Skip to content

Commit 49f084f

Browse files
committed
Software compatibility for 58167: 86Box, ASTCLOCK, etc. Remove AAM imm
1 parent d5e38e1 commit 49f084f

File tree

7 files changed

+230
-121
lines changed

7 files changed

+230
-121
lines changed

src/GLATICK.ASM

Lines changed: 58 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@
2727
; - MSM5832: 310h, 210h
2828
; - MM58167: *240h, *340h, *2C0h, 250h, *300h, 350h, 377h, 037Dh, 027Dh
2929
; - RP5C15: *2C0h
30-
; - MSM6242: 2C0, 240, 250, 300, 340, 350
31-
;
32-
; * overlapping port numbers: 240h, 2C0h, 340h
30+
; - MSM6242: 2C0h, 240h, 250h, 300h, 340h, 350h
3331
;
3432
; TODO:
33+
; - RTC Detection with overlapping port numbers: 240h, 2C0h, 340h
3534
; - Other Clock Types:
3635
; - MSM-58321 (is different than 5832?): 2C0, 27E, 37E, 02A2-02A3?
3736
; - DS1216E/DS1315 "SmartWatch"
@@ -41,8 +40,8 @@
4140
;
4241
;----------------------------------------------------------------------------;
4342
VER_NAME EQU 'GLaTICK'
44-
VER_NUM EQU '0.8.3' ; (max 6 chars)
45-
VER_DATE EQU '05/09/23' ; must be MM/DD/YY format
43+
VER_NUM EQU '0.8.4' ; (max 6 chars)
44+
VER_DATE EQU '05/11/23' ; must be MM/DD/YY format
4645
COPY_YEAR EQU '2023'
4746

4847
;----------------------------------------------------------------------------;
@@ -52,17 +51,6 @@ SHOW_BANNER = 1 ; always show full banner at POST
5251
SHOW_RTC = 1 ; show detected RTC and clock
5352
SHOW_CLOCK = 1 ; if above, show date/time at POST
5453

55-
;----------------------------------------------------------------------------;
56-
; RESET_ON_ERROR:
57-
; If enabled, this will validate the date and time read from the clock at POST
58-
; and if invalid attempt to reset the clock to 1980-01-01 00:00:00. This is
59-
; to prevent the "chicken and egg" scenario where DOS will not enable the RTC
60-
; thus preventing the date from being set using DATE/TIME.
61-
; If disabled, non-error/CF results will be displayed as returned by the clock
62-
; driver. This may be helpful for debugging clock read issues.
63-
;
64-
RESET_ON_ERROR = 1 ; reset date if error on POST
65-
6654
MAGIC_WORD EQU 0AA55H ; Magic Word used for option ROM
6755
ROM_SIZE EQU 800H ; size of ROM (2K)
6856

@@ -76,7 +64,7 @@ DATE_FMT = 3 ; 0 = MM/DD/YY (Ye Olde BIOS style)
7664
TIME_SEC = 0 ; 1 = HH:MM:SS, 0 = HH:MM only
7765

7866
;----------------------------------------------------------------------------;
79-
; Formatting based on display config
67+
; Date/time display formatting based on display config
8068
;
8169
IF DATE_FMT LT 2
8270
DATE_SEP = '/' ; '/' date separator
@@ -98,8 +86,8 @@ INCLUDE SEGS.INC
9886
ASSUME DS:OPTROM, SS:OPTROM, CS:OPTROM, ES:OPTROM
9987
OPTROM SEGMENT BYTE PUBLIC 'CODE'
10088

101-
PUBLIC INT_1A_DEFAULT, IS_LEAP, LEAP_NEXT, GET_RTC
102-
PUBLIC PACK_BCD, BCD_TO_WORD, BCD_TO_BYTE, STR_CRLF
89+
PUBLIC INT_1A_DEFAULT, IS_LEAP, LEAP_NEXT, GET_RTC, STR_CRLF
90+
PUBLIC PACK_BCD, UNPACK_BCD, BCD_TO_WORD, BCD_TO_BYTE, BYTE_TO_BCD
10391

10492
EXTRN OUT_CHAR:NEAR, OUT_SZ_ATTR:NEAR, OUT_SZ:NEAR, OUT_SZ_NL:NEAR
10593
EXTRN WORD_HEX:NEAR, BYTE_HEX:NEAR
@@ -113,11 +101,12 @@ EXTRN POST_END_COL:NEAR, POST_END_COL_NL:NEAR, IS_GLABIOS:NEAR
113101
ROM_HEADER PROC FAR
114102
DW MAGIC_WORD ; ROM magic number
115103
DB ROM_SIZE / 512 ; ROM size (512 byte blocks)
116-
ROM_HEADER ENDP ; fall through to INIT
104+
ROM_HEADER ENDP
117105

