]>
Commit | Line | Data |
---|---|---|
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 | |
11 | extrn _b0call\r | |
12 | \r | |
13 | include config.inc\r | |
14 | include z180reg.inc\r | |
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 | |
33 | b0call gs_rtc\r | |
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 | |
172 | \r | |
173 | cseg ;common!\r | |
174 | isvprt0:\r | |
175 | push af\r | |
176 | in0 a,(tcr) ;reset TIF0 flag\r | |
177 | in0 a,(tmdr0l)\r | |
178 | in0 a,(tmdr0h)\r | |
179 | \r | |
180 | push hl ;11\r | |
181 | ld hl,uptime ; 9\r | |
182 | inc (hl) ;10\r | |
183 | jr nz,iprt_1 ;6/8 38\r | |
184 | inc hl ; 4\r | |
185 | inc (hl) ;10\r | |
186 | jr nz,iprt_1 ;6/8 58\r | |
187 | inc hl ; 4\r | |
188 | inc (hl) ;10\r | |
189 | jr nz,iprt_1 ;6/8\r | |
190 | inc hl ; 4\r | |
191 | inc (hl) ;10\r | |
192 | iprt_1:\r | |
193 | pop hl ; 9\r | |
194 | ld a,(time_to)\r | |
195 | sub a,1\r | |
196 | jr c,iprt_0\r | |
197 | ld (time_to),a\r | |
198 | iprt_0:\r | |
199 | pop af\r | |
200 | ei\r | |
201 | ret\r | |
202 | \r | |
203 | uptime:\r | |
204 | dw 0,0\r | |
205 | time_to:\r | |
206 | db 0\r | |
207 | \r | |
208 | end\r |