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