118106
;----------------------------------------------------------------------------;
119107
; INIT procedure called during POST
120108
;----------------------------------------------------------------------------;
109+
ORG 0003H ; fixed offset for INIT
121110
ROM_INIT PROC
122111
PUSHF
123112
PUSH AX ; preserve all registers
@@ -264,7 +253,7 @@ DETECT_SET:
264253
CALL BCD_TIME_TO_TICKS ; set BIOS time/clock from BCD values
265254
MOV AH, 1
266255
INT 1AH
267-
MOV DL, 1 ; set time is valid flag
256+
MOV DL, 1 ; set "time is valid" flag (DL=1)
268257

269258
DETECT_DONE:
270259
IF SHOW_RTC EQ 1
@@ -290,18 +279,19 @@ DETECT_RESET:
290279
MOV CX, 1980H ; default to beginning of time
291280
MOV DX, 0101H ; Jan 01
292281
INT 1AH
282+
293283
MOV AH, 3 ; reset time to 00:00:00
294284
CWD ; DX = 0
295285
MOV CX, DX ; CX = 0
296286
INT 1AH
297-
IF SHOW_RTC EQ 1
287+
IF SHOW_RTC EQ 1
298288
;----------------------------------------------------------------------------;
299289
; Force 'Error' message since clock was reset
300290
;
301-
CWD ; DL = 0 (invalid read)
302-
ENDIF
291+
CWD ; clear "time is valid" flag (DL=0)
292+
ENDIF ; END IF SHOW_RTC
303293
JMP SHORT DETECT_DONE
304-
ENDIF ; /RESET_ON_ERROR
294+
ENDIF ; END IF RESET_ON_ERROR
305295

306296
;----------------------------------------------------------------------------;
307297
; Print detected clock type and I/O port (if enabled)
@@ -312,7 +302,7 @@ DETECT_RESET:
312302
; DL = valid flag: 1 = display time, 0 = print 'Error'
313303
;----------------------------------------------------------------------------;
314304
PRINT_DETECTED PROC
315-
POST_COL_1 STR_DETECT, POST_CLR_VAL2, 1 ; display 'RTC' row label
305+
POST_COL_1 STR_RTC, POST_CLR_VAL2, 1 ; display 'RTC' row label
316306
CALL OUT_SZ ; display RTC name in SI
317307
TEST DI, DI ; port number zero?
318308
JZ RTC_DONE ; if zero, do not display
@@ -331,7 +321,7 @@ PORT_DONE:
331321
;----------------------------------------------------------------------------;
332322
PRINT_DATETIME PROC
333323
CALL POST_END_COL ; end first column
334-
POST_COL_2 STR_DT, POST_CLR_VAL2 ; start second column
324+
POST_COL_2 STR_CLK, POST_CLR_VAL2 ; start second column
335325

336326
;----------------------------------------------------------------------------;
337327
; Check if clock was previously in error and reset
@@ -357,7 +347,7 @@ PRINT_DATETIME PROC
357347
POP CX ; discard date and time values
358348
POP DX
359349
RTC_PRINT_ERR:
360-
MOV SI, OFFSET STR_DT_ERR ; print 'Error' message
350+
MOV SI, OFFSET STR_ERR ; print 'Error' message
361351
CALL OUT_SZ
362352
JMP SHORT RTC_DONE ; end column and exit
363353

@@ -414,13 +404,13 @@ RTC_PRINT_DATE:
414404
MOV AL, ' '
415405
CALL OUT_CHAR
416406

417-
;----------------------------------------------------------------------------;
418-
; Display Time
419-
;----------------------------------------------------------------------------;
420407
POP CX ; restore time
421408
POP DX
422-
MOV AL, CH ; AL = BCD hours
423409

