	.TITLE	ADVANCE		
; JEFFREY KODOSKY	ARL	NOV75
;
; SUBR
; ENTRY:	1 ARG		<BOOL>
; EXIT:		1 ARG		<INT> OR $EOF
; ERRORS:	NONE
; CALLS:	RDCHAR
;		RDBKUP
;		I2ATM
;(NOTE: CAN BACKUP MAX OF 6 CHARS)
	.GLOBL	ADVANCE,ZADVANCE,EOF,QRDCHAR,QI2ATM,QRDBKUP
ADVANCE:TST	(R5)+
	BNE	ADV02
ADV01:	QRDCHAR		;NULL[<ARG>]--->READ NEXT CHAR
	BCS	ADV09	;JUMP IF EOF
	MOV	R3,-(SP);ELSE RETURN INTEGER ATOM
	QI2ATM
	.WORD	0
ADV02:	QRDBKUP		;BACKUP TWICE
	BCS	ADV09
	QRDBKUP
	BCC	ADV01	;AND READ NEXT CHAR
ADV09:	MOV	EOF,-(R5)
	JMP	@-(R4)
;
;
; UTILITY:	INPUT ONE CHARACTER
; ENTRY:	NO ARGS
; EXIT:		R3 CONTAINS 7 BIT ASCII CHARACTER
;		C BIT SET AND 0 RETURNED IF EOF
; ERRORS:	O1, INPUT ERROR
; CALLS:	PRNT
;		GET
;		.TTYIN
;		.READW
	.GLOBL	AREA,QO1ERR,RDCHAR,PCBUF,PCBUFL,QPRNT,LSWVAL
	.GLOBL	SUBSYS,DEVTBL,BLKTBL,INSYS,PTRTBL,BFRTBL,OUTSYS
	.MCALL	.READW,.TTYIN
RDCHAR:	CMP	NXTC,#TOP	;IS A CHARACTER WAITING?
	BNE	RDC18	;JUMP IF SO
	MOV	INSYS,R2	;GET SYSIN CHANNEL
	BMI	.+4
	SWAB	R2	;USE CURRENT INPUT CHANNEL IF ANY
	BIC	#177760,R2
	MOV	R2,R1
	ASL	R1
	CMP	DEVTBL(R1),(PC)+	;TTY?
		.RAD50	/TT/
	BEQ	RDC07	;JUMP IF SO
RDC02:	MOV	PTRTBL(R1),R0	;NO: GET NEXT CHAR FROM INPUT CHANNEL
	BNE	RDC04	;IF NONE LEFT IN IBUF DO A READ
	.READW	#AREA,R2,BFRTBL(R1),#256.,BLKTBL(R1)
	BCC	RDC03
	TST	@#52	;CHECK IF EOF
	BEQ	RDC06
	QO1ERR		;IF NOT THEN FATAL ERROR
RDC03:	CLR	R0
	INC	BLKTBL(R1)	;POINT TO NEXT RELATIVE BLOCK
RDC04:	ADD	BFRTBL(R1),R0	;GET CHAR
	MOVB	@R0,R0
	BIC	#177600,R0
	INC	PTRTBL(R1)
	CMP	PTRTBL(R1),#512.
	BLT	RDC05
	CLR	PTRTBL(R1)	;RESET POINTER IF THAT WAS LAST CHAR
RDC05:	MOV	#TEMP,R3;ECHO CHAR TO OUTPUT CHANNEL
	MOV	R0,@R3
	BEQ	RDC02	;IGNORE NULLS ON INPUT
	TST	SUBSYS	;NO ECHO FOR SUBSYS INPUT
	BNE	RDC5B
	CMP	LSWVAL,#3
	BEQ	RDC5A
	CMP	LSWVAL,#1
	BNE	RDC5B
RDC5A:	QPRNT
RDC5B:	MOV	TEMP,R0
	BR	RDC10
RDC06:	CLR	R0	;<EOF> SIGNALLED WITH NULL
	BR	RDC10
RDC07:	.TTYIN		;GET A CHAR FROM TERMINAL
	MOV	OUTSYS,R2	;ECHO IF SYSOUT NOT TT:
	BMI	.+4
	SWAB	R2
	BIC	#177760,R2
	ASL	R2
	CMP	DEVTBL(R2),(PC)+
	  .RAD50	/TT/
	BNE	RDC05
