Browse Source

Add graceful exit for DS1307 utility

pull/206/head
b1ackmai1er 5 years ago
parent
commit
91c7c1dbba
  1. 243
      Source/Apps/I2C/rtcds7.asm
  2. 74
      Source/HBIOS/pcf8584.asm

243
Source/Apps/I2C/rtcds7.asm

@ -1,20 +1,21 @@
;================================================================================================== ;==================================================================================================
; PCF8584 I2C Clock Driver
; PCF8584/DS1307 I2C DATE AND TIME UTILITY
;================================================================================================== ;==================================================================================================
; ;
.ECHO "rtcds7\n" .ECHO "rtcds7\n"
; ;
#INCLUDE "pcfi2c.inc" #INCLUDE "pcfi2c.inc"
; ;
;
.ORG 100H
.ORG 100H
; ;
DS7_START: 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 CP ' ' ; COMPARE TO BLANK. IF SO NO
JR Z,DS7_ST0 ; ARGUMENTS SO DISLAY TIME AND DATE JR Z,DS7_ST0 ; ARGUMENTS SO DISLAY TIME AND DATE
; ;
@ -28,7 +29,7 @@ DS7_START:
; ;
; /D SET DATE ; /D SET DATE
; ;
RET
JR DS7_EXIT
; ;
DS7_ST1: DS7_ST1:
LD A,(FCB+2) ; GET NEXT CHARACTER LD A,(FCB+2) ; GET NEXT CHARACTER
@ -37,7 +38,7 @@ DS7_ST1:
; ;
; /T SET TIME ; /T SET TIME
; ;
RET
JR DS7_EXIT
; ;
DS7_ST2: DS7_ST2:
LD A,(FCB+2) ; GET NEXT CHARACTER LD A,(FCB+2) ; GET NEXT CHARACTER
@ -46,48 +47,27 @@ DS7_ST2:
; ;
; /S SET TIME AND DATE ; /S SET TIME AND DATE
; ;
RET
JR DS7_EXIT
; ;
DS7_ST3: DS7_ST3:
; ;
; UNREGOGNIZED ARGUMENT ; UNREGOGNIZED ARGUMENT
; ;
RET
JR DS7_EXIT
; ;
DS7_ST0: 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 ; RTC READ
@ -101,25 +81,26 @@ DS7_PR0:
; 7. END READ WITH NON-ACKNOWLEDGE ; 7. END READ WITH NON-ACKNOWLEDGE
; 8. ISSUE STOP AND RELEASE BUS ; 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 CALL PCF_WAIT_FOR_BB
JP NZ,PCF_BBERR 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 PCF_WAIT_FOR_PIN; AND ISSUE THE SLAVE ADDRESS
CALL NZ,PCF_PINERR 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 PCF_WAIT_FOR_PIN
CALL NZ,PCF_PINERR CALL NZ,PCF_PINERR
; ;
CALL PCF_REPSTART ; REPEAT START 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 CALL PCF_READI2C ; DUMMY READ
; ;
@ -149,7 +130,7 @@ DS7_WTPIN:
CALL PCF_STOP CALL PCF_STOP
; ;
IN A,(REGS0) IN A,(REGS0)
RET
RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
@ -165,7 +146,7 @@ DS7_CLP:LD C,(HL)
LD A,(HL) LD A,(HL)
OR A OR A
RET Z RET Z
CALL COUT
CALL COUT
INC HL INC HL
JR DS7_CLP JR DS7_CLP
RET RET
@ -180,10 +161,10 @@ DS7_CLKTBL:
; ;
DS7_BCD:PUSH HL DS7_BCD:PUSH HL
LD HL,DS7_BUF ; READ VALUE FROM LD HL,DS7_BUF ; READ VALUE FROM
LD B,0 ; BUFFER, INDEXED BY A
LD B,0 ; BUFFER, INDEXED BY A
ADD HL,BC ADD HL,BC
LD A,(HL) LD A,(HL)
AND D ; MASK OFF UNNEEDED
AND D ; MASK OFF UNNEEDED
SRL A SRL A
SRL A SRL A
SRL A SRL A
@ -201,81 +182,82 @@ DS7_BUF: .FILL 8,0 ; BUFFER FOR TIME, DATE AND CONTROL
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
PCF_START: PCF_START:
LD A,PCF_START_
LD A,PCF_START_
OUT (REGS1),A OUT (REGS1),A
RET RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
PCF_REPSTART: PCF_REPSTART:
LD A,PCF_REPSTART_
LD A,PCF_REPSTART_
OUT (REGS1),A OUT (REGS1),A
RET RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
PCF_STOP: PCF_STOP:
LD A,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: 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 OUT (REGS1),A
; ;
LD HL,PCF_LABDLY
LD HL,PCF_LABDLY
PCF_LABLP: PCF_LABLP:
LD A,H 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: PCF_WAIT_FOR_PIN:
PUSH HL PUSH HL
LD HL,PCF_PINTO ; SET TIMEOUT VALUE
LD HL,PCF_PINTO ; SET TIMEOUT VALUE
PCF_WFP0: PCF_WFP0:
IN A,(REGS1) ; GET BUS IN A,(REGS1) ; GET BUS
@ -299,8 +281,8 @@ PCF_WFP0:
JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT
LD A,B ; 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 POP HL ; YES COMPLETE (PIN=0) RETURN WITH ZERO
RET RET
PCF_WFP1: PCF_WFP1:
@ -313,7 +295,7 @@ PCF_WFP1:
XOR A ; RETURN NZ, A=01H XOR A ; RETURN NZ, A=01H
INC A INC A
PCF_WFP2: PCF_WFP2:
POP HL ; RET NZ, A=FF IF TIMEOUT
POP HL ; RET NZ, A=FF IF TIMEOUT
RET RET
; ;
PCF_STATUS .DB 00H PCF_STATUS .DB 00H
@ -330,17 +312,17 @@ PCF_WAIT_FOR_ACK:
; ;
PCF_WFA0: PCF_WFA0:
IN A,(REGS1) ; READ PIN 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 LD A,B ; WE GOT PIN SO NOW
AND PCF_LRB ; CHECK WE HAVE 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 ; AFTER RESET THE BUS BUSY BIT WILL BE SET TO 1 I.E. NOT BUSY
; ;
PCF_WAIT_FOR_BB: PCF_WAIT_FOR_BB:
LD HL,PCF_BBTO
LD HL,PCF_BBTO
PCF_WFBB0: PCF_WFBB0:
IN A,(REGS1) 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 RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
@ -552,4 +534,7 @@ PCF_BBFAIL .DB "BUS BUSY$"
; ;
#INCLUDE "i2ccpm.inc" #INCLUDE "i2ccpm.inc"
; ;
.END
.FILL 128
DS7_LOC:
;
.END

