	.TITLE CONSOLIO - CONSOLE TERMINAL I/O ROUTINES
	.IDENT	/02/
 
; CONSOLE I/O ROUTINES
;
; MACRO LIBRARY CALLS
;
 
	$PRDEF				;DEFINE PROCESSOR REGISTERS
 
;
; LOCAL SYMBOLS
;
; CHARACTER DEFINITIONS
;
 
BLANK=32				;BLANK
CR=13					;CARRIAGE RETURN
LF=10					;LINE FEED
SEVEN=55				;DIGIT 7
ZERO=48					;DIGIT 0
 
;
; TERMINAL REGISTER DEFINITIONS
;
 
RCSR=-4					;OFFSET RECEIVER CSR
RDBR=-2					;OFFSET RECEIVER DBR
TCSR=0					;OFFSET TRANSMITTER CSR
TDBR=2					;OFFSET TRANSMITTER DBR
 
;
; LOCAL DATA
;
; HEX CONVERSION TABLE
;
 
	.PSECT	YROLLA,LONG,RD,NOEXE
EXE$AB_HEXTAB::				;HEXDECIMAL CONVERSION TABLE
	.ASCII	/0/			;0 DIGIT
	.ASCII	/1/			;1 DIGIT
	.ASCII	/2/			;2 DIGIT
	.ASCII	/3/			;3 DIGIT
	.ASCII	/4/			;4 DIGIT
	.ASCII	/5/			;5 DIGIT
	.ASCII	/6/			;6 DIGIT
	.ASCII	/7/			;7 DIGIT
	.ASCII	/8/			;8 DIGIT
	.ASCII	/9/			;9 DIGIT
	.ASCII	/A/			;10 DIGIT
	.ASCII	/B/			;11 DIGIT
	.ASCII	/C/			;12 DIGIT
	.ASCII	/D/			;13 DIGIT
	.ASCII	/E/			;14 DIGIT
	.ASCII	/F/			;15 DIGIT
	.PAGE
	.PSECT	YROLL,LONG,PIC,SHR,NOWRT
	.SBTTL	CONVERT LONGWORD TO HEX AND OUTPUT DIGITS
;+
; EXE$OUTHEX - CONVERT LONGWORD TO HEX AND OUTPUT DIGITS
;
; THIS ROUTINE IS CALLED VIA A JSB TO CONVERT A LONGWORD TO HEX AND
; OUTPUT THE RESULTANT DIGITS TO A SPECIFIED DEVICE IN NONINTERRUPT
; MODE.
;
; INPUTS:
;
;	R1 = VALUE TO BE CONVERTED.
;	R11 = OUTPUT DEVICE CSR ADDRESS.
;
; OUTPUTS:
;
;	THE SPECIFED VALUE IS CONVERTED TO HEX AND OUTPUT.
;-
 
EXE$OUTHEX::				;CONVERT AND OUTPUT HEX LONGWORD
	MOVL	#28,R2			;SET POSITION OF FIRST FOUR BIT FIELD
10$:	EXTZV	R2,#4,R1,R0		;GET NEXT FOUR BITS OF VALUE
	MOVZBL	@#EXE$AB_HEXTAB[R0],R0	;GET ASCII CHARACTER
	BSBB	EXE$OUTCHAR		;OUTPUT DIGIT
	ACBB	#0,#-4,R2,10$		;ANY MORE DIGITS TO CONVERT?
	RSB				;
	.PAGE
	.SBTTL	OUTPUT BLANK CHARACTER
;+
; EXE$OUTBLANK - OUTPUT BLANK CHARACTER
;
; THIS ROUTINE IS CALLED VIA A JSB TO OUTPUT A BLANK CHARACTER TO A
; SPECIFIED DEVICE.
;
; INPUTS:
;
;	R11 = OUTPUT DEVICE CSR ADDRESS.
;
; OUTPUTS:
;
;	BLANK CHARACTER IS OUTPUT TO SPECIFIED DEVICE.
;-
 
EXE$OUTBLANK::				;OUTPUT BLANK CHARACTER
	MOVZBL	#BLANK,R0		;SET BLANK CHARACTER
	BRB	EXE$OUTCHAR		;
	.PAGE
	.SBTTL	OUTPUT CHARACTER
;+
; EXE$OUTCHAR - OUTPUT CHARACTER
;
; THIS ROUTINE IS CALLED VIA A JSB TO OUTPUT A CHARACTER TO A SPECIFIED
; DEVICE.
;
; INPUTS:
;
;	R0 = CHARACTER TO OUTPUT.
;	R11 = OUTPUT DEVICE CSR ADDRESS (ZERO IMPLIES CONSOLE TERMINAL).
;
; OUTPUTS:
;
;	CHARACTER IS OUTPUT TO THE SPECIFIED DEVICE. IF THE CHARACTER
;	IS A CARRIAGE RETURN AND THE OUTPUT DEVICE IS THE CONSOLE TERMINAL,
;	THEN A SUFFICIENT NUMBER OF FILL CHARACTERS ARE ALSO OUTPUT.
;-
 
