|
|
|
@ -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 |
|
|
|
|