mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
6.3 KiB
326 lines
6.3 KiB
;
|
|
;==================================================================================================
|
|
; M6242 CLOCK DRIVER
|
|
;==================================================================================================
|
|
;
|
|
M6242RTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS)
|
|
;
|
|
; RTC DEVICE INITIALIZATION ENTRY
|
|
;
|
|
|
|
; TODO:
|
|
; set the day of week register
|
|
|
|
;; 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
|
|
|
|
|
|
REG_1SEC .EQU $00
|
|
REG_10SEC .EQU $01
|
|
REG_1MIN .EQU $02
|
|
REG_10MIN .EQU $03
|
|
REG_1HR .EQU $04
|
|
REG_10HR .EQU $05
|
|
REG_1DAY .EQU $06
|
|
REG_10DAY .EQU $07
|
|
REG_1MNTH .EQU $08
|
|
REG_10MNTH .EQU $09
|
|
REG_1YEAR .EQU $0A
|
|
REG_10YEAR .EQU $0B
|
|
REG_DAYWEEK .EQU $0C ; NOT USED BY THIS DRIVER
|
|
REG_CONTROL1 .EQU $0D
|
|
REG_CONTROL2 .EQU $0E
|
|
REG_CONTROL3 .EQU $0F
|
|
|
|
.ECHO "M6242: IO="
|
|
.ECHO M6242RTC_BASE
|
|
.ECHO "\n"
|
|
|
|
M6242RTC_INIT:
|
|
LD A, (RTC_DISPACT) ; RTC DISPATCHER ALREADY SET?
|
|
OR A ; SET FLAGS
|
|
RET NZ ; IF ALREADY ACTIVE, ABORT
|
|
|
|
CALL NEWLINE ; FORMATTING
|
|
PRTS("M6242 RTC: $")
|
|
|
|
; PRINT RTC LATCH PORT ADDRESS
|
|
PRTS("IO=0x$") ; LABEL FOR IO ADDRESS
|
|
LD A,M6242RTC_BASE ; GET IO ADDRESS
|
|
CALL PRTHEXBYTE ; PRINT IT
|
|
CALL PC_SPACE ; FORMATTING
|
|
|
|
; CHECK PRESENCE STATUS
|
|
CALL M6242RTC_DETECT ; HARDWARE DETECTION
|
|
JR Z, M6242RTC_INIT1 ; IF ZERO, ALL GOOD
|
|
PRTS("NOT PRESENT$") ; NOT ZERO, H/W NOT PRESENT
|
|
OR $FF ; SIGNAL FAILURE
|
|
RET ; BAIL OUT
|
|
|
|
M6242RTC_INIT1:
|
|
; ENSURE DEVICE IS RESET AND NOT IN TEST MODE
|
|
LD A, 05h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR
|
|
OUT (REG_CONTROL3 + M6242RTC_BASE), A
|
|
LD A, 05h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR
|
|
OUT (REG_CONTROL3 + M6242RTC_BASE), A
|
|
LD A, 04h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR
|
|
OUT (REG_CONTROL3 + M6242RTC_BASE), A
|
|
|
|
LD A, 00h ; LET CLOCK RUN
|
|
OUT (REG_CONTROL1 + M6242RTC_BASE), A
|
|
OUT (REG_CONTROL2 + M6242RTC_BASE), A
|
|
|
|
; DISPLAY CURRENT TIME
|
|
LD HL, M6242RTC_BCDBUF ; POINT TO BCD BUF
|
|
CALL M6242RTC_GETTIM
|
|
CALL PRTDT
|
|
;
|
|
LD BC, M6242RTC_DISPATCH
|
|
CALL RTC_SETDISP
|
|
;
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
; DETECT RTC HARDWARE PRESENCE
|
|
;
|
|
M6242RTC_DETECT:
|
|
LD A, 01h ; TURN ON REST BIT
|
|
OUT (REG_CONTROL3 + M6242RTC_BASE), A
|
|
CALL DLY64
|
|
CALL DLY64
|
|
IN A,(REG_CONTROL3 + M6242RTC_BASE)
|
|
AND 01h
|
|
CP 01h
|
|
JR NZ, M6242RTC_DETECTERR ; IF NOT MATCH, ERROR
|
|
LD A, 00h ; TURN OFF REST BIT
|
|
OUT (REG_CONTROL3 + M6242RTC_BASE), A
|
|
CALL DLY64
|
|
CALL DLY64
|
|
IN A,(REG_CONTROL3 + M6242RTC_BASE)
|
|
AND 01h
|
|
CP 00h
|
|
JR NZ, M6242RTC_DETECTERR ; IF NOT MATCH, ERROR
|
|
LD A, 0 ; ASSUME OK
|
|
OR A ; SET FLAGS
|
|
RET
|
|
|
|
M6242RTC_DETECTERR:
|
|
LD A, $FF ; ELSE STATUS IS ERROR
|
|
OR A ; SET FLAGS
|
|
RET
|
|
|
|
;
|
|
; RTC DEVICE FUNCTION DISPATCH ENTRY
|
|
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR
|
|
; B: FUNCTION (IN)
|
|
;
|
|
M6242RTC_DISPATCH:
|
|
LD A,B ; GET REQUESTED FUNCTION
|
|
AND $0F ; ISOLATE SUB-FUNCTION
|
|
JP Z,M6242RTC_GETTIM ; GET TIME
|
|
DEC A
|
|
JP Z,M6242RTC_SETTIM ; SET TIME
|
|
DEC A
|
|
JP Z,M6242RTC_GETBYT ; GET NVRAM BYTE VALUE
|
|
DEC A
|
|
JP Z,M6242RTC_SETBYT ; SET NVRAM BYTE VALUE
|
|
DEC A
|
|
JP Z,M6242RTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
|
|
DEC A
|
|
JP Z,M6242RTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
|
|
DEC A
|
|
JP Z,M6242RTC_GETALM ; GET ALARM
|
|
DEC A
|
|
JP Z,M6242RTC_SETALM ; SET ALARM
|
|
DEC A
|
|
JP Z,M6242RTC_DEVICE ; REPORT RTC DEVICE INFO
|
|
SYSCHKERR(ERR_NOFUNC)
|
|
RET
|
|
;
|
|
; RTC GET NVRAM BYTE
|
|
; C: INDEX
|
|
; E: VALUE (OUTPUT)
|
|
; A:0 IF OK, ERR_RANGE IF OUT OF RANGE
|
|
;
|
|
M6242RTC_GETBYT:
|
|
M6242RTC_SETBYT:
|
|
M6242RTC_GETBLK:
|
|
M6242RTC_SETBLK:
|
|
M6242RTC_GETALM:
|
|
M6242RTC_SETALM:
|
|
SYSCHKERR(ERR_NOTIMPL)
|
|
RET
|
|
;
|
|
; RTC GET TIME
|
|
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR
|
|
; HL: DATE/TIME BUFFER (OUT)
|
|
; BUFFER FORMAT IS BCD: YYMMDDHHMMSS
|
|
; 24 HOUR TIME FORMAT IS ASSUMED
|
|
;
|
|
M6242RTC_GETTIM:
|
|
PUSH HL
|
|
PUSH BC
|
|
IN A,(REG_10YEAR + M6242RTC_BASE)
|
|
RLA
|
|
RLA
|
|
RLA
|
|
RLA
|
|
LD C,A
|
|
IN A,(REG_1YEAR + M6242RTC_BASE)
|
|
AND 0FH
|
|
OR C
|
|
LD (HL),A
|
|
INC HL
|
|
|
|
IN A,(REG_10MNTH + M6242RTC_BASE)
|
|
RLA
|
|
RLA
|
|
RLA
|
|
RLA
|
|
LD C,A
|
|
IN A,(REG_1MNTH + M6242RTC_BASE)
|
|
AND 0FH
|
|
OR C
|
|
LD (HL),A
|
|
INC HL
|
|
|
|
IN A,(REG_10DAY + M6242RTC_BASE)
|
|
RLA
|
|
RLA
|
|
RLA
|
|
RLA
|
|
LD C,A
|
|
IN A,(REG_1DAY + M6242RTC_BASE)
|
|
AND 0FH
|
|
OR C
|
|
LD (HL),A
|
|
INC HL
|
|
|
|
IN A,(REG_10HR + M6242RTC_BASE)
|
|
RLA
|
|
RLA
|
|
RLA
|
|
RLA
|
|
LD C,A
|
|
IN A,(REG_1HR + M6242RTC_BASE)
|
|
AND 0FH
|
|
OR C
|
|
LD (HL),A
|
|
INC HL
|
|
|
|
IN A,(REG_10MIN + M6242RTC_BASE)
|
|
RLA
|
|
RLA
|
|
RLA
|
|
RLA
|
|
LD C,A
|
|
IN A,(REG_1MIN + M6242RTC_BASE)
|
|
AND 0FH
|
|
OR C
|
|
LD (HL),A
|
|
INC HL
|
|
|
|
IN A,(REG_10SEC + M6242RTC_BASE)
|
|
RLA
|
|
RLA
|
|
RLA
|
|
RLA
|
|
LD C,A
|
|
IN A,(REG_1SEC + M6242RTC_BASE)
|
|
AND 0FH
|
|
OR C
|
|
LD (HL),A
|
|
INC HL
|
|
|
|
POP BC
|
|
POP HL
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET ; AND RETURN
|
|
;
|
|
;
|
|
; RTC SET TIME
|
|
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR
|
|
; HL: DATE/TIME BUFFER (IN)
|
|
; BUFFER FORMAT IS BCD: YYMMDDHHMMSSWW
|
|
; 24 HOUR TIME FORMAT IS ASSUMED
|
|
;
|
|
M6242RTC_SETTIM:
|
|
PUSH HL
|
|
LD A, (HL)
|
|
OUT (REG_1YEAR + M6242RTC_BASE), A
|
|
RRA
|
|
RRA
|
|
RRA
|
|
RRA
|
|
OUT (REG_10YEAR + M6242RTC_BASE), A
|
|
|
|
INC HL
|
|
LD A, (HL)
|
|
OUT (REG_1MNTH + M6242RTC_BASE), A
|
|
RRA
|
|
RRA
|
|
RRA
|
|
RRA
|
|
OUT (REG_10MNTH + M6242RTC_BASE), A
|
|
|
|
INC HL
|
|
LD A, (HL)
|
|
OUT (REG_1DAY+ M6242RTC_BASE), A
|
|
RRA
|
|
RRA
|
|
RRA
|
|
RRA
|
|
OUT (REG_10DAY + M6242RTC_BASE), A
|
|
|
|
INC HL
|
|
LD A, (HL)
|
|
OUT (REG_1HR + M6242RTC_BASE), A
|
|
RRA
|
|
RRA
|
|
RRA
|
|
RRA
|
|
OUT (REG_10HR + M6242RTC_BASE), A
|
|
|
|
INC HL
|
|
LD A, (HL)
|
|
OUT (REG_1MIN + M6242RTC_BASE), A
|
|
RRA
|
|
RRA
|
|
RRA
|
|
RRA
|
|
OUT (REG_10MIN + M6242RTC_BASE), A
|
|
|
|
INC HL
|
|
LD A, (HL)
|
|
OUT (REG_1SEC + M6242RTC_BASE), A
|
|
RRA
|
|
RRA
|
|
RRA
|
|
RRA
|
|
OUT (REG_10SEC + M6242RTC_BASE), A
|
|
POP HL
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET ; AND RETURN
|
|
;
|
|
; REPORT RTC DEVICE INFO
|
|
;
|
|
M6242RTC_DEVICE:
|
|
LD D,RTCDEV_M6242 ; D := DEVICE TYPE
|
|
LD E,0 ; E := PHYSICAL DEVICE NUMBER
|
|
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
|
LD L,0 ; L := 0, NO I/O ADDRESS
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|
|
M6242RTC_BCDBUF:
|
|
RP5RTC_YR .DB 20
|
|
RP5RTC_MO .DB 01
|
|
RP5RTC_DT .DB 01
|
|
RP5RTC_HH .DB 00
|
|
RP5RTC_MM .DB 00
|
|
RP5RTC_SS .DB 00
|