; ;================================================================================================== ; M6242 CLOCK DRIVER ;================================================================================================== ; M6242RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) ; ; RTC DEVICE INITIALIZATION ENTRY ; ; TODO: ; set the day of week register ;; NOTES FOR USING DRIVER IN Z-DOS ; First load the LDDS datestamper ; A:LDDS ; next prepare and drives with datestamper info: ; eg: a:putds -d=g: -V ; then view date time of files with: ; a:filedate M6242RTC_REG_1SEC .EQU $00 M6242RTC_REG_10SEC .EQU $01 M6242RTC_REG_1MIN .EQU $02 M6242RTC_REG_10MIN .EQU $03 M6242RTC_REG_1HR .EQU $04 M6242RTC_REG_10HR .EQU $05 M6242RTC_REG_1DAY .EQU $06 M6242RTC_REG_10DAY .EQU $07 M6242RTC_REG_1MNTH .EQU $08 M6242RTC_REG_10MNTH .EQU $09 M6242RTC_REG_1YEAR .EQU $0A M6242RTC_REG_10YEAR .EQU $0B M6242RTC_REG_DAYWEEK .EQU $0C ; NOT USED BY THIS DRIVER M6242RTC_REG_CONTROL1 .EQU $0D M6242RTC_REG_CONTROL2 .EQU $0E M6242RTC_REG_CONTROL3 .EQU $0F DEVECHO "M6242RTC: IO=" DEVECHO M6242RTC_BASE DEVECHO "\n" ; ;-------------------------------------------------------------------------------------------------- ; HBIOS MODULE HEADER ;-------------------------------------------------------------------------------------------------- ; ORG_M6242RTC .EQU $ ; .DW SIZ_M6242RTC ; MODULE SIZE .DW M6242RTC_INITPHASE ; ADR OF INIT PHASE HANDLER ; M6242RTC_INITPHASE: ; INIT PHASE HANDLER, A=PHASE ;CP HB_PHASE_PREINIT ; PREINIT PHASE? ;JP Z,M6242RTC_PREINIT ; DO PREINIT CP HB_PHASE_INIT ; INIT PHASE? JP Z,M6242RTC_INIT ; DO INIT RET ; DONE ; M6242RTC_INIT: LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? OR A ; SET FLAGS RET NZ ; IF ALREADY ACTIVE, ABORT CALL NEWLINE ; FORMATTING PRTS("M6242RTC: $") ; PRINT RTC LATCH PORT ADDRESS PRTS("IO=0x$") ; LABEL FOR IO ADDRESS LD A,M6242RTC_BASE ; GET IO ADDRESS CALL PRTHEXBYTE ; PRINT IT CALL PC_SPACE ; FORMATTING ; CHECK PRESENCE STATUS CALL M6242RTC_DETECT ; HARDWARE DETECTION JR Z, M6242RTC_INIT1 ; IF ZERO, ALL GOOD PRTS("NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT OR $FF ; SIGNAL FAILURE RET ; BAIL OUT M6242RTC_INIT1: ; ENSURE DEVICE IS RESET AND NOT IN TEST MODE LD A, 05h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A LD A, 05h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A LD A, 04h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A LD A, 00h ; LET CLOCK RUN OUT (M6242RTC_REG_CONTROL1 + M6242RTC_BASE), A OUT (M6242RTC_REG_CONTROL2 + M6242RTC_BASE), A ; DISPLAY CURRENT TIME LD HL, M6242RTC_BCDBUF ; POINT TO BCD BUF CALL M6242RTC_GETTIM CALL PRTDT ; LD BC, M6242RTC_DISPATCH CALL RTC_SETDISP ; XOR A ; SIGNAL SUCCESS RET ; ; DETECT RTC HARDWARE PRESENCE ; M6242RTC_DETECT: LD A, 01h ; TURN ON REST BIT OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A CALL DLY64 CALL DLY64 IN A,(M6242RTC_REG_CONTROL3 + M6242RTC_BASE) AND 01h CP 01h JR NZ, M6242RTC_DETECTERR ; IF NOT MATCH, ERROR LD A, 00h ; TURN OFF REST BIT OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A CALL DLY64 CALL DLY64 IN A,(M6242RTC_REG_CONTROL3 + M6242RTC_BASE) AND 01h CP 00h JR NZ, M6242RTC_DETECTERR ; IF NOT MATCH, ERROR LD A, 0 ; ASSUME OK OR A ; SET FLAGS RET M6242RTC_DETECTERR: LD A, $FF ; ELSE STATUS IS ERROR OR A ; SET FLAGS RET ; ; RTC DEVICE FUNCTION DISPATCH ENTRY ; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR ; B: FUNCTION (IN) ; M6242RTC_DISPATCH: LD A,B ; GET REQUESTED FUNCTION AND $0F ; ISOLATE SUB-FUNCTION JP Z,M6242RTC_GETTIM ; GET TIME DEC A JP Z,M6242RTC_SETTIM ; SET TIME DEC A JP Z,M6242RTC_GETBYT ; GET NVRAM BYTE VALUE DEC A JP Z,M6242RTC_SETBYT ; SET NVRAM BYTE VALUE DEC A JP Z,M6242RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES DEC A JP Z,M6242RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES DEC A JP Z,M6242RTC_GETALM ; GET ALARM DEC A JP Z,M6242RTC_SETALM ; SET ALARM DEC A JP Z,M6242RTC_DEVICE ; REPORT RTC DEVICE INFO SYSCHKERR(ERR_NOFUNC) RET ; ; RTC GET NVRAM BYTE ; C: INDEX ; E: VALUE (OUTPUT) ; A:0 IF OK, ERR_RANGE IF OUT OF RANGE ; M6242RTC_GETBYT: M6242RTC_SETBYT: M6242RTC_GETBLK: M6242RTC_SETBLK: M6242RTC_GETALM: M6242RTC_SETALM: SYSCHKERR(ERR_NOTIMPL) RET ; ; 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 ; M6242RTC_GETTIM: PUSH HL PUSH BC IN A,(M6242RTC_REG_10YEAR + M6242RTC_BASE) RLA RLA RLA RLA LD C,A IN A,(M6242RTC_REG_1YEAR + M6242RTC_BASE) AND 0FH OR C LD (HL),A INC HL IN A,(M6242RTC_REG_10MNTH + M6242RTC_BASE) RLA RLA RLA RLA LD C,A IN A,(M6242RTC_REG_1MNTH + M6242RTC_BASE) AND 0FH OR C LD (HL),A INC HL IN A,(M6242RTC_REG_10DAY + M6242RTC_BASE) RLA RLA RLA RLA LD C,A IN A,(M6242RTC_REG_1DAY + M6242RTC_BASE) AND 0FH OR C LD (HL),A INC HL IN A,(M6242RTC_REG_10HR + M6242RTC_BASE) RLA RLA RLA RLA LD C,A IN A,(M6242RTC_REG_1HR + M6242RTC_BASE) AND 0FH OR C LD (HL),A INC HL IN A,(M6242RTC_REG_10MIN + M6242RTC_BASE) RLA RLA RLA RLA LD C,A IN A,(M6242RTC_REG_1MIN + M6242RTC_BASE) AND 0FH OR C LD (HL),A INC HL IN A,(M6242RTC_REG_10SEC + M6242RTC_BASE) RLA RLA RLA RLA LD C,A IN A,(M6242RTC_REG_1SEC + M6242RTC_BASE) AND 0FH OR C LD (HL),A INC HL POP BC POP HL 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: YYMMDDHHMMSSWW ; 24 HOUR TIME FORMAT IS ASSUMED ; M6242RTC_SETTIM: PUSH HL LD A, (HL) OUT (M6242RTC_REG_1YEAR + M6242RTC_BASE), A RRA RRA RRA RRA OUT (M6242RTC_REG_10YEAR + M6242RTC_BASE), A INC HL LD A, (HL) OUT (M6242RTC_REG_1MNTH + M6242RTC_BASE), A RRA RRA RRA RRA OUT (M6242RTC_REG_10MNTH + M6242RTC_BASE), A INC HL LD A, (HL) OUT (M6242RTC_REG_1DAY+ M6242RTC_BASE), A RRA RRA RRA RRA OUT (M6242RTC_REG_10DAY + M6242RTC_BASE), A INC HL LD A, (HL) OUT (M6242RTC_REG_1HR + M6242RTC_BASE), A RRA RRA RRA RRA OUT (M6242RTC_REG_10HR + M6242RTC_BASE), A INC HL LD A, (HL) OUT (M6242RTC_REG_1MIN + M6242RTC_BASE), A RRA RRA RRA RRA OUT (M6242RTC_REG_10MIN + M6242RTC_BASE), A INC HL LD A, (HL) OUT (M6242RTC_REG_1SEC + M6242RTC_BASE), A RRA RRA RRA RRA OUT (M6242RTC_REG_10SEC + M6242RTC_BASE), A POP HL XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; ; REPORT RTC DEVICE INFO ; M6242RTC_DEVICE: LD D,RTCDEV_M6242 ; D := DEVICE TYPE LD E,0 ; E := PHYSICAL DEVICE NUMBER LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,0 ; L := 0, NO I/O ADDRESS XOR A ; SIGNAL SUCCESS RET M6242RTC_BCDBUF: RP5RTC_YR .DB 20 RP5RTC_MO .DB 01 RP5RTC_DT .DB 01 RP5RTC_HH .DB 00 RP5RTC_MM .DB 00 RP5RTC_SS .DB 00 ; ;-------------------------------------------------------------------------------------------------- ; HBIOS MODULE TRAILER ;-------------------------------------------------------------------------------------------------- ; END_M6242RTC .EQU $ SIZ_M6242RTC .EQU END_M6242RTC - ORG_M6242RTC ; MEMECHO "M6242RTC occupies " MEMECHO SIZ_M6242RTC MEMECHO " bytes.\n"