Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-05 - 43,50337/14/t3.mac
There is 1 other file named t3.mac in the archive. Click here to see a list.
;<ENDERIN>T3.MAC.32,  5-Jan-77 14:02:15, Edit by ENDERIN
	SUBTTL	Terminate compilation
	SEARCH SIMMAC
	SALL

	CTITLE	T3

COMMENT ;

AUTHORS:	ELISABETH ALUND 
		OLOF BJORNER
		Lars Enderin (DEC-20 modifications) [225]

VERSION:	4 [1,6,12,22,104,162,204,225,246,260]

PURPOSES:	1.  To delete temporary files
		2.  To close output files	[162]
		3.  To type error messages on the TTY
		4.  To handle aborts from all three passes
		5.  To fetch next command line and switch to Pass 1
		    when appropriate.

CONTENTS:	SUBROUTINES:

;
INTERN	T3A	;FOR DELETION OF nnnATR.TMP
	EDIT(225)
TOPS10,<;[225]
INTERN	T3CHAR	;FOR FETCHING NEXT BYTE FROM COMMAND
>
INTERN	T3MOVE	;FOR MOVING COMMAND LINES FROM COMMAND BUFFER
INTERN	T3NAME	;FOR PACKING NEXT FILE SPECIFICATION PART IN SIXBIT
INTERN	T3E	;FOR CREATING STATISTICAL INFORMATION OF ERRORS
INTERN	T3I	;FOR DELETION OF IC2 and closing REL file
INTERN	T3L	;CORRESPONDING FOR LST-FILE
INTERN	T3T	;ROUTINE FOR ABORTS IN PASS 1 AND 2
INTERN	T3T3	;ROUTINE FOR ABORT IN PASS 3
INTERN	T3R	;Close REL file without superseding an old REL file
INTERN	T3REE	;HANDLE ^C REENTER
INTERN	T3X	;DELETE XRF.TMP
INTERN	T3	;Main routine

			EDIT(104)
	SEARCH SIMMC3	;[104]
	TWOSEG
	RELOC	400000
	MACINIT
	P3INIT	;[104]
	SYN	YPOLST,YPOLS3
;	EXTERNAL SUBROUTINES

	EXTERN	E3BD	;CONVERT FROM BIN TO ASCII
	EXTERN	E3DM	;SORT ZDM
	EXTERN	E3EM	;CREATE ERROR MESSAGE
	EXTERN	O3ERR	;READ ERROR TABLES INTO CORE
	EXTERN	O3WS	;WRITE LS3


	EXTERN	.JBERR	;ERROR COUNT
			EDIT(6)
	EXTERN	YBHREL	;[6] Buffer header for REL file
	EXTERN	YSWITCH	;WORD CONTAINING SWITCHES
	EXTERN	YSWCHA	;SIWTCHES CHANGED FROM DEFAULT
	EXTERN	YSWDEF	;DEFAULT VALUES OF SWITCHES
	EXTERN	YE3ERR	;;BUFFER FOR ERROR MESSAGE
	EXTERN	Y1LOWE
	EXTERN	Y3OPEN	;SWITCHES CONTAINING STATUS OF FILES
	EXTERN	Y3ENTRY	;[6] Entry point name for global class/proc
	EXTERN	YEXTS	;RENAME ARGUMENT REL AND LST FILE
	EXTERN	YESEM
	EXTERN	YWARCT	;NUMBER OF WARNINGS
	EXTERN	YERRCT	;NUMBER OF ERRORS
	EXTERN	Y3BUF	;BUFFER FOR INTERMEDIATE DATA
	EXTERN	Y3SWAP	;SWITCH AREA IN LOW SEGMENT
	EXTERN	YDMEND	;INDEX TO FIRST FREE ELEMENT IN ZDM
	EXTERN	YI1CB	;COMMAND LINE BUFFER
	EXTERN	YI1CBE	;END OF COMMAND LINE BUFFER
	EXTERN	YCBBH	;COMMAND BUFFER HEADER
	EXTERN	YCBUF	;COMMAND BUFFER


	X3BYTE==X10
	XT3P==X11
	XT3IND==X12
	SUBTTL	 T3, LOCAL MACROS

Comment*
	DELETE macro
	------------
	PURPOSE:
		DEBUG VERSION: CLOSE FILE
		PRODUCT VERSION: DELETE FILE
*

DEFINE	DELETE(FILE)<
	EXTERN	YEL'FILE
	IF
		SKIPN	YEL'FILE
		GOTO	FALSE
	THEN
	IFG QDEBUG,<
		CLOSE	QCH'FILE,
		STATZ	QCH'FILE,740K
		GOTO	[IOER	FILE
			ERRT	QT,Q.TER+5
			BRANCH	T3T3]
		>
	IFE QDEBUG,<
		SETZM	YEL'FILE
		RENAME	QCH'FILE,YEL'FILE
		GOTO	[IOER	FILE
			ERRT	QT,Q.TER+6
			BRANCH	T3T3]
		>
		SETOFF	YOP'FILE
		RELEASE	QCH'FILE,
	FI
