Browse Source

More RTC Cleanup

pull/634/head
Wayne Warthen 2 months ago
parent
commit
605ac58f7a
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 1
      Source/HBIOS/cfg_MASTER.asm
  2. 1
      Source/HBIOS/cfg_SZ80.asm
  3. 31
      Source/HBIOS/ds12rtc.asm
  4. 88
      Source/HBIOS/pcrtc.asm

1
Source/HBIOS/cfg_MASTER.asm

@ -210,6 +210,7 @@ PCRTC_BASE .EQU $C0 ; Default port for PCRTC, like DSRTC.
MMRTCENABLE .EQU FALSE ; MMRTC: ENABLE NS MM58167B RTC DRIVER (MMRTC.ASM)
;
DS12RTCENABLE .EQU FALSE ; DS12RTC: ENABLE DS1288X RTC DRIVER (DS12RTC.ASM)
DS12RTC_BASE .EQU $70 ; DS12RTC: I/O BASE ADDRESS
;
M6242RTCENABLE .EQU TRUE ; M6242RTC: ENABLE M6242 CLOCK DRIVER (M6242.ASM)
M6242RTC_BASE .EQU $A0 ; M6242RTC: I/O BASE ADDRESS

1
Source/HBIOS/cfg_SZ80.asm

@ -163,6 +163,7 @@ PCRTCENABLE .SET FALSE ; PCRTC: DISABLE DS12885 etc. RTC
MMRTCENABLE .SET FALSE ; MMRTC: ENABLE NS MM58167B RTC DRIVER (MMRTC.ASM)
;
DS12RTCENABLE .SET FALSE ; DS12RTC: ENABLE DS1288X RTC DRIVER (DS12RTC.ASM)
DS12RTC_BASE .SET $70 ; DS12RTC: I/O BASE ADDRESS
;
M6242RTCENABLE .SET FALSE ; M6242RTC: ENABLE M6242 CLOCK DRIVER (M6242.ASM)
;

31
Source/HBIOS/ds12rtc.asm

@ -48,14 +48,16 @@
; 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
DS12RTC_SEL .EQU DS12RTC_BASE + 0
DS12RTC_DATA .EQU DS12RTC_BASE + 1
;
DS12RTC_NVBASE .EQU $10
DS12RTC_NVSIZE .EQU $30
;
DEVECHO "DS12RTC:"
;
DEVECHO " IO="
DEVECHO DS12RTC_IO
DEVECHO DS12RTC_BASE
DEVECHO "\n"
;
; RTC DEVICE PRE-INITIALIZATION ENTRY
@ -72,7 +74,7 @@ DS12RTC_INIT:
;
; PRINT RTC PORT ADDRESS
PRTS(" IO=0x$") ; LABEL FOR IO ADDRESS
LD A,DS12RTC_IO ; GET IO ADDRESS
LD A,DS12RTC_BASE ; GET IO ADDRESS
CALL PRTHEXBYTE ; PRINT IT
;
CALL DS12RTC_DETECT ; HARDWARE DETECTION
@ -202,7 +204,10 @@ DS12RTC_SETTIM:
;
DS12RTC_GETBYT:
LD A,C ; INDEX TO ACCUM
ADD A,$60 ; WE USE NVRAM STARTING AT $60
CP DS12RTC_NVSIZE ; COMPARE TO MAX
JR NC,DS12RTC_BADIDX ; HANDLE RANGE ERROR
;
ADD A,DS12RTC_NVBASE ; OFFSET TO START OF NVRAM
LD C,A ; INDEX BACK TO C
CALL DS12RTC_RDREG ; GET THE VALUE
LD E,A ; PUT IN E TO RETURN
@ -215,20 +220,30 @@ DS12RTC_GETBYT:
;
DS12RTC_SETBYT:
LD A,C ; INDEX TO ACCUM
ADD A,$60 ; WE USE NVRAM STARTING AT $60
CP DS12RTC_NVSIZE ; COMPARE TO MAX
JR NC,DS12RTC_BADIDX ; HANDLE RANGE ERROR
;
ADD A,DS12RTC_NVBASE ; OFFSET TO START OF NVRAM
LD C,A ; INDEX BACK TO C
LD A,E ; PUT VALUE IN A
CALL DS12RTC_WRREG ; WRITE IT
XOR A ; SIGNAL SUCCESS
RET ; DONE
;
; HANDLE RANGE ERROR
;
DS12RTC_BADIDX:
LD A,ERR_RANGE
OR A
RET
;
; REPORT RTC DEVICE INFO
;
DS12RTC_DEVICE:
LD D,RTCDEV_DS12 ; D := DEVICE TYPE
LD E,0 ; E := PHYSICAL DEVICE NUMBER
LD H,0 ; H := MODE
LD L,DS12RTC_IO ; L := BASE I/O ADDRESS
LD L,DS12RTC_BASE ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
;

