;**************************************************************************** ; B3C-QX10.INS ( QX-10 RTC clock code for BYE335) ; ; v1.2 June 1985 Norm Gregory Seattle's 'downspout' 206-325-1325 ; ; This is to be inserted in the BYE3 code right afte IF TIMEON label following ; the machine insert. ; ; NOTE: It is no longer required that the user define the starting address ; of the BIOS area. Modifications allowing fuller compatibility ; with most versions of CP/M have been incorporated (i.e. removing ; the need for indirect access to clock via BIOS jump table. ; ; Since we are accessing the CMOS chip directly this insert should ; work under any QX-10 operating system. ; ; THANKS TO: Roger Lanphere (Mt Vernon, WA) for invaluable help whenever ; asked. Mick Gaitor (Brooklyn, NY) for much of the code here. I ; borrowed heavily from his MXC-QX10.ASM. If you are using MEX on ; your QX-10 you should be using his overlays. Super job Mick! ; ;**************************************************************************** ; BUSY EQU 80H ;Mask to test for clock busy condition CLKADR EQU 3DH ;QX-10 clock command register port CLKDAT EQU 3CH ;QX-10 clock data register port STBYTE EQU 0AH ;Clock memory addr to check for clock busy CENTURY EQU 019H ;Hey, it's the 1900's (for a while). ; IF RTC TIME: CALL CREAD ; read data from clock chip LDA TBFR+3 STA RTCBUF+0 ; Hour LDA TBFR+4 STA RTCBUF+1 ; Minute LDA TBFR+5 STA RTCBUF+2 ; Second MVI A,CENTURY STA RTCBUF+3 ; Century LDA TBFR+0 STA RTCBUF+4 ; Year LDA TBFR+1 STA RTCBUF+5 ; Month LDA TBFR+2 STA RTCBUF+6 ; Day LDA RTCBUF ; Pick up BCD HH CALL BCDBIN ; And convert to binary STA CCHOUR ; For BYE3 LDA RTCBUF+1 ; BCD MM CALL BCDBIN STA CCMIN ; To binary for BYE3 RET ; And return (for now..) ; ;========= ; ; CREAD: gets date/time directly from the LSI 46818 chip. ; (doing it this way rather than through the QX-10 BIOS ; call makes this overlay independent of the version ; of Epson's CPM (A or B) being used.) ; ; Time/Date buffer consists of 6 bytes of packed BCD-encoded information ; located in buffer TBFR. Time/Date buffer is of the following format: ; ; TBFR + 0 = year ; + 1 = month ; + 2 = day ; + 3 = hour ; + 4 = minute ; + 5 = second ; CREAD: CALL CLKBSY ;Wait till clock is idle LXI H,TBFR ;Point to time/date buffer LXI D,ADRTBL ;Point to clock memory data address table MVI B,6 ;Number of data items to read TDLOOP: LDAX D ;Get next clock memory data address OUT CLKADR ;and send addr to clock port IN CLKDAT ;Read clock data MOV M,A ;and store in time/date buffer INX H ;Set next time/date buffer position INX D ;Set next clock memory data address DCR B ;One less data item JNZ TDLOOP ; - continue read till done RET ; CLKBSY: ;Routine to wait till clock is idle MVI A,STBYTE ;Check if clock is updating OUT CLKADR ;Send address IN CLKDAT ;Read clock ANI BUSY ;Test bit 7 JNZ CLKBSY ;Jump if clock busy RET ; TBFR: DS 6 ;Real-time clock buffer - see above ADRTBL: DB 9,8,7,4,2,0 ;Clock memory addr's for yr,mo,da,hr,min,sec ENDIF ;RTC ; ;***************************************************************************