; ;================================================================================================== ; MAXIM DS1305 RTC DRIVER ;================================================================================================== ; ; THE DS1305 USES AN SPI INTERFACE. THIS DRIVER CURRENTLY ASSUMES THE ; FPGA-BASED SPI INTERFACE IMPLEMENTED IN THE S100 FPGA Z80. ; ; TRICKLE CHARGING IS NOT CURRENTLY IMPLEMENTED SINCE THE S100 FPGA Z80 ; DOES NOT SUPPORT THE USER OF A SUPER CAPACITOR. ; ; REGISTER ADDRESSES (HEX / BCD): ; ; +---+-----+---------------+-------------------+------------------+----------------+ ; |ADR| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | RANGE | REGISTER | ; +---+-----+---------------+-------------------+------------------+----------------+ ; | 0 | 0 | 10-SECOND | 1-SECOND | 00-59 | SECONDS | ; +---+-----+-----+---------+-------------------+------------------+----------------+ ; | 1 | 0 | 10-MINUTE | 1-MINUTE | 00-59 | MINUTES | ; +---+-----+-----+---------+-------------------+------------------+----------------+ ; | 2 | 0 | 0 | 10-HOUR | 1-HOUR | 00-23 | HOURS | ; +---+-----+-----+----+----+-------------------+------------------+----------------+ ; | 3 | 0 | 0 | 0 | 0 | DAY OF WEEK | 01-07 | DAY OF WEEK | ; +---+-----+-----+----+----+----+--------------+------------------+----------------+ ; | 4 | 0 | 0 | 10-DATE | 1-DATE | 01-31 | DATE | ; +---+-----+-----+----+----+-------------------+------------------+----------------+ ; | 5 | 0 | 0 |10-MONTH | 1-MONTH | 01-12 | MONTH | ; +---+-----+-----+----+----+-------------------+------------------+----------------+ ; | 6 | 10-YEAR | 1-YEAR | 00-99 | YEAR | ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; --- ALARM 0 --- ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; | 7 | M | 10-SECOND | 1-SECOND | 00-59 | SECONDS ALARM | ; +---+-----+---------------+-------------------+------------------+----------------+ ; | 8 | M | 10-MINUTE | 1-MINUTE | 00-59 | MINUTES ALARM | ; +---+-----+-----+---------+-------------------+------------------+----------------+ ; | 9 | M | 0 | 10-HOUR | 1-HOUR | 00-23 | HOURS ALARM | ; +---+-----+-----+----+----+-------------------+------------------+----------------+ ; | A | M | 0 | 0 | 0 | DAY | 1-7 | DAY ALARM | ; +---+-----+-----+----+----+----+--------------+------------------+----------------+ ; --- ALARM 1 --- ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; | B | M | 10-SECOND | 1-SECOND | 00-59 | SECONDS ALARM | ; +---+-----+---------------+-------------------+------------------+----------------+ ; | C | M | 10-MINUTE | 1-MINUTE | 00-59 | MINUTES ALARM | ; +---+-----+-----+---------+-------------------+------------------+----------------+ ; | D | M | 0 | 10-HOUR | 1-HOUR | 00-23 | HOURS ALARM | ; +---+-----+-----+----+----+-------------------+------------------+----------------+ ; | E | M | 0 | 0 | 0 | DAY | 1-7 | DAY ALARM | ; +---+-----+-----+----+----+----+--------------+------------------+----------------+ ; ; +---+-----+-----+---------+-------------------+------------------+----------------+ ; | F |/EOSC| WP | 0 | 0 | 0 |INTC|AIE1|AIE0| | CONTROL REG | ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; |10 | 0 | 0 | 0 | 0 | 0 | 0 |IRQ1|IRQ0| | STATUS REG | ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; |11 | TRICKLE CHG ENABLE | DIODE |RESISTOR | | TRICKLE CHG REG| ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; |12-1F | RESERVED | | | ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; |20-7F | USER NVRAM | 00-FF | | ; +---+-----+-----+----+----+----+----+----+----+------------------+----------------+ ; ; 0 = SHOULD BE SET TO 0 FOR VALID TIME/CALENDAR RANGE. ; CLOCK CALENDAR DATA IS BCD. AUTOMATIC LEAP YEAR ADJUSTMENT. ; DAY-OF-WEEK CODED AS SUNDAY = 1 THROUGH SATURDAY = 7. ; ; CONSTANTS ; DS5RTC_BASE .EQU $68 DS5RTC_DATA .EQU DS5RTC_BASE + 0 DS5RTC_SELECT .EQU DS5RTC_BASE + 2 ; WRITE DS5RTC_STATUS .EQU DS5RTC_BASE + 2 ; READ DS5RTC_RUN .EQU DS5RTC_BASE + 3 ; START READ/WRITE USING IN/OUT OPCODE ; ; IO PORTS ; DS5NVM_BASE .EQU DS5RTC_BASE + $20 DS5RTC_REG_SEC .EQU $00 DS5RTC_REG_MIN .EQU $01 DS5RTC_REG_HOUR .EQU $02 DS5RTC_REG_WEEKDAY .EQU $03 DS5RTC_REG_DATE .EQU $04 DS5RTC_REG_MONTH .EQU $05 DS5RTC_REG_YEAR .EQU $06 DS5RTC_REG_ALM0_SEC .EQU $07 DS5RTC_REG_ALM0_MIN .EQU $08 DS5RTC_REG_ALM0_HOUR .EQU $09 DS5RTC_REG_ALM0_DAY .EQU $0A DS5RTC_REG_ALM1_SEC .EQU $0B DS5RTC_REG_ALM1_MIN .EQU $0C DS5RTC_REG_ALM1_HOUR .EQU $0D DS5RTC_REG_ALM1_DAY .EQU $0E DS5RTC_REG_CONTROL .EQU $0F DS5RTC_REG_STATUS .EQU $10 DS5RTC_REG_TCHG .EQU $11 DS5RTC_REG_NVM_BASE .EQU $20 ; ; VALUES FOR DIFFERENT BATTERY OR SUPERCAPACITOR CHARGE RATES ; DS5RTC_TC1D2K .EQU %10100101 ; 1 DIODE 2K RESISTOR (DEFAULT) DS5RTC_TC1D4K .EQU %10100110 ; 1 DIODE 4K RESISTOR DS5RTC_TC1D8K .EQU %10100111 ; 1 DOIDE 8K RESISTOR DS5RTC_TC2D2K .EQU %10101001 ; 2 DIODES 2K RESISTOR DS5RTC_TC2D4K .EQU %10101010 ; 2 DIODES 4K RESISTOR DS5RTC_TC2D8K .EQU %10101011 ; 2 DIODES 8K RESISTOR ; ; ; DS5RTC_BUFSIZE .EQU 6 ; 6 BYTE BUFFER (YYMMDDHHMMSS) ; DEVECHO "DS5RTC: RTCIO=" DEVECHO DS5RTC_BASE DEVECHO ", IO=" DEVECHO DS5RTC_BASE DEVECHO "\n" ; ;-------------------------------------------------------------------------------------------------- ; HBIOS MODULE HEADER ;-------------------------------------------------------------------------------------------------- ; ORG_DS5RTC .EQU $ ; .DW SIZ_DS5RTC ; MODULE SIZE .DW DS5RTC_INITPHASE ; ADR OF INIT PHASE HANDLER ; DS5RTC_INITPHASE: ; INIT PHASE HANDLER, A=PHASE ;CP HB_PHASE_PREINIT ; PREINIT PHASE? ;JP Z,DS5RTC_PREINIT ; DO PREINIT CP HB_PHASE_INIT ; INIT PHASE? JP Z,DS5RTC_INIT ; DO INIT RET ; DONE ; ; RTC DEVICE INITIALIZATION ENTRY ; DS5RTC_INIT: LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? OR A ; SET FLAGS RET NZ ; IF ALREADY ACTIVE, ABORT ; CALL NEWLINE ; FORMATTING PRTS("DS5RTC: IO=0x$") LD A, DS5RTC_BASE CALL PRTHEXBYTE ; CALL DS5RTC_DETECT ; HARDWARE DETECTION JR Z,DS5RTC_INIT1 ; IF ZERO, ALL GOOD PRTS(" NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT OR $FF ; SIGNAL FAILURE RET ; BAIL OUT ; DS5RTC_INIT1: ; DISPLAY CURRENT TIME CALL PC_SPACE ; FORMATTING LD HL,DS5RTC_BUF ; USE INTERNAL BUFFER CALL DS5RTC_RDCLK ; GET RAW RTC DATE/TIME LD HL,DS5RTC_TIMBUF ; POINT TO HBIOS TIME BUF CALL DS5RTC_CLK2TIM ; CONVERT TO HBIOS FMT LD HL,DS5RTC_TIMBUF ; POINT TO HBIOS TIME BUF CALL PRTDT ; PRINT FORMATTED DATE/TIME ; ; ADD OURSELVES TO RTC DISPATCHER LD BC,DS5RTC_DISPATCH CALL RTC_SETDISP ; XOR A RET ; ; RTC DEVICE FUNCTION DISPATCH ENTRY ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; B: FUNCTION (IN) ; DS5RTC_DISPATCH: LD A, B ; Get requested function AND $0F ; Isolate Sub-Function JP Z, DS5RTC_GETTIM ; Get Time DEC A JP Z, DS5RTC_SETTIM ; Set Time DEC A JP Z, DS5RTC_GETBYT ; Get NVRAM Byte Value DEC A JP Z, DS5RTC_SETBYT ; Set NVRAM Byte Value DEC A JP Z, DS5RTC_GETBLK ; Get NVRAM Data Block Value DEC A JP Z, DS5RTC_SETBLK ; Set NVRAM Data Block Value DEC A JP Z, DS5RTC_GETALM ; Get Alarm DEC A JP Z, DS5RTC_SETALM ; Set Alarm ; ; RTC GET TIME ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; HL: DATE/TIME BUFFER (OUT) ; BUFFER FORMAT IS BCD: YYMMDDHHMMSS ; 24 HOUR TIME FORMAT IS ASSUMED ; DS5RTC_GETTIM: PUSH HL ; SAVE ADR OF OUTPUT BUF ; ; READ THE CLOCK LD HL,DS5RTC_BUF ; POINT TO CLOCK BUFFER CALL DS5RTC_RDCLK ; READ THE CLOCK LD HL,DS5RTC_TIMBUF ; POINT TO TIME BUFFER CALL DS5RTC_CLK2TIM ; CONVERT CLOCK TO TIME ; ; NOW COPY TO REAL DESTINATION (INTERBANK SAFE) LD A,BID_BIOS ; COPY FROM BIOS BANK LD (HB_SRCBNK),A ; SET IT LD A,(HB_INVBNK) ; COPY TO CURRENT USER BANK LD (HB_DSTBNK),A ; SET IT LD HL,DS5RTC_TIMBUF ; SOURCE ADR POP DE ; DEST ADR LD BC,6 ; LENGTH IS 6 BYTES #IF (INTMODE == 1) DI #ENDIF CALL HB_BNKCPY ; COPY THE CLOCK DATA #IF (INTMODE == 1) EI #ENDIF ; ; CLEAN UP AND RETURN XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; ; RTC SET TIME ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; HL: DATE/TIME BUFFER (IN) ; BUFFER FORMAT IS BCD: YYMMDDHHMMSS ; 24 HOUR TIME FORMAT IS ASSUMED ; DS5RTC_SETTIM: ; COPY INCOMING TIME DATA TO OUR TIME BUFFER LD A,(HB_INVBNK) ; COPY FROM CURRENT USER BANK LD (HB_SRCBNK),A ; SET IT LD A,BID_BIOS ; COPY TO BIOS BANK LD (HB_DSTBNK),A ; SET IT LD DE,DS5RTC_TIMBUF ; DEST ADR LD BC,6 ; LENGTH IS 6 BYTES #IF (INTMODE == 1) DI #ENDIF CALL HB_BNKCPY ; COPY THE CLOCK DATA #IF (INTMODE == 1) EI #ENDIF ; ; WRITE TO CLOCK LD HL,DS5RTC_TIMBUF ; POINT TO TIME BUFFER CALL DS5RTC_TIM2CLK ; CONVERT TO CLOCK FORMAT LD HL,DS5RTC_BUF ; POINT TO CLOCK BUFFER CALL DS5RTC_WRCLK ; WRITE TO THE CLOCK ; ; CLEAN UP AND RETURN XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; ; RTC GET NVRAM BYTE ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; C: INDEX (IN) ; E: VALUE (OUT) ; DS5RTC_GETBYT: LD A,C ; INDEX TO A ADD A,$20 ; NVRAM STARTS AT REG $20 LD C,A ; BACK TO REG C CALL DS5RTC_GET ; DO IT LD E,A ; MOVE RESULT TO E XOR A ; SIGNAL SUCCESS RET ; DONE ; ; RTC SET NVRAM BYTE ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; C: INDEX (IN) ; E: VALUE (IN) ; DS5RTC_SETBYT: LD A,C ; INDEX TO A ADD A,$20 ; NVRAM STARTS AT REG $20 LD C,A ; BACK TO REG C LD A,E ; VALUE TO A CALL DS5RTC_WPOFF ; DISABLE WRITE PROTECT CALL DS5RTC_PUT ; DO IT CALL DS5RTC_WPOFF ; ENABLE WRITE PROTECT XOR A ; SIGNAL SUCCESS RET ; DONE ; ; RTC GET BLOCK ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; HL: BUFFER ADDRESS (IN) ; DS5RTC_GETBLK: SYSCHKERR(ERR_NOTIMPL) RET ; ; RTC GET BLOCK ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; HL: BUFFER ADDRESS (IN) ; DS5RTC_SETBLK: SYSCHKERR(ERR_NOTIMPL) RET ; ; RTC GET ALARM ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERROR ; HL: DATE/TIME BUFFER ADDRESS (IN) ; BUFFER FORMAT IS BCD: YYMMDDHHMMSS ; 24 HOUR TIME FORMAT IS ASSUMED ; DS5RTC_GETALM: SYSCHKERR(ERR_NOTIMPL) RET ; ; RTC SET ALARM ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERROR ; HL: DATE/TIME BUFFER ADDRESS (IN) ; BUFFER FORMAT IS BCD: YYMMDDHHMMSS ; 24 HOUR TIME FORMAT IS ASSUMED ; DS5RTC_SETALM: SYSCHKERR(ERR_NOTIMPL) RET ; ;================================================================================================== ; INTERNAL PROCEDURES ;================================================================================================== ; ; TURN ON WRITE PROTECT ; DS5RTC_WPON: PUSH AF PUSH BC LD A,%01000000 ; CONTROL REGISTER W/P ON VALUE LD C,DS5RTC_REG_CONTROL ; CONTROL REGISTER ADR CALL DS5RTC_PUT ; SET CONTROL REGISTER POP BC POP AF RET ; ; TURN OFF WRITE PROTECT ; DS5RTC_WPOFF: PUSH AF PUSH BC XOR A ; CONTROL REGISTER W/P OFF VALUE LD C,DS5RTC_REG_CONTROL ; CONTROL REGISTER ADR CALL DS5RTC_PUT ; SET CONTROL REGISTER POP BC POP AF RET ; ; DETECT RTC HARDWARE PRESENCE ; DS5RTC_DETECT: CALL DS5RTC_WPOFF ; DISABLE WRITE PROTECT ; ; TEST AN NVRAM BYTE (NON-DESTRUCTIVE) LD C,$7F ; LAST NVRAM BYTE CALL DS5RTC_GET ; GET CURRENT VALUE LD B,A ; SAVE IN B XOR $FF ; FLIP ALL BITS CALL DS5RTC_PUT ; SAVE TO RTC NVRAM CALL DS5RTC_GET ; GET UPDATED VALUE XOR $FF ; FLIP ALL BITS CP B ; COMPARE W/ ORIGINAL READ PUSH AF ; SAVE FLAGS CALL DS5RTC_PUT ; RESAVE ORIGINAL VALUE ; CALL DS5RTC_WPON ; RESTORE WRITE PROTECT POP AF ; RESTORE FLAGS RET ; ZF INDICATES PRESENCE ; ; READ RTC DATE/TIME INTO INTERNAL BUFFER ; DS5RTC_RDCLK: LD B,7 ; 7 BYTE DATE/TIME BUFFER LD C,DS5RTC_REG_SEC ; START W/ SECONDS REGISTER LD HL,DS5RTC_BUF ; USE INTERNAL BUFFER CALL DS5RTC_GETBUF ; FILL THE BUFFER XOR A ; SIGNAL SUCCESS RET ; RETURN ; ; WRITE RTC DATE/TIME FROM INTERNAL BUFFER ; DS5RTC_WRCLK: CALL DS5RTC_WPOFF ; DISABLE WRITE PROTECT LD B,7 ; 7 BYTE DATE/TIME BUFFER LD C,DS5RTC_REG_SEC ; START W/ SECONDS REGISTER LD HL,DS5RTC_BUF ; USE INTERNAL BUFFER CALL DS5RTC_PUTBUF ; FILL THE BUFFER CALL DS5RTC_WPON ; RESTORE WRITE PROTECT XOR A ; SIGNAL SUCCESS RET ; RETURN ; ; CONVERT DATA IN CLOCK BUFFER TO TIME BUFFER AT HL ; DS5RTC_CLK2TIM: LD A,(DS5RTC_YR) LD (HL),A INC HL LD A,(DS5RTC_MON) LD (HL),A INC HL LD A,(DS5RTC_DT) LD (HL),A INC HL LD A,(DS5RTC_HR) LD (HL),A INC HL LD A,(DS5RTC_MIN) LD (HL),A INC HL LD A,(DS5RTC_SEC) LD (HL),A RET ; ; CONVERT DATA IN TIME BUFFER AT HL TO CLOCK BUFFER ; DS5RTC_TIM2CLK: PUSH HL LD A,(HL) LD (DS5RTC_YR),A INC HL LD A,(HL) LD (DS5RTC_MON),A INC HL LD A,(HL) LD (DS5RTC_DT),A INC HL LD A,(HL) LD (DS5RTC_HR),A INC HL LD A,(HL) LD (DS5RTC_MIN),A INC HL LD A,(HL) LD (DS5RTC_SEC),A POP HL CALL TIMDOW INC A ; CONVERT FROM 0-6 TO 1-7 LD (DS5RTC_DAY),A RET ; ; READ A BUFFER OF BYTES FROM THE RTC ; START RTC ADR IN C, COUNT IN B, BUF PTR IN HL ; DS5RTC_GETBUF: LD A,1 OUT (DS5RTC_SELECT),A ; SELECT RTC LD A,C ; ADDRESS TO A OUT (DS5RTC_DATA),A ; SEND TO INTERFACE OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO WRITE ADR CALL DS5RTC_WAITBSY ; WAIT FOR COMPLETION DS5RTC_GETBUF1: OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO READ DATA CALL DS5RTC_WAITBSY ; WAIT FOR DATA IN A,(DS5RTC_DATA) ; GET VALUE LD (HL),A ; SAVE BYTE IN BUFFER INC HL ; BUMP BUF PTR DJNZ DS5RTC_GETBUF1 ; LOOP FOR REQUESTED BYTES LD A,0 OUT (DS5RTC_SELECT),A ; DESELECT DEVICE RET ; ; WRITE A BUFFER OF BYTES TO THE RTC ; START RTC ADR IN C, COUNT IN B, BUF PTR IN HL ; DS5RTC_PUTBUF: LD A,1 OUT (DS5RTC_SELECT),A ; SELECT RTC LD A,C ; ADDRESS TO A SET 7,A ; SET WRITE BIT OUT (DS5RTC_DATA),A ; SEND TO INTERFACE OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO WRITE ADR CALL DS5RTC_WAITBSY ; WAIT FOR COMPLETION DS5RTC_PUTBUF1: LD A,(HL) ; NEXT BYTE TO WRITE INC HL ; BUMP BUF PTR OUT (DS5RTC_DATA),A ; SEND TO INTERFACE OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO WRITE BYTE CALL DS5RTC_WAITBSY ; WAIT FOR COMPLETION DJNZ DS5RTC_PUTBUF1 ; LOOP FOR REQUESTED BYTES LD A,0 OUT (DS5RTC_SELECT),A ; DESELECT DEVICE RET ; ; GET A BYTE FROM THE RTC ; ADDRESS IN C, RETURN VALLUE IN A ; DS5RTC_GET: LD A,1 OUT (DS5RTC_SELECT),A ; SELECT RTC LD A,C ; ADDRESS TO A OUT (DS5RTC_DATA),A ; SEND TO INTERFACE OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO WRITE ADR CALL DS5RTC_WAITBSY ; WAIT FOR COMPLETION OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO READ DATA CALL DS5RTC_WAITBSY ; WAIT FOR DATA IN A,(DS5RTC_DATA) ; GET VALUE PUSH AF ; SAVE VALUE LD A,0 OUT (DS5RTC_SELECT),A ; DESELECT DEVICE POP AF ; RESTORE VALUE RET ; ; PUT A BYTE TO THE RTC ; ADDRESS IN C, VALUE IN A ; DS5RTC_PUT: PUSH AF ; SAVE VALUE TO PUT LD A,1 OUT (DS5RTC_SELECT),A ; SELECT RTC LD A,C ; ADDRESS TO A SET 7,A ; SET WRITE BIT OUT (DS5RTC_DATA),A ; SEND TO INTERFACE OUT (DS5RTC_RUN),A ; SPI TRANSACTION TO WRITE ADR CALL DS5RTC_WAITBSY ; WAIT FOR COMPLETION POP AF ; RECOVER VALUE TO PUT OUT (DS5RTC_DATA),A ; VALUE TO OUTPUT OUT (DS5RTC_RUN),A ; SPI TRANSACTOIN TO WRITE VALUE CALL DS5RTC_WAITBSY ; WAIT FOR WRITE TO COMPLETE LD A,0 OUT (DS5RTC_SELECT),A ; DESELECT DEVICE RET ; ; WAIT UNTIL SPI INTERFACE IS NO LONGER BUSY ; DS5RTC_WAITBSY: PUSH AF ; PRESERVE AF PUSH BC ; PRESERVE BC ; ; AFTER INITIATING A SPI TRANSACTION, IT MAY TAKE A WHILE ; FOR THE BUSY STATUS TO BE REFLECTED. THE DELAYS BELOW ; ENSURE ENOUGH TIME HAS ELAPSED. CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY CALL DELAY ; ; SINCE THIS ROUTINE MAY BE USED TO DETECT AN RTC THAT DOES ; NOT EXIST, WE PROTECT THE WAIT WITH A TIMEOUT LOOP TO ; PREVENT A SYSTEM STALL. LD B,0 DS5RTC_WAITBSY1: IN A,(DS5RTC_STATUS) ; GET STATUS BYTE OR A ; SET FLAGS JR Z,DS5RTC_WAITBSY2 ; IF ZERO, WE ARE DONE DJNZ DS5RTC_WAITBSY1 ; TRY TILL COUNTER EXHAUSTED DS5RTC_WAITBSY2: POP BC ; RECOVER BC POP AF ; RECOVER AF RET ; ; DS5RTC_BUF IS USED FOR BURST READ/WRITE OF CLOCK DATA TO DS1305 ; FIELDS BELOW MATCH ORDER OF DS1305 FIELDS (BCD) ; DS5RTC_BUF: DS5RTC_SEC .DB 0 ; SECOND DS5RTC_MIN .DB 0 ; MINUTE DS5RTC_HR .DB 0 ; HOUR DS5RTC_DAY .DB 0 ; DAY OF WEEK DS5RTC_DT .DB 0 ; DATE DS5RTC_MON .DB 0 ; MONTH DS5RTC_YR .DB 0 ; YEAR ; ; DS5RTC_TIMBUF IS TEMP BUF USED TO STORE TIME TEMPORARILY TO DISPLAY ; IT. ; DS5RTC_TIMBUF .FILL 6,0 ; 6 BYTES FOR GETTIM ; ; DS5RTC_TIMDEF IS DEFAULT TIME VALUE TO INITIALIZE CLOCK IF IT IS ; NOT RUNNING. ; DS5RTC_TIMDEF: ; DEFAULT TIME VALUE TO INIT CLOCK .DB $00,$01,$01 ; 2000-01-01 .DB $00,$00,$00 ; 00:00:00 ; ;-------------------------------------------------------------------------------------------------- ; HBIOS MODULE TRAILER ;-------------------------------------------------------------------------------------------------- ; END_DS5RTC .EQU $ SIZ_DS5RTC .EQU END_DS5RTC - ORG_DS5RTC ; MEMECHO "DS5RTC occupies " MEMECHO SIZ_DS5RTC MEMECHO " bytes.\n"