diff --git a/Source/HBIOS/rp5rtc.asm b/Source/HBIOS/rp5rtc.asm index f4b83abf..fec5fc63 100644 --- a/Source/HBIOS/rp5rtc.asm +++ b/Source/HBIOS/rp5rtc.asm @@ -13,11 +13,30 @@ RP5RTC_DAT .EQU $B5 REG_1SEC .EQU $00 REG_10SEC .EQU $01 +REG_1MIN .EQU $02 +REG_10MIN .EQU $03 +REG_1HR .EQU $04 +REG_10HR .EQU $05 +REG_DAYWEEK .EQU $06 +REG_1DAY .EQU $07 +REG_10DAY .EQU $08 +REG_1MNTH .EQU $09 +REG_10MNTH .EQU $0A +REG_1YEAR .EQU $0B +REG_10YEAR .EQU $0C REG_MODE .EQU $0D REG_TEST .EQU $0E +REG_RESET .EQU $0F -MD_TIM .EQU 8 -MD_ALM .EQU 4 +REG_12_24 .EQU $0A + +MODE_TIMEST .EQU 0 +MODE_ALRMST .EQU 1 +MODE_RAM0 .EQU 2 +MODE_RAM1 .EQU 3 + +MD_TIME .EQU 8 +MD_ALRM .EQU 4 RP5RTC_INIT: LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? @@ -35,6 +54,16 @@ RP5RTC_INIT: XOR A 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 + OUT (RP5RTC_REG), A + LD A, 1 + OUT (RP5RTC_DAT), A + + CALL RP5RTC_RDTIM ; DISPLAY CURRENT TIME @@ -131,6 +160,33 @@ RP5RTC_SETTIM: LD BC,RP5RTC_BUFSIZ ; LENGTH CALL HB_BNKCPY ; COPY THE CLOCK DATA ; + LD B, MODE_TIMEST + CALL RP5RTC_SETMD + + LD B, REG_1SEC + LD A, (RP5RTC_SS) + CALL RP5RTC_WRVL + + LD B, REG_1MIN + LD A, (RP5RTC_MM) + CALL RP5RTC_WRVL + + LD B, REG_1HR + LD A, (RP5RTC_HH) + CALL RP5RTC_WRVL + + LD B, REG_1DAY + LD A, (RP5RTC_DT) + CALL RP5RTC_WRVL + + LD B, REG_1MNTH + LD A, (RP5RTC_MO) + CALL RP5RTC_WRVL + + LD B, REG_1YEAR + LD A, (RP5RTC_YR) + CALL RP5RTC_WRVL + XOR A ; SIGNAL SUCCESS RET ; AND RETURN ; @@ -147,57 +203,101 @@ RP5RTC_DEVICE: ; ; READ OUT THE TIME RP5RTC_RDTIM: + LD B, MODE_TIMEST + CALL RP5RTC_SETMD + + LD B, REG_1SEC + CALL RP5RTC_RDVL + LD (RP5RTC_SS), A + + LD B, REG_1MIN + CALL RP5RTC_RDVL + LD (RP5RTC_MM), A + + LD B, REG_1HR + CALL RP5RTC_RDVL + LD (RP5RTC_HH), A + + LD B, REG_1DAY + CALL RP5RTC_RDVL + LD (RP5RTC_DT), A + + LD B, REG_1MNTH + CALL RP5RTC_RDVL + LD (RP5RTC_MO), A + + LD B, REG_1YEAR + CALL RP5RTC_RDVL + LD (RP5RTC_YR), A + + RET + +; SET MODE +; MODE IN B (MODE_TIMEST, MODE_ALRMST, MODE_RAM0, MODE_RAM1) +RP5RTC_SETMD: LD A, REG_MODE ; SELECT MODE REGISTER OUT (RP5RTC_REG), A - ; CALL DLY32 - LD A, MD_TIM | !MD_ALM | 0 ; TURN ON TIME AND TURN OFF ALARM - OUT (RP5RTC_DAT), A ; AND SET MODE 0 (REGISTER BANK 0) - ; CALL DLY32 - LD A, REG_1SEC ; SELECT 1 SECOND REGISTER + IN A, (RP5RTC_DAT) + AND MD_TIME | MD_ALRM + OR B + OUT (RP5RTC_DAT), A ; ASSIGN MODE + RET + + +; READ OUT 2 REGISTERS - 2 NIBBLES TO 1 BYTE +; REGISTER IN B +RP5RTC_RDVL: + LD A, B ; SELECT UNIT REGISTER OUT (RP5RTC_REG), A - ; CALL DLY32 IN A, (RP5RTC_DAT) - AND $0F ; RETRIEVE 1 SECOND NIBBLE + AND $0F ; RETRIEVE UNIT NIBBLE LD L, A - LD A, REG_10SEC ; SELECT 1 SECOND REGISTER + INC B + LD A, B ; SELECT TENS REGISTER OUT (RP5RTC_REG), A - ; CALL DLY32 IN A, (RP5RTC_DAT) AND $0F - rlca - rlca - rlca - rlca ; MOVE TO TOP NIBBLE + RLCA + RLCA + RLCA + RLCA ; MOVE TO TOP NIBBLE OR L ; MERGE IN LOW NIBBLE - LD H, A - ; A = SECONDS AS BCD - LD (RP5RTC_SS), A + LD H, A ; A = VALUE AS BCD RET +; WRITE OUT 2 REGISTERS - 1 BYTE TO 2 NIBBLES +; REGISTER IN B (B+1) +; VALUE IN A +RP5RTC_WRVL: + LD C, A + LD A, B ; SELECT UNIT REGISTER + OUT (RP5RTC_REG), A + + LD A, C ; WRITE C (ONLY LOW NIBBLE WILL BE USED) + OUT (RP5RTC_DAT), A + + INC B + LD A, B ; SELECT TENS REGISTER + OUT (RP5RTC_REG), A + + LD A, C ; SHIFT TOP NIBBLE TO LOW NIBBLE + RRCA + RRCA + RRCA + RRCA + OUT (RP5RTC_DAT), A ; WRITE IT + + RET ; -; WORKING VARIABLES +; REGISTER EXTRACTED VALUES ; -RP5RTC_BCDBUF: ; ALL IN BINARY +RP5RTC_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 -;; -RP5RTC_MONTBL: ; DAYS IN MONTH + 1 - .DB 32 ; JANUARY - .DB 29 ; FEBRUARY (NON-LEAP) - .DB 32 ; MARCH - .DB 31 ; APRIL - .DB 32 ; MAY - .DB 31 ; JUNE - .DB 32 ; JULY - .DB 32 ; AUGUST - .DB 31 ; SEPTEMBER - .DB 32 ; OCTOBER - .DB 31 ; NOVEMBER - .DB 32 ; DECEMBER