	.TITLE	LINE_IO ROUTINES
	.ENABLE DEBUG
	.SUBTITLE	DATA AREA
	.PSECT	PURE_DATA,NOEXE,SHR,RD,NOWRT,CON,GBL
GET_ERROR:
	.ASCID	/INDEX-F-File Read Record Error/
CONTINUATION_ERROR:
	.ASCID	/INDEX-E-Too Many Continuation Lines/
PASS_LINE:
	.LONG	1
	.ADDRESS	DESCRIPTER
	.PSECT	IMPURE_DATA,NOEXE,NOSHR,RD,WRT,CON,GBL,LONG
DESCRIPTER:	.LONG	0
	.ADDRESS	0
DESCRIPTER2:
	.LONG		0
	.ADDRESS	0
DESCRIPTER3:
	.LONG	132
	.ADDRESS	INPUT_BUFFER
ERROR_MESS:	.LONG	0
	.SUBTITLE	INPUT A LINE FROM SOURCE FILE
	.PSECT	CODE,EXE,RD,NOWRT,SHR,CON,GBL
	.ENTRY	GET_LINE,^M<R2,R3,R4,R5,R6,R7>
;	CLEAR LINE STORAGE AREA
	MOVC5	#0,NULL,#0,#<100*<4+132>>,SOURCE_LINE
;	CHECK FOR END OF FILE
11$:	TSTL	DEFFERED_END_OF_FILE
	BEQL	4$
	TSTL	INCLUDE_LEVEL		;CAN WE POP DOWN 1 LEVEL
	BEQL	10$			;NO
	CALLG	NULL,POP_INCLUDE_LEVEL
	BRB	11$
10$:	CMPL	FILE_SPEC_QUEUE,FILE_SPEC_QUEUE+4	;ANY MORE INPUT FILES?
	BEQL	12$					;NO-NO MORE OPTIONS
	CALLG	NULL,OPEN_NEW_FILE			;OPEN NEW ZERO LEVEL FILE
	BRB	4$
12$:	INCL	END_OF_FILE		;EXIT
	RET
;	CHECK FOR LINE IN BUFFER FROM LAST READ
4$:	TSTL	INPUT_BUFFER_FLAG
	BNEQ	1$
;	GET THAT LINE OR READ IN NEW LINE
3$:	CALLG	NULL,GET_ONE_LINE
	TSTL	R0
	BEQL	1$
	INCL	END_OF_FILE
	RET
1$:	MOVAL	INPUT_BUFFER,DESCRIPTER+4
	LOCC	#0,#132,INPUT_BUFFER
	SUBL3	R0,#132,DESCRIPTER
;	CHECK FOR FORM-FEEDS
	LOCC	#12,DESCRIPTER,@DESCRIPTER+4
	BEQL	5$			;NO <FF>
	MOVB	#^A/ /,(R1)		;REPLACE WITH BLANK
	CLRL	LINES_ON_PAGE		;FORCE NEW PAGE
	CMPB	#1,DESCRIPTER		;SEE IF ONLY <FF>
	BNEQ	5$
	JMP	3$
5$:
;	OUTPUT THE LINE
	CALLG	PASS_LINE,PUT_LINE
;	IS THIS A COMMENT LINE
	CALLG	NULL,CHECK_COMMENT
	BLBS	R0,6$
	JMP	3$			;YES REPEAT
;	MAIN LINE FOUND-STORE MAIN LINE
6$:	MOVL	#SOURCE_LINE,R6		;SET UP POINTER TO OUTPUT
	MOVL	#100,R7
COPY_IN_LOOP:
	DECL	R7			;SEE IF ANY ROOM LEFT
	BGEQ	1$
	PUSHAL	CONTINUATION_ERROR	;TOO MANY CONTINUATION LINES
	CALLS	#1,G^LIB$PUT_OUTPUT
	PUSHAL	CONTINUATION_ERROR
	CALLS	#1,ERROR_LINE
	MOVL	#1,INPUT_BUFFER_FLAG
	RET
