]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/time.180
b0call --> b0hlcall
[z180-stamp-cpm3.git] / cbios / time.180
CommitLineData
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
32time_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
43gs_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
102gstimer:\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
113gtimer:\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
135prt0ini:\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
175isvprt0: ;\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
190iprt_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
202iprt_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
210time_to:\r
211 db 0\r
023a0215
L
212uptime:\r
213 dw 0,0\r
947c5868
L
214\r
215 end\r