]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blob - cbios/time.180
e2ffc6b79f3f815f8e285d143d70a87eac827dd1
[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
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 ret nz ;nothing to do
25
26 ld c,3
27
28 b0call gs_rtc
29 ret
30
31 ;----------------------------------------------------------------------
32 ; c = 2: get time
33 ; c = 3: set time
34
35 dseg
36 gs_rtc:
37
38 push hl
39 push de
40
41 di
42 ld hl,(@date)
43 ld a,(@hour)
44 ld d,a
45 ld a,(@min)
46 ld e,a
47 ld a,(@sec)
48 ei
49 ld b,a ;b = sec, c = subcommand
50 push hl ;2
51 push de ;4
52 push bc ;6
53 ld hl,3 * 256 + 0 ;h = command, l = 0
54 push hl ;8
55
56 ld h,l ;hl = 0
57 add hl,sp
58 push hl
59 inc hl ;7
60
61 ld b,7
62 call msg.sm
63
64 pop hl ;8
65 ld b,8 ; max receive message len
66 call msg.recv
67
68 pop hl ;len/command (discard)
69 pop bc ;subc/sec
70 pop de
71 pop hl
72 ld a,b
73 di
74 ld (@sec),a
75 ld a,e
76 ld (@min),a
77 ld a,d
78 ld (@hour),a
79 ld (@date),hl
80 ei
81
82 pop de
83 pop hl
84 ret
85
86
87 ;----------------------------------------------------------------------
88 ; intit timer interrupt
89
90 dseg
91
92 prt0ini:
93 in0 a,(tcr)
94 push af
95 and ~(M_TIE0+M_TDE0) ;stop timer 0
96 out0 (tcr),a
97
98 ld a,i
99 ld h,a
100 in0 a,(il)
101 and 0E0h
102 or IV$PRT0
103 ld l,a
104 ld de,isvprt0
105 ld (hl),e
106 inc hl
107 ld (hl),d
108
109 ld hl,(f_cpu)
110 ld de,(f_cpu+2)
111 ld bc,PRT_PRE * 100 ;1/100 s == 10 ms interrupt rate
112 call div32_16
113
114 out0 (tmdr0l),l
115 out0 (tmdr0h),h
116 out0 (rldr0l),l
117 out0 (rldr0h),h
118 pop af
119 or (M_TIE0+M_TDE0)
120 out0 (tcr),a
121 ret
122
123 ;----------------------------------------------------------------------
124 ; timer interrupt
125 ;
126 ; 10 ms clock tick
127
128
129 cseg ;common!
130 isvprt0:
131 push af
132 in0 a,(tcr) ;reset TIF0 flag
133 in0 a,(tmdr0l)
134 in0 a,(tmdr0h)
135
136 ld a,(counter_10ms) ;
137 inc a
138 cp 100 ;100 * 10ms ?
139 jr nz,iprt_1
140
141 ld a,(@sec)
142 inc a
143 daa
144 cp 60h
145 jr nz,iprt_2
146
147 ld a,(@min)
148 inc a
149 daa
150 cp 60h
151 jr nz,iprt_3
152
153 ld a,(@hour)
154 inc a
155 daa
156 cp 24h
157 jr nz,iprt_4
158
159 push hl
160 ld hl,(@date)
161 inc hl
162 ld (@date),hl
163 pop hl
164
165 xor a
166 iprt_4:
167 ld (@hour),a
168 xor a
169 iprt_3:
170 ld (@min),a
171 xor a
172 iprt_2:
173 ld (@sec),a
174 xor a
175 iprt_1:
176 ld (counter_10ms),a
177 pop af
178 ei
179 ret
180
181 counter_10ms:
182 db 0
183
184 end