88
Source/HBIOS/pcrtc.asm

@ -9,29 +9,29 @@ PCRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS)
;; Then read from or write to PCRTC_DAT
;; PCRTC_BASE must be set in config files
PCRTC_REG .EQU PCRTC_BASE
PCRTC_DAT .EQU PCRTC_BASE + $01
REG_SEC .EQU $00
REG_SEC_ALM .EQU $01
REG_MIN .EQU $02
REG_MIN_ALM .EQU $03
REG_HOUR .EQU $04
REG_HOUR_ALM .EQU $05
REG_DOW .EQU $06 ; day of week
REG_DAY .EQU $07
REG_MONTH .EQU $08
REG_YEAR .EQU $09
REG_CTLA .EQU $0A
REG_CTLB .EQU $0B
REG_CTLC .EQU $0C
REG_CTLD .EQU $0D
CTLA_VAL .EQU $2F
CTLB_VAL .EQU $0A
PCRTC_NVBASE .EQU $10
PCRTC_NVSIZE .EQU $30 ; 64 bytes in total is what DS1285 and MC146818 had
PCRTC_REG .EQU PCRTC_BASE
PCRTC_DAT .EQU PCRTC_BASE + $01
PCRTC_REG_SEC .EQU $00
PCRTC_REG_SEC_ALM .EQU $01
PCRTC_REG_MIN .EQU $02
PCRTC_REG_MIN_ALM .EQU $03
PCRTC_REG_HOUR .EQU $04
PCRTC_REG_HOUR_ALM .EQU $05
PCRTC_REG_DOW .EQU $06 ; day of week
PCRTC_REG_DAY .EQU $07
PCRTC_REG_MONTH .EQU $08
PCRTC_REG_YEAR .EQU $09
PCRTC_REG_CTLA .EQU $0A
PCRTC_REG_CTLB .EQU $0B
PCRTC_REG_CTLC .EQU $0C
PCRTC_REG_CTLD .EQU $0D
PCRTC_CTLA_VAL .EQU $2F
PCRTC_CTLB_VAL .EQU $0A
PCRTC_NVBASE .EQU $10
PCRTC_NVSIZE .EQU $30 ; 64 bytes in total is what DS1285 and MC146818 had
DEVECHO "PCRTC: IO="
DEVECHO PCRTC_BASE
@ -43,7 +43,7 @@ PCRTC_INIT:
RET NZ ; IF ALREADY ACTIVE, ABORT
CALL NEWLINE ; FORMATTING
PRTS("PC RTC: $")
PRTS("PCRTC: $")
; PRINT RTC REGISTER NR PORT ADDRESS
PRTS("IO=0x$") ; LABEL FOR IO ADDRESS
@ -222,66 +222,66 @@ PCRTC_SETTIM:
LD BC,PCRTC_BUFSIZ ; LENGTH
CALL HB_BNKCPY ; COPY THE RPC DATA
;
LD A, REG_CTLA ; Set Ctl Reg A
LD A, PCRTC_REG_CTLA ; Set Ctl Reg A
EZ80_IO
OUT (PCRTC_REG), A
LD A, CTLA_VAL
LD A, PCRTC_CTLA_VAL
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_CTLB ; Set Ctl Reg B
LD A, PCRTC_REG_CTLB ; Set Ctl Reg B
EZ80_IO
OUT (PCRTC_REG), A
LD A, CTLB_VAL|0x80 ; Set the SET bit to stop updates
LD A, PCRTC_CTLB_VAL|0x80 ; Set the SET bit to stop updates
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_SEC ; Set seconds
LD A, PCRTC_REG_SEC ; Set seconds
EZ80_IO
OUT (PCRTC_REG), A
LD A, (PCRTC_SS)
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_MIN ; Set minutes
LD A, PCRTC_REG_MIN ; Set minutes
EZ80_IO
OUT (PCRTC_REG), A
LD A, (PCRTC_MM)
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_HOUR ; Set hours
LD A, PCRTC_REG_HOUR ; Set hours
EZ80_IO
OUT (PCRTC_REG), A
LD A, (PCRTC_HH)
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_DAY ; Set date
LD A, PCRTC_REG_DAY ; Set date
EZ80_IO
OUT (PCRTC_REG), A
LD A, (PCRTC_DT)
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_MONTH ; Set month
LD A, PCRTC_REG_MONTH ; Set month
EZ80_IO
OUT (PCRTC_REG), A
LD A, (PCRTC_MO)
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_YEAR ; Set year
LD A, PCRTC_REG_YEAR ; Set year
EZ80_IO
OUT (PCRTC_REG), A
LD A, (PCRTC_YR)
EZ80_IO
OUT (PCRTC_DAT), A
LD A, REG_CTLB ; Set Ctl Reg B
LD A, PCRTC_REG_CTLB ; Set Ctl Reg B
EZ80_IO
OUT (PCRTC_REG), A
LD A, CTLB_VAL ; Reset the SET bit to start clock
LD A, PCRTC_CTLB_VAL ; Reset the SET bit to start clock
EZ80_IO
OUT (PCRTC_DAT), A
@ -302,50 +302,50 @@ PCRTC_DEVICE:
; READ OUT THE TIME
PCRTC_RDTIM:
;; Need to wait until update-in-progress flag is reset
LD A, REG_CTLA ; Set Ctl Reg A
LD A, PCRTC_REG_CTLA ; Set Ctl Reg A
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO
IN A, (PCRTC_DAT)
BIT 7, A
JP NZ, PCRTC_RDTIM ; Jump back if update in progress.
JP NZ, PCRTC_RDTIM ; Jump back if update in progress.
LD A, REG_SEC ; Set seconds
LD A, PCRTC_REG_SEC ; Set seconds
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO
IN A, (PCRTC_DAT)
LD (PCRTC_SS), A
LD A, REG_MIN ; Set minutes
LD A, PCRTC_REG_MIN ; Set minutes
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO
IN A, (PCRTC_DAT)
LD (PCRTC_MM), A
LD A, REG_HOUR ; Set hours
LD A, PCRTC_REG_HOUR ; Set hours
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO
IN A, (PCRTC_DAT)
LD (PCRTC_HH), A
LD A, REG_DAY ; Set day
LD A, PCRTC_REG_DAY ; Set day
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO
IN A, (PCRTC_DAT)
LD (PCRTC_DT), A
LD A, REG_MONTH ; Set month
LD A, PCRTC_REG_MONTH ; Set month
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO
IN A, (PCRTC_DAT)
LD (PCRTC_MO), A
LD A, REG_YEAR ; Set year
LD A, PCRTC_REG_YEAR ; Set year
EZ80_IO
OUT (PCRTC_REG), A
EZ80_IO

Loading…
Cancel
Save