410+
;----------------------------------------------------------------------------;
411+
; Print Time
412+
;----------------------------------------------------------------------------;
413+
MOV AL, CH ; AL = BCD hours
424414
IF TIME_FMT EQ 1 ; 12 hour time
425415
CMP AL, 12H ; is noon or before?
426416
JLE TIME_12_DONE ; jump if so
@@ -457,9 +447,9 @@ TIME_12_DONE:
457447
; If 12 hour time, display a/p
458448
;
459449
MOV AL, 'a'
460-
CMP CH, 12H
461-
JL TIME_12_DONE_1
462-
MOV AL, 'p'
450+
CMP CH, 12H ; hours > 12?
451+
JL TIME_12_DONE_1 ; if not, leave 'a'
452+
MOV AL, 'p' ; otherwise, change to 'p'
463453
TIME_12_DONE_1:
464454
CALL OUT_CHAR
465455
ENDIF ; END IF 12 hour time
@@ -556,7 +546,7 @@ GET_RTC ENDP
556546
;----------------------------------------------------------------------------;
557547
INT_1A_DEFAULT PROC NEAR
558548
INT INT_1A_BIOS ; use BIOS function instead
559-
IRET
549+
IRET ; clobber BIOS INT 1Ah flags and IRET
560550
INT_1A_DEFAULT ENDP
561551

562552
;----------------------------------------------------------------------------;
@@ -569,7 +559,7 @@ INT_1A_DEFAULT ENDP
569559
;----------------------------------------------------------------------------;
570560
BCD_TO_WORD PROC
571561
PUSH BX
572-
MOV BX, AX ; save
562+
MOV BX, AX ; save input
573563
CALL BCD_TO_BYTE ; convert low byte
574564
XCHG AX, BX ; BL = low byte
575565
MOV AL, AH ; AL = high byte
@@ -592,11 +582,24 @@ BCD_TO_WORD ENDP
592582
; Clobbers: AH
593583
;----------------------------------------------------------------------------;
594584
BCD_TO_BYTE PROC
595-
UNPACK_BCD ; split nibbles in AL into BCD in AH/AL
585+
CALL UNPACK_BCD ; split nibbles in AL into BCD in AH/AL
596586
AAD ; AL = unpacked BCD nibbles into decimal
597587
RET
598588
BCD_TO_BYTE ENDP
599589

590+
;----------------------------------------------------------------------------;
591+
; Convert packed BCD to unpacked BCD
592+
;----------------------------------------------------------------------------;
593+
; Input:
594+
; AL = packed BCD value
595+
; Output:
596+
; AH/AL = unpacked BCD value
597+
;----------------------------------------------------------------------------;
598+
UNPACK_BCD PROC
599+
UNPACK_NIB ; unpack nibbles
600+
RET
601+
UNPACK_BCD ENDP
602+
600603
;----------------------------------------------------------------------------;
601604
; Convert BYTE to packed BCD
602605
;----------------------------------------------------------------------------;
@@ -610,19 +613,16 @@ BYTE_TO_BCD PROC
610613
AAM ; split nibbles to AH / AL
611614

612615
;----------------------------------------------------------------------------;
613-
; Convert Unpacked BCD to Packed BCD in AX
616+
; Convert unpacked BCD to packed BCD
614617
;----------------------------------------------------------------------------;
615618
; Input:
616-
; AX = Unpacked BCD value
619+
; AH/AL = Unpacked BCD value
617620
; Output:
618621
; AL = Packed BCD value, CF = 0
619622
; Clobbers: AH
620623
;----------------------------------------------------------------------------;
621624
PACK_BCD PROC
622-
REPT 4
623-
SHL AH, 1 ; shift low nibble into high nibble
624-
ENDM
625-
OR AL, AH ; combine nibbles
625+
PACK_NIB ; pack nibbles
626626
RET
627627
PACK_BCD ENDP
628628
BYTE_TO_BCD ENDP
@@ -755,7 +755,6 @@ LEAP_NEXT ENDP
755755
; CF = 1 if error
756756
; Clobbers: AX
757757
;----------------------------------------------------------------------------;
758-
PUBLIC VALIDATE_TIME
759758
VALIDATE_TIME PROC
760759
MOV AL, CH
761760
CALL BCD_TO_BYTE ; AL = BYTE hours
@@ -787,7 +786,6 @@ VALIDATE_TIME ENDP
787786
; CF = 1 if error
788787
; Clobbers: AX
789788
;----------------------------------------------------------------------------;
790-
PUBLIC VALIDATE_DATE
791789
VALIDATE_DATE PROC
792790