RDC10:	MOV	#BOT,R1	;SLIDE UP WINDOW
	MOV	R1,R2
	INC	R2
	.REPT	5
	MOVB	(R2)+,(R1)+
	.ENDM
	MOVB	R0,@R1	;INSERT NEW CHAR
	BR	RDC20
RDC18:	MOVB	@NXTC,R0
	INC	NXTC
RDC20:	MOV	R0,-(SP);SAVE CHAR
	BEQ	RDC25	;IF <EOF> TRY TO ECHO PARBUF
	MOV	#SCHAR,R1
	CMPB	R0,(R1)+;TAB?
	BEQ	RDC21
	CMPB	R0,(R1)+;CR?
	BEQ	RDC21
	CMPB	R0,(R1)+;IF LF
	BEQ	RDC25
	CMPB	R0,(R1)+;OR FF
	BEQ	RDC25	;THEN ECHO PARBUF
	MOV	#40,R0	;OTHERWISE PUT SPACE
RDC21:	MOV	PCNT,R2	;CR OR TAB IN PARBUF
	BMI	RDC29
	CMP	R2,#PCBUFL-2
	BGE	RDC30
	ADD	#PCBUF,R2
	MOVB	R0,@R2
	BR	RDC29
RDC25:	MOV	PCNT,R2	;PUT LF OR FF IN PARBUF
	BMI	RDC29
	CMP	R2,#PCBUFL-1
	BLT	RDC26
	MOV	#PCBUFL-2,R2;(SHOULD NEVER HAPPEN)
RDC26:	ADD	#PCBUF,R2
	MOVB	R0,(R2)+
	CLRB	(R2)+	;ZERO BYTE TERMINATOR
	CLR	PCNT
	MOV	#PCBUF,R3
	TST	SUBSYS	;NO ECHO IF READING SUBSYSTEMS
	BNE	RDC30
	CMP	LSWVAL,#3
	BNE	RDC30
	QPRNT		;ECHO PARBUF
	BR	RDC30
RDC29:	INC	PCNT
RDC30:	MOV	(SP)+,R3;RETURN CHARACTER
	CLC
	BNE	.+4
	SEC		;AND C BIT IF EOF
	JMP	@-(R4)
	.PAGE
; UTILITY:	BACKSPACE INPUT POINTER
; ENTRY:	NO ARGS
; EXIT:		NO ARGS
;		C BIT SET IF ATTEMPT TO BACKUP TOO MUCH (>6 CHARS)
; ERRORS:	NONE
; CALLS:	NONE
; R1,R2,R3 PRESERVED
	.GLOBL	RDBKUP
RDBKUP:	DEC	PCNT
	DEC	NXTC
	CMP	NXTC,#BOT
	BHIS	RDB2
	MOV	#BOT,NXTC
RDB2:	JMP	@-(R4)
ZADVANCE=.-ADVANCE
;
;
;
; UTILITY:	LABEL PARENTHESIS
; ENTRY:	1 ARG (SP)	LEVEL #
; EXIT:		NO ARGS
; ERRORS:	NONE
; CALLS:	NONE
; R2,R3 PRESERVED
	.GLOBL	PARLBL
PARLBL:	MOV	(SP)+,R0
LBL1:	SUB	#36.,R0	;GET R0 MOD 36.
	BPL	LBL1
	ADD	#36.,R0
	CMP	R0,#9.	;CONVERT TO ASCII 0-9,A-Z
	BLE	LBL2
	ADD	#7,R0
LBL2:	ADD	#60,R0
	MOV	PCNT,R1
	DEC	R1
	BMI	LBL3	;IGNORE LABELING IF BUFFER ALREADY ECHOED
	ADD	#PCBUF,R1
	MOVB	R0,@R1
LBL3:	JMP	@-(R4)
;
TEMP:	.WORD	0
SCHAR:	.BYTE	11,15,12,14
	.EVEN
PCNT:	.WORD	0
BOT:	.WORD	0,0,0
TOP:
NXTC:	.WORD	TOP
	.END
