-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathrtc.sys.a80
More file actions
192 lines (156 loc) · 2.62 KB
/
Copy pathrtc.sys.a80
File metadata and controls
192 lines (156 loc) · 2.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
; RTC.SYS - ESXDOS driver for RTC 724121A
; created by VELESOFT (c) 15.6.2014
; improved and fixed RTC init by ub880d (autumn 2019)
PORT equ #0003
HIADR equ #0000
output "rtc.sys"
org #2700
push af
ld bc,#0D00+PORT ; rtc_control_d
ld de,#0200 ; timeout
rtc_detect: in a,(c)
set 0,a ; hold
out (c),a
in a,(c)
bit 1,a ; busy?
jr z,rtc_found
res 0,a ; unhold
out (c),a
dec de
ld a,d
or e
jr nz,rtc_detect
pop af
scf
ret
rtc_found: push hl
ld hl,reg.CTRL_F
ld b,HIADR+#0F
; read all 16 registers of RTC
; mask lower nibble and save into buffer
rtc_port_read: in a,(c)
and #0F
ld (hl),a
dec hl
ld a,b
dec b
or a
jr nz,rtc_port_read
; READ TIME -----------------------------------------------------------------------------
ld a,(reg.SEC10)
and 7
call X10
ld b,a
ld a,(reg.SEC)
add a,b
srl a ; seconds / 2
and #1F ; keep bits 0-4
ld e,a
ld a,(reg.MIN10)
and 7
call X10
ld b,a
ld a,(reg.MIN)
add a,b
ld d,a
xor a
dup 3
rr d
rra
edup
or e
ld e,a
ld a,(reg.CTRL_F) ; control
bit 2,a ; 12h? 24h?
ld a,(reg.HOUR10)
jr nz,mode24 ; 24h => jump
bit 2,a ; am/pm
jr z,mode24 ; am => jump
and 1 ; +12h if pm and 12h
inc a
ld (reg.HOUR10),a
ld a,(reg.HOUR)
add a,2
ld (reg.HOUR),a
mode24: ld a,(reg.HOUR10)
and 3
ld (reg.HOUR10),a
call X10
ld b,a
ld a,(reg.HOUR)
add a,b
and 0x1F ; keep bits 0-4
rlca
rlca
rlca
or d
ld d,a ; register DE for ESXDOS completed
; READ DATE -----------------------------------------------------------------------------
ld a,(reg.DAY10)
and 3
call X10
ld b,a
ld a,(reg.DAY)
add a,b
and 0x1F ; keep bits 0-4
ld l,a
ld a,(reg.MON10)
and 1
call X10
ld b,a
ld a,(reg.MON)
add a,b
ld h,a
xor a
dup 3
rr h
rra
edup
or l
ld l,a
ld a,(reg.YEAR10)
add a,2 ; fixed year 1980 > 2000
call X10
ld b,a
ld a,(reg.YEAR)
add a,b
add a,a
or h ; register BC from ESXDOS completed
ld h,a ; temporarily stored in HL
; RETURN & ENABLE RTC -------------------------------------------------------------------
ld bc,0x0D00+PORT ; reg.CTRL_D
in a,(c)
res 0,a ; unhold
out (c),a
ld b,h
ld c,l
pop hl
pop af
or a ; return without error
ret
; multiple A by ten
X10: add a,a ; * 2
ld b,a ; * 2
add a,a ; * 4
add a,a ; * 8
add a,b ; * 10
ret
outend
; buffer for all RTC registers
reg:
.SEC db 0
.SEC10 db 0
.MIN db 0
.MIN10 db 0
.HOUR db 0
.HOUR10 db 0
.DAY db 0
.DAY10 db 0
.MON db 0
.MON10 db 0
.YEAR db 0
.YEAR10 db 0
.DAYOFW db 0
.CTRL_D db 0
.CTRL_E db 0
.CTRL_F db 0