Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-04 - decus/20-0130/macro.mac
There are 45 other files named macro.mac in the archive. Click here to see a list.
TITLE	MACRO %50A(441)	
SUBTTL	 RPG/CMF/JF/PMH/DMN/JNT/RKH/JBC/ILG	1-Jul-76
;COPYRIGHT 1968,1969,1970,1971,1972,1973,1974,1975,1976  DIGITAL EQUIPMENT CORP., MAYNARD, MASS.

	VMACRO==50		;VERSION NUMBER
	VUPDATE==1		;DEC UPDATE LEVEL
	VEDIT==441		;EDIT NUMBER
	VCUSTOM==2		;NON-DEC UPDATE LEVEL


	LOC	<.JBVER==137>
	<VCUSTOM>B2+<VMACRO>B11+<VUPDATE>B17+VEDIT
	RELOC

COMMENT	*	ASSEMBLY FEATURE SWITCHES (ACTION WHEN NON-ZERO)

	SWITCHES ON (NON-ZERO) IN DEC VERSION
PURESW		GIVES TWO SEGMENT MACRO
CCLSW		GIVES RAPID PROGRAM GENERATION FEATURE
TEMP		TMPCOR UUO IS TO BE USED
FORMSW		USE MORE READABLE FORMATS FOR LISTING (ICCSW)
DFRMSW		DEFAULT CONDITION OF FORMAT PRINTING (MULTI-FORM IF ON)
KI10		GIVES KI10 OP-CODES
KL10		GIVES KL10 OP-CODES

	SWITCHES OFF (ZERO) IN DEC VERSION
STANSW		GIVES STANFORD FEATURES
LNSSW		GIVES LNS VERSION
IIISW		GIVES III FEATURES
OPHSH		GIVES HASH SEARCH OF OPCODES
TENEX		GIVES BBN TENEX FEATURES
POLISH		GIVES EXTERNAL ARITHMETIC EXPRESSIONS
		AND PSECT MULTIPLE RELOCATION COUNTERS
TSTCD		GIVES LINK DEBUGGING AND DEVELOPMENT DIRECTIVES
*
SUBTTL	DEFAULT ASSEMBLY SWITCH SETTINGS

IFNDEF FT.U01,<FT.U01==1>
IFNDEF PURESW,<PURESW==1>

IFNDEF STANSW,<STANSW==0>
IFN STANSW,<CCLSW==1>

IFNDEF LNSSW,<LNSSW==0>

IFNDEF CCLSW,<CCLSW==1>

IFNDEF TEMP,<TEMP==1>


IFNDEF IIISW,<IIISW==0>
IFN IIISW,<
IFNDEF DFRMSW,<DFRMSW==0>>

IFNDEF DFRMSW,<DFRMSW==1>
IFN DFRMSW,<FORMSW==1>

IFNDEF FORMSW,<FORMSW==1>

IFNDEF OPHSH,<OPHSH==0>

IFNDEF KI10,<KI10==1>
IFNDEF KL10,<KL10==1>
IFN KL10,<KI10==1>

IFNDEF TENEX,<TENEX==0>

IFNDEF POLISH,<POLISH==0>
IFNDEF TSTCD,<TSTCD==0>
SUBTTL	REVISION HISTORY

;START OF 50
;114	(6113)	TIDY UP SYMBOL TABLE LISTING
;115		IMPLEMENT BINARY UNIVERSAL FILES
;116	(6272)	CORRECT LISTING OF CERTAIN BYTE FIELDS
;117	(6321)	MINOR FIX FOR I.S.C.
;120	(6245)	LABEL IN LITERAL
;121		ADD PSEUDO-OP .COMMON
;122		ADD PSEUDO-OPS .REQUIRE AND .REQUEST
;123		ADD ^! (XOR) AND ^- (NOT) OPERATORS
;124	(6350)	V ERRORS ON PASS 1
;125	(6483)	X ERRORS ON PASS 1
;126		SOME SLIGHT SPEEDUPS IN BYPASS ROUTINE (NOW A MACRO)
;127		FREE A FLAG BIT FOR POLISH FIXUPS (FUTURE)
;130	(6482)	GENERATE MULTIPLE CREF NO. FOR EXP 1,2,3,,ETC.
;131	(6476)	REMOVE BLANKS AT END OF COMMAND STRING
;132	(6477)	INCORRECT DEFAULT EXT FOR @ FILES
;133	(6475)	MISSING MACRO LISTING WITH SALL
;134	(6506)	FIX BUG IN HASHED OPCODES
;135	(6764)	MAKE OPDEF PRINT VALUE LIKE =
;136	(6803)	ADD SYMBOL .CPU. FOR HOST CPU TYPE
;137	(6765)	BETTER HANDLING OF () IN MACRO CALLS
;140	(6708)	DON'T NEED <> FOR SINGLE LINE CONDITIONALS
;141	(6629)	DON'T CREF .XCREF
;142	(6509)	COUNT PAGES CORRECTLY ON PRGEND
;143	(6698)	GIVE "Q" ERROR  IF MORE THAN 18 BIT VALUES IN XWD
;144		CHANGE EOL CHAR TO LF, QIVE "Q" ERROR ON FREE CR
;145		MAKE "Q" ERRORS PRINT AS WARNINGS INSTEAD OF ERRORS
;146		CALL HELPER TO PRINT HELP TEXT
;147		ADD NEW I/O DEVICE CODES AND NEW UUOS
;150	(6894)	FIX LOCATION COUNTER IN PHASE CODE
;151		ADD FAIL COMPATIBLE PSEUDO-OP .LINK (LINK), .LNKEND (LNKEND), .ORG (ORG)
;152	(7063)	COUNT <> IN CHARACTER LOOKAHEAD
;153	(6981)	VERY LONG SEQUENCED LINES DON'T PRINT CORRECTLY
;154	(7018)	87 CHAR LONG LINE GET EXTRA CR-LF IN LISTING
;155	(7005)	LABEL IN LITERALS AGAIN
;156	(7116)	SUPERSEDED BY 225
;157	(7027)	PRINT SEQUENCED BLANK LINE
;160	(7078)	GARBAGE IN BITS 0-3 OF RADIX-50 IN SOME MACROS
;161	(7373)	MAKE PAGE PSEUDO-OP INCREASE PAGE INCREMENT NO. ONLY
;162		ADD SFD LOGIC
;163	(7435)	SUPERSEDED BY 204
;164		ADD POLISH EXPRESSIONS (NOT SUPPORTED)
;165		REMOVE 0 LISTED ON FIRST LINE AFTER PRGEND
;167	(7462)	ADD ! TO SUPPRESS SYMBOLS
;170	(7638)	FIX ILL MEM REFS ON PRGEND
;171	(8374)	TEST AND GIVE ERROR IF EXP AFTER \ IN MACRO CALL IS A MACRO
;173	(8264)	SAVE AND RESTORE ACCS IN SYN ROUTINE IF CORE EXPANSION IS REQUIRED
;175	(8606)	ONLY USE ASCII 37 AS CONTINUATION CHARACTER IF AT END OF LINE
;176	(8633)	CORRECTLY HANDLE <> IN COMMENTS IN MACROS AFTER ;;
;200		MAKE DEFAULT NUMBER OF BUFFERS BE 5
;201		ADD DATE75 HACK
;202		ADD PSEUDO-OP .DIRECTIVE
;203	(10071)	FIX TWOSEG & PRGEND INTERACTION SO LOAD FORLIB IN LOW SEG
;204	(11044)	CLEAR PNTF IF 18 BIT VALUE (UNLESS EXTERN) AT INSRT4
;205	(10820)	FIX #154 INCASE IN MACROS
;206		ADD TENEX FEATURES
;207		FORCE END STATEMENT IF END NOT SEEN
;210		ADD EXTERNAL START ADDRESS ON END STATEMENT
;211		ALLOW <> IN COMMAND TO BE SAME AS []
;212		PUT ERROR MESSAGES IN STANDARD FORM
;213		PUT ASSEMBLY ERRORS IN CREF TABLE
;214		OUTPUT COMPILER TYPE IN HEADER BLOCK (TYPE 6)
;215	(9810)	DON'T LIST COMMENT BEFORE MACRO EXPANSION IF IN REPEAT
;216		MAKE DEFAULT [DIRECTORY] WORK
;217	(9996)	TURN ON SALL IN LITERALS SO MACRO CALLS DON'T EXPAND
;220	(9633)	MAKE .XCREF APPLY TO SPECIFIC SYMBOLS
;221	(9508)	IF NEXT LINE AFTER TAPE PSEUDO-OP IS FF OR VT LIST IT
;222	(9499)	MORE OF #124
;223	(10393)	FIX ILL MEM REF ON END MACRO
;224	(S-033)	MINOR VERSION NUMBER DECODE LOGIC WRONG
;225	(11907)	REDEFINING MACROS IN PRGENDS
;226	(11929)	MORE OF ABOVE, WHEN A UNIVERSAL FILE HAS BEEN READ
;227	(S-034)	ADD SWITCH /nnL TO GIVE LINES/PAGE, ALSO MAKE 2 LARGER
;230		DON'T SEARCH UNIVERSAL FILE ON LABEL & ASSIGNMENT DEFINITIONS
;231		EXPAND CORE TO HOLD BOTH COPIES IN UNIVERSAL AND PRGEND
;232		ADD .TEXT PSEUDO-OP TO GENERATE ASCIZ BLOCK TYPE FOR LINK-10
;233		CHECK FOR INVALID ARG TO BLOCK PSEUDO-OP
;234		OUTPUT CPU TIME TAKEN FOR ASSEMBLY
;235		ADD .DIRECTIVE KA10,KI10 TO SET BIT IN BLOCK TYPE 6
;236		FIX SALL/XLIST BUG, MAKE XALL ONLY TURN OFF SALL
;237	(12493)	GIVE U ERROR ON LABEL DEFINED AND USED IN SAME LITERAL
;240	(12631)	ENHANCEMENTS TO BINARY UNIVERSALS
;241	(13033) INCORRECT CHECKING OF ACC "C" AGAINST ASCII AT STMNT2+13
;242	(13034) SAVE AC0 (AND SOME OTHERS) AT OUTPL1
;243	(13402) MAKE LOWER CASE WORK WITH SINGLE QUOTES
;244		EXTEND EDIT #210 TO ALLOW EXTERNAL + CONSTANT
;245	(13047)	FLAG QUESTIONABLE USE OF SINGLE QUOTE WITH "Q" ERROR
;246	(13119)	WRITE CREF FILE IN DEFAULT PATH
;247	(12803)	FLAG QUESTIONABLE USE OF # AND ## ON SAME SYMBOL
;250	(13032)	CLEAR MORE ERROR BITS ON PASS1 IN MULTI-LINE LITERAL
;251		FIX PROGRAM BREAK IF LIT STATEMENT IN PRGEND
;252		DON'T GIVE "Q" ERROR ON EXTRA "CR" (SEE EDIT #144)
;253		DON'T PRINT GARBAGE ON PASS1 ERROR IN MULTI-LINE LIT
;254		USE ALL AVAILABLE PRINTING SPACES FOR LONG LINES
;255		FIX UNARY MINUS BUG IN EDIT #164
;256	(13664)	HANDLE SPECIAL EXTERN IN UNIVERSAL CORRECTLY
;257		HANDLE VERTICAL TABS CORRECTLY
;260		FIX BUG IN #140, THROW AWAY JUNK BEFORE COMMA
;261		HANDLE SOS PAGE MARK CORRECTLY
;262		TRAP ILL MEM REF CAUSED BY MISSING CLOSE PAREN IN MACRO ARG LIST (#137)
;263		DON'T DESTROY ACC RC IN LONG LINE OF ASCIZ TEXT
;264		FIX BUG IN #175 CAUSING EXTRA CR-LF
;265		ADD PSECT CODE UNDER POLISH SWITCH, THIS IS VERSION 51 ONLY
;266		FIX LOOP CAUSED BY MISSING ")" IN SEARCH MODS (#240)
;267		DON'T PASS DEFINITION FLAG TO CREF ON ##
;270		DOUBLE SIZE OF BASIC PUSHDOWN STACK
;271		ADD .IF PSEUDO-OP
;272		FIX LOOP CAUSED BY #260 IF EOL ENCOUNTERED
;VERSION 50 (272) RELEASED NOV-74

;273		ADD BYPASS TO FIX ERROR WITH PPN SPEC FOR .REQUIRE & .REQUEST
;274	(14734)	FIX PROBLEM WITH .IF CONDITIONALS
;275	(14723)	FIX SPURIOUS MONRET WITH STICKY PPNS
;276	(14811)	CAUSE * AND / TO GIVE N ERRORS WHEN THEY OVERFLOW
;277		ALLOW ALTMODES TO TERMINATE COMMAND STRINGS AGAIN

;EDITS 300 THROUGH 317 WERE USED FOR MACRO 51

;320	(Q3086)	FIX MCRNES MESSAGE IN DEFINE AFTER SIXBIT//
;321	(Q3085)	FIX LITERALS NOT LISTING IN MACROS AND SOME BOGUS V ERRORS WHEN NOT LALL
;322		CHANGE RADIX50 TO GIVE Q ERROR ON CODE NOT 74 BITS
;323	(14943)	FIX TO MAKE EXTERNALS REFERENCED IN UNIVERSALS WORK
;324	(14957)	FIX FOR E ERRORS WHEN OPDEF REFERENCES EXTERNAL OF SAME NAME
;325	(15043)	CHANGE 152 & 176 TO NOT PRINT ANGLE BRACKETS OR 1 ; AFTER ;;
;326	(15218)	CHANGE MCRNEC MESSAGE TO GIVE UP ASSEMBLY
;327		FIX THE CRLF'S WHEN LALL IS USED IN A MACRO UNDER SALL
;330	(15277)	CORRECT VALUE OF SYMBOL .CPU. FOR KA-10
;331	(15279)	CORRECT OUTPUT OF .TEXT BLOCKS GENERATING MORE THAN 18 WORDS
;332		CORRECTION TO 325 WHEN ;;> IS END OF MACRO
;333	(15280)	^ IS SOMETIMES SWALLOWED WHEN NOT FOLLOWED BY ! OR -
;334	(15293)	DEFAULT MACRO ARGUMENTS ARE NOT SAVED IN BINARY UNIVERSALS
;335	(15406)	SCAN .REQUIRE,.REQUEST WITH FILE SPEC SCANNER, NOT GETSYM
;336	(15485)	CLEAN UP 323 TO MAKE IT THE SAME AS PUBLISHED 256
;337		FIX EDIT 333 TO MAKE ^! ^- WORK AGAIN
;340	(15682)	CHECK FOR FORWARD DEFINED ENTRIES BEFORE MAKING UNDEFINES EXTERNAL
;341		FIX ERRORS WITH DEFAULT ARGUMENTS
;342	(15680)	ADD PORTAL OPCODE
;343	(15683)	DON'T SEARCH UNIVERSALS WHEN DEFINING INTERN,EXTERN,ETC
;344		LIST MOVE [CONO] CORRECTLY
;345	(16130) CORRECT EDIT 335 TO BYPASS EXTRA TABS AND SPACES
;346	(16130) PREVENT RELOC FROM OPERATING ACROSS PRGEND'S
;347	(16250) FIX EDITS 325 AND 332 TO HANDLE MACROS TERMINATING
;	ON THE SAME LINE
;350	(16471) EDIT 345 BREAKS SCANNING OF .REQU??? TYPE ITEM BECAUSE
;	BYPASS MACRO EATS FIRST CHARACTER OF SPEC.
;351	(16335) WHEN AN OPEN ANGLE BRACKET IS MISSING AFTER IRPC,
;	DON'T CRASH WHILE SEARCHING FOR IT.
;352	(16589) FIX '[DEVICE] NOT AVAILABLE' ERROR MESSAGE TYPEOUT
;353		REMOVE EDIT 343
;354	(16804)	FIX EDIT 351 TO ALLOW COMMA BEFORE OPEN BRACKET IN IRP,IRPC
;	ADD 'MISSING OPEN BRACKET' ERROR MESSAGE FOR IRP
;355	(16878)	CHECK ENOUGH CORE ALLOTTED FOR UNIVERSAL FILES WITH PRGEND
;356	(16883)	GIVE ERROR MESSAGE IF UNABLE TO WRITE UNIVERSAL FILE
;357	(17041)	FIX EDITS 333,337 TO MAKE ^!,^- WORK IN A MACRO
;360	(16690)	FIX '[SYMBOL] UNASSIGNED, DEFINED AS IF EXTERNAL' ERROR
;	MESSAGE TYPEOUT
;361	(17046)	FIX EDITS 351,354 TO ALLOW ) BEFORE OPEN ANGLE BRACKET
;362		ADD .DIRECTIVES .OKOVL,.EROVL TO ALLOW * OR / OVERFLOW
;363	(16988)	INSERT UNDEFINED SYMBOL PRECEDED BY UNARY MINUS IN UNDEFINED SYMBOL TABLE
;364	(17147)	ADD SEPARATE 'UNIVERSAL VERSION SKEW' ERROR MESSAGE
;365	(17143)	FIX .CREF,.XCREF FOR MULTIPLY-ENTERED SYMBOLS
;366	(17256)	FIX HANDLING OF FIRST LEVEL ANGLE BRACKETS INSIDE MACROS
;367	(16559)	FIX ERROR HANDLING IN LITERALS
;370	(17387)	FIX .TEXT FLAG HANDLING
;371	(16710)	CORRECT DECREMENTING OF MACROS DEFINED IN UNIVERSALS BELOW 1
;372	(17912)	FIX .XTABM FOR SPECIAL CASES
;373	(17913)	ADD ERROR MESSAGE FOR MISSING < IN REPEAT
;374	(17993)	FIX HANDLING OF RELOCATABLE ARGUMENTS WITH ^L
;375	(17994)	FIX PREVIOUS EDITS TO ^-  AND ^! OPERATORS
;376	(18280)	CORRECT EDIT 367, IT BROKE ERRORS IN SINGLE LINE LITERALS
;377		ADD MCRPGE (PRGEND ERROR) MNEMONIC
;400		PRESERVE OLD .REL FILE AND PRODUCE PARTIAL LISTING AFTER
;		MRCNEC OR MRCPDL ERROR
;401		DON'T ALLOW SHIFT TO DELETE RELOCATION FACTOR
;402	(17904)	FIX "LABEL + OFFSET" FOR LABELS IN LITERALS
;403		REPLACE MCREWU,MCRERU ERROR MESSAGES WITH EXISTING I/O MESSAGES
;404	(18768)	FIX CHECK FOR ! AFTER SYMBOL IN INTERN,EXTERN,SUPRESS,ETC.
;405	(18282)	CHECK FOR DEFAULT PPN SUCH AS [,NNNN] OR [NNNN,]
;406	(18894)	DON'T ALLOW SEMI-INFINITE LOOP IN ASSIGNMENT STATEMENT
;407		EDIT 401 IS A GOOD IDEA,BUT IT BROKE OLD PROGRAMS
;410		GENERAL CLEANUP IN PREPARATION FOR RELEASE.
;411	(18828)	/N SHOULDN'T SUPRESS %....X SYMBOLS IN CREF
;412		CLEAR HISNSW AT PRGEND FOR NEXT PROGRAM
;413		ADD .DIRECTIVE KL10, MAKE IT OK TO HAVE MULTIPLE CPUS
;414		ADD .DIRECTIVES .TCDON/.TCDOFF FOR TESTING NEW LINK CODES
;415		SUPERSEDE EDITS 367,376 FOR CLARITY
;416	(Q0320)	FIX ^- AGAIN. EDITS 375,333 SUPERSEDED.
;417	(Q0316)	EDIT 221 BROKE TAPE PSEUDO-OP WHEN EOF FOLLOWS
;420	(Q0322)	RESET TITLE TO ".MAIN" AT PRGEND
;421	(Q0328)	CLEAN UP THE .DIRECTIVE CODE, ADD .DIRECTIVE NO
;422	(Q0363)	FIX DEFAULT ARG READ-IN FOR DEFINES IN MACROS
;423		MAKE .LINK PSEUDO-OP READ 3RD ARGUMENT CORRECTLY.
;424	(18893)	CHECK FOR ILLEGAL CHARACTERS AT ASTERISK LEVEL.
;425	(19585)	REWORK EDIT 373
;426		CLEAN UP EDITS 351,354,361
;427	(Q0390)	ALLOW NULL EXTENSIONS IN SOURCE SPECIFICATIONS
;430	(20036)	IMPLEMENT "%MCRSOC STATEMENT OUT OF ORDER .COMMON [SYMBOL]" MESSAGE
;431		CLEAN UP UNIVERSAL I/O ERROR MESSAGES
;432		FURTHER CLEANUP FOR RELEASE
;; MACRO 50A	RELEASE IN FALL, 1976
;440		FIX "R" ERRORS (WITH EXTERNAL SYMBOLS) CAUSED BY EDIT 324
;441		FIX "P" ERRORS WHEN SYMBOL FORWARD-REFERENCED ACROSS LITERAL
;
;*****CUSTOMER REVISION HISTORY*****
;1		IMPLEMENT USER PUSHDOWN LIST--FEATURE TEST FT.U01
;2		CLEAR USER PDP ON PRGEND AND END, CHECK FOR STACK UNDERFLOW

;*******************  END OF REVISION HISTORY  *******************
SUBTTL	OTHER PARAMETERS

IFN FT.U01,<$USRLN==^D50> ;LENGTH OF USER PUSH DOWN LIST
.PDP==	^D100		;[270] BASIC PUSH-DOWN POINTER
IFNDEF LPTWID,<LPTWID==^D132>	;DEFAULT WIDTH OF PRINTER
.LPTWD==8*<LPTWID/8>		;USEFUL WIDTH IN MAIN LISTING
.CPL==	.LPTWD-^D32		;WIDTH AVAILABLE FOR TEXT WHEN
				;BINARY IS IN HALFWORD FORMAT
.CPLX==LPTWID-.LPTWD		;[254] EXCESS SPACE IN LAST TAB STOP
IFNDEF .LPP,<			;[227]
	IFE STANSW,<.LPP==^D57	;LINES/PAGE>
	IFN STANSW,<.LPP==^D52	;LINES/PAGE>
>
.STP==	^D40		;STOW SIZE
.TBUF==	^D80		;TITLE BUFFER
.SBUF==	^D80		;SUB-TITLE BUFFER
.IFBLK==^D20		;IFIDN COMPARISON BLOCK SIZE
.R1B==^D18
.UNIV==^D10		;NUMBER OF UNIVERSAL SYMBOL TABLES ALLOWED
.LEAF==4		;SIZE OF BLOCKS IN MACRO TREE
.UVER==5		;[334] VERSION # OF UNV FILE
.SFDLN==5		;[162] NUMBER OF SFD'S ALLOWED

NCOLS==LPTWID/^D32		;NUMBER OF COLUMNS IN SYMBOL TABLE
SGNSGS==^D64			;MAX # OF DISTINCT PSECTS ALLOWED
				;IN ONE ASSEMBLY
SGNDEP==^D16			;MAX PSECT DEPTH ALLOWED
IFN CCLSW,<IFNDEF CTLSIZ,<CTLSIZ==^D200>>
IFN OPHSH,<IFNDEF PRIME,<PRIME==^D701>>
IFNDEF NUMBUF,<NUMBUF==5>	;[200] NUMBER OF INPUT BUFFERS

EXTERN	.JBREL,.JBFF,.JBAPR,.JBSA,.JBERR
EXTERN	.HELPR
IFDEF .REQUEST,<.REQUEST REL:HELPER  >	;[122]

LOWL:!				;START OF LOW SEGMENT
IFN PURESW,<TWOSEGMENTS
	RELOC 400000>

	SALL		;SUPPRESS ALL MACROS

;SOME ASCII CHARACTERS

HT==11
LF==12
VT==13
FF==14
CR==15
CZ==32
EOL==33
CLA==37
			;ACCUMULATORS
AC0==	0
AC1=	AC0+1
AC2=	AC1+1
SDEL=	3		;SEARCH INCREMENT
SX=	SDEL+1		;SEARCH INDEX
ARG=	5		;ARGUMENT
V=	6		;VALUE
C=	7		;CURRENT CHARACTER
CS=	C+1		;CHARACTER STATUS BITS
RC=	11		;RELOCATION BITS
MWP=	12		;MACRO WRITE POINTER
MRP=	13		;MACRO READ POINTER
IO=	14		;IO REGISTER (LEFT)
ER==	IO		;ERROR REGISTER (RIGHT)
FR=	15		;FLAG REGISTER (LEFT)
RX==	FR		;CURRENT RADIX (RIGHT)
MP=	16		;MACRO PUSHDOWN POINTER
PP=	17		;BASIC PUSHDOWN POINTER

%OP==	3
%MAC==	5
%DSYM==	2
%SYM==	1
%DMAC==	%MAC+1
%ERR==%MAC

OPDEF	RESET	[CALLI	 0]
OPDEF	SETDDT	[CALLI   2]
OPDEF	DDTOUT	[CALLI	 3]
OPDEF	DEVCHR	[CALLI	 4]
OPDEF	CORE	[CALLI	11]
OPDEF	EXIT	[CALLI	12]
OPDEF	UTPCLR	[CALLI	13]
OPDEF	DATE	[CALLI	14]
OPDEF	APRENB	[CALLI	16]
OPDEF	MSTIME	[CALLI	23]
OPDEF	PJOB	[CALLI	30]
OPDEF	RUN	[CALLI	35]
OPDEF	TMPCOR	[CALLI	44]
OPDEF	MTWAT.	[MTAPE	 0]
OPDEF	MTREW.	[MTAPE	 1]
OPDEF	MTEOT.	[MTAPE	10]
OPDEF	MTSKF.	[MTAPE	16]
OPDEF	MTBSF.	[MTAPE	17]
			;FR  FLAG REGISTER (FR/RX)
IOSCR== 000001		;NO CR AFTER LINE
POLSW== 000002		;[164] DOING POLISH ON GLOBALS
MTAPSW==000004		;MAG TAPE
ERRQSW==000010		;IGNORE Q ERRORS
LOADSW==000020		;END OF PASS1 & NO EOF YET
DCFSW==	000040		;DECIMAL FRACTION
RIM1SW==000100		;RIM10 MODE
NEGSW==	000200		;NEGATIVE ATOM
RIMSW==	000400		;RIM OUTPUT
PNCHSW==001000		;RIM/BIN OUTPUT WANTED
CREFSW==002000
R1BSW== 004000		;RIM10 BINARY OUTPUT
TMPSW==	010000		;EVALUATE CURRENT ATOM
INDSW==	020000		;INDIRECT ADDRESSING WANTED
RADXSW==040000		;RADIX ERROR SWITCH
FSNSW== 100000		;NON BLANK FIELD SEEN
MWLFLG==200000		;ON FOR DON'T ALLOW MULTI-WORD LITERALS
P1==	400000		;PASS1

			;IO FLAG REGISTER (IO/ER)
FLDSW==	400000		;ADDRESS FIELD
IOMSTR==200000
ARPGSW==100000		;ALLOW RAPID PROGRAM GENERATION
IOPROG==040000		;SUPRESS LISTING (LIST/XLIST PSEUDO OP)
NUMSW==	020000
IOMAC==	010000		;MACRO EXPANSION IN PROGRESS
IOPALL==004000		;SUPRESS LISTING OF MACRO EXPANSIONS
IONCRF==002000		;SUPRESS OUTPUT OF CREF INFORMATION
CRPGSW==001000		;CURRENTLY IN PROGRESS ON RPG
IOCREF==000400		;WE ARE NOW OUTPUTTING CREF INFO
IOENDL==000200		;BEEN TO STOUT
IOPAGE==000100
DEFCRS==000040		;THIS IS A DEFINING OCCURANCE (MACROS)
IOIOPF==000020		;IOP INSTRUCTION SEEN
MFLSW== 000010		;MULTI-FILE MODE,PRGEND SEEN
IORPTC==000004		;REPEAT CURRENT CHARACTER
RSASSW==000002		;[265] REFERENCE IS TO A SYMBOL IN ANOTHER PSECT
IOSALL==000001		;SUPPRESS MACRO LISTING EVEN IF BINARY IS GENERATED

OPDEF	JUMP1	[JUMPL	FR,  ]	;JUMP IF PASS 1
OPDEF	JUMP2	[JUMPGE	FR,  ]	;JUMP IF PASS 2

OPDEF	JUMPOC	[JUMPGE	IO,  ]	;JUMP IF IN OP-CODE FIELD
OPDEF	JUMPAD	[JUMPL	IO,  ]	;JUMP IF IN ADDRESS FIELD

OPDEF	JUMPCM	[JUMPL	CS,  ]	;JUMP IF CURRENT CHAR IS COMMA
OPDEF	JUMPNC	[JUMPGE	CS,  ]	;JUMP IF CURRENT CHAR IS NON-COMMA

OPDEF	PJRST	[JRST]		;JUMP TO POPJ PP,	;RETURN
OPDEF	HALT	[HALT]		;TO PUT IN CREF TABLE
			;ER ERROR REGISTERS (IO/ER)
ERRS==	000010		;[265] ILLEGAL PSECT USAGE
ERRM==	000020		;MULTIPLY DEFINED SYMBOL
ERRE==	000040		;ILLEGAL USE OF EXTERNAL
ERRP==	000100		;PHASE DISCREPANCY
ERRO==	000200		;UNDEFINED OP CODE
ERRN==	000400		;NUMBER ERROR
ERRV==	001000		;VALUE PREVIOUSLY UNDEFINED
ERRU==	002000		;UNDEFINED SYMBOL
ERRR==	004000		;RELOCATION ERROR
ERRL==	010000		;LITERAL ERROR
ERRD==	020000		;REFERENCE TO MULTIPLY DEFINED SYMBOL
ERRA==	040000		;PECULIAR ARGUMENT
ERRX==	100000		;MACRO DEFINITION ERROR
ERRQ==	200000		;QUESTIONABLE, NON-FATAL ERROR
ERROR1==ERRP!ERRM!ERRV!ERRX	;[125] ERRORS THAT PRINT ON PASS 1
ERRORS==777760
LPTSW==	000002
TTYSW==	000001

			;SYMBOL TABLE FLAGS
SYMF==	400000		;SYMBOL
TAGF==	200000		;TAG
NOOUTF==100000		;NO DDT OUTPUT WFW
SYNF==	040000		;SYNONYM
MACF==	SYNF_-1		;MACRO
OPDF==	SYNF_-2		;OPDEF
PNTF==	004000		;"VALUE" IN SYMBOL TBL IS PNTR TO 36BIT VALUE
UNDF==	002000		;UNDEFINED
EXTF==	001000		;EXTERNAL
INTF==	000400		;INTERNAL
ENTF==	000200		;ENTRY
VARF==	000100		;VARIABLE
NCRF==  000040		;[220] DO NOT CREF THIS SYMBOL
MDFF==	000020		;MULTIPLY DEFINED
SPTR==	000010		;SPECIAL EXTERNAL POINTER
SUPRBT==000004		;SUPRESS OUTPUT TO REL AND LISTING
LELF==	000002		;LEFT HAND RELOCATABLE
RELF==	000001		;RIGHT HAND RELOCATABLE

LITF==  200000		;FLAG FOR PSEUDO-OPS INVALID IN LIT'S
ADDF==  100000		;FLAG FOR PSEUDO-OPS INVALID IN ADDRESSES

TNODE==	200000		;TERMINAL NODE FOR EVALEX
;USEFUL MACROS

DEFINE FORERR(AC,ABC)<
	MOVE	AC,[PAGENO,,ABC'PG]
	BLT	AC,ABC'PG+3
>

;MACRO TO BYPASS LEADING TABS AND SPACES
DEFINE BYPASS <
	PUSHJ	PP,GETCHR
	JUMPE	C,.-1
>
SUBTTL	START ASSEMBLING

ASSEMB:	PUSHJ	PP,INZ		;INITIALIZE FOR PASS
	SKIPA	AC1,.+1		;LOCALIZED CODE
	ASCII	/.MAIN/
	MOVEM	AC1,TBUF
	SETZM	TBUF+1		;SIGNAL NOT YET SEEN A TITLE
	MOVEI	SBUF
	HRRM	SUBTTX

ASSEM1:	PUSHJ	PP,CHARAC	;TEST FOR FORM FEED
	SKIPGE	LIMBO		;CRLF FLAG?
	JRST	ASSEM1		;YES ,IGNORE LF
	CAIN	C,14
	SKIPE	SEQNO
	JRST	ASSEM2
	PUSHJ	PP,OUTFF1
	PUSHJ	PP,OUTLI
	JRST	ASSEM1

ASSEM2:	AOS	TAGINC
	CAIN	C,"\"		;BACK-SLASH?
	TLZA	IO,IOMAC	;YES, LIST IF IN MACRO
	TLO	IO,IORPTC
	PUSHJ	PP,STMNT	;OFF WE GO
	TLZN	IO,IOENDL	;WAS STOUT PRE-EMPTED?
	PUSHJ	PP,STOUT	;NO, POLISH OFF LINE
	JRST	ASSEM1
SUBTTL	STATEMENT PROCESSOR

STMNT:	TLZ	FR,INDSW!FSNSW
	SETZM	UPARROW		;[375]CLEAR SPECIAL REPEAT CHARACTER
	TLZA	IO,FLDSW
STMNT1:	PUSHJ	PP,LABEL
STMNT2:	PUSHJ	PP,ATOM		;GET THE FIRST ATOM
	CAIN	C,'='		;"="?
	JRST	ASSIGN		;YES
	CAIN	C,':'		;":"?
	JRST	STMNT1		;YES
	JUMPAD	STMNT7		;NUMERIC EXPRESSION
	JUMPN	AC0,STMN2A	;JUMP IF NON NULL FIELD
	SKIPN	LITLVL		;ALLOW COMMA IN LITERALS
	CAIE	C,','		;NULL, COMMA?
	CAIN	C,EOL		;OR END OF LINE?
	POPJ	PP,		;YES,EXIT
	CAIN	C,']'		;[241] CLOSING LITERAL?
	POPJ	PP,		;YES
	JRST	STMNT9		;NO,AT LEAST SKIP ALL THIS NONSENSE

STMN2A:	JUMPE	C,.+2
	TLO	IO,IORPTC
	PUSHJ	PP,MSRCH	;SEARCH FOR MACRO/OPDEF/SYN
	  JRST	STMNT3		;NOT FOUND, TRY OP CODE
	LDB	SDEL,[POINT 3,ARG,5]
	JUMPE	SDEL,ERRAX	;ERROR IF NO FLAGS
	SOJE	SDEL,OPD1	;OPDEF IF 1
	SOJE	SDEL,CALLM	;MACRO IF 2
	JRST	STMNT4		;SYNONYM, PROCESS WITH OP-CODES

STMNT3:	PUSHJ	PP,OPTSCH	;SEARCH OP CODE TABLE
	  JRST	STMNT5		;NOT FOUND
STMNT4:	HLLZ	AC0,V		;PUT CODE IN AC0
	TRZ	V,ADDF		;CLEAR ADDRESS NON-VALID FLAG
	TRZE	V,LITF		;VALID IN LITERAL?
	SKIPN	LITLVL		;NO, ARE WE IN A LITERAL?
	JRST	0(V)		;NO, GO TO APPROPRIATE PROCESSOR
	POPJ	PP,		;YES,EXIT

STMNT5:	PUSHJ	PP,SSRCH	;TRY SYMBOLS
	  JRST	STMNT8		;NOT FOUND
	TLNN	ARG,EXTF!UNDF	;EXTERNAL OR UNDEFINED?
	TDNE	RC,[-2,,-2]	;CHECK FOR EXTERNAL
	JRST	STMNT7		;YES, PROCESS IN EVALEX
	MOVE	AC0,V		;FOUND, PUT VALUE IN AC0
	TLO	IO,NUMSW	;FLAG AS NUMERIC
STMNT7:	TLZ	IO,IORPTC
STMNT9:	PUSHJ	PP,EVALHA	;EVALUATE EXPRESSION
IFN FORMSW,<	MOVE	AC1,HWFORM	;USE STANDARD FORM>
	TLNE	FR,FSNSW	;FIELD SEEN?
	JRST	STOW		;YES,STOW THE CODE AND EXIT
	CAIE	C,']'		;CLOSING LITERAL?
	TRO	ER,ERRQ		;NO, GIVE "Q" ERROR
	POPJ	PP,		;EXIT
STMNT8:	MOVEI	V,0		;ALWAYS START SCAN WITH 0
	CAIL	V,CALNTH	;END OF TABLE?
	JRST	STMN8C		;YES, TRY TTCALLS
	CAME	AC0,CALTBL(V)	;FOUND IT?
	AOJA	V,.-3		;NO,TRY AGAIN
	SUBI	V,NEGCAL	;CALLI'S START AT -1
	HRLI	V,(CALLI)	;PUT IN UUO
STMN8D:	MOVSI	ARG,OPDF	;SET FLAG FOR OPDEF
STMN8B:	PUSHJ	PP,INSERT	;PUT OPDEF IN TABLE
	JRST	OPD		;AND TREAT AS OPDEF

STMN8C:	SETZ	V,		;START WITH ZERO
	CAIL	V,TTCLTH	;END OF TABLE?
	JRST	STMN8E		;TRY MTAPES
	CAME	AC0,TTCTBL(V)	;MATCH?
	AOJA	V,.-3		;NO, KEEP TRYING
	LSH	V,5		;PUT IN AC FIELD (RIGHT HALF)
	HRLZI	V,<(TTCALL)>(V)	;PUT UUO IN LEFT HALF
	JRST	STMN8D		;SET OPDEF FLAG

STMN8E:	SETZ	V,		;START AT ZERO
	CAIL	V,MTALTH	;END OF TABLE?
	JRST	STMN8A		;YES, ERROR
	CAME	AC0,MTATBL(V)	;MATCH
	AOJA	V,.-3		;NOT YET
	PUSH	PP,AC0		;SAVE IT
	MOVE	AC0,[POINT 9,MTACOD]
	IBP	AC0		;GET TO RIGHT ONE
	SOJGE	V,.-1		;EVENTUALLY
	LDB	V,AC0		;GET FUNCTION
	HRLI	V,(MTAPE)	;FILL IN OPCODE
	POP	PP,AC0
	JRST	STMN8D

STMN8A:	SETZB	V,RC		;CLEAR VALUE AND RELOCATION
	TRO	ER,ERRO		;FLAG AS UNDEFINED OP-CODE
	JUMP1	OPD		;TREAT AS STANDARD OP ON PASS1
	MOVSI	ARG,OPDF!UNDF!EXTF	;SET A FEW FLAGS
	JRST	STMN8B		;TO FORCE OUT A MESSAGE
	SUBTTL	LABEL PROCESSOR
	
LABEL:	JUMPAD	LABEL4		;COMPARE IF NON-SYMBOLIC
	JUMPE	AC0,LABEL5	;ERROR IF BLANK
	TLO	IO,DEFCRS	;THIS IS A DEFINITION
	SKIPN	LITLVL		;[402] LABEL IN LITERAL?
	JRST	LABL10		;[402] NO
	SETOM	LBLFLG		;[402] SET FLAG
	EXCH	AC0,STPX	;[402]
	MOVEM	AC0,LTGINC	;[402] SET MARKER
	EXCH	AC0,STPX	;[402]
LABL10:	PUSH	PP,UNISCH+1	;[402] SAVE SEARCH LIST
	SETZM	UNISCH+1	;BUT DISALLOW
	PUSHJ	PP,SSRCH	;SEARCH FOR OPERAND
	  MOVSI	ARG,SYMF!UNDF!TAGF	;NOT FOUND
	POP	PP,UNISCH+1	;RESTORE STATUS
	TLNN	ARG,EXTF	;OPERAND FOUND (SKIP EXIT)
	JRST	LABEL0
	JUMP1	LABEL3		;ERROR ON PASS1
	TLNN	ARG,UNDF	;UNDEFINED ON PASS1
	JRST	LABEL3		;NO, FLAG ERROR
	TLZ	ARG,EXTF!PNTF	;TURN OFF EXT FLAG NOW
	JUMPE	V,LABEL0	;NOTHING TO CHAIN IF 0
	MOVE	RC,LOCAL	;GET CURENT POINTER
	MOVEM	RC,1(ARG)	;STORE OVER NAME
	HRRM	ARG,LOCAL	;LINK INTO CHAIN
	MOVE	RC,LOCA		;GET CURRENT LOCATION
	HRLM	RC,(ARG)	;STORE BUT SWAPPED
	LSH	V,-^D17		;SHIFT RELOCATION TO BIT 34
	IOR	V,MODA		;CURRENT RELOCATION
	HRLM	V,1(ARG)	;STORE IT
LABEL0:	TLZN	ARG,UNDF!VARF	;WAS IT PREVIOUSLY DEFINED?
	JRST	LABEL2		;YES, CHECK EQUALITY
	MOVE	V,LOCA		;WFW
	MOVE	RC,MODA
	TLO	ARG,TAGF
	PUSHJ	PP,PEEK		;GET NEXT CHAR.
	CAIE	C,":"		;SPECIAL CHECK FOR  ::
	JRST	LABEL1		;NO MATCH
	TLO	ARG,INTF	;MAKE IT INTERNAL
	PUSHJ	PP,GETCHR	;PROCESS NEXT CHAR.
	PUSHJ	PP,PEEK		;PREVIEW NEXT CHAR.
LABEL1:	CAIE	C,"!"		;HALF-KILL SIGN
	JRST	LABEL6		;NO
	TLO	ARG,NOOUTF	;YES, SUPPRESS IT
	PUSHJ	PP,GETCHR	;AND GET RID OF IT
LABEL6:	MOVEM	AC0,TAG		;SAVE FOR PASS 1 ERRORS
	HLLZS	TAGINC		;ZERO INCREMENT
	JRST	INSERT		;INSERT/UPDATE AND EXIT

LABEL2:	HRLOM	V,LOCBLK	;SAVE LIST LOCATION
IFN POLISH,<
	CAMLE	SX,SGSBOT	;IS IT IN THE
	CAMLE	SX,SGSTOP	; CURRENT PSECT
	JRST	LABEL3>		;NO, FLAG ERROR
	CAMN	V,LOCA		;DOES IT COMPARE WITH PREVIOUS? WFW
	CAME	RC,MODA
LABEL3:	TLOA	ARG,MDFF	;NO, FLAG MULTIPLY DEFINED AND SKIP
	JRST	LABEL7		;YES, GET RID OF EXTRA CHARS.
	TRO	ER,ERRM		;FLAG MULTIPLY DEFINED ERROR 
	JRST	UPDATE		;UPDATE AND EXIT
LABEL4:	CAMN	AC0,LOCA	;DO THEY COMPARE?
	CAME	RC,MODA
LABEL5:	TRO	ER,ERRP		;NO, FLAG PHASE ERROR
	POPJ	PP,
LABEL7:	SKIPN	LITLVL		;[155] LABEL IN A LITERAL?
	JRST	LABEL8		;[155] NO
	MOVEM	AC0,LITLBL	;[155] YES, SAVE LABEL NAME FOR LATER
	MOVE	AC0,STPX	;[155] CURRENT DEPTH
	SUB	AC0,STPY	;[155] MINUS START
	MOVEM	AC0,LITLBL+1	;[155] STORE DEPTH IN LIT
	MOVE	AC0,LITLBL	;[155] RESTORE 0
	TLO	ARG,UNDF	;[237] PUT BACK U FLAG
	IORM	ARG,0(SX)	;[237] INCASE REFERENCED IN SAME LITERAL
	JRST	LABEL9		;DON'T STORE LABEL IN LIT
LABEL8:	MOVEM	AC0,TAG		;SAVE FOR ERRORS
	HLLZS	TAGINC
LABEL9:	PUSHJ	PP,PEEK		;INSPECT A CHAR.
	CAIN	C,":"		;COLON?
	PUSHJ	PP,GETCHR	;YES, DISPOSE OF IT
	PUSHJ	PP,PEEK		;EXAMINE ONE MORE CHAR.
	CAIN	C,"!"		;EXCLAMATION?
	JRST	GETCHR		;YES, INDEED
	POPJ	PP,
SUBTTL	ATOM PROCESSOR
ATOM:	PUSHJ	PP,CELL		;GET FIRST CELL
	TLNE	IO,NUMSW	;IF NON-NUMERIC
ATOM1:	CAIE	C,42		;OR NOT A BINARY SHIFT,
	POPJ	PP,		;EXIT

	PUSH	PP,AC0		;STACK REGISTERS, ITS A BINARY SHIFT
	PUSH	PP,AC1
	PUSH	PP,RC
	PUSH	PP,RX
	HRRI	RX,^D10		;COMPUTE SHIFT RADIX 10
	PUSHJ	PP,CELLSF	;GET SHIFT
	MOVE	ARG,RC		;SAVE RELOCATION
	POP	PP,RX		;RESTORE REGISTERS
	POP	PP,RC
	POP	PP,AC1
	MOVN	SX,AC0		;USE NEGATIVE OF SHIFT
	POP	PP,AC0
	JUMPN	ARG,NUMER2	;IF NOT ABSOLUTE
	TLNN	IO,NUMSW	;AND NUMERIC,
	JRST	NUMER2		;FLAG ERROR
	LSHC	AC0,^D35(SX)
	LSH	RC,^D35(SX)
	JRST	ATOM1		;TEST FOR ANOTHER
CELLSF:	TLO	IO,FLDSW
CELL:	SETZB	AC0,RC		;CLEAR RESULT AND RELOCATION
	SETZB	AC1,AC2		;CLEAR WORK REGISTERS
	MOVEM	PP,PPTEMP	;SAVE PUSHDOWN POINTER
	TLZ	IO,NUMSW
	TLZA	FR,NEGSW!DCFSW!RADXSW

CELL1:	TLO	IO,FLDSW
	AOSLE	UPARRO		;[333] SKIP GETCHR IF RE-EATING ^
	BYPASS
	LDB	V,[POINT 4,CSTAT(C),14]	;GET CODE
	XCT	.+1(V)		;EXECUTE, INDEX VIA BITS 11,12,13,14 OF CSTAT TABLE
	JRST	CELL1		;0; BLANK, (TAB OR "+")
	JRST	LETTER		;1; LETTER  ] $ % ( ) , ; >
	TLC	FR,NEGSW	;2; "-"
	TLO	FR,INDSW	;3; "@"
	JRST	NUM1		;4; NUMERIC   0 - 9
	JRST	ANGLB		;5; "<"
	JRST	SQBRK		;6; "["
	JRST	QUOTES		;7; ""","'" 
	JRST	QUAL		;10; "^"
	JRST	PERIOD		;11; "."
	TROA	ER,ERRQ		;12; ERROR, FLAG AND TREAT AS DELIMITER
				;12;	! # & * / : = ? \ _
LETTER:	TLOA	AC2,(POINT 6,AC0,)	;SET BYTE POINTER
LETTE1:	PUSHJ	PP,GETCHR	;GET CHARACTER
	TLNN	CS,6		;ALPHA-NUMERIC?
	JRST	LETTE3		;NO,TEST FOR VARIABLE
	TLNE	AC2,770000	;STORE ONLY SIX BYTES
LETTE2:	IDPB	C,AC2		;RETURN FROM PERIOD
	JRST	LETTE1

LETTE3:	CAIE	C,03		;"#"?
	POPJ	PP,
	JUMPE	AC0,POPOUT	;TEST FOR NULL
	PUSHJ	PP,PEEK		;PEEK AT NEXT CHAR.
	CAIN	C,"#"		;IS IT 2ND #?
	JRST	LETTE4		;YES, THEN IT'S AN EXTERN
	TLO	IO,DEFCRS
	PUSHJ	PP,SSRCH	;YES, SEARCH FOR SYMBOL (OPERAND)
	  MOVSI	ARG,SYMF!UNDF	;NOT FOUND, FLAG AS UNDEFINED SYM.
	TLNN	ARG,UNDF	;UNDEFINED?
	JRST	LETTE5		;[247] NO, BUT SEE IF ALREADY DEFINED AS EXTERNAL
	TLO	ARG,VARF	;YES, FLAG AS A VARIABLE
	TRO	ER,ERRU		;SET UNDEFINED ERROR FLAG
	PUSHJ	PP,INSERZ	;INSERT IT WITH A ZERO VALUE
	JRST	GETDEL

LETTE4:	PUSHJ	PP,GETCHR	;AND SCAN PAST IT
	TLZ	IO,DEFCRS	;[267] MAKE SURE NOT A DEFINITION
	PUSHJ	PP,EXTER5	;[267] PUT IN SYMBOL TABLE
	JRST	GETCHR		;GET RID OF #

LETTE5:	TLNE	ARG,EXTF	;[247] EXTERNAL
	TRO	ER,ERRQ		;[247] YES, FLAG WITH "Q" ERROR
	JRST	GETCHR		;[247] GET NEXT CHAR AND RETURN

NUMER1:	SETZB	AC0,RC		;RETURN ZERO
NUMER2:	TRO	ER,ERRN		;FLAG ERROR

GETDEL:	PUSHJ	PP,GETCHR
GETDE1:	JUMPE	C,.-1
	MOVEI	AC1,0
GETDE3:	TLO	IO,NUMSW!FLDSW	;FLAG NUMERIC
	TLNN	FR,NEGSW	;IS ATOM NEGATIVE?
	POPJ	PP,		;NO, EXIT
	JUMPE	AC1,GETDE2
	MOVNS	AC1
	TDCA	AC0,[-1]
GETDE2:	MOVNS	AC0		;YES, NEGATE VALUE
	MOVNS	RC		;AND RELOCATION
POPOUT:	POPJ	PP,		;EXIT
QUOTES:	CAIE	C,"'"-40	;IS IT  "'"
	JRST	QUOTE		;NO MUST BE """
	JRST	SQUOTE		;YES

QUOTE0:	TLNE	AC0,376000	;5 CHARACTERS STORED ALREADY?
	TRO	ER,ERRQ		;YES, GIVE WARNING
	ASH	AC0,7
	IOR	AC0,C
QUOTE:	PUSHJ	PP,CHARAC	;GET 7-BIT ASCII
	CAIG	C,15		;TEST FOR LF, VT, FF OR CR
	CAIGE	C,12
	JRST	.+2		;NO, SO ALL IS WELL
	JRST	QUOTE2		;ESCAPE WITH Q ERROR
	CAIE	C,42
	JRST	QUOTE0
	PUSHJ	PP,PEEK		;LOOK AT NEXT CHAR.
	CAIE	C,42
	JRST	QUOTE1		;RESTORE REPEAT LEVEL AND QUIT
	PUSHJ	PP,CHARAC	;GET NEXT CHAR.
	JRST	QUOTE0		;USE IT

QUOTE2:	TRO	ER,ERRQ		;SET Q ERROR
QUOTE1:	JRST	GETDEL

SQUOT0:	CAIL	C,"a"		;[243] TEST FOR LOWER CASE
	CAILE	C,"z"		;[243] ...
	JRST	.+2		;[243] NO
	SUBI	C," "		;[243]
	TLNE	AC0,770000	;SIX CHARS. STORED ALREADY ?
	TRO	ER,ERRQ		;YES
	LSH	AC0,6
	IORI	AC0,-40(C)	;OR IN SIXBIT CHAR.

SQUOTE:	PUSHJ	PP,CHARAC
	CAIG	C,CR
	CAIGE	C,LF
	JRST	.+2
	JRST	QUOTE2		;[245] FLAG WITH "Q" ERROR
	CAIE	C,"'"
	JRST	SQUOT0
	PUSHJ	PP,PEEK
	CAIE	C,"'"
	JRST	QUOTE1
	PUSHJ	PP,CHARAC
	JRST	SQUOT0
QUAL:	BYPASS			;SKIP BLANKS, GET NEXT CHARACTER
	CAIN	C,'B'		;"B"?
	JRST	QUAL2		;YES, RADIX=D2
	CAIN	C,'O'		;"O"?
	JRST	QUAL8		;YES, RADIX=D8
	CAIN	C,'F'		;"F"?
	JRST	NUMDF		;YES, PROCESS DECIMAL FRACTION
	CAIN	C,'L'		;"L"?
	JRST	QUALL		;YES
	CAIN	C,'-'		;[123] "^-" IS NOT
	JRST	QUALN		;[123]
	CAIE	C,'D'		;"D"?
	JRST	NUMER1		;NO, FLAG NUMERIC ERROR
	ADDI	AC2,2
QUAL8:	ADDI	AC2,6
QUAL2:	ADDI	AC2,2
	PUSH	PP,RX
	HRR	RX,AC2
	PUSHJ	PP,CELLSF
QUAL2A:	POP	PP,RX
	TLNN	IO,NUMSW
	JRST	NUMER1
	JRST	GETDE1

QUALL:	PUSH	PP,FR
	PUSHJ	PP,CELLSF
	MOVE	AC2,AC0
	MOVEI	AC0,^D36
	SETZ	RC,		;[374] IN CASE ARG IS RELOCATABLE
	JUMPE	AC2,QUAL2A
	LSH	AC2,-1
	SOJA	AC0,.-2

QUALN:	MOVE	CS,CSTATN	;[416]GET CHARACTERISTICS FOR "^-"
	JRST	GETDE1		;[416]THEN GET DELIMITER
SUBTTL	LITERAL PROCESSOR

SQBRK:	PUSH	PP,TAG		;[402] SAVE CURRENT TAG
	PUSH	PP,TAGINC	;[402] AND OFFSET
	PUSH	PP,FR
	PUSH	PP,EXTPNT	;ALLOW EXTERN TO PRECEDE LIT IN XWD
IFN FORMSW,<	PUSH	PP,IOSEEN	;[344] SAVE I/O INSTRUCTION SEEN VALUE>
	SETZM	EXTPNT
	SKIPE	LITLVL		;SAVE SEQNO AND PAGE IF NOT IN LIT ALREADY
	JRST	SQB5
	FORERR	(C,LIT)
SQB5:	JSP	AC2,SVSTOW
	PUSH	PP,[0]		;[217] STACK A ZERO
	TLNE	IO,IOPALL	;[217] LEAVE ALONE IF LALL ON
	TLNN	IO,IOSALL	;[321] TEST IF SALL ALREADY ON
	SETOM	(PP)		;[217] SIGNAL NOT BY -1
	PUSH	PP,LITERR	;[415]SAVE LITERR FROM PREVIOUS LEVEL
	SETZM	LITERR		;[415]CLEAR IT FOR THIS LEVEL
SQB3:	PUSHJ	PP,STMNT
	IORM	ER,LITERR	;[415]GET CUMMULATIVE ERRORS FOR LEVEL
	CAIN	C,75		;CHECK FOR ]
	JRST	SQB1
	TLO	IO,IORPTC
	TLNE	FR,MWLFLG	;CALL IT ] IF NOT MULTI-WORD FLAG
	JRST	SQB2		;BUT REPEAT LAST CHARACTER
	BYPASS
	CAIN	C,EOL
	TLOA	IO,IORPTC
	TRO	ER,ERRQ
SQB4:	PUSHJ	PP,CHARAC
	CAIN	C,";"		;COMMENT?
	JRST	SQB6		;YES, IGNORE SQUARE BRACKETS
	CAIN	C,"]"		;LOOK FOR TERMINAL SQB
	TRNN	ER,ERRORS	;IN CASE OF ERROR IN LITERAL
	JRST	.+2		;NO ALL IS WELL
	JRST	SQB1		;FINISH THE LITERAL NOW!!
	CAIG	C,FF		;LOOK FOR END OF LINE
	CAIN	C,HT
	JRST	SQB4
SQB4A:	PUSHJ	PP,OUTIML	;DUMP
	PUSHJ	PP,CHARAC	;GET ANOTHER CHAR.
	SKIPL	LIMBO		;CRLF FLAG
	TLO	IO,IORPTC	;NO REPEAT
	JRST	SQB3

SQB6:	PUSHJ	PP,CHARAC	;GET A CHARACTER
	CAIG	C,CR
	CAIN	C,HT		;LOOK FOR END OF LINE CHAR.
	JRST	SQB6		;NOT YET
	JRST	SQB4A		;GOT IT
SQB1:	TLZ	IO,IORPTC
SQB2:	PUSHJ	PP,STOLIT
	POP	PP,LITERR	;[415]RESTORE LITERR FOR NEXT LEVEL
	SKIPE	(PP)		;[217] WAS SALL ORIGINALLY ON?
	TLZ	IO,IOSALL	;[217] NO, SO TURN IT OFF
	POP	PP,(PP)		;[217] GET STACK RIGHT
	JSP	AC2,GTSTOW
	SKIPE	LITLBL		;NEED TO FIXUP A LABEL?
	PUSHJ	PP,RELBLE	;YES, USE LOC OF LITERAL
IFN POLISH,<
	SKIPE	POLITS		;[265] NEED TO FIXUP ANY POLISH?
	PUSHJ	PP,SQBPOL	;[265] YES
>
IFN FORMSW,<	POP	PP,IOSEEN	;[344] RESTORE IOSEEN FOR LISTING>
	POP	PP,EXTPNT
	POP	PP,FR
	POP	PP,TAGINC	;[402] RESTORE PREVIOUS OFFSET
	POP	PP,TAG		;[402] AND LABEL
	SETZM	LBLFLG		;[402] ZERO 'LABEL-IN-LITERAL' FLAG
	SETZM	LTGINC		;[402] AND MARKER
	SKIPE	LITLVL		;WERE WE NESTED?
	JUMP1	NUMER2		;YES, FORCE ERROR IF PASS 1
	JUMP2	GETDEL		;[120] USE VALUE GIVEN IF PASS 2
	TRO	ER,ERRU		;[120] VALUE IS UNDEFINED ON PASS 1
	SETZ	AC0,		;[120] SO SET IT TO 0
	JRST	GETDEL		;[120]

RELBLE:	PUSH	PP,AC0		;SAVE LOCATION COUNTER
	PUSH	PP,RC		;AND RELOCATION
	MOVE	AC0,LITLBL	;SYMBOL WE NEED
	SETZM	LITLBL		;ZERO INDICATOR
	PUSHJ	PP,SSRCH	;SEARCH FOR OPERAND
	JRST	RELBL1		;SHOULD NEVER HAPPEN
	TLNN	ARG,TAGF	;IT BETTER BE A LABEL
	JRST	RELBL1		;IT WASN'T , GIVE UP BEFORE SOME HARM IS DONE
	TLZ	ARG,UNDF!EXTF!PNTF	;CLEAR FLAGS NOW
	POP	PP,RC		;GET LITERAL RELOCATION
	MOVE	V,(PP)		;GET VALUE (LOC COUNTER)
	ADD	V,LITLBL+1	;[155] PLUS DEPTH IN LITERAL
	PUSHJ	PP,UPDATE	;UPDATE VALUE
	POP	PP,AC0		;RESTORE LITERAL COUNT
	POPJ	PP,		;RETURN
	
RELBL1:	POP	PP,RC		;RESTORE RC
	POP	PP,AC0		;AND AC0
	POPJ	PP,		;JUST RETURN
IFN POLISH,<			;[265]
;HERE TO FIXUP POLISH EXPRESSIONS INSIDE CURRENT LIT
;AS EACH ONE IS FIXED MOVE IT TO POLIST
SQBPOL:	PUSH	PP,CS		;GET SOME FREE ACCS
	PUSH	PP,AC0		;SAVE LOC
SQBPL1:	MOVE	CS,@POLITS	;GET A BLOCK POINTER
	EXCH	CS,POLITS	;SET FOR NEXT TIME
	MOVE	AC0,CS		;GET A COPY
	EXCH	AC0,POLIST	;STORE IN LIST OF "GOOD" POLISH
	MOVEM	AC0,(CS)	;LINK IN
SQBPL2:	ADDI	CS,1		;FIRST WORD
	MOVE	AC0,(CS)	;GET SOMETHING
	JUMPL	AC0,SQBPL5	;THIS IS AN OPERATOR
	JUMPE	AC0,SQBPL4	;18 BIT VALUE
	SOJE	AC0,SQBPL3	;36 BIT VALUE
	AOJA	CS,SQBPL2	;SYMBOL

SQBPL3:	ADDI	CS,1		;SKIP OVER 2 WORDS
SQBPL4:	AOJA	CS,SQBPL2	;GET NEXT

SQBPL5:	HRRZ	AC0,AC0		;GET OPERATOR ONLY
	CAIGE	AC0,-6		;[265] CHECK FOR STORE OP
	JRST	SQBPL2		;ITS NOT
	MOVE	AC0,0(PP)	;GET ADDRESS
	ADDM	AC0,1(CS)	;ADD TO OFFSET
	HRLM	RC,1(CS)	;SET RELOCATION
	SKIPE	POLITS		;MORE TO DO?
	JRST	SQBPL1		;YES
	POP	PP,AC0		;RESTORE LOC
	POP	PP,CS		;AND SAVED AC
	POPJ	PP,
>
SUBTTL	NUMBER PROCESSOR

ANGLB:	PUSH	PP,FR
	TLZ	FR,INDSW
	PUSHJ	PP,ATOM
	TLNN	IO,NUMSW
	CAIE	C,35
	JRST	ANGLB1
	PUSHJ	PP,ASSIG1
	MOVE	AC0,V
	JRST	ANGLB2

ANGLB1:	PUSHJ	PP,EVALHA
ANGLB2:	POP	PP,FR
	CAIE	C,36
	TRO	ER,ERRN
	JRST	GETDEL

PERIOD:	PUSHJ	PP,GETCHR	;LOOK AT NEXT CHARACTER
	TLNN	CS,2		;ALPHABETIC?
	JRST	PERNUM		;NO, TEST NUMERIC
	MOVSI	AC0,'.  '	;YES, PUT PERIOD IN AC0
	MOVSI	AC2,(POINT 6,AC0,5)	;SET BYTE POINTER
	JRST	LETTE2		;AND TREAT AS SYMBOL

PERNUM:	TLNE	CS,4		;IS IT A NUMBER
	JRST	NUM32		;YES
	MOVE	AC0,LOCA	;NO. CURRENT LOC SYMBOL (.)
	MOVE	RC,MODA		;SET TO CURRENT ASSEMBLY MODE
	JRST	GETDE1		;GET DELIMITER
NUMDF:	TLO	FR,DCFSW	;SET DECIMAL FRACTION FLAG
NUM:	PUSHJ	PP,GETCHR	;GET A CHARACTER
	TLNN	CS,4		;NUMERIC?
	JRST	NUM10		;NO
NUM1:	SUBI	C,20		;CONVERT TO OCTAL
	PUSH	PP,C		;STACK FOR FLOATING POINT
	SKIPE	AC0		;ARE WE ABOUT TO LOSE SOME DATA?
	TRO	ER,ERRQ		;YES, AT LEAST WARN USER
	MOVE	AC0,AC1
	MULI	AC0,0(RX)
	ADD	AC1,C		;ADD IN LAST VALUE
	CAIL	C,0(RX)		;IS NUMBER LESS THAN CURRENT RADIX?
	TLO	FR,RADXSW	;NO, SET FLAG
	AOJA	AC2,NUM		;YES, AC2=NO. OF DECIMAL PLACES
NUM10:	CAIE	C,'.'		;PERIOD?
	TLNE	FR,DCFSW	;OR DECIMAL FRACTION?
	JRST	NUM30		;YES, PROCESS FLOATING POINT
	SETZ	CS,		;AND CLEAR IT
	CAIN	C,'K'		;SEE IF SUFFIX THERE
	MOVEI	CS,3
	CAIN	C,'M'
	MOVEI	CS,6
	CAIN	C,'G'
	MOVEI	CS,9
	JUMPE	CS,NUM12	;NO SUFFIX?
	MOVE	AC0,AC1		;SCALE THE NUMBER
	MULI	AC0,(RX)
	SOJG	CS,.-2
	PUSHJ	PP,GETCHR	;SKIP THE SUFFIX
NUM12:	MOVE	CS,CSTAT(C)	;RESTORE STATUS
	LSH	AC1,1		;NO, CLEAR THE SIGN BIT
	LSHC	AC0,^D35	;AND SHIFT INTO AC0
	MOVE	PP,PPTEMP	;RESTORE PP
	SOJE	AC2,GETDE1	;NO RADIX ERROR TEST IF ONE DIGIT
	TLNE	FR,RADXSW	;WAS ILLEGAL NUMBER ENCOUNTERED?
	TRO	ER,ERRN		;YES, FLAG N ERROR
	JRST	GETDE1

NUM30:	CAIE	C,'B'		;IF "B" THEN MISSING  "."
NUM31:	PUSHJ	PP,GETCHR
	TLNN	CS,4		;NUMERIC?
	JRST	NUM40		;NO
NUM32:	SUBI	C,20
	PUSH	PP,C
	JRST	NUM31

NUM40:	PUSH	PP,FR		;STACK VALUES
	HRRI	RX,^D10
	PUSH	PP,AC2
	PUSH	PP,PPTEMP
	CAIN	C,45		;"E"?
	JRST	[PUSHJ PP,PEEK		;GET NEXT CHAR
		PUSH	PP,C		;SAVE NEXT CHAR
		PUSHJ	PP,CELL		;YES, GET EXPONENT
		POP	PP,C		;GET FIRST CHAR. AFTER E
		CAIN	V,4		;MUST HAVE NUMERICAL STATUS
		JRST	.+2		;SKIP RETURN
		CAIN	C,"<"		;ALLOW <EXP>
		JRST	.+2		;SKIP RETURN
		SKIPN	AC0		;ERROR IF NON-ZERO EXPRESSION
		TROA	ER,ERRQ		;ALLOW E+,E-
		SETOM	RC		;FORCE NUMERICAL ERROR
		JRST	.+2]		;SKIP RETURN
	MOVEI	AC0,0		;NO, ZERO EXPONENT
	POP	PP,PPTEMP
	POP	PP,SX
	POP	PP,FR
	HRRZ	V,PP
	MOVE	PP,PPTEMP
	JUMPN	RC,NUMER1	;EXPONENT MUST BE ABSOLUTE
	ADD	SX,AC0
	HRRZ	ARG,PP
	ADD	SX,ARG
	SETZB	AC0,AC2
	TLNE	FR,DCFSW
	JRST	NUM60
	JOV	NUM50		;CLEAR OVERFLOW FLAG
NUM50:	JSP	SDEL,NUMUP	;FLOATING POINT
	JRST	NUM52		;END OF WHOLE NUMBERS
	FMPR	AC0,[10.0]	;MULTIPLY BY 10
	TLO	AC1,233000	;CONVERT TO FLOATING POINT
	FADR	AC0,AC1		;ADD IT IN
	JRST	NUM50

NUM52:	JSP	SDEL,NUMDN	;PROCESS FRACTION
	FADR	AC0,AC2
	JOV	NUMER1		;TEST FOR OVERFLOW
	JRST	GETDE1

	TLO	AC1,233000
	TRNE	AC1,-1
	FADR	AC2,AC1		;ACCUMULATE FRACTION
	FDVR	AC2,[10.0]
	JRST	NUM52

NUM60:	JSP	SDEL,NUMUP
	JRST	NUM62
	IMULI	AC0,^D10
	ADD	AC0,AC1
	JRST	NUM60

NUM62:	LSHC	AC1,-^D36
	JSP	SDEL,NUMDN
	LSHC	AC1,^D37
	PUSHJ	PP,BYPAS2
	JRST	GETDE3

	DIVI	AC1,^D10
	JRST	NUM62

NUMUP:	MOVEI	AC1,0
	CAML	ARG,SX
	JRST	0(SDEL)
	CAMGE	ARG,V
	MOVE	AC1,1(ARG)
	AOJA	ARG,1(SDEL)

NUMDN:	MOVEI	AC1,0
	CAMG	V,SX
	JRST	0(SDEL)
	CAMLE	V,ARG
	MOVE	AC1,0(V)
	SOJA	V,3(SDEL)
SUBTTL	GETSYM
GETSYM:	MOVEI	AC0,0		;CLEAR AC0
	MOVSI	AC1,(POINT 6,AC0)	;PUT POINTER IN AC1
	BYPASS			;SKIP LEADING BLANKS
	TLNN	CS,2		;ALPHABETIC?
	JRST	GETSY1		;NO, ERROR
	CAIE	C,16		;PERIOD?
	JRST	GETSY2		;NO, A VALID SYMBOL
	IDPB	C,AC1		;STORE THE CHARACTER
	PUSHJ	PP,GETCHR	;YES, TEST NEXT CHARACTER
	TLNN	CS,2		;ALPHABETIC?
GETSY1:	TROA	ER,ERRA
GETSY2:	AOS	0(PP)		;YES, SET SKIP EXIT
GETSY3:	TLNN	CS,6		;ALPHA-NUMERIC?
	JRST	BYPAS2		;NO, GET DELIMITER
	TLNE	AC1,770000	;YES, HAVE WE STORED SIX?
	IDPB	C,AC1		;NO, STORE IT
	PUSHJ	PP,GETCHR
	JRST	GETSY3
SUBTTL	EXPRESSION EVALUATOR
CV==	AC0			;CURRENT VALUE
PV==	AC1			;PREVIOUS VALUE
RC==	RC			;CURRENT RELOCATABILITY
PR==	AC2			;PREVIOUS RELOCATABILITY
CS=	CS			;CURRENT STATUS
PS==	SDEL			;PREVIOUS STATUS

EVALHA:	TLO	FR,TMPSW
EVALCM:	PUSHJ	PP,EVALEX	;EVALUATE FIRST EXPRESSION
	PUSH	PP,[0]		;MARK PDL
	JUMPCM	EVALC3		;JUMP IF COMMA
	TLO	IO,IORPTC	;IT'S NOT,SO REPEAT
	JRST	OP		;PROCESS IN OP
EVALC3:
IFN FORMSW,<PUSH PP,INFORM	;PUT FORM WORD ON STACK>
	PUSH	PP,[0]		;STORE ZERO'S ON PDL
	PUSH	PP,[0]		;.......
	MOVSI	AC2,(POINT 4,(PP),12)
	JRST	OP1B		;PROCESS IN OP

EVALEX:	TLO	IO,FLDSW
IFN POLISH,<
	TLZ	FR,POLSW	;[164] CLEAR EVALUATING POLISH FLAG
>
	PUSH	PP,[TNODE,,0]	;MARK THE LIST 200000,,0
	TLZN	FR,TMPSW
EVATOM:	PUSHJ	PP,ATOM		;GET THE NEXT ATOM
	JUMPE	AC0,EVGETD	;TEST FOR NULL/ZERO
	TLOE	IO,NUMSW	;SET NUMERIC, WAS IT PREVIOUSLY?
	JRST	EVGETD+1	;YES, TREAT ACCORDINGLY
	PUSHJ	PP,SEARCH	;SEARCH FOR MACRO OR SYMBOL
	  JRST	EVOP		;NOT FOUND, TRY FOR OP-CODE
	JUMPL	ARG,.+2		;SKIP IF OPERAND
	PUSHJ	PP,SSRCH1	;OPERATOR, TRY FOR SYMBOL (OPERAND)
	PUSHJ	PP,QSRCH	;PERFORM CROSS-REFERENCE
	JUMPG	ARG,EVMAC	;BRANCH IF OPERATOR
	MOVE	AC0,V		;SYMBOL, SET VALUE
	JRST	EVTSTS		;TEST STATUS

EVMAC:	TLNE	FR,NEGSW	;UNARY MINUS?
	JRST	EVERRZ		;YES, INVALID BEFORE OPERATOR
	LDB	SDEL,[POINT 3,ARG,5]	;GET MACF/OPDF/SYNF
	SOJL	SDEL,EVERRZ	;ERROR IF NO FLAGS

	JUMPE	C,.+2		;NON-BLANK?
	TLO	IO,IORPTC	;YES, REPEAT CHARACTER
	SOJE	SDEL,EVMAC1	;MACRO IF 2
	JUMPG	SDEL,EVOPS	;SYNONYM IF 4

	MOVE	AC0,V		;OPDEF
	MOVEI	V,OP		;SET TRANSFER VECTOR
	JRST	EVOPD
EVMAC1:	SKIPL	MACENL		;ALREADY IN CALLM?
	JRST	CALLM		;NO, EVALUATE MACRO
	SETZB	RC,AC0		;ZERO VALUE
	TRO	ER,ERRA		;SET "A" ERROR
	JRST	EVGETD		;CONTINUE EVALUATION

EVOP:	PUSHJ	PP,OPTSCH	;[363] SEARCH OP TABLE
	  JRST	EVOPX		;[363] NOT FOUND
	TLNE	FR,NEGSW	;[363] OPCODE, UNARY MINUS?
	JRST	EVERRZ		;[363] YES, ERROR
EVOPS:	TRZ	V,LITF		;CLEAR LIT INVALID FLAG
	TRZE	V,ADDF		;SYNONYM
	JRST	EVOPX		;PSEUDO-OP THAT GENERATES NO DATA JUMPS
	HLLZ	AC0,V
EVOPD:	JUMPE	C,.+2		;OPDEF, NON-BLANK DELIMITER?
	TLO	IO,IORPTC	;YES, REPEAT CHARACTER
	JSP	AC2,SVSTOW
	PUSHJ	PP,0(V)
	PUSHJ	PP,DSTOW
	JSP	AC2,GTSTOW
	TRNE	RC,-2
	HRRM	RC,EXTPNT
	TLNE	RC,-2
	HLLM	RC,EXTPNT
	JRST	EVNUM

EVOPX:	MOVSI	ARG,SYMF!UNDF
	PUSHJ	PP,INSERZ
EVERRZ:	SETZB	AC0,RC		;CLEAR CODE AND RELOCATION
EVERRU:	TRO	ER,ERRU
	JRST	EVGETD
EVTSTS:	TLNE	ARG,UNDF
	JRST	[TRO	ER,ERRU	;SET UNDEF ERROR
		JUMP1	EVGETD	;TREAT AS UNDF ON PASS1
		JRST	.+1]	;TREAT AS EXTERNAL ON PASS2
	TLNN	ARG,EXTF
	JRST	EVTSTR
	HRRZ	RC,ARG		;GET ADRES WFW
	HRRZ	ARG,EXTPNT	;SAVE IT WFW
	HRRM	RC,EXTPNT	;WFW
IFE POLISH,<			;[164] NOT NEEDED SINCE POLISH WILL TAKE CARE OF EXTERNS
	TRNE	ARG,-1		;WFW
	TRO	ER,ERRE
>
	SETZB	AC0,ARG

EVTSTR:	TLNE	ARG,MDFF	;MULTIPLY DEFINED?
	TRO	ER,ERRD		;YES, FLAG IT
	TLNN	FR,NEGSW	;[255] NEGATIVE ATOM?
	JRST	EVGETD		;[255] NO
IFN POLISH,<
	TDNE	RC,[-2,,-2]	;[255] EXTERNALS?
	JRST	NEGEXT		;[255] YES, MUST BE UNARY MINUS
>
	PUSHJ	PP,GETDE2	;[255] NO, JUST NEGATE
EVGETD:	TLNE	IO,NUMSW	;NON BLANK FIELD
	TLO	FR,FSNSW	;YES,SET FLAG
	PUSHJ	PP,BYPAS2
	TLNE	CS,6		;ALPHA-NUMERIC?
	TLO	IO,IORPTC	;YES, REPEAT IT
	CAIN	C,'^'		;[123] IS THIS THE SPECIAL ESCAPE CHAR?
	JRST	EVUPAR		;[123] YES, SEE WHAT FOLLOWS

EVUPAT:				;[333] LABEL FOR RETURN FROM ^
IFN POLISH,<
	TLZN	IO,RSASSW	;INTER-PSECT REFERENCE?
	JRST	EVNUM		;NO
	PUSH	PP,SGWFND	;INX OF PSECT REFERRED TO
	PUSH	PP,[-1]		;DUMMY RELOCATION
	PUSH	PP,CSTATP>	;ADDITIVE PSECT OPERATION
EVNUM:	POP	PP,PS		;POP THE PREVIOUS DELIMITER/TNODE
	TLO	PS,4000
IFN POLISH,<
	TLC	PS,110000	;TEST FOR BITS 2 AND 5
	TLCN	PS,110000	; BOTH ON - MEANS ADDITIVE
	JRST	EVXCT>		; PSECT OPERATION
	CAMGE	PS,CS		;OPERATION REQUIRED?
	JRST	EVPUSH		;NO, PUT VALUES BACK ON STACK
	TLNN	PS,TNODE	;YES, HAVE WE REACHED TERMINAL NODE?
	JRST	EVXCT		;NO, EXECUTION REQUIRED
	TLNE	CS,170000	;[123] YES, ARE WE POINTING AT DEL? (& ! * / + - _)
	JRST	EVPUSH		;[123] NO,FALL INTO EVPUSH
IFN POLISH,<
	TLNE	FR,POLSW	;[164] BEEN RESOLVING POLISH?
	JRST	POLPOP		;[164] YES, OUTPUT IT
>
	POPJ	PP,		;NO, EXIT

;HERE TO HANDLE "^!" 

EVUPAR:	SETZM	UPARRO		;[333] CLEAR ^ COUNTER ONCE IN A WHILE
	PUSHJ	PP,PEEK		;[333] SEE WHAT CHARACTER AFTER ^ IS
	SETZ	CS,		;[333] AND CHECK FOR ! AFTER IT
	CAIN	C,"!"		;[333] IS IT ! FOR ^!
	SKIPA	CS,CSTATX	;[333] YES, GET SPECIAL POINTER
	JRST	EVUPAN		;[416]NOT ^!
	TLZ	IO,IORPTC	;[337] CLEAR REREAD
	SKIPE	MRP		;[357] IF IN A MACRO
	PUSHJ	PP,MREAD	;[357] BETTER DO THIS
	SUBI	C,40		;[333] YES, CHANGE TO SIXBIT
	JRST	EVNUM		;[333] AND EVALUATE
EVUPAN:	MOVEI	C,'^'		;[333] RESTORE C
	MOVE	CS,CSTAT(C)	;[333] AND CS
	SETOM	UPARRO		;[333] SET FLAG FOR CELL1 TO RE-EAT ^
	JRST	EVUPAT		;[333] AND CONTINUE FROM ^
EVPUSH:	PUSH	PP,PS		;STACK VALUES
	PUSH	PP,CV
	PUSH	PP,RC
	PUSH	PP,CS
	JRST	EVATOM		;GET NEXT ATOM

EVXCT:	POP	PP,PR		;POP PREVIOUS RELOCATABILITY
	POP	PP,PV		;AND PREVIOUS VALUE
	LDB	PS,[POINT 4,PS,29]	;[123] TYPE OF OPERATION TO PS
IFE POLISH,<
	XCT	EVTAB(PS)	;[123] PERFORM PROPER OPERATION
	JUMPN	RC,.+2		;COMMON RELOCATION TEST
EVXCT1:	JUMPE	PR,EVNUM
	TRO	ER,ERRR		;BOTH MUST BE FIXED
	JRST	EVNUM		;GO TRY AGAIN

EVTAB:	JRST	ASSEM1		;0; SHOULD NEVER GET HERE ;DMN
	JRST	XMUL		;1;
	JRST	XDIV		;2;
	JRST	XADD		;3;
	JRST	XSUB		;4;
	JRST	XLRW		;5; "_"
	IOR	CV,PV		;6; MERGE PV INTO CV
	AND	CV,PV		;7; AND PV INTO CV
	XOR	CV,PV		;10; XOR PV INTO CV
	SETCM	CV,CV		;11;[416] NOT (ONE'S COMPLIMENT)
REPEAT 6,<HALT>			;12-17;[416] JUST INCASE
>
IFN POLISH,<
	CAILE	PS,11		;[265] OPS 12 AND 13
	JRST	POLPSH		;[265]  REQUIRE POLISH FIXUPS
	TDNN	RC,[-2,,-2]	;CHECK FOR EXTERNALS
	TDNE	PR,[-2,,-2]	;IN EITHER OPERAND
	JUMP2	POLPSH		;CAN NOT DO IT HERE
	XCT	PRTAB(PS)	;TEST PREVIOUS RELOCATION
	XCT	RCTAB(PS)	;AND THIS RELOCATION
EVXCT1:	JFCL	17,.+1		;[276] CLEAR OVERFLOW FOR * AND /
	XCT	EVTAB(PS)	;[276] PERFORM PROPER OPERATION
	SKIPL	OKOVFL		;[362] OVERFLOW OK?
	JOV	.+2		;[276] SKIP IF * OR / OVERFLOWED
	SKIPA			;[276] IT'S OK
	TRO	ER,ERRN		;[276] SET N ERROR FOR OVERFLOW
	JRST	EVNUM		;GO TRY AGAIN

EVTAB:	JRST	ASSEM1		;0; SHOULD NEVER GET HERE ;DMN
	IMULM	PV,CV		;1;
	IDIVM	PV,CV		;2;
	JRST	XADD		;3;
	JRST	XSUB		;4;
	JRST	XLRW		;5; "_"
	IOR	CV,PV		;6; MERGE PV INTO CV
	AND	CV,PV		;7; AND PV INTO CV
	XOR	CV,PV		;10; XOR PV INTO CV
	SETCM	CV,CV		;11; NOT (ONE'S COMPLIMENT)
	MOVN	CV,CV		;12; NEGATE (TWO'S COMPLEMENT)
	JFCL			;13;[265] ADDITIVE PSECT OPERATION
REPEAT 4,<HALT>			;14-17; JUST INCASE
NEGEXT:	MOVE	PS,(PP)		;[255] GET DELIMITER OFF STACK
	CAME	PS,[TNODE,,0]	;[255] NOTHING ON YET?
	JRST	EVGETD		;[255] NO?
	MOVSI	PS,4000		;[255] FAKE UP EVPUSH OF
	ADDM	PS,(PP)		;[255]  PS
	PUSH	PP,[0]		;[255]  CV
	PUSH	PP,[0]		;[255]  RC
	PUSH	PP,CSTAT+'-'	;[255]  CS
	TLZ	FR,NEGSW	;[255] CLEAR FLAG
	JRST	EVGETD		;[255] NOW EVALUATE

PRTAB:	JFCL			;0
	JUMPN	PR,POLPSH	;1
	JUMPN	PR,POLPSH	;2
	SKIPE	PR		;3
	SKIPE	PR		;4
REPEAT 4,<JUMPN	PR,POLPSH>	;5, 6, 7, 10
	JFCL			;11

RCTAB:	JFCL			;0
	JUMPN	RC,POLPSH	;1
	JUMPN	RC,POLPSH	;2
	JUMPN	RC,POLPSH	;3
	JUMPE	RC,POLPSH	;4
REPEAT 4,<JUMPN	RC,POLPSH>	;5, 6, 7, 10
	JFCL			;11
>
XSUB:	SUBM	PV,CV
	SUBM	PR,RC
	JRST	EVNUM

XADD:	ADDM	PV,CV
	ADDM	PR,RC
	JRST	EVNUM

IFE POLISH,<
XDIV:	IDIV	PR,CV		;CORRECT RELOCATABILITY
	JFCL	17,.+1		;[276] CLEAR OVERFLOW
	IDIVM	PV,CV
	SKIPL	OKOVFL		;[362] SKIP IF OVERFLOW OK
	JOV	.+2		;[276] SEE IF OVERFLOWED
	SKIPA			;[276] NO
	TRO	ER,ERRN		;[276] YES, SET N ERROR
XDIV1:	EXCH	PR,RC		;TAKE RELOCATION OF NUMERATOR
	JRST	EVXCT1

XMUL:	JUMPE	PR,XMUL1	;AT LEAST ONE OPERAND
	JUMPE	RC,XMUL1	;MUST BE FIXED
	TRO	ER,ERRR
XMUL1:	IORM	PR,RC		;GET RELOCATION TO RC
	CAMGE	PV,CV		;FIND THE GREATER
	EXCH	PV,CV		;FIX IN CASE CV=0,OR 1
	IMULM	PV,RC
	JFCL	17,.+1		;[276] CLEAR OVERFLOW
	IMULM	PV,CV
	SKIPL	OKOVFL		;[362] SKIP IF OVERFLOW OK
	JOV	.+2		;[276] SEE IF OVERFLOW
	SKIPA			;[276] NO
	TRO	ER,ERRN		;[276] YES, SET N ERROR
	JRST	EVNUM
XLRW:	EXCH	PV,CV		;[401][407]
	LSH	CV,0(PV)
	LSH	PR,0(PV)
	JRST	XDIV1
>
IFN POLISH,<
XLRW:	EXCH	PV,CV
	LSH	CV,0(PV)
	JRST	EVNUM
>
IFN POLISH,<			;[164]
;HERE FOR EXTERNAL ARITHMETIC
;CONVERS TO POLISH BLOCK TYPE 11

POLPSH:	JUMP1	EVXCT1		;ONLY SAVE POLISH ON PASS2
	PUSH	PP,POLSTK	;SAVE STACK POINTER
	EXCH	PP,POLSTK	;SAVE PP AND SET UP POLISH STACK
	TLO	FR,POLSW	;SIGNAL STORING POLISH
	PUSH	PP,POLTBL-1(PS)	;STACK OPERATOR
	PUSH	PP,PR		;STACK PREVIOUS RELOCATION
	PUSH	PP,PV		;AND VALUE
	PUSH	PP,RC		;STACK CURRENT
	PUSH	PP,CV
	EXCH	PP,POLSTK	;GET PP BACK
	POP	PP,CV		;USE STACK POINTER FOR VALUE
	MOVE	RC,CV		;AND RELOCATION (ENSURES EXTERNAL)
	JRST	EVNUM		;TRY NEXT ITEM

;HERE TO STORE THE POLISH LIST
;RC  (AND CV) HAVE POINTER TO TOP ITEM IN PUSHDOWN STACK
POLPOP:	MOVE	PV,FREE		;GET NEXT FREE LOCATION
	EXCH	PV,POLIST	;SWAP STACK POINTER
	PUSHJ	PP,POLSTR	;STORE POINTER TO NEXT POLISH BLOCK
	PUSHJ	PP,POLOPF	;STORE FIRST OPERATOR
	PUSHJ	PP,POLFST	;STORE FIRST PART
	PUSHJ	PP,POLSND	;STORE SECOND PART
	SKIPE	PV,POLTYP	;USE PRESET TYPE
	JRST	POLOCT		;IF SET
	SETO	PV,		;STORE OPERATOR OF -1
	JUMPNC	POLOCT		;FOR RIGHT HALF FIXUP
	SUBI	PV,1		;-2 FOR LEFT HALF
POLOCT:	XCT	3+[SETZM EXTPNT		;FULL WORD
		HRRZS	EXTPNT		;LEFT HALF
		HLLZS	EXTPNT](PV)	;RIGHT HALF
	SKIPE	INASGN		;DEFINING A SYMBOL?
	JRST	[SUBI	PV,3		;DIFFERENT STORE OPERATOR
		PUSHJ	PP,POLSTR	;STORE IT
		MOVE	CV,HDAS		;GET FLAGS
		MOVEI	ARG,10		;ASSUME LOCAL
		TLNE	CV,INTF		;IS IT GLOBAL?
		MOVEI	ARG,4		;YES, MAKE GLOBAL
		MOVE	CV,INASGN	;GET SIXBIT SYMBOL
		PUSHJ	PP,SQOZE	;RADIX50
		MOVE	PV,AC0		;CORRECT ACC
		JRST	POLPOR]		;STORE IT
	PUSHJ	PP,POLSTR	;[265] STORE IT
	MOVE	PV,LOCA		;LOCATION
	HRL	PV,MODA		;AND MODE
	SKIPN	LITLVL		;[265] HOWEVER IF IN A LITERAL?
	JRST	POLPOR		;[265] NOT
	MOVE	PV,POLIST	;[265] WE CAN NOT SUPPLY THE STORE ADDRESS YET
	MOVE	CV,(PV)		;[265] SO PUT IN A SPECIAL LIST
	MOVEM	CV,POLIST	;[265] REMOVE FROM REGULAR LIST
	EXCH	PV,POLITS	;[265] STORE IN POLIST LIT LIST
	MOVEM	PV,@POLITS	;[265] LINK TOGETHER
	MOVE	PV,STPX		;[265] STORE DEPTH IN THIS LIT
	SUB	PV,STPY		;[265] WITH NO RELOCATION YET
POLPOR:	PUSHJ	PP,POLSTR
	SETZB	RC,CV		;USE ZERO VALUE AND RELOCATION
POLRET:	MOVE	PV,POLPTR	;RESET INITIAL POLISH POINTER
	MOVEM	PV,POLSTK
	POPJ	PP,		;RETURN
;THIS IS A KLUDGE TO PRODUCE ADDITIVE GLOBALS FOR THE FEW CASES THAT THEY
;CAN HANDLE. I.E. K+GLOBAL, GLOBAL+K, GLOBAL-K
;SO THAT OLD PROGRAMS WILL COMPIL THE SAME WAY AND LOAD WITH THE
;OLD LOADER WITHOUT THE FAILSW CODE
;APART FROM ADDITIVE SYMBOL FIXUPS POLISH BLOCKS ARE MORE POWERFULL
;***** REMOVE SOMEDAY
POLOPF:	HRRZ	PS,1(RC)	;GET FIRST OPERATOR
	CAIE	PS,3		;CAN ONLY HANDLE ADD
	CAIN	PS,4		;AND SUBTRACT
	JRST	POLOP2		;ITS ONE OF THOSE  GIVE IT A TRY
;*****
POLOPX:	SKIPN	SGNMAX		;[265] PSECTS USED?
	JRST	POLOPR		;[265] NO
	PUSH	PP,PV		;[265] SAVE FIRST OP
	HRRO	PV,SGNCUR	;[265] GET CUR PSECT INX
	TRO	PV,400000	;[265] MAKE POLISH OP
	PUSHJ	PP,POLSTR	;[265] STORE IT
	POP	PP,PV		;[265] GET FIRST OP
POLOPR:	HRRZ	PV,1(RC)	;[265] GET OPERATOR
	CAIE	PV,15		;[265] ADDITIVE PSECT OPERATION?
	JRST	POLOPS		;[265] NO
	AOS	0(PP)		;[265] SKIP FIRST OPERAND
	HRRO	PV,3(RC)	;[265] GET PSECT INX
	TROA	PV,400000	;[265] MAKE POLISH OP
POLOPS:	HRRO	PV,1(RC)	;[265] GET OPERATOR AND FLAG IT
	JRST	POLSTR		;STORE IT AND EXIT

;***** MORE OF THIS KLUDGE
POLOP2:	SUBI	PS,3		;MAKES LIFE EASIER
	MOVE	CV,4(RC)	;GET 2ND OPERAND
	JUMPL	CV,POLOPX	;ITS A POINTER, THEREFORE TOO COMPLEX
	MOVE	PV,2(RC)	;AND 1ST OPERAND
	JUMPL	PV,POLOPX	;THIS IS A POINTER
	TDNN	CV,[-2,,-2]	;TEST FOR EXTERN
	JRST	[TRNE	CV,1		;TEST FOR BOTH RELOCATABLE
		TRNN	PV,1
		JRST	POLOP3		;THIS IS NOT EXTERN SO OTHER CAN BE
		JRST	POLOPX]		;CANNOT HANDLE HERE, USE POLISH
	JUMPN	PS,POLOPX	;CAN NOT HANDLE -GLOBAL
	TDNE	PV,[-2,,-2]	;TEST FOR EXTERN HERE
	JRST	POLOPX		;GLOBAL+GLOBAL TOO COMPLEX
POLOP3:	SOS	FREE		;BACKUP FREE COUNTER
	MOVE	PV,@FREE	;GET LAST POINTER
	MOVEM	PV,POLIST	;SET POINTER BACK
	POP	PP,PV		;POP RETURN OFF STACK
	TLZ	FR,POLSW	;CLEAR FLAG JUST IN CASE
;RELOAD RC, CV, PV, AND PR FROM STACK
;AND EXECUTE OPERATOR
	MOVE	PR,2(RC)	;
	MOVE	PV,3(RC)
	MOVE	CV,5(RC)
	MOVE	RC,4(RC)	;THIS ONE LAST OF COURSE
	JUMPN	PS,POLOP5	;DO MINUS
	ADDM	PV,CV
	ADDM	PR,RC
	JRST	POLRET		;RESTORE STACK AND RETURN

POLOP5:	SUBM	PV,CV
	SUBM	PR,RC
	JRST	POLRET
;***** END OF THIS KLUDGE
;HERE TO HANDLE FIRST OPERAND
;HIGHLY RECURSIVE

POLFST:	MOVE	PV,2(RC)	;GET RELOCATION
	JUMPL	PV,POLFSR	;THIS IS ANOTHER POINTER
	TDNE	PV,[-2,,-2]	;IS IT EXTERNAL?
	JRST	POLFS2		;YES
	MOVE	CV,3(RC)	;GET VALUE
POLFS4:	TLNN	PV,-1		;CHECK FOR LEFT HALF VALUE
	TLNE	CV,-1
	JRST	POLFS1		;YES, NEED FULL WORD
	HRL	CV,PV		;XWD RELOC ,, VALUE
	SETZ	PV,		;OPERAND IS 0 FOR 18 BIT VALUE
	PUSHJ	PP,POLSTR
	MOVE	PV,CV
	JRST	POLSTR		;STORE AND EXIT

POLFS1:	MOVEI	PV,1		;OPERAND IS 1 FOR 36 BIT VALUE
	PUSHJ	PP,POLSTR
	MOVE	PV,2(RC)	;RELOCATION
	PUSHJ	PP,POLSTR
	MOVE	PV,CV		;VALUE
	JRST	POLSTR

POLSN2:
POLFS2:	MOVE	CV,1(PV)	;GET SIXBIT SYMBOL INTO AC0
	MOVEI	PV,2		;OPERAND IN 2 FOR SYMBOL
	PUSHJ	PP,POLSTR
	MOVEI	ARG,4		;MAKE GLOBAL REQUEST
	PUSHJ	PP,SQOZE	;TO RADIX-50
	MOVE	PV,CV		;PUT IN RIGHT ACC
	JRST	POLSTR		;STORE IT

POLFSR:	CAME	PV,3(RC)	;CHECK TO MAKE SURE IT REALLY IS A POINTER
	JRST	POLFSN		;NO, ITS A NEGATIVE GLOBAL
	PUSH	PP,RC		;SAVE THIS POINTER
	MOVE	RC,PV		;GET NEXT POINTER
	PUSHJ	PP,POLOPR	;GET OPERATOR
	PUSHJ	PP,POLFST	;GET FIRST OPERAND
	PUSHJ	PP,POLSND	;GET SECOND OPERAND
	POP	PP,RC		;GET BACK PREVIOUS POINTER
	POPJ	PP,		;RETURN TO PREVIOUS LEVEL


POLFSN:	HRROI	PV,14		;TWO'S COMPLIMENT NEGATIVE
	PUSHJ	PP,POLSTR	;STORE OPERATOR
	MOVN	PV,2(RC)	;GET RELOCATION
	TDNE	PV,[-2,,-2]	;CHECK FOR EXTERN
	JRST	POLFS2		;IT IS, CONVERT TO RADIX-50
	MOVN	CV,3(RC)	;GET VALUE
	JRST	POLFS4		;AND STORE IT
;HERE TO HANDLE 2ND OPERAND, ALSO RECURSIVE

POLSNR:	CAME	PV,5(RC)	;MAKE SURE IT REALLY IS
	JRST	POLSNN		;ITS A NEGATIVE GLOBAL
	MOVE	RC,PV		;GET NEXT POINTER
	PUSHJ	PP,POLOPR	;STORE OPERATOR
	PUSHJ	PP,POLFST	;GET 1ST OPERAND
				;AND GET SECOND OPERAND

POLSND:	MOVE	PV,4(RC)	;GET RELOCATION
	JUMPL	PV,POLSNR	;THIS IS A POINTER
	TDNE	PV,[-2,,-2]	;IS IT EXTERNAL?
	JRST	POLSN2		;YES
	MOVE	CV,5(RC)	;GET VALUE
POLSN4:	TLNN	PV,-1		;CHECK FOR LEFT HALF VALUE
	TLNE	CV,-1
	JRST	POLSN1		;YES, NEED FULL WORD
	HRL	CV,PV		;XWD RELOC ,, VALUE
	SETZ	PV,		;OPERAND IS 0 FOR 18 BIT VALUE
	PUSHJ	PP,POLSTR
	MOVE	PV,CV
	JRST	POLSTR		;STORE AND EXIT

POLSNN:	HRROI	PV,14		;TWO'S COMPLIMENT NEGATIVE
	PUSHJ	PP,POLSTR	;STORE OPERATOR
	MOVN	PV,4(RC)	;GET RELOCATION
	TDNE	PV,[-2,,-2]	;CHECK FOR EXTERN
	JRST	POLSN2		;IT IS, CONVERT TO RADIX-50
	MOVN	CV,5(RC)	;GET VALUE
	JRST	POLSN4		;AND STORE IT

POLSN1:	MOVEI	PV,1		;OPERAND IS 1 FOR 36 BIT VALUE
	PUSHJ	PP,POLSTR
	MOVE	PV,4(RC)	;RELOCATION
	PUSHJ	PP,POLSTR
	MOVE	PV,CV		;VALUE
;	JRST	POLSTR

POLSTR:	AOS	SDEL,FREE	;GET A FREE WORD
	CAML	SDEL,SYMBOL	;ENOUGH?
	PUSHJ	PP,XCEED	;NO
	MOVEM	PV,-1(SDEL)	;STORE ONE WORD
	POPJ	PP,
;TABLE OF CORRESPONDENCE BETWEEN MACRO-10 OPERATORS AND BLOCK 11 OPERATORS
POLTBL:	;POLISH VALUE	MACRO-10	OPERATOR
	5		;1		MULTIPLY
	6		;2		DIVIDE
	3		;3		ADD
	4		;4		SUBTRACT
	11		;5		LEFT SHIFT
	10		;6		LOGICAL IOR
	7		;7		LOGICAL AND
	12		;10		LOGICAL XOR
	13		;11		NOT
	14		;12		NEGATE
	15		;13		ADDITIVE PSECT OPERATION

>;END OF IFN POLISH
	SUBTTL	LITERAL STORAGE HANDLER
	
STOLER:
IFE FORMSW,<	SETZB	AC0,RC	;ERROR, NO CODE STORED
	PUSHJ	PP,STOW		;STOW ZERO>
IFN FORMSW,<	MOVEI	AC0,0
	PUSHJ	PP,STOWZ1>
	TRO	ER,ERRL		;AND FLAG THE ERROR

STOLIT:	MOVE	SDEL,STPX
	SUB	SDEL,STPY	;COMPUTE NUMBER OF WORDS
	JUMPE	SDEL,STOLER	;ERROR IF NONE STORED
	MOVE	SX,LITERR	;[415]GET TOTAL ERRORS FOR LEVEL
	TRNN	FR,ERRQSW	;[415]IGNORING Q ERRORS?
	TRZ	SX,ERRQ		;[415]YES,SO TURN IT OFF
	TRNN	SX,ERRORS	;[415]DOES LITERAL HAVE ERROR?
	JRST	STOL06		;NO
;**;[441] INSERT 2L,CHANGE COMMENT @STOLIT+8	JBC	21-SEP-76
	TRNE	SX,ERRU		;[441] YES,NO SEARCH IF UNDF SYMBOL ON
	 JRST	STOL22		;[441] PASS1, BRANCH
	JUMP2	STOL22		;[441] BRANCH IF PASS2
	ADDM	SDEL,LITCNT	;PASS ONE, UPDATE COUNT
	JRST	STOWI		;INITIALIZE STOW

STOL06:	MOVEI	SX,LITAB	;PREPARE FOR SEARCH
	MOVE	ARG,STPX	;SAVE IN THE EVENT OF MULTIPLE-WORD
	HRL	ARG,STPY
	MOVE	AC2,LITNUM
	MOVEI	SDEL,0
STOL08:	PUSHJ	PP,DSTOW	;GET VALUE WFW

STOL10:	SOJL	AC2,STOL24	;TEST FOR END
	MOVE	SX,0(SX)	;NO, GET NEXT STORAGE CELL
	MOVE	V,-1(SX)		;GET RELOCATION BITS WFW
	CAMN	AC0,-2(SX)	;DO CODES COMPARE? WFW
	CAME	RC,V		;YES, HOW ABOUT RELOCATION?
	AOJA	SDEL,STOL10	;NO, TRY AGAIN
	SKIPGE	STPX		;YES, MULTI-WORD?
	JRST	STOL13		;NO, JUST RETURN LOCATION
	MOVEM	AC2,SAVBLK+AC2	;YES, SAVE STARTING INFO
	MOVEM	SX,SAVBLK+SX

STOL12:	SOJL	AC2,STOL23	;TEST FOR END
	PUSHJ	PP,DSTOW	;GET NEXT WORD WFW
	MOVE	SX,0(SX)	;UPDATE POINTER
	MOVE	V,-1(SX)		;GET RELOCATION WFW
	CAMN	AC0,-2(SX)	;COMPARE VALUE WFW
	CAME	RC,V		;AND RELOCATION
	JRST	STOL14		;NO MATCH, TRY AGAIN
	SKIPL	STPX		;MATCH, HAVE WE FINISHED SEARCH?
	JRST	STOL12		;NO, TRY NEXT WORD
STOL13:				;YES, RETURN LOCATION
IFN POLISH,<
	SETZM	POLITS		;CLEAR ANY POLISH PENDING
>
	JRST	STOL26

STOL14:	MOVE	AC2,SAVBLK+AC2	;RESTORE STOW POINTERS
	MOVE	SX,SAVBLK+SX
	HRREM	ARG,STPX
	HLREM	ARG,STPY
	AOJA	SDEL,STOL08	;BETTER LUCK NEXT TIME
STOL22:	MOVE	SDEL,LITNUM
STOL23:	PUSHJ	PP,DSTOW	;DSTOW AND CONVERT
STOL24:	MOVE	SX,LITABX	;GET CURRENT STORAGE
	PUSHJ	PP,GETTOP	;GET NEXT CELL
	MOVEM	AC0,-2(SX)	;STORE CODE WFW
	MOVEM	RC,-1(SX)	;WFW
IFN FORMSW,<
	MOVE	AC0,FORM
	MOVEM	AC0,-3(SX)>
	MOVEM	SX,LITABX	;SET POINTER TO CURRENT CELL
	AOS	LITNUM		;INCREMENT NUMBER STORED
	AOS	LITCNT		;INCREMENT NUMBER RESERVED
	SKIPL	STPX		;ANY MORE CODE?
	JRST	STOL23		;YES
STOL26:	JUMP1	POPOUT		;EXIT IF PASS ONE
	MOVE	SX,LITHDX	;GET HEADER BLOCK
	HLRZ	RC,-1(SX)	;GET BLOCK RELOCATION
	HRRZ	AC0,-1(SX)
	ADDI	AC0,0(SDEL)	;COMPUTE ACTUAL LOCATION
	POPJ	PP,		;EXIT
SUBTTL	INPUT ROUTINES

GETCHR:	PUSHJ	PP,CHARAC	;GET ASCII CHARACTER
	CAIL	C,"A"+40	;CHECK FOR LOWER CASE
	CAILE	C,"Z"+40
	JRST	.+2		;NOT LOWER CASE
IFN STANSW,<
	SUBI C,40
	CAIN C,32
	MOVEI C,136		;^
	CAIN C,30
	MOVEI C,137		;_
	CAIN C,176
	MOVEI C,134		;~
	CAIN C,140
	MOVEI C,100		;@>
IFE STANSW,<
	TRZA	C,100		;CONVERT LOWER CASE TO SIXBIT>
	SUBI	C,40		;CONVERT TO SIXBIT
	CAIG	C,77		;CHAR GREATER THAN SIXBIT?
	JUMPGE	C,GETCS		;TEST FOR VALID SIXBIT
	ADDI	C,40		;BACK TO ASCII
	CAIN	C,HT		;CHECK FOR TAB
	JRST	GETCS2		;MAKE IT LOOK LIKE SPACE
	CAIG	C,CR		;GREATER THAN CR
	CAIG	C,HT		;GREATER THAN TAB
	JRST	GETCS1		;IS NOT FF,VT,LF OR CR
	MOVEI	C,EOL		;LINE OR FORM FEED OR V TAB
	TLOA	IO,IORPTC	;REPEAT CHARACTER
GETCS2:	MOVEI	C,0		;BUT TREAT AS BLANK
GETCS:	MOVE	CS,CSTAT(C)	;GET STATUS BITS
	POPJ	PP,		;EXIT

GETCS1:	JUMPE	C,GETCS		;IGNORE NULS
	TRC	C,100		;MAKE CHAR. VISIBLE
	MOVEI	CS,"^"
	DPB	CS,LBUFP	;PUT ^ IN OUTPUT
	PUSHJ	PP,RSW2		;ALSO MODIFIED CHAR.
	TRO	ER,ERRQ		;FLAG Q ERROR
	JRST	GETCHR		;BUT IGNORE CHAR.
CHARAC:	TLZE	IO,IORPTC	;REPEAT REQUESTED?
	JRST	CHARAX		;YES
RSW0:	JUMPN	MRP,MREAD	;BRANCH IF TREE POINTER SET
	PUSHJ	PP,READ
RSW1:	SKIPE	RPOLVL		;ARE WE IN "REPEAT ONCE"?
	JRST	REPO1		;YES
RSW2:	CAIN	C,LF		;LF?
	JRST	RSW4		;YES, SEE IF LAST CHAR WAS A CR
	MOVEM	C,LIMBO		;STORE THIS CHAR. FOR RPTC
RSW3:	TLNE	IO,IOSALL	;MACRO SUPPRESS ALL?
	JUMPN	MRP,CPOPJ	;YES,DON'T LIST IN MACRO
	SOSG	CPL		;ANY ROOM IN THE IMAGE BUFFER?
	PUSHJ	PP,RSW5		;[254] NO, BUT SEE IF ANY EXCESS WE CAN USE
	IDPB	C,LBUFP		;YES, STORE IN PRINT AREA
	CAIE	C,HT		;TAB?
	POPJ	PP,		;NO, EXIT
	MOVEI	CS,7		;TAB COUNT MASK
	ANDCAM	CS,CPL		;MASK TO TAB STOP
	POPJ	PP,

RSW4:	MOVE	CS,LIMBO	;GET LAST CHAR.
	MOVEM	C,LIMBO		;STORE THIS CHAR. FOR RPTC
	CAIE	CS,CR		;LAST CHAR. A CR?
	JRST	RSW3		;NO
	HRROS	LIMBO		;YES,FLAG
	POPJ	PP,		;AND EXIT

RSW5:	PUSH	PP,C		;[254] NEED AN ACC
	MOVNI	C,.CPLX		;[254] GET EXCESS SPACE
	CAMGE	C,CPL		;[254] ANY ROOM?
	JRST	[POP	PP,C		;[254] YES
		POPJ	PP,]		;[254] JUST RETURN
	POP	PP,C		;[254] NO
	JRST	OUTPL		;[254] OUTPUT THE PARTIAL LINE
CHARAX:	HRRZ	C,LIMBO		;GET LAST CHARACTER
	POPJ	PP,		;EXIT

CHARL:	PUSHJ	PP,CHARAC	;GET AND TEST 7-BIT ASCII
	CAIG	C,FF		;LINE OR FORM FEED OR VT?
	CAIGE	C,LF
	POPJ	PP,		;NO,EXIT
	SKIPE	LITLVL		;IN LITERAL?
	JRST	OUTIML		;YES
CHARL1:	PUSHJ	PP,SAVEXS	;SAVE REGISTERS
	PUSHJ	PP,OUTLIN	;DUMP THE LINE
	JRST	RSTRXS		;RESTORE REGISTERS AND EXIT
;STATEMENT OUT PASSES REMAINDER OF LINE (CMNT)
;UNTIL A LINE TERMINATOR IS SEEN.
STOUTS:	TLOA	IO,IOENDL!IORPTC
STOUT:	TLO	IO,IORPTC
	BYPASS
	CAIE	C,EOL		;MOST LIKELY A ; OR EOL CH
	JRST	STOUT2		;IT WASN'T, SEE WHY!
	HRRZ	C,LIMBO		;GET CHARACTER INCASE EOL
	TLZN	IO,IORPTC	;IT WAS , SKIP NEXT GET
STOUT1:	PUSHJ	PP,RSW0
	CAIN	C,CR		;NEED SPECIAL TEST FOR CR
	JRST	STOUT3		;INCASE NOT FOLLOWED BY LF
	CAIG	C,FF
	CAIGE	C,LF
	JRST	STOUT1
	JRST	OUTLIN		;OUTPUT THE LINE (BIN AND LST)

STOUT2:	CAIN	C,14		;COMMA?
	SKIPL	STPX		;YES, ERROR IF CODE STORED
	TRO	ER,ERRQ
	JRST	STOUT1		;PASS OUT TIL END OF LINE

STOUT3:	PUSHJ	PP,RSW0		;GET NEXT CHAR.
	CAIG	C,FF		;GENUINE EOL CHARACTER?
	CAIGE	C,LF
	TLOA	IO,IORPTC	;NO, SO REPEAT IT
	JRST	OUTLIN		;AND DUMP LINE IN ANY CASE
REPEAT 0,<			;[252] DON'T FLAG IT
	TRO	ER,ERRQ		;[144] FLAG EXTRA <CR> WITH "Q" ERROR
>
	SETZ	C,
	DPB	C,LBUFP		;CLEAR LOOK-AHEAD CHAR OUT OF BUFFER
	PUSHJ	PP,OUTLIN	;DUMP UPTO CR AS LINE
	HRRZ	C,LIMBO		;GET C BACK
	JRST	RSW3		;AND PUT CHAR IN NEW  BUFFER
SUBTTL	CHARACTER STATUS TABLE

	DEFINE	GENCS	(OPLVL,ATOM,AN,SQUOZ,OPTYPE,SEQNO)
<BYTE (6)OPLVL (9)ATOM (3)AN (6)SQUOZ,OPTYPE,SEQNO>

	;OPLVL	PRIORITY OF BINARY OPERATORS
	;ATOM	INDEX TO JUMP TABLE AT CELL1
	;AN	TYPE OF CHARACTER
	;	1=OTHER, 2=ALPHA, 4=NUMERIC
	;SQUOZ	VALUE IN RADIX 50
	;OPTYPE	INDEX TO JUMP TABLE AT EVXCT
	;SEQNO	VALUE IN SIXBIT
CSTAT:
	GENCS	00,00,1,00,00,00	; ' '
	GENCS	04,12,1,00,06,01	; '!'
	GENCS	00,07,1,00,00,02	; '"'
	GENCS	00,12,1,00,00,03	; '#'
	GENCS	00,01,2,46,00,04	; '$'
	GENCS	00,01,2,47,00,05	; '%'
	GENCS	04,12,1,00,07,06	; '&'
	GENCS	00,07,1,00,00,07	; '''

	GENCS	00,01,1,00,00,10	; '('
	GENCS	00,01,1,00,00,11	; ')'
	GENCS	02,12,1,00,01,12	; '*'
	GENCS	01,00,1,00,03,13	; '+'
	GENCS	40,01,1,00,00,14	; ','
	GENCS	01,02,1,00,04,15	; '-'
	GENCS	00,11,2,45,00,16	; '.'
	GENCS	02,12,1,00,02,17	; '/'

	GENCS	00,04,4,01,00,20	; '0'
	GENCS	00,04,4,02,00,21	; '1'
	GENCS	00,04,4,03,00,22	; '2'
	GENCS	00,04,4,04,00,23	; '3'
	GENCS	00,04,4,05,00,24	; '4'
	GENCS	00,04,4,06,00,25	; '5'
	GENCS	00,04,4,07,00,26	; '6'
	GENCS	00,04,4,10,00,27	; '7'

	GENCS	00,04,4,11,00,30	; '8'
	GENCS	00,04,4,12,00,31	; '9'
	GENCS	00,12,1,00,00,32	; ':'
	GENCS	00,01,1,00,00,33	; ';'
	GENCS	00,05,1,00,00,34	; '<'
	GENCS	00,12,1,00,00,35	; '='
	GENCS	00,01,1,00,00,36	; '>'
	GENCS	00,12,1,00,00,37	; '?'
	GENCS	00,03,1,00,00,40	; '@'
	GENCS	00,01,2,13,00,41	; 'A'
	GENCS	00,01,2,14,00,42	; 'B'
	GENCS	00,01,2,15,00,43	; 'C'
	GENCS	00,01,2,16,00,44	; 'D'
	GENCS	00,01,2,17,00,45	; 'E'
	GENCS	00,01,2,20,00,46	; 'F'
	GENCS	00,01,2,21,00,47	; 'G'

	GENCS	00,01,2,22,00,50	; 'H'
	GENCS	00,01,2,23,00,51	; 'I'
	GENCS	00,01,2,24,00,52	; 'J'
	GENCS	00,01,2,25,00,53	; 'K'
	GENCS	00,01,2,26,00,54	; 'L'
	GENCS	00,01,2,27,00,55	; 'M'
	GENCS	00,01,2,30,00,56	; 'N'
	GENCS	00,01,2,31,00,57	; 'O'

	GENCS	00,01,2,32,00,60	; 'P'
	GENCS	00,01,2,33,00,61	; 'Q'
	GENCS	00,01,2,34,00,62	; 'R'
	GENCS	00,01,2,35,00,63	; 'S'
	GENCS	00,01,2,36,00,64	; 'T'
	GENCS	00,01,2,37,00,65	; 'U'
	GENCS	00,01,2,40,00,66	; 'V'
	GENCS	00,01,2,41,00,67	; 'W'

	GENCS	00,01,2,42,00,70	; 'X'
	GENCS	00,01,2,43,00,71	; 'Y'
	GENCS	00,01,2,44,00,72	; 'Z'
	GENCS	00,06,1,00,00,73	; '['
	GENCS	00,12,1,00,00,74	; '\'
	GENCS	00,01,1,00,00,75	; ']'
	GENCS	00,10,1,00,00,76	; '^'
	GENCS	10,12,1,00,05,77	; '_'

CSTATX:	GENCS	04,12,1,00,10,01	;[123]  '^!'
CSTATN:	GENCS	04,12,1,00,11,15	;[123][416]  '^-'
IFN POLISH,<
CSTATP:	GENCS	11,12,1,00,13,13	;ADDITIVE PSECT OPERATION
>
SUBTTL	LISTING ROUTINES

OUTLIN:	TRNN	ER,ERRORS-ERRQ	;ANY ERRORS?
	TLNE	FR,ERRQSW	;NO, IGNORE Q ERRORS?
	TRZ	ER,ERRQ		;YES, YES, ZERO THE Q ERROR
	HRLZ	AC0,ER		;PUT ERROR FLAGS IN AC0 LEFT
	TDZ	ER,TYPERR
	JUMP1	OUTL30		;BRANCH IF PASS ONE
	JUMPN	AC0,OUTL02	;JUMP IF ANY ERRORS TO FORCE PRINTING
	SKIPL	STPX		;SKIP IF NO CODE, OTHERWISE
	JRST	OUTL01		;NO
	TLNN	IO,IOSALL	;YES,SUPPRESS ALL?
	JRST	OUTL03		;NO
	JUMPN	MRP,CPOPJ	;YES,EXIT IF IN MACRO
	LDB	C,[XWD 350700,LBUF]
	CAIE	C,15		;FIRST CHAR CR?
OUTL01:	TLZ	IO,IOMAC	;FORCE MACRO PRINTING
OUTL03:	TLNN	IO,IOMSTR!IOPROG!IOMAC
OUTL02:	IOR	ER,OUTSW	;FORCE IT.
	IDPB	AC0,LBUFP	;STORE ZERO TERMINATOR AFTER ASCII SRC LINE
	TSO	ER,AC0		;[411]RE-FLAG THE ERRORS FOR %....X
	TLNN	FR,CREFSW	;CREF?
	PUSHJ	PP,CLSCRF	;YES, WRITE END OF CREF DATA (177,003)
	MOVE	C,TYPERR	;[411]NOW RESTORE FLAGS AS
	ANDI	C,ERRORS	;[411]THEY WERE SO TTY LISTING IS
	TDZ	ER,C		;[411]WHAT THEY ASKED FOR
	JUMPE	AC0,OUTL20	;BRANCH IF NO ERRORS
	TLZE	AC0,ERRM	;M ERROR?
	TLO	AC0,ERRP	;M ERROR SET - SET P ERROR.
	PUSHJ	PP,OUTLER	;PROCESS ERRORS

OUTL20:	SKIPN	C,ASGBLK	;[263]
	SKIPE	CS,LOCBLK	;
	SKIPL	STPX		;ANY BINARY?
	JRST	OUTL23		;YES, JUMP
	JUMPE	C,OUTL22	;[263] SEQUENCE BREAK AND NO BINARY JUMPS
	ILDB	C,TABP		;ASSIGNMENT FALLS THROUGH
	PUSHJ	PP,OUTL		;OUTPUT A TAB.
	ILDB	C,TABP		;OUTPUT 2ND TAB, LOCATION FIELD
	PUSHJ	PP,OUTC		;NEXT IS BINARY LISTING FIELD
	HLLO	CS,LOCBLK	;LEFT HALF OF A 36BIT VALUE
	SKIPL	ASGBLK		;[263] SKIP IF LEFT HALF IS NOT RELOC
	TRZA	CS,1		;IT IS, SET THE FLAG
	TLNE	CS,-1		;SKIP IF ITS A 18BIT VALUE, OTHERWISE
	PUSHJ	PP,ONC1		;PRINT LH OF A 36 BIT VALUE IN CS
	HRLO	CS,LOCBLK	;PICK UP THE RIGHT HALF (18BIT VALUE)
	MOVE	C,ASGBLK	;[263] GET RIGHT HALF RELOCATION
	TRZ	CS,0(C)		;[263] 
	PUSHJ	PP,ONC		;PRINT IT
	JRST	OUTL23		;SKIP SINGLE QUOTE TEST
OUTL22:	PUSHJ	PP,ONC		;TAB TO RH AND PRINT IT
	MOVEI	C,"'"
	SKIPE	MODA
	PUSHJ	PP,OUTC
OUTL23:	SKIPL	STPX		;ANY BINARY?
	PUSHJ	PP,BOUT		;YES, DUMP IT
	MOVE	CS,@OUTLI2	;[POINT 7,LBUF]
OUTL24:	ILDB	C,CS
	CAILE	C," "		;[157]
	JRST	OUTL28		;[157] FOUND A PRINTING CHARACTER
	JUMPN	C,OUTL24	;[157] TRY AGAIN UNLESS TERMINAL 0
	SKIPN	SEQNO		;[157] SEQUENCE NO. ARE WORTH PRINTING
	JRST	OUTL25		;[157] BUT JUST TABS AREN'T
OUTL28:	MOVE	CS,TABP
	PUSHJ	PP,OUTASC	;OUTPUT TABS & SEQ. NO.
OUTL25:	MOVEI	CS,LBUF
	PUSHJ	PP,OUTAS0	;DUMP THE LINE
	TLNE	IO,IOSALL	;SUPPRESSING ALL
	JUMPN	MRP,OUTL27	;YES,EXTRA CR IF IN MACRO
OUTL26:	SKIPGE	STPX		;ANY BINARY?
	JRST	OUTLI		;NO, CLEAN UP AND EXIT
	PUSHJ	PP,OUTLI2	;YES, INITIALIZE FOR NEXT LINE
	TLNN	FR,CREFSW	;[130] CREF REQUESTED?
	TLNE	IO,IOPROG	;[130] YES, THEN IS XLIST ON?
	JRST	.+2		;[130] CREF NOT BEING PRINTED
	PUSHJ	PP,CLSCRF	;[130] CLOSE OUT THIS CREF LINE
	PUSHJ	PP,BOUT		;YES, DUMP IT
OUTL27:	PUSHJ	PP,OUTCR	;OUTPUT CARRIAGE RETURN
	JRST	OUTL26		;TEST FOR MORE BINARY

OUTPL:	SKIPN	LITLVL		;IF IN LITERAL
	SKIPL	STPX		;OR CODE GENERATED
	JRST	OUTIM		;JUST OUTPUT THE IMAGE
	SKIPE	ASGBLK		;[205]
	JRST	OUTPL1		;[205] JUMP IF AN ASSIGNMENT
	SKIPE	LOCBLK		;[205] OR A BLOCK RESERVATION
	SKIPE	MACENL		;[205] STILL IN "CALLM"?
	JRST	OUTIM		;[205] OTHERWISE OUTPUT IMAGE
	JUMPN	MRP,OUTIM	;[205] ALSO IF IN A MACRO
OUTPL1:	PUSHJ	PP,SAVEXS	;[242] SAVE AC0 AND C
	MOVEI	C,CR
	IDPB	C,LBUFP
	MOVEI	C,LF
	IDPB	C,LBUFP		;FINISH WITH CRLF
	PUSHJ	PP,OUTLIN	;OUTPUT PARTIAL LINE
	PUSHJ	PP,RSTRXS	;[242] RESTORE ACS
	JRST	OUTLI2		;INITIALISE REST OF LINE
OUTL30:	AOS	CS,STPX		;PASS ONE
	CAIN	C,FF		;FORM FEED?
	PUSHJ	PP,OUTFF2	;YES, COUNT PAGES FOR PASS1 ERROR
	ADDM	CS,LOCO		;INCREMENT OUTPUT LOCATION
	PUSHJ	PP,STOWI	;INITIALIZE STOW
	TLZ	AC0,ERRORS-ERROR1	;[125]
	JUMPN	AC0,OUTL32	;JUMP IF ERRORS
	TLNE	IO,IOSALL	;SUPPRESSING ALL
	JUMPN	MRP,CPOPJ	;YES,EXIT
	JRST	OUTLI1		;NO,INIT LINE

OUTL32:	IDPB	AC0,LBUFP	;ZERO TERNIMATOR
	IOR	ER,OUTSW	;LIST ERRORS
	MOVE	CS,TAG
	PUSHJ	PP,OUTSY1
	MOVEI	CS,[SIXBIT / +@/]
	PUSHJ	PP,OUTSIX	;OUTPUT TAG
	HRRZ	C,TAGINC
	PUSHJ	PP,DNC		;CONVERT INCREMENT TO DECIMAL
	PUSHJ	PP,OUTTAB	;OUTPUT TAB
	PUSHJ	PP,OUTLER	;OUTPUT ERROR FLAGS
	PUSHJ	PP,OUTTAB
	MOVEI	CS,SEQNO	;ADDRESS OF SEQUENCE NO.
	SKIPE	SEQNO		;FILE NOT SEQUENCED
	PUSHJ	PP,OUTAS0	;OUTPUT IT
	JRST	OUTL25		;OUTPUT BASIC LINE
OUTLER:
	SETZM	LITERR		;[415]CLEAR ACCUMULATED LITERAL ERRORS
	PUSH	PP,ER		;SAVE LISTING SWITCHES FOR LATER
	TRNE	ER,TTYSW	;IF THIS IS ON, LISTING IS ON TTY
	TRZ	ER,ERRORS	;SO SUPPRESS ON TTY
	TDZ	ER,OUTSW	;BUT THIS SHOULD ONLY GO TO THE TTY
	MOVE	CS,INDIR	;GET FILE NAME
	CAME	CS,LSTFIL	;AND SEE IF SAME
	JRST	[MOVEM	CS,LSTFIL	;SAVE AS LAST ONE
		MOVEI	CS,LSTFIL
		PUSHJ	PP,OUTSIX	;LIST NAME
		MOVEI	C," "
		PUSHJ	PP,OUTL
		MOVE	CS,PAGENO	;PRINT PAGE NUMBER TOO
		JRST	OUTLE8]
	MOVE	CS,PAGENO	;NOW CHECK PAGE NUMBER
	CAME	CS,LSTPGN
OUTLE8:	JRST	[MOVEM	CS,LSTPGN
		MOVEI	CS,[ASCIZ /PAGE /]
		PUSHJ	PP,OUTAS0
		MOVE	C,PAGENO
		PUSHJ	PP,DNC
		PUSHJ	PP,OUTCR	;AND NOW FOR THE ERROR LINE
		JRST	.+1]
	HLLM	ER,(PP)		;RESTORE ER BUT NOT IO (LEFT HALF OF AC)
	POP	PP,ER
	MOVE	CS,[POINT 7,[ASCII / QXADLRUVNOPEMS/]]
OUTLE2:	ILDB	C,CS		;GET ERROR MNEMONIC
	JUMPGE	AC0,OUTLE4	;BRANCH IF NOT FLAGGED
	CAIN	C,"Q"		;"Q" ERROR?
	AOSA	QERRS		;YES, JUST COUNT AS WARNING
	AOS	ERRCNT		;INCREMENT ERROR COUNT
	PUSHJ	PP,OUTL		;OUTPUT THE CHARACTER
OUTLE4:	LSH	AC0,1		;SHIFT NEXT FLAG INTO SIGN BIT
	JUMPN	AC0,OUTLE2	;TEST FOR END
	POPJ	PP,		;EXIT
OUTIM1:	TLOA	FR,IOSCR	;SUPPRESS CRLF AFTER LINE
OUTIM:	TLZ	FR,IOSCR	;DON'T FOR PARTIAL LINE
	TLNE	IO,IOSALL	;SUPPRESSING ALL?
	JUMPN	MRP,CPOPJ	;YES ,EXIT IF IN MACRO
	JUMP1	OUTLI1		;BYPASS IF PASS ONE
	PUSH	PP,ER
	TDZ	ER,TYPERR
	TLNN	IO,IOMSTR!IOPROG!IOMAC
	IOR	ER,OUTSW
	PUSH	PP,C		;OUTPUT IMAGE
	TLNN	FR,CREFSW
	PUSHJ	PP,CLSCRF
OUTIM2:	MOVE	CS,TABP
	PUSHJ	PP,OUTASC	;OUTPUT TABS
	IDPB	C,LBUFP		;STORE ZERO TERMINATOR
	MOVEI	CS,LBUF
	PUSHJ	PP,OUTAS0	;OUTPUT THE IMAGE
	TLZN	FR,IOSCR	;CRLF SUPPRESS?
	PUSHJ	PP,OUTCR	;NO,OUTPUT
	POP	PP,C
	HLLM	ER,0(PP)
	POP	PP,ER
	JRST	OUTLI2

OUTLI:	TLNE	IO,IOSALL	;SUPPRESSING ALL
	JUMPN	MRP,OUTLI3	;YES,SET FLAG IN REPEATS ALSO
	TLNE	IO,IOPALL	;MACRO EXPANSION SUPRESS REQUESTED?
	SKIPN	MACLVL		;YES, ARE WE IN MACRO?
	TLZA	IO,IOMAC	;NO, CLEAR MAC FLAG
OUTLI3:	TLO	IO,IOMAC	;YES, SET FLAG

OUTLI1:	TRZ	ER,ERRORS!LPTSW!TTYSW
OUTLI2:	MOVE	CS,[POINT 7,LBUF]	;INITIALIZE BUFFERS
	MOVEM	CS,LBUFP
IFN FORMSW,<MOVE CS,[POINT 7,TABI]
	MOVSS	HWFMT		;PUT FLAG IN LEFT HALF
	SKIPGE	HWFMT		;BUT IF ONLY HALF-WORD FORMAT>
	MOVE	CS,[POINT 7,TABI,6]
	MOVEM	CS,TABP
	MOVEI	CS,.CPL
IFN FORMSW,<SKIPL HWFMT		;IF MULTI-FORMAT
	SUBI	CS,8		;LINE IS ONE TAB SHORTER
	MOVSS	HWFMT		;BACK AS IT WAS>
	SKIPE	SEQNO		;[153] A SEQUENCED FILE?
	SUBI	CS,8		;[153] YES, SEQ NO TAKES UP SPACE
	MOVEM	CS,CPL
	MOVSI	CS,(ASCII /	/)
	SKIPE	SEQNO		;HAVE WE SEQUENCE NUMBERS?
	MOVEM	CS,SEQNO	;YES, STORE TAB IN CASE OF MACRO
	MOVEM	CS,SEQNO+1	;STORE TAB AND TERMINATOR
	SETZM	ASGBLK
	SETZM	LOCBLK
	POPJ	PP,
OUTIML:	TLNE	IO,IOSALL	;SUPPRESSING ALL?
	JUMPN	MRP,CPOPJ	;YES,EXIT IF IN MACRO
	TRNN	ER,ERRORS-ERRQ		;FOR LITERALS (MULIT-LINE) OUTPUT ERRORS
	TLNE	FR,ERRQSW
	TRZ	ER,ERRQ
	HRLZ	CS,ER
	JUMP1	OUTML1		;CHECK PASS1 ERRORS
	TDZ	ER,TYPERR
	JUMPE	CS,OUTIM1
	PUSH	PP,[0]		;ERRORS SHOULD BE ZEROED
	PUSH	PP,C
	PUSH	PP,AC0		;SAVE AC0 IN CASE CALLED FROM ASCII
	MOVE	AC0,CS		;ERROR ROUTINE WANTS FLAGS IN AC0
	IOR	ER,OUTSW
	TLNN	 FR,CREFSW
	PUSHJ	PP,CLSCRF	;FIX CREF
	TLZE	AC0,ERRM
	TLO	AC0,ERRP
	PUSHJ	PP,OUTLER	;OUTPUT THEM
	POP	PP,AC0
	JRST	OUTIM2		;AND LINE
	
OUTML1:	TLZ	CS,ERRORS-ERROR1-ERRL	;[250] ANY ERRORS TO PRINT ON PASS1?
	JUMPE	CS,[TRZ	ER,ERRORS!LPTSW!TTYSW-ERRN	;[250] NONE
		JRST	OUTLI2]		;[250] BUT "N" IS FOR MULTI-LINE LITS
	TRZ	ER,ERRORS!LPTSW!TTYSW	;[250]
	TRO	ER,ERRL
	PUSH	PP,ER		;SAVE
	PUSH	PP,C		;SAVE THIS
	PUSH	PP,AC0		;AS ABOVE
	MOVE	AC0,CS		;...
	TDZ	ER,TYPERR
	IOR	ER,OUTSW
	MOVE	CS,TAG
	PUSHJ	PP,OUTSY1
	MOVEI	CS,[SIXBIT / +@/]
	PUSHJ	PP,OUTSIX
	SKIPN	LBLFLG		;[402] HAS A LABEL OCCURRED IN THIS LITERAL?
JRST	[HRRZ	C,TAGINC	;[402] NO, GET NORMAL INC
	JRST	OUTML2]		;[402]
	MOVE	C,STPX		;[402] GET CURRENT DEPTH
	SUB	C,LTGINC	;[402] SUBTRACT DEPTH OF LABEL
OUTML2:	PUSHJ	PP,DNC		;[402]
	PUSHJ	PP,OUTTAB
	PUSHJ	PP,OUTLER	;DO NOT FORGET ERRORS
	PUSHJ	PP,OUTTAB
	SETZ	AC0,		;[253] SET A ZERO TERMINATOR
	IDPB	AC0,LBUFP	;[253] IN THE OUTPUT BUFFER
	MOVEI	CS,LBUF		;PRINT REST OF LINE
	PUSHJ	PP,SOUT20
	POP	PP,AC0
	POP	PP,C
	POP	PP,ER
	JRST	OUTLI2
SUBTTL	OUTPUT ROUTINES
UOUT:	PUSHJ	PP,LOOKUP	;SET FOR TABLE SCAN
	TRNN	ARG,PNTF	;WFW
	TRNN	ARG,UNDF
	JRST	UOUT13		;TEST FOR UNDF!EXTF!PNTF ON PASS2
	JUMP2	UOUT10
	TLNN	IO,IOIOPF	;ANY IOP'S SEEN
	JRST	UOUT12		;NO,MAKE EXTERNAL
	MOVSI	CS,PRMTBL-PRMEND;YES LOOKUP IN TABLE
UOUT1:	CAME	AC0,PRMTBL(CS)	;HAVE WE A MATCH?
	AOBJN	CS,UOUT2	;NO,INCREMENT AND JUMP
	MOVE	ARG,PRMTBL+1(CS);YES,GET VALUE
	MOVEM	ARG,(SX)	;UPDATE SYMBOL TABLE
	POPJ	PP,		;EXIT

UOUT2:	AOBJN	CS,UOUT1	;TEST FOR END
UOUT12:	TRNE	ARG,ENTF	;[340] SEE IF FORWARD DEFINED
	POPJ	PP,		;[340] YES, THEN DON'T EXTERNAL IT
	PUSHJ	PP,EXTER2	;MAKE IT EXTERNAL
	MOVSI	ARG,UNDF	;BUT PUT UNDF BACK ON
	IORM	ARG,(SX)	;SO MESSAGE WILL COME OUT
	POPJ	PP,		;GET NEXT SYMBOL

UOUT13:	JUMP1	CPOPJ		;RECYCLE ON PASS1
	TRC	ARG,UNDF!EXTF!PNTF	;CHECK FOR ALL THREE ON
	TRCE	ARG,UNDF!EXTF!PNTF	;ARE THEY?
	POPJ	PP,		;NO, RECYCLE
UOUT10:	PUSHJ	PP,OUTSYM	;OUTPUT THE SYMBOL
	MOVEI	CS,[SIXBIT /UNASSIGNED, DEFINED AS IF EXTERNAL @/]
	PUSHJ	PP,OUTSIX	;[360]
	JRST	OUTCR		;[360] POPJ FOR NEXT SYMBOL
				;OUTPUT THE ENTRIES

EOUT:	MOVEI	C,0		;INITIALIZE THE COUNT
	MOVE	SX,SYMBOL
	MOVE	SDEL,0(SX)
EOUT1:	SOJL	SDEL,EOUT2	;TEST FOR END
	ADDI	SX,2
	HLRZ	ARG,0(SX)
	ANDCAI	ARG,SYMF!INTF!ENTF
	JUMPN	ARG,EOUT1	;IF INVALID, DON'T COUNT
	AOJA	C,EOUT1		;BUMP COUNT

EOUT2:	HRLI	C,4		;BLOCK TYPE 4
	PUSHJ	PP,OUTBIN
	SETZB	C,ARG
	PUSHJ	PP,OUTBIN
	MOVE	SX,SYMBOL
	MOVE	SDEL,0(SX)
	MOVEI	V,^D18

EOUT3:	SOJL	SDEL,POPOUT
	ADDI	SX,2
	HLRZ	C,0(SX)
	ANDCAI	C,SYMF!INTF!ENTF
	JUMPN	C,EOUT3
	SOJGE	V,EOUT4		;TEST END OF BLOCK
	PUSHJ	PP,OUTBIN
	MOVEI	V,^D17	;WFW
EOUT4:	MOVE	AC0,-1(SX)
	PUSHJ	PP,SQOZE
	MOVE	C,AC0
	PUSHJ	PP,OUTBIN
	JRST	EOUT3

LSOUT:	SKIPN	C,LOCAL		;ANY LOCAL FIXUPS REQUIRED?
	POPJ	PP,		;NO
	MOVS	AC0,(C)		;GET VALUE RIGHT WAY ROUND
	MOVS	RC,1(C)		;AND RELOCATION
	HLRZM	RC,LOCAL	;STORE NEXT POINTER
	PUSHJ	PP,COUT		;OUTPUT THIS WORD
	JRST	LSOUT		;LOOK FOR MORE
				;OUTPUT THE SYMBOLS
SOUT:	SKIPN	IONSYM		;SKIP IF NOSYM SEEN
	TRNN	ER,LPTSW!TTYSW	;A LISTING REQUIRED?
	JRST	SOUT2		;NO
	MOVEI	[ASCIZ /SYMBOL TABLE/]
	HRRM	SUBTTX		;SET NEW SUB-TITLE
	MOVEI	ARG,NCOLS	;SET UP FOR NCOLS ACROSS SYMBOL TABLE
	TRNE	ER,TTYSW	;IS TTY LISTING DEVICE?
	MOVEI	ARG,2		;YES,ONLY 2 COLLUMNS
	MOVEM	ARG,NCOLLS	;STORE ANSWER
IFE POLISH,<
	MOVE	SX,SYMBOL	;START OF TABLE
	MOVE	SDEL,(SX)	;COUNT OF SYMBOLS
>
IFN POLISH,<
	MOVE	SX,SGSBOT	;START OF TABLE
	MOVE	SDEL,SGNCUR	;CUR PSECT INX
	JUMPE	SDEL,SOUTBS	;IS THIS THE BLANK PSECT?
	MOVE	ARG,[XWD SGTTLB,SGLIST]
	BLT	ARG,SGTTLE-SGTTLB+SGLIST-1	;MOVE SUBTTL
	MOVE	AC1,SGTTLE	;'TO' POINTER
	MOVE	AC2,SGTTLF	;'FROM' POINTER
SGTTLL:	ILDB	AC0,AC2		;GET A SIXBIT CHAR
	ADDI	AC0,40		;FORM ASCII
	IDPB	AC0,AC1		;PUT IN SUBTTL
	TLNE	AC2,770000	;DONE SIX CHARS?
	JRST	SGTTLL		;NOT DONE YET
	SETZ	AC0,		;TERMINATE SUBTTL
	IDPB	AC0,AC1		; WITH NULL BYTE
	MOVEI	AC0,SGLIST	;POINTER TO
	HRRM	AC0,SUBTTX	; NEW SUBTTL
SOUTBS:	HRRZ	SDEL,SGSCNT(SDEL)	;COUNT OF SYMBOLS
>
	ADDI	SX,2		;SKIP COUNT
	MOVEM	SX,SXSV		;SAVE PLACE
	MOVEM	SDEL,SDELSV
	MOVE	SX,SPAGNO	;GET LAST SYMBOL PAGE NUMBER
	EXCH	SX,PAGENO	;SWAP WITH OUTPUT PAGE NUMBER
	MOVEM	SX,SPAGNO	;AND STORE IT
	MOVE	SX,[BYTE (7) 0,0,<"S">,<"-">,0]
	IORM	SX,DBUF+4	;FIXUP TITLE

SOUT0:	PUSHJ	PP,SOUTP	;GET PAGE SET UP
	  JRST	SOUT1		;NOTHING TO OUTPUT
	PUSHJ	PP,SOUTF	;DUMP ONE PAGE
	  JRST	SOUT1		;DIDN'T FILL PAGE-DONE
	JRST	SOUT0

IFN POLISH,<
SGTTLB:	ASCII	/SYMBOL TABLE FOR PSECT   /
SGTTLE:	POINT	7,SGTTLE-SGTTLB+SGLIST
SGTTLF:	POINT	6,SGNAME(SDEL)
>
SOUTT:	MOVE	ARG,(SX)	;GET FLAGS
	TLNE	ARG,SUPRBT	;SURPRESSED?
	POPJ	PP,		;YES
	TLNN	ARG,SYMF	;SYMBOL IS OK
	TLNN	ARG,SYNF!MACF	;BUT MACRO OR SYNONYM AREN'T
	AOS	(PP)
	POPJ	PP,
SOUTP:	MOVE	AC1,NCOLLS	;GET COLUMN COUNT
	MOVE	SX,SXSV		;GET POSITION
	MOVE	SDEL,SDELSV	;AND COUNT

SOUTP0:	MOVEM	SX,SYMBLK(AC1)
	HRLM	SDEL,SYMBLK(AC1)	;SAVE IN TABLE
	MOVE	AC0,..LPP	;[227] LINE COUNT

SOUTP1:	JUMPE	SDEL,SOUTP2	;IF NONE LEFT, GO ELSEWHERE
	PUSHJ	PP,SOUTT	;SYMBOL OK?
	  TDZA	RC,RC		;NO
	SETO	RC,		;YES
	ADDI	SX,2		;SET UP FOR NEXT NOW
	SUBI	SDEL,1
	JUMPGE	RC,SOUTP1	;SKIP SYMBOL
	SOJG	AC0,SOUTP1	;COUNT IN SYMBOL
	SOJG	AC1,SOUTP0	;START NEXT COLUMN
	MOVEM	SX,SXSV		;SAVE POSITION
	MOVEM	SDEL,SDELSV
	AOS	(PP)
	POPJ	PP,
SOUTP2:	CLEARM	SDELSV		;FLAG DONE
	CAME	AC1,NCOLLS	;IF ON 1ST COLUMN
	JRST	.+3
	CAMN	AC0,..LPP	;[227] AND FIRST LINE
	POPJ	PP,		;THEN SKIP PRINTING
	SOJLE	AC1,CPOPJ1	;ALREADY GOT THIS LINE
	CLEARM	SYMBLK(AC1)
	SOJG	AC1,.-1		;ZERO ALL OTHERS
	JRST	CPOPJ1
SOUTF:	PUSHJ	PP,OUTFF	;GET TO TOP OF PAGE
	MOVE	AC1,..LPP	;[227]
	MOVEM	AC1,COLSIZ

SOUTF1:	PUSHJ	PP,SOUTL	;DUMP ONE LINE
	  JRST	CPOPJ		;WAS BLANK
	SOSLE	COLSIZ		;ONE MORE DONE
	JRST	SOUTF1		;MORE TO GO
SOUTF2:	JRST	CPOPJ1

SOUTL:	MOVE	AC1,NCOLLS	;SET COLUME COUNT
SOUTL0:	HRRZ	SX,SYMBLK(AC1)
	HLRZ	SDEL,SYMBLK(AC1);GET POSITION IN TABLE
	JUMPE	SDEL,SOUTL3	;NOTHING THERE

SOUTL1:	PUSHJ	PP,SOUTT	;SYMBLE PRINTABLE?
	  JRST	SOUTL2		;CENCOR!!
	PUSHJ	PP,SOUTE	;DUMP OUT ENTRY
	ADDI	SX,2
	SUBI	SDEL,1		;UP TP NEXT ONE
	HRL	SX,SDEL		;SAVE OUR PLACE
	MOVEM	SX,SYMBLK(AC1)
	SOJG	AC1,SOUTL0	;NEXT!
	AOS	(PP)
	JRST	OUTCR		;POLISH OFF LINE

SOUTL2:	ADDI	SX,2
	SOJG	SDEL,SOUTL1	;KEEP SEARCHING
SOUTL3:	CAME	AC1,NCOLLS	;BLANK LINE?
	AOS	(PP)		;NO
	JRST	OUTCR
SOUTE:	MOVE	AC0,-1(SX)
	PUSHJ	PP,OUTSYM	;DUMP SYMBOL OUT
	PUSHJ	PP,SRCH7	;GET VALUE
	TLNN	ARG,EXTF	;EXTERNAL?
	JRST	.+5
	HLRZ	RC,V		;YES, NEED FIXUP
	TRNE	RC,-2
	MOVS	RC,(RC)
	HLL	V,RC

	HLLO	CS,V
	TLNE	RC,-1
	TRZ	CS,1
	TLNE	RC,-2
	TRZ	CS,EXTF
	TLNN	V,-1
	TLNE	RC,-1
	PUSHJ	PP,ONC1
	PUSHJ	PP,OUTTAB
	HRLO	CS,V
	TRNE	RC,-1
	TRZ	CS,1
	TRNE	RC,-2
	TRZ	CS,EXTF
	PUSHJ	PP,ONC1
	PUSHJ	PP,OUTTAB	;AND TAB, OF COURSE
	PUSHJ	PP,SOUTE8	;ABBREVIATION FOR TYPE
	JRST	OUTTAB		;FINAL TAB

SOUTE8:	TLNN	ARG,INTF!EXTF!ENTF!UNDF!NOOUTF
	 POPJ	PP,		;SKIP JUNK FOR SIMPLE STUFF
	SETZ	CS,
	TLNE	ARG,INTF	;INTERNAL
	MOVEI	CS,1
	TLNE	ARG,EXTF	;EXTERNAL
	MOVEI	CS,-1
	TLNE	ARG,ENTF	;ENTRY
	MOVEI	CS,-5
	TLNE	ARG,NOOUTF	;DDT SURPRESSED
	ADDI	CS,3
	TLNE	ARG,UNDF	;UNDEFINED
	MOVEI	CS,-3		;SET FOR UDF
	MOVEI	CS,SOUTC(CS)	;GET ABREVIATION
	JRST	OUTAS0
SOUT1:	MOVE	SX,PAGENO	;GET LAST SYMBOL PAGE NUMBER
	EXCH	SX,SPAGNO	;SWAP WITH OUTPUT PAGE NUMBER
	MOVEM	SX,PAGENO	;AND STORE IT
	MOVE	SX,[BYTE (7) 0,0,<"S">,<"-">,0]
	ANDCAM	SX,DBUF+4	;FIXUP TITLE
SOUT2:	PUSHJ	PP,SGLKUP	;[265] SET FOR TABLE SCAN
	TRNN	ARG,SYMF
	TRNN	ARG,MACF!SYNF
	TDZA	MRP,MRP		;SKIP AND CLEAR MRP
	POPJ	PP,		;NO, TRY AGAIN
	TRNE	ARG,INTF
	MOVEI	MRP,1
	TRNE	ARG,EXTF
	MOVNI	MRP,1		;MRP=-1 FOR EXTERNAL
	TRNE	ARG,SYNF	;SYNONYM?
	JUMPL	MRP,POPOUT	;YES, DON'T OUTPUT IF EXTERNAL
	TRNE	ARG,SUPRBT	;IF SUPRESSED
	POPJ	PP,		;DO NOT OUTPUT
	JUMPGE	MRP,SOUT10	;BRANCH IF NOT EXTERNAL
	HLRZ	RC,V		;PUT POINTER/FLAGS IN RC
	TRNE	RC,-2		;POINTER?
	MOVS	RC,0(RC)	;YES
	HLL	V,RC		;STORE LEFT VALUE

SOUT10:	PUSH	PP,RC		;SAVE FOR LATER
	MOVEI	AC1,0
	JUMPLE	MRP,SOUT15	;SET DEFFERRED BITS IF INTERN=EXTERN
	TDNE	RC,[-2,,-2]	;CHECK FOR INTERN=EXTERN
	TRZ	ARG,NOOUTF	;YES, SO CLEAR SUPPRESS FLAG
	TLNE	RC,-2		;CHECK FOR LEFT FIXUP
	IORI	AC1,40		;AND SET BITS
	TRNE	RC,-2		;CHECK FOR RIGHT FIXUP
	IORI	AC1,20		;AND SET BITS
SOUT15:	TLNE	RC,-2		;FIX RELOC AS 0 IF EXTERNAL
	HRRZS	RC
	TRNE	RC,-2
	HLLZS	RC
	TLZE	RC,-1
	TRO	RC,2
	HRL	MRP,RC
	MOVEI	RC,0
	TRNE	ARG,ENTF	;ENTRY DMN
	HRRI	MRP,-5
	TRNE	ARG,NOOUTF	;SUPRESS OUTPUT? WFW
	ADDI	MRP,3		;YES WFW
	TRNE	ARG,UNDF	;UNDEFINED IS EXTERNAL
	HRRI	MRP,2		;SO FLAG AS UDF
	IOR	AC1,SOUTC(MRP)
	MOVE	ARG,AC1
	PUSHJ	PP,NOUT2	;SQUOZE AND DUMP THE SYMBOL
	MOVEM	AC0,SVSYM	;SAVE IT
	MOVE	AC0,V		;GET THE VALUE
	HLRZ	RC,MRP		;AND THE RELOCATION
	PUSHJ	PP,COUT
	POP	PP,RC		;GET BACK RELOC AND CHECK EXTERNAL
	TRNN	RC,-2		;IS IT?
	JRST	SOUT50		;NO
	MOVE	AC0,1(RC)	;GET NAME
	MOVEI	ARG,60		;EXTERNAL REQ
	PUSHJ	PP,SQOZE
	HLLZS	RC		;NO RELOC
	PUSHJ	PP,COUT		;OUTPUT IT
	MOVE	AC0,SVSYM	;GET SYMBOL NAME
	TLO	AC0,500000	;SET AS ADDITIVE SYMBOL
	TLZ	AC0,200000	;BUT NOT LEFT HALF ETC
	PUSHJ	PP,COUT
SOUT50:	MOVSS	RC		;CHECK LEFT HALF
	TRNN	RC,-2
	POPJ	PP,
	MOVE	AC0,1(RC)
	MOVEI	ARG,60
	PUSHJ	PP,SQOZE
	MOVEI	RC,0
	PUSHJ	PP,COUT
	MOVE	AC0,SVSYM
	TLO	AC0,700000
	JRST	COUT

SOUT20:	PUSHJ	PP,OUTAS0
	JRST	OUTCR

	<ASCII /ENT/>!04	;DMN
	0
	<ASCII /UDF/>!60	;UNDEFINED EXTERNAL
	<ASCII /SEN/>!44	;SUPRESSED ENTRY
	<ASCII /EXT/>!60
SOUTC:	EXP	10
	<ASCII /INT/>!04
	<ASCII /SEX/>!60	;SUPPRESSED EXTERNAL (NOT USED YET)
	<ASCII /SPD/>!50
	<ASCII /SIN/>!44	;DMN
				;OUTPUT THE BINARY

BOUT:	HRRZ	CS,LOCA		;[150] PICKUP THE LOCATION
	SUB	CS,STPX		;[150] MINUS START
	ADD	CS,STPY		;[150] PLUS END
	HRLO	CS,CS		;[150] TO GET ASSEMBLY LOCATION
	PUSHJ	PP,ONC		;OUTPUT IT TO THE LISTING FILE
	MOVEI	C,"'"
	SKIPE	MODA		;[150] IF MODE IS NOT ABSOLUTE
	PUSHJ	PP,OUTC		;PRINT A SINGLE QUOTE
	PUSHJ	PP,DSTOW	;GET THE CODE
	PUSH	PP,RC		;SAVE RELOC
	PUSH	PP,RC		;AND AGAIN
	TLNE	RC,-2		;CHECK LEFT EXTERNAL
	HRRZS	RC		;MAKE LEFT NON-RELOC
	TRNN	RC,-2		;RIGHT EXT?
	JRST	BOUT30		;NO
	HRRZ	AC1,AC0		;YES
	JUMPE	AC1,BOUT20	;PROCESS IF ZERO CODE THERE
	HLLZS	RC		;MAKE NON-RELOC
	JRST	BOUT30		;PROCESS

BOUT20:	HRRM	AC1,-1(PP)	;FIX RC IN STACK SO NO CONFUSION WFW (AC1 HAS 0)
	HRR	AC0,0(RC)	;NO, SET ADDRESS LINK
	MOVE	AC1,LOCO	;GET CURRENT LOCATION
	HRRM	AC1,0(RC)	;SET NEW LINK
	HLRZ	AC1,0(RC)	;GET FLAGS/POINTER
	TRNN	AC1,-2		;POINTER?
	HRR	AC1,RC		;NO, SET TO FLAGS
	HLR	RC,0(AC1)	;PUT FLAGS IN RC
	HRL	AC1,MODO	;GET CURRENT MODE
	TRZE	RC,-2		;LEFT HALF RELOCATABLE+
	TLO	AC1,2		;YES, SET FLAG
	HLLM	AC1,0(AC1)	;STORE NEW FLAGS
BOUT30:	HLLO	CS,AC0
	TLZE	RC,1		;PACK RELOCATION BITS
	TRO	RC,2
	TRNE	RC,2		;LEFT HALF RELOCATABLE?
	TRZ	CS,1		;YES, RESET BIT
	PUSH	PP,AC0		;NEED AN AC
	HLRZ	AC0,-1(PP)	;AC0 = LEFT RELOCATION
	CAILE	AC0,1		;EXTERNAL?
	XORI	CS,EXTF!1	;YES, SET SWITCH
IFN FORMSW,<
	OR	AC0,HWFMT
	JUMPN	AC0,BOUT3H	;EDIT IN HALF WORD FORMAT IF NOT 0
	MOVE	AC0,FORM	;GET FORM WORD
	MOVEI	C,0		;ZERO FIELD SIZE
BOUT3A:	JFFO	AC0,BOUT3B	;AC1 = FIELD SIZE -1
	JRST	BOUT3C		;NO FIELDS LEFT, JUMP
BOUT3B:	LSH	AC0,1(AC1)	;SHIFT OFF FORM FIELD
	MOVEI	AC1,6(AC1)
	IDIVI	AC1,3		;AC1 = COLUMNS USED + 1
	ADDI	C,(AC1)		;INCREMENT FIELD SIZE
	CAIG	C,^D23		;IS FIELD SIZE GTR 23?
	JRST	BOUT3A		;NO.  CONTINUE
	MOVE	AC1,HWFORM	;USE STANDARD FORM
	MOVEM	AC1,FORM
	MOVEI	C,^D13		;SET FIELD SIZE TO 13
BOUT3C:	MOVEM	C,FLDSIZ	;STORE FIELD SIZE
	MOVE	AC0,FORM	;AC0 = FORM WORD
	TRNN	RC,2		;IS LEFT HALF RELOCATED?
	CAMN	AC0,HWFORM	;NO.  IS FORM HALF WORD?
	JRST	BOUT3H		;YES.  EDIT IN OLD WAY
	IBP	TABP
	CAIL	C,^D16
	IBP	TABP
	ILDB	C,TABP		;GET A TAB
	PUSHJ	PP,OUTL		;OUTPUT IT
	MOVE	AC2,(PP)	;AC2 = INFO TO BE EDITED
	PUSH	PP,CS		;SAVE CS = C+1
BOUT3D:	JFFO	AC0,BOUT3E	;AC1 = FIELD LENGTH - 1
BOUT3E:	LSH	AC0,1(AC1)	;SHIFT OFF FORM FIELD
	MOVEI	C,3(AC1)
	MOVEI	AC1,0
	LSHC	AC1,-2(C)	;AC1 = FIELD INFO
	IDIVI	C,3		;C = # OF OCTAL DIGITS
	MOVE	C+1,AC0		;SAVE AC0
	SKIPE	IOSEEN		;IS THIS A I/O INST.
	PUSHJ	PP,BOUT3J	;YES,SET FIELDS CORRECTLY
	MOVNS	C
	ROT	AC1,(C)
	ROT	AC1,(C)
	ROT	AC1,(C)
	MOVNS	C
BOUT3F:	MOVEI	AC0,6		;EDIT A DIGIT
	LSHC	AC0,3
	EXCH	AC0,C
	PUSHJ	PP,OUTC		;OUTPUT IT
	MOVE	C,AC0
	SOJG	C,BOUT3F	;IF MORE DIGITS,  GO BACK
	JUMPE	C+1,BOUT3G	;JUMP IF END OF WORD
	MOVE	AC0,C+1		;RESTORE AC0
	MOVEI	C," "
	PUSHJ	PP,OUTC		;OUTPUT A SPACE
	JRST	BOUT3D		;PROCESS NEXT FIELD

BOUT3G:	POP	PP,CS		;RESTORE CS = C+1
	MOVEI	C," "
	TRNE	RC,1		;RELOCATABLE?
	MOVEI	C,"'"		;YES
	HRRZ	AC0,-1(PP)	;AC0 = RIGHT RELOCATION
	CAILE	AC0,1		;EXTERNAL?
	MOVEI	C,"*"		;YES
	PUSHJ	PP,ONC2		;STORE POSSIBLE INDICATOR
	POP	PP,AC0
	JRST	BOUT3I		;CONTINUE

BOUT3H:	MOVEI	C,^D15		;SET SIZE TO 15
	MOVEM	C,FLDSIZ	;[116]
	SETZM	IOSEEN		;CLEAR INCASE HWFMT WAS SET
>
	POP	PP,AC0		;RESTORE
	PUSHJ	PP,ONC
	HRLO	CS,AC0
	TDZ	CS,RC		;SET RELOCATION
	HRRZ	C,(PP)		;C = RIGHT RELOCATION
	CAILE	C,1		;EXTERNAL
	XORI	CS,EXTF!1	;YES, SET SWITCH
	PUSHJ	PP,ONC
BOUT3I:	POP	PP,CS		;GET RID OF ENTRY ON STACK
	HRRZ	CS,LOCO
	TLNE	FR,RIMSW!RIM1SW!R1BSW	;RIM OUTPUT?
	JRST	ROUT		;YES, GO PROCESS

	HRL	CS,MODO
	CAME	CS,MODLOC	;SEQUENCE OR RELOCATION BREAK?
	PUSHJ	PP,COUTD	;YES, DUMP THE BUFFER
	SKIPL	COUTX		;NEW BUFFER?
	JRST	BOUT40		;NO, STORE CODE AND EXIT
	MOVEM	CS,MODLOC	;YES, STORE NEW VALUES
	EXCH	AC0,LOCO
	EXCH	RC,MODO
	PUSHJ	PP,COUT		;STORE BLOCK LOCATION AND MODE
	EXCH	RC,MODO		;RESTORE CURRENT VALUES
	EXCH	AC0,LOCO
BOUT40:	PUSHJ	PP,COUT		;EMIT CODE
	POP	PP,RC		;RETRIEVE EXTERNAL BITS
	TRNN	RC,-2		;RIGHT EXTERNAL?
	JRST	BOUT50		;TRY FOR LEFT
	PUSHJ	PP,COUTD
	PUSH	PP,BLKTYP	;TERMINATE TYPE AND SAVE
	MOVEI	AC0,2		;BLOCK TYPE 2
	MOVEM	AC0,BLKTYP
	MOVE	AC0,1(RC)	;GET SYMBOL
	MOVEI	ARG,60		;CODE BITS
	PUSHJ	PP,SQOZE	;CONVERT TO RADIX 50
	HLLZS	RC		;SYMBOL HAS NO RELOCATION
	PUSHJ	PP,COUT		;EMIT
	MOVE	AC0,LOCO	;GET CURRENT LOC
	HRLI	AC0,400000	;ADDITIVE REQ
	HRR	RC,MODO		;CURRENT MODE
	PUSHJ	PP,COUT		;EMIT
	MOVSS	RC		;NOW FOR LEFT
	TRNN	RC,-2
	JRST	BOUT60
	JRST	BOUT70
BOUT50:	MOVSS	RC		;CHECK OTHER HALF
	TRNN	RC,-2		;LEFT HALF EXTERNAL?
	JRST	BOUT80		;NO, FALSE ALARM
	PUSHJ	PP,COUTD	;CHANGE MODE
	PUSH	PP,BLKTYP
	MOVEI	AC0,2
	MOVEM	AC0,BLKTYP
BOUT70:	MOVE	AC0,1(RC)
	MOVEI	ARG,60
	PUSHJ	PP,SQOZE
	HLLZS	RC
	PUSHJ	PP,COUT
	MOVE	AC0,LOCO
	HRLI	AC0,600000	;LEFT HALF ADD
	HRR	RC,MODO
	PUSHJ	PP,COUT		;EMIT
BOUT60:	PUSHJ	PP,COUTD	;CHANGE MODE
	POP	PP,BLKTYP	;TO OLD ONE
BOUT80:	AOS	LOCO
	AOS	MODLOC
	POPJ	PP,
IFN FORMSW,<
BOUT3J:	MOVSS	IOSEEN		;SWAP
	SKIPGE	IOSEEN		;SKIP IF NOT FIRST FIELD
	JRST	[HLLZS IOSEEN		;CLEAR RIGHT HALF
		POPJ	PP,]		;AND RETURN
	MOVSS	IOSEEN		;SWAP BACK
	LSH	AC1,2		;CORRECT  MNEMONIC AND OP CODE
	CAIE	C,1		;IS IT OP CODE?
	POPJ	PP,		;NO,JUST RETURN
	MOVEI	C,2		;TWO CHAR. WIDE NOW
	SETZM	IOSEEN		;DON'T COME AGAIN
	POPJ	PP,		;RETURN
>
NOUT:	MOVE	V,[POINT 7,TBUF]	;POINTER TO ASCII LINE
	MOVSI	CS,(POINT 6,AC0)	;POINTER TO SIXBIT AC0
	SETZB	ARG,AC0
NOUT1:	ILDB	C,V		;GET ASCII
	CAIL	C,"A"+40
	CAILE	C,"Z"+40
	JRST	.+2
	TRZA	C,100		;LOWER CASE TO SIXBIT
	SUBI	C,40		;CONVERT TO SIXBIT
	JUMPLE	C,NOUT3		;TEST FORM NON-SIXBIT
	CAILE	C,77		;AND NOT GREATER THAN SIXBIT
	JRST	NOUT3		;...
	IDPB	C,CS		;DEPOSIT IN AC0
	TLNE	CS,770000	;TEST FOR SIX CHARACTERS
	JRST	NOUT1		;NO, GET ANOTHER
NOUT3:	SKIPGE	UNIVSN		;IF A UNIVERSAL PROG
	POPJ	PP,		;RETURN TO PUT IT IN THE TABLE

IFN CCLSW,<SKIPN TBUF+1		;AND IF WE HAVE NOT SEEN A TITLE
	PUSHJ	PP,PRNAM	;THEN PRINT THE NAME>
	PUSHJ	PP,NOUT2	;[214] DUMP NAME
	MOVSI	AC0,11		;[214] TYPE MARKER
	IOR	AC0,CPUTYP	;[235] CPU  TYPE
	PJRST	COUT		;[214] DUMP AND EXIT

NOUT2:	PUSHJ	PP,SQOZE	;CONVERT TO SIXBIT
	JRST	COUT		;DUMP AND EXIT

HOUT:
IFN POLISH,<
	SETZ	AC0,		;[265] FORCE TO PSECT 0
	SKIPE	SGNMAX		;[265] NO PSECTS
	PUSHJ	PP,SGOUTN	;[265] PUT IT OUT
>
	MOVEI	RC,1		;RELOCATABLE
	MOVE	AC0,HHIGH	;GET HIGH SEG IF TWO SEGMENTS
	JUMPE	AC0,.+2		;NOT TWO SEGMENTS
	PUSHJ	PP,COUT		;OUTPUT IT 
	MOVE	AC0,SGATTR	;[265]
	SKIPE	HHIGH		;ANY TWOSEG HIGH STUFF
	JRST	COUT		;YES,SO NO ABS.
	PUSHJ	PP,COUT		;OUTPUT THE HIGHEST LOCATION
	MOVE	AC0,ABSHI
				;PUT OUT ABS PORTION OF PROGRAM BREAK
	SOJA	RC,COUT		;OUTPUT A WORD OF ZERO AND EXIT
IFN POLISH,<			;[164]
;HERE TO OUTPUT BLOCK TYPE 11
POUT:	SKIPN	POLIST		;ANY POLISH TO OUTPUT?
	POPJ	PP,		;NO
	TLO	FR,POLSW	;SET FLAG
	PUSHJ	PP,COUTD	;DUMP BUFFER UNLESS EMPTY
	MOVE	CS,@POLIST	;GET A BLOCK POINTER
	EXCH	CS,POLIST	;SET FOR NEXT TIME
POUTA:	ADDI	CS,1		;FIRST WORD
	MOVE	AC0,(CS)	;GET SOMETHING
	SETZ	RC,		;CLEAR RELOCATION
	JUMPL	AC0,POUTOP	;THIS IS AN OPERATOR
	PUSHJ	PP,PCOUT	;STORE THIS HALF WORD
	JUMPE	AC0,POUT0	;18 BIT VALUE
	SOJE	AC0,POUT1	;36 BIT VALUE
	HLRZ	AC0,1(CS)	;GET HALF OF SYMBOL
	PUSHJ	PP,PCOUT
	HRRZ	AC0,1(CS)	;GET OTHER HALF
	PUSHJ	PP,PCOUT
	AOJA	CS,POUTA

POUT0:	HLRZ	RC,1(CS)	;GET RELOCATION
	HRRZ	AC0,1(CS)	;AND VALUE
	PUSHJ	PP,PCOUT
	AOJA	CS,POUTA	;GET NEXT

POUT1:	HLRZ	RC,1(CS)	;GET LEFT HALF
	HLRZ	AC0,2(CS)
	PUSHJ	PP,PCOUT
	HRRZ	RC,1(CS)	;RIGHT HALF
	HRRZ	AC0,2(CS)
	PUSHJ	PP,PCOUT
	ADDI	CS,2		;SKIP OVER 2 WORDS
	JRST	POUTA

POUTOP:	HRRZ	AC0,AC0		;GET OPERATOR ONLY
	PUSHJ	PP,PCOUT	;OUTPUT
	CAIGE	AC0,-6		;[265] CHECK FOR STORE OP
	JRST	POUTA		;ITS NOT
	CAIGE	AC0,-3		;CHECK FOR SYMBOL FIXUP
	JRST	POUTSY		;IT IS
	HLRZ	RC,1(CS)	;GET RELOCATION
	HRRZ	AC0,1(CS)	;AND STORE ADDRESS
POUTOQ:	PUSHJ	PP,PCOUT
	TLZ	FR,POLSW	;CLEAR FLAG INCASE END
	JRST	POUT		;SEE IF MORE TO GO

POUTSY:	HLRZ	AC0,1(CS)	;GET LHS SYMBOL
	SETZ	RC,		;NO RELOCATION
	PUSHJ	PP,PCOUT	;OUTPUT IT
	HRRZ	AC0,1(CS)	;GET RHS
	PUSHJ	PP,COUT
	JFFO	PP,POUTOQ	;FOLLOW WITH 0 FOR BLOCK LEVEL (FAIL COMPATIBLE)

PCOUT:	MOVE	C,COUTP		;GET POINTER
	TLNE	C,010000	;LEFT OR RIGHT HALF?
	JRST	PCOUTR		;JUST THE RIGHT HALF
	AOS	C,COUTX		;INCREMENT INDEX
	HRLZM	AC0,COUTDB(C)	;STORE LEFT HALF
	IDPB	RC,COUTP	;AND RELOCATION
	POPJ	PP,
PCOUTR:	MOVE	C,COUTX		;GET CURRENT INDEX
	HRRM	AC0,COUTDB(C)	;STORE RIGHT HALF
	IDPB	RC,COUTP	;AND RELOCATION
	CAIE	C,^D17		;IS THE BUFFER FULL
	POPJ	PP,		;NO
	JRST	COUTD		;YES, DUMP IT

;HERE TO OUTPUT BLOCK TYPE 22 - PSECT NAME
SGOUTN:	PUSHJ	PP,COUTD	;FINISH OFF CURRENT BLOCK
	PUSH	PP,BLKTYP	;SAVE CURRENT BLOCK TYPE
	MOVEI	AC0,22		;BLOCK TYPE 22 IS A
	MOVEM	AC0,BLKTYP	; PSECT NAME
	MOVE	C,SGNCUR	;GET CUR PSECT INX
	MOVE	AC0,SGNAME(C)	;GET PSECT NAME
	SETZ	RC,		;CLEAR RELOCATION
	PUSHJ	PP,COUT		;OUTPUT THE BLOCK
	MOVE	C,SGNCUR	;INDEX AGAIN
	HRRZ	AC0,SGORIG(C)	;GET ORIGIN IF SPECIFIED
	SKIPE	AC0		;NOT
	PUSHJ	PP,COUT
	PUSHJ	PP,COUTD	;FINISH IT OFF
	POP	PP,BLKTYP	;RESTORE CURRENT BLOCK TYPE
	POPJ	PP,		;RETURN

;HERE TO OUTPUT BLOCK TYPE 23 - PSECT LENGTH AND ATTRIBUTES
SGOUTL:	PUSHJ	PP,COUTD	;FINISH OFF CURRENT BLOCK
	PUSH	PP,BLKTYP	;SAVE CURRENT BLOCK TYPE
	MOVEI	AC0,23		;BLOCK TYPE 23 IS A
	MOVEM	AC0,BLKTYP	; PSECT LENGTH
	MOVE	RC,SGNCUR	;GET CUR PSECT INX
	MOVE	AC0,SGNAME(RC)	;GET PSECT NAME
	SETZ	RC,		;CLEAR RELOCATION
	PUSHJ	PP,COUT		;OUTPUT THE NAME
	MOVE	RC,SGNCUR	;GET CUR PSECT INX
	MOVE	AC0,SGATTR(RC)	;GET PSECT LENGTH AND ATTRS
	MOVEI	RC,1		;BREAK IS RELOCATED
	PUSHJ	PP,COUT		;OUTPUT THE LENGTH AND ATTRS
	PUSHJ	PP,COUTD	;FINISH IT OFF
	POP	PP,BLKTYP	;RESTORE CURRENT BLOCK TYPE
	POPJ	PP,		;RETURN
>
HSOUT:	SETZM	HISNSW		;CLEAR FOR PASS2
	MOVE	AC0,SVTYP3	;GET HISEG ARG
	JUMPGE	AC0,.+4		;JUMP IF ONLY HISEG
	HRL	AC0,HIGH1	;GET BREAK FROM PASS 1
	JUMPL	AC0,.+2		;OK IF GREATER THAN 400000
	HRLS	AC0		;SIGNAL TWO SEGMENT TO LOADER
	MOVEI	RC,1		;ASSUME RELOCATABLE
	JRST	COUT		;OUTPUT THE WORD

VOUT:	SKIPN	RC,VECREL	;IS VECTOR ABSOLUTE ZERO?
	SKIPE	VECTOR		;ALSO CHECK RELOCATION
	JRST	.+3		;[244]
	SKIPN	VECSYM		;[244] SEE IF SYMBOLIC
	POPJ	PP,		;YES, EXIT
IFN POLISH,<
	MOVE	AC0,VECFND	;GET START ADR PSECT INX
	MOVEM	AC0,SGNCUR	;POINT CUR PSECT THERE
	SKIPE	SGNMAX		;IF PSECTS WERE USED
	PUSHJ	PP,SGOUTN	; THEN PUT OUT PSECT BLOCK
	MOVE	RC,VECREL>	;GET RELOCATION
	MOVE	AC0,VECTOR	;AC0 SHOULD BE FLAGS
	SKIPN	VECSYM		;[244] 2 WORDS IF SYMBOLIC
	JRST	COUT
	PUSHJ	PP,COUT		;OUTPUT CONSTANT
	MOVE	AC0,VECSYM	;[244] GET SYMBOL
	MOVEI	ARG,60		;[210] MAKE REQUEST
	PUSHJ	PP,SQOZE	;[210] IN RADIX-50
	SETZ	RC,		;[240]

COUT:	AOS	C,COUTX		;INCREMENT INDEX
	MOVEM	AC0,COUTDB(C)	;STORE CODE
	IDPB	RC,COUTP	;STORE RELOCATION BITS
	CAIE	C,^D17		;IS THE BUFFER FULL?
	POPJ	PP,		;NO, EXIT

COUTD:	AOSG	C,COUTX		;DUMP THE BUFFER
	JRST	COUTI		;BUFFER WAS EMPTY
	HRL	C,BLKTYP	;SET BLOCK TYPE
COUTT:				;[232] ENTER FROM .TEXT PSEUDO-OP
	PUSHJ	PP,OUTBIN	;OUTPUT COUNT AND TYPE
	SETOB	C,COUTY		;INITIALIZE INDEX

COUTD2:	MOVE	C,COUTDB(C)	;GET RELOCATION BITS/CODE
	CAMN	SDEL,[XWD 440000,0]	;[331] IF .TEXT, ONLY OUTPUT THE RELOCATION
	TRZN	C,1		;[331]  WORD IF IT HAS DATA OR IS NEEDED
				;[331]  FOR A NULL STRING TERMINATOR
	PUSHJ	PP,OUTBIN	;DUMP IT
	AOS	C,COUTY		;INCREMENT INDEX
	CAMGE	C,COUTX		;TEST FOR END
	JRST	COUTD2		;NO, GET NEXT WORD

COUTI:	SETOM	COUTX		;INITIALIZE BUFFER INDEX
	SETZM	COUTRB		;ZERO RELOCATION BITS
IFN POLISH,<
	HRRZ	C,BLKTYP	;[164] IF WE ARE OUTPUTING
	CAIN	C,11		;[164] POLISH BLOCK TYPE 11
	SKIPA	C,[POINT 1,COUTRB]	;[164] USE HALF WORDS
>
	MOVE	C,[POINT 2,COUTRB]
	MOVEM	C,COUTP		;INITIALIZE BIT POINTER
	POPJ	PP,		;EXIT
STOWZ1:
IFN FORMSW,<	MOVE	AC1,HWFORM	;USE STANDARD FORM>
STOWZ:	MOVEI	RC,0
STOW:
IFN FORMSW,<	MOVEM	AC1,FORM	;STORE FORM WORD>
IFN TSTCD,<
	SKIPE	TCDFLG		;[414]TESTING NEW LINK CODES?
	JRST	STOWTC		;[414]YES.
	> ; NFI TSTCD		;[414]
	JUMP1	STOW20		;SKIP TEST IF PASS ONE
	TRNE	RC,-2		;RIGHT HALF ZERO OR 1?
	PUSHJ	PP,STOWT	;NO, HANDLE EXTERNAL
	TLNN	RC,-2		;LEFT HALF ZERO OR 1? WFW
	JRST	STOW10		;YES, SKIP TEST
	MOVSS	RC		;SWAP HALVES
	PUSHJ	PP,STOWT1	;HANDLE EXTERNAL WFW
	MOVSS	RC		;RESTORE VALUES

STOW10:	SKIPE	EXTPNT		;ANY EXTERNALS REMAINING?
	TRO	ER,ERRE		;YES, SET EXTERNAL ERROR FLAG

STOW20:	AOS	AC1,STPX	;INCREMENT POINTER
	MOVEM	AC0,STCODE(AC1)	;STOW CODE
	MOVEM	RC,STOWRC(AC1)	;STOW RELOCATION BITS
IFN FORMSW,<
	PUSH	PP,FORM
	POP	PP,STFORM(AC1)	;STORE FORM WORD
>
	SKIPN	LITLVL		;ARE WE IN LITERAL?
	AOS	LOCA		;NO, INCREMENT ASSEMBLY LOCATION
	CAIGE	AC1,.STP-1	;OVERFLOW?
	POPJ	PP,		;NO, EXIT

	SKIPE	LITLVL		;ARE WE IN A LITERAL?
	TROA	ER,ERRL		;YES, FLAG ERROR BUT DON'T DUMP
	JRST	CHARL1		;NO, SAVE REGISTERS AND DUMP THE BUFFER
	JRST	STOWI		;INITIALIZE BUFFER

DSTOW:	AOS	AC1,STPY	;INCREMENT POINTER
	MOVE	AC0,STCODE(AC1)	;FETCH CODE
	MOVE	RC,STOWRC(AC1)	;FETCH RELOCATION BITS
IFN FORMSW,<
	PUSH	PP,STFORM(AC1)
	POP	PP,FORM		;GET FORM WORD
>
	CAMGE	AC1,STPX	;IS THIS THE END?
	POPJ	PP,		;NO, EXIT

STOWI:	SETOM	STPX		;INITIALIZE FOR INPUT
	SETOM	STPY		;INITIALIZE FOR OUTPUT
	SETZM	EXTPNT
	POPJ	PP,		;EXIT
SVSTOW:	AOS	LITLVL		;NESTED LITERALS
	PUSH	PP,STPX		;MAKE ROOM FOR ANOTHER
	PUSH	PP,STPY
	MOVE	AC1,STPX
	MOVEM	AC1,STPY
	JRST	0(AC2)

GTSTOW:	POP	PP,STPY		;BACK UP A LEVEL
	POP	PP,STPX
	SOS	LITLVL
	JRST	0(AC2)

	;EXTERNAL RIGHT
STOWT:	HRRZ	AC1,EXTPNT	;GET RIGHT POINTER
	CAIE	AC1,(RC)	;DOES IT MATCH 
	PUSHJ	PP,QEXT		;EXTERNAL OR RELOCATION ERROR
	HLLZS	EXTPNT
	POPJ	PP,		;EXIT

	;EXTERNAL LEFT
STOWT1:	HLRZ	AC1,EXTPNT	;GET LEFT HALF
	CAIE	AC1,(RC)	;SEE ABOVE
	PUSHJ	PP,QEXT
	HRRZS	EXTPNT
	POPJ	PP,		;EXIT

IFN TSTCD,<
STOWTC:	SKIPE	RC		;[414]RELOCATABLE OR EXTERNAL?
	PUSHJ	PP,QEXT		;[414]YES,FLAG ERROR
	JUMP1	CPOPJ		;[414]IF PASS 1, RETURN
	MOVE	C,AC0		;[414]GET VALUE
	JRST	OUTBIN		;[414]DEPOSIT INTO REL FILE AND RETURN
> ; NFI TSTCD
ONC:	ILDB	C,TABP		;ENTRY TO ADVANCE TAB POINTER
	PUSHJ	PP,OUTL		;OUTPUT A TAB
				;OUTPUT 6 OCT NUMBERS FROM CS LEFT
ONC1:	MOVEI	C,6		;CONVERT TO ASCII
	LSHC	C,3		;SHIFT IN OCTAL
	PUSHJ	PP,OUTL		;OUTPUT ASCII FROM C
	TRNE	CS,-1		;ARE WE THROUGH?
	JRST	ONC1		;NO, GET ANOTHER
	MOVEI	C,0		;CLEAR C
	TLNN	CS,1		;RELOCATABLE?
	MOVEI	C,"'"		;YES
	TLNN	CS,EXTF		;OR EXTERNAL
	MOVEI	C,"*"		;YES
ONC2:	JUMPN	C,OUTC		;OUTPUT IF EXTERN OR RELOCATABLE
IFN FORMSW,<	SOS	FLDSIZ	;DECREMENT FIELD SIZE>
	POPJ	PP,		;EXIT

DNC:	IDIVI	C,^D10
	HRLM	CS,0(PP)
	JUMPE	C,.+2
	PUSHJ	PP,DNC		;RECURSE IF NON-ZERO
	HLRZ	C,0(PP)
	ADDI	C,"0"		;FORM ASCII
	JRST	PRINT		;DUMP AND TEST FOR END

OUTAS0:	HRLI	CS,(POINT 7,,)	;ENTRY TO SET POINTER
OUTASC:	ILDB	C,CS		;GET NEXT BYTE
	JUMPE	C,POPOUT	;EXIT ON ZERO DELIMITER
	PUSHJ	PP,PRINT
	JRST	OUTASC

OUTSIX:	HRLI	CS,(POINT 6,,)	;OUTPUT SIXBIT
	ILDB	C,CS		;GET SIXBIT
	CAIN	C,40		;"@" DELIMITER?
	POPJ	PP,		;YES, EXIT
	ADDI	C,40		;NO, FORM ASCII
	PUSHJ	PP,OUTL		;OUTPUT ASCII CHAR FROM C
	JRST	OUTSIX+1

OUTSYM:	MOVE	CS,AC0		;PLACE NAME IN CS
OUTSY1:	MOVEI	C,0		;CLEAR C
	LSHC	C,6		;MOVE NEXT SIXBIT CHARACTER IN
	JUMPE	C,OUTTAB	;TEST FOR END
	ADDI	C,40		;CONVERT TO ASCII
	PUSHJ	PP,OUTL		;OUTPUT
	JRST	OUTSY1		;LOOP
OUTSET:	AOS	SX,0(PP)	;GET RETURN LOCATION
	MOVE	SX,-1(SX)	;GET XWD CODE
	HLRM	SX,BLKTYP	;SET BLOCK TYPE
	SETZB	ARG,RC
	PUSHJ	PP,0(SX)	;GO TO PRESCRIBED ROUTINE
	JRST	COUTD		;TERMINATE BLOCK AND EXIT

	;LOOKUP SCANS ALL THE SYMBOLS IN THE SYMBOL TABLE

LOOKUP:	POP	PP,LOOKX	;INTERCEPT RETURN POP
	MOVE	SX,SYMBOL
IFE POLISH,<
	MOVE	SDEL,0(SX)	;SET FOR TABLE SCAN
LOOKL:	SOJL	SDEL,POPOUT	;TEST FOR END
>
IFN POLISH,<
	PUSH	PP,0(SX)	;SET FOR TABLE SCAN
LOOKL:	SOSGE	0(PP)		;TEST FOR END
	JRST	LOOKXT		;DONE, EXIT
>
	ADDI	SX,2
	MOVE	AC0,-1(SX)
	PUSHJ	PP,SRCH7	;LOAD REGISTERS
	HLRZS	ARG
	PUSHJ	PP,@LOOKX	;RETURN TO CALLING ROUTINE
	JRST	LOOKL		;TRY AGAIN

IFE POLISH,<SYN LOOKUP,SGLKUP>
IFN POLISH,<
LOOKXT:	POP	PP,AC0		;THROW AWAY COUNTER
	POPJ	PP,
SGLKUP:	POP	PP,LOOKX	;INTERCEPT RETURN POP
	MOVE	SX,SGNCUR	;GET CUR PSECT INX
	PUSH	PP,SGSCNT(SX)	;SAVE SYM CNT
	HRRZS	0(PP)		;DON'T WANT LEFT HALF
	MOVE	SX,SGSBOT	;GET INIT SYM TAB PTR
	JRST	LOOKL		;REST IS SAME AS FOR FULL CASE
>
END0:
IFN FT.U01,<
	MOVE	V,[IOWD $USRLN,$USSTK] ; RESET USER STACK
	MOVEM	V,$USRPD	; SO DO IT
>; END OF FT.U01
IFN POLISH,<
	HRROS	SGNCUR		;[265] FORCE EVALUATION IN ITS OWN PSECT
>
	PUSHJ	PP,EVALCM	;GET A WORD
IFN POLISH,<
	HRRZS	SGNCUR		;[265] BACK TO NORMAL
>
	SKIPN	V,AC0		;NON-ZERO?
	JUMPE	RC,.+2		;OR RELOC?
	PUSHJ	PP,ASSIG7	;YES, LIST THE VALUE
	SETZM	VECSYM		;[240] INCASE NOT SYMBOLIC
	SKIPN	EXTPNT		;[210] EXTERNAL?
	JRST	END00		;[210] NO
	CAME	RC,EXTPNT	;[210] MAKE SURE SAME
	JRST	[SETZB	AC0,VECSYM	;[244] NO, CLEAR
		TRO	ER,ERRE		;[210] FLAG ERROR
		JRST	.+3]		;[244]
	MOVE	RC,1(RC)	;[244] GET SIXBIT NAME
	MOVEM	RC,VECSYM	;[244] STORE SYMBOL NAME
	SETZB	RC,EXTPNT	;[210] AND CLEAR RELOC
END00:	MOVEM	AC0,VECTOR
	MOVEM	RC,VECREL
IFN POLISH,<
	MOVE	AC1,SGWFND	;[265] GET START ADR PSECT INX
	MOVEM	AC1,VECFND	;[265] SAVE IT
>
	PUSHJ	PP,STOUTS	;DUMP THE LINE
END01:	SETZ	MRP,		;[223] SHOULDN'T BE IN A MACRO BY NOW
IFN POLISH,<
	MOVE	AC1,SGNMAX	;[265] GET HIGHEST PSECT USED
	PUSH	PP,AC1		;[265] SAVE IT
END02:	CAME	AC1,SGNCUR	;[265] IF NOT CURRENT
	PUSHJ	PP,%SWSEG	;[265] SWAP IT
>
	PUSHJ	PP,VARA		;FILL OUT SELF-DEFINED VARIABLES
IFE IIISW,<PUSH	PP,IO		;SAVE FLAGS
	TLO	IO,IOPROG	;XLIST LITS>
	PUSHJ	PP,LIT1
IFE IIISW,<POP	PP,IO		;GET FLAG BACK>
IFN POLISH,<
	SOSL	AC1,0(PP)	;[265] DONE YET?
	JRST	END02		;[265] NO
	POP	PP,AC1		;[265] GET JUNK OFF STACK
>
	JUMP2	ENDP2

	MOVE	HHIGH		;GET HIGH SEG BREAK
	MOVEM	HIGH1		;SAVE FOR TWOSEG/HISEG BLOCK TYPE 3
	PUSHJ	PP,UOUT
	TLNN	IO,MFLSW	;SKIP IF ONLY PSEND
	PUSHJ	PP,REC2
	MOVE	INDIR		;SET UP FIRST AS LAST
	MOVEM	LSTFIL		;PRINTED
	SETZM	LSTPGN
	PUSHJ	PP,INZ1		;[234]
	TLNE	IO,MFLSW	;IF PSEND
	POPJ	PP,		;BACK TO PSEND0
	SKIPE	PRGPTR		;HAVE ANY PRGEND'S BEEN SEEN
	PUSHJ	PP,PSEND3	;YES,GO SET UP AGAIN

PASS20:	SETZM	CTLSAV
	PUSHJ	PP,COUTI
	PUSHJ	PP,EOUT		;OUTPUT THE ENTRIES
	PUSHJ	PP,OUTSET
	XWD	6,NOUT		;OUTPUT THE NAME (BLKTYP-6)
	SKIPN	HISNSW		;PUT OUT BLOCK TYPE 3?
	JRST	PASS21		;NO
	PUSHJ	PP,OUTSET
	XWD	3,HSOUT		;OUTPUT THE HISEG BLOCK
PASS21:	MOVEI	1
	HRRM	BLKTYP		;SET FOR TYPE 1 BLOCK
	TLZ	FR,P1		;SET FOR PASS 2 AND TURN OFF FLAG
	TLO	IO,IOPALL	;PUT THESE BACK
	TLZ	IO,IOPROG!IOCREF!DEFCRS!IONCRF	;[141] SO LISTINGS WILL BE THE WAY THEY SHOULD
	TLNN	FR,R1BSW
	JRST	STOWI
	MOVE	CS,[XWD $ST-1-$CKSM,R1BLDR]
	MOVE	C,0(CS)
	PUSHJ	PP,PTPBIN
	AOBJN	CS,.-2
	PUSHJ	PP,R1BI
	JRST	STOWI
	
R1BLDR:
	PHASE	0
	IOWD	$ADR,$ST
$ST:	CONO	PTR,60
	HRRI	$A,$RD+1
$RD:	CONSO	PTR,10
	JRST	.-1
	DATAI	PTR,@$TBL1-$RD+1($A)
	XCT	$TBL1-$RD+1($A)
	XCT	$TBL2-$RD+1($A)
$A:	SOJA	$A,
$TBL1:	CAME	$CKSM,$ADR
	ADD	$CKSM,1($ADR)
	SKIPL	$CKSM,$ADR
$TBL2:	JRST	4,$ST
	AOBJN	$ADR,$RD
$ADR:	JRST	$ST+1
$CKSM:	
	DEPHASE

IF2,<	PURGE	$ST,$RD,$A,$TBL1,$TBL2,$ADR,$CKSM>
ENDP2:	PUSHJ	PP,COUTD	;DUMP THE BUFFER
	MOVE	AC0,LOCO	;CHECK TO SEE IF LIT DIFFERED
	SKIPN	MODO		;AND USE SMALLER SINCE AT END
	JRST	[CAMN	AC0,ABSHI
		HRRZM	AC2,ABSHI
		JRST	ENDP2W]
	SKIPE	HHIGH		;SKIP IF NOT TWO SEGMENTS
	JRST	[CAMN	AC0,HHIGH
		HRRZM	AC2,HHIGH
		JRST	ENDP2W]
	CAMN	AC0,HIGH
	HRRZM	AC2,HIGH
ENDP2W:
IFN POLISH,<
	MOVE	AC1,SGNCUR
	CAMN	AC0,HIGH
	HRRM	AC2,SGATTR(AC1)
>
REPEAT 1,<TLNE	IO,IOCREF	;CLOSE CREF IF NECESSARY>
REPEAT 0,<TLNE	FR,CREFSW	;IF CREFFING
	JRST	ENDP2Q
	MOVEI	SDEL,0
	PUSH	PP,DBUF+3	;SO NO PAGE INFO
	DPB	SDEL,[POINT 7,DBUF+3,13]
	IOR	ER,OUTSW	;MAKE SURE OF OUTPUT
	PUSHJ	PP,CREF
	MOVEI	C,20		;CODE FOR TITLE
	PUSHJ	PP,OUTLST
	PUSH	PP,IO		;SAVE THIS
	TLZ	IO,IOPAGE	;AND PREVENT PAGE DURING TITLE
	MOVEI	CS,TBUF
	PUSHJ	PP,OUTAS0
	MOVEI	CS,VBUF
	PUSHJ	PP,OUTAS0
	POP	PP,IO		;RESTORE THE IO WORD
	POP	PP,DBUF+3>	;NEEDS FIX TO CREF
	PUSHJ	PP,CLSCR2	;CLOSE IT UP
ENDP2Q:	HRR	ER,OUTSW	;SET OUTPUT SWITCH
	SKIPN	TYPERR
	TRO	ER,TTYSW
	PUSHJ	PP,UOUT		;OUTPUT UNDEFINEDS
	TRO	ER,TTYSW
	OUTPUT	CTL,		;CLEAR JUNK OUT OF BUFFER
	SKPINC	C		;SEE IF WE CAN INPUT A CHAR.
	  JFCL			;BUT ONLY TO DEFEAT ^O
	SKIPG	C,QERRS		;ANY Q ERRORS SEEN?
	JRST	ENDPER		;NO, TRY REAL ERRORS
	PUSHJ	PP,OUTCR	;NEW LINE
	MOVEI	C,"%"		;WARNING CHARACTER
	PUSHJ	PP,OUTL
	MOVE	C,QERRS		;GET COUNT
	CAIN	C,1		;1 IS SPECIAL
	JRST	ONERQ
	PUSHJ	PP,DNC		;OUTPUT IT
	SKIPA	CS,[EXP ERRMQ2]
ONERQ:	MOVEI	CS,ERRMQ1
	PUSHJ	PP,OUTSIX
ENDPER:	SKIPG	C,ERRCNT	;GET ERROR COUNT AND CHECK FOR POSITIVE
	JRST	NOERW		;PRINT NO ERROR MESSAGE
IFN CCLSW,<ADDM C,.JBERR	;REMEMBER ERROR COUNT FOR EXECUTION DELETION>
	PUSHJ	PP,OUTCR
	MOVEI	C,"?"		;? FOR BATCH
	PUSHJ	PP,OUTL		;...
	MOVE	C,ERRCNT	;PRINT NUMBER OF ERRORS
	CAIN	C,1		;1 IS A SPECIAL CASE
	JRST	 ONERW		;PRINT MESSAGE
	PUSHJ	PP,DNC
	SKIPA	CS,[EXP ERRMS1]	;LOAD TO PRINT
ONERW:	MOVEI	CS,ERRMS2	;ONE ERROR DETECTED
ONERW1:	PUSHJ	PP,OUTSIX	;PRINT
	JRST	ENDP2A

NOERW:	SKIPE	QERRS		;IF "Q" ERRORS
	PUSHJ	PP,OUTCR	;CLOSE LINE NOW
	MOVEI	CS,ERRMS3
IFN CCLSW,<TLNE IO,CRPGSW!MFLSW	;IF RPG, DON'T PRINT MESSAGE>
IFE CCLSW,<TLNE	IO,MFLSW	;NOR IF MULTI-FILE MODE>
	TRZ	ER,TTYSW	;NO TTY OUTPUT
	IOR	ER,OUTSW	;UNLESS NEEDED FOR LISTING
	SKIPN	QERRS		;ALREADY DONE
	PUSHJ	PP,OUTCR
	JRST	ONERW1
ENDP2A:	PUSHJ	PP,OUTCR
	TLNN	IO,MFLSW	;IN A MULTI-PROG FILE?
	JRST	ENDP2D		;NO
	SKIPN	QERRS		;ANY WARNINGS?
	SKIPE	ERRCNT		;ANY ERROR?
	PUSHJ	PP,[MOVEI CS,[ASCIZ /PROGRAM	/]
		PUSHJ PP,OUTAS0		;YES,SO PRINT MESSAGE
		MOVEI	CS,TBUF		;AND TITLE
		PUSHJ PP,OUTAS0		;FOR IDENTIFICATION
		JRST	OUTCR]		;AND A CR-LF
	TRZA	ER,TTYSW	;NO MORE OUTPUT NOW
ENDP2D:
IFN CCLSW,<TLNE IO,CRPGSW	;IF RPG, DON'T PRINT PGM BREAK
	TRZ	ER,TTYSW	;...>
IFE CCLSW,<	SKIPA		;SO PRGEND CODE CAN WORK>
	IOR	ER,OUTSW	;...
	PUSHJ	PP,OUTCR
	MOVEI	CS,[SIXBIT /HI-SEG. BREAK IS @/]
	SKIPN	HHIGH		;DON'T PRINT IF ZERO
	JRST	ENDP2C		;IT WAS
	PUSHJ	PP,OUTSIX
	HRLO	CS,HHIGH	;GET THE BREAK
	PUSHJ	PP,ONC1
	PUSHJ	PP,OUTCR
ENDP2C:	MOVEI	CS,[SIXBIT /PROGRAM BREAK IS @/]
	PUSHJ	PP,OUTSIX	;OUTPUT PROGRAM BREAK
	HRLO	CS,SGATTR	;GET PROGRAM BREAK
	PUSHJ	PP,ONC1
	PUSHJ	PP,OUTCR
IFN POLISH,<
	SKIPN	AC1,SGNMAX	;GET PSECT CNT
	JRST	ENDP2E		;PSECTS NOT USED?
	MOVEI	AC2,1
ENDP2F:	MOVEI	CS,[SIXBIT /PSECT   BREAK IS @/]
	PUSHJ	PP,OUTSIX	;OUTPUT PSECT BREAK
	HRLO	CS,SGATTR(AC2)	;GET PSECT BRK
	PUSHJ	PP,ONC1
	MOVE	CS,[SIXBIT / FOR  /]
	MOVEM	CS,SGLIST
	MOVE	CS,SGNAME(AC2)	;GET PSECT NAME
	MOVEM	CS,SGLIST+1
	MOVSI	CS,SIXBIT/   @  /
	MOVEM	CS,SGLIST+2
	MOVEI	CS,SGLIST
	PUSHJ	PP,OUTSIX
	PUSHJ	PP,OUTCR
	AOS	AC2
	SOJG	AC1,ENDP2F	;LOOP THRU PSECT.S
ENDP2E:>
	HRRZ	CS,ABSHI	;GET ABS. BREAK
	CAIG	CS,140		;ANY ABS. CODE
	JRST	ENDP2B		;NO, SO DON'T PRINT
	MOVEI	CS,[SIXBIT /ABSLUTE BREAK IS @/]
	PUSHJ	PP,OUTSIX
	HRLO	CS,ABSHI
	PUSHJ	PP,ONC1
	PUSHJ	PP,OUTCR
ENDP2B:	MOVEI	CS,[SIXBIT /CPU TIME USED @/]
	PUSHJ	PP,OUTSIX	;[234] PRINT THE TIME IT TOOK TO ASSEMBLE
	SETZ	C,		;[234] SO AS TO GET THE RIGHT TIME
	RUNTIM	C,		;[234] GET THE TIME NOW
	SUB	C,RTIME		;[234] MINUS TIME WHEN STARTED
	IDIVI	C,^D1000	;[234] GET MS.
	PUSH	PP,C+1		;[234] SAVE
	IDIVI	C,^D60		;[234] GET SEC. IN C+1, MIN. IN C
	PUSH	PP,C+1		;[234] SAVE SECONDS
	IDIVI	C,^D60		;[234] GET HOURS IN C, MINS. IN C+1
	PUSH	PP,C+1		;[234] SAVE MINS
	JUMPE	C,NOHOUR	;[234] SKIP IF LESS THAN 1 HOUR
	PUSHJ	PP,DNC		;[234] PRINT HOURS
	MOVEI	C,":"		;[234] SEPARATOR
	PUSHJ	PP,OUTC		;[234]
NOHOUR:	POP	PP,CS		;[234] GET MINS
	PUSHJ	PP,DECPT2	;[234] PRINT THEM
	MOVEI	C,":"		;[234]
	PUSHJ	PP,OUTC		;[234]
	POP	PP,CS		;[234] A LITTLE DIFFERENT FOR MS
	PUSHJ	PP,DECPT2	;[234] PRINT SECONDS
	MOVEI	C,"."		;[234] A POINT FOR MS.
	PUSHJ	PP,OUTC		;[234]
	POP	PP,CS		;[234] GET MS.
	PUSHJ	PP,DECPT3	;[234] PRINT MS.
	PUSHJ	PP,OUTCR	;[234] AND A CRLF
	TLNE	FR,RIMSW!R1BSW	;RIM MODE?
	PUSHJ	PP,RIMFIN	;YES, FINISH IT
IFN CCLSW,<TLNN	IO,CRPGSW!MFLSW	;IF NOT IN CCL MODE>
IFE CCLSW,<TLNN	IO,MFLSW	;NOR IF IN MULTI-FILE MODE>
	TRO	ER,TTYSW	;PRINT SIZE
	PUSHJ	PP,OUTCR
	MOVE	C,.JBREL
IFN TENEX,<
	SUB	C,SYMBOL	;[206] ONLY COUNT WHATS REALLY IN USE
	ADD	C,FREE		;[206] EITHER SYMBOLS OR STORAGE
	LSH	C,-9		;[206] IN PAGES
>
IFE TENEX,<
	LSH	C,-^D10
>
	ADDI	C,1
	PUSHJ	PP,DNC
IFE TENEX,<
	MOVEI	CS,[SIXBIT /K CORE USED@/]
>
IFN TENEX,<
	MOVEI	CS,[SIXBIT /  PAGES USED@/]
>
	PUSHJ	PP,OUTSIX
	PUSHJ	PP,OUTCR	
	HRR	ER,OUTSW
	PUSHJ	PP,OUTSET
	XWD	10,LSOUT	;OUTPUT THE LOCALS (..-10)
IFN POLISH,<
	SETZM	SGNCUR		;SET TO BLANK PSECT
	SKIPN	SGNMAX		;WERE PSECTS USED?
	JRST	ENDP2H		;NO
ENDP2G:	PUSHJ	PP,SRCHI	;SET UP SRCHX,SGSBOT,SGSTOP
	PUSHJ	PP,SGOUTL	;OUTPUT PSECT LENGTH BLOCK
ENDP2H:
>
	PUSHJ	PP,OUTSET
	XWD	2,SOUT		;OUTPUT THE SYMBOLS (BLKTYP-2)
IFN POLISH,<
	AOS	SX,SGNCUR	;INCR PSECT INX
	CAMG	SX,SGNMAX	;LAST PSECT DONE?
	JRST	ENDP2G		;NO, DO NEXT PSECT
	SETZM	SGNCUR		;SET TO BLANK PSECT
	PUSHJ	PP,OUTSET	;[164]
	XWD	11,POUT		;[164] OUTPUT THE POLISH (..-11)
	MOVSI	SX,(POINT 2)	;[164] RESET BYTE COUNT
	HLLM	SX,COUTP	;[164] AFTER END OF POLISH
>
	PUSHJ	PP,OUTSET
	XWD	7,VOUT		;OUTPUT TRANSFER VECTOR (..-7)
	PUSHJ	PP,OUTSET
	XWD	5,HOUT		;OUTPUT HIGHEST RELOCATABLE (..-5)
	PUSHJ	PP,COUTD
	TLNN	IO,MFLSW	;IS IT PRGEND?
	JRST	FINIS		;ALAS, FINISHED
	MOVEI	CS,SBUF		;RESET SBUF POINTER
	HRRM	CS,SUBTTX	;TO SUBTTL
	SETZM	PASS2I		;CLEAR PASS2 VARIABLES
	MOVE	[XWD PASS2I,PASS2I+1]
	PUSH	PP,PAGENO	;SAVE PAGE NUMBER IN CASE PRGEND
	BLT	PASS2Z-1	;BUT NOT ALL OF VARIABLES
	POP	PP,PAGENO	;RESTORE IT
;	JRST	INZ		;RE-INITIALIZE FOR NEXT PROG
				; FALL THROUGH
SUBTTL	PASS INITIALIZE

INZ:	SETZ	C,		;[234] GET CURRENT JOB NUMBER
	RUNTIM	C,		;[234] GET RUNTIME FOR LATER
	MOVEM	C,RTIME		;[234] SAVE
INZ1:	AOS	MODA
	AOS	MODO
IFN POLISH,<
	MOVE	AC1,SGNMAX
	MOVSI	AC0,1
	MOVEM	AC0,SGRELC(AC1)
	SOJGE	AC1,.-1
	MOVE	AC1,SGNMAX	;[265] GET HIGHEST PSECT USED
	PUSH	PP,AC1		;[265] SAVE IT
INZ2:	CAME	AC1,SGNCUR	;[265] IF NOT CURRENT
	PUSHJ	PP,%SWSEG	;[265] SWAP IT
>
	MOVEI	VARHD
	MOVEM	VARHDX
	MOVEI	LITHD
	MOVEM	LITHDX
	PUSHJ	PP,LITI
IFN POLISH,<
	SOSL	AC1,0(PP)	;[265] DONE YET?
	JRST	INZ2		;[265] NO
	POP	PP,AC1		;[265] GET JUNK OFF STACK
>
	SETZM	SEQNO
	HRRI	RX,^D8
	PUSHJ	PP,STOWI
IFN FORMSW,<
	HRRES	HWFMT		;SET DEFAULT VALUE BACK>
	JRST	OUTLI

RCPNTR:	POINT	1,ARG,^L<RELF>-18	;POINT 1,ARG,22
;[234] ROUTINE TO PRINT CPU TIME USED

DECPT3:	MOVEI	C,"0"		;[234] FILL WITH ZERO
	CAIG	CS,^D99		;[234] 3 DIGITS?
	PUSHJ	PP,OUTC		;[234] NO
DECPT2:	MOVEI	C,"0"		;[234] FILL WITH ZERO
	CAIG	CS,^D9		;[234] 2 DIGITS?
	PUSHJ	PP,OUTC		;[234] NO
	MOVE	C,CS		;[234] GET VALUE
	PJRST	DNC		;[234] OUTPUT IN DECIMAL AND RETURN

RIMFIN:	TLNE	FR,R1BSW
	PUSHJ	PP,R1BDMP
	SKIPN	C,VECTOR
	MOVSI	C,(JRST 4,)
	TLNN	C,777000
	TLO	C,(JRST)
	PUSHJ	PP,PTPBIN
	MOVEI	C,0
	JRST	PTPBIN
SUBTTL	PSEUDO-OP HANDLERS

IFN FT.U01,<	;USER PUSH-DOWN LIST
$PDUSR:	PUSH	PP,AC0		;SAVE INSTR FOR LATER
	PUSHJ	PP,GETSYM	;GET SIXBIT SYMBOL TO PUSH/POP
	 JRST	[TRO	ER,ERRA	;NO SYMBOL--FLAKY STATEMENT
		POP	PP,AC0	;KEEP THE STACK HONEST
		POPJ	PP,]	;GIVE UP WITH ERROR FLAG SET
	PUSHJ	PP,SSRCH	;LOOKUP THE SYMBOL
	 JRST	[TRO	ER,ERRU	;SYMBOL MUST BE DEFINED TO PUSH IT
		POP	PP,AC0	;CLEAR PDL
		POPJ	PP,]	;GIVE UP
	POP	PP,AC0		;RESTORE INSTR
	TLNN	AC0,(1B7)	; POP?
	JRST	$PDUS1		; NOPE, DON'T CHECK FOR UNDERFLOW
	HRRZ	AC1,$USRPD	; GET CURRENT STACK POINTER
	CAIGE	AC1,$USSTK	; IS THE STACK EMPTY?
	JRST	[TRO	ER,ERRA	;YES GIVE AN ERROR
		POPJ	PP,]	; GIVE UP WITH AN ERROR
$PDUS1:	MOVE	AC1,$USRPD	;PICK UP USER PDP
	TLO	AC0,(<AC1>B12)	;PUT LOCATION OF PDP IN INSTR
	HRRI	AC0,V		;SET LOCATION OF DATA
	XCT	AC0		;PUSH/POP THE SYMBOL
	MOVEM	AC1,$USRPD	;SAVE PDP FOR LATER
	TLNE	AC0,(1B7)	;WAS THIS A PUSH?
	 PUSHJ	PP,UPDATE	;NO--RESET VALUE OF SYMBOL
	CAIN	C,','		;ANOTHER SYMBOL COMING?
	 JRST	$PDUSR		;YES--GO HANDLE IT
	POPJ	PP,		;NO--GET NEXT STATEMENT
>;END IFN FT.U01

TAPE0:	PUSHJ	PP,STOUTS	;FINISH THIS LINE
	SETZM	EOFFLG		;[417]CLEAR END OF FILE FLAG
	PUSHJ	PP,PEEK		;[221] LOOK AT NEXT CHARACTER
	CAIE	C,VT		;[221] PRINT IF V TAB
	CAIN	C,FF		;[221] OR FORM FEED
	PUSHJ	PP,STOUTS	;[221]
	TLZ	IO,IORPTC	;[221] CLEAR CHARACTER FROM LOOK-AHEAD
	PUSHJ	PP,OUTLI2	;[221] AND FROM LINE BUFFER
	SKIPE	EOFFLG		;[417]IF EOF SEEN DURING PEEKING
	POPJ	PP,		;[417]DON'T SKIP ANOTHER FILE, ELSE
	JRST	GOTEND		;IGNORE THE REST OF THIS FILE

%NOBIN:	TLZE	FR,PNCHSW	;IS REL FILE OPEN?
	CLOSE	BIN,40		;YES, GET RID OF IT
	POPJ	PP,

RADIX0:	PUSHJ	PP,EVAL10	;EVALUATE RADIX D10
	CAIG	AC0,^D10	;IF GREATER THAN 10
	CAIG	AC0,1		;OR LESS THAN 2,
ERRAX:	TROA	ER,ERRA		;FLAG ERROR AND SKIP
	HRR	RX,AC0		;SET NEW RADIX
	POPJ	PP,


XALL0:	JUMP1	POPOUT		;IGNORE ON PASS 1
	TLZN	IO,IOSALL	;TURN OFF MACRO SUPPRESS ALL
	JRST	IOSET		;NOT SALL ON SO NOTHING TO WORRY ABOUT
	CAIE	C,EOL		;END OF LINE SEEN?
	JRST	XALL1		;NO
	LDB	C,LBUFP		;GET LAST CHARACTER
	CAIN	C,CR		;UNDER SPECIAL CIRCUMSTANCES IT GETS REMOVED
	JRST	XALL1		;[236] NO, ALL IS WELL
	SOSG	CPL		;ANY ROOM?
	PUSHJ	PP,RSW5		;[254] NO, SEE IF ANY EXCESS IN IT
	MOVEI	C,CR		;NOW FOR TERMINAYOR
	IDPB	C,LBUFP		;WILL GET REMOVED LATER
XALL1:	PUSHJ	PP,IOSET	;[236] FINISH OFF LINE
	TRNN	SX,IOPALL	;[236] WAS IT XALL OR XLIST?
	TLO	IO,IOSALL	;[236] IT WAS XLIST
	POPJ	PP,		;[236]

IOSET:	JUMP1	POPOUT		;NOSYM (IONSYM), XALL (IOPALL), XLIST (IOPROG)
	HLRZ	SX,AC0		;STORE FLAGS
	PUSHJ	PP,STOUTS	;POLISH OFF LINE
	TLO	IO,0(SX)	;NOW SUPRESS PRINTING
	POPJ	PP,

IORSET:	TDZ	IO,AC0		;RESET  FLAG IOPALL/IOPROG
	POPJ	PP,

IOLSET:	JUMP1	POPOUT		;[327] SPECIAL FOR LALL, TO SEE IF IN MACRO UNDER SALL
	TLNE	IO,IOSALL	;[327] SEE IF SALL
	JUMPN	MRP,IOLSE1	;[327] AND IN MACRO
	TDZ	IO,AC0		;[327] NO, CHANGE TO LALL
	POPJ	PP,		;[327] AND RETURN

IOLSE1:	PUSHJ	PP,STOUTS	;[327] LALL UNDER MACRO, CLEAR REST OF LINE
	TLZ	IO,IOSALL!IOPALL	;[327] ****** SET TO LALL
	PUSHJ	PP,OUTIM	;[327] FORCE A CRLF
	POPJ	PP,		;[327] AND RETURN

BLOCK0:	PUSHJ	PP,HIGHQ
	PUSHJ	PP,EVALEX	;EVALUATE
	TLNE	AC0,-1		;[233] SEE IF VALID ARG TYPE
	JRST	ERRAX		;[233] NO, GIVE ERROR
	TRZE	RC,-1		;EXTERNAL OR RELOCATABLE?
	PUSHJ	PP,QEXT		;YES, DETERMINE TYPE
	ADDM	AC0,LOCO	;UPDATE ASSEMBLY LOCATION
BLOCK1:	EXCH	AC0,LOCA	;SAVE START OF BLOCK
	ADDM	AC0,LOCA	;UPDATE OUTPUT LOCATION
BLOCK2:	HRLOM	AC0,LOCBLK
	JUMP2	POPOUT
	TRNE	ER,ERRU
	TRO	ER,ERRV
	POPJ	PP,
PRNTX0:	TRO	ER,TTYSW	;SET OUTPUT TO TTY
	JUMP2	PRNTX2		;PASS1?
	TDOA	ER,OUTSW	;YES,OUTPUT TO LSTDEV ALSO
PRNTX2:	ANDCM	ER,OUTSW	;NO,DON'T OUTPUT TO TTY IF IT IS LSTDEV
	BYPASS			;GET FIRST CHAR.
	TLOA	IO,IORPTC	;REPEAT IT AND SKIP
PRNTX4:	PUSHJ	PP,PRINT	;PRINT THE CHAR.
	PUSHJ	PP,CHARAC	;GET ASCII CHAR.
	CAIG	C,CR		;IF GREATER THAN CR
	CAIG	C,HT		;OR LESS THAN LF
	JRST	PRNTX4		;THEN CONTINUE
	PUSHJ	PP,OUTCR	;OUTPUT A CRLF
	TRZA	ER,TTYSW!LPTSW	;TURN OF OUTPUT
CPOPJ1:	AOS	(PP)		;USEFUL TAG HAS TO GO SOMEWHERE
CPOPJ:	POPJ	PP,		;EXIT

REMAR0:	PUSHJ	PP,GETCHR	;GET A CHARACTER
REMAR1:	CAIE	C,EOL
	JRST	REMAR0
	POPJ	PP,		;EXIT

PAGE0:	PUSHJ	PP,STOUTS	;[161] PAGE PSEUDO-OP

PAGE1:	TLNE	IO,IOCREF	;[161] CURRENTLY DOING CREF?
	TLNE	IO,IOPROG	;[161] AND NOT XLISTED?
	JRST	PAGE2		;[161] NO
	HRR	ER,OUTSW	;[161]
	PUSHJ	PP,CLSCRF	;[161]
	PUSHJ	PP,OUTCR
	HRRI	ER,0		;[161]
PAGE2:	TLO	IO,IOPAGE	;[161]
	POPJ	PP,		;[161]
LIT0:	PUSHJ	PP,BLOCK1
	PUSHJ	PP,STOUTS
LIT1:	JUMP2	LIT20

;ON PASS ONE, WE JUST STEP THE LOCATION COUNTER AND CLEAR

	MOVE	AC0,LITCNT
	MOVE	SX,LITHDX
	HRLM	AC0,0(SX)
	MOVE	V,LOCA
	HRL	V,MODA
	MOVEM	V,-1(SX)
	JRST	LIT24

LIT20:	PUSH	PP,LOCA
	PUSH	PP,LOCO
	SKIPN	LITNUM
	JRST	LIT20A
	MOVE	SX,LITHDX
	HRRZ	AC0,-1(SX)
	CAME	AC0,LOCA
	TRO	ER,ERRP
LIT20A:	MOVE	SX,LITAB
LIT21:	SOSGE	LITNUM
	JRST	LIT22
IFN FORMSW,<
	MOVE	AC0,-3(SX)
	MOVEM	AC0,FORM
>
	MOVE	AC0,-2(SX)	;WFW
	MOVE	RC,-1(SX)	;WFW
	MOVE	 SX,(SX)	;WFW POINTER TO THE NEXT LIT
	PUSHJ	PP,STOW20	;STOW CODE
	MOVEI	C,12		;SET LINE FEED
	IDPB	C,LBUFP
	PUSHJ	PP,OUTLIN	;OUTPUT THE LINE
	JRST	LIT21
LIT22:	HRRZ	AC2,LOCO
	POP	PP,LOCO
	POP	PP,LOCA
	MOVE	SX,LITHDX
	HLRZ	AC0,0(SX)
	SUB	AC2,LOCO	;COMPUTE LENGTH USED
	CAMGE	AC0,AC2		;USE LARGER
	MOVE	 AC0,AC2
	ADD	AC2,LOCO
LIT24:	ADDM	AC0,LOCA
	ADDM	AC0,LOCO
	PUSHJ	PP,GETTOP
	HRRM	SX,LITHDX
LITI:	SETZM	LITCNT
	SETZM	LITNUM
	MOVEI	LITAB
	MOVEM	LITABX
	JRST	HIGHQ

GETTOP:	HRRZ	AC1,SX		;VARHD
	HRRZ	SX,0(SX)
	JUMPN	SX,POPOUT
IFE FORMSW,<	MOVEI	SX,3	;WFW>
IFN FORMSW,<	MOVEI	SX,4	;ICC>
	ADDB	SX,FREE
	CAML	SX,SYMBOL
	PUSHJ	PP,XCEED
	SUBI	SX,1		;MAKE SX POINT TO LINK
	SETZM	0(SX)		;CLEAR FORWARD LINK
	HRRM	SX,0(AC1)	;STORE ADDRESS IN LAST LINK
	POPJ	PP,
VAR0:	PUSHJ	PP,BLOCK1	;PRINT LOCATION
	PUSHJ	PP,VARA
	JRST	STOUTS

VARA:	MOVE	SX,VARHDX
	MOVE	AC0,LOCA	;GET LOCATION FOR CHECK
	JUMP1	VARB		;DO NOT CHECK START ON PASS 1
	CAME	AC0,-1(SX)	;CHECK START OF VAR AREA
	TRO	ER,ERRP		;AND GIVE ERROR
VARB:	MOVEM	AC0,-1(SX)	;SAVE START FOR PASS 2
	HLRZ	AC0,0(SX)
	ADDM	AC0,LOCA
	ADDM	AC0,LOCO
	PUSHJ	PP,GETTOP
	HRRM	SX,VARHDX
	JUMP2	POPOUT

	PUSHJ	PP,LOOKUP	;SET FOR TABLE SCAN
	TRZN	ARG,VARF
	POPJ	PP,		;NO, EXIT
	TRZ	ARG,UNDF	;TURN OFF FLAG NOW
	MOVSI	AC0,1(V)	;NUMBER TO ADD TO
	ADDM	AC0,0(AC1)	;UPDATE COUNT
VARA1:	ADDI	V,1		;GET LENGTH OF DESIRED BLOCK
	ADDM	V,LOCO
	EXCH	V,LOCA
	ADDM	V,LOCA
	HRL	ARG,V		;GET STARTING LOCATION AND UPDAT PCS
	IOR	ARG,MODA	;SET TO ASSEMBLY MODE
	MOVSM	ARG,0(SX)	;UPDATE 2ND WRD OF SYM TAB ENTRY
	JRST	HIGHQ1
IF:	PUSH	PP,AC0		;SAVE AC0
	PUSH	PP,IO
	PUSHJ	PP,EVALXQ	;EVALUATE AND TEST EXTERNAL
	POP	PP,AC1
	IORI	ER,(AC1)	;[124] RESTORE PREVIOUS ERROR FLAGS
	JUMPL	AC1,IFPOP
	TLZ	IO,FLDSW
IFPOP:	POP	PP,AC1		;RETRIEVE SKIP INSTRUCTION
IFSET:	TLO	IO,IORPTC	;REPEAT CHARACTER
IFXCT:	XCT	AC1		;EXECUTE INSTRUCTION
IFXF:	TDZA	AC0,AC0		;FALSE
IFXT:	MOVEI	AC0,1		;TRUE
IFEXIT:	SETZM	EXTPNT		;JUST IN CASE
IFN POLISH,<
	TLZ	IO,RSASSW	;[265] ...
>
	JUMPOC	IFDO		;[140] BRANCH IF IN OP-CODE FIELD
IFEX1:	PUSHJ	PP,GETCHR	;SEARCH FOR "<"
	CAIN	C,EOL		;ERROR IF END OF LINE
	JRST	ERRAX
	CAIE	C,'<'
	JRST	IFEX1
	JUMPE	AC0,IFEX2	;TEST FOR 0
	TLO	IO,IORPTC	;NO, PROCESS AS CELL
	PUSHJ	PP,CELL
IFN FORMSW,<MOVE AC1,HWFORM	;USE STANDARD FORM>
	SETZM	INCND		;NOT ANY MORE
	JRST	STOW		;STOW CODE AND EXIT

IFDO:	BYPASS			;[140] GET NEXT NON-3LANK
	CAIN	C,EOL		;[272] AT EOL?
	JRST	 REPEA1		;[272] YES, USE OLD METHOD
	CAIE	C,','		;[260] ARE WE AT THE COMMA?
	CAIN	C,'<'		;[260] OR START OF CONDITIONAL?
	CAIA			;[260] YES
	JRST	IFDO		;[260] NOT YET AT COMMA OR ANGLE BRKT
	CAIN	C,','		;[260] IGNORE THE COMMA
	PUSHJ	PP,BYPAS1	;[140] AND GET SOMETHING ELSE
	TLO	IO,IORPTC	;[140] REPEAT LAST CHAR.
	CAIE	C,'<'		;[140] OLD METHOD USED ANGLES
	CAIN	C,EOL		;[140] ALSO OLD IF NEW LINE SEEN
	JRST	REPEA1		;[140] ASSEMBLE CODE BETWEEN ANGLES
	JUMPLE	AC0,REMAR0	;[140] FALSE, TREAT AS COMMENT
	JRST	STMNT		;[140] TRUE, ASSEMBLE IT

IFPASS:	HRRI	AC0,P1		;MAKE IT TLNX IO,P1
	MOVE	AC1,AC0		;PLACE IT IN AC1
	JRST	IFSET		;EXECUTE INSTRUCTION
IFB0:	HLLO	AC1,AC0		;FORM AND STORE TEST INSTRUCTION
IFB1:	PUSHJ	PP,CHARL	;GET FIRST NON-BLANK
	CAIE	C," "
	CAIN	C,"	"
	JRST	IFB1		;SKIP BLANKS AND TABS
	CAIG	C,CR		;CHECK FOR CARRET AS DELIM.
	CAIGE	C,LF
	CAIA
	JRST	ERRAX
	FORERR	(SX,CND)
	SETOM	INCND		;SAVE INFO. FOR PASS 1 ERRORS
	CAIN	C,"<"		;LEFT BRACKET?
	SETZB	C,RC		;YES, PREPARE FOR OLD FORMAT
	SKIPA	SX,C		;SAVE FOR COMPARISON
IFB3:	TRO	AC0,1		;SET FLAG
IFB2:	PUSHJ	PP,CHARL	;GET ASCII CHARACTER AND LIST
	CAMN	C,SX		;TEST FOR DELIMITER
	JRST	IFXCT		;FOUND
	CAIE	C," "		;BLANK?
	CAIN	C,"	"	;OR TAB?
	JRST	IFB2		;YES
	JUMPN	SX,IFB3		;JUMP IF NEW FORMAT
	CAIN	C,"<"		;<?
	AOJA	RC,IFB2		;YES, INCREMENT COUNT
	CAIN	C,">"		;>?
	SOJL	RC,IFXCT	;YES, DECREMENT AND EXIT IF DONE
	JRST	IFB3		;GET NEXT CHARACTER
IFDEF0:	HRRI	AC0,UNDF	;MAKE IT TLNX ARG,UNDF
	PUSH	PP,AC0		;STACK IT
	PUSHJ	PP,GETSYM	;TAKES SKIP RETURN IF SYM NAME IS LEGAL
	TROA	ER,ERRA		;ILLEGAL!
	PUSHJ	PP,SEARCH
	JRST	[PUSHJ	PP,OPTSCH
		TLO	ARG,UNDF
		JRST	.+1]
	PUSHJ	PP,SSRCH3	;EMIT TO CREF ANYWAY
	JRST	IFPOP		;POP AND EXECUTE INSTRUCTION
IFIDN0:	HLRZS	AC0
	MOVEI	V,2*.IFBLK-1
	SETZM	IFBLK(V)	;CLEAR COMPARISON BLOCK
	SOJGE	V,.-1
	SETZM	.TEMP		;CLEAR STORED DELIMETER
	MOVEI	RC,IFBLK	;SET FOR FIRST BLOCK
	PUSHJ	PP,IFCL		;GET FIRST STRING
	MOVEI	RC,IFBLKA
	PUSHJ	PP,IFCL		;GET SECOND STRING
	MOVEI	V,.IFBLK-1
	MOVE	SX,IFBLK(V)	;GET WORD FROM FIRST STRING
	CAMN	SX,IFBLKA(V)	;COMPARE WITH SECOND STRING
	SOJGE	V,.-2		;EQUAL, TRY NEXT WORD
	JUMPL	V,IFEXIT	;DID WE FINISH STRING
	XORI	AC0,1		;NO, TOGGLE REQUEST
	JRST	IFEXIT	;DO NOT TURN ON IORPTC WFW

IFCL:	PUSHJ	PP,CHARAC	;GET AND LIST CHARACTER
	CAIE	C," "		;SKIP SPACES
	CAIG	C,CR		;ALSO SKIP CR-LF
	CAIGE	C,HT		;AND TAB
	JRST	.+2		;NOT ONE OF THEM
	JRST	IFCL		;SO LONG COMPARISONS WILL WORK
;*** A CROCK SO THAT IFIDN <X>,<X>,<INST.> WILL WORK	***
	CAIE	C,","		;IS IT A COMMA?
	JRST	.+3		;NO
	SKIPN	.TEMP		;YES, WAS PREVIOUS FIELD OLD METHOD?
	JRST	IFCL		;YES, IGNORE COMMA AND SPACES
;	***
	CAIN	C,"<"		;WAS IT LEFT BRACKET?
	SETO	C,		;SIGNAL OLD METHOD, LOOK FOR RIGHT BRACKET
	MOVEM	C,.TEMP		;STORE TERMINATOR FOR COMPARISON
	MOVEI	SX,5*.IFBLK-1	;LIMIT SEARCH
	HRLI	RC,(POINT 7,,)	;SET UP BYTE IN RC
IFCLR:	PUSHJ	PP,CHARAC
	SKIPLE	.TEMP		;NEW METHOD?
	JRST	IFCLR1		;YES, IGNORE ANGLE BRACKET COUNTING
	CAIN	C,"<"		;ANOTHER LEFT ANGLE?
	SOS	.TEMP		;YES, KEEP COUNT
	CAIN	C,">"		;CLOSING ANGLE
	AOSGE	.TEMP		;MATCHING COUNT?
IFCLR1:	CAMN	C,.TEMP		;TEST FOR DELIMITER
	POPJ	PP,		;EXIT ON RIGHT DELIMITER
	SOJG	SX,.+2		;ANY ROOM IN COMPARISON BLOCK?
	TROA	ER,ERRA		;NO, FLAG ERROR BUT KEEP ON GOING
	IDPB	C,RC		;DEPOSIT BYTE
	JRST	IFCLR
IFEX2:	PUSHJ	PP,GETCHR
	CAIN	C,EOL		;EXIT WITH ERROR IF END OF LINE
	JRST	ERRAX
	CAIN	C,34		;"<"?
	AOJA	AC0,IFEX2	;YES, INCREMENT COUNT
	CAIE	C,36		;">"?
	JRST	IFEX2		;NO, TRY AGAIN
	SOJGE	AC0,IFEX2	;YES, TEST FOR MATCH
	BYPASS			;YES, MOVE TO NEXT DELIMITER
	SETZM	INCND		;OUT OF CONDITIONAL NOW
	AOJA	AC0,STOWZ1	;STOW ZERO


INTER0:	HLLZM	AC0,INTENT	;AC0 CONTAINS INTF/ENTF FLAGS
INTER1:	PUSHJ	PP,GETSYM	;GET A SYMBOL
	JRST	INTER3		;INVALID, SKIP
	PUSHJ	PP,SSRCH	;SEARCH THE TABLE
	  MOVSI	ARG,SYMF!INTF!UNDF
	PUSHJ	PP,SUPSYM	;[167] SEE IF "!" SEEN
	TLNN	ARG,UNDF	;ALLOW FORWARD REFERENCE
	TLNN	ARG,SYNF!EXTF
	TDOA	ARG,INTENT	;SET APPROPRIATE FLAGS
INTER3:	TROA	ER,ERRA		;FLAG ARG EROR AND SKIP
	PUSHJ	PP,INSERQ	;INSERT/UPDATE
	JUMPCM	INTER1
	SETZM	EXTPNT		;JUST IN CASE, SO AS NOT TO CONFUSE WORLD
IFN POLISH,<
	TLZ	IO,RSASSW	;[265] ...
>
	POPJ	PP,		;NO, EXIT
;.IF SYMBOL ATTRIBUTE

%IF:	PUSHJ	PP,GETSYM	;[271] GET THE SYMBOL
	  JRST	%IFNUMERIC	;[271] MIGHT WANT THIS ATTRIBUTE
	PUSHJ	PP,SEARCH	;[271] GENERAL SEARCH
	  JRST	IFXF		;[271] FAILED IF NOT IN TABLE
	TLO	IO,IORPTC	;[271] GET FIRST CHAR
	PUSHJ	PP,GETSYM	;[271] GET ATTRIBUTE
	  JRST	ERRAX		;[271] MUST BE A SYMBOL
	SETO	AC1,		;[271] MASK
IFLOOP:	MOVSI	AC2,-IFLEN	;[271] AOBJN PTR
	MOVE	SDEL,IFATAB(AC2);[271] GET NAME
	AND	SDEL,AC1	;[271] MASK
	CAMN	AC0,SDEL	;[271] MATCH
	JRST	IFOUND		;[271] GOT IT
	AOBJN	AC2,IFLOOP+1	;[271] LOOP
	JUMPGE	AC1,ERRAX	;[271] NOT IN TABLE
	TDNN	AC0,AC1		;[271] SET MASK
	JRST	IFLOOP		;[271] SET
	LSH	AC1,-6		;[271] TRY NEXT CHAR
	JUMPN	AC1,.-3		;[271] TRY AGAIN
	HALT			;[271] ?

IFOUND:	XCT	IFJTAB(AC2)	;[274]
	  JRST	IFXF		;[271] FALSE
	JRST	IFXT		;[271] TRUE

DEFINE IFATRIB <
XX	SYMBOL,<TLNN	ARG,SYMF>
XX	SYNONYM,<TLNN	ARG,SYNF>
XX	MACRO,<TLNN	ARG,MACF>
XX	OPDEF,<TLNN	ARG,OPDF>
XX	EXTERNAL
XX	ENTRY,<TLNN	ARG,ENTF>
XX	INTERNAL
XX	GLOBAL
XX	LOCAL
XX	LABEL,<TLNN	ARG,TAGF>
XX	ASSIGNMENT
XX	ABSOLUTE,<TLNE	ARG,LELF!RELF>
XX	RELOCATABLE,<TLNN	ARG,LELF!RELF>
XX	LRELOCATABLE,<TLNN	ARG,LELF>
XX	RRELOCATABLE,<TLNN	ARG,RELF>
XX	NUMERIC,JFCL
>

DEFINE XX (A,B)<
	<SIXBIT /A/>
>
IFATAB:	IFATRIB
IFLEN==.-IFATAB

DEFINE XX (A,B)<
 IFB <B>,<
	PUSHJ	PP,%IF'A
>
 IFNB <B>,<
	B
>>
IFJTAB:	IFATRIB

%IFEXTERNAL:
	TLNE	ARG,EXTF	;[271] ENTERNAL?
	AOS	(PP)		;[271] YES
	POPJ	PP,

%IFINTERNAL:
	TLNN	ARG,EXTF!SPTR	;[271] EXTERN?
	AOS	(PP)
	POPJ	PP,

%IFGLOBAL:
	TLNE	ARG,EXTF!INTF!ENTF
	AOS	(PP)
	POPJ	PP,

%IFLOCAL:
	TLNN	ARG,EXTF!SPTR
	AOS	(PP)
	POPJ	PP,

%IFASSIGNMENT:
	TLNE	ARG,SYMF
	TLNE	ARG,TAGF
	POPJ	PP,
	JRST	CPOPJ1

%IFNUMERIC:
	TLNE	IO,NUMSW	;[271] MUST BE NUMERIC
	PUSHJ	PP,GETSYM	;[271] GET ATTRIBUTE
	  JRST	ERRAX		;[271] ERROR
	SETO	AC1,		;[271] MASK
	TDNN	AC0,AC1		;[271] SET IT UP
	JRST	.+3		;[271] DONE
	LSH	AC1,-6
	JRST	.-3		;[271] TRY AGAIN
	MOVE	SDEL,['NUMERI']	;[271] ONLY VALID ONE
	AND	SDEL,AC1	;[271] MASK OUT ONES WE DON'T CARE ABOUT
	CAMN	AC0,SDEL	;[271] MATCH?
	AOS	(PP)		;[271] TRUE
	POPJ	PP,
;ASSIGN PSEUDO-OP FOR TENEX
;ASSIGN SYM1,SYM2,INCR

ASGN:	PUSHJ	PP,COUTD	;DUMP BUFFER
	PUSH	PP,BLKTYP	;SAVE BLOCK TYPE
	MOVEI	AC0,100		;ASSIGN BLOCK TYPE
	MOVEM	AC0,BLKTYP

	PUSHJ	PP,GETSYM	;HERE TO ASGN6 COPIED FROM EXTERN
	JRST	ASGN2
	TLO	IO,DEFCRS	;FLAG AS DEFINITION
	PUSHJ	PP,SSRCH
	JRST	ASGN1
	TLNN	ARG,EXTF!VARF!UNDF
	JRST	ASGN2
	TLNE	ARG,EXTF
	JRST	[JUMP1	ASGN6
		TLZN	ARG,UNDF
		JRST	ASGN6
		ANDM	ARG,(SX)
		JRST	ASGN1]
ASGN1:	MOVEI	V,2
	ADDB	V,FREE
	CAML	V,SYMBOL
	PUSHJ	PP,XCEEDS
	SUBI	V,2
	SETZB	RC,0(V)
	MOVSI	ARG,SYMF!EXTF
	PUSHJ	PP,INSERT
	MOVSI	ARG,PNTF
	IORM	ARG,0(SX)
	MOVE	AC0,-1(SX)
	MOVEM	AC0,1(V)
ASGN6:	MOVE	AC0,-1(SX)
	SETZ	ARG,
	PUSHJ	PP,SQOZE	;CONVERT TO SQUOZE
	PUSHJ	PP,COUT		;OUTPUT FIRST SYMBOL
	JUMPNC	ASGN2		;MUST BE COMMA HERE
	PUSHJ	PP,GETSYM	;SECOND SYMBOL
	JRST	ASGN2
	MOVEI	SDEL,%SYM	;OUTPUT	TO CREF
	PUSHJ	PP,CREF
	SETZ	ARG,
	PUSHJ	PP,SQOZE	;CONVERT TO SQUOZE
	PUSHJ	PP,COUT
	JUMPNC	ASGN3		;COMMA?
	PUSHJ	PP,EVALXQ	;YES, EVALUATE INCREMENT
ASGN4:	PUSHJ	PP,COUT
	JUMP1	ASGN7		;DON'T OUTPUT IF PASS1
	PUSHJ	PP,COUTD	;OUTPUT 3 WORDS
ASGN5:	POP	PP,BLKTYP	;RESTORE BLOCK TYPE
	POPJ	PP,

ASGN3:	MOVEI	AC0,1		;INCREMENT IS 1 IF NOT SPECIFIED
	JRST	ASGN4

ASGN2:	TRO	ER,ERRE		;INDICATE
ASGN7:	PUSHJ	PP,COUTI	;CLEAR OUTPUT BUFFER
	JRST	ASGN5
EXTER0:	PUSHJ	PP,GETSYM	;GET A SYMBOL
	JRST	EXTER4		;INVALID, ERROR
EXTER1:	TLO	IO,DEFCRS	;FLAG THIS AS A DEFINITION
EXTER5:	PUSHJ	PP,SSRCH	;[267] OK, SEARCH SYMBOL TABLE
	JRST	EXTER2		;NOT THERE, INSERT IT
	TLNN	ARG,EXTF!VARF!UNDF
	TROA	ER,ERRE		;FLAG ERROR AND BYPASS
	TLNE	ARG,EXTF	;VALID, ALREADY DEFINED?
	JRST	[JUMP1	EXTER3		;YES, BYPASS
		TLZN	ARG,UNDF	;SKIP IF UNDEFINED ALSO
		JRST	EXTER3		;CONTINUE
		ANDM	ARG,(SX)	;CLEAR UNDF ON PASS 2
		JRST	EXTER2]		;SET UP EXTERNAL NOW
EXTER2:	MOVEI	V,2		;NO, GET 2 CELLS FROM THE TREE
	ADDB	V,FREE
	CAML	V,SYMBOL	;HAVE WE RUN OUT OF CORE?
	PUSHJ	PP,XCEEDS	;YES, TRY TO BORROW SOME MORE
	SUBI	V,2		;GET RIGHT CELL FOR POINTER
	SETZB	RC,0(V)		;ALL SET, ZERO VALUES
	MOVSI	ARG,SYMF!EXTF
	PUSHJ	PP,SUPSYM	;[167] SEE IF "!" SEEN
	PUSHJ	PP,INSERT	;INSERT/UPDATE IT
	MOVSI	ARG,PNTF
	IORM	ARG,0(SX)
	SKIPA	ARG,-1(SX)	;GET THE SIXBIT FOR THE NAME
EXTER4:	TROA	ER,ERRA		;FLAG AS ERROR
	MOVEM	ARG,1(V)	;AND STORE IT FOR ADDITIVE GLOBAL FIXUPS
EXTER3:	PUSHJ	PP,SUPSYM	;[167] SEE IF "!" SEEN
	JUMPCM	EXTER0
	POPJ	PP,		;NO, EXIT
EVAL10:	PUSH	PP,RX
	HRRI	RX,^D10
	PUSHJ	PP,EVALEX	;EVALUATE
	POP	PP,RX		;RESET RADIX
	JUMPE	RC,POPOUT	;EXIT IF ABSOLUTE

QEXT:
IFN POLISH,<
	TLNE	FR,POLSW	;[164] ANY POLISH EXTERNAL EXPRESSIONS
	JRST	QPOL		;[164] YES, REMOVE  AND FLAG ERROR
>
	SKIPE	EXTPNT		;ANY POSSIBILITIES?
	TROA	ER,ERRE		;YES, FLAG EXTERNAL ERROR
	TRO	ER,ERRR		;NO, FLAG RELOCATION ERROR
	HLLZS	RC		;CLEAR RELOCATION/EXTERNAL
	POPJ	PP,

IFN POLISH,<
QPOL:	TRO	ER,ERRE		;[164] FLAG EXTERNAL ERROR
	PUSH	PP,AC1		;[164] GET AN AC
	MOVE	AC1,POLIST	;[164] GET LAST ITEM IN LIST
	MOVEM	AC1,FREE	;[164] RESET FREE CORE POINTER
	MOVE	AC1,(AC1)	;[164] GET PREVIOUS ITEM
	MOVEM	AC1,POLIST	;[164] MAKE IT TOP OF LIST
	POP	PP,AC1		;[164]
	POPJ	PP,		;[164]
>

EVALXQ:	PUSH	PP,IO		;[222] SAVE ERROR STATUS
	TRZ	ER,-1		;[222] START AFRESH
	PUSHJ	PP,EVALQ	;[222] EVALUATE EXPRESSION
	TRNE	ER,ERRU		;[222] TEST FOR UNDEF
	TRO	ER,ERRV		;[222] FLAG "V" ERROR
	HLLM	IO,(PP)		;[222] STORE STATUS FLAGS
	IORM	ER,(PP)		;[222] COMPOUND ERRORS
	POP	PP,IO		;[222] RESTORE THEM
	POPJ	PP,		;[222]

EVALQ:	PUSHJ	PP,EVALEX	;EVALUATE EXPRESSION
	TDZE	RC,[-2,,-2]	;WAS AN EXTERNAL FOUND?
	TRO	ER,ERRE		;YES, FLAG ERROR
	POPJ	PP,		;RETURN
OPDEF0:	PUSHJ	PP,GETSYM	;GET THE FIRST SYMBOL
	POPJ	PP,		;ERROR IF INVALID SYMBOL
	CAIE	C,73		;"["?
	JRST	ERRAX		;NO, ERROR
	PUSH	PP,AC0		;STACK MNEMONIC
	AOS	LITLVL		;SHORT OUT LOCATION INCREMENT
	PUSHJ	PP,STMNT	;EVALUATE STATEMENT
	SKIPGE	STPX		;CODE STORED?
	TROA	ER,ERRA		;NO,"A" ERROR
	PUSHJ	PP,DSTOW	;GET AND DECODE VALUE
	SOS	LITLVL
	EXCH	AC0,0(PP)	;EXCHANGE VALUE FOR MNEMONIC
	PUSH	PP,RC		;STACK RELOCATION
	TLO	IO,DEFCRS	;SAY WE ARE DEFINING IT
	PUSHJ	PP,MSRCH	;SEARCH SYMBOL TABLE
	MOVSI	ARG,OPDF	;NOT FOUND
	POP	PP,RC		;RESTORE VALUES
	POP	PP,V
	TLNE	ARG,SYNF!MACF
	TRO	ER,ERRA		;YES "A" ERROR
	TRNN	ER,ERRA		;ERROR?
	PUSHJ	PP,INSERT	;NO, INSERT/UPDATE
	PUSHJ	PP,ASSIG7	;[135] LIST VALUE LIKE =
	TLZ	IO,DEFCRS	;JUST IN CASE
	BYPASS
	JRST	STOWI		;BE SURE STOW IS RESET


DEPHA0:	MOVE	AC0,LOCO
	SKIPA	RC,MODO		;SET TO OUTPUT VALUES AND SKIP
PHASE0:	PUSHJ	PP,EVALXQ	;EVALUATE AND CHECK FOR EXTERNAL
	MOVEM	AC0,LOCA	;SET ASSEMBLY LOCATION COUNTER
	MOVEM	RC,MODA
	JRST	BLOCK2
ASSIGN:	JUMPAD	ERRAX		;NO, ERROR
	PUSHJ	PP,ASSIG1
	TLNE	IO,IOSALL	;SUPPRESS ALL?
	JUMPN	MRP,CPOPJ	;IF IN MACRO
ASSIG7:	MOVEM	RC,ASGBLK
	TRNE	RC,-2		;EXTERNAL
	HLLZS	ASGBLK		;YES,CLEAR RELOCATION
	TLNE	RC,1		;LEFT HALF NOT RELOC?
	TLNE	RC,-2		;...
	HRROS	ASGBLK		;YES, SET FLAG
	MOVEM	V,LOCBLK
	POPJ	PP,

ASSIG1:	PUSH	PP,AC0		;SAVE SYMBOL
	MOVEM	AC0,INASGN	;[164] INCASE POLISH FIXUP REQUIRED
	SETZB	AC0,EXTPNT	;SPECIAL CHECK FOR == WFW
ASSIG4:	PUSHJ	PP,PEEK		;IS THE NEXT ON =
	CAIE	C,"="
	CAIN	C,"!"
	CAIA			;[406]WANT TO SUPRESS SYMBOL
	JRST	ASSIG5		;[406]NOT "=" OR "!",SO SEE IF COLON
	TLOE	AC0,NOOUTF	;[406]TURN ON "NO-OUTPUT" FLAG
	TRO	ER,ERRQ		;[406]IF ALREADY ON, GIVE ERROR
	PUSHJ	PP,GETCHR	;PROCESS THE CHAR.
	PUSHJ	PP,PEEK		;CHECK FOR ==: DMN
ASSIG5:	CAIE	C,":"		;IS IT
	JRST	ASSIG6		;NO
	TLOE	AC0,INTF	;[406]FLAG AS INTERNAL
	TRO	ER,ERRQ		;[406]IF ALREADY ON, ITS AN ERROR
	PUSHJ	PP,GETCHR	;REPEAT IT
	JRST	ASSIG4		;TRY AGAIN (MIGHT BE =:!)

ASSIG6:	MOVEM	AC0,HDAS	;STORE THESE BITS WFW
	PUSHJ	PP,EVALCM	;EVALUATE EXPRESSION
	SETZM	INASGN		;[164] FINISHED WITH POLISH BY NOW
	EXCH	AC0,0(PP)	;SWAP VALUE FOR SYMBOL
	PUSH	PP,RC
	TRNN	RC,-2		;CHECK EXTERNAL AGREEMENT
	JRST	ASSIG2
	HRRZS	RC
	HRRZ	ARG,EXTPNT
	CAME	RC,ARG
	PUSHJ	PP,QEXT		;EXTERNAL OR RELOCATION ERROR
ASSIG2:	HLRZ	RC,(PP)
	TRNN	RC,-2
	JRST	ASSIG3
	HLRZ	ARG,EXTPNT
	CAME	RC,ARG
	PUSHJ	PP,QEXT
ASSIG3:	TLO	IO,DEFCRS
	PUSH	PP,UNISCH+1	;SAVE SEARCH LIST
	SETZM	UNISCH+1	;BUT DISALLOW
	PUSHJ	PP,SSRCH
	  MOVSI	ARG,SYMF
	POP	PP,UNISCH+1	;RESTORE STATUS
	IOR	ARG,HDAS	;WFW
	TLNE	ARG,UNDF	;WAS IT UNDEFINED
	TLZ	ARG,EXTF!PNTF	;YES,CLEAR EXTF NOW
	TLZ	ARG,UNDF!VARF	;CANCEL UNDEFINED AND VARIABLE FLAGS
	SETZM	EXTPNT		;FOR REST OF WORLD
IFN POLISH,<
	TLZ	IO,RSASSW	;[265] ...
>
	POP	PP,RC
	TRNE	ER,ERRORS-ERRQ
	SETZ	RC,		;CLEAR RELOCATION
	POP	PP,V
	TRNE	ER,ERRU		;WAS VALUE UNDEFINED?
	TLO	ARG,UNDF	;YES,SO TURN UNDF ON
	TLNE	ARG,TAGF!EXTF
	JRST	ERRAX
	JRST	INSERT
;LOC, RELOC, AND ORG COME HERE

%ORG:	PUSH	PP,AC0		;SAVE TYPE
	PUSHJ	PP,HIGHQ	;GET LATEST PC
	BYPASS			;SKIP BLANKS
	TLO	IO,IORPTC	;REPEAT LAST
	CAIN	C,EOL		;USE PREVIOUS VALUE IF NULL ARGUMENT
	JRST	ORG03
	PUSHJ	PP,EVALXQ	;GET EXPRESSION AND TEST EXTERNAL
	SKIPGE	(PP)		;ORG?
	HRLM	RC,(PP)		;YES, SAVE RELOC OF ARG
ORG01:	HRRM	AC0,(PP)	;STORE NEW VALUE
IFE POLISH,<
	HLRZ	AC1,(PP)	;GET MODE
	HRRZ	AC0,LOCO	;PC OF OUTPUT
	CAMN	AC1,MODO	;MODE SAME?
	JRST	[MOVEM AC0,@REL1P(AC1)	;SAVE NEW VALUE
		JRST	ORG02]
	MOVEM	AC0,@ABS1P(AC1)	;SAVE NEW VALUE
ORG02:	MOVE	AC0,MODO	;SAVE OLD MODE
	MOVEM	AC0,ORGMOD
>
IFN POLISH,<
	HRRZ	AC0,LOCO	;PC OF OUTPUT
	MOVE	AC1,MODO	;OLD MODE
	MOVEM	AC0,@REL1P(AC1)	;SAVE OLD VALUE
	MOVE	AC0,MODO	;SAVE OLD MODE
	MOVEM	AC0,ORGMOD
	MOVE	AC1,SGNCUR	;CURRENT PSECT INDEX
	MOVE	AC0,HIGH	;SAVE PSECT BREAK
	HRRM	AC0,SGATTR(AC1)
	HRR	AC0,RELLOC	;SAVE PSECT REL PC
	HRL	AC0,ORGMOD	;SAVE PSECT MODE
	MOVEM	AC0,SGRELC(AC1)
>
	POP	PP,AC0		;GET RESULT
ORG2A:	HLRZM	AC0,MODA	;SET MODES
	HLRZM	AC0,MODO
	HRRZM	AC0,LOCA	;AND LOCATIONS
	HRRZM	AC0,LOCO
	JRST	BLOCK2

ORG03:	HRRZ	AC0,ORGMOD	;GET PREV MODE
	SKIPGE	(PP)		;ORG?
	HRLM	AC0,(PP)	;YES, SAVE IT
	HLRZ	AC1,(PP)	;NEW MODE
	MOVE	AC0,@REL1P(AC1)	;GET PREV VALUE
	JRST	ORG01

REL1P:	EXP	ABSLOC
ABS1P:	EXP	RELLOC
	EXP	ABSLOC
;	.PSECT	NAME /ATTRIB,ORIGIN

IFN POLISH,<
%SEGME:	SKIPN	HISNSW		;CAN'T HAVE PSECTS WITH
	SKIPE	UNIVSN		; HISEG, TWOSEG OR
	JRST	ERRSX		; UNIVERSAL
	MOVE	AC2,SGDMAX	;CHECK IF MAX PSECT
	CAILE	AC2,SGNDEP-1	; NESTING DEPTH EXCEEDED
	JRST	ERRSX		;YES
	PUSHJ	PP,GETSYM	;GET PSECT NAME
	  PUSHJ	PP,[SETZ AC0,		;NONE SPECIFIED, BLANK NAME
		TRZ	ER,ERRA		;UNDO GETSYM'S ERR FLAG
		POPJ	PP,]
	MOVE	AC1,SGNMAX	;GET PSECT COUNT
%SEGM1:	CAMN	AC0,SGNAME(AC1)	;SEEN THIS NAME BEFORE?
	JRST	%SEGM2		;YES
	SOJGE	AC1,%SEGM1	;LOOP THRU KNOWN NAMES
	MOVE	AC1,SGNMAX	;CHECK IF MAX DISTINCT PSECT
	CAILE	AC1,SGNSGS-1	; LIMIT EXCEEDED
	JRST	ERRSX		;YES
	AOS	AC1,SGNMAX	;INCR PSECT COUNT
	MOVEM	AC0,SGNAME(AC1)	;STORE PSECT NAME
	MOVSI	AC2,1		;SET MODE TO RELOC
	MOVEM	AC2,SGRELC(AC1)	; AND PC TO ZERO
	HRRZS	SGORIG		;INCASE NOT GIVEN
%SEGM4:	MOVE	SDEL,SYMBOL	;ROOM TO INIT
	SUBI	SDEL,LENGTH	; SYM TAB
	CAMLE	SDEL,FREE	; FOR NEW PSECT?
	JRST	%SEGM3		;YES
	PUSHJ	PP,XCEEDS	;TRY FOR MORE CORE
	JRST	%SEGM4		;START OVER
%SEGM3:	MOVEM	SDEL,SYMBOL	;NEW SYM TAB BOT
	HRLI	SDEL,LENGTH(SDEL)	;OLD SYM TAB BOT
	MOVE	SX,SYMTOP	;SYM TAB TOP
	BLT	SDEL,-LENGTH(SX)	;MOVE SYM TAB DOWN
	HRLI	SDEL,SYMNUM+1	;PTR TO PERM SYM TAB
	HRRI	SDEL,1-LENGTH(SX)	;PERM SYMS GO HERE
	BLT	SDEL,0(SX)	;MOVE PERM SYMS TO NEW PSECT
	MOVE	AC2,SYMNUM	;PERM SYM CNT
	MOVEM	AC2,SGSCNT(AC1)	;SET SYM CNT
	SETZM	SGATTR(AC1)	;ZERO PSECT BRK AND ATTRS
	ADDM	AC2,@SYMBOL	;ADJUST TOTAL SYM CNT
%SEGM2:	AOS	AC2,SGDMAX	;INCR PSECT DEPTH
	MOVEM	AC0,SGLIST(AC2)	;STORE PSECT NAME
%SEGM5:	CAIE	C,'/'		;ATTRIBUTES SPECIFIED?
	JRST	%SEGM9		;NO, TRY VALUE
	PUSH	PP,AC1		;SAVE PSECT INX
	PUSHJ	PP,GETSYM	;GET ATTRIBUTE
	  JRST	%SEGM8		;TOO BAD
; THE BELOW ATTRIBUTES ARE PAIRED; A CONFLICT IS
; FLAGGED IF BOTH OF ANY PAIR ARE SEEN (CUMMULATIVELY)
	MOVE	AC1,AC0		;ATRIB NAME
	SETO	AC2,		;MASK
	LSH	AC1,6		;SHIFT UP 1 CHAR AT A TIME
	LSH	AC2,6		;SAME FOR MASK
	JUMPN	AC1,.-2		;UNTIL CHAR ALL GONE, MASK LEFT
	MOVSI	AC1,-%SGTLN	;AOBJN WORD
%SEGM6:	CAMN	AC0,%SGTBL(AC1)	;ATTRIBUTE FOUND?
	JRST	%SEGM7		;YES, PROCESS IT
	XOR	AC0,%SGTBL(AC1)	;BUT SEE IF WHAT WE HAVE MATCHES
	TDNN	AC0,AC2		;TRUE IF MASKED BITS ARE 0
	JRST	%SEGM7		;YES, IT MATCHES
	XOR	AC0,%SGTBL(AC1)	;PUT NAME BACK
	AOBJN	AC1,%SEGM6	;NO, CHECK NEXT
	SETZ	AC2,		;CLEAR ATTR FLAG
	TRO	ER,ERRQ		;FLAG WARNING
%SEGM7:	MOVEI	AC2,1		;SET ATRIB BIT
	LSH	AC2,-1(AC1)	; IN AC2
	MOVE	AC1,0(PP)	;GET PSECT INX
	HLRZ	AC0,SGATTR(AC1)	;GET PREV ATTRS
	ANDI	AC0,525252	;SELECT LEFT OPTIONS
	LSH	AC0,-1		;SHIFT THEM RIGHT
	AND	AC0,AC2		;COMPARE NEW AND PREVIOUS
	JUMPE	AC0,.+3		;CONFLICTING ATTRIBUTE?
	TRO	ER,ERRQ		;YES, FLAG WARNING
	SETZ	AC2,		; AND IGNORE IT
	HLRZ	AC0,SGATTR(AC1)	;GET PREV ATTRS
	ANDI	AC0,252525	;SELECT RIGHT OPTIONS
	LSH	AC0,1		;SHIFT THEM LEFT
	AND	AC0,AC2		;COMPARE NEW AND PREVIOUS
	JUMPE	AC0,.+3		;CONFLICTING ATTRIBUTE?
	TRO	ER,ERRQ		;YES, FLAG WARNING
	SETZ	AC2,		; AND IGNORE IT
	HRLZS	AC2		;MOVE TO LEFT HALF
	IORM	AC2,SGATTR(AC1)	;MERGE ATTRIBUTES
%SEGM8:	POP	PP,AC1		;RESTORE PSECT INX
	JUMPCM	%SEGM5		;LOOP IF MORE ATTRS
	JRST	%SWSEG		;SWAP PC AND MODE

%SEGM9:	JUMPNC	%SWSEG		;NO VALUE
	PUSH	PP,AC1		;SAVE INDEX
	PUSHJ	PP,EVALCM	;GET IT
	POP	PP,AC1		;RESTORE INDEX
	HRRM	AC0,SGORIG(AC1)	;STORE IT
	JRST	%SWSEG		;SWAP PC AND MODE

%SGTBL:	<SIXBIT /CONCATENATED/>
	<SIXBIT /OVERLAID/>
	<SIXBIT /RWRITE/>
	<SIXBIT /RONLY/>

%SGTLN==.-%SGTBL
%ENDSE:	SKIPN	HISNSW		;CAN'T HAVE PSECTS WITH
	SKIPE	UNIVSN		; HISEG, TWOSEG OR
	JRST	ERRSX		; UNIVERSAL
	MOVE	AC2,SGDMAX	;IF DEPTH IS ALREADY ZERO
	JUMPE	AC2,ERRSX	; THEN .ENDPS IS ILLEGAL
	PUSHJ	PP,GETSYM	;GET PSECT NAME
	JRST	%ENDS1		;NONE SPECIFIED, IGNORE CHECK
	CAME	AC0,SGLIST(AC2)	;DOES IT MATCH CORRES .PSECT NAME
	TRO	ER,ERRQ		;NO, FLAG WARN AND DO IT ANYWAY
%ENDS1:	TRZ	ER,ERRA		;UNDO GETSYM'S ERR FLAG
	SOS	AC2,SGDMAX	;DECR PSECT DEPTH
	MOVE	AC0,SGLIST(AC2)	;NAME OF PSECT TO RESUME
	MOVE	AC1,SGNMAX	;GET PSECT COUNT
	CAME	AC0,SGNAME(AC1)	;NAME MATCH?
	SOJGE	AC1,.-1		;NO, TRY NEXT

;HERE TO SWAP TO NEW PSECT
;ENTER WITH OLD PSECR IN SGNCUR
;NEW PSECT IN AC1
%SWSEG:	PUSH	PP,AC1		;SAVE NEW PSECT INX
	MOVE	AC2,SGNCUR	;GET OLD PSECT INX
	HLRZ	SDEL,SGORIG(AC2)	;ALREADY SETUP LIT/VAR BLOCK
	JUMPN	SDEL,%SWSG1	;YES
	MOVEI	SDEL,.SGLVL+1	;NO
	ADDB	SDEL,FREE	;TRY TO GET IT
	CAML	SDEL,SYMBOL	;WILL IT FIT?
	PUSHJ	PP,XCEED	;NO, XPAND
	SUBI	SDEL,.SGLVL+1	;GET ORIGIN
	HRLM	SDEL,SGORIG(AC2)	;NOW STORE IT
%SWSG1:	MOVSI	AC0,.SGLVZ	;START OF LIT/VAR AREA
	HRRI	AC0,1(SDEL)	;SAVE AREA
	BLT	AC0,.SGLVL(SDEL);STORE IT
	MOVE	AC0,LITLVL	;GET LITLVL
	MOVEM	AC0,(SDEL)	;STORE IT
	HLLZ	AC0,SGORIG(AC1)	;RESTORE NEW LIT/VAR
	JUMPE	AC0,[MOVE AC0,[.SGLVZ,,.SGLVZ+1]	;NOT YET SETUP
		SETZM	.SGLVZ		;CLEAR FIRST WORD
		BLT	AC0,.SGLVZ+.SGLVL	;PLUS REST
		MOVEI	AC0,VARHD	;SET UP AREA
		MOVEM	AC0,VARHDX
		MOVEI	AC0,LITHD
		MOVEM	AC0,LITHDX
		SETZM	LITLVL
		PUSHJ	PP,LITI
		JRST	%SWSG2]		;JOIN COMMON CODE
	AOBJP	AC0,.+1		;BYPASS FIRST WORD
	HRRI	AC0,.SGLVZ	;TO LIT/VAR AREA
	BLT	AC0,.SGLVZ+.SGLVL-1
	HLRZ	SDEL,SGORIG(AC1)	;POINTER TO LIT INFO
	MOVE	AC0,(SDEL)	;GET LITLVL
	MOVEM	AC0,LITLVL	;WE ARE NOW IN
	PUSHJ	PP,HIGHQ	;SET CURRENT PROG BRK
%SWSG2:	MOVE	AC0,SGRELC(AC1)	;GET OLD MODE AND PC
	PUSH	PP,AC0		;SAVE SAME
	HLRZ	RC,AC0		;GET OLD MODE
	SKIPN	RC		;IF ABS MODE
	MOVE	AC0,ABSLOC	; THEN GET ABS PC
	HRRM	AC0,(PP)	;STORE NEW VALUE
	HRRZ	AC0,LOCO	;PC OF OUTPUT
	MOVE	AC1,MODO	;OLD MODE
	MOVEM	AC0,@REL1P(AC1)	;SAVE OLD VALUE
	MOVE	AC0,MODO	;SAVE OLD MODE
	MOVEM	AC0,ORGMOD
	MOVE	AC1,SGNCUR	;CURRENT PSECT INDEX
	MOVE	AC0,HIGH	;SAVE PSECT BREAK
	HRRM	AC0,SGATTR(AC1)
	HRR	AC0,RELLOC	;SAVE PSECT REL PC
	HRL	AC0,ORGMOD	;SAVE PSECT MODE
	MOVEM	AC0,SGRELC(AC1)
	MOVE	AC0,-1(PP)	;GET NEW PSECT INX
	MOVEM	AC0,SGNCUR	;SET SGNCUR TO IT
	JUMP1	.+2		;IF PASS 2 THEN
	PUSHJ	PP,SGOUTN	; OUTPUT PSECT NAME BLOCK
	POP	PP,AC0		;GET RESULT
	HLRZM	AC0,MODA	;SET MODES
	HLRZM	AC0,MODO
	HRRZM	AC0,LOCA	;AND LOCATIONS
	HRRZM	AC0,LOCO
	POP	PP,SGNCUR	;STORE NEW PSECT INX
	MOVE	AC1,SGNCUR	;NEW PSECT INX
	HRRZ	AC0,SGATTR(AC1)	;GET PSECT BRK
	MOVEM	AC0,HIGH	;RESTORE IT
	PUSHJ	PP,SRCHI	;SET UP SRCHX
	POPJ	PP,		;DONE

ERRSX:	TRO	ER,ERRS		;FLAG PSECT USAGE ERROR
	POPJ	PP,		;DONE
>
HISEG1:
IFN POLISH,<
	SKIPE	SGNMAX		;IF PSECTS USED THEN CAN'T USE
	JRST	ERRSX		; HISEG OR TWOSEG
>
	PUSHJ	PP,HIGHQ	;SET CURRENT PROGRAM BREAK
	PUSHJ	PP,COUTD	;DUMP CURRENT TYPE OF BLOCK
	SKIPN	HISNSW		;IF WE HAVE SEEN IT BEFORE
	SKIPE	HIGH		;OR ANY RELOC CODE PUT OUT
	TRO	ER,ERRQ		;FLAG AS AN ERROR
	BYPASS			;GO GET EXPRESSION
	TLO	IO,IORPTC
	PUSHJ	PP,EVALXQ	;CHECK FOR EXTERNAL
	ANDCMI	AC0,1777	;ONLY ALLOWED TO START ON NEW K BOUND
	HRRZM	AC0,LOCA	;SET LOC COUNTERS
	HRRZM	AC0,LOCO
	MOVEI	RC,1		;ASSUME RELOCATABLE
	POPJ	PP,

TWSEG0:	PUSHJ	PP,HISEG1	;COMMON CODE
	JUMPN	AC0,.+2		;ARGUMENT SEEN
	MOVEI	AC0,400000	;ASSUME 400000
	HRRZM	AC0,HMIN	;SET OFSET OF HIGH SEG.
	HRRZM	AC0,HHIGH	;INCASE NO HISEG CODE
	TLOA	AC0,(1B0)	;SIGNAL TWO SEGMENTS AND SKIP

HISEG0:	PUSHJ	PP,HISEG1	;COMMON CODE
HISEG2:	MOVEM	AC0,SVTYP3	;SAVE THE HISEG ARG
	MOVEM	RC,MODA		;SET MODES
	MOVEM	RC,MODO
	SETOM	HISNSW		;WE HAVE ALREADY PUT ONE OUT
	JRST	BLOCK2		;MAKE LISTING HAPPEN RIGHT


IFN FORMSW,<
ONFORM:	HRRES	HWFMT		;ALLOW MULTI-FORMAT LISTING
	POPJ	PP,
OFFORM:	HRROS	HWFMT		;HALF-WORD FORMAT ONLY
	POPJ	PP,	>

IFE FORMSW,<
	SYN	CPOPJ,ONFORM
	SYN	CPOPJ,OFFORM>
HIGHQ:
HIGHQ1:	MOVE	V,LOCO	;GET ASSEMBLY LOCATION
	SKIPN	MODO		;IF ASSEMBLY MODE IS ABSOLUTE
	JRST	[CAMLE V,ABSHI		;RECORED ABS HIGHEST ALSO
		MOVEM V,ABSHI
		POPJ PP,]
	SKIPE	HMIN		;IS IT A TWO SEGMENT PROGRAM?
	JRST	[CAMGE	V,HMIN		;YES,IS THIS HIGH SEG.?
		JRST	.+1		;NO,STORE LOW SEGMENT
		CAMLE	V,HHIGH		;YES,IS IT GREATER THAN "HHIGH"?
		MOVEM	V,HHIGH		;YES,REPLACE WITH LARGER VALUE
		POPJ	PP,]
	CAMLE	V,HIGH		;IS IT GREATER THAN "HIGH"?
	MOVEM	V,HIGH		;YES, REPLACE WITH LARGER VALUE
	POPJ	PP,
	
ONML:	TLZA	FR,MWLFLG	;MULTI-WORD LITERALS OK
OFFML:	TLO	FR,MWLFLG	;NO
	POPJ PP,

OFFSYM:	SETOM	IONSYM	;SUPRESS SYMBOL TABLE LISTING
	POPJ	PP,

SUPRE0:	PUSHJ	PP,GETSYM	;GET A SYMBOL TO SUPRES
	JRST	SUPRE1		;ERROR
	PUSHJ	PP,SSRCH	;SYMBOL ONLY
	  JRST	SUPRE1		;GIVE ERROR MESSAGE
	PUSHJ	PP,SUPSYM	;[167] SEE IF "!" SEEN
	TLOA	ARG,SUPRBT	;SET THE SUPRESS BIT
SUPRE1:	TROA	ER,ERRA
	IORM	ARG,(SX)	;PUT BACK
	JUMPCM	SUPRE0		;ANY MORE?
	JRST	SUPRS1

SUPRSA:	PUSHJ	PP,LOOKUP	;SUPRESS ALL
	MOVSI	ARG,SUPRBT
	IORM	ARG,(SX)
SUPRS1:	SETZM	EXTPNT		;JUST IN CASE WE LOOKED ONE UP
IFN POLISH,<
	TLZ	IO,RSASSW	;[265] ...
>
	POPJ	PP,

XPUNG0:	JUMP1	POPOUT
	PUSHJ	PP,LOOKUP
	MOVE	ARG,(SX)	;GET SYMBOL FLAGS
	TLNN	ARG,INTF!ENTF!EXTF!SPTR
	TLOA	ARG,SUPRBT	;LOCAL SYMBOL,SO SUPPRESS IT
	SETZM	EXTPNT
IFN POLISH,<
	TLZ	IO,RSASSW	;[265] ...
>
	MOVEM	ARG,(SX)	;RESTORE FLAGS
	POPJ	PP,

NODDT0:	PUSHJ	PP,GETSYM	;GET A SYMBOL TO SUPRES
	  JRST	NODDT1		;ERROR
	PUSHJ	PP,SSRCH	;SYMBOL ONLY
	  JRST	NODDT1		;GIVE ERROR MESSAGE
	PUSHJ	PP,SUPSYM	;SEE IF "!" SEEN
	TLOA	ARG,NOOUTF	;SET THE NO-DDT BIT
NODDT1:	TROA	ER,ERRA
	IORM	ARG,(SX)	;PUT BACK
	JUMPCM	NODDT0		;ANY MORE?
	JRST	SUPRS1

SUPSYM:	CAIE	C,'!'		;[404][167] WANT NO DDT OUTPUT FOR THIS SYMBOL?
	POPJ	PP,		;[167] NO
	TLO	ARG,NOOUTF	;[167] YES, SET FLAG
	PJRST	BYPAS1		;[167] SKIP "!" AND RETURN

;[220] .CREF SYMBOL,SYMBOL,ETC
ONCRF:	PUSHJ	PP,GETSYM	;SEE IF A SYMBOL SPECIFIED
	  JRST	[MOVSI	AC0,IONCRF	;NO, PUT FLAG BACK
		TRZ	ER,ERRA		;CLEAR "A" ERROR
		TLZ	IO,DEFCRS	;CLEAR ANY WAITING DEFINING OCCURENCES
		JRST	IORSET]
ONCRF0:	PUSHJ	PP,SEARCH	;[365] GENERAL SEARCH
	  JRST	ONCRFE		;[365] ERROR
	MOVSI	ARG,NCRF	;[365] NO CREF FLAG IN ARG
	ANDCAM	ARG,(SX)	;[365] TURN OFF NO CREF BIT
	CAMN	AC0,1(SX)	;[365] OTHER ENTRY IN SYMBOL TABLE?
	 ANDCAM	ARG,2(SX)	;[365] TURN OFF NCRF
	CAMN	AC0,-3(SX)	;[365] OTHER ENTRY IN SYMBOL TABLE?
	 ANDCAM	ARG,-2(SX)	;[365] TURN OFF NCRF
	CAIA			;[365]
ONCRFE:	TRO	ER,ERRA		;[365] SET ERROR CONDITION
	JUMPNC	SUPRS1		;GIVE UP IF NO MORE
	PUSHJ	PP,GETSYM	;GET NEXT SYMBOL
	  JRST	ONCRFE		;ERROR
	JRST	ONCRF0

;[220] .XCREF SYMBOL,SYMBOL,ETC
OFFCRF:	PUSHJ	PP,GETSYM	;SEE IF A SYMBOL SPECIFIED
	  JRST	[MOVSI	AC0,IONCRF	;PUT FLAG BACK
		TRZ	ER,ERRA		;CLEAR "A" ERROR
		JRST	IOSET]
OFCRF0:	PUSHJ	PP,SEARCH	;[365] GENERAL SEARCH
	  JRST	OFCRFE		;[365] ERROR
	MOVSI	ARG,NCRF	;[365] NO CREF FLAG IN ARG
	IORM	ARG,(SX)	;[365] SET NO CREF BIT
	CAMN	AC0,1(SX)	;[365] OTHER ENTRY IN SYMBOL TABLE?
	 IORM	ARG,2(SX)	;[365] SET BIT
	CAMN	AC0,-3(SX)	;[365] OTHER ENTRY IN SYMBOL TABLE?
	 IORM	ARG,-2(SX)	;[365] SET BIT
	CAIA			;[365]
OFCRFE:	TRO	ER,ERRA		;[365] FLAG ERROR
	JUMPNC	SUPRS1		;GIVE UP IF NO MORE SYMBOLS
	PUSHJ	PP,GETSYM	;GET NEXT SYMBOL
	  JRST	OFCRFE		;ERROR
	JRST	OFCRF0
TITLE0:	JUMP2	REMAR0
	SKIPE	TBUF+1		;IS THIS THE FIRST TITLE?
	JRST	[TRO	ER,ERRM		;NO, FLAG AS ERROR
		JRST	REMAR0]		;AND IGNORE
	MOVEI	SX,.TBUF
	HRRI	AC0,TBUF
	PUSHJ	PP,SUBTT1	;GO READ IT
	MOVEM	SX,TCNT		;SAVE COUNT OF CHARS. WRITTEN
	SKIPE	UNIVSN		;WAS IT A UNIVERSAL?
	PUSHJ	PP,ADDUNV	;YES  ADD TO TABLE
	SKIPN	TBUF+1		;2ND WORD NON-ZERO SIGNALS TITLE SEEN
	AOS	TBUF+1		;MAKE IT SO
IFN CCLSW,<JRST	PRNAM		;PRINT NAME IF FIRST ONE>
IFE CCLSW,<POPJ	PP,		;EXIT OTHERWISE>

SUBTT0:	SKIPE	SBUF		;STORE FIRST SUBTTL ON PASS1
	JUMP1	REMAR0		;OTHERWISE EXIT IF PASS ONE
	MOVEI	SX,.SBUF
	HRRI	AC0,SBUF

SUBTT1:	BYPASS			;BYPASS LEADING BLANKS
	TLO	IO,IORPTC
SUBTT3:	PUSHJ	PP,CHARAC	;GET ASCII CHARACTER
	IDPB	C,AC0		;STORE IN BLOCK
	CAIGE	C,40		;TEST FOR TERMINATOR
	CAIN	C,HT
	SOJG	SX,SUBTT3	;TEST FOR BUFFER FULL
	DPB	RC,AC0		;END, STORE TERMINATOR
	SOJA	SX,REMAR1	;COUNT NULL AND EAT UP ANY REMAINING CHARS.
IFN CCLSW,<
PRNAM:	TLNN	IO,CRPGSW	;NOT IF NOT RPG
	POPJ	PP,
	PUSH	PP,AC0		;SAVE AC0 DMN
	PUSH	PP,RC		;AND RC
	MOVE	AC0,[POINT 7,TBUF]
	MOVE	SX,[POINT 7,OTBUF]
	MOVEI	RC,6		;MAX OF SIX CHRS
	MOVEI	C,HT		;START WITH A TAB
	IDPB	C,SX
PN1:	ILDB	C,AC0
	CAILE	C," "		;CHECK FOR LEGAL
	CAILE	C,"Z"+40	;CHECK AGAINST LOWER CASE Z
	JRST	PN2
	IDPB	C,SX		;PUT IN OUTPUT BUFFER
	SOJG	RC,PN1		;GET MORE
PN2:	MOVEI	C,CR		;END WITH CR-LF
	IDPB	C,SX
	MOVEI	C,LF
	IDPB	C,SX
	SETZ	C,		;TERMINATOR
	IDPB	C,SX
	TTCALL	3,OTBUF
	POP	PP,RC
	POP	PP,AC0		;RESTORE AC0 DMN
	POPJ	PP,
>
SYN0:	PUSHJ	PP,GETSYM	;GET THE FIRST SYMBOL
	  JRST	ERRAX		;ERROR, EXIT
	PUSHJ	PP,MSRCH	;TRY FOR MACRO/OPDEF
	  JRST	SYN3		;NO, TRY FOR OPERAND
SYN1:	MOVEI	SX,MSRCH	;YES, SET FLAG
SYN2:	JUMPNC	ERRAX		;[173] ERROR IF NO COMMA
	PUSH	PP,ARG		;[173] SAVE SOME REGISTERS
	PUSH	PP,RC		;[173]
	PUSH	PP,V		;[173]
	PUSH	PP,SX		;[173] SAVE SEARCH ROUTINE
	PUSHJ	PP,GETSYM	;[173] GET THE SECOND SYMBOL
	  JRST	[SUB	PP,[4,,4]	;[173] PUT STACK BACK
		POPJ	PP,]		;[173] AND GIVE UP
	POP	PP,SX		;[173] RESTORE SEARCH ROUTINE
	PUSHJ	PP,@SX		;[173] SEARCH FOR SECOND SYMBOL
	  JFCL			;[173]
	POP	PP,V		;[173] RESTORE VALUES
	POP	PP,RC		;[173]
	POP	PP,ARG		;[173]
	TLNE	ARG,MACF	;MACRO?
	PUSHJ	PP,REFINC	;YES, INCREMENT REFERENCE
	JRST	INSERT		;INSERT AND EXIT

SYN3:	PUSHJ	PP,SSRCH	;SEARCH FOR OPERAND
	  JRST	SYN4		;NOT FOUND, TRY OP CODE
	TLO	ARG,SYNF	;FLAG AS SYNONYM
	TLNE	ARG,EXTF	;EXTERNAL?
	HRRZ	V,ARG		;YES, RELPACE WITH POINTER
	MOVEI	SX,SSRCH	;SET FLAG
	TLNN	ARG,VARF	;DO NOT LET HIM SYN A VARIABLE
	JRST	SYN2
	JRST	ERRAX

SYN4:	PUSHJ	PP,OPTSCH	;SEARCH FOR OP-CODE
	  JRST	ERRAX		;NOT FOUND, EXIT WITH ERROR
	MOVSI	ARG,SYNF	;FLAG AS SYNONYM
	JRST	SYN1
PURGE0:	PUSHJ	PP,GETSYM	;GET A MNEMONIC
	  JRST	[TRZ ER,ERRA		;CLEAR ERROR
		POPJ	PP,]		;AND RETURN
	PUSHJ	PP,MSRCH	;SEARCH MACRO SYMBOL TABLE
	  JRST	PURGE2		;NOT FOUND, TRY SYMBOLS
	PUSH	PP,CS		;SAVE CS AS IT MAY GET GARBAGED
	TLNE	ARG,MACF	;MACRO?
	PUSHJ	PP,REFDEC	;YES, DECREMENT THE REFERENCE
	POP	PP,CS
	JRST	PURGE4		;REMOVE SYMBOL FROM TABLE

PURGE2:	PUSHJ	PP,SSRCH	;TRY OPERAND SYMBOL TABLE
	  JRST	PURGE5		;NOT FOUND GET NEXT SYMBOL
	TDNE	RC,[-2,,-2]	;CHECK COMPLEX EXTERNAL
	TLNE	ARG,SYNF
	JRST	.+2
	JRST	PURGE3
	TLNE	ARG,EXTF!UNDF	;ERROR IF EXTERNAL OR UNDEFINED
	TLNE	ARG,SYNF	;BUT NOT A SYNONYM
	JRST	PURGE4
PURGE3:	TROA	ER,ERRA		;NOT FOUND, ERROR
PURGE4:	PUSHJ	PP,REMOVE	;REMOVE FROM THE SYMBOL TABLE
PURGE5:	JUMPCM	PURGE0
	POPJ	PP,		;EXIT
OPD1:	TLNE	ARG,UNDF	;IF OPDEF IS UNDEFINED
	TRO	ER,ERRO		;GIVE "O" ERROR
OPD:	MOVE	AC0,V		;PUT VALUE IN AC0
	JRST	OP
IOP:	MOVSI	AC2,(POINT 9,0(PP),11)
IFE FORMSW,<	TLOA	IO,IOIOPF	;SET "IOP SEEN" AND SKIP>
IFN FORMSW,<	PUSH	PP,IOFORM	;USE I/O FORM
	JUMPAD	.+2		;[344] IF IN ADDRESS FIELD, DON'T CHANGE IOSEEN
	SETOM	IOSEEN		;[116] SIGNAL  FOR BOUT TO ADJUST FIELDS
	TLO	IO,IOIOPF	;SET "IOP" SEEN
	JRST	OP+2>
OP:	MOVSI	AC2,(POINT 4,0(PP),12)
IFN FORMSW,<	PUSH	PP,INFORM	;USE INST. FORM>
	PUSH	PP,RC
	PUSH	PP,AC0		;STACK CODE 
	PUSH	PP,AC2
	PUSHJ	PP,EVALEX	;EVALUATE FIRST EXPRESSION
	POP	PP,AC2
	JUMPNC	OP2
OP1B:	PUSHJ	PP,GETCHR	;GET A CHARACTER
IFE FORMSW,<JUMPCM XWD5		;PROCESS COMMA COMMA IN XWD>
IFN FORMSW,<JUMPNC .+4		;JUMP IF NO COMMA
	MOVE	AC2,HWFORM	;GET FORM WORD FOR XWD
	MOVEM	AC2,-2(PP)	;REPLACE INSTRUCTION FORM
	JRST	XWD5		;PROCESS COMMA COMMA IN XWD>
	TLO	IO,IORPTC	;NOT A COMMA,REPEAT IT
	LDB	AC1,AC2
	ADD	AC1,AC0
	DPB	AC1,AC2
IFN POLISH,<
	TLNN	FR,POLSW	;[164] DON'T ALLOW EXTERNAL ACS
>
	JUMPE	RC,OP1A		;EXTERNAL OR RELOCATABLE?
	PUSHJ	PP,QEXT		;YES, DETERMINE WHICH AND FLAG AN ERROR

OP1A:	PUSHJ	PP,EVALEX	;GET ADDRESS PART
OP2:	PUSHJ	PP,EVADR	;EVALUATE STANDARD ADDRESS
OP3:	POP	PP,AC0		;PUT IN AC0
	POP	PP,RC
IFN FORMSW,<	POP	PP,AC1	;GET FORM WORD>
	SKIPE	(PP)		;CAME FROM EVALCM?
	JRST	STOW		;NO,STOW CODE AND EXIT
	POP	PP,AC1		;YES,EXIT IMMEDIATELY
	POPJ	PP,
EVADR:				;EVALUATE STANDARD ADDRESS
IFE IIISW,<TLNN	AC0,-1		;OK IF ALL 0'S
	JRST	.+4		;IT WAS
	TLC	AC0,-1		;CHANGE ALL ONES TO ZEROS
	TLCE	AC0,-1		;OK IF ALL 1'S
	TRO	ER,ERRQ		;NO,FLAG Q ERROR>
	ADD	AC0,-1(PP)	;ADD ADDRESS PORTIONS
	HLL	AC0,-1(PP)	;GET LEFT HALF
	TLZE	FR,INDSW	;INDIRECT BIT?
	TLO	AC0,(Z @)	;YES, PUT IT IN
	MOVEM	AC0,-1(PP)	;RE-STACK CODE
	ADD	RC,-2(PP)	;UPDATE RELOCATION
	HRRM	RC,-2(PP)	;USE HALF WORD ADD
	CAIE	C,10		;"("?
	POPJ	PP,		;NO, EXIT

	MOVSS	EXTPNT		;WFW
	PUSHJ	PP,EVALCM	;EVALUATE
	MOVSS	EXTPNT		;WFW
	MOVSS	V,AC0		;SWAP HALVES
IFE IIISW,<MOVSS SX,RC
	IOR	SX,V		;MERGE RELOCATION
	TRNN	SX,-1		;RIGHT HALF ZERO?
	JRST	OP2A		;YES, DO SIMPLE ADD
	MOVE	ARG,RC		;NO, SWAP RC INTO ARG>
IFN IIISW,<MOVSS ARG,RC>
	ADD	V,-1(PP)	;ADD RIGHT HALVES
	ADD	ARG,-2(PP)
	HRRM	V,-1(PP)	;UPDATE WITHOUT CARRY
	HRRM	ARG,-2(PP)
	HLLZS	AC0		;PREPARE LEFT HALVES
	HLLZS	RC
IFE IIISW,<TLNE	SX,-1		;IS LEFT HALF ZERO?
	TRO	ER,ERRQ		;NO FLAG FORMAT ERROR
OP2A:	TLNE	RC,-1		;RELOCATION FOR LEFT HALF?
	PUSHJ	PP,OP2A1	;YES,IS IT LEGAL?
	TLNE	AC0,777000	;OP CODE FIELD USED?
	JRST	[EXCH AC0,-1(PP)	;YES, GET STORED CODE
		TLNE AC0,777000		;OP CODE FIELD BEEN SET?
		TRO ER,ERRQ		;YES, MOST LIKELY AN ERROR
		EXCH AC0,-1(PP)
		JRST	.+1]		;RETURN TO ADD >
	ADDM	AC0,-1(PP)	;MERGE WITH PREVIOUS VALUE
	ADDM	RC,-2(PP)
	CAIE	C,11		;")"?
	JRST	ERRAX		;NO, FLAG ERROR
				;YES, BYPASS PARENTHESIS
BYPAS1:	PUSHJ	PP,GETCHR
BYPAS2:	JUMPE	C,.-1		;SKIP TRAILING BLANKS
	POPJ	PP,		;EXIT
IFE IIISW,<
OP2A1:	EXCH	RC,-2(PP)	;GET STORED CODE
	TLNN	RC,-1		;OK IF ALL ZERO
	JRST	OP2A2		;OK SO RETURN
	TLC	RC,-1		;CHANGE ALL ONES TO ZEROS
	TLCE	RC,-1		;OK IF ALL ONES
	TRO	ER,ERRQ		;OTHERWISE A "Q" ERROR
OP2A2:	EXCH	RC,-2(PP)	;GET RC,BACK
	POPJ	PP,		;AND RETURN>


EXPRES:	HRLZ	AC0,RX		;FUDGE FOR OCT0

OCT0:	PUSH	PP,RX
	HLR	RX,AC0
IFN POLISH,<
	MOVNI	AC0,3		;[164] PRESET POLISH TYPE SINCE WE
	MOVEM	AC0,POLTYP	;[164] NEED FULL WORD FIXUPS IF POLISH
>
OCT1:	PUSHJ	PP,EVALEX	;EVALUATE
IFN POLISH,<
	TDNE	RC,[-2,,-2]	;[164] TEST FOR EXTERNAL
	PUSHJ	PP,OCTFW	;[164] YES, NEEDS FULL WORD FIXUP
>
IFN FORMSW,<	MOVE	AC1,HWFORM>
	PUSHJ	PP,STOW		;STOW CODE
	JUMPCM	OCT1
	POP	PP,RX		;YES, RESTORE RADIX
IFN POLISH,<
	SETZM	POLTYP		;[164] CLEAR FLAG
>
	POPJ	PP,		;EXIT

IFN POLISH,<
;HERE TO GENERATE FULL WORD FIXUPS FOR EXP EXTERN
;NOTE THIS GENERATES BLOCK TYPE 11 POLISH FIXUPS
;THESE CANNOT BE LOADER BY LOADER UNLESS FAILSW IS ON

OCTFW:	MOVE	PV,FREE		;[164] COPY CODE FROM POLPOP
	EXCH	PV,POLIST	;[164] TO SET UP A NEW BLOCK
	PUSHJ	PP,POLSTR	;[164] STORE POINTER TO LAST
	MOVE	PV,EXTPNT	;[164] GET POINTER TO EXTERNAL SYMBOL
	PUSHJ	PP,POLFS2	;[164] STORE EXTERNAL
	JRST	POLOCT		;[164] AND FIXUP ADDRESS, AND RETURN
>
SIXB10:	MOVSI	RC,(POINT 6,AC0)	;SET UP POINTER
	MOVEI	AC0,0		;CLEAR WORD

SIXB20:	PUSHJ	PP,CHARL	;GET NEXT CHARACTER
	CAMN	C,SX		;IS THIS PRESET DELIMITER?
IFE FORMSW,<	JRST	ASC60		;YES>
IFN FORMSW,<
	JRST	[PUSHJ	PP,BYPAS1
		ANDCM	RC,STPX
		MOVE	AC1,SXFORM
		SETZM	INTXT		;[320] NO LONGER IN TEXT
		JUMPGE	RC,STOWZ
		POPJ	PP,]>
	CAIL	C,"A"+40
	CAILE	C,"Z"+40
	JRST	.+2
	TRZA	C,100		;CONVERT LOWER CASE TO SIXBIT
	SUBI	C,40		;CONVERT TO SIXBIT
	JUMPL	C,ASC55		;TEST FOR INVALID CHARACTER
	IDPB	C,RC		;NO, DEPOSIT THE BYTE
	TLNE	RC,770000	;IS THE WORD FULL?
	JRST	SIXB20		;NO, GET NEXT CHARACTER
IFN FORMSW,<	MOVE	AC1,SXFORM	;SIXBIT FORM>
	PUSHJ	PP,STOWZ	;YES, STORE
	JRST	SIXB10		;GET NEXT WORD
%TEXT1:	TLC	AC0,240000	;[232] CONVERT .TEXT TO COMMENT ON PASS1
ASCII0:	HLLZ	SDEL,AC0	;STORE ASCII/ASCIZ FLAG
ASC10:	PUSHJ	PP,CHARL	;GET FIRST NON-BLANK
	CAIE	C," "
	CAIN	C,HT
	JRST	ASC10
	CAIG	C,CR		;CHECK FOR CRRET AS DELIM
	CAIGE	C,LF
	CAIA
	JRST	ERRAX
	FORERR	(SX,TXT)
	SETOM	INTXT
	MOVE	SX,C		;SAVE FOR COMPARISON
	JUMPG	SDEL,SIXB10	;BRANCH IF SIXBIT

ASC20:	MOVSI	RC,(POINT 7,AC0)	;SET UP POINTER
	TLNE	SDEL,200000	;THIS BIT (AND BIT0) IN FOR COMMENT
	MOVSI	RC,440000	;SO NOTHING WILL BE DEPOSITED
IFE IIISW,<MOVEI AC0,0		;CLEAR WORD>
IFN IIISW,<TLNE	SDEL,100000	;ASCID?
	TLZA	SDEL,400000	;YES, ZERO ASCIZ BIT
	TDZA	AC0,AC0		;NO, ZERO WORD
	MOVE	AC0,[BYTE (7) 10,10,10,10,10 (1) 1]	;YES, A WORD FULL OF BACKSPACES>
ASC30:	PUSHJ	PP,CHARL	;GET ASCII CHARACTER AND LIST
	CAMN	C,SX		;TEST FOR DELIMITER
	JRST	ASC50		;FOUND
	IDPB	C,RC		;DEPOSIT BYTE
	TLNE	RC,760000	;HAVE WE FINISHED WORD?
	JRST	ASC30		;NO,GET NEXT CHARACTER
IFN FORMSW,<	MOVE	AC1,ASCIIF	;USE ASCII FORM WORD>
	TLNE	SDEL,040000	;.TEXT ?
	JRST	[PUSHJ	PP,STOTXT	;YES, STORE IN REL FILE
		JRST	ASC20]		;CONTINUE
	PUSHJ	PP,STOWZ	;YES, STOW IT
	JRST	ASC20		;GET NEXT WORD

ASC55:	TDZA	CS,CS		;ZERO CS IN CASE NESTED
ASC50:	TDZA	RC,SDEL		;TEST FOR ASCIIZ
	TROA	ER,ERRA		;SIXBIT ERROR EXIT
ASC60:	PUSHJ	PP,BYPAS1	;POLISH OFF TERMINATOR
	SETZM	INTXT		;WE ARE OUT OF IT
IFN FORMSW,<	MOVE	AC1,ASCIIF	;USE ASCII FORM WORD>
IFN IIISW,<TLNN	SDEL,100000	;NO EXTRA WORDS FOR ASCID>
	ANDCM	RC,STPX		;STORE AT LEAST ONE WORD
	TLNN	SDEL,200000	;GET OUT WITHOUT STORING
	JUMPGE	RC,[TLNN SDEL,040000	;.TEXT?
		JRST	STOWZ		;NO, STOW
		JRST	STOTXT]		;YES, STORE IN REL FILE
	POPJ	PP,		;ASCII, NO BYTES STORED, SO EXIT
;[232] .TEXT PSEUDO-OP

%TEXT0:	JUMP1	%TEXT1		;IGNORE ON PASS1
	PUSH	PP,BLKTYP	;SAVE CURRENT TYPE
	PUSHJ	PP,COUTD	;[370] DUMP CURRENT BLOCK
	HLLZ	SDEL,AC0	;[370] FLAG BITS FOR ASCII
	SETZM	BLKTYP		;DON'T KNOW IT YET
	PUSHJ	PP,ASC10	;START PROCESSING
	PUSHJ	PP,STOTXD	;FINISH BLOCK
	POP	PP,BLKTYP	;RESTORE PREVIOUS
	POPJ	PP,

STOTXT:	SKIPN	BLKTYP		;FIRST WORD?
	JRST	[MOVEM	AC0,BLKTYP
		POPJ	PP,]	;SAVE AS BLOCK TYPE
	SKIPN	COUTRB		;2ND WORD
	JRST	[MOVEM	AC0,COUTRB
		POPJ	PP,]
	AOS	C,COUTX		;NO, JUST STORE AS NORMAL
	MOVEM	AC0,COUTDB(C)
	CAIE	C,^D17		;BUFFER FULL?
	POPJ	PP,		;NO

STOTXD:	SKIPN	C,BLKTYP	;[331] SEE IF ANY TEXT TO OUTPUT
	JRST	COUTI		;[331] NO JUST CLEAR COUNTS
	AOS	COUTX		;[331] ACCOUNT FOR STARTING FROM -1
	SETZM	BLKTYP		;[331] CLEAR BLOCKTYPE WORD FOR NEXT BLOCK
	TRNN	C,177_1		;[331] SEE IF RELOCATION WORD IS NEEDED
	AOS	COUTRB		;[331] FIRST WORD OF BLOCK WAS NOT FULL,
				;[331] 2ND WAS 0, PUT THE LSN BIT ON FOR
				;[331] COUTD2 TO CHECK SO THERE WON'T BE
				;[331] AN EXTRA 0 WORD IN THE FILE
	JRST	COUTT		;DUMP BLOCK
POINT0:
IFN FORMSW,<	PUSH	PP,BPFORM	;USE BYTE POINTER FORM WORD>
	PUSH	PP,RC		;STACK REGISTERS
	PUSH	PP,AC0
	PUSHJ	PP,EVAL10	;EVALUATE RADIX 10
	DPB	AC0,[POINT 6,0(PP),11]	;STORE BYTE SIZE
	JUMPNC	POINT2
IFN POLISH,<
	SETOM	POLTYP		;[164] FORCE RIGHT-HALF FIXUP IF POLISH
>
	PUSHJ	PP,EVALEX	;NO, GET ADDRESS
	PUSHJ	PP,EVADR	;EVALUATE STANDARD ADDRESS
IFN POLISH,<
	SETZM	POLTYP		;[164] BACK TO NORMAL
>
	JUMPNC	POINT2
	PUSHJ	PP,EVAL10	;EVALUATE RADIX 10
	TLNE	IO,NUMSW	;IF NUMERIC
	TDCA	AC0,[-1]	;POSITION=D35-RHB
POINT2:	MOVEI	AC0,0		;OTHERWISE SET TO D36
	ADDI	AC0,^D36
	LSH	AC0,^D30
	ADDM	AC0,0(PP)	;UPDATE VALUE
	JRST	OP3
XWD0:
IFN FORMSW,<	PUSH	PP,HWFORM	;USE HALF WORD FORM>
	PUSH	PP,RC
	PUSH	PP,AC0		;STORE ZERO ON STACK
	PUSHJ	PP,EVALEX	;EVALUATE EXPRESSION
	JUMPNC	OP2
XWD5:	SKIPN	(PP)		;ANY CODE YET?
	JRST	XWD10		;NO,USE VALUE IN AC0
	JUMPE	AC0,.+2		;ANYTHING IN AC0?
	TRO	ER,ERRQ		;YES,FLAG "Q"ERROR
	MOVE	AC0,(PP)	;USE PREVIOUS VALUE
	MOVE	RC,-1(PP)	;AND RELOCATION
XWD10:	TLNN	AC0,-1		;[143] LEFT HALF SHOULD BE ZERO
	JRST	XWD11		;[143] IT IS
	TLC	AC0,-1		;[143] OR AT LEST ALL ONES
	TLCE	AC0,-1		;[143] FOR XWD -1,-2 ETC
	TRO	ER,ERRQ		;[143] NO, WARN USER
XWD11:	HRLZM	AC0,0(PP)	;SET LEFT HALF
	HRLZM	RC,-1(PP)
	MOVSS	EXTPNT		;WFW
	JRST	OP1A		;EXIT THROUGH OP

IOWD0:	PUSHJ	PP,EVALQ	;[222] EVALUATE AND TEST FOR EXTERNAL
	CAIE	C,14		;","?
	JRST	[SKIPN	AC0		;IF NZERO AND NO "," SEEN
		TRO ER,ERRQ		;TREAT AS Q ERROR
IFN FORMSW,<	MOVE	AC1,HWFORM	;USE HALF WORD FORM>
		SOJA AC0,STOW]		;NO, TREAT AS RIGHT HALF
	PUSH	PP,AC0		;YES, STACK LEFT HALF
	PUSHJ	PP,EVALEX	;WFW
	SUBI	AC0,1
	POP	PP,AC1		;RETRIEVE LEFT HALF
	MOVNS	AC1
	HRL	AC0,AC1
IFN FORMSW,<	MOVE	AC1,HWFORM	;USE HALF WORD FORM>
	JRST	STOW		;STOW CODE AND EXIT
BYTE0:	PUSHJ	PP,BYPAS1	;GET FIRST NON-BLANK
	CAIE	C,10		;"("?
	JRST	ERRAX		;NO, FLAG ERROR AND EXIT
IFN FORMSW,<
	PUSH	PP,[1]
	MOVEI	AC0,0
>
	PUSH	PP,RC
	PUSH	PP,AC0		;INITIALIZE STACK TO ZERO
	MOVSI	ARG,(POINT -1,(PP))

BYTE1:	PUSH	PP,ARG
	PUSHJ	PP,EVAL10	;EVALUATE RADIX 10
	POP	PP,ARG
	CAIG	AC0,^D36	;TEST SIZE
	JUMPGE	AC0,.+2
	TRO	ER,ERRA
	DPB	AC0,[POINT 6,ARG,11]	;STORE BYTE SIZE

BYTE2:	IBP	ARG		;INCREMENT BYTE
	TRZN	ARG,-1		;OVERFLOW?
	JRST	BYTE3		;NO
	SETZB	AC0,RC		;YES
	EXCH	AC0,0(PP)	;GET CURRENT VALUES
	EXCH	RC,-1(PP)	;AND STACK ZEROS
IFN FORMSW,<
	MOVE	AC1,HWFORM	;USE STANDARD FORM
	EXCH	AC1,-2(PP)	;GET FORM WORD
>
	PUSHJ	PP,STOW		;STOW FULL WORD

BYTE3:	PUSH	PP,ARG
	PUSHJ	PP,EVALEX	;COMPUTE NEXT BYTE
	POP	PP,ARG
	DPB	AC0,ARG		;STORE BYTE
	HLLO	AC0,ARG
	DPB	RC,AC0		;STORE RELOCATION

IFN FORMSW,<
	MOVEI	AC0,1
	HRRI	ARG,-2
	DPB	AC0,ARG		;STORE FORM BYTE
	HRRI	ARG,0
>
	JUMPCM	BYTE2
	CAIN	C,10		;"("?
	JRST	BYTE1		;YES, GET NEW BYTE SIZE
	JRST	OP3		;NO, EXIT
RADX50:	PUSHJ	PP,EVALEX	;EVALUATE CODE
	JUMPN	RC,ERRAX	;ERROR IF NOT ABSOLUTE
	JUMPNC	ERRAX
	TDZE	AC0,[EXP ^-74]	;[322] MAKE SURE ONLY 74 BITS ON
	TRO	ER,ERRQ		;[322] NOPE, LIGHT Q ERROR
	PUSH	PP,AC0		;[160] SAVE CODE BITS
	PUSHJ	PP,GETSYM	;YES, GET SYMBOL
	TRZ	ER,ERRA		;CLEAR ERROR
	POP	PP,ARG		;[160] PUT CODE INTO ARG
	PUSHJ	PP,SQOZE	;SQUOZE SIXBIT AND ADD CODE
IFN FORMSW,<	MOVE	AC1,HWFORM	;USE STANDARD FORM>
	JRST	STOW		;STOW CODE AND EXIT


SQOZE:	MOVE	AC1+1,AC0	;PUT SIXBIT IN AC1+1
	MOVEI	AC0,0		;CLEAR RESULT
SQOZ1:	MOVEI	AC1,0
	LSHC	AC1,6		;PUT 6-BIT CHARACTER IN AC1
	LDB	AC1,[POINT 6,CSTAT(AC1),23]	;CONVERT TO RADIX50
	IMULI	AC0,50		;MULTIPLY PREVIOUS RESULT
	ADD	AC0,AC1		;ADD NEW CHARACTER
	JUMPN	AC1+1,SQOZ1	;TEST FOR END
	LSH	ARG,^D30	;LEFT-JUSTIFY CODE
	IOR	AC0,ARG		;MERGE WITH RESULT
	POPJ	PP,
; .LINK PSEUDO OP.   FORM IS
;
;	.LINK	LNKNO, LNKLOC, LNKNXT
;
;WHERE LNKNO IS THE LINK NUMBER, LNKLOC IS THE LOCATION INTO WHICH
;LINK SHOULD STORE THE CURRENT VALUE OF THE LINK POINTER, AND
;LNKNXT IS AN OPTIONAL ARGUMENT WHICH LINK WILL ACCEPT AS THE
;NEW VALUE OF THE LINK POINTER (IF LNKNXT ABSENT THEN LNKLOC IS
;THE NEW POINTER VALUE).

%LINK:	PUSH	PP,BLKTYP	;SAVE BLOCK TYPE
	PUSH	PP,AC0
	JUMP1	LINK1		;SKIP CODE GEN IF P1
	PUSHJ	PP,COUTD
	MOVEI	AC0,12		;LINK TYPE
	MOVEM	AC0,BLKTYP
LINK1:	PUSHJ	PP,EVALEX	;EVAL CHECK EXT
	POP	PP,AC1		;GET BITS BACK
	JUMPN	RC,LNKERR	;MUST BE ABS
	JUMPNC	LNKERR		;GRNTEE COMMA
	TLNE	AC1,400000	;LNKEND?
	MOVN	AC0,AC0		;YES, NEGATE RESULT
	JUMP1	LINK2		;SKIP IF P1
	PUSHJ	PP,COUT
LINK2:	PUSHJ	PP,EVALXQ	;NO EXTERNALS
	JUMPNC	LINK2A		;[423] THIRD ARGUMENT SPECIFIED?
	HRL	AC0,RC		;[423] YES - MUST FIRST SAVE THE
	PUSH	PP,AC0		;[423] OLD VALUES OF RC, AC0
	PUSHJ	PP,EVALXQ	;[423] READ IN THIRD ARGUMENT
	MOVS	AC0,AC0		;[423] LINK EXPECTS LNKNXT IN THE
	MOVS	RC,RC		;[423] LEFT HALF OF SECOND WORD
	HRR	AC0,(PP)	;[423] RESTORE LNKLOC VALUE
	HLR	RC,(PP)		;[423] AND ITS RELOCATION BIT
	TLNE	RC,1		;[423] LNKNXT RELOCATABLE???
	 TRO	RC,2		;[423] YES - SET FOR COUT TO DEPOSIT
	SUB	PP,[1,,1]	;[423] "POP" BOGUS WORD OFF STACK
LINK2A:	JUMP1	LINK3
	PUSHJ	PP,COUT		;DUMP LOC
	PUSHJ	PP,COUTD	;FINISH BLOCK
LINK3:	POP	PP,BLKTYP	;RESTORE BLKTYP
	POPJ	PP,

LNKERR:	POP	PP,BLKTYP	;RESTORE BLOCK TYPE
	PJRST	ERRAX		;GIVE ERROR RETURN
%INTEG:	PUSHJ	PP,GETSYM	;GET A SYMBOL
	JRST	INTG2		;BAD SYMBOL ERROR
	TLO	IO,DEFCRS	;THIS IS A DEFINTION
	PUSHJ	PP,SSRCH	;SEE IF THERE
	MOVSI	ARG,SYMF!UNDF	;SET SYMBOL AND UNDEFINED IF NOT
	TLNN	ARG,UNDF	;IF ALREADY DEFINED
	JRST	INTG1		;JUST IGNORE
	TLOA	ARG,VARF	;SET VARIABLE FLAG
INTG2:	TROA	ER,ERRA		;SYMBOL ERROR
	PUSHJ	PP,INSERZ	;PUT IN WITH ZERO VALUE (LENGTH OF 1)
INTG1:	JUMPCM	%INTEG
	POPJ	PP,

%ARAY:	MOVEM	PP,ARAYP	;SAVE PUSHDOW POINTER
ARAY2:	PUSHJ	PP,GETSYM
	JRST	ARAY1		;BAD SYMBOL GIVE ERROR AND ABORT
	PUSH	PP,AC0		;SAVE NAME
	JUMPCM	ARAY2		;AND GO ON IF A COMMA
	CAIE	C,"["-40	;MUST BE A [
	JRST	ARAY1
	BYPASS			;OH,	WELL
	TLO	IO,IORPTC
	PUSHJ	PP,EVALXQ	;GET A SIZE
	CAIE	C,"]"-40	;MUST END RIGHT
	JRST	ARAY1
	BYPASS			;??
	HRRZ	V,AC0		;GET VALUE
	SUBI	V,1
NXTVAL:	POP	PP,AC0
	PUSH	PP,V		;SAVE OVER SEARCH
	TLO	IO,DEFCRS
	PUSHJ	PP,SSRCH	;FIND IT
	MOVSI	ARG,SYMF!UNDF
	POP	PP,V		;GET VALUE BACK
	TLNN	ARG,UNDF
	JRST	ARAY3
	TLO	ARG,VARF
	MOVEI	RC,0		;NO RELOC
	PUSHJ	PP,INSERT
ARAY3:	CAME	PP,ARAYP
	JRST	NXTVAL		;STILL NAMES STACKED
	JUMPCM	ARAY2
	POPJ	PP,

ARAY1:	TRO	ER,ERRA		;ERROR EXIT
	MOVE	PP,ARAYP
	POPJ	PP,		;RESET PDL AND GO
;[121] .COMMON SYMBOL [SIZE]
SYN	ARAYP,COMMP		;SAVE SPACE

COMM0:	JUMP1	COMM1		;WASTE OF TIME ON PASS1
	PUSHJ	PP,COUTD	;DUMP CURRENT BLOCK
	PUSH	PP,BLKTYP	;SAVE TYPE
	MOVEI	AC0,20		;COMMON BLOCK TYPE
	MOVEM	AC0,BLKTYP	;SET NEW
COMM1:	MOVEM	PP,COMMP	;SAVE PUSHDOWN POINTER
COMM2:	PUSHJ	PP,GETSYM	;GET A 6-BIT SYMBOL NAME
	  JRST	COMM7		;BAD SYMBOL, GIVE UP
	PUSH	PP,AC0		;SAVE SYMBOL NAME
	JUMPCM	COMM2		;AND GET ANOTHER IF COMMA

	CAIE	C,'['		;MUST BE A [
	JRST	COMM7		;YOU LOSE
	BYPASS			;SKIP ANY LEADING SPACES
	TLO	IO,IORPTC	;BUT NOT LAST CHAR
	PUSHJ	PP,EVALXQ	;GET SIZE OF COMMON
	CAIE	C,']'		;MUST END RIGHT
	JRST	COMM7
	HRRZ	V,AC0		;GET VALUE
				;PUSHDOWN STACK IS IN WRONG ORDER, REVERSE IT
	HRRZ	RC,PP		;TOP ITEM
	HRRZ	ARG,COMMP	;BOTTOM ITEM
	ADDI	ARG,1		;WELL ALMOST
COMM6:	CAIG	RC,(ARG)	;ANYTHING TO MOVE?
	JRST	COMM3		;NO
	MOVE	0,(RC)		;MOVE TOP
	EXCH	0,(ARG)		;TO BOTTOM
	MOVEM	0,(RC)
	SUBI	RC,1		;DECREMENT
	AOJA	ARG,COMM6	;AND TRY AGAIN

COMM3:	JUMP1	[MOVE	AC0,0(PP)	;[430] GET SYMBOL
		PUSHJ	PP,SEARCH	;[430] PERFORM GENERAL SEARCH
		JRST	COMM3A		;[430] NOT FOUND, GOOD
		JUMPL	ARG,CMNERR	;[430] FOUND, OPERAND, WARN
		CAME	AC0,-3(SX)	;[430] MACRO, LOOK ONE SLOT BELOW
		JRST	COMM3A		;[430] NOT FOUND, CONTINUE
		JRST	CMNERR		;[430] WARNING
		]
COMM3A:	POP	PP,AC0		;GET SYMBOL OFF STACK
	JUMP1	.+2		;IGNORE V ON PASS 1
	PUSH	PP,V		;SAVE VALUE
	PUSHJ	PP,EXTER1	;DEFINE AS EXTERNAL
				;NOTE, CS IS NOT ON A COMMA, SO WILL RETURN
	JUMP1	COMM4		;ALL DONE IF PASS1
	SETZ	RC,		;NO RELOCATION
	MOVEI	ARG,4		;FORM RADIX50 04,SYMBOL
	PUSHJ	PP,SQOZE	;IN AC0
	PUSHJ	PP,COUT		;OUTPUT SYMBOL
	POP	PP,V		;GET VALUE BACK
	MOVE	AC0,V		;AND INTO AC0
	PUSHJ	PP,COUT		;SECOND PART OF PAIR
COMM4:	CAME	PP,COMMP	;FINISHED WITH STACKED SYMBOLS
	JRST	COMM3		;NO MORE TO GO
	BYPASS			;GET NEXT DELIMITER
	JUMPCM	COMM2		;MORE TO GO IF COMMA NEXT
COMM5:	JUMP1	CPOPJ
	PUSHJ	PP,COUTD	;DUMP THIS BLOCK
	POP	PP,BLKTYP	;RESTORE LAST
	POPJ	PP,


COMM7:	TRO	ER,ERRA		;FLAG ERROR
	MOVE	PP,COMMP	;RESET PUSHDOWN POINTER
	JRST	COMM5		;RESTORE BLKTYP AND EXIT

CMNERR:	PUSHJ	PP,EWARN	;[430] WARNING
	MOVSI	RC,[SIXBIT /SOC STATEMENT OUT OF ORDER .COMMON@/]	;[430] SYMBOL IN AC0
	PUSHJ	PP,TYPMSG	;[430]
	AOS	QERRS		;[430] COUNT AS WARNING
	JRST	COMM3A		;[430] CONTINUE
;[122] .REQUEST DEV:FILENAME[PPN]

REQUIR:	SKIPA	CS,[16]		;BLOCK TYPE 16
REQUES:	MOVEI	CS,17		;BLOCK TYPE 17
	JUMP1	REMAR0		;IGNORE ON PASS 1
	PUSHJ	PP,COUTD	;DUMP CURRENT
	PUSH	PP,BLKTYP	;SAVE LAST BLOCK TYPE
	MOVEM	CS,BLKTYP	;SET NEW
REQU0:
REPEAT 3,<PUSH	PP,[0]>		;STACK A NULL SPEC INCASE OF ERROR
	BYPASS			;[345] FLUSH EXTRA TABS AND SPACES
	TLO	IO,IORPTC	;[350]BACK OFF BECAUSE SCHGET
				;[350]WILL TRY TO GET THIS CHARACTER
	PUSHJ	PP,SCHGET	;[335] GET PART OF A FILE SPEC
	JUMPE	AC0,REQUER	;[335] ERROR IF NOTHING
	CAIE	C,':'		;WAS THERE A DEVICE
	JRST	REQU1		;NO, GOOD GUESS
	MOVEM	AC0,-2(PP)	;SAVE DEVICE
	PUSHJ	PP,SCHGET	;[335] GET THE FILE NAME
	JUMPE	AC0,REQUER	;[335] ERROR IF NOTHING
REQU1:	MOVEM	AC0,(PP)	;STORE FILE NAME
	CAIN	C,'.'		;[335] SEE IF AN EXTENSION GIVEN
	JRST	REQU4		;[335] YES, GO SKIP IT AND MAKE SURE IT'S
REQU3:				;[335] A .REL FILE, CAUSE THAT'S ALL IT CAN BE
	CAIE	C,'['		;WAS THERE A PPN
	JRST	REQU2		;NO, AS EXPECTED
	BYPASS			;SKIP ANY BLANKS
	TLO	IO,IORPTC
	PUSHJ	PP,EVALXQ	;GET HALF A PPN
	HRLM	AC0,-1(PP)	;STORE IT
	PUSHJ	PP,EVALXQ	;GET OTHER HALF
	HRRM	AC0,-1(PP)	;STORE IT
	CAIE	C,']'		;MUST END ON ]
	JRST	REQUER		;IT DIDN'T
	BYPASS			;[273]HANDLE PPN CORRECTLY
REQU2:	SETZ	RC,		;NO RELOCATION
	POP	PP,AC0		;GET FILE NAME
	PUSHJ	PP,COUT
	POP	PP,AC0		;AND PPN
	PUSHJ	PP,COUT
	POP	PP,AC0		;FINALLY DEVICE
	PUSHJ	PP,COUT
	JUMPCM	REQU0		;MORE TO COME
	PUSHJ	PP,COUTD	;DUMP BLOCK
	POP	PP,BLKTYP	;RESTORE BLOCK TYPE
	POPJ	PP,		;NO

REQU4:	PUSHJ	PP,SCHGET	;[335] GO SCAN OUT EXTENSION
	HLRZ	AC0,AC0		;[335] SWAP FOR CAIE
	CAIE	AC0,'REL'	;[335] SEE IF IT'S FOR .REL
	TRO	ER,ERRQ		;[335] NOPE, TELL HIM ABOUT IT
	JRST	REQU3		;[335] BACK TO LOOK FOR PPN

REQUER:	SUB	PP,[3,,3]	;REMOVE THE THREE ITEMS
	POP	PP,BLKTYP	;RESTORE BLOCK TYPE
	JRST	ERRAX		;AND GIVE UP
;[202] NEW .DIRECTIVE PSEUDO-OP 
;[202] ARGS ARE FUNCTIONS TO BE DONE
;[421] CLEAN UP DIRECTIVE CODE
;[421] ADD .DIRECTIVE NO XXXX WHICH NEGATES EFFECT

%DIREC:
	SETZM	NOFLG		;START W/POSITIVE DIRECTIVE
DIREC1:	PUSHJ	PP,GETSYM	;GET SYMBOL
	  JRST	ERRAX		;MISSING, GIVE ERROR
	CAMN	AC0,[SIXBIT /NO/];IS IT "NO"
	JRST	[ SKIPE  NOFLG  ;IS NEGATIVE FLAG OFF?
		  TROA   ER,ERRQ;NO. DONT ALLOW .DIRECT NO NO XXXX
		  SETOM  NOFLG  ;SET AS NEGATIVE DIRECTIVE
		  TLO IO,IORPTC ;REGET THE DELIMITER
		  JRST DIREC1]	;AND GET NEXT SYMBOL
	MOVSI	ARG,-DIRLEN	;AOBJN WORD
	CAMN	AC0,DIRARG(ARG)	;LOOK FOR MATCH
	JRST	DIRFND		;GOT IT
	AOBJN	ARG,.-2		;LOOP FOR ALL OF TABLE
	JRST	ERRAX		;NOT FOUND, GIVE ERROR

DIRFND:
	SKIPE	NOFLG		;IS THIS A NEGATIVE DIRECTIVE?
	JRST	DIRNDO		;YES,GO PROCESS IT
	XCT	DIPXCT(ARG)	;EXECUTE THE INSTRUCTION
	JRST	DIREND		;SEE IF MORE TO DO
DIRNDO:				;HERE FOR NEGATIVE DIRECTIVE
	SKIPN	DINXCT(ARG)	;ANYTHING THERE TO DO?
	TROA	ER,ERRA		;NO, NOTHING TO DO
	XCT	DINXCT(ARG)	;ELSE DO IT
DIREND:	
	JUMPCM	%DIREC		;GET NEXT SYMBOL IF COMMA FOLLOWS
	POPJ	PP,		;ELSE RETURN
; TABLES FOR DIRECTIVE PROCESSOR

;[421]
; THE DIRMAK MACRO DEFINES THE ARGUMENTS FOR THE .DIRECTIVE PSEUDO-OP
; THE FIRST ENTRY IS THE NAME OF THE PARTICULAR DIRECTIVE
; THE SECOND ENTRY IS THE INSTRUCTION TO EXECUTE IF THE CASE IS
;	.DIRECTIVE XXXXXX
; THE THIRD ARGUMENT IS THE INSTRUCTION TO EXECUTE IF THE CASE IS
;	.DIRECTIVE NO XXXXXX
; IF THERE IS NO LOGICAL NEGATIVE FOR THIS DIRECTIVE, IT SHOULD
; BE LEFT BLANK.
; THE THREE TABLES CREATED ARE  DIRARG, DIPXCT, DINXCT

	DEFINE DIRMAK, <
	XLIST
	X (.NOBIN,<PUSHJ PP,%NOBIN>)		;;DONT GENERATE REL FILE
	X (.ITABM,<SETZM DECTAB>,<SETOM DECTAB>);;INCLUDE TABS IN MACRO ARGS
	X (.XTABM,<SETOM DECTAB>,<SETZM DECTAB>);;EXCLUDE  "" " ""
	X (KA10,<PUSHJ PP,SETKA>)		;;SET PROCESSOR TYPE KA
	X (KI10,<PUSHJ PP,SETKI>)		;;SET PROCESSOR TYPE KI
	X (KL10,<PUSHJ PP,SETKL>)		;;SET PROCESSOR TYPE KL
	X (.OKOVL,<SETOM OKOVFL>,<SETZM OKOVFL>);;ALLOW /,* OVERFLOW
	X (.EROVL,<SETZM OKOVFL>,<SETOM OKOVFL>);;DONT ALLOW /,* OVERFLOW
IFN TSTCD,<
	X (.TCDON,<PUSHJ PP,TCDSET>)		;;DEBUG NEW CODE TYPES
	X (.TCDOF,<SETZM TCDFLG>)		;; ""    ""  ""    ""
> ; END OF IFN TSTCD CONDITIONAL

	LIST
  > ; END OF DIRMAK DEFINITION


; DEFINE TABLE OF DIRECTIVE ARGUMENTS
	DEFINE X($A,$B,$C)< SIXBIT \$A\>

DIRARG:	DIRMAK
	DIRLEN==.-DIRARG

; DEFINE TABLE OF POSITIVE DIRECTIVE ACTIONS
	DEFINE X($A,$B,$C)< $B>

DIPXCT:	DIRMAK

; DEFINE TABLE OF NEGATIVE DIRECTIVE ACTIONS
	DEFINE X($A,$B,$C)< 
	IFB <$C>,<EXP 0>
	IFNB <$C>, <$C> >

DINXCT:	DIRMAK
; [421] SET THE VARIOUS FLAVORS OF CPU FOR LINK TO CHECK

SETKA:	SKIPA	ARG,[1B5]	;[235]
SETKI:	MOVSI	ARG,(2B5)	;[235]
	SKIPA			;[413]SET FOR KI OR KA
SETKL:	MOVSI	ARG,(4B5)	;[413] KA=1 KI=2 KL=4
	IORM	ARG,CPUTYP	;[413]MAKE INCLUSIVE WITH WHAT IS THERE
	POPJ	PP,		;[413]THEN RETURN


; [421] SET TEST CODE UP FOR DEBUGGING NEW LINK TYPES

IFN TSTCD,<
TCDSET:	SETOM	TCDFLG		;[414]SET FLAG ON
	PUSHJ	PP,COUTD	;[414]BIND OFF LAST BLOCK
	POPJ	PP,		;[414]
> ; NFI TSTCD [414]
; PSEUDO-END STATEMENT FOR MULTI-FILE CAPABILITY

; HERE IF PRGEND (PASS 1)
PSEND0:	TLO	IO,MFLSW	;PSEND SEEN
	PUSHJ	PP,END0		;AS IF END STATEMENT
	HLLZS	IO		;CLEAR ER(RH)
	SETZM	ERRCNT		;CLEAR ERROR COUNT FOR EACH PROG.
	SETZM	QERRS		;[145] ...
	JUMP2	PSEND2		;DIFFERENT ON PASS2
	SKIPE	UNIVSN		;SEEN A UNIVERSAL
	PUSHJ	PP,UNISYM	;YES, STORE SYMBOLS
	PUSHJ	PP,PSEND4	;SAVE SYMBOLS, POINTERS AND TITLE
	MOVE	AC0,[ASCII /.MAIN/] ;[420] GET DEFAULT TITLE
	MOVEM	AC0,TBUF	;[420]AND MAKE IT CURRENT TITLE
	SETZM	TBUF+1		;CLEAR TITLE SEEN FLAG
	SETZM	RELLOC		;[346] CLEAR TO PREVENT EFFECTS ACROSS PRGEND
PSEND1:	TLZ	IO,MFLSW	 ;FOR NEXT FILE
	SETZM	UNISCH		;CLEAR UNIVERSAL SEARCH TABLE
	MOVE	AC0,[UNISCH,,UNISCH+1]
	BLT	AC0,UNISCH+.UNIV-1
	TLO	IO,IOPAGE	;[142] SIGNAL NEW PAGE BUT DON'T CHANGE NUMBER
	MOVSI	AC0,1		;SET SO RELOC 0 WORKS
	HRRZM	AC0,LOCA	;[165] SET ASSEMBLY LOCATION
	HRRZM	AC0,LOCO	;[165] AND OUTPUT LOCATION
	HLRZM	AC0,MODA	;[165] SET MODE
	HLRZM	AC0,MODO	;[165]
	POPJ	PP,		;[165]

; HERE IF PRGEND (PASS 2)
PSEND2:	SETZM	SBUF		;SO SUBTTL IS NOT WRONG
	SETZM	UNIVSN		;[226] IN CASE IN UNIVERSAL
	PUSHJ	PP,PSEND5	;PUT TITLE BACK
	PUSHJ	PP,PSEND1	;COMMON  CODE
	JRST	PASS20		;OUTPUT THE ENTRIES

; HERE IF END (PASS 1)
PSEND3:	PUSHJ	PP,PSEND4	;SAVE LAST PROGRAM 
	HLRS	PRGPTR		;REINITIALIZE POINTER
	PJRST	PSEND5		;READ BACK FIRST PROGRAM
;HERE TO SAVE AND RESTORE SYMBOL TABLE, TITLE AND OTHER USEFUL LOCATIONS
	XTRA==7			;NUMBER OF OTHER LOCATIONS TO SAVE

PSEND4:	MOVE	V,FREE		;GET  NEXT FREE LOCATION
	ADDI	V,LENGTH+.TBUF/5+XTRA
IFN POLISH,<
	ADD	V,SGNMAX
	ADD	V,SGNMAX
	ADD	V,SGNMAX
	ADD	V,SGNMAX
>
	CAML	V,SYMBOL	;WILL WORST CASE FIT?
	PUSHJ	PP,XCEED	;NO, EXPAND
	MOVS	V,FREE
	HRR	V,PRGPTR	;LAST PRGEND BLOCK
	HLRM	V,(V)		;LINK THIS BLOCK
	SKIPN	PRGPTR		;IF FIRST TIME
	HLLZM	V,PRGPTR	;SET LINK TO START OF CHAIN
	HLRM	V,PRGPTR	;POINTER TO IT
	SETZM	@FREE		;CLEAR LINK WORD
	AOS	FREE		;THIS LOCATION USED NOW
	MOVS	AC0,SYMBOL	;BOTTOM OF SYMBOL TABLE
	HRR	AC0,FREE	;FREE SPACE
	MOVE	V,@SYMBOL	;GET NUMBER OF SYMBOLS
	ASH	V,1		;TWO WORDS PER SYMBOL
	ADDI	V,1		;ONE MORE FOR COUNT
	ADDB	V,FREE		;END OF TABLE WHEN MOVED
	BLT	AC0,(V)		;MOVE TABLE
	HRRZ	AC0,.JBREL	;TOP OF CORE
	SUBI	AC0,1
	MOVEM	AC0,SYMTOP	;FOR NEXT SYMBOL TABLE
	SUBI	AC0,LENGTH	;LENGTH OF INITIAL SYMBOLS
	MOVEM	AC0,SYMBOL	;SET POINTER TO COUNT OF SYMBOLS
	HRLI	AC0,SYMNUM	;BLT POINTER
	BLT	AC0,@SYMTOP	;SET UP INITIAL SYMBOL TABLE
	PUSHJ	PP,SRCHI	;SET UP SEARCH POINTER
	MOVEI	AC0,.TBUF	;MAX NUMBER OF CHARS. IN TITLE
	SUB	AC0,TCNT	;ACTUAL NUMBER
	IDIVI	AC0,5		;NUMBER OF WORDS
	SKIPE	AC1		;REMAINDER?
	ADDI	AC0,1		;YES
	MOVEM	AC0,@FREE	;STORE COUNT
	AOS	FREE		;THIS LOCATION USED NOW
	EXCH	AC0,FREE	;SET UP AC0 FOR BLT
	ADDM	AC0,FREE	;WILL BE AFTER TITLE MOVES
	HRLI	AC0,TBUF	;BLT POINTER
	BLT	AC0,@FREE	;MOVE TITLE
IFN POLISH,<
	MOVE	AC2,SGNMAX	;PSECT COUNT
	MOVE	AC0,AC2
	PUSHJ	PP,STORIT	;SAVE PSECT COUNT
	MOVE	AC0,SGNAME(AC2)
	PUSHJ	PP,STORIT	;SAVE PSECT NAME
	MOVE	AC0,SGRELC(AC2)
	PUSHJ	PP,STORIT	;SAVE MODE AND PC
	MOVE	AC0,SGSCNT(AC2)
	PUSHJ	PP,STORIT	;SAVE SYM CNT
	MOVE	AC0,SGATTR(AC2)
	PUSHJ	PP,STORIT	;SAVE BREAK AND ATTRS
	SOJGE	AC2,.-10
	SETZM	SGNMAX		;ZERO PSECT CNT
	SETZM	SGNAME		;BLANK PSECT NAME
	MOVSI	AC0,1		;SET RELOCATION
	MOVEM	AC0,SGRELC	; TO RELATIVE ZERO
	MOVE	AC0,@SYMBOL	;GET SYM CNT
	MOVEM	AC0,SGSCNT	;SAVE PSECT SYM CNT
	PUSHJ	PP,SRCHI	;SET UP SEARCH POINTER
>
	MOVE	AC0,LITHD	;[251] LENGTH ,, START
	PUSHJ	PP,STORIT	;[251]
	MOVE	AC2,LITHDX	;POINTER TO LIT INFO.
	MOVE	AC0,-1(AC2)	;SIZE OF PASS1 LOCO
	PUSHJ	PP,STORIT	;SAVE IT IN SYMBOL TABLE
	MOVE	AC2,VARHDX	;SAME FOR VARS
	MOVE	AC0,-1(AC2)
	PUSHJ	PP,STORIT
	MOVE	AC0,(AC2)
	PUSHJ	PP,STORIT
	SETZM	(AC2)		;CLEAR NUMBER OF VARIABLES SEEN
	MOVE	AC0,HISNSW	;GET TWOSEG/HISEG FLAG
	HRR	AC0,HIGH1	;AND PASS1 BREAK
	PUSHJ	PP,STORIT
	SETZM	HISNSW		;[412] CLEAR HISEG FLAG FOR NEXT PROGRAM
	JUMPGE	AC0,PSEND6	;NOT TWOSEG
	MOVE	AC0,SVTYP3	;HIGH SEGMENT OFFSET
	PUSHJ	PP,STORIT	;SAVE IT ALSO
PSEND6:	MOVE	AC0,FREE	;GET NEXT FREE LOCATION
	SUBI	AC0,1		;LAST ONE USED
	HRRZ	V,PRGPTR	;POINTER TO START OF DATA BLOCK
	HRLM	AC0,(V)		;LINK TO END OF BLOCK
	POPJ	PP,		;RETURN
PSENDX:	PUSHJ	PP,XCEED	;NEED TO EXPAND CORE FIRST
PSEND5:	HRRZ	V,.JBREL	;[170] GET TOP OF CORE
	SETZM	(V)		;[170] CLEAR OR GET ILL MEM REF
	MOVEI	AC0,-1(V)	;[170]
	MOVEM	AC0,SYMTOP	;TOP OF NEW SYMBOL TABLE
	HRRZ	V,PRGPTR	;ADDRESS OF THIS BLOCK
	JUMPE	V,PSNDER	;ERROR LINK NOT SET UP
	MOVE	AC1,(V)		;NEXT LINK
	MOVE	V,1(V)		;GET ITS SYMBOL COUNT
	ASH	V,1		;NUMBER OF WORDS
	ADDI	V,1		;PLUS ONE FOR COUNT
	SUBI	AC0,(V)		;START OF NEW SYMBOL TABLE
	CAMG	AC0,FREE	;WILL IT FIT
	JRST	PSENDX		;NO, NEED TO EXPAND AND RESET AC0
	ADD	V,PRGPTR	;POINT TO END OF SYMBOL TABLE
	MOVEI	V,1(V)		;THEN TO BEG OF TITLE
	MOVEM	AC0,SYMBOL	;BOTTOM OF NEW TABLE
	HRL	AC0,PRGPTR	;ADDRESS OF FIRST WORD OF BLOCK
	ADD	AC0,[1,,0]	;MAKE BLT POINTER
	HRRM	AC1,PRGPTR	;POINT TO NEXT BLOCK
	BLT	AC0,@SYMTOP	;MOVE TABLE
	PUSHJ	PP,SRCHI	;SET UP POINTER
	MOVE	AC1,(V)		;NUMBER OF WORDS OF TITLE
	MOVEI	AC0,1(V)	;START OF STORED TITLE
	ADD	V,AC1		;INCREMENT PAST TITLE
	ADDI	AC1,TBUF-1	;END OF TITLE
	HRLI	AC0,TBUF	;WHERE TO PUT IT
	MOVSS	AC0		;BLT POINTER
	BLT	AC0,(AC1)	;MOVE TITLE
IFN POLISH,<
	PUSHJ	PP,GETIT	;GET PSECT COUNT
	MOVE	AC2,AC0
	MOVEM	AC2,SGNMAX
	PUSHJ	PP,GETIT	;GET PSECT NAME
	MOVEM	AC0,SGNAME(AC2)
	PUSHJ	PP,GETIT	;GET MODE AND PC
	MOVEM	AC0,SGRELC(AC2)
	PUSHJ	PP,GETIT	;GET SYM CNT
	MOVEM	AC0,SGSCNT(AC2)
	PUSHJ	PP,GETIT	;GET BREAK AND ATTRS
	MOVEM	AC0,SGATTR(AC2)
	SOJGE	AC2,.-10
	SETZM	SGNCUR		;SET TO BLANK PSECT
	PUSHJ	PP,SRCHI	;SET UP POINTER
>
	SKIPN	TBUF+1		;CHECK TITLE SEEN FLAG
	AOS	TBUF+1		;AND SET IT NON-ZERO
	PUSHJ	PP,GETIT	;[251]
	MOVEM	AC0,LITHD	;[251]
	MOVE	AC2,LITHDX	;INVERSE OF ABOVE
	PUSHJ	PP,GETIT
	MOVEM	AC0,-1(AC2)
	MOVE	AC2,VARHDX	;SAME FOR VARS
	PUSHJ	PP,GETIT
	MOVEM	AC0,-1(AC2)
	PUSHJ	PP,GETIT
	MOVEM	AC0,(AC2)	;RESTORE COUNT OF VARS
	PUSHJ	PP,GETIT	;GET TWO HALF WORDS
	HRRZM	AC0,HIGH1	;PASS1 BREAK
	HLLEM	AC0,HISNSW	;TWOSEG/HISEG FLAG
	JUMPGE	AC0,CPOPJ	;NOT TWOSEG
	PUSHJ	PP,GETIT
	MOVEM	AC0,SVTYP3	;BLOCK 3 WORD
	POPJ	PP,

STORIT:	MOVEM	AC0,@FREE	;STORE IT IN DATA BLOCK
	AOS	FREE		;ADVANCE POINTER
	POPJ	PP,

GETIT:	MOVE	AC0,1(V)	;FILL AC0 OUT OF PRGEND BLOCK
	AOJA	V,CPOPJ		;INCREMENT AND RETURN

PSNDER:	HRROI	RC,[SIXBIT	/PGE PRGEND ERROR @/]	;[377]
	JRST	ERRFIN
;MULTIPLE SYMBOL TABLE FEATURE PSEUDO-OPS

UNIV0:	JUMP2	UNIV2		;[226] DO PROPER PASS2 STUFF
	HRRZ	SX,UNIVNO	;GET NUMBER OF UNIVERSALS SEEN
	CAIL	SX,.UNIV	;ALLOW ONE MORE?
	JRST	UNVERR		;NO, GIVE FATAL ERROR
	SETOM	UNIVSN		;AND SET SEEN A UNIVERSAL
	JRST	TITLE0		;CONTINUE AS IF TITLE

UNIV2:	HLLOS	UNIVSN		;[226] ENSURE SET UP FOR UNIVERSAL
	JRST	REMAR0		;[226] AND IGNORE LINE

ADDUNV:	PUSH	PP,RC		;AN AC TO USE
	PUSHJ	PP,NOUT		;CONVERT TO SIXBIT
	HRRZ	RC,UNIVNO	;GET ENTRY INDEX
	MOVEM	AC0,UNITBL+1(RC)	;STORE SIXBIT NAME IN TABLE
	MOVEM	AC0,UNVDIR	;AND FOR ENTER LATER
	HRRZS	UNIVSN		;ONLY DO IT ONCE
	POP	PP,RC		;RESTORE RC
	POPJ	PP,		;AND RETURN

UNVERR:	HRROI	RC,[SIXBIT /TMU TOO MANY UNIVERSALS@/]
	JRST	ERRFIN

UNISYM:	PUSHJ	PP,SUPRSA	;TURN ON SUPPRESS BIT
	SKIPN	UNVSKP		;SKIP IF /U SEEN
	PUSHJ	PP,UNVOUT	;OUTPUT SYMBOL TABLE
	TLNN	IO,MFLSW	;[231] ALSO IN PRGEND?
	JRST	UNISYN		;[231] NO
	MOVE	AC0,@SYMBOL	;[231] GET NO. OF SYMBOLS
	LSH	AC0,1		;[231] 2 WORDS EACH
	ADDI	AC0,1		;[231] PLUS COUNT
	ADD	AC0,FREE	;[231] HOW MUCH WE WILL NEED
	CAML	AC0,SYMBOL	;[231] WILL IT FIT IN WHAT WE HAVE
UNISYK:	PUSHJ	PP,XCEED	;[355] [231] NO, EXPAND
	CAML	AC0,SYMBOL	;[355] ENOUGH?
	JRST	UNISYK		;[355] NO,EXPAND
UNISYN:	PUSH	PP,SYMBOL	;NEED TO SAVE INCASE PRGEND
	MOVE	AC0,SYMTOP	;TOP OF TABLE
	SUB	AC0,SYMBOL	;GET LENGTH OF TABLE
	HRL	ARG,SYMBOL	;BOTTOM OF TABLE
	HRR	ARG,FREE	;WHERE TO GO
	HRRZ	RC,UNIVNO	;GET TABLE INDEX
	HRRM	ARG,SYMBOL	;WILL BE THERE SOON
	HRRZM	ARG,UNIPTR+1(RC)	;STORE IN CORRESPONDING PLACE
	ADDB	AC0,FREE	;WHERE TO END
	HRLM	AC0,UNIPTR+1(RC)	;SAVE NEW SYMTOP
	BLT	ARG,@FREE	;MOVE TABLE
	HRRZM	AC0,UNITOP	;SAVE TOP OF TABLES+1
	CAMLE	AC0,MACSIZ	;IN CASE OVER A K BOUND
	MOVEM	AC0,MACSIZ	;DON'T REDUCE SO FAR NOW
	MOVE	AC0,SRCHX	;SAVE OLD SEARCH POINTER
	PUSHJ	PP,SRCHI	;GET SEARCH POINTER
	EXCH	AC0,SRCHX
	MOVEM	AC0,UNISHX+1(RC)	;SAVE IT
	POP	PP,SYMBOL	;RESTORE OLD VALUE
	SETZM	UNIVSN		;CLEAR FLAG INCASE PRGEND
	AOS	UNIVNO		;SIGNAL ANOTHER UNIVERSAL SAVED
	POPJ	PP,		;RETURN
SERCH0:	PUSHJ	PP,GETSYM	;GET A SYMBOL
	  JRST	ERRAX		;ERROR IF NOT VALID
	MOVE	RC,UNIVNO	;NUMBER OF UNIVERSALS AVAILABLE
	JUMPE	RC,UNVINP	;TRY TO READ SYMBOLS FROM DSK
	CAME	AC0,UNITBL(RC)	;LOOK FOR MATCH
	SOJA	RC,.-2		;NOT FOUND YET
SERCH1:	MOVE	AC0,RC		;STORE TABLE ENTRY NUMBER
	MOVEI	RC,1		;START AT ENTRY ONE
	CAIL	RC,.UNIV	;CHECK FOR CONSISTENCY ERROR
	JRST	SCHERR		;SHOULD NEVER HAPPEN!!
	SKIPE	UNISCH(RC)	;LOOK FOR AN EMPTY SLOT
	AOJA	RC,.-3		;NOT FOUND YET
	MOVEM	AC0,UNISCH(RC)	;STORE INDEX IN TABLE
	CAIE	C,'('		;[240] GIVING FILE SPEC?
	JRST	SERCH4		;[240] NO
SERCH2:	PUSHJ	PP,GETCHR	;[240] YES, GET RID OF IT
	CAIN	C,')'		;[266] LOOK FOR END
	JRST	SERCH3		;[266] FOUND IT
	CAIE	C,EOL		;[266] REACHED END OF LINE?
	JRST	SERCH2		;[266] NO, KEEP LOOKING
	TROA	ER,ERRQ		;[266] GIVE UP AND FLAG ERROR
SERCH3:	PUSHJ	PP,GETCHR	;[240] GET NEXT CHAR
SERCH4:	JUMPCM	SERCH0		;[240] LOOK FOR MORE NAMES
	POPJ	PP,		;FINISHED

VERSKW:	MOVSI	RC,[SIXBIT /UVS UNIVERSAL VERSION SKEW, REASSEMBLE UNIVERSAL@/]	;[364]
	JRST	ERRFIN		;[364] NAME IN AC0

SCHERR:	MOVSI	RC,[SIXBIT /CFU CANNOT FIND UNIVERSAL@/]
	JRST	ERRFIN		;NAME IN AC0

;MESSAGE FOR CASE WHERE FILES AFTER UNIVERSAL USED MORE BUFFER SPACE THAN FIRST UNIVERSAL
UNIERR:	HRROI	RC,[SIXBIT /USS UNIVERSAL PROGRAM(S) MUST HAVE SAME OUTPUT SPECIFICATION AS OTHER FILES@/]
	JRST	ERRFIN

SCHGET:	SETZ	AC0,		;[240] INITIALIZE
	MOVSI	AC1,(POINT 6,AC0)	;[240]
SCHGNX:	PUSHJ	PP,GETCHR	;[240] GET NEXT CHARACTER
	CAIE	C,'.'		;[240] SPECIAL TEST FOR END OF NAME
	TLNN	CS,6		;[240] OR ANY NON-ALPHANUMERIC
	PJRST	BYPAS2		;[240] SKIP ALL SPACES AND QUIT
	TLNE	AC1,770000	;[240] ALL SIX IN YET?
	IDPB	C,AC1		;[240] NO, STORE THIS ONE
	JRST	SCHGNX		;[240] GET NEXT

SCHOCT:	SETZ	AC0,		;[240] INITIALIZE
SCHONX:	PUSHJ	PP,GETCHR	;[240] GET NEXT CHAR
	TLNN	CS,4		;[240] NUMBER
	PJRST	BYPAS2		;[240] NO, SKIP TRAILING SPACES
	LSH	AC0,3		;[240] MAKE SPACE
	ADDI	AC0,-'0'(C)	;[240] AND STOW DIGIT
	JRST	SCHONX		;[240] GET NEXT
SUBTTL	MACRO/REPEAT HANDLERS

REPEA0:	PUSHJ	PP,EVALXQ	;EVALUATE REPEAT EXP, EXTERNS ARE ILL.
	JUMPNC	ERRAX

REPEA1:	SETZM	COMSW		;[425] SET COMMENT SWITCH
	JUMPLE	AC0,REPZ	;PASS THE EXP., DONT PROCESS
	SOJE	AC0,REPO	;REPEAT ONCE
REPEA2:	PUSHJ	PP,GCHARQ	;GET STARTING "<"
	PUSHJ	PP,COMTST	;[425] IGNORE COMMENTS
	SKIPN	COMSW		;[425] INSIDE A COMMENT?
	CAIG	C," "		;[373] TEXT FORMATTING CHARACTER?
	JRST	REPEA2		;[373] YES, GET NEXT
	CAIE	C,"<"		;[373] "<"?
	JRST	REPMAB		;[373] NO, ERROR
	PUSHJ	PP,SKELI1	;INITIALIZE SKELETON
	PUSH	MP,REPEXP
	MOVEM	AC0,REPEXP
	PUSH	MP,REPPNT	;STACK PREVIOUS REPEAT POINTER
	MOVEM	ARG,REPPNT	;STORE NEW POINTER
	TDZA	SDEL,SDEL	;YES, INITIALIZE BRACKET COUNT AND SKIP

REPEA4:	PUSHJ	PP,WCHARQ	;WRITE A CHARACTER
	PUSHJ	PP,GCHARQ	;GET A CHARACTER
	CAIN	C,"<"		;"<"?
	AOJA	SDEL,REPEA4	;YES, INCREMENT AND WRITE
	CAIE	C,">"		;">"?
	JRST	REPEA4		;NO, WRITE THE CHARACTER
	SOJGE	SDEL,REPEA4	;YES, WRITE IF NON-NEGATIVE COUNT
	MOVSI	CS,(BYTE (7) 177,3)	;SET "REPEAT" END
	PUSHJ	PP,WWRXE	;WRITE END
	SKIPN	LITLVL		;LITERAL MIGHT END ON LINE
	SKIPE	MACLVL		;IF IN MACRO DARE NOT PROCESS
	JRST	REPEA5		;REST OF LINE SINCE MACRO MIGHT END ON IT
	BYPASS
	PUSHJ	PP,STOUTS	;POLISH OF LINE BEFORE PROCESSING REPEAT
REPEA5:	PUSH	MP,MRP		;STACK PREVIOUS READ POINTER
	PUSH	MP,RCOUNT	;SAVE WORD COUNT
	HRRZ	MRP,REPPNT	;SET UP READ POINTER
	SKIPN	MACLVL		;IF IN MACRO GIVE CR-LF FIRST
	SKIPE	LITLVL		;SAME FOR LITERAL
	JRST	REPEA7
	AOJA	MRP,POPOUT	;BYPASS ARG COUNT

REPEA7:	HRRZ	MRP,REPPNT	;SET UP READ POINTER
	ADDI	MRP,1		;BYPASS ARG COUNT
REPEA8:	MOVEI	C,LF
	JRST	RSW2

REPEND:	SOSL	REPEXP
	JRST	REPEA7
	HRRZ	V,REPPNT	;GET START OF TREE
	PUSHJ	PP,REFDEC	;DECREMENT REFERENCE
	POP	MP,RCOUNT
	POP	MP,MRP
	POP	MP,REPPNT
	POP	MP,REPEXP
	SKIPN	LITLVL		;IF IN LITERAL OR
	SKIPE	MACLVL		;IF IN MACRO
	JRST	RSW0		;FINISH OF LINE NOW
	JRST	REPEA8

REPMAB:	HRROI	RC,[SIXBIT /MBR MISSING OPEN ANGLE BRACKET FOR REPEAT@/]	;[373]
	JUMP1	.+2		;[373] ONLY COUNT ERROR ON PASS 2
	AOS	ERRCNT		;[373] INCREMENT ERROR COUNT
	JRST	ERRNE0		;[373] COMMON MESSAGE
REPZ:	FORERR	(SDEL,REP)
	SETOM	INREP
REPZ0:	PUSHJ	PP,GCHAR	;[425] GET STARTING <
	PUSHJ	PP,COMTST	;[425] IGNORE COMMENTS
	SKIPN	COMSW		;[425] INSIDE A COMMENT?
	CAIG	C," "		;[425] TEXT-FORMATTING CHARACTER?
	JRST	REPZ0		;[425] YES, GET NEXT
	CAIE	C,"<"		;[425] < ?
	JRST	CORMAB		;[425] NO, ERROR
	MOVEI	SDEL,1		;[425] SET COUNT
REPZ1:	PUSHJ	PP,GCHAR	;GET NEXT CHARACTER
	CAIN	C,"<"		;"<"?
	AOJA	SDEL,REPZ1	;YES, INCREMENT COUNT
	CAIN	C,">"		;">"?
	SOJLE	SDEL,REPZ2	;YES, EXIT IF MATCHING
	JRST	REPZ1		;NO, RECYCLE
REPZ2:	SETZM	INREP		;FLAG OUT OF IT
	SETZM	INCND		;AND CONDITIONAL ALSO
	JRST	STMNT		;AND EXIT

REPO:	PUSHJ	PP,GCHAR	;GET "<"
	PUSHJ	PP,COMTST	;[425] IGNORE COMMENTS
	SKIPN	COMSW		;[425] INSIDE A COMMENT?
	CAIG	C," "		;[425] TEXT-FORMATTING CHARACTER?
	JRST	REPO		;[425] YES, GET NEXT
	CAIE	C,"<"		;[425] < ?
	JRST	CORMAB		;[425] NO, ERROR
	SKIPE	RPOLVL		;ARE WE NESTED?
	AOS	RPOLVL		;YES, DECREMENT CURRENT
	PUSH	MP,RPOLVL
	SETOM	RPOLVL
	JRST	STMNT

REPO1:	CAIN	C,"<"
	SOS	RPOLVL
	CAIN	C,">"
	AOSE	RPOLVL
	JRST	RSW2
	POP	MP,RPOLVL
	PUSHJ	PP,RSW2
	JRST	RSW0

CORMAB:	HRROI	RC,[SIXBIT /MBC MISSING OPEN ANGLE BRACKET FOR CONDITIONAL OR REPEAT@/]	;[425]
	JUMP1	.+2		;[425] ONLY COUNT ERROR ON PASS 2
	AOS	ERRCNT		;[425] INCREMENT ERROR COUNT
	JRST	ERRNE0		;[425] COMMON MESSAGE

COMTST:	CAIG	C,FF		;[425] SEARCH FOR END OF LINE
	CAIGE	C,LF		;[425] LF, VT OR FF?
	JRST	.+2		;[425] WASN'T ANY OF THEM
	SETZM	COMSW		;[425] RESET COMMENT SWITCH
	CAIN	C,";"		;[425] COMMENT?
	SETOM	COMSW		;[425] YES, SET COMMENT SWITCH
	POPJ	PP,		;[425] CONTINUE
DEFIN0:	PUSHJ	PP,GETSYM	;GET MACRO NAME
	JRST	ERRAX		;EXIT ON ERROR
	MOVEM	PP,PPTMP1	;SAVE POINTER
	MOVEM	AC0,PPTMP2	;SAVE NAME
	TLO	IO,IORPTC
	FORERR	(SX,DEF)
	SETOM	INDEF		;AND FLAG IN DEFINE
	SETZB	SX,.TEMP	;[425] SET ARGUMENT AND REFERENCE COUNT
	SETZM	COMSW		;[425] AND COMMENT SWITCH
DEF02:	PUSHJ	PP,GCHAR	;SEARCH FOR "(" OR "<"
	PUSHJ	PP,COMTST	;[425] IGNORE COMMENTS
	SKIPE	COMSW		;INSIDE A COMMENT?
	JRST	DEF02		;YES, IGNORE CHARACTER
	CAIN	C,"<"		;"<"?
	JRST	DEF20		;YES
	CAIE	C,"("		;"("?
	JRST	DEF02		;NO
DEF10:	PUSHJ	PP,GETSYM	;YES, GET DUMMY SYMBOL
	TRO	ER,ERRA		;FLAG ERROR
	ADDI	SX,1		;INCREMENT ARG COUNT
	PUSH	PP,AC0		;STACK IT
	CAIN	C,'<'		;A DEFAULT ARGUMENT COMING UP?
	JRST	DEF80		;YES, STORE IT AWAY
	CAIE	C,11		;")"?
	JRST	DEF10		;NO, GET NEXT DUMMY SYMBOL
DEF12:	PUSHJ	PP,GCHAR
	PUSHJ	PP,COMTST	;[425] IGNORE COMMENTS
	SKIPN	COMSW		;[425] SKIP IF INSIDE COMMENT
	CAIE	C,"<"		;"<"?
	JRST	DEF12		;NO
DEF20:	PUSH	PP,[0]		;YES, MARK THE LIST
	LSH	SX,9		;SHIFT ARG COUNT
	AOS	ARG,SX
	PUSHJ	PP,SKELI	;INITIALIZE MACRO SKELETON
	MOVE	AC0,PPTMP2	;GET NAME
	TLO	IO,DEFCRS
	PUSH	PP,UNISCH+1	;MUST NOT SEARCH UNIVERSALS AT THIS POINT
	SETZM	UNISCH+1	;OTHERWISE ORIGINAL DEFINITION WILL BE LOST
	PUSHJ	PP,MSRCH	;SEARCH THE TABLE
	JRST	DEF24		;NOT FOUND
	TLNN	ARG,MACF	;FOUND, IS IT A MACRO?
	TROA	ER,ERRX		;NO, FLAG ERROR AND SKIP
	PUSHJ	PP,REFDEC	;YES, DECREMENT THE REFERENCE
DEF24:	POP	PP,UNISCH+1	;BACK AS IT WAS
	HRRZ	V,WWRXX		;GET START OF TREE
	SKIPN	.TEMP		;ANY DEFAULT ARGUMENTS TO TAKE CARE OF?
	JRST	DEF25		;NO
	HRRZ	C,1(V)		;GET SHIFTED ARG COUNT
	LSH	C,-9		;GET ARG COUNT BACK
	ADDI	C,1		;ONE MORE FOR TERMINAL ZERO
	ADD	C,.TEMP		;NUMBER OF ITEMS IN STACK
	HRLS	C		;MAKE XWD
	MOVE	SDEL,.TEMP	;NUMBER OF WORDS NEEDED
	ADDI	SDEL,1		;[341] PLUS THE 0 AT THE END
	ADDB	SDEL,FREE	;FROM FREE CORE
	CAML	SDEL,SYMBOL	;MORE CORE NEEDED
	PUSHJ	PP,XCEEDS	;YES, TRY TO GET IT
	SUB	SDEL,.TEMP	;FORM POINTER
	SUBI	SDEL,1		;[341] MINUS THE 0
	SUB	PP,C		;[341] BACK UP STACK TO START OF ARGS
	HRLM	SDEL,1(V)	;STORE IT WITH ARG COUNT IN MACRO
	SUBI	SDEL,1		;TO USE FOR PUSHING POINTER INTO STORAGE
	MOVEI	C,1(PP)		;POINT TO START OF STACK
DEF26:	MOVE	ARG,(C)		;GET AN ITEM OFF STACK
	TLNN	ARG,-40		;A POINTER?
	JUMPN	ARG,[PUSH SDEL,ARG	;YES, STORE IT
		AOJA	C,DEF26]	;GET NEXT
	PUSH	PP,ARG		;RESTACK ARGUMENT
	SKIPE	ARG		;FINISHED IF ZERO
	AOJA	C,DEF26		;GET NEXT
	PUSH	SDEL,ARG	;STORE ZERO IN DEFAULT LIST ALSO
DEF25:	MOVSI	ARG,MACF
	MOVEM	PP,PPTMP2	;STORE TEMP STORAGE POINTER
	PUSHJ	PP,INSERT	;INSERT/UPDATE
	TLZ	IO,DEFCRS	;JUST IN CASE
	SETZM	ARGF		;NO ARGUMENT SEEN
	SETZM	SQFLG		;AND NO ' SEEN
	TDZA	SDEL,SDEL	;CLEAR BRACKET COUNT
DEF30:	PUSHJ	PP,WCHAR	;WRITE CHARACTER
DEF31:	PUSHJ	PP,GCHAR	;GET A CHARACTER
DEF32:	MOVE	CS,C		;GET A COPY
	CAIN	C,";"		;IS IT A COMMENT
	JRST	CPEEK		;YES CHECK FOR ;;
DEF33:	CAIG	CS,"Z"+40	;CONVERT LOWER CASE
	CAIGE	CS,"A"+40
	JRST	.+2
	SUBI	CS,40
	CAIGE	CS,40		;TEST FOR CONTROL CHAR.
	JRST	[SKIPN	SQFLG		;HAS SINGLE QUOTE BEEN SEEN?
		JRST	DEF30		;NO, OUTPUT THIS CHAR.
		PUSH	PP,C		;YES, SAVE CURRENT CHAR
		MOVEI	C,47		;SET UP QUOTE
		PUSHJ	PP,WCHAR	;WRITE IT
		POP	PP,C		;GET BACK CURRENT CHAR.
		SETZM	SQFLG		;RESET FLAG
		JRST	DEF30]		;AND CONTINUE 
	CAILE	CS,77+40
	JRST	DEF30		;TEST FOR SPECIAL
	MOVE	CS,CSTAT-40(CS)	;GET STATUS BITS
	TLNE	CS,6		;ALPHA-NUMERIC?
	JRST	DEF40		;YES
	SKIPN	SQFLG		;WAS A ' SEEN?
	JRST	DEF36		;NO, PROCESH
	PUSH	PP,C		;YES, SAVE CURRENT CHARACTER
	MOVEI	C,47		;AND PUT IN A '
	PUSHJ	PP,WCHAR	;...
	POP	PP,C		;RESTORE CURRENT CHARACTER
	SETZM	SQFLG		;AND RESET FLAG
DEF36:	CAIE	C,47		;IS THIS A '?
	JRST	DEF35		;NOPE
	SKIPN	ARGF		;YES, WAS LAST THING SEEN AN ARG?
	SETOM	SQFLG		;IF NOT, SET SNGL QUOT FLAG
	SETZM	ARGF		;BUT NOT ARGUMENT IN ANY CASE
	JRST	DEF31		;GO GET NEXT CHARACTER
DEF35:	SETZM	ARGF		;THIS IS NOT AN ARGUMENT
	CAIN	C,"<"		;"<"?
	AOJA	SDEL,DEF30	;YES, INCREMENT COUNT AND WRITE
	CAIN	C,">"		;">"?
	SOJL	SDEL,DEF70	;YES, TEST FOR END
	JRST	DEF30		;NO, WRITE IT

CPEEK:	TLNN	IO,IOPALL	;IF LALL IS ON
	JRST	DEF33		;JUST RETURN
	PUSH	PP,CS		;NEED TO SAVE CS, SINCE CHARAC MAY DESTROY IT
	PUSHJ	PP,PEEK		;LOOK AT NEXT CHAR.
	POP	PP,CS		;RESTORE CS
	CAIN	C,";"		;IS IT ;;?
	JRST	CPEEK0		;[325] YES, GO SCAN LINE MATCHING ANGLE BRAKETS
	MOVE	C,CS		;RESTORE C
	JRST	DEF33		;AND RETURN

CPEEK0:	SETZM	CPEEKC		;[325] CLEAR MATCHING ANGLE COUNTER
CPEEK1:	PUSHJ	PP,GCHAR	;[325] GET A CHARACTER
	CAIN	C,"<"		;[325] SEE IF LEFT ANGLE
	AOJA	SDEL,CPEEKL	;[325] YES, GO ADD TO COUNT
	CAIN	C,">"		;[325] SEE IF RIGHT ANGLE
	SOJA	SDEL,CPEEKR	;[325] YES, GO SUBTRACT FROM COUNT
	CAIG	C,CR		;[325] SEE IF AN
	CAIGE	C,LF		;[325]  END OF LINE CHARACTER
	JRST	CPEEK1		;[325] NO, CONTINUE
CPEK1A:	SKIPL	CPEEKC		;[347] YES, SEE IF UNMATCHED ANGLES
	JRST	CPEEK3		;[332] NO, GO SEE IF END OF MACRO
	PUSH	PP,C		;[325] SAVE EOL CHARACTER
CPEEK2:	MOVEI	C,">"		;[325] SET TO PUT IN SOME RIGHTS
	PUSHJ	PP,WCHAR	;[325] GO DO ONE
	AOSGE	CPEEKC		;[325] SEE IF ENOUGH
	JRST	CPEEK2		;[325] NO, LOOP
	POP	PP,C		;[325] RECOVER EOL CHARACTER
CPEEK3:	JUMPL	SDEL,DEF70	;[332] IF END OF MACRO, LEAVE COMPLETELY
	JRST	DEF32		;[325] AND GET OUT OF LINE

CPEEKL:	AOS	CPEEKC		;[325] ADD IN LEFT ANGLE BRACKET
	JRST	CPEEK1		;[325] TO NEXT CHARACTER
CPEEKR:
	JUMPL	SDEL,CPEK1A	;[366] JUMP IF END OF MACRO
	SOS	CPEEKC		;[325],[347]SUBTRACT OUT RIGHT BRACKET
	JRST	CPEEK1		;[347]CONTINUE
DEF40:	MOVEI	AC0,0		;CLEAR ATOM
	MOVSI	AC1,(POINT 6,AC0)	;SET POINTER
DEF42:	PUSH	PP,C		;STACK CHARACTER
	TLNE	AC1,770000	;HAVE WE STORED 6?
	IDPB	CS,AC1		;NO, STORE IN ATOM
	PUSHJ	PP,GCHAR	;GET NEXT CHARACTER
	MOVE	CS,C
	CAIG	CS,"Z"+40
	CAIGE	CS,"A"+40
	JRST	.+2
	SUBI	CS,40		;CONVERT LOWER TO UPPER
	CAIL	CS,40
	CAILE	CS,77+40
	JRST	DEF44		;TEST SPECIAL
	MOVE	CS,CSTAT-40(CS)	;GET STATUS
	TLNE	CS,6		;ALPHA-NUMERIC?
	JRST	DEF42		;YES, GET ANOTHER
DEF44:	PUSH	PP,[0]		;NO, MARK THE LIST
	MOVE	SX,PPTMP1	;GET POINTER TO TOP

DEF46:	SKIPN	1(SX)		;END OF LIST?
	JRST	DEF50		;YES
	CAME	AC0,1(SX)	;NO, DO THEY COMPARE?
	AOJA	SX,DEF46	;NO, TRY AGAIN
	SUB	SX,PPTMP1	;YES, GET DUMMY SYMBOL NUMBER
	LSH	SX,4
	MOVSI	CS,<(BYTE (7) 177,101)>(SX)	;SET ESCAPE CODE MACEND
	LSH	AC0,-^D30
	CAIN	AC0,5		;"%"?
	TLO	CS,1000		;YES, SET CRESYM FLAG
	PUSHJ	PP,WWORD	;WRITE THE WORD
	SETOM	ARGF		;SET ARGUMENT SEEN FLAG
	SETZM	SQFLG		;AND IGNORE ANY ' WAITING TO GET INTO STRING
DEF48:	MOVE	PP,PPTMP2	;RESET PUSHDOWN POINTER
	TLO	IO,IORPTC	;ECHO LAST CHARACTER
	JRST	DEF31		;RECYCLE

DEF50:
	SKIPN	SQFLG		;HAVE WE SEEN A '?
	JRST	DEF51		;NOPE
	MOVEI	C,47		;YES, PUT IT IN
	PUSHJ	PP,WCHAR	;...
	SETZM	SQFLG		;AND CLEAR FLAG
DEF51:	MOVE	C,2(SX)		;GET CHARACTER
	JUMPE	C,DEF48		;CLEAN UP IF END
	PUSHJ	PP,WCHAR	;WRITE THE CHARACTER
	AOJA	SX,DEF51	;GET NEXT

DEF70:	MOVE	PP,PPTMP1	;RESTORE PUSHDOWN POINTER
	MOVSI	CS,(BYTE (7) 177,1)
	PUSHJ	PP,WWRXE	;WRITE END
	SETZM	INDEF		;OUT OF IT
	JRST	BYPAS1
; HERE TO STORE DEFAULT ARGUMENTS

DEF80:	AOS	.TEMP		;COUNT ONE MORE
	PUSHJ	PP,SKELI1	;INITIALIZE SKELETON
	HRL	V,SX		;SYMBOL NUMBER
	PUSH	PP,V		;STORE POINTER
	TDZA	SDEL,SDEL	;ZERO BRACKET COUNT
DEF81:	PUSHJ	PP,WCHARQ	;WRITE A CHARACTER
	PUSHJ	PP,GCHAR	;[422] GET A CHARACTER
	CAIN	C,"<"		;ANOTHER "<"?
	AOJA	SDEL,DEF81	;YES, INCREMENT AND WRITE
	CAIE	C,">"		;CLOSING ANGLE?
	JRST	DEF81		;NO, JUST WRITE THE CHAR.
	SOJGE	SDEL,DEF81	;YES, WRITE IF NOT END
	MOVSI	CS,(BYTE (7) 177,2)
	PUSHJ	PP,WWRXE	;WRITE END OF DUMMY ARGUMENT
	PUSHJ	PP,GCHAR	;READ AT NEXT CHAR.
	CAIE	C,")"		;END OF ARGUMENT LIST?
	JRST	DEF10		;NO, GET NEXT SYMBOL
	JRST	DEF12		;YES, LOOK FOR "<"
SUBTTL	MACRO CALL PROCESSOR
CALLM:	SKIPGE	MACENL		;ARE WE TRYING TO RE-ENTER?
	JRST	ERRAX		;YES, BOMB OUT WITH ERROR
	HRROS	MACENL		;FLAG "CALLM IN PROGRESS"
	EXCH	MP,RP
	PUSH	MP,V		;STACK FOR REFDEC
	EXCH	MP,RP
	MOVEM	AC0,CALNAM	;SAVE MACRO NAME INCASE OF ERROR
	FORERR	(SDEL,CAL)
	ADDI	V,1		;POINT TO DUMMY SYMBOL COUNT
	AOS	SDEL,0(V)	;INCREMENT ARG COUNT
	HLLZM	SDEL,.TEMP	;DEFAULT ARG POINTER IF NON-ZERO
	LSHC	SDEL,-^D<9+36>	;ZERO SDEL, GET ARG COUNT IN SX
	ANDI	SX,777		;MASK OUT ANYTHING ELSE
	SKIPE	.TEMP		;IF AT LEAST ONE DEFAULT ARG
	HRRM	SX,.TEMP	;STORE COUNT OF ARGS
	PUSH	PP,V		;STACK FOR MRP
	PUSH	PP,RP		;STACK FOR MACPNT
	JUMPE	SX,MAC20	;TEST FOR NO ARGS
	PUSHJ	PP,CHARAC
	CAIE	C,"("		;"("
	TLOA	SDEL,-1		;[137] NO, FUDGE PAREN COUNT AND SKIP

MAC10:	PUSHJ	PP,GCHAR	;GET A CHARACTER, LOOK FOR AN ARG
	JUMPE	SDEL,MAC11	;[137] SKIP TEST IF IN ()
	CAIG	C,CR
	CAIGE	C,LF
	CAIN	C,";"		;";"?
	JRST	MAC21		;YES, END OF ARGUMENT STRING

MAC11:	IFE TENEX,<
	SKIPN	DECTAB		;[372] TREAT LEADING TAB UNDER .XTABM AS SPECIAL CASE
	JRST	MAC11A		;[372]
>
	CAIN	C,11		;[372] FLUSH TABS
	JRST	MAC10		;[372]
MAC11A:	SKIPLE	SX		;[372] [137] SKIP IF NO ARGS LEFT
	PUSHJ	PP,SKELI1	;NO, INITIALIZE SKELETON
	CAIN	C,"<"		;"<"?
	JRST	MAC30		;YES, PROCESS AS SPECIAL
	CAIE	C,176
	CAIN	C,134		;"\"
	JRST	MAC40		;YES, PROCESS SYMBOL

MAC14:	CAIN	C,","		;","?
	JRST	MAC16		;YES; NULL SYMBOL
IFE TENEX,<
	SKIPN	DECTAB		;DO TABS DEC'S WAY?
	JRST	.+3		;YES
>
	CAIN	C,11		;FLUSH TABS
	JRST	MAC14A
	JUMPL	SDEL,MAC14B	;[137] IGNORE TEST FOR () IF NOT INSIDE ()
	CAIN	C,"("		;"("?
	ADDI	SDEL,1		;YES, INCREMENT COUNT
	CAIN	C,")"		;")"?
	SOJL	SDEL,MAC16	;YES, TEST FOR END
MAC14B:	SKIPLE	SX		;[137] IGNORE IF NO ARGS LEFT
	PUSHJ	PP,WCHAR	;WRITE INTO SKELETON
MAC14A:	PUSHJ	PP,CHARAC	;GET NEXT CHARACTER
MAC14E:				;[262] INCASE WE REACHED MACEND
	JUMPG	SDEL,MAC14	;[137] IGNORE TEST IF IN ()
	CAIG	C,CR
	CAIGE	C,LF
	JRST	.+2
	JRST	MAC15		;TEST FOR END OF LINE
	CAIE	C,";"		;";"?
	JRST	MAC14		;NO
				;YES, END OF LINE

MAC15:	TLO	IO,IORPTC
MAC16:	JUMPLE	SX,MAC17	;[137] SKIP IF NO ARGS LEFT
	MOVSI	CS,(BYTE (7) 177,2)
	PUSHJ	PP,WWRXE	;WRITE END
	EXCH	MP,RP
	PUSH	MP,WWRXX
	EXCH	MP,RP
MAC17:	SUBI	SX,1		;[137] DECREMENT ARG COUNT
	JUMPGE	SDEL,MAC10	;[137] IF IN () KEEP LOOKING
	TRNN	SDEL,(1B0)	;[205] SKIP LOOKING IF SEEN ")"
	JUMPG	SX,MAC10	;[137] NO, BUT MORE ARGS TO COME
MAC20:	TLZN	IO,IORPTC
	PUSHJ	PP,CHARAC
MAC21:	EXCH	MP,RP
	JUMPE	SX,MAC21B	;NO MISSING ARGS
MAC21A:	PUSH	MP,[-1]		;FILL IN MISSING ARGS
	SKIPN	.TEMP		;ANY DEFAULT ARGS?
	JRST	MAC21C		;NO
	HRRZ	C,.TEMP		;GET ARG COUNT
	SUBI	C,-1(SX)	;ACCOUNT FOR THOSE GIVEN
	HRLZS	C		;PUT IN LEFT HALF
	HLRZ	SDEL,.TEMP	;ADDRESS OF TABLE
MAC21D:	SKIPN	(SDEL)		;END OF LIST
	JRST	MAC21C		;YES
	XOR	C,(SDEL)	;TEST FOR CORRECT ARG
	TLNN	C,-1		;WAS IT?
	JRST	MAC21E		;YES
	XOR	C,(SDEL)	;BACK THE WAY IT WAS
	AOJA	SDEL,MAC21D	;AND TRY AGAIN

MAC21E:	MOVEM	C,(MP)		;REPLACE -1 WITH TREE POINTER
	AOS	1(C)		;INCREMENT REFERENCE
MAC21C:	SOJG	SX,MAC21A
MAC21B:	PUSH	MP,[0]		;SET TERMINAL
	HRRZ	C,LIMBO
	TLNN	IO,IOSALL	;SUPPRESSING ALL?
	JRST	MAC23		;NO
	JUMPN	MRP,MAC27	;IN MACRO?
	PUSHJ	PP,SEMSRC	;CHECK FOR IMMEDIATE COMMENT
	  JRST	MAC26		;NOT FOUND, CONTINUE
MAC22:	PUSHJ	PP,CHARAC	;YES,GET IT INTO THE LBUF
	CAIG	C,CR		;LESS THAN CR?
	CAIGE	C,LF		;AND GREATER THAN LF?
	JRST	MAC22		;NO GET ANOTHER
MAC26:	PUSHJ	PP,DECLBP	;DECREMENT LINE BUFFER POINTER
MAC27:	HRLI	C,-1		;SET FLAG
	JRST	MAC25
MAC23:	MOVEI	SX,"^"
	DPB	SX,LBUFP	;SET ^ INTO LINE BUFFER
	JUMPAD	MAC25		;BRANCH IF ADDRESS FIELD
	JUMPN	MRP,MAC25	;BRANCH IF ALREADY IN A MACRO
	SKIPN	LITLVL		;[215] BRANCH IF WITHIN A LITERAL
	SKIPE	RPOLVL		;[215] OR IN A REPEAT
	JRST	MAC25
	PUSHJ	PP,RSW3		;OUTPUT C AGAIN (OVERWRITTEN BY "^")
	PUSHJ	PP,SEMSRC	;LOOK FOR A COMMENT
	  JRST	MAC24		;NO COMMENT CONTINUE
	PUSHJ	PP,STOUT	;LIST COMMENT OR CR-LF
	TLNE	IO,IOPALL	;MACRO EXPANSION SUPPRESSION?
	TLO	IO,IOMAC	;  NO, SET TEMP BIT
	TDOA	C,[-1]		;FLAG LAST CHARACTER
MAC24:	PUSHJ	PP,DECLBP	;DECREMENT BYTE POINTER
MAC25:	PUSH	MP,MACPNT
	POP	PP,MACPNT
	PUSH	MP,C
	PUSH	MP,RCOUNT	;STACK WORD COUNT
	PUSH	MP,MRP		;STACK MACRO POINTER
	POP	PP,MRP		;SET NEW READ POINTER
	EXCH	MP,RP
	AOS	MACLVL
	HRRZS	MACENL		;RESET "CALLM IN PROGRESS"
	JUMPOC	STMNT2		;OP-CODE FIELD
	JRST	EVATOM		;ADDRESS FIELD

;ROUTINE TO LOOK FOR A SEMICOLON, IGNORING SPACES AND TABS
; SKIP IF FOUND

	PUSHJ	PP,CHARAC	;FETCH ANOTHER CHARACTER
SEMSRC:	CAIE	C," "		;SPACE?
	CAIN	C,"	"	;OR TAB?
	JRST	.-3		;YES, GET ANOTHER CHARACTER
	CAIN	C,";"		;NO, SEMICOLON?
	AOS	(PP)		;YES, SKIP RETURN
	POPJ	PP,

;ROUTINE TO DEVREMENT BYTE POINTER LBUFP

DECLBP:	HRLZI	SX,70000	;INCREASE P FIELD BY 1 BYTE
	ADDB	SX,LBUFP
	JUMPGE	SX,CPOPJ	;RETURN IF NO OVERFLOW
	HRLOI	SX,347777	;OVERFLOW, BACKUP ONE WORD
	ADDM	SX,LBUFP
	POPJ	PP,
MAC30:	MOVEI	AC0,0		;INITIALIZE BRACKET COUNTER
MAC31:	PUSHJ	PP,GCHAR	;GET A CHARACTER
	CAIN	C,"<"		;"<"?
	ADDI	AC0,1		;YES, INCREMENT COUNT
	CAIN	C,">"		;">"?
	SOJL	AC0,MAC14A	;YES, EXIT IF MATCHING
	SKIPLE	SX		;[137] IGNORE IF NO ARGS LEFT
	PUSHJ	PP,WCHAR	;WRITE INTO SKELETON
	JRST	MAC31		;GO BACK FOR ANOTHER

MAC40:	PUSH	PP,SX		;STACK REGISTERS
	PUSH	PP,SDEL
	HLLM	IO,TAGINC	;SAVE IO FLAGS
	PUSHJ	PP,CELL		;GET AN ATOM
	MOVE	V,AC0		;ASSUME NUMERIC
	TLNE	IO,NUMSW	;GOOD GUESS?
	JRST	MAC41		;YES
	PUSHJ	PP,SSRCH	;SEARCH THE SYMBOL TABLE
	TROA	ER,ERRX		;NOT FOUND, ERROR
MAC41:	PUSHJ	PP,MAC42	;FORM ASCII STRING
	HLL	IO,TAGINC	;RESTORE IO FLAGS
	POP	PP,SDEL
	POP	PP,SX
	TLO	IO,IORPTC	;REPEAT LAST CHARACTER
	JRST	MAC14A		;RETURN TO MAIN SCAN

MAC42:	JUMPLE	SX,CPOPJ	;[137] NO ARGS LEFT
	MOVE	C,V
MAC44:	LSHC	C,-^D35
	LSH	CS,-1
	DIVI	C,0(RX)		;DIVIDE BY CURRENT RADIX
	HRLM	CS,0(PP)
	JUMPE	C,.+2		;TEST FOR END
	PUSHJ	PP,MAC44
	HLRZ	C,0(PP)
	ADDI	C,"0"		;FORM TEXT
	JRST	WCHAR		;WRITE INTO SKELETON
MACEN0:	SOS	MACENL
MACEND:	HRRZ	C,0(PP)		;[262] GET TOP ADDRESS
	CAIN	C,MAC14E	;[262] WERE WE LOOKING FOR CLOSE PAREN?
	JUMPGE	SDEL,MPAERR	;[262] YES, GIVE USEFUL ERROR MESSAGE
	SKIPGE	C,MACENL	;TEST "CALLM IN PROGRESS"
	AOS	MACENL		;INCREMENT END LEVEL AND EXIT
	JUMPL	C,REPEA8
	EXCH	MP,RP
	POP	MP,MRP		;RETRIEVE READ POINTER
	POP	MP,RCOUNT	;AND WORD COUNT
	MOVEI	C,"^"
	SKIPL	0(MP)		;TEST FLAG
	PUSHJ	PP,RSW2		;MARK END OF SUBSTITUTION
	POP	MP,C
	POP	MP,ARG
	SKIPA	MP,MACPNT	;RESET MP AND SKIP
MACEN1:	PUSHJ	PP,REFDEC	;DECREMENT REFERENCE
MACEN2:	AOS	V,MACPNT	;GET POINTER
	MOVE	V,0(V)
	JUMPG	V,MACEN1	;IF >0, DECREMENT REFERENCE
	JUMPL	V,MACEN2	;IF <0, BYPASS
	POP	MP,V		;IF=0, RETRIEVE POINTER
	PUSHJ	PP,REFDEC	;DECREMENT REFERENCE
	MOVEM	ARG,MACPNT
	EXCH	MP,RP
	SOS	MACLVL
	SKIPN	MACENL		;CHECK UNPROCESSED END LEVEL
	JRST	MACEN3		;NONE TO PROCESS
	TRNN	MRP,-1		;MRP AT END OF TEXT
	JRST	MACEN0		;THEN POP THE MACRO STACK NOW
MACEN3:	TRNN	C,77400		;SALL FLAG?
	HRLI	C,0		;YES,TURN IT OFF
	JUMPL	C,REPEA8	;IF FLAG SET SUBSTITUTE
	JRST	RSW2
IRP0:	SKIPN	MACLVL		;ARE WE IN A MACRO?
	JRST	ERRAX		;NO, BOMB OUT
IRP10:	PUSHJ	PP,MREADS	;YES, GET DATA SPEC
	CAIE	C,40		;SKIP LEADING BLANKS
	CAIN	C,"("		;"("?
	JRST	IRP10		;YES, BYPASS
	CAIN	C,11
	JRST	IRP10
	CAIE	C,177		;NO, IS IT SPECIAL?
	JRST	ERRAX		;NO, ERROR
	PUSHJ	PP,MREADS	;YES
	TRZN	C,100		;CREATED?
	JRST	ERRAX
	CAIL	C,40		;TOO BIG?
	JRST	ERRAX
	ADD	C,MACPNT	;NO, FORM POINTER TO STACK
	PUSH	MP,IRPCF	;STACK PREVIOUS POINTERS
	PUSH	MP,IRPSW
	PUSH	MP,IRPARP
	PUSH	MP,IRPARG
	PUSH	MP,IRPCNT
	PUSH	MP,0(C)
	PUSH	MP,IRPPOI

	HRRZM	C,IRPARP
	MOVEM	AC0,IRPCF	;IRPC FLAG FOUND IN AC0
	SETOM	IRPSW		;RESET IRP SWITCH
	MOVE	CS,0(C)
	MOVEM	CS,IRPARG

IRP15:	PUSHJ	PP,MREADS	;[351] GET A CHARACTER LOOKING FOR "<"
	CAIE	C,"<"		;"<"?
	JRST	[CAIE	C,","	;[426] IGNORE COMMA
		CAIG   C," "	;[351] IGNORE TEXT-FORMATTING CHARACTERS
		JRST	IRP15	;[351]
		CAIE	C,")"	;[361] IGNORE CLOSE PARENTHESIS
		CAIN	C,">"	;[426] IGNORE RIGHT ANGLE BRACKET
		JRST	IRP15	;[354] GO BACK FOR ANOTHER
		JRST	IRPMBI]	;[351] CAN'T FIND BRACKET (OR ILL CHAR)
	PUSHJ	PP,SKELI1	;INITIALIZE NEW STRING
	MOVEM	ARG,IRPPOI	;SET NEW POINTER

	TDZA	SDEL,SDEL	;ZERO BRACKET COUNT AND SKIP
IRP20:	PUSHJ	PP,WCHAR1
	PUSHJ	PP,MREADS
	CAIN	C,"<"		;"<"?
	AOJA	SDEL,IRP20	;YES, INCREMENT COUNT AND WRITE
	CAIE	C,">"		;">"?
	JRST	IRP20		;NO, JUST WRITE IT
	SOJGE	SDEL,IRP20	;YES, WRITE IF NOT MATCHING
	MOVE	CS,[BYTE (7) 15,177,4]
	PUSHJ	PP,WWRXE	;WRITE END
	PUSH	MP,MRP		;STACK PREVIOUS READ POINTER
	PUSH	MP,RCOUNT	;AND WORD COUNT
	SKIPG	CS,IRPARG
	JRST	IRPPOP		;EXIT IF NOT VALID ARGUMENT
	MOVEI	C,1(CS)		;INITIALIZE POINTER
	MOVEM	C,IRPARG
IRPSET:	EXCH	MRP,IRPARG	;SWAP READ POINTERS
	MOVE	SX,RCOUNT	;SWAP COUNT OF WORDS TO READ
	EXCH	SX,IRPCNT
	MOVEM	SX,RCOUNT
	PUSHJ	PP,SKELI1	;INITIALIZE SKELETON FOR DATA
	HRRZM	ARG,@IRPARP	;STORE NEW DS POINTER
	SETZB	SX,SDEL		;ZERO FOUND FLAG AND BRACKET COUNT
	LDB	C,MRP		;GET LAST CHAR
	CAIN	C,","
	SKIPE	IRPCF		;IN IRPC
	JRST	IRPSE1		;NO
	MOVEI	SX,1		;FORCE ARGUMENT
IRPSE1:	PUSHJ	PP,MREADS
	CAIE	C,177		;SPECIAL?
	AOJA	SX,IRPSE2	;NO, FLAG AS FOUND
	PUSHJ	PP,PEEKM	;LOOK AT NEXT CHARACTER
	SETZM	IRPSW		;SET IRP SWITCH
	JUMPG	SX,IRPSE4	;IF ARG FOUND, PROCESS IT
	JRST	IRPPOP		;NO, CLEAN UP AND EXIT

IRPSE2:	SKIPE	IRPCF		;IRPC?
	JRST	IRPSE3		;YES, WRITE IT
	CAIN	C,","		;NO, IS IT A COMMA?
	JUMPE	SDEL,IRPSE4	;YES, EXIT IF NOT NESTED
	CAIN	C,"<"		;"<"?
	ADDI	SDEL,1		;YES, INCREMENT COUNT
	CAIN	C,">"		;">"?
	SUBI	SDEL,1		;YES, DECREMENT COUNT

IRPSE3:	PUSHJ	PP,WCHAR
	SKIPN	IRPCF		;IRPC?
	JRST	IRPSE1		;NO, GET NEXT CHARACTER

IRPSE4:	MOVSI	CS,(BYTE (7) 177,2)
	PUSHJ	PP,WWRXE	;WRITE END
	MOVEM	MRP,IRPARG	;SAVE POINTER
	MOVE	MRP,RCOUNT	;SAVE COUNT
	MOVEM	MRP,IRPCNT
	HRRZ	MRP,IRPPOI	;SET FOR NEW SCAN
	AOJA	MRP,REPEA8	;ON ARG COUNT

IRPMBI:	PUSHJ PP,EFATAL		;[351]FATAL ERROR,TYPE ?MCR
	MOVE	AC0,CALNAM	;[351]FETCH MACRO NAME
	SKIPN	IRPCF		;[354] IRPC?
	JRST	[MOVSI	RC,[SIXBIT/MBI MISSING OPEN BRACKET FOR IRP INSIDE MACRO@/]	;[354] NO
		JRST	IRPERR]	;[354]
	MOVSI	RC,[SIXBIT/MBI MISSING OPEN BRACKET FOR IRPC INSIDE MACRO@/] ;[351]
IRPERR:	PUSHJ	PP,TYPMSG	;[354] [351]OUTPUT MESSAGE
	JUMP1	.+2		;[351]ONLY COUNT ERROR ONCE
	AOS	ERRCNT		;[351]DO DURING PASS2
	JRST	ERRNE2		;[351]COMMON MESSAGE
STOPI0:	SKIPN	IRPARP		;IRP IN PROGRESS?
	JRST	ERRAX		;NO, ERROR
	SETZM	IRPSW		;YES, SET SWITCH
	POPJ	PP,

IRPEND:	MOVE	V,@IRPARP
	PUSHJ	PP,REFDEC
	SKIPE	IRPSW		;MORE TO COME?
	JRST	IRPSET		;YES

IRPPOP:	MOVE	V,IRPPOI
	PUSHJ	PP,REFDEC	;DECREMENT REFERENCE
	POP	MP,RCOUNT
	POP	MP,MRP		;RESTORE CELLS
	POP	MP,IRPPOI
	POP	MP,@IRPARP
	POP	MP,IRPCNT
	POP	MP,IRPARG
	POP	MP,IRPARP
	POP	MP,IRPSW
	POP	MP,IRPCF
	JRST	REPEA8
GETDS:				;GET DUMMY SYMBOL NUMBER
	MOVE	CS,C		;USE CS FOR WORK REGISTER
	ANDI	CS,37		;MASK
	ADD	CS,MACPNT	;ADD BASE ADDRESS
	MOVE	V,0(CS)		;GET POINTER FLAG
	JUMPG	V,GETDS1	;BRANCH IF POINTER
	TRNN	C,40		;NOT POINTER, SHOULD WE CREATE?
	JRST	RSW0		;NO, FORGET THIS ARG
	PUSH	PP,WWRXX
	PUSH	PP,MWP		;STACK MACRO WRITE POINTER
	PUSH	PP,WCOUNT	;SAVE WORD  COUNT
	PUSHJ	PP,SKELI1	;INITIALIZE SKELETON
	MOVEM	ARG,0(CS)	;STORE POINTER
	MOVE	CS,[BYTE (7) 0,170,170,170,171]	;CREATE A SYMBOL
	ADD	CS,LSTSYM		;LSTSYM= # OF LAST CREATED
	TDZ	CS,[BYTE (7) 0,170,170,170,170]
	MOVEM	CS,LSTSYM
	IOR	CS,[ASCII /.0000/]
	MOVEI	C,"."
	PUSHJ	PP,WCHAR
	PUSHJ	PP,WWORD	;WRITE INTO SKELETON
	MOVSI	CS,(BYTE (7) 177,2)
	PUSHJ	PP,WWRXE	;WRITE END CODE
	POP	PP,WCOUNT	;RESTORE WORD COUNT
	POP	PP,MWP		;RESTORE MACRO WRITE POINTER
	POP	PP,WWRXX
	MOVE	V,ARG		;SET UP FOR REFINC

GETDS1:	PUSHJ	PP,REFINC	;INCREMENT REFERENCE
	HRL	V,RCOUNT	;SAVE WORD COUNT
	PUSH	MP,V		;STACK V FOR DECREMENT
	PUSH	MP,MRP		;STACK READ POINTER
	MOVEI	MRP,1(V)	;FORM READ POINTER
	JRST	RSW0		;EXIT

DSEND:	POP	MP,MRP
	POP	MP,V
	HLREM	V,RCOUNT	;RESTORE WORD COUNT
	HRRZS	V		;CLEAR COUNT
	PUSHJ	PP,REFDEC	;DECREMENT REFERENCE
	JRST	RSW0		;EXIT
SKELI1:	MOVEI	ARG,1		;ENTRY FOR SINGLE ARG
SKELI:	SETZ	MWP,		;SIGNAL FIRST TIME THROUGH
	PUSHJ	PP,SKELWL	;GET POINTER WORD
	HRRZM	MWP,WWRXX	;SAVE FIRST ADDRESS
	HRRZM	MWP,LADR	;SAVE START OF LINKED LIST
	HRRZM	ARG,1(MWP)	;STORE COUNT
	SOS	WCOUNT		;ACCOUNT FOR WORD
	HRRZ	ARG,WWRXX	;SET FIRST ADDRESS
	ADDI	MWP,2		;BUMP POINTER
	HRLI	MWP,(POINT 7)	;SET FOR 5 ASCII BYTES
	;SKELW RETURNS WITH ADR OF NEXT FREE LOC IN V (RIGHT)

SKELW:	SOSLE	WCOUNT		;STILL SOME SPACE IN LEAF?
	POPJ	PP,		;YES, RETURN
SKELWL:	SKIPE	V,NEXT		;GET FIRST FREE ADDRESS
	JRST	SKELW1		;IF NON-ZERO, UPDATE FREE
	MOVE	V,FREE		;GET FREE
	ADDI	V,.LEAF		;INCREMENT BY LEAF SIZE
	CAML	V,SYMBOL	;OVERFLOW?
	PUSHJ	PP,XCEED	;YES, BOMB OUT
	EXCH	V,FREE		;UPDATE FREE
	SETZM	(V)		;CLEAR LINK

SKELW1:	HLL	V,0(V)		;GET ADDRESS
	HLRM	V,NEXT		;UPDATE NEXT
	SKIPE	MWP		;IF FIRST TIME
	HRLM	V,1-.LEAF(MWP)	;STORE LINK IN FIRST WORD OF LEAF
	MOVEI	MWP,.LEAF	;SIZE OF LEAF
	MOVEM	MWP,WCOUNT	;STORE FOR COUNT DOWN
	MOVEI	MWP,(V)		;SET UP WRITE POINTER
	TLO	MWP,(POINT 7,,20)	;2 ASCII CHARS
	POPJ	PP,

	;WWRXX	POINTS TO END OF TREE
	;MWP	IDPB POINTER TO NEXT HOLE
	;NEXT	FIRST OF A LINKED PORTION THAT IS NOT BEING USED (LEAVES)
	;FREE	POINTS TO FREE CORE BETWEEN TREE AND SYM-TABLE
	;LADR	POINTS TO BEG OF LINKED PORTION.
GCHARQ:	JUMPN	MRP,MREADS	;IF GETTING CHAR. FROM TREE
GCHAR:	PUSHJ	PP,CHARAC	;GET ASCII CHARACTER
	CAIG	C,FF		;TEST FOR LF, VT OR FF
	CAIGE	C,LF
	POPJ	PP,		;NO
	JRST	OUTIM1		;YES, LIST IT

WCHARQ:
WCHAR:	
WCHAR1:	TLNN	MWP,760000	;END OF WORD?
	PUSHJ	PP,SKELW	;YES, GET ANOTHER
	IDPB	C,MWP		;STORE CHARACTER
	POPJ	PP,

WWORD:	LSHC	C,7		;MOVE ASCII INTO C
	PUSHJ	PP,WCHAR1	;STORE IT
	JUMPN	CS,WWORD	;TEST FOR END
	POPJ	PP,		;YES, EXIT

WWRXE:	PUSHJ	PP,WWORD	;WRITE LAST WORD
	ADD	MWP,WCOUNT	;GET TO END OF LEAF
	SUBI	MWP,.LEAF	;NOW POINT TO START OF IT
	HRRZS	(MWP)		;ZERO LEFT HALF OF LAST LEAF
	HRRM	MWP,@WWRXX	;SET POINTER TO END
	POPJ	PP,
MREAD:	PUSHJ	PP,MREADS	;READ ONE CHARACTER
	CAIE	C,177		;SPECIAL?
	JRST	RSW1		;NO, EXIT
	PUSHJ	PP,MREADS	;YES, GET CODE WORD
	TRZE	C,100		;SYMBOL?
	JRST	GETDS		;YES
	CAILE	C,4		;POSSIBLY ILLEGAL
	JRST	ERRAX		;YUP
	HRRI	MRP,0		;NO, SIGNAL END OF TEXT
	JRST	.+1(C)
	PUSHJ	PP,XCEED
	JRST	MACEND		;1; END OF MACRO
	JRST	DSEND		;2; END OF DUMMY SYMBOL
	JRST	REPEND		;3; END OF REPEAT
	JRST	IRPEND		;4; END OF IRP

MREADI:	HRLI	MRP,700		;SET UP BYTE POINTER
	MOVEI	C,.LEAF-1	;NUMBER OF WORDS
	MOVEM	C,RCOUNT
MREADS:	TLNN	MRP,-1		;FIRST TIME HERE?
	JRST	MREADI		;YES, SET UP MRP AND RCOUNT
	TLNN	MRP,760000	;HAVE WE FINISHED WORD?
	SOSLE	RCOUNT		;YES, STILL ROOM IN LEAF?
	JRST	MREADC		;STILL CHAR. IN LEAF
	HLRZ	MRP,1-.LEAF(MRP);YES, GET LINK
	HRLI	MRP,(POINT 7,,20)	;SET POINTER
	MOVEI	C,.LEAF		;RESET COUNT
	MOVEM	C,RCOUNT
MREADC:	ILDB	C,MRP		;GET CHARACTER
	POPJ	PP,

PEEK:	JUMPN	MRP,PEEKM	;THIS IS A MACRO READ
	PUSHJ	PP,CHARAC	;READ AN ASCII CHAR.
	TLO	IO,IORPTC	;REPEAT  FOR NEXT
	POPJ	PP,		;AND RETURN

PEEKM:	PUSH	PP,MRP		;SAVE MACRO READ POINTER
	PUSH	PP,RCOUNT	;SAVE WORD COUNT
	PUSHJ	PP,MREADS	;READ IN A CHAR.
	POP	PP,RCOUNT	;RESTORE WORD COUNT
	POP	PP,MRP		;RESET READ POINTER
	POPJ	PP,		;IORPTC IS NOT SET
REFINC:	AOS	1(V)		;INCREMENT REFERENCE
	POPJ	PP,

REFDEC:	JUMPLE	V,DECERR	;CATASTROPHIC ERROR SOMEWHERE
	SOS	CS,1(V)		;DECREMENT REFERENCE
	TRNE	CS,000777	;IS IT ZERO?
	POPJ	PP,		;NO, EXIT
	CAMGE	V,UNITOP	;[225] IS THIS IN UNIV AREA?
	JRST	[AOS	1(V)	;[371][225] YES, PUT IT BACK TO DEFINING REFERENCE COUNT
		POPJ	PP,]	;[371] AND DO NOT DELETE IT
	HRRZ	CS,0(V)		;YES, GET POINTER TO END
	HRL	CS,NEXT		;GET POINTER TO NEXT RE-USABLE
	HLLM	CS,0(CS)	;SET LINK
	HRRM	V,NEXT		;RESET NEXT
	POPJ	PP,

DECERR:	PUSHJ	PP,EFATAL	;OUTPUT CR-LF ? MCR
	MOVE	AC0,CALNAM	;GET MACRO NAME
	MOVSI	RC,[SIXBIT /EWE ERROR WHILE EXPANDING@/]
	PUSHJ	PP,TYPMSG
	JRST	ERRNE2		;COMMON MESSAGE

MPAERR:	PUSHJ	PP,EFATAL	;OUTPUT CR-LF ? MCR
	MOVE	AC0,CALNAM	;GET MACRO NAME
	MOVSI	RC,[SIXBIT /MPA MISSING CLOSE PAREN AROUND ARG LIST OF@/]
	PUSHJ	PP,TYPMSG
	JRST	ERRNE2		;COMMON MESSAGE
A==	0			;ASCII MODE
AL==	1			;ASCII LINE MODE
IB==	13			;IMAGE BINARY MODE
B==	14			;BINARY MODE

;  ==   0			;USED BY HELPER AND GETSEGS
CTL==	1			;CONTROL DEVICE NUMBER
IFN CCLSW,<CTL2==5		;INPUT DEV FOR CCL FILE>
BIN==	2			;BINARY DEVICE NUMBER
CHAR==	3			;INPUT DEVICE NUMBER
LST==	4			;LISTING DEVICE NUMBER
UNV==	6			;SYMBOL TABLE FILE (UNIVERSAL)

;	COMMAND STRING ACCUMULATORS

ACDEV==	1			;DEVICE
ACFILE==2			;FILE
ACEXT==	3			;EXTENSION
ACPPN== 4			;PPN
ACDEL==	4			;DELIMITER
ACPNTR==5			;BYTE POINTER

TIO==	6

TIORW==	1000
TIOLE==	2000
TIOCLD==20000

DIRBIT==4		;DIRECTORY DEVICE
TTYBIT==10		;TTY
MTABIT==20		;MTA
DTABIT==100		;DTA
DISBIT==2000		;DISPLAY
CONBIT==20000		;CONTROLING TTY
LPTBIT==40000		;LPT
DSKBIT==200000		;DSK

;GETSTS ERROR BITS

IOIMPM==400000		;IMPROPER MODE (WRITE LOCK)
IODERR==200000		;DEVICE DATA ERROR
IODTER==100000		;CHECKSUM OR PARITY ERROR
IOBKTL== 40000		;BLOCK TOO LARGE
ERRBIT==IOIMPM!IODERR!IODTER!IOBKTL

SYN	.TEMP,PPN
SUBTTL	I/O ROUTINES
BEG:
IFN CCLSW,<TLZA	IO,ARPGSW	;DON'T ALLOW RAPID PROGRAM GENERATION
	TLO	IO,ARPGSW	;ALLOW RAPID PROGRAM GENERATION>
IFN PURESW,<
	MOVE	MRP,[XWD LOWL,LOWL+1]	;START OF DATA
	SETZM	LOWL		;ZERO FIRST WORD
	BLT	MRP,LOWEND	;AND THE REST
	MOVE	MRP,[XWD LOWH,LOWL] ;PHASED CODE
	BLT	MRP,LOWL+LENLOW	;MOVE IT IN>
	HRRZ	MRP,.JBREL	;GET LOWSEG SIZE
IFN TENEX,<
	CAIL	MRP,377777	;[206] DO WE HAVE ALL OF CORE?
	JRST	.+4		;[206] YES
	MOVEI	MRP,377777	;[206] NO, MAY AS WELL GET IT
	CORE	MRP,		;[206] IT WILL SAVE EXPANSION LATER
	  JFCL			;[206] TOO BAD
	HRRZ	MRP,.JBREL	;[206] GET HIGHEST LOC
>
	MOVEM	MRP,MACSIZ	;SAVE CORE SIZE
				;DECODE VERSION NUMBER
	MOVEI	PP,JOBFFI	;TEMP PUSH DOWN STACK
	PUSH	PP,[0]		;MARK BOTTOM OF STACK
	LDB	0,[POINT 3,.JBVER,2]	;GET USER BITS
	JUMPE	0,GETE		;NOT SET IF ZERO
	ADDI	0,"0"		;FORM NUMBER
	PUSH	PP,0		;STACK IT
	MOVEI	0,"-"		;SEPARATE BY HYPHEN
	PUSH	PP,0		;STACK IT ALSO
GETE:	HRRZ	0,.JBVER	;GET EDIT NUMBER
	JUMPE	0,GETU		;SKIP ALL THIS IF ZERO
	MOVEI	1,")"		;ENCLOSE IN PARENS.
	PUSH	PP,1
GETED:	IDIVI	0,8		;GET OCTAL DIGITS
	ADDI	1,"0"		;MAKE ASCII
	PUSH	PP,1		;STACK IT
	JUMPN	0,GETED		;LOOP TIL DONE
	MOVEI	0,"("		;OTHER PAREN.
	PUSH	PP,0
GETU:	LDB	0,[POINT 6,.JBVER,17]	;UPDATE NUMBER
	JUMPE	0,GETV		;SKIP IF ZERO
	IDIVI	0,^D26		;[224] MIGHT BE TWO DIGITS
	ADDI	1,"@"		;FORM ALPHA
	PUSH	PP,1
	JUMPN	0,GETU+1	;LOOP IF NOT DONE
GETV:	LDB	0,[POINT 9,.JBVER,11]	;GET VERSION NUMBER
	IDIVI	0,8		;GET DIGIT
	ADDI	1,"0"		;TO ASCII
	PUSH	PP,1		;STACK
	JUMPN	0,GETV+1	;LOOP
	MOVE	1,[POINT 7,VBUF+1,20]	;POINTER TO DEPOSIT IN VBUF
	POP	PP,0		;GET CHARACTER
	IDPB	0,1		;DEPOSIT IT
	JUMPN	0,.-2		;KEEP GOING IF NOT ZERO
IFN FORMSW,<IFE DFRMSW,<
	SETOM	PHWFMT		;HALF WORD UNLESS CHANGED BY SWITCH>>
IFN CCLSW,<
	TLZA	IO,CRPGSW	;SET TO INIT NEW COMMAND FILE
M:	TLNN	IO,CRPGSW	;CURRENTLY DOING RPG?>
IFE CCLSW,<M:>
	RESET			;INITIALIZE PROGRAM
	SETZM	BINDEV		;CLEAR INCASE NOT USED NEXT TIME
	SETZM	LSTDEV		;SAME REASON
	SETZM	INDEV		;INCASE OF ERROR
	HRRZ	MRP,MACSIZ	;GET INITIAL SIZE
	CORE	MRP,		;BACK TO ORIGINAL SIZE
	  JFCL			;SHOULD NEVER FAIL
	SETZB	MRP,PASS1I
	MOVE	[XWD PASS1I,PASS1I+1]
	BLT	PASS2X-1	;ZERO THE PASS1 AND PASS2 VARIABLES
	MOVEI	PP,JOBFFI	;SET TEMP PUSH-DOWN POINTER
IFN FORMSW,<
	MOVE	CS,PHWFMT	;GET DEFAULT VALUE (PERMANENT)
	MOVEM	CS,HWFMT	;SET IT (TEMP) >
	MOVE	CS,[POINT 7,DBUF,6]	;INITIALIZE FOR DATE
	MSTIME	2,		;GET TIME FROM MONITOR
	PUSHJ	PP,TIMOUT	;TIME FORMAT OUTPUT
	DATE	1,		;GET DATE
	IBP	CS		;PASS OVER PRESET SPACE
	PUSHJ	PP,DATOUT	;DATE FORMAT OUTPUT
	MOVSI	FR,P1!CREFSW
IFN CCLSW,<TLNE	IO,CRPGSW	;RPG IN PROGRESS?
	JRST	GOSET		;YES, GO READ NEXT COMMAND
	TLNE	IO,ARPGSW	;NO, RPG ALLOWED?
	JRST	RPGSET		;YES, GO TRY
CTLSET:	RELEASE	CTL2,		;IN CASE OF LOOKUP FAILURE>
IFE CCLSW,<CTLSET:>
	MOVSI	IO,IOPALL	;ZERO FLAGS
	INIT	CTL,AL		;INITIALIZE USER CONSOLE
	SIXBIT	/TTY/
	XWD	CTOBUF,CTIBUF
	  EXIT			;NO TTY, NO ASSEMBLY
	MOVSI	C,'TTY'
	DEVCHR	C,		;GET CHARACTERISTICS
	TLNN	C,10		;IS IT REALLY A TTY
	EXIT			;NO
	INBUF	CTL,1		;INITIALIZE SINGLE CONTROL
	OUTBUF	CTL,1		;BUFFERS
	PUSHJ	PP,CRLF		;OUTPUT CARRIAGE RETURN - LINE FEED
	MOVEI	C,"*"
	IDPB	C,CTOBUF+1
	OUTPUT	CTL,
	MOVE	AC1,[POINT 7,CTLBUF]	;BYTE POINTER TO STORE COMMAND
	MOVEI	AC2,1		;[277] INITIALIZE CHARACTER COUNT
CTLS2:	SOSGE	CTIBUF+2	;USUAL SOSG LOOP ON TTY INPUT
	INPUT	CTL,		;GET NEXT BUFFER
	ILDB	0,CTIBUF+1	;GET CHARACTER
	CAIL	AC2,CTLSIZ	;NUMBER OF CHARS. ALLOWED
	JRST	COMERR		;COMMAND LINE TOO LONG
	CAIN	0,CZ		;TEST FOR ^Z
	JRST	CZSTOP		;MONRET TYPE EXIT
	IDPB	0,AC1		;STORE CHAR.
	CAIE	0,33		;TEST FOR ALTMODE
	CAIG	0,FF		;TEST FOR EOL CHAR
	CAIGE	0,LF		;ONE OF FF, VT, OR LF
	AOJA	AC2,CTLS2	;NOT END OF LINE YET
	MOVEM	AC2,CTIBUF+2	;RESET CHAR. COUNT
	MOVE	AC1,[POINT 7,CTLBUF]	;BYTE POINTER TO STORE COMMAND
	MOVEM	AC1,CTIBUF+1	;RESET BYTE POINTER
IFN CCLSW,<JRST BINSET		;BEGIN WITH BINARY FILE

RPGSET:
IFN TEMP,<HRRZ	3,.JBFF		;GET START OF BUFFER AREA
	HRRZ	0,.JBREL	;GET TOP OF CORE
	CAIGE	0,200(3)	;WILL BUFFER FIT?
	JRST	[ADDI 0,200		;NO, GET ENUF CORE
		CORE	0,		;CORE UUO
		JRST	XCEED2		;FAILED, SO GIVE UP
		JRST	.+1]		;CONTINUE
	HRRM	3,TMPFIL+1	;STORE IN TMPCOR UUO IOWD
	SOS	TMPFIL+1	;MAKE IT THE PROPER IOWD FORMAT
	HRRM	3,CTLBLK+1	;DUMMY UP BUFFER HEADER
	MOVE	0,[2,,TMPFIL]	;SET UP FOR TEMP CORE READ
	TMPCOR			;READ AND DELETE FILE "MAC"
	  JRST	RPGTMP		;NO SUCH FILE IN CORE TRY DISK
	ADD	3,0		;CALCULATE END OF BUFFER
	MOVEM	3,.JBFF		;FIX JOBFF SO FILE WONT BE KILLED
	IMULI	0,5		;CALCULATE CHARACTER COUNT
	ADDI	0,1		;SINCE SOSG HAPPENS AFTER NOT BEFORE
	MOVEM	0,CTLBLK+2	;SET UP CHAR CNT IN BUFFER HEADER
	MOVEI	0,440700	;SET UP BYTE POINTER IN HEADER
	HRLM	0,CTLBLK+1	;BUFFER HEADER NOW SET UP
	SETOM	TMPFLG		;MARK THAT A TMPCOR UUO WAS DONE
	JRST	RPGS2A		;CONTINUE IN MAIN STREAM
RPGTMP:	SETZM	TMPFLG		;JUST IN CASE>
	INIT	CTL2,AL		;LOOK FOR DISK
	SIXBIT	/DSK/		;...
	XWD	0,CTLBLK	;...
	  JRST	CTLSET		;DSK NOT THERE
	HRLZI	3,'MAC'		;###MAC
	MOVEI	3		;COUNT
	PJOB	AC1,		;RETURNS JOB NO. TO AC1
RPGLUP:	IDIVI	AC1,12		;CONVERT
	ADDI	AC2,"0"-40	;SIXBITIZE IT
	LSHC	AC2,-6		;
	SOJG	0,RPGLUP	;3 TIMES
	MOVEM	3,CTLBUF	;###MAC
	HRLZI	'TMP'		;
	MOVEM	CTLBUF+1	;TMP
	SETZM	CTLBUF+3	;PROG-PRO
	LOOKUP	CTL2,CTLBUF	;COMMAND FILE
	  JRST	CTLSET		;NOT THERE
	HLRM	EXTMP		;SAVE THE EXTENSION

RPGS2:	INBUF	CTL2,1		;SINGLE BUFFERED
RPGS2A:	INIT	CTL,AL		;TTY FOR CONSOLE MESSAGES
	SIXBIT	/TTY/		;...
	XWD	CTOBUF,0	;...
	  EXIT			;NO TTY, NO ASSEMBLY
	OUTBUF	CTL,1		;SINGLE BUFFERED
	MOVE	.JBFF		;REMEMBER WHERE BINARY BUFFERS BEGIN
	MOVEM	SAVFF		;...
	HRRZ	.JBREL		;TOP OF CORE
	CAMLE	MACSIZ		;SEE IF IT HAS GROWN
	MOVEM	MACSIZ		;PREVENTS ADDRESS CHECK ON EXIT
	TLNE	IO,CRPGSW	;ARE WE ALREADY IN RPG MODE?
	JRST	M		;MUST HAVE COME FROM @ COMMAND, RESET
GOSET:	MOVSI	IO,IOPALL!CRPGSW	;SET INITIAL FLAGS
	MOVEI	CS,CTLSIZ	;MAXIMUM CHARS IN A LINE
	MOVE	AC1,CTLBLK+2	;NUMBER OF CHARACTERS
	MOVEM	AC1,CTIBUF+2	;SAVE FOR PASS 2
	MOVE	AC1,[POINT 7,CTLBUF]	;WHERE TO STASH CHARS
	MOVEM	AC1,CTIBUF+1	;...
GOSET1:	SOSG	CTLBLK+2	;ANY MORE CHARS?
	PUSHJ	PP,[IFN TEMP,<SKIPE TMPFLG	;TMPCOR UUO IN PROGRESS?
		   EXIT		;YES EXIT>
		   IN CTL2,		;READ ANOTHER BUFFERFUL
		     POPJ PP,		;EVERYTHING OK, RETURN
		   STATO CTL2,20000	;EOF?
		   JRST	[HRROI RC,[SIXBIT /ECF ERROR READING COMMAND FILE@/]
			JRST ERRFIN]		;GO COMPLAIN
		   PUSHJ PP,DELETE	;CMD FILE
		   EXIT]		;EOF AND FINISHED
	ILDB	C,CTLBLK+1	;GET NEXT CHAR
	MOVE	RC,@CTLBLK+1	;CHECK FOR SEQUENCE NUMBERS
	TRNE	RC,1		;...
	JRST	[AOS	CTLBLK+1	;SKIP OVER ANOTHER 5 CHARS
		MOVNI	RC,5		;...
		ADDM	RC,CTLBLK+2	;...
		JRST	GOSET1	]	;GO READ ANOTHER CHAR
	JUMPE	C,GOSET1	;IGNORE NULLS
	CAIE	C," "		;[131] IGNORE SPACES
	CAIN	C,"	"	;[131] AND TABS
	JRST	GOSET1		;[131] ALSO, SAVES SPACE AND COMMAND ERROR
	IDPB	C,CTIBUF+1	;STASH AWAY
	AOS	CTIBUF+2	;INCREMENT CHAR. COUNT
	CAIE	C,12		;LINE FEED OR
	CAIN	C,175		;ALTMODE?
	JRST	GOSET2		;YES, FINISHED WITH COMMAND
	CAIE	C,176
	CAIN	C,33
	JRST	GOSET2		;ALTMODE.
	SOJG	CS,GOSET1	;GO READ ANOTHER
	JRST	COMERR		;GO COMPLAIN

GOSET2:	MOVEI	C,12		;MAKE SURE THERE'S A LF
	IDPB	C,CTIBUF+1	;...
	MOVEM	AC1,CTIBUF+1	;SET POINTER TO BEGINNING
	AOS	CTIBUF+2	;ADD I TO COUNT
	MOVE	SAVFF		;RESET JOBFF FOR NEW BINARY
	MOVEM	.JBFF		;...
	JRST	BINSET
RPGS1:	PUSHJ	PP,DELETE	;DELETE COMMAND FILE
	MOVEM	ACDEV,RPGDEV	;GET SET TO INIT
	OPEN	CTL2,RPGINI	;DO IT
	JRST	EINIT		;ERROR
	MOVEM	ACFILE,INDIR	;USE INPUT BLOCK
	MOVEM	ACPPN,INDIR+3	;SET PPN 
	HLLZM	ACEXT,INDIR+1	;SET FILE EXTENSION
	JUMPN	ACEXT,RPGS1A	;[132] EXPLICIT EXTENSION GIVEN, USE IT
IFE STANSW,<MOVSI ACEXT,'CCL'	;IF BLANK TRY CCL>
IFN STANSW,<MOVSI ACEXT,'RPG'	;IF BLANK TRY RPG>
	HLLZM	ACEXT,INDIR+1	;[132] STORE DEFAULT EXT
	LOOKUP	CTL2,INDIR	;[132]
	  SKIPA	ACEXT,INDIR+1	;[132] FAILED, PICKUP EXT AND ERROR CODE
	JRST	RPGS1B		;[132] SUCCESS
	TRNE	ACEXT,-1	;[132] CHECK FOR ERROR CODE OTHER THAN 0
	JRST	RPGLOS		;[132] YES, YOU LOSE
	SETZB	ACEXT,INDIR+1	;[132] TRY NULL EXT
RPGS1A:	LOOKUP	CTL2,INDIR	;[132]
	  JRST	RPGLOS		;[132] TOTAL FAILURE
RPGS1B:	HLRM	ACEXT,EXTMP	;[132] SAVE THE EXTENSION
	HLRZ	.JBSA		;RESET JOBFF TO ORIGINAL
	MOVEM	.JBFF
	TLO	IO,CRPGSW	;TURN ON SWITCH SO WE RESET WORLD
	JRST	RPGS2		;AND GO

RPGLOS:	RELEAS	CTL2,0
	TLZ	IO,CRPGSW	;STOPS IO TO UNASGD CHAN
	JRST	ERRCF		;NO FILE FOUND
>
BINSET:	PUSHJ	PP,NAME1	;GET FIRST NAME
	  JRST	BINSE3		;NO FILE HERE
	HLLZ	ACEXT,ACEXT	;[427] DISALLOW NULL EXTENSIONS
IFN CCLSW,<CAIN	C,"!"		;WAS THIS AN IMPERATIVE?
	JRST	NUNSET		;GET THEE TO A NUNNERY
	CAIN	C,"@"		;CHECK FOR A NEW RPG FILE
	JRST	RPGS1>
	TLNN	FR,CREFSW	;CROSS REF REQUESTED?
	JRST	LSTSE1		;YES, SKIP BINARY
	CAIN	C,","		;COMMA?
	JUMPE	ACDEV,LSTSET	;YES, SKIP BINARY IF NO DEVICE SPECIFIED
	CAIN	C,"_"		;LEFT ARROW?
	JUMPE	ACDEV,LSTSE1	;YES, SKIP BINARY IF NO DEVICE SPECIFIED
	JUMPE	ACDEV,M		;IGNORE IF JUST <CR-LF>
	TLO	FR,PNCHSW	;OK, SET SWITCH
	MOVEM	ACDEV,BINDEV	;STORE DEVICE NAME
	MOVEM	ACFILE,BINDIR	;STORE FILE NAME IN DIRECTORY
	JUMPN	ACEXT,.+2	;EXTENSION SPECIFIED?
	MOVSI	ACEXT,'REL'	;NO, ASSUME RELOCATABLE BINARY
	MOVEM	ACEXT,BINDIR+1	;STORE IN DIRECTORY
	MOVEM	ACPPN,BINDIR+3	;SET PPN
	OPEN	BIN,BININI	;INITIALIZE BINARY
	  JRST	EINIT		;ERROR
	TLZE	TIO,TIOLE	;SKIP TO EOT
	MTEOT.	BIN,
	TLZE	TIO,TIORW	;REWIND REQUESTED?
	MTREW.	BIN,		;YES
	JUMPGE	CS,BINSE2	;BRANCH IF NO BACK-SPACE
	MTBSF.	BIN,		;BACK-SPACE A FILE
	AOJL	CS,.-1		;TEST FOR END
	MTWAT.	BIN,
	STATO	BIN,1B24	;LOAD POINT?
	MTSKF.	BIN,		;NO, GO FORWARD ONE
BINSE2:	SOJG	CS,.-1		;TEST FORWARD SPACING

	TLNE	TIO,TIOCLD	;DIRECTORY CLEAR REQUESTED?
	UTPCLR	BIN,		;YES, CLEAR IT
	OUTBUF	BIN,2		;SET UP TWO RING BUFFER
BINSE3:	CAIN	C,"_"
	JRST	GETSET		;NO LISTING
LSTSET:	PUSHJ	PP,NAME1	;GET NEXT DEVICE
	  JRST	GETSET		;NO FILE HERE
HLLZ	ACEXT,ACEXT
	HLLZ	ACEXT,ACEXT	;[427] DISALLOW NULL EXTENSIONS
LSTSE1:	CAIE	C,"_"
	JRST	ERRCM
	TLNE	FR,CREFSW	;CROSS-REF REQUESTED?
	JRST	LSTSE2		;NO, BRANCH
	JUMPN	ACDEV,.+2	;YES, WAS DEVICE SPECIFIED?
	MOVSI	ACDEV,'DSK'	;NO, ASSUME DSK
	JUMPN	ACFILE,.+2
	MOVE	ACFILE,[SIXBIT /CREF/]
	JUMPN	ACEXT,.+2
	MOVSI	ACEXT,'CRF'
LSTSE2:	JUMPE	ACDEV,GETSET	;FORGET LISTING IF NO DEVICE SPECIFIED
	MOVE	AC0,ACDEV
	DEVCHR	AC0,		;GET CHARACTERISTICS
	TLNE	AC0,LPTBIT!DISBIT!TTYBIT
	TLNE	FR,CREFSW	; WAS CROSS-REF REQUESTED?
	AOSA	OUTSW+0*TTYSW	;NO, ASSUME TTY
	JRST	ERRCM		;YES, ERROR - CREF DEV MUST NOT BE LPT, DIS, OR TTY
	TLNE	AC0,CONBIT	;CONTROLING TELETYPE LISTING?
	JRST	GETSET		;YES, BUFFER ALREADY SET
	MOVEM	ACDEV,LSTDEV	;STORE DEVICE NAME
	AOS	OUTSW+0*LPTSW	;SET FOR LPT
	MOVEM	ACFILE,LSTDIR	;STORE FILE NAME
	JUMPN	ACEXT,.+2
	MOVSI	ACEXT,'LST'
	MOVEM	ACEXT,LSTDIR+1
	MOVEM	ACPPN,LSTDIR+3	;SET PPN
	OPEN	LST,LSTINI	;INITIALIZE LISTING OUTPUT
	  JRST	EINIT		;ERROR
	TLZE	TIO,TIOLE
	MTEOT.	LST,
	TLZE	TIO,TIORW	;REWIND REQUESTED?
	MTREW.	LST,		;YES
	JUMPGE	CS,LSTSE3
	MTBSF.	LST,
	AOJL	CS,.-1
	MTWAT.	LST,
	STATO	LST,1B24
	MTSKF.	LST,
LSTSE3:	SOJG	CS,.-1
	TLNE	TIO,TIOCLD	;DIRECTORY CLEAR REQUESTED?
	UTPCLR	LST,		;YES, CLEAR IT
	OUTBUF	LST,2		;SET UP A TWO RING BUFFER
GETSET:
IFN FT.U01,<
	MOVE	3,[IOWD $USRLN,$USSTK] ; RESET THE USER PUSH DOWN STACK
	MOVEM	3,$USRPD	; SO DO IT
>;END OF FT.U01
	MOVEI	3,PDPERR
	HRRM	3,.JBAPR	;SET TRAP LOCATION
	MOVEI	3,1B19		;SET FOR PUSH-DOWN OVERFLOW
	APRENB	3,
	SOS	3,PDP		;GET PDP REQUEST MINUS 1
	IMULI	3,.PDP		;COMPUTE SIZE (50*<NUMBER OF /P'S +1>)
	HRLZ	MP,3
	HRR	MP,.JBFF	;SET BASIC POINTER
	MOVE	PP,MP
	SUB	PP,3
	MOVEM	PP,RP		;SET RP
	MOVEM	PP,SAVERP
	SUB	PP,3
IFN POLISH,<
	MOVEM	PP,POLSTK	;[164] SAVE INITIAL POLISH FIXUP STACK
	MOVEM	PP,POLPTR	;[164] ONLY CHANGE IF STACK MOVES
	SUB	PP,3		;[164]
>
	ASH	3,1		;DOUBLE SIZE OF BASIC POINTER
	HRL	PP,3
	MOVEM	PP,SAVEPP
	MOVEM	MP,SAVEMP
	SUBM	PP,3		;COMPUTE TOP LOCATION
	SKIPN	UNITOP		;IF ANY UNIVERSALS HAVE BEEN SEEN
	JRST	GETSE0		;NO
	HRRZS	3		;GET TOP OF BUFFERS AND STACKS
	CAMLE	3,UNISIZ	;HOPE ITS NOT BIGGER THAN UNIVERSAL ONE
	JRST	UNIERR		;IT WAS, YOU LOSE
	SKIPA	3,UNITOP	;DON'T LOSE THEM
GETSE0:	HRRZM	3,UNISIZ	;STORE UNTIL A UNIVERSAL IS SEEN
	HRRZM	3,LADR		;SET START OF MACRO TREE
	HRRZM	3,FREE

GETSE1:	HRRZ	.JBREL
	SUBI	1
	MOVEM	SYMTOP		;SET TOP OF SYMBOL TABLE
	SUBI	LENGTH		;SET POINTER FOR INITIAL SYMBOLS
	CAMLE	LADR		;HAVE WE ROOM?
	JRST	GETSE2		;YES

	HRRZ	2,.JBREL	;NO, TRY FOR MORE CORE
	ADDI	2,2000
	CORE	2,
	  JRST	XCEED2		;NO MORE, INFORM USER
	JRST	GETSE1		;TRY AGAIN
GETSE2:	MOVEM	SYMBOL		;SET START OF SYMBOL TABLE
	HRLI	SYMNUM
	BLT	@SYMTOP		;STORE SYMBOLS
IFN POLISH,<
	MOVE	@SYMBOL		;SYMBOL COUNT
	MOVEM	SGSCNT		; FOR THIS PSECT
>
	PUSHJ	PP,SRCHI	;INITIALIZE TABLE

;HERE TO TEST FOR CPU AND SET VALUE IN .CPU.
;PDP-6 = 1
;KA-10 = 2
;KI-10 = 3
;KL-10 = 4

	MOVEI	V,1		;SET VALUE TO .PDP6. FOR STARTERS
	JFCL	1,.+1		;CLEAR PC CHANGE FLAG
	JRST	.+1		;THEN CHANGE PC
	JFCL	1,.PDP6.	;IF FLAG ON, ITS A PDP6
	HRLOI	1,-2		;CHECK FOR KA-10
	AOBJP	1,.KA10.	;CHECK CARRY BETWEEN HALVES
	SETZ	1,		;CLEAR AC
	BLT	1,0		;AND TRY BLT, KI WILL BE 0 AND
	JUMPE	1,.KI10.	;KL WILL HAVE 1,,1
;	JRST	.KL10.

.KL10.:	AOS	V
.KI10.:	AOS	V
.KA10.:	AOS	V
.PDP6.:	MOVE	AC0,['.CPU. ']
	PUSHJ	PP,SSRCH	;SEE IF THERE ALREADY AND IF NOT
	  PUSHJ	PP,[MOVSI ARG,SYMF!NOOUTF!SUPRBT
		SETZ	RC,
		JRST	INSERT]		;PUT IT IN TABLE
	GETPPN	V,		;[405]GET LOGGED IN PPN
	  JFCL			;[405]ALT. RETURN
	MOVEM	V,MYPPN		;[405]AND REMEMBER IT
IFN POLISH,<
	SETZM	SGNMAX		;INIT TO ONE .PSECT
	SETZM	SGNCUR		;IT IS THE CURRENT .PSECT
	SETZM	SGNAME		;IT IS THE BLANK .PSECT
	MOVSI	1
	MOVEM	SGRELC		;SET THE RELOCATION COUNTER
	SETZM	SGATTR		;ZERO PSECT BRK AND ATTRS
	SETZM	SGDMAX		;ONE .PSECT DEEP
	SETZM	SGLIST		;IT IS THE BLANK .PSECT
>
	MOVE	[XWD CTIBUF+1,CTLSAV]	;SAVE CONTROL INPUT BUFFER
	BLT	CTLS1		;FOR RESCAN ON PASS 2
	MOVSI	'DSK'		;SET INPUT TO TAKE DSK AS DEV
	MOVEM	ACDEVX
	PUSHJ	PP,COUTI	;INIT OUTPUT JUST IN CASE
	PUSHJ	PP,INSET	;GET FIRST INPUT FILE
	  JRST	GETSE3		;ERROR

IFN CCLSW,<TLNE	IO,CRPGSW	;BUT ONLY IF DOING RPG
	TTCALL	3,[ASCIZ /MACRO:/]	;PUBLISH COMPILER NAME>
	MOVE	CS,INDIR	;SET UP NAME OF FIRST FILE
	MOVEM	CS,LSTFIL	;AS LAST PRINTED
	SETZM	LSTPGN
	JRST	ASSEMB		;START ASSEMBLY

GETSE3:	PUSHJ	PP,ERRNE
	JRST	ERRFIN
FINIS:	CLOSE	BIN,		;DUMP BUFFER
	TLNE	FR,PNCHSW	;PUNCH REQUESTED?
	PUSHJ	PP,TSTBIN	;YES, TEST FOR ERRORS
	RELEAS	BIN,
	CLOSE	LST,
	SOSLE	OUTSW+0*LPTSW	;LPT TYPE OUTPUT?
	PUSHJ	PP,TSTLST	;YES, TEST FOR ERRORS
	RELEAS	LST,
	RELEAS	CHAR,
	OUTPUT	CTL,0		;FLUSH TTY OUTPUT
	SKIPE	UNIVSN		;SKIP IF NOT ASSEMBLING UNIVERSAL
	PUSHJ	PP,UNISYM	;STORE SYMBOLS ETC. FIRST
	JRST	M		;RETURN FOR NEXT ASSEMBLY
IFN CCLSW,<
NUNSET:	JUMPN	ACDEV,.+2
	MOVSI	ACDEV,'SYS'	;USE SYS IF NONE SPECIFIED
	MOVEM	ACDEV,RUNDEV
	MOVEM	ACFILE,RUNFIL	;STORE FILE NAME
	SKIPN	SFDADD		;ANY SFD'S?
	JRST	NUNPP		;NO
	HRLI	ACPPN,RUNSFD	;FORM BLT WORD
	MOVSS	ACPPN		;BUT WRONG WAY ROUND
	BLT	ACPPN,RUNSFD+2+.SFDLN
	MOVEI	ACPPN,RUNSFD	;SET UP ADDRESS AGAIN
NUNPP:	MOVEM	ACPPN,RUNPP	;IN PPN
	PUSHJ	PP,DELETE	;COMMAND FILE
	SETZM	RUNFIL+1	;LET MONITOR CHOOSE EXT
	SETZM	RUNFIL+2	;CLEAR ALSO
	SETZM	RUNPP+1		;ZERO CORE ARG
	MOVEI	16,RUNDEV	;XWD 0,RUNDEV
	TLNE	IO,CRPGSW	;WAS RPG IN PROGRESS?
	HRLI	16,1		;YES. START NEXT AT C(.JBSA)+1

;REDUCE THE LOW SEGMENT TO 1K AND DELETE THE HIGH
;BEFORE THE RUN UUO, SAVES CORE AND TIME
	MOVE	1,[1,,RUNEND-1]	;DELETE HIGH & LOW
	MOVE	2,[RUNHI,,RUNLO]
	BLT	2,RUNDEV-1	;BLT CODE DOWN
	JRST	RUNLO		;GO TO IT

RUNHI:	PHASE	LOWL
RUNLO:!	CORE	1,		;CUT DOWN TO 1K
	  JFCL			;TOO BAD
	RUN	16,		;DO "RUN DEV:NAME"
	  HALT			;SHOULDN'T RETURN. HALT IF IT DOES

RUNDEV:!	BLOCK	1
RUNFIL:!	BLOCK	3
RUNPP:!		BLOCK	2
RUNSFD:!	BLOCK	3+.SFDLN
RUNEND:!
	DEPHASE

DELETE:	HRRZ	EXTMP		;IF THE EXTENSION
	CAIE	'TMP'		;IS  .TMP
	POPJ	PP,		;RETURN.
	CLOSE	CTL2,		;DELETE
	SETZB	4,5		;THE COMMAND FILE.
	SETZB	6,7
	RENAME	CTL2,4		;
	  JFCL
	POPJ	PP,
>
INSET:	MOVEI	JOBFFI		;POINTER TO INPUT BUFFER
	HRRM	.JBFF		;INFORM SYSTEM OF BUFFER AREA
	PUSHJ	PP,NAME2	;GET NEXT COMMAND NAME
	  POPJ	PP,		;ERROR RETURN IF NONE LEFT
	AOS	(PP)		;SUCCESS
	MOVEM	ACDEV,INDEV	;STORE DEVICE
	MOVEM	ACFILE,INDIR	;STORE FILE IN DIRECTORY
	MOVEM	ACPPN,INDIR+3	;STORE PPN BEFORE WE LOSE IT
	OPEN	CHAR,INDEVI
	  JRST	EINIT		;ERROR
	DEVCHR	ACDEV,		;TEST CHARACTERISTICS
	TLNN	ACDEV,MTABIT	;MAG TAPE?
	JRST	INSET3		;NO
	TLZN	FR,MTAPSW	;FIRST MAG TAPE IN PASS 2?
	JRST	INSET1		;NO
	TLNN	TIO,TIORW	;YES, REWIND REQUESTED?
	SUB	CS,RECCNT	;NO, PREPARE TO BACK-SPACE TAPE
INSET1:	AOS	RECCNT		;INCREMENT FILE COUNTER
	ADDM	CS,RECCNT	;UPDATE  COUNT
	TLZE	TIO,TIOLE
	MTEOT.	CHAR,
	TLZE	TIO,TIORW	;REWIND?
	MTREW.	CHAR,		;YES
	JUMPGE	CS,INSET2
	MTBSF.	CHAR,
	MTBSF.	CHAR,
	AOJL	CS,.-1
	MTWAT.	CHAR,
	STATO	CHAR,1B24
	MTSKF.	CHAR,
INSET2:	SOJGE	CS,.-1

INSET3:	INBUF	CHAR,1
	MOVEI	ACPNTR,JOBFFI
	EXCH	ACPNTR,.JBFF
	SUBI	ACPNTR,JOBFFI
	MOVEI	ACDEL,NUMBUF*203+1
	IDIV	ACDEL,ACPNTR
	INBUF	CHAR,(ACDEL)
	JUMPN	ACEXT,INSET4	;TAKE USER'S EXTENSION IF NON-BLANK
	MOVSI	ACEXT,'MAC'	;BLANK, TRY .MAC FIRST
	PUSHJ	PP,INSETI
INSET4:	  PUSHJ	PP,INSETI
	  JUMPE	ACEXT,ERRCF	;ERROR IF ZERO
	TLNE	ACDEV,TTYBIT	;TELETYPE?
	SETSTS	CHAR,AL		;YES, CHANGE TO ASCII LINE
				;DO ALL ENTERS HERE FOR LEVEL D
	SKIPE	ENTERS		;HAVE ENTERS BEEN DONE ALREADY?
	JRST	ENTRDN		;YES, DON'T DO TWICE
	SKIPN	ACEXT,LSTDEV	;IS THERE A LIST DEVICE?
	JRST	LSTSE6		;NO SO DON'T DO ENTER
	SKIPN	ACFILE,LSTDIR	;GET FILE NAME INCASE OF ERROR
	JRST	[DEVCHR	ACEXT,	
		TLNE	ACEXT,DIRBIT	;DOES IT HAVE A DIRECTORY?
		JRST	LSTSE4		;YES, GIVE UP BEFORE HARM IS DONE
		SKIPE	ACFILE,INDIR	;USE INPUT FILE NAME
		MOVEM	ACFILE,LSTDIR	;TOO BAD IF ZERO ALSO
		JRST	LSTSE4]
	HLLZS	ACEXT,LSTDIR+1	;EXT ALSO
	MOVE	ACPPN,LSTDIR+3	;SAVE PPN
	LOOKUP	LST,LSTDIR	;PREVIOUS ONE STILL THERE
	  JRST	LSTSE4		;NO
	SETZM	LSTDIR		;YES,CLEAR NAME
	HLLZS	LSTDIR+1
	MOVEM	ACPPN,LSTDIR+3	;RESET PPN
	RENAME	LST,LSTDIR
	CLOSE	LST,		;IGNORE FAILURE
	MOVEM	ACFILE,LSTDIR	;RESTORE NAME
	SETZM	LSTDIR+2	;CLEAR PROTECTION AND DATE
LSTSE4:	MOVEM	ACPPN,LSTDIR+3	;[246] SET PPN AGAIN
	HLLZS	LSTDIR+1	;ZERO RIGHT HALF OF EXTENSION WORD
	ENTER	LST,LSTDIR	;SET UP DIRECTORY
	  JRST	ERRCL		;ERROR
LSTSE6:	SKIPN	ACEXT,BINDEV	;A BINARY DEVICE THEN ?
	JRST	ENTRDN		;NO
	SKIPN	ACFILE,BINDIR	;INCASE OF ERROR
	JRST	[DEVCHR	ACEXT,	
		TLNE	ACEXT,DIRBIT	;DOES IT HAVE A DIRECTORY?
		JRST	.+1		;YES, GIVE UP BEFORE HARM IS DONE
		SKIPE	ACFILE,INDIR	;USE INPUT FILE NAME
		MOVEM	ACFILE,BINDIR	;TOO BAD IF ZERO ALSO
		JRST	.+1]
	HLLZS	ACEXT,BINDIR+1
	ENTER	BIN,BINDIR	;ENTER FILE NAME
	  JRST	ERRCB		;ERROR

ENTRDN:	SETOM	ENTERS		;MAKE SURE ONLY DONE ONCE
	MOVE	CS,[POINT 7,DEVBUF]
	PUSH	PP,1		;SAVE THE ACCS
	PUSH	PP,2
	PUSH	PP,3
	SKIPN	2,INDIR		;GET INPUT NAME
	JRST	FINDEV		;FINISHED WITH DEVICE
	SETZ	1,		;CLEAR FOR RECEIVING
	LSHC	1,6		;SHIFT ONE CHAR. IN
	ADDI	1,40		;FORM ASCII
	IDPB	1,CS		;STORE CHAR.
	JUMPN	2,.-4		;MORE TO DO?
	MOVEI	1,"	"	;SEPARATE BY TAB
	IDPB	1,CS
	HLLZ	2,INDIR+1	;GET EXT
	JUMPE	2,FINEXT	;NO EXT
	SETZ	1,
	LSHC	1,6		;SAME LOOP AS ABOVE
	ADDI	1,40
	IDPB	1,CS
	JUMPN	2,.-4
	MOVEI	1,"	"
	IDPB	1,CS		;SEPARATE BY TAB
FINEXT:	LDB	1,[POINT 12,INDIR+2,35]	;GET LOW 12 BITS OF DATE
	LDB	2,[POINT 3,INDIR+1,20]	;GET HIGH 3 BITS OF DATE
	DPB	2,[POINT 3,1,23]	;MERGE TO BITS 
	JUMPE	1,FINDEV	;NO DATE?
	PUSHJ	PP,DATOUT	;STORE IT
	LDB	2,[POINT 11,INDIR+2,23]	;GET CREATION TIME
	JUMPE	2,FINDEV	;NO TIME (DECTAPE)
	MOVEI	1," "		;SEPARATE BY SPACE
	IDPB	1,CS
	PUSHJ	PP,TIMOU1	;STORE TIME
FINDEV:	SETZ	1,
	MOVEI	2,"	"	;FINAL TAB
	IDPB	2,CS
	IDPB	1,CS		;TERMINATE FOR NOW
	POP	PP,3		;RESTORE ACCS
	POP	PP,2
	POP	PP,1
	SKIPN	PAGENO		;IF FIRST TIME THRU
	JRST	OUTFF		;START NEW PAGE
	SETZM	PAGENO		;ON NEW FILE, RESET PAGES
	JRST	OUTFF2		;DON'T START NEW PAGE UNLESS FF

INSETI:	HLLZM	ACEXT,INDIR+1	;STORE EXTENSION
	MOVE	ACPPN,INDIR+3	;SAVE PPN
	LOOKUP	CHAR,INDIR
	  SKIPA	ACEXT,INDIR+1	;GET ERROR CODE
	JRST	CPOPJ1		;SKIP-RETURN IF FOUND
	TRNE	ACEXT,-1	;ERROR CODE OF 0 IS FILE NOT FOUND
	JRST	ERRCF		;FILE THERE BUT NOT READABLE
	SETZ	ACEXT,		;CLEAR EXT AND TRY AGAIN
	MOVEM	ACPPN,INDIR+3	;RESTORE PPN
	POPJ	PP,
REC2:	MOVS	[CTIBUF+1,,CTLSAV]	;RESCAN CONTROL (FROM PASS1 END STMNT)
	BLT	CTIBUF+2	;INPUT BUFFER
	MOVEI	"_"
	HRLM	ACDELX		;FUDGE PREVIOUS DELIMITER
	SETZM	PASS2I
	MOVE	[XWD PASS2I,PASS2I+1]
	BLT	PASS2X-1		;ZERO PASS2 VARIABLES
	TLO	FR,MTAPSW!LOADSW	;SET FLAGS 

GOTEND:	MOVE	INDEV		;GET LAST DEVICE
	DEVCHR			;GET ITS CHARACTERISTICS
	TLNE	4		;TEST FOR DIRECTORY (DSK OR DTA)
	JRST	EOT		;YES, SO DON'T WASTE TIME
	JRST	.+3		;NO, INPUT BUFFER BY BUFFER
	IN	CHAR,
	JRST	.-1		;NO ERRORS
	STATO	CHAR,1B22	;TEST FOR EOF
	JRST	.-3		;IGNORE ERRORS

EOT:	PUSHJ	PP,SAVEXS	;SAVE REGISTERS
	SETOM	EOFFLG		;[417]GOING THRU EOF PROCEDURE
	PUSHJ	PP,INSET	;GET THE NEXT INPUT DEVICE
	  JRST	EOT0		;ERROR
	HRROI	RC,[SIXBIT /EP1 END OF PASS 1]@/]	;ASSUME END OF PASS
	TLZN	FR,LOADSW	;ZERO ONLY ON END OF PASS 1
	HRROI	RC,[SIXBIT /LNF LOAD THE NEXT FILE]@/]	;NOT END OF PASS
	TLNE	ACDEV,(1B13!1B15)	;WAS ALL THAT WORK NECESSARY?
	JRST	RSTRXS		;NO
	PUSHJ	PP,EINFO	;CR-LF [
	PUSHJ	PP,TYPMSG	;YES

RSTRXS:	MOVSI	RC,SAVBLK	;SET POINTER
	BLT	RC,RC-1		;RESTORE REGISTERS
	MOVE	RC,SAVERC	;RESTORE RC
	POPJ	PP,		;EXIT

SAVEXS:	MOVEM	RC,SAVERC	;SAVE RC
	MOVEI	RC,SAVBLK	;SET POINTER
	BLT	RC,SAVBLK+RC-1	;BLT ALL REGISTERS BELOW RC
	POPJ	PP,		;EXIT

EOT0:	JUMP1	[TLON	FR,LOADSW	;PRINT MESSAGE ONCE
		PUSHJ	PP,ERRNE	;ON PASS1
		JRST	EOT1]
	AOS	ERRCNT		;COUNT AS ERROR
	TLO	FR,LOADSW	;USED TO SIGNAL  POPJ RET FROM ERRNE
	PUSHJ	PP,ERRNE	;PRINT ERROR MESSAGE
EOT1:	TLZ	IO,IORPTC
	MOVE	PP,SAVEPP	;RESTORE STACKS
	MOVE	MP,SAVERP
	MOVEM	MP,SAVERP
	MOVE	MP,SAVEMP
	AOBJN	PP,END01	;FAKE END SEEN
NAME1:	SETZM	ACDEVX		;ENTRY FOR DESTINATION
NAME2:	SETZB	ACDEV,INDIR+2	;ENTRY FOR SOURCE
	SETZB	ACFILE,PPN	;CLEAR FILE AND PPN
	HLRZ	ACDEL,ACDELX	;GET PREVIOUS DELIMITER
	SETZB	TIO,CS
	SETZB	ACEXT,INDIR+3	;RESET EXTENSION AND PROGRAM-NUMBER PAIR
	SETZM	SFDADD		;CLEAR FIRST WORD OF SFD BLOCK
	MOVE	AC0,[SFDADD,,SFDADD+1]
	BLT	AC0,SFDADD+2+.SFDLN	;AND REST OF IT
NAME3:	MOVSI	ACPNTR,(POINT 6,AC0)	;SET POINTER
	TDZA	AC0,AC0		;CLEAR SYMBOL

SLASH:	PUSHJ	PP,SW0
GETIOC:	PUSHJ	PP,TTYIN	;GET INPUT CHARACTER
	CAIN	C,"/"
	JRST	SLASH
	CAIN	C,"("
	JRST	SWITCH
	CAIN	C,":"
	JRST	DEVICE
	CAIN	C,"."
	JRST	NAME
IFN CCLSW,<CAIE	C,"!"		;IS CHAR AN IMPERATIVE?
	CAIN	C,"@"
	JRST	TERM		;YES, GO DO IT>
	CAIE	C,33		;CHECK FOR THREE FLAVORS OF ALT-MODE
	CAIN	C,176		;...
	JRST	TERM		;...
	CAIG	C,CR		;LESS THAN CR?
	CAIGE	C,LF		;AND GREATER THAN LF?
	CAIN	C,175		;OR 3RD ALTMOD
	JRST	TERM		;YES
	CAIE	C,"<"		;NEW ALT FORM OF DIRECTORY
	CAIN	C,"["
	JRST	PROGNP		;GET PROGRAMER NUMBER PAIR
	CAIN	C,"="		;EQUALS IS SAME AS LEFT ARROW
	TRCA	C,142		;SO MAKE IT A "_" AND SKIP
	CAIE	C,","
	CAIN	C,"_"
	JRST	TERM
	JUMPL	C,TERME		;ERROR RETURN FROM TTYIN?
	CAIGE	C,40		;VALID AS SIXBIT?
	JRST	[CAIN C,CZ	;NO,IS IT ^Z
		JRST	CZSTOP	;YES,EXIT FOR BATCH
		JRST	GETIOC]	;JUST IGNORE
	CAIL	C,"0"		;[424] ERROR IF NOT ALPHANUMERIC
	CAILE	C,"Z"		;[424]
	JRST	ERRCM		;[424]
	CAILE	C,"9"		;[424]
	CAIL	C,"A"		;[424]
	CAIA			;[424]
	JRST	ERRCM		;[424]
	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,ERRCM	;ERROR IF ALREADY SET
	MOVE	ACDEV,AC0	;DEVICE NAME
	JRST	DEVNAM		;COMMON CODE

NAME:	JUMPN	ACFILE,ERRCM	;ERROR IF ALREADY SET
	MOVE	ACFILE,AC0	;FILE NAME
DEVNAM:	MOVE	ACDEL,C		;SET DELIMITER
	JRST	NAME3		;GET NEXT SYMBOL

TERME:	TLZA	C,-1		;MAKE INTO 33 BUT GIVE ERROR RET
TERM:	AOS	(PP)		;GIVE SKIP RETURN ON VALID TERMINATOR
	JUMPE	ACDEL,TERM1	;IF NO PREVIOUS TERMINATOR, THEN FILENAME
	CAIN	ACDEL,"_"	;...
	JRST	TERM1		;...
	CAIE	ACDEL,":"	;IF PREVIOUS DELIMITER
	CAIN	ACDEL,","	;WAS COLON OR COMMA
TERM1:	MOVE	ACFILE,AC0	;SET FILE
	CAIN	ACDEL,"."	;IF PERIOD,
	HLLO	ACEXT,AC0	;[427] SET EXTENSION
	HRLM	C,ACDELX	;SAVE PREVIOUS DELIMITER
	JUMPN	ACDEV,.+2	;IF DEVICE SET USE IT
	SKIPA	ACDEV,ACDEVX	;OTHERWISE USE LAST DEVICE
	MOVEM	ACDEV,ACDEVX	;AND DEVICE
	SKIPN	ACPPN,PPN	;[216] PUT PPN IN RIGHT PLACE
	SKIPN	PPPN		;[216] DO WE HAVE A DEFAULT?
	JRST	TERM2		;[216] PPN IS SETUP
	MOVE	ACPPN,[PSFD,,SFDADD]	;[216] MOVE DEFAULT SFD
	BLT	ACPPN,SFDE	;[216]
	MOVE	ACPPN,PPPN	;[216] AND PPN
TERM2:	CAIN	C,"!"		;IMPERATIVE?
	POPJ	PP,		;YES, DON'T ASSUME DEV
	JUMPE	ACFILE,CPOPJ	;IF THERE IS A FILE,
	JUMPN	ACDEV,.+2	;BUT NO DEVICE
	MOVSI	ACDEV,'DSK'	;THEN ASSUME DISK
	POPJ	PP,		;EXIT

CZSTOP:	EXIT	1,		;[275]MONRET
	JRST	M		;[275]CONTINUE
ERRCM:	HRROI	RC,[SIXBIT /CME COMMAND ERROR@/]
	JRST	ERRFIN

PROGNP:	PUSHJ	PP,GETOCT	;GET AN OCTAL NUMBER IN RC
	SKIPN	RC		;[405] IF ITS 0, USE
	HLRZ	RC,MYPPN	;[405]USE LOGGED IN PROJECT NUMBER
	HRLZM	RC,PPN		;STORE IT
	CAIE	C,","		;MORE?
	JRST	PPNTST		;[216] NO, GIVE UP
	PUSHJ	PP,GETOCT	;GET AN OCTAL NUMBER
	SKIPN	RC		;[405] IF ITS 0, USE
	HRRZ	RC,MYPPN	;[405]MY PROGRAMMER NUMBER
	HRRM	RC,PPN		;STORE IT
	CAIE	C,","		;SFD'S?
	JRST	PPNTST		;[216] NO
	MOVEI	C,SFDADD	;POINT TO DDDSFD BLOCK
	EXCH	C,PPN		;SWAP WITH PPN
	MOVEM	C,SFDADD+2	;STORE IT
	MOVEI	RC,SFDADD+3	;START OF SFD AREA
SFD1:	HRRZS	RC		;CLEAR BYTE POINTER
	CAILE	RC,SFDADD+2+.SFDLN
	JRST	ERRCM		;PATH TOO LONG
	HRLI	RC,(POINT 6)	;BYTE POINTER SETUP
SFD2:	PUSHJ	PP,TTYIN	;GET CHAR
	CAIE	C,">"		;ALT FORM
	CAIN	C,"]"		;END?
	JRST	PPNTST		;[216] YES
	CAIN	C,","		;NEXT SFD
	AOJA	RC,SFD1		;YES, INCREMENT STORE ADDRESS
	SUBI	C,40		;CONVERT TO SIXBIT
	JUMPL	C,ERRCM		;ERROR
	TLNE	RC,770000	;SPACE IN WORD
	IDPB	C,RC		;YES, STORE CHAR.
	JRST	SFD2		;GET NEXT CHAR

GETOCT:	SETZ	RC,		;START WITH ZERO
GETOC1:	PUSHJ	PP,TTYIN
	CAIE	C,","		;TEST FOR COMMA
	CAIN	C,"]"		;AND CLOSE SQB
	POPJ	PP,		;YES, WEVE GOT SOMETHING
	CAIN	C,">"		;ALSO ALT FORM
	POPJ	PP,
IFE STANSW,<
	CAIL	C,"0"		;CHECK FOR VALID NUMBERS
	CAILE	C,"7"
	JRST	ERRCM		;NOT VALID
	LSH	RC,3		;SHIFT PREVIOUS RESULT
	ADDI	RC,-"0"(C)	;ADD IN NEW NUMBER>
IFN STANSW,<LSH	RC,6		;SHIFT PREVIOUS RESULT
	ADDI	RC,-40(C)	;PUT IN NEW CHARACTER>
	JRST	GETOC1		;GET NEXT CHARACTER

;[216] HERE TO TEST FOR DEFAULT PPN
PPNTST:	SKIPN	ACFILE		;SEEN FILE NAME YET?
	SKIPE	AC0		;OR PENDING
	JRST	GETIOC		;NO
	PUSH	PP,AC0		;GET AN AC
	MOVE	AC0,PPN		;GET PPN
	MOVEM	AC0,PPPN	;MAKE IT PERMANENT
	MOVE	AC0,[SFDADD,,PSFD]
	BLT	AC0,PSFDE	;SAME FOR SFDS
	POP	PP,AC0
	JRST	GETIOC
;[216] END OF EDIT
SWITC0:	PUSHJ	PP,SW1		;PROCESS CHARACTER
SWITCH:	PUSHJ	PP,TTYIN	;GET NEXT CHARACTER
	CAIE	C,")"		;END OF STRING?
	JRST	SWITC0		;NO
	JRST	GETIOC		;YES

SW0:	PUSHJ	PP,TTYIN
SW1:	HRREI	C,-"A"(C)	;[227] CONVERT FROM ASCII TO NUMERIC
	JUMPL	C,SEELPP	;[227] NUMERIC VALUE MAYBE?
	CAILE	C,"Z"-"A"	;WITHIN BOUNDS? (IS IT ALPHA?)
	JRST	ERRCM		;[227] NO, LT. Z, ERROR
	MOVE	RC,[POINT 5,BYTAB]
	IBP	RC
	SOJGE	C,.-1		;MOVE TO PROPER BYTE
	LDB	C,RC		;PICK UP BYTE
	JUMPE	C,ERRCM		;TEST FOR VALID SWITCH
	CAIG	C,SWTABT-SWTAB	;LEGAL ON SOURCE?
	JUMPL	PP,ERRCM	;NO, TEST FOR SOURCE
	LDB	RC,[POINT 4,SWTAB-1(C),12]
	CAIN	RC,IO
	SKIPN	CTLSAV		;IF PASS2 OR IO SWITCH,
	XCT	SWTAB-1(C)	;EXECUTE INSTRUCTION
	POPJ	PP,		;EXIT
	TLZ	IO,IOSALL	;TAKE CARE OF /X
	POPJ	PP,

HELP:	PUSH	PP,.JBFF	;SAVE REAL .JBFF
	MOVE	1,.JBREL	;USE JOBREL
	MOVEM	1,.JBFF		;SO HELPER DOESN'T DESTROY SYMBOL TABLE
	MOVE	1,['MACRO ']	;GET MACRO.HLP
	PUSHJ	PP,.HELPR	;CALL HELPER
	POP	PP,.JBFF	;RESTORE JOBFF INCASE CCL MODE
	JRST	M		;RESTART
;[227] HERE FOR /nnL SWITCH TO SET LINES/PAGE

SEELPP:	ADDI	C,"A"-"0"	;TO NUMERIC RANGE
	CAIG	C,9		;IS IT
	JUMPGE	C,.+2
	JRST	ERRCM		;NO, BARF
	MOVE	RC,C		;MOVE VALUE

SEELP1:	PUSHJ	PP,TTYIN	;GET NEXT
	CAIG	C,"9"		;IS IT NUMERIC
	CAIGE	C,"0"		;...
	JRST	SEELP2		;NO, CHECK END
	IMULI	RC,^D10		;MAKE SPACE
	ADDI	RC,-"0"(C)	;AND PUT DIGIT
	JRST	SEELP1		;AND CONTINUE

SEELP2:	CAIE	C,"L"		;END PROPERLY?
	JRST	ERRCM		;NO, BARF
	SUBI	RC,4		;EASIER FOR SYMBOL OUTPUT ROUTINES
	MOVEM	RC,..LPP	;SAVE IN "READ-ONLY"
	POPJ	PP,		;ALL DONE
	DEFINE	SETSW	(LETTER,INSTRUCTION) <	INSTRUCTION
J=	<"LETTER"-"A">-7*<I=<"LETTER"-"A">/7>
	SETCOD	\I,J>

	DEFINE	SETCOD		(I,J)
	<BYTAB'I=BYTAB'I!<.-SWTAB>B<5*J+4>>

BYTAB0=	0			;INITIALIZE TABLE
BYTAB1=	0
BYTAB2=	0
BYTAB3= 0

SWTAB:
	SETSW	Z,<TLO	TIO,TIOCLD	>
	SETSW	C,<TLZ	FR,CREFSW	>
	SETSW	P,<SOS	PDP		>
SWTABT:				;THE ABOVE SW'S ARE LEGAL ON OUTPUT ONLY
	SETSW	A,<ADDI	CS,1		>
	SETSW	B,<SUBI	CS,1		>
	SETSW	E,<TLZ	IO,IOPALL!IOSALL	>
IFN FORMSW,<	SETSW	F,<SETZM	HWFMT>
		SETSW	G,<SETOM	HWFMT>>
	SETSW	H,<JRST	HELP>
	SETSW	L,<TLZ	IO,IOMSTR	>
	SETSW	M,<TLO	IO,IOPALL!IOSALL	>
	SETSW	N,<HLLOS   TYPERR	>
	SETSW	O,<XCT	OFFML		>
	SETSW	Q,<TLO	FR,ERRQSW	>
	SETSW	S,<TLO	IO,IOMSTR	>
	SETSW	T,<TLO	TIO,TIOLE	>
	SETSW	U,<SETOM UNVSKP		>
	SETSW	W,<TLO	TIO,TIORW	>
	SETSW	X,<TLOA	IO,IOPALL	>
IFG .-SWTAB-37,<PRINTX SWITCH TABLE TOO LONG, CHANGE BYTE SIZE>

BYTAB:				;BYTAB CONTAINS AN INDEX TO SWTAB
				;IT CONSIST OF 7 5BIT BYTES/WORD
				;OR ONE BYTE FOR EACH LETTER

	+BYTAB0			;A-G	BYTE = 1 THROUGH 17 = INDEX
	+BYTAB1			;H-N	BYTE = 0 = COMMAND ERROR
	+BYTAB2			;O-U
	+BYTAB3			;V-Z

IF2,<PURGE I,J,BYTAB0,BYTAB1,BYTAB2,BYTAB3>
TTYIN:	SOSGE	CTIBUF+2	;ENUF CHAR.?
	JRST	TTYERR		;NO
	ILDB	C,CTIBUF+1	;GET CHARACTER
	CAIE	C," "		;SKIP BLANKS
	CAIN	C,HT		;AND TABS
	JRST	TTYIN
	CAIN	C,15		;CR?
	SETZM	CTIBUF+2	;YES,IGNORE REST OF LINE
	CAIG	C,"Z"+40	;CHECK FOR LOWER CASE
	CAIGE	C,"A"+40
	POPJ	PP,		;NO,EXIT
	SUBI	C,40
	POPJ	PP,		;YES, EXIT

COMERR:	HRROI	RC,[SIXBIT /CTL COMMAND LINE TOO LONG@/]
	JRST	ERRFIN

TTYERR:	SKIPN	INDEV		;INPUT DEVICE SEEN?
	JRST	ERRCM		;NO, SO MISSING "_"
	HRROI	C,EOL		;SIGNAL ERROR
	POPJ	PP,		;AND RETURN

ERRNE:	HRROI	RC,[SIXBIT /NES NO END STATEMENT ENCOUNTERED ON INPUT FILE@/]
ERRNE0:	PUSHJ	PP,EFATAL	;OUTPUT CR-LF ?MCR
	PUSHJ	PP,TYPMSG	;OUTPUT IT
	SKIPE	LITLVL		;SEE IF IN LITERAL
	SKIPN	LITPG		;PAGE 0 MEANS NOT IN A LITERAL REALLY
	JRST	ERRNE1		;NO, TRY OTHERS
	MOVE	V,[XWD [SIXBIT /IN LITERAL@/],LITPG]
	PUSHJ	PP,PRNUM	;GO PRINT INFORMATION
ERRNE1:	MOVEI	V,0		;CHECK FOR OTHER PLACES
	SKIPE	INDEF
	MOVE	V,[XWD [SIXBIT /IN DEFINE@/],DEFPG]
	SKIPE	INTXT
	MOVE	V,[XWD [SIXBIT /IN TEXT@/],TXTPG]
	SKIPE	INREP
	MOVE	V,[XWD [SIXBIT /IN CONDITIONAL OR REPEAT@/],REPPG]
	SKIPE	INCND
	MOVE	V,[XWD [SIXBIT /IN CONDITIONAL@/],CNDPG]
	SKIPGE	MACENL
ERRNE2:	MOVE	V,[XWD [SIXBIT /IN MACRO CALL@/],CALPG]
	JUMPN	V,ERRNE3
	MOVE	V,[XWD [SIXBIT /@/],PAGENO]	;BETTER THAN NOTHING
	SKIPE	LITLVL		;HAD ONE PAGE NUMBER ALREADY
	POPJ	PP,
ERRNE3:	PUSHJ	PP,PRNUM
	TLNE	FR,LOADSW	;SEEN END OF FILE YET?
	POPJ	PP,		;YES
	MOVE	PP,SAVEPP	;NO RESET STACK
	MOVE	MP,SAVERP
	MOVEM	MP,RP
	MOVE	MP,SAVEMP
	SETZ	MRP,
	JRST	ASSEM2		;AND CONTINUE

ERRMS1:	SIXBIT / ERRORS DETECTED@/
ERRMS2:	SIXBIT /1 ERROR DETECTED@/
ERRMS3:	SIXBIT /NO ERRORS DETECTED@/
ERRMQ1:	SIXBIT	/1 WARNING GIVEN@/
ERRMQ2:	SIXBIT	/ WARNINGS GIVEN@/
EINIT:	PUSHJ	PP,EFATAL	;[352] ?MCR
	MOVSI	CS,'DNA'	;[352]
	PUSHJ	PP,TYPSYM	;[352] DNA
	MOVEI	C," "		;[352]
	PUSHJ	PP,TYO		;[352] SPACE
	MOVE	RC,[XWD ACDEV,[SIXBIT /NOT AVAILABLE@/]]	;[352]
	JRST	ERRFN1		;[352] REST OF MESSAGE
ERRCL:	HRRZ	RC,LSTDIR+1	;GET LST DEV ERROR CODE
	JRST	.+2		;GET ERROR MESSAGE
ERRCB:	HRRZ	RC,BINDIR+1	;GET BIN DEV ERROR CODE
	JUMPN	RC,ERRTYP
	SOJA	RC,ERRTYP	;SPECIAL CASE IF ERROR CODE 0

ERRCF:	HRRZ	RC,INDIR+1	;GET INPUT DEV ERROR CODE
	HLLZ	ACEXT,INDIR+1	;SET UP EXT

ERRTYP:	CAIL	RC,TABLND-TABLE	;IS ERROR CODE LEGAL?
	SKIPA	RC,TABLND	;NO, GIVE CATCH ALL MESSAGE
	MOVE	RC,TABLE(RC)	;YES, PICK UP MESSAGE
	PUSHJ	PP,EFATAL	;PUT OUT CR-LF ?MCR
	MOVSI	CS,'LRE'	;LOOKUP-RENAME-ENTER TYPE
	PUSHJ	PP,TYPSYM
	CAIA			;SKIP CALL TO EFATAL NOW

ERRFIN:	PUSHJ	PP,EFATAL
ERRFN1:	PUSHJ	PP,TYPMSG	;[352]
	CLOSE	LST,		;GIVE USER A PARTIAL LISTING
	CLOSE	BIN,40		;BUT NEVER A BUM REL FILE
	JRST	M

EFATAL:	PUSHJ	PP,OCRLF
	MOVEI	C,"?"
	PUSHJ	PP,TYO
	MOVSI	CS,'MCR'	;IDENTIFY CUSP
IFN CCLSW,<AOS	.JBERR		;RECORD ERROR SO EXECUTION DELETED>
	PJRST	TYPSYM		;AND RETURN

EWARN:	PUSHJ	PP,OCRLF
	MOVEI	C,"%"
	PUSHJ	PP,TYO
	MOVSI	CS,'MCR'	;IDENTIFY CUSP
	PJRST	TYPSYM		;AND RETURN

EINFO:	PUSHJ	PP,OCRLF
	MOVEI	C,"["
	PUSHJ	PP,TYO
	MOVSI	CS,'MCR'	;IDENTIFY CUSP
	PJRST	TYPSYM		;AND RETURN

OCRLF:	SKPINC	C		;SEE IN WE CAN INPUT A CHAR.
	  JFCL			;BUT ONLY TO DEFEAT ^O
	PJRST	CRLF
	[SIXBIT /(0) ILLEGAL FILE NAME@/],,ACFILE
TABLE:	[SIXBIT /(0) FILE WAS NOT FOUND@/],,ACFILE
	[SIXBIT /(1) NO DIRECTORY FOR PROJECT-PROGRAMMER NUMBER@/],,ACFILE
	[SIXBIT /(2) PROTECTION FAILURE@/],,ACFILE
	[SIXBIT /(3) FILE WAS BEING MODIFIED@/],,ACFILE
	[SIXBIT /(4) RENAME FILE NAME ALREADY EXISTS@/],,ACFILE
	[SIXBIT /(5) ILLEGAL SEQUENCE OF UUOS@/],,ACFILE
	[SIXBIT /(6) BAD UFD OR BAD RIB@/],,ACFILE
	[SIXBIT /(7) NOT A SAV FILE@/],,ACFILE
	[SIXBIT /(10) NOT ENOUGH CORE@/],,ACFILE
	[SIXBIT /(11) DEVICE NOT AVAILABLE@/],,ACFILE
	[SIXBIT /(12) NO SUCH DEVICE@/],,ACFILE
	[SIXBIT /(13) NOT TWO RELOC REG. CAPABILITY@/],,ACFILE
	[SIXBIT /(14) NO ROOM OR QUOTA EXCEEDED@/],,ACFILE
	[SIXBIT /(15) WRITE LOCK ERROR@/],,ACFILE
	[SIXBIT /(16) NOT ENOUGH MONITOR TABLE SPACE@/],,ACFILE
	[SIXBIT /(17) PARTIAL ALLOCATION ONLY@/],,ACFILE
	[SIXBIT /(20) BLOCK NOT FREE ON ALLOCATION@/],,ACFILE
	[SIXBIT /(21) CAN'T SUPERSEDE (ENTER) AN EXISTING DIRECTORY@/],,ACFILE
	[SIXBIT /(22) CAN'T DELETE (RENAME) A NON-EMPTY DIRECTORY@/],,ACFILE
	[SIXBIT /(23) SFD NOT FOUND@/],,ACFILE
	[SIXBIT /(24) SEARCH LIST EMPTY@/],,ACFILE
	[SIXBIT /(25) SFD NESTED TOO DEEPLY@/],,ACFILE
	[SIXBIT /(26) NO-CREATE ON FOR SPECIFIED PATH@/],,ACFILE

TABLND:	[SIXBIT /(?) LOOKUP, ENTER, OR RENAME ERROR@/],,ACFILE
TYPMSG:	HLRZ	CS,RC		;GET FIRST MESSAGE
	CAIE	CS,-1		;SKIP IF MINUS ONE
	PUSHJ	PP,TYPM2	;TYPE MESSAGE
	HRRZ	CS,RC		;GET SECOND HALF
	PUSHJ	PP,TYPM2

CRLF:	MOVEI	C,CR		;OUTPUT CARRIAGE RETURN
	PUSHJ	PP,TYO
	MOVEI	C,LF		;AND LINE FEED

TYO:	SOSG	CTOBUF+2	;BUFFER FULL?
	OUTPUT	CTL,0		;YES, DUMP IT
	IDPB	C,CTOBUF+1	;STORE BYTE
	CAIG	C,FF		;FORM FEED?
	CAIGE	C,LF		;V TAB OR LINE FEED?
	POPJ	PP,		;NO
	OUTPUT	CTL,0		;YES
	POPJ	PP,		;AND EXIT

TYPM2:	MOVSI	C,(1B0)		;ANTICIPATE REGISTER WORD
	CAIN	CS,ACFILE	;FILE NAME ?
	JRST	[JUMPE	ACEXT,.+1	;YES, TEST FOR EXT
		LSH	ACEXT,-6	;MAKE SPACE FOR "."
		IOR	ACEXT,[SIXBIT /.   @/]
		JRST	TYPM2A]
	CAIG	CS,17		;IS IT?
	MOVEM	C,1(CS)
TYPM2A:	HRLI	CS,(POINT 6,,)	;FORM BYTE POINTER

TYPM3:	ILDB	C,CS		;GET A SIXBIT BYTE
	CAIN	C,40		;"@"?
	JRST	TYO		;YES, TYPE SPACE AND EXIT
	ADDI	C,40		;NO, FORM 7-BIT ASCII
	PUSHJ	PP,TYO		;OUTPUT CHARACTER
	JRST	TYPM3

TYPSYM:	MOVEI	C,0		;CLEAR C
	LSHC	C,6		;MOVE NEXT SIXBIT CHARACTER IN
	JUMPE	C,CPOPJ		;TEST FOR END
	ADDI	C,40		;CONVERT TO ASCII
	PUSHJ	PP,TYO		;OUTPUT
	JRST	TYPSYM		;LOOP
XCEEDS:	ADDI	SX,2000		;ADJUST SYMBOL POINTER
XCEED:	PUSHJ	PP,SAVEXS	;SAVE THE REGISTERS
	HRRZ	1,.JBREL	;GET CURRENT TOP
	MOVEI	0,2000(1)
	CORE	0,		;REQUEST MORE CORE
	  JRST	XCEED2		;ERROR, BOMB OUT
	HRRZ	2,.JBREL	;GET NEW TOP

XCEED1:	MOVE	0,0(1)		;GET ORIGIONAL
	MOVEM	0,0(2)		;STORE IN NEW LOCATION
	SUBI	2,1		;DECREMENT UPPER
	CAMLE	1,SYMBOL	;HAVE WE ARRIVED?
	SOJA	1,XCEED1	;NO, GET ANOTHER
	MOVEI	1,2000
	ADDM	1,SYMBOL
	ADDM	1,SYMTOP
	PUSHJ	PP,SRCHI	;RE-INITIALIZE SYMBOL TABLE
	JRST	RSTRXS		;RESTORE REGISTERS AND EXIT

XCEED2:	HRROI	RC,[SIXBIT /NEC INSUFFICIENT CORE@/]
XCEED3:	TLO	FR,LOADSW	;[326] MAKE SURE IT COMES BACK
	PUSHJ	PP,ERRNE0	;[326] GO PRINT WHERE
	CLOSE	LST,		;[400] GIVE USER A PARTIAL LISTING
	CLOSE	BIN,40		;[400] BUT NEVER A BUM REL FILE
	JRST	M		;[326] START ANOTHER ASSEMBLY

PDPERR:	HRROI	RC,[SIXBIT .PDL PDP OVERFLOW, TRY /P@.]
	MOVE	PP,[IOWD $USRLN,$USSTK] ; RESET BOTH TYPES OF STACKS
	MOVEM	PP,$USRPD	; INCLUDING USER TYPE
	MOVE	PP,SAVEPP	;GET A VALID STACK POINTER
	JRST	XCEED3		;[326] DON'T CONTINUE ASSEMBLY

PRNUM:	HLRZ	CS,V		;GET MESSAGE
	PUSHJ	PP,TYPM2
	MOVEI	CS,[SIXBIT /ON PAGE@/]
	PUSHJ	PP,TYPM2
	MOVE	AC0,(V)		;GET PAGE
	PUSHJ	PP,DP1		;PRINT NUMBER
	MOVEI	C,40
	PUSHJ	PP,TYO
	SKIPN	AC1,1(V)	;GET SEQ NUM IF THERE
	JRST	PRNUM1		;NO, TRY FOR TAG
	MOVEM	AC1,OUTSQ
	MOVEI	CS,[SIXBIT /LINE@/]
	PUSHJ	PP,TYPM2
	OUTPUT	CTL,0		;TO MAKE THINGS PRINT IN RIGHT ORDER
	OUTSTR	OUTSQ		;PRINT SEQUENCE NUMBER
	MOVEI	C," "		;ADD SPACE
	PUSHJ	PP,TYO

PRNUM1:	MOVEI	CS,[SIXBIT /AT@/]
	PUSHJ	PP,TYPM2
	MOVE	CS,2(V)
	PUSHJ	PP,TYPSYM	;PRINT TAG
	MOVEI	CS,[SIXBIT / +@/]
	PUSHJ	PP,TYPM2
	HRRZ	AC0,3(V)
	PUSHJ	PP,DP1		;PRINT DECIMAL INCREMENT
	PJRST	CRLF		;END LINE

DP1:	IDIVI	AC0,^D10
	HRLM	AC1,(PP)
	JUMPE	AC0,.+2
	PUSHJ	PP,DP1
	HLRZ	C,(PP)
	ADDI	C,"0"
	JRST	TYO
RIM0:	TDO	FR,AC0		;SET RIM/RIM10 FLAG
	TLNE	FR,PNCHSW	;FORGET IT IF PUNCH RESET
	SETSTS	BIN,IB		;SET TO IMAGE BINARY MODE
	POPJ	PP,

ROUT:	EXCH	CS,RIMLOC
	SUB	PP,[XWD 1,1]	;CLEAR OUT STACK WFW
	TLNE	FR,R1BSW
	JRST	ROUT6
	TLNN	FR,RIM1SW
	JRST	ROUT1
	JUMPE	CS,ROUT1	;RIM10 OUTPUT
	SUB	CS,RIMLOC
	JUMPE	CS,ROUT1
	JUMPG	CS,ERRAX
	MOVEI	C,0
	PUSHJ	PP,PTPBIN
	AOJL	CS,.-1
ROUT1:	MOVSI	C,(DATAI PTR,)	;RIM OUTPUT
	HRR	C,LOCO		;GET ADDRESS
	TLNE	FR,RIM1SW	;NO DATAI IF RIM10
	AOSA	RIMLOC
	PUSHJ	PP,PTPBIN	;OUTPUT
	MOVE	C,AC0		;CODE
	AOSA	LOCO		;INCREMENT CURRENT LOCATION

OUTBIN:	TLNN	FR,RIMSW!RIM1SW!R1BSW	;EXIT IF RIM MODE
PTPBIN:	TLNN	FR,PNCHSW	;EXIT IF PUNCH NOT REQUESTED
	POPJ	PP,
	SOSG	BINBUF+2	;TEST FOR BUFFER FULL
	PUSHJ	PP,DMPBIN	;YES, DUMP IT
	IDPB	C,BINBUF+1	;DEPOSIT BYTE
	POPJ	PP,		;EXIT
DMPBIN:	OUT	BIN,0		;DUMP THE BUFFER
	POPJ	PP,		;NO ERRORS
TSTBIN:	GETSTS	BIN,C		;GET STSTUS BITS
	TRNN	C,ERRBIT	;ERROR?
	POPJ	PP,		;NO, EXIT
	MOVE	AC0,BINDEV	;YES, GET TAG
	JRST	ERRLST		;TYPE MESSAGE AND ABORT

DMPLST:	OUT	LST,0		;OUTPUT BUFFER
	POPJ	PP,		;NO ERRORS
TSTLST:	GETSTS	LST,C		;ANY ERRORS?
	TRNN	C,ERRBIT
	POPJ	PP,		;NO, EXIT
	MOVE	AC0,LSTDEV
ERRLST:	MOVSI	RC,[SIXBIT /WLE OUTPUT WRITE-LOCK ERROR DEVICE@/]
	TRNE	C,IOIMPM	;IMPROPER MODE?
	JRST	ERRFIN		;YES
	MOVSI	RC,[SIXBIT /ODE OUTPUT DATA ERROR DEVICE@/]
	TRNE	C,IODERR	;DEVICE DATA ERROR?
	JRST	ERRFIN		;YES
	MOVSI	RC,[SIXBIT /OCP OUTPUT CHECKSUM OR PARITY ERROR DEVICE@/]
	TRNE	C,IODTER	;IS IT
	JRST	ERRFIN		;YES
	MOVE	CS,AC0		;GET DEVICE
	DEVCHR	CS,		;FIND OUT WHAT IT IS
	MOVSI	RC,[SIXBIT /OQE OUTPUT QUOTA EXCEEDED ON DEVICE@/]
	TLNN	CS,DSKBIT	;SKIP IF DSK OUTPUT
	MOVSI	RC,[SIXBIT /OBL OUTPUT BLOCK TOO LARGE DEVICE@/]
	JRST	ERRFIN
R1BDMP:	SETCM	CS,R1BCNT
	JUMPE	CS,R1BI
	HRLZS	C,CS
	HRR	C,R1BLOC
	HRRI	C,-1(C)
	MOVEM	C,R1BCHK
	PUSHJ	PP,PTPBIN
	HRRI	CS,R1BBLK
R1BDM1:	MOVE	C,0(CS)
	ADDM	C,R1BCHK
	PUSHJ	PP,PTPBIN
	AOBJN	CS,R1BDM1
	MOVE	C,R1BCHK
	PUSHJ	PP,PTPBIN
R1BI:	SETOM	R1BCNT
	PUSH	PP,LOCO
	POP	PP,R1BLOC
	POPJ	PP,

ROUT6:	CAME	CS,RIMLOC
	PUSHJ	PP,R1BDMP
	AOS	C,R1BCNT
	MOVEM	AC0,R1BBLK(C)
	AOS	LOCO
	CAIN	C,.R1B-1
	PUSHJ	PP,R1BDMP
	AOS	RIMLOC
	POPJ	PP,
READ0:	PUSHJ	PP,EOT		;END OF TAPE

READ:	SOSGE	IBUF+2		;BUFFER EMPTY?
	JRST	READ3		;YES
READ1:	ILDB	C,IBUF+1	;PLACE CHARACTER IN C
	MOVE	CS,@IBUF+1	;CHECK FOR SEQUENCE NUMBER
	TRNN	CS,1
	JRST	READ1A
	CAMN	CS,[<ASCII /     />+1]	;[261] HOWEVER IF AN SOS PAGE MARK
	SETZ	CS,		;[261] CLEAR SEQ NO. SO LINE NOT COUNTED
	MOVEM	CS,SEQNO
	MOVEM	CS,SEQNO2
	MOVNI	CS,4
	ADDM	CS,IBUF+2	;ADJUST WORD COUNT
REPEAT 4,<	IBP	IBUF+1>	;SKIP SEQ NO
	PUSHJ	PP,READ		;AND THE TAB
	JRST	READ		;GET NEXT CHARACTER

READ1A:	JUMPE	C,READ		;IGNORE NULL
	CAIN	C,CZ		;IF IT'S A "^Z"
	MOVEI	C,LF		;TREAT IT AS A "LF"
	CAIE	C,CLA		;CONTROL _
	POPJ	PP,
	MOVEI	C,"^"		;MAKE CONTROL _ VISIBLE
	PUSHJ	PP,RSW2
	MOVEI	C,"_"
	PUSHJ	PP,RSW2
	PUSHJ	PP,PEEK		;[175] LOOK AT NEXT CHAR
	CAIG	C,CR		;[175] IF IT IS END OF LINE
	CAIGE	C,LF		;[175]
	JRST	[POP	PP,CS		;[175] GET RETURN ADDRESS
		PUSH	PP,LIMBO	;[175] SAVE NEXT CHAR,RSW1 DESTROYS IT
		MOVEI	C,CLA		;[175] RETORE ^_
		PUSHJ	PP,(CS)		;[175] RETURN TO LIST CHAR ETC
		POP	PP,LIMBO	;[175] SAFE TO STORE NOW
		POPJ	PP,]		;[175] RETURN TO PROGRAM
	TLZ	IO,IORPTC	;[264] USE THE CHAR IN C NOW
	JRST	READ2A		;[264] BUT DON'T LIST TWICE

READ2:	PUSHJ	PP,READ		;YES, TEST FOR LINE FEED
	PUSHJ	PP,RSW2		;LIST IN ANY EVENT
READ2A:	CAIG	C,FF		;[264] IS IT ONE OF
	CAIGE	C,LF		;LF, VT, OR FF?
	JRST	READ2		;NO
	PUSHJ	PP,OUTIM1	;YES, DUMP THE LINE
	JRST	READ		;RETURN NEXT CHARACTER

READ3:	IN	CHAR,0		;GET NEXT BUFFER
	  JRST	READ		;NO ERRORS
	GETSTS	CHAR,C
	TRNN	C,ERRBIT!2000	;ERRORS?
	JRST	READ0		;EOF
	MOVE	AC0,INDEV
READ4:	MOVSI	RC,[SIXBIT/PET INPUT PHYSICAL END OF TAPE DEVICE@/]	;[403]
	TRNE	C,2000
	JRST	ERRFIN		;E-O-T
	MOVSI	RC,[SIXBIT /MDE MONITOR DETECTED SOFTWARE INPUT ERROR DEVICE@/]
	TRNE	C,IOIMPM	;IMPROPER MODE?
	JRST	ERRFIN		;YES
	MOVSI	RC,[SIXBIT /IDE INPUT DATA ERROR DEVICE@/]
	TRNE	C,IODERR	;DEVICE DATA ERROR?
	JRST	ERRFIN		;YES
	MOVSI	RC,[SIXBIT /ICP INPUT CHECKSUM OR PARITY ERROR DEVICE@/]
	TRNN	C,IODTER
	MOVSI	RC,[SIXBIT /IBL INPUT BLOCK TOO LARGE DEVICE@/]
	JRST	ERRFIN
OUTAB2:	PUSHJ	PP,OUTTAB	;PRINT TWO TABS
OUTTAB:	MOVEI	C,HT
PRINT:	CAIE	C,CR		;IS THIS A CR?
	CAIN	C,LF		;OR LF?
	JRST	OUTCR		;YES, GO PROCESS
	CAIN	C,VT		;[257] VERT TAB?
	JRST	OUTVT		;[257] YES
	CAIN	C,FF		;FORM FEED?
	JRST	OUTFF		;YES, FORCE NEW PAGE
	JRST	OUTL

OUTVT:	PUSH	PP,C+1		;[257] NEED ADJACENT ACC
	MOVEI	C,.LPP		;[257] NO. OF LINES WE STARTED WITH
	SUB	C,LPP		;[257] MINUS NO. OF LINES LEFT
	IDIVI	C,^D20		;[257] HOW MANY WILL VT TAKE
	SUBI	C+1,^D20	;[257] TO GET TO NEXT TAB STOP
	ADDM	C+1,LPP		;[257] ACCOUNT FOR THEM
	POP	PP,C+1		;[257]
	MOVEI	C,VT		;[257] PUT CHAR BACK
	SKIPLE	LPP		;[257] DID WE END PAGE?
	JRST	OUTL		;[257] NO, OUTPUT IT
	TLO	IO,IOPAGE	;[257] YES, NEXT TIME
	JRST	OUTC		;[257] OUTPUT IT

OUTCR:	TRNN	ER,ERRORS!LPTSW!TTYSW
	POPJ	PP,
	MOVEI	C,CR		;CARRIAGE RETURN, LINE FEED
	PUSHJ	PP,OUTL
	SOSGE	LPP		;END OF PAGE?
	TLO	IO,IOPAGE	;YES, SET FLAG
	TRCA	C,7		;FORM LINE FEED AND SKIP

OUTL:	TLZN	IO,IOPAGE	;NEW PAGE REQUESTED?
	JRST	OUTC		;NO
	JUMP1	OUTC		;YES, BYPASS IF PASS ONE
	PUSH	PP,C		;SAVE C AND CS
	PUSH	PP,CS
	PUSH	PP,ER
	TLNN	IO,IOMSTR!IOPROG
	HRR	ER,OUTSW
	TLNE	IO,IOCREF	;IF DOING CREF OUTPUT NOW
	TLNE	FR,CREFSW	;AND CREFFING (JUST IN CASE)
	JRST	.+2
	PUSHJ	PP,CLSC3	;CLOSE IT OUT
	HLLM	IO,(PP)		;SAVE THIS NEW STATE OF IO
	MOVE	C,..LPP		;[227]
	ADDI	C,2		;[227] PUT BACK THE 2 LINES
	MOVEM	C,LPP		;SET NEW COUNTER
	MOVEI	C,CR
	PUSHJ	PP,OUTC
	MOVEI	C,FF
	PUSHJ	PP,OUTC		;OUTPUT FORM FEED
	MOVEI	CS,TBUF
	PUSHJ	PP,OUTAS0	;OUTPUT TITLE
	MOVEI	CS,VBUF
	PUSHJ	PP,OUTAS0	;OUTPUT VERSION
	MOVEI	CS,DBUF
	PUSHJ	PP,OUTAS0	; AND DATE
	MOVE	C,PAGENO
	PUSHJ	PP,DNC		;OUTPUT PAGE NUMBER
	AOSG	PAGEN.		;FIRST PAGE OF THIS NUMBER?
	JRST	OUTL1		;YES
	MOVEI	C,"-"		;NO, PUT OUT MODIFIER
	PUSHJ	PP,OUTC
	MOVE	C,PAGEN.
	PUSHJ	PP,DNC
OUTL1:	PUSHJ	PP,OUTCR
	MOVEI	CS,DEVBUF
	PUSHJ	PP,OUTAS0
	HRRZ	CS,SUBTTX	;SWITCH FOR SUB-TITLE
	SKIPE	0(CS)		;IS THERE A SUB-TITLE?
	PUSHJ	PP,OUTTAB	;YES, OUTPUT A TAB
	PUSHJ	PP,SOUT20	;OUTPUT ASCII WITH CARRIAGE RETURN
	PUSHJ	PP,OUTCR
	POP	PP,ER
	POP	PP,CS		;RESTORE REGISTERS
	POP	PP,C

OUTC:	TRNE	ER,ERRORS!TTYSW
	PUSHJ	PP,TYO
	TRNN	ER,LPTSW
	POPJ	PP,
OUTLST:	SOSG	LSTBUF+2	;BUFFER FULL?
	PUSHJ	PP,DMPLST	;YES, DUMP IT
IFN STANSW,< CAIN C,"@"
	MOVEI C,140
	CAIN C,"_"
	MOVEI C,30
	CAIN C,"^"
	MOVEI C,32
	CAIE C,"\"
	JRST OUTLSS
	MOVEI C,177
	IDPB C,LSTBUF+1
	JRST OUTLST
OUTLSS:	>
	IDPB	C,LSTBUF+1	;STORE BYTE
	POPJ	PP,		;EXIT
OUTFF:	TLOA	IO,IOPAGE	;[161]
OUTFF1:	PUSHJ	PP,PAGE1	;[161] CLOSE CREF
OUTFF2:	SETOM	PAGEN.		;[161]
	AOS	PAGENO		;[161]
	POPJ	PP,		;[161]

TIMOUT:	IDIVI	2,^D60*^D1000
TIMOU1:	IDIVI	2,^D60
	PUSH	PP,3		;SAVE MINUTES
	PUSHJ	PP,OTOD		;STORE HOURS
	MOVEI	3,":"		;SEPARATE BY COLON
	IDPB	3,CS
	POP	PP,2		;STORE MINUTES
OTOD:	IDIVI	2,^D10
	ADDI	2,60		;FORM ASCII
	IDPB	2,CS
	ADDI	3,60
	IDPB	3,CS
	POPJ	PP,

DATOUT:	IDIVI	1,^D31		;GET DAY
	ADDI	2,1
	CAIG	2,^D9		;TWO DIGITS?
	ADDI	2,7760*^D10	;NO, PUT IN SPACE
	PUSHJ	PP,OTOD		;STORE DAY
	IDIVI	1,^D12		;GET MONTH
	MOVE	2,DTAB(2)	;GET MNEMONIC
	IDPB	2,CS		;DEPOSIT RIGHT MOST 7 BITS
	LSH	2,-7		;SHIFT NEXT IN
	JUMPN	2,.-2		;DEPOSIT IFIT EXISTS
	MOVEI	2,^D64(1)	;GET YEAR
	JRST	OTOD		;STORE IT

DTAB:	"-NAJ-"
	"-BEF-"
	"-RAM-"
	"-RPA-"
	"-YAM-"
	"-NUJ-"
	"-LUJ-"
	"-GUA-"
	"-PES-"
	"-TCO-"
	"-VON-"
	"-CED-"
;[115] BINARY UNIVERSALS
;HERE TO WRITE OUT UNIVERSAL SYMBOL FILE
;SYMBOL TABLE PLUS MACROS

UNVOUT:	HRRZ	AC0,FREE	;GET HIGHEST FREE LOCATION
	MOVEM	AC0,.JBFF	;INTO JOBFF
	INIT	UNV,B		;INIT DSK FOR OUTPUT
	SIXBIT	/DSK/
	XWD	UNVBUF,0	;OUTPUT ONLY
	JRST	UNVINT		;[431] ERROR
	MOVSI	AC0,'UNV'	;STANDARD EXT
	MOVEM	AC0,UNVDIR+1
	SETZM	UNVDIR+2
	SETZM	UNVDIR+3	;CLEAR PPN
	ENTER	UNV,UNVDIR	;ENTER FILE
	JRST	UNVENT		;[431] ERROR
	MOVEI	SDEL,2*203	;STANDARD DOUBLE BUFFERING
	ADD	SDEL,FREE	;FROM FREE CORE
	CAML	SDEL,SYMBOL	;MORE CORE NEEDED?
	PUSHJ	PP,XCEED	;YES
	SUBI	SDEL,2*203	;BACK TO START OF BUFFER
	MOVEM	SDEL,.JBFF	;SETUP FOR BUFFERS
	OUTBUF	UNV,2		;SET THEM UP
	MOVSI	AC1,777		;SPECIAL MARKER FIRST WORD
	HRRI	AC1,.UVER	;STORE VERSION NUMBER
	PUSHJ	PP,UNVBIN	;LOADER BLOCK 777?
	MOVE	AC1,@SYMBOL	;GET NUMBER OF SYMBOLS
	MOVN	SDEL,AC1
	HRLZS	SDEL
	HRR	SDEL,SYMBOL	;FORM AOBJN POINTER
	PUSHJ	PP,UNVBIN	;OUTPUT NUMBER OF SYMBOLS
	ADDI	SDEL,1		;BYPASS COUNT
UNVLUP:	MOVE	AC1,(SDEL)	;GET SYMBOL
	PUSHJ	PP,UNVBIN
	ADDI	SDEL,1
	MOVE	AC1,(SDEL)	;GET VALUE
	TLNE	AC1,SPTR	;SPECIAL EXTERNAL POINTER?
	JRST	UNVSPT		;YES
	TLNE	AC1,EXTF	;EXTERNAL (BUT NOT SPTR)?
	JRST	UNVEXT		;YES, OUTPUT 2 WORDS
	TLNE	AC1,MACF	;MACRO
	JRST	UNVMAC		;YES, SAVE MACRO TEXT ALSO
	TLNE	AC1,PNTF	;ONLY A POINTER TO VALUE?
	JRST	UNVPTF		;YES
	PUSHJ	PP,UNVBIN	;OUTPUT VALUE
UNVNXT:	AOBJN	SDEL,UNVLUP	;FOR ALL SYMBOLS
	RELEASE	UNV,
	POPJ	PP,

UNVINT:	PUSHJ	PP,EWARN	;[431] NOT FATAL
	AOS	QERRS		;[431] INCREMENT WARNING COUNT
	MOVE	AC0,UNVDIR	;[431] FILENAME IN AC0
	MOVSI	RC,[SIXBIT /UWU UNABLE TO WRITE UNIVERSAL FILE@/]	;[431]
	PJRST	TYPMSG		;[431] TYPE MESSAGE AND EXIT

UNVENT:	PUSHJ	PP,EWARN	;[431] NOT FATAL
	AOS	QERRS		;[431] INCREMENT WARNING COUNT
	MOVSI	CS,'EFU'	;[431] ENTER FAILED UNIVERSAL MNEMONIC
	PUSHJ	PP,TYPSYM	;[431]
	MOVEI	C," "		;[431] THROW IN A SPACE
	PUSHJ	PP,TYO		;[431]
	HRRZ	RC,UNVDIR+1	;[431] GET ERROR BITS
	SKIPN	RC		;[431]
	SOS	RC		;[431] =0 SPECIAL CASE
	CAIL	RC,TABLND-TABLE	;[431] WITHIN BOUNDS?
	JRST	[HLRZ	CS,TABLND	;[431] CATCH-ALL ERR MESS
		JRST	.+2]	;[431]
	HLRZ	CS,TABLE(RC)	;[431] REFERENCE TABLE
	PUSHJ	PP,TYPM2	;[431] GIVE APPROPRIATE MESSAGE
	MOVE	AC0,UNVDIR	;[431] FILE NAME
	MOVSI	RC,[SIXBIT /UNIVERSAL FILE@/]	;[431]
	PJRST	TYPMSG		;[431] FINISH OFF AND EXIT
;HERE FOR EXTERNAL (NOT SPTR)
UNVEXT:	MOVE	AC2,AC1		;GET POINTER
	HLLZ	AC1,AC1		;CLEAR POINTER
	PUSHJ	PP,UNVBIN	;OUTPUT FLAGS
	MOVE	AC1,0(AC2)	;GET FIRST WORD (VALUE)
	PUSHJ	PP,UNVBIN
	MOVE	AC1,1(AC2)	;GET SECOND WORD (SYMBOL)
	PUSHJ	PP,UNVBIN
	JRST	UNVNXT

;HERE FOR 36 BIT VALUE
UNVPTF:	MOVE	AC2,AC1		;GET COPY
	HLLZ	AC1,AC1		;CLEAR POINTER
	PUSHJ	PP,UNVBIN	;OUTPUT FLAGS
	MOVE	AC1,(AC2)	;GET VALUE
	PUSHJ	PP,UNVBIN	;OUTPUT IT
	JRST	UNVNXT

;HERE FOR SPECIAL EXTERNAL SYMBOL
UNVSPT:	MOVE	AC2,AC1		;COPY POINTER
	HLLZ	AC1,AC1		;CLEAR POINTER
	PUSHJ	PP,UNVBIN	;OUTPUT FLAGS
	MOVE	AC1,(AC2)	;GET FIRST WORD
	PUSHJ	PP,UNVBIN	;STORE VALUE
	MOVE	AC1,1(AC2)	;GET RELOCATION WORD
	MOVE	AC2,AC1		;COPY IT
	PUSHJ	PP,UNVBIN
	TRNN	AC2,-1		;RIGHT HALF RELOCATION?
	JRST	.+5		;NO
	MOVE	AC1,(AC2)	;GET VALUE
	PUSHJ	PP,UNVBIN
	MOVE	AC1,1(AC2)	;EXTERNAL SYMBOL
	PUSHJ	PP,UNVBIN
	TLNN	AC2,-1		;LEFT HALF RELOCATION?
	JRST	UNVNXT		;NO
	HLRZS	AC2		;YES, SWAP
	JRST	.-7		;AND OUTPUT
;HERE FOR MACRO
UNVMAC:	MOVE	AC2,AC1		;GET POINTER TO TEXT
	HLLZ	AC1,AC1		;CLEAR POINTER
	PUSHJ	PP,UNVBIN	;OUTPUT FLAGS
	HLRZ	AC1,1(AC2)	;[334] GET DEFAULT VALUES, IF ANY
	MOVEM	AC1,UNVDFA	;[334] SAVE STARTING ADDRESS
	PUSHJ	PP,UNVMCP	;[334] GO DUMP MACRO ITSELF
	SKIPN	AC2,UNVDFA	;[334] SEE IF ANY DEFAULT VALUES (LEFT)
	JRST	UNVNXT		;[334] NO, CONTINUE WITH NEXT SYMBOL
	HRROI	AC1,(AC2)	;[334] SET UP AOBJP POINTER FOR # OF DEFAULTS
	SKIPE	(AC1)		;[334] ARE THERE ANY MORE?
	AOBJP	AC1,.-1		;[334] YES, COUNT AND TRY NEXT
	PUSHJ	PP,UNVBIN	;[334] OUTPUT COUNT WORD
UNVMC1:	HLRZ	AC1,(AC2)	;[334] GET THE AGUMENT # OF THIS DEFAULT
	PUSHJ	PP,UNVBIN	;[334] OUTPUT THE ARGUMENT NUMBER
	MOVE	AC2,(AC2)	;[334] GET ADDRESS OF DEFAULT
	PUSHJ	PP,UNVMCP	;[334] GO OUTPUT, IT LOOKS LIKE MACRO
	AOS	AC2,UNVDFA	;[334] UP POINTER TO DEFAULT BLOCK
	SKIPE	(AC2)		;[334] SEE IF ANY MORE
	JRST	UNVMC1		;[334] YES, GO WRITE THEM OUT
	JRST	UNVNXT		;[334] NO, GO DO NEXT SYMBOL

UNVMCP:	HLL	AC2,(AC2)	;[334] PUT ADDRESS OF NEXT BLOCK IN LEFT
	QQ==0
REPEAT .LEAF,<
	MOVE	AC1,QQ(AC2)
	PUSHJ	PP,UNVBIN
	QQ==QQ+1>
	HLRZS	AC2
	JUMPN	AC2,UNVMCP	;[334] MORE LEAFS TO PROCESS
	POPJ	PP,		;[334] RETURN

UNVBIN:	SOSG	UNVBUF+2
	PUSHJ	PP,DMPUNV
	IDPB	AC1,UNVBUF+1
	POPJ	PP,

DMPUNV:	OUT	UNV,0
	  POPJ	PP,
	GETSTS	UNV,C		;[403] GET STATUS BITS
	TRNN	C,ERRBIT	;[403] ERRORS?
	POPJ	PP,		;[403] NO, EXIT
	MOVSI	AC0,'DSK'	;[431] DEVICE ALWAYS DSK
	JRST	ERRLST		;[403] GIVE ERROR MESSAGE
;HERE TO READ IN UNIVERSAL SYMBOL TABLE

UNVINP:	MOVEM	AC0,UNVDIR	;FILE WE NEED
	PUSH	PP,AC0		;[240] SAVE REAL NAME OF UNV
	MOVSI	AC1,'DSK'	;[240] DEFAULT DEVICE
	MOVEM	AC1,UNVDEV	;[240]
	MOVSI	AC1,'UNV'	;REQUIRED EXT
	MOVEM	AC1,UNVDIR+1
	SETZM	UNVDIR+2
	SETZM	UNVDIR+3
	CAIE	C,'('		;[240] SEE IF USER SUPPLIED FILE SPEC
	JRST	UNVOPN		;[240] NO, USE DEFAULT
	PUSHJ	PP,SCHGET	;[240] GET A NAME
	CAIE	C,':'		;[240] IS IT A DEVICE?
	JRST	UNVCKN		;[240] NO TRY NAME
	MOVEM	AC0,UNVDEV	;[240] YES, SAVE DEVICE
	PUSHJ	PP,SCHGET	;[240] TRY NEXT NAME
UNVCKN:	MOVEM	AC0,UNVDIR	;[240] SAVE NAME
	CAIE	C,'.'		;[240] DOES EXT FOLLOW?
	JRST	.+3		;[240] NO
	PUSHJ	PP,SCHGET	;[240] YES, GET IT
	MOVEM	AC0,UNVDIR+1	;[240] AND STORE IT
	CAIE	C,'['		;[240] A DIRECTORY SPECIFIED?
	JRST	SCHCLP		;[240] NO
	PUSHJ	PP,SCHOCT	;[240] GET PPN
	HRLZM	AC0,UNVDIR+3	;[240] AND SAVE IT
	CAIE	C,','		;[240] CHECK PROG NO.
	TROA	ER,ERRQ		;[240] WARN USER
	PUSHJ	PP,SCHOCT	;[240] GRT IT
	HRRM	AC0,UNVDIR+3	;[240]
	CAIE	C,','		;[240] AN SFD GIVEN?
	JRST	SCHCLB		;[240] NO
	MOVEI	AC0,UNVPTH	;GET PATH PTR
	EXCH	AC0,UNVDIR+3	;[240] SWAP WITH PPN
	MOVEM	AC0,UNVPTH+2	;[240] AND PUT IN PATH
	MOVSI	RC,-.SFDLN	;[240] AOBJN PTR FOR SFDS
SCHSFD:	PUSHJ	PP,SCHGET	;[240] GET SFD NAME
	AOBJP	RC,SCHCLB+1	;[240] SEE IF ENOUGH ROOM
	MOVEM	AC0,UNVPTH+2(RC)	;[240] YES, STORE
	CAIN	C,','		;[240] DOES PATH CONTINUE ON?
	JRST	SCHSFD		;[240] YES
SCHCLB:	CAIE	C,']'		;[240] DOES PATH FINISH PROPERLY?
	TROA	ER,ERRQ		;[240] NO
	PUSHJ	PP,BYPAS1	;[240] EAT UP THE "]"
SCHCLP:	CAIE	C,')'		;[240] FILE SPEC END PROPERLY?
	TROA	ER,ERRQ		;[240] NO
	PUSHJ	PP,BYPAS1	;[240] EAT IT
UNVOPN:	POP	PP,AC0		;[240] UNV NAME BACK IN 0
	OPEN	UNV,UNVINI	;[240] TRY USER SPECIFICATION
	  JRST	UNVUNV		;FAILED
	LOOKUP	UNV,UNVDIR	;SEE IF THERE
	  JRST	UNVUNV		;TRY UNV:
	MOVEM	AC0,UNVDIR	;[240] RESTORE NAME OF UNV 
UNVFND:	AOS	RC,UNIVNO	;BUMP COUNT OF UNIVERSALS
	CAILE	RC,.UNIV	;SEE IF ROOM IN TABLES
	JRST	UNVERR		;NO, GIVE ERROR
	SKIPN	UNIVSN		;IS CURRENT PROG A UNIVERSAL
	JRST	UNVNOT		;NO
	CAIL	RC,.UNIV	;YES, ROOM FOR IT AS WELL?
	JRST	UNVERR		;NO
	MOVE	AC1,UNITBL(RC)	;GET CURRENT NAME
	MOVEM	AC1,UNITBL+1(RC)	;STORE IT IN NEXT SLOT
UNVNOT:	MOVEM	AC0,UNITBL(RC)	;STORE NAME
	HLRE	SDEL,UNVDIR+3	;GET SIZE OF FILE
	MOVMS	SDEL		;IN WORDS
	ADD	SDEL,FREE	;AT TOP OF FREE CORE
	HRRZM	SDEL,UNIPTR(RC)	;SAVE NEW SYMTOP (IN WRONG HALF)
	ADDI	SDEL,2*203	;PLUS  2 BUFFERS
	CAML	SDEL,SYMBOL	;WILL IT FIT?
	PUSHJ	PP,XCEED	;NO, TRY FOR MORE
	CAML	SDEL,SYMBOL	;DID WE GET ENOUGH?
	JRST	.-2		;NO TRY AGAIN
	SUBI	SDEL,2*203	;START OF BUFFERS
	MOVEM	SDEL,.JBFF
	INBUF	UNV,2		;STANDARD DOUBLE BUFFERING
	PUSHJ	PP,UNVREAD	;READ AND IGNORE FIRST WORD (777 MARKER)
	HRRZS	AC1		;GET UNV VERSION #
	SETOM	UNVER%		;[334] KLUDGE SWITCH TO ALLOW VERSION 4
	CAIE	AC1,4		;[334] SEE IF 4 (MIGHT BOMB DEFAULT ARGUMENTS)
	AOSA	UNVER%		;[334] NO, UNVER% IS 0 FOR GOOD FILES
	AOS	AC1		;[334] VERSION 4 NEEDS FUDGING
	CAIE	AC1,.UVER	;BETTER MATCH
	JRST	VERSKW		;[364] YOU LOSE
	PUSHJ	PP,UNVREAD	;READ SYMBOL COUNT (SECOND WORD)
	MOVE	SDEL,AC1	;GET COPY
	LSH	SDEL,1		;TWO WORDS PER SYMBOL
	ADDI	SDEL,1		;PLUS ONE FOR COUNT
	MOVNS	SDEL		;NEGATE
	MOVE	AC2,SDEL	;STORE IT
	ADD	AC2,UNIPTR(RC)	;ADD SYMTOP
	HRLM	AC2,UNIPTR(RC)	;TO FORM SYMBOL
	MOVSS	UNIPTR(RC)	;NOW PUT IN CORRECT HALVES
	MOVN	SDEL,AC1	;GET NO. OF SYMBOLS
	HRLZ	SDEL,SDEL	;TO FORM AOBJN POINTER
	HRR	SDEL,AC2	;POINT TO WHERE TO STORE THEM
	MOVEM	AC1,(SDEL)	;STORE COUNT
	ADDI	SDEL,1		;AND GET PAST IT
UNVRLO:	PUSHJ	PP,UNVREAD	;GET A SYMBOL
	MOVEM	AC1,(SDEL)	;STORE IT
	ADDI	SDEL,1		;INCREMENT PAST IT
	PUSHJ	PP,UNVREAD	;GET  VALUE
	MOVEM	AC1,(SDEL)	;STORE IT
	TLNE	AC1,SPTR	;SPECIAL EXTERNAL POINTER?
	JRST	UNVRSP		;YES
	TLNE	AC1,EXTF	;EXTERNAL (NOT SPTR)?
	JRST	UNVREX		;YES
	TLNE	AC1,MACF	;MACRO?
	JRST	UNVRMC		;YES
	TLNE	AC1,PNTF	;36 BIT VALUE
	JRST	UNVRPT		;YES
UNVRNX:	AOBJN	SDEL,UNVRLO	;GET NEXT
	RELEASE	UNV,
	MOVE	RC,UNIVNO	;POINT TO LAST ENTRY
	MOVE	AC1,UNITBL+1(RC)	;GET NAME INCASE IN UNIV NOW
	SKIPE	UNIVSN		;ARE WE?
	MOVEM	AC1,UNVDIR	;YES, RESET NAME OF OUTPUT FILE
IFN POLISH,<
	PUSH	PP,SGSBOT
	PUSH	PP,SGSTOP
	PUSH	PP,SGSCNT
	PUSH	PP,SGNCUR
>
	PUSH	PP,SYMBOL
	PUSH	PP,SYMTOP	;SAVE EXISTING VALUES
	PUSH	PP,SRCHX
	MOVE	AC1,UNIPTR(RC)	;GET SYMTOP,,SYMBOL
	HLRZM	AC1,SYMTOP
	HLRZM	AC1,FREE	;DON'T FORGET TO SET FREE BEYOND SYMTOP
	HRRZM	AC1,SYMBOL
	HLRZ	AC1,AC1		;TOP LOCATION
	MOVEM	AC1,UNITOP	;SAVE NEW TOP FOR UNIVERSALS
	CAMLE	AC1,MACSIZ	;HAVE WE INCREASED?
	MOVEM	AC1,MACSIZ	;YES, STOP ILL MEM REFS
IFN POLISH,<
	SETZM	SGNCUR
	MOVE	AC0,@SYMBOL
	MOVEM	AC0,SGSCNT
>
	PUSHJ	PP,SRCHI	;SETUP SEARCH POINTER
	MOVE	AC1,SRCHX	;LOAD IT
	MOVEM	AC1,UNISHX(RC)	;SAVE IT
	POP	PP,SRCHX	;RESTORE
	POP	PP,SYMTOP
	POP	PP,SYMBOL
IFN POLISH,<
	POP	PP,SGNCUR
	POP	PP,SGSCNT
	POP	PP,SGSTOP
	POP	PP,SGSBOT
>
	JRST	SERCH1		;AND RETURN

;HERE FOR 36 BIT VALUE
UNVRPT:	PUSHJ	PP,UNVREAD
	AOS	AC2,FREE	;GET A FREE LOC
	SUBI	AC2,1
	MOVEM	AC1,(AC2)	;STORE IT
	HRRM	AC2,(SDEL)	;FIXUP SYMBOL POINTER
	JRST	UNVRNX		;GET NEXT
;HERE FOR EXTERNAL (NOT SPTR)
UNVREX:	MOVEI	AC2,2		;NEED 2 LOCS
	ADDB	AC2,FREE
	SUBI	AC2,2		;POINT TO START OF 2 WORDS
	PUSHJ	PP,UNVREAD	;GET VALUE
	MOVEM	AC1,0(AC2)	;MOST LIKELY 0
	PUSHJ	PP,UNVREAD	;GET NAME
	MOVEM	AC1,1(AC2)
	HRRM	AC2,(SDEL)	;POINT TO VALUE
	JRST	UNVRNX		;GET NEXT

;HERE FOR SPECIAL EXTERNAL SYMBOL
UNVRSP:	MOVEI	AC2,2		;GET 2 LOCATIONS
	ADDB	AC2,FREE	;FROM FREE CORE
	SUBI	AC2,2		;POINT TO START OF 2 WORDS
	PUSHJ	PP,UNVREAD	;GET VALUE
	MOVEM	AC1,(AC2)
	PUSHJ	PP,UNVREAD	;GET RELOCATION
	HRRM	AC2,(SDEL)	;STORE POINTER
	MOVEI	RC,1(AC2)	;POINT TO RELOCATION WORD
	SETZM	(RC)		;CLEAR RELOCATION
	MOVE	AC2,AC1		;STORE PREVIOUS RELOCATION
	TRNN	AC2,-1		;RIGHT HALF RELOCATION?
	JRST	UNVRS2		;NO
	HRR	AC2,FREE	;POINT TO NEXT 2 WORD BLOCK
	HRRM	AC2,(RC)	;POINT TO BLOCK (RELOCATION)
UNVRS1:	PUSHJ	PP,UNVREAD	;GET VALUE
	MOVEM	AC1,(AC2)
	PUSHJ	PP,UNVREAD	;GET EXTERNAL SYMBOL
	MOVEM	AC1,1(AC2)
	HRRI	AC2,2(AC2)	;INCREMENT RIGHT HALF BY 2 WORDS USED
	HRRZM	AC2,FREE	;INCREMENT FREE
UNVRS2:	TLZN	AC2,-1		;LEFT HALF RELOCATION?
	JRST	UNVRNX		;NO, GET NEXT SYMBOL
	HRLM	AC2,(RC)	;FIX LEFT RELOCATION
	JRST	UNVRS1		;AND FILL IN VALUE
;HERE FOR MACRO
UNVRMC:	MOVE	AC2,FREE	;FREE LOC COUNTER
	HRRM	AC2,(SDEL)	;IS WHERE MACRO STARTS
	MOVEM	AC2,UNVDFA	;[334] SAVE STARTING ADDRESS OF MACRO
	PUSHJ	PP,UNVRML	;[334] GO READ IN MACRO DEFINITION
	MOVE	AC1,UNVDFA	;[334] GET STARTING ADDRESS BACK
	HLRZ	AC2,1(AC1)	;[334] GET POINTER FOR ANY DEFAULTS
	JUMPE	AC2,UNVRNX	;[334] NONE, GO DO NEXT SYMBOL
	SKIPE	UNVER%		;[334] MAKE SURE WE WROTE THEM ON DISK
	JRST	UNVRER		;[334] NO, TELL USER
	PUSH	PP,SDEL		;[334] SAVE AOBJN POINTER
	MOVE	AC2,FREE	;[334] GET NEXT FREE ADDRESS
	HRLM	AC2,1(AC1)	;[334] POINT TO IT IN MACRO BODY
	PUSHJ	PP,UNVREAD	;[334] GO READ COUNT OF DEFAULTS
	MOVN	SDEL,AC1	;[334] COPY COUNT TO AOBJN POINTER
	HRRI	SDEL,(AC2)	;[334] SET AOBJN ADDRESS INTO SDEL
	HLRZ	AC2,AC1		;[334] GET COUNT-1 OF DEFAULTS
	ADDI	AC2,2		;[334] CHANGE TO COUNT+1 (+0 WORD)
	ADDB	AC2,FREE	;[334] BUMP FREE BY DEFAULT POINTER BLOCK LENGTH
UNVRM1:	PUSHJ	PP,UNVREAD	;[334] GO READ ARGUMENT NUMBER
	HRLM	AC1,(SDEL)	;[334] SAVE IN POINTER BLOCK
	HRRM	AC2,(SDEL)	;[334] SAVE START OF VALUE (MAY BE SET UP BY UNVRML)
	PUSHJ	PP,UNVRML	;[334] GO COPY DEFAULT VALUE
	AOBJN	SDEL,UNVRM1	;[334] DO ALL DEFAULTS
	SETZM	(SDEL)		;[334] CLEAR END OF BLOCK WORD
	POP	PP,SDEL		;[334] RESTORE BIG AOBJN WORD
	JRST	UNVRNX		;[334] GO DO NEXT SYMBOL

UNVRML:	QQ==0
REPEAT .LEAF,<
	PUSHJ	PP,UNVREAD
	MOVEM	AC1,QQ(AC2)	;STORE
QQ==QQ+1>
	MOVE	AC1,(AC2)	;SEE WHAT FIRST WORD WAS
	TLNN	AC1,-1		;IF ZERO THEN FINISHED
	JRST	UNVRMF		;SET LAST BLOCK POINTER
	MOVEI	AC1,.LEAF(AC2)	;POINT TO NEXT BLOCK
	HRLM	AC1,(AC2)	;FILL IT IN
	ADDI	AC2,.LEAF	;POINT TO IT
	JRST	UNVRML		;AND LOOP

UNVRMF:	MOVE	AC1,(SDEL)	;GET FIRST BLOCK
	HRRM	AC2,(AC1)	;POINT TO LAST
	ADDI	AC2,.LEAF	;POINT TO NEXT FREE
	MOVEM	AC2,FREE
	POPJ	PP,		;[334] RETURN

UNVRER:	MOVSI	RC,[SIXBIT /OUF UNIVERSAL FILE DEFAULT ARGUMENTS LOST, REASSEMBLE@/];[334]
	JRST	ERRFIN		;[334] PRINT THAT HAD DEFAULTS WHICH WERE LOST
UNVREA:	SOSG	UNVBUF+2
	PUSHJ	PP,UNVRIN
	ILDB	AC1,UNVBUF+1
	POPJ	PP,

UNVRIN:	IN	UNV,
	  POPJ	PP,
	GETSTS	UNV,C		;[403] GET STATUS BITS
	TRNN	C,ERRBIT!2000	;[403] ERRORS?
	JRST	UNVRN1		;[431] E-O-F
	MOVE	AC0,UNVDEV	;[403] GET DEVICE
	JRST	READ4		;[403] GIVE I/O ERROR MESSAGE

UNVRN1:	MOVSI	RC,[SIXBIT /ERU UNEXPECTED END-OF-FILE READING UNIVERSAL FILE@/]	;[431] NAME IN AC0
	JRST	ERRFIN		;[431] GIVE ERROR MESSAGE

UNVUNV:	MOVEM	AC0,UNVDIR	;[240] RESTORE REAL NAME
	MOVSI	AC1,'UNV'	;[240] AND DEFAULT EXT
	MOVEM	AC1,UNVDIR+1	;[240]
	SETZM	UNVDIR+2	;[240]
	SETZM	UNVDIR+3	;[240] DEFAULT PATH
	INIT	UNV,B
	SIXBIT	/UNV/
		UNVBUF
	  JRST	UNVSYS
	LOOKUP	UNV,UNVDIR
	  JRST	UNVSYS
	JRST	UNVFND

UNVSYS:	INIT	UNV,B
	SIXBIT	/SYS/
		UNVBUF
	  JRST	SCHERR
	LOOKUP	UNV,UNVDIR	;SEE IF THERE
	  JRST	SCHERR		;NO
	JRST	UNVFND		;GOT IT
SUBTTL	MACHINE INSTRUCTION SEARCH ROUTINES
IFE OPHSH,<
OPTSCH:	MOVEI	RC,0
	MOVEI	ARG,1B^L<OP1END-OP1TOP>	;SET UP INDEX
	MOVEI	V,1B^L<OP1END-OP1TOP>/2	;SET UP INCREMENT

OPT1A:	CAMN	AC0,OP1TOP(ARG)	;ARE WE POINTING AT SYMBOL?
	JRST	OPT1D		;YES, GET THE CODE
	JUMPE	V,POPOUT	;TEST FOR END
	CAML	AC0,OP1TOP(ARG)	;NO, SHOULD WE MOVE DOWN?
	TDOA	ARG,V		;NO, INCREMENT
OPT1B:	SUB	ARG,V		;YES, DECREMENT
	ASH	V,-1		;HALVE INCREMENT
	CAIG	ARG,OP1END-OP1TOP	;ARE WE OUT OF BOUNDS?
	JRST	OPT1A		;NO, TRY AGAIN
	JRST	OPT1B		;YES, BRING IT DOWN A PEG
>

IFN OPHSH,<
OPTSCH:	MOVE	ARG,AC0		;GET SIXBIT NAME
	TLZ	ARG,400000	;CLEAR SIGN BIT
	IDIVI	ARG,PRIME	;REM. GOES IN V
	CAMN	AC0,OP1TOP(V)	;ARE WE POINTING AT SYMBOL?
	JRST	OPT1D		;YES
	SKIPN	OP1TOP(V)	;TEST FOR END
	JRST	OPT1B		;SYMBOL NOT FOUND
	HLRZ	RC,ARG		;SAVE LHS OF QUOTIENT
	SKIPA	ARG,RC		;GET IT BACK
OPT1A:	ADDI	ARG,(RC)	;INCREMENT ARG
	ADDI	V,(ARG)		;QUADRATIC INCREASE TO V
	CAIL	V,PRIME		;V IS MODULO PRIME
	JRST	[SUBI	V,PRIME
		JRST	.-1]
	CAMN	AC0,OP1TOP(V)	;IS THIS IT?
	JRST	OPT1D		;YES
	SKIPE	OP1TOP(V)	;END?
	JRST	OPT1A		;TRY AGAIN
OPT1B:	SETZ	RC,		;[134] CLEAR RELOCATION INCASE IMPLICIT OPDEF
	POPJ	PP,		;FAILED
>
OPT1D:
IFN OPHSH,<	SETZ	RC,	;CLEAR RELOCATION
	MOVE	ARG,V		;GET INDEX IN RIGHT ACC.>
	IDIVI	ARG,4		;ARG HAS INDEX USED IN OPTTAB
	LDB	V,OPTTAB(V)	;V HAS INDEX TO OPTTAB
	CAIL	V,700		;PSEUDO-OP OR IO INSTRUCTION?
	JRST	OPT1G		;YES
	ROT	V,-^D9		;LEFT JUSTIFY
	HRRI	V,OP		;POINT TO BASIC FORMAT
OPT1F:	AOS	0(PP)		;SET FOR SKIP EXIT
	MOVEI	SDEL,%OP	;SET OP-CODE CROSS-REF FLAG
	JRST	CREF		;TEST AND OUTPUT, AC0=SYMBOL, V=VALUE

OPT1G:	JUMPG	AC0,[CAME AC0,['.XCREF']	;[141] DON'T CREF .XCREF
		JRST	.+3		;IF ".","$",OR "%" USE TABLE 1
		MOVE	V,OP1TAB-700(V)	;[217] USE TABLE 1
		JRST	CPOPJ1]		;[217] AND BYPASS CREF
	TLNN	AC0,200000	;PSEUDO-OP OR IO INST., TEST FOR PROPER TABLE
	SKIPA	V,OP2TAB-700(V)	;2ND TABLE, FIRST LETTER IS "A" TO "O"
	MOVE	V,OP1TAB-700(V)	;1ST TABLE, ..."P" TO "Z"
	JRST	OPT1F		;EXIT

OPTTAB:
IFE OPHSH,<	POINT	9,OP1COD-1(ARG),35>
	POINT	9,OP1COD  (ARG), 8
	POINT	9,OP1COD  (ARG),17
	POINT	9,OP1COD  (ARG),26
IFN OPHSH,<	POINT	9,OP1COD  (ARG),35>
	.XCREF	;DON'T CREF THIS MESS
IFE OPHSH,<
	RELOC	.-1
OP1TOP:
	RELOC

	IF1, < N1=0
		LSYM== SIXBIT /ADD/
		DEFINE $FAIL(SYMBOL)< PRINTX ? SYMBOL -BAD OPCODE ORDER>
	DEFINE X (SYMBOL,CODE)<
		 IFL <SIXBIT /SYMBOL/-LSYM>,< $FAIL(SYMBOL)>
		 LSYM== <SIXBIT /SYMBOL/>
		 N1=N1+1>>

	IF2, <
	N2=^D36
	CC=0
	RELOC	OP1COD
	RELOC
DEFINE	X (SYMBOL,CODE) 
<SIXBIT /SYMBOL/
CC=CC+CODE_<N2=N2-9>
IFE N2, <OUTLIT>>

DEFINE	OUTLIT	<
	RELOC
	+CC
	RELOC
N2=^D36+<CC=0>>>
	SYN X,XX		;JUST THE SAME MACRO>
IFN OPHSH,<
DEFINE XX (SB,CD)<>		;A NUL MACRO
OP1TOP:	IF1,<	BLOCK PRIME>
IF1,<DEFINE X (SB,CD)<>>
IF2,<
DEFINE OPSTOR (RM)<.$'RM=.$'RM+<OPCODE_<9*<3-R&3>>>>

DEFINE X (SB,CD)<
SXB=<SIXBIT /SB/>
Q=SXB&-1_-1/PRIME
R=SXB&-1_-1-Q*PRIME
H=Q_-22&777
TRY=1
OPCODE=CD
ITEM Q,\R
IFL PRIME-TRY,<PRINTX HASH FAILURE>>

DEFINE ITEM (QT,RM)<
IFN .%'RM,<R=R+H
IFL PRIME-R,<R=R-R/PRIME*PRIME>
H=H+Q_-22&777
IFGE PRIME-<TRY=TRY+1>,<ITEM Q,\R>>
IFE .%'RM,<.%'RM=SXB
OPSTOR \<R/4>>>>
IF1,<
DEFINE GETSYM (N)<.%'N=0>

N=0
	XLIST
REPEAT PRIME,<GETSYM \N
N=N+1>
DEFINE GETSYM (N)<.$'N=0>
N=0
REPEAT <PRIME/4+1>,<GETSYM \N
N=N+1>
>
	LIST>

;MACRO TO HANDLE KI10 OP-CODES
IFE KI10,<
DEFINE XK (SB,CD) <>		;NUL MACRO>
IFN KI10,<SYN X,XK		;USUAL X MACRO>

; MACRO TO HANDLE KL10 OP-CODES
IFE KL10,<
	DEFINE XKK (SB,CD) <>  >
IFN KL10, <SYN X,XKK>
IFN OPHSH,<		;PUT THE MOST USED OP CODES FIRST
X	JRST  ,	254
X	PUSHJ , 260
X	POPJ  , 263
X	PUSH  , 261
X	POP   , 262
X	AOS   ,	350
X	ASCIZ ,	701
X	CALLI ,	047
X	EXTERN,	724
X	INTERN,	744
X	JFCL  ,	255
X	JSP   ,	265
X	MOVE  ,	200
X	MOVEI ,	201
X	MOVEM ,	202
X	SETZM ,	402
X	SIXBIT,	717
X	SOS   ,	370
X	TLNE  ,	603
X	TLNN  ,	607
X	TLO   ,	661
X	TLZ   ,	621
X	TLZA  ,	625
X	TLZE  ,	623
X	TLZN  ,	627
X	TRNE  ,	602
X	TRNN  ,	606
X	TRZ   ,	620
>
X	ADD   ,	270
X	ADDB  ,	273
X	ADDI  ,	271
X	ADDM  ,	272
XKK	ADJBP , 133
XKK	ADJSP , 105
X	AND   ,	404
X	ANDB  ,	407
X	ANDCA ,	410
X	ANDCAB,	413
X	ANDCAI,	411
X	ANDCAM,	412
X	ANDCB ,	440
X	ANDCBB,	443
X	ANDCBI,	441
X	ANDCBM,	442
X	ANDCM ,	420
X	ANDCMB,	423
X	ANDCMI,	421
X	ANDCMM,	422
X	ANDI  ,	405
X	ANDM  ,	406

X	AOBJN ,	253
X	AOBJP ,	252

X	AOJ   ,	340
X	AOJA  ,	344
X	AOJE  ,	342
X	AOJG  ,	347
X	AOJGE ,	345
X	AOJL  ,	341
X	AOJLE ,	343
X	AOJN  ,	346

XX	AOS   ,	350
X	AOSA  ,	354
X	AOSE  ,	352
X	AOSG  ,	357
X	AOSGE ,	355
X	AOSL  ,	351
X	AOSLE ,	353
X	AOSN  ,	356
X	ARG   , 320
X	ARRAY , 771
IFN IIISW,<X	ASCID , 773>
X	ASCII ,	700
XX	ASCIZ ,	701

X	ASH   ,	240
X	ASHC  ,	244

X	ASUPPR,	705
X	BLKI  ,	702
X	BLKO  ,	703
X	BLOCK ,	704

X	BLT   ,	251

X	BYTE  ,	707

XX	CAI   ,	300
X	CAIA  ,	304
X	CAIE  ,	302
X	CAIG  ,	307
X	CAIGE ,	305
X	CAIL  ,	301
X	CAILE ,	303
X	CAIN  ,	306

X	CALL  ,	040
XX	CALLI ,	047

XX	CAM   ,	310
X	CAMA  ,	314
X	CAME  ,	312
X	CAMG  ,	317
X	CAMGE ,	315
X	CAML  ,	311
X	CAMLE ,	313
X	CAMN  ,	316

XX	CLEAR ,	400
XX	CLEARB,	403
XX	CLEARI,	401
XX	CLEARM,	402

X	CLOSE ,	070
XKK	CMPSE , 002
XKK	CMPSG , 007
XKK	CMPSGE, 005
XKK	CMPSL , 001
XKK	CMPSLE, 003
XKK	CMPSN , 006
X	COMMEN, 770


X	CONI  ,	710
X	CONO  ,	711
IFN STANSW,<X	CONS,257>
X	CONSO ,	712
X	CONSZ ,	713
XKK	CVTBDO, 012
XKK	CVTBDT, 013
XKK	CVTDBO, 010

XKK	CVTDBT, 011
XKK	DADD  , 114
XX	DATA. ,	020

X	DATAI ,	714
X	DATAO ,	715
XKK	DDIV  , 117
X	DEC   ,	716
X	DEFINE,	717
X	DEPHAS,	720

XK	DFAD  , 110
XK	DFDV  , 113
XK	DFMP  , 112
X	DFN   ,	131
XK	DFSB  , 111

X	DIV   ,	234
X	DIVB  ,	237
X	DIVI  ,	235
X	DIVM  ,	236

XK	DMOVE , 120
XK	DMOVEM, 124
XK	DMOVN , 121
XK	DMOVNM, 125
XKK	DMUL  , 116

X	DPB   ,	137
XKK	DSUB  , 115

XKK	EBLT  , 020
XKK	EDIT  , 004
X	END   ,	721

X	ENTER ,	077

X	ENTRY ,	722

X	EQV   ,	444
X	EQVB  ,	447
X	EQVI  ,	445
X	EQVM  ,	446

X	EXCH  ,	250

X	EXP   ,	723

XKK	EXTEND, 123
XX	EXTERN,	724

X	FAD   ,	140
X	FADB  ,	143
X	FADL  ,	141
X	FADM  ,	142

X	FADR  ,	144
X	FADRB ,	147
X	FADRI ,	145
X	FADRM ,	146

X	FDV   ,	170
X	FDVB  ,	173
X	FDVL  ,	171
X	FDVM  ,	172

X	FDVR  ,	174
X	FDVRB ,	177
X	FDVRI ,	175
X	FDVRM ,	176

XX	FIN.  ,	021

IFN STANSW,<X	FIX   , 130>
IFE STANSW,<XK	FIX   , 122>
XK	FIXR  , 126
XK	FLTR  , 127

X	FMP   ,	160
X	FMPB  ,	163
X	FMPL  ,	161
X	FMPM  ,	162
X	FMPR  ,	164
X	FMPRB ,	167
X	FMPRI ,	165
X	FMPRM ,	166

X	FSB   ,	150
X	FSBB  ,	153
X	FSBL  ,	151
X	FSBM  ,	152

X	FSBR  ,	154
X	FSBRB ,	157
X	FSBRI ,	155
X	FSBRM ,	156

X	FSC   ,	132

X	GETSTS,	062
X	HALT  ,	725
X	HISEG ,	706

X	HLL   ,	500
X	HLLE  ,	530
X	HLLEI ,	531
X	HLLEM ,	532
X	HLLES ,	533
X	HLLI  ,	501
X	HLLM  ,	502
X	HLLO  ,	520
X	HLLOI ,	521
X	HLLOM ,	522
X	HLLOS ,	523
X	HLLS  ,	503
X	HLLZ  ,	510
X	HLLZI ,	511
X	HLLZM ,	512
X	HLLZS ,	513

X	HLR   ,	544
X	HLRE  ,	574
X	HLREI ,	575
X	HLREM ,	576
X	HLRES ,	577
X	HLRI  ,	545
X	HLRM  ,	546
X	HLRO  ,	564
X	HLROI ,	565
X	HLROM ,	566
X	HLROS ,	567
X	HLRS  ,	547
X	HLRZ  ,	554
X	HLRZI ,	555
X	HLRZM ,	556
X	HLRZS ,	557
X	HRL   ,	504
X	HRLE  ,	534
X	HRLEI ,	535
X	HRLEM ,	536
X	HRLES ,	537
X	HRLI  ,	505
X	HRLM  ,	506
X	HRLO  ,	524
X	HRLOI ,	525
X	HRLOM ,	526
X	HRLOS ,	527
X	HRLS  ,	507
X	HRLZ  ,	514
X	HRLZI ,	515
X	HRLZM ,	516
X	HRLZS ,	517

X	HRR   ,	540
X	HRRE  ,	570
X	HRREI ,	571
X	HRREM ,	572
X	HRRES ,	573
X	HRRI  ,	541
X	HRRM  ,	542
X	HRRO  ,	560
X	HRROI ,	561
X	HRROM ,	562
X	HRROS ,	563
X	HRRS  ,	543
X	HRRZ  ,	550
X	HRRZI ,	551
X	HRRZM ,	552
X	HRRZS ,	553

X	IBP   ,	133

X	IDIV  ,	230
X	IDIVB ,	233
X	IDIVI ,	231
X	IDIVM ,	232

X	IDPB  ,	136

X	IF1   ,	726
X	IF2   ,	727
X	IFB   ,	730
X	IFDEF ,	731
X	IFDIF ,	732
X	IFE   ,	733
X	IFG   ,	734
X	IFGE  ,	735
X	IFIDN ,	736
X	IFL   ,	737
X	IFLE  ,	740
X	IFN   ,	741
X	IFNB  ,	742
X	IFNDEF,	743

X	ILDB  ,	134

X	IMUL  ,	220
X	IMULB ,	223
X	IMULI ,	221
X	IMULM ,	222

X	IN    ,	056
XX	IN.   ,	016
X	INBUF ,	064
XX	INF.  ,	026
X	INIT  ,	041
X	INPUT ,	066
X	INTEGE,	772

XX	INTERN,	744

X	IOR   ,	434
X	IORB  ,	437
X	IORI  ,	435
X	IORM  ,	436


X	IOWD  ,	745
X	IRP   ,	746
X	IRPC  ,	747
X	JCRY  ,	750
X	JCRY0 ,	751
X	JCRY1 ,	752
X	JEN   ,	753

XX	JFCL  ,	255

X	JFFO  , 243
X	JFOV  ,	765
X	JOV   ,	754

X	JRA   ,	267
XX	JRST  ,	254

X	JRSTF ,	755

X	JSA   ,	266
XX	JSP   ,	265
X	JSR   ,	264
X	JSYS  , 104

XX	JUMP  ,	320
XX	JUMPA ,	324
X	JUMPE ,	322
X	JUMPG ,	327
X	JUMPGE,	325
X	JUMPL ,	321
X	JUMPLE,	323
X	JUMPN ,	326

X	LALL  ,	756

X	LDB   ,	135

X	LIST  ,	757
X	LIT   ,	760
X	LOC   ,	761

X	LOOKUP,	076

X	LSH   ,	242
X	LSHC  ,	246
XK	MAP   , 257
X	MLOFF , 767
X	MLON  , 766
XX	MOVE  ,	200
XX	MOVEI ,	201
XX	MOVEM ,	202
X	MOVES ,	203
X	MOVM  ,	214
X	MOVMI ,	215
X	MOVMM ,	216
X	MOVMS ,	217
X	MOVN  ,	210
X	MOVNI ,	211
X	MOVNM ,	212
X	MOVNS ,	213
X	MOVS  ,	204

X	MOVSI ,	205
XKK	MOVSLJ, 016
X	MOVSM ,	206
XKK	MOVSO , 014
XKK	MOVSRJ, 017
X	MOVSS ,	207
XKK	MOVST , 015


X	MTAPE ,	072
XX	MTOP. , 024

X	MUL   ,	224
X	MULB  ,	227
X	MULI  ,	225
X	MULM  ,	226
XX	NLI.  , 031
XX	NLO.  , 032

X	NOSYM ,	762
X	OCT   ,	763
X	OPDEF ,	764

X	OPEN  ,	050

X	OR    ,	434
X	ORB   ,	437
X	ORCA  ,	454
X	ORCAB ,	457
X	ORCAI ,	455
X	ORCAM ,	456
X	ORCB  ,	470
X	ORCBB ,	473

X	ORCBI ,	471
X	ORCBM ,	472
X	ORCM  ,	464
X	ORCMB ,	467
X	ORCMI ,	465
X	ORCMM ,	466
X	ORI   ,	435
X	ORM   ,	436

X	OUT   ,	057
XX	OUT.  ,	017
X	OUTBUF,	065
XX	OUTF. ,	027
X	OUTPUT,	067
X	PAGE  ,	700
X	PASS2 ,	701
X	PHASE ,	702
X	POINT ,	703

XX	POP   ,	262
XX	POPJ  ,	263
X	PORTAL,	757

X	PRGEND, 714
X	PRINTX,	704
X	PURGE ,	705

XX	PUSH  ,	261
XX	PUSHJ ,	260

X	RADIX ,	706
X	RADIX5,	707

X	RELEAS,	071

X	RELOC ,	710
X	REMARK,	711

X	RENAME,	055

X	REPEAT,	712

XX	RESET.,	015
X	RIM   ,	715
X	RIM10 ,	735
X	RIM10B, 736

X	ROT   ,	241
X	ROTC  ,	245

X	RSW   ,	716
XX	RTB.  ,	022
X	SALL  , 720
X	SEARCH, 721

X	SETA  ,	424
X	SETAB ,	427
X	SETAI ,	425
X	SETAM ,	426
X	SETCA ,	450
X	SETCAB,	453
X	SETCAI,	451
X	SETCAM,	452
X	SETCM ,	460
X	SETCMB,	463
X	SETCMI,	461
X	SETCMM,	462
X	SETM  ,	414
X	SETMB ,	417
X	SETMI ,	415
X	SETMM ,	416
X	SETO  ,	474
X	SETOB ,	477
X	SETOI ,	475
X	SETOM ,	476
X	SETSTS,	060
X	SETZ  ,	400
X	SETZB ,	403
X	SETZI ,	401
XX	SETZM ,	402

XX	SIXBIT,	717

XX	SKIP  ,	330
X	SKIPA ,	334
X	SKIPE ,	332
X	SKIPG ,	337
X	SKIPGE,	335
X	SKIPL ,	331
X	SKIPLE,	333
X	SKIPN ,	336

XX	SLIST.,	025

X	SOJ   ,	360
X	SOJA  ,	364
X	SOJE  ,	362
X	SOJG  ,	367
X	SOJGE ,	365
X	SOJL  ,	361
X	SOJLE ,	363
X	SOJN  ,	366

XX	SOS   ,	370
X	SOSA  ,	374
X	SOSE  ,	372
X	SOSG  ,	377
X	SOSGE ,	375
X	SOSL  ,	371
X	SOSLE ,	373
X	SOSN  ,	376

IFN STANSW,<X SPCWAR,43>
X	SQUOZE,	707

X	STATO ,	061
X	STATUS,	062
X	STATZ ,	063

X	STOPI ,	722

X	SUB   ,	274
X	SUBB  ,	277
X	SUBI  ,	275
X	SUBM  ,	276

IF2,<IFE OPHSH,<SUBTL:>>
X	SUBTTL,	723
X	SUPPRE,	713
X	SYN   ,	724
X	TAPE  ,	725
X	TDC   ,	650
X	TDCA  ,	654
X	TDCE  ,	652
X	TDCN  ,	656
X	TDN   ,	610
X	TDNA  ,	614
X	TDNE  ,	612
X	TDNN  ,	616
X	TDO   ,	670
X	TDOA  ,	674
X	TDOE  ,	672
X	TDON  ,	676
X	TDZ   ,	630
X	TDZA  ,	634
X	TDZE  ,	632
X	TDZN  ,	636

X	TITLE ,	726

X	TLC   ,	641
X	TLCA  ,	645
X	TLCE  ,	643
X	TLCN  ,	647
X	TLN   ,	601
X	TLNA  ,	605
XX	TLNE  ,	603
XX	TLNN  ,	607
XX	TLO   ,	661
X	TLOA  ,	665
X	TLOE  ,	663
X	TLON  ,	667
XX	TLZ   ,	621
XX	TLZA  ,	625
XX	TLZE  ,	623
XX	TLZN  ,	627
X	TRC   ,	640
X	TRCA  ,	644
X	TRCE  ,	642
X	TRCN  ,	646
X	TRN   ,	600
X	TRNA  ,	604
XX	TRNE  ,	602
XX	TRNN  ,	606
X	TRO   ,	660
X	TROA  ,	664
X	TROE  ,	662
X	TRON  ,	666
XX	TRZ   ,	620
X	TRZA  ,	624
X	TRZE  ,	622
X	TRZN  ,	626

X	TSC   ,	651
X	TSCA  ,	655
X	TSCE  ,	653
X	TSCN  ,	657
X	TSN   ,	611
X	TSNA  ,	615
X	TSNE  ,	613

X	TSNN  ,	617
X	TSO   ,	671
X	TSOA  ,	675
X	TSOE  ,	673
X	TSON  ,	677
X	TSZ   ,	631
X	TSZA  ,	635
X	TSZE  ,	633
X	TSZN  ,	637
X	TTCALL, 051
X	TWOSEG, 731
X	UFA   ,	130
X	UGETF ,	073
X	UJEN  , 100
IFN TENEX,<
X	UMOVE , 100
X	UMOVEI, 101
X	UMOVEM, 102
X	UMOVES, 103
>
X	UNIVER, 737
X	USETI ,	074
X	USETO ,	075

X	VAR   ,	727

XX	WTB.  ,	023

X	XALL  ,	732

X	XCT   ,	256

X	XLIST ,	733

X	XOR   ,	430
X	XORB  ,	433
X	XORI  ,	431
X	XORM  ,	432

X	XPUNGE, 730
X	XWD   ,	734

X	Z     ,	000

IFN FT.U01,<
IFN POLISH,<$BEG==762>
IFE POLISH,<$BEG==760>
X	$POP  , $BEG
X	$PUSH , <$BEG+1>
>;END IFN FT.U01
X	.ASSIG, 751
X	.COMMO, 747
X	.CREF , 740
X	.DIREC, 750
IFN POLISH,<
X	.ENDPS,	761
>
X	.HWFRM, 742
X	.IF   , 756
X	.LINK , 753
X	.LNKEN, 754
X	.MFRMT, 743
X	.NODDT, 746
X	.ORG  , 752
IFN POLISH,<
X	.PSECT,	760
>
X	.REQUE, 744
X	.REQUI, 745
X	.TEXT , 755
X	.XCREF, 741
IFN OPHSH,<		;NO-OPS, OLD MNEMONICS,F4 UUOS
X	CAI   ,	300
X	CAM   ,	310
X	CLEAR ,	400
X	CLEARB,	403
X	CLEARI,	401
X	CLEARM,	402
X	JUMP  ,	320
X	JUMPA ,	324
X	SKIP  ,	330
X	RESET.,	015
X	IN.   ,	016
X	OUT.  ,	017
X	DATA. ,	020
X	FIN.  ,	021
X	RTB.  ,	022
X	WTB.  ,	023
X	MTOP. , 024
X	SLIST., 025
X	INF.  , 026
X	OUTF. ,	027
X	NLI.  , 031
X	NLO.  , 032
>
IFE OPHSH,<
IF1, <	BLOCK	N1>
OP1END:	-1B36
OP1COD:	BLOCK	N1/4
	CC
 IF2,<	PURGE	N1,N2>
>
IFN OPHSH,<
IF2,<
DEFINE SETVAL (N)<EXP	.%'N
PURGE .%'N>
N=0
XLIST
REPEAT PRIME,<SETVAL \N
N=N+1>
LIST
>
OP1COD:	IF1,<	BLOCK <PRIME/4+1>>
IF2,<
DEFINE SETVAL (N)<EXP	.$'N
PURGE .$'N>
N=0
XLIST
REPEAT <PRIME/4+1>,<SETVAL	\N
N=N+1>
>
LIST>

	.CREF	;START CREFFING AGAIN
SUBTTL	PERMANENT SYMBOLS
SYMNUM:	EXP	LENGTH/2	;NUMBER OF PERMANENT SYMBOLS
DEFINE	P	(A,B)<
	XLIST
	SIXBIT	/A/
	XWD	SYMF!NOOUTF,B
	LIST>

P	@,	0(SUPRBT)
P	??????,	0(SUPRBT)

LENGTH= .-SYMNUM-1			;LENGTH OF INITIAL SYMBOLS

PRMTBL:			;PERMANENT SYMBOLS
P	ADC,	24
P	ADC2,	30
P	APR,	0
P	CCI,	14
P	CDP,	110
P	CDR,	114
P	CLK,	70
P	CLK2,	74
P	CPA,	0
P	CR,	150
P	CR2,	154
P	DC,	200
P	DC2,	204
P	DCSA,	300
P	DCSB,	304
P	DDC,	270
P	DDC2,	274
P	DF,	270
P	DIS,	130
P	DIS2,	134
P	DLB,	60
P	DLB2,	160
P	DLC,	64
P	DLC2,	164
P	DLS,	240
P	DLS2,	244
P	DPC,	250
P	DPC2,	254
P	DPC3,	260
P	DPC4,	264
P	DSI,	464
P	DSI2,	474
P	DSK,	170
P	DSK2,	174
P	DSS,	460
P	DSS2,	470
P	DTC,	320
P	DTC2,	330
P	DTS,	324
P	DTS2,	334
P	LPT,	124
P	LPT2,	234
P	MDF,	260
P	MDF2,	264
P	MTC,	220
P	MTM,	230
P	MTS,	224
P	PAG,	10
P	PI,	4
P	PLT,	140
P	PLT2,	144
P	PTP,	100
P	PTR,	104
P	TMC,	340
P	TMC2,	350
P	TMS,	344
P	TMS2,	354
P	TTY,	120
P	UTC,	210
P	UTS,	214
IFE LNSSW,<	XLIST	>
IFN LNSSW,<	;SPECIAL DEVICES FOR PEPR
P .A,550
P .AB,434
P .ANG,440
P .B,554
P .BITE,470
P .FA,564
P .GAIN,520
P .GATE,444
P .IA,560
P .INC,514
P .LC,474
P .LG,570
P .PEPR,400
P .RG,574
P .SCON,430
P .STAT,410
P .TC,500
P .TED,540
P .THR,544
P .TRK,404
P .VIEW,524>
	LIST
PRMEND:				;END OF PERMANENT SYMBOLS
	OPDEF	ZL	[Z	LITF]	;INVALID IN LITERALS
	OPDEF	ZA	[Z	ADDF]	;INVALID IN ADDRESSES
	OPDEF	ZAL	[Z	ADDF!LITF]

OP1TAB:

	ZA	PAGE0			;PAGE
	ZAL	PASS20			;PASS2
	ZAL	PHASE0			;PHASE
	Z	POINT0			;POINT
	ZA	PRNTX0			;PRINTX
	ZA	PURGE0			;PURGE
	ZA	RADIX0			;RADIX
	Z	RADX50			;RADIX50,SQUOZE
	ZAL	%ORG	(1)		;RELOC
	ZAL	REMAR0			;REMARK
	ZA	REPEA0			;REPEAT
	ZA	SUPRE0			;SUPRESS
	ZAL	PSEND0			;PRGEND
	ZAL	RIM0	(RIMSW)		;RIM
	DATAI	0,IOP			;RSW
	Z	ASCII0	(1)		;SIXBIT
	ZAL	IOSET	(IOPALL!IOSALL)	;SALL
	ZAL	SERCH0			;SEARCH
	ZA	STOPI0			;STOPI
	ZA	SUBTT0	(Z (POINT 7,,))	;SUBTTL
	ZA	SYN0			;SYN
	ZAL	TAPE0			;TAPE
	ZA	TITLE0	(Z (POINT 7,,))	;TITLE
	ZAL	VAR0			;VAR

	Z	XPUNG0			;XPUNGE
	ZAL	TWSEG0			;TWOSEGMENTS
	ZAL	XALL0	(IOPALL)	;XALL
	ZAL	XALL0	(IOPROG)	;XLIST
	Z	XWD0			;XWD
	ZAL	RIM0	(RIM1SW)	;RIM10
	ZAL	RIM0	(R1BSW)		;RIM10B
	ZA	UNIV0	(Z (POINT 7,,))	;UNIVERSAL
	ZAL	ONCRF	(IONCRF)	;.CREF
	ZAL	OFFCRF	(IONCRF)	;.XCREF
	ZA	OFFORM			;.HWFRMT
	ZA	ONFORM			;.MFRMT
	ZAL	REQUEST			;.REQUEST
	ZAL	REQUIRE			;.REQUIRE
	ZA	NODDT0			;.NODDT
	ZAL	COMM0			;.COMMON
	ZAL	%DIREC			;.DIRECTIVE
	ZA	ASGN			;.ASSIGN
	ZAL	%ORG	(1B18)		;.ORG
	ZAL	%LINK	(0)		;.LINK
	ZAL	%LINK	(1B18)		;.LNKEND
	Z	%TEXT0	(1B18+1B21)	;.TEXT
	Z	%IF			;.IF
	JRST	1,OP			;[342] PORTAL
IFN POLISH,<
	ZA	%SEGME			;.PSECT
	ZA	%ENDSE			;.ENDPS
>
IFN FT.U01,<
	POP	$PDUSR			;$POP
	PUSH	$PDUSR			;$PUSH
>;END IFN FT.U01
OP2TAB:

	Z	ASCII0	(0)		;ASCII
	Z	ASCII0	(1B18)		;ASCIZ
	BLKI	IOP			;BLKI
	BLKO	IOP			;BLKO
	ZAL	BLOCK0			;BLOCK
	ZA	SUPRSA			;ASUPPRESS
	ZAL	HISEG0			;HISEG
	Z	BYTE0			;BYTE
	CONI	IOP			;CONI
	CONO	IOP			;CONO
	CONSO	IOP			;CONSO
	CONSZ	IOP			;CONSZ
	DATAI	IOP			;DATAI
	DATAO	IOP			;DATAO
	Z	OCT0	(^D10)		;DEC
	ZA	DEFIN0			;DEFINE

	ZAL	DEPHA0			;DEPHASE
	ZAL	END0			;END
	ZA	INTER0	(INTF!ENTF)	;ENTRY
	Z	EXPRES			;EXP
	ZA	EXTER0			;EXTERN
	JRST	4,OP			;HALT
	TLNN	FR,IFPASS		;IF1
	TLNE	FR,IFPASS		;IF2

	TRNE	AC0,IFB0		;IFB
	TLNE	ARG,IFDEF0		;IFDEF
	Z	IFIDN0	(0)		;IFDIF
	SKIPE	IF			;IFE
	SKIPG	IF			;IFG
	SKIPGE	IF			;IFGE
	Z	IFIDN0	(1)		;IFIDN
	SKIPL	IF			;IFL

	SKIPLE	IF			;IFLE
	SKIPN	IF			;IFN
	TRNN	AC0,IFB0		;IFNB
	TLNN	ARG,IFDEF0		;IFNDEF
	ZA	INTER0	(INTF)		;INTERN
	Z	IOWD0			;IOWD
	Z	IRP0	(0)		;IRP
	Z	IRP0	(400000)	;IRPC

	JFCL	6,OP			;JCRY
	JFCL	4,OP			;JCRY0
	JFCL	2,OP			;JCRY1
	JRST	12,OP			;JEN
	JFCL	10,OP			;JOV
	JRST	2,OP			;JRSTF

	ZAL	IOLSET	(IOPALL!IOSALL)	;[327] LALL, SEE ***** AT IOLSE1+1 IF CHANGED
	ZAL	IORSET	(IOPROG)	;LIST
	ZAL	LIT0			;LIT
	ZAL	%ORG	(0)		;LOC
	ZA	OFFSYM			;NOSYM
	Z	OCT0	(^D8)		;OCT
	ZA	OPDEF0			;OPDEF
	JFCL	1,OP			;JFOV
	ZA	ONML			;MLON
	ZA	OFFML			;MLOFF
	Z	ASCII0	(3B19)		;COMMENT
	ZAL	%ARAY			;ARRAY
	ZAL	%INTEG			;INTEGER
	ZAL	%LINK	(0)		;LINK
	ZAL	%LINK	(1B18)		;LNKEND
	ZAL	%ORG	(1B18)		;ORG
	ZA	ASGN			;ASSIGN
IFN IIISW,<
	Z	ASCII0	(5B20)		;ASCID>
CALTBL:
				;USER DEFINED CALLI'S GO HERE
	SIXBIT	/LIGHTS/	;-1
CALLI0:	SIXBIT	/RESET/		; 0
	SIXBIT	/DDTIN/		; 1
	SIXBIT	/SETDDT/	; 2
	SIXBIT	/DDTOUT/	; 3
	SIXBIT	/DEVCHR/	; 4
	SIXBIT	/DDTGT/		; 5
	SIXBIT	/GETCHR/	; 6
	SIXBIT	/DDTRL/		; 7
	SIXBIT	/WAIT/		;10
	SIXBIT	/CORE/		;11
	SIXBIT	/EXIT/		;12
	SIXBIT	/UTPCLR/	;13
	SIXBIT	/DATE/		;14
	SIXBIT	/LOGIN/		;15
	SIXBIT	/APRENB/	;16
	SIXBIT	/LOGOUT/	;17
	SIXBIT	/SWITCH/	;20
	SIXBIT	/REASSI/	;21
	SIXBIT	/TIMER/		;22
	SIXBIT	/MSTIME/	;23
	SIXBIT	/GETPPN/	;24
	SIXBIT	/TRPSET/	;25
	SIXBIT	/TRPJEN/	;26
	SIXBIT	/RUNTIM/	;27
	SIXBIT	/PJOB/		;30
	SIXBIT	/SLEEP/		;31
	SIXBIT	/SETPOV/	;32
	SIXBIT	/PEEK/		;33
	SIXBIT	/GETLIN/	;34
	SIXBIT	/RUN/		;35
	SIXBIT	/SETUWP/	;36
	SIXBIT	/REMAP/		;37
	SIXBIT	/GETSEG/	;40
	SIXBIT	/GETTAB/	;41
	SIXBIT	/SPY/		;42
	SIXBIT	/SETNAM/	;43
	SIXBIT	/TMPCOR/	;44
	SIXBIT	/DSKCHR/	;45
	SIXBIT	/SYSSTR/	;46
	SIXBIT	/JOBSTR/	;47
	SIXBIT	/STRUUO/	;50
	SIXBIT	/SYSPHY/	;51
	SIXBIT	/FRECHN/	;52
	SIXBIT	/DEVTYP/	;53
	SIXBIT	/DEVSTS/	;54
	SIXBIT	/DEVPPN/	;55
	SIXBIT	/SEEK/		;56
	SIXBIT	/RTTRP/		;57
	SIXBIT	/LOCK/		;60
	SIXBIT	/JOBSTS/	;61
	SIXBIT	/LOCATE/	;62
	SIXBIT	/WHERE/		;63
	SIXBIT	/DEVNAM/	;64
	SIXBIT	/CTLJOB/	;65
	SIXBIT	/GOBSTR/	;66
	0			;67
	0			;70
	SIXBIT	/HPQ/		;71
	SIXBIT	/HIBER/		;72
	SIXBIT	/WAKE/		;73
	SIXBIT	/CHGPPN/	;74
	SIXBIT	/SETUUO/	;75
	SIXBIT	/DEVGEN/	;76
	SIXBIT	/OTHUSR/	;77
	SIXBIT	/CHKACC/	;100
	SIXBIT	/DEVSIZ/	;101
	SIXBIT	/DAEMON/	;102
	SIXBIT	/JOBPEK/	;103
	SIXBIT	/ATTACH/	;104
	SIXBIT	/DAEFIN/	;105
	SIXBIT	/FRCUUO/	;106
	SIXBIT	/DEVLNM/	;107
	SIXBIT	/PATH./		;110
	SIXBIT	/METER./	;111
	SIXBIT	/MTCHR./	;112
	SIXBIT	/JBSET./	;113
	SIXBIT	/POKE./		;114
	SIXBIT	/TRMNO./	;115
	SIXBIT	/TRMOP./	;116
	SIXBIT	/RESDV./	;117
	SIXBIT	/UNLOK./	;120
	SIXBIT	/DISK./		;121
	SIXBIT	/DVRST./	;122
	SIXBIT	/DVURS./	;123
	SIXBIT	/XTTSK./	;124
	SIXBIT	/CAL11./	;125
	SIXBIT	/MTAID./	;126
	SIXBIT	/IONDX./	;127
	SIXBIT	/CNECT./	;130
	SIXBIT	/MVHDR./	;131
	SIXBIT	/ERLST./	;132
	SIXBIT	/SENSE./	;133
	SIXBIT	/CLRST./	;134
	SIXBIT	/PIINI./	;135
	SIXBIT	/PISYS./	;136
	SIXBIT	/DEBRK./	;137
	SIXBIT	/PISAV./	;140
	SIXBIT	/PIRST./	;141
	SIXBIT	/IPCFR./	;142
	SIXBIT	/IPCFS./	;143
	SIXBIT	/IPCFQ./	;144
	SIXBIT	/PAGE./		;145
	SIXBIT	/SUSET./	;146
	SIXBIT	/COMPT./	;147
	SIXBIT	/SCHED./	;150
	SIXBIT	/ENQ./		;151
	SIXBIT	/DEQ./		;152
	SIXBIT	/ENQC./		;153
	SIXBIT	/TAPOP./	;154
	SIXBIT	/FILOP./	;155
	SIXBIT	/CAL78./	;156
	SIXBIT	/NODE./		;157
	SIXBIT	/ERRPT./	;160
	SIXBIT	/ALLOC./	;161
	SIXBIT	/PERF./		;162

CALNTH==.-CALTBL
NEGCAL==CALLI0-CALTBL		;NUMBER OF NEGATIVE CALLI'S
TTCTBL:	SIXBIT	/INCHRW/	; 0	INPUT A CHAR. AND WAIT
	SIXBIT	/OUTCHR/	; 1	OUTPUT A CHAR.
	SIXBIT	/INCHRS/	; 2	INPUT A CHAR. AND SKIP
	SIXBIT	/OUTSTR/	; 3	OUTPUT A STRING
	SIXBIT	/INCHWL/	; 4	INPUT CHAR., WAIT, LINE MODE
	SIXBIT	/INCHSL/	; 5	INPUT CHAR., SKIP, LINE MODE
	SIXBIT	/GETLCH/	; 6	GET LINE CHARACTERISTICS
	SIXBIT	/SETLCH/	; 7	SET LINE CHARACTERISTICS
	SIXBIT	/RESCAN/	;10	RESET INPUT STREAM TO COMMAND
	SIXBIT	/CLRBFI/	;11	CLEAR TYPEIN BUFFER
	SIXBIT	/CLRBFO/	;12	CLEAR TYPEOUT BUFFER
	SIXBIT	/SKPINC/	;13	SKIPS IF A CHAR. CAN BE INPUT
	SIXBIT	/SKPINL/	;14	SKIPS IF A LINE CAN BE INPUT
	SIXBIT	/IONEOU/	;15	OUTPUT AS AN IMAGE CHAR.

TTCLTH==.-TTCTBL

MTATBL:	SIXBIT	/MTWAT./	;  0
	SIXBIT	/MTREW./	;  1
	SIXBIT	/MTEOF./	;  3
	SIXBIT	/MTSKR./	;  6
	SIXBIT	/MTBSR./	;  7
	SIXBIT	/MTEOT./	; 10
	SIXBIT	/MTUNL./	; 11
	SIXBIT	/MTBLK./	; 13
	SIXBIT	/MTSKF./	; 16
	SIXBIT	/MTBSF./	; 17
	SIXBIT	/MTDEC./	;100
	SIXBIT	/MTIND./	;101

MTALTH==.-MTATBL

MTACOD:	BYTE	(9) 0,1,3,6
	BYTE	(9) 7,10,11,13
	BYTE	(9) 16,17,100,101
	SUBTTL	USER-DEFINED SYMBOL SEARCH ROUTINES
MSRCH:	PUSHJ	PP,SEARCH	;PERFORM GENERAL SEARCH
	POPJ	PP,		;NOT FOUND, EXIT
	JUMPG	ARG,MSRCH2	;SKIP-EXIT AND CROSS-REF IF FOUND
	CAME	AC0,1(SX)	;WE ARE LOOKING AT SYMBOL, TRY ONE ABOVE
	POPJ	PP,		;NO, EXIT
	ADDI	SX,2		;YES, POINT TO IT
;**;[440] DELETE 1 INSTR @MSRCH+6	JBC	3-SEP-76
;**	SETZM	EXTPNT		;[324] RESET EXTERNAL POINTERS WORD
	PUSHJ	PP,SRCH5	;LOAD REGISTERS
MSRCH2:	AOSA	0(PP)		;SET SKIP-EXIT
QSRCH:	JUMPL	ARG,SSRCH3	;BRANCH IF OPERAND
	MOVEI	SDEL,%MAC	;SET OPERATOR FLAG
	TLZE	IO,DEFCRS	;IS IT A DEFINITION?
	MOVEI	SDEL,%DMAC	;YES
	JRST	CREF		;CROSS-REF AND EXIT

SSRCH:	PUSHJ	PP,SEARCH	;PERFORM GENERAL SEARCH
	POPJ	PP,		;NOT FOUND, EXIT
	JUMPL	ARG,SSRCH2	;SKIP-EXIT AND CROSS-REF IF FOUND
SSRCH1:	CAME	AC0,-3(SX)	;WE ARE LOOKING AT MACRO, LOOK ONE SLOT BELOW
	POPJ	PP,		;NO DICE, EXIT
	SUBI	SX,2		;YES, POINT TO IT
;**;[440] INSERT 1 INSTR @SSRCH1+3	JBC	3-SEP-76
	TLNE	ARG,OPDF	;[440] IF IN OPDEF

	SETZM	EXTPNT		;[324] RESET EXTERNAL POINTERS WORD
	PUSHJ	PP,SRCH5	;LOAD REGISTERS
SSRCH2:	AOS	0(PP)		;SET FOR SKIP-EXIT
SSRCH3:	MOVEI	SDEL,%SYM	;SET OPERAND FLAG

CREF:	TLNE	ARG,NCRF	;[220] .XCREF SEEN?
	JRST	[TLZ	IO,DEFCRS	;[220] CLEAR DEFINITION FLAG
		POPJ	PP,]		;[220] AND DON'T CREF
	TLNN	IO,IONCRF	;NO CREFFING FOR THIS SYMBOL?
	TLNE	FR,P1!CREFSW	;PASS ONE OR CROSS-REF SUPPRESSION?
	POPJ	PP,		;YES, EXIT
	EXCH	SDEL,C		;PUT FLAG IN C, SACE C
	PUSH	PP,CS
	TLNE	IO,IOCREF	;HAVE WE PUT OUT THE 177,102
	JRST	CREF3		;YES
	PUSH	PP,C		;START OF CREF DATA
REPEAT 0,<	;NEEDS CHANGE TO CREF
	MOVEI	C,177
	PUSHJ	PP,OUTLST
	MOVEI	C,102
	PUSHJ	PP,OUTLST
	TLO	IO,IOCREF	;WE NOW ARE IN THAT STATE
	POP	PP,C		;WE HAVE NOW
CREF3:	JUMPE	C,NOFLG		;JUST CLOSE IT
	PUSHJ	PP,OUTLST	;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
	MOVSI	CS,770000		;COUNT CHRS
	TDZA	C,C		;STARTING AT 0
	LSH CS,-6		;TRY NEXT
	TDNE	AC0,CS		;IS THAT ONE THERE?
	AOJA	 C,.-2		;YES
	PUSHJ	PP,OUTLST	;PRINT NUMBER OF SYMBOL CONSTITUENTS
	MOVE	CS,AC0

CREF2:	MOVEI	C,0
	LSHC	C,6
	ADDI	C,40
	PUSHJ	PP,OUTLST	;THE ASCII SYMBOL
	JUMPN	CS,CREF2
	MOVEI	C,%DSYM
	TLZE	IO,DEFCRS
	PUSHJ	PP,OUTLST	;MARK IT AS A DEFINING OCCURENCE
NOFLG:	MOVE	C,SDEL
	POP	PP,CS
	POPJ	PP,

CLSCRF:	TRNN	ER,LPTSW
	POPJ	PP,		;LEAVE IF WE SHOULD NOT BE PRINTING
CLSCR2:	MOVEI	C,177
	PUSHJ	PP,PRINT
	TLZE	IO,IOCREF	;WAS IT OPEN?
	JRST	CLSCR1		;YES, JUST CLOSE IT
	MOVEI	C,102		;NO, OPEN IT FIRST
	PUSHJ	PP,OUTLST	;MARK BEGINNING OF CREF DATA
	MOVEI	C,177
	PUSHJ	PP,OUTLST
CLSCR1:	MOVEI	C,103
	JRST	OUTLST		;MARK END OF CREF DATA

CLSC3:	TLZ	IO,IOCREF
	MOVEI	C,177
	PUSHJ	PP,OUTLST
	MOVEI	C,104
	JRST	OUTLST		;177,104 CLOSES IT FOR NOW
>	;END OF REPEAT 0
REPEAT 1,<			;WORKS WITH EXISTING CREF
	TLNE	IO,IOPAGE
	PUSHJ	PP,CRFHDR	;GET CORRECT SUBTTL
	MOVEI	C,177
	PUSHJ	PP,OUTLST
	MOVEI	C,102
	PUSHJ	PP,OUTLST
	TLO	IO,IOCREF	;WE NOW ARE IN THAT STATE
	POP	PP,C		;WE HAVE NOW
CREF3:	PUSHJ	PP,OUTLST	;TYPE OF SYMBOL (%MAC,%DMAC,%SYM)
	MOVSI	CS,770000	;COUNT CHRS
	TDZA	C,C		;STARTING AT 0
	LSH	CS,-6		;TRY NEXT
	TDNE	AC0,CS		;IS THAT ONE THERE?
	AOJA	C,.-2		;YES
	PUSHJ	PP,OUTLST	;PRINT NUMBER OF SYMBOL CONSTITUENTS
	MOVE	CS,AC0

CREF2:	MOVEI	C,0
	LSHC	C,6
	ADDI	C,40
	PUSHJ	PP,OUTLST	;THE ASCII SYMBOL
	JUMPN	CS,CREF2
	MOVEI	C,%DSYM
	TLZE	IO,DEFCRS
	PUSHJ	PP,OUTLST	;MARK IT AS A DEFINING OCCURENCE
	MOVE	C,SDEL
	POP	PP,CS
	POPJ	PP,

IFN OPHSH,<
SUBTL:	SIXBIT	/SUBTTL/>
CRFHDR:	CAME	AC0,SUBTL	;IS FIRST SYMBOL "SUBTTL"
	JRST	CRFHD1		;NO
	HLLZ	AC0,V
	PUSHJ	PP,SUBTT0	;UPDATE SUBTTL
	MOVE	AC0,SUBTL	;RESTORE ARG.
	MOVEI	V,CPOPJ
CRFHD1:	MOVEI	C,0
	JRST	OUTL

CLSC3:
CLSCRF:	TRNN	ER,LPTSW
	POPJ	PP,		;LEAVE IF WE SHOULD NOT BE PRINTING
CLSCR2:	TLZE	 IO,IOCREF	;FINISH UP LINE
	JRST	CLSCR1
	MOVEI	C,0
	TLNE	IO,IOPAGE	;NEW PAGE?
	PUSHJ	PP,OUTL		;YES,GIVE IT A ROUSING SENDOFF!
	MOVEI	C,177
	PUSHJ	PP,OUTLST
	MOVEI	C,102
	PUSHJ	PP,OUTLST	;MARK BEGINNING OF CREF DATA
CLSCR1:	TRNN	ER,ERRORS	;ANY ERRORS TO CREF
	JRST	CLSCR6		;NO, JUST CLOSE OUT
	MOVE	C,[POINT 6,[SIXBIT /QXADLRUVNOPEMS/]]
	PUSH	PP,ER		;SAVE 
	ANDI	ER,ERRORS	;ONLY LOOK AT THESE
	HRLZ	ER,ER		;PUT FLAGS IN LEFT HALF
CLSCR4:	ILDB	CS,C		;GET NEXT ERROR CODE
	LSH	ER,1		;SHIFT FLAG IN
	JUMPE	ER,CLSCR5	;FINISHED
	JUMPG	ER,CLSCR4	;NOT YET
	PUSH	PP,C		;SAVE BYTE POINTER
	TDO	CS,['%.... ']	;MAGIC SYMBOL
	MOVEI	C,%ERR		;TYPE
	PUSHJ	PP,OUTLST
	MOVEI	C,6		;NO OF CHARS.
	PUSHJ	PP,OUTLST
	SETZ	C,		;CLEAR RECEIVING ACC
	LSHC	C,6		;SHIFT IN CHAR
	ADDI	C,40		;TO ASCII
	PUSHJ	PP,OUTLST
	JUMPN	CS,.-4		;MORE TO DO
	POP	PP,C		;BYTE POINTER BACK
	JUMPN	ER,CLSCR4	;GET NEXT
CLSCR5:	POP	PP,ER		;RESTORE ER
CLSCR6:	MOVEI	C,177
	PUSHJ	PP,OUTLST
	MOVEI	C,103
	JRST	OUTLST		;MARK END OF CREF DATA
>	;END OF REPEAT 1
IFE POLISH,<
SEARCH:	HLRZ	SX,SRCHX
	HRRZ	SDEL,SRCHX

SRCH1:	CAML	AC0,-1(SX)
	JRST	SRCH3
SRCH2:	SUB	SX,SDEL
	LSH	SDEL,-1
	CAMG	SX,SYMTOP
	JUMPN	SDEL,SRCH1
	JUMPN	SDEL,SRCH2
	SOJA	SX,SRCHNO	;NOT FOUND

SRCH3:	CAMN	AC0,-1(SX)
	JRST	SRCH4		;NORMAL / FOUND EXIT
	ADD	SX,SDEL
	LSH	SDEL,-1
	CAMG	SX,SYMTOP
	JUMPN	SDEL,SRCH1
	JUMPN	SDEL,SRCH2
	SOJA	SX,SRCHNO	;NOT FOUND

SRCH4:	AOS	0(PP)		;SET FOR SKIP EXIT
SRCH5:	MOVSI	ARG,SUPRBT	;HE IS USING IT, TURN OFF BIT
	ANDCAM	ARG,(SX)	; IN THE TABLE
SRCH7:	MOVE	ARG,0(SX)	;FLAG AND VALUE TO ARG
	LDB	RC,RCPNTR	;POINT 1,ARG,17
	TLNE	ARG,LELF	;CHECK LEFT RELOCATE
	TLO	RC,1
	HRRZ	V,ARG
	TLNE	ARG,SPTR	;CHECK SPECIAL EXTESN POINTER
	JRST	SRCH6
	TLNE	ARG,PNTF
	MOVE	V,0(ARG)		;36BIT VALUE TO V
	JRST	SRCHOK
	
SRCH6:	MOVE	V,0(ARG)	;VALUE
	MOVE	RC,1(ARG)	;AND RELOC
	TLNE	RC,-2		;CHECK AND SET EXTPNT
	HLLM	RC,EXTPNT
	TRNE	RC,-2	
	HRRM	RC,EXTPNT
	JRST	SRCHOK

SRCHNO:	SKIPN	UNISCH+1	;ALLOWED TO SEARCH OTHER TABLES
	POPJ	PP,		;NO, JUST RETURN
	AOS	V,UNISCH	;GET NEXT INDEX TO TABLE
	CAIE	V,1		;FIRST TIME IN
	JRST	SRCHN1		;YES, SAVE SYMBOL INFO
	HRLM	SX,UNISCH	;SAVE SX AND SET FLAG
	MOVE	ARG,SRCHX	;SEARCH POINTER
	MOVEM	ARG,UNISHX	;TO A SAFE PLACE
	HRR	ARG,SYMBOL
	HRL	ARG,SYMTOP
	MOVEM	ARG,UNIPTR	;STORE ALSO
SRCHN1:	MOVE	V,UNISCH(V)	;GET TRUE INDEX
	JUMPE	V,SRCHKO	;IF ZERO ALL TABLE SCANNED
	MOVE	ARG,UNISHX(V)	;NEW SRCHX
	MOVEM	ARG,SRCHX	;SET IT UP
	MOVE	ARG,UNIPTR(V)	;SYMTOP,,SYMBOL
	HRRZM	ARG,SYMBOL
	HLRZM	ARG,SYMTOP
	JRST	SEARCH		;TRY AGAIN

>
IFN POLISH,<
SEARCH:	PUSHJ	PP,SRCHI	;SET UP SRCHX
	TLZ	IO,RSASSW	;CLR INTER-PSECT REF SWITCH
	HRRZ	AC1,SGNCUR	;GET CUR PSECT INX
	MOVEM	AC1,SGWFND	;SET PSECT WHERE FOUND
	PUSHJ	PP,SRCH		;SEARCH CURRENT PSECT
	  JRST	SRCHSG		;NOPE, TRY OTHER PSECT.S
	JRST	SRCH4S		;COMMON SUCCESSFUL EXIT

SRCHSG:	PUSH	PP,SX		;SAVE SX VALUE
	PUSH	PP,SGNCUR	;SAVE SGNCUR
	PUSH	PP,SGNMAX	;INIT PSECT INX
SRCHSL:	MOVE	V,0(PP)		;GET PSECT INX
	CAMN	V,-1(PP)	;DON'T SEARCH CURRENT
	JRST	SRCHSC		; PSECT AGAIN
	MOVEM	V,SGNCUR	;FUDGE CUR PSECT
	PUSHJ	PP,SRCHI	;SET UP SRCHX
	PUSHJ	PP,SRCH		;SEARCH THIS PSECT
	  JRST	SRCHSC		;NOT HERE EITHER
	MOVE	AC1,SGNCUR	;GET RELEVANT PSECT INX
	MOVEM	AC1,SGWFND	;SET PSECT WHERE FOUND
	SKIPGE	-1(PP)		;WANT TO EVALUATE IN THIS PSECT?
	JRST	SRCH4		;YES, JUST EXIT
	MOVE	ARG,0(SX)	;GET FLAGS
	TLNN	ARG,EXTF	;EXTERNAL?
	JRST	.+3		;NO
	TLNN	ARG,SPTR	;BUT NOT SPECIAL
	JRST	SRCHEX		;YES, MUST STOR IN REQUESTING PSECT
	TLNE	ARG,LELF!RELF	;IF RELOCATABLE THEN
	TLO	IO,RSASSW	; SET INTER-PSECT REF SWITCH
	JRST	SRCH4		;COMMON SUCCESSFUL EXIT

SRCHEX:	POP	PP,AC1	;INDEX
	POP	PP,SGNCUR	;RESTORE
	POP	PP,SX		;WHERE IT SHOULD BE
	MOVEI	SDEL,2		;NEEDS 2 WORDS
	ADDB	SDEL,FREE
	CAML	SDEL,SYMBOL	;WILL IT FIT?
	PUSHJ	PP,XCEEDS	;NO
	SETZM	-2(SDEL)	;VALUE
	MOVEM	AC0,-1(SDEL)	;NAME
	MOVEI	V,-2(SDEL)	;POINTER
	MOVSI	ARG,SYMF!EXTF!PNTF	;FLAGS WE NEED
	PUSHJ	PP,INSERT	;PUT IT IN
	JRST	SEARCH		;TRY AGAIN

SRCHSC:	SOS	V,0(PP)		;BUMP PSECT INX
	JUMPGE	V,SRCHSL	;LOOP IF MORE PSECTS
	POP	PP,AC1		;THROW AWAY PSECT INX
	POP	PP,SGNCUR	;RESTORE SGNCUR
	PUSHJ	PP,SRCHI	;RESET SRCHX
	POP	PP,SX		;RESTORE SX VALUE
	SKIPN	UNISCH+1	;ALLOWED TO SEARCH OTHER TABLES
	POPJ	PP,		;NO, JUST RETURN
	HRLM	SX,UNISCH	;SAVE SX AND SET FLAG
	MOVE	ARG,SRCHX	;SEARCH POINTER
	MOVEM	ARG,UNISHX	;TO A SAFE PLACE
	HRR	ARG,SGSBOT
	HRL	ARG,SGSTOP
	MOVEM	ARG,UNIPTR	;STORE ALSO
SRCHUL:	AOS	V,UNISCH	;GET NEXT INDEX TO TABLE
	MOVE	V,UNISCH(V)	;GET TRUE INDEX
	JUMPE	V,SRCHKO	;IF ZERO ALL TABLE SCANNED
	MOVE	ARG,UNISHX(V)	;NEW SRCHX
	MOVEM	ARG,SRCHX	;SET IT UP
	MOVE	ARG,UNIPTR(V)	;SGSTOP,,SGSBOT
	HRRZM	ARG,SGSBOT
	HLRZM	ARG,SGSTOP
	PUSHJ	PP,SRCH		;SEARCH UNIV SYM TAB
	  JRST	SRCHUL		;NOPE, TRY NEXT ONE
	JRST	SRCH4S		;COMMON SUCCESSFUL EXIT

SRCH4:	POP	PP,AC1		;THROW AWAY PSECT INX
	POP	PP,SGNCUR	;RESTORE SGNCUR
	POP	PP,AC1		;THROW AWAY SX VALUE
SRCH4S:	AOS	0(PP)		;SET FOR SKIP EXIT
SRCH5:	MOVSI	ARG,SUPRBT	;HE IS USING IT, TURN OFF BIT
	ANDCAM	ARG,(SX)	; IN THE TABLE
SRCH7:	MOVE	ARG,0(SX)	;FLAG AND VALUE TO ARG
	LDB	RC,RCPNTR	;POINT 1,ARG,17
	TLNE	ARG,LELF	;CHECK LEFT RELOCATE
	TLO	RC,1
	HRRZ	V,ARG
	TLNE	ARG,SPTR	;CHECK SPECIAL EXTESN POINTER
	JRST	SRCH6
	TLNE	ARG,PNTF
	MOVE	V,0(ARG)	;36BIT VALUE TO V
	JRST	SRCHOK
SRCH6:	MOVE	V,0(ARG)	;VALUE
	MOVE	RC,1(ARG)	;AND RELOC
	TLNE	RC,-2		;CHECK AND SET EXTPNT
	HLLM	RC,EXTPNT
	TRNE	RC,-2	
	HRRM	RC,EXTPNT
	JRST	SRCHOK
>
SRCHKO:	SETZ	ARG,		;CLEAR ARG SO ZERO STORED
SRCHOK:	SKIPN	UNISCH		;HAVE WE SEARCH OTHER TABLES
	POPJ	PP,		;NO, JUST RETURN
SYMBCK:	HLRZ	SX,UNISCH	;RESTORE SX
	SETZM	UNISCH		;CLEAR SYMBCK FLAG
	MOVE	SDEL,UNISHX	;SRCHX
	MOVEM	SDEL,SRCHX	;RESTORE ORIGINAL
IFE POLISH,<
	MOVE	SDEL,UNIPTR	;SYMTOP,,SYMBOL
	HRRZM	SDEL,SYMBOL
	HLRZM	SDEL,SYMTOP
	JUMPE	ARG,CPOPJ	;TOTALLY UNDEFINED
>
IFN POLISH,<
	MOVE	SDEL,UNIPTR	;SGSTOP,,SGSBOT
	HRRZM	SDEL,SGSBOT
	HLRZM	SDEL,SGSTOP
	JUMPE	ARG,CPOPJ	;TOTALLY UNDEFINED
	PUSH	PP,SGNCUR	;SAVE CUR PSECT
	SETZM	SGNCUR		;SET TO BLANK PSECT
	SETZM	SGWFND		;SET PSECT WHERE FOUND
	PUSHJ	PP,SRCHI	;SET UP SRCHX
	PUSHJ	PP,SRCH		;SET UP SX
	  JFCL
>
	TLNE	ARG,SPTR	;[256] SPECIAL EXTERNAL?
	JRST	SYMBKS		;[256] YES
	TLNE	ARG,EXTF	;EXTERNAL?
	JRST	SYMBKX		;YES, NEED 2 MORE CELLS
	TLNN	ARG,PNTF	;36 BIT VALUE FLAG SET?
	JRST	.+3		;[265] NO, PUT IN TABLE AND RETURN
	TLNN	V,-1		;BUT IS IT ONLY 18 BIT VALUE?
	TLZ	ARG,PNTF	;YES, SO ONLY USE 18 BITS
IFE POLISH,<
	JRST	INSERT
	SYN	CPOPJ,SYMBKR
>
IFN POLISH,<
	PUSHJ	PP,INSERT	;[265] STILL HAVE 0 PSECT
SYMBKR:	POP	PP,SGNCUR	;[265] RESTORE CUR PSECT
	POPJ	PP,		;[265]
>
SYMBKX:	PUSH	PP,[EXP	SYMBKR]	;[265] RETURN ADDRESS
	PUSH	PP,1(ARG)	;SAVE SIXBIT NAME
	MOVSI	ARG,SYMF!EXTF!PNTF	;SET ONLY THE REQUIRED FLAGS
				;[265] PUT 2 WORDS IN CORE
SYMBKY:	PUSHJ	PP,INSERZ	;[256] INSERT SYMBOL IN TABLE
	MOVEI	SDEL,2		;GET 2 CELLS FROM FREE CORE
	ADDB	SDEL,FREE
	CAML	SDEL,SYMBOL	;MORE CORE NEEDED?
	PUSHJ	PP,XCEEDS	;YES
	HRRI	ARG,-2(SDEL)	;POINTER TO VALUE
	SETZM	(ARG)		;AND CLEAR IT
	POP	PP,1(ARG)	;STORE SIXBIT VALUE
	MOVEM	ARG,(SX)	;SET FLAGS AND VALUE AS IT SHOULD BE
	POPJ	PP,		;RETURN

SYMBKS:	PUSH	PP,V		;[256] SAVE ADDITIVE VALUE
	PUSH	PP,[Z SYMBKZ]	;[336] SET UP RETURN ADDRESS FOR PJRST
	PUSH	PP,ARG		;[323] SAVE SYMBOL'S FLAGS
	PUSH	PP,UNISCH+1	;[256] ONLY SEARCH MAIN TABLE
	SETZM	UNISCH+1	;[256] ...
	PUSH	PP,AC0		;[256] SAVE SYMBOL WE REALLY WANT
	MOVE	ARG,1(ARG)	;[256] GET POINTER TO DEFINING SYMBOL
	MOVE	AC0,1(ARG)	;[256] AND FINALLY SYMBOL
	PUSHJ	PP,SEARCH	;[256] SEE IF DEFINING GLOBAL IS IN TABLE
	  PUSHJ	PP,[PUSH PP,1(ARG)	;SAVE SIXBIT NAME
		MOVSI	ARG,SYMF!EXTF!PNTF	;SET ONLY THE REQUIRED FLAGS
		JRST	SYMBKY]		;[256] NO, PUT IN SYMBOL TABLE
	POP	PP,AC0		;[256] GET SYMBOL BACK
	PUSHJ	PP,SEARCH	;[256] SETUP SX AGAIN
	  JFCL			;[256] WILL ALWAYS FAIL
	POP	PP,UNISCH+1	;[256] BACK TO MULTIPLE SEARCHES
	HLL	ARG,0(PP)	;[256] RECOVER FLAGS
	HRRZM	ARG,0(PP)	;[256] STACK POINTER TO GLOBAL
	JRST	SYMBKY		;[323] AND DO DUMMY PUSHJ
SYMBKZ:				;[323] FAKE RETURN ADDRESS
	POP	PP,V		;[256] GET OFFSET
	MOVEM	V,0(ARG)	;[256] STORE OFFSET
	JRST	SYMBKR		;[265] RETURN
IFN POLISH,<
SRCH:	HLRZ	SX,SRCHX
	HRRZ	SDEL,SRCHX
SRCH1:	CAML	AC0,-1(SX)
	JRST	SRCH3
SRCH2:	SUB	SX,SDEL
	LSH	SDEL,-1
	CAMG	SX,SGSTOP
	JUMPN	SDEL,SRCH1
	JUMPN	SDEL,SRCH2
	SOJA	SX,SRCHNO	;NOT FOUND
SRCH3:	CAMN	AC0,-1(SX)
	JRST	SRCHYE		;NORMAL / FOUND EXIT
	ADD	SX,SDEL
	LSH	SDEL,-1
	CAMG	SX,SGSTOP
	JUMPN	SDEL,SRCH1
	JUMPN	SDEL,SRCH2
	SOJA	SX,SRCHNO	;NOT FOUND
	SYN	CPOPJ1,SRCHYE	;SKIP RETURN
	SYN	CPOPJ,SRCHNO	;NON-SKIP RETURN
>
INSERQ:	TLNE	ARG,UNDF!VARF
INSERZ:	SETZB	RC,V
INSERT:	CAME	AC0,-1(SX)	;ARE WE LOOKING AT MATCHING MNEMONIC?
	JRST	INSRT2		;NO, JUST INSERT
	JUMPL	ARG,INSRT1	;YES, BRANCH IF OPERAND
	SKIPL	0(SX)		;OPERATOR, ARE WE LOOKING AT ONE?
	JRST	UPDATE		;YES, UPDATE
	JRST	INSRT2		;NO, INSERT

INSRT1:	SKIPG	0(SX)		;OPERAND, ARE WE LOOKING AT ONE?
	JRST	UPDATE		;YES, UPDATE
	SUBI	SX,2		;NO, MOVE UNDER OPERATOR AND INSERT
INSRT2:	MOVE	SDEL,SYMBOL
	SUBI	SDEL,2
	CAMLE	SDEL,FREE
	JRST	INSRT3
	PUSHJ	PP,XCEEDS
	ADDI	SDEL,2000
INSRT3:	MOVEM	SDEL,SYMBOL	;MAKE ROOM FOR A TWO WORD ENTRY
	HRLI	SDEL,2(SDEL)
	BLT	SDEL,-2(SX)	;PUSH EVERYONE DOWN TWO LOACTIONS
IFN POLISH,<
	MOVE	AC1,SGNCUR	;CURRENT PSECT INDEX
	AOS	SGSCNT(AC1)	;INCREMENT PSECT SYM COUNT
>
	AOS	@SYMBOL		;INCREMENT THE SYMBOL COUNT
	TDNE	RC,[-2,,-2]	;SPECIAL LEFT OR RIGHT EXTERNAL?
	JRST	INSRT5		;YES, JUMP
	TLNN	V,-1		;SKIP IF V IS A 36BIT VALUE
	JRST	INSRT4		;JUMP, ITS A 18BIT VALUE
	AOS	SDEL,FREE	;36BIT, SO GET A CELL FROM FREE CORE
	CAML	SDEL,SYMBOL	;MORE CORE NEEDED?
	PUSHJ	PP,XCEEDS	;YES
	HRRI	ARG,-1(SDEL)	;POINTER TO ARG
	MOVEM	V,0(ARG)	;36BIT VALUE TO FREE CORE
	TLO	ARG,PNTF	;[204] NOTE THAT ARG IS APOINTER, NOT A 18BIT VALUE
	JRST	INSRT7		;[204] STORE SYMBOL

INSRT4:	HRR	ARG,V		;18 BIT VALUE ARG
	TLNN	ARG,EXTF	;[204] POSSIBLE TO BE EXT WITH 0 RELOC SO DON'T
	TLZ	ARG,PNTF	;[204] CLEAR POINTER FLAG INCASE SET
INSRT7:	DPB	RC,RCPNTR	;FIX RIGHT RELOCATION
	TLNE	RC,1
	TLO	ARG,LELF	;FIX LEFT RELOCATION
INSRT6:	MOVEM	ARG,0(SX)	;INSERT FLAGS AND VALUE.
	MOVEM	AC0,-1(SX)	;INSERT SYMBOL NAME.
	PUSHJ	PP,SRCHI	;INITILIAZE SRCHX
	JRST	QSRCH		;EXIT THROUGH CREF
	
INSRT5:	MOVEI	SDEL,2		;GET TWO CELLS FROM FREE CORE
	ADDB	SDEL,FREE
	CAML	SDEL,SYMBOL	;MORE CORE NEEDED?
	PUSHJ	PP,XCEEDS	;YES
	MOVEM	RC,-1(SDEL)
	HRRI	ARG,-2(SDEL)	;POINTER TO ARG
	MOVEM	V,0(ARG)
	TLO	ARG,SPTR	;SET SPECIAL POINTER, POINTS TO TWO CELLS
	JRST	INSRT6
REMOVE:
IFN POLISH,<
	MOVEI	AC2,0(SX)	;ADDRESS OF THE SYMBOL
	SUB	AC2,SYMBOL	; - BASE OF SYMBOL TABLE
	LSH	AC2,-1		; / 2 = SYMBOL ORDINAL
	TDZA	AC1,AC1		;INIT PSECT INDEX
	ADDI	AC1,1		;INCREMENT PSECT INDEX
	HRRZ	AC0,SGSCNT(AC1)	;WITHIN THIS PSECT?
	SUB	AC2,AC0
	JUMPG	AC2,.-3		;TRY NEXT PSECT IF NOT
	SOS	SGSCNT(AC1)	;DECREMENT PSECT SYM COUNT
>
	SUBI	SX,2		;MOVE EVERYONE UP TWO LOCATIONS
REMOV1:	MOVE	0(SX)
	MOVEM	2(SX)		;OVERWRITE THE DELETED SYMBOL
	CAME	SX,SYMBOL	;SKIP WHEN DONE
	SOJA	SX,REMOV1
	ADDI	SX,2
	MOVEM	SX,SYMBOL
	SOS	0(SX)		;DECREMENT THE SYMBOL COUNT

SRCHI:	MOVEI	AC2,0		;THIS CODE SETS UP SRCHX
IFE POLISH,<
	FAD	AC2,@SYMBOL
>
IFN POLISH,<
	HRRZ	AC1,SGNCUR
	HRRZ	AC1,SGSCNT(AC1)
	FAD	AC2,AC1
>
	LSH	AC2,-^D27
	MOVEI	AC1,1000
	LSH	AC1,-357(AC2)
	HRRM	AC1,SRCHX
	LSH	AC1,1
IFE POLISH,<
	ADD	AC1,SYMBOL
	HRLM	AC1,SRCHX
>
IFN POLISH,<
	HRLM	AC1,SRCHX
	MOVE	AC1,SYMBOL
	MOVEM	AC1,SGSBOT
	HRRZ	AC2,SGNCUR
	JUMPE	AC2,SRCHI2
SRCHI1:	HRRZ	AC1,SGSCNT-1(AC2)
	LSH	AC1,1
	ADDB	AC1,SGSBOT
	SOJG	AC2,SRCHI1
SRCHI2:	MOVS	AC2,AC1
	ADDM	AC2,SRCHX
	MOVE	AC2,SGNCUR
SRCHI3:	HRRZ	AC1,SGSCNT(AC2)
	LSH	AC1,1
	ADD	AC1,SGSBOT
	MOVEM	AC1,SGSTOP
>
	POPJ	PP,		;SRCHX=XWD <SYMTBL+LENGTH/2>,LENGTH/4
UPDATE:	DPB	RC,RCPNTR	;FIX RIGHT RELOCATION
	TLNE	ARG,SPTR	;SKIP IF THERE IS NO SPECIAL POINTER
	JRST	UPDAT4		;YES, USE THE TWO CELLS
	TDNE	RC,[-2,,-2]	;NEED TO CHANGE ANY CURRENT EXTERNS
	JRST	UPDAT5		;YES ,JUMP
	TLZ	ARG,LELF	;CLEAR LELF
	TLNE	RC,1		;LEFT RELOCATABLE?
	TLO	ARG,LELF	;YES, SET THE FLAG
	TLNE	ARG,PNTF	;WAS THERE A 36BIT VALUE?
	JRST	UPDAT2		;YES, USE IT.
	TLNE	V,-1		;NO,IS THERE A 36BIT VALUE?
	JRST	UPDAT1		;YES, GET A CELL
	HRR	ARG,V		;NO, USE RH OF ARG
UPDAT3:	MOVEM	ARG,0(SX)	;OVERWRITE THE ONE IN THE TABLE
IFE POLISH,<
	POPJ	PP,		;AND EXIT
>
IFN POLISH,<
	JRST	UPDAT6		;AND EXIT
>

UPDAT1:	AOS	SDEL,FREE	;GET ONE CELL
	CAML	SDEL,SYMBOL	;NEED MORE CORE?
	PUSHJ	PP,XCEEDS	;YES
	HRRI	ARG,-1(SDEL)	;POINTER TO ARG
	TLO	ARG,PNTF	;AND NOTE IT.
UPDAT2:	TLNE	ARG,EXTF	;IS THERE A EXTERNAL?
	JRST	UPDAT3		;YES, - JUST SAVE A LOCATION
	MOVEM	ARG,0(SX)	;NO, OVERWRITE THE POINTER IN THE TABLE
	MOVEM	V,0(ARG)	;STORE VALUE AS A 36BIT VALUE
IFE POLISH,<
	POPJ	PP,		;AND EXIT
>
IFN POLISH,<
	JRST	UPDAT6		;AND EXIT
>
	
UPDAT4:	MOVEM	ARG,0(SX)	;WE HAVE TWO CELLS, WE USE THEM
	MOVEM	V,0(ARG)	;SAVE AS 36BIT VALUE
	MOVEM	RC,1(ARG)	;SAVE RELOCATION BITS
	POPJ	PP,		;AND EXIT

UPDAT5:	MOVEI	SDEL,2		;THERE IS A EXTERNAL
	ADDB	SDEL,FREE	;SO WE NEED TWO LOACTIONS
	CAML	SDEL,SYMBOL	;NEED MORE CORE?
	PUSHJ	PP,XCEEDS	;YES
	MOVEM	RC,-1(SDEL)	;SAVE RELOCATION BITS
	HRRI	ARG,-2(SDEL)	;SAVE THE POINTER IN ARG
	MOVEM	V,0(ARG)	;SAVE A 36BIT VALUE
	TLO	ARG,SPTR	;SET SPECIAL PNTR FLAG
	TLZ	ARG,PNTF	;CLEAR POINTER FLAG
	JRST	UPDAT3		;SAVE THE POINTER AND EXIT
IFN POLISH,<
UPDAT6:	TLNN	IO,DEFCRS	;DEFINING OCCURANCE?
	POPJ	PP,		;NO, RETURN
	TLNE	ARG,EXTF	;EXTERNAL?
	POPJ	PP,		;YES, RETURN
	MOVE	SDEL,SYMBOL	;GET START OF SYM TAB
	SETZ	AC1,		;ZERO PSECT INX
UPDAT7:	HRRZ	AC2,SGSCNT(AC1)	;PSECT SYM CNT
	LSH	AC2,1		;DOUBLE IT
	ADD	SDEL,AC2	;END OF PSECT
	CAMGE	SDEL,SX		;SYM IN THIS PSECT?
	AOJA	AC1,UPDAT7	;NO, TRY NEXT PSECT
	CAMN	AC1,SGNCUR	;IF IT'S IN THE CUR PSECT
	POPJ	PP,		; THEN RETURN
	PUSH	PP,AC1		;SAVE PRESENT PSECT INX
	PUSH	PP,0(SX)	;SAVE SYMBOL STUFF
	PUSH	PP,-1(SX)	; AND NAME
	PUSH	PP,SX		;SAVE PRESENT SYM INX
	PUSHJ	PP,SRCHI	;SET UP SRCHX
	PUSHJ	PP,SRCH		;SET UP NEW SX
	  JFCL
	POP	PP,SDEL		;RESTORE PRESENT SYM INX
	MOVE	AC1,-2(PP)	;GET PRESENT PSECT INX
	CAMG	AC1,SGNCUR	;WHICH WAY TO MOVE?
	JRST	UPDAT9		;DOWN
	ADDI	SX,2		;MUST MOVE THIS ONE ALSO
UPDAT8:	MOVE	AC2,-2(SDEL)	;MOVE PART OF
	MOVEM	AC2,0(SDEL)	; SYMBOL TABLE
	CAILE	SDEL,0(SX)	;ENOUGH MOVED?
	SOJA	SDEL,UPDAT8	;NO
	JRST	UPDT10		;COMMON EXIT
UPDAT9:	HRLI	AC2,1(SDEL)	;FROM HERE
	HRRI	AC2,-1(SDEL)	; TO HERE
	BLT	AC2,-2(SX)	; UNTIL HERE, MOVE!
UPDT10:	POP	PP,-1(SX)	;RESTORE SYMBOL NAME
	POP	PP,0(SX)	; AND STUFF
	POP	PP,AC1		;OLD PSECT INX
	SOS	SGSCNT(AC1)	;DECR ITS SYM CNT
	MOVE	AC1,SGNCUR	;CUR PSECT INX
	AOS	SGSCNT(AC1)	;INCR ITS SYM CNT
	PUSHJ	PP,SRCHI	;SET UP SRCHX
	POPJ	PP,		;RETURN
>
	SUBTTL	CONSTANTS


IFN FORMSW,<
HWFORM:	BYTE	(18) 1,1
INFORM:	BYTE 	(9) 1 (4) 1 (1) 1 (4) 1 (18) 1
IOFORM:	BYTE	(3) 1 (7) 1 (3) 1 (1) 1 (4) 1 (18) 1
BPFORM:	BYTE	(6) 1,1 (2) 1 (4) 1 (18) 1
ASCIIF:	BYTE	(7) 1,1,1,1,1
SXFORM:	BYTE	(6) 1,1,1,1,1,1
>
	SUBTTL PHASED CODE

IFN PURESW,<LOWH:
	PHASE	LOWL>

IFN FT.U01,<
$USRPD:	IOWD	$USRLN,$USSTK
>;END IFN FT.U01
IFN TEMP,<TMPFIL: SIXBIT /MAC/
	XWD	-200,0>
LSTFIL:	BLOCK 1
	SIXBIT /@/	;SYMBOL TO STOP PRINTING
TABI:
IFE FORMSW,<	BYTE	(7) 0, 11, 11, 11, 11>
IFN FORMSW,<	BYTE	(7) 11,11, 11, 11, 11>
SEQNO:	BLOCK	1
	ASCIZ	/	/
BININI:	EXP	B
BINDEV:	BLOCK	1
	XWD	BINBUF,0
LSTINI:	EXP	AL
LSTDEV:	BLOCK	1
	XWD	LSTBUF,0
IFN CCLSW,<
RPGINI:	EXP	AL
RPGDEV:	BLOCK 1
	XWD 0,CTLBLK
>
INDEVI:	EXP	A
INDEV:	BLOCK	1
	XWD	0,IBUF

UNVINI:	EXP	B		;[240] OPEN BLOCK FOR BINARY UNV
UNVDEV:	BLOCK	1		;[240] SO USER CAN SPECIFY
	EXP	UNVBUF		;[240]

..LPP:	EXP	.LPP-2		;[227] "READ-ONLY" LINES/PAGE

DBUF:	ASCIZ	/ TI:ME DY-MON-YR PAGE /
VBUF:	ASCIZ	/	MACRO %/	;MUST BE LAST LOCATIONS IN BLOCK
IFE PURESW,<	BLOCK	3	;ALLOW FOR LONG TITLE>
IFN PURESW,<	DEPHASE
	LENLOW==.-LOWH>
SUBTTL	STORAGE CELLS

IFN PURESW,<	RELOC	LOWL
LOWL:	BLOCK	LENLOW+3 >
PASS1I:

RP:	BLOCK	1
IFN POLISH,<
POLSTK:	BLOCK	1		;[164]
POLPTR:	BLOCK	1		;[164]
>
CTLBUF:	BLOCK	<CTLSIZ+5>/5
LSTBUF:	BLOCK	3
BINBUF:	BLOCK	3
IBUF:	BLOCK	3
UNVBUF:	BLOCK	3
LSTDIR:	BLOCK	4
BINDIR:	BLOCK	4
INDIR:	BLOCK	4
UNVDIR:	BLOCK	4
UNVPTH:	BLOCK	2+.SFDLN	;[240] PATH FOR UNV LOOKUP
MYPPN:	BLOCK	1		;[405]LOGGED IN PPN

ACDELX:				;LEFT HALF
BLKTYP:	BLOCK	1		;RIGHT HALF

COUTX:	BLOCK	1
COUTY:	BLOCK	1
COUTP:	BLOCK	1
COUTRB:	BLOCK	1
COUTDB:	BLOCK	^D18

UPARRO:	BLOCK	1		;[333] SWITCH WORD FOR RE-EATING ^ IF NOT FOLLOWED BY - OR !
OKOVFL:	BLOCK	1		;[362] -1 == * OR / OVERFLOW OK
DECTAB:	BLOCK	1		;[206] -1 == TABS NOT INCLUDED IN MACRO ARGS
IFN TSTCD,<
TCDFLG:	BLOCK	1		;[414]-1 MEANS TEST MODE, 0 REGULAR MODE
> ; NFI TSTCD
ERRCNT:	BLOCK	1
EOFFLG:	BLOCK	1		;[417]END OF FILE SEEN,NEXT FILE OPENED
NOFLG:	BLOCK	1		;0=DIRECTIVE XXX  -1=DIRECT NO XXXX
QERRS:	BLOCK	1		;COUNT OF "Q" ERRORS
FREE:	BLOCK	1
HIGH1:	BLOCK	1
HISNSW:	BLOCK	1
SVTYP3:	BLOCK	1
HMIN:	BLOCK	1		;START OF HIGH SEG. IN TWO SEG. PROG.
SXSV:	BLOCK	1
SDELSV:	BLOCK	1
COLSIZ:	BLOCK	1
SYMBLK:	BLOCK	1
IFBLK:	BLOCK	.IFBLK
IFBLKA:	BLOCK	.IFBLK
LADR:	BLOCK	1
NCOLLS:	BLOCK	1
LIMBO:	BLOCK	1
LBUFP:	BLOCK	1
LBUF:	BLOCK	<.CPL+5>/5
.SGLVZ==.			;[264] START OF LIT /VAR AREA
	BLOCK	1
VARHD:	BLOCK	1
VARHDX:	BLOCK	1

LITAB:	BLOCK	1
LITABX:	BLOCK	1
	BLOCK	1
LITHD:	BLOCK	1
LITHDX:	BLOCK	1
LITCNT:	BLOCK	1
LITNUM:	BLOCK	1
.SGLVL==.-.SGLVZ		;[264] LENGTH OF LIT/VAR AREA
LITERR:	BLOCK	1		;[415]

LOOKX:	BLOCK	1
NEXT:	BLOCK	1
OUTSW:	BLOCK	1
PDP:	BLOCK	1
RECCNT:	BLOCK	1
SAVBLK:	BLOCK	RC
SAVERC:	BLOCK	1
SBUF:	BLOCK	.SBUF/5
SRCHX:	BLOCK	1
SUBTTX:	BLOCK	1
SVSYM:	BLOCK	1
SYMBOL:	BLOCK	1
SYMTOP:	BLOCK	1
SYMCNT:	BLOCK	1
IFN POLISH,<
SGNMAX:	BLOCK	1
SGNAME:	BLOCK	SGNSGS+1
SGRELC:	BLOCK	SGNSGS+1
SGSCNT:	BLOCK	SGNSGS+1
SGATTR:	BLOCK	SGNSGS+1
SGORIG:	BLOCK	SGNSGS+1	;[264] LIT/VAR AREA ,, ORIGIN OF PSECT
SGSBOT:	BLOCK	1
SGSTOP:	BLOCK	1
SGWFND:	BLOCK	1
>

STPX:	BLOCK	1
STPY:	BLOCK	1
STCODE:	BLOCK	.STP
STOWRC:	BLOCK	.STP

IFN FORMSW,<
STFORM:	BLOCK	.STP
FORM:	BLOCK	1
HWFMT:	BLOCK	1
FLDSIZ:	BLOCK	1
IOSEEN:	BLOCK	1
>
TABP:	BLOCK	1
TCNT:	BLOCK	1		;COUNT OF CHARS. LEFT IN TBUF
TBUF:	BLOCK	.TBUF/5
DEVBUF:	BLOCK	6		;STORE NAME.EXT CREATION DATE AND TIME
TYPERR:	BLOCK	1
PRGPTR:	BLOCK	1		;POINTER TO CHAIN OF PRGEND BLOCKS
ENTERS:	BLOCK	1		;-1 WHEN ENTERS HAVE BEEN DONE
UNIVSN:	BLOCK	1		;-1 WHEN A UNIVERSAL SEEN
UNVSKP:	BLOCK	1		;-1 IF /U SEEN (DON'T SAVE UNIV)
CPUTYP:	BLOCK	1		;[235] CPU TYPE FOR HEADER BLOCK
IFN FT.U01,<
$USSTK:	BLOCK	$USRLN		;USER PUSH-DOWN STACK
>;END IFN FT.U01
PASS2I:

ABSHI:	BLOCK	1
HIGH:	BLOCK	1
HHIGH:	BLOCK	1		;SAVE BREAK OF HIGH SEG. IN TWO SEG PROG.
IFN POLISH,<
SGNCUR:	BLOCK	1
SGDMAX:	BLOCK	1
SGLIST:	BLOCK	SGNDEP+1
>
ACDEVX:	BLOCK	1
CPL:	BLOCK	1
CTLSAV:	BLOCK	1
CTLS1:	BLOCK	1
EXTPNT:	BLOCK	1
INTENT:	BLOCK	1
INREP:	BLOCK	1
INDEF:	BLOCK	1
INTXT:	BLOCK	1
INCND:	BLOCK	1
CALNAM:	BLOCK	1
COMSW:	BLOCK	1		;[425] -1 IF IN COMMENT WHILE LOOKING FOR ANG.BRKT.
;DO NOT SPLIT THIS BLOCK	OF 4 WORDS
PAGENO:	BLOCK	1
SEQNO2:	BLOCK	1
TAG:	BLOCK	1
TAGINC:	BLOCK	1
CALPG:	BLOCK	4
DEFPG:	BLOCK	4
LITPG:	BLOCK	4
REPPG:	BLOCK	4
TXTPG:	BLOCK	4
CNDPG:	BLOCK	4
IRPCNT:	BLOCK	1
IRPARG:	BLOCK	1
IRPARP:	BLOCK	1
IRPCF:	BLOCK	1
IRPPOI:	BLOCK	1
IRPSW:	BLOCK	1
LITLVL:	BLOCK	1
LBLFLG:	BLOCK	1		;[402] -1 IF LABEL HAS OCCURRED INSIDE CURRENT LITERAL
LTGINC:	BLOCK	1		;[402] DEPTH OF LABEL IN LITERAL
LITLBL:	BLOCK	2		;[155] NAME OF LABEL DEFINED INSIDE A LITERAL + VALUE

ASGBLK:	BLOCK	1
LOCBLK:	BLOCK	1

LOCA:	BLOCK	1
LOCO:	BLOCK	1
RELLOC:	BLOCK	1
ABSLOC:	BLOCK	1
LPP:	BLOCK	1
ORGMOD:	BLOCK	1
MODA:	BLOCK	1
MODLOC:	BLOCK	1
MODO:	BLOCK	1
IFN CCLSW,<OTBUF:	BLOCK	2>
OUTSQ:	BLOCK	2
PAGEN.:	BLOCK	1
PPTEMP:	BLOCK	1
PPTMP1:	BLOCK	1
PPTMP2:	BLOCK	1

REPCNT:	BLOCK	1
REPEXP:	BLOCK	1
REPPNT:	BLOCK	1
RPOLVL:	BLOCK	1
R1BCNT:	BLOCK	1
R1BCHK:	BLOCK	1
R1BBLK:	BLOCK	.R1B
R1BLOC:	BLOCK	1
RIMLOC:	BLOCK	1
VECREL:	BLOCK	1
VECTOR:	BLOCK	1
VECSYM:	BLOCK	1		;[244] GLOBAL SYMBOLIC START ADDRESS
IFN POLISH,<
VECFND:	BLOCK	1
>
.TEMP:	BLOCK	1		;TEMPORARY STORAGE
UNISCH:	BLOCK	.UNIV+1		;SEARCH TABLE FOR UNIVERSALS
SQFLG:	BLOCK	1
ARGF:	BLOCK	1

CPEEKC:	BLOCK	1		;[325] ANGLE COUNT AFTER ;; IN MACRO
MACENL:	BLOCK	1
MACLVL:	BLOCK	1
MACPNT:	BLOCK	1
WWRXX:	BLOCK	1
RCOUNT:	BLOCK	1		;COUNT OF WORDS STILL TO READ IN LEAF
WCOUNT:	BLOCK	1		;COUNT OF WORDS STILL FREE IN LEAF
IONSYM:	BLOCK	1		;-1 SUPRESS LISTING OF SYMBOLS
LOCAL:	BLOCK	1		;LINKED LIST OF LOCAL FIXUPS 
IFN POLISH,<
POLTYP:	BLOCK	1		;[164] PRESET IF POLISH FIXUP TYPE KNOWN
POLIST:	BLOCK	1		;[164] LINKED LIST OF POLISH FIXUP BLOCKS
POLITS:	BLOCK	1		;[265] LINKED LIST OF POLISH FIXUPS TO LITS (TEMP)
>
INASGN:	BLOCK	1		;[267] HOLDS SYMBOL NAME DURING ASSIGN INCASE NEEDS POLISH
SFDADD:	BLOCK	3+.SFDLN	;FOR LOOKUP/ENTER OF SFD PATH
SFDE==.-1			;[216] END OF SFD
PPPN:	BLOCK	1		;[216] DEFAULT PPN
PSFD:	BLOCK	3*.SFDLN	;[216] DEFAULT SFD
PSFDE==.-1			;[216] LAST ADDRESS IN SFD
PASS2Z:				;ONLY CLEAR TO HERE ON PRGEND
LSTSYM:	BLOCK	1
SPAGNO:	BLOCK	1		;PAGE NUMBER FOR SYMBOL TABLES
PASS2X:
SUBTTL	MULTI-ASSEMBLY STORAGE CELLS

SAVEPP:	BLOCK	1		;SAVE PP INCASE NO END STATEMENT
SAVEMP:	BLOCK	1		;MACRO PNTR FOR SAME REASOM
SAVERP:	BLOCK	1		;MACRO READ POINTER
LSTPGN:	BLOCK	1
ARAYP:	BLOCK	1
HDAS:	BLOCK	1
IFN CCLSW,<EXTMP:	BLOCK	1	;HOLDS EXT OF COMMAND FILE (RH)
SAVFF:	BLOCK	1>
CTLBLK:	BLOCK	3
CTIBUF:	BLOCK	3
CTOBUF:	BLOCK	3
IFN TEMP,<TMPFLG:	BLOCK	1>
IFN FORMSW,<PHWFMT:	BLOCK	1>
MACSIZ:	BLOCK	1		;INITIAL SIZE OF LOW SEG
UNISIZ:	BLOCK	1		;TOP OF BUFFERS AND STACKS
UNITOP:	BLOCK	1		;TOP OF UNIVERSAL SYMBOL TABLE
UNIVNO:	BLOCK	1		;NUMBER OF UNIVERSALS SEEN
UNITBL:	BLOCK	.UNIV+1		;TABLE OF UNIVERSAL NAMES
UNIPTR:	BLOCK	.UNIV+1		;TABLE OF SYMBOL POINTERS
UNISHX:	BLOCK	.UNIV+1		;TABLE OF SRCHX POINTERS
UNVDFA:	BLOCK	1		;[334] DEFAULT ARGUMENT POINTER FOR UNIVERSAL I/O 
UNVER%:	BLOCK	1		;[334] OLD UNIVERSAL FILE IF -1, MAY HAVE LOST DEFAULT ARGS
RTIME:	BLOCK	1		;[234] CPU TIME AT START OF PASS1
	VAR			;CLEAR VARIABLES

IFE POLISH,<SYN HIGH,SGATTR>
JOBFFI:	BLOCK	203*NUMBUF+1	;INPUT BUFFER PLUS ONE
IFN PURESW,<LOWEND==.-1
	RELOC >

	END	BEG