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
/
MB8251-2.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
8KB
|
273 lines
;***********************************************************************
;
; MBYE (Modular BYE)
; 8251A USART routines
; Version 2.0 - by Kim Levitt - 02/20/84
;
; This version is for a 8251A I/O with CTC timer to set speed,
; or for a Morrow Micro Decision using the 8251A baud rate multiplier
; to change baud rates. (Set your printer port baud rate switches to
; 1200 baud and connect your modem to this port.)
;
; These routines will allow the easy patching of MBYE for any
; type of modem/serial port combination. Certain routines must return
; status flags, so please be careful to set the flags as directed.
;
; This version is for the Intel 8251A chip that is hooked up to an ex-
; ternal modem. Since the 8251A cannot detect rings (RI), set NORING EQU
; YES in the main program. Also, since the 8251A cannot detect carrier,
; you should wire pin 8 (DCD) from your modem to pin 6 (DSR) on your
; port, which the 8251 reads to determine if carrier is present.
;
;=======================================================================
;
; 02/20/84 Added equates and code for MicroDecisions - Kim Levitt
; 02/07/84 Fixed and renamed to work with MBYE - Kim Levitt
; 11/27/83 Altered and renamed to work with BYE3 - Irv Hoff
; 10/04/83 Modified for use with 8251A I/O with
; CTC timer to set speed. - Irv Hoff
; 10/04/82 Routines added, no fuss, mess, or frills. - Paul Traina
;
;=======================================================================
;
; Set this equate to YES if you are running on a Morrow MicroDecision
;
MICROD: EQU YES ;Yes, if Morrow MicroDecision
;
IF MICROD
BASEP: EQU 0FEH ;MicroDecision base port address
ENDIF
;
IF NOT MICROD
BASEP: EQU 28H ;Set to your modem's UART base port
RCVPORT:EQU 20H ;Set to recv speed CTC port
XMTPORT:EQU 1AH ;Set to xmit speed CTC port
ENDIF
;
; The following define the port address to use.
;
DATPORT:EQU BASEP ;Data port
STPORT: EQU BASEP+1 ;Status/Control port
;
; The following are STPORT commands (output these to STPORT)
;
MODINS: EQU 01001110B ;8 bits, no parity, 1 stop bit, 16x
OFFINS: EQU 00010000B ;drop DTR and disable RCV/XMT
ONINS: EQU 00010111B ;reset flags, send DTR, enable rx & tx
RSTINS: EQU 01000010B ;reset USART and send DTR
;
; The following are STPORT status masks
;
DAV: EQU 00000010B ;data available
TBMT: EQU 00000001B ;transmit buffer empty
DSR: EQU 10000000B ;data set ready (no DCD avail)
FE: EQU 00100000B ;framing error
OE: EQU 00010000B ;overrun error
ERR: EQU OE+FE ;overrun and framing error
;
IF NOT MICROD
;
; The following are CTC timer baud rates divisors.
;
BD300: EQU 32 ;9600/300 = 300 bps
BD450: EQU 21 ;9600/450 = 450 bps
BD1200: EQU 8 ;9600/1200 = 1200 bps
;
ENDIF
;
;=======================================================================
;
; If any of your routines zaps anything other than the Accumulator, then
; you must preserve all other registers.
;
;=======================================================================
;
; This routine should turn off everything on the modem, and get it ready
; to wait for a ring. (Also hang it up) (lowers DTR)
;
MDINIT:
MVI A,RSTINS ;reset UART
OUT STPORT
CALL UDELAY
;
IF NOT MICROD
MVI A,MODINS ;x16 clk, 1 stop bit, etc.
ENDIF
;
IF MICROD AND SPDBYTE
LDA MSPEED ;if multi speed, check speed byte
CPI 5 ;if not 1200 baud now, set to 300
JNZ INIT300
MVI A,MODINS ;else set to 1200
JMP INITSET
ENDIF
;
IF MICROD
INIT300:
MVI A,MODINS+1 ;x64 clk for 300 initially
ENDIF
;
INITSET:
OUT STPORT
CALL UDELAY
MVI A,OFFINS ;Clear DTR
OUT STPORT ;causing hangup
RET ;return
;
; The following routine will make the modem answer the phone. (raise DTR)
;
MDANSW:
MVI A,ONINS ;turn on DTR, etc.
OUT STPORT
RET ;return
;
; The following is a routine to determine if there is a character wait-
; ing to be received, if none, the Zero flag will be set, otherwise it
; returns with FF in register A. Remember that the system will like you
; a little more if you also mask out framing, parity, and overrun errors.
;
MDINST:
IN STPORT ;get status
ANI DAV ;got a character?
RZ ;return if none
IN STPORT ;get status again
ANI ERR ;check for framing and overrun
JZ MDINST1 ;no errors
MVI A,ONINS ;reset error flags
OUT STPORT
XRA A ;return false
RET
;
MDINST1:
ORI 0FFH ;We have a character
RET
;
; The following is a routine to determine if the transmit buffer is
; empty. If it is, it will return with the Zero flag clear. If the
; transmitter is busy, then it will return with the Zero flag set.
;
MDOUTST:
IN STPORT
ANI TBMT
RET
;
; The following is a routine that will check to make sure we still have
; carrier. If there is no carrier, it will return with the Zero flag
; set.
;
MDCARCK:
IN STPORT ;get status
ANI DSR ;check if Data Set Ready is on (no DCD)
RET ;(wire modem pin 8 to port pin 6 for carrier read)
;
; The following is a routine that will input one character from the
; modem port. If there is nothing there, it will return garbage...
; so use the MDINST routine first.
;
MDINP:
IN DATPORT ;get character
ANI 7FH ;strip parity and other garbage
RET
;
; The following is a routine that will output one character in register
; A to the modem. REMEMBER, that is register A, not register C.
;
; ** Use MDOUTST first to see if buffer is empty **
;
MDOUTP:
OUT DATPORT ;send it
RET
;
; These next routines set the proper baud rates for the modem. If you
; do not support the particular rate, then simply set the appropriate
; S110 - S1200 equates in the main program. If the baud rate change
; is successful, make SURE the Zero flag is set.
;
IF NOT MICROD ;if non-MicroDecision (CTC)
;
; Set up for 300 bps
;
SET300:
MVI B,BD300 ;load 300 bps
JMP SETSPD
;
; Set up for 450 bps
;
SET450:
MVI B,BD450 ;load 450 bps
JMP SETSPD
;
; Set up for 1200 bps
;
SET1200:
MVI B,BD1200 ;poke in 1200 bps
;
SETSPD:
MVI A,47H
OUT RCVPORT
OUT XMTPORT
MOV A,B ;get the speed value back
OUT RCVPORT
OUT XMTPORT
XRA A ;say it is ok
RET
;
ENDIF ;NOT MICROD
;
IF MICROD
;
; On MicroDecisions, there is no software controllable baud rate chip,
; (at least not on the MD1 and MD2, anyway), so only two baud rates
; can be selected, either 300 or 1200 baud, by using the baud rate
; factor variable of the 8251A to change baud rates instead of an
; external baud rate chip. Be sure to set up your dip switches so that
; 1200 is the baud rate for your printer port and attach your modem
; there. Set the switches to 1200 even if it is a 300 only modem, as
; the software will switch to 300 only if switches are set up right.
;
;
SET300:
MVI B,MODINS+1 ;x64 clk for 300 baud
JMP SETBAUD ;change baud rate
;
SET1200:
MVI B,MODINS ;x16 clk for 1200 baud
SETBAUD:
MVI A,RSTINS ;return to mode instruction reg
OUT STPORT
CALL UDELAY
MOV A,B ;get clk multiplier
OUT STPORT
JMP UDELAY ;pause and return
;
SET450:
;
ENDIF ;MICROD
;
; The following routines returns a 255 because we were not able to set to
; the proper baud rate because the serial port can't handle it.
; (Use S110-S1200 equates and SINGLE equate to select from valid baud
; rates you wish to support. (in main pgm))
;
SET110:
SET600:
SET710:
;
SETINV:
MVI A,0FFH
ORA A ;make sure the Zero flag isn't set
RET
;
; 8251 specific USART delay
;
UDELAY:
NOP
NOP
NOP
RET
;
; Ok, that's all of the modem dependent routines that MBYE uses, so if
; you patch this file into your copy of MBYE, it should work out well.
;
;***********************************************************************
;