home *** CD-ROM | disk | FTP | other *** search
- ;***********************************************************************
- ;
- ; MBYE (Modular 'BYE')
- ; TRS-80 Model III UART I/O routines
- ; v2.0 (02/19/84) by Kim Levitt
- ;
- ; 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.
- ;
- ; NOTE: The TRS-80 Model III uses the Western Digital TR1602 UART along
- ; with some additional circuts and latches used to interface it to the
- ; RS-232C port. The modem status port addresses a set of latches which
- ; are apparently reset when any data is output to this port, at which
- ; point a master reset also occurs on the UART, causing DTR to go off,
- ; the recv/xmit holding registers to be cleared, etc. There is no way
- ; I know of to reset the modem status latches WITHOUT ALSO resetting the
- ; UART, and the latches do not reset automatically when the line they
- ; are monitoring goes off. This means the carrier can be detected going
- ; ON after a disconnect, (during which a UART reset is done), but it
- ; CANNOT DETECT CARRIER LOSS DURING MODEM I/O (because the UART cannot
- ; be repeatedly reset during I/O to reset those blasted modem status
- ; latches...) WHAT THIS MEANS IS: You MUST set TIMEOUT EQU YES, other-
- ; wise, if someone hangs up without saying BYE, the system will never
- ; reset for a new caller... (With the timeout set, it will recover after
- ; the timeout, which could be several minutes, so set the timeout for
- ; 2 or 3 minutes maximum...)
- ;
- ;-----------------------------------------------------------------------
- ;
- ; 02/17/84 Fixed some glaring bugs/deficiencies, added
- ; important note re: TRS modem status latches - Kim Levitt
- ; 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/08/83 Routines added, no fuss, mess, or frills. - Paul Traina
- ;
- ;-----------------------------------------------------------------------
- ;
- ; Port addresses:
- ;
- MSPORT: EQU 0E8H ;modem status/uart reset port
- BPORT: EQU 0E9H ;baud rate port
- SPORT: EQU 0EAH ;uart status port
- CPORT: EQU 0EAH ;uart control port
- DPORT: EQU 0EBH ;data I/O port
- ;
- ; MSPORT modem status port masks:
- ;
- RI: EQU 00010000b ;ring indicator
- DCD: EQU 00100000b ;data carrier detect
- DSR: EQU 01000000b ;data set ready
- CTS: EQU 10000000b ;clear to send
- ;
- ; MSPORT command:
- ;
- RESET: EQU 00000010b ;UART/modem status reset cmd
- ;
- ; SPORT status port masks:
- ;
- TBMT: EQU 01000000b ;xmit buffer empty
- DAV: EQU 10000000b ;data available
- ;
- PE: EQU 00001000b ;parity error
- FE: EQU 00010000b ;framing error
- OE: EQU 00100000b ;overrun error
- ERR: EQU PE+FE+OE ;error bits
- ;
- ; CPORT control port commands:
- ;
- CBASE: EQU 01101100b ;everything on, 8 no 1, no dtr or rts
- DTR: EQU 00000010b ;data terminal ready
- RTS: EQU 00000001b ;request to send
- ;
- ; BPORT Baud rate values:
- ;
- BD110: EQU 22H ;110 baud
- BD300: EQU 55H ;300 baud
- BD600: EQU 66H ;600 baud
- BD1200: EQU 77H ;1200 baud
- ;
- ;***********************************************************************
- ;
- ; 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, but set baud-
- ; rate to 300 bps, and get it ready to wait for a ring. (Also hang it
- ; up)
- ;
- MDINIT:
- MVI A,RESET ;reset uart, enable modem control
- OUT MSPORT
- MVI A,CBASE ;Xmit on, Recv on, DTR off, RTS off
- OUT CPORT
- RET
- ;
- ; The following is a routine to determine if there is a character wait-
- ; ing to be received. If there are none, the 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, par-
- ; ity, and overrun errors.
- ;
- MDINST:
- IN SPORT ;Get status
- ANI DAV ;Got a character?
- RZ ;return now if none
- ORI 0FFH ;else say we got one
- RET ;...and return
- ;
- ; The following is a routine to determine if the transmit buffer is em-
- ; pty. If empty, it will return with the Zero flag clear. If not, it
- ; will return with the Zero flag set.
- ;
- MDOUTST:
- IN SPORT ;read port
- ANI TBMT ;mask crap
- RET
- ;
- ; The following is a routine that will check to make sure we still have
- ; carrier. If no carrier, it will return with the Zero flag set.
- ; (Actually, on the TRS-80 Model III, it will only detect carrier coming
- ; on in the initial wait for carrier routine, thereafter it will always
- ; return NZ until MDINIT or MDRING is called to reset the modem status
- ; latches.) (See lengthy note at beginning of program.)
- ;
- MDCARCK:
- IN MSPORT ;read modem status port
- ANI DCD ;mask carrier detect
- 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:
- MVI A,RESET ;reset modem status latches
- OUT MSPORT ;to get current status
- NOP ! NOP ! NOP ! NOP ;pause (allow latch to set)
- IN MSPORT ;read modem status port
- ANI RI ;check if RI on..
- RET
- ;
- ; The following is a routine that will input one character from the mo-
- ; dem port. If there is nothing there, it will return garbage... so use
- ; the MDINST routine first.
- ;
- MDINP:
- IN DPORT ;get character
- ANI 7FH ;strip parity and other garbage
- RET
- ;
- ; The following is a routine that will output one character in reg. 'A'
- ; to the modem. REMEMBER, that is reg. 'A', not reg. 'C'.
- ;
- ; ** Use MDOUTST first to see if buffer is empty **
- ;
- MDOUTP:
- OUT DPORT ;send it
- RET
- ;
- ; The following routine will make the modem answer the phone.
- ; (Raises DTR and RTS.)
- ;
- MDANSW:
- MVI A,CBASE+DTR+RTS ;turn on DTR and RTS which will allow
- OUT CPORT ;..the modem to answer on next ring
- 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
- ; equates in the main program.
- ;
- SET110:
- MVI A,BD110
- JMP SETBAUD
- ;
- SET300:
- MVI A,BD300
- JMP SETBAUD
- ;
- SET600:
- MVI A,BD600
- JMP SETBAUD
- ;
- SET1200:
- MVI A,BD1200
- ;
- SETBAUD:
- OUT BPORT ;set baud rate
- XRA A ;say rate ok
- RET ;and return
- ;
- ; The following rates, (450 & 710), are not supported for the Model III
- ;
- SET450:
- SET710:
- ORI 0FFH ;say rate ng
- RET ;and return
- ;
- ;**********************************************************************
- ;
- ; Ok, that's all of the modem dependent routines that MBYE uses, so if
- ; you patch this file into your copy of MBYE, then it should work out
- ; well.
- ;
- ;**********************************************************************
- ;