1$:	MOVL	LINE_NUMBER,(R6)+	;SAVE LINE NUMBER
;	CPY LINE FROM INPUT BUFFER TO SOURCE LINE BUFFER
;	TRANSLATEING LOWER CASE TO UPPER CASE AND REMOVEING
;	ANY BIT 7 SET
	MOVTC	DESCRIPTER,@<DESCRIPTER+4>,#0,TRANSLATE_LC_TO_UC,#132.,(R6)
	ADDL2	#132,R6
;	WRITE/READ UNTILL ALL CONTINUATION LINES ARE IN,
4$:	CALLG	NULL,GET_ONE_LINE
	TSTL	R0
	BEQL	3$
	INCL	DEFFERED_END_OF_FILE	;END OF FILE-SET FLAG
	RET
3$:
;	SET UP TO OUTPUT THE LINE
	MOVAL	INPUT_BUFFER,DESCRIPTER+4
	LOCC	#0,#132,INPUT_BUFFER
	SUBL3	R0,#132,DESCRIPTER
;	IS THIS A COMMENT LINE
	CALLG	NULL,CHECK_COMMENT
	BLBS	R0,5$			;YES REPEAT
;	CHECK FOR FORM-FEEDS
	LOCC	#12,DESCRIPTER,@DESCRIPTER+4
	BEQL	15$			;NO <FF>
	MOVB	#^A/ /,(R1)		;REPLACE WITH BLANK
	CLRL	LINES_ON_PAGE		;FORCE NEW PAGE
	CMPB	#1,DESCRIPTER		;SEE IF ONLY <FF>
	BNEQ	15$
	JMP	4$
15$:
	CALLG	PASS_LINE,PUT_LINE
	BRW	4$
;	SEE IF MAIN LINE OR CONTINUATION LINE
5$:
	LOCC	#9,#6,@DESCRIPTER+4	;SEE IF TAB USED
	BNEQ	6$			;YES-HANDLE TAB CONVENTION
;	NO TAB- DIRECT CHECK OF COLL 6 POINTED TO BY R1
	CMPB	#^A/ /,-1(R1)		;SEE IF MAIN LINE
	BEQL	30$			;YES
	CMPB	#^A/0/,-1(R1)
	BEQL	30$
	CMPB	#0,-1(R1)
	BEQL	30$
;	NOT A MAIN LINE
;	CHECK FOR FORM-FEEDS
	LOCC	#12,DESCRIPTER,@DESCRIPTER+4
	BEQL	25$			;NO <FF>
	MOVB	#^A/ /,(R1)		;REPLACE WITH BLANK
	CLRL	LINES_ON_PAGE		;FORCE NEW PAGE
	CMPB	#1,DESCRIPTER		;SEE IF ONLY <FF>
	BNEQ	25$
	JMP	4$
25$:
	CALLG	PASS_LINE,PUT_LINE
	BRW	COPY_IN_LOOP
6$:	CMPB	#^A/1/,1(R1)
	BGTR	30$
	CMPB	#^A/9/,1(R1)
	BLSS	30$
	CALLG	PASS_LINE,PUT_LINE
	BRW	COPY_IN_LOOP
30$:	INCL	INPUT_BUFFER_FLAG
	RET
;	SKIPPING COMMENT LINES, STORING CONTINUATION LINES
	RET
	.PAGE
	.SUBTITLE	GET A LINE(HANDLE NESTING)
	.ENTRY	GET_ONE_LINE,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