EXE$OUTCHAR::				;OUTPUT CHARACTER
	TSTL	R11			;CONSOLE TERMINAL?
	BNEQ	20$			;IF NEQ NO
10$:	MFPR	#PR$_TXCS,-(SP)		;READ TRANSMIT CONTROL REGISTER
	BITL	#^X80,(SP)+		;TERMINAL READY?
	BEQL	10$			;IF EQL NO
	MTPR	R0,#PR$_TXDB		;OUTPUT CHARACTER
	BRB	30$			;
20$:	BITW	#^X080,TCSR(R11)	;DEVICE READY?
	BEQL	20$			;IF EQL NO
	MOVB	R0,TDBR(R11)		;OUTPUT CHARACTER
30$:	CMPB	#CR,R0			;CARRIAGE RETURN?
	BNEQ	60$			;IF NEQ NO
	TSTL	R11			;CONSOLE TERMINAL?
	BNEQ	60$			;IF NEQ NO
40$:	CLRL	R0			;SET FILL CHARACTER
	PUSHL	#2			;SET FILL COUNT
50$:	BSBB	EXE$OUTCHAR		;OUTPUT A FILL CHARACTER
	SOBGTR	(SP),50$		;ANY MORE FILLS TO OUTPUT?
	TSTL	(SP)+			;CLEAN STACK
60$:	RSB				;
	.PAGE
	.SBTTL	OUTPUT CARRIAGE RETURN/LINE FEED PAIR
;+
; EXE$OUTCRLF - OUTPUT CARRIAGE RETURN/LINE FEED PAIR
;
; THIS ROUTINE IS CALLED TO OUTPUT A CARRIAGE RETURN/LINE FEED PAIR TO A
; SPECIFIED DEVICE.
;
; INPUTS:
;
;	R11 = OUTPUT DEVICE CSR ADDRESS.
;
; OUTPUTS:
;
;	A CARRIAGE RETURN FOLLOWED BY A LINE FEED IS OUTPUT TO THE SPECIFIED
;	DEVICE.
;-
 
EXE$OUTCRLF::				;OUTPUT CARRIAGE RETURN/LINE FEED PAIR
	MOVZBL	#CR,R0			;SET CARRIAGE RETURN CHARACTER
	BSBB	EXE$OUTCHAR		;OUTPUT CARRIAGE RETURN
	MOVZBL	#LF,R0			;SET LINE FEED CHARACTER
	BRB	EXE$OUTCHAR		;OUTPUT LINE FEED CHARACTER
	.PAGE
	.SBTTL	OUTPUT COUNTED AND ZERO TERMINATED STRINGS
;+
; EXE$OUTCSTRING - OUTPUT COUNTED STRING
;
; THIS ROUTINE IS CALLED VIA A JSB TO OUTPUT A STRING WHOSE FIRST CHARACTER
; IS THE NUMBER OF CHARACTERS TO BE OUTPUT.
;
; INPUTS:
;
;	R1 = ADDRESS OF COUNTED STRING.
;	R11 = OUTPUT DEVICE CSR ADDRESS.
;
; OUTPUTS:
;
;	THE NUMBER OF CHARACTERS SPECIFIED BY THE FIRST BYTE OF THE STRING
;	ARE OUTPUT TO THE SPECIFIED DEVICE. OUTPUT IS ALSO TERMINATED IF
;	A ZERO BYTE IS ENCOUNTERED BEFORE THE COUNT IS EXHAUSTED.
;-
 
	.ENABL	LSB
EXE$OUTCSTRING::			;OUTPUT COUNTED STRING
	MOVZBL	(R1)+,R2		;SET COUNT OF CHARACTERS TO OUTPUT
	BRB	10$			;
 
;+
; EZE$OUTZSTRING - OUTPUT ZERO TERMINATED STRING
;
; THIS ROUTINE IS CALLED VIA A JSB TO OUTPUT A STRING THAT IS TERMINATED BY
; A ZERO BYTE.
;
; INPUTS:
;
;	R1 = ADDRESS OF ZERO TERMINATED STRING.
;	R11 = OUTPUT DEVICE CSR ADDRESS.
;
; OUTPUTS:
;
;	CHARACTERS FROM THE SPECIFIED STRING ARE OUTPUT UNTIL A ZERO BYTE
;	IS ENCOUNTERED.
;-
 
EXE$OUTZSTRING::			;OUTPUT ZERO TERMINATED STRING
	MOVZBL	#255,R2			;SET MAXIMUM ALLOWABLE STRING LENGTH
10$:	MOVZBL	(R1)+,R0		;GET NEXT CHARACTER FROM INPUT STRING
	BEQL	20$			;IF EQL END OF STRING
	BSBB	EXE$OUTCHAR		;OUTPUT CHARACTER
	SOBGTR	R2,10$			;ANY MORE CHARACTERS TO OUTPUT?
20$:	RSB				;
	.DSABL	LSB
 
	.END
