]>
Commit | Line | Data |
---|---|---|
947c5868 L |
1 | title 'Time module for the Modular CP/M 3 BIOS'\r |
2 | \r | |
3 | public ?time, gs_rtc\r | |
4 | public prt0ini\r | |
5 | public gtimer,gstimer\r | |
6 | \r | |
7 | extrn @date,@hour,@min,@sec\r | |
8 | extrn f_cpu\r | |
9 | extrn ioiniml,div32_16\r | |
10 | extrn msg.sm,msg.recv\r | |
aa1cd3a9 | 11 | extrn _b0hlcall\r |
947c5868 | 12 | \r |
3c56f4c2 L |
13 | maclib z180reg.inc\r |
14 | maclib config.inc\r | |
947c5868 L |
15 | \r |
16 | \r | |
17 | ;----------------------------------------------------------------------\r | |
18 | ; c == 00h: get time\r | |
19 | ; c == ffh: set time\r | |
20 | \r | |
21 | cseg ; time must be done from resident memory\r | |
22 | ?time:\r | |
23 | inc c ;zero if ff\r | |
24 | ld c,3\r | |
25 | jr z,time_set\r | |
26 | \r | |
27 | ld a,(time_to)\r | |
28 | or a\r | |
29 | ret nz\r | |
30 | \r | |
31 | dec c\r | |
32 | time_set:\r | |
aa1cd3a9 | 33 | b0hlcall gs_rtc\r |
947c5868 L |
34 | ld a,0ffh\r |
35 | ld (time_to),a\r | |
36 | ret\r | |
37 | \r | |
38 | ;----------------------------------------------------------------------\r | |
39 | ; c = 2: get time\r | |
40 | ; c = 3: set time\r | |
41 | \r | |
42 | dseg\r | |
43 | gs_rtc:\r | |
44 | \r | |
45 | push hl\r | |
46 | push de\r | |
47 | \r | |
48 | ld hl,(@date)\r | |
49 | ld a,(@hour)\r | |
50 | ld d,a\r | |
51 | ld a,(@min)\r | |
52 | ld e,a\r | |
53 | ld a,(@sec)\r | |
54 | ld b,a ;b = sec, c = subcommand\r | |
55 | push hl ;2\r | |
56 | push de ;4\r | |
57 | push bc ;6\r | |
58 | ld hl,3 * 256 + 0 ;h = command, l = 0\r | |
59 | push hl ;8\r | |
60 | \r | |
61 | ld h,l ;hl = 0\r | |
62 | add hl,sp\r | |
63 | push hl\r | |
64 | inc hl ;7\r | |
65 | \r | |
66 | ld b,7\r | |
67 | call msg.sm\r | |
68 | \r | |
69 | pop hl ;8\r | |
70 | ld b,8 ; max receive message len\r | |
71 | call msg.recv\r | |
72 | \r | |
73 | pop hl ;len/command (discard)\r | |
74 | pop bc ;subc/sec\r | |
75 | pop de\r | |
76 | pop hl\r | |
77 | ld a,b\r | |
78 | ld (@sec),a\r | |
79 | ld a,e\r | |
80 | ld (@min),a\r | |
81 | ld a,d\r | |
82 | ld (@hour),a\r | |
83 | ld (@date),hl\r | |
84 | \r | |
85 | pop de\r | |
86 | pop hl\r | |
87 | ret\r | |
88 | \r | |
89 | ;----------------------------------------------------------------------\r | |
90 | \r | |
91 | ;uint32_t get_timer(uint32_t base)\r | |
92 | ;{\r | |
93 | ; uint32_t ret;\r | |
94 | ; ATOMIC_BLOCK(ATOMIC_FORCEON)\r | |
95 | ; {\r | |
96 | ; ret = timestamp;\r | |
97 | ; }\r | |
98 | ; return ret - base;\r | |
99 | ;}\r | |
100 | \r | |
101 | dseg ; called from banked only\r | |
102 | gstimer:\r | |
103 | push de\r | |
104 | ex de,hl\r | |
105 | ld hl,(uptime)\r | |
106 | or a\r | |
107 | sbc hl,de\r | |
108 | pop de\r | |
109 | ret\r | |
110 | \r | |
111 | ;----------------------------------------------------------------------\r | |
112 | \r | |
113 | gtimer:\r | |
114 | push bc\r | |
115 | ld b,h\r | |
116 | ld c,l\r | |
117 | or a\r | |
118 | di\r | |
119 | ld hl,(uptime)\r | |
120 | sbc hl,bc\r | |
121 | push hl\r | |
122 | ei\r | |
123 | ld hl,(uptime+2)\r | |
124 | sbc hl,de\r | |
125 | ex de,hl\r | |
126 | pop hl\r | |
127 | pop bc\r | |
128 | ret\r | |
129 | \r | |
130 | ;----------------------------------------------------------------------\r | |
131 | ; intit timer interrupt\r | |
132 | \r | |
133 | dseg\r | |
134 | \r | |
135 | prt0ini:\r | |
136 | in0 a,(tcr)\r | |
137 | push af\r | |
138 | and ~(M_TIE0+M_TDE0) ;stop timer 0\r | |
139 | out0 (tcr),a\r | |
140 | \r | |
141 | ld a,i\r | |
142 | ld h,a\r | |
143 | in0 a,(il)\r | |
144 | and 0E0h\r | |
145 | or IV$PRT0\r | |
146 | ld l,a\r | |
147 | ld de,isvprt0\r | |
148 | ld (hl),e\r | |
149 | inc hl\r | |
150 | ld (hl),d\r | |
151 | \r | |
152 | ld hl,(f_cpu)\r | |
153 | ld de,(f_cpu+2)\r | |
154 | ld bc,PRT_PRE * 800 ;1/800 s == 1,25 ms interrupt rate\r | |
155 | call div32_16\r | |
156 | \r | |
157 | out0 (tmdr0l),l\r | |
158 | out0 (tmdr0h),h\r | |
159 | out0 (rldr0l),l\r | |
160 | out0 (rldr0h),h\r | |
161 | pop af\r | |
162 | or (M_TIE0+M_TDE0)\r | |
163 | out0 (tcr),a\r | |
164 | ret\r | |
165 | \r | |
166 | \r | |
167 | ;----------------------------------------------------------------------\r | |
168 | ; timer interrupt\r | |
169 | ;\r | |
170 | ; 1,25 ms clock tick\r | |
171 | \r | |
023a0215 | 172 | extrn i$stack\r |
947c5868 L |
173 | \r |
174 | cseg ;common!\r | |
175 | isvprt0: ;\r | |
023a0215 L |
176 | ld (i$stack),sp ; + 19\r |
177 | ld sp,i$stack ; + 9\r | |
178 | \r | |
947c5868 L |
179 | push af ; 11\r |
180 | in0 a,(tcr) ;reset TIF0 flag 12\r | |
181 | in0 a,(tmdr0l) ; 12\r | |
182 | in0 a,(tmdr0h) ; 12\r | |
183 | ;\r | |
023a0215 L |
184 | push hl ; 11\r |
185 | ld hl,time_to ; 9\r | |
186 | ld a,(hl) ; 6\r | |
187 | sub a,1 ; 6 79\r | |
188 | jr c,iprt_0 ; 6/8\r | |
189 | ld (hl),a ; 7\r | |
190 | iprt_0: ; 87 92\r | |
191 | inc hl ; 4\r | |
192 | inc (hl) ; 10 101\r | |
193 | jr nz,iprt_1 ; 6/8 109 -2\r | |
194 | inc hl ; 4\r | |
947c5868 L |
195 | inc (hl) ; 10 14\r |
196 | jr nz,iprt_1 ; 6/8\r | |
023a0215 L |
197 | inc hl ; 4\r |
198 | inc (hl) ; 10\r | |
199 | jr nz,iprt_1 ; 6/8\r | |
200 | inc hl ; 4\r | |
201 | inc (hl) ; 10\r | |
202 | iprt_1: ; 109 138\r | |
203 | pop hl ; 9\r | |
947c5868 | 204 | pop af ; 9\r |
023a0215 | 205 | ld sp,(i$stack) ; + 18\r |
947c5868 | 206 | ei ; 3\r |
023a0215 L |
207 | ret ; 9 139 199\r |
208 | ; +intack 18 157 217\r | |
947c5868 | 209 | \r |
947c5868 L |
210 | time_to:\r |
211 | db 0\r | |
023a0215 L |
212 | uptime:\r |
213 | dw 0,0\r | |
947c5868 L |
214 | \r |
215 | end\r |