home *** CD-ROM | disk | FTP | other *** search
- ;***********************************************************************
- ;
- ; 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.
- ;
- ;**********************************************************************
- ;