From 0c4f82c8813bc15580a9dd5fe2395cfc444c1e7c Mon Sep 17 00:00:00 2001 From: Dean Netherton Date: Wed, 28 Oct 2020 14:29:47 +1100 Subject: [PATCH] RP5C01: Added support for read/write nvram byte and detect board present --- Source/HBIOS/rp5rtc.asm | 172 +++++++++++++++++++++++++++++++++------- 1 file changed, 142 insertions(+), 30 deletions(-) diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index 6e8acae6..6b67b9e6 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -10,12 +10,18 @@ RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) ; TODO: ; set the day of week register -; read from nvram -; write to nvram ; read block of nvram ; write block of nvram ; set alarm/get alarm???? +;; 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 + RP5RTC_REG .EQU $B4 RP5RTC_DAT .EQU $B5 @@ -46,35 +52,46 @@ MODE_ALRMST .EQU 1 MODE_RAM0 .EQU 2 MODE_RAM1 .EQU 3 -MD_TIME .EQU 8 -MD_ALRM .EQU 4 +MD_TIME .EQU 8 +MD_ALRM .EQU 4 RP5RTC_INIT: - LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? + LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? OR A ; SET FLAGS RET NZ ; IF ALREADY ACTIVE, ABORT -; - CALL NEWLINE ; FORMATTING + + CALL NEWLINE ; FORMATTING PRTS("RP5C01 RTC: $") -; + ; PRINT RTC LATCH PORT ADDRESS + PRTS("IO=0x$") ; LABEL FOR IO ADDRESS + LD A,RP5RTC_REG ; GET IO ADDRESS + CALL PRTHEXBYTE ; PRINT IT + CALL PC_SPACE ; FORMATTING + + ; CHECK PRESENCE STATUS + CALL RP5RTC_DETECT ; HARDWARE DETECTION + JR Z, RP5RTC_INIT1 ; IF ZERO, ALL GOOD + PRTS("NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT + OR $FF ; SIGNAL FAILURE + RET ; BAIL OUT + +RP5RTC_INIT1: ; ENSURE DEVICE IS RESET AND NOT IN TEST MODE - LD A, REG_TEST ; SELECT TEST REGISTER + LD A, REG_TEST ; SELECT TEST REGISTER OUT (RP5RTC_REG), A CALL DLY16 XOR A - OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS - + OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS LD B, MODE_ALRMST CALL RP5RTC_SETMD - LD A, REG_12_24 ; SET TO 24 HOUR CLOCK + LD A, REG_12_24 ; SET TO 24 HOUR CLOCK OUT (RP5RTC_REG), A LD A, 1 OUT (RP5RTC_DAT), A - CALL RP5RTC_RDTIM ; DISPLAY CURRENT TIME @@ -84,7 +101,36 @@ RP5RTC_INIT: LD BC, RP5RTC_DISPATCH CALL RTC_SETDISP ; - XOR A ; SIGNAL SUCCESS + XOR A ; SIGNAL SUCCESS + RET +; +; DETECT RTC HARDWARE PRESENCE +; +RP5RTC_DETECT: + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_GETBYT ; GET VALUE + LD A, E ; TO ACCUM + LD L, A ; SAVE IT + XOR $FF ; FLIP ALL BITS + LD E, A ; TO E + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_SETBYT ; WRITE IT + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_GETBYT ; GET VALUE + LD A, L ; GET SAVED VALUE + XOR $FF ; FLIP ALL BITS + CP E ; COMPARE WITH VALUE READ + LD A, 0 ; ASSUME OK + JR Z, RP5RTC_DETECT1 ; IF MATCH, GO AHEAD + LD A, $FF ; ELSE STATUS IS ERROR + +RP5RTC_DETECT1: + PUSH AF ; SAVE STATUS + LD A, L ; GET SAVED VALUE + LD C, 0 ; NVRAM INDEX 0 + CALL RP5RTC_SETBYT ; SAVE IT + POP AF ; RECOVER STATUS + OR A ; SET FLAGS RET ; ; RTC DEVICE FUNCTION DISPATCH ENTRY @@ -92,40 +138,108 @@ RP5RTC_INIT: ; B: FUNCTION (IN) ; RP5RTC_DISPATCH: - LD A,B ; GET REQUESTED FUNCTION - AND $0F ; ISOLATE SUB-FUNCTION - JP Z,RP5RTC_GETTIM ; GET TIME + LD A,B ; GET REQUESTED FUNCTION + AND $0F ; ISOLATE SUB-FUNCTION + JP Z,RP5RTC_GETTIM ; GET TIME DEC A - JP Z,RP5RTC_SETTIM ; SET TIME + JP Z,RP5RTC_SETTIM ; SET TIME DEC A - JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE + JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE DEC A - JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE + JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE DEC A - JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES + JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES DEC A - JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES + JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES DEC A - JP Z,RP5RTC_GETALM ; GET ALARM + JP Z,RP5RTC_GETALM ; GET ALARM DEC A - JP Z,RP5RTC_SETALM ; SET ALARM + JP Z,RP5RTC_SETALM ; SET ALARM DEC A - JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO + JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO CALL SYSCHK - LD A,ERR_NOFUNC + LD A, ERR_NOFUNC OR A RET ; -; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR +; RTC GET NVRAM BYTE +; C: INDEX +; E: VALUE (OUTPUT) +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE ; RP5RTC_GETBYT: + LD A, C + CP $0D + JR NC, RP5RTC_BADIDX + + LD B, MODE_RAM0 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + LD E, A + + LD B, MODE_RAM1 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + IN A, (RP5RTC_DAT) + AND $0F ; RETRIEVE UNIT NIBBLE + RLCA + RLCA + RLCA + RLCA + OR E + LD E, A + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + +RP5RTC_BADIDX: + LD E, 00 + LD A, ERR_RANGE + RET +; +; RTC SET NVRAM BYTE +; C: INDEX +; E: VALUE +; A:0 IF OK, ERR_RANGE IF OUT OF RANGE +; RP5RTC_SETBYT: + LD A, C + CP $0D + JR NC, RP5RTC_BADIDX + + LD B, MODE_RAM0 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + LD A, E + AND $0F + OUT (RP5RTC_DAT), A + + LD B, MODE_RAM1 + CALL RP5RTC_SETMD + LD A, C ; SELECT NVRAM INDEX + OUT (RP5RTC_REG), A + LD A, E + AND $F0 + RRCA + RRCA + RRCA + RRCA + OUT (RP5RTC_DAT), A + + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN + RP5RTC_GETBLK: RP5RTC_SETBLK: RP5RTC_GETALM: RP5RTC_SETALM: + LD A, ERR_NOTIMPL CALL SYSCHK - LD A,ERR_NOTIMPL OR A RET ; @@ -322,5 +436,3 @@ RP5RTC_HH .DB 00 RP5RTC_MM .DB 00 RP5RTC_SS .DB 00 -RP5RTC_DW .DB 00 ; THE DAY OF THE WEEK -RP5RTC_LP .DB 00 ; 1 IF IS LEAP YEAR, OTHERWISE 0