793791
;----------------------------------------------------------------------------;
@@ -838,44 +836,40 @@ VER_BANNER DB CR, LF
838836
DB VER_NAME, ' [', HEART, '] '
839837
DB "It's About Time"
840838
DB CR, LF
839+
DB 'Ver: '
840+
ELSE
841+
DB VER_NAME, ' ' ; embed name and version
842+
ENDIF
843+
DB VER_NUM, ' '
841844
DB '(C) '
842845
DB COPY_YEAR
843846
DB ' 640KB Released under GPLv3'
844-
ELSE
845-
DB VER_NAME, ' '
846-
ENDIF
847847
STR_CRLF DB CR, LF, 0
848-
849-
;VER DB 'v', VER_NUM, ' ', VER_DATE, 0
850-
VER DB VER_NUM, 0
851-
852-
STR_DT DB 'Clock', 0
853-
STR_DT_ERR DB 'Error', 0
854-
STR_DETECT DB 'RTC '
855-
DB POST_L, 0
856-
POST_RSEP DB POST_R, 0
848+
STR_RTC DB 'RTC', 0
849+
STR_CLK DB 'Clock', 0
850+
STR_ERR DB 'Error', 0
857851

858852
;----------------------------------------------------------------------------;
859853
; RTC type display
860854
;
861855
STR_NONE DB 'None', 0
862856
IFDEF RTC_AT
863-
STR_AT DB 'AT ', 0 ; 1 = AT = DS1285/MC146818
857+
STR_AT DB 'AT ', 0 ; AT = DS1285/MC146818
864858
ENDIF
865859
IFDEF RTC_OK
866-
STR_OK DB '5832 ', 0 ; 2 = OK = MSM5832/1
860+
STR_OK DB '5832 ', 0 ; OK = MSM5832/1
867861
ENDIF
868862
IFDEF RTC_OK2
869-
STR_OK2 DB '6242 ', 0 ; = OK2 = MSM6242
863+
STR_OK2 DB '6242 ', 0 ; OK2 = MSM6242
870864
ENDIF
871865
IFDEF RTC_RP
872-
STR_RP DB 'RP5C15 ', 0 ; 3 = RP = RP5C15
866+
STR_RP DB 'RP5C15 ', 0 ; RP = RP5C15
873867
ENDIF
874868
IFDEF RTC_SW
875-
STR_SW DB 'DS1216 ', 0 ; 4 = SW = DS1216x
869+
STR_SW DB 'DS1216 ', 0 ; SW = DS1216x
876870
ENDIF
877871
IFDEF RTC_NS
878-
STR_NS DB '58167 ', 0 ; 6,7 = NS = MM58167AN
872+
STR_NS DB '58167 ', 0 ; NS = MM58167AN
879873
ENDIF
880874

881875
;----------------------------------------------------------------------------;

src/MACROS.INC

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,36 @@ DNB RECORD HBN:4, LBN:4
1212
DBW RECORD HWB:8, LWB:8
1313

1414
;----------------------------------------------------------------------------;
15-
; Unpack BCD - Split nibbles (packed BCD) in AL into AH/AL (unpacked BCD)
16-
;----------------------------------------------------------------------------;
17-
UNPACK_BCD MACRO
15+
; Unpack packed BCD nibbles in AL into AH/AL (unpacked BCD)
16+
;----------------------------------------------------------------------------;
17+
SAFE_V20 EQU 1 ; don't use AAM/AAD imm instructions to split
18+
; nibbles in case some CPUs/emulators do not
19+
; implement this
20+
UNPACK_NIB MACRO
21+
IF SAFE_V20 EQ 1
22+
MOV AH, AL ; AH = packed input
23+
REPT 4
24+
SHR AH, 1 ; shift high nibble into low nibble
25+
ENDM
26+
AND AL, 0FH ; isolate low nibble
27+
ELSE
1828
DB 0D4H, 10H ; AAM 10H
29+
ENDIF
30+
ENDM
31+
32+
;----------------------------------------------------------------------------;
33+
; Pack unpacked BCD nibbles in AH/AL into packed BCD in AL
34+
;----------------------------------------------------------------------------;
35+
PACK_NIB MACRO
36+
IF SAFE_V20 EQ 1
37+
AND AL, 0FH ; isolate low nibble
38+
REPT 4
39+
SHL AH, 1 ; shift low nibble into high nibble
40+
ENDM
41+
OR AL, AH ; combine nibbles
42+
ELSE
43+
DB 0D5H, 10H ; AAD 10H
44+
ENDIF
1945
ENDM
2046

2147
;----------------------------------------------------------------------------;

0 commit comments

Comments
 (0)