From b9a251bb1f60506328ebadddba678260b66eeaf5 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sat, 29 Nov 2025 17:03:42 -0800 Subject: [PATCH] Minor Improvement in DS12RTC Driver - Refactored the Update-In-Progress checks to reduce code size and improve checking accuracy. --- Source/HBIOS/ds12rtc.asm | 44 +++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/Source/HBIOS/ds12rtc.asm b/Source/HBIOS/ds12rtc.asm index 516aa20c..e59db42e 100644 --- a/Source/HBIOS/ds12rtc.asm +++ b/Source/HBIOS/ds12rtc.asm @@ -252,64 +252,70 @@ DS12RTC_DETECT: ; READ CLOCK DATA INTO BUFFER AT HL (YYMMDDHHMMSS) ; DS12RTC_RDCLK: - LD D,H ; RESET DE - LD E,L ; ... IN CASE OF RESTART + LD E,0 ; CLEAR UIP FLAG + PUSH HL ; SAVE IN CASE OF RESTART LD C,$09 ; START WITH YEAR REG CALL DS12RTC_RDCLK1 ; DO YEAR (REG $09) - JR NZ,DS12RTC_RDCLK ; RESTART IF UIP DETECTED CALL DS12RTC_RDCLK1 ; DO MONTH (REG $08) - JR NZ,DS12RTC_RDCLK ; RESTART IF UIP DETECTED CALL DS12RTC_RDCLK1 ; DO DAY OF MONTH (REG $07) - JR NZ,DS12RTC_RDCLK ; RESTART IF UIP DETECTED DEC C ; SKIP DAY OF WEEK (REG $06) DEC C ; SKIP HOURS ALARM (REG $05) CALL DS12RTC_RDCLK1 ; DO HOUR (REG $04) - JR NZ,DS12RTC_RDCLK ; RESTART IF UIP DETECTED DEC C ; SKIP MINUTES ALARM (REG $03) CALL DS12RTC_RDCLK1 ; DO MINUTES (REG $02) - JR NZ,DS12RTC_RDCLK ; RESTART IF UIP DETECTED DEC C ; SKIP SECONDS ALARM (REG $01) CALL DS12RTC_RDCLK1 ; DO SECONDS (REG $00) + POP HL ; RESTORE BUF PTR + LD A,E ; UIP FLAG TO ACCUM + OR A ; TEST IT + JR NZ,DS12RTC_RDCLK ; IF UIP WAS FLAGGED, TRY AGAIN ; XOR A ; SIGNAL SUCCESS RET ; DONE ; DS12RTC_RDCLK1: + CALL DS12RTC_UIP ; CHECK FOR UPDATE IN PROGRESS + JR Z,DS12RTC_RDCLK2 ; IF NO UIP, SKIP AHEAD + INC E ; FLAG UIP OCCURRED +DS12RTC_RDCLK2: CALL DS12RTC_RDREG ; GET IT - LD (DE),A ; STORE IN BUF - INC DE ; BUMP BUF PTR + LD (HL),A ; STORE IN BUF + INC HL ; BUMP BUF PTR DEC C ; DEC REGISTER - JR DS12RTC_UIP ; RETURN VIA CHECK FOR UPDATE IN PROGRESS + RET ; ; WRITE CLOCK DATA FROM BUFFER AT HL ; DS12RTC_WRCLK: - LD D,H ; RESET DE - LD E,L ; ... IN CASE OF RESTART + LD E,0 ; CLEAR UIP FLAG + PUSH HL ; SAVE IN CASE OF RESTART LD C,$09 ; START WITH YEAR REG CALL DS12RTC_WRCLK1 ; DO YEAR (REG $09) - JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED CALL DS12RTC_WRCLK1 ; DO MONTH (REG $08) - JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED CALL DS12RTC_WRCLK1 ; DO DAY OF MONTH (REG $07) - 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 UIP DETECTED DEC C ; SKIP MINUTES ALARM (REG $03) CALL DS12RTC_WRCLK1 ; DO MINUTES (REG $02) - JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED DEC C ; SKIP SECONDS ALARM (REG $01) CALL DS12RTC_WRCLK1 ; DO SECONDS (REG $00) + POP HL ; RESTORE BUF PTR + LD A,E ; UIP FLAG TO ACCUM + OR A ; TEST IT + JR NZ,DS12RTC_WRCLK ; IF UIP WAS FLAGGED, TRY AGAIN ; XOR A ; SIGNAL SUCCESS RET ; DONE ; DS12RTC_WRCLK1: - LD A,(DE) ; GET VALUE + CALL DS12RTC_UIP ; CHECK FOR UPDATE IN PROGRESS + JR Z,DS12RTC_WRCLK2 ; IF NO UIP, SKIP AHEAD + INC E ; FLAG UIP OCCURRED +DS12RTC_WRCLK2: + LD A,(HL) ; GET VALUE CALL DS12RTC_WRREG ; WRITE IT - INC DE ; BUMP BUF PTR + INC HL ; BUMP BUF PTR DEC C ; DEC REGISTER JR DS12RTC_UIP ; RETURN VIA CHECK FOR UPDATE IN PROGRESS ;