]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/time.180
BIOS debugging with ddtz: Set 3F to 81 to en fifo inits.
[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
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
32time_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
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
172\r
173 cseg ;common!\r
174isvprt0: ;\r
175 push af ; 11\r
176 in0 a,(tcr) ;reset TIF0 flag 12\r
177 in0 a,(tmdr0l) ; 12\r
178 in0 a,(tmdr0h) ; 12\r
179 ;\r
180\r
181 push hl ;11\r
182 ld hl,uptime ; 9\r
183 inc (hl) ; 10 77\r
184 jr nz,iprt_1 ; 6/8 -2\r
185 inc hl ; 4\r
186 inc (hl) ; 10 14\r
187 jr nz,iprt_1 ; 6/8\r
188 inc hl ; 4\r
189 inc (hl) ;10\r
190 jr nz,iprt_1 ;6/8\r
191 inc hl ; 4\r
192 inc (hl) ;10\r
193iprt_1: ; 85 138\r
194 pop hl ; 9\r
195 ld a,(time_to) ; 12\r
196 sub a,1 ; 6 112\r
197 jr c,iprt_0 ; 6/8\r
198 ld (time_to),a ; 13\r
199iprt_0: ; 120 178\r
200 pop af ; 9\r
201 ei ; 3\r
202 ret ; 9 141 199\r
203 ; +intack 18 159 217\r
204\r
205uptime:\r
206 dw 0,0\r
207time_to:\r
208 db 0\r
209\r
210 end\r