home *** CD-ROM | disk | FTP | other *** search
- ;
- ; B3C-DD.INS - Clock routine for the Digital Dynamics card 08/22/85
- ; -- by pst
- ;
- ; This insert should read the clock from a Digital Dynamics
- ; SpeedPro5 clock card. The SpeedPro5 uses a 5832 chip.
- ;
- ; This clock routine needs:
- ; BCD2BIN - no
- ; BIN2BCD - no
- ;
- ; This routine NEEDS a Z80 processor to function properly.
- ; It will NOT work with an 8080 or 8085.
- ;
- ;----------------------------------------------------------------
- ;
- ; Note- This is an insert--not an overlay
- ;
- IF RTC
- DDBASE EQU 156 ; Base port of PIO
- ADATA EQU DDBASE ; Data port A
- ACTRL EQU DDBASE+1 ; Control port A
- BDATA EQU DDBASE+2 ; Data port B
- BCTRL EQU DDBASE+3 ; Control port B
- ;
- NCS EQU 00000001B ; Not chip select
- CLKRD EQU 00000010B ; Clock read
- CLKWR EQU 00000100B ; Clock write
- ADWWR EQU 00001000B ; Address write
- CLKHD EQU 00010000B ; Clock hold
- ;
- TIME: LXI B,ACTRL ; Output mode - port A (reg B=0, C=port)
- CALL SETMODE
- ;
- LXI B,BCTRL ; Output mode - port B (reg B=0, C=port)
- CALL SETMODE
- ;
- XRA A
- OUT ADATA ; Zero address/data lines
- MVI A,NCS+CLKHD
- OUT BDATA ; Deselect chip
- ;
- LXI H,RTCBUF ; Point to RTC buffer
- MVI D,5 ; Set counter for hour tens
- CALL RDIGIT ; Get hour tens
- CALL SHFT4 ; Save in buffer
- CALL MULT10 ; Multiply by 10
- STA CCHOUR ; Save temporarily
- CALL RDIGIT ; Get hour units in A reg
- CALL ADDLOW ; Set BCD digit
- MOV B,A
- LDA CCHOUR
- ADD B ; Add ones digit from B
- STA CCHOUR ; Store for later use
- ;
- ; Minutes
- ;
- CALL RDIGIT ; Get minute tens in A reg
- CALL SHFT4 ; Save in buffer
- CALL MULT10 ; Multiply by 10
- STA CCMIN ; Save in CCMIN
- CALL RDIGIT ; Get minute units in A reg
- CALL ADDLOW ; Set BCD digit
- MOV B,A
- LDA CCMIN
- ADD B ; Add in minutes ones from B
- STA CCMIN ; Store for later use
- ;
- ; Seconds
- ;
- CALL RDIGIT ; Second tens
- CALL SHFT4
- CALL RDIGIT ; Second units
- CALL ADDLOW
- ;
- ; Year
- ;
- INX H ; Skip over "19"
- MVI D,12 ; Start with years tens
- CALL RDIGIT
- CALL SHFT4
- CALL RDIGIT ; Years units
- CALL ADDLOW
- ;
- CALL RDIGIT ; Month tens
- CALL SHFT4
- CALL RDIGIT ; Month units
- CALL ADDLOW
- ;
- CALL RDIGIT ; Day tens
- CALL SHFT4
- CALL RDIGIT ; Day units
- CALL ADDLOW
- ;
- MVI A,0 ; Turn off hold
- OUT BDATA
- MVI A,NCS ; Deselect chip
- OUT BDATA
- RET
- ;
- ; Read a digit
- ; Command in D
- ; Digit returned in A
- ; D is decremented
- ; Hold bit is set
- ; Destroys: 'BCE'
- ;
- RDIGIT: LXI B,ACTRL ; Output mode - port A (b=0, c=port)
- CALL SETMODE
- ;
- MOV A,D ; Get command byte
- OUT ADATA ; Set address on lines
- MVI A,CLKHD+ADWWR ; Hold & Write
- OUT BDATA
- MVI A,CLKHD ; Hold
- OUT BDATA
- ;
- LXI B,0FF00H+ACTRL ; Input mode - port A (b=255, c=port)
- CALL SETMODE
- ;
- MVI A,CLKHD+CLKRD ; Hold & Read
- OUT BDATA
- ;
- MOV A,D ; Check for hour tens digit
- DCR D
- CPI 5 ; Was it hour tens digit?
- ;
- IN ADATA ; Read the digit
- PUSH PSW
- MVI A,CLKHD ; Set hold mode
- OUT BDATA
- POP PSW
- RNZ ; No, return
- ANI 3 ; Yes, so kill 24 hour bit
- RET
- ;
- ; Set for input or output mode of port A
- ; Entry: mode in B -- 255=output, 0=input
- ; port to send to in C
- ;
- SETMODE:MVI A,207 ; Mode 3, bit I/O
- DB 0EDh,079h ; Z80 instruction = OUT (C),A
- DB 0EDh,041h ; Z80 instruction = OUT (C),B
- MVI A,7 ; Interrupt control
- DB 0EDh,079h ; Z80 instruction = OUT (C),A
- MVI A,3
- DB 0EDh,079h ; Z80 instruction = OUT (C),A
- RET
- ;
- ; Multiply register A by 10
- ; Destroys 'E'
- ;
- MULT10: ADD A ; 2x
- MOV E,A
- ADD A ; 4x
- ADD A ; 8x
- ADD D ; 10x
- RET
- ;
- ; Shift A to high nibble
- ; Stores shifted value in 'M'
- ; Destroys 'E'
- ; A is left unchanged
- ;
- SHFT4: MOV E,A
- ANI 15 ; Only handle lower 4 bits
- RLC ; Shift A over 4 bits
- RLC
- RLC
- RLC
- MOV M,A ; Save it while we're at it
- MOV A,E
- RET
- ;
- ; Add in low BCD nibble
- ; Gets high nibble from M
- ; Stores new BCD byte in M
- ; Increments HL
- ; Destroyes 'E'
- ;
- ADDLOW: MOV E,A
- ANI 15 ; Deal with low nibble only
- ORA M ; Add in high nibble from tens digit
- MOV M,A ; Save new BCD byte in buffer
- INX H ; Move on to next location
- MOV A,E
- RET
- ENDIF ; RTC