;*********************************************************************** ; ; 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. ; ;********************************************************************** ;