;***********************************************************************
;
;
;
;                     MBYE (Modular 'BYE')
;              Otrona Attache Specialized Routines
;               v1.1 (04/08/84) by Donald Larson
;                      Modified from.....
;
;			 MBYE (Modular 'BYE')
;		Zilog Z80-SIO/DART USART/UART routines
;		    v2.1 (02/21/84) by Kim Levitt
;
;
;
;----------------------------------------------------------------------
;
; This particular version was skeletonized and reworked for the Otrona
; Attache.  The program will utilize escape codes to the display driver
; instead of direct hardware sets to prevent difficulties with Valet.
; Also note that this will require a rework on the Otrona standard modem
; ("Communications") cable.  The pin for CTS must be moved to pin 8
; from pin 5 on the DB-25 (25 pin) connector.  This will allow the
; BYE to monitor the DSR (data set ready) lead (which tracks with
; carrier detect).  Therefore the correct cable would be:
;
;         Attache'                                   Modem
;          15 pin                                    25 pin
;
;            1 --------- Protective Ground ----------- 1
;            2 --------- Transmitted Data ------------ 2
;            4 --------- Received Data --------------- 3
; NOTE ===>  5 --------- Clear to Send --------------- 8
;            8 --------- Signal Ground --------------- 7 <---+-+
;            9 --------- Data Terminal Ready --------- 20    | |
;           10 --------- Request to Send ------------- 4     | |
;           11 --------- Received Data Return ---------------+ |
;           12 --------- Clear to Send Return -----------------+
;
; NOTE: this is where you change the standard lead from pin 5 in the
; standard cable to pin 8 as shown.
;
; This version was tested with a Hayes Smartmodem 1200 and an 8:16
; using CP/M 2.2.5.  If there are any bugs, please call by voice
; days at (312) 867-6400 X 451.
;
; I have still been unable to use the Attache's (R)eal (T)ime
; (C)lock for forced logoff, etc.  I'd like to talk to anyone 
; coming up with a method of doing so.  Please give me a call.
;
;                                 - Donald Larson
;
;-----------------------------------------------------------------------
;
; 04/08/84  Editted, skeletonized  and reformatted for
;           specific use with the Otrona Attache. Used
;           with MBYE v 3.2.                            - Donald Larson
; 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
;
;-----------------------------------------------------------------------
;
BASEP:	EQU	0F0H		;Set Base port for SIO (data port)
;
; The following define the port addresses to use.
;
DPORT:	EQU	BASEP		;Data port
SPORT:	EQU	BASEP+1		;Status/Control 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
;
DAV:	EQU	00000001B	;Data available
TBMT:	EQU	00000100B	;Transmit buffer empty
DCD:	EQU	00100000B	;Data carrier detect (using modifed cts)
OE:	EQU	00100000B	;Overrun error
FE:	EQU	01000000B	;Framing error
ERR:	EQU	OE+FE		;Overrun and framing errors
;
; 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
;.....
;
;
; 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).
;
;
SET110:
	MVI	A,01		;Send code for 110 baud
	JMP	SETBAUD
;
SET300:
	MVI	A,04		;Send code for 300 baud
	JMP	SETBAUD
;
SET600:
	MVI	A,05		;Send code for 600 baud
	JMP	SETBAUD
;
SET1200:
	MVI	A,06		;Send code for 1200 baud
	JMP	SETBAUD
;
SET2400:
	MVI	A,07		;Send code for 2400 baud
	JMP	SETBAUD
;
SET4800:
	MVI	A,08		;Send code for 4800 baud
	JMP	SETBAUD
;
SET9600:
	MVI	A,09		;Send code for 9600 baud
	JMP	SETBAUD
;
SET19200:
	MVI	A,0AH		;Send code for 19,200 baud
;	
SETBAUD:
	PUSH	PSW		;Preserve baud code (just in case)
	MVI	E,ESC		;First, send escape
	CALL 	SCONOUT
	MVI	E,'@'		;Next set for write to CMOS ram
	CALL	SCONOUT
	MVI	E,8		;Communications address
	CALL 	SCONOUT
	POP	PSW		;Get back baud code
	PUSH	PSW		;Again, just in case
	MOV	E,A
	CALL	SCONOUT		;Write it
	MVI	E,ESC		;Send escape (again)
	CALL 	SCONOUT
	MVI	E,'<'		;Tell machine to reset to CMOS speed
	CALL	SCONOUT
	POP	PSW
	XRA	A	
	RET			;Return
;
;.....
;
; This routine uses a BDOS call for direct console I/O.
;
SCONOUT:
	MVI	C,6		;BDOS direct console i/o function
	CALL	BDOS
	RET
;
;....
;
; The following routine returns a 255 because we were not able to set to
; the proper baud rate because the serial port can't handle it.
;
SET450:
SET710:
	ORI	0FFH		;Make sure zero flag is not set
	RET			;Return
;
;.....
;
; Ok, that's all of the modem dependent routines that MBYE uses, so if
; you patch this file into your copy of MBYE, (using Wordstar's ^KR
; function) 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.)
;
;***********************************************************************