>

DEFINE	IOER(FILE)<
	L	X1,[ASCIZ/FILE/]>

	;CLOSE FILE

				EDIT(162)
DEFINE	KLOSE(FILE,OPT)<
	CLOSE	QCH'FILE,OPT;;[162] Close option bits
	STATZ	QCH'FILE,740K
	GOTO	[IOER	FILE
		ERRT	QT,Q.TER+5
		BRANCH	T3T3]
	SETOFF	YOP'FILE
	RELEASE	QCH'FILE,
>

	;DELETE ALL TMP FILES IF IN DEBUG MODE, OTHERWISE CLOSE FILES

DEFINE	IRPDELETE(FILE)<
IRP FILE,<
IFE QDEBUG,<
	EXTERN	YEL'FILE
	IF
		IFOFF	YPO'FILE
		GOTO	FALSE
	THEN
		LOOKUP	QCH'FILE,YEL'FILE
		NOP	;NO MORE ERRORS
		SETOFF	YPO'FILE
	FI
	IF	IFOFF	YOP'FILE
		GOTO	FALSE
	THEN
		SETZM	YEL'FILE
		RENAME	QCH'FILE,YEL'FILE
		NOP
		SETOFF	YOP'FILE
		RELEASE	QCH'FILE,
	FI
	>
IFG QDEBUG,<
	IF
		IFON	YPO'FILE
		GOTO	FALSE
		IFOFF	YOP'FILE
		GOTO	FALSE
	THEN
		CLOSE	QCH'FILE,
		RELEASE	QCH'FILE,
	FI
	SETOFF	YPO'FILE
	SETOFF	YOP'FILE
	>
>
>

	;[162] NEWNAM macro not needed any more
	SUBTTL	LOCAL DATA AREAS


;NOTE THAT THE ORDER IS SIGNIFICANT

T3DEFA:	ASCII	/

DEFAULT SWITCHES USED
/
T3CHA:	ASCII	/

SWITCHES CHANGED FROM DEFAULT:

/
T3NO:	ASCII	/NO /
T3SWA:	ASCII	/CHECK OF ARRAY INDEX
/
T3SWD:	ASCII	/SYMBOL TABLE GENERATED FOR DEBUG
/
T3SWE:	ASCII	?EXTERNAL CLASS/PROCEDURE
?
T3SWI:	ASCII	/LINENUMBER TABLE GENERATED
/
T3SWQ:	ASCII	/CHECK OF QUALIFICATION
/
T3SWR:	ASCII	/RUNSWITCHES PRESENT
/
T3SWW:	ASCII	/WARNINGS GENERATED
/
T3SWS:	ASCII	/Non-standard search list
/	;[12]
	EDIT(12)
T3SEND:

T3SW:	;TABLE CONTAINING ADDRESS AND LENGTH OF TEXT FOR EACH SWITCH
	XWD	5*<T3SWD-T3SWA>,T3SWA
	XWD	5*<T3SWE-T3SWD>,T3SWD
	XWD	5*<T3SWI-T3SWE>,T3SWE
	XWD	5*<T3SWQ-T3SWI>,T3SWI
	XWD	5*<T3SWR-T3SWQ>,T3SWQ
	XWD	5*<T3SWW-T3SWR>,T3SWR
	XWD	5*<T3SWS-T3SWW>,T3SWW
	XWD	5*<T3SEND-T3SWS>,T3SWS	;[12]
T3SWCH:
	;TABLE  CONTAINING SWITCHES
	ASCII	/   A /
	ASCII	/   D /
	ASCII	/   E /
	ASCII	/   I /
	ASCII	/   Q /
	ASCII	/   R /
	ASCII	/   W /
	ASCII	/   S /	;[12]
	SUBTTL	T3A

	EDIT(10)
COMMENT;[10] NEW ROUTINE

PURPOSE:	DELETE nnnATR.TMP

ENTRY:		T3A

NORMAL EXIT:	RETURN

ERROR EXIT:	BRANCH	T3T3

CALL FORMAT:	EXEC	T3A

;



T3A:	DELETE	ATR
	RETURN
	SUBTTL	T3CHAR	GET NEXT BYTE

	EDIT(225)
TOPS10,<;[225]

COMMENT ;

PURPOSE:		TO FETCH NEXT BYTE FROM A  BUFFER AND 
			RETURN IMMEDIATELY IF IT IS NOT A DIGIT OR A LETTER
			LOWER CASE LETTERS ARE CONVERTED TO UPPER CASE.
			TAB IS CONVERTED TO SPACE.
