Browse Source

RP5C01: Added support for read/write nvram byte and detect board present

pull/199/head
Dean Netherton 5 years ago
parent
commit
0c4f82c881
  1. 172
      Source/HBIOS/rp5rtc.asm

172
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

Loading…
Cancel
Save