500$:	MOVC5	#0,NULL,#0,#132,INPUT_BUFFER	;CLEAR THE INPUT BUFFER
	MOVL	INCLUDE_LEVEL,R11	;GET THE NESTING LEVEL
	MOVL	INCLUDE_STACK[R11],R10	;GET POINTER TO INCLUDE STACK FRAME
	TSTB	INCLUDE_TYPE(R10)	;LIBRARY FILE OR REGULAR FILE
	BNEQ	50$			;LIBRARY FILE
	MOVW	#132,<INCLUDE_RAB+RAB$W_USZ>(R10)
	MOVAL	INPUT_BUFFER,<INCLUDE_RAB+RAB$L_UBF>(R10)
	$GET	RAB=INCLUDE_RAB(R10)
	BLBC	R0,1$
	CLRL	R0
	RET
1$:	CMPL	#RMS$_EOF,R0
	BEQL	100$
	PUSHR	#^M<R0>
	PUSHAL	GET_ERROR
	CALLS	#1,G^LIB$PUT_OUTPUT
	POPR	#^M<R0>
	$EXIT_S	R0
50$:	MOVL	#132,DESCRIPTER3
	MOVAL	INPUT_BUFFER,DESCRIPTER3+4
	PUSHAL	DESCRIPTER3
	PUSHAL	INCLUDE_INDEX(R10)
	CALLS	#2,G^LBR$GET_RECORD
	BLBC	R0,51$
	CLRL	R0
	RET
51$:	CMPL	#RMS$_EOF,R0
	BEQL	100$
	PUSHR	#^M<R0>
	PUSHAL	GET_ERROR
	CALLS	#1,G^LIB$PUT_OUTPUT
	POPR	#^M<R0>
	$EXIT_S	R0
100$:	TSTL	INCLUDE_LEVEL	;ROOM TO POP A LEVEL
	BEQL	101$		;NO
	CALLG	NULL,POP_INCLUDE_LEVEL;YES-POP
	CLRL	R0	;RESTORE OLD DATA
	RET
101$:	MOVAL	FILE_SPEC_QUEUE,R0
	CMPL	R0,(R0)		;MORE FILES TO READ
	BEQL	102$					;NOPE-QUEUE IS EMPTY
	CALLG	NULL,OPEN_NEW_FILE		;OPEN NEW ZERO LEVEL FILE
	JMP	500$	;AND RETRY READ
102$:	MOVL	#1,R0			;NOPE-NOTHING MORE TO GET IN
	RET
	.PAGE
	.SUBTITLE	CHECK LINE AS COMMMENT UTILITY
	.ENTRY	CHECK_COMMENT,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
	CMPB	#^A/C/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BNEQ	203$
	BRW	3$			;NO-KEEP GOING
203$:	CMPB	#^A/c/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BNEQ	303$
	BRW	3$
303$:	BITL	#DEBUG_FLAG,FLAG_WORD
	BNEQ	4$
	CMPB	#^A/D/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BNEQ	403$
	BRW	3$
403$:	CMPB	#^A/d/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BEQL	3$
	BRB	5$
4$:	CMPB	#^A/D/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BEQL	6$
	CMPB	#^A/d/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BNEQ	5$
6$:	MOVB	#^A/ /,@<DESCRIPTER+4>	;RESET DEBUG FLAG TO BLANK
	BRB	7$
5$:	CMPB	#^A/!/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BEQL	3$
	CMPB	#^A/*/,@<DESCRIPTER+4>	;SEE IF FOUND MAIN LINE YET
	BEQL	3$
	CVTWL	DESCRIPTER,R11		;GET LENGTH OF STRING
	BEQL	3$			;CATCH ZERO LENGTH
	MOVL	DESCRIPTER+4,R10	;GET START OF STRING
	CMPL	#72,R11			;CHECK ONLY FIRST 72 COLLUMNS
	BGEQ	100$
	MOVL	#72,R11			;IF LONGER-RESET CHECK COUNT