ENTRY:			T3CHAR
INPUT ARGUMENT:		BYTE POINTER IN XT3P
OUTPUT ARGUMENT:	BYTE IN X3BYTE
			SKIP RETURN IF X3BYTE CONTAINS A LETTER OR A DIGIT
NORMAL EXIT:		RETURN
ERROR EXIT:		-
CALL FORMAT:		EXEC T3CHAR
USED ROUTINES:		-
USED REGISTER:	X3BYTE
ERROR MESSAGE:	-
;

T3CHAR:	PROC	
	ILDB 	X3BYTE,XT3P	;GET BYTE
	CAIE	X3BYTE,"%"
	CAIN	X3BYTE,"$"
	GOTO	L9		;ACCEPT DOLLAR AND PERCENT
	CAIN	X3BYTE,QHT	;IF TAB THEN
	LI	X3BYTE," "	;CONVERT IT TO SPACE
	CAIGE	X3BYTE,"0"
	RETURN			;NOT DIGIT OR LETTER!
	CAIG	X3BYTE,"9"
	GOTO	L9		;IF DIGIT
	CAIGE	X3BYTE,"A"
	RETURN
	CAIG	X3BYTE,"Z"
	GOTO	L9		;IF UPPER CASE LETTER
	CAIL	X3BYTE,"a"
	CAILE	X3BYTE,"z"
	RETURN
	SUBI	X3BYTE,40	;CONVERT TO UPPER CASE IF LOWER CASE
L9():!
	AOS	(XPDP)		;SKIP RETURN IF LETTER OR DIGIT
	RETURN
	EPROC
	>;[225]
	SUBTTL	T3MOVE

	EDIT(225)

TOPS20,<T3MOVE==:I1MOVE##>;[225]
TOPS10,<;[225]
COMMENT ;
PURPOSE:		TO MOVE NEXT COMMAND LINE FROM COMMAND BUFFER (YCBUF)
			TO COMMAND LINE BUFFER (YI1CB). THIS SUBROUTINE IS
			CALLED IN COMPIL MODE ONLY.
INPUT ARGUMENTS:	BYTE POINTER AND BYTE COUNTER SET IN
			COMMAND BUFFER HEADER, YCBBH.
OUTPUT ARGUMENTS:	NEXT COMMAND LINE IN YI1CB.
			YSWCM TRUE IF MORE COMMAND LINES IN BUFFER.
NORMAL EXIT:		RETURN, OR, IF END OF COMMAND FILE EXIT TO MONITOR
ERROR EXIT:		GOTO T3AB IF READ ERROR OR TOO LONG COMMAND LINE
CALL FORMAT:		EXEC T3MOVE
USED REGISTERS:		X0 BYTE TO BE MOVED
			X1 BYTE POINTER TO YI1CB
			X2 SCRATCH
USED ROUTINES:		T3GC, T3PC AND T3RCOM.
			THESE THREE SUBROUTINES ARE DEFINED LOCALLY
			WITHIN T3MOVE. T3PC IS ALSO USED BY T3CM.
ERROR MESSAGES		?Read error on command file
			?Command line exceeds 135 characters
;

T3MOVE:
	EXEC	T3GC
	CAIE	X0,QCR
	CAIN	X0,QLF
	GOTO	T3MOVE		;IGNORE LEADING CR AND LF IF ANY
	IF	;NULL HERE
		JUMPN	X0,FALSE
	THEN	;END OF COMMAND FILE IF TMPCOR!
		IFOFF	YSWCOM
		EXIT			;DIRECTLY IF CORE FILE
		GOTO	T3MOVE
	FI
	L	X1,[POINT 7,YI1CB]
	EXEC	T3PC
	RETURN			;IF BUFFER OVERFLOW
	LOOP	;AND MOVE BYTES UNTIL LINE FEED
		EXEC	T3GC
		JUMPE	X0,TRUE		;IGNORE NULLS!
		EXEC	T3PC
		RETURN			;IF BUFFER OVERFLOW
	AS	CAIE	X0,QLF
		GOTO	TRUE
	SA
	AOS	(XPDP)
	RETURN

T3GC:
	SOSG	YCBBH+2		;DECREASE BYTE COUNTER
	EXEC	T3RCOM		;READ NEXT BUFFER IF CURRENT IS EMPTY
	ILDB	X0,YCBBH+1	;GET NEXT BYTE
	RETURN
>
	EDIT(225)
TOPS20,<T3PC==:I1PC##>;[225]
TOPS10,<;[225]
T3PC:
	HRRZ	X2,X1
	SUBI	X2,YI1CBE
	IF	;END OF COMMAND LINE BUFFER
		JUMPL	X2,FALSE
	THEN	;ERROR
		OUTSTR	[ASCIZ/
?Command line exceeds 135 characters/]
		IFOFF	YI1CCL
		CLRBFI			;CLEAR BUFFER IN RUN MODE
		SETOFF	YI1CCL		;SWITCH TO RUN MODE
		RETURN
	FI
	IDPB	X0,X1		;STORE BYTE IN COMMAND LINE BUFFER
	AOS	(XPDP)
	RETURN

