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.
169 lines
4.1 KiB
169 lines
4.1 KiB
;
|
|
;==================================================================================================
|
|
; SIMH RTC DRIVER
|
|
;==================================================================================================
|
|
;
|
|
SIMRTC_IO .EQU $FE ; SIMH IO PORT
|
|
SIMRTC_CLKREAD .EQU 7 ; READ CLOCK COMMAND
|
|
SIMRTC_CLKWRITE .EQU 8 ; WRITE CLOCK COMMAND
|
|
SIMRTC_BUFSIZ .EQU 6 ; SIX BYTE BUFFER (YYMMDDHHMMSS)
|
|
;
|
|
; RTC DEVICE INITIALIZATION ENTRY
|
|
;
|
|
SIMRTC_INIT:
|
|
PRTS("SIMRTC: $")
|
|
;
|
|
; DISPLAY CURRENT TIME
|
|
LD HL,SIMRTC_BUF
|
|
PUSH HL
|
|
CALL SIMRTC_GETTIM0
|
|
POP HL
|
|
CALL PRTDT
|
|
;
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
; RTC DEVICE FUNCTION DISPATCH ENTRY
|
|
; A: RESULT (OUT), 0=OK, Z=OK, NZ=ERR
|
|
; B: FUNCTION (IN)
|
|
;
|
|
SIMRTC_DISPATCH:
|
|
LD A,B ; GET REQUESTED FUNCTION
|
|
AND $0F ; ISOLATE SUB-FUNCTION
|
|
JP Z,SIMRTC_GETTIM ; GET TIME
|
|
DEC A
|
|
JP Z,SIMRTC_SETTIM ; SET TIME
|
|
DEC A
|
|
JP Z,SIMRTC_GETBYT ; GET NVRAM BYTE VALUE
|
|
DEC A
|
|
JP Z,SIMRTC_SETBYT ; SET NVRAM BYTE VALUE
|
|
DEC A
|
|
JP Z,SIMRTC_GETBLK ; GET NVRAM DATA BLOCK VALUES
|
|
DEC A
|
|
JP Z,SIMRTC_SETBLK ; SET NVRAM DATA BLOCK VALUES
|
|
CALL PANIC
|
|
;
|
|
; NVRAM FUNCTIONS ARE NOT AVAILABLE IN SIMULATOR
|
|
;
|
|
SIMRTC_GETBYT:
|
|
SIMRTC_SETBYT:
|
|
SIMRTC_GETBLK:
|
|
SIMRTC_SETBLK:
|
|
CALL PANIC
|
|
;
|
|
; 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
|
|
;
|
|
SIMRTC_GETTIM:
|
|
; PUSH HL
|
|
; POP BC
|
|
; CALL NEWLINE
|
|
; CALL PRTHEXWORD
|
|
; CALL NEWLINE
|
|
|
|
; LD A,SIMRTC_CLKREAD ; READ CLOCK COMMAND
|
|
; OUT (SIMRTC_IO),A ; SEND IT TO SIMH
|
|
; LD B,SIMRTC_BUFSIZ ; SETUP TO GET 6 BYTES
|
|
; LD C,SIMRTC_IO ; FROM SIMH PORT
|
|
; INIR ; GET BYTES TO (HL)
|
|
;;
|
|
; XOR A ; SIGNAL SUCCESS
|
|
; RET ; AND RETURN
|
|
|
|
; GET THE TIME INTO TEMP BUF
|
|
PUSH HL ; SAVE PTR TO CALLS BUFFER
|
|
CALL SIMRTC_GETTIM0 ; GET TIME TO WORK BUFFER
|
|
;
|
|
; NOW COPY TO REAL DESTINATION (INTERBANK SAFE)
|
|
LD C,BID_HB ; SOURCE BANK IS OUT BANK
|
|
CALL HBXX_GETBNK
|
|
LD B,A ; .. AND USE AS DEST BANK
|
|
CALL HBXX_XCOPY ; SET COPY BANKS
|
|
LD HL,SIMRTC_BUF ; SOURCE ADR
|
|
POP DE ; DEST ADR
|
|
LD BC,SIMRTC_BUFSIZ ; LENGTH
|
|
CALL HBXX_COPY
|
|
|
|
; ; FILL IN DAY OF WEEK VIA ALGORITHM ASSUMING CENTURY IS 20XX
|
|
; PUSH HL
|
|
; LD A,(SIMRTC_YR)
|
|
; CALL BCD2BIN
|
|
; LD L,A ; YEAR VALUE
|
|
; LD H,0 ; .. IN HL
|
|
; LD DE,2000 ; ASSUME CENTURY IS 20XX
|
|
; ADD HL,DE ; .. AND ADD IT IN TO THE YEAR VALUE IN HL
|
|
; LD A,(SIMRTC_MO)
|
|
; CALL BCD2BIN
|
|
; LD D,A ; MONTH VALUE IN D
|
|
; LD A,(SIMRTC_DT)
|
|
; CALL BCD2BIN
|
|
; LD E,A ; DATE VALUE IN E
|
|
; CALL DOW
|
|
; POP HL
|
|
; LD (HL),A ; FILL IN THE FINAL VALUE
|
|
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET ; AND RETURN
|
|
;
|
|
SIMRTC_GETTIM0:
|
|
LD HL,SIMRTC_BUF
|
|
LD A,SIMRTC_CLKREAD ; READ CLOCK COMMAND
|
|
OUT (SIMRTC_IO),A ; SEND IT TO SIMH
|
|
LD B,SIMRTC_BUFSIZ ; SETUP TO GET 6 BYTES
|
|
LD C,SIMRTC_IO ; FROM SIMH PORT
|
|
INIR ; GET BYTES TO (HL)
|
|
RET
|
|
|
|
;
|
|
; 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
|
|
;
|
|
SIMRTC_SETTIM:
|
|
;
|
|
; LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND
|
|
; OUT (SIMRTC_IO),A ; SEND COMMAND TO SIMH
|
|
; LD A,L ; LOW BYTE OF BUFFER ADDRESS
|
|
; OUT (SIMRTC_IO),A ; SEND IT
|
|
; LD A,H ; HIGH BYTE OF BUFFER ADDRESS
|
|
; OUT (SIMRTC_IO),A ; SEND IT
|
|
;;
|
|
; XOR A ; SIGNAL SUCCESS
|
|
; RET ; AND RETURN
|
|
|
|
|
|
;
|
|
; COPY TO TEMP BUF
|
|
CALL HBXX_GETBNK
|
|
LD C,A ; .. AND USE AS SOURCE BANK
|
|
LD B,BID_HB ; DESTINATION BANK
|
|
CALL HBXX_XCOPY ; SET COPY BANKS
|
|
LD DE,SIMRTC_BUF ; DEST ADR
|
|
LD BC,SIMRTC_BUFSIZ ; LENGTH
|
|
CALL HBXX_COPY ; DO THE COPY
|
|
;
|
|
LD HL,SIMRTC_BUF ; POINT TO TEMP BUF
|
|
LD A,SIMRTC_CLKWRITE ; WRITE CLOCK COMMAND
|
|
OUT (SIMRTC_IO),A ; SEND COMMAND TO SIMH
|
|
LD A,L ; LOW BYTE OF BUFFER ADDRESS
|
|
OUT (SIMRTC_IO),A ; SEND IT
|
|
LD A,H ; HIGH BYTE OF BUFFER ADDRESS
|
|
OUT (SIMRTC_IO),A ; SEND IT
|
|
;
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET ; AND RETURN
|
|
;
|
|
; WORKING VARIABLES
|
|
;
|
|
SIMRTC_BUF: ; ALL IN BCD!!!
|
|
SIMRTC_YR .DB 0
|
|
SIMRTC_MO .DB 0
|
|
SIMRTC_DT .DB 0
|
|
SIMRTC_HH .DB 0
|
|
SIMRTC_MM .DB 0
|
|
SIMRTC_SS .DB 0
|
|
|