;***********************************************************************
;
;			 MBYE (Modular 'BYE')
;		Overlay for Kaypro 4'84 Internal Modem
;		    v1.0 (05/12/85) by Terry Carroll
;
; These routines will allow the easy patching of MBYE for the
; Kaypro 4'84 Internal Modem.  Certain routines must return status
; flags, so please be careful to set the flags as directed.
;
; NOTE: In the main MBYE program, be sure to set the following equates:
;
;          NORING:	EQU 	NO
;	   SINGLE: 	EQU 	YES
;	   S300:  	EQU 	YES
;
;       Set all other baud rate equates to NO.
;       Set all modem equates to NO.
;
;-----------------------------------------------------------------------
;
; 05/12/85  Initial version	-----	 Terry Carroll
;					 The Poor Man's RCP/M
;					 Bedford, Texas
;					 817-283-9167
;					 24 hours, 300/1200 Baud
;
;-----------------------------------------------------------------------
;
; Set base ports
;
SIOBASEP:	EQU	0DH		;Base port for SIO
PIOBASEP:	EQU	21H		;Base port for PIO
BAUDRATE:	EQU	00H		;Baud rate port
;
; The following define the port addresses to use.
;
DPORT:		EQU	SIOBASEP	;SIO Data port
SPORT:		EQU	SIOBASEP+2	;SIO Status/Control port
PDPORT:		EQU	PIOBASEP	;PIO Data port
PSPORT:		EQU	PIOBASEP+2	;PIO Status/Control port
BPORT:		EQU	BAUDRATE	;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	00100000B	;Ring Indicator
;
; RR1:
OE:		EQU	00100000B	;Overrun error
FE:		EQU	01000000B	;Framing error
ERR:		EQU	OE+FE		;Overrun and framing errors
;
; 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.
; The Kaypro 4'84 only supports 300 baud; other values are included here
; for informational purposes.
;
BD110:		EQU	02H
BD300:		EQU	05H
BD600:		EQU	06H
BD1200:		EQU	07H
BD2400:		EQU	0AH
BD4800:		EQU	0CH
BD9600:		EQU	0EH
BD19K:		EQU	0FH
;
;
;***********************************************************************
;
; 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,00001111B	;PIO initialization
	OUT	PSPORT
	MVI	A,01011111B
	OUT	PDPORT
	MVI	B,10
	CALL	DELAY
	MVI	A,11011111B	
	OUT	PDPORT
	MVI	B,10
	CALL	DELAY
	MVI	A,01011111B
	OUT	PDPORT
	MVI	A,10000111B
	OUT	PSPORT
	MVI	A,10000110B
	OUT	PSPORT
	MVI	A,01000000B	;Set modem on-hook (hang-up)
	OUT	PDPORT
	MVI	A,0
	OUT	SPORT
	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.
;
MDRING:
	MVI	A,RESSTA	;reset status latches
	OUT	SPORT		;to get CURRENT
	IN	SPORT		;status
	ANI	RI		;check RI status
	RET
;
; The following routine will raise DTR. (and RTS)
;
MDANSW:
	MVI	A,5		;address WR5
	OUT	SPORT
	MVI	A,DTRON		;raise DTR, RTS
	OUT	SPORT
	MVI	A,00010000B	;answer phone (off hook)
	OUT	PDPORT
	MVI	B,10
	CALL	DELAY
	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).
;
SET300:
	MVI	A,BD300
;
SETBAUD:
	OUT	BPORT		;set baud rate
	XRA	A		;say rate ok
	RET			;and return
;
; The following baud rates are not supported on the Kaypro 4'84
;
SET110:
SET450:
SET600:
SET710:
SET1200:
SET2400:
	ORI	0FFH		;say rate ng
	RET
;
; Ok, that's all of the modem dependent routines that MBYE uses, so if
; you insert this file into your copy of MBYE, then it should work out
; well.
;
;***********************************************************************
