
; 	TEST THE STATUS OF THE CONSOLE INPUT TO
; 	SEE IF A CHARACTER IS AVAILABLE.
;	EXIT:	A=0FFH	->	CHARACTER AVAILABLE
;		A=0	->	NO CHARACTER

CONST:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	0		; CONSOLE POSITION IN IOBYTE
	DEFW	TTYIST		; CONSOLE PRINTER DEVICE
	DEFW	CRTST		; CONSOLE CRT DEVICE
	DEFW	READST		; CONSOLE READER DEVICE
	DEFW	MODIST		; CONSOLE MODEM PORT DEVICE 

;	PRINTER PORT INPUT STATUS ROUTINE

TTYIST:	IN	A,(SIOBC1)	; READ PRINTER PORT INPUT STATUS
	JR	CHKIST

;	MODEM PORT INPUT STATUS ROUTINE

MODIST:	IN	A,(SIOAC1)	; READ MODEM PORT STATUS
	JR	CHKIST

; 	CONSOLE STATUS ROUTINE FOR STANDARD
; 	CRT TERMINAL DEVICE, SIO #0 CHANNEL B

CRTST:	IN	A,(SIOBC0)	; READ SIO STATUS

CHKIST:	BIT	RCVRDY,A	; CHARACTER AVAILABLE?
	LD	A,0
	RET	Z		; NO. A = 0

	DEC	A		; YES. A = FFH
	RET

; 	GRAB A CHARACTER FROM CONSOLE INPUT
;	     EXIT:	A=RETURNED CHARACTER

CONIN:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	0		; CONSOLE POSITION IN IOBYTE
	DEFW	TTYIN		; CONSOLE PRINTER DEVICE
	DEFW	CRTIN		; CONSOLE CRT DEVICE
	DEFW	READER		; CONSOLE CURRENT READER 
	DEFW	MODIN		; CONSOLE MODEM DEVICE 

; 	INPUT FROM PRINTER PORT 

TTYIN:	CALL 	TTYIST		; SEE IF CHAR AVAIL
	JR	Z,TTYIN
	IN	A,(SIOBD1)	; GET CHAR
	AND	7FH
	RET

;	INPUT FROM MODEM PORT

MODIN:	CALL	MODIST		; SEE IF CHAR AVAIL
	JR	Z,MODIN
	IN	A,(SIOAD1)	; GET CHAR
	RET

; 	CONSOLE INPUT ROUTINE FOR
; 	STANDARD CRT TERMINAL DEVICE.
; 	SIO CHANNEL B.
; 	MOTOR AND LIGHT OFF IN HALF A SECOND
; 	WHEN THERE IS NO INPUT ON CONSOLE

CRTIN:	CALL	CRTST		; CHECK THE STATUS
	JR	Z,CRTIN
	IN	A,(SIOBD0)	; FETCH THE CHARACTER
	AND	7FH		; STRIP OFF PARITY BIT 
	RET

; 	OUTPUT A CHARACTER TO THE CONSOLE
;	ENTRY:	C=CHARACTER TO BE OUTPUT

CONOUT:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	0		; CONSOLE POSITION IN IOBYTE
	DEFW	TTYOUT		; CONSOLE PRINTER DEVICE
	DEFW	CRTOUT		; CONSOLE CRT DEVICE
	DEFW	LIST		; CONSOLE CURRENT LIST DEVICE
	DEFW	MODOUT		; CONSOLE MODEM DEVICE 

;	PRINTER STATUS ROUTINE FOR SERIAL
;	INTERFACE WITH EPSON AND TI SIO
;	#1 CHANNEL B

TTYOST:	LD	A,00010000B	; RESET EXTRN/STATUS COMMAND
	OUT	(SIOBC1),A	; SEN OUT
	IN	A,(SIOBC1)	; READ SIO STATUS
	JR	CHKOST

;	CRT OUTPUT STATUS ROUTINE

CRTOST:	LD	A,00010000B	; RESET EXTRN/STATUS COMMAND
	OUT	(SIOBC0),A
	IN	A,(SIOBC0)
;	JR	CHKOST

;	*********  DISABLE XON/XOFF FOR CRT  *********
;		  MASK BIT   CRTMSK    TXMT
;       OLD 802:     4H        0        NO
;	                       4       YES
;       NEW 802:    24H        0        NO
;                              4       YES
;                             24        NO    

	LD	B,A
	LD	A,(CRTMSK)
	AND	B
	CP	04H		; CHECK TRANSMIT READY
	JR	NZ,NOTRDY