T3RCOM:
	IN	QCHCOM,YCBUF+1
	RETURN			;IF READ OK
	IF	;END OF FILE
		STATZ	QCHCOM,740000
		GOTO	FALSE
	THEN	;DELETE COMMAND FILE
		LI	X1,0
		RENAME	QCHCOM,X1
		NOP
		EXIT
	FI
	OUTSTR	[ASCIZ/
?Read error on command file/]
	EXIT
>;[225]
	SUBTTL	T3NAME

	EDIT(225)
TOPS20,<T3NAME==:I1NAME##>;[225]
TOPS10,<;[225]
COMMENT ;
PURPOSE:		TO PACK NEXT SYMBOLIC NAME IN SIXBIT IN X0.
			DELIMITER IS ANY NON-DIGIT AND NON-LETTER BYTE.
			NAMES LONGER THAN 6 BYTES ARE TRUNCATED WITHOUT WARNING.
			LEADING SPACES ARE IGNORED.
ENTRY:			T3NAME
INPUT ARGUMENT:		BYTE POINTER IN XT3P
OUTPUT ARGUMENT:	DELIMITER IN X3BYTE
			NAME IN X0
NORMAL EXIT:		RETURN
ERROR EXIT:		-
CALL FORMAT:		EXEC T3NAME
USED ROUTINES:		T3CHAR
USED REGISTERS:		X0	RETURN ARGUMENT
			X3BYTE	DELIMITER AFTER NAME
			XT3IND	POINTER TO X0
ERROR MESSAGE:		-
;

T3NAME:
	SETZ
	MOVSI	XT3IND,(POINT 6)	;Pointer to X0
	WHILE	; LETTER OR DIGIT
		EXEC	T3CHAR
		 GOTO	FALSE		
	DO	SUBI	X3BYTE,40	;CONVERT TO SIXBIT
		TRNN	77		;SKIP IF 6 BYTES ALREADY
		IDPB	X3BYTE,XT3IND	;STORE IN X0
	OD
	CAIN	X3BYTE," "
	 JUMPE	X0,T3NAME		;SKIP LEADING SPACES
	RETURN
>;[225]
	SUBTTL	T3E


COMMENT ;
PURPOSE:		Output to TTY and LS3 if relevant:
			- Information on non-default switch settings
			- Report if a new ATR file was generated
			- Error statistics
			- Report if no new REL file was created
			Update job error count (.JBERR)
ENTRY:			T3E
INPUT ARGUMENT:		YSWITCH	SWITCHES
			YSWCHA COMPILER SWITCHES CHANGED FROM DEFAULT
			YSWDEF	DEFAULT VALUE OF COMPILER SWITCHES
	
NORMAL EXIT		RETURN
ERROR EXIT:		-
OUTPUT ARGUMENTS:	INFORMATION ON TTY AND IN SOURCE LIST
			.JBERR
USED SUBROUTINES:	O3WS,E3BD
CALL FORMAT:		EXEC	T3E
;