100$:	TSTB	(R10)			;CHECK IF NULL
	BEQL	101$
	CMPB	#^A/ /,(R10)		;CHECK IF BLANK
	BEQL	101$
	CMPB	#9,(R10)		;CHECK IF TAB
	BEQL	101$
	CMPB	#12,(R10)		;CHECK IF <FF>
	BEQL	101$
	BRW	7$			;FOUND SOMETHING ELSE-NOT A COMMENT
101$:	INCL	R10
	SOBGTR	R11,100$		;LOOP UNTILL DONE
	BRW	3$			;WAS A COMMENT
7$:	MOVL	#1,R0	;FLAG NOT A COMMENT
	RET
3$:	CLRL	R0	;FLAG WAS COMMENT
	RET
	.PAGE
	.SUBTITLE	OUTPUT A LINE TO LIST FILE
	.ENTRY	PUT_LINE,^M<R2,R3,R4,R5,R6,R7,R10,R11>
;
;	CALL PUT_LINE(STRING) ! PASS BY DESCRIPTER
;
;	ALTERNATE ENTRY POINTS ARE
;	CALL ERROR_LINE(STRING)	!PASS BY DESCRIPTER
;	CALL PRINT_LINE(STRING)
;	WHICH DIFFERS FROM PUT_LINE ONLY IN THAT NO LINE NUMBER IS GENERATED
;
	CLRL	ERROR_MESS
	BRB	CHK_HDR
	.ENTRY	ERROR_LINE,^M<R2,R3,R4,R5,R6,R7,R10,R11>
	MOVL	#1,ERROR_MESS
	BRB	CHK_HDR
	.ENTRY	PRINT_LINE,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
	MOVL	#1,ERROR_MESS
CHK_HDR:BITL	#GET_ENTRY_FLAG,FLAG_WORD	;NO OUTPUT FILE ???
	BNEQ	77$
	BITL	#NO_SOURCE_FLAG,FLAG_WORD	;SEE IF ANY OUTPUT REQUIRED
	BEQL	1$				;YES
	CMPL	#PARSE_LINES,STATUS_WORD	;IN SOURCE ?
	BNEQ	1$				;NO
77$:	CALLG	NULL,GET_LINE_NUMBER		;YES-JUST GET LINE NUMBER
	RET					;DONE
;	CHECK FOR LINES/PAGE USED UP
1$:	TSTL	LINES_ON_PAGE
	BLEQ	25$
	JMP	NO_HEADER
;	IF YES-UPDATE PAGE NUMBER
25$:	INCL	PAGE_NUMBER
;	FORM TITLE LINE, OUTPUT WITH <FF>
	MOVAL	OUTPUT_BUFFER,R11	;SET UP OUTPUT POINTER
	MOVB	#12,(R11)+		;OUTPUT <FF>
	MOVC3	TITLE1,@TITLE1+4,(R11)	;FIRST PART OF TITLE
	MOVL	R3,R11
	CASEL	STATUS_WORD,#1,#9	;SET UP TO OUTPUT PROPER TYPE HEADER    ;V1.4
11$:	.WORD	T1-11$                                                          ;**-1
	.WORD	T2-11$
	.WORD	T3-11$
	.WORD	T4-11$
	.WORD	T5-11$
	.WORD	T6-11$
	.WORD	T7-11$
	.WORD	T8-11$
	.WORD	T9-11$                                                          ;V1.4
T1:	MOVC3	TITLE3A,@TITLE3A+4,(R11)
	BRB	ENDTN
T2:	MOVC3	TITLE3B,@TITLE3B+4,(R11)
	BRB	ENDTN
T3:	MOVC3	TITLE3C,@TITLE3C+4,(R11)
	BRB	ENDTN
T4:	MOVC3	TITLE3D,@TITLE3D+4,(R11)
	BRB	ENDTN
T5:	MOVC3	TITLE3E,@TITLE3E+4,(R11)
	BRB	ENDTN
T6:	MOVC3	TITLE3F,@TITLE3F+4,(R11)
	BRB	ENDTN
