;*****************************************************************
;
;			MBYE (Modular 'BYE')
;	      D. C. Hayes MicroModem ][ modem I/O 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 a MicroModem ][ card.
; It seems to work on those Apples that even APBYE barfed on.  The prob-
; lem was in the Carrier Detect routine, because the Microsoft Z80 card
; screws up on a double strobe type of I/O that they tried to use.  Any-
; way, that means the Answer Phone routine is a crock,  but the thing
; works...
;
; 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 use with ByeII version 1.6	- Paul Traina
; 04/16/83  General code cleanup and optimization.	- Paul Traina
; 03/09/83  Fixed a missing '$+OFFSET' in MDANSW
;	    routine, also improved the "flip" logic
;	    needed for checking carrier and ring.	- Paul Traina
; 10/04/82  Routines added, no fuss, mess, or frills.	- Paul Traina
;
;-----------------------------------------------------------------------
;
; The following define the slot address to use.
;
BASE:	EQU	0E0A6H		;This is the status port location
;				;for slot #2
;
;***********************************************************************
;
; MMII Modem address equates
;
SPORT:	EQU	BASE		;Control/status port
DPORT:	EQU	BASE+1		;Data port
RPORT:	EQU	BASE-1		;Baud rate/modem status port
CPORT:	EQU	BASE-1		;Modem control port
;
; Switch hook and modem commands, output to SPORT
;
BYE:	EQU	0		;on hook or dial-break
ORIG:	EQU	8EH		;off hook originate
ANSW:	EQU	8AH		;off hook answer
TSB:	EQU	8		;2 stop bits
NORM:	EQU	15H		;8 bits, no parity, 1 stop bit
F110:	EQU	11H		;same w/2 stop bits
;
; Modem status input
;
RDET:	EQU	80H		;ring detect
CTS:	EQU	4		;carrier detect
TBMT:	EQU	2		;xmit buffer empty
DAV:	EQU	1		;data available
; 
; Baud rate divisors
;
B110:	EQU	0		;110 bps
B300:	EQU	1		;300 bps
;
;
;***********************************************************************
;
; 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:	XRA	A
	STA	CPORT		;Hang up phone
	STA	SPORT		;Turn of Xmit/Recv
	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
; system will like you a little more if you also mask out framing,
; parity, and overrun errors.
;
MDINST:	LDA	SPORT		;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	SPORT		;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	RPORT		;The Z80 interface likes this dummy load...
	LDA	SPORT		;Get modem status
	CMA			;flip/flop the Zero flag
	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	RPORT		;get ring port status
	CMA			;flip/flop the proper bit
	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:	LDA	DPORT		;get 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	DPORT		;send character
	RET
;
; The following routine will make the modem answer the phone.  It should
; set baudrate to 300 baud.
;
MDANSW:	MVI	A,ANSW		;Answer phone
	STA	CPORT
	PUSH	D		;save register pair DE
	MVI	E,20		;Wait for modem to turn on
;
ALOP1:	CALL	DELAY
	DCR	E
	JNZ	ALOP1
	POP	D		;restore registers
	CALL	SET300
	PUSH	B		;here is the crock I was telling you
	MVI	B,30		;  about,  I was beating my head for two
;
ALOOP:	CALL	DELAY		;  days trying to figure out why the
	LDA	RPORT		;  carrier detect routine was not work-
	LDA	SPORT		;  ing - it turns out this corck here
	LDA	DPORT		;  will get the modem to work properly.
	LDA	DPORT
	DCR	B
	JNZ	ALOOP
	POP	B
	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				;1200 bps not supported
;
SETINV:	ORI	0FFH		;make sure the Zero flag isn't set
	RET
;
; Set speed to 110 baud.
;
SET110:	MVI	A,B110+ANSW
	STA	CPORT		;Set 110 bps
	MVI	A,F110
	STA	SPORT		;Set 8 bits, no parity, 2 stop bits
	RET
;
; Set up for 300 bps
;
SET300:	MVI	A,B300+ANSW
	STA	CPORT		;Set 300 bps
	MVI	A,NORM
	STA	SPORT		;Set 8 bits, no parity, 1 stop bit
	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.
;
;**********************************************************************
;
