home *** CD-ROM | disk | FTP | other *** search
- ;
- ;***********************************************************************
- ;
- ; MBYE (Modular 'BYE')
- ; Zilog Z80-SIO/DART USART/UART routines
- ; v2.1 (02/21/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: set NORING EQU YES in the main MBYE program if you have an SIO
- ; chip. Normally, the SIO doesn't allow monitoring of the RI status.
- ; The DART, however, does have RI has a standard function. If you have
- ; a DART, set NORING EQU NO (unless you are using a Smartmodem). (Also
- ; set DART EQU YES below.)
- ;
- ; This version is for the Zilog SIO chip that is hooked up to an extern-
- ; al modem. A Z80-CTC or 8116 can be used as baud rate generator. If
- ; you have a KAYPRO, XEROX 820-II, or another "BigBoard"-based system,
- ; set the KAYPRO equate true and the rest is automatic.
- ;
- ;-----------------------------------------------------------------------
- ;
- ; 02/21/84 Removed exclaimation mark from comment - Kim Levitt oops!
- ; 02/20/84 Added comments for XEROX 820-II & BigBoards,
- ; code for DARTs and modified SIOs to read RI - Kim Levitt
- ; 02/02/84 Fixed and renamed to work with MBYE 3.0 - Kim Levitt
- ; (Also added conditional equates 8116, CTC and KAYPRO.)
- ; 11/27/83 Altered and renamed to work with BYE3 - Irv Hoff
- ; 08/04/83 Updated for use with ByeII version 1.6 - Paul Traina
- ; 07/19/83 Improved operation of modem initialization. - Paul Traina
- ; 04/18/83 Added option to use 300/1200 Smartmodem. - Don Brown
- ; 04/14/83 Added option for alt. CTC baud set format. - Paul Traina
- ; 02/21/83 Initial version. - Steve Fox
- ;
- ;-----------------------------------------------------------------------
- ;
- KAYPRO: EQU YES ;yes, if Kaypro, Xerox 820 or BigBoard
- ;
- IF KAYPRO
- CTC: EQU NO
- C8116: EQU YES ;BigBoards use the 8116 baud rate clock
- ENDIF
- ;
- IF NOT KAYPRO
- CTC: EQU YES
- C8116: EQU NO ;most other systems use CTC
- ENDIF
- ;
- ; Set base ports for SIO/DART & baud rate clock
- ;
- IF KAYPRO
- DART: EQU NO ;BigBoards use a true SIO
- BASEP: EQU 04H ;Base port for SIO
- BASEC: EQU 00H ;Base port for 8116
- ENDIF
- ;
- IF NOT KAYPRO
- DART: EQU NO ;Yes, if DART used and not SIO
- BASEP: EQU 20H ;Set Base port for SIO (data port)
- BASEC: EQU 32H ;Set Base port for CTC
- ENDIF
- ;
- ; The following define the port addresses to use.
- ;
- DPORT: EQU BASEP ;Data port
- SPORT: EQU BASEP+2 ;Status/Control port
- BPORT: EQU BASEC ;Baud rate port
- ;
- ;
- ; The following are SPORT commands (output these to SPORT)
- ;
- ; WR0:
- RESCHN: EQU 00011000B ;Reset channel
- RESSTA: EQU 00010000B ;Reset ext/status
- RESERR: EQU 00110000B ;Error reset
- ;
- WRREG1: EQU 00000000B ;WR1 - No interrupts
- WRREG3: EQU 11000001B ;WR3 - Rx 8 bits/char, Rx enable
- WRREG4: EQU 01000100B ;WR4 - 16x, 1 stop bit, no parity
- ;
- ; WR5:
- DTROFF: EQU 01101000B ;DTR off, Tx 8 bits, Tx enable, RTS off
- DTRON: EQU 11101010B ;DTR on, Tx 8 bits, Tx enable, RTS on
- ;
- ;
- ; The following are SPORT status masks
- ;
- ; RR0:
- DAV: EQU 00000001B ;Data available
- TBMT: EQU 00000100B ;Transmit buffer empty
- DCD: EQU 00001000B ;Data carrier detect
- RI: EQU 00010000B ;Ring Indicator (DARTs only)
- ;
- ;(Normally, only DARTs can detect Ring Indicator...... HOWEVER,
- ; with special wiring to SYNC pin, SIOs can detect RI on this bit
- ; in asynchronous receive mode, wheras it is normally used only
- ; in synchronous mode. If you have this hardware mod done, your
- ; SIO will in effect function as a DART and this "SYNC/HUNT" bit
- ; in read reg. 0 will function as a RI status bit.) (Connect
- ; SYNCA pin 11 of SIO to pin 22 of RS-232C connector, not sure if
- ; any intermediate circut is necessary, though, so DON'T TRY IT
- ; UNLESS YOU KNOW WHAT YOU'RE DOING and really NEED ring detect,
- ; also realize you will lose synchronous capabilities...)
- ;
- ; RR1:
- OE: EQU 00100000B ;Overrun error
- FE: EQU 01000000B ;Framing error
- ERR: EQU OE+FE ;Overrun and framing errors
- ;
- IF CTC
- ;
- ; First Byte of CTC Command:
- ;
- BDCMD1: EQU 07H ;110 baud (timer mode)
- BDCMD2: EQU 47H ;300, 600 & 1200 baud (counter mode)
- ;
- ;
- ; The following are baud rates for BPORT -- they may have to be changed
- ; for your particular system's CTC.
- ;
- BD300: EQU 128 ;300 bps
- BD600: EQU 64 ;600 bps (not supported by Smartmodem)
- BD1200: EQU 32 ;1200 bps
- ;
- ENDIF ;CTC
- ;
- IF KAYPRO
- ;
- ; 8116 (on Kaypros at least) is initialized by system on cold boot,
- ; only need to set baud rate as single command to baud rate port.
- ;
- BD110: EQU 02H
- BD300: EQU 05H
- BD600: EQU 06H
- BD1200: EQU 07H
- BD2400: EQU 0AH ;2400 - 19.2 K baud values
- BD4800: EQU 0CH ;not currently supported, but could be
- BD9600: EQU 0EH ;used on a high speed link so are
- BD19K: EQU 0FH ;included for informational purposes
- ;
- ENDIF ;KAYPRO
- ;
- IF C8116 AND NOT KAYPRO
- ;
- BD110: EQU 02H
- BD300: EQU 05H ;you may have to change these if you're not
- BD600: EQU 06H ;on a Kaypro system
- BD1200: EQU 07H
- ;
- ENDIF
- ;
- ;***********************************************************************
- ;
- ; If any of your routines zap anything other than the Accumulator, then
- ; you must preserve all other registers.
- ;
- ;***********************************************************************
- ;
- ; This routine should turn off everything on the modem, hang it up, and
- ; get it ready to wait for a ring. (DTR off)
- ;
- MDINIT:
- MVI A,RESCHN ;Reset channel (DTR, RTS off)
- OUT SPORT
- MVI A,4 ;Setup to write register 4
- OUT SPORT
- MVI A,WRREG4 ;set 16x clock, 1 stop bit, no parity
- OUT SPORT
- MVI A,1 ;Setup to write register 1
- OUT SPORT
- MVI A,WRREG1 ;set no interrupts
- OUT SPORT
- MVI A,3 ;Setup to write register 3
- OUT SPORT
- MVI A,WRREG3 ;set Rx 8 bits, enable recv
- OUT SPORT
- MVI A,5 ;Setup to write register 5
- OUT SPORT
- MVI A,DTROFF ;leave DTR OFF initially
- OUT SPORT
- RET ;Return
- ;.....
- ;
- ; This routine will check the Ring Indicator status,
- ; returning a non-zero value if the RI line is active.
- ; (This routine is only valid for DARTs or modified SIOs,
- ; see notes above.)
- ;
- IF DART ;Only DARTs or modified SIOs can do this
- ;
- MDRING:
- IN SPORT
- ANI RI
- RET
- ;
- ENDIF ;DART
- ;.....
- ;
- ;
- ; The following routine will raise DTR. (and RTS)
- ;
- MDANSW:
- MVI A,5 ;address WR5
- OUT SPORT
- MVI A,DTRON ;raise DTR, RTS
- OUT SPORT
- RET ;Return
- ;
- ;
- ; The following routine checks to make sure we still have carrier. If
- ; there is no carrier, it will return with the Zero flag set.
- ;
- MDCARCK:
- MVI A,RESSTA ;Reset status
- OUT SPORT
- IN SPORT ;Get status
- ANI DCD ;Check for data carrier
- RET ;Return
- ;
- ;
- ; The following routine determines if there is a character waiting to
- ; be received. If no character is waiting, the Zero flag will be set,
- ; otherwise, 255 will be returned in register A. (Error conditions are
- ; checked, and, if present, the character is ignored.)
- ;
- MDINST:
- IN SPORT ;Get status
- ANI DAV ;Got a character?
- RZ ;Return if none
- MVI A,1 ;else, check error bits
- OUT SPORT ;(address RR1)
- IN SPORT ;read RR1
- ANI ERR ;mask error bits
- JZ MDINST1 ;no error, ok
- MVI A,RESERR ;else, reset error bits
- OUT SPORT
- IN DPORT ;clear out garbage
- XRA A ;say no data
- RET ;and return
- MDINST1:
- ORI 0FFH ;say we got one
- RET ;...and return
- ;.....
- ;
- ;
- ; 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 DPORT ;Get character
- ANI 7FH ;Strip parity
- RET ;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 ;Mask it
- RET ;Return
- ;.....
- ;
- ;
- ; 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 DPORT ;Send it
- RET ;Return
- ;.....
- ;
- ;
- ; These next routines set the proper baud rates for the modem. If you
- ; do not support the particular rate, then simply put the label in front
- ; of the ORI 0FFH / RET. If the baud rate change was successful, make
- ; SURE the Zero flag is set (XRA A).
- ;
- IF CTC
- ;
- SET300:
- MVI A,BDCMD1 ;Get first byte of command
- OUT BPORT ;send it
- MVI A,BD300 ;Load rate
- JMP SETBAUD
- ;
- SET1200:
- MVI A,BDCMD2 ;Get first byte of command
- OUT BPORT ;send it
- MVI A,BD1200 ;Load rate
- ;
- SETBAUD:
- OUT BPORT ;Send 2nd byte of command (rate)
- XRA A ;Say rate is OK
- RET ;Return
- ;
- ; 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:
- SET450:
- SET600:
- SET710:
- ORI 0FFH ;Make sure zero flag is not set
- RET ;Return
- ;
- ENDIF ;CTC
- ;.....
- ;
- ;
- IF C8116
- ;
- 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 8116/SIO
- ;
- SET450:
- SET710:
- ORI 0FFH ;say rate ng
- RET
- ;
- ENDIF ;C8116
- ;.....
- ;
- ; 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. (Be sure to set the SMODEM and SM1200 equates in the main program
- ; section to indicate if you are using a Hayes Smartmodem or compatible
- ; or not.)
- ;
- ;***********************************************************************
- ;