mirror of https://github.com/wwarthen/RomWBW.git
15 changed files with 265 additions and 26 deletions
@ -0,0 +1,203 @@ |
|||
; |
|||
;================================================================================================== |
|||
; RP5C01 CLOCK DRIVER |
|||
;================================================================================================== |
|||
; |
|||
RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) |
|||
; |
|||
; RTC DEVICE INITIALIZATION ENTRY |
|||
; |
|||
|
|||
RP5RTC_REG .EQU $B4 |
|||
RP5RTC_DAT .EQU $B5 |
|||
|
|||
REG_1SEC .EQU $00 |
|||
REG_10SEC .EQU $01 |
|||
REG_MODE .EQU $0D |
|||
REG_TEST .EQU $0E |
|||
|
|||
MD_TIM .EQU 8 |
|||
MD_ALM .EQU 4 |
|||
|
|||
RP5RTC_INIT: |
|||
LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET? |
|||
OR A ; SET FLAGS |
|||
RET NZ ; IF ALREADY ACTIVE, ABORT |
|||
; |
|||
CALL NEWLINE ; FORMATTING |
|||
PRTS("RP5C01 RTC: $") |
|||
; |
|||
|
|||
; ENSURE DEVICE IS RESET AND NOT IN TEST MODE |
|||
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 |
|||
|
|||
CALL RP5RTC_RDTIM |
|||
|
|||
; DISPLAY CURRENT TIME |
|||
LD HL, RP5RTC_BCDBUF ; POINT TO BCD BUF |
|||
CALL PRTDT |
|||
; |
|||
LD BC, RP5RTC_DISPATCH |
|||
CALL RTC_SETDISP |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET |
|||
; |
|||
; RTC DEVICE FUNCTION DISPATCH ENTRY |
|||
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR |
|||
; B: FUNCTION (IN) |
|||
; |
|||
RP5RTC_DISPATCH: |
|||
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 |
|||
DEC A |
|||
JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE |
|||
DEC A |
|||
JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE |
|||
DEC A |
|||
JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES |
|||
DEC A |
|||
JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES |
|||
DEC A |
|||
JP Z,RP5RTC_GETALM ; GET ALARM |
|||
DEC A |
|||
JP Z,RP5RTC_SETALM ; SET ALARM |
|||
DEC A |
|||
JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO |
|||
CALL SYSCHK |
|||
LD A,ERR_NOFUNC |
|||
OR A |
|||
RET |
|||
; |
|||
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR |
|||
; |
|||
RP5RTC_GETBYT: |
|||
RP5RTC_SETBYT: |
|||
RP5RTC_GETBLK: |
|||
RP5RTC_SETBLK: |
|||
RP5RTC_GETALM: |
|||
RP5RTC_SETALM: |
|||
CALL SYSCHK |
|||
LD A,ERR_NOTIMPL |
|||
OR A |
|||
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 |
|||
; |
|||
RP5RTC_GETTIM: |
|||
; GET THE TIME INTO TEMP BUF |
|||
PUSH HL ; SAVE PTR TO CALLERS BUFFER |
|||
; |
|||
CALL RP5RTC_RDTIM |
|||
|
|||
; 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,RP5RTC_BCDBUF ; SOURCE ADR |
|||
POP DE ; DEST ADR |
|||
LD BC,RP5RTC_BUFSIZ ; LENGTH |
|||
CALL HB_BNKCPY ; COPY THE CLOCK DATA |
|||
|
|||
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 |
|||
; |
|||
RP5RTC_SETTIM: |
|||
; COPY TO BCD BUF |
|||
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,RP5RTC_BCDBUF ; DEST ADR |
|||
LD BC,RP5RTC_BUFSIZ ; LENGTH |
|||
CALL HB_BNKCPY ; COPY THE CLOCK DATA |
|||
; |
|||
XOR A ; SIGNAL SUCCESS |
|||
RET ; AND RETURN |
|||
; |
|||
; REPORT RTC DEVICE INFO |
|||
; |
|||
RP5RTC_DEVICE: |
|||
LD D,RTCDEV_RP5 ; 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 |
|||
|
|||
; |
|||
; READ OUT THE TIME |
|||
RP5RTC_RDTIM: |
|||
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 |
|||
OUT (RP5RTC_REG), A |
|||
; CALL DLY32 |
|||
IN A, (RP5RTC_DAT) |
|||
AND $0F ; RETRIEVE 1 SECOND NIBBLE |
|||
LD L, A |
|||
|
|||
LD A, REG_10SEC ; SELECT 1 SECOND REGISTER |
|||
OUT (RP5RTC_REG), A |
|||
; CALL DLY32 |
|||
IN A, (RP5RTC_DAT) |
|||
AND $0F |
|||
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 |
|||
|
|||
RET |
|||
|
|||
; |
|||
; WORKING VARIABLES |
|||
; |
|||
RP5RTC_BCDBUF: ; ALL IN BINARY |
|||
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 |
|||
Loading…
Reference in new issue