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