mirror of https://github.com/wwarthen/RomWBW.git
committed by
GitHub
19 changed files with 1790 additions and 47 deletions
File diff suppressed because it is too large
@ -0,0 +1,446 @@ |
|||||
|
; |
||||
|
;================================================================================================== |
||||
|
; RP5C01 CLOCK DRIVER |
||||
|
;================================================================================================== |
||||
|
; |
||||
|
RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS) |
||||
|
; |
||||
|
; RTC DEVICE INITIALIZATION ENTRY |
||||
|
; |
||||
|
|
||||
|
; TODO: |
||||
|
; set the day of week register |
||||
|
; 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 |
||||
|
|
||||
|
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 ; NOT USED BY THIS DRIVER |
||||
|
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 |
||||
|
|
||||
|
|
||||
|
REG_12_24 .EQU $0A |
||||
|
REG_LEAPYR .EQU $0B |
||||
|
|
||||
|
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? |
||||
|
OR A ; SET FLAGS |
||||
|
RET NZ ; IF ALREADY ACTIVE, ABORT |
||||
|
|
||||
|
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 |
||||
|
OUT (RP5RTC_REG), A |
||||
|
CALL DLY16 |
||||
|
XOR A |
||||
|
OUT (RP5RTC_DAT), A ; TURN OFF ALL TEST MODE BITS |
||||
|
|
||||
|
LD B, MODE_ALRMST |
||||
|
CALL RP5RTC_SETMD |
||||
|
|
||||
|
CALL RP5RTC_ENTIME |
||||
|
|
||||
|
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 |
||||
|
LD HL, RP5RTC_BCDBUF ; POINT TO BCD BUF |
||||
|
CALL PRTDT |
||||
|
; |
||||
|
LD BC, RP5RTC_DISPATCH |
||||
|
CALL RTC_SETDISP |
||||
|
; |
||||
|
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 |
||||
|
; 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 |
||||
|
; |
||||
|
; 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 |
||||
|
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 |
||||
|
; |
||||
|
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 |
||||
|
|
||||
|
LD B, MODE_ALRMST |
||||
|
CALL RP5RTC_SETMD |
||||
|
|
||||
|
LD A, (RP5RTC_YR) |
||||
|
CALL BCD2BYTE |
||||
|
AND 3 |
||||
|
LD B, REG_LEAPYR |
||||
|
CALL RP5RTC_WRVL |
||||
|
|
||||
|
CALL RP5RTC_ENTIME |
||||
|
|
||||
|
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 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 |
||||
|
|
||||
|
IN A, (RP5RTC_DAT) |
||||
|
AND MD_TIME | MD_ALRM |
||||
|
OR B |
||||
|
OUT (RP5RTC_DAT), A ; ASSIGN MODE |
||||
|
RET |
||||
|
|
||||
|
; ENABLE THE TIME COUNTER |
||||
|
RP5RTC_ENTIME: |
||||
|
LD B, MD_TIME |
||||
|
JP RP5RTC_SETMD |
||||
|
|
||||
|
; READ OUT 2 REGISTERS - 2 NIBBLES TO 1 BYTE |
||||
|
; REGISTER IN B |
||||
|
RP5RTC_RDVL: |
||||
|
LD A, B ; SELECT UNIT REGISTER |
||||
|
OUT (RP5RTC_REG), A |
||||
|
IN A, (RP5RTC_DAT) |
||||
|
AND $0F ; RETRIEVE UNIT NIBBLE |
||||
|
LD L, A |
||||
|
|
||||
|
INC B |
||||
|
LD A, B ; SELECT TENS REGISTER |
||||
|
OUT (RP5RTC_REG), A |
||||
|
IN A, (RP5RTC_DAT) |
||||
|
AND $0F |
||||
|
RLCA |
||||
|
RLCA |
||||
|
RLCA |
||||
|
RLCA ; MOVE TO TOP NIBBLE |
||||
|
OR L ; MERGE IN LOW NIBBLE |
||||
|
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 |
||||
|
; |
||||
|
; REGISTER EXTRACTED VALUES |
||||
|
; |
||||
|
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 |
||||
|
|
||||
Loading…
Reference in new issue