Browse Source

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.
pull/634/head
Wayne Warthen 2 months ago
parent
commit
ac48639bfc
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 31
      Source/HBIOS/ds12rtc.asm

31
Source/HBIOS/ds12rtc.asm

@ -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 DS12RTC_IO + 0 DS12RTC_SEL .EQU DS12RTC_IO + 0
DS12RTC_DATA .EQU DS12RTC_IO + 1 DS12RTC_DATA .EQU DS12RTC_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,$0E ; 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 DS12RTC_RDREG ; GET THE VALUE CALL DS12RTC_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,$0E ; 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 DS12RTC_WRREG ; WRITE IT CALL DS12RTC_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 DS12RTC_WRCLK1 ; DO YEAR (REG $09) 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) 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) 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 DAY OF WEEK (REG $06)
DEC C ; SKIP HOURS ALARM (REG $05) DEC C ; SKIP HOURS ALARM (REG $05)
CALL DS12RTC_WRCLK1 ; DO HOUR (REG $04) 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) DEC C ; SKIP MINUTES ALARM (REG $03)
CALL DS12RTC_WRCLK1 ; DO MINUTES (REG $02) 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) DEC C ; SKIP SECONDS ALARM (REG $01)
CALL DS12RTC_WRCLK1 ; DO SECONDS (REG $00) CALL DS12RTC_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 DS12RTC_WRREG ; WRITE IT CALL DS12RTC_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 (DS12RTC_SEL),A ; SELECT IT OUT (DS12RTC_SEL),A ; SELECT IT
IN A,(DS12RTC_DATA) ; GET REG VALUE IN A,(DS12RTC_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 (DS12RTC_SEL),A ; SELECT IT OUT (DS12RTC_SEL),A ; SELECT IT
POP AF ; RECOVER VALUE TO WRITE POP AF ; RECOVER VALUE TO WRITE
OUT (DS12RTC_DATA),A ; GET REG VALUE OUT (DS12RTC_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

Loading…
Cancel
Save