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
/
MB8250-1.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
7KB
|
251 lines
;***********************************************************************
;
; MBYE (Modular 'BYE')
; 8250 UART routines
; v1.0 (02/07/84) by Kim Levitt
;
; This is adapted from the WD8250 routines in BYE3.
;
; 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 Western Digital 8250 chip that is hooked up to
; an external modem. If your modem cannot detect a ring, then set
; NORING true.
;
;=======================================================================
;
; 02/07/84 Altered and renamed to work with MBYE - Kim Levitt
; 11/27/83 Altered and renamed to work with BYE3 - Irv Hoff
; 08/04/83 Added MDQUIT routine - Paul Traina
; 07/18/83 Fixed several bugs that I put in - Paul Traina
; 10/04/82 Initial re-write of old 8250 routines - Paul Traina
;
;=======================================================================
;
; The following define the port address to use.
;
BASEP: EQU 0D8H ;Base port modem port
DATPORT:EQU BASEP ;Data port
LPORT: EQU BASEP+3 ;Line control
CPORT: EQU BASEP+4 ;Modem control
SPORT: EQU BASEP+5 ;Line status port
MSPORT: EQU BASEP+6 ;Modem status port
RPORT: EQU BASEP+6 ;Ring indicator port
;
; Line status bits
;
DAV: EQU 00000001B ;Data available
ORUN: EQU 00000010B ;Overrun error
PERR: EQU 00000100B ;Parity error
FERR: EQU 00001000B ;Framing error
ERR: EQU ORUN+PERR+FERR ;Error bits
TBMT: EQU 00100000B ;Transmitt buffer empty
;
; Modem status bits
;
DSR: EQU 00100000B ;Data set ready
RDET: EQU 01000000B ;Ring detect
DCD: EQU 10000000B ;Carrier detect
;
; Baud rate divisors
;
BR300LS: EQU 080H ;300 baud
BR300MS: EQU 001H
BR450LS: EQU 000H ;450 baud
BR450MS: EQU 001H
BR600LS: EQU 0C0H ;600 baud
BR600MS: EQU 000H
BR120LS: EQU 060H ;1200 baud
BR120MS: EQU 000H
;
; Modem control bits
;
DTR: EQU 00000001B ;Data terminal ready
RTS: EQU 00000010B ;Request to send
OUT1: EQU 00000100B ;Aux output #1
OUT2: EQU 00001000B ;Aux output #2
;
; Line control bits
;
WLS0: EQU 00000001B ;Word length select 0
WLS1: EQU 00000010B ;Word length select 1
STB: EQU 00000100B ;Stop bit select
PEN: EQU 00001000B ;Parity enable
PES: EQU 00010000B ;Even parity select
SPS: EQU 00100000B
BRKS: EQU 01000000B ;Break
DLAB: EQU 10000000B
;
;
;***********************************************************************
;
; 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)
;
MDINIT:
XRA A ;Shut off DTR & RTS
OUT CPORT ;..which turns off modem.
RET
;
; The following routine will make the modem answer the phone.
;
MDANSW:
MVI A,DTR+RTS ;Turn on DTR and let modem answer phone
OUT CPORT
CALL SET300 ;Set 300 baud (for init only)
MVI A,WLS0+WLS1 ;8 data bits, 1 stop bit, no parity
OUT LPORT
RET
;
; The following is a routine to determine if there is a character wait-
; ing to be received, if none, Zero flag will be set, otherwise, 0FFH
; will be returned in register A. Remember that the system will like
; you a little more if you also mask out framing, parity, and overrun
; errors.
;
MDINST:
PUSH B ;Save BC
IN SPORT ;Get status
MOV B,A ;Save it in B (status cleared by read)
ANI DAV ;Data available?
JZ NDAV ;Return if not ready
MOV A,B ;else, check error bits
ANI ERR ;for parity/overrun/framing errors
JZ DAVA ;if none, ok...
IN DPORT ;else clear garbage
;
NDAV:
XRA A ;say no data
POP B ;restore BC
RET ;and return
;
DAVA:
ORI 0FFH ;We have a character
POP B ;restore BC
RET ;and return
;
; The following is a routine to determine if the transmit buffer is
; empty. If it is empty, it will return with the Zero flag clear. If
; the transmitter is busy, then it will return with the Zero flag set.
;
MDOUTST:
IN SPORT
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 MSPORT ;Get modem status
ANI DCD ;Got a carrier?
RET
;
; The following routine will check to see if the phone is ringing, if it
; isn't, it will return with Zero set, otherwise Zero will be cleared.
;
MDRING:
IN RPORT ;Ringing?
ANI RDET ;1=yes, 0=no
RET
;
; 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 remove that routine
; and put the pointer in front of SETINV.
;
; If the baud rate change was successful, make SURE the Zero flag is set.
;
; The following routine returns a 255 because we were not able to set to
; the proper baud rate because either the serial port or the modem can't
; handle it.
;
SET110: ;110 baud is seldom used
SET600: ;600 bause is only for PMMI
SET710: ;710 baud is only for PMMI
;
SETINV:
ORI 0FFH
RET
;
; Set up for 300 baud
;
SET300:
PUSH D ;Set 300
MVI D,BR300MS
MVI E,BR300LS
JMP SETALL
;
; Set up for 450 baud
;
SET450:
PUSH D ;Set 450
MVI D,BR450MS
MVI E,BR450LS
JMP SETALL
;
; Set up for 1200 baud
;
SET1200:
PUSH D ;Set 1200
MVI D,BR120MS
MVI E,BR120LS
;
SETALL:
CALL SETBAUD
POP D
XRA A
RET
;
; This routine takes the baud rate divisors passed in the DE register
; and sets the modem port accordingly.
;
SETBAUD:
MVI A,83H ;Set DLAB
OUT LPORT
MOV A,E ;Get LSB
OUT DATPORT
MOV A,D ;Get MSB
OUT DATPORT+1
MVI A,WLS0+WLS1 ;8 data bits, no parity, 1 stop bit
OUT LPORT
PUSH B
MVI B,2 ;wait about .2 seconds
CALL DELAY
POP B
IN DATPORT ;Clear out any inpuyt chars.
IN DATPORT
RET
;
; Ok, that's all of the modem dependant routines that MBYE uses, so if
; you patch this file into your copy of MBYE, then it should work out
; well.
;
;**********************************************************************
;