T3E:
	CLEARO
	;OUTPUT INFORMATION ON SWITCHES USED
	IF	;List is generated
		IFOFFA	YE3LST
		GOTO	FALSE
	THEN
		IF	;No switches changed
			SKIPE	X4,YSWCHA
			GOTO	FALSE
		THEN	;DEFAULT SWITCHES
			LI	X1,T3DEFA
			EXEC	O3WS,<[XWD	5*<T3CHA-T3DEFA>]>
		ELSE	;SOME SWITCH(ES) CHANGED FROM DEFAULT VALUE
			LI	X1,T3CHA
			EXEC	O3WS,<[XWD	5*<T3NO-T3CHA>]>
			LI	X3,0
						EDIT(12)
			MOVSI	X2,-QNSWCH	;[12]
			LOOP
				;CHECK EACH SWITCH FOR CHANGE
				LSHC	X3,1
				IF
					JUMPE	X3,FALSE
				THEN
					;THIS SWITCH CHANGED
					;GET CURRENT SWITCH
					L	X6,T3SWCH(X2)
					LI	X0,5
					TRZ	X3,1
					;GET DEFAULT STATUS
					L	X1,YSWDEF
					LSH	X1,(X2)
					IF	;Switch is on
						TLNN	X1,1B18
						GOTO	FALSE
					THEN
						;DEFAULT IS ON CHANGED TO OFF OUTPUT NO
						IOR	X6,[ASCIZ	/  -/]
						L	X7,T3NO
						ADDI	X0,3
					FI
					STD	X6,Y3BUF
					LI	X1,Y3BUF
					EXEC	O3WS,<X0>
					HRRZ	X1,T3SW(X2)
					HLRZ	X0,T3SW(X2)
					EXEC	O3WS,<X0>
				FI
			AS
				JUMPE	X4,FALSE
				AOBJN	X2,TRUE
			SA
		FI
			edit(22)
		IF	;A new ATR file was created
			IFONA	NEWATR	;[22]
			IFOFFA	OLDATR
			GOTO	FALSE
		THEN	;Put a message in the listing
			LI	X1,T3ATR
			LI	X0,5*<T3ATRE-T3ATR>	;[22]
			IFONA	NEWUNR			;[22]
			LI	X0,5*<T3ATRF-T3ATR>	;[22]
			EXEC	O3WS,<X0>		;[22]
	FI	FI
	IF	;[22] New ATR generated
		IFONA	NEWATR	;[22]
		IFOFFA	OLDATR
		GOTO	FALSE
	THEN	;Type message on TTY
		OUTSTR	T3ATR
		IFONA	NEWUNR
		OUTSTR	T3ATRE
	FI	;[22]
	IF
		SKIPN	YWARCT
		SKIPE	YDMEND
		GOTO	FALSE				;RETURN AT ONCE IF NO ERRORS
		IFON	YSWTRM
		GOTO	FALSE
	THEN
		;NO ERRORS
		IF
			IFOFFA	YE3LST
			GOTO	FALSE
		THEN	;LIST WANTED 
			LI	X1,T3NE
			EXEC	O3WS,<[XWD 5*<T3EI-T3NE>]>
		FI
		IFOFF	YI1CCL
		;NO OUTPUT IF COMMAND FILE
		OUTSTR	T3NE
	ELSE		;OUTPUT STAT. INF OF ERRORS
		IF
			IFOFFA	YE3LST
			GOTO	FALSE
		THEN
			IF
				IFOFFA	NOREL
				GOTO	FALSE
			THEN
				;NO NEW REL FILE
				LI	X1,T3REL
				EXEC	O3WS,<[XWD	5*<T3RELE-T3REL>]>
			FI
			LI	X1,T3EI
			EXEC	O3WS,<[^D20]>
		FI
		IFONA	NOREL
		OUTSTR	T3REL
		OUTSTR	T3EI
		IF	SKIPN	X6,YWARCT
			GOTO	FALSE
		THEN	;OUTPUT NUMBER OF WARNINGS
			L	X0,YWARCT
			HRLI	X2,T3MW
			EXEC	T3E1
		FI
		IF	SKIPN	YERRCT
			GOTO	FALSE
		THEN	;OUTPUT NUMBER OF ERRORS
			L	X0,YERRCT
			AOS	.JBERR
			HRLI	X2,T3ME
			EXEC	T3E1
			ADD	X6,YERRCT
		FI
		IF
			IFOFF	YSWTRM
			GOTO	FALSE
		THEN	;TERMINATION ERROR HAS OCCURRED
			OUTSTR	T3MT
			IF
				IFOFFA	YE3LST
				GOTO	FALSE
			THEN	;OUTPUT MESSAGE ON LIST FILE
				LI	X1,T3MT
				EXEC	O3WS,<[^D21]>
			FI
			AOS	.JBERR
		FI
		;OUTPUT MESSAGE ONLY 50 ERRORS OUTPUT IF RELEVANT
		IF
			CAIG	X6,^D50
			GOTO	FALSE
		THEN
			OUTSTR	T3MERR
			IF
				IFOFFA	YE3LST
				GOTO	FALSE
			THEN
				LI	X1,T3MERR
				EXEC	O3WS,<[XWD	5*<T3ATR-T3MERR>]> ;[1]
							;OUTPUT T3MERR ON LIST
			FI
		FI
	FI
	;INDICATE STATISTICAL INFORMATION OUTPUT
	SETONA	Y3STAT
	RETURN

T3E1:	EXEC	E3BD				;CREATE LINE CONTAINING NO OF ERRORS
	ST	X1,Y3BUF
	HRRI	X2,Y3BUF+1
	BLT	X2,Y3BUF+4
	IF
		IFOFFA	YE3LST
		GOTO	FALSE
	THEN	LI	X1,Y3BUF
		EXEC	O3WS,<[^D23]>			;OUTPUT TO LST
	
	FI
	OUTSTR	Y3BUF
	RETURN

	;SIGNIFICANT ORDER BETWEEN TABLES
T3NE:	ASCIZ /
NO ERRORS DETECTED
/
T3EI:	ASCIZ /
ERRORS DETECTED:
/
T3ME:	ASCIZ	/ TYPE E MESSAGES
/
T3MW:	ASCIZ	/ TYPE W MESSAGES
/
T3MT:	ASCIZ	/?TERMINATION ERROR
/

