;*************************************************************************
;
;			     MB7201-1.ASM
;			 MBYE (Modular 'BYE')
;		      7201 MPSC UART I/O routines
;		        with 4618  RTC as timer	
;		     ****** for EPSON QX-10 ******
;			      Version 1.0
;
; Renamed and fixed to work with MBYE    02/15/84   Kim Levitt
; Adapted from BY3-KPSM.ASM	         12/15/83   Albert Doolittle	
; Adapted for use with BYE3-12           12/07/83   Steve Sanders
; Original Z80-SIO routine	         Ver. 1.3   by Steve Fox 
;
=========================================================================
;
;	Set base port for SIO & CTC chips
;
BASEP:	EQU	11h		;Base port for SIO
BASEC:	EQU	06h		;Base port for CTC baud rate generator
;
;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
VPORT:	EQU	BASEC+1		;Vector port
;
;The following are SPORT commands (output these to SPORT)
;
RESCHN:	EQU	00011000b	;Reset channel
RESSTA:	EQU	00010000b	;Reset ext/status
WRREG1:	EQU	00000000b	;Value to write to register 1
WRREG3:	EQU	11000001b	;8 bits/char, Rx enable
WRREG4:	EQU	01000100b	;16x, 1 stop bit, no parity
DTROFF:	EQU	00000000b	;DTR off, RTS off
DTRON:	EQU	11101010b	;DTR on, 8 bits/char, Tx enable, RTS on
ONINS:	EQU	00110000b	;Error reset
;
;The following are SPORT status masks
;
DAV:	EQU	00000001b	;Data available
TBMT:	EQU	00000100b	;Transmit buffer empty
DCD:	EQU	00001000b	;Data carrier detect
PE:	EQU	00010000b	;Parity error
OE:	EQU	00100000b	;Overrun error
FE:	EQU	01000000b	;Framing error
ERR:	EQU	PE+OE+FE	;Parity, overrun and framing error
;
;Now comes the time to decide how we set the baud rate.  Set it properly
;for your particular CTC configuration
;
BDVECT:	EQU	0B6H		;QX-10 Vector word
;
; Set Speed values for CTC Command:
;
BD300:	EQU	0A001H		;300 Baud
BD1200:	EQU	06800H		;1200 Baud
;
MDINIT:
	MVI	A,0		;select WR0 (to be sure)
	OUT	SPORT
	MVI	A,RESCHN	;Reset channel
	OUT	SPORT
	MVI	A,4		;Setup to write register 4
	OUT	SPORT
	MVI	A,WRREG4
	OUT	SPORT
	MVI	A,1		;Setup to write register 1
	OUT	SPORT
	MVI	A,WRREG1
	OUT	SPORT
	MVI	A,5		;Setup to write register 5
	OUT	SPORT
	MVI	A,DTROFF	;Clear DTR
	OUT	SPORT		;..Causing Hang-Up
	MVI	A,3		;Setup to write register 3
	OUT	SPORT
	MVI	A,WRREG3	;Initialize receive register
	OUT	SPORT
	RET			;Return
;
; This routine will raise DTR to answer the phone
;
MDANSW:
	MVI	A,5		;WR5
	OUT	SPORT
	MVI	A,DTRON		;turn on DTR
	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, select WR0:
	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.
;
MDINST:
	IN	SPORT		;Get status
	ANI	DAV		;Got a character?
	RZ			;Return if none
	ORI	0FFh		;..Otherwise, set the proper flag
	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 lable in front of
;the SETINV routine.  If the baud rate change was successful, make SURE
;the Zero flag is set.
;
;Set up for 300 baud
;
SET300:
	PUSH	H
	LXI	H,BD300		;Load rate
	JMP	SETBAUD
;
;Set up for 1200 baud
;
SET1200:
	PUSH	H
	LXI	H,BD1200	;Load rate
;
SETBAUD:
	MVI	A,BDVECT	;Get Vector addr
	OUT	VPORT		;Send to CTC
	MOV	A,H
	OUT	BPORT
	MOV	A,L
	OUT	BPORT		;Send rate
	POP	H
	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:			;110 baud not supported
SET450:			;450 baud not supported
SET600:			;600 baud not supported
SET710:			;710 baud not supported
;
	ORI	0FFH	;Make sure zero flag is not set
	RET		;and return...
;
;***********************************************************************
;
; That's it for the modem dependent I/O routines. Patch these into MBYE
; where it says INSERT YOUR MODEM DEPENDENT ROUTINES and it should work.
;
;************************************************************************
;
