mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
RP5C01: Added support for read/write nvram byte and detect board present
This commit is contained in:
@@ -10,12 +10,18 @@ RP5RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS)
|
|||||||
|
|
||||||
; TODO:
|
; TODO:
|
||||||
; set the day of week register
|
; set the day of week register
|
||||||
; read from nvram
|
|
||||||
; write to nvram
|
|
||||||
; read block of nvram
|
; read block of nvram
|
||||||
; write block of nvram
|
; write block of nvram
|
||||||
; set alarm/get alarm????
|
; 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_REG .EQU $B4
|
||||||
RP5RTC_DAT .EQU $B5
|
RP5RTC_DAT .EQU $B5
|
||||||
@@ -46,35 +52,46 @@ MODE_ALRMST .EQU 1
|
|||||||
MODE_RAM0 .EQU 2
|
MODE_RAM0 .EQU 2
|
||||||
MODE_RAM1 .EQU 3
|
MODE_RAM1 .EQU 3
|
||||||
|
|
||||||
MD_TIME .EQU 8
|
MD_TIME .EQU 8
|
||||||
MD_ALRM .EQU 4
|
MD_ALRM .EQU 4
|
||||||
|
|
||||||
RP5RTC_INIT:
|
RP5RTC_INIT:
|
||||||
LD A,(RTC_DISPACT) ; RTC DISPATCHER ALREADY SET?
|
LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET?
|
||||||
OR A ; SET FLAGS
|
OR A ; SET FLAGS
|
||||||
RET NZ ; IF ALREADY ACTIVE, ABORT
|
RET NZ ; IF ALREADY ACTIVE, ABORT
|
||||||
;
|
|
||||||
CALL NEWLINE ; FORMATTING
|
|
||||||
PRTS("RP5C01 RTC: $")
|
|
||||||
;
|
|
||||||
|
|
||||||
|
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
|
; 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
|
OUT (RP5RTC_REG), A
|
||||||
CALL DLY16
|
CALL DLY16
|
||||||
XOR A
|
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
|
LD B, MODE_ALRMST
|
||||||
CALL RP5RTC_SETMD
|
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
|
OUT (RP5RTC_REG), A
|
||||||
LD A, 1
|
LD A, 1
|
||||||
OUT (RP5RTC_DAT), A
|
OUT (RP5RTC_DAT), A
|
||||||
|
|
||||||
|
|
||||||
CALL RP5RTC_RDTIM
|
CALL RP5RTC_RDTIM
|
||||||
|
|
||||||
; DISPLAY CURRENT TIME
|
; DISPLAY CURRENT TIME
|
||||||
@@ -84,7 +101,36 @@ RP5RTC_INIT:
|
|||||||
LD BC, RP5RTC_DISPATCH
|
LD BC, RP5RTC_DISPATCH
|
||||||
CALL RTC_SETDISP
|
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
|
RET
|
||||||
;
|
;
|
||||||
; RTC DEVICE FUNCTION DISPATCH ENTRY
|
; RTC DEVICE FUNCTION DISPATCH ENTRY
|
||||||
@@ -92,40 +138,108 @@ RP5RTC_INIT:
|
|||||||
; B: FUNCTION (IN)
|
; B: FUNCTION (IN)
|
||||||
;
|
;
|
||||||
RP5RTC_DISPATCH:
|
RP5RTC_DISPATCH:
|
||||||
LD A,B ; GET REQUESTED FUNCTION
|
LD A,B ; GET REQUESTED FUNCTION
|
||||||
AND $0F ; ISOLATE SUB-FUNCTION
|
AND $0F ; ISOLATE SUB-FUNCTION
|
||||||
JP Z,RP5RTC_GETTIM ; GET TIME
|
JP Z,RP5RTC_GETTIM ; GET TIME
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_SETTIM ; SET TIME
|
JP Z,RP5RTC_SETTIM ; SET TIME
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE
|
JP Z,RP5RTC_GETBYT ; GET NVRAM BYTE VALUE
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE
|
JP Z,RP5RTC_SETBYT ; SET NVRAM BYTE VALUE
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
|
JP Z,RP5RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
|
JP Z,RP5RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_GETALM ; GET ALARM
|
JP Z,RP5RTC_GETALM ; GET ALARM
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_SETALM ; SET ALARM
|
JP Z,RP5RTC_SETALM ; SET ALARM
|
||||||
DEC A
|
DEC A
|
||||||
JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO
|
JP Z,RP5RTC_DEVICE ; REPORT RTC DEVICE INFO
|
||||||
CALL SYSCHK
|
CALL SYSCHK
|
||||||
LD A,ERR_NOFUNC
|
LD A, ERR_NOFUNC
|
||||||
OR A
|
OR A
|
||||||
RET
|
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:
|
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:
|
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_GETBLK:
|
||||||
RP5RTC_SETBLK:
|
RP5RTC_SETBLK:
|
||||||
RP5RTC_GETALM:
|
RP5RTC_GETALM:
|
||||||
RP5RTC_SETALM:
|
RP5RTC_SETALM:
|
||||||
|
LD A, ERR_NOTIMPL
|
||||||
CALL SYSCHK
|
CALL SYSCHK
|
||||||
LD A,ERR_NOTIMPL
|
|
||||||
OR A
|
OR A
|
||||||
RET
|
RET
|
||||||
;
|
;
|
||||||
@@ -322,5 +436,3 @@ RP5RTC_HH .DB 00
|
|||||||
RP5RTC_MM .DB 00
|
RP5RTC_MM .DB 00
|
||||||
RP5RTC_SS .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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user