74
Source/HBIOS/pcf8584.asm

@ -123,21 +123,21 @@ PCF8584_INIT:
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
PCF_START: PCF_START:
LD A,PCF_START_
LD A,PCF_START_
OUT (PCF_RS1),A OUT (PCF_RS1),A
RET RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
PCF_REPSTART: PCF_REPSTART:
LD A,PCF_REPSTART_
LD A,PCF_REPSTART_
OUT (PCF_RS1),A OUT (PCF_RS1),A
RET RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
PCF_STOP: PCF_STOP:
LD A,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: PCF_HANDLE_LAB:
; ;
LD A,PCF_PIN
LD A,PCF_PIN
OUT (PCF_RS1),A OUT (PCF_RS1),A
LD A,PCF_ES0
LD A,PCF_ES0
OUT (PCF_RS1),A OUT (PCF_RS1),A
; ;
LD HL,PCF_LABDLY
LD HL,PCF_LABDLY
PCF_LABLP: PCF_LABLP:
LD A,H 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: PCF_WAIT_FOR_PIN:
PUSH HL PUSH HL
LD HL,PCF_PINTO ; SET TIMEOUT VALUE
LD HL,PCF_PINTO ; SET TIMEOUT VALUE
PCF_WFP0: PCF_WFP0:
IN A,(PCF_RS1) ; GET BUS IN A,(PCF_RS1) ; GET BUS
@ -231,8 +231,8 @@ PCF_WFP0:
JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT JR Z,PCF_WFP1 ; YES WE HAVE, GO ACTION IT
LD A,B ; 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 POP HL ; YES COMPLETE (PIN=0) RETURN WITH ZERO
RET RET
PCF_WFP1: PCF_WFP1:
@ -262,17 +262,17 @@ PCF_WAIT_FOR_ACK:
; ;
PCF_WFA0: PCF_WFA0:
IN A,(PCF_RS1) ; READ PIN 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 LD A,B ; WE GOT PIN SO NOW
AND PCF_LRB ; CHECK WE HAVE AND PCF_LRB ; CHECK WE HAVE
@ -389,13 +389,13 @@ PCF_WAIT_FOR_BB:
LD HL,PCF_BBTO LD HL,PCF_BBTO
PCF_WFBB0: PCF_WFBB0:
IN A,(PCF_RS1) 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 RET
; ;
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
@ -473,8 +473,8 @@ PCF_PRTERR:
#IF (1) #IF (1)
PCF_DBG: PCF_DBG:
PUSH AF PUSH AF
PUSH DE
PUSH HL
PUSH DE
PUSH HL
LD A,'[' LD A,'['
CALL COUT CALL COUT
LD HL,PCF_DBGF LD HL,PCF_DBGF
@ -484,15 +484,15 @@ PCF_DBG:
CALL COUT CALL COUT
LD A,']' LD A,']'
CALL COUT CALL COUT
POP HL
POP DE
POP AF
POP HL
POP DE
POP AF
RET RET
PCF_DBGF: PCF_DBGF:
.DB 0 ; DEBUG STAGE COUNTER .DB 0 ; DEBUG STAGE COUNTER
#ENDIF #ENDIF
; ;
PCF_NOPCF .DB "NO DEVICE FOUND$"
PCF_NOPCF .DB "NOT PRESENT$"
PCF_WRTFAIL .DB "SETTING DEVICE ID FAILED$" PCF_WRTFAIL .DB "SETTING DEVICE ID FAILED$"
PCF_REGFAIL .DB "CLOCK REGISTER SELECT ERROR$" PCF_REGFAIL .DB "CLOCK REGISTER SELECT ERROR$"
PCF_CLKFAIL .DB "CLOCK SET FAIL$" PCF_CLKFAIL .DB "CLOCK SET FAIL$"

Loading…
Cancel
Save