home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
BBSING
/
MBBS
/
MBC-KPRO.AQM
/
MBC-KPRO.ASM
Wrap
Assembly Source File
|
2000-06-30
|
5KB
|
204 lines
;
;**********************************************************************
;
; MBC-KPRO.ASM -- Version 1.0 -- 03/01/84 -- by Kim Levitt
;
; CLOCK routine for MBYE running on Kaypro 2 with Pro-Clock
; (adapted from Kaypro Pro-Clock driver written by Greg Haerr)
;
; This overlay is designed to work on a Kaypro II running MBYE
; and equipped with a Business Computer Systems Pro-Clock RTC.
; (Use the DATE program to initialize the clock outside of BYE.)
; (BCS address: 5350 South 3600 West; Salt Lake City, UT 84118)
;
; When called this routine will check the RTCBUF. If a '99H'
; is in the first byte, the clock is initialized. Next the
; seconds are checked, and if changed since last update of
; RTC buffer, the clock is stopped, data copied to RTCBUF and
; the clock is restarted. (If no change in seconds, the
; routine returns immediately.)
;
;**********************************************************************
;
CLOCK:
PUSH PSW ; save ALL regs that are used
PUSH B
PUSH H
LDA RTCBUF ; get first BCD byte
CPI 099H ; 99 ?
CZ CLKINIT ; if so, init clock...
CALL HOLDON ; put clock on hold
MVI C,0 ; check low seconds
CALL RDPIO ; to see if change...
LXI H,RTCBUF+2 ; compared to old secs
XRA M ; value stored in
ANI 0FH ; RTC buffer (low nibble)
JZ CLKEXIT ; if no change, skip update
MVI C,5 ; start with hi hours
LXI H,RTCBUF ; and copy to RTCBUF
CALL GETCLK ; (get time)
MVI C,12 ; start with hi year
LXI H,RTCBUF+4 ; and copy to RTCBUF
CALL GETCLK ; (and date)
LDA RTCBUF ; get hours
ANI 03FH ; mask out PM/24 hour bits
STA RTCBUF
LDA RTCBUF+6 ; get day
ANI 03FH ; mask out leap year bit
STA RTCBUF+6
CLKEXIT:
MVI C,13 ; set clock addr. to
CALL WRADDR ; junk location so no data cleared
CALL HOLDOFF ; when we take clock off hold..
POP H ; restore ALL regs
POP B
POP PSW
RET ; and return (for now..)
;
GETCLK:
MVI B,3 ; repeat 3 times for 3 BCD bytes
CLKLP:
CALL RDPIO ; get data at address C
RLC ! RLC ! RLC ! RLC ; move to high nibble for BCD
MOV M,A ; save at location temporarily
DCR C ; decrement clock addr
CALL RDPIO ; get data at next address
ORA M ; OR with previously saved data
MOV M,A ; and save it
DCR C ; decrement clock addr
INX H ; increment to next BCD byte
DCR B ; decrement BCD counter
JNZ CLKLP ; if 3rd BCD byte, done..
RET ; return
;
; PIO STUFF
;
MODE3 EQU 0CFH ; bit control mode
;
DATA EQU 0AH ; port B data
CMD EQU 0BH ; port B cmd
;
; mask values for clock chip
;
LATCH EQU 80H ; set address latch (active high)
WR EQU 40H ; write (active high)
RD EQU 20H ; read (active high)
HOLD EQU 10H ; time hold (active high)
;
CLKINIT:
MVI A,7 ; disable interrupts
OUT CMD
;
; fall into set output
;
; set output mode
;
SETOUT:
LDA FLAG ; get current state
OUT DATA ; preset data register
MVI A,MODE3 ; set bit control mode
OUT CMD
XRA A ; set all outputs mask
OUT CMD
LDA FLAG
OUT DATA
RET
;
; set input mode
;
SETIN:
LDA FLAG ; get current state
ORI RD ; set read line
OUT DATA
MVI A,MODE3
OUT CMD
MVI A,0FH ; d7-d4 are still output, mask em'
OUT CMD
LDA FLAG
ORI RD
OUT DATA
XCHG ! XCHG ; delay for 6 uS min.
RET
;
; send data in A to address in C
;
WRPIO:
MOV B,A ; save data in B
CALL WRADDR ; set address
MOV A,B ; fall into write data
;
; write data in A
;
WRDATA:
MOV C,A ; save in C
LDA FLAG ; get current flag
ORA C ; or in data
OUT DATA
ORI WR ; and write it
OUT DATA
NOP ; delay for 1 uS min
NOP
ANI (NOT WR) AND 0FFH ; reset write
OUT DATA
RET
;
; read data into A from address in C
;
RDPIO:
PUSH B
CALL WRADDR ; set address
;
; fall into read data
;
; read data into A
;
RDDATA:
CALL SETIN ; set input mode
IN DATA ; input data
ANI 0FH ; just in case
MOV C,A ; save in C
CALL SETOUT ; set to output mode
MOV A,C ; get saved data
POP B ; restore BC
RET
;
; latch address in C
;
WRADDR:
LDA FLAG ; get current flag
ORA C ; or in address
OUT DATA ; send address
ORI LATCH ; set latch
OUT DATA ; and latch it
ANI (NOT LATCH) AND 0FFH
OUT DATA
RET
;
HOLDON:
MVI A,HOLD ; set hold flag
STA FLAG
CALL WRDATA
HOLD0:
MVI B,20 ; wait 150 uS
HOLD1:
XCHG ! XCHG
DCR B
JNZ HOLD1
RET
;
HOLDOFF:
XRA A ; reset hold flag
STA FLAG
JMP WRDATA
;
FLAG: DB 0 ; current hold/nohold status flag
;
;**********************************************************************
;
; This is the end of the CLOCK routine overlay for MBYE-31. If you
; include this after your modem overlay, and have a Kaypro 2 equipped
; with a Pro-Clock, it SHOULD work fine...
;
;**********************************************************************
;