Skip to content

Commit b48a7b4

Browse files
committed
Add support for MSM58321/RTC-58321/58323
1 parent bfc0fda commit b48a7b4

File tree

11 files changed

+812
-58
lines changed

11 files changed

+812
-58
lines changed

src/GLATICK.ASM

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
;
77
; A Real Time Clock Companion ROM.
88
;
9-
; Copyright (c) 2022-2023, 640KB and contributors
9+
; Copyright (c) 2022-2025, 640KB and contributors
1010
;
1111
;----------------------------------------------------------------------------;
1212
;
@@ -42,8 +42,8 @@
4242
;
4343
;----------------------------------------------------------------------------;
4444
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
4747
COPY_YEAR EQU '2023-25'
4848

4949
;----------------------------------------------------------------------------;
@@ -89,7 +89,7 @@ INCLUDE SEGS.INC
8989
ASSUME DS:OPTROM, SS:OPTROM, CS:OPTROM, ES:OPTROM
9090
OPTROM SEGMENT BYTE PUBLIC 'CODE'
9191

92-
PUBLIC INT_1A_DEFAULT, IS_LEAP, LEAP_NEXT, GET_RTC, STR_CRLF
92+
PUBLIC INT_1A_DEFAULT, GET_RTC, STR_CRLF
9393
PUBLIC PACK_BCD, UNPACK_BCD, BCD_TO_WORD, BCD_TO_BYTE, BYTE_TO_BCD
9494

9595
EXTRN OUT_CHAR:NEAR, OUT_SZ_ATTR:NEAR, OUT_SZ:NEAR, OUT_SZ_NL:NEAR
@@ -148,20 +148,20 @@ ROM_INIT PROC
148148
; Optionally display a GLaTICK banner
149149
;
150150
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
152152
PRINTLN_SZ VER_BANNER ; otherwise display it
153+
BANNER_DONE:
154+
ENDIF
153155

154156
;----------------------------------------------------------------------------;
155157
; Detect Supported RTCs
156158
;----------------------------------------------------------------------------;
157-
DETECT_RTCS:
158-
ENDIF
159159

160160
IFDEF RTC_AT
161161
;----------------------------------------------------------------------------;
162162
; Check for AT port 70H, 240H, 2C0H: MC146818, DS12x85
163163
;----------------------------------------------------------------------------;
164-
EXTRN AT_DETECT:NEAR
164+
EXTRN AT_DETECT:NEAR, STR_AT:NEAR
165165
DETECT_AT:
166166
CALL AT_DETECT ; DI = new IVT, AL = RTC type, DX = port
167167
MOV SI, OFFSET STR_AT ; 'AT' string
@@ -173,7 +173,7 @@ DETECT_AT:
173173
; Check for NS MM58167AN: SixPakPlus V1, generic I/O boards
174174
; AL = RTC_NS (direct) or RTC_NS2 (latched)
175175
;----------------------------------------------------------------------------;
176-
EXTRN NS_DETECT:NEAR
176+
EXTRN NS_DETECT:NEAR, STR_NS:NEAR
177177
DETECT_NS:
178178
CALL NS_DETECT ; DI = new IVT, AL = RTC type, DX = port
179179
MOV SI, OFFSET STR_NS ; '58167' string
@@ -184,7 +184,7 @@ DETECT_NS:
184184
;----------------------------------------------------------------------------;
185185
; Check for RP5C15: SixPakPlus V2
186186
;----------------------------------------------------------------------------;
187-
EXTRN RP_DETECT:NEAR
187+
EXTRN RP_DETECT:NEAR, STR_RP:NEAR
188188
DETECT_RP:
189189
CALL RP_DETECT ; DI = new IVT, AL = RTC type, DX = port
190190
MOV SI, OFFSET STR_RP ; 'RP5C15' string
@@ -195,7 +195,7 @@ DETECT_RP:
195195
;----------------------------------------------------------------------------;
196196
; Check for MSM6242: Above Board, others
197197
;----------------------------------------------------------------------------;
198-
EXTRN OK2_DETECT:NEAR
198+
EXTRN OK2_DETECT:NEAR, STR_OK2:NEAR
199199
DETECT_OK2:
200200
CALL OK2_DETECT ; DI = new IVT, AL = RTC type, DX = port
201201
MOV SI, OFFSET STR_OK2 ; '6242' string
@@ -206,7 +206,7 @@ DETECT_OK2:
206206
;----------------------------------------------------------------------------;
207207
; Check for MSM5832: Quadram, DTK PII-125
208208
;----------------------------------------------------------------------------;
209-
EXTRN OK_DETECT:NEAR
209+
EXTRN OK_DETECT:NEAR, STR_OK:NEAR
210210
DETECT_OK:
211211
CALL OK_DETECT ; DI = new IVT, AL = RTC type, DX = port
212212
MOV SI, OFFSET STR_OK ; '5832' string
@@ -217,13 +217,23 @@ DETECT_OK:
217217
;----------------------------------------------------------------------------;
218218
; Check for DS-1216x "SmartWatch"
219219
;----------------------------------------------------------------------------;
220-
EXTRN SW_DETECT:NEAR
220+
EXTRN SW_DETECT:NEAR, STR_SW:NEAR
221221
DETECT_SW:
222222
CALL SW_DETECT ; DI = new IVT, AL = RTC type, DX = port
223223
MOV SI, OFFSET STR_SW ; 'DS1216' string
224224
JNC DETECT_SET
225225
ENDIF
226226

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+
227237
;----------------------------------------------------------------------------;
228238
; No RTC was detected
229239
;
@@ -572,11 +582,11 @@ SETUP_RTC PROC
572582
MOV _INT_1AH_BIOS_SEG, AX ; Save BIOS INT 1Ah to INT 55h
573583
MOV _INT_1AH_BIOS_OFF, DI
574584
SETUP_RTC_EXIT:
575-
ASSUME DS:_BDA
576585
POPF ; restore IF
577586
POP CX
578587
POP DS
579588
RET
589+
ASSUME DS:_BDA
580590
SETUP_RTC ENDP
581591

