@ -43,6 +43,11 @@
; | $0D | VRT | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
; | $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_IO .EQU $ 70
DS12RTC_SEL .EQU DS 12 RTC_IO + 0
DS12RTC_SEL .EQU DS 12 RTC_IO + 0
DS12RTC_DATA .EQU DS 12 RTC_IO + 1
DS12RTC_DATA .EQU DS 12 RTC_IO + 1
@ -197,7 +202,7 @@ DS12RTC_SETTIM:
;
;
DS12RTC_GETBYT:
DS12RTC_GETBYT:
LD A , C ; INDEX TO ACCUM
LD A , C ; INDEX TO ACCUM
ADD A , $ 0 E ; RAM STARTS AT INDEX $0E
ADD A , $ 60 ; WE USE NVRAM STARTING AT $60
LD C , A ; INDEX BACK TO C
LD C , A ; INDEX BACK TO C
CALL DS 12 RTC_RDREG ; GET THE VALUE
CALL DS 12 RTC_RDREG ; GET THE VALUE
LD E , A ; PUT IN E TO RETURN
LD E , A ; PUT IN E TO RETURN
@ -210,7 +215,7 @@ DS12RTC_GETBYT:
;
;
DS12RTC_SETBYT:
DS12RTC_SETBYT:
LD A , C ; INDEX TO ACCUM
LD A , C ; INDEX TO ACCUM
ADD A , $ 0 E ; RAM STARTS AT INDEX $0E
ADD A , $ 60 ; WE USE NVRAM STARTING AT $60
LD C , A ; INDEX BACK TO C
LD C , A ; INDEX BACK TO C
LD A , E ; PUT VALUE IN A
LD A , E ; PUT VALUE IN A
CALL DS 12 RTC_WRREG ; WRITE IT
CALL DS 12 RTC_WRREG ; WRITE IT
@ -283,25 +288,25 @@ DS12RTC_WRCLK:
LD E , L ; ... IN CASE OF RESTART
LD E , L ; ... IN CASE OF RESTART
LD C , $ 09 ; START WITH YEAR REG
LD C , $ 09 ; START WITH YEAR REG
CALL DS 12 RTC_WRCLK1 ; DO YEAR (REG $09)
CALL DS 12 RTC_WRCLK1 ; DO YEAR (REG $09)
JR NZ , DS 12 RTC_WRCLK ; RESTART IF SO
JR NZ , DS 12 RTC_WRCLK ; RESTART IF UIP DETECTED
CALL DS 12 RTC_WRCLK1 ; DO MONTH (REG $08)
CALL DS 12 RTC_WRCLK1 ; DO MONTH (REG $08)
JR NZ , DS 12 RTC_WRCLK ; RESTART IF SO
JR NZ , DS 12 RTC_WRCLK ; RESTART IF UIP DETECTED
CALL DS 12 RTC_WRCLK1 ; DO DAY OF MONTH (REG $07)
CALL DS 12 RTC_WRCLK1 ; DO DAY OF MONTH (REG $07)
JR NZ , DS 12 RTC_WRCLK ; RESTART IF SO
JR NZ , DS 12 RTC_WRCLK ; RESTART IF UIP DETECTED
DEC C ; SKIP DAY OF WEEK (REG $06)
DEC C ; SKIP DAY OF WEEK (REG $06)
DEC C ; SKIP HOURS ALARM (REG $05)
DEC C ; SKIP HOURS ALARM (REG $05)
CALL DS 12 RTC_WRCLK1 ; DO HOUR (REG $04)
CALL DS 12 RTC_WRCLK1 ; DO HOUR (REG $04)
JR NZ , DS 12 RTC_WRCLK ; RESTART IF SO
JR NZ , DS 12 RTC_WRCLK ; RESTART IF UIP DETECTED
DEC C ; SKIP MINUTES ALARM (REG $03)
DEC C ; SKIP MINUTES ALARM (REG $03)
CALL DS 12 RTC_WRCLK1 ; DO MINUTES (REG $02)
CALL DS 12 RTC_WRCLK1 ; DO MINUTES (REG $02)
JR NZ , DS 12 RTC_WRCLK ; RESTART IF SO
JR NZ , DS 12 RTC_WRCLK ; RESTART IF UIP DETECTED
DEC C ; SKIP SECONDS ALARM (REG $01)
DEC C ; SKIP SECONDS ALARM (REG $01)
CALL DS 12 RTC_WRCLK1 ; DO SECONDS (REG $00)
CALL DS 12 RTC_WRCLK1 ; DO SECONDS (REG $00)
;
;
XOR A ; SIGNAL SUCCESS
XOR A ; SIGNAL SUCCESS
RET ; DONE
RET ; DONE
;
;
DS12RTC_WRCLK1: ; 108TS
DS12RTC_WRCLK1:
LD A ,( DE ) ; GET VALUE
LD A ,( DE ) ; GET VALUE
CALL DS 12 RTC_WRREG ; WRITE IT
CALL DS 12 RTC_WRREG ; WRITE IT
INC DE ; BUMP BUF PTR
INC DE ; BUMP BUF PTR
@ -339,22 +344,26 @@ DS12RTC_INITDEV:
; C=REGISTER
; C=REGISTER
; A=VALUE
; A=VALUE
;
;
DS12RTC_RDREG: ; 43TS
DS12RTC_RDREG:
HB_DI ; NO INTS BETWEEN REG SEL AND DATA
LD A , C ; REGSITER TO A
LD A , C ; REGSITER TO A
OUT ( DS 12 RTC_SEL ), A ; SELECT IT
OUT ( DS 12 RTC_SEL ), A ; SELECT IT
IN A ,( DS 12 RTC_DATA ) ; GET REG VALUE
IN A ,( DS 12 RTC_DATA ) ; GET REG VALUE
HB_EI ; RESTORE INTS
RET ; DONE
RET ; DONE
;
;
; WRITE REGSITER
; WRITE REGSITER
; C=REGSITER
; C=REGSITER
; A=VALUE
; A=VALUE
;
;
DS12RTC_WRREG: ; 64TS
DS12RTC_WRREG:
HB_DI ; NO INTS BETWEEN REG SEL AND DATA
PUSH AF ; SAVE VALUE TO WRITE
PUSH AF ; SAVE VALUE TO WRITE
LD A , C ; REGSITER TO A
LD A , C ; REGSITER TO A
OUT ( DS 12 RTC_SEL ), A ; SELECT IT
OUT ( DS 12 RTC_SEL ), A ; SELECT IT
POP AF ; RECOVER VALUE TO WRITE
POP AF ; RECOVER VALUE TO WRITE
OUT ( DS 12 RTC_DATA ), A ; GET REG VALUE
OUT ( DS 12 RTC_DATA ), A ; GET REG VALUE
HB_EI ; RESTORE INTS
RET ; DONE
RET ; DONE
;
;
; CHECK FOR UPDATE IN PROGRESS
; CHECK FOR UPDATE IN PROGRESS
@ -377,4 +386,4 @@ DS12RTC_UIP:
; DS12RTC_TIMBUF IS DRIVER'S INTERNAL CLOCK DATA BUFFER
; DS12RTC_TIMBUF IS DRIVER'S INTERNAL CLOCK DATA BUFFER
;
;
DS12RTC_TIMBUF .FILL 6 , 0 ; 6 BYTES FOR GETTIM, YYMMDDHHMMSS
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