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

;
;==================================================================================================
; 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