Google
 

Trailing-Edge - PDP-10 Archives - bb-y390o-bm_tops20_v41_atpch_20 - autopatch/cref.x20
There are no other files named cref.x20 in the archive.
	TITLE	CREF %53C(101) CROSS REFERENCE PROGRAM
	SUBTTL	BOWERING/RPG/PMH/NGP/TNH/TWE/HPW/ASM/RDH/ILG/JNG/BPK/MS	/JEH 22-AUG-85


;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1974,1975,1976,1977,1978,1979,1980,1984,1985,1986. ALL RIGHTS RESERVED.
;
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR ANY  OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF THE  SOFTWARE  IS  HEREBY
;TRANSFERRED.
;
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT  NOTICE
;AND  SHOULD  NOT  BE  CONSTRUED  AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY  OF  ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.



;THE VERSION OF CREF

VCREF==53	;MAJOR CREF VERSION NUMBER
VWHO==0		;WHO MADE EDIT
VMINOR==3	;MINOR VERSION NUMBER
VEDIT==101	;EDIT NUMBER

INTERNAL .JBVER
LOC <.JBVER==137>
<CRFVER==<BYTE (3) VWHO (9) VCREF (6) VMINOR (18) VEDIT>>
IFDEF .MCRV.,<
	.VERSION CRFVER
>

	SEARCH	UUOSYM


.REQUEST	REL:HELPER
	SUBTTL	REVISION HISTORY