;       **********************************************

CHKOS1:	XOR	A
	DEC	A		; A=FF, Z=0 (TXMT READY/ENABLE FOR CRT)
	RET

;	MODEM OUTPUT STATUS ROUTINE FOR SERIAL OUTPUT

MODOST:	LD	A,00010000B	; RESET EXTRN/STATUS COMMAND
	OUT	(SIOAC1),A	; SEND IT OUT
	IN	A,(SIOAC1)	; READ SIO STATUS

CHKOST:	AND	00100100B	; CHECK TRANSMITT READY AND CTS
	CP	00100100B	; READY TO SEND
	JR	Z,CHKOS1	; YES, CODE FOR SET READY CONDITION

NOTRDY:	XOR	A		; NO, SET NOT READY CONDITION
	RET

; 	OUTPUT ROUTINE FOR SERIAL EPSON AND TI 
; 	PRINTER SIO CHANNEL A

TTYOUT:	CALL	TTYOST		; CHECK STATUS OF PRINTER
	JR	Z,TTYOUT	; NOT READY, LOOP BACK
	LD	A,C		; GET CHARACTER IN REG. C
	AND	7FH		; STRIP OFF PARITY
	OUT	(SIOBD1),A	; SEND OUT
	RET

;	OUTPUT ROUTINE FOR MODEM PORT

MODOUT:	CALL	MODOST		; CHECK STATUS OF PRINTER
	JR	Z,MODOUT	; NOT READY WAIT
	LD	A,C
	OUT	(SIOAD1),A	; OUTPUT CHAR
	RET

; 	OUTPUT ROUTINE FOR STANDARD CRT
; 	TERMINAL DEVICE, SIO CHANNEL B

CRTOUT:	CALL	CRTOST		; CHECK CHANNEL B TXMIT STATUS 
	JR	Z,CRTOUT	; NOT YET.
	LD	A,C		; TRANSFER THE CHARACTER
	OUT	(SIOBD0),A	; OUTPUT THE CHARACTER TO SIO
	RET

;	READER STATUS ROUTINE

READST:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	2
	DEFW	TTYIST		; STANDARD PRINTER DEVICE
	DEFW	CRTST		; STANDARD CONSOLE DEVICE
	DEFW	MODIST		; MODEM PORT DEVICE
	DEFW	UR2RDR		; USER DEFINED READER #2

; 	PAPER TAPE READER ROUTINE,
; 	MOSTLY UNUSED.

READER:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	2		; POSITION OF READER IN IOBYTE
	DEFW	TTYIN		; STANDARD TELETYPE DEVICE
	DEFW	CRTIN		; STANDARD CONSOLE DEVICE 
	DEFW	MODIN		; MODEM PORT DEVICE 
	DEFW	UR2RDR		; USER DEFINED READER #2
 	

; 	PAPER TAPE PUNCH ROUTINE,
; 	CURRENTLY DUMMIED OUT,
; 	PRETTY MUCH.

PUNCH:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	4		; PUNCH POSITION IN IOBYTE
	DEFW	TTYOUT		; TELETYPE OUTPUT
	DEFW	CRTOUT		; CONSOLE OUTPUT 
	DEFW	MODOUT		; MODEM PORT OUTPUT 
	DEFW	UP2PUN		; USER DEFINED PUNCH #2

;	OUTPUT ROUTINE FOR LIST DEVICE 

LIST:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	6		; LIST POSITION IN IOBYTE
	DEFW	TTYOUT		; OUTPUT TO TELETYPE DEVICE
	DEFW	CRTOUT		; OUTPUT TO CRT DEVICE
	DEFW	MODOUT		; MODEM PORT OUTPUT 
	DEFW	UL1LST		; USER DEFINED PRINTING DEVICE

; 	HERE IS THE SERIAL PRINTER DRIVER, WHICH EXPECTS
; 	THE DEVICE ON THE OTHER END TO SUPPORT AN ETX/ACK
; 	PROTOCOL.  PORT USED IS SIO CHANNEL A.

UL1LST:	LD	A,(UL1SIZ)	; SIZE OF PRINTER BUFFER.
	LD	B,A		; FOR LATER.
	OR	A		; CLEAR CARRY
	RRA			; DIVIDE BY 2
	LD	E,A		; E <- UL1SIZ/2
	LD	HL,UL1CNT	; CURRENT BUFFER COUNT
	INC	(HL)		; BUMP IT.
 