T7:	MOVC3	TITLE3G,@TITLE3G+4,(R11)
	BRB	ENDTN
T8:	MOVC3	TITLE3H,@TITLE3H+4,(R11)
	BRB	ENDTN                                                           ;V1.4
T9:	MOVC3	TITLE3I,@TITLE3I+4,(R11)                                        ;V1.4
ENDTN:	MOVL	R3,R11
;	COPY THE DAY_TIME STRING TO OUTPUT LINE
	MOVC3	DAY_TIME,@DAY_TIME+4,(R11)
	MOVL	R3,R11
;	COPY MORE OF FIXED TITLE
	MOVC3	TITLE2,@TITLE2+4,(R11)
	MOVL	R3,R11
	MOVL	R11,DESCRIPTER2+4	;LOAD DESCRPTER
	MOVL	#6,DESCRIPTER2
	PUSHAL	DESCRIPTER2
	PUSHAL	PAGE_NUMBER
	CALLS	#2,G^OTS$CVT_L_TI		;GET ASCII PAGE NUMBER
	ADDL	#6,R11
	SUBL2	#OUTPUT_BUFFER,R11	;GET LENGTH OF TITLE
	MOVW	R11,OUT_RAB+RAB$W_RSZ	;STORE LENGTH
	MOVL	#OUTPUT_BUFFER,OUT_RAB+RAB$L_RBF
	$PUT	RAB=OUT_RAB
	BLBS	R0,21$
	JMP	WRITE_ERROR		;FATAL ERROR IN WRITE
21$:	MOVW	COMMAND_BUFFER,OUT_RAB+RAB$W_RSZ	;SET UP SUB TITLE
	MOVL	COMMAND_BUFFER+4,OUT_RAB+RAB$L_RBF
	$PUT	RAB=OUT_RAB
	BLBS	R0,22$
	JMP	WRITE_ERROR
22$:	MOVW	#0,OUT_RAB+RAB$W_RSZ		;EMPTY LINE
	MOVAL	NULL,OUT_RAB+RAB$L_RBF
	$PUT	RAB=OUT_RAB
	BLBS	R0,23$
	JMP	WRITE_ERROR
;	RESET LINE COUNT_DOWN
23$:	ADDL3	LINES_PER_PAGE,#-6,LINES_ON_PAGE
;
;	FORM OUTPUT LINE WITH LINE NUMBER AND OUTPUT IT
NO_HEADER:
	MOVL	#OUTPUT_BUFFER,R11	;GET OUTPUT POINTER
	TSTL	ERROR_MESS
	BNEQ	NO_NUMBER
	CALLG	NULL,GET_LINE_NUMBER	;GET NEW LINE NUMBER
	MOVAL	OUTPUT_BUFFER,DESCRIPTER2+4	;SET UP FOR ASCII LINE NUMBER
	MOVL	#4,DESCRIPTER2
	PUSHAL	DESCRIPTER2
	PUSHAL	LINE_NUMBER
	CALLS	#2,G^OTS$CVT_L_TI
	ADDL2	#4,R11
	MOVB	#^A/ /,(R11)+		;BLANK FILL
	PUSHL	#0			;FILL IN INCLUDE NESTING DEPTH
	MOVL	R11,DESCRIPTER2+4
	MOVL	#2,DESCRIPTER2
	PUSHAL	DESCRIPTER2
	PUSHAL	INCLUDE_LEVEL
	CALLS	#3,G^OTS$CVT_L_TI	;INSERT INCLUDE NESTING LEVEL
	ADDL2	#2,R11
	MOVB	#^A/ /,(R11)+		;ANOTHER BLANK
