6
6
;
7
7
; A Real Time Clock Companion ROM.
8
8
;
9
- ; Copyright (c) 2022-2023 , 640KB and contributors
9
+ ; Copyright (c) 2022-2025 , 640KB and contributors
10
10
;
11
11
;----------------------------------------------------------------------------;
12
12
;
42
42
;
43
43
;----------------------------------------------------------------------------;
44
44
VER_NAME EQU 'GLaTICK'
45
- VER_NUM EQU '0.8.7 ' ; (max 6 chars)
46
- VER_DATE EQU '06/12 /25' ; must be MM/DD/YY format
45
+ VER_NUM EQU '0.8.8 ' ; (max 6 chars)
46
+ VER_DATE EQU '07/07 /25' ; must be MM/DD/YY format
47
47
COPY_YEAR EQU '2023-25'
48
48
49
49
;----------------------------------------------------------------------------;
@@ -89,7 +89,7 @@ INCLUDE SEGS.INC
89
89
ASSUME DS :OPTROM , SS :OPTROM , CS :OPTROM , ES :OPTROM
90
90
OPTROM SEGMENT BYTE PUBLIC 'CODE'
91
91
92
- PUBLIC INT_1A_DEFAULT , IS_LEAP , LEAP_NEXT , GET_RTC, STR_CRLF
92
+ PUBLIC INT_1A_DEFAULT , GET_RTC , STR_CRLF
93
93
PUBLIC PACK_BCD , UNPACK_BCD , BCD_TO_WORD , BCD_TO_BYTE , BYTE_TO_BCD
94
94
95
95
EXTRN OUT_CHAR:NEAR , OUT_SZ_ATTR:NEAR , OUT_SZ:NEAR , OUT_SZ_NL:NEAR
@@ -148,20 +148,20 @@ ROM_INIT PROC
148
148
; Optionally display a GLaTICK banner
149
149
;
150
150
CALL IS_GLABIOS ; is GLaBIOS?
151
- JZ DETECT_RTCS ; if so, don't display banner
151
+ JZ BANNER_DONE ; if so, don't display banner
152
152
PRINTLN_SZ VER_BANNER ; otherwise display it
153
+ BANNER_DONE:
154
+ ENDIF
153
155
154
156
;----------------------------------------------------------------------------;
155
157
; Detect Supported RTCs
156
158
;----------------------------------------------------------------------------;
157
- DETECT_RTCS:
158
- ENDIF
159
159
160
160
IFDEF RTC_ AT
161
161
;----------------------------------------------------------------------------;
162
162
; Check for AT port 70H, 240H, 2C0H: MC146818, DS12x85
163
163
;----------------------------------------------------------------------------;
164
- EXTRN AT_DETECT:NEAR
164
+ EXTRN AT_DETECT:NEAR , STR_ AT :NEAR
165
165
DETECT_ AT :
166
166
CALL AT_DETECT ; DI = new IVT, AL = RTC type, DX = port
167
167
MOV SI , OFFSET STR_ AT ; 'AT' string
@@ -173,7 +173,7 @@ DETECT_AT:
173
173
; Check for NS MM58167AN: SixPakPlus V1, generic I/O boards
174
174
; AL = RTC_NS (direct) or RTC_NS2 (latched)
175
175
;----------------------------------------------------------------------------;
176
- EXTRN NS_DETECT:NEAR
176
+ EXTRN NS_DETECT:NEAR , STR_NS:NEAR
177
177
DETECT_NS:
178
178
CALL NS_DETECT ; DI = new IVT, AL = RTC type, DX = port
179
179
MOV SI , OFFSET STR_NS ; '58167' string
@@ -184,7 +184,7 @@ DETECT_NS:
184
184
;----------------------------------------------------------------------------;
185
185
; Check for RP5C15: SixPakPlus V2
186
186
;----------------------------------------------------------------------------;
187
- EXTRN RP_DETECT:NEAR
187
+ EXTRN RP_DETECT:NEAR , STR_RP:NEAR
188
188
DETECT_RP:
189
189
CALL RP_DETECT ; DI = new IVT, AL = RTC type, DX = port
190
190
MOV SI , OFFSET STR_RP ; 'RP5C15' string
@@ -195,7 +195,7 @@ DETECT_RP:
195
195
;----------------------------------------------------------------------------;
196
196
; Check for MSM6242: Above Board, others
197
197
;----------------------------------------------------------------------------;
198
- EXTRN OK2_DETECT:NEAR
198
+ EXTRN OK2_DETECT:NEAR , STR_OK2:NEAR
199
199
DETECT_OK2:
200
200
CALL OK2_DETECT ; DI = new IVT, AL = RTC type, DX = port
201
201
MOV SI , OFFSET STR_OK2 ; '6242' string
@@ -206,7 +206,7 @@ DETECT_OK2:
206
206
;----------------------------------------------------------------------------;
207
207
; Check for MSM5832: Quadram, DTK PII-125
208
208
;----------------------------------------------------------------------------;
209
- EXTRN OK_DETECT:NEAR
209
+ EXTRN OK_DETECT:NEAR , STR_OK:NEAR
210
210
DETECT_OK:
211
211
CALL OK_DETECT ; DI = new IVT, AL = RTC type, DX = port
212
212
MOV SI , OFFSET STR_OK ; '5832' string
@@ -217,13 +217,23 @@ DETECT_OK:
217
217
;----------------------------------------------------------------------------;
218
218
; Check for DS-1216x "SmartWatch"
219
219
;----------------------------------------------------------------------------;
220
- EXTRN SW_DETECT:NEAR
220
+ EXTRN SW_DETECT:NEAR , STR_SW:NEAR
221
221
DETECT_SW:
222
222
CALL SW_DETECT ; DI = new IVT, AL = RTC type, DX = port
223
223
MOV SI , OFFSET STR_SW ; 'DS1216' string
224
224
JNC DETECT_SET
225
225
ENDIF
226
226
227
+ IFDEF RTC_EP
228
+ ;----------------------------------------------------------------------------;
229
+ ; Check for RTC-58321
230
+ ;----------------------------------------------------------------------------;
231
+ EXTRN EP_DETECT:NEAR
232
+ DETECT_SW:
233
+ CALL EP_DETECT ; DI = new IVT, AL = RTC type, DX = port,
234
+ JNC DETECT_SET ; SI = '58321' string, NC if detected
235
+ ENDIF
236
+
227
237
;----------------------------------------------------------------------------;
228
238
; No RTC was detected
229
239
;
@@ -572,11 +582,11 @@ SETUP_RTC PROC
572
582
MOV _INT_1AH_BIOS_SEG , AX ; Save BIOS INT 1Ah to INT 55h
573
583
MOV _INT_1AH_BIOS_OFF , DI
574
584
SETUP_RTC_EXIT:
575
- ASSUME DS :_BDA
576
585
POPF ; restore IF
577
586
POP CX
578
587
POP DS
579
588
RET
589
+ ASSUME DS :_BDA
580
590
SETUP_RTC ENDP
581
591
582
592
;----------------------------------------------------------------------------;
@@ -767,13 +777,15 @@ TTT_HIGH:
767
777
TIME_TO_TICKS ENDP
768
778
BCD_TIME_TO_TICKS ENDP
769
779
780
+ IF USE_LEAP EQ 1
770
781
;----------------------------------------------------------------------------;
771
782
; Is leap year in next 12 months?
772
783
;----------------------------------------------------------------------------;
773
784
; Input: AX = year, CH = month
774
785
; Output: ZF if leap, NZ if not leap
775
786
; Clobbers AX, BX
776
787
;----------------------------------------------------------------------------;
788
+ PUBLIC LEAP_NEXT
777
789
LEAP_NEXT PROC
778
790
CMP CH , 3 ; is Mar - Dec?
779
791
JL IS_LEAP ; if so, check if NEXT year is a leap
@@ -787,6 +799,7 @@ LEAP_NEXT PROC
787
799
; ZF if leap, NZ if not leap
788
800
; AL = leap counter (0 = leap year, 1-3 = non-leap year)
789
801
;----------------------------------------------------------------------------;
802
+ PUBLIC IS_LEAP
790
803
IS_LEAP PROC
791
804
MOV BL , 100 ; divide by 100 to split year
792
805
DIV BL ; AL = first two digits, AH = last two
@@ -800,7 +813,9 @@ LEAP_MOD4:
800
813
801
814
IS_LEAP ENDP
802
815
LEAP_NEXT ENDP
816
+ ENDIF
803
817
818
+ IF RESET_ON_ERROR EQ 1
804
819
;----------------------------------------------------------------------------;
805
820
; Validate BCD time: 00:00:00-23:59:59
806
821
;----------------------------------------------------------------------------;
@@ -879,6 +894,7 @@ VAL_DATE_RET_CMC:
879
894
VAL_DATE_RET:
880
895
RET ; return with current CF
881
896
VALIDATE_DATE ENDP
897
+ ENDIF
882
898
883
899
;----------------------------------------------------------------------------;
884
900
; Strings
@@ -900,29 +916,7 @@ STR_CRLF DB CR, LF, 0
900
916
STR_RTC DB 'RTC' , 0
901
917
STR_CLK DB 'Clock' , 0
902
918
STR_ERR DB 'Error' , 0
903
-
904
- ;----------------------------------------------------------------------------;
905
- ; RTC type display
906
- ;
907
919
STR_NONE DB 'None' , 0
908
- IFDEF RTC_ AT
909
- STR_ AT DB 'AT ' , 0 ; AT = DS1285/MC146818
910
- ENDIF
911
- IFDEF RTC_OK
912
- STR_OK DB '5832 ' , 0 ; OK = MSM5832/1
913
- ENDIF
914
- IFDEF RTC_OK2
915
- STR_OK2 DB '6242 ' , 0 ; OK2 = MSM6242
916
- ENDIF
917
- IFDEF RTC_RP
918
- STR_RP DB 'RP5C15 ' , 0 ; RP = RP5C15
919
- ENDIF
920
- IFDEF RTC_SW
921
- STR_SW DB 'DS1216 ' , 0 ; SW = DS1216x
922
- ENDIF
923
- IFDEF RTC_NS
924
- STR_NS DB '58167 ' , 0 ; NS = MM58167AN
925
- ENDIF
926
920
927
921
;----------------------------------------------------------------------------;
928
922
; END of ROM
0 commit comments