582592
;----------------------------------------------------------------------------;
@@ -767,13 +777,15 @@ TTT_HIGH:
767777
TIME_TO_TICKS ENDP
768778
BCD_TIME_TO_TICKS ENDP
769779

780+
IF USE_LEAP EQ 1
770781
;----------------------------------------------------------------------------;
771782
; Is leap year in next 12 months?
772783
;----------------------------------------------------------------------------;
773784
; Input: AX = year, CH = month
774785
; Output: ZF if leap, NZ if not leap
775786
; Clobbers AX, BX
776787
;----------------------------------------------------------------------------;
788+
PUBLIC LEAP_NEXT
777789
LEAP_NEXT PROC
778790
CMP CH, 3 ; is Mar - Dec?
779791
JL IS_LEAP ; if so, check if NEXT year is a leap
@@ -787,6 +799,7 @@ LEAP_NEXT PROC
787799
; ZF if leap, NZ if not leap
788800
; AL = leap counter (0 = leap year, 1-3 = non-leap year)
789801
;----------------------------------------------------------------------------;
802+
PUBLIC IS_LEAP
790803
IS_LEAP PROC
791804
MOV BL, 100 ; divide by 100 to split year
792805
DIV BL ; AL = first two digits, AH = last two
@@ -800,7 +813,9 @@ LEAP_MOD4:
800813

801814
IS_LEAP ENDP
802815
LEAP_NEXT ENDP
816+
ENDIF
803817

818+
IF RESET_ON_ERROR EQ 1
804819
;----------------------------------------------------------------------------;
805820
; Validate BCD time: 00:00:00-23:59:59
806821
;----------------------------------------------------------------------------;
@@ -879,6 +894,7 @@ VAL_DATE_RET_CMC:
879894
VAL_DATE_RET:
880895
RET ; return with current CF
881896
VALIDATE_DATE ENDP
897+
ENDIF
882898

883899
;----------------------------------------------------------------------------;
884900
; Strings
@@ -900,29 +916,7 @@ STR_CRLF DB CR, LF, 0
900916
STR_RTC DB 'RTC', 0
901917
STR_CLK DB 'Clock', 0
902918
STR_ERR DB 'Error', 0
903-
904-
;----------------------------------------------------------------------------;
905-
; RTC type display
906-
;
907919
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
926920

927921
;----------------------------------------------------------------------------;
928922
; END of ROM

src/GLATICK.MAK

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,18 @@ RTC_AT.OBJ: RTC_AT.ASM $(DEPS)
2525
RTC_RP.OBJ: RTC_RP.ASM $(DEPS)
2626
$(ASM) $*;
2727

28-
$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_RP.OBJ
28+
RTC_SW.OBJ: RTC_SW.ASM $(DEPS)
29+
$(ASM) $*;
30+
31+
RTC_EP.OBJ: RTC_EP.ASM $(DEPS)
32+
$(ASM) $*;
33+
34+
#
35+
# List is too long so must choose correct objects to LINK
36+
#
37+
#$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_RP.OBJ RTC_SW.OBJ
38+
$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_EP.OBJ
39+
#$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_RP.OBJ
2940
$(LNK) $**,$*,$*;
3041
$(OPT2ROM) $@ $*.ROM
3142