T3REL:	ASCIZ	/
NO NEW REL FILE GENERATED
/
T3RELE:
T3MERR:	ASCIZ	/
	SOME ERROR OR WARNING MESSAGES SUPPRESSED
/
T3ATR:	ASCIZ	/
NEW ATR FILE GENERATED
/	;[22]
T3ATRE:	ASCIZ	/RECOMPILE DEPENDENT PROGRAMS
/
T3ATRF:	;[22]
	edit(22)
	SUBTTL	T3I

	edit(162)

COMMENT ;[162]
PURPOSE:		To close REL file, delete IC2
ENTRY:			T3I, alternatively T3ID [204]
Input:			-
Output:			-
NORMAL EXIT:		RETURN
ERROR EXIT:		BRANCH T3T3
CALL FORMAT:		EXEC T3I
USED ROUTINES:		-
;

T3I:	PROC
	SETOFA	NOREL	;Show REL file was created
	CLOSE	QCHREL,	;[162] Just close now
	STATZ	QCHREL,740K
			edit(225)
	  GOTO	L8	;[225] On error
				edit(6)
	DEFINE E<YEXTS+4>	;[6] Enter block
	TOPS10,<;[225]
	;The following pertains to edit no [6]
	L	X1,E+3		;[6] [162] PPN
	L	X3,Y3ENTRY	;[6]
	IF	;[6] Entry name still to be changed
		JUMPE	X3,FALSE
	THEN	;Must look up file again and change 1st block
		SETSTS	QCHREL,14+1B30	;Synchronous binary mode
		LOOKUP	QCHREL,E
		GOTO	L9	;[225] Lookup error
		;Prepare for ENTER
		ST	X1,E+3		;Restore ppn
		ENTER	QCHREL,E
		GOTO	L9	;On error
		USETI	QCHREL,1
		L	X2,YBHREL	;Current buffer
		IN	QCHREL,(X2)
		SKIPA
		GOTO	L9		;On error
		ST	X3,4(X2)	;Change name of entry point
		USETO	QCHREL,1	;Find first block for output
		OUT	QCHREL,(X2)	;Replace first block
		SKIPA			;If ok
		GOTO	L9		;On error
	FI
	>;[225]
	RELEASE	QCHREL,
		edit(225)
	TOPS20,<;[225]
	SKIPN	Y3ENTRY
	GOTO	T3ID
	JF==-3		;JFN OFFSET (SEE LOWSEG)
	E1==Y3LKU##+8
	LD	E
	STD	E1
	LD	E+2
	STD	E1+2
	LI	X1,E1
	HRLI	X1,(GJ%OLD)
	EXEC	O1JFN##
	GOTO	L9
	HRRZ	X1,JF+E1	;JFN
	L	X2,[^D36B5+OF%RD+OF%WR+OF%HER+OF%NWT+OF%PLN]
	OPENF
	GOTO	L9
	L	X2,Y3ENTRY
	LI	X3,2	;Offset of entry name in REL file
	ROUT
	ERJMP	L9
	LI	X1,(X1)	;JFN, no special options for CLOSF
	CLOSF
	GOTO	L9
	>;[225] End of DEC-20 variant
	PURGE	E	;[6,225]
	SETOFF	YOPREL
	edit(204)
T3ID:	;[204] Entry for deleting IC2 only
	DELETE	IC2
	RETURN

L8():!	IOER	REL	;[225] Close error on REL file
	ERRT	QT,Q.TER+5
	BRANCH	T3T3

L9():!	IOER	REL	;[225] Output error on REL file
	ERRT	QT,Q.TER+6
	BRANCH	T3T3
	EPROC
	SUBTTL	T3L

COMMENT ;
PURPOSE:		TO DELETE LS1, CLOSE LST FILE
			 AND RELEASE THE SOURCE CODE FILE, IF LIST FILE IS GENERATED
ENTRY:			T3L
INPUT ARGUMENT:		-
OUTPUT ARGUMENT:	-
NORMAL EXIT:		RETURN
ERROR EXIT:		BRANCH T3T3
CALL FORMAT:		EXEC T3L
USED ROUTINES:		-
ERROR MESSAGE:		YT3E2
;

T3L:
	DELETE	LS1
	;RETURN IF NO LIST FILE IS GENERATED
	IFOFF	YOPLS3
	RETURN
			edit(162)
	KLOSE	SRC,0	;[162]
	;[162] Close and release LST channel
			edit(6)
	RELEASE	QCHLS3,	;[6]
	SETOFF	YOPLS3	;[6]
	RETURN		;[6]
	SUBTTL	T3R


;PURPOSE:		Close REL file without creating new REL file
;			Delete IC2 also [204]
;ENTRY:			T3R
;INPUT ARGUMENTS:	-
;OUTPUT ARGUMENTS:	-
;NORMAL EXIT:		RETURN
;ERROR EXIT:		-
;CALL FORMAT:		EXEC	T3R


