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.7 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
M6242RTC_REG_1SEC .EQU $00
M6242RTC_REG_10SEC .EQU $01
M6242RTC_REG_1MIN .EQU $02
M6242RTC_REG_10MIN .EQU $03
M6242RTC_REG_1HR .EQU $04
M6242RTC_REG_10HR .EQU $05
M6242RTC_REG_1DAY .EQU $06
M6242RTC_REG_10DAY .EQU $07
M6242RTC_REG_1MNTH .EQU $08
M6242RTC_REG_10MNTH .EQU $09
M6242RTC_REG_1YEAR .EQU $0A
M6242RTC_REG_10YEAR .EQU $0B
M6242RTC_REG_DAYWEEK .EQU $0C ; NOT USED BY THIS DRIVER
M6242RTC_REG_CONTROL1 .EQU $0D
M6242RTC_REG_CONTROL2 .EQU $0E
M6242RTC_REG_CONTROL3 .EQU $0F
DEVECHO "M6242RTC: IO="
DEVECHO M6242RTC_BASE
DEVECHO "\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("M6242RTC: $")
; 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 (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A
LD A, 05h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR
OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A
LD A, 04h ; TURN OFF ALL TEST MODE BITS, SET 24 HOUR
OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A
LD A, 00h ; LET CLOCK RUN
OUT (M6242RTC_REG_CONTROL1 + M6242RTC_BASE), A
OUT (M6242RTC_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 (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A
CALL DLY64
CALL DLY64
IN A,(M6242RTC_REG_CONTROL3 + M6242RTC_BASE)
AND 01h
CP 01h
JR NZ, M6242RTC_DETECTERR ; IF NOT MATCH, ERROR
LD A, 00h ; TURN OFF REST BIT
OUT (M6242RTC_REG_CONTROL3 + M6242RTC_BASE), A
CALL DLY64
CALL DLY64
IN A,(M6242RTC_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,(M6242RTC_REG_10YEAR + M6242RTC_BASE)
RLA
RLA
RLA
RLA
LD C,A
IN A,(M6242RTC_REG_1YEAR + M6242RTC_BASE)
AND 0FH
OR C
LD (HL),A
INC HL
IN A,(M6242RTC_REG_10MNTH + M6242RTC_BASE)
RLA
RLA
RLA
RLA
LD C,A
IN A,(M6242RTC_REG_1MNTH + M6242RTC_BASE)
AND 0FH
OR C
LD (HL),A
INC HL
IN A,(M6242RTC_REG_10DAY + M6242RTC_BASE)
RLA
RLA
RLA
RLA
LD C,A
IN A,(M6242RTC_REG_1DAY + M6242RTC_BASE)
AND 0FH
OR C
LD (HL),A
INC HL
IN A,(M6242RTC_REG_10HR + M6242RTC_BASE)
RLA
RLA
RLA
RLA
LD C,A
IN A,(M6242RTC_REG_1HR + M6242RTC_BASE)
AND 0FH
OR C
LD (HL),A
INC HL
IN A,(M6242RTC_REG_10MIN + M6242RTC_BASE)
RLA
RLA
RLA
RLA
LD C,A
IN A,(M6242RTC_REG_1MIN + M6242RTC_BASE)
AND 0FH
OR C
LD (HL),A
INC HL
IN A,(M6242RTC_REG_10SEC + M6242RTC_BASE)
RLA
RLA
RLA
RLA
LD C,A
IN A,(M6242RTC_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 (M6242RTC_REG_1YEAR + M6242RTC_BASE), A
RRA
RRA
RRA
RRA
OUT (M6242RTC_REG_10YEAR + M6242RTC_BASE), A
INC HL
LD A, (HL)
OUT (M6242RTC_REG_1MNTH + M6242RTC_BASE), A
RRA
RRA
RRA
RRA
OUT (M6242RTC_REG_10MNTH + M6242RTC_BASE), A
INC HL
LD A, (HL)
OUT (M6242RTC_REG_1DAY+ M6242RTC_BASE), A
RRA
RRA
RRA
RRA
OUT (M6242RTC_REG_10DAY + M6242RTC_BASE), A
INC HL
LD A, (HL)
OUT (M6242RTC_REG_1HR + M6242RTC_BASE), A
RRA
RRA
RRA
RRA
OUT (M6242RTC_REG_10HR + M6242RTC_BASE), A
INC HL
LD A, (HL)
OUT (M6242RTC_REG_1MIN + M6242RTC_BASE), A
RRA
RRA
RRA
RRA
OUT (M6242RTC_REG_10MIN + M6242RTC_BASE), A
INC HL
LD A, (HL)
OUT (M6242RTC_REG_1SEC + M6242RTC_BASE), A
RRA
RRA
RRA
RRA
OUT (M6242RTC_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