home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************
- ; *
- ; B5C-ZCLK.INS *
- ; *
- ; Clock insert for BYE5xx with the following hardware *
- ; configuration: *
- ; *
- ; Heath/Zenith Z-100 series computer *
- ; ZCLK clock card from FBE Research *
- ; *
- ; Hampton Childress *
- ; Sysop, BHEC RCPM/RBBS 10/27/85 *
- ; (301) 661-2175 *
- ; *
- ; Be sure to set the BCDBIN equate to TRUE *
- ; *
- ; *
- ;****************************************************************
-
- ; Access to the ZCLK is via the 6821 Parallel Printer PIA
- ; (U114) as follows:
- ;
- ; PIA Bit Name Function
- ; ------------------------------------------------
- ; PB1 /ERROR Enable access to ZCLK *
- ;
- ; PA0 PD1 RD Strobe
- ; PA1 PD2 WR Strobe
- ;
- ; PB2 PD3 Address Counter Clock
- ;
- ; PB4 PD5 Data Bus Bit D0 (LSB)
- ; PB5 PD6 Data Bus Bit D1
- ; PB6 PD7 Data Bus Bit D2
- ; PB7 PD8 Data Bus Bit D3
- ;
- ; * Installing the ZCLK disconnects PB1 from the /ERROR
- ; signal from the printer. PB1 is programmed as an input
- ; by CP/M-86 but is used here as an output.
- ;
- ;************************************************************
- ; MSM5832 REGISTER DEFINITIONS
- ;************************************************************
- ;
- ; Data Bus
- ; ADDR NAME D3 D2 D1 D0 RANGE NOTES
- ; ----------------------------------------------------------
- ; 0 S1 * * * * 0-9 S1 and S10 are reset to
- ; 1 S10 * * * 0-5 zero on write to address
- ;
- ; 2 MI1 * * * * 0-9
- ; 3 MI10 * * * 0-5
- ;
- ; 4 H1 * * * * 0-9
- ; 5 H10 A B * * 0-2 A=1 for 24 hour format
- ; A=0 for 12 hour format
- ; B=1 for PM B=0 for AM
- ; 6 W * * * 0-6
- ;
- ; 7 D1 * * * * 0-9
- ; 8 D10 C * * 0-3 C=0 for 28 day February
- ; C=1 for 29 day February
- ; 9 MO1 * * * * 0-9
- ; 10 MO10 * 0-1
- ;
- ; 11 Y1 * * * * 0-9
- ; 12 Y10 * * * *
- ;
- ; All registers are read/write. * means data valid as "1"
- ; or "0" bit. Blank means bit does not exist ("0" during
- ; read and ignored on write).
- ;
- ;************************************************************
- ;
-
- ZPIA EQU 0E0H ; PIA base port
- ADATA EQU ZPIA+0
- ACTL EQU ZPIA+1
- BDATA EQU ZPIA+2
- BCTL EQU ZPIA+3
- CENTURY EQU 019H
-
- ;
- ;
- TIME: DI ; No interrupts
- CALL ACCESS ; Enable the ZCLK
- CALL SPBDIR ; Select direction register
- MVI A,00001110B ; Make DB4-DB7 inputs
- OUT BDATA
- CALL SPBDAT ; Select data register
- IN ADATA ; Set RD low
- ANI 11111110B
- OUT ADATA
- LXI D,BUFFER
- MVI B,13
- INLOOP: CALL RDZCLK ; Read ZCLK byte
- STAX D ; Byte to buffer
- INX D ; Advance pointer
- CALL CLKADR ; Advance address counter
- DCR B ; Done all?
- JNZ INLOOP ; Loop if not
- IN ADATA ; Set RD high
- ORI 00000001B
- OUT ADATA
-
- ;
- ;
- CALL SPBDIR ; Select direction register
- MVI A,11111100B ; Make PB1 an input
- OUT BDATA
- CALL SPBDAT ; Select data register
- EI ; Interrupts ok now
- ;
- LDA BUFFER+5 ; Still there seem to remain some
- ANI 03H ; annoying bits which must be
- STA BUFFER+5 ; removed
- LDA BUFFER+6
- ANI 07H
- STA BUFFER+6
- LDA BUFFER+8
- ANI 03H
- STA BUFFER+8
- ;
- ;
- LXI D,RTCBUF ; Point to start of RTC buffer (hours)
- LXI H,BUFFER+5 ; Point to our buffer (hours)
- CALL GTSTOR
- CALL BCDBIN
- STA CCHOUR
- LXI H,BUFFER+3 ; Minutes
- CALL GTSTOR
- CALL BCDBIN
- STA CCMIN
- LXI H,BUFFER+1 ; Seconds
- CALL GTSTOR
- MVI A,CENTURY ; Century equate
- STAX D ; Century
- INX D
- MVI B,3 ; Set counter
- LXI H,BUFFER+12
- DTLOOP: CALL GTSTOR ; Simple date moving loop
- DCX H ; Point to next byte
- DCR B ; Test counter to see if we're done
- JNZ DTLOOP ; Day, month, year
-
- RET ; To BYE
-
- GTSTOR: MOV A,M ; Get a character from the buffer
- RLC ! RLC ! RLC ! RLC ; Position data in high nibble
- ANI 0F0H ; Just for good measure
- DCX H
- ADD M ; Add the low nibble to form bcd
- STAX D ; Store it
- INX D ; Increment RTCBUF pointer
- RET
-
- ;
- ;
- RDZCLK:
- PUSH B ; Wait for access (6 usec)
- MVI B,6
- CALL WAITSOME
- POP B
- IN BDATA ; Read ZCLK
- RRC ! RRC ! RRC ! RRC ; Position the data
- ANI 00001111B ; Mask off unwanted bits
- RET
- ;
- ;
- CLKADR: IN BDATA
- ORI 00000100B ; Set counter clock high
- OUT BDATA
- ANI 11111011B ; Set counter clock low
- OUT BDATA
- RET
- ;
- ;
- SPBDIR: IN BCTL ; Select B port direction reg
- ANI 11111011B
- OUT BCTL
- RET
- ;
- ;
- SPBDAT: IN BCTL ; Select B port data register
- ORI 00000100B
- OUT BCTL
- RET
- ;
- ;
- ACCESS: IN ADATA ; Set RD and WR high
- ORI 00000011B
- OUT ADATA
- CALL SPBDIR ; Select direction register
- MVI A,11111110B ; Make PB1 and output
- OUT BDATA
- CALL SPBDAT ; Select data register
- XRA A ; Make PB1 low to enable ZCLK
- OUT BDATA
- ;
- MVI B,150 ; Wait for access (150 usec)
- WAITSOME:
- NOP ! NOP ! NOP ! NOP ! NOP ; Waste 1 usec. at 5 mhz
- DCR B
- JNZ WAITSOME
- RET
- ;
- BUFFER DB 'xxxxxxxxxxxxx' ; 13 byte buffer for the ZCLK
- ;
- ; *** End of ZCLK clock card routine for the Z-100 ***
- ;