T3R:
				edit(204)
	EXEC	T3ID		;[204] Delete IC2
				edit(162)
	KLOSE	(REL,40)	;[162] Inhibit supersede of old file
	RETURN
	SUBTTL	TERMINATION ROUTINES


COMMENT ;
PURPOSE:		TO CLOSE ALL OPENED FILES AND TERMINATE COMPILATION
			UPDATE .JBERR
			TAKE CARE OF ^C REENTER
ENTRY:			T3T	WHEN TERMINATION ERROR IN PASS 1 OR 2
			T3T3	TERMINATION ERROR IN PASS 3
			T3REE	^C REENTER
INPUT ARGUMENT:		SWITCH-ARRAY IN Y3OPEN DENOTING OPENED FILES
			YDMEND=0 IF ^C REENTER
OUTPUT ARGUMENT:	-
NORMAL EXIT:		TO MONITOR WITH EXIT
ERROR EXIT:		-
CALL FORMAT:		BRANCH T3T	RESP	BRANCH T3T3 
USED ROUTINES:		I3E,O3ERR,O3TR,O3WT,E3EM,T3E,E3DM
;


T3T3:	SETZM	YESEM
T3T:
	AOS	.JBERR

	L	X1,Y3OPEN
	;EXIT IF MORE THAN ONE TERMINATION ERROR
	IFONA	Y3TERM
	 GOTO	[OUTSTR	[ASCIZ/
SIM561 T ?Unrecoverable errors
/]
		BRANCH	T3]
T3REE:
	edit(162)
	IRPDELETE<LS1,IC1,DF1,IC2,ZSE,XRF,ATR>	;[162] Do not include REL, LST
	IF
		IFOFF	YOPSRC
		GOTO	FALSE
	THEN
		CLOSE	QCHSRC,
		SETOFF	YOPSRC
		RELEASE	QCHSRC,
	FI
	IF
		IFOFF	YOPEXT
		GOTO	FALSE
	THEN
		CLOSE	QCHEXT,
		SETOFF	YOPEXT
		RELEASE	QCHEXT,
	FI
	SETONA	Y3TERM
	IF	SKIPN	YDMEND
		GOTO	FALSE

	THEN	;OUTPUT ERRORS ON TTY
		IF
			IFONA	Y3ERR
			GOTO	FALSE
		THEN
		;NO ERROR TABLES IN CORE
			EXEC	O3ERR		;READ TABLES FOR ERROR HANDLING INTO CORE
			EXEC	E3DM
			LI	XDM2,1	;INDEX TO ZDM
		FI
		WHILE	;ERRORS IN ZDM
			CAML	XDM2,YDMEND
			GOTO	FALSE
		DO	;OUTUT ONE ERROR
			EXEC	E3EM
			OUTSTR	YE3ERR
			ADDI	XDM2,3
		OD
		IF
			IFONA	Y3STAT
			GOTO	FALSE
		THEN
			SETOFA	YE3LST
			EXEC	T3E
		ELSE
			OUTSTR	T3MT
		FI
	ELSE
	;ERROR ALREADY WRITTEN IN PASS 1
		OUTSTR	T3MT
	FI
	BRANCH	T3
T3X:
		;DELETE XRF.TMP
	DELETE	XRF
	RETURN
	SUBTTL	T3 MAIN ROUTINE

COMMENT /
PURPOSES:		TO READ NEXT COMMAND FROM TTY OR IF IN COMPIL MODE
			TO SEARCH NEXT COMMAND LINE FOR NEXT CUSP
			DEFINITION (DELIMITER "!") AND IN THAT
			CASE RUN NEXT CUSP.
			ALGORITHM:
			BEGIN	IF RUN MODE THEN READ NEXT COMMAND FROM TTY
				ELSE
				BEGIN	IF NOT MORE COMMANDS THEN
					BEGIN	DELETE COMMAND FILE;
						EXIT
					END;
					T3NAME;
					IF NOT "!" THEN T3NAME;
					IF "!" THEN RUN NEXT CUSP;
				END;
				SWAP TO PASS 1;
			END
ENTRY:			T3
INPUT ARGUMENTS:	-
OUTPUT ARGUMENTS:	-
NORMAL EXIT:		TO MONITOR (EXIT UUO) ON END OF COMMAND FILE,
			BRANCH TO PASS 1 OTHERWISE.
ERROR EXIT:		TO MONITOR (EXIT UUO) IF GETSEG FAILED
USED ROUTINES:		T3NAME,T3PC.
USED REGISTERS:		X0,X1,X2,X3,X4,X5,X6,X10,X11,X12
ERROR MESSAGES:		-
/

	OPDEF	PUTCHAR	[XEC	T3PC]
	edit(246)
