;**********************************************************************
;
;			MBYE (Modular 'BYE')
;	    	 Novation Apple-Cat modem routines
;		   v1.0 (02/07/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.
;
; This version is for the Apple ][ running with an Apple-Cat modem card.
; (much thanks to Dave Roznar for the original ACAT code)
;
; For the Apple, you should set BYELOW to YES.
;
;-----------------------------------------------------------------------
;
; 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/04/83  Updated for ByeII version 1.6		- Paul Traina
; 10/04/82  Routines added, no fuss, mess, or frills.	- Paul Traina
;
;-----------------------------------------------------------------------
;
; The following define the slot address to use.
;
SLOT:	EQU	2		;Apple-Cat residing in Slot #2
;
;***********************************************************************
;
;
; Apple-Cat modem address equates
;
SLOTVAL:EQU	SLOT*16		;number to add for proper slot
;
MCSTATP:EQU	0E080H+SLOTVAL	;Carrier status
LNCTL:	EQU	0E081H+SLOTVAL	;Line control
PHCTL:	EQU	0E082H+SLOTVAL	;Phone control
BSRINT:	EQU	0E083H+SLOTVAL	;BSR and interrupts
RCVCTL:EQU	0E089H+SLOTVAL	;Receiver control
MDPORT:	EQU	0E08AH+SLOTVAL	;Mode (parity/stop bits) port
BAUDPT:	EQU	0E08BH+SLOTVAL	;Baud rate port
XRINT:	EQU	0E08CH+SLOTVAL	;Transmitt/Receive interrupts
TRXCTL:	EQU	0E08DH+SLOTVAL	;Transmitter control
MODSEL:	EQU	0E08FH+SLOTVAL	;Modem select port
;
RSPORT:	EQU	0E08FH+SLOTVAL	;Receive status port
RDPORT:	EQU	0E08BH+SLOTVAL	;Receive data port
TSPORT;	EQU	0E08FH+SLOTVAL	;Transmit status port
TDPORT:	EQU	0E08EH+SLOTVAL	;Transmit data port
;
; Values to poke into ports
;
MAINM:	EQU	0		;Select main modem
HANG:	EQU	0		;Hang up phone
RDET:	EQU	1		;Ring detect
SQLT:	EQU	1		;Squeltch cat
ANSW:	EQU	2		;Answer phone
NOXRINT:EQU	5		;No transmitt/recv interrupts
NOINT:	EQU	6		;No BSR interrupts
DAV:	EQU	8		;Data available
TBMT:	EQU	10H		;Transmit buffer empty
XMT103:	EQU	10H		;Transmitter 103 mode (also clears RX)
XMITOFF:EQU	1FH		;Turn of transmitter
CTS:	EQU	20H		;Carrier detect
ANS103:	EQU	64H		;Receiver 103 mode
CATERR:	EQU	0C0H		;Framing/Overrun errors
B110:	EQU     55H		;Select 110 bps
B300:	EQU     22H		;Select 300 bps
B8NO1:	EQU     03H		;8 data bits, no parity, 1 stop bit
B8NO2:	EQU     0BH		;8 data bits, no parity, 2 stop bits
;
;
;***********************************************************************
;
; 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, hang up the
; phone, and get it ready to wait for a ring.
;
MDINIT:	MVI	A,XMITOFF	;Turn off transmitter
	STA	TRXCTL
	MVI	A,HANG		;Hang up phone
	STA	PHCTL
	RET
;
; The following is a routine to determine if there is a character wait-
; ing to be received.  If none are there, the Zero flag will be set,
; otherwise, 255 will be returned in register A.  Remember that the sys-
; tem will like you a little more if you also mask out framing, parity,
; and overrun errors.
;
MDINST:	LDA	RSPORT		;Get modem status
	ANI	DAV		;Data available?
	RZ			;nope
	ORI	0FFH		;return true
	RET
;
; 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:LDA	TSPORT		;Get modem status
	ANI	TBMT		;mask out junk
	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:LDA	MCSTATP		;Get carrier status
	ANI	CTS		;got a carrier?
	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:	LDA	TRXCTL		;get ring status
	ANI	RDET		;ringing?
	RET
;
; 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:	MVI	A,XMT103	;Clear receiver
	STA	TRXCTL
	LDA	RDPORT		;Read 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:	STA	TDPORT		;send character
	RET
;
; The following routine will make the modem answer the phone.
;
MDANSW:	MVI	A,ANSW		;Answer phone
	STA	PHCTL
	MVI	A,SQLT		;Squelch Cat
	STA	LNCTL
	MVI	A,NOINT		;Disable BSR and interupts
	STA	BSRINT
	MVI	A,ANS103	;Set receiver to 103, answer mode
	STA	RCVCTL
;
	CALL	SET300		;300 baud
	MVI	A,NOXRINT	;No XMIT/RCV interrupts
	STA	XRINT
	MVI	A,XMT103	;Transmitter 103, answer mode
	STA	TRXCTL
	MVI	A,MAINM		;Select main modem
	STA	MODSEL
	RET
;
; These next routines set the proper baud rates for the modem.  If you
; do not support the particular rate, then simply put in a JMP to SETINV.
; If the baud rate change was successful, make SURE the Zero flag is set.
;
; 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: 			;110 bps too slow to support
SET450:				;450 bps not supported
SET600:				;600 bps not supported
SET710:				;710 bps not supported
SET1200:	
;
SETINV:	ORI	0FFH		;make sure the Zero flag isn't set
	RET
;
; Set speed to 110 baud
;
SET110:	CALL	MDINP		;Clear out garbage since the modem was
	CALL	MDINP		;Set to 300 baud upon answer
	MVI	A,B110		;Set 110 baud
	STA	BAUDPT
	MVI	A,B8NO2		;Set 8 data bits, no parity, 2 stop bits
	STA	MDPORT
	XRA	A		;Force zero flag
	RET
;
; Set up for 300 bps
;
SET300:	CALL	MDINP
	CALL	MDINP
	MVI	A,B300		;Set 300 baud
	STA	BAUDPT
	MVI	A,B8NO1		;Set 8 data bits, no parity, 1 stop bit
	STA	MDPORT
	XRA	A
	RET
;
; 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.
;
;***********************************************************************
;