UL1L10:	IN	A,(SIOBC1)	; READ STATUS 
	BIT	RCVRDY,A	; DO WE HAVE AN INPUT CHARACTER?
	JR	Z,UL1L20	; NO. SEND CHARACTER.
	IN	A,(SIOBD1)	; GRAB THE CHARACTER.
	AND	7FH		; STIP PARITY.
	CP	ASCACK		; IS IT ACK?
	JR	Z,UL1L60	; YES, PROCESS IT.
UL1L20:	LD	A,E		; GET UL1SIZ/2
	CP	(HL)		; IS BUFFER HALF-FULL?
	JR	NZ,UL1L40	; NO, NO NEED FOR ETX.
 
UL1L30:	IN	A,(SIOBC1)	; PREPARE FOR OUTPUT.
	BIT	TRXRDY,A	; CAN WE OUTPUT?
	JR	Z,UL1L30	; NOT YET.
	LD	A,ASCETX	; SEND OFF THE END-OF-
	OUT	(SIOBD1),A	; BLOCK CHARACTER.
	JR	UL1L50		; NOW OUTPUT THE CHARACTER
 
UL1L40:	LD	A,B		; ORIGINAL BUFFER SIZE
	CP	(HL)		; CHECK FOR FULL AND OVERFLOW.
	JR	Z,UL1L30	; FULL, SO SEND ANOTHER ETX
	JR	C,UL1L10	; OVERFLOW, WAIT FOR ACK.
 
UL1L50:	IN	A,(SIOBC1)	; THIS IS THE REAL OUTPUT
	BIT	TRXRDY,A	; ROUTINE AND EXIT
	JR	Z,UL1L50	; LOOP UNTIL TRANSMITTER READY.
	LD	A,C		; CHARACTER HAS BEEN IN REG. C
	AND	7FH		; ALL THIS TIME. STRIP PARITY.
	OUT	(SIOBD1),A	; SHIP IT!
	RET			; ONLY EXIT POINT.

UL1L60:	LD	A,(HL)		; DID WE EVER SEND AN ETX?
	SUB	E		; I.E., IS BUFFER > = HALF FULL?
	JR	Z,UL1L70	; YES.
	JR	C,UL1L50	; NO, SPURIOUS ACK.
 
UL1L70:	LD	(HL),A		; ADJUST THE BUFFER COUNT
	JR	UL1L50		; AND SEND THE CHARACTER.
 
; 	TEST THE STATUS OF THE PRINTER
; 	THEN RETURN NOT READY FLAG.
;	EXIT:		A=0	->	PRINTER IS NOT READY
;			A=0FFH	->	PRINTER IS READY

LISTST:	CALL	IODISP		; DIRECT I/O TO PROPER DEVICE
	DEFB	6		; LIST POSITION IN IOBYTE
	DEFW	TTYOST		; STATUS OF TELETYPE DEVICE
	DEFW	CRTOST		; STATUS OF CRT DEVICE
	DEFW	MODOST		; STATUS OF MODEM PORT OUTPUT 
	DEFW	UL1LSS		; STATUS OF USER DEFINED PRINTING DEVICE

; 	CHECK THE STATUS OF SERIAL PRINTER,
; 	CP/M UL1 DEVICE

UL1LSS:	LD	HL,UL1CNT	; CURRENT BUFFER COUNT
	LD	A,(UL1SIZ)	; MAX COUNT.
	CP	(HL)		; ROOM FOR MORE CHARACTER?
	LD	A,0FFH		; ANTICIPATE AFFIRMATIVE.
	RET	NZ		; LISTER IS READY.
 
	IN	A,(SIOBC1)	; OTHERWISE SEE IF WE HAVE
	BIT	RCVRDY,A	; AN INPUT CHARACTER READY.
	LD	A,0FFH		; ANTICIPATE AFFIRMATIVE AGAIN.
	RET	NZ		; WE ARE ASSUMING CHAR. IS AN ACK.
 
	XOR	A		; WE MUST NOT BE READY YET
	RET

; 	PAPER TAPE READER, PUNCH AND CONSOLE
; 	DUMMY ROUTINES.  USER MAY FILL OUT LATER.

UR2RDR:
UP2PUN:

	LD	A,1AH		; RETURN EOF.
	RET

; END OF 802FCONS.MAC