;17	-----	MODIFY FOR FORTRAN-10 VERSION 2
;20	-----	MODIFY THE DEC VERSION FOR FULL FAIL FEATURES  REG 5/18/74
;21	-----	MODIFY FOR (ALGOL) LONG SYMBOLS   DGS 3/13/75
;22	16016	CHECK SEQUENCE OF LINE NUMBERS  ILG 4/18/75
;23	13344	ALLOW INPUT BUFFERS TO BE BIGGER THAN 200 WORDS ILG 11/8/74
;24	16636	FIX EOF <CRLF> PROBLEM  SER 9/12/75
;25	16859	CHANGED EDIT 22 TO ALLOW MULTI-STATEMENT LINES  SER 9/19/75
;26	17543	CHANGED EDIT 22 TO ALLOW MULTI-PROGRAM INPUT FILES  EHM 10/28/75
;27	17596	FAIL FILES SKIP EDIT 21 TEST FOR LONG(ALGOL) SYMBOLS EHM 11/11/75
;30	-----	GENERAL COSMETIC EDITS (MAKE LISTING NEATER)	04-APR-76
;31	-----	GET RID OF .LOW FILE FROM TENEX GARBAGE		04-APR-76
;32	-----	ADD SFD CAPABILITY				04-APR-76
;33	-----	ADD COMMAND FILE CAPABILITY (@CREF.CCL, ETC)	05-APR-76
;34	-----	PUT ERROR MESSAGES IN UPPER/LOWER CASE		05-APR-76
;35	-----	CHANGE OVER TO "=" FROM "_" (NETWORK SYNTAX)	06-APR-76
;36	-----	CLEAN UP COMMAND HANDLING - OLD ALTMODES, ETC.	06-APR-76
;37	-----	TEACH CREF ABOUT COMMENTS (";") AND CONT ("-")	06-APR-76
;40	-----	TEACH CREF ABOUT /MESSAGE:(PREFIX,FIRST)	06-APR-76
;41	-----	CALL NON-BREAK CONTROL CHAR .LT. <LF> SYN ERROR	07-APR-76
;42	-----	ADD "?CRFUKS UNKNOWN SWITCH"			08-APR-76
;43	-----	DO RESCAN ON CCL ENTRY FOR ".CREF V=V/O/P" ETC.	08_APR-76
;44	-----	ADD DSK:SWITCH.INI SUPPORT			08-APR-76
;45	-----	PROBLEM WITH ".CREF A=B/R" TYPE COMMAND		08-APR-76
;46	-----	[33] BROKEN BY MOVING AROUND ERROR ROUTINES	02-MAY-76
;47	-----	READ SWITCH.INI FROM LOGGED-IN PPN (SCAN'S WAY)	02-MAY-76
;50	-----	DELETE ALL FILES IF MULTIPLE INPUT		05-MAY-76
;51	-----	MAKE ".CREF/H" EXIT, MORE STRINGENT SCANNING	05-MAY-76
;52	18277	ADDRESS CHECK ON FORTRAN MULTI-INPUT PROGS	06-MAY-76
;53	-----	[50] OVERZEALOUS, DELETE ONLY EXT OF .CRF, .LST 08-DEC-76

;START OF VERSION 53A
;54	22405	ALLOW DIFFERENTIAL LINE NUMBERS TO BE NEGATIVE, SO NON-
;		MONOTONIC LINE NUMBERS WON'T BOTHER CREF. THIS REMOVES
;		EDITS 22, 25, 26.
;55	-----	DON'T EAT TYPE-AHEAD IF NOTHING RETURNED FROM RESCAN.
;56	-----	FIX CREF'ING OF FAIL OUTPUT - BROKEN BY EDIT 22.
;57	-----	DON'T TRY TO PUT LISTING CREATION DATE IN THE FUTURE.
;60	-----	UPDATE COPYRIGHT DATE, AND RELEASE AS CREF %53A(60).
;61	26783	A NULL LINE NO LONGER PRODUCES AN ERROR MESSAGE	08-MAR-79
;62	26662	CREFFED LONG FORTRAN INSTRUCTIONS NO LONGER
;		CONTAIN GARBAGE					19-MAR-79
;63	-----	ONE UNDERBAR ERROR MESSAGE PER COMMAND LINE
;		AND NO LONGER CAUSED BY SWITCH.INI		19-MAR-79
;64	-----	ADDITION TO EDIT 61 FOR DEC-20'S		05-JUL-79
;65	28017	CREF ONLY SORTS FIRST SIX CHARACTERS OF LONG 
;		SYMBOL NAMES.					06-JUL-79
;66	28018	CREF LOOPS INFINITELY WHEN HANDLING SYMBOLS
;		WITH LEADING SPACES.  DISALLOW SPACES IN 
;		SYMBOLS (REMOVE THEM).  ALSO FIX EDIT 62.	10-JUL-79
;67	27990	CREF USES EXCESS CRLFS WHEN CREFFING 
;		LONG SYMBOLS.					12-JUL-79
;70	28408	CHANGE LOWERCASE SYMBOLS TO UPPERCASE BEFORE
;		CONVERTING TO SIXBIT.				13-JULY-79
;71	28409	IF A COMMENT LINE PRECEEDS A CREF LINE IN
;		SWITCH.INI, THE CREF LINE WILL NOT BE READ.	13-JULY-79
;72	-----	ALGOL SHOULD NOT PRINT END BLOCK NAME 'E----1'
;		AS PROGRAM NAME WHILE PRINTING NESTED-TABLE.	11-AUG-80
;
;*******     START OF VERSION 53B     *******
;
;73	32794	EXTEND EDIT 70 TO WORK FOR LONG SYMBOLS AS WELL.
;		10-AUG-82
;
;74	32942	INCREASE ADDRESS OF HISEG TO 560K TO ALLOW CREF
;		TO HANDLE LARGER PROGRAMS	14-SEP-82
;
;75	DEVEL	MODIFY TO USE LARGE BUFFERS FOR 7.02
;		03-SEP-82
;
;76	33145	FIX /T SWITCH ON INPUT FILE SPECS - CAUSES
;		?IO TO UNASSIGNED CHANNEL	12-NOV-82
;
;77	None.	BAH	2-Oct-84
;	Update copyrights.
;
;100	None	COPY .RBVER TO OUTPUT FILE
;
;101	None.	LEO	22-AUG-85
;	Do Copyrights.
;

	SUBTTL	GLOBAL, ACCUMULATOR, AND OTHER DEFINITIONS

;EXTERNAL AND INTERNAL DECLARATIONS

EXTERNAL	.JBFF,	.JBREL
INTERNAL	CREF



;ACCUMULATOR DEFINITIONS

AC0=0			;THIS HAD BETTER ALWAYS BE ZERO!
TEMP=1
TEMP1=2
WPL=3			;CONTAINS COUNT OF HOW MANY REFERENCES/LINE IN LISTING
RC=WPL
SX=4
BYTEX=5
BYTEM=6
TX=BYTEM
C=7
CS=10
LINE=11			;HOLDS LINE #
FLAG=12
FREE=13			;POINTS TO HIGH END OF INCREMENT BYTE TABLE
SYMBOL=14		;POINTS TO ENTRY COUNT AT LOW END OF SYMBOL TABLE
TEMPX=15
IO=16			;HOLDS FLAGS
P=17			;PUSH DOWN POINTER



;COMMAND STRING ACCUMULATORS

ACTXT==0		;STORES TEXT FOR DEVICES, FILENAMES, EXT.
ACDEV==1		;DEVICE
ACFILE==2		;FILE
ACEXT==3		;EXTENSION
ACDEL==4		;DELIMITER
ACPNTR==5		;BYTE POINTER
ACPPN==6		;HOLDS PROJ,PROG FOR COMMAND SCANNER
;C=7			;INPUT TEXT CHARACTER
;CS=10
ACTMP==11		;TEMP AC
TIO==15			;HOLDS MTAPE FLAGS
;IO=16			;CREF FLAGS SET BY COMMAND SCANNER
;P=17			;PUSH DOWN POINTER

HISEG==560000		;[74] HISEG ADDRESS
;USEFUL OPDEF'S

OPDEF	PJRST	[JRST]		;[24][30]



;CONDITIONAL ASSEMBLY SWITCHES

IFNDEF STANSW,<STANSW==0>		;SET TO 1 FOR STANFORD A.I. LAB FEATURES
IFN STANSW,<SEGSW==0>			;
IFNDEF SEGSW,<SEGSW==1>			;SET TO 1 FOR TWO-SEGMENT SHARABLE ASSEMBLY
IFNDEF TEMPC,<TEMPC==1>			;SET TO 1 TO ALLOW TMPCOR UUO

IFN SEGSW,<	TWOSEG	HISEG		
		RELOC	HISEG	>	;[74] END IFN SEGSW,
IFE SEGSW,<	RELOC	0>		;BACK TO RELOC AFTER LOC .JBVER

IFE STANSW,<	EXTERN	.HELPR	>

COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1974,1986.  ALL RIGHTS RESERVED.
\;END COPYRIGHT MACRO


;I/O CHANNELS

CTLI==1		;CONTROL DEVICE NUMBER (INPUT)
CHAR==2		;INPUT DEVICE NUMBER
LST==3		;LISTING DEVICE NUMBER
SINI==4		;[44] READ DSK:SWITCH.INI
;DEFINITIONS FOR LENGTHS OF LINES AND PAGES

WPLLPT==^D14		;IN OUTPUT LPT LISTING, 14 REFERENCES/LINE
IFN STANSW,<	WPLLPT==^D10 	>	;(NARROW LPT)
WPLTTY==^D8		;IN OUTPUT TTY LISTING, 8 REFERENCES/LINE
.LPP==^D53		;LINES PER PAGE IN LISTING



;OTHER RANDOM DEFINITIONS

PDL==30			;PUSH DOWN STACK LENGTH
HASH==145		;HASH SIZE
TXTSIZ==^D32		;SIZE OF COMMAND TEXT BUFFER
ERRSIZ==^D20		;[40] SIZE OF ERROR BUFFER
TTRSIZ==^D20		;[43] AREA FOR TTY RESCAN INPUT



;DEFINITIONS NECESSARY FOR TENEX FILE SYSTEM FEATURES.

;	OPDEF COMPT. [CALLI 147]  ;DEFINED IN UUOSYM

CP.OPN==1			;OPEN FUNCTION
CP.REN==2			;RENAME FUNCTION
CP.PPN==3			;PPN TO DIRECTORY FUNCTION
CP.RUN==4			;RUN UUO SIMULATION
CP.MON==4			;FIRST MONITOR WITH COMPT.
CP.NAM==5			;NAMING FUNCTION
;BIT DEFINITIONS FOR FLAGS IN ACCUMULATOR "IO"

IOLST==	000001		;IF 1, SUPPRESS PROGRAM LISTING
IOSAME==000002		;SET TO 1 WHEN NEXT SYMBOL TO OUTPUT NEEDS A BLOCK NAME
IOPAGE==000004		;IF 1, DO A FORM FEED
IOFAIL==000010		;1 IF "NEW STYLE" CREF DATA HAS BBEN SEEN
IODEF==	000020		;1 IF SYMBOL IS A DEFINING OCCURRANCE
; IOENDL==000040	;REPLACED BY M0XCT FEATURE
IORSCN==000040		;[43] IN (OR NEED) RESCAN FOR CCL ENTRY
IOCCL==	000100		;1 IF CCL SYSTEM IN USE (SET BY STARTING AT (.JBSA)+1)
IOTABS==000200		;"RUBOUT A" SEEN AT END OF CREF DATA (INSERT TAB IN LISTING)
IOEOF==	000400		;END OF FILE SEEN
IOSINI==001000		;[44] WE'RE PROCESSING SWITCH.INI
; IONLZ==001000		;LEADING ZERO TEST,  HANDLED BY RECODING OUTASC
IOTB2==	002000		;FOR F4
IOLSTS==004000		;SET IF PROGRAM OUTPUT IS BEING SUPPRESSED
IOERR==	010000		;IMPROPER INPUT DATA SEEN
; ROOM FOR ANOTHER
IOSYM==	040000		;SYMBOL DEFINED WITH = OR :
IOMAC==	100000		;MACRO NAME
IOOP==	200000		;OPDEF, OP CODE, OR PSEUDO INSTRUCTION OCCURRANCE
IOPROT==400000		;1 IF INPUT 'CRF' OR 'LST' FILE IS PROTECTED BY /P SWITCH

IODF2==	020000		;DEFINING OCCURRANCE OF A SYMBOL.  FLAG IN REGISTER SX ONLY!



;FLAGS USED IN AC TIO

TIORW==1000		;MTAPE REWIND FLAG
TIOLE==2000		;SET(BUT NOT USED ANYWHERE) BY BACKSPACE REQUEST
TIOCLD==20000		;CLEAR DIRECTORY FLAG
;DEFINITIONS FOR "OLD STYLE" CODES FROM VARIOUS PROCESSORS

%OP==33
%EOF==37	;MULTIPLE-PROGRAM BREAK CHARACTER



;DEFINITION FOR "NEW STYLE" CODES

I.BEGN=="B"		;[17] ALL NEW STYLE CREF INFO BEGINS WITH
			;[17] <RUBOUT>B
I.FTAB=="A"		;[17] END CREF INFO WITH LINE # AND TAB
I.FNTB=="C"		;[17] END CREF INFO WITH LINE # BUT NO TAB
I.FINV=="D"		;[17] DO NOT PRINT ANYTHING AFTER CREF INFO
I.BRK=="E"		;[17] SUBROUTINE BREAK - OUTPUT CURRENT
			;[17] INFORMATION NOW AND RESET
I.NLTB=="F"		;[21] NO LINE NUMBER, NO TAB



;[45] SYMBOLS FOR ALL THE SWITCHES

;[45] LEFT HALF, "/A" TO "/R"

SWT.AA==1B00	;A - ADVANCE ONE FILE
SWT.BB==1B01	;B - BACKSPACE ONE FILE
SWT.CC==1B02	;C - CANCEL SWITCH.INI SWITCH DEFAULTING
SWT.DD==1B03	;D - DEFAULTS (I.E., SWITCH.INI SWITCH DEFAULTING)
SWT.EE==1B04	;E - UNDEFINED
SWT.FF==1B05	;F - UNDEFINED
SWT.GG==1B06	;G - UNDEFINED
SWT.HH==1B07	;H - HELP (UNDEFINED IF STANSW .EQ. 0)
SWT.II==1B08	;I - UNDEFINED
SWT.JJ==1B09	;J - UNDEFINED
SWT.KK==1B10	;K - KILL (SUPPRESS) SYMBOL TABLE LISTING
SWT.LL==1B11	;L - UNDEFINED
SWT.MM==1B12	;M - SUPPRESS MACRO TABLE LISTING
SWT.NN==1B13	;N - UNDEFINED
SWT.OO==1B14	;O - OPCODE TABLE LISTING (ENABLE)
SWT.PP==1B15	;P - PRESERVE INPUT FILES (DON'T DELETE THEM)
SWT.QQ==1B16	;Q - UNDEFINED
SWT.RR==1B17	;R - RESTART LISTING @ USER SPECIFIED LINE NUMBER

;[45] LEFT HALF, "/S" TO "/Z"

SWT.SS==1B18	;S - SUPPRESS PROGRAM LISTING (ONLY LIST SYMBOL TABLES)
SWT.TT==1B19	;T - ADVANCE TO END OF TAPE
SWT.UU==1B20	;U - UNDEFINED
SWT.VV==1B21	;V - UNDEFINED
SWT.WW==1B22	;W - REWIND TAPE
SWT.XX==1B23	;X - UNDEFINED
SWT.YY==1B24	;Y - UNDEFINED
SWT.ZZ==1B25	;Z - ZERO DECTAPE DIRECTORY
;MNEMONIC FOR ERROR MESSAGES

;MNEMONIC	SEVERITY	MEANING

;CRFIDC		WARNING		IMPROPER INPUT DATA
;CRFPUE		WARNING		PLEASE USE "=" RATHER THAN "_"
;CRFSIH		WARNING		/H OR /R ILLEGAL IN SWITCH.INI ([44])
;CRFSII		WARNING		SYNTAX ERROR IN SWITCH.INI ([44])
;CRFSIO		WARNING		I/O READ ERROR IN SWITCH.INI ([44])
;CRFRLL		INFORMATION	ASKS USER FOR LINE # TO RESTART LISTING ([45])
;CRFXKC		INFORMATION	SIZE OF LOW SEGMENT IN K OF CORE
;CRFCFF		FATAL		CANNOT FIND FILE
;CRFCFE		FATAL		COMMAND FILE INPUT ERROR
;CRFINE		FATAL		INPUT ERROR
;CRFOUE		FATAL		OUTPUT ERROR
;CRFDNA		FATAL		DEVICE NOT AVAILABLE
;CRFCEF		FATAL		CANNOT ENTER FILE
;CRFIMA		FATAL		INSUFFICIENT MEMORY AVAILABLE
;CRFCME		FATAL		COMMAND ERROR
;CRFCDN		FATAL		CAN'T GET CMD FILE DEVICE ([33])
;CRFCLC		FATAL		CAN'T LOOKUP COMMAND FILE ([33])
;CRFCFI		FATAL		CAN'T FIND INPUT FILE
;CRFUKS		FATAL		UNKNOWN SWITCH ([42])
;CRFIBP		FATAL		INPUT BUFFER SIZE PHASE ERROR
	SUBTTL	INITIALIZATION

CREF0:	TLNN	IO,IOCCL		;IF OPEN FAILED IN CCL, START OVER
	EXIT				;IF OPEN FAILED NOT IN CCL, THEN EXIT
CREF:	TDZA	IO,IO			;START HERE FROM (.JBSA)
	MOVSI	IO,IOCCL ! IORSCN	;[43] START HERE FROM (.JBSA)+1
	MOVE	P, [IOWD PDL, PPSET]	;[44] SETUP STACK
	RESET				;CLEAR IO AND INITIALIZE .JBFF
	SETZM	BZCOR			;[37] START OF TO-BE-ZERO'ED AREA
	MOVE	ACTMP, [BZCOR,,BZCOR+1]	;[37] BLT POINTER TO
	BLT	ACTMP, STCLR - 1	;[37] ZERO INITIAL CORE AREA
	GETPPN	ACTMP,			;[32] GET MY PPN
	 JFCL				;[32] BLOODY JACCT BIT!!!!!
	MOVEM	ACTMP, MYPPN		;[32] SAVE AWAY FOR FUTURE REFERENCE
	HRROI	ACTMP, .GTWCH		;[40] NEED TO GET THE WATCH BITS
	GETTAB	ACTMP,			;[40] IN CASE OF ERRORS
	 SETO	ACTMP,			;[40] ???
	TLNN	ACTMP, (JW.WMS)		;[40] WHOLE FIELD NULL?
	TLO	ACTMP, (JW.WPR!JW.WFL)	;[40] YES - DEFAULT /MES:(PRE,FIR)
	MOVEM	ACTMP, MYWCH		;[40] AND SAVE FOR FUTURE REFERENCE
	HRROI	ACTMP,[ASCIZ /CRF/]
	MOVEM	ACTMP,EXTNAM		;SET UP ARGS
	HRROI	ACTMP,TXTHLD
	MOVEM	ACTMP,OUTARG+2		;""
	MOVE	ACTMP,[1,,FLAG]
					;[43] THIS MUST BE A BUG - THERE'S
					;[43] NO MOVEM, NO REFERENCES . . .
	PUSHJ	P, DOSINI		;[44] GO DO SWITCH.INI DEFAULTS
	TLNN	IO, IORSCN		;[43] NEED DO A RESCAN?
	 JRST	REGSET			;[43] NO - REGULAR (.R CREF) ENTRY
	RESCAN	1			;[55] YES - PREPARE TO READ THE
	SKPINL				;[43] MAKE SURE SOMETHING THERE
	 JRST	NORSCN			;[43] BZZZZT! NOTHING IN TTY BUFFER?
	SETOB	FLAG, CTIBUF + 1	;[43] USER'S TYPED COMMAND
	PUSHJ	P, TTISIX		;[43] EAT THE ".CREF" PART FIRST
					;[43] SHOULD SEE IF "CREF" ?????
	CAIN	C, 12			;[43] ANYTHING ELSE ON LINE?
	 JRST	NORSCN			;[43] NO - JUST DO REGULAR CCL STUFF
	PUSHJ	P, TTRSCN		;[43] BUILD MASK OF SWITCHES
	 JRST	TTRSXX			;[43] OOPS - FILE SPECS THERE TOO!!!
	TLNE	ACTXT, (SWT.HH)		;[45] WAS THERE A "/H" ???
	 JRST	HELP43			;[43] YES - SIGH - ZAP THE WORLD
	TLZE	ACTXT, (SWT.RR)		;[45] "/R" SEEN?????
	 SETOM	RRFLAG			;[45] YES - MUST BE KEPT SEPERATE
	MOVEM	ACTXT, TTRSWT		;[43] REMEMBER STICKY SWITCHES
NORSCN:	TLZ	IO, IORSCN		;[43] AND DO NORMAL CCL STUFF
IFN TEMPC,< SUBTTL TMPCOR PROCESSING FOR CCL ENTRY

;[43]    ***   FALL HERE FROM PREVIOUS PAGE ON CCL ENTRY   ***

		TLNN	IO,IOCCL	;IS THIS A CCL TYPE CALL?
		JRST	REGSET		;[43] NO.  SKIP READING TMPCOR
		HRRZ	AC0,.JBFF	;GET START OF BUFFER AREA
		HRLI	AC0,-200	;-LENGTH IN LH FOR TMPCOR IOWD
		MOVEM	AC0,TMPFIL+1	;STORE IT IN TMPCOR IOWD
		SOS	TMPFIL+1	;MAKE IT CONFORM TO IOWD FORMAT
		HRRZM	AC0,CTIBUF+1	;SET UP DUMMY BYTE POINTER
		MOVE	TEMP,.JBFF	;[20] MAKE SURE THERE'S ROOM ENOUGH
		ADDI	TEMP,200	;[20]
		CAMG	TEMP,.JBREL	;[20] SKIP IF THERE'S NO ROOM ABOVE .JBFF
		JRST	TMP1		;[20]
		CORE	TEMP,		;[20] ASK FOR MORE
		 JRST	ERRCOR		;[20] LOSE
TMP1:		MOVSI	TEMP,'CRE'	;SETUP 2 WORD BLOCK FOR TMPCOR UUO
		MOVEM	TEMP,TMPFIL
		MOVE	TEMP,[XWD .TCRDF,TMPFIL] ;[33] SET UP FOR READ FROM CORE
		TMPCOR	TEMP,		;READ AND DELETE FILE "CRE"
		 JRST	REGSET		;FILE NOT THERE, TRY THE DISK
		ADD	AC0,TEMP	;GET END OF BUFFER
		MOVEM	AC0,.JBFF	;DUMMY UP .JBFF
		MOVEM	AC0,SVJFF	;SAVE NEW .JBFF
		IMULI	TEMP,5		;CALCULATE THE CHARACTER COUNT
		ADDI	TEMP,1		;ADJUST CHARACTER COUNT BY 1 TO
					;ACCOUNT FOR THE STANDARD READ ROUTINE
		MOVEM	TEMP,CTIBUF+2	;DUMMY UP CHARACTER COUNT IN HEADER
		MOVEI	TEMP,440700	;SET UP REST OF BYTE POINTER
		HRLM	TEMP,CTIBUF+1	;HEADER NOW COMPLETE
		SETOM	TMPFLG
		JRST	RETCCL		;RETURN TO MAIN FLOW

> ;[43] IFN TEMPC



;[43] HERE IF USER TYPED MONITOR COMMAND OF FORM ".CREF A=B"
;[43] I.E., MORE THAN MERELY SWITCHES.  MUST "FAKE IT"

TTRSXX:	ADDI	FLAG, <TTRSIZ * 5> + 1 ;[43] GET POSITIVE COUNT OF CHARS SO FAR
	MOVEM	FLAG, CTIBUF + 2 ;[43] FAKE COUNT
	MOVE	FLAG, [POINT 7, TTRBUF] ;[43] POINTER TO BUFFER
	MOVEM	FLAG, CTIBUF + 1 ;[43] FAKE THAT ALSO
	SETOM	LEAFLG		;[45] ONLY ONE LINE ALLOWED IN THIS MODE
	JRST	RETCCX		;[43] AND GO PROCESS AS IF NORMAL CCL
	SUBTTL	SETUP FOR COMMAND INPUT

;[43] HERE FOR BOTH CCL-DISK FILE (###CRE.TMP) AND REGULAR STYLE
;[43] COMMAND INPUT (.R CREF) FROM TTY:

REGSET:	MOVEI	TEMP,1			;[43] OPEN FILE IN ASCII LINE MODE
	MOVSI	TEMP+1,'TTY'
	TLNE	IO,IOCCL		;USING CCL MODE?
	MOVSI	TEMP+1,'DSK'		;YES
	MOVEM	TEMP+1,CTIDEV		;SAVE DEVICE NAME
	MOVEI	TEMP+2,CTIBUF		;SET UP INPUT BUFFER HEADER ADDRESS
	OPEN	CTLI,TEMP		;OPEN INPUT COMMAND FILE
	 JRST CREF0			;OPEN FAILURE, START OVER
	INBUF	CTLI,1			;SET UP 1 INPUT BUFFER
	HRRZ	AC0,.JBFF
	MOVEM	AC0,SVJFF		;SAVE .JBFF
	TLNN	IO,IOCCL
	JRST	RETCCL			;NOT IN CCL MODE

;NOW, LOOKUP DSK:###CRE.TMP (WHERE ### IS THE 3-DIGIT DECIMAL JOB NUMBER.
;THAT FILE WILL BE USED FOR COMMAND INPUT.  IF ANYTHING GOES WRONG, CREF
;IS RESTARTED AND IT WILL ACCEPT COMMANDS FROM USER'S TERMINAL

IFE STANSW,<	MOVEI	AC0,3		;JOB # IS 3 CHARS LONG
		PJOB	TEMP,		;GET JOB #
CREF1:		IDIVI	TEMP,12
		ADDI	TEMP+1,"0"-40	;CHANGE REMAINDER TO SIXBIT DIGIT
		LSHC	TEMP+1,-6	;SHOVE DIGITS INTO TEMP+2
		SOJG	AC0,CREF1	;3 DIGITS YET?
		HRRI	TEMP+2,'CRE'
		MOVSI	TEMP,'TMP'	>;IFE STANSW

IFN STANSW,<	MOVE	TEMP+2,['QQCREF']
		MOVSI	TEMP,'RPG'	>;IFN STANSW

	MOVEM	TEMP+2,CTIDIR		;SET UP ###CRE
	MOVEM	TEMP,CTIDIR+1		;SET UP EXTENSION
	SETZM	CTIDIR+3		;CLEAR PROJ,PROG
	LOOKUP	CTLI,CTIDIR		;DO LOOKUP ON COMMAND FILE
	 JRST CREF			;FILE ###CRE.TMP NOT FOUND
;[43]   ***   CAN FALL HERE FROM LOOKUP OF ###CRE.TMP   ***

;THE END OF ONE CCL COMMAND LINE AND THE BEGINNING OF THE NEXT
;RETURNS TO HERE. THE INPUT COMMAND BUFFER IS PRESERVED. THE
;OUTPUT AND INPUT FILE BUFFERS ARE RECLAIMED PRIOR TO PROCESSING
;THE NEXT CCL COMMAND LINE.

RETCCL:	SKIPE	LEAFLG			;[43] NEED TO EXIT INSTEAD?
	 JRST	LEAVE			;[43] YES - SO GO EXIT
	HRRZ	0,SVJFF			;GET THE SAVED .JBFF
	MOVEM	0,.JBFF			;RESTORE .JBFF
	CORE	0,			;(POSSIBLY SHRINK TO ORIGINAL SIZE)
	 JRST	CREF			;HOW COULD YOU LOSE?
RETCCX:	TLO	IO, IOPAGE!IOSYM!IOMAC	;[43] SET DEFAULT FLAGS
	SETZM	STCLR			;CLEAR FIXED DATA AREA
	MOVE	0,[XWD STCLR,STCLR+1]
	BLT	0,ENDCLR
 IFN	SEGSW,<				;[31]
	MOVE	0, [TNXHGH,,TNXLOW]	;[31] GET BLT POINTER
	BLT	0, TNXLOW + TNXLEN - 1>	;[31] SET UP RUN AND OTHER STUFF
	MOVE	P,[IOWD PDL,PPSET]	;INIT PUSH DOWN LIST POINTER
	HLLOS	UPPLIM			;ASSUME VERY LARGE UPPER LIMIT
	MOVE	AC0,[TDNN IO,SX]	;SETUP M6X
	MOVEM	AC0,M6X			;SKIP IF WE'RE CREFING THIS KIND OF SYM

	SETZM	CRFPUE			;[63] RESET FLAG
	TLNN	IO,IOCCL		;SKIP IF IN CCL MODE.
	OUTSTR	[ASCIZ/*/]		;[61] LOOK READY FOR A COMMAND
					;[61] NO MORE EXTRA CRLF
	SETZM	ACHR			;[61] SET NULL LINE FLAG
	MOVSI	ACDEV,'LPT'
	MOVEM	ACDEV,LSTDEV		;DEFAULT LIST DEVICE IS LPT:
	MOVSI	ACEXT,'LST'		;DEFAULT EXTENSION IS "LST"
	MOVEM	ACEXT,LSTDIR+1
	SUBTTL	INITIALIZATION - LSTSET - SETUP DESTINATION DEVICE

LSTS00:	PUSHJ	P,NAME1			;[43] GET NEXT DEVICE
	CAIN	C, "@"			;[33] COMMAND FILE NEEDED?
	JRST	CMDFIL			;[33] YES - SWITCH COMMAND INPUT
	CAIN	C,"!"			;RUN ON NEXT PROGRAM?
	JRST	RUNUUO			;YES
	CAIE	C,"="			;[35] LISTING DEVICE SPECIFIED?
	JRST	LSTS2			;NO
	JUMPN	ACDEV,LSTS1		;USE SPECIFIED DEVICE. BUT IF
	MOVSI	ACDEV,'DSK'		;DEVICE NULL, USE DSK IF
	SKIPE	ACFILE			;A FILE IS SPECIFIED
LSTS1:	MOVEM	ACDEV,LSTDEV		;SAVE DEVICE NAME
	MOVEM	ACFILE,LSTDIR		;STORE FILE NAME
	SKIPE	ACEXT			;EXTENSION NULL?
	HLLZM	ACEXT,LSTDIR+1		;[57]
	JUMPE	ACPPN, LSTS1A		;[32] 0 IS OK - DEFAULT
	TLNE	ACPPN, -1		;[32] EXTENDED PATH?
	 JRST	LSTS1A			;[32] NO - DON'T WORRY 'BOUT IT
	MOVSI	ACTMP, (ACPPN)		;[32] YES - MUST NEEDS
	IORI	ACTMP, LSTPTH		;[32] COPY IT OVER
	BLT	ACTMP, LSTPTH + .PTMAX - 1 ;[32] SO DON'T LOSE IT
	MOVEI	ACPPN, LSTPTH		;[32] USE IT AS PPN NOW
LSTS1A:	MOVEM	ACPPN,LSTDIR+3		;[32] SET UP PROJ,PROG NUMBER

LSTS2:	MOVE	ACTMP,[TXTBUF,,TXTHLD]
	BLT	ACTMP,TXTHLD+TXTSIZ-1	;MOVE NAME 
	CAIN	C,"="			;[35] OUTPUT NAME SPECIFIED?
	JRST	MADEIT			;YES. GO ON
	HRROI	ACTMP,[ASCIZ/ LPT:/]	;NO. GET DEFAULT
	MOVEM	ACTMP,OUTARG+2		;TO ARG BLOCK
MADEIT:	MOVEM	TIO,OFLAG		;SAVE SWITCHES
	MOVEM	CS,OFLAG1
	MOVEM	C,OFLAG2
	CAIN	C,"="			;[35] OUTPUT SPEC?
	PUSHJ	P,NAME1			;GET NEXT COMMAND NAME
INSET1:	TLNN	IO,IOCCL		;[61] IN CCL MODE?
	JRST	INSET2			;[61] NO.
	SKIPE	ACHR			;[61] YES. IS LINE EMPTY?
	OUTSTR	[ASCIZ /CREF:/]		;[61] NO.. TYPE OUR NAME
INSET2:	SETOM	NOIOJF			;[51] SET FLAG TO WAIT ON INBUF
					;[51] SINCE MUST NOT SET IOJFF
					;[51] TILL OUTPUT IS SETUP.
	PUSHJ	P,INFILE		;DO INPUT OPEN AND LOOKUP
	 JRST	[TLNN IO,IOCCL		;LOOKUP FAILURE
		JRST CREF		;NOT IN CCL MODE, START OVER
		MOVE C,CMDTRM
		CAIE C,","		;WAS FILE TERMINATOR A COMMA?
		JRST CCLFN3		;NO,LOOK FOR NEXT CCL LINE
		PUSHJ P,NAME1		;YES, LOOK FOR NEXT FILE
		JRST INSET2 ]		;AND GO LOOK IT UP
	SETZM	NOIOJF			;[51] NOW CLEAR FLAG LEST WE FORGET
	MOVE	TIO,OFLAG		;GET FLAGS BACK
	MOVE	CS,OFLAG1
	MOVE	C,OFLAG2
	MOVE	ACTXT,[CHAR,,CP.NAM]	;GET NAME OF IN FILE
	HRROI	ACTXT+1,TXTBUF		;WHERE NAME WULL GO
	MOVSI	ACTXT+2,(1B8)		;NAME ONLY
	MOVE	ACTMP,[3,,ACTXT]
	COMPT.	ACTMP,			;GET THE NAME
	 JRST	DOOPN			;[51] FAILED - GO TRY OPEN
	MOVE	ACTMP,[ASCIZ /LPT/]	;[T20-40] DEFAULT
	MOVEM	ACTMP,LSTNM1		;[T20-40] TO DEFAULT BLOCK
	SKIPN	LSTDEV			;[T20-40] HAVE A LIST DEVICE?
	JRST	NOLSTD			;[T20-40] NO
	MOVE	ACTMP,[POINT 6,LSTDEV]	;[T20-40] YES. CONVERT
	MOVE	ACTMP+1,[POINT 7,LSTNM1];[T20-40] WHERE TO PUT ASCII
CNVT:	ILDB	ACTMP+2,ACTMP		;[T20-40] GET BYTE
	JUMPE	ACTMP+2,CNVTD		;[T20-40] DONE
	ADDI	ACTMP+2,40		;[T20-40] MAKE IT ASCII
	IDPB	ACTMP+2,ACTMP+1		;[T20-40] STORE IT
	TLNE	ACTMP,770000		;[T20-40] DONE ALL SIX?
	JRST	CNVT			;[T20-40] NO DO ALL
	SETZ	ACTMP+2,		;[T20-40] YES. DONE THEN
CNVTD:	IDPB	ACTMP+2,ACTMP+1		;[T20-40] TIE IT OFF
NOLSTD:	MOVE	ACTMP,[10,,OUTARG]	;[T20-40] DO OUT ARG
	COMPT. 	ACTMP,			;OPEN OUT FILE
	 JRST	DOOPN			;[51] ??!!FAILED!!??
	JRST	GDOPN			;MADE IT. GO ON

DOOPN:	MOVSI	ACTMP,(1B7)		;[75]INIT DEV IN ASCII MODE, BIGBUF
	MOVE	ACTMP+1,LSTDEV		;GET DEVICE NAME
	MOVSI	ACTMP+2,LSTBUF		;BUFFER HEADER ADDRESS
	OPEN	LST,ACTMP		;TRY TO INIT DEVICE
	 JRST	ERRAVL			;OPEN FAILED
	SETZ	ACTMP,			;ENTER NEEDED
GDOPN:	PUSH	P,ACTMP			;SAVE THIS FOR LATER
	OUTBUF	LST,0			;[75] MAKE DEFAULT BUFFERS
	MOVEI	ACTMP+1,LST		;USE CHANNEL NYMBER
	DEVCHR	ACTMP+1,		;GET OUTPUT DEVICE CHARACTERISTICS
	MOVEI	ACTMP,WPLLPT		;ASSUME LINES FOR LPT
	TLNE	ACTMP+1,10		;IS DEVICE REALLY TTY?
	MOVEI	ACTMP,WPLTTY		;YES. SET UP LINES FOR TTY
	MOVEM	ACTMP,.WPL		;SAVE NUMBER OF ENTRIES/LINE
	TLNE	ACTMP+1,10		;SKIP IF NOT TTY
	SKIPA	ACTMP,[CAIE C,12]	;WRITE LINE-BY-LINE ON TTY.
	MOVSI	ACTMP,(<POPJ P,>)
	MOVEM	ACTMP,WRITEX		;SET INSTR. TO XCT TO EXIT FROM WRITE.
	TLNN	ACTMP+1,20		;MAG TAPE?
	JRST	LSTSE4			;NO. AVOID RANDOM TESTS AND MTAPES
	TLZE	TIO,TIORW		;REWIND REQUESTED?
	MTAPE	LST,1			;YES
	TLZE	TIO,TIOLE
	MTAPE	LST,10			;ADVANCE TO END OF TAPE
	JUMPGE	CS,LSTSE3
	MTAPE	LST,17			;BACKSPACE MTA
	AOJL	CS,.-1			;IF COUNT IS NEG., BACKSPACE AGAIN
	MTAPE	LST,0			;[20] SOME CRETINS DON'T READ MANUALS.
					;[20] WAIT FOR TAPE TO STOP SO LOAD
					;[20] POINT CAN BE SENSED
	STATO	LST,1B24		;SKIP IF AT LOAD POINT-
					;THIS PUTS TAPE ON CORRECT SIDE OF EOF
	MTAPE	LST,16			;SPACE FORWARD 1 FILE
LSTSE3:	SOJGE	CS,.-1			;[20] LOOP UNTIL POS. COUNT RUNS OUT
;[45]     ***   FALL HERE FROM PREVIOUS PAGE   ***

;FOR MTA OUTPUT WE NEED TO TEST IOEOT WHICH IS NOT TESTED BY AN OUT UUO.
;THEREFORE, WE CALL A ROUTINE TO DO OUTPUT, STATZ FOR EVERY BUFFER.
;IN ALL OTHER CASES, WE MINI-OPTIMIZE BY DOING ONLY ONE UUO.

	SKIPA	ACTMP,[PUSHJ P,DMPOUT]	;SET OUTPUT INSTR. FOR MTA
LSTSE4:	MOVSI	ACTMP,(<OUT LST,>)	;OUTPUT INSTRUCTION FOR ALL EXCEPT MTA.
	MOVEM	ACTMP,DMPXCT		;SET OUTPUT INSTRUCTION
	TLNE	TIO,TIOCLD		;DIRECTORY CLEAR REQUESTED?
	UTPCLR	LST,			;YES.
	POP	P,FLAG			;DOI COMPT. WORK FLAG
	SKIPE	FLAG			;COMPT. WORKED?
	JRST	INSET3			;YES. DONT DO ENTER
	MOVE	ACFILE,INDIR		;GET INPUT FILENAME
	SKIPN	LSTDIR			;LISTING FILENAME NULL?
	MOVEM	ACFILE,LSTDIR		;MAKE IT SAME AS INPUT FILENAME
IFN STANSW,<	MOVSI	ACFILE,400000	;AT STANFORD, SET DUMP NEVER BIT
		MOVEM	ACFILE,LSTDIR+2	>
	PUSH	P,ACFILE		;[100]
	MOVE	ACFILE,LSTDIR
	MOVEM	ACFILE,EXTBLK+.RBNAM
	MOVE	ACFILE,LSTDIR+1
	MOVEM	ACFILE,EXTBLK+.RBEXT
	MOVE	ACFILE,LSTDIR+2
	MOVEM	ACFILE,EXTBLK+.RBPRV
	MOVE	ACFILE,LSTDIR+3
	MOVEM	ACFILE,EXTBLK+.RBPPN
	MOVEI	ACFILE,.RBVER
	MOVEM	ACFILE,EXTBLK+.RBCNT
	POP	P,ACFILE
	ENTER	LST,EXTBLK		;INPUT FILE FOUND, ENTER OUTPUT FILE
	 JRST	[PUSH	P,EXTBLK+.RBEXT
		 POP	P,LSTDIR+2
		 JRST	ERRENT]		;ENTER FAILED FOR LISTING DEVICE

INSET3:	SETO	FLAG		;[45] IN CASE NEED NO INPUT
	SKIPN	FIRSTL		;[45] "/R" SWITCH SEEN?
	 JRST	LSTS3		;[45] NO - SEE IF A STICKY ONE AROUND
	SKIPL	LEAFLG		;[45] CCL-TTY-RESCAN ENTRY???
	TLNN	IO, IOCCL	;[45] CCL OR REGULAR ENTRY
	 JRST	LSTS3A		;[45] REGULAR - PROMPT USER FOR LINE #
	PUSHJ	P, TTIDEC	;[45] CCL - NUMBER IN INPUT STREAM ALREADY
	JRST	LSTS4		;[45] COMMON CODE . . .

LSTS3:	SKIPN	RRFLAG		;[45] STICKY "/R" FROM TTY RESCAN?
	 JRST	LSTS7		;[45] NO - JUST GO DO THE CREFFING
LSTS3A:	PUSH	P, CTIBUF + 2	;[45] MUST PROMPT USER FOR INPUT
	SETOM	CTIBUF + 2	;[45] SO MUST FORCE IMMED TTCALL'S
	TLO	IO, IORSCN	;[45] . . .
	SKPINC			;[45] ZAP ^O, JUST IN CASE . . .
	 JFCL			;[45] . . .
	PUSHJ	P, LSTS5M	;[45] GIVE PROMPTING MESSAGE
	PUSHJ	P, TTIDEC	;[45] READ IN LINE NUMBER
	TLZ	IO, IORSCN	;[45] CLEAR THIS TTCALL FLAG
	POP	P, CTIBUF + 2	;[45] RESTORE OTHER COUNT (MIGHT BE IN
				;[45] COMMAND FILE BY NOW)
LSTS4:	MOVEM	ACTMP, FIRSTL	;[45] SET STARTING LINE NUMBER
	JRST	LSTS6		;[45] AND GO DO CREFFING

LSTS5M:	MOVEI	RC, [[ASCIZ/%CRFRLL Restart listing at line:  /]] ;[45]
	PJRST	PNTM0		;[45] SEND OUT PROMPT MESSAGE
	SUBTTL	PROCESS CREF INPUT FILE

LSTS6:	MOVEM	ACTMP,FIRSTL	;SAVE DECIMAL NUMBER
	SKIPA	C,[JRST WRITE1]	;INITIAL WRITE-ENTRANCE INSTRUCTION
LSTS7:	MOVE	C,[SOSG LSTBUF+2] ;SET UP WRITE ENTRANCE INSTRUCTION
	MOVEM	C,WRITEE
	MOVE	C,.JBFF		;[51] NOW MAY SET IOJFF SINCE THE LISTING
	MOVEM	C,IOJFF		;[51] BUFFERS ETC. ARE SAFELY ENSCONCED
				;[51] BELOW .JBFF/IOJFF
	INBUF	CHAR,0		;[75] [51] NOW - DO THE DELAYED INBUF
	MOVEI	FREE,BLKST-1
	MOVEM	FREE,BLKND	;INITIALIZE FOR COMBG
	MOVE	C,.JBFF		;[52] SAVE FOR FORTRAN MULTI STUFF
	MOVEM	C,FRJFF		;[52] AND CRFIBP CHECK

RECYCL:	HRRZ	FREE,.JBFF	;RETURN FOR MULTIPLE F4 PROGS
	ADDI	FREE,1
	TRZ	FREE,1		;MAKE SURE FREE STARTS OUT EVEN
	MOVEM	P,PPSAV		;SAVE P IN CASE OF IMPROPER INPUT DATA
	SETZM	FSTPNT#
	MOVEI	LINE,1
	CAMGE	LINE,LOWLIM
	TLO	IO,IOLST	;WE DON'T WANT LISTING YET.  LOWLIM>LINE
	TLNN	IO,IOLST	;LISTING SUPPRESSED?
	SKIPA	C,[WRITE]
	MOVEI	C,CPOPJ
	MOVEM	C,AWRITE	;WRITE BY PUSHJ P,@AWRITE.
	MOVSI	C,(<JFCL>)
	MOVEM	C,M0XCT		;SET UP INSTRUCTION FOR M0

	PUSHJ	P,READ		;TEST FIRST CHARACTER
	CAIE	C,%EOF		;PROGRAM BREAK?
	JRST	M2A		;NO, PROCESS
	JRST	M2		;YES, BYPASS

NOTINF:	SKIPA	TEMP,[177]	;HERE TO INSERT RUBOUT (WASN'T NEW FORMAT)
M0A:	MOVEI	TEMP,11		;HERE TO INSERT TAB
	EXCH	C,TEMP
	PUSHJ	P,@AWRITE
	MOVSI	C,(<JFCL>)
	MOVEM	C,M0XCT		;SET UP INSTRUCTION FOR M0
	MOVEI	C,(TEMP)
M0:	XCT	M0XCT		;WRITE NORMAL CHARACTER.  (JFCL, OR JRST M0A)
M1:	PUSHJ	P,@AWRITE	;WRITE CHARATER
M2:	PUSHJ	P,READ		;READ NEXT
M2A:	CAIN	C,177		;RUBOUT?
	JRST	FAILM		;YES.  PROBABLY NEW STYLE CREF
	CAILE	C,%EOF		;MIGHT THIS BE A SPECIAL CHARACTER.
 	JRST	M0		;NO WAY.  THIS HAS TO BE NORMAL.
	CAIL	C,%OP		;IN RANGE FOR OLD-STYLE CREF?
	JRST	M2C		;YES.  SPECIAL CHARACTER FOR OLD-STYLE CREF
	CAIN	C,12		;LF?
	JRST	M1		;PASS IT DIRECTLY
	CAIE	C,15		;CR?
	JRST	M0		;NO. THIS IS NOT ANY SPECIAL CHARACTER.
	MOVE	TEMP,[JRST M0A]
	TLNE	IO,IOTABS!IOTB2	;HANDLE CR. TAB FLAGS ON?
	MOVEM	TEMP,M0XCT	;YES.  ARRANGE TO WRITE TAB LATER
	JRST	M1		;GO WRITE CR.
;DISPATCH FOR OLD-STYLE CREF.  XCT'ED FROM M2C+4
MTAB:	MOVSI	SX,IOOP		;33  OPCODE REF
	MOVSI	SX,IOMAC	;34  MACRO REF
	SKIPA	C,LINE		;35  END OF LINE
	MOVSI	SX,IOSYM	;36  SYMBOL REF
	JRST	R0		;37  BREAK BETWEEN PROGRAMS

;HERE FOR OLD-STYLE CREF FORMAT
M2C:	TLNE	IO,IOFAIL	;ARE WE DOING NEW-STYLE ALREADY?
	JRST	M0		;YES. THEN THESE AREN'T SPECIALS
	MOVSI	TEMP,(<JFCL>)
	MOVEM	TEMP,M0XCT	;SEEN TEXT ON LINE.  FLUSH TAB INSERTION INSTR.
	TLO	IO,IOTB2	;NEED TAB
	XCT	MTAB-%OP(C)	;(CAN SKIP)
	JRST	M3		;FLAG SET. GOBBLE SYMBOL NAME
M2B:	TLNE	IO,IOLSTS	;PERMANENT LISTING SUPPRESS?
	AOJA	LINE,M2		;YES. JUST INCREMENT LINE AND READ MORE
	CAML	LINE,LOWLIM	;LINE ABOVE LOWER LIMIT?
	CAMLE	LINE,UPPLIM	;YES. SKIP IF BELOW HIGH LIMIT
	TLOA	IO,IOLST	;ASSUME OUT OF BOUNDS
	TLZA	IO,IOLST	;LINE IN BOUNDS, CLEAR LISTING SUPPRESS
	SKIPA	TEMP,[CPOPJ]	;SUPPRESS OUTPUT
	MOVEI	TEMP,WRITE
	MOVEM	TEMP,AWRITE	;PUSHJ P,@AWRITE TO OUTPUT A CHARACTER
	TLNE	IO,IOLST
	AOJA	LINE,M2
	PUSHJ	P,CNVRT		;WRITE LINE NUMBER
	MOVEI	C,11
	TLNE	IO,IOTABS	;NEED TO DO TABS?
	PUSHJ	P,WRITE		;YES. WRITE A TAB
	AOJA	LINE,M2
;OLD STYLE-CREF.  GOBBLE SYMBOL
M3:	MOVEI	AC0,0		;ACCUMULATE SIXBIT LEFT ADJUSTED IN AC0
	MOVSI	TEMP,440600	;BYTE POINTER TO AC0
M4:	PUSHJ	P,READ		;GET CHARACTER.
	CAIGE	C,40
	JRST	M5A		;NOT SIXBIT.  THIS BREAK DEFINES END OF SIXBIT
	SUBI	C,40		;CONVERT ASCII TO SIXBIT
	TLNE	TEMP,770000	;SKIP IF AC0 FULL
	IDPB	C,TEMP		;STUFF CHARACTER
	JRST	M4

ERROR:	MOVE	P,PPSAV		;RESTORE P
	TLOE	IO,IOERR	;ANY ERRORS ALREADY?
	JRST	M2		;YES. DON'T REPORT AGAIN
	MOVEI	RC, [[ASCIZ /%CRFIDC Improper input data at line /]] ;[34]
	PUSHJ	P,PNTMSG	;IDENTIFY MESSAGE
	MOVE	C,LINE		;TELL WHAT LINE #
	PUSHJ	P,ECNVRT
	MOVEI	RC, [[ASCIZ/, continuing/]] ;[34]
	PUSHJ	P,PNTM0		;IDENTIFY MESSAGE.
	OUTSTR	CRLF
	JRST	M2		;TRY TO CONTINUE

M5A:	JUMPE	AC0,ERROR	;ERROR IF ZERO
	CAIN	C,33		;SPECIAL BREAK CHARACTER?
	TLO	IO,IODEF	;YES. THIS SYMBOL IS BEING DEFINED.
	PUSH	P,[M2]		;SET RETURN ADDRESS FROM M6/SRCH.  FALL INTO M6
M6:	XCT	M6X		;TDNN IO,SX -- SKIP IF WE'RE CREFFING THIS
				;  KIND OF SYMBOL, OR,
				;  POPJ P, --	LISTING RANGE IS EMPTY.
	POPJ	P,		;NOT CREFFING THIS KIND OF SYMBOL
	CAML	LINE,LOWLIM
	CAMLE	LINE,UPPLIM
	TDZA	FLAG,FLAG	;OUT OF BOUNDS
	MOVSI	FLAG,400000	;FLAG THAT SYMBOL WAS USED INSIDE RANGE OF INTEREST
	SUBTTL	SEARCH FOR A SYMBOL, ENTER ANOTHER REFERENCE

COMMENT $
There are 3 tables (symbols, opcodes, and macros).  Each is indexed by
a hash code.  The table entry points to a chain of symbol-entry blocks.
Each symbol-entry block is 4 words:

	0/	Sixbit symbol name
	1/	link-out to next
	2/	byte(1)flag(17)lastline(18)refchain
	3/	AUXHEAD,,AUXTAIL, later becoming: AUXHEAD,,block name addr

Flag is on if this symbol was ever seen within the line-limit range.
lastline: the last line number on which this symbol was used.

Auxhead and Auxtail are pointers to auxiliary refchains which must be
output before the main refchain.

the refchain points to a 2-word block:

	0/	byte pointer to next rd
	1/	byte(6)rfb,rd1,rd2(18)link to next refchain entry

subsequent 2-word blocks on the refchain contain 9 6-bit bytes of rd,
and an 18-bit link-out.

The rd are reference-data, which are differential line numbers, with a bit
to specify reference/definition.  The rd are stored radix 32 (decimal), with 
a bit in each 6-bit byte to specify continuation/lastbyte.
Differential line number = 
	2*(this line - last line where used) + if reference then 1 else 0

$


SRCH:	MOVEI	C,1			;SET UP SOME BITS TO SAVE CODE AND TIME
	TLZE	IO,IODEF		;   LATER
	MOVEI	C,2
	MOVEM	C,REFBIT		;2=DEFINING OCCURENCE, 1= REFERENCE
	ANDI	C,1
	MOVEM	C,REFINC		;0=DEFINING OCCURENCE, 1= REFERENCE

	MOVE	BYTEX,AC0		;GET SIXBIT
	TLNN	BYTEX,770000		; [21] POINTER TO LONG SYMBOL ?
	MOVE	BYTEX,(BYTEX)		; [21] YES - GET FIRST WORD.
	IDIVI	BYTEX,HASH
	MOVMS	TX
	TLNE	SX,IOOP			;SELECT APPROPRIATE TABLE
	MOVEI	TX,OPTBL(TX)		;SEARCH CORRECT ONE
	TLNE	SX,IOMAC
	MOVEI	TX,MACTBL(TX)
	TLNE	SX,IOSYM
	MOVEI	TX,SYMTBL(TX)
	SKIPN	SX,(TX)			;SEARCH FOR SYMBOL
	JRST	NTFND			;NONE THERE.
	TLNN	AC0,770000		; [21] LONG SYMBOL ?
	JRST	LNSRCH			; [21] YES - DO SEPARATELY
	CAMN	AC0,(SX)		;MATCHES FIRST SYMBOL?
	JRST	STV10B			;YES. (AVOID MOVING SYM TO FRONT OF CHAIN)
	SKIPN	BYTEX,1(SX)		;ADVANCE TO NEXT.
	JRST	NTFND			;NOT FOUND.
SRCH1:	CAMN	AC0,(BYTEX)		;MATCH?
	JRST	STV9			;YES. (BYTEX=CURRENT, SX=PREVIOUS)
	SKIPN	SX,1(BYTEX)
	JRST	NTFND
	CAMN	AC0,(SX)		;SEARCH HASH CHAIN FOR SYMBOL
	JRST	STV10			;GOT IT (SX=CURRENT, BYTEX=PREVIOUS)
	SKIPE	BYTEX,1(SX)		;SEARCH NEXT (BYTEX=CURRENT, SX=PREVIOUS)
	JRST	SRCH1			;KEEP LOOKING
NTFND:	SKIPE	SX,FSTPNT		;FAILURE. MAKE NEW ENTRY FOR THIS SYM.
	JRST	[MOVE	BYTEX,1(SX)	;GET 4-WORD BLOCK FROM FREE STORAGE
		MOVEM	BYTEX,FSTPNT	;RESET FREE STG
		JRST	NTFND1]
	MOVE	SX,FREE			;OTHERWISE, GET 4-WORDS FROM END OF MEM.
	ADDI	FREE,4			;GET A SPACE TO PUT NEW SYMBOL
	CAML	FREE,.JBREL
	PUSHJ	P,XCEED			;GET MORE CORE
NTFND1:	MOVEM	AC0,(SX)		;STORE SIXBIT FOR SYMBOL
	MOVE	BYTEX,(TX)		;GET FIRST LINK ON THIS CHAIN
	MOVEM	BYTEX,1(SX)		;STORE THAT IN OUR LINK-OUT
	MOVEM	SX,(TX)			;STORE OUR ADDRESS AT HEAD OF CHAIN
	SETZM	3(SX)
	MOVE	TX,FREE			;NEXT, WE NEED A 2-WORD BLOCK
	ADDI	FREE,2
	CAML	FREE,.JBREL
	PUSHJ	P,XCEED
	SETZM	1(TX)
	MOVEI	BYTEX,1(TX)
	HRLI	BYTEX,(<POINT 6,0,5>)	;POINTER FOR DEPOSITING RD (REF DATA)
	MOVE	C,REFBIT		;2=DEFINED, 1=REFERNCED
	DPB	C,[POINT 6,1(TX),5]	;DEPOSIT REFTYPE BITS
	MOVE	C,LINE
	LSH	C,1
	IOR	C,REFINC		;LINE*2+(IF REF THEN 1 ELSE 0); LAST REFLINE
	HRLM	LINE,2(SX)		;STORE  LASTLINE ON WHICH REF OCCURED.
	HRRM	TX,2(SX)		;ADDRESS OF REFCHAIN
	JRST	STV12
LNSRCH:	; LONG SYMBOL - AC0 IS POINTER
	; SX IS HEAD OF HASH-CHAIN
	HLRZ	C,AC0			; [21] GET LENGTH
	HLRZ	TEMP,(SX)		; [21] GET LENGTH OF FIRST-OF-CHAIN
	CAIE	C,(TEMP)		; [21] = ?
	JRST	LNSRC1			; [21] NO - NO CHANCE
	PUSHJ	P,COMPLN		; [21] YES - COMPARE NAMES
	JRST	STV10B			; [21] = - DON'T BOTHER TO MOVE TO HEAD

LNSRC1:	MOVE	BYTEX,SX		; [21] ADVANCE
	SKIPN	SX,1(SX)		; [21]  TO NEXT
	JRST	NTFND			; [21] END OF CHAIN - NOT FOUND
	HLRZ	TEMP,(SX)		; [21] GET LENGTH
	CAIE	C,(TEMP)		; [21] SAME ?
	JRST	LNSRC1			; [21] NO - TRY NEXT
	PUSHJ	P,COMPLN		; [21] YES - COMPARE NAMES
	JRST	STV10			; [21] = - DONE
	JRST	LNSRC1			; [21] NOT - TRY AGAIN

COMPLN:	; COMPARE LONG NAMES. POINTERS IN (SX) & AC0. SKIP IF NOT =.
	; LENGTHS ARE = ON ENTRY, IN C (WORDS)
	; PRESERVE BYTEX,SX,AC0, C(UNLESS =)
	HRRZM	AC0,L1			; [21] SAVE ADDRESS 1
	MOVE	TEMP,(SX)		; [21] GET, &
	HRRZM	TEMP,L2			; [21] SAVE ADDRESS 2

CMPLN1:	MOVE	TEMP,@L1		; [21] COMPARE
	CAME	TEMP,@L2		; [21]  A WORD
	JRST	CMPLN2			; [21] UNEQUAL
	AOS	L1			; [21] ADVANCE
	AOS	L2			; [21]  ADDRESSES
	SOJG	C,CMPLN1		; [21] & LOOP, UNLESS DONE
	HRRZ	C,AC0			; [21] EQUAL - RETURN NEW BUFFER
	HLRZ	AC0,AC0			; [21] C:=POINTER; AC0:=LENGTH;
	LSH	AC0,-2			; [21] AC0:= # OF 4-WORD BLOCKS

CMPLN3:	MOVE	TEMP,C			; [21] ADDR OF 4-WORD BLOCK
	EXCH	TEMP,FSTPNT		; [21] CHAIN INTO
	MOVEM	TEMP,1(C)		; [21]   FREE CORE CHAIN
	ADDI	C,4			; [21] ADVANCE TO NEXT BLOCK,
	SOJG	AC0,CMPLN3		; [21]   IF ANY
	POPJ	P,			; [21] SAY EQUAL

CMPLN2:	HLRZ	C,AC0			; [21] RESTORE C
	AOS	(P)			; [21] AND SKIP
	POPJ	P,			; [21]  RETURN
;MOVE SX TO HEAD OF LIST.
STV9:	EXCH	SX,BYTEX		;MAKE SX=CURRENT, BYTEX=PREVIOUS
STV10:	MOVE	C,(TX)			;GET LIST-HEAD
	EXCH	C,1(SX)			;SAVE THAT IN OUR LINKOUT
	MOVEM	C,1(BYTEX)		;OUR OLD LINKOUT INTO PREVIOUS LINKOUT
	MOVEM	SX,(TX)			;OUR ADDRESS IN LIST HEAD
STV10B:	LDB	C,[POINT 17,2(SX),17]	;GET LINE NUMBER OF PREVIOUS REFERENCE
	HRRZ	TX,2(SX)		;POINTER TO REFCHAIN
	CAME	C,LINE			;LAST LINE THE SAME AS THIS LINE?
	JRST	STV10A			;NOPE.
	LDB	TEMP,[POINT 6,1(TX),5]	;GET THE REFERENCE TYPE BITS
	TDOE	TEMP,REFBIT		;TURN ON A BIT FOR THIS TYPE OF REFERENCE
	POPJ	P,			;THIS KIND OF REF EXISTS ALREADY.
	JRST	STV10C

STV10A:	MOVE	TEMP,REFBIT		;SET REFERENCE/DEFINITION TYPE
STV10C:	DPB	TEMP,[POINT 6,1(TX),5]	;STORE REFTYPE
	DPB	LINE,[POINT 17,2(SX),17]	;STORE CURRENT LINE NUMBER
	SUBM	LINE,C			;C_(CURRENT LINE-PREVIOUS REF LINE)
	HRRZ	C,C			;[54] MIGHT BE NEGATIVE, STORE
					;[54] 18 BITS NOW & EXTEND LATER
	LSH	C,1			;DOUBLE DIFFERENCE
	IOR	C,REFINC		;PLUS 1 IF REFERENCE
	MOVE	BYTEX,0(TX)		;GET THE BYTE POINTER

;HERE C= 2*(THIS LINE-PREVIOUS REF LINE)+(IF DEFINING THEN 0 ELSE 1)
;BYTEX=BYTE POINTER FOR RD (REF DATA)
;CONTENTS OF C ARE STORED AS RADIX =32 BYTES, WITH THE 40 BIT ON IN EVERY
;BYTE BUT THE LAST.  THESE BYTES ARE STORED IN 6-BIT FIELDS.

STV12:	ORM	FLAG,2(SX)		;STORE FLAG (SIGN BIT)
	CAIGE	C,40
	JRST	STV20			;SMALL OPTIMIZATION
	MOVEM	P,PPTEMP
STV14:	IDIVI	C,40
	PUSH	P,CS
	CAIL	C,40
	JRST	STV14
STV16:	TRO	C,40
	PUSHJ	P,STV20
	POP	P,C
	CAME	P,PPTEMP
	JRST	STV16

;HERE WITH C CONTAINING A BYTE OF REFERENCE DATA
STV20:	TRNE	BYTEX,1			;SKIP END-TEST IF EVEN WORD
	CAML	BYTEX,[POINT 6,0,16]	;AT END?
	JRST	STV22			;NOT AT END (OF 9-BYTE RD STRING)
	HRRM	FREE,0(BYTEX)		;STORE FREE POINTER INTO REFCHAIN
	MOVE	BYTEX,FREE		;SET BYTE POINTER TO POINT AT FREE
	HRLI	BYTEX,(<POINT 6,0>)
	ADDI	FREE,2			;INCREMENT FREE POINTER
	CAML	FREE,.JBREL
	PUSHJ	P,XCEED
STV22:	IDPB	C,BYTEX			;STOW BYTE
	MOVEM	BYTEX,0(TX)		;AND BYTE POINTER
	POPJ	P,
	SUBTTL	HANDLE NEW-STYLE INPUT

;HERE TO READ A SYMBOL NAME

FREAD:	PUSHJ	P,READ		;READ A LABEL.  GET CHARACTER COUNT
	MOVEI	TEMP1,(C)	;SAVE CHARACTER COUNT
	SETZM	FRDTMP		;ACCUMULATE SIXBIT HERE.
	MOVE	AC0,[POINT 6,FRDTMP]	;POINTER FOR 6-BIT DEPOSIT
FM4:	PUSHJ	P,READ		;GET A CHARACTER
	CAIL	C,"A"+40	;[70] IS IT LOWER CASE?
	CAILE	C,"Z"+40	;[70] 
	SKIPA			;[70] NO.
	SUBI	C,40		;[70] YES, MAKE IT UPPER
	SUBI	C,40		;CONVERT TO SIXBIT
	TLNN	AC0,770000	; [21] IF WORD IS EXHAUSTED
	JRST	LNGSYM		; [21] GO HANDLE LONG SYMBOL
	SKIPE	C		;[66] IF CHARACTER IS SPACE, DON'T SAVE
	IDPB	C,AC0		;STUFF THIS CHARACTER
	SOJG	TEMP1,FM4	;LOOP WHILE CHARACTER COUNT LASTS
	JRST	LB5		;[51]

FAILM:	PUSHJ	P,READ		;177 SEEN.  GET THE NEXT. 
	CAIN	C,I.BRK		;[17] BREAK BETWEEN FORTRAN SUBROUTINES?
	JRST	R0		;YES.  FLUSH PRESENT CREF DATA AND REINITIALIZE
	CAIE	C,I.BEGN	;IS THIS THE START
	JRST	NOTINF		;NO.  PUT THE 177 INTO THE OUTPUT STREAM
	TLO	IO,IOFAIL	;THIS IS A NEW-STYLE PROGRAM
FM2:	PUSHJ	P,READ		;GET NEXT
	CAIN	C,177		;RUBOUT?
	JRST	TEND		;YES. CHECK FOR END
	CAILE	C,DTABLN	;IN RANGE?
	JRST	ERROR		;FOO!
	XCT	DTAB-1(C)	;EXCECUTE SPECIFIC FUNCTION
	JUMPE	SX,FM2		;JUMP IF NO FLAGS WERE SET - GOBBLE MORE CREF DATA
	TLZE	SX,IODF2	;DO WE WANT TO DEFINE IT?
	TLO	IO,IODEF	;YES, SET REAL DEFINITION FLAG
	PUSHJ	P,FREAD		;GET THE SYMBOL NAME
FM6:	PUSHJ	P,M6		;GO ENTER SYMBOL
	JRST	FM2

TEND:	MOVE	AC0,SVLAB	;IS THERE A LABEL TO PUT IN?
	JUMPE	AC0,TEND1	;NO.
	SETZM	SVLAB		;CLEAR SAVED LABEL
	MOVSI	SX,IOSYM
	PUSHJ	P,M6		;PUT THE LABEL IN
TEND1:	PUSHJ	P,READ		;CHECK FOR VALID END CHARACTER
	CAIN	C,I.FINV	;
	JRST	M2		;177D JUST GOBBLE CREF INFO BUT NO LINE NUMBER
	MOVSI	TEMP,(<JFCL>)
	MOVEM	TEMP,M0XCT	;INFORMATION WAS SEEN ON LINE.  FLUSH TAB WRITER
	CAIN	C,I.NLTB 	;[21] NO LINE NUMBER, NO TAB
	JRST	M2		;[21] YES.
	CAIN	C,I.FTAB
	TLOA	IO,IOTABS	;TAB AFTER LINE NUMBER
	CAIN	C,I.FNTB	;OTHER LEGAL END CHARACTER?
	SKIPA	C,LINE		;LEGAL END CHARACTER.  C GETS LINE NUMBER
	JRST	ERROR		;LOSE - ILLEGAL INPUT FORMAT
	JRST	M2B		;GO WRITE THE LINE NUMBER
;DISPATCH TABLE FOR SPECIAL CHARACTERS (1-17)
DTAB:	JRST	SETLAB		; ^A=1 PREVIOUS SYMBOL IS REFERENCED
	JRST	DLAB		; ^B=2 PREVIOUS SYMBOL IS DEFINED
	MOVSI	SX,IOOP		; ^C=3 OPCODE REFERENCE -  GOBBLE NAME
	MOVSI	SX,IOOP!IODF2	; ^D=4 OPCODE DEFINITION - GOBBLE NAME
	MOVSI	SX,IOMAC	; ^E=5 MACRO REFERENCE
	MOVSI	SX,IOMAC!IODF2	; ^F=6 MACRO DEFINITION
	SETZB	SX,SVLAB	; ^G=7 FAIL TAKES BACK A MISTAKEN OCCURANCE
	JRST	COMBIN		; ^H=10 COMBINE TWO FIXUP CHAINS FOR FAIL
	JRST	DEFSYM		; ^I=11 DEFINE SYMBOL (CHANGE NUMBER TO NAME)
	JRST	ERROR		; ^J=12 LF
	JRST	DEFMAC		; ^K=13 DEFINE MACRO (CHANGE NUMBER TO NAME)
	JRST	ERROR		; ^L=14 FF
	JRST	BBEG		; ^M=15 BLOCK BEGIN
	JRST	BBEND		; ^N=16 BLOCK END
	JRST	SETLIN		; ^O=17 READ LINE NUMBER FROM FILE
DTABLN==.-DTAB
SUBTTL LONG SYMBOLS.

LNGSYM:	PUSH	P,TEMP		; [21] SAVE AN AC
	MOVEI	AC0,6(TEMP1)	; [21] ALLOW FOR 6 ALREADY DONE
	IDIVI	AC0,6		; [21] LENGTH
	SKIPE	TEMP		; [21]  IN
	ADDI	AC0,1		; [21]   WORDS
	TRNE	AC0,1		; [21] MAKE IT EVEN *** MUST BE ***
	ADDI	AC0,1		; [21]
	TRNE	AC0,2		; [21] MAKE MULTIPLE OF 4
	ADDI	AC0,2		; [21]
	MOVE	TEMP,FREE	; [21] GET 
	ADD	FREE,AC0	; [21]  SOME
	CAML	FREE,.JBREL	; [21]   CORE, IF
	PUSHJ	P,XCEED		; [21]    NEEDED.
	HRLZ	AC0,AC0		; [21]
	HRR	AC0,TEMP	; [21]
	EXCH	AC0,FRDTMP	; [21] SAVE WORD-COUNT,,PNTR, GET 1ST WORD
	MOVEM	AC0,(TEMP)	; [21] SAVE 1ST WORD OF SYMBOL IN BUFFER
	ADD	TEMP,[
	POINT	6,1]		; [21] FORM BYTE-POINTER TO 2ND WORD

LB0:	SKIPE	C		;[66] IF CHARACTER IS SPACE, DON'T SAVE
	IDPB	C,TEMP		; [21] PUT CHARACTER AWAY
	SOJLE	TEMP1,LB1	; [21] SEE IF DONE
	PUSHJ	P,READ		; [21] NOT - GET NEXT CHARACTER
	CAIL	C,"A"+40	; [73] IS IT LOWER CASE?
	CAILE	C,"Z"+40	; [73]
	SKIPA			; [73] NO - SKIP
	SUBI	C,40		; [73] YES - CONVERT TO UPPER
	SUBI	C,40		; [21] TO SIXBIT
	JRST	LB0		; [21] AND LOOP

LB1:	TLNN	TEMP,770000	; [21] WHOLE WORD ?
	JRST	LB2		;[62] YES.
	MOVEI	C,0		; [21]
	IDPB	C,TEMP		; [21] NULL FILL
	JRST	LB1		; [21] & TRY AGAIN

LB2:	ADDI	TEMP,1		;[62] ZERO REST OF FOUR WORD BLOCK
	HRRZ	TEMP,TEMP	;[66] JUST WANT RIGHT HALF
LB3:	CAML	TEMP,FREE	;[66] ARE WE DONE?
	JRST	LB4		;[62] YES.
	SETZM	(TEMP)		;[62] NOPE, ZERO THAT WORD
	AOJA	TEMP,LB3	;[62] AND TRY AGAIN!
LB4:	POP	P,TEMP		;[62][21]
LB5:	MOVE	AC0,FRDTMP	;[51] LOAD RESULT INTO AC0 (AC0=0 - DON'T DO SKIPN)
	JUMPE	AC0,ERROR	;ERROR IF ZERO.
	POPJ	P,
	SUBTTL	DEFMAC, DEFSYM, COMBIN

;REDEFINE SYMBOL NAME FOR FAIL (CHANGES NUMERIC NAME TO ITS PRINTING NAME)
DEFMAC:	SKIPA	SX,[MACTBL]		;CODE 13
DEFSYM:	MOVEI	SX,SYMTBL		;CODE 11
	MOVE	AC0,SVLAB
	JUMPE	AC0,DEFS0		;NO SAVED SYMBOL
	SETZM	SVLAB	

;ENTER SAVED SYMBOL BEFORE REDEFINING A SYMBOL NAME, IN CASE IT'S THE SAVED
;SYMBOL THAT'S BEING REDEFINED.
	PUSH	P,SX			;SAVE SX
	MOVSI	SX,IOSYM		;SET TO DEFINE OLD SYMBOL
	PUSHJ	P,M6			;STUFF SYMBOL
	POP	P,SX
DEFS0:
	PUSHJ	P,FREAD			;GET SYMBOL NAME
	MOVE	BYTEX,AC0
	IDIVI	BYTEX,HASH
	MOVMS	TX			;HASH IT
	ADDI	TX,(SX)			;ADDRESS OF CHAIN HEADER
	SKIPN	SX,(TX)
	JRST	DEFBYP			;NOT FOUND
DEFS1:	CAMN	AC0,(SX)		;FIND SYMBOL
	JRST	DEFFD
	SKIPE	SX,1(SX)
	JRST	DEFS1
DEFBYP:	PUSHJ	P,FREAD			;HERE IF SYMBOL IS NOT FOUND (ERROR?)
	JRST	FM2

;HERE IF THE SYMBOL IS FOUND.  SX POINTS TO OUR ENTRY FOR IT
DEFFD:	PUSHJ	P,FREAD			;NOW GET DEFINITION
	MOVEM	AC0,(SX)		;STORE DEFINITION
	MOVE	AC0,BLKND		;GET BLOCK NAME
	HRRM	AC0,3(SX)		;STORE IT WITH SYMBOL
	JRST	FM2
;HERE WHEN FAIL DISCOVERS THAT TWO FORMERLY DIFFERENT SYMBOLS ARE THE SAME.
;COMBINE THEIR CREF SYMBOLS INTO ONE NEW SYMBOL.

COMBIN:	PUSHJ	P,FREAD			;GET FIRST
	MOVE	BYTEX,AC0
	IDIVI	BYTEX,HASH
	MOVMS	TX
	MOVEI	SX,SYMTBL-1(TX)
CMB1:	MOVE	TEMP,SX			;FIND IT (TEMP IS THE PREVIOUS POINTER)
	SKIPN	SX,1(TEMP)
	JRST	DEFBYP			;NOT FOUND (ERROR?)
	CAME	AC0,(SX)
	JRST	CMB1
	PUSHJ	P,FREAD			;FOUND FIRST.  NOW, GET NEXT NAME
	MOVE	BYTEX,AC0
	IDIVI	BYTEX,HASH
	MOVMS	TX
	MOVEI	TEMP1,SYMTBL-1(TX)
CMB2:	MOVE	TX,TEMP1
	SKIPN	TEMP1,1(TX)
	JRST	MOVSYM			;SECOND NOT FOUND
	CAME	AC0,(TEMP1)
	JRST	CMB2
	LDB	BYTEX,[
	POINT 17,2(TEMP1),17]		;GET LINE NUMBER FROM SECOND
	LDB	AC0,[
	POINT 17,2(SX),17]		;AND FROM FIRST.
	CAML	BYTEX,AC0		;AND SEE WHICH IS SMALLER
	JRST	CMBOK			;SMALLER IS ONE TO DELETE (SX)
	MOVE	AC0,2(SX)		;SWAP FIRST AND SECOND TO MAKE SX SMALLER
	EXCH	AC0,2(TEMP1)
	MOVEM	AC0,2(SX)
	MOVE	AC0,3(SX)
	EXCH	AC0,3(TEMP1)
	MOVEM	AC0,3(SX)
CMBOK:	MOVE	BYTEX,FREE		;GOBBLE A 2-WORD BLOCK
	ADDI	FREE,2
	CAML	FREE,.JBREL
	PUSHJ	P,XCEED
	MOVSI	AC0,400000		;PREPARE TO SET FLAG IN (TX) IF NEEDED
	SKIPGE	C,2(SX)			;SKIP IF FLAG OFF IN SX (C _ REFCHAIN)
	IORM	AC0,2(TEMP1)		;TURN ON BIT IN TEMP1 IF BIT WAS SET IN SX
	HLL	C,3(TEMP1)		;AUXCHAIN FROM MAIN SYMBOL
	MOVEM	C,(BYTEX)		;STORE: AUX POINTER,,REFCHAIN ADDRESS
	SKIPN	3(TEMP1)		;WAS THERE AN OLD MERGE POINTER?
	MOVEM	BYTEX,3(TEMP1)		;NO. "TAIL" OF AUXLIST = (BYTEX)
	MOVE	C,3(SX)			;GET AUXLIST FROM DELETED SYMBOL
	HLLM	C,3(TEMP1)		;STUFF IT AS OUR AUXLIST.
	JUMPE	C,CMB4			;JUMP IF THERE IS NO OLD AUXLIST.
	HRLM	BYTEX,(C)		;APPEND NEW LIST (BYTEX) TO OLD AUXLIST
CMB3:	MOVE	TX,FSTPNT		;PUT DELETED SYMBOL BACK ON FREE LIST
	EXCH	TX,1(SX)		;AND LINK IT OUT OF THE SYMBOL TABLE
	MOVEM	SX,FSTPNT
	MOVEM	TX,1(TEMP)
	JRST	FM2
CMB4:	HRLM	BYTEX,3(TEMP1)		;NO OLD AUXLIST. (BYTEX)=HEAD OF NEW AUXLIST
	JRST	CMB3

COMMENT $
THE LAST WORD OF A SYMBOL ENTRY POINTS TO THE HEAD AND TAIL OF AN AUXILIARY
LIST OF ENTRIES FOR THIS SYMBOL (LH=HEAD, RH=TAIL).
THE AUXILIARY LIST CONTAINS TWO-WORD ENTRIES OF:
	0/ LINKOUT,,REFCHAIN ADRESS
	1/ UNUSED
$

MOVSYM:	MOVE	BYTEX,AC0		;GET THE SYMBOL NAME AGAIN
	TLNN	BYTEX,770000		; [21] POINTER TO LONG SYMBOL ?
	MOVE	BYTEX,(BYTEX)		; [21] YES - FOLLOW IT
	IDIVI	BYTEX,HASH
	MOVMS	TX
	SKIPE	TEMP1,FSTPNT		;GET A BLOCK
	JRST	[MOVE	BYTEX,1(TEMP1)
		MOVEM	BYTEX,FSTPNT
		JRST	MOVS1]
	MOVE	TEMP1,FREE
	ADDI	FREE,4
	CAML	FREE,.JBREL
	PUSHJ	P,XCEED
MOVS1:	MOVE	BYTEX,SYMTBL(TX)	;INSERT SYMBOL INTO SYMBOL TABLE
	MOVEM	BYTEX,1(TEMP1)
	MOVEM	TEMP1,SYMTBL(TX)
	MOVEM	AC0,(TEMP1)
	HRLI	BYTEX,2(SX)
	HRRI	BYTEX,2(TEMP1)
	BLT	BYTEX,3(TEMP1)		;COPY INFO FROM DELETED SYMBOL
	MOVE	TX,FSTPNT		;PUT DELETED SYMBOL BACK ON FREE LIST
	EXCH	TX,1(SX)		;AND LINK IT OUT OF THE SYMBOL TABLE
	MOVEM	SX,FSTPNT
	MOVEM	TX,1(TEMP)
	JRST	FM2
	SUBTTL	LABELS AND BLOCKS.  SETLAB, DLAB, BBEG, BBEND, BLKPRN,SETLIN

SETLAB:	PUSHJ	P,FREAD			;GET LABEL.  SYMBOL REFERENCE
	EXCH	AC0,SVLAB		;CHANGE FOR OLD LABEL
	JUMPE	AC0,FM2			;IF NO OLD LABEL, GO GET MORE
	MOVSI	SX,IOSYM		;SET TO REFERENCE OLD LABEL
	JRST	FM6			;ADD OLD LABEL TO SYMBOL TABLE

DLAB:	MOVE	AC0,SVLAB		;USE LAST LABEL.  DEFINE PREVIOUS SYMBOL
	SETZM	SVLAB			;NO OLD LABEL NOW.
	JUMPE	AC0,ERROR		;ERROR IF NONE THERE
	MOVSI	SX,IOSYM		;SET FOR SYMBOL TABLE
	TLO	IO,IODEF		;SET FOR DEFINING OCCURANCE.
	PUSHJ	P,M6			; [22] STUFF IT
	JRST	FM2			; [22] ONWARD

BBEG:	AOS	TEMP,LEVEL		;GET CURRENT LEVEL.  BEGIN A BLOCK
	MOVSI	SX,0			;FLAG BEGIN FOR COMBEG
	JRST	COMBG			;GO INSERT BEGIN IN BLOCK LIST

BBEND:	MOVE	TEMP,LEVEL		;CURRENT LEVEL
	SOSGE	LEVEL			;RESET LEVEL
	SETZM	LEVEL			;BUT NOT TO GO NEGATIVE (PRGEND DOES THIS!)
	MOVEI	SX,1			;FLAG BEND FOR COMBEG

COMBG:	PUSHJ	P,FREAD			;GET BLOCK NAME
	MOVE	TEMP1,FREE
	ADDI	FREE,4			;RESERVE 4 WORDS
	CAML	FREE,.JBREL
	PUSHJ	P,XCEED
	MOVEM	AC0,(TEMP1)		;SAVE BLOCK NAME
	HRLZM	TEMP,1(TEMP1)		;AND LEVEL
	MOVEM	LINE,2(TEMP1)		;AND CURRENT LINE
	HRLM	SX,2(TEMP1)		;AND FLAG TO SELECT BEGIN/BEND
	MOVE	TEMP,BLKND		;ADD THIS BLOCK TO END OF LIST
	HRRM	TEMP1,1(TEMP)
	MOVEM	TEMP1,BLKND		;SET END OF THE LIST TO POINT HERE
	JRST	FM2
COMMENT $
BLOCK NAME LIST
Block names are entered on a single-linked list of four-word elements.
Each element contains:
	0/	block name (sixbit)
	1/	block level,,link to next element
	2/	BEGIN/BEND flag,,Line number where the BEGIN/BEND  occured
	3/	Unused

BLKND points to the last entry (initially to BLKST-1, which is the head of the list).
$

;PRINT BLOCK NAMES.  CALL WITH BYTEX POINTING TO THE LIST OF BLOCK NAMES

BLKPRN:	PUSHJ	P,LINOUT		;PRINT BLOCK LIST
	MOVE	CS,@BLKND		;NAME OF THE OUTER BLOCK IS PROGRAM NAME
	CAME	CS,[SIXBIT /E----1/]	;[72] SKIP FOR ALGOL THE BLOCK-END
					;[72] NAME AS 'E----1'
	PUSHJ	P,OUTAS2		;[27] SKIP ALGOL TEST & WRITE IN ASCII
	MOVEI	C,11
	PUSHJ	P,WRITE	
	MOVE	CS,[SIXBIT /PROGRA/]	;GET THE "M" LATER...
	PUSHJ	P,OUTASC
	MOVEI	C,"M"
	PUSHJ	P,WRITE
BLKP3:	PUSHJ	P,LINOUT		;NEXT LINE
	HLRZ	BYTEM,1(BYTEX)		;GET BLOCK LEVEL
	LSH	BYTEM,-1		;DIVIDE BY 2
					;(INDENT 4 SPACES HALF-TAB FOR EACH LEVEL)
	JUMPE	BYTEM,BLKP1
	PUSHJ	P,TABOUT		;OUTPUT MANY TABS
	SOJG	BYTEM,.-1		;HALF AS MANY TABS AS NESTING LEVEL
BLKP1:	HLRZ	BYTEM,1(BYTEX)		;GET THE BLOCK LEVEL AGAIN
	HLRZ	SX,2(BYTEX)		;0=BEGIN, 1=BEND
	TRNE	BYTEM,1			;ODD LEVEL?
	ADDI	SX,4			;YES.  NEED 4 MORE SPACES
	JUMPE	SX,BLKP2		;NOW WRITE SPACES FROM COUNT IN SX
	MOVEI	C," "			;(ONE EXTRA SPACE FOR BEND)
	PUSHJ	P,WRITE
	SOJG	SX,.-1			;WRITE ENOUGH SPACES
BLKP2:	MOVE	CS,(BYTEX)		;GET AND WRITE THE BLOCK NAME
	PUSHJ	P,OUTAS2		;[27] SKIP ALGOL TEST
	HLRZ	SX,2(BYTEX)		;0=BEGIN, 1=BEND
	MOVNS	SX
	ADDI	SX,5			;4 SPACES FOR BEND, 5 FOR BEGIN
	SKIPN	CS,(BYTEX)
	JRST	BLKP2A			;BLANK BLOCK NAMES ARE NOT GENERATED BY FAIL
	JRST	.+2
	LSH	CS,-6
	TRNN	CS,77
	AOJA	SX,.-2			;COUNT TRAILING SPACES IN THE BLOCK NAME
BLKP2A:	MOVEI	C," "
	PUSHJ	P,WRITE
	SOJG	SX,.-1			;WRITE SPACES TO GET TO A NICE COLUMN
	HRRZ	C,2(BYTEX)		;GET THE LINE NUMBER
	PUSHJ	P,CNVRT			;AND WRITE IT
	HRRZ	BYTEX,1(BYTEX)		;ADVANCE TO NEXT BLOCK NAME
	JUMPN	BYTEX,BLKP3		;LOOP UNLESS LIST EXHAUSTED
	TLO	IO,IOPAGE		;TIME FOR A NEW PAGE
	POPJ	P,

SETLIN:	PUSHJ	P,READ			;[17] READ LINE NUMBER FROM FILE
	MOVEI	TEMP,(C)		;[17] SAVE CHARACTER COUNT
	MOVEI	LINE,0			;[17] ACCUMULATE NEW VALUE
SETLI1:	PUSHJ	P,READ			;[17] GET A DIGIT
	IMULI	LINE,12			;[17]
	ADDI	LINE,-"0"(C)		;[17]
	SOJG	TEMP,SETLI1		;[17]
	JRST	FM2			;[17] DONE. SCAN MORE.
	SUBTTL	EOF SEEN.  OUTPUT TABLES AND FINISH UP.

R0:	MOVE	C,[SOSG LSTBUF+2]	;SET UP WRITE ENTRANCE INSTRUCTION
	MOVEM	C,WRITEE		;SO THAT CREF DATA WILL BE WRITTEN
	SKIPE	BYTEX,BLKST		;CHECK FOR FAIL BLOCK STRUCTURE
	PUSHJ	P,BLKPRN		;PRINT FAIL BLOCK STRUCTURE
	MOVE	CS,@BLKND		;SET FOR PURGED SYMBOL W/O BLOCK NAME
	MOVEM	CS,BLKST-1		;BLOCK NAME OF OUTER BLOCK SAVED HERE.
	TLZ	IO,IOSAME		;CLEAR FLAG FOR OUTP
	MOVEI	BYTEX,SYMTBL
	TLNE	IO,IOSYM		;SKIP IF NO SYMBOL OUTPUT REQUIRED
	PUSHJ	P,SORT			;SORT SYMTBL - OUTPUT SYMTBL
	MOVEI	BYTEX,MACTBL
	TLNE	IO,IOMAC		;SKIP IF NO MACRO OUTPUT REQUIRED
	PUSHJ	P,SORT			;SORT AND OUTPUT MACTBL
	MOVEI	BYTEX,OPTBL
	TLNE	IO,IOOP			;SKIP IF NO OPCODE OUTPUT REQUIRED
	PUSHJ	P,SORT			;SORT AND OUTPUT OPTBL

	MOVE	P,PPSAV			;RE-INITIALIZE STACK.
	TLZN	IO,IOEOF		;END OF FILE SEEN?
	JRST	RECYCL			;NO, RECYCLE (F40 PROGRAM?)

	CLOSE	LST,			;FINISH LISTING (IN CASE OF TTY OUTPUT)
	PUSHJ	P,TSTLST		;YES, TEST FOR ERRORS
	RELEAS	LST,

	TLNE	IO,IOCCL
	JRST	CCLFN
	MOVEI	RC, [[ASCIZ /[CRFXKC /]] ;[17][34] IDENTIFY MESSAGE
	PUSHJ	P,PNTM0			;[17] IDENTIFY MESSAGE
	EXCH	IO, MYWCH		;[40]
	TLNN	IO, (JW.WFL)		;[40] /MES:FIR??
	 JRST	R0X			;[40] NO - SKIP
	MOVE	C,.JBREL
	LSH	C,-12			;CONVERT WORDS TO K
	ADDI	C,1
	PUSHJ	P,TYDEC			;[20] TYPE DECIMAL
	OUTSTR	[ASCIZ/K core/]	;[34]
	TLNN	IO, (JW.WPR)		;[40] /MES:(PRE,FIR) ??
	OUTCHR	[" "]			;[40] NO - ONLY /MES:FIR
R0X:	OUTSTR	[ASCIZ /]
/]					;[40] [61] CAP OFF MESSAGE
	EXCH	IO, MYWCH		;[40] RESTORE STUFF
					;[37] FALL INTO CCLFN
;[37]    ***   FALL HERE FROM PREVIOUS PAGE   ***

CCLFN:

IFE STANSW,<	HLRZ	C,INDIR+1	;GET INPUT FILE EXTENSION
		CAIE	C,'CRF'		;IS IT CRF OR
		CAIN	C,'LST'		;  LST?
		TLNE	IO,IOPROT	;YES, IS IT PROTECTED (/P SWITCH)?
		JRST	CCLFN1		;PROTECTED, OR NOT 'LST' OR 'CRF'
		SETZB	TEMP,TEMP+1	;CRF OR LST AND NOT PROTECTED
		SETZB	TEMP+2,TEMP+3	;LET'S DELETE IT
		RENAME	CHAR,TEMP	;RENAME FILE TO 0 TO DELETE IT
		 JFCL			;IGNORE RENAME FAILURES >

CCLFN1:	RELEAS	CHAR,
	TLNN	IO,IOCCL		;CCL MODE?
	JRST	CREF			;NO. RETURN FOR NEXT ASSEMBLY
CCLFN3:	MOVSI	IO,IOCCL
	MOVE	C, LASCHR		;[37] PICKUP LAST SEEN COMMAND CHAR
	CAIE	C, 12			;[37] READY FOR NEW LINE OF COMMANDS
	 PUSHJ	P, EATLIN		;[37] NO - EAT REST OF THIS LINE
	JRST	RETCCL

TYDEC:	IDIVI	C,12
	HRLM	CS,(P)
	JUMPE	C,.+2
	PUSHJ	P,TYDEC
	HLRZ	C,(P)
	ADDI	C,"0"
	OUTCHR	C
	POPJ	P,
	SUBTTL	SORT SYMBOL TABLE

COMMENT $

This sort routine should not be approached as a trivial programming
example.  This is coded for speed and compactness, not clarity.

For each non-empty symbol chain, LSORT is called, which sorts that
one chain.  Sorted chains are deposited into a compact table (SORT2)
which is terminated by a zero (SORT4).  Then, adjacent pairs of lists
are merged by LMERGE, and deposited in a compact table.  Each
pairwise merge pass continues until one of a pair is zero, at which
time a zero is deposited at the end of the compact area, and another
merge pass is started.  The pairwise merge terminates when the second
word of the first pair is zero, at which point the result is the
first word of that pair.

The routine LSORT is recursive.  A single-element is list is sorted.
For longer lists, break the list into two lists (of approximately
equal size) and sort those two lists (i.e., recur).  The result of
those two sorts is merged (LMERGE again) to form one sorted list.

Also, this sort routines causes the hash table to be cleared to zero.

$

SORT:	MOVEM	BYTEX,SRTTMP		;SAVE FIRST ADDRESS OF HASH TABLE
	HRLI	BYTEX,-HASH		;AOBJN POINTER TO TABLE
	MOVEI	FLAG,-1(BYTEX)		;PUSHDOWN POINTER TO "FIRST FREE" HEADER
SORT1:	SKIPN	SX,(BYTEX)		;GET LIST HEADER
	JRST	SORT3			;THIS IS EASY
	SETZM	(BYTEX)			;CLEAR OUT SOURCE ENTRY
	PUSHJ	P,LSORT			;SORT ONE CHAIN. RESULT IS POINTER IN SX
SORT2:	PUSH	FLAG,SX			;STORE SORTED CHAIN
SORT3:	AOBJN	BYTEX,SORT1		;ADVANCE TO NEXT CHAIN
SORT5:	HRRZ	BYTEX,SRTTMP		;GET BACK THE HASH TABLE ADDRESS
	SETZB	SX,TX
	EXCH	SX,(BYTEX)		;GET FIRST CHAIN (STORE ZERO)
	EXCH	TX,1(BYTEX)		;ANY SECOND CHAIN? (STORE ZERO)
	JUMPE	TX,OUTP			;NO. RESULT IS IN SX.  CALL OUTP
	MOVEI	FLAG,-1(BYTEX)		;INITIALIZE POINTER FOR DEPOSITS
SORT6:	PUSHJ	P,LMERGE		;MERGE SX,TX. RESULT IN SX
	PUSH	FLAG,SX			;STUFF RESULT
	ADDI	BYTEX,2			;ADVANCE TO NEXT
	SETZB	SX,TX
	EXCH	SX,(BYTEX)		;GET FIRST OF NEXT PAIR (STORE ZERO)
	JUMPE	SX,SORT5		;NO NEXT PAIR.  DO ANOTHER MERGE PASS
	EXCH	TX,1(BYTEX)		;GET SECOND OF PAIR (STORE ZERO)
	JUMPE	TX,SORT2		;NOT THERE. PUSH SX. (BYTEX>0)
	JRST	SORT6			;LOOP UNTIL A PAIRWISE MERGE PASS COMPLETES
;SORT ONE NON-EMPTY LIST POINTED TO BY SX, RESULT IN SX.
LSORT:	SKIPN	TX,1(SX)		;GET NEXT LINK
	POPJ	P,			;LIST WITH ONE ELEMENT IS SORTED.
	MOVE	C,TX			;TAIL OF TX LIST
	MOVE	CS,SX			;TAIL OF SX LIST
LSORT1:	MOVE	TEMP,1(C)		;GET LINK-OUT OF TS-LIST
	MOVEM	TEMP,1(CS)		;STORE LINK-OUT OF NA-LIST
	SKIPN	CS,TEMP			;ADVANCE NA-TAIL
	JRST	LSORT2			;NONE LEFT
	MOVE	TEMP,1(CS)
	MOVEM	TEMP,1(C)
	SKIPE	C,TEMP
	JRST	LSORT1
LSORT2:	PUSH	P,TX			;TX AND SX ARE EACH HALF THE LENGTH OF
	PUSHJ	P,LSORT			;ORIGINAL LIST.  RECUR TO SORT EACH
	EXCH	SX,(P)			;SX AND TX GET EXCH'D HERE, BUT NO ONE CARES
	PUSHJ	P,LSORT
	POP	P,TX
;ENTER HERE TO MERGE TWO NON-EMPTY LISTS INTO ONE.  ARGS IN SX,TX; RESULT IN SX
LMERGE:	MOVEI	CS,C-1			;LIST HEAD (OF RESULT) INTO C.
SCOMP:	MOVE	TEMP,(SX)		;COMPARE CAR(SX), CAR(TX).
	MOVE	TEMP1,(TX)		; [21] 
	TLNN	TEMP,770000		; [21] LONG SYMBOL ?
	JRST	LSYM1			; [21] YES
	TLNN	TEMP1,770000		; [21] LONG SYMBOL ?
	JRST	LSYM2			; [21] YES.
	CAMGE	TEMP,(TX)		;COMPARE SYMBOL NAMES
	JRST	LCOMP			;CAR(SX)<CAR(TX) DONE.
	CAME	TEMP,(TX)		;EQUAL?
	JRST	XCOMP			;NO. CAR(TX)<CAR(SX). EXCH THEM, THEN DONE

ECOMP:	MOVE	TEMP,3(SX)		;GET THE BLOCK POINTER
	MOVE	TEMP,(TEMP)		;GET THE BLOCK NAME (SX)
	MOVE	TEMP1,3(TX)
	CAML	TEMP,(TEMP1)		;SKIP IF SX IS THE SMALLER
XCOMP:	EXCH	SX,TX			;CAR(TX)<CAR(SX). TO MAKE SX THE SMALLER
LCOMP:					;SX IS NOW THE SMALLER
	MOVEM	SX,1(CS)		;APPEND SMALLER TO OUTPUT LIST
	MOVEI	CS,(SX)			;ADVANCE OUTPUT LIST TO INCLUDE THIS
	SKIPE	SX,1(SX)		;REPLACE LIST BY ITS CDR. 
	JRST	SCOMP			;LOOP UNTIL SOME LIST EMPTIES
	MOVEM	TX,1(CS)		;SX EMPTY. APPEND TX LIST TO OUTPUT
	MOVE	SX,C			;RETURN HEAD OF OUTPUT-LIST
	POPJ	P,
SUBTTL SORT LONG SYMBOLS

LSYM1:	; (SX) IS POINTER IN TEMP: (TX) MAYBE POINTER TOO
	TLNE	TEMP1,770000		; [21] POINTER ?
	MOVEI	TEMP1,(TX)		; [21] NO - MAKE IT SO
	TLO	TEMP1,1			; [21] SAY 6 CHARS
	JRST	LSYM3			; [21]

LSYM2:	; (TX) IS POINTER IN TEMP1; (SX)(IN TEMP1) ISN'T
	MOVEI	TEMP,(SX)		; [21] MAKE IT SO
	TLO	TEMP,1			; [21] SET LENGTH = 1 WORD

LSYM3:	HLRZM	TEMP,L1			; [21] SAVE
	HLRZM	TEMP1,L2		; [21]  LENGTHS

LSYML:	MOVE	TEMPX,(TEMP)		; [21] GET WORD
	CAME	TEMPX,(TEMP1)		; [21] = ?
	JRST	LSYMNE			; [21] NO
	SOSG	L1			; [21] YES - CHECK LENGTHS
	JRST	LSYM4			; [21] L1 FINISHED
	SOSG	L2			; [21] NOT - L2 ?
	JRST	XCOMP			; [21] YES - (TX)<(SX)
	AOJ	TEMP,			;[65] NO,INCREMENT POINTER TO SYMBOL
	AOJA	TEMP1,LSYML		;[65] INCREM. PTR. TO SYMBOL 
					;[65] AND TEST NEXT WORDS

LSYM4:	SOSG	L2			; [21] L1 DONE - L2 ?
	JRST	ECOMP			; [21] YES - EQUAL
	JRST	LCOMP			; [21] NO - (SX)<(TX)

LSYMNE:	CAML	TEMPX,(TEMP1)		; [21] NOT = - WHICH LARGER ?
	JRST	XCOMP			; [21] (TX)<(SX)
	JRST	LCOMP			; [21] (SX)<(TX)
	SUBTTL	OUTPUT ROUTINES.  OUTP, GETVAL, CNVRT, OUTASC

OUTASC:	SETZ	TEMP,			;[67] ZERO CHARACTER COUNT
	TLNN	CS,770000		; [21] POINTER ?
	JRST	OUTLNG			; [21] YES - DEAL WITH LONG SYMBOL
OUTAS2:	MOVEI	C,0			;[27] SIXBIT IN CS, OUTPUT ASCII.
	LSHC	C,6
	CAIE	C,'0'
	JRST	OUTAS1
	MOVEI	C," "
	PUSHJ	P,WRITE0		;CHANGE LEADING 0'S TO BLANKS FOR F4
	JUMPN	CS,OUTASC
	POPJ	P,

OUTLNG:	HLRZM	CS,L1			; [21] SAVE LENGTH
	HRRZM	CS,L2			; [21] SAVE POINTER

OUTLN2:	MOVE	CS,@L2			; [21] GET WORD
	JUMPE	CS,OUTLN3		;[67] JUST SPACES LEFT? JUMP IF SO.
	PUSHJ	P,OUTAS0		; [21] OUTPUT
	AOS	L2			; [21]
	SOSLE	L1			; [21] MORE ?
	JRST	OUTLN2			; [21] YES
OUTLN3:	IDIVI	TEMP,8			;[67] NO. HOW MANY TAB STOPS PASSED?
	SUB	WPL,TEMP		;[67] SUBTRACT THOSE FROM TOTAL COUNT.

OUTAS0:	MOVEI	C,0
	LSHC	C,6
OUTAS1:	ADDI	C,40
	PUSHJ	P,WRITE0
	AOJ	TEMP,			;[67] ADD ONE TO CHARACTER COUNT
	JUMPN	CS,OUTAS0		;ANY MORE TO PRINT?
	POPJ	P,			;DONE

OUTP:	JUMPE	SX,CPOPJ		;NO.
	TLO	IO,IOPAGE
OUTPA:	SKIPL	2(SX)			;IGNORE SYMBOL?
	JRST	LNKOUT			;YES (IT WAS NEVER MENTIONED IN RANGE)
	PUSHJ	P,LINOUT		;SEND CRLF TO OUTPUT
	MOVE	CS,(SX)			;GET SYMBOL NAME
	PUSHJ	P,OUTASC		;CONVERT TO ASCII AND SEND TO OUTPUT
	MOVE	CS,(SX)			;GET SYMBOL NAME AGAIN
	MOVE	TX,1(SX)		;GET LINK TO NEXT SYMBOL.
	CAMN	CS,(TX)			;IS NEXT SYMBOL THE SAME AS THIS?
	JUMPN	TX,ISBLK		;YES. PRINT BLOCK NAME IF NEXT SYMBOL EXISTS
	TLZN	IO,IOSAME		;THIS MIGHT BE LAST OF A SET OF SAME NAMES
	JRST	NOBLK			;NO, THIS IS UNIQUE
	SKIPA				;AVOID SETTING IOSAME
ISBLK:	TLO	IO,IOSAME		;NEXT LINE NEEDS BLOCK NAME.
	PUSHJ	P,TABOUT		;DO A TAB
	MOVE	CS,3(SX)		;GET A POINTER TO THE BLOCK NAME
	MOVE	CS,(CS)			;GET THE BLOCK NAME ITSELF
	PUSHJ	P,OUTASC		;WRITE IT
NOBLK:	PUSHJ	P,OUTP1			;NOW, THE REST OF THE DATA FOR THIS SYM
LNKOUT:	SKIPN	SX,1(SX)		;GET LINK TO NEXT
	PJRST	LINOUT			;[24] NO NEXT - CRLF & EXIT
	JRST	OUTPA			;PROCESS NEXT
OUTP1:	MOVEI	FLAG,3(SX)
LINLP:	HLRZ	FLAG,(FLAG)
	JUMPE	FLAG,LAST
	PUSH	P,[LINLP]		;POPJ WILL RETURN TO LINLP
	SKIPA	BYTEX,(FLAG)
LAST:	HRRZ	BYTEX,2(SX)
	HRLI	BYTEX,(<POINT 6,0,5>)
	ADDI	BYTEX,1
	MOVE	BYTEM,-1(BYTEX)
	MOVEI	LINE,0
	JRST	GETV20			;START OUTPUTTING VALUES

GETVAL:	TLZN	IO,IODEF
	JRST	GETV20
	MOVEI	C,"#"
	PUSHJ	P,WRITE
GETV20:	CAMN	BYTEX,BYTEM
	POPJ	P,
	PUSHJ	P,TABOUT
	MOVEI	C,0
GETV10:	TRNE	BYTEX,1
	CAML	BYTEX,[POINT 6,0,16]
	JRST	GETV12
	MOVE	BYTEX,0(BYTEX)
	HRLI	BYTEX,(<POINT 6,0>)

GETV12:	ILDB	CS,BYTEX
	ROT	CS,-5
	LSHC	C,5
	JUMPN	CS,GETV10
	TRNN	C,1			;SET DEFINED FLAG
	TLO	IO,IODEF
	LSH	C,-1
	HRRE	C,C			;[54] EXTEND IN CASE NEGATIVE
	ADDB	LINE,C
	PUSH	P,[GETVAL]		;RETURN FROM CNVRT TO GETVAL

CNVRT:	MOVEI	TEMP,5			;HERE TO OUTPUT A FIVE-DIGIT NUMBER FROM C
	MOVEI	TEMP1,0
CNVRT1:	IDIV	C,TABL(TEMP)
	ADD	TEMP1,C
	ADDI	C,40
	SKIPE	TEMP1
	ADDI	C,20
	PUSHJ	P,WRITE
	MOVE	C,CS
	SOJGE	TEMP,CNVRT1
	POPJ	P,

TABL:	DEC	1,10,100,1000,10000,100000
	SUBTTL	OUTPUT ROUTINES -  TABOUT, LINOUT, WRITE

LINOUT:	SOSG	LPP
	TLO	IO,IOPAGE
	MOVEI	C,15
	PUSHJ	P,WRITE
	MOVEI	C,12
	MOVE	WPL,.WPL
	JRST	WRITE

TABOU0:	PUSHJ	P,LINOUT
TABOUT:	MOVEI	C,11
	SOJL	WPL,TABOU0
WRITE0:	TLZN	IO,IOPAGE
	JRST	WRITE
	PUSH	P,C
	MOVEI	C,14
	PUSHJ	P,WRITE
	MOVEI	C,.LPP
	MOVEM	C,LPP
	POP	P,C

WRITE:	XCT	WRITEE			;SOSG LSTBUF+2  OR JRST WRITE1
	PUSHJ	P,DMPLST
	IDPB	C,LSTBUF+1
	XCT	WRITEX			;EXIT FROM WRITE (POPJ P, OR CAIE C,12)
 	POPJ	P,			;WASN'T LF IN TTY OUTPUT MODE.
					;FORCE TTY OUTPUT AFTER EVERY LINE.
DMPLST:	XCT	DMPXCT			;OUTPUT BUFFER (OUT OR PUSHJ P,DMPOUT)
	POPJ	P,			;WIN.
					;LOSE.
TSTLST:	STATO	LST,742000		;ANY ERROR. (EOT NOT TESTED BY OUT UUO)
	POPJ	P,			;NO ERRORS.
	GETSTS	LST,ERRSTS
	MOVEI	CS,LSTDEV
	JSP	RC,DVFSTS
	 [ASCIZ/?CRFOUE OUTPUT error, /]	;[17][34] IDENTIFY MESSAGE
	JRST	CREF

DMPOUT:	OUTPUT	LST,
	STATZ	LST,742000		;CHECK FOR EOT ON TAPE OPERATIONS
	AOS	(P)			;ERROR STATUS.  SKIP RETURN
	POPJ	P,

WRITE1:	CAMGE	LINE,FIRSTL		;TIME TO START WRITING YET?
	POPJ	P,			;NO.
	PUSH	P,C
	MOVE	C,[SOSG LSTBUF+2]
	MOVEM	C,WRITEE		;FIX THE WRITE ENTRANCE INSTRUCTION
	POP	P,C
	JRST	WRITE			;NOW GO AN PLUNK THAT CHARACTER
	SUBTTL	HERE TO EXPAND CORE - XCEED

XCEED:	PUSH	P,1		;HERE TO EXPAND CORE
	HRRZ	1,.JBREL	;GET CURRENT TOP
	MOVEI	1,2000(1)
IFN SEGSW,<	CAIGE	1,HISEG		;[74] DON'T EXPAND LOWER ABOVE HISEG>
	CORE	1,		;REQUEST MORE CORE
	JRST	ERRCOR		;ERROR, BOMB OUT
	POP	P,1
	POPJ	P,


;[51] HERE ON SYNTAX ERROR IN COMMAND SCANING

REPEAT	0, <	;[51] TRY THIS ON FOR SIZE
SCNERR:	SETOM	SYNERR		;[51] FLAG SYNTAX ERROR OCCURRED
	CAIE	C,12		;[51] AT EOL?
	 PUSHJ	P,EATLIN	;[51] NO - EAT REST OF LINE
	MOVEM	C,CMDTRM	;[51] REMEMBER FINISHED LINE
	POPJ	P,		;[51] RETURN TO ISSUE ERROR MESSAGE
>	;[51] END OF REPEAT 0 ON SCNERR

	SYN	ERRCM, SCNERR	;[51] NOW - BOMB USER BIG!


;HERE FOR HELP
IFE STANSW,<
HELP43:	SETOM	LEAFLG		;[51] FORCE EARLY EXIT
HELP:	CAIE	C,12		;[51] IF IN MIDDLE OF LINE, THEN
	PUSHJ	P, EATLIN	;[37] EAT REST OF THIS LINE
	MOVE	1,[SIXBIT 'CREF'] ;[43]
	PUSHJ	P,.HELPR
	SKIPE	LEAFLG		;[43] SPECIAL (".CREF/H")??
	 JRST	LEAVE		;[43] YES - GO EXIT
	JRST	CREF	>	;AND START OVER
	SUBTTL	SCAN COMMAND INPUT

NAME1:	SETZB	ACDEV,ACFILE
	SETZB	ACEXT,ACDEL
	SETZB	TIO,CS
	SETZB	ACPPN, SYNERR	;[32] NO SYNTAX ERROR
	MOVEI	FLAG, <TXTSIZ * 5> ;[31] # CHARS IN BUFFER
	MOVE	ACTXT,[POINT 7,TXTBUF] ;POINTER FOR TENEX
	MOVEM	ACTXT,ASCCNT	;TO WORD

NAME3:	MOVSI	ACPNTR,(<POINT 6,ACTXT>) ;SET POINTER
	SETZ	ACTXT,		;[51] READY FOR NEXT PASS
GETIOC:	PUSHJ	P,TTYIN		;GET INPUT CHARACTER
	CAIN	C,12		;[61] ESC. AND RET. CHANGED TO LF.
	JRST	TSTIOC		;[61] ONE OF THE THREE, LINE COULD BE EMPTY
	CAIN	C," "		;[61] IS CHAR. A SPACE?
	JRST	TSTIOC		;[61] YES, LINE COULD BE EMPTY
	CAIE	C,11		;[61] IS CHAR. A TAB?
	SETOM	ACHR		;[61] NO, LINE IS NOT EMPTY
TSTIOC:	CAIN	C,"/"		;[61]
	JRST	SLASH
	CAIN	C,"("
	JRST	SWITCH
	SOSLE	FLAG		;ROOM IN TEXT BUFFER?
	IDPB	C,ASCCNT	;YES. PUT IT AWAY
	MOVEM	C,CMDTRM	;SAVE LAST COMMAND CHARACTER
	CAIN	C, "@"		;[33] ARE WE SEEING COMMAND FILE SPECS?
	JRST	NAMCMD		;[33] YES - GO FLAG AS SUCH
	CAIE	C,"="		;[35] LOOKING AT OUTPUT SPECS
	CAIN	C,12		;[41] ALT MODES AND  RETURN CHANGED TO LINE FEED
	JRST	TERM
	CAIE	C,","
	CAIN	C,"!"
	JRST	TERM		; ! IS FOR RUNING NEXT PROGRAM
	CAIN	C,":"
	JRST	DEVICE
	CAIE	C, " "		;[43] SPACE?
	CAIN	C,"."
	JRST	NAME
	CAIE	C,"<"
	CAIN	C,"["
	JRST	PROGNP		;GET PROGRAMER NUMBER PAIR
	CAIL	C,"A"
	CAILE	C,"Z"
	JRST	[CAIL C,"0"	;NOT ALPHABETIC, IS IT NUMERIC?
		CAILE C,"9"
		  JRST	SCNERR	;[32]
		JRST .+1]
	SUBI	C,40		;CONVERT TO 6-BIT
	TLNE	ACPNTR,770000	;HAVE WE STORED SIX BYTES?
	IDPB	C,ACPNTR	;NO, STORE IT
	JRST	GETIOC		;GET NEXT CHARACTER
DEVICE:	JUMPN	ACDEV, SCNERR	;[32] DUPLICATE NAME IS ERROR
	MOVE	ACDEV, ACTXT	;[32] SET DEVICE NAME
	JRST	NAME02		;[32] COMMON CODE

NAMCMC:	SETZ	ACTXT,		;[33] ENTRY FROM PATH PROCESSING
NAMCMD:	MOVEM	C, CMDFLG	;[33] REMEMBER COMMAND FILE SPECS
	SETZ	C,		;[33] SET TO IGNORE IN ACDEL
NAME:	CAIE	ACDEL, "."	;[51] FOLLOW EXTENSION?
	 JRST	NAME01		;[51] NO - MUST BE NAME (IF ANYTHING)
	JUMPN	ACEXT, SCNERR	;[33] DUPLICATE EXTENSION IS ERROR
	HLLO	ACEXT, ACTXT	;[33] SET NEW-FOUND EXTENSION
	JRST	NAME02		;[33] AND KEEP PARSING

NAME01:	JUMPE	ACTXT, NAME02	;[51] IGNORE IF BLANK
	JUMPN	ACFILE, SCNERR	;[32] DUPLICATE FILENAME IS ERROR
	MOVE	ACFILE,ACTXT	;FILE NAME
NAME02:	MOVE	ACDEL,C		;[32] SET DELIMITER
	JRST	NAME3		;GET NEXT SYMBOL



TERM:	CAIN	ACDEL,"."	;[51] IS ACTXT ACTUALLY EXTENSION?
	 JRST	TERM01		;[51] YES - DIFFERENT
	JUMPE	ACTXT,TERM02	;[51] IF NOTHING THERE JUST LEAVE
	JUMPN	ACFILE,SCNERR	;[51] IF SOMETHING MUST BE FILENAME
	MOVE	ACFILE,ACTXT	;[51] SO SET IF NOT ALREADY SEEN ONE.
	JRST	TERM02		;[51] AND CAP OFF EVERYTHING
TERM01:	JUMPN	ACEXT,SCNERR	;[51] DUPLICATE EXTENSION IS ERROR
	HLLO	ACEXT,ACTXT	;[51] SET EXTENSION
TERM02:	SETZ	ACTMP,		;[32]
	DPB	ACTMP,ASCCNT	;TIE OFF ASCII STRING
	SKIPLE	CMDFLG		;[33] NEED TO RETURN "@" FLAG?
	 MOVEI	C, "@"		;[33] YES - THEN DO SO
	PUSH	P, FLAG		;[43] NEED 2 CONTIGUOUS (!!!) AC'S
	MOVE	ACTMP, TTRSWT	;[43] PICK UP USER CCL STICKY FLAGS
	SKIPN	SWTINI		;[44] USER NOT WANT SWITCH.INI DEFAULTS?
	 IOR	ACTMP, SWSINI	;[44] NO - SLIP IN WITH OTHERS
TERM07:	JFFO	ACTMP, TERM10	;[43] LOOP PROCESSING THEM ALL
	 POP	P, FLAG		;[43] RESTORE FLAG FOR OUTSIDE WORLD
	 POPJ	P,		;[43] RETURN WITH FILE SPECS ETC.
TERM10:	XCT	SWTAB(FLAG)	;[43] DO THIS SWITCH
	MOVNI	FLAG, (FLAG)	;[43] NOW NEED LSH INDEX
	MOVSI	ACTXT, (1B0)	;[43] AND BIT TO LSH
	LSH	ACTXT, (FLAG)	;[43] AND OF COURSE, A LSH
	TDZ	ACTMP, ACTXT	;[43] CLEAR OUT THIS "SWITCH"
	JRST	TERM07		;[43] AND LOOP BACK FOR MORE
PROGNP:	CAIE	ACDEL, "."	;[32] DID WE FINISH OFF AN EXTENSION?
	 JRST	PROG01		;[32] NO - SKIP
	JUMPN	ACEXT, SCNERR	;[32] YES - IF DUPLICATE THEN ERROR
	HLLO	ACEXT, ACTXT	;[32] SAVE AWAY FILE EXTENSION
	JRST	PROG02		;[32] AND BUILD PPN/PATH
PROG01:	JUMPE	ACTXT, PROG02	;[32] 0 MEANS NOTHING HAPPENED OF INTEREST
	JUMPN	ACFILE, SCNERR	;[32] CAUSE ERROR IF DUPLICATE FILENAME
	MOVE	ACFILE, ACTXT	;[32] SET FILENAME
PROG02:	MOVEI	ACDEL, "["	;[32] SET NEW ACDEL FLAG
	JUMPN	ACPPN, SCNERR	;[32] DUPLICATE PPN IS ERROR
	PUSHJ	P,TTI8		;BUILD A PROJECT, PROGRAMMER NUMBER
	CAIE	C,"-"		;[32] EXPLICIT DEFAULT PATH?
	 JRST	PROG07		;[32] NO - SKIP
	PUSHJ	P, TTYIN	;[32] SKIP A CHARACTER
	SOSLE	FLAG		;[32] ROOM TO STASH AWAY?
	IDPB	C, ASCCNT	;[32] YES - STASH AWAY
	JRST	PROG50		;[32] GO AWAY
PROG07:	CAIE	C,","
	 JRST	SCNERR		;[32]
	HRLZ	ACPPN,ACTMP
	PUSHJ	P,TTI8
	IORI	ACPPN, (ACTMP)	;[32]
	TLNN	ACPPN, -1	;[32] EXPLICIT PROJECT NUMBER?
	 HLL	ACPPN, MYPPN	;[32] NO - FILL IN FROM LOGGED-IN PPN
	TRNN	ACPPN, -1	;[32] EXPLICIT PROGRAMMER NUMBER?
	 HRR	ACPPN, MYPPN	;[32] NO - FILL IN FROM LOGGED-IN PPN
	CAIE	C, ","		;[32] EXTENDED PATH????
	 JRST	PROG50		;[32] NO - SKIP NONSENSE
	SETZM	SCNPTH		;[32] YES - FIRST ZERO PATH BLOCK
	MOVE	ACTMP, [SCNPTH,,SCNPTH+1] ;[32] . . .
	BLT	ACTMP, SCNPTH + .PTMAX - 1 ;[32] . . .
	MOVEM	ACPPN, SCNPPN	;[32] SET PPN PART OF PATH
	MOVE	ACPPN, [IOWD <.PTMAX-3>,SCNPPN+1] ;[32] POINTER TO BUILD PATH
PROG20:	PUSHJ	P, TTISIX	;[32] READ IN SIXBIT SFD NAME
	AOBJP	ACPPN, SCNERR	;[32] MAKE SURE DON'T OVERFLOW
	MOVEM	ACTXT, (ACPPN)	;[32] SAVE AWAY LATEST ADDITION
	CAIN	C,","		;[32] MORE???
	 JRST	PROG20		;[32] YEP - GO GET IT
	MOVEI	ACPPN, SCNPTH	;[32] RETURN EXTENDED PATH-BLOCK ADDRESS
PROG50:	CAIE	C,"]"
	CAIN	C,">"
	JRST	NAME3		;[32] GO READ IN NEXT ITEM
	CAIE	C,"="		;[32][35] ALSO ALLOW "=" / "_" TO TERMINATE
	CAIN	C,12		;[32] DON'T FORGET BREAK CHARS ALSO
	JRST	TERM		;[32] END OF SCAN
	CAIE	C, ","		;[32] OTHER SCAN TERMINATORS
	CAIN	C, "!"		;[32] . . .
	JRST	TERM		;[32] OTHER SCAN TERMINATOR
	CAIN	C, "@"		;[33] COMMAND FILE?
	JRST	NAMCMC		;[33] YES - GO FLAG AS SUCH
	JRST	SCNERR		;[32] USER LOSES
IFE STANSW,<
TTI8:	MOVEI	ACTMP,0		;BUILD AN OCTAL NUMBER
TTI8B:	PUSHJ	P,TTYIN
	SOSLE	FLAG
	IDPB	C,ASCCNT
	CAIL	C,"0"
	CAILE	C,"7"
	POPJ	P,		;RETURN ON A NON-OCTAL DIGIT
	LSH	ACTMP,3
	ADDI	ACTMP,-"0"(C)
	JRST	TTI8B
>;IFE STANSW

IFN STANSW,<
TTI8:	MOVEI	ACTMP,0
TTI8B:	PUSHJ	P,TTYIN
	SOSLE	FLAG
	IDPB	C,ASCCNT
	CAIL	C,"A"+40
	CAILE	C,"Z"+40
	JRST	TTI8C		;NOT LOWER CASE
	SUBI	C,40		;LOWER TO UPPER CASE
TTI8A:	LSH	ACTMP,6
	ADDI	ACTMP,-" "(C)
	JRST	TTI8B

TTI8C:	CAIL	C,"A"
	CAIL	C,"Z"
	JRST	.+2
	JRST	TTI8A		;UPPERCASE
	CAIL	C,"0"
	CAILE	C,"9"
	POPJ	P,		;NOT VALID CHARACTER IN PPN
	JRST	TTI8A		;DIGITS
>;IFN STANSW
TTIDEC:	SETZ	ACTMP,		;[45] INITIALIZE
TTIDE1:	PUSHJ	P, TTYIN	;[45] NEXT CHARACTER
	SOJLE	FLAG, . + 2	;[45] ROOM TO REMEMBER?
	 IDPB	C, ASCCNT	;[45] LEAVE FOR TENEX FREAKS
	CAIL	C, "0"		;[45] DECIMAL DIGIT???
	CAILE	C, "9"		;[45] . . .
	 POPJ	P,		;[45] NO - RETURN NUMBER IN ACTMP
	IMULI	ACTMP, 12	;[45] READY FOR NEXT DECADE
	ADDI	ACTMP, -"0"(C)	;[45] NEXT DECADE
	JRST	TTIDE1		;[45] LOOP FOR ENTIRE NUMBER



TTISIX:	MOVSI	ACPNTR, (POINT 6,) ;[32] ACTXT IS AC 0
	SETZ	ACTXT,		;[32]
TTISI1:	PUSHJ	P, TTYIN	;[32] NEXT CHARACTER
	SOSLE	FLAG		;[32] ROOM IN BUFFER
	IDPB	C, ASCCNT	;[32] YES - STUFF IN COMMAND CHAR
	CAIL	C, "0"		;[32] CAN POSSIBLY BE APHANUMERIC?
	CAILE	C, "Z"		;[32] . . .
	 POPJ	P,		;[32] NO - RETURN
	CAIL	C, "9"		;[32] CAN . . .
	CAIL	C, "A"		;[32] . . .
	CAIA			;[32] GOOD - ALPHANUMERIC
	 POPJ	P,		;[32]
	SUBI	C, "0" - '0'	;[32] CONVERT TO SIXBIT CHARACTER
	TLNE	ACPNTR, (77B5)	;[32] ROOM IN WORD??
	IDPB	C, ACPNTR	;[32] YES - STUFF IT IN
	JRST	TTISI1		;[32] AND LOOP
	SUBTTL	SWITCH PROCESSING

SWITCH:	PUSHJ	P,TTYIN
	CAIL	C,"0"
	CAILE	C,"9"
	JRST	SWIT1
	PUSHJ	P,GETLIM
	CAIE	C,","
	JRST	ERRCM
	MOVEM	ACTMP,LOWLIM
	PUSHJ	P,TTYIN
	PUSHJ	P,GETLIM
	CAIE	C,")"
	JRST	ERRCM
	MOVEM	ACTMP,UPPLIM
	CAML	ACTMP,LOWLIM
	JRST	GETIOC		;UPPLIM .GE. LOWLIM
	MOVE	ACTMP,[POPJ P,]
	MOVEM	ACTMP,M6X	;DON'T ENTER ANYTHING IN THE SYMBOL TABLE
	JRST	GETIOC

SWIT1:	CAIN	C,")"
	JRST	GETIOC
	PUSHJ	P,SW1
	PUSHJ	P,TTYIN
	JRST	SWIT1

GETLIM:	TDZA	ACTMP,ACTMP
GETLI1:	PUSHJ	P,TTYIN
	CAIL	C,"0"
	CAILE	C,"9"
	POPJ	P,
	IMULI	ACTMP,12	;ACCUMULATE DECIMAL
	ADDI	ACTMP,-"0"(C)
	JRST	GETLI1

SLASH:				;[51] BE MORE STRINGENT
SW0:	PUSHJ	P,TTYIN
SW1:	MOVEI	C,-"A"(C)	;CONVERT FROM ASCII TO NUMERIC
	CAILE	C,"Z"-"A"	;WITHIN BOUNDS?
	JRST	ERRSWT		;[42] NO, ERROR
	XCT	SWTAB(C)	;EXECUTE THE SWITCH FUNCTION FOR THIS SWITCH
	CAIN	ACDEL,"/"	;[51] WAS LAST THING SEEN A SWITCH?
	 JUMPE	ACTXT,GETIOC	;[51] YES - IF NOTHING SINCE JUST KEEP ON
	MOVEI	C,"/"		;[51] SET FOR LAST SEEN A SWITCH
	JRST	NAME		;[51] SEE IF WE CAPPED OFF FILENAME, ETC
	SUBTTL	COMMAND SWITCH TABLE

SWTAB:	ADDI	CS,1			;A - ADVANCE FILE
	SUBI	CS,1			;B - BACKSPACE FILE
	SETOM	SWTINI			;[44] C - CANCEL SWITCH.INI DEFAULTING
	SETZM	SWTINI			;[44] D - DEFAULTING (SWITCH.INI)
	JRST	ERRSWT			;E
	JRST	ERRSWT			;F
	JRST	ERRSWT			;G
	JRST	HELP			;H - HELP
	JRST	ERRSWT			;I
	JRST	ERRSWT			;J
	TLZ	IO,IOSYM		;K - KILL (SUPPRESS) SYMBOL TABLE LISTING
	JRST	ERRSWT			;L
	TLZ	IO,IOMAC		;M - SUPPRESS MACRO TABLE LISTING
	JRST	ERRSWT			;N
	TLO	IO,IOOP			;O - ENABLE OPCODE TABLE LISTING
	TLO	IO,IOPROT		;P - PROTECT (I.E. DON'T DELETE) INPUT FILES
	JRST	ERRSWT			;Q
	SETOM	FIRSTL			;R - USER WILL SPECIFY STARTING LINE NUMBER
	TLO	IO,IOLST!IOLSTS		;S - SUPPRESS PROGRAM.  LIST ONLY TABLES.
	TLO	TIO,TIOLE		;T - ADVANCE TO END OF TAPE
	JRST	ERRSWT			;U
	JRST	ERRSWT			;V
	TLO	TIO,TIORW		;W - REWIND TAPE
	JRST	ERRSWT			;X
	JRST	ERRSWT			;Y
	TLO	TIO,TIOCLD		;Z - ZERO DECTAPE DIRECTORY


;[42] HERE ON UNKNOWN SWITCH SEEN

ERRSWT:	MOVEI	C, "A"(C)	;[42] BACK TO ASCII LETTER
	MOVEI	RC,[[ASCIZ\?CRFUKS Unknown switch "/\]] ;[42][44]
	PUSHJ	P, PNTMSG	;[44] PRINT FIRST PART OF MESSAGE
	EXCH	TIO, MYWCH	;[44] NEED BLASTED WATCH BITS
	TLNN	TIO, (JW.WFL)	;[44] /MES:FIR ON?
	 JRST	ERRSW1	;[44] NO - SKIP THIS CRUD
	CAIE	C,12		;[51] DON'T TYPE "/<LF>"
	OUTCHR	C		;[44] TELL USER OFFENDING SWITCH
	OUTCHR	[""""]		;[44]
	TLNE	IO, IOSINI	;[44] IN SWITCH.INI PROCESSING?
	 OUTSTR	[ASCIZ/ in DSK:SWITCH.INI/] ;[44] TELL USER THIS ALSO
ERRSW1:	EXCH	TIO, MYWCH	;[44] RESTORE THINGS
	OUTSTR	CRLF		;[44] CAP OFF MESSAGE
	TLNE	IO, IOSINI	;[44] REGULAR OR SWITCH.INI ERROR?
	 JRST	LEAVE		;[44] SWITCH.INI - LEAVE NOW (NO LOOP)
	JRST	CREF		;[44] USER ERROR - REGULAR RESTART
	SUBTTL	PROCESS COMMAND FILE REQUEST

CMDFIL:	TLZ	IO, IORSCN	;[43] CLEAR WEIRD RESCAN FLAG
	MOVE	AC0, FIRSTL	;[45] NEED TO CHECK FOR ".CREF/R @X"
	TDNE	AC0, LEAFLG	;[45] I.E., BOTH THESE FLAGS 'ON'
	 SETOM	RRFLAG		;[45] SET STICKY CCL-TTY-RESCAN /R FLAG
	SETZM	LEAFLG		;[43] AND IT'S ASSOCIATED KLUDGE
	TLON	IO, IOCCL	;[33] FAKE CCL-MODE OPERATION
	 JRST	CMDF05		;[33] . . .
	SKIPE	TMPFLG		;[33] WHOOPS - ALREADY IN CCL MODE!
	 JRST	CMDF04		;[33] ONLY TMPCOR - FLAG PROCESSED
	SETZM	CTIDIR		;[33] NOT TMPCOR - THEN DSK:###CRE.TMP
	SKIPN	CMDFLG		;[33] OR WAS IT CMD FILE - IF SO SKIP
	RENAME	CTLI, CTIDIR	;[33] JUST CCL .TMP FILE - DELETE IT
CMDF04:	SETZM	TMPFLG		;[33] SCROUNGE AN EXTRA WORD!
CMDF05:	SETOM	CMDFLG		;[33] FLAG IN CMD FILE NOW!!!!!
	RESET			;[33] NOW - STOP THE WORLD
	CAIN	ACDEV, 0	;[33] USER GIVE EXPLICIT DEVICE?
	 MOVSI	ACDEV, 'DSK'	;[33] NO - USE GOOL OLE DSK:
	MOVEM	ACDEV, CTIDEV	;[33] REMEMBER IT FOR FUTURE
	MOVEM	ACFILE, CTIDIR	;[33] SAVE AWAY FILENAME,
	MOVEM	ACEXT, CTIDIR + 1 ;[33] FILE EXTENSION,
	MOVEM	ACPPN, CTIDIR + 3 ;[33] AND THE PATH
	MOVEI	ACDEV-1, 1	;[33] SET OPEN MODE
	MOVEI	ACDEV+1, CTIBUF	;[33] AND INPUT RING HEADER
	OPEN	CTLI, ACDEV - 1	;[33] GET COMMAND DEVICE
	 JRST	NOCLDV		;[33] ERROR - CAN'T GET IT
	INBUF	CTLI, 1		;[33] ONLY NEED ONE BUFFER!
	MOVE	ACTMP, .JBFF	;[33] ALSO NEED TO RESET .JBFF
	MOVEM	ACTMP, SVJFF	;[33] FOR FUTURE "RESETTING"
	LOOKUP	CTLI, CTIDIR	;[33] NOW - LOOKUP THE ACTUAL FILE
	 CAIA			;[33] OOPS - NOT THERE
	JRST	RETCCL		;[33] NOW GO DO ACTUAL CREFFING
	JUMPN	ACEXT, NOCLKP	;[33] IF EXPLICIT EXTENSION, ERROR
	MOVSI	ACEXT, 'CCL'	;[33] NO EXTENSION - TRY DEFAULT .CCL
	MOVEM	ACEXT, CTIDIR + 1 ;[33] . . .
	MOVEM	ACPPN, CTIDIR + 3 ;[33] ALSO RESTORE PATH
	LOOKUP	CTLI, CTIDIR	;[33] NOW TRY AGAIN
	 JRST	NOCLKP		;[46] SIGH
	JRST	RETCCL		;[33] GOT IT - GO READ IT.
	SUBTTL	RUN ANOTHER PROGRAM

;SHRINK CORE, START ANOTHER PROGRAM WHEN A FILE SPEC TERMINATOR IS "!"

RUNUUO:	SKIPN	ACDEV		;IF NO DEVICE, DEFAULT IS SYS:
	MOVSI	ACDEV,'SYS'
	MOVEM	ACPPN,5		;MOVE PROJ,PROG TO 5TH LOCATION
	SETZB	4,6
			;THIS LEAVES DEVICE IN AC1
			;FILENAME IN AC2
			;EXTENSION IN AC3
			;0 IN AC4
			;PROJ,PROG IN AC5
			;0 IN AC6
	MOVEI	7,1			;ADDRESS OF RUN BLOCK
	TLNE	IO,IOCCL		;IN CCL MODE?
	TLO	7,1			;YES. SET STARTING ADDRESS INCREMENT
	MOVE	0,[CORRUN,,10]		;MOVE INSTRUCTIONS TO ACS
	BLT	0,10+COREND-CORRUN	;MOVE CODE INTO ACS
	MOVE	P,[3,,RUNARG]
IFE STANSW,<	MOVE	0,[1,,1]	;USED BY CORE UUO >
IFN STANSW,<	MOVEI	0,1		;USED BY CORE UUO >
	RESET				;KILL OPEN FILES
	JRST	10			;GO SHRINK CORE AND DO RUN

CORRUN:	CORE	0,			;10   SHRINK
	JFCL				;11   IGNORE FAILURE
	COMPT.	P,			;TRY SIMULATED RUN
	 JFCL				;OOPS. HARD TO RECOVER
	RUN	7,			;12   GET NEXT PROGRAM
COREND:	HALT				;13   LET MONITOR PRINT ANY ERROR MESSAGES

CRLF:	BYTE(7)15,12
	SUBTTL	DSK:SWITCH.INI[,] SWITCH DEFAULTING

DOSINI:	MOVEI	TEMP, 1		;[44] ASCII LINE MODE
	MOVSI	TEMP+1, 'DSK'	;[44] DEVICE GOOD-OLE-DSK
	MOVEI	TEMP+2, CTIBUF	;[44] RING HEADER BLOCK
	OPEN	SINI, TEMP	;[44] TRY FOR THE DEVICE
	 POPJ	P,		;[44] OH FOR CRYING OUT LOUD!!
	MOVEI	TEMP, 3		;[44] NOW BUILD LOOKUP BLOCK
	MOVE	TEMP+1, MYPPN	;[47] USE LOGGED-IN PPN FOR PATH
				;[47] THIS IS THE SCHEME THAT SCAN
				;[47] USES, GOOD A CONVENTION AS ANY.
	MOVE	TEMP+2, ['SWITCH'] ;[44] FILENAME
	MOVSI	TEMP+3, 'INI'	;[44] AND OF COURSE, THE EXTENSION
	LOOKUP	SINI, TEMP	;[44] SEE IF SWITCH.INI THERE
	 POPJ	P,		;[44] AT ANY RATE, WE CAN'T HAVE IT
	PUSH	P, IO		;[44] SAVE FLAGS IN IO
	PUSH	P, .JBFF	;[44] SAVE CURRENT .JBFF
	MOVEM	P, PDSINI	;[44] PRESERVE STACK
	INBUF	SINI, 1		;[44] ONLY NEED ONE BUFFER
	MOVSI	IO, IOSINI	;[44] FLAG NOW PROCESSING SWITCH.INI
	SETOM	CRFPUE		;[63] SET SO SWITCH.INI WON'T CAUSE "_" ERROR
	SETOB	FLAG, CTIBUF+2	;[44] SOME GARBAGE FLAGS
DOSIN2:	PUSHJ	P, TTISIX	;[44] READ KEYWORD
	CAMN	ACTXT, ['CREF  '] ;[44] IS IT FOR US?
	 JRST	DOSIN4		;[44] YES - GO SLURP IT UP
	CAIE	C,12		;[71] WE MAY HAVE GOTTEN A COMMENT LINE, IF SO
				;[71] LINE ALREADY EATEN AND <LF> RETURNED IN C
	PUSHJ	P, EATLIN	;[44] NAH - TOSS OUT LINE
	JRST	DOSIN2		;[44] AND TRY AGAIN

DOSIN4:	PUSHJ	P, TTRSCN	;[44] GET SWITCH MASK
	 JRST	ERSINI		;[44] OOPS - NAUGHTY NAUGHTY NAUGHTY
	TLNE	ACTXT, (SWT.HH ! SWT.RR);[45] /H OR /R IN SWITCH.INI
	 JRST	ERSINH		;[44] YES - GOOD GRIEF
	IORM	ACTXT, SWSINI	;[44] ACCUMULATE SWITCHES
	JRST	DOSIN2		;[44] KEEP LOOKING (GREEDY, AREN'T I?)

DOSIN6:	RELEAS	SINI,		;[44] TIME TO GO AWAY
	MOVE	P, PDSINI	;[44] GET BACK OLD "P"
	POP	P, .JBFF	;[44] RESTORE .JBFF
	POP	P, IO		;[44] AND IO FLAGS
	SETZM	CRFPUE		;[63] ENABLE UNDERBAR ERROR MESSAGE
	POPJ	P,		;[44] RETURN TO WHENCE-EVER

ERSINH:	JSP	RC, ERRMSG	;[44] LIKE I SAID . . .
	 [ASCIZ\%CRFSIH "/H" or "/R" switch illegal in SWITCH.INI defaulting\] ;[44]
	JRST	DOSIN6		;[44] JUST A WARNING

ERSINI:	JSP	RC, ERRMSG	;[44] GARBAGE IN SWITCH.INI
	 [ASCIZ/%CRFSII Syntax error in SWITCH.INI defaults/] ;[44]
	JRST	DOSIN6		;[44] JUST A WARNING
	SUBTTL	INPUT FILE HANDLING

;LOGIC FOR INPUT FILE HANDLING (DEFAULTS, OPEN AND LOOKUP)

INFILE:	TLNE	TIO,TIOCLD		;DIRECTORY CLEAR ILLEGAL FOR INPUT
	JRST	ERRCM
	SKIPN	ACDEV
	MOVSI	ACDEV,'DSK'		;DEFAULT INPUT DEVICE
	MOVEM	ACDEV,INDEV		;SAVE DEVICE FOR ERR MESSAGES
	SKIPN	ACFILE
	MOVE	ACFILE,[SIXBIT /CREF/]
	MOVEM	ACFILE,INDIR		;STORE FILE IN DIRECTORY
	HLLZM	ACEXT,INDIR+1		;STORE EXTENSION TOO
	MOVEM	ACPPN,INDIR+3		;STORE PROJ,PROG IN DIRECTORY
	MOVEI	ACTMP,2			;YES. SET UP TRIES
TRYAGN:	MOVE	FLAG,[10,,INARG]
	COMPT.	FLAG,			;TRY TO OPEN INPUT FILE
	 JRST	[TLNN FLAG,-1		;UNIMPLEMENTED?
		 JRST MORMOR		;NO. GO ON TO TRY MORE
		JRST EXTAGN]		;YES. TRY SIXBIT STUFF
	SKIPE	INDIR+1			;ALREADY HAVE AN EXTENSION?
	JRST	GOTIN			;YES. USE IT
	SETZM	TXTBUF			;CLEAR PUT BUFFER
	MOVE	ACTXT,[CHAR,,CP.NAM]	;GET EXT NAME
	HRROI	ACTXT+1,TXTBUF		;THE BUFFER
	MOVSI	ACTXT+2,(1B11)		;EXTENSION ONLY
	MOVE	ACTMP,[3,,ACTXT]
	COMPT.	ACTMP,			;DO THE UUO
	 JFCL				;IT HAS TO WORK
	MOVE	ACTMP,TXTBUF		;GET TEXT BUFFER
	MOVSI	ACTXT,'CRF'		;TO FAK OUT DELETE CODE
	CAME	ACTMP,[ASCIZ /CRF/]
	CAMN	ACTMP,[ASCIZ /LST/]
	MOVEM	ACTXT,INDIR+1		;STORE NAME TO BE DELETED
	JRST	GOTIN
MORMOR:	SOSGE	ACTMP			;MORE TRIES?
	 JRST	EXTFAL			;NO. TSK TSK
	HRRO	FLAG,[[ASCIZ /TMP/]
			[ASCIZ /LST/]](ACTMP) ;GET NEW EXTENSION
	MOVEM	FLAG,EXTNAM		;TO DEFAULT BLOCK
	JRST	TRYAGN			;AND DO IT AGAIN
EXTFAL:	SKIPN	ACHR			;[64]ERROR CAUSED BY BLANK LINE?
	POPJ	P,			;[64]YES, RETURN W/O ERROR MASSAGE
	MOVE	CS,INARG+2		;THE BAD NAME
	JSP	RC, DVFNEX		;[34] GO PRINT ERROR
	 [ASCIZ/?CRFCFI Cannot find input file, /] ;[34]
	POPJ	P,			;AND GIVE UP
EXTAGN:	SETZ	FLAG,
	SKIPE	SYNERR			;SIXBIT SCAN GOOD?
	JRST	ERRCM			;NO. BOMB IT

	MOVSI	ACDEV-1,(1B7)		;[75] INIT DEVICE  SETUP W/ BIGBUF
	MOVEI	ACDEV+1,INBUF		;SET UP ARG FOR BUFFER HEADER
	OPEN	CHAR,ACDEV-1		;OPEN CHANNEL
	 JRST	ERRAVI			;FAILED

GOTIN:	TLZE	TIO,TIORW		;REWIND REQUESTED?
	MTAPE	CHAR,1			;YES
	TLZE	TIO,TIOLE
	MTAPE	CHAR,10			;[76] ADVANCE TO END OF TAPE
	JUMPGE	CS,INFIL2		;ADVANCE/BACKSPACE?
	MTAPE	CHAR,17
	MTAPE	CHAR,17
	AOJL	CS,.-1
	MTAPE	CHAR,0			;[20] WAIT FOR TAPE TO STOP.
	STATO	CHAR,1B24		;SKIP IF AT LOADPOINT
	MTAPE	CHAR,16			;NOT LOADPOINT. ADVANCE OVER EOF MARK
INFIL2:	SOJGE	CS,.-1
	SKIPE	NOIOJF			;[51] CAN WE DO THE I/O BUFFERS?
	 JRST	INFIL3			;[51] NO - MUST BE DONE AT LSTS7
	HRRZS	CS,.JBFF
	MOVEM	CS,IOJFF		;SAVE .JBFF TO RECLAIM THIS BUFFER SPACE
	INBUF	CHAR,0			;[75] BUILD DEFAULT BUFFERS
	MOVE	CS,.JBFF		;[52] SEE HOW BIG IT GREW
	CAMLE	CS,FRJFF		;[52] OVERFLOW PRE-ALLOCATED?
	 JRST	CRFIBP			;[52] YES - CAN'T HAVE TIMESHARING
					;[52] OF FREE CORE,IO BUFFERS
INFIL3:	SKIPE	FLAG			;NEED TO DO LOOKUP?
	JRST	INFILN			;NO. COMPT. WORKED
	JUMPN	ACEXT,INFIL4		;TAKE USER'S EXTENSION IF NON-BLANK
	MOVE	ACEXT,[SIXBIT /CRFLST/]	;TRY CRF 1ST, THEN LST
	JSP	ACDEV,INFILI		;LOOKUP FILE (DON'T RETURN IF FOUND)
	JUMPN	ACEXT,.-1		;KEEP LOOKING UNTIL EXT'S GONE
	MOVSI	ACEXT,'TMP'		;FINALLY TRY TMP THEN NULL
	JSP	ACDEV,INFILI
INFIL4:	JSP	ACDEV,INFILI
	MOVEI	CS,INDEV		;POINT TO INPUT DESCRIPTOR
	SKIPN	ACHR			;[61] ERROR CAUSED BY NULL LINE?
	JRST	IFIL4D			;[61] YES, TRY AGN. W/O ERROR MSG.
	JSP	RC,DVFDIR		;GO PRINT MSG, AND FILE NAME
	 [ASCIZ/?CRFCFF Cannot find file, /] ;[17][34] IDENTIFY MESSAGE
IFIL4D:	TLO	IO,IOPROT		;[61] DON'T DELETE ANY INPUT FILES
	POPJ	P,			;ERROR RETURN

INFILI:	HLLM	ACEXT,INDIR+1	;STORE EXTENSION
	HRLZ	ACEXT,ACEXT	;SLIDE NEXT EXT INTO PLACE
	PUSH	P,ACEXT		;[100] STUFF AN AC
	MOVE	ACEXT,INDIR
	MOVEM	ACEXT,EXTBLK+.RBNAM
	MOVE	ACEXT,INDIR+1
	MOVEM	ACEXT,EXTBLK+.RBEXT
	MOVE	ACEXT,INDIR+3
	MOVEM	ACEXT,EXTBLK+.RBPPN
	MOVEI	ACEXT,.RBVER
	MOVEM	ACEXT,EXTBLK+.RBCNT
	POP	P,ACEXT		;[100]
	LOOKUP	CHAR,EXTBLK
	 JRST	[PUSH P,EXTBLK+.RBEXT
		 POP  P,INDIR+1
		 JRST	(ACDEV)]	;[100]
INFILN:	TLNN	IO,IOCCL	;TYPE FILE NAME IF IN CCL MODE
	JRST	CPOPJ1		;SUCCESS RETURN
	OUTCHR	[11]
	MOVE	ACTMP,[3,,ACTXT]	;[T20] ARGS
	MOVE	ACTXT,[CHAR,,CP.NAM]	;[T20]
	HRROI	ACTXT+1,TXTBUF		;[T20]
	MOVSI	ACTXT+2,(1B8)		;[T20] NAME ONLY
	COMPT.	ACTMP,			;[T20] GET THE NAME
	  SKIPA	CS,INARG+2		;[T20] FAILED, USE OLD WAY
	MOVEI	CS,TXTBUF		;[T20] OUTPUT THE NAME
	OUTSTR	(CS)			;[T20]
	OUTSTR	CRLF		;FOLLOWED BY CARRIAGE RETURN
CPOPJ1:	AOS	(P)
CPOPJ:	POPJ	P,
	SUBTTL	TTYIN	COMMAND CHARACTER INPUT ROUTINE

;[37] HERE TO READ IN A COMMAND CHARACTER, HANDLING ALL THE USUAL
;[37] FORMATTING CONVENTIONS - CONTINUATION LINES ("-" FOLLOWED BY A
;[37] BREAK CHARACTER); COMMENTS (";" - NOTE THAT COMMENTS HAVE A
;[37] "HIGHER" PRIORITY THAN CONTINUATION - ";-<CR>" IS NOT A VALID
;[37] CONTINUATION LINE); SUPPRESS LINE-SEQUENCE NUMBERS IN INPUT;
;[37] CONVERT LOWER-CASE TO UPPER-CASE; CONVERT BREAK CHARACTERS TO
;[37] <LF> CHARACTER; COMPRESS <TAB> TO SPACE; CONVERT MULTIPLE SPACES
;[37] INTO ONE SPACE; SUPPRESS NULLS; AND IMMEDIATELY EXIT ON RECEIPT
;[37] OF EITHER ^C OR ^Z CHARACTERS.
;[37]
;[37] NOTE THAT TEMPORARILY "_" CHARACTER IS CONVERTED TO "=" AND A
;[37] WARNING MESSAGE IS ISSUED ("_" IS RESERVED FOR NETWORK USAGE).
;[37]
;[37] THE SEVEN-BIT ASCII CHARACTER WILL BE RETURNED IN ACCUMULATOR
;[37] C, RIGHT-JUSTIFIED.  ALL OTHER AC'S WILL BE PRESERVED.

TTYIN:	PUSHJ	P, CCLIN	;[37] READ IN ANOTHER CHARACTER
	CAIN	C, "-"		;[37] POSSIBLE CONTINUATION LINE
	JRST	TTYDSH		;[37] YES - GO CHECK IT OUT
	CAIN	C, " "		;[43] SPACE ??
	 JRST	TTYSPC		;[43] YES - GO EAT AS MANY AS POSSIBLE
	CAIN	C, ";"		;[43] COMMENT?
	 JRST	EATLIN		;[43] YES - GO EAT REST OF LINE, RETURN <LF>
TTYINR:	MOVEM	C, LASCHR	;[43] SET LAST CHARACTER RETURNED
	CAIN	C, 12		;[45] EOL??
	 TLZ	IO, IORSCN	;[45] YES - END OF TTY RESCAN INPUT
	POPJ	P,		;[45] RETURN



;[37] HERE TO EAT THE REST OF THE LINE (AS FOR A COMMENT).  ALL CHAR-
;[37] ACTERS UP TO THE NEXT BREAK CHARACTER IN THE COMMAND INPUT STREAM
;[37] WILL BE READ AND DISCARDED, THE BREAK CHARACTER WILL BE RETURNED
;[37] AS A <LF> IN ACCUMULATOR C.

EATLIN:	PUSHJ	P, CCLIN	;[37] READ NEXT CHARACTER
	CAIE	C, 12		;[37] EOL YET?
	JRST	EATLIN		;[37] NOT YET - KEEP EATING THOSE CHARS
	JRST	TTYINR		;[43] RETURN WITH <LF>
TTYIN2:	AOS	CTIBUF+1	;FLUSH SOS LINE NUMBERS
	MOVNI	C,5
	ADDM	C,CTIBUF+2

CCLIN:	SKIPN	C, RPTCHR	;[37] NEED TO "REPEAT" A CHARACTER?
	 JRST	CCLIN0		;[37] NO - SKIP NONSENSE
	SETZM	RPTCHR		;[37] YES - FLAG AS DONE
	JRST	CCLIN2		;[37] AND CARRY ON ELSEWHERE
CCLIN0:	SOSG	CTIBUF+2
	JRST	CKCCLI		;NEED ANOTHER BUFFER
CCLIN1:	IBP	CTIBUF+1
	MOVE	C,@CTIBUF+1
	TRNE	C,1		;TEST FOR SOS LINE NUMBERS
	JRST	TTYIN2		;SOS LINE NUMBER SEEN
	LDB	C,CTIBUF+1
	JUMPE	C,CCLIN		;IGNORE NULLS
CCLIN2:	CAILE	C, " "		;[37] CONTROL OR PRINTING CHAR?
	 JRST	CCLIN6		;[37] PRINTING - GO ELSEWHERE
	CAIN	C, 15		;[37] CONTROL - SUPPRESS <CR>'S
	JRST	CCLIN		;[37] I.E., EAT THEM WHOLE (RAW EVEN)
	CAIN	C, 11		;[36] <TAB>??
	MOVEI	C, " "		;[36] YES - CONVERT TO SPACE
	CAIE	C, 3		;[36] ^C
	CAIN	C, 32		;[36] OR ^Z ??
	JRST	LEAVE		;[36] YES - GO EXIT
	CAIE	C, 33		;[36] <ESC>
	CAIN	C, 7		;[36] OR <BEL>??
	JRST	CCLIN4		;[37] YES - BREAK - CONVERT TO <LF>
	CAIE	C, 13		;[36] <VT>
	CAIN	C, 14		;[36] OR <FF> ??
CCLIN4:	MOVEI	C, 12		;[36] YES - BREAK - CONVERT TO <LF>
	POPJ	P,		;[37]

;[37] HERE ON REGULAR PRINTING CHARACTERS

CCLIN6:	CAIN	C, 177		;[37] <DEL> CHARACTER?
	JRST	CCLIN		;[37] YES - EAT IT
	CAIN	C, "_"		;[36] "_" CHARACTER?
	JRST	TTYLAR		;[36] YES - SPECIAL HANDLING
	CAIL	C, "A" + 40	;[36] LOWER CASE ALPHABETICS
	CAILE	C, "Z" + 40	;[36] . . .
	POPJ	P,		;[36] NO - RETURN NEW CHARACTER IN C
	SUBI	C, 40		;[36] YES - MAKE UPPER CASE
	POPJ	P,		;[36] AND RETURN
;[43] HERE TO SUPPRESS LEADING & TRAILING SPACES, COMPRESS
;[43] MULTPLE SPACES INTO ONE SPACE.

TTYSPC:	SKIPN	C, LASCHR	;[43] SEEN ANYTHING YET?
	 JRST	TTYIN		;[43] NO - JUST EAT LEADING SPACE
	CAIN	C, 12		;[43] LEADING SPACE THIS LINE?
	 JRST	TTYIN		;[43] YES - ABSORB IT
TTYSP1:	PUSHJ	P, CCLIN	;[43] PEEK AT NEXT CHARACTER
	CAIN	C, " "		;[43] MULTIPLE SPACES
	 JRST	TTYSP1		;[43] YEP - COMPRESS
	CAIN	C, "-"		;[43] POSSIBLE CONTINUATION?
	 JRST	TTYDSH		;[43] YES - GO CHECK IT OUT
	CAIN	C, ";"		;[43] HOW ABOUT A COMMENT?
	 JRST	EATLIN		;[43] YEP! KRUMP REST OF LINE
	MOVEM	C, RPTCHR	;[43] NO - THEN NEED TO RETURN A SPACE
	MOVEI	C, " "		;[43] AND SAVE LAST CHARACTER TO BE RE-EATEN
	JRST	TTYINR		;[43] RETURN WITH SPACE IN C


TTYLAR:	SKIPE	CRFPUE		;[63] HAVE WE ALREADY SEEN MESSAGE?
	JRST	TTYLR2		;[63] YES. ONCE IS ENOUGH
	SETOM	CRFPUE		;[63] NO, SET FLAG FOR NEXT TIME
	PUSH	P, RC		;[35] REALLY SHOULD SAVE AC'S
	MOVEI	RC,[[ASCIZ/%CRFPUE Please use "=" rather than "_"
/]]				;[35]
	PUSHJ	P, PNTMSG	;[35] COMPLAIN AT USER FOR USING "_"
	POP	P, RC		;[35] RESTORE GRUNDGE ACS
TTYLR2:	MOVEI	C, "="		;[63][35] IN FUTURE, "_" IS FOR NETWORKS
	JRST	TTYINR		;[43] FOR NOW, MERELY RETURN "="


;[37] HERE TO IMPLEMENT CONTINUATION LINES

TTYDSH:	PUSHJ	P, CCLIN	;[37] SEE WHAT NEXT CHARACTER IS
	CAIN	C, " "		;[37] TRAILING SPACES?
	 JRST	TTYDSH		;[37] YES - JUST ABSORB THEM
	CAIN	C, ";"		;[37] COMMENT FIELD EMBEDDED IN CONT LINE?
	 JRST	TTYDS0		;[37] YES - WHAT A PAIN!
	CAIN	C, 12		;[37] . . .
	JRST	TTYDS1		;[37] WAS A BREAK - CONTINUATION LINE
	MOVEM	C, RPTCHR	;[37] REGULAR - SAVE FOR NEXT CALL TO RE-GET
	MOVEI	C, "-"		;[37] AND RETURN A REAL "-" IN C
	JRST	TTYINR		;[37] . . .

TTYDS0:	PUSHJ	P, EATLIN	;[37] FIRST EAT THE BLOODY COMMENT
TTYDS1:	SKIPE	TMPFLG		;[37] ARE WE IN TMPCOR?
	 JRST	TTYIN		;[37] YES - THEN JUST KEEP READING
	MOVEI	C, CTLI		;[37] NO - THEN WE NEED TO SEE 
	DEVCHR	C,		;[37] WHAT THE COMMAND DEVICE IS
	JUMPE	C, TTYDS2	;[37] NONE - ASSUME TTY
	TLNN	C, (DV.TTA)	;[37] IS DEVICE CONTROLLING TTY?
	 JRST	TTYIN		;[37] NO - JUST GO ASK FOR MORE INPUT
	SKPINL			;[37] YES - HAS USER TYPED A FULL LINE AHEAD?
TTYDS2:	 OUTCHR	["#"]		;[37] NO - THEN PROMPT HIM WITH A "#"
	JRST	TTYIN		;[37] AND GO READ MORE
CKCCLI:	TLNE	IO, IOSINI		;[44] IN SWITCH.INI?
	 JRST	CKSINI			;[44] YES - READ IT THEN

IFN TEMPC,<	SKIPE TMPFLG		;IS TMPCOR UUO IN ACTION?
		JRST	LEAVE >		;[33] YES, EXIT

	TLNN	IO, IORSCN		;[43] DOING TTY RESCAN INPUT?
	 JRST	CKCCL5			;[43] NO - REGULAR THING
CKCCL2:	INCHWL	C			;[43] YES - READ 'NOTHER CHAR
	JUMPN	C, CCLIN2		;[43] AND GO DO IT
	JRST	CKCCL2			;[43] YOU NEVER CAN TELL . . .

CKCCL5:	IN	CTLI,0			;READ ANOTHER BUFFER
	JRST	CCLIN1
	STATO	CTLI,740000
	JRST	CKCCL7			;[43] EOF
	GETSTS	CTLI,ERRSTS
	MOVEI	CS,CTIDEV
	JSP	RC,DVFSTS		;PRINT MESSAGE AND ERR #
	 [ASCIZ/?CRFCFE Command file INPUT error, /] ;[17][34] IDENTIFY MESSAGE
	JRST	CREF

CKCCL7:	TLNN	IO,IOCCL		;IN CCL MODE?
	JRST	LEAVE			;NO, GET OUT
	SETZB	TEMP,TEMP+1		;YES, DELETE COMMAND FILE
	SETZB	TEMP+2,TEMP+3
	SKIPN	CMDFLG			;[33] DON'T DELETE USER COMMAND FILES
	RENAME	CTLI,TEMP		;[33] WAS CCL-ENTRY - ###CRE.TMP
	JFCL				;[33] AND FALL INTO LEAVE CODE

LEAVE:	EXIT	1,			;[33] EXIT POLITELY
	JRST	CREF			;[33] USER TYPED "CONTINUE"



;[44] HERE TO READ IN MORE OF SWITCH.INI

CKSINI:	IN	SINI,			;[44] NEED 'NOTHER BUFFER
	JRST	CCLIN1			;[44] GOT IT
	GETSTS	SINI, C			;[44] DIDN'T GET IT
	TRNE	C, IO.EOF		;[44] GOOD OR BAD?
	 JRST	DOSIN6			;[44] ONLY EOF - THAT'S GOOD
	JSP	RC, ERRMSG		;[44] WAS ERROR - THAT'S BAD
	 [ASCIZ\%CRFSIO I/O error while reading SWITCH.INI\] ;[44]
	JRST	DOSIN6			;[44] DOESN'T SEEM REASONABLE TO
					;[44] CALL THIS FATAL
;[43] TTRSCN  --  ROUTINE TO READ INPUT STREAM AND BUILD MASK OF
;[43] SWITCHES SEEN.  WILL FORCE A ?CRFUKS ERROR IF ILLEGAL
;[43] SWITCH IS SEEN.  RETURNS MASK IN ACTXT - 1B<N> IS ON FOR
;[43] <SWITCH - "A"> - I.E., A IS 1B0, B IS 1B1, ETC.  ALSO, THE
;[43] ASCII TEXT STREAM IS LEFT IN TTRBUF FOR THOSE WEIRD PEOPLE
;[43] WHO LIKE IT, OR IN CASE OF NON-SWITCHES ENCOUNTERED (E.G., A
;[43] FILE SPEC).
;[43]
;[43] NORMAL RETURN IS CPOPJ1, ACTXT SET, C=<LF>
;[43] ERROR RETURN IS CPOPJ0, C=<ASCII CHAR>

TTRSCN:	MOVNI	FLAG, <TTRSIZ * 5> ;[43] MAX CHARS ALLOWABLE
	MOVE	CS, [POINT 7,TTRBUF] ;[43] BUFFER TO BE BUILT
	SETZ	ACTXT,		;[43] INITIALIZE MASK
	CAIN	C, " "		;[43] IGNORABLE SPACE???
TTRS01:	PUSHJ	P, TTYIN	;[43] NEXT CHARACTER
	AOJGE	FLAG, . + 2	;[43] ROOM??
	IDPB	C, CS		;[43] YES
	CAIN	C, " "		;[43] SPACE?
	JRST	TTRS01		;[43] YES - EAT IT
	CAIN	C, 12		;[43] EOL?
	 JRST	CPOPJ1		;[43] YES - ALL DONE - GO AWAY
	CAIE	C, "/"		;[43] SWITCH COMING UP?
	 POPJ	P,		;[43] NO - ERROR (OR SOMETHING)
	PUSHJ	P, TTYIN	;[43] YES - READ IN SWITCH
	AOJGE	FLAG, . + 2	;[45] ROOM
	IDPB	C, CS		;[45] YES - REMEMBER
	MOVEI	C, -"A"(C)	;[43] MAKE INTO OFFSET
	CAILE	C, "Z" - "A"	;[43] IN RANGE???
	 JRST	ERRSWT		;[43] NO - CAUSE ERROR
	MOVE	ACTMP, SWTAB(C)	;[43] SEE WHAT IT IS
	CAMN	ACTMP, . + 1	;[43] LEGAL SWITCH?
	 JRST	ERRSWT		;[43] NO - ISSUE ERROR MSG
	MOVSI	ACTMP, (1B0)	;[43] GET SET TO GENERATE
	MOVNI	C, (C)		;[43] LATEST BIT TO
	LSH	ACTMP, (C)	;[43] FLAG
	IOR	ACTXT, ACTMP	;[43] ACCUMULATE ALL SEEN SWITCHES
	JRST	TTRS01		;[43] LOOP BACK FOR MORE
	SUBTTL	FILE INPUT

READ:	SOSG	INBUF+2		;BUFFER EMPTY?
	JRST	READ3		;YES
READ1:	ILDB	C,INBUF+1	;PLACE CHARACTER IN C
	JUMPE	C,READ
	POPJ	P,

READ3:	IN	CHAR,0		;GET NEXT BUFFER.
	JRST	READ1		;OK SO FAR.  (THIS IGNORES EOT AS AN ERROR)
	GETSTS	CHAR,C		;GET FILE STATUS
	TRNE	C,020000	;EOF?
	JRST	READ4		;YES.
	MOVEM	C,ERRSTS	;REAL ERROR.  SAVE ERROR STATUS
	MOVEI	CS,INDEV
	JSP	RC,DVFSTS
	 [ASCIZ/?CRFINE INPUT error, /]	;[17][34] IDENTIFY MESSAGE
	JRST	CREF

READ4:	MOVE	C,CMDTRM		;GET COMMAND TERMINATION CHARACTER
	CAIN	C,","	
	JRST	READ5			;TERMINATOR WAS A COMMA. CONCATENATE FILES
	TLO	IO,IOEOF		;NO COMMA, THAT WAS LAST FILE
	JRST	R0			;GO PRINT RESULTS

READ5:	MOVE	0,[1,,CMDSAV+1]		;SAVE AC'S FOR COMMAND SCANNER.
	BLT	0,CMDSAV+16		;0 IS TEMP, 17 ALWAYS PDL
	HLRZ	1,INDIR+1		;[53] GET INPUT EXTENSION
	CAIE	1,'CRF'			;[53] IS IT A .CRF
	CAIN	1,'LST'			;[53] OR A .LST FILE?
	TLNE	1,IOPROT		;[53] AND USER DIDN'T TYPE "/P"?
	JRST	READ6			;[53] DO NOT DELETE INPUT FILE
	SETZB	1,4			;[50] NEED TO DELETE INPUT FILES
	RENAME	CHAR,1			;[50] DELETE IT
	 JFCL				;[50] EH - SO WHAT?
READ6:	PUSHJ	P,NAME1			;SCAN NEXT INPUT FILE
	MOVE	C,IOJFF			;RESTORE .JBFF TO REUSE BUFFER SPACE
	MOVEM	C,.JBFF
	SETZM	CMDSAV+C		;FLAG SUCCESS FOR INFILE
	PUSHJ	P,INFILE		;SET UP THE INPUT FILE
	 SETOM	CMDSAV+C		;FLAG FAILURE FOR INFILE
	MOVSI	16,CMDSAV		;RESTORE THE AC'S
	BLT	16,16
	JUMPE	C,READ			;AND TRY TO READ THIS FILE'S INPUT
	JRST	READ4			;INFILE FAILED.  LOOK FOR NEXT FILE.
	SUBTTL	ERROR MESSAGES/ERROR TYPEOUT

ERRAVI:	SKIPA	CS,INARG+2	;INPUT DEVICE INIT FAILURE
ERRAVL:	MOVE	CS,OUTARG+2	;LISTING DEVICE INIT FAILURE
	JSP	RC,DVFNEX
	 [ASCIZ/?CRFDNA Device not available, /]	;[17][34] IDENTIFY MESSAGE
	JRST	CREF


ERRENT:	MOVEI	CS,LSTDEV	;ENTER FAILURE
	JSP	RC,DVFDIR
	 [ASCIZ/?CRFCEF Cannot ENTER file, /]	;[17][34] IDENTIFY MESSAGE
	JRST	CREF


ERRCOR:	JSP	RC,ERRMSG	;CORE UUO FAILURE
	 [ASCIZ/?CRFIMA Insufficient memory available/]	;[17][34] IDENTIFY MESSAGE
	JRST	CREF


IFN STANSW,<HELP:>
ERRCM:	JSP	RC,ERRMSG			;[17] IDENTIFY MESSAGE
IFE STANSW,<  [ASCIZ\?CRFCME Command error - type /H for help\] > ;[34]
IFN STANSW,<  [ASCIZ\?CRFCME Command error\] > ;[34]
	CAIE	C,12		;[51] ARE WE ALREADY AT EOL?
	 PUSHJ	P,EATLIN	;[51] NO - EAT REST, DON'T RESCAN IT
	JRST	CREF


NOCLKP:	MOVEI	CS, CTIDEV	;[33] ADDR OF ERROR STUFF
	JSP	RC, DVFDIR	;[33] GO TYPE OUT MESSAGE
	 [ASCIZ/?CRFCLC Can't LOOKUP command file /] ;[34]
	JRST	CREF		;[33] OH WELL

NOCLDV:	MOVEI	CS, CTIDEV	;[33] ADDR OF ERROR STUFF
	JSP	RC, DVFDEV	;[33] GO TYPE MESSAGE
	 [ASCIZ/?CRFCDN Can't get command file device /] ;[34]
	JRST	CREF		;[33] GO PROMPT USER AGAIN


CRFIBP:	MOVEI	CS,INDEV	;[52] OFFENDING DEVICE
	HLLZS	INDEV+2		;[52] GIVE A "0" (AS IF IT MATTERS)
	JSP	RC,DVFDIR	;[52] ISSUE ERROR MESSAGE
	 [ASCIZ/?CRFIBP Input buffer size phase error - /] ;[52]
	JRST	CREF		;[52] RESTART EVERYTHING
ERRMSG:	PUSHJ	P,PNTMSG	;FOR SIMPLE ERROR MESSAGES
	OUTSTR	CRLF		;TYPE CRLF
	JRST	(RC)		;RETURN TO AFTER SIXBIT TEXT


DVFNEX:	PUSHJ	P,PNTMSG	;PRINT MESSAGE DEV:FILENAME.EXT
	EXCH	IO, MYWCH	;[40] NEED WATCH BITS
	TLNE	IO, (JW.WFL)	;[40] IF NO /MESS:FIRST THEN SKIP
	OUTSTR	(CS)		;[34] FINISH OFF MESSAGE
	JRST	ERRFIN		;AND DONE


DVFDEV:	PUSHJ	P, PNTMSG	;[33] PRINT MESSAGE
	EXCH	IO, MYWCH	;[40] SEE IF /MESS:FIRST IS ON
	TLNN	IO, (JW.WFL)	;[40] . . .
	 JRST	ERRFIN		;[40] WASN'T - NO MORE OUTPUT
	PUSHJ	P, PNTSIX	;[33] FOLLOWED BY OFFENDING DEVICE
	OUTCHR	[":"]		;[33] APPEND ":" FOR LOOKS
	JRST	ERRFIN		;[33] CAP OFF AND RETURN TO CALLER


DVFDIR:	HRRZ	C,2(CS)		;PRINT MESSAGE WITH DIR ERR #
	MOVEM	C,ERRSTS
DVFSTS:	PUSHJ	P,PNTMSG	;PRINT MESSAGE, ERR #, DEV:FILENAM.EXT
	EXCH	IO, MYWCH	;[40] GET COPY OF WATCH BITS
	TLNN	IO, (JW.WFL)	;[40] /MESS:FIRST ON?
	 JRST	ERRFIN		;[40] NO - SKIP FURTHER OUTPUT
	PUSH	P,RC		;SAVE RETURN AT END OF SIXBIT TEXT
	PUSHJ	P,PNTSTS
	OUTCHR	[" "]
	POP	P,RC		;GET RETURN BACK NOW
	PUSHJ	P,PNTSIX	;PRINT DEVICE
	OUTCHR	[":"]
	ADDI	CS,1		;ADVANCE POINTER TO FILENAME
	SKIPN	(CS)		;IS FILENAME 0?
	JRST	ERRFIN		;YES, NO FILENAME
	PUSHJ	P,PNTSIX	;NO, PRINT FILENAME
	ADDI	CS,1		;ADVANCE POINTER TO EXTENSION
	HLLZS	C,(CS)		;ZERO OUT OTHER HALF. EXTENSION=0?
	JUMPE	C,ERRFIN	;EXTENSION 0?
	OUTCHR	["."]		;NO
	PUSHJ	P,PNTSIX	;PRINT EXTENSION
ERRFIN:	OUTSTR	CRLF		;TYPE RETURN
	EXCH	IO, MYWCH	;[40] RESTORE STUFF
	JRST	0(RC)		;RETURN 
PNTMSG:	OUTSTR	CRLF		;PRINT SIXBIT MESSAGE
PNTM0:	PUSH	P, AC0		;[40] NEED
	PUSH	P, TEMP		;[40] SOME
	PUSH	P, TEMP1	;[40] GRUNDGE
	PUSH	P, RC		;[40] AC'S
	PUSH	P, SX		;[40] . . .
	MOVE	AC0, MYWCH	;[40] GET THE WATCH BITS
	MOVEI	RC, @(RC)	;[40] ADDRESS OF ERROR MESSAGE
	HRLI	RC, (POINT 7,)	;[40] THE USUAL BYTEPOINTER
	MOVE	SX, [POINT 7, ERRBUF] ;[40] WHERE TO BUILD THE MESSAGE
	ILDB	TEMP, RC	;[40] PICK UP FIRST CHAR ALWAYS
	IDPB	TEMP, SX	;[40] AND STUFF IT AWAY
	TLNE	AC0, (JW.WPR)	;[40] PREFIX ON?
	 JRST	PNTM10		;[40] YES - GO PRINT IT
	IBP	RC		;[40] NO - THEN ADJUST POINTER
	AOJA	RC, PNTM20	;[40] AROUND PREFIX-PART
PNTM10:	MOVEI	TEMP1, 6	;[40] LOOP COUNT FOR PREFIX
PNTM11:	ILDB	TEMP, RC	;[40] LOOP GETTING THE
	IDPB	TEMP, SX	;[40] PREFIX-PART
	SOJG	TEMP1, PNTM11	;[40] (WHICH HAS 6 LETTERS)
PNTM20:	SETZ	TEMP,		;[40] NULL FOR EXIT
	TLNE	AC0, (JW.WFL)	;[40] /MESSAGE:FIRST?
PNTM30:	ILDB	TEMP, RC	;[40] GET NEXT CHARACTER
	IDPB	TEMP, SX	;[40] STUFF INTO OUTPUT BUFFER
	JUMPN	TEMP, PNTM30	;[40] LOOP FOR WHOLE ASCIZ STRING
	OUTSTR	ERRBUF		;[40] OUTPUT MESSAGE TO USER TTY
	POP	P, SX		;[40] . . .
	POP	P, RC		;[40] S'CA
	POP	P, TEMP1	;[40] EGDNURG
	POP	P, TEMP		;[40] EMOS
	POP	P, AC0		;[40] DEEM
	AOJA	RC, CPOPJ	;[40] RETURN TO WHEREVER
PNTSIX:	HRLI	CS,(<POINT 6,0>)	;PRINT 1 WORD OF SIXBIT
PNTSX1:	TLNN	CS,770000	;NEXT ILDB GO OVER WORD BOUNDARY?
	POPJ	P,		;YES, FINISHED
	ILDB	C,CS
	JUMPE	C,.-2		;STOP AT A 0
	ADDI	C,40		;CONVERT TO ASCII
	OUTCHR	C
	JRST	PNTSX1

PNTSTS:	HRRZ	RC,ERRSTS	;PRINT ERROR STATUS
PNTOCT:	IDIVI	RC,10		;PRINT OCTAL NUMBER
	HRLM	RC+1,(P)
	SKIPE	RC
	PUSHJ	P,PNTOCT
	HLRZ	C,(P)
	ADDI	C,"0"
	OUTCHR	C
	POPJ	P,


ECNVRT:	MOVEI	TEMP,5			;HERE TO TYPE A FIVE-DIGIT NUMBER FROM C
	MOVEI	TEMP1,0			;  LEFT-JUSTIFIED, ZERO-SUPPRESSED.

ECNVR1:	IDIV	C,TABL(TEMP)
	ADD	TEMP1,C
	ADDI	C,"0"
	SKIPE	TEMP1
	OUTCHR	C
	MOVE	C,CS
	SOJGE	TEMP,ECNVR1
	POPJ	P,


	XLIST		;THE LITERALS ARE XLISTED FOR YOUR READING PLEASURE
	LIT
	LIST
	SUBTTL	FIXED DATA STORAGE

IFN SEGSW,<	RELOC	0		;IMPURE DATA AREA >

 IFN	SEGSW,<			;[31]

TNXLOW:	RELOC			;[31] BACK TO HISEG (FOR TOPS-10)

TNXHGH:	PHASE	TNXLOW		;[31] BUILD PROTOTYPE FOR LOWSEG
> ;[31] END OF IFN SEGSW

OUTARG:	LST,,CP.OPN		;OUTPUT ARG BLOCK
	OUTBLK
	-1,,TXTHLD
	7B5+1B20
	BLOCK	2
	LSTBUF
	RIB

OUTBLK:	1B0+1B17
	377777,,377777
	-1,,LSTNM1			;[T20]
	0
	-1,,TXTBUF			;DEFAULT NAME
	-1,,[ASCIZ /LST/]
	BLOCK	5			;REST IS DEFAULTED

LSTNM1:	BLOCK	2			;[T20]

RUNARG:	CP.RUN		;ARG IS NOR USED
	RUNBLK
	-1,,TXTBUF

RUNBLK:	1B2+1B17		;DEFAULT FOR RUN ARG
	377777,,377777
	-1,,SYSSTR		;FROM SYS
	0
	0
	-1,,SAVSTR		;S SAVE FILE
	BLOCK	5

INARG:	CHAR,,CP.OPN
	ALTARG			;LONG FORM
	-1,,TXTBUF
	7B5+1B19		;READ ACCESS
	0			;MODE
	0,,INBUF		;BUFFER HEADER
	0
	RIB

ALTARG:	1B2+1B17		;OLD FILE
	377777,,377777
	BLOCK	3
EXTNAM:	-1,,[ASCIZ /CRF/]	;CREF FILE
	BLOCK	5

;FILE DEFITIONS FOR COMPT.
SYSSTR:	ASCIZ	/SYS/
SAVSTR:	ASCIZ	/SAV/

	XLIST			;[31] EXPAND PHASED LITERALS
	LIT			;[31]
	LIST			;[31]

 IFN	SEGSW,<			;[31]

	DEPHASE			;[31] BACK TO HISEG RELOCATION

	TNXLEN==.-TNXHGH	;[31]

	RELOC			;[31] BACK TO LOWSEG "CODE"

	BLOCK	TNXLEN		;[31] ALLOCATE LOWSEG AREA NEEDED
> ;[31] END OF IFN SEGSW

CRFPUE:	BLOCK	1
ACHR:	BLOCK	1		;[61] FLAG TO CHK. FOR NULL INPUT LINES

L1:	BLOCK	1		; [21] SAVE FOR LONG
L2:	BLOCK	1		; [21]   SYMBOL ROUTINES
NOIOJF:	BLOCK	1		;[51] .NE. 0 TO DELAY IOJFF
SVJFF:	BLOCK	1
MYPPN:	BLOCK	1		;[32] JOB'S PPN
MYWCH:	BLOCK	1		;[40] JOB'S WATCH BITS

ERRBUF:	BLOCK	ERRSIZ		;[40] BUFFER TO BUILD ERROR MESSAGES
TTRBUF:	BLOCK	TTRSIZ		;[43] BUFFER FOR TTY RESCAN

BZCOR:				;[37] START OF TO-BE-ZEROED ON PROG START

PDSINI:	BLOCK	1		;[44] P SAVE LOCATION
SWSINI:	BLOCK	1		;[44] SWITCH.INI SWITCH MASK
SWTINI:	BLOCK	1		;[44] .NE. 0 TO NOT USE SWITCH.INI DEFAULTS
TTRSWT:	BLOCK	1		;[43] MASK OF CCL STICKY SWITCHES
RRFLAG:	BLOCK	1		;[45] .NE. 0 IF /R IN TTY RESCAN
LEAFLG:	BLOCK	1		;[43] SPECIAL (I.E. KLUDGE) EXIT FLAG

LASCHR:	BLOCK	1		;[37] LAST COMMAND CHAR FROM TTYIN
RPTCHR:	BLOCK	1		;[37] .NE. 0 THEN CHAR TO RE-READ
CMDFLG:	BLOCK	1		;[33] .GT. 0 THEN TIME TO READ CMD FILE
				;[33] .EQ. 0 THEN NOTHING
				;[33] .LT. 0 THEN IN COMMAND FILE
CTIBUF:	BLOCK	3		;COMMAND FILE INPUT BUFFER HEADER
CTIDEV:	BLOCK	1		;INPUT COMMAND DEVICE
CTIDIR:	BLOCK	4
TMPFIL:	BLOCK	2		;SIXBIT /CRE/
				;XWD -200,C(.JBFF)
				;FOR TMPCOR UUO
TMPFLG:	BLOCK	1		;FLAG FOR TMPCOR UUO IN PROGRESS

SCNPTH:	BLOCK	2		;[32] AREA TO BUILD PATH BLOCK
SCNPPN:	BLOCK	.PTMAX - 2	;[32] PPN, SFD1, SFD2, ETC.

.WPL:	BLOCK	1		;NUMBER OF ENTRIES/LINE OF CREF (WPLTTY OR WPLLPT)
WRITEE:	BLOCK	1		;INSTR TO XCT TO GET INTO THE WRITE ROUTINE
WRITEX:	BLOCK	1		;INSTR TO XCT AT GET OUT OF THE WRITE ROUTINE
AWRITE:	BLOCK	1		;ADDRESS OF WRITER (EITHER WRITE OR CPOPJ)
M6X:	BLOCK	1		;INSTR TO XCT TO DECIDE WHETHER TO ENTER A SYMBOL
				;  IN THE SYMBOL TABLE
M0XCT:	BLOCK	1		;INSTRUCTION TO XCT TO WRITE A LEADING TAB.
DMPXCT:	BLOCK	1		;OUT LST, EXCEPT, FOR MTA OUTPUT: PUSHJ P,DMPOUT
SYNERR:	BLOCK	1
TXTBUF:	BLOCK	TXTSIZ

STCLR:		;START BLT CLEAR HERE

OPTBL:	BLOCK	HASH+1		;OPCODE TABLE (EXTRA CELLS NEEDED FOR MERGE)
MACTBL:	BLOCK	HASH+1
SYMTBL:	BLOCK	HASH+1

REFBIT:	BLOCK	1		;TEMP CELL FOR REFERENCE TYPE IN SRCH
REFINC:	BLOCK	1		;TEMP CELL FOR REFERENCE TYPE IN SRCH
SRTTMP:	BLOCK	1		;TEMP CELL FOR SORT
FRDTMP:	BLOCK	1		;TEMP CELL FOR FREAD

INBUF:	BLOCK	3
INDEV:	BLOCK	1		;INPUT DEVICE (FOR ERR MESSAGES ONLY)
INDIR:	BLOCK	4
EXTBLK:	BLOCK	.RBVER+1	;[100] EXTENDED BLOCK

LSTBUF:	BLOCK	3
LSTDEV:	BLOCK	1		;LIST DEVICE (FOR ERR MESSAGES ONLY)
LSTDIR:	BLOCK	4
LSTPTH:	BLOCK	.PTMAX		;[32] LIST DEVICE EXTENDED PATH

PPSAV:	BLOCK	1		;RESTORE P FROM HERE FOR "IMPROPER INPUT DATA"
PPSET:	BLOCK	PDL		;PUSH DOWN STACK; ALSO USED BY "RUN" UUO
CMDSAV:	BLOCK	20		;SAVE AC'S DURING COMMAND SCANNING
LPP:	BLOCK	1

PPTEMP:	BLOCK	1
FIRSTL:	BLOCK	1		;LINE # AFTER WHICH TO PRINT LISTING
ERRSTS:	BLOCK	1		;HOLDS ERROR STATUS FOR MESSAGES
CMDTRM:	BLOCK	1		;HOLS LAST CHARACTER IN COMMAND SCANNER
IOJFF:	BLOCK	1		;HOLDS .JBFF BEFORE INPUT BUFFERS SETUP
FRJFF:	BLOCK	1		;[52] HOLDS ORIGINAL IO BUFFER SIZE
				;[52] FOR MULTI-INPUT OVERFLOW CHECK

LOWLIM:	BLOCK	1		;LOWER LIMIT (STARTING LINE #)
UPPLIM:	BLOCK	1		;UPPER LIMIT (ENDING LINE #)

SVLAB:	BLOCK	1

LEVEL:	BLOCK	1		;BLOCK LEVEL FOR COMBG.
	BLOCK	1		;BLKST-1 IS CLOBBERD AT R0!!
BLKST:	BLOCK	1		
OFLAG:	BLOCK	1
OFLAG1:	BLOCK	1
OFLAG2:	BLOCK	1
TXTHLD:	BLOCK	TXTSIZ
RIB:	BLOCK	4
ASCCNT:	BLOCK	1
BLKND:	BLOCK	1
ENDCLR=	.-1

	END	CREF