From 91c7c1dbba33f5a8cbee763a1ea65d2651827545 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Sun, 11 Jul 2021 22:52:23 +0800 Subject: [PATCH] Add graceful exit for DS1307 utility --- Source/Apps/I2C/rtcds7.asm | 243 +++++++++++++++++-------------------- Source/HBIOS/pcf8584.asm | 74 +++++------ 2 files changed, 151 insertions(+), 166 deletions(-) diff --git a/Source/Apps/I2C/rtcds7.asm b/Source/Apps/I2C/rtcds7.asm index 045a1cd0..2c05c96c 100644 --- a/Source/Apps/I2C/rtcds7.asm +++ b/Source/Apps/I2C/rtcds7.asm @@ -1,20 +1,21 @@ ;================================================================================================== -; PCF8584 I2C Clock Driver +; PCF8584/DS1307 I2C DATE AND TIME UTILITY ;================================================================================================== ; .ECHO "rtcds7\n" ; #INCLUDE "pcfi2c.inc" ; - -; - .ORG 100H + .ORG 100H ; DS7_START: - CALL DS7_PROBE ; PROBE FRO DEVICE - RET Z ; EXIT IF DEVICE NOT FOUND + LD (DS7_STK),SP ; SETUP A + LD SP,DS7_LOC ; LOCAL STACK ; - LD A,(FCB+1) ; GET FIRST CHAR + CALL DS7_INIT ; INITIALIZE AND + JR NZ,DS7_ERR ; RETURN WITH STATUS +; + LD A,(FCB+1) ; GET FIRST COMMAND LINE CHAR CP ' ' ; COMPARE TO BLANK. IF SO NO JR Z,DS7_ST0 ; ARGUMENTS SO DISLAY TIME AND DATE ; @@ -28,7 +29,7 @@ DS7_START: ; ; /D SET DATE ; - RET + JR DS7_EXIT ; DS7_ST1: LD A,(FCB+2) ; GET NEXT CHARACTER @@ -37,7 +38,7 @@ DS7_ST1: ; ; /T SET TIME ; - RET + JR DS7_EXIT ; DS7_ST2: LD A,(FCB+2) ; GET NEXT CHARACTER @@ -46,48 +47,27 @@ DS7_ST2: ; ; /S SET TIME AND DATE ; - RET + JR DS7_EXIT ; DS7_ST3: ; ; UNREGOGNIZED ARGUMENT ; - RET + JR DS7_EXIT ; DS7_ST0: - CALL DS7_RDC ; READ CLOCK DATA INTO BUFFER - CALL DS7_DISP ; DISPLAY TIME AND DATE FROM BUFFER - RET + CALL DS7_RDC ; READ CLOCK DATA INTO BUFFER + CALL DS7_DISP ; DISPLAY TIME AND DATE FROM BUFFER ; -;----------------------------------------------------------------------------- -; RETURN 00/Z IF NOT FOUND -; NZ IF FOUND +DS7_EXIT: + LD SP,(DS7_STK) ; RESTORE STACK + RET ; AND EXIT ; +DS7_ERR: + CALL PCF_INIERR ; DISPLAY ERROR + JR DS7_EXIT ; END EXIT ; -DS7_PROBE: - LD A,PCF_PIN ; SET PIN BIT - OUT (PCF_RS1),A - NOP - IN A,(PCF_RS1) ; CHECK IF SET - AND 07FH - JR NZ,DS7_PR0 ; ERROR IF NOT SET - - LD A,'%' - CALL COUT - - OR 0FFH ; SUCCESS - RET - -DS7_PR0: - LD A,PCF_OWN ; LOAD OWN ADDRESS IN S0, - OUT (PCF_RS0),A ; EFFECTIVE ADDRESS IS (OWN <<1) - - LD A,PCF_IDLE_ - OUT (PCF_RS1),A - - CALL PCF_INIERR ; DISLAY ERROR - XOR A ; SET ERROR - RET +DS7_STK .DW 2 ; SAVE STACK ; ;----------------------------------------------------------------------------- ; RTC READ @@ -101,25 +81,26 @@ DS7_PR0: ; 7. END READ WITH NON-ACKNOWLEDGE ; 8. ISSUE STOP AND RELEASE BUS ; -DS7_RDC:LD A,DS7_WRITE ; SET SLAVE ADDRESS - OUT (REGS0),A +DS7_RDC: + LD A,DS7_WRITE ; SET SLAVE ADDRESS + OUT (REGS0),A ; CALL PCF_WAIT_FOR_BB JP NZ,PCF_BBERR ; - CALL PCF_START ; GENERATE START CONDITION + CALL PCF_START ; GENERATE START CONDITION CALL PCF_WAIT_FOR_PIN; AND ISSUE THE SLAVE ADDRESS CALL NZ,PCF_PINERR ; - LD A,0 - OUT (REGS0),A ; PUT ADDRESS MSB ON BUS + LD A,0 + OUT (REGS0),A ; PUT ADDRESS MSB ON BUS CALL PCF_WAIT_FOR_PIN CALL NZ,PCF_PINERR ; CALL PCF_REPSTART ; REPEAT START ; - LD A,DS7_READ ; ISSUE CONTROL BYTE + READ - OUT (REGS0),A + LD A,DS7_READ ; ISSUE CONTROL BYTE + READ + OUT (REGS0),A ; CALL PCF_READI2C ; DUMMY READ ; @@ -149,7 +130,7 @@ DS7_WTPIN: CALL PCF_STOP ; IN A,(REGS0) - RET + RET ; ;----------------------------------------------------------------------------- @@ -165,7 +146,7 @@ DS7_CLP:LD C,(HL) LD A,(HL) OR A RET Z - CALL COUT + CALL COUT INC HL JR DS7_CLP RET @@ -180,10 +161,10 @@ DS7_CLKTBL: ; DS7_BCD:PUSH HL LD HL,DS7_BUF ; READ VALUE FROM - LD B,0 ; BUFFER, INDEXED BY A + LD B,0 ; BUFFER, INDEXED BY A ADD HL,BC LD A,(HL) - AND D ; MASK OFF UNNEEDED + AND D ; MASK OFF UNNEEDED SRL A SRL A SRL A @@ -201,81 +182,82 @@ DS7_BUF: .FILL 8,0 ; BUFFER FOR TIME, DATE AND CONTROL ;----------------------------------------------------------------------------- PCF_START: - LD A,PCF_START_ + LD A,PCF_START_ OUT (REGS1),A RET ; ;----------------------------------------------------------------------------- PCF_REPSTART: - LD A,PCF_REPSTART_ + LD A,PCF_REPSTART_ OUT (REGS1),A RET ; ;----------------------------------------------------------------------------- PCF_STOP: LD A,PCF_STOP_ - OUT (REGS1),A - RET + OUT (REGS1),A + RET ; ;----------------------------------------------------------------------------- -;; -PCF_INIT: - LD A,PCF_PIN ; S1=80H: S0 SELECTED, SERIAL - OUT (REGS1),A ; INTERFACE OFF - NOP - IN A,(REGS1) ; CHECK TO SEE S1 NOW USED AS R/W - AND 07FH ; CTRL. PCF8584 DOES THAT WHEN ESO - JP NZ,PCF_INIERR ; IS ZERO -; - LD A,PCF_OWN ; LOAD OWN ADDRESS IN S0, - OUT (REGS0),A ; EFFECTIVE ADDRESS IS (OWN <<1) - NOP - IN A,(REGS0) ; CHECK IT IS REALLY WRITTEN - CP PCF_OWN - JP NZ,PCF_SETERR -; - LD A,+(PCF_PIN | PCF_ES1) ; S1=0A0H - OUT (REGS1),A ; NEXT BYTE IN S2 - NOP - IN A,(REGS1) - AND 07FH - CP PCF_ES1 - JP NZ,PCF_REGERR -; - LD A,PCF_CLK ; LOAD CLOCK REGISTER S2 - OUT (REGS0),A - NOP - IN A,(REGS0) ; CHECK IT'S REALLY WRITTEN, ONLY - AND 1FH ; THE LOWER 5 BITS MATTER - CP PCF_CLK - JP NZ,PCF_CLKERR -; - LD A,PCF_IDLE_ - OUT (REGS1),A - NOP - IN A,(REGS1) - CP +(PCF_PIN | PCF_BB) - JP NZ,PCF_IDLERR -; - RET +; +DS7_INIT: + LD A,PCF_PIN ; S1=80H: S0 SELECTED, SERIAL + OUT (REGS1),A ; INTERFACE OFF + NOP + IN A,(REGS1) ; CHECK TO SEE S1 NOW USED AS R/W CTRL. + AND 07FH ; PCF8584 DOES THAT WHEN ESO IS ZERO + RET NZ ; PCF_INIERR +; + LD A,PCF_OWN ; LOAD OWN ADDRESS IN S0, + OUT (REGS0),A ; EFFECTIVE ADDRESS IS (OWN <<1) + NOP + IN A,(REGS0) ; CHECK IT IS REALLY WRITTEN + CP PCF_OWN + RET NZ ; PCF_SETERR +; + LD A,+(PCF_PIN | PCF_ES1) ; S1=0A0H + OUT (REGS1),A ; NEXT BYTE IN S2 + NOP + IN A,(REGS1) + AND 07FH + CP PCF_ES1 + RET NZ ; PCF_REGERR +; + LD A,PCF_CLK ; LOAD CLOCK REGISTER S2 + OUT (REGS0),A + NOP + IN A,(REGS0) ; CHECK IT'S REALLY WRITTEN, ONLY + AND 1FH ; THE LOWER 5 BITS MATTER + CP PCF_CLK + RET NZ ; PCF_CLKERR +; + LD A,PCF_IDLE_ + OUT (REGS1),A + NOP + IN A,(REGS1) + CP +(PCF_PIN | PCF_BB) + RET NZ ; PCF_IDLERR +; + XOR A + RET ; ;----------------------------------------------------------------------------- PCF_HANDLE_LAB: ; - LD A,PCF_PIN - OUT (REGS1),A - LD A,PCF_ES0 + LD A,PCF_PIN + OUT (REGS1),A + LD A,PCF_ES0 OUT (REGS1),A ; - LD HL,PCF_LABDLY + LD HL,PCF_LABDLY PCF_LABLP: LD A,H - OR L - DEC HL - JR NZ,PCF_LABLP + OR L + DEC HL + JR NZ,PCF_LABLP ; - IN A,(REGS1) - RET + IN A,(REGS1) + RET ; ;----------------------------------------------------------------------------- ; @@ -286,7 +268,7 @@ PCF_LABLP: ; PCF_WAIT_FOR_PIN: PUSH HL - LD HL,PCF_PINTO ; SET TIMEOUT VALUE + LD HL,PCF_PINTO ; SET TIMEOUT VALUE PCF_WFP0: IN A,(REGS1) ; GET BUS @@ -299,8 +281,8 @@ PCF_WFP0: JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT LD A,B ; - AND PCF_PIN ; IS TRANSMISSION COMPLETE? - JR NZ,PCF_WFP0 ; KEEP ASKING IF NOT OR + AND PCF_PIN ; IS TRANSMISSION COMPLETE? + JR NZ,PCF_WFP0 ; KEEP ASKING IF NOT OR POP HL ; YES COMPLETE (PIN=0) RETURN WITH ZERO RET PCF_WFP1: @@ -313,7 +295,7 @@ PCF_WFP1: XOR A ; RETURN NZ, A=01H INC A PCF_WFP2: - POP HL ; RET NZ, A=FF IF TIMEOUT + POP HL ; RET NZ, A=FF IF TIMEOUT RET ; PCF_STATUS .DB 00H @@ -330,17 +312,17 @@ PCF_WAIT_FOR_ACK: ; PCF_WFA0: IN A,(REGS1) ; READ PIN - LD (PCF_STATUS),A ; STATUS - LD B,A -; - DEC HL ; SEE IF WE HAVE TIMED - LD A,H ; OUT WAITING FOR PIN - OR L ; EXIT IF - JR Z,PCF_WFA1 ; WE HAVE -; - LD A,B ; OTHERWISE KEEP LOOPING - AND PCF_PIN ; UNTIL WE GET PIN - JR NZ,PCF_WFA0 ; OR TIMEOUT + LD (PCF_STATUS),A ; STATUS + LD B,A +; + DEC HL ; SEE IF WE HAVE TIMED + LD A,H ; OUT WAITING FOR PIN + OR L ; EXIT IF + JR Z,PCF_WFA1 ; WE HAVE +; + LD A,B ; OTHERWISE KEEP LOOPING + AND PCF_PIN ; UNTIL WE GET PIN + JR NZ,PCF_WFA0 ; OR TIMEOUT ; LD A,B ; WE GOT PIN SO NOW AND PCF_LRB ; CHECK WE HAVE @@ -454,16 +436,16 @@ PCF_READI2C: ; AFTER RESET THE BUS BUSY BIT WILL BE SET TO 1 I.E. NOT BUSY ; PCF_WAIT_FOR_BB: - LD HL,PCF_BBTO + LD HL,PCF_BBTO PCF_WFBB0: IN A,(REGS1) - AND PCF_BB - RET Z ; BUS IS FREE RETURN ZERO - DEC HL - LD A,H - OR L - JR NZ,PCF_WFBB0 ; REPEAT IF NOT TIMED OUT - CPL ; RET NZ IF TIMEOUT + AND PCF_BB + RET Z ; BUS IS FREE RETURN ZERO + DEC HL + LD A,H + OR L + JR NZ,PCF_WFBB0 ; REPEAT IF NOT TIMED OUT + CPL ; RET NZ IF TIMEOUT RET ; ;----------------------------------------------------------------------------- @@ -552,4 +534,7 @@ PCF_BBFAIL .DB "BUS BUSY$" ; #INCLUDE "i2ccpm.inc" ; - .END + .FILL 128 +DS7_LOC: +; + .END diff --git a/Source/HBIOS/pcf8584.asm b/Source/HBIOS/pcf8584.asm index 507f1037..54dfe6a4 100644 --- a/Source/HBIOS/pcf8584.asm +++ b/Source/HBIOS/pcf8584.asm @@ -123,21 +123,21 @@ PCF8584_INIT: ; ;----------------------------------------------------------------------------- PCF_START: - LD A,PCF_START_ + LD A,PCF_START_ OUT (PCF_RS1),A RET ; ;----------------------------------------------------------------------------- PCF_REPSTART: - LD A,PCF_REPSTART_ + LD A,PCF_REPSTART_ OUT (PCF_RS1),A RET ; ;----------------------------------------------------------------------------- PCF_STOP: LD A,PCF_STOP_ - OUT (PCF_RS1),A - RET + OUT (PCF_RS1),A + RET ; ;----------------------------------------------------------------------------- ; @@ -194,20 +194,20 @@ PCF_FAIL_FLAG: ;----------------------------------------------------------------------------- PCF_HANDLE_LAB: ; - LD A,PCF_PIN + LD A,PCF_PIN OUT (PCF_RS1),A - LD A,PCF_ES0 + LD A,PCF_ES0 OUT (PCF_RS1),A ; - LD HL,PCF_LABDLY + LD HL,PCF_LABDLY PCF_LABLP: LD A,H - OR L - DEC HL - JR NZ,PCF_LABLP + OR L + DEC HL + JR NZ,PCF_LABLP ; - IN A,(PCF_RS1) - RET + IN A,(PCF_RS1) + RET ; ;----------------------------------------------------------------------------- ; @@ -218,7 +218,7 @@ PCF_LABLP: ; PCF_WAIT_FOR_PIN: PUSH HL - LD HL,PCF_PINTO ; SET TIMEOUT VALUE + LD HL,PCF_PINTO ; SET TIMEOUT VALUE PCF_WFP0: IN A,(PCF_RS1) ; GET BUS @@ -231,8 +231,8 @@ PCF_WFP0: JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT LD A,B ; - AND PCF_PIN ; IS TRANSMISSION COMPLETE? - JR NZ,PCF_WFP0 ; KEEP ASKING IF NOT OR + AND PCF_PIN ; IS TRANSMISSION COMPLETE? + JR NZ,PCF_WFP0 ; KEEP ASKING IF NOT OR POP HL ; YES COMPLETE (PIN=0) RETURN WITH ZERO RET PCF_WFP1: @@ -262,17 +262,17 @@ PCF_WAIT_FOR_ACK: ; PCF_WFA0: IN A,(PCF_RS1) ; READ PIN - LD (PCF_STATUS),A ; STATUS - LD B,A + LD (PCF_STATUS),A ; STATUS + LD B,A ; - DEC HL ; SEE IF WE HAVE TIMED - LD A,H ; OUT WAITING FOR PIN - OR L ; EXIT IF - JR Z,PCF_WFA1 ; WE HAVE + DEC HL ; SEE IF WE HAVE TIMED + LD A,H ; OUT WAITING FOR PIN + OR L ; EXIT IF + JR Z,PCF_WFA1 ; WE HAVE ; - LD A,B ; OTHERWISE KEEP LOOPING - AND PCF_PIN ; UNTIL WE GET PIN - JR NZ,PCF_WFA0 ; OR TIMEOUT + LD A,B ; OTHERWISE KEEP LOOPING + AND PCF_PIN ; UNTIL WE GET PIN + JR NZ,PCF_WFA0 ; OR TIMEOUT ; LD A,B ; WE GOT PIN SO NOW AND PCF_LRB ; CHECK WE HAVE @@ -389,13 +389,13 @@ PCF_WAIT_FOR_BB: LD HL,PCF_BBTO PCF_WFBB0: IN A,(PCF_RS1) - AND PCF_BB - RET Z ; BUS IS FREE RETURN ZERO - DEC HL - LD A,H - OR L - JR NZ,PCF_WFBB0 ; REPEAT IF NOT TIMED OUT - CPL ; RET NZ IF TIMEOUT + AND PCF_BB + RET Z ; BUS IS FREE RETURN ZERO + DEC HL + LD A,H + OR L + JR NZ,PCF_WFBB0 ; REPEAT IF NOT TIMED OUT + CPL ; RET NZ IF TIMEOUT RET ; ;----------------------------------------------------------------------------- @@ -473,8 +473,8 @@ PCF_PRTERR: #IF (1) PCF_DBG: PUSH AF - PUSH DE - PUSH HL + PUSH DE + PUSH HL LD A,'[' CALL COUT LD HL,PCF_DBGF @@ -484,15 +484,15 @@ PCF_DBG: CALL COUT LD A,']' CALL COUT - POP HL - POP DE - POP AF + POP HL + POP DE + POP AF RET PCF_DBGF: .DB 0 ; DEBUG STAGE COUNTER #ENDIF ; -PCF_NOPCF .DB "NO DEVICE FOUND$" +PCF_NOPCF .DB "NOT PRESENT$" PCF_WRTFAIL .DB "SETTING DEVICE ID FAILED$" PCF_REGFAIL .DB "CLOCK REGISTER SELECT ERROR$" PCF_CLKFAIL .DB "CLOCK SET FAIL$"