NO_NUMBER:
	MOVL	4(AP),R10		;GET POINTER TO DESCRIPTER
	MOVAL	OUTPUT_BUFFER+132,R6
	SUBL2	R11,R6			;CACULATE NUMBER OF BYTES LEFT IN
					;OUTPUT BUFFER
	MOVC5	(R10),@4(R10),#0,R6,(R11)	;COPY OUTPUT STRING
	LOCC	#0,#132,OUTPUT_BUFFER
	MOVAL	OUTPUT_BUFFER,OUT_RAB+RAB$L_RBF
	SUBL2	#OUTPUT_BUFFER,R1
	MOVW	R1,OUT_RAB+RAB$W_RSZ
	$PUT	RAB=OUT_RAB
	BLBC	R0,WRITE_ERROR
	DECL	LINES_ON_PAGE
	RET
WRITE_ERROR:
	PUSHR	#^M<R0>
	PUSHAL	PUT_ERROR	;ERROR MESSAGE
	CALLS	#1,G^LIB$PUT_OUTPUT
	POPR	#^M<R0>
	$EXIT_S	R0
	.PAGE
	.SUBTITLE	GET LINE NUMBER
	.ENTRY	GET_LINE_NUMBER,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>
	BITL	#PREPROCESSOR_FLAG,FLAG_WORD	;DO WE WANT PREPORCESSOR NUMBERS
	BNEQ	1$				;YES
	INCL	LINE_NUMBER			;NO-JUST BUMP LINE NUMBER
	RET
1$:;	CHECK INPUT BUFFER
;	SCANN FROM COL 80 TO 73-SKIPPING BLANKS AND NULLS, STOPING ON
;	NON NUMBER FOUND
	MOVAL	INPUT_BUFFER+80,R11	;SET UP FOR SCAN
	MOVL	#8,R10			;8 CHRS
	CLRL	R9			;CLR ACCUMATOR
	MOVL	#1,R8			;MULTIPLYER
2$:	MOVB	-(R11),R7		;GET CHR
	BEQL	3$			;IF NULL SKIP
	CMPB	#^A/ /,R7		;DITTO FOR BLANK
	BEQL	3$
	CMPB	#^A/0/,R7		;IS IT LESS THAN ZERO
	BGTR	4$			;YES-DONE
	CMPB	#^A/9/,R7		;.GT.9
	BLSS	4$			;YES-DONE
	SUBB2	#^A/0/,R7
	CVTBL	R7,R7
	MULL2	R8,R7			;MUL TO PROPER D.P.
	ADDL2	R7,R9
	MULL2	#10,R8
3$:	SOBGTR	R10,2$
4$:	TSTL	R9			;WAS A NUMBER SPECIFIED
	BEQL	5$			;NO
	MOVL	R9,LINE_NUMBER		;YES-SET LINE NUMBER
	RET
5$:;	NO LINE NUMBER SPECIFIED-IF ZERO SET TO 1 ELSE LEAVE ALONE
	TSTL	LINE_NUMBER
	BNEQ	6$
	MOVL	#1,LINE_NUMBER
6$:	RET
	.PAGE
	.SUBTITLE	OUTPUT LINE PURE DATA
	.PSECT	PURE_DATA,NOEXE,SHR,RD,NOWRT,CON,GBL
PUT_ERROR:
	.ASCID	/INDEX-F-File Write Record Error/
TITLE1:	.ASCID	?VAX/VMS INDEX V1.9 ?                                           ;V1.9
TITLE2:	.ASCID	? PAGE ?                                                        ;**-1
TITLE3A:.ASCID	? SOURCE LISTING ?
TITLE3B:.ASCID	? CROSS REFERENCE ?
TITLE3C:.ASCID	? SUPER CROSS REFERENCE ?
TITLE3D:.ASCID	? ENTRY POINT CROSS REFERENCE ?
TITLE3E:.ASCID	? STATISTICS ?
TITLE3F:.ASCID	? OPTIONS ?
TITLE3G:.ASCID	? CALLING TREE ?
TITLE3H:.ASCID	? CALLED BY TREE ?
TITLE3I:.ASCID	? FLOW CHART ?                                                  ;V1.4
	.END