src/GLATICK.NMK

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ LNK=LINK /MAP /LI /PACKCODE
44
OPT2ROM=OPT2ROM\OPT2ROM
55
DEPS=RTC.INC MACROS.INC SEGS.INC GLATICK.NMK
66

7+
#
8+
# List is too long so must choose correct objects to LINK
9+
#
10+
#$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_EP.OBJ
11+
#$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_RP.OBJ RTC_SW.OBJ
712
$(ROM).EXE: $*.OBJ GLALIB.OBJ RTC_NS.OBJ RTC_OK.OBJ RTC_OK2.OBJ RTC_AT.OBJ RTC_RP.OBJ
813
$(LNK) $**,$*,$*;
914
$(OPT2ROM) $@ $*.ROM
@@ -27,4 +32,10 @@ RTC_AT.OBJ: RTC_AT.ASM $(DEPS)
2732
$(ASM) $*;
2833

2934
RTC_RP.OBJ: RTC_RP.ASM $(DEPS)
35+
$(ASM) $*;
36+
37+
RTC_SW.OBJ: RTC_SW.ASM $(DEPS)
38+
$(ASM) $*;
39+
40+
RTC_EP.OBJ: RTC_EP.ASM $(DEPS)
3041
$(ASM) $*;

src/RTC.INC

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
;
1313
; Recommented/Tested groupings:
1414
; - RTC_RP, RTC_NS, RTC_NS2
15-
; - RTC_OK, RTC_OK2
15+
; - RTC_OK, RTC_OK2, RTC_EP
1616
; - RTC_AT
1717
; - RTC_SW
1818
;----------------------------------------------------------------------------;
@@ -26,8 +26,8 @@ RTC_AT EQU 1 ; 1 AT - DS12x85/MC146818
2626

2727
;RTC_OK EQU 3 ; 3 OK - MSM5832
2828
;RTC_OK2 EQU 5 ; 5 OK2 - MSM6242
29+
;RTC_EP EQU 4 ; 4 EP - RTC-58321
2930

30-
;RTC_OK1 EQU 4 ; 4 OK1 - MSM58321 (in progress)
3131
;RTC_SW EQU 8 ; 8 SW - DS1216x/DS1315 SmartWatch
3232

3333
;----------------------------------------------------------------------------;
@@ -54,6 +54,11 @@ RESET_ON_ERROR = 1 ; reset date if error on POST
5454
;
5555
POST_ALT_STACK = 0 ; use BIOS stack during POST
5656

57+
;----------------------------------------------------------------------------;
58+
; Optional routines (can be removed to save code space)
59+
;
60+
USE_LEAP = 0 ; Do not include LEAP by deafult
61+
5762
;----------------------------------------------------------------------------;
5863
; Per-clock configuration below
5964
;
@@ -62,4 +67,13 @@ POST_ALT_STACK = 1 ; use alternate stack during POST
6267
; due to large amount of stack
6368
; space required
6469
RESET_ON_ERROR = 1 ; reset date if error on POST
65-
ENDIF
70+
USE_LEAP = 1
71+
ENDIF
72+
73+
IFDEF RTC_RP
74+
USE_LEAP = 1
75+
ENDIF
76+
77+
IFDEF RTC_OK
78+
USE_LEAP = 1
79+
ENDIF

src/RTC_AT.ASM

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
;----------------------------------------------------------------------------;
55
; GLaTICK (Generational Logic and Time Interval Cadence Keeper)
66
;----------------------------------------------------------------------------;
7-
; RTC Support for Standard AT CMOS (port 70H, 240H or 2C0H), MC146818, DS12x85
7+
; RTC Support for AT-type CMOS (port 70H, 240H or 2C0H), MC146818, DS12x85
88
;----------------------------------------------------------------------------;
99
INCLUDE RTC.INC
1010

@@ -75,11 +75,16 @@ INCLUDE MACROS.INC
7575
ASSUME DS:OPTROM, SS:OPTROM, CS:OPTROM, ES:OPTROM
7676
OPTROM SEGMENT BYTE PUBLIC 'CODE'
7777

78-
PUBLIC AT_DETECT, INT_1A_AT
78+
PUBLIC AT_DETECT, INT_1A_AT, STR_AT
7979
EXTRN INT_1A_DEFAULT:NEAR, IRET_CF:NEAR, GET_RTC:NEAR
8080

8181
RTC_AT_PROC PROC
8282

83+
;----------------------------------------------------------------------------;
84+
; AT Display string
85+
;----------------------------------------------------------------------------;
86+
STR_AT DB 'AT ', 0 ; AT = DS1285/MC146818
87+
8388
;----------------------------------------------------------------------------;
8489
; Supported I/O ports
8590
;----------------------------------------------------------------------------;

0 commit comments

Comments
 (0)