From ac48639bfc7f343f00348aca75ed46eec1eeaa05 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 26 Nov 2025 13:05:21 -0800 Subject: [PATCH] Cleanup of DS12RTC Driver - Offset NVRAM register access by $60 to avoid collisions with IBM PC CMOS usage. - Wrap register accesses in DI/EI. The DS1288x requires no interrupts between the register selection and the data r/w. - Minor comment improvements. --- Source/HBIOS/ds12rtc.asm | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/Source/HBIOS/ds12rtc.asm b/Source/HBIOS/ds12rtc.asm index 7a3bb864..516aa20c 100644 --- a/Source/HBIOS/ds12rtc.asm +++ b/Source/HBIOS/ds12rtc.asm @@ -43,6 +43,11 @@ ; | $0D | VRT | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ; +-----+-------+-------+-------+-------+-------+-------+-------+-------+ ; +; NOTE: THE IBM PC CMOS USES REGISTER ADDRESSES UP TO $5F. THIS RTC +; IS SOMETIMES USED IN SYSTEMS THAT HAVE A X86 BOARD, SO WE AVOID ANY +; CONFLICT BY OFFSETTING OUR REGISTER INDEXES BY $60. THIS MEANS WE +; MAP REQUESTS FOR $00-$1F TO NVRAM REGISTERS $60-$7F. +; DS12RTC_IO .EQU $70 DS12RTC_SEL .EQU DS12RTC_IO + 0 DS12RTC_DATA .EQU DS12RTC_IO + 1 @@ -197,7 +202,7 @@ DS12RTC_SETTIM: ; DS12RTC_GETBYT: LD A,C ; INDEX TO ACCUM - ADD A,$0E ; RAM STARTS AT INDEX $0E + ADD A,$60 ; WE USE NVRAM STARTING AT $60 LD C,A ; INDEX BACK TO C CALL DS12RTC_RDREG ; GET THE VALUE LD E,A ; PUT IN E TO RETURN @@ -210,7 +215,7 @@ DS12RTC_GETBYT: ; DS12RTC_SETBYT: LD A,C ; INDEX TO ACCUM - ADD A,$0E ; RAM STARTS AT INDEX $0E + ADD A,$60 ; WE USE NVRAM STARTING AT $60 LD C,A ; INDEX BACK TO C LD A,E ; PUT VALUE IN A CALL DS12RTC_WRREG ; WRITE IT @@ -283,25 +288,25 @@ DS12RTC_WRCLK: LD E,L ; ... IN CASE OF RESTART LD C,$09 ; START WITH YEAR REG CALL DS12RTC_WRCLK1 ; DO YEAR (REG $09) - JR NZ,DS12RTC_WRCLK ; RESTART IF SO + JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED CALL DS12RTC_WRCLK1 ; DO MONTH (REG $08) - JR NZ,DS12RTC_WRCLK ; RESTART IF SO + JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED CALL DS12RTC_WRCLK1 ; DO DAY OF MONTH (REG $07) - JR NZ,DS12RTC_WRCLK ; RESTART IF SO + JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED DEC C ; SKIP DAY OF WEEK (REG $06) DEC C ; SKIP HOURS ALARM (REG $05) CALL DS12RTC_WRCLK1 ; DO HOUR (REG $04) - JR NZ,DS12RTC_WRCLK ; RESTART IF SO + JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED DEC C ; SKIP MINUTES ALARM (REG $03) CALL DS12RTC_WRCLK1 ; DO MINUTES (REG $02) - JR NZ,DS12RTC_WRCLK ; RESTART IF SO + JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED DEC C ; SKIP SECONDS ALARM (REG $01) CALL DS12RTC_WRCLK1 ; DO SECONDS (REG $00) ; XOR A ; SIGNAL SUCCESS RET ; DONE ; -DS12RTC_WRCLK1: ; 108TS +DS12RTC_WRCLK1: LD A,(DE) ; GET VALUE CALL DS12RTC_WRREG ; WRITE IT INC DE ; BUMP BUF PTR @@ -339,22 +344,26 @@ DS12RTC_INITDEV: ; C=REGISTER ; A=VALUE ; -DS12RTC_RDREG: ; 43TS +DS12RTC_RDREG: + HB_DI ; NO INTS BETWEEN REG SEL AND DATA LD A,C ; REGSITER TO A OUT (DS12RTC_SEL),A ; SELECT IT IN A,(DS12RTC_DATA) ; GET REG VALUE + HB_EI ; RESTORE INTS RET ; DONE ; ; WRITE REGSITER ; C=REGSITER ; A=VALUE ; -DS12RTC_WRREG: ; 64TS +DS12RTC_WRREG: + HB_DI ; NO INTS BETWEEN REG SEL AND DATA PUSH AF ; SAVE VALUE TO WRITE LD A,C ; REGSITER TO A OUT (DS12RTC_SEL),A ; SELECT IT POP AF ; RECOVER VALUE TO WRITE OUT (DS12RTC_DATA),A ; GET REG VALUE + HB_EI ; RESTORE INTS RET ; DONE ; ; CHECK FOR UPDATE IN PROGRESS @@ -377,4 +386,4 @@ DS12RTC_UIP: ; DS12RTC_TIMBUF IS DRIVER'S INTERNAL CLOCK DATA BUFFER ; DS12RTC_TIMBUF .FILL 6,0 ; 6 BYTES FOR GETTIM, YYMMDDHHMMSS -DS12RTC_TIMDEF .DB $00,$01,$01,$00,$00,$00 +DS12RTC_TIMDEF .DB $00,$01,$01,$00,$00,$00 ; DEFAULT DATE/TIME