]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blame - cbios/time.180
Convert line endings of some source files (back) to CR/LF.
[z180-stamp-cpm3.git] / cbios / time.180
CommitLineData
4cd9d981
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\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
192iprt_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
198iprt_0:\r
199 pop af\r
200 ei\r
201 ret\r
202\r
203uptime:\r
204 dw 0,0\r
205time_to:\r
206 db 0\r
207\r
208 end\r