	.TITLE	PRNT		
; JEFFREY KODOSKY	ARL	NOV75
;
; UTILITY:	OUTPUT ASCIZ BUFFER
; ENTRY:	R3 POINTS TO ASCIZ BUFFER
;		(IF R3=0 THEN ANY REMAINING CHARS ARE OUTPUT)
; EXIT:		R3 POINTS PAST ZERO BYTE (OR R3=0 IF CALLED WITH0)
; ERRORS:	O2, OUTPUT ERROR
; CALLS:	.TTYOUT
;		.WRITW
	.GLOBL	PRNT,APVAL,QO2ERR,AREA,OUTSYS,DEVTBL,BLKTBL
	.GLOBL	PTRTBL,BFRTBL,WSWVAL
	.MCALL	.WRITW,.TTYOUT
PRNT:	MOV	OUTSYS,R1	;GET SYSOUT CHANNEL
	BMI	.+4
	SWAB	R1	;USE CURRENT OUTPUT CHANNEL IF ANY
	BIC	#177760,R1
	MOV	R1,OCHANL
	ASL	R1
	MOV	R3,R2
	BEQ	PRNT30	;JUMP IF FORCED OUTPUT
	MOV	#80.,-(SP)	;GET LINE WIDTH
	TST	WSWVAL
	BEQ	.+6
	MOV	#132.,@SP
	MOV	@SP,R0
	SUB	CCNT,@SP	;REMAINING SPACE ON CURRENT LINE
	BGT	PRNT05	;JUMP IF SPACE REMAINING
	CMPB	@R2,#15	;IF NOT, OUTPUT CRLF UNLESS
	BEQ	PRNT10	;1ST CHAR OF BUFFER IS A LINE TERMINATOR
	BR	PRNT09
PRNT05:	CMPB	@R2,#15	;TEST FOR ROOM ENOUGH ON LINE
	BEQ	PRNT07	;LOOK FOR TERMINATOR OR END OF BUFFER
	TSTB	(R2)+
	BEQ	PRNT07
	DEC	@SP
	DEC	R0
	BMI	PRNT10	;JUMP IF BUFFER IS TOO LONG FOR EVEN A
	BR	PRNT05	;WHOLE LINE (JUST OUTPUT IT)
PRNT07:	TST	@SP	;IF BUFFER WILL FIT ON A NEW LINE BUT
	BPL	PRNT10	;NOT ON PRESENT LINE THEN DO A CRLF
PRNT09:	MOV	#5015,R2
	JSR	PC,OUTC
	SWAB	R2
	JSR	PC,OUTC
	CLR	CCNT
PRNT10:	TST	(SP)+	;DISCARD COUNTER
PRNT13:	MOVB	(R3)+,R2	;END OF BUFFER?
	BEQ	PRNT25	;JUMP IF SO
	TST	CCNT
	BNE	PRNT14
	CMPB	R2,#240	;IGNORE "MARKED" SPACES AT START OF LINE
	BEQ	PRNT13
PRNT14:	BIC	#177600,R2
	CMP	R2,#40
	BGE	PRNT16	;JUMP IF PRINTABLE
	CMP	R2,#11
	BEQ	PRNT15	;COUNT IN A SPECIAL WAY FOR TABS
	CMP	R2,#15	;DON'T COUNT ANY OTHER CONTROL CHARS
	BNE	PRNT17
	CLR	CCNT
	BR	PRNT17
PRNT15:	ADD	#8.,CCNT
	BIC	#7,CCNT
	BR	PRNT17
PRNT16:	INC	CCNT
PRNT17:	JSR	PC,OUTC
	BR	PRNT13
PRNT30:	JSR	PC,OUTL
PRNT25:	JMP	@-(R4)
OUTC:	CMP	DEVTBL(R1),(PC)+
		.RAD50	/TT/
	BNE	OUTC1	;STORE CHAR IF NOT TT:
	.TTYOUT	R2
	RTS	PC
OUTC1:	MOV	PTRTBL(R1),R0
	ADD	BFRTBL(R1),R0
	MOVB	R2,@R0	;STORE CHAR IN OUTPUT BUFFER
	INC	PTRTBL(R1)
	CMP	PTRTBL(R1),#512.
	BLT	OUTE	;IF IT FILLS WRITE IT OUT
WRITE:	.WRITW	#AREA,OCHANL,BFRTBL(R1),#256.,BLKTBL(R1)
	BCC	.+4
	QO2ERR
	CLR	PTRTBL(R1)	;RESET BUFFER POINTER
	INC	BLKTBL(R1)	;POINT TO NEXT RELATIVE BLOCK
OUTE:	RTS	PC
OUTL:	CMP	DEVTBL(R1),(PC)+
		.RAD50	/TT/
	BEQ	OUTE	;NO BUFFER IF TT:
	MOV	PTRTBL(R1),R0	;FORCE OUTPUT OF EXISTING BUFFER
	BEQ	OUTE
	MOV	R0,R2	;NULL FILL TO END OF BUFFER
	SUB	#512.,R2
	ADD	BFRTBL(R1),R0
OUT1:	CLRB	(R0)+
	INC	R2
	BLT	OUT1
	BR	WRITE
;
OCHANL:	.WORD	0	;OUTPUT CHANNEL
CCNT:	.WORD	0	;NUMBER OF CHARS ON PRESENT LINE
	.END