TOPS20,<OPDEF TTYCOMMAND [XEC I1TTYC##]>;[246]
TOPS10,<OPDEF TTYCOMMAND [XEC T3TTYC]>	;[246]

T3:	PROC
	HLLZS	.JBREN## ;DO NOT ALLOW REENTER WHEN READING FILE SPECIFICATIONS
	IF	;RUN MODE
		IFON	YI1CCL
		GOTO	FALSE
	THEN	;READ IN NEXT COMMAND FROM TTY
L1():!		SETOFF	YI1CCL		;[246]
		TTYCOMMAND		;[246]
		 GOTO	L1		;IF NOT SATISFACTORY
	ELSE	;SEE IF NEXT LINE CONTAINS RUN REQUEST
		EXEC	T3MOVE		;MOVE NEXT COMMAND LINE
		 GOTO	L1		;from TTY on ERROR
	FI	;[246]
TOPS10,<;[246] Let Pass 1 handle the command line
	L	XT3P,[POINT 7,YI1CB]
	EXEC	T3NAME
	SETZB	X2,X3
	SETZB	X4,X5
	SETZB	X6,X7		;SET UP RUN UUO ARGUMENTS
	IF	;DELIMITER IS "!"
		CAIE	X3BYTE,"!"
		GOTO	FALSE
L2():!	THEN	ST	X0,X3		;CUSP NAME IN X3
		IF	;COMMAND FILE
			IFOFF	YSWCOM
			GOTO	FALSE
		THEN	;TIME TO DELETE IT!
			LI	X1,0
			RENAME	QCHCOM,X1
			NOP
		FI
COMMENT *	LINK 10 WILL STOP THE ATTEMPT TO EXECUTE A JOB CONTAINING ANY ERRORS.
		THE FOLLOWING CODE MAKES IT POSSIBLE TO PREVENT LOADING AND EXECUTION
		WITHOUT ANY CALL OF NEW CUSPS
			IF	;ERROR(S) IN PREV. COMPILATION(S)
				SKIPN	.JBERR
				GOTO	FALSE
			THEN	;SKIP CALL OF NEXT CUSP
				OUTSTR	[ASCIZ/
?LOADING AND EXECUTION DELETED/]
				EXIT
			FI
	*

		SKIPN	X0,X2
		MOVSI	X2,'SYS'	;DEFAULT DEVICE
		L	X1,[XWD 1,X2]	;NEXT CUSP +1, ARG IN X2
		RUN	X1,
		HALT
	FI
	ST	X0,X2		;SAVE POSSIBLE DEVICE
	EXEC	T3NAME
	CAIN	X3BYTE,"!"
	GOTO	L2
>;[246]
	;NOW SWAP TO PASS 1
	edit(225)
TOPS10,<;[225]
	L	X3,[XWD 1,Y1LOWE]
	IFG QTRACE,<EXTERN	YTRPAS
			IFON	YTRSW
			HRRI	X3,0
			>
		edit(260)
	SWAPPA	(SIMULA,S1,-1,QP1PPN)
>
TOPS20,<BRANCH 400010>;[225,260]
	EPROC
	SUBTTL	T3TTYC [225] Read command from TTY

	edit(225)

Comment;
Purpose:	Input command from user TTY.
Input:		None
Output:		Command line in YI1CB
Normal exit:	Skip return
Alternate exit:	EXIT to monitor level if last command was finished by ^Z
Error exit:	Non-skip return
Used ac's:	X0,X1,X2
Calls:		PUTCHAR (T3PC)
;

T3TTYC:	PROC
	CLEARO		;CLEAR CONTROL-O
			edit(220)
	IFON	YSWCZ	;[220]
	EXIT		;[220]
	OUTSTR	[ASCIZ/
*/]
	L	X1,[POINT 7,YI1CB]
	LOOP	;UNTIL CR, ^Z OR ALTMODE
		INCHWL	X0
		CAIN	X0,033		;IF ALTMODE
		LI	X0,QCR		;THEN SUBSTITUTE CR
			edit(220)
		IF	;[220] ^Z
			CAIE	X0,"Z"-"A"+1
			GOTO	FALSE
		THEN	;SET ^Z FLAG, RETURN <CR>
			SETON	YSWCZ
			LI	X0,QCR
		FI
		IF	;NOT LINE FEED
			CAIN	X0,QLF		;IGNORE LINE FEED
			GOTO	FALSE
		THEN	;STORE BYTE IN COMMAND LINE BUFFER
			PUTCHAR
			GOTO	L9		;IF OVERFLOW
		FI
	AS	CAIE	X0,QCR
		GOTO	TRUE
	SA
	LI	X0,QLF
	PUTCHAR
	GOTO	L9		;IF OVERFLOW
L8():!	AOS(XPDP)
L9():!	RETURN
	EPROC

	LIT
	END