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