mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
Cleanup of DS12RTC Driver
- Offset NVRAM register access by $60 to avoid collisions with IBM PC CMOS usage. - Wrap register accesses in DI/EI. The DS1288x requires no interrupts between the register selection and the data r/w. - Minor comment improvements.
This commit is contained in:
@@ -43,6 +43,11 @@
|
||||
; | $0D | VRT | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
; +-----+-------+-------+-------+-------+-------+-------+-------+-------+
|
||||
;
|
||||
; NOTE: THE IBM PC CMOS USES REGISTER ADDRESSES UP TO $5F. THIS RTC
|
||||
; IS SOMETIMES USED IN SYSTEMS THAT HAVE A X86 BOARD, SO WE AVOID ANY
|
||||
; CONFLICT BY OFFSETTING OUR REGISTER INDEXES BY $60. THIS MEANS WE
|
||||
; MAP REQUESTS FOR $00-$1F TO NVRAM REGISTERS $60-$7F.
|
||||
;
|
||||
DS12RTC_IO .EQU $70
|
||||
DS12RTC_SEL .EQU DS12RTC_IO + 0
|
||||
DS12RTC_DATA .EQU DS12RTC_IO + 1
|
||||
@@ -197,7 +202,7 @@ DS12RTC_SETTIM:
|
||||
;
|
||||
DS12RTC_GETBYT:
|
||||
LD A,C ; INDEX TO ACCUM
|
||||
ADD A,$0E ; RAM STARTS AT INDEX $0E
|
||||
ADD A,$60 ; WE USE NVRAM STARTING AT $60
|
||||
LD C,A ; INDEX BACK TO C
|
||||
CALL DS12RTC_RDREG ; GET THE VALUE
|
||||
LD E,A ; PUT IN E TO RETURN
|
||||
@@ -210,7 +215,7 @@ DS12RTC_GETBYT:
|
||||
;
|
||||
DS12RTC_SETBYT:
|
||||
LD A,C ; INDEX TO ACCUM
|
||||
ADD A,$0E ; RAM STARTS AT INDEX $0E
|
||||
ADD A,$60 ; WE USE NVRAM STARTING AT $60
|
||||
LD C,A ; INDEX BACK TO C
|
||||
LD A,E ; PUT VALUE IN A
|
||||
CALL DS12RTC_WRREG ; WRITE IT
|
||||
@@ -283,25 +288,25 @@ DS12RTC_WRCLK:
|
||||
LD E,L ; ... IN CASE OF RESTART
|
||||
LD C,$09 ; START WITH YEAR REG
|
||||
CALL DS12RTC_WRCLK1 ; DO YEAR (REG $09)
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF SO
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED
|
||||
CALL DS12RTC_WRCLK1 ; DO MONTH (REG $08)
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF SO
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED
|
||||
CALL DS12RTC_WRCLK1 ; DO DAY OF MONTH (REG $07)
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF SO
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED
|
||||
DEC C ; SKIP DAY OF WEEK (REG $06)
|
||||
DEC C ; SKIP HOURS ALARM (REG $05)
|
||||
CALL DS12RTC_WRCLK1 ; DO HOUR (REG $04)
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF SO
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED
|
||||
DEC C ; SKIP MINUTES ALARM (REG $03)
|
||||
CALL DS12RTC_WRCLK1 ; DO MINUTES (REG $02)
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF SO
|
||||
JR NZ,DS12RTC_WRCLK ; RESTART IF UIP DETECTED
|
||||
DEC C ; SKIP SECONDS ALARM (REG $01)
|
||||
CALL DS12RTC_WRCLK1 ; DO SECONDS (REG $00)
|
||||
;
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE
|
||||
;
|
||||
DS12RTC_WRCLK1: ; 108TS
|
||||
DS12RTC_WRCLK1:
|
||||
LD A,(DE) ; GET VALUE
|
||||
CALL DS12RTC_WRREG ; WRITE IT
|
||||
INC DE ; BUMP BUF PTR
|
||||
@@ -339,22 +344,26 @@ DS12RTC_INITDEV:
|
||||
; C=REGISTER
|
||||
; A=VALUE
|
||||
;
|
||||
DS12RTC_RDREG: ; 43TS
|
||||
DS12RTC_RDREG:
|
||||
HB_DI ; NO INTS BETWEEN REG SEL AND DATA
|
||||
LD A,C ; REGSITER TO A
|
||||
OUT (DS12RTC_SEL),A ; SELECT IT
|
||||
IN A,(DS12RTC_DATA) ; GET REG VALUE
|
||||
HB_EI ; RESTORE INTS
|
||||
RET ; DONE
|
||||
;
|
||||
; WRITE REGSITER
|
||||
; C=REGSITER
|
||||
; A=VALUE
|
||||
;
|
||||
DS12RTC_WRREG: ; 64TS
|
||||
DS12RTC_WRREG:
|
||||
HB_DI ; NO INTS BETWEEN REG SEL AND DATA
|
||||
PUSH AF ; SAVE VALUE TO WRITE
|
||||
LD A,C ; REGSITER TO A
|
||||
OUT (DS12RTC_SEL),A ; SELECT IT
|
||||
POP AF ; RECOVER VALUE TO WRITE
|
||||
OUT (DS12RTC_DATA),A ; GET REG VALUE
|
||||
HB_EI ; RESTORE INTS
|
||||
RET ; DONE
|
||||
;
|
||||
; CHECK FOR UPDATE IN PROGRESS
|
||||
@@ -377,4 +386,4 @@ DS12RTC_UIP:
|
||||
; DS12RTC_TIMBUF IS DRIVER'S INTERNAL CLOCK DATA BUFFER
|
||||
;
|
||||
DS12RTC_TIMBUF .FILL 6,0 ; 6 BYTES FOR GETTIM, YYMMDDHHMMSS
|
||||
DS12RTC_TIMDEF .DB $00,$01,$01,$00,$00,$00
|
||||
DS12RTC_TIMDEF .DB $00,$01,$01,$00,$00,$00 ; DEFAULT DATE/TIME
|
||||
|
||||
Reference in New Issue
Block a user