Google
 

Trailing-Edge - PDP-10 Archives - BB-Z759A-SM - cobol-source/xfrgen.mac
There are 7 other files named xfrgen.mac in the archive. Click here to see a list.
; UPD ID= 1247 on 6/3/83 at 5:10 PM by HOFFMAN                          
TITLE	XFRGEN FOR COBOL V13
SUBTTL	TRANSFER-OF-CONTROL GENERATORS		SERG POLEVITSKY/ALB/CAM

	SEARCH COPYRT
	SALL

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.

COPYRIGHT (C) 1974, 1983, 1984 BY DIGITAL EQUIPMENT CORPORATION


	SEARCH	P
	%%P==:%%P
	IFN TOPS20,<SEARCH MONSYM,MACSYM>

TWOSEG
	.COPYRIGHT		;Put standard copyright statement in REL file
RELOC	400000
SALL

;EDITS
;NAME	DATE		COMMENTS

;V12A****************
;WTK	 8-Jan-81	[1111] PERFORM LIMIT EXCEEDED when doing many executions of DECLARATIVES.
;DMN	 1-FEB-80	[762] IMPLEMENT AND USE D. P. FLOATING POINT LITERALS

;V12*****************
;DAW	28-SEP-78	[561] FIX "GO DEPENDING" - /O PROBLEM

;V10*****************
;	10-AUG-76	[435] PUT IN CODE TO JUMP AROUND DECLARITIVES IN A DBMS PROG
;	14-APR-76	[425] FIX KPROG CALL IN NON-RESIDENT SECTION.
;DBT	1/20/75		SET AND CLEAR FLAG INDICATING INSTRUCTIONS
;			NOT BEING PUT INTO ASY RATHER LITTAB
;			SET AT SEGCLN AND CLEAR AT EBURPX
;DBT	1/18/75		IN GOENTR AND GOALTD THE REVERSED ORDER
;			OF PUTASY AND PUTASN CALLS IS FOOLING THE 
;			UUO CONVERTER - REVERSE THEM
;			ALSO EXITRP
;			IT IS NOT CLEAR THATTHIS WILL WORK BUT IT'S
;			WORTH A TRY
;ACK	22-APR-75	CONVERT LITAB EBCIDC CODE TO ASYFIL EBCDIC
;			CODE WHEN TRANSFERING LITERALS TO THE ASY FILES.
;********************

; EDIT 271 FIX SO THAT GENERATED PARA NAME NEVER GETS TRACED
;**; EDIT 210 ADD TO FIX 167-LITTAB OVERFLOW
;*;	EDIT 167 JEC 3/14/74 FIXES LITTAB OVERFLOW.
;		IN THIS ROUTINE THE REQUIREMENT THAT THE ENTIRE
;		LITERAL BE ALL IN CORE IS REMOVED.
ENTRY XFRGEN
XFRGEN:

INTERNAL PARGEN,GOGOGN,SECGEN,ALTGEN,PERFGN,STOPGN,GODPGN,PRFYGN
INTERN	IPRFGN,EPRFGN
INTERNAL  EWARN, RESOLV, SOLVER
INTERNAL TAGGEN, JUMPTO, SEGBRK, SEGCLN
INTERNAL DECLST,DECLEN	;[435]

EXTERNAL DCLTAG		;[435]
EXTERNAL INDCLR
EXTERNAL BADEOP,FATAL,WARN,LNKSET
IFE TOPS20,<
EXTERN	DEVDED
>
EXTERNAL PUTAS1,PUTASY,PUTASN,DISPGN,PUTTAG,KILL,KILLF
EXTERNAL XPNALT,XPNLIT,XPNSEC,SETSEG,OPNFAT,PUT.EX,PUT.PJ,PUT.SX
EXTERNAL STASHP,STASHQ,POOLIT,PLITPC
EXTERNAL COMEBK
EXTERNAL TB.DAT,ESAVER,CUREOP,EOPLOC
EXTERNAL EBASEA,EMODEA,EDPLA,ESIZEA,EINCRA
EXTERNAL EBASEB,EMODEB,EDPLB,ESIZEB,EBASBX,EINCRB
EXTERNAL SOSLE.,SOSGE.,JRST.
EXTERNAL EAS1PC,AS.PAR,D1MODE,LTMODE,FCMODE,AS.OCT
EXTERNAL OPLINE
EXTERN	PRODSW
EXTERN 	SETOPN, PUT.B, PUT.LA, GETTAG, PUTTAG, CONVNL
EXTERN 	MXAC., MACX., PUTAS1, PUTASY, PUTASN, OPNFAT


;CHECK PROTAB ENTRY FOR VALIDITY

DEFINE ISOPOK (ACSYM),<
	TRNE	ACSYM,PTDEF	;IS OPERAND DEFINED?
	TRNE	ACSYM,PTMULD	;BUT NOT MULTIPLY DEFINED?
	POPJ	PP,		;BAD OPERAND
	>
SUBTTL MISCELLANEOUS GENERATORS

TAGGEN:	HLRZ	CH,W2		;GET TAG NUMBER
	PUSHJ	PP,PUTTAG	;PUT TAG INTO TAG TABLE
	JRST	COMEBK		;RETURN WITHOUT DISTURBING EOPTAB

JUMPTO:	HLRZ	CH,W2		;GET TAG FROM LEFT HALF OF W2.
	ANDI	CH,TM.TAG
	IOR	CH,[XWD	JRST.,AS.TAG]	;CH _ JRST TAG [TAG CONVERTED TO F-G NOTATION].
	HRRZ	TA,CH		;GET TAG NUMBER
	PUSHJ	PP,REFTAG##	;REFERENCE IT
	PUSHJ	PP,PUTASY	;WRITE IT OUT
	JRST	COMEBK		;RETURN WITHOUT DISTURBING EOPTAB


SEGBRK:	SKIPE	TA,EPSECT	;CHECK TO SEE IF ANY SECTIONS PRIOR
				;TO THIS ONE [IF NOT, HOW COME THERE IS
				;A PRIORITY # FLOATING AROUND?]


	JRST	SETSEG		;PULL THE SCATTERED SEGMENT TOGETHER
	OUTSTR	[ASCIZ "Internal error: segment # found but no sections detected
"]
	JRST	KILL

;[435] FOR A DBMS PROG JUMP AROUND DECLARITIVES FROM DBMS SECTION
DECLST:	SETOM	INDCLR		;FLAG THAT WE ARE IN THE DECLARATIVES
IFN DBMS,<
	SKIPN	SCHSEC##	;IS THIS A DBMS PROGRAM?
>
	POPJ	PP,		;NO
IFN DBMS,<
	PUSHJ	PP,GETTAG	;[435] JUST BEFORE START OF DECLARITIVES GET A TAG TO JUMP TO
	HRLI	CH,JRST.	;[435] PUT IN JRST %TAG
	HRRZM	CH,DCLTAG	;[435] SAVE FOR LATER PUTTAG ADDR ASSIGNMENT
	HRRZ	TA,CH		;GET TAG NUMBER
	PUSHJ	PP,REFTAG##	;REFERENCE IT
	PJRST	PUTASY		;[435] PUT JRST %TAG INTO ASY FILE
>

DECLEN:	SETZM	INDCLR		;FLAG THAT WE ARE OUT OF THE DECLARATIVES
IFN DBMS,<
	SKIPE	SCHSEC		;IS THIS A DBMS PROGRAM?
	HRROS	DCLTAG		;[435] FLAG THAT WE ARE AT END OF DECLARITIVES
>
	HRRZ	CH,PROGLN##	;GET LINE NO. OF FIRST PROCEDURE
	DPB	CH,[POINT 13,PREVW1,28]	;SET IT INCASE FIRST PROCEDURE HAS NO VERB
	POPJ	PP,		;[435] RETURN
SUBTTL SECTION GENERATOR



				SEENIT=1B35



SECGEN:	HRRZ	TA,EOPLOC	;IS THERE ONE AND ONLY ONE OPERAND?
	HRRZ	EACA,EOPNXT
	CAIE	TA,-2(EACA)
	JRST	BADEOP		;NO--TROUBLE

	HRRZ	TA,(EACA)	;GET PROTAB POINTER.
	PUSHJ	PP,LNKSET	;CONVERT LINK TO REAL ADDRESS

	HRRZ	EACD,2(TA)	;GET PRIORITY # FROM PROTAB

	TROE	EACD,SEENIT	;CHECK TO SEE IF
				;YOU HAVE SEEN THIS SECTION BEFORE
				;AND MARK IT AS "SEEN".
				;IF YOU HAVE SEEN A SECTION BEFORE &
				;BECAUSE OF SEGMENTATION
				;YOU ARE DOING RANDOM READING, THE COMPILER
				;COULD ENDLESSLY LOOP IF YOU DIDN'T DO THIS
				;CHECK

	JRST	PREVLP		;PREVENT ENDLESS RE-READING OF THE SOURCE.
	HRRM	EACD,2(TA)	;UPDATE PROTAB ENTRY.



	LDB	EACC,FLAGPS	;GET PREVIOUSLY-SEEN SECTION'S FLAGS & PRIORITY #
	ANDI	EACC,ENREZE	;STRIP OFF ALL BUT PRIORITY BITS FOR LAST-SEEN OPERATOR
	ANDI	EACD,ENREZE	;STRIP OFF SECTION PRIORITY BITS FOR ITEM HELD IN HAND
	CAIE	EACC,(EACD)	;EQUAL ?
	PUSHJ	PP,SEGCLN	;NOPE! CHECK TO SEE IF CLEAN UP NECESSARY
				;THEN PROCESS THE OPERATOR HELD IN HAND

	SKIPGE	W2,EPPARA	;IF 1ST PARAGRAPH NOT SEEN YET, OR LAST
				;PARAGRAPH DOES NOT REQUIRE AN EXIT,
				;DO NOT CHECK LAST
				;PARAGRAPH'S STATUS.
				;BIT 0 WILL BE UP IN EPPARA IF EXIT REQUIRED
	PUSHJ	PP,ESETUP	;SET POINTERS UP FOR CALL TO PARGEN

	MOVEI	EACC,EPSECT	;POINTER NOW REFLECTS FLAGS AND LINK
				;FOR THE SECTION OPERATOR.

	SKIPL	W2,EPSECT	;IF PREVIOUS SECTION NEEDS EXIT, OR
	TLNE	W2,PTDECL*2	;  IT IS IN DECLARATIVES,
	PUSHJ	PP,EXITRP	;  PUT OUT EXIT.
	JRST	EGETPR		;LEAVE FROM HERE FOR PARGEN.  

ESETUP:	MOVEI	EACC,EPPARA	;TELL PARGEN THAT PREVIOUS
				;PROCEDURE NAME WAS A PARAGRAPH
				;NAME.
	JRST	EXITRP		;GO TO PARGEN


PREVLP:	OUTSTR	[ASCIZ "Internal error: incorrect source linkage
"]
	JRST	KILL
SUBTTL THE PARAGRAPH GENERATOR

	EPAREX=1B18		;THE ALERT FLAG TO SIGNAL THE
				;GENERATING OF AN EXIT AT THE END OF
				;THE LAST-SEEN PROCEDURE NAME OF TYPE
				;SPECIFIED BY (EACC).

	ECPFLG=6B20		;CHANGE THE PROTAB FLAG FROM
				;PHASE E NOMANCLATURE TO PHASE F-G
				;NOMANCLATURE.


PARGEN:	HRRZ	TA,EOPLOC	;IS THERE ONE AND ONLY ONE OPERAND?
	HRRZ	EACA,EOPNXT
	CAIE	TA,-2(EACA)
	JRST	BADEOP		;NO--TROUBLE

	MOVEI	EACC,EPPARA	;ADDRESS FOR WHICH "PREVIOUS"
				;PROCEDURE NAME WILL APPLY.
				;
				;
	SKIPGE	W2,EPPARA	;AS YOU COME TO THE PARAGRAPH
				;GENERATOR, EPPARA CAN BE EITHER
				;> 0 , OR = 0, THEN NO CHECKING NEEDED
				;< 0 THEN   CHECKS NEED TO BE MADE
	PUSHJ	PP,EXITRP	;AN EXIT IS REQUIRED!
;IF YOU COME FROM SCANNER ROUTINE,I.E., PARGEN CALLED DIRECTLY, YOU WILL
;BE INTERESTED IN THE PREVIOUS AND CURRENT PARAGRAPH OPERATORS.

;IF YOU COME FROM SECGEN, THEN YOU WILL BE INTERESTED IN THE PREVIOUS SECTION
;AND CURRENT SECTION OPERATORS

;IF YOU CAME TO THE PARAGRAPH GENERATOR AS PART OF THE CLEAN UP ACTIVITY AT
;A SEGMENT BREAK OR THE END OF PHASE E, THEN ALL THAT YOU
;ARE INTERESTED IN DOING IS GENERATING AN EXIT IF IT IS REQUIRED.

EGETPR:	MOVE	CH,EPGFIX	;"I AM A SECTION OR PARAGRAPH" TO CH.
				;RIGHT HALF LOADED WITH MASK WHICH WILL
				;CHANGE TABLE LINK TYPE FROM 4 TO 2.


	HRRZ	TA,(EACA)	;GET PROTAB LINK AS POINTED TO BY EACA.
	XORI	CH,(TA)		;CHANGE D-E NOTATION TO F-G NOTATION
				;FOR PROTAB ENTRY.

	HRRM	TA,(EACC)	;UPDATE EPSECT OR EPPARA WITH CURRENT PROTAB ENTRY.

	PUSHJ	PP,LNKSET	;GET REAL ADDRESS
	LDB	EACD,PR.DEB	;DEBUGGING ON THIS PARA?
	JUMPE	EACD,EGTPR1	;NO
	PUSH	PP,CH		;SAVE PARA NAME
	MOVE	CH,[SKIPA.##+AC16+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+1
	PUSHJ	PP,PUTASY	;SKIPA 16,.+1
	MOVE	CH,[AS.XWD,,1]
	PUSHJ	PP,PUTASN
	MOVEI	CH,DBP%FT	;FALL THROUGH CODE
	PUSHJ	PP,PUTASN	;IN LHS
	LDB	CH,[POINT 13,PREVW1##,28]	;GET LINE # OF PREVIOUS  OPERATOR
	PUSHJ	PP,PUTASY
	MOVE	CH,[MOVEM.+AC16+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVE	CH,DBPARM
	IORI	CH,AS.PAR
	PUSHJ	PP,PUTASY	;MOVEM 16,%PARAM+N
	POP	PP,CH
EGTPR1:	HRLZ	EACD,2(TA)	;EACD _ FLAG BITS FROM PROTAB

	TLNN	EACD,PTDEF	;IF ITEM IS NOT DEFINED,
	TLNE	EACD,PTMULD	; [271]  ON MEANS GENERATED PARA NAME
	SKIPA			; [271]
	POPJ	PP,		;  FORGET IT

	HRRZM	TA,CURPRO	;SAVE ADDRESS OF THIS ENTRY
	LSH	EACD,-^D1	; !.... SHIFT EACD RIGHT SO AS TO BE
				;ABLE TO FIT IN A FLAG IN THE SIGN BIT DENOTING
				;WHETHER OR NOT AN EXIT IS REQUIRED.
				;IF EITHER EPPARA OR EPSECT NEEDS EXIT

				;FOR CURRENT PROCEDURE NAME, CELL IS LESS THAN 0.

	TLNE	EACD,1B27	;BIT 26 (BEFORE THE LSH EACD,-1), NOW BIT 27
				;EQUIVALENT IN THE LEFT HALF OF EACD.
				;SAYS WHETHER OR NOT ITEM REQUIRES EXIT GENERATED
				;IF AN EXIT IS NEEDED, THEN
				;BIT 27'S LEFT HALF EQUIVALENT IS ON.  IF NO EXIT,
				;THEN BIT 27'S EQUIVALENT IN LEFT HALF IS OFF.
				;SKIP IF OFF.
	TLO	EACD,EPAREX	;EXIT REQUIRED FLAG GOES UP

				;PROTAB FLAGS +
	HLLM	EACD,(EACC)	;FLAG FOR EXIT <IF NEEDED> IN LEFT HALF
				;<LINK TO PROTAB IN RIGHT HALF>
				;RESULT ALSO LEFT IN EACD.
	TLNE	EACD,ENREZF	;IF ITEM IS RESIDENT (PRIORITY # FROM PROTAB ENTRY
				;IS ZERO IN BITS 19-25 (AFTER LSH -1))
				;PUT CH OUT ONTO AS2.
				;IF NON-RESIDENT, PUT ONTO AS3.
				;SKIP IF RESIDENT.

	SKIPA	TC,EAS3PC	;PRIORITY NOT = 0--->GET NON-RES PPC\
	MOVE	TC,EAS2PC	;PRIORITY = 0 ---> GET RES-PPC.

	MOVE	TA,CURPRO
	HRRM	TC,1(TA)	;PROTAB ENTRY UPDATED!

	PUSHJ	PP,PUTASN	;SECTION  OR PARAGRAPH OPERATOR GOES OUT
				;AND PPC IS NOT! BUMPED.
IFN DBMS,<
	SKIPL	DCLTAG		;[435] ARE WE AT END OF DECLARITIVES?
	JRST	EGTPR3		;[435] NO
	HRRZ	CH,DCLTAG	;[435] YES--GET JUMP TO TAG
	PUSHJ	PP,PUTTAG	;[435]   AND ASSIGN IT HERE
	SETZM	DCLTAG		;ONLY DO IT ONCE
EGTPR3:>			;[435]
	TLNE	EACD,PTDEF/2	; [271] IF GENERATED NAME NO TRACE
	SKIPE	PRODSW		;IF '/P' TYPED,
	POPJ	PP,		;  NO TRACE CODE

	MOVEI	CH,C.TRCE##
	PUSHJ	PP,PUT.PJ
	MOVE	CH,[XWD AS.XWD,1]
	PUSHJ	PP,PUTASN
	MOVE	TA,CURPRO	;JUST INCASE
	LDB	CH,PR.DEB##	;DEBUGGING REQUIRED?
	SKIPN	CH
	AOSA	CH		;NO, SET CH TO 1 WORD
	MOVEI	CH,TC.DB+2	;YES, NEED 2 WORDS
	PUSHJ	PP,PUTASN
	HRRZ	CH,0(EACC)
	PUSHJ	PP,GETPR%	;GET CORRECT %PR OFFSET
	PUSHJ	PP,PUTASY
	LDB	CH,PR.DEB	;DID WE WANT DEBUGGING USE
	JUMPE	CH,CPOPJ##	;NO
	PUSH	PP,CH		;YES
	MOVE	CH,[AS.XWD,,1]
	PUSHJ	PP,PUTASN
	HRLZ	CH,DBPARM##	;GET %PARAM TO USE
	TLO	CH,AS.PAR	;MAKE INTO %PARAM+N
	HRRI	CH,AS.MSC
	PUSHJ	PP,PUTASN
	POP	PP,TA		;DEBUG USE PROCEDURE
	ADD	TA,USELOC##	;POINT TO USE TABLE
	LDB	CH,US.PRO##	;GET TAG OF USE PROCEDURE
	JRST	PUTASY		;PUT OUT CODE

				;THE RETURN IS EITHER TO ENTERS IN THE
				;SCANNER ROUTINE
				;TO A CLEAN UP ROUTINE ,
				;OR TO THE SECTION GENERATOR

GETPR%:	TRZ	CH,700000	;GRNTEE ADRCON
	PUSH	PP,CH+1		;WE NEED TO CHANGE THE SIZE
	IDIVI	CH,SZ.PRO	; BECAUSE THE COMPILER USES SZ.PRO = 5
	IMULI	CH,SZ.PR6	; WORDS, WHERE AS COBDDT ONLY SEES SZ.PR6 = 4
	ADD	CH,CH+1		;WORDS. ADD IN THE EXTRA 1
	POP	PP,CH+1		;THIS SAVES SPACE AND MAKES -68 AND -74 THE SAME
	POPJ	PP,
EPGFIX:	XWD	740000,ECPFLG	; THE XOR OPERATION WITH THIS MASK
				;WILL SET UP THE PARAGRAPH OPERATOR USED
				;IN THIS PHASE (PHASE E) SO AS TO BE INTELLIGIBLE
				;TO THE ASSEMBLY PHASE.


EXITRP:	MOVSI	CH,1B18		;RESET EXIT REQ'D FLAG FOR THIS PROCEDURE NAME
	ANDCAM	CH,(EACC)	;STORE BACK INTO EITHER EPPARA OR EPSECT
	SKIPE	NRESSN##	;DID WE SEE ANY NON-RESIDENT SECTION?
	JRST	EXITNR		;YES, DO IT THE SLOW WAY

	MOVE	TA,(EACC)	;GET PROCEDURE NAME'S PROTAB LINK
				;...LINK POINT BACK TO LAST-SEEN PROCEEDURE
	PUSHJ	PP,LNKSET	;CONVERT LINK TO REAL ADDRESS
	HLRZ	CH,3(TA)	;GET EXIT WORD <IF ONE IN PROTAB>
	CAIN	CH,0		;NO LINK?  THEN GO ALLOCATE ONE...
				;TA IS EXPECTED TO HOLD POINTER TO
				;PROPER PROTAB ENTRY, ABSOLUTE ADDRESS TYPE.

	PUSHJ	PP,EALLOC	;ALLOCATE AN EXIT WORD [0CT 0]
				;EALLOC SUBROUTINE IS EXPECTED
				;TO RETURN LINK IN CH, IF
				;EXIT WORD NEEDS TO BE CREATED ON THE SPOT.
				;PROTAB UP-DATED BY EALLOC SUBROUTINE.

	PUSH	PP,CH		;SAVE ADDRESS
	SKIPE	QUIKSW##	;/Q?
	JRST	EXITQ		;YES
				;NO
;HERE FOR NORMAL EXIT IN RESIDENT SECTION

;GENERATES:
;	SKIPN	%PARAM+n
;	JRST	.+7
;	SOS	%PARAM+n
;	HLRZ	10,0(17)
;	CAME	10,LEVEL.##
;	PUSHJ	17,EXIT.E##
;	SOS	LEVEL.##
;	JRST	@TRAC2.##

	MOVE	CH,[SKIPN.##+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVE	CH,0(PP)
	PUSHJ	PP,PUTASY	;SKIPN %PARAM+N
	MOVE	CH,[JRST.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+7
	PUSHJ	PP,PUTASY	;JRST .+7
	MOVE	CH,[SOS.##+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	POP	PP,CH
	PUSHJ	PP,PUTASY	;SOS %PARAM+N
	PUSHJ	PP,PUTASA
	MOVSI	CH,HLRZ.##+AC10+17
	PUSHJ	PP,PUTASY	;HLRZ 10,(17)
	MOVE	CH,[CAME.##+AC10,,LEVEL.]
	PUSHJ	PP,PUT.EX	;CAME 10,LEVEL.
	MOVEI	CH,EXIT.E##
	PUSHJ	PP,PUT.PJ	;PUSHJ P,EXIT.E
	MOVE	CH,[SOS.,,LEVEL.]
	PUSHJ	PP,PUT.EX	;SOS LEVEL.
	SKIPN	PRODSW
	JRST	EXITRN		;NON-PRODUCTION
	MOVSI	CH,POPJ.##+AC17
	JRST	PUTASY

EXITRN:	PUSHJ	PP,PUTASA##
	MOVE	CH,[XJRST.##+<(@)>,,TRAC2.##]
	JRST	PUT.EX		;NON-PRODUCTION
;HERE FOR QUICK EXIT IN RESIDENT SECTION

;GENERATES:
;	SOSL	%PARAM+n
;	SOS	LEVEL.##	;If in DECLARATIVES
;	POPJ	17,
;	AOS	%PARAM+n

EXITQ:	PUSHJ	PP,PUTASA
	MOVE	CH,[SOSL.##+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVE	CH,0(PP)
	PUSHJ	PP,PUTASY	;ASSUME WE PERFORMED THE EXIT
	LDB	CH,PR.DFD##	;[1111] FIND OUT IF THIS IS
	JUMPE	CH,EXITQA	;[1111]  A DECLARATIVE EXIT
	MOVE	CH,[SOS.,,LEVEL.]	;[1111] SOS LEVEL. (DECREMENT TO
	PUSHJ	PP,PUT.EX	;[1111] COMPLEMENT THE AOS IN PERF.)
EXITQA:	MOVSI	CH,POPJ.##+AC17
	PUSHJ	PP,PUTASY	;OK, WE DID
	MOVE	CH,[AOS.##+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	POP	PP,CH
	JRST	PUTASY		;NO, WE DIDN'T
;HERE FOR EXIT WHEN NON-RESIDENT SECTION SEEN

EXITNR:	MOVE	CH,[ASINC+XIT##,,AS.MSC]	;EXIT UUO
	PUSHJ	PP,PUTASY
	MOVE	TA,(EACC)	;GET PROCEDURE NAME'S PROTAB LINK
				;...LINK POINT BACK TO LAST-SEEN PROCEEDURE
	PUSHJ	PP,LNKSET	;CONVERT LINK TO REAL ADDRESS
	HLRZ	CH,3(TA)	;GET EXIT WORD <IF ONE IN PROTAB>
	CAIN	CH,0		;NO LINK?  THEN GO ALLOCATE ONE...
				;TA IS EXPECTED TO HOLD POINTER TO
				;PROPER PROTAB ENTRY, ABSOLUTE ADDRESS TYPE.

	PUSHJ	PP,EALLOC	;ALLOCATE AN EXIT WORD [0CT 0]
				;EALLOC SUBROUTINE IS EXPECTED
				;TO RETURN LINK IN CH, IF
				;EXIT WORD NEEDS TO BE CREATED ON THE SPOT.
				;PROTAB UP-DATED BY EALLOC SUBROUTINE.

	JRST	PUTASN
SUBTTL THE PERFORM GENERATOR

PERFGN:	MOVEM	W1,OPLINE	;SAVE LN&CP OF OPERATOR
	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	JRST	BADEOP		;NO--TROUBLE

	HRRZ	TC,EOPLOC	;GET ADDRESS OF FIRST OPERAND
	ADDI	TC,1
	MOVSM	TC,OPERND

	MOVEI	TE,-1(EACA)	;ALSO ADDRESS OF SECOND OPERAND
	HRRM	TE,OPERND

	CAIN	TC,0(TE)	;IS THERE ONLY ONE OPERAND?
	JRST	PERF1		;YES
	CAIE	TC,-2(TE)	;NO--IS THERE ONLY TWO OPERANDS?
	JRST	BADEOP		;NO--ERROR
	PUSHJ	PP,SOLVER	;CONVERT FLOTAB TO PROTAB FOR "A"
	MOVEM	TA,-2(EACA)

PERF1:	PUSHJ	PP,RESOLV	;CONVERT FLOTAB TO PROTAB FOR "B" (OR ONLY)
	MOVEM	TA,0(EACA)	;LHS is guaranteed to be zero

	CAIL	TA,500000	;Is it pointing to TAGTAB ?
	CAIL	TA,600000
	TRNA			;No, its a normal PROTAB entry
	JRST	PERF3		;Yes, get real address, and cont.

	PUSHJ	PP,LNKSET	;Get  flags for
	HRRZ	EACB,PTFLAG(TA)	;  "B"
	MOVS	TA,OPERND	;GET
	MOVE	TA,1(TA)	;  FLAGS
	PUSHJ	PP,LNKSET	;  FOR
	LDB	EACD,PR.DEB	;DEBUGGING ON THIS PARA?
	JUMPE	EACD,PERF2	;NO
	MOVE	CH,[SKIPA.##+AC11+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+1
	PUSHJ	PP,PUTASY	;SKIPA 16,.+1
	MOVE	CH,[AS.XWD,,1]
	PUSHJ	PP,PUTASN
	SKIPN	CH,PERFCD##	;CODE ALREADY SET?
	MOVEI	CH,DBP%PL	;NO, USE PERFORM LOOP CODE
	PUSHJ	PP,PUTASN	;IN LHS
	SETZM	PERFCD
	LDB	CH,[POINT 13,PREVW1##,28]	;GET LINE # OF PREVIOUS  OPERATOR
	PUSHJ	PP,PUTASY
	MOVE	CH,[MOVEM.+AC11+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVE	CH,DBPARM
	IORI	CH,AS.PAR
	PUSHJ	PP,PUTASY	;MOVEM 16,%PARAM+N
PERF2:	MOVE	EACD,PTFLAG(TA)	;  "A"

	ISOPOK	EACB;		CHECK TO SEE THAT "B" LEGAL
	ISOPOK	EACD;		ALSO "A"

	TRNE	EACB,PTXFER	;DOES "B" HAVE UNCONDITIONAL TRANSFER?
	PUSHJ	PP,NOEXIT	;YES, WARN USER

	LDB	EACC,FLAGPP	;GET FLAGS FOR CURRENT PARAGRAPH
;EVERYTHING OK--GENERATE THE PERFORM
;GENERATES
;	AOS	%PARAM+n
	MOVE	CH,[AOS.##+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVE	TA,OPERND	;DO WE
	MOVE	TA,1(TA)	;  HAVE AN
	PUSHJ	PP,LNKSET	;  EXIT WORD
	HLRZ	CH,3(TA)	;  FOR THIS
	SKIPN	CH		;  PARAGRAPH OR SECTION?
	PUSHJ	PP,EALLOC	;NO--GET ONE
	PUSHJ	PP,PUTASY	;GENERATE AOS %PARAM+N
	SKIPE	QUIKSW		;/Q?
	SKIPE	NRESSN		;YES, ANY NON-RES SECTIONS?
	JRST	PERF6		;NOT /Q ALL RESIDENT

;HERE FOR PERFORM OF ALL RESIDENT SECTIONS IN QUICK MODE

;GENERATES:
;	PUSHJ	17,<paragraph-name>

	MOVS	TA,OPERND	;GET SET FOR THE "GO"
	HRRZ	CH,1(TA)
	MOVEI	CH,ECPFLG(CH)
	SETZM	GODPOV##	;[V10] MAKE SURE THAT THE SPECIAL
				;[V10]  GO DEPENDING FLAG IS OFF.
PERF2A:	HRLI	CH,EPJPP
	JRST	PUTASY		;GENERATE PUSHJ 17,<PERFORM-PARA>
;Here for in-line PERFORM
;If not in quick mode generates
;	AOS	11,LEVEL.##
;	MOVS	11,11
;	HRRI	11,.+3
;	PUSH	17,11
;	JRST	%TAG
;If in quick mode generates
;	PUSHJ	PP,%TAG

PERF3:	MOVE	CH,TA
	SKIPE	QUIKSW		;/Q?
	JRST	PERF2A		;YES, PERFORM-PARA = TAG
	PUSH	PP,CH		;SAVE TAG FOR JRST %TAG
	MOVE	CH,[AOS.+AC11,,LEVEL.##]
	PUSHJ	PP,PUT.EX	;GENERATE AOS 11,LEVEL.##
	MOVE	CH,[MOVS.##+AC11,,11]
	PUSHJ	PP,PUTASY	;GENERATE MOVS 11,11
	MOVE	CH,[HRRI.##+ASINC+AC11,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+3
	PUSHJ	PP,PUTASY	;GENERATE HRRI 11,.+3
	PUSHJ	PP,PUTASA##
	MOVE	CH,[PUSH.##+AC17,,11]
	PUSHJ	PP,PUTASY	;GENERATE PUSH 17,11
	PUSHJ	PP,PUTASA##
	POP	PP,CH		;GET TAG
	AOS	CH
	HRLI	CH,XJRST.
	JRST	PUTASY		;GENERATE JRST %TAG
;HERE FOR PERFORM  OF EITHER NOT /Q OR NOT ALL RESIDENT (OR BOTH)

;GENERATES
;	AOS	11,LEVEL.##
;	MOVS	11,11
;	HRRI	11,.+4
;	PUSH	17,11
;	MOVEI	10,<paragraph-name>+1
;	JRST	@TRAC3.##

PERF6:	MOVE	CH,[AOS.+AC11,,LEVEL.##]
	PUSHJ	PP,PUT.EX	;GENERATE AOS 11,LEVEL.##
	MOVE	CH,[MOVS.##+AC11,,11]
	PUSHJ	PP,PUTASY	;GENERATE MOVS 11,11
	CAIGE	EACC,1B24	;IN RESIDENT SECTION
	JRST	PERF7		;YES
	MOVE	CH,[TLO.##+AC11+ASINC,,AS.CNB]
	PUSHJ	PP,PUTASY	;NO
	LDB	CH,[POINT 7,EACC,24]	;GET CURRENT LEVEL
	LSH	CH,^D10
	PUSHJ	PP,PUTASN	;GENERATE TLO 11,LEVEL_^D10
PERF7:	XOR	EACC,EACD	;SEE IF IN SAME SECTION
	TRNE	EACC,ENREZE
	JRST	PERF8		;NOT
	XOR	EACC,EACD	;PUT SECTION NUMBER BACK
	MOVE	CH,[HRRI.##+ASINC+AC11,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+4
	SKIPE	PRODSW		;IF /P SEEN
	MOVEI	CH,AS.DOT+3	;ONE LESS WORD GENERATED
	PUSHJ	PP,PUTASY	;GENERATE HRRI 11,.+4
	PUSHJ	PP,PUTASA##
	MOVE	CH,[PUSH.##+AC17,,11]
	PUSHJ	PP,PUTASY	;GENERATE PUSH 17,11
	MOVS	TA,OPERND	;GET SET FOR THE "GO"
	HRRZ	CH,1(TA)
	MOVEI	CH,ECPFLG(CH)
	SETZM	GODPOV##	;[V10] MAKE SURE THAT THE SPECIAL
				;[V10]  GO DEPENDING FLAG IS OFF.
	SKIPN	PRODSW		;IF /P
	JRST	PERFDB		;PERFORM DEBUGGING
	PUSH	PP,CH		;SAVE CH FROM PUTASA
	PUSHJ	PP,PUTASA	;ALTERNATE SET
	POP	PP,CH		;RESTORE IT
	HRLI	CH,XJRST.
	JRST	PUTASY		;GENERATE JRST <PERFORM-PARA>

PERFDB:	HRLI	CH,MOVEI.+AC10+ASINC
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.ABS##+1
	PUSHJ	PP,PUTASY	;GENERATE MOVEI 10,<PERFORM-PARA>+1
	PUSHJ	PP,PUTASA##
	MOVE	CH,[XJRST.+<(@)>,,TRAC3.##]
	JRST	PUT.EX
;HERE WHEN DESTINATION AND SOURCE NOT SAME PRIORITY

PERF8:	XOR	EACC,EACD	;PUT SECTION PRIORITY BACK
	MOVE	CH,[HRRI.##+ASINC+AC11,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+6
	SKIPE	PRODSW		;IF /P SEEN
	MOVEI	CH,AS.DOT+4	;TWO LESS WORD GENERATED
	PUSHJ	PP,PUTASY	;GENERATE HRRI 11,.+6
	PUSHJ	PP,PUTASA##
	MOVE	CH,[PUSH.##+AC17,,11]
	PUSHJ	PP,PUTASY	;GENERATE PUSH 17,11
	SKIPE	PRODSW		;/P?
	JRST	PERF9		;YES
	MOVE	CH,[MOVEI.+AC10+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+3
	PUSHJ	PP,PUTASY	;GENERATE MOVEI 10,.+3
	PUSHJ	PP,PUTASA##
	MOVE	CH,[XJRST.+<(@)>,,TRAC3.]
	PUSHJ	PP,PUT.EX	;GENERATE PUSHJ 17,@TRAC3.
PERF9:	MOVE	CH,[OVLAY.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY
	MOVS	TA,OPERND	;GET SET FOR THE "GO"
	HRRZ	CH,1(TA)
	MOVEI	CH,ECPFLG(CH)
	HRLM	CH,CURPRO	;SAVE PROTAB TO BE RESOLVED LATER
	SETZM	GODPOV##	;[V10] MAKE SURE THAT THE SPECIAL
				;[V10]  GO DEPENDING FLAG IS OFF.
	PUSHJ	PP,OVLHDR	;OVERLAY HEADER MAKER ROUTINE
	JRST	PUTASN		;OUTPUT THE OVERLAY CALL


;EXIT PROCEDURE-NAME ENDS WITH AN UNCONDITIONAL "GO"
NOEXIT:	MOVE	TC,OPERND
	HRRZM	TC,CUREOP
	MOVEI	DW,E.232
	JRST	OPNWRN##
SUBTTL THE "PERFORM TIMES" GENERATOR

PRFYGN:	SWOFF	FEOFF1		;TURN OFF MOST FLAGS
	MOVEM	W1,OPLINE	;SAVE LN&CP OF OPERATOR
	MOVE	EACC,[XWD 2,2]	;ASSUME ONLY ONE PROCEDURE NAME
	HRRZ	TC,EOPLOC	;SET "TC" TO SECOND OPERAND
	ADDI	TC,3
	MOVE	EACA,EOPNXT
	CAIL	TC,(EACA)	;IS THERE A SECOND ONE?
	JRST	BADEOP		;NO--TROUBLE

	MOVE	TE,0(TC)	;GET FIRST WORD OF SECOND OPERAND
	TLNE	TE,GNLIT	;IS IT A LITERAL OR FIG. CONST.?
	JRST	PRFYG1		;YES

	LDB	TE,[POINT 3,1(TC),20]	;NO--DATA-NAME?
	CAIN	TE,TB.DAT
	JRST	PRFYG1		;YES

	ADD	EACC,[XWD 2,2]	;NO--MUST HAVE TWO PROCEDURE-NAMES

	ADDI	TC,2		;STEP UP TO NEXT OPERAND
	CAIL	TC,(EACA)	;IS THERE ANOTHER?
	JRST	BADEOP		;NO--TROUBLE

;"TC" POINTS TO "TIMES" COUNT

PRFYG1:	ADD	EACC,EOPLOC
	MOVEM	EACC,EOPNXT
	MOVEM	TC,CUREOP
	MOVEI	LN,EBASEA	;SET UP PARAMETERS
	PUSHJ	PP,SETOPN

	HRRZ	TE,EMODEA	;IS ITEM A LITERAL
	CAIN	TE,LTMODE	
	JRST	PRFYG3		;YES

	CAIN	TE,FCMODE	;NO--FIG. CONST.?
	JRST	BADINT		;YES--ERROR
;"TIMES" COUNT IS A DATA-NAME

	CAIE	TE,FPMODE	;IS IT COMP-1?
	CAIN	TE,F2MODE	;OR COMP-2?
	JRST	BADFP		;YES--ERROR

	TSWF	FANUM		;IS ITEM NUMERIC?
	SKIPE	EDPLA		;YES--ANY DECIMAL PLACES?
	JRST	BADDP		;NO--ERROR
	HRRZ	TE,ESIZEA	;IS IT ONE WORD?
	CAILE	TE,^D10
	JRST	BADSIZ		;NO--ERROR
	JRST	PRFYG6		;YES

;"TIMES" COUNT IS A LITERAL

PRFYG3:	PUSHJ	PP,CONVNL	;GET VALUE OF LITERAL INTO TD & TC

	SKIPN	EDPLA		;ANY DECIMAL PLACES?
	TSWF	FLNEG		;NO--POSITIVE LITERAL?
	JRST	BADINT		;NO--ERROR

	JUMPN	TD,BADSIZ	;IS IT TWO WORDS?
	JUMPE	TC,BADINT	;NO--ZERO?

	MOVSI	CH,MOV##	;GET LITERAL INTO AC'S
	PUSHJ	PP,PUT.LA
	MOVEI	TE,D1MODE
	MOVEM	TE,EMODEA
	JRST	PRFYG7

PRFYG6:	HRLZM	TC,OPERND	;SAVE PTR TO OPERAND IN CASE SUBSCRIPTED
	PUSHJ	PP,MXAC.	;GET ITEM INTO AC'S

PRFYG7:	MOVE	CH,[XWD AS.OCT,1]	;ALLOCATE A %PARAM WORD
	PUSHJ	PP,PUTAS1
	MOVEI	CH,0
	PUSHJ	PP,PUTAS1
	HRRZ	EACC,EAS1PC
	IORI	EACC,AS.PAR
	AOS	EAS1PC
	MOVE	TE,[XWD EBASEA,EBASEB]
	BLT	TE,EBASBX
	MOVEI	TE,D1MODE
	MOVEM	TE,EMODEB
	MOVE	TE,[XWD ^D36,AS.MSC]
	MOVEM	TE,EBASEB
	SWON	FBSIGN;
	HRRZM	EACC,EINCRB
	PUSHJ	PP,MACX.	;STASH AC'S INTO %PARAM WORD
	PUSHJ	PP,GETTAG	;GET A TAG NUMBER
	HRRZM	CH,ESAVER+1	;SAVE IT 
	PUSHJ	PP,PUTTAG	;WRITE IT OUT
;ITEM HAS BEEN PUT INTO %PARAM

	MOVE	TE,@CUREOP	;WAS IT A LITERAL?
	TLNN	TE,GNLIT
	JRST	PRFY10		;NO--MUST HAVE BEEN A DATA NAME

	PUSHJ	PP,PRFY20	;YES--GENERATE THE PERFORM

	MOVSI	CH,SOSLE.	;YES--GENERATE <SOSLE B>
	PUSHJ	PP,PUT.B

	MOVSI	CH,JRST.	;GENERATE <JRST %TAG1>
	HRR	CH,ESAVER+1
	HRRZ	TA,CH		;TAG NUMBER
	PUSHJ	PP,REFTAG##	;REFERENCE IT
	JRST	PUTASY		;	AND RETURN

;ITEM IS A DATA-NAME--TEST HAS TO BE BEFORE THE PERFORM

PRFY10:	MOVSI	CH,SOSGE.	;GENERATE <SOSGE>
	PUSHJ	PP,PUT.B

	PUSHJ	PP,GETTAG	;GENERATE <JRST %TAG2>
	MOVEM	CH,ESAVER+2
	HRLI	CH,JRST.
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##
	PUSHJ	PP,PUTASY

	PUSHJ	PP,PRFY20	;GENERATE THE PERFORM

	MOVSI	CH,JRST.	;GENERATE <JRST %TAG1>
	HRR	CH,ESAVER+1
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##
	PUSHJ	PP,PUTASY

	HRRZ	CH,ESAVER+2	;PUT OUT %TAG2
	JRST	PUTTAG		;	AND RETURN


;SET UP EACA AS IF PERFORM WERE BEING CALLED, THEN CALL IT

PRFY20:	MOVE	EACA,EOPNXT
	JRST	PERFGN		;GO DO THE PERFORM
;ERROR ROUTINES

;LITERAL IS NEGATIVE OR HAS DECIMAL PLACES

BADINT:	MOVEI	DW,E.25
	JRST	OPNFAT

;IMPROPER SIZE OF DATA NAME

BADSIZ:	MOVEI	DW,E.278
	JRST	OPNFAT

;DATA-NAME HAS DECIMAL PLACES

BADDP:	MOVEI	DW,E.264
	JRST	OPNFAT

;DATA-NAME IS A COMP-1 ITEM

BADFP:	MOVEI	DW,E.321
	JRST	OPNFAT
;IN-LINE PERFORM GENERATOR

IPRFGN:	SWOFF	FEOFF1		;TURN OFF MOST FLAGS
	TLO	W2,AS.TAG	;CONVERT TO TAG NUMBER
	MOVEM	W1,OPLINE	;SAVE LN&CP OF OPERATOR
	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	JRST	IPRF10		;NO, SIMPLE CASE
	HRRZ	TC,EOPLOC	;GET ADDRESS OF FIRST OPERAND
	ADDI	TC,1
	MOVEM	TC,OPERND
	MOVEI	TE,-1(EACA)	;ALSO ADDRESS OF SECOND OPERAND
	CAIE	TC,0(TE)	;IS THERE ONLY ONE OPERAND?
	JRST	BADEOP		;NO--ERROR
	MOVE	TE,0(TC)	;GET FIRST WORD OF OPERAND
	TLNE	TE,GNLIT	;IS IT A LITERAL OR FIG. CONST.?
	JRST	IPRFG1		;YES
	LDB	TE,[POINT 3,1(TC),20]	;NO--DATA-NAME?
	CAIE	TE,TB.DAT
	JRST	BADEOP		;NO--TROUBLE

;Similar code to PRFYG1
IPRFG1:	MOVEM	TC,CUREOP
	MOVEI	LN,EBASEA	;SET UP PARAMETERS
	PUSHJ	PP,SETOPN
	HRRZ	TE,EMODEA	;IS ITEM A LITERAL
	CAIN	TE,LTMODE	
	JRST	IPRFG2		;YES
	CAIN	TE,FCMODE	;NO--FIG. CONST.?
	JRST	BADINT		;YES--ERROR
;"TIMES" COUNT IS A DATA-NAME

	CAIE	TE,FPMODE	;IS IT COMP-1?
	CAIN	TE,F2MODE	;OR COMP-2?
	JRST	BADFP		;YES--ERROR
	TSWF	FANUM		;IS ITEM NUMERIC?
	SKIPE	EDPLA		;YES--ANY DECIMAL PLACES?
	JRST	BADDP		;NO--ERROR
	HRRZ	TE,ESIZEA	;IS IT ONE WORD?
	CAILE	TE,^D10
	JRST	BADSIZ		;NO--ERROR
	JRST	IPRFG3		;YES

;"TIMES" COUNT IS A LITERAL

IPRFG2:	PUSHJ	PP,CONVNL	;GET VALUE OF LITERAL INTO TD & TC
	SKIPN	EDPLA		;ANY DECIMAL PLACES?
	TSWF	FLNEG		;NO--POSITIVE LITERAL?
	JRST	BADINT		;NO--ERROR
	JUMPN	TD,BADSIZ	;IS IT TWO WORDS?
	JUMPE	TC,BADINT	;NO--ZERO?
	MOVSI	CH,MOV##	;GET LITERAL INTO AC'S
	PUSHJ	PP,PUT.LA
	MOVEI	TE,D1MODE
	MOVEM	TE,EMODEA
	JRST	IPRFG4

IPRFG3:	HRLZM	TC,OPERND	;SAVE PTR TO OPERAND IN CASE SUBSCRIPTED
	PUSHJ	PP,MXAC.	;GET ITEM INTO AC'S

IPRFG4:	MOVE	CH,[XWD AS.OCT,1]	;ALLOCATE A %PARAM WORD
	PUSHJ	PP,PUTAS1
	MOVEI	CH,0
	PUSHJ	PP,PUTAS1
	HRRZ	EACC,EAS1PC
	IORI	EACC,AS.PAR
	AOS	EAS1PC
	MOVE	TE,[XWD EBASEA,EBASEB]
	BLT	TE,EBASBX
	MOVEI	TE,D1MODE
	MOVEM	TE,EMODEB
	MOVE	TE,[XWD ^D36,AS.MSC]
	MOVEM	TE,EBASEB
	SWON	FBSIGN;
	HRRZM	EACC,EINCRB
	PUSHJ	PP,MACX.	;STASH AC'S INTO %PARAM WORD
	PUSHJ	PP,GETTAG	;GET A TAG NUMBER
	HRRZM	CH,ESAVER+1	;SAVE IT 
	PUSHJ	PP,PUTTAG	;WRITE IT OUT
;ITEM HAS BEEN PUT INTO %PARAM

	MOVE	TE,@CUREOP	;WAS IT A LITERAL?
	TLNN	TE,GNLIT
	JRST	IPRFG5		;NO--MUST HAVE BEEN A DATA NAME
	PUSHJ	PP,IPRF20	;YES--GENERATE THE PERFORM
	MOVSI	CH,SOSLE.	;YES--GENERATE <SOSLE B>
	PUSHJ	PP,PUT.B
	MOVSI	CH,JRST.	;GENERATE <JRST %TAG1>
	HRR	CH,ESAVER+1
	HRRZ	TA,CH		;TAG NUMBER
	PUSHJ	PP,REFTAG##	;REFERENCE IT
	PUSHJ	PP,PUTASY
	JRST	IPRF30		;Output jump over in-line PERFORM

;ITEM IS A DATA-NAME--TEST HAS TO BE BEFORE THE PERFORM

IPRFG5::	MOVSI	CH,SOSGE.	;GENERATE <SOSGE>
	PUSHJ	PP,PUT.B
	PUSHJ	PP,GETTAG	;GENERATE <JRST %TAG2>
	MOVEM	CH,ESAVER+2
	HRLI	CH,JRST.
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##
	PUSHJ	PP,PUTASY
	PUSHJ	PP,IPRF20	;GENERATE THE PERFORM
	MOVSI	CH,JRST.	;GENERATE <JRST %TAG1>
	HRR	CH,ESAVER+1
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##
	PUSHJ	PP,PUTASY
	HRRZ	CH,ESAVER+2	;PUT OUT %TAG2
	PUSHJ	PP,PUTTAG
	JRST	IPRF30
IPRF10:	PUSHJ	PP,IPRF20	;Generate PERFORM entry
	JRST	IPRF30		;Generate jump over in-line PERFORM

;Generate code for entry to in-line PERFORM
;Similar code to PERF6 - generates code as if /P were on

IPRF20:	SKIPN	QUIKSW		;/Q?
	JRST	IPRF21		;NO
	HLRZ	CH,W2
	HRLI	CH,EPJPP
	JRST	PUTASY		;GENERATE PUSHJ 17,<TAG%>

IPRF21:	MOVE	CH,[AOS.+AC11,,LEVEL.##]
	PUSHJ	PP,PUT.EX	;GENERATE AOS 11,LEVEL.##
	MOVE	CH,[MOVS.##+AC11,,11]
	PUSHJ	PP,PUTASY	;GENERATE MOVS 11,11
	MOVE	CH,[HRRI.##+ASINC+AC11,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVEI	CH,AS.DOT+3
	PUSHJ	PP,PUTASY	;GENERATE HRRI 11,.+3
	PUSHJ	PP,PUTASA##
	MOVE	CH,[PUSH.##+AC17,,11]
	PUSHJ	PP,PUTASY	;GENERATE PUSH 17,11
	PUSHJ	PP,PUTASA	;ALTERNATE SET
	HLRZ	CH,W2
	HRLI	CH,XJRST.
	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##
	JRST	PUTASY		;GENERATE JRST <TAG%>

IPRF30:	PUSHJ	PP,PUTASA	;ALTERNATE SET
	HLRZ	CH,W2
	AOS	TA,CH
	PUSHJ	PP,REFTAG##
	HRLI	CH,XJRST.
	PUSHJ	PP,PUTASY	;GENERATE JRST <TAG+1%>
	HLRZ	CH,W2		;Get tag number
	JRST	PUTTAG		;Put out tag to start of in-line PERFORM
;END OF IN-LINE PERFORM
;Same as EXITRP

EPRFGN:	TLO	W2,AS.TAG	;CONVERT TO TAG NUMBER
	HRRZ	TA,EOPLOC	;THERE SHOULD BE NO OPERANDS
	HRRZ	EACA,EOPNXT
	CAIE	TA,(EACA)
	JRST	BADEOP		;NO--TROUBLE
	SKIPE	QUIKSW		;/Q?
	JRST	EPRFGQ		;YES
				;NO
;HERE FOR NORMAL EXIT

	PUSHJ	PP,PUTASA
	MOVSI	CH,HLRZ.##+AC10+17
	PUSHJ	PP,PUTASY	;HLRZ 10,(17)
	MOVE	CH,[CAME.##+AC10,,LEVEL.]
	PUSHJ	PP,PUT.EX	;CAME 10,LEVEL.
	MOVEI	CH,EXIT.E##
	PUSHJ	PP,PUT.PJ	;PUSHJ P,EXIT.E
	MOVE	CH,[SOS.,,LEVEL.]
	PUSHJ	PP,PUT.EX	;SOS LEVEL.

;HERE FOR QUICK EXIT

EPRFGQ:	MOVSI	CH,POPJ.##+AC17
	PUSHJ	PP,PUTASY
	HLRZ	CH,W2		;Get tag number
	AOJA	CH,PUTTAG	;Put out tag after in-line PERFORM
SUBTTL THE STOP GENERATOR

				;IF THERE ARE NO OPERANDS
				;IN EOPTAB (EACC) = 0, THEN STOP RUN
				;IF MORE THAN 1 OPERAND <A LITERAL>
				;FOR THE STOP < LITERAL>
				;CONDITION IS DISCOVERED, WE ARE IN TROUBLE.

STOPGN:	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	JRST	ESTRUN		;NO--BETTER BE "STOP RUN"
	MOVE	EACB,-1(EACA)	;NOW CHECK TO SEE IF THE OPERAND TYPE IS A.O.K.
	TLNE	EACB,1B19	;IS THE LITERAL OR FIGURATIVE CONSTANT FLAG UP?
	JRST	STPGN1		;YES
	LDB	EACB,[POINT 3,(EACA),20]
	CAIE	EACB,TB.MNE##	;IS IT A SYMBOLIC-CHARACTER?
	JRST	EBLTFC		;NOPE! IT WASN'T, BAD SHOW, BAD OPERAND TYPE.
STPGN1:	PUSHJ	PP,DISPGN	;GENERATE THE DISPLAY
	MOVEI	CH,C.STOP##	;GENERATE <PUSHJ PP,C.STOP>
	JRST	PUT.PJ


;OPERAND FOR "STOP" WASN'T A LITERAL

EBLTFC:	OUTSTR	[ASCIZ /"STOP" operand not literal
/]
	JRST	KILLF


;GENERATE "STOP RUN"

ESTRUN:	MOVEI	CH,STOPR.##	;GENERATE <PUSHJ PP,STOPR.>
	JRST	PUT.PJ
SUBTTL THE ALTER GENERATOR

				;SOURCE EXAMPLE:
				;  C.  ALTER A TO PROCEED TO B.
				;NOMANCLATURE:
				;C. SHALL BE THE POINT OF ORIGIN
				;B. SHALL BE THE OBJECT OF THE ALTER
				;A. SHALL BE THE SUBJECT OF THE ALTER.

				;STRATEGY(?)
				;
				;(A) CHECK FOR TWO OPERANDS
				;(B) CHECK TO SEE IF A IS ALTERABLE.
				;(C) CHECK FOR A NOT BEING IN DECLARATIVES
				;(D) CHECK FOR B NOT BEING IN DECLARATIVES.
				; <A AND B AND C MUST BE TOTALLY WITHIN DECLARATIVES
				; OR TOTALLY EXCLUDED FROM DECLARATIVES.>

				;(E) SEE WHETHER OR NOT A'S PRIORITY # < 50.
				;(F) IF A < 50, THEN A AND B CAN BE IN
				;IN ANY SEGEMENTS <NO PRIORITY PROBLEMS>

				;(G) GOT A LINK TO AN ALTER WORD IN LEFT HAND
				;HALF OF
				;THE 2ND WORD IN A'S PROTAB ENTRY ?.  IF SO
				;ALTER WORD HAS BEEN GENERATED & ALLOCATED.
				;IF NOT, ALLOCATE ONE.

				;(H) AS LONG AS TRANS-SEGEMENT GO DOES NOT
				;CAUSE OVERLAY, GENERATE:
				;	MOVEI	0,<PHASE F-G TYPE CODE
				;		  FOR B'S PROTAB LINK>


				;	MOVEM	0,<ALLOCATED ALTER WORD ADDRESS>

				;(I) EXIT BACK TO SCANNER ROUTINE.




			;(1) NOT TWO OPERANDS ? DIE...
			;(2) B IN DECLARATIVES?  THEN A HAD BETTER
			;LIKEWISE BE WITHIN DECLARATIVES
			;IF A AND B NOT COMPATIBLE, PUT
			;OUT DIAGNOSTIC AND CONTINUE
			;(3) SAME AS FOR (2); A AND B HAD BETTER MATCH.
			;(4) IF A > 50, THEN THE GO TO
			;< C.'S PRIORITY> HAS TO BE = A.'S.

			;(5) OVERLAY CODING:
ALTGEN:	HRRZ	TA,EOPLOC	;IS THERE TWO AND ONLY TWO OPERANDS?
	MOVE	EACA,EOPNXT
	CAIE	TA,-4(EACA)
	JRST	BADEOP		;OOPS! BAD SHOW _ 

	PUSHJ	PP,RESOLV	;EACA IS LOOKING AT LAST OPERAND, B.
	HRRM	TA,(EACA)	;UPDATE EOPTAB.

	PUSHJ	PP,SOLVER	;RESOLV GETS B OPERNAD, SOLVER GETS
				;A OPERAND.
	HRRM	TA,-2(EACA)	;UPDATE EOPTAB.


	PUSHJ	PP,LNKSET	;CONVERT TO REAL ADDRESS.
	MOVEI	EACB,(TA)	;SAVE POINTER TO 1ST WORD IN PROTAB FOR A.
				;YOU MAY USE IT LATER
	HRRZ	W2,2(TA)	;GET A'S FLAGS & STUFF
	TRNN	W2,1B28		;IS A ALTERABLE ?
	POPJ	PP,		;NO--FORGET IT (PHASE D PUT OUT DIAG)



	ISOPOK	W2;

	HRRZ	TA,(EACA)	;GET B OPERAND






	MOVEI	CH,ECPFLG(TA)	;& SAVE IT!
				;CH _ PHASE F-G PROTAB CODE FOR B.
	PUSHJ	PP,LNKSET	;CONVERT LINK TO ENTRY ADDRESS
	HRRZ	EACD,2(TA)	;SAVE WORD 3 OF B'S PROTAB ENTRY IN EACD
	


	ISOPOK	EACD;
				;BEGIN LADDER TEST:
				;RUN DOWN NON-DECLARATIVE PATH/ IT WILL
				;BE MOST FREQUENT BY FAR.


				;THE OVERLAY GENERATOR EXPECTS TO FIND
				;CH WITH THE PHASE F-G ADDRESS TO WHICH
				;CONTROL IS TO BE TRANSFERRED
				;EACC WITH THE CURRENT PRIORITY # OF CURRENT PARAGRAPH
				;EACD WITH PRIORITY # OF (CH) ..OF WHERE YOU ARE GOING
				;SEE GO GENERATOR ALSO...



	LDB	EACC,FLAGPP	;GET WHERE YOU ARE PRESENTLY....
	TRNE	EACC,1B32	;IS C IN DECLARATIVES <SKIP IF NOT>?
	JRST	EBDECL		;C IS IN DECLARATIVES/ IF SO, A & B BOTH MUST
				;BE IN DECLARATIVES.!.


				;C WASN'T IN DECLARATIVES:
	TRNN	W2,1B32		;OK, IS A IN DECLARATIVES [BETTER NOT BE]
	TRNE	EACD,1B32	;IS B ?
	JRST	CWASNT		;BAD SHOW _ !! ALL NOT IN DECLARATIVES!



	CAIL	W2,^D50B24	;CHECK TO SEE IF GO TO IS LESS THAN 50 
	JRST	CKAEQB		;IF SEGMENT # > OR = 50, C AND A MUST BE =

EALTOK:	TRNE	W2,40		;ARE ALL ALTERS WITHIN CURRENT SEGMENT

	JRST	ALTOLA		;OVERLAY REQUIRED? SURE IS!
ALLDEC:	HRLI	CH,MOVEI.	;CH NOW CONTAINS:
				;MOVEI 0, B


QUICKY:	PUSHJ	PP,PUTASY	;PUT OUT & BUMP PPC.


				;NOW PUT OUT
				;MOVEM	0,<ALTER WORD>
ALTFIN:	MOVE	CH,[XWD	ASINC+MOVEM.,AS.MSC]	;MOVEM 0,<IMPURE ADDRESS
					;HOLDING ADDRESS OF DESTINATION>

	PUSHJ	PP,PUTASN	;1ST WORD DOESN'T BUMP PPC
				;BECAUSE THIS IS A TWO-WORD ENTRY
	HLRZ	CH,2(EACB)	;GET A'S ALTER WORD [IF PRESENT]

	JUMPE	CH,ALTWDN	;IF NO ALTER WORD, GO GENERATE ONE.

ALTDEB:	SKIPN	DEBSW##		;DO WE NEED DEBUG CODE?
	JRST	PUTASY		;NO
	PUSHJ	PP,PUTASY	;YES
	HLRZ	CH,4(EACB)	;GET PR.DEB
	JUMPE	CH,CPOPJ	;NOT WANTED HERE
	MOVEI	CH,DBALT.##
	PUSHJ	PP,PUT.PJ	;PUSHJ 17,DBALT.
	MOVE	CH,[AS.XWD,,1]
	PUSHJ	PP,PUTASN
	HRRZ	CH,(EACA)	;GET "B" OPERAND
	PUSHJ	PP,GETPR%	;GET CORRECT %PR OFFSET
	PUSHJ	PP,PUTASN
	HRRZ	CH,-2(EACA)	;GET "A" OPERAND
	PUSHJ	PP,GETPR%	;GET CORRECT %PR OFFSET
	PUSHJ	PP,PUTASY
	MOVE	CH,[AS.XWD,,1]
	PUSHJ	PP,PUTASN
	LDB	CH,W1LN##	;GET LINE NUMBER
	PUSHJ	PP,PUTASN
	HLRZ	TA,4(EACB)	;DEBUG USE PROCEDURE
	ADD	TA,USELOC##	;POINT TO USE TABLE
	LDB	CH,US.PRO##	;GET TAG OF USE PROCEDURE
	JRST	PUTASY
ALTOLA:	CAIGE	W2,^D1B24	;DO WE REALLY NEED A MOVE?
				;IF BOTH SEG PRIORITY # ARE = 0,
				;A MOVSI 0,<PROTAB LINK> WILL DO THE TRICK!

	CAIL	EACD,^D1B24	;SEE IF BOTH ARE 0

	JRST	NEEDMV		; _ SHORT-CUT LOST, AT LEST 1
				;PRIORITY # > RES => 0.

	HRLI	CH,MOVSI.	;SHORT-CUT PAYS OFF
	JRST	QUICKY


NEEDMV:	HRLM	CH,CURPRO	;SAVE PROTAB LINK
				;FOR OVLHDR ROUTINE.
				;START GENERATING:	MOVE 0,LIT
	MOVE	CH,[XWD	ASINC+MOV,AS.MSC]
	PUSHJ	PP,PUTASN	;1ST HALF OF INSTRUCTION OUT

	PUSH	PP,EACC		;SAVE ADDRESS OF CURRENT PARAGRAPH
	MOVE	EACC,W2		;SET IT TO "A".
	PUSHJ	PP,OVLHDR	;NOW CREATE AN XWD WITH THE ADDRESS
				;IN LEFT HALF, PRIORITY #'S IN RIGHT HALF
	POP	PP,EACC		;RESTORE ADDRESS OF CURRENT PARAGRAPH

	PUSHJ	PP,PUTASY	;FINISH UP SECOND HALF OF
				;INSTRUCTION BEGUN ABOVE
				;NOW YOU HAVE:

				;MOVE 0,LIT
				;LIT: XWD ADDRESS,PRI # PRI #
				;NOW GO BACK AND GENERATE MOVEM 0,ALTER WORD
				;MOVEM 0, PARAM

	JRST	ALTFIN


EBDECL:	TRNE	W2,1B32		;C IN DECLARATIVES. A MUST BE TOO.
	TRNN	EACD,1B32	;AS WELL AS "B".
				;TEST WHERE YOU ARE FOR BEING IN DECLARATIVES.

	JRST	CWASIN		;ONE OF A OR C WAS NOT IN DECLARATIVES
	JRST	ALLDEC		;ALL IN DECLARATIVES, WHICH MUST BE IN SEGMENT 0
				;NO NEED TO CHECK FOR OVERLAY REQUIRED
CWASNT:	TRNE	W2,1B32		;C WASN'T IN DECLARATIVES, BUT
				;EITHER A OR B OR BOTH WERE. FIND OUT WHICH ONES.

	PUSHJ	PP,AWASIT
	TRNE	EACD,1B32	;OK, WAS "B" IN DECLARATIVES
	JRST	BWASIT
	POPJ	PP,

CWASIN:	TRNN	W2,1B32		;C WAS IN DECLARATIVES, BUT EITHER A OR B OR BOTH
				;WERE OUTSIDE.
	PUSHJ	PP,AWASIT	;A WAS OUTSIDE
	TRNN	EACD,1B32	;TRY B
	JRST	BWASIT
	POPJ	PP,





AWASIT:	MOVEI	EACA,-2(EACA)		;POSITION POINTER TO LOOK AT A.
	PUSHJ	PP,BWASIT		;GIVE HIM THE DIAG.
	MOVEI	EACA,+2(EACA)		;REPOSITION POINTER TO LOOK AT B.
	POPJ	PP,

BWASIT:	MOVEI	DW,E.185		;TRYING TO CROSS DECLARATIVES DIAGNOSTIC
	JRST	EFATAL


CKAEQB:	MOVEI	TB,(W2)			;SAVE THE ORIGINAL (W2).
	ANDI	TB,ENREZE		;STRIP ALL BUT PRIORITY BITS
	MOVEI	TC,(EACC)		;PRESERVE EACC
	ANDI	TC,ENREZE
	CAIN	TC,(TB)			;SEE STANDARDS, P-2-81, FOR RESTRICTIONS ON ALTER VERB.


	JRST	EALTOK			;GREAT! THEY ARE =
	MOVEI	DW,E.90			;ALTERING A PROCEEDURE NAME OUTSIDE
	JRST	EFATAL			;YOUR OWN SEG WHEN YOU ARE IN A 50 OR GREATER SEGMENT.
					;N*O*T*E	ALTDWN REQUIRES
					;THAT PROTAB BE UPDATED WITH THE ADDRESS LINK
					;FOR THE ALTER WORD.





ALTWDN:	CAIL	EACC,^D50B24		;ARE WE IN A 50 OR > SEG.
					;IN OTHER WORDS, DO WE HAVE TO SAVE
					;THE ALTERS?
	JRST	SAVALT			;YEP!!!


	MOVE	CH,[XWD	AS.XWD,1]	;XWD HEADER 
	PUSHJ	PP,PUTAS1		;ONTO AS1 FILE
	TRNE	W2,40			;OK, HEADER OUT, NOW WHAT'S IT GONNA BE,
					;ADDRESS, PRIORITY BITS <FOR OVLAY>
					;OR
					;0,ADDRESS <FOR NON-OVERLAYED GOES.


	JRST	ADDPR1			;OK, ADDRESS, PRIORITY BITS NEEDED


	MOVEI	CH,0			;LEFT HALF OF XWD _ 0
	PUSHJ	PP,PUTAS1
	PUSHJ	PP,GETADR		;GET THE ADDRESS
FINXWD:	PUSHJ	PP,PUTAS1		;WRITE THAT ADDRESS OUT
	AOS	CH,EAS1PC		;BUMP THE PPC
	MOVEI	CH,100000-1(CH)		;ADD IN TABLE TYPE AND READJUST PPC
					;TO WHAT XWD IS.
	HRLM	CH,2(EACB)		;UPDATE PROTAB ENTRY.
	JRST	ALTDEB			;TEST FOR DEBUGGING CODE
GETADR:	HRRZ	TB,3(EACB)		;GET THE FLOTAB LINK FROM PROTAB ENTRY
	ANDI	TB,77777		;STRIP OFF ALL BUT OFFSET
	JUMPE	TB,NOFLOK		;NO  FLOTAB LINK?
					;TSK! TSK?


	ADD	TB,FLOLOC		;ADD BASE ADDRESS
	HRRZ	TD,FLONXT		;TB NOW HOLDS POINTER TO FLOTAB
					;CHECK POINTER AGAINST HIGHEST LEGAL
					;FLOTAB ENTRY <(FLONXT)>
	CAIGE	TD,3(TB)		;MAKE SURE THAT THE NEXT ENTRY
					;WHICH IS THE ONE YOU WANT, HAS BEEN
					;COMPLETED, I.E., TWO WORDS ENTERED
	JRST	NOFLOK			;TSK, TSK NO CHAINING THRU FLOTAB.
	MOVE	TA,2(TB)		;GET NEXT ENTRY
	LDB	CH,LNKCOD##		;IS THE ITEM A PROTAB LINK?
	CAIE	CH,TB.PRO
	JRST	NOFLOK			;NO--ERROR
	TLNN	TA,1B23			;IS THAT SOMETHING AN OBJECT OF
	JRST	NOFLOK			;
					;GO OR GO DEPENDING?

	MOVEI	CH,ECPFLG(TA)		;LINK  CONVERTED TO F-G NOTATION.
	POPJ	PP,


					;GOTO. DEFAULT ADDRESS SINCE
					;WE CANNOT CHAIN THRU FLOTAB.
NOFLOK:	MOVE	CH,EGOTO
	POPJ	PP,




ADDPR1:	PUSHJ	PP,GETADR		;XWD ADDRESS, PRIORITY BITS REQUIRED.
	PUSHJ	PP,PUTAS1		;WRITE IT OUT
	CAMN	CH,EGOTO		;SEE IF GOTO. IS ADDRESS,
					;THERE IS NO PROTAB ENTRY FOR HIM
	PUSHJ	PP,GOTOSG		;EVADE GOING TO LNKSET WITH
					;GOTO. AS A LINK.
					;LOAD UP WITH CURRENT PARA'S
					;PRIORITY BITS IN CH.
					;GOTO. IN TA.

					;WITH GOTO. AS LINK.
	PUSHJ	PP,GETBIT		;SHIFT BITS INTO CORRECT POSITIONS.
	JRST	FINXWD
SAVALT:	TRNE	W2,40			;ALL ALTERS WITHIN THE CURRENT SEG?
	JRST	ADDPR0			;NOPE! _


	MOVEI	TB,0

	PUSHJ	PP,PUTALT		;XWD 0,ADDRESS
					;ALL ENTRIES IN ALTAB ARE
					;XWD'S, SO HEADER DOESN'T NEED TO BE
					;SUPPLIED UNTIL YOU ARE BEGINNING
					;TO DUMP THE TABLE.

	PUSHJ	PP,GETADR
					;RESOLVE ADDRESS BY CHAINING THRU FLOTAB.
WRPALT:	MOVE	TB,CH
	PUSHJ	PP,INCALT		;INTO ALTAB + BUMP PPC.



	MOVEI	CH,700000-1(CH)
	HRLM	CH,2(EACB)		;UPDATE PROTAB
	JRST	ALTDEB			;TEST FOR DEBUGGING CODE

ADDPR0:	PUSHJ	PP,GETADR
	MOVE	TB,CH
	PUSHJ	PP,PUTALT	;GET ADDRESS AND PUT IT IN LEFT HALF OF XWD
	CAMN	CH,EGOTO	;AVOID GIVING GOTO. TO A SUBROUTINE AS A VIABLE LINK
	PUSHJ	PP,GOTOSG	;GOTO. IS IN THE RES SEG.
				;EACD = DESTINATION PRIORITY BITS = RES
	PUSHJ	PP,GETBIT	;RIGHT HALF HAS PRI #S IN IT.

	JRST	WRPALT		;FINISH UP////

GOTOSG:	MOVEI	CH,AS.CNB
	MOVEI	TC,(W2)		;SAVE (W2) PLEASE!!
	ANDI	TC,ENREZE	;STRIP OFF ALL BUT PRIORITY BITS
	LSH	TC,-^D2		;ALIGN POINT ORIGIN  PRIORITY < BITS>
	TLO	CH,(TC)
	POP	PP,TE		;PREPARE TO TAKE THE SKIP EXIT BACK
	JRST	1(TE)		;BACK + 1 WE GOT
SUBTTL THE GO GENERATOR

GOGOGN:	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;IF NO OPERANDS,
	JRST	EXTGO		;  MUST BE 'GO TO.'
	HRRZ	TE,EOPLOC	;THERE ARE OPERANDS, THERE MUST
	CAIE	TE,-2(EACA)	;  BE ONLY ONE
	JRST	BADEOP		;SOMETHING IS WRONG

	SETZM	GODPOV##	;[V10] MAKE SURE THE SPECIAL GO
				;[V10]  DEPENDING FLAG IS OFF.
	SETZM	USEXJR##	;DON'T USE "XJRST"
	PUSHJ	PP,GODBTS	;SEE IF DEBUGGING INFO NEEDED

;[V10] GO DEPENDING ENTERS HERE FOR EACH PROCEDURE-NAME.

GOGO1:	PUSHJ	PP,RESOLV	;RESOLVE (IF NECESSARY, PROTAB-FLOTAB ENTRY).
	HRRM	TA,(EACA)	;UPDATE EOPTAB

	TLNE	W1,1B27		;IS THIS A SPECIAL GO; ONE CREATED BY
				;THE SYNTAX SCANNER TO CONNECT THE
				;SEGMENTS TOGETHER

	JRST	GOCKIT		;"SPECIAL" GO FOUND

RESUME:	MOVEI	CH,(TA)		;CHANGE
	ANDI	CH,TM.PRO	;  ADDRESS CODE TO
	IORI	CH,AS.PRO	;  ASSEMBLY NOTATION
	PUSHJ	PP,LNKSET	;CONVERT LINK TO REAL ADDRESS
	MOVE	EACD,2(TA)	;GET FLAGS FOR OBJECT OF GO



				;CHECK FOR BONA FIDE OPERAND.
	ISOPOK	EACD;

	LDB	EACC,FLAGPP	;GET FLAGS FROM EPPARA

	TRNE	EACD,1B32	;CHECK TO SEE IF DESTINATION IS IN DECLARATIVES.
	JRST	GODDEC		;GO HAS DESINATION IN DECLARATIVES, ALL
				;IS NOT LOST YET FOR THE GUY. HE MAY BE
				;O.K. IF SOURCE IS IN DECLARATIVES.

	TRNE	EACC,1B32	;O.K., NOW CHECK FOR SOURCE IN DECLARATIVES
				;COME HERE ONLY IF 1ST TEST SHOWS DESTINATION OUT OF
				;DECLARATIVES.

	JRST	DECWRN		;YEP, SOURCE IN DECLARATIVES. THIS IS O.K.
				;ONLY IF DESTINATION IN DECLARATIVES.
DECOK:	TRNE	EACC,140	;CHECK FOR PRESENT PP'S BEING ALTERED:
				;AN ALTERED GO.


	JRST	GOALTD

				;GET EXPRESSION SET UP
GOENTR:	HRLI	CH,JRST.	;ADD IN A <JRST> TO CONVERTED LINK TO PROTAB

	ANDI	EACC,ENREZE	;STRIP OFF ALL BUT SOURCE'S PRIORITY BITS.
	ANDI	EACD,ENREZE	;STRIP OFF ALL BUT DESTINATION'S  PRIORITY BITS

	CAIN	EACD,(EACC)	;DESTINATION & SOURCE OF = PRIORITY ?
				;
	JRST	GOENT1		;DESTINATION & SOURCE =, JRST IS OK.

	HRLM	CH,CURPRO	;SAVE CH, WHICH CONTAIN PROTAB
				;POINTER, WHICH WILL BE RESOLVED TO ADDRESS
	SKIPN	GODPOV##	;[561] SKIP IF SPECIAL "GO DEPENDING"
	 JRST	GOENT0		;[561] NO

;[561] WRITE OUT THE "MOVEI" USING OPCODE "XMOVI." SO THE OPTIMIZER
;[561] DOESN'T THINK IT CAN TAMPER WITH IT.

	PUSHJ	PP,PUTASA	;[561] USE 2ND CODE SET FOR "XMOVI."
	SKIPA	CH,[XMOVI.##+AC16+ASINC,,AS.MSC] ;[561] SKIP WITH CH LOADED
GOENT0:	MOVE	CH,[OVLAY.+ASINC,,AS.MSC] ;[561] NEW LABEL

	PUSHJ	PP,PUTASY	;WRITE OUT THE CALL OR "MOVEI" TO BE XCT'D
	PUSHJ	PP,OVLHDR	;GO OFF TO OVERLAY HEADER MAKER ROUTINE.
				;WILL RETURN WITH CH LOADED WITH
				;ADDRESS REQUIRED TO FINISH OVLAY INSTRUCTION.
	JRST	PUTASN		;DBT

GOENT1:	SKIPN	USEXJR##	;SKIP IF XJRST
	 JRST	PUTASY		;NO
	HRLI	CH,XJRST.	;[561] USE "XJRST"
	PUSH	PP,CH
	PUSHJ	PP,PUTASA##
	POP	PP,CH
	JRST	PUTASY
EXTGO:	TLNE	W1,1B28			;IS HE GONNA FALL OF THE EDGE OF THE WORLD?
	JRST	EDGE			; _ YEP, SURE IS!


					; _ GO TO. IN HAND
	LDB	EACC,FLAGPP		;GET CURRENT PARAGRAPH'S PROTAB LINK
	TRNN	EACC,140		;LET'S SEE IF HE REALLY EVER DOES ALTER THIS GO.
	JRST	GOWRN			; _ HMMM! GO TO. THAT'S NEVER ALTERED!???


					;<GOTO.. REQUIRED>


	MOVEI	EACD,0			;_ SOME NON-RESIDENT
					; MUST BE ASSUMED FOR A GOTO. THAT'S NOT
					;RESOLVED. OTHERWISE, CHAINNING OF
					;THE DAMN GLOBAL WILL KILL YOU
					;SINCE THE ASSEMBLER WON'T BE ABLE TO 
					;TELL THE LOADER ABOUT THE CHAIN THAT
					;VANISHES.

	SKIPA	EACB,EGOTO		;TO SEGMENT 0/
					; ^ NOTE THAT SKIP WILL ALWAYS TAKE
					;YOU OVER THE SAVING OF THE OPERAND
					;IF THERE WAS NOT AN OPERAND
GOALTD:	MOVEI	EACB,(CH)		;IF YOU ARE COMING FROM THE OPERAND SIDE,
					;SAVE THE OPERAND!!



	TRNN	EACC,40			;OK, CHECK  ALL PLACES THAT WE MIGHT BE GOING
					;ALL PLACES IN THE SAME SEGMENT?


	SKIPA	CH,[XWD	ASINC+JRST.+1B31,AS.MSC]
					; ^ YEP. ALL OBJECTS IN SAME SEGMENT.

	MOVE	CH,[OVLAY.+ASINC,,AS.MSC]	;OVERLAY REQUIRED, MAKE ONE & UPDATE
					;1ST PART OF JRST @ OR OVLAY. OUT
					;ADDRESS PORTION COMING UP!!!
	PUSHJ	PP,PUTASY		;DBT

	HRRZ	TA,EPPARA		;GET PROTAB LINK FOR THIS PARAGRAPH
					;<THE 1 THAT'S GOT THE GO WE'RE TALKING ABOUT>.
	PUSHJ	PP,LNKSET		;CONVERT TO REAL ADDRESS
	HLRZ	CH,2(TA)		;GET THE ALTER WORD <IF ONE IS THERE>
	JUMPN	CH,PUTASN		;DBT, IF NON-ZERO, WORD ALLOCATED, SO
					;PUT IT ON ASSEMBLER INPUT FILE & BUMP PPC.


					; _ NO WORD ALLOCATED
					;ALLOCATE ONE, BUT MAKE ADDRESS
					;GOTO. IN THE EVENT THAT HE DOES NOT
					;FILL IN THE BLANK AT OBJECT TIME.


					;FINISH  UP  JRST @ WITH ADDRESS
					;OF XWD JUST PUT OUT.
					;OR... PUT OUT LAST HALF OF OVLAY. UUO
					;WITH ADDRESS OF XWD JUST PUT OUT.

	CAIL	EACC,^D50B24		;ARE WE IN A 50 OR GREATER SEG?
					;IF SO, WE HAVE TO  SAVE THE ALTERS
					;FOR THE BLT RESTORATION.
	JRST	SAVBLT			;YEP! IN 50 OR GT. SAVE ALTS/

	PUSHJ	PP,MAKXWD		;MAKE AN XWD
					;EITHER A) XWD 0,ADDRESS FOR JRST @
					;OR B) XWD ADDRESS, PRIORITY BITS
					;FOR OVERLAY.




	HRRZ	TA,EPPARA		;GET ADDRESS OF
	PUSHJ	PP,LNKSET		;  CURRENT PARAGRAPH
	HRLM	CH,2(TA)		;UPDATE PROTAB WITH ALTER-WORD ADDRESS.
	JRST	PUTASN			;DBT, FINISH UP INSTRUCTION WITH ADDRESS OF XWD
					;SINCE WE ARE NOT IN A 50 OR GREATER SEG,
					;ALL ALTER WORDS GO ON AS1.
EDGE:	PUSHJ	PP,CKEXIT		;CLEAN UP EXITS

	SKIPN	SLASHJ##		;/J ON (FORCE MAIN PROG)?
	SKIPN	SUBPRG##		;NO, /I ON (SUBPROG)?
	SKIPE	PROGST##		;MAIN PROG BUT DOES IT HAVE  START
	JRST	EDGE1			;YES, OR ITS A SUBPROG
	SETZ	CH,			;USE TAG 0
	PUSHJ	PP,PUTTAG		;DEFINE IT
	MOVEI	CH,AS.TAG		;AND TO START ADDRESS
	MOVEM	CH,PROGST

EDGE1:	MOVE	CH,[EPJPP,,KPROG.##]	;HE'S GONNA TRY TO FALL OFF
					;THE EDGE OF THE WORLD
					;INTO HIS LITERAL POOL.

	HLLZ	TA,EPPARA		;SEE IF YOU ARE IN RES/SEG
	TLNE	TA,ENREZF


	PUSHJ	PP,FXPROG		;SET FLAG IN EXTAB SHOWING REFERENCE
					;TO EXTERNAL NAME MADE FROM NON-RES


	JRST	PUTASY			;WRITE IT ON APPROPRIATE FILE AND BUMP PPC.
GOCKIT:	PUSHJ	PP,CKEXIT	;IN ANY EVENT, GENERATE EXITS AS REQUIRED.

	SKIPE	TA,EPSECT	;IF NO LAST SECTION, THEN WE CANNOT
				;BE IN THE DECLARATIVES
	TLNN	TA,1B33		;THERE WAS A LAST SECTION, SKIP IF IT WAS IN THE DECLARATIVES
				;REMEMBER, THAT EPSECT'S FLAGS SHIFTED RIGHT 1

	JRST	RESTOR		;PUSHJ TO OBJECT TIME ERROR ROUTINE NOT NEEDED.
				;THERE MUST HAVE BEEN A LAST SECTION
				;AND IT MUST HAVE BEEN IN THE DECLARATIVES, AND


				;PLACE WHERE SYNTAX ROUTINE IS SENDING
				;YOU MUST BE OUTSIDE THE DECLARATIVES.



	HRRZ	TA,(EACA)	;GET WHERE SYNTAX IS SENDING YOU
	PUSHJ	PP,LNKSET
	MOVE	TB,2(TA)

	TRNE	TB,1B32		;ITEM OUTSIDE DECLARATIVES ?

	JRST	RESTOR		;NO, YOU CAN GO BACK


	MOVE	CH,[EPJPP,,KDECL.##]	;OOOPS, HE MIGHT FALL INTO LITERALS

	HLLZ	TA,EPPARA	;SEE WHETHER OR NOT WE IN RESIDENT SECTION.
	TLNE	TA,ENREZF

	PUSHJ	PP,FXDECL	;FIXUP OF USER TO DIE WHEN
				;FALLING OUT OF DECLARATIVES
				;REQUIRED, BUT PUSHJ 17
				;MUST BE INDIRECT BECAUSE
				;EXTERNALS CANNOT BE CHAINED
				;INTO/OUT OF NON-RES SEGS.


	JRST	PUTASY
				;THE CATCHER GENERATED <NO FALLING OUT OF
				;THE DECLARATIVES>
				;RETURN
FXDECL:	SKIPA	TA,[EXP STOPR.]	;PREPARE TO UPDATE EXTAB'S NON-RES REFERENCE FLAG
FXPROG:	HRRZI	TA,KPROG.
	ANDI	TA,77777
	ADDI	TA,<CD.EXT>B20
	PUSHJ	PP,LNKSET
	MOVSI	TB,NR.EXT
	IORM	TB,1(TA)	;[425] SET IN NON-RESIDENT SECTION.

	POPJ	PP,





RESTOR:	HRRZ	TA,(EACA)	;RESTORE TA FOR MAIN LINE PROGRAM
	JRST	RESUME



GODDEC:	TRNE	EACC,1B32	;SEE IF SOURCE IS IN THE DECLARATIVES.
	JRST	DECOK		;EVERYTHING'S OK

GODBTS:	SKIPN	DBPARM##	;ANY CHANCE WE NEED TO OUTPUT DEBUG INFO?
	POPJ	PP,		;NO, NORMAL CODE
	LDB	CH,W1LN		;GET LINE#
	HRLI	CH,MOVEI.##+AC16
	PUSHJ	PP,PUTASY
	MOVE	CH,[MOVEM.+AC16+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASN
	MOVE	CH,DBPARM
	IORI	CH,AS.PAR
	JRST	PUTASY		;MOVEM 16,%PARAM+N
DECWRN:	MOVEI	DW,E.185		;VIOLATION OF DECLARATIVES BOUNDARY
	JRST	EFATAL



GOWRN:	HRRZ	TA,EPPARA		;GET THIS PP'S PROTAB LINK
	PUSHJ	PP,LNKSET		;GET REAL ADDRESS
	HRRZ	TB,3(TA)		;GET FLOTAB NTRY
	ANDI	TB,77777		;STRIP OFF ALL BUT OFFSET
	ADD	TB,FLOLOC		;NOW YOU HAVE FLOTAB ENTRY.!
	MOVEI	EACA,2(TB)		;POINT EACA SO THAT -1(EACA)
					;WILL LOOK AT LN & CP
	MOVEI	DW,E.94			;GO TO. NOT ALTERED.
	JRST	EWARN
SAVBLT:	MOVEI	W2,(TA)		;COME HERE WHEN NO
				;ALTER WORD HAS BEEN ALLOCATED FOR AN
				;ALTERED GO.

				;START BY SAVING THE ADDRESS
				;OF THE PROTAB ENTRY THAT WILL BE
				;UPDATED, SHOWING
				;THAT AN ALTER WORD HAS BEEN ALLOCATED.

	TRNE	EACC,40		;ALL ALTERS IN  THIS SEG?
	JRST	ADDPR2		;NOPE!

	MOVEI	TB,0
	PUSHJ	PP,PUTALT
	MOVE	TB,EACB		;GET SAVED ADDRESS.
FINBLT:	PUSHJ	PP,INCALT	;THE ADDRESS GOES IN RIGHT HAND
				;HALF OF XWD. INCALT BUMPS ALTAB'S PPC

	MOVEI	CH,700000-1(CH)	;RESTORE ALTAB'S PPC TO
				;WHAT IT SHOULD BE TO POINT TO
				;XWD JUST CREATED, AND ADD IN TABLE TYPE CODE.


	HRLM	CH,2(W2)	;UPDATE THAT OLD PROTAB ENTRY
				;THIS WILL ALLOW YOU TO GET
				;A HANDLE ON ALTERED GOES
	JRST	PUTASN		;DBT

ADDPR2:	MOVE	TB,EACB		;RETRIEVE SAVED ADDRESS.
	PUSHJ	PP,PUTALT	;ADDRESS IN LEFT HALF OF XWD
	HRRZ	TA,EPPARA	;HAVE TO HAVE THE PROTAB ADDRESS
	PUSHJ	PP,GTBIT1

	MOVE	TB,CH		;GET PRI BITS INTO TB FROM CH   &
	JRST	FINBLT
				;FINISH UP
EGOTO:	XWD	AS.GO,AS.MSC	;POINTS TO JRST GOTO.
SUBTTL THE "GO DEPENDING" GENERATOR

EXTERNAL SETOPN,PUTASY,PUTASN,MXAC.

GODPGN:	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	JRST	BADEOP		;NO--TROUBLE
	MOVEM	W1,OPLINE	;SAVE OPERATOR'S LN&CP

;SCAN THRU EOPTAB FROM TOP, LOOKING FOR VARIABLE

	MOVE	EACA,EOPLOC

	SETZM	GODPOV##	;[V10] CLEAR THE CALL OVERLAY FLAG.
	SETOM	USEXJR##	;MAKE SURE WE GENERATE "XJRST'S" FOR
				; GOTO'S

GODPG1:	MOVE	TE,1(EACA)	;GET FIRST WORD OF AN OPERAND
	TLNE	TE,GNLIT	;IS IT A LITERAL OR FIG. CONST.?
	JRST	GODPG2		;YES

	MOVE	TA,2(EACA)	;NO--IS IT
	LDB	TE,LNKCOD	;  A DATA-NAME?
	CAIN	TE,TB.DAT
	JRST	GODPG3		;YES

	ADD	EACA,[XWD 2,2]	;[V10] MOVE UP TO THE SECOND
				;[V10]  WORD OF THE CURRENT OPERAND.

	PUSHJ	PP,RESOLV	;[V10] GO MAKE SURE WE HAVE A
				;[V10]  PROTAB LINK.
	PUSHJ	PP,LNKSET##	;[V10] MAKE IT INTO AN ADDRESS.
	MOVE	EACD,2(TA)	;[V10] GET THE DESTINATION'S FLAGS.
	LDB	EACC,FLAGPP	;[V10] GET THE CURRENT SEGMENT'S FLAGS.
	XORI	EACD,(EACC)	;[V10] IF THE DESTINATION ISN'T
	TRNE	EACD,ENREZE	;[V10]  IN THE CURRENT SEGMENT,
	SETOM	GODPOV##	;[V10]  NOTE THAT WE HAVE TO
				;[V10]  CALL THE OVERLAY HANDLER.

	CAME	EACA,EOPNXT	;KEEP LOOKING

	JRST	GODPG1
	JRST	BADEP6
;LITERAL OR FIG. CONST. FOUND

GODPG2:	MOVEI	TC,1(EACA)	;SETUP CUREOP
	MOVEM	TC,CUREOP	;INCASE OF ERROR
	JRST	BADEP4		;NO--ERROR

;VARIABLE FOUND

GODPG3:	MOVEM	EACA,EOPNXT

	MOVEI	TC,1(EACA)
	MOVEM	TC,CUREOP
	MOVSM	TC,OPERND

	SETOM	EDEBDA##	;WE MIGHT NEED TO DEBUG ON DEPENDING VARIABLE
	SOS	EDEBDA		;BUT ONLY IF "ALL REFERENCE OFF"
	MOVEI	LN,EBASEA	;SET UP PARAMETERS FOR VARIABLE
	PUSHJ	PP,SETOPN

	HRRZ	TE,EMODEA
	CAIE	TE,FPMODE	;IS IT COMP-1?
	CAIN	TE,F2MODE	;OR COMP-2?
	JRST	BADEP7		;YES--ERROR
	TSWF	FANUM		;IS IT NUMERIC?
	SKIPE	EDPLA		;YES--DECIMAL PLACES?
	JRST	BADEP1		;BAD VARIABLE
	MOVE	TE,ESIZEA	;IS IT ONLY ONE WORD?
	CAILE	TE,^D10
	JRST	BADEP2		;NO--BAD VARIABLE
;MOVE 'DEPENDING' ITEM INTO AC3

	PUSH	PP,EDEBDA	;DON'T WANT DEBUGGING CODE ON MOVE
	SETZM	EDEBDA
	MOVEI	TE,3
	MOVEM	TE,EAC
	PUSHJ	PP,MXAC.
	POP	PP,EDEBDA	;PUT BACK DEBUGGING INFO

;HOW MANY NAMES?

GODPG5:	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY PROCEDURE NAMES?
	JRST	BADEOP		;NO--TROUBLE

	HRRZ	TC,EACA		;COMPUTE NUMBER OF NAMES
	MOVE	TD,EOPLOC
	SUBI	TC,0(TD)
	LSH	TC,-1

	CAILE	TC,77777	;IN-BOUNDS?
	JRST	BADEOP		;NO--TROUBLE

	SKIPE	GODPOV##	;[V10] IF WE HAVE TO WORRY
	JRST	GODPD		;[V10]  ABOUT SEGMENTS, GO ON.

	PUSHJ	PP,GODBTS	;SEE IF DEBUGGING ON PROCEDURES INFO NEEDED
	SKIPE	EDEBDA		;IF DEBUGGING ON "A"
	JRST	[PUSHJ PP,PUTASA	; WE NEED TO SAVE ACC 3
		MOVE	CH,[PUSH.+AC17,,3]
		PUSHJ	PP,PUTASY	;USE STACK
		PUSHJ	PP,GDEBA##	;GENERATE DEBUGGING INFO ON DEPENDING VARIABLE
		PUSHJ	PP,PUTASA	;NOW RESTORE ACC 3
		MOVE	CH,[POP.##+AC17,,3]
		PUSHJ	PP,PUTASY
		JRST	.+2]
	PUSHJ	PP,GDEBA##	;GENERATE DEBUGGING INFO ON DEPENDING VARIABLE
;GENERATE:	CAIG	3,N
;		JUMPG	3,.+1(3)
;		JRST	%TAG (.+N+1)	;[561]
;WHERE "N" IS THE NUMBER OF PROCEDURE NAMES

	MOVSI	CH,CAIG.+AC3
	HRR	CH,TC
	PUSHJ	PP,PUTASY

	MOVE	CH,[XWD JUMPG.+AC3+ASINC+3,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZI	CH,AS.DOT+1
	PUSHJ	PP,PUTASN

;[561]	PUSHJ	PP,PUTASA##
;[561]	MOVE	CH,[XWD XJRST.+ASINC,AS.MSC]
;[561]	PUSHJ	PP,PUTASY
;[561]	MOVEI	CH,AS.DOT+1(TC)
;[561]	PUSHJ	PP,PUTASN
;
	PUSHJ	PP,GETTAG	;[561] GET A TAG FOR TARGET OF JRST
	PUSH	PP,CH		;[561] SAVE ON PUSHDOWN STACK
	HRLI	CH,JRST.	;[561] FINISH INSTRUCTION -- "JRST %TAG"
	PUSHJ	PP,GOENT1	;[561] PUT OUT JRST OR XJRST
	HRRZ	TA,CH		;[561] NOW REFERENCE THE TAG
	PUSHJ	PP,REFTAG	;[561] SO THE OPTIMIZER WILL WORK

;NOW PUT OUT ALL THE GO'S

GODPG6:	;[V10] COME BACK HERE AFTER WORRYING ABOUT SEGMENTS.

	MOVE	EACA,EOPLOC

GODPG7:	ADD	EACA,[XWD 2,2]	;BUMP TO NEXT ENTRY
	PUSHJ	PP,GOGO1

	CAME	EACA,EOPNXT	;DONE?
	JRST	GODPG7		;NO--LOOP

	SETZM	GODPOV##	;[V10] MAKE SURE THE WORRY ABOUT
				;[V10]  SEGMENTS FLAG IS OFF.

	POP	PP,CH		;[561] GET TAG TO PUT OUT
	PJRST	PUTTAG		;[561] OUTPUT IT AND RETURN
;[V10] COME HERE ON A GO DEPENDING WHEN THE DESTINATION ISN'T IN THE
;[V10] CURRENT SEGMENT.

;[V10]	(TC) = N, THE NUMBER OF DESTINATIONS

;[V10] GENERATE:	JUMPLE	3,	%TAG (.+5+N) ;[561]
;[V10]	 		CAILE	3,	N
;[V10]	 		JRST		%TAG (.+3+N)
;[V10]	 		XCT		.+1(3)
;[V10]	 		PUSHJ	17,	OVRLAY.

GODPD:	PUSHJ	PP,	GETTAG		;[561] GET A TAG TO JUMP TO
	PUSH	PP,	CH		;[561] SAVE IT ON STACK

;[V10] GENERATE THE "JUMPLE 3,%TAG"
	HRLI	CH,	JMPLE.##+AC3	;[561]
	PUSHJ	PP,	PUTASY		;[V10]

;[V10] GENERATE THE "CAILE 3,N"
	MOVSI	CH,	CAILE.##+AC3	;[V10]
	HRRI	CH,	(TC)		;[V10]
	PUSHJ	PP,	PUTASY		;[V10]

;[V10] GENERATE THE "JRST %TAG"
	HRRZ	CH,	(PP)		;[561] GET TAG (ON TOP OF STACK)
	HRLI	CH,	JRST.##		;[561]
	PUSHJ	PP,	PUTASY		;[V10]

;[561]  REFERENCE THE TAG TWICE
	HRRZ	TA,	(PP)		;[561]
	PUSHJ	PP,	REFTAG		;[561]
	HRRZ	TA,	(PP)		;[561]
	PUSHJ	PP,	REFTAG		;[561]

;[V10] GENERATE THE "XCT .+1(3)"
	MOVE	CH,	[XWD	XCT.##+ASINC+3,AS.MSC]	;[V10]
	PUSHJ	PP,	PUTASY		;[V10]
	MOVEI	CH,	AS.DOT+1	;[V10]
	PUSHJ	PP,	PUTASN		;[V10]

;[V10] GENERATE THE "PUSHJ 17,OVLAY."
	MOVEI	CH,	OVLAY%##	;[V10]
	PUSHJ	PP,	GNPSX.##	;[V10]
;[V10] NOW WE HAVE TO PUT OUT EITHER "JRST <PROCEDURE-NAME>", IF
;[V10]  THE DESTINATION IS IN THE SAME SECTION WE ARE CURRENTLY IN
;[V10]  OR "MOVE 16,[XWD <PROCEDURE-NAME>,<PRIORITY>]", IF IT ISN'T,
;[V10]  FOR ALL <PROCEDURE-NAMES> GIVEN.

	JRST		GODPG6		;[V10] GO BACK TO THE OLD
					;[V10]  CODE.  THE SUBROUTINE
					;[V10]  GOGO1 WAS HACKED SO
					;[V10]  THAT IT WOULD PRODUCE
					;[V10]  THE CORRECT CODE WHEN
					;[V10]  GODPOV WAS NON-ZERO.
;ERRORS

;VARIABLE ISN'T NUMERIC, OR HAS DECIMAL PLACES

BADEP1:	PUSHJ	PP,BADDP
	JRST	BADEP3

;VARIABLE IS TOO LARGE

BADEP2:	PUSHJ	PP,BADSIZ

BADEP3:	MOVSI	CH,MOVEI.+AC3	;GENERATE <MOVEI 3,0> SO WE CAN GO ON
	PUSHJ	PP,PUTASY
	JRST	GODPG5

;A FIGURATIVE CONSTANT, BUT NOT TALLY.

BADEP4:	MOVEI	DW,E.184
	PUSHJ	PP,OPNFAT

BADEP5:	MOVEM	EACA,EOPNXT
	JRST	BADEP3

;COULDN'T FIND A LITERAL NOR A DATA NAME

BADEP6:	OUTSTR	[ASCIZ "No variable for GODEP
"]
	JRST	BADEP5

;COMP-1 WHEN IT SHOULDN'T BE

BADEP7:	PUSHJ	PP,BADFP
	JRST	BADEP3

AC3==3B30	;AC USED BY GODEP

EXTERNAL ESIZEA,EBASEA,EDPLA
EXTERNAL EOPLOC,EOPNXT,CUREOP,OPERND,AS.DOT,EAC,TB.DAT
EXTERNAL CAIG.,MOVEI.,JUMPG.,JRST.
SUBTTL GENERATOR SERVICE ROUTINES






				;THE VALTAB TO LITAB XFER SUBROUTINE:
				;TRANSFERS ASCII FROM VALTAB TO LITAB
				;AND SUPPLIES LITAB WITH A HEADER WORD
				;ENTRY.

				;ONLY GOOD FOR ASCII!

				;EACA IS EXPECTED TO CONTAIN A POINTER
				;TO A WORD WHICH, IN TURN, POINTS TO A
				;RELATIVE ADDRESS IN VALTAB. THE ENTRY IN
				;VALTAB CONTAINS IN BITS 0-5 [OF THE 1ST WORD]
				;THE NUMBER OF CHARACTERS IN THE ASCII STRING.
				;REFER TO COBOL MEMO 100-350-11.01, PAGE
				;20 FOR FURTHER DESCRIPTION OF WORD LAYOUT
				;IN VALTAB AND BIT ASSIGNMENTS.



				;CALL:
				;[PUSHJ	PP,EVALIT]
				;TA IS EXPECTED TO POINT TO THE ORIGIN'S
				;[REAL ! ADDRESS!!] 1ST ENTRY.
				;THIS ENTRY IS EXPECTED TO HAVE A CHARACTQR
				;COUNT IN THE 1ST ASCII CHARACTER!
				;
				;
				;THE SUBROUTINE CAN BE EXPECTED TO CLOBBER:
				;EACA _ WHICH RETURNS WITH THE # OF WORDS PUT IN AS.LIT
				;EACB
				;EACC
				;EACD
				;
				;TA - TE
				;EACC AND EACD ARE EXPECTED TO BE CONTIGUOUS,
				;I.E., EACC MUST BE 1 LESS THAN EACD,
				;MODULO 20 OCTAL.
				;PUT A WORD FROM TB
				;INTO LITAB
				;AND KEEP LITNXT & TA
				;CORRECTLY POINTING TO
				;WHERE THEY SHOULD
				;
				;TA WILL BE = LITNXT UPON EXITING.
				;CALL IS [PUSHJ	PP,PUTLIT]
				;




INCALT:	AOSA	CH,EALTPC	;BUMP PPC
	PUSHJ	PP,XPNALT	;EXPAND THE ALTER TABLE
PUTALT:	MOVE	TA,ALTNXT
	AOBJP	TA,.-2
	MOVEM	TB,(TA)
	MOVEM	TA,ALTNXT
	POPJ	PP,



LINUM:	POINT	13,-1(EACA),28	;13 BITS LONG STOPPING AT BIT #28


				;DW IS EXPECTED TO CONTAIN THE APPROPRIATE
				;DECIMAL DIAGNOSTIC NUMBER UPON ARRIVING HERE.
EWARN:	LDB	LN,LINUM	;ALSO, W1 IS EXPECTED TO
				;CONTAIN THE OPERAND'S LN & CP.
	HRRZ	CP,-1(EACA)	;GET CHARACTER POSITION
	JRST	WARN		;PUT OUT DIAG & RETURN


EFATAL:	LDB	LN,LINUM	;LIKEWISE FOR FATAL DIAGNOSTIC
	HRRZ	CP,-1(EACA)
	JRST	FATAL		;PUT OUT DIAG & RETURN
				;ALLOCATE A WORD FOR EXIT ROUTINE.
				;
				;USES ACCUMULATORS
				;TC
				;TD
				;TE

				;TA IS EXPECTED TO POINT AT APPLICABLE PROTAB
				;ENTRY UPON ENTERING SUBROUTINE

				;CH IS EXPECTED TO RETURN WITH THE
				;PHASE F EAS1PC + TYPE CODE LINK IN IT.


EOCT1:	XWD	6B20!ASCOCT,000001
EALLOC:	MOVE	CH,EOCT1	;ASSEMBLER OCTAL INFORMATION
	PUSHJ	PP,PUTAS1
	MOVEI	CH,0		;THE 1 WORD OF OCTAL RADIX = 0.
	PUSHJ	PP,PUTAS1
	AOS	CH,EAS1PC	;BUMP PPC
	MOVEI	CH,100000-1(CH)	;LEAVE TYPE CODE + PPC BEFORE BUMPING
				;IN CH
	HRLM	CH,3(TA)	;UP-DATE PROTAB.


	POPJ	PP,		;---------------> RETURN
;WRITE LITAB ONTO CURRENT ASYFIL

EBURPL:	SKIPG	LITBLK		;ANYTHING ON LITFIL?
	JRST	EBRP10		;NO

	HRRZ	TE,LITNXT	;YES--COMPUTE HOW
	HRRZ	TD,LITLOC	;  MANY WORDS
	SUB	TD,TE		;  STILL IN LITAB
	JUMPE	TD,EBRPL1	;IF NONE--NO NEED TO WRITE

	MOVM	TE,TD		;INCREMENT LITBLK
	ADDM	TE,LITBLK
	MOVSS	TD		;BUILD
	HRR	TD,LITLOC	;  IOWD LIST FOR
	SETZ	TC,		;  OUTPUT
IFE TOPS20,<
	OUT	LIT,TD		;WRITE OUT REST OF TABLE
	  JRST	EBRPL1		;OK
	MOVEI	CH,LITDEV	;ERROR--KILL
	JRST	DEVDED
>
IFN TOPS20,<
	DMOVEM	TD,IOWLIT##	;STORE IOWD
	PUSHJ	PP,RITLIT##	;OUTPUT IT
>

EBRPL1:
IFE TOPS20,<
	CLOSE	LIT,
	MOVE	TE,LITHDR	;CREATE
	HLLZ	TD,LITHDR+1	;  LOOKUP
	SETZB	TC,TB		;  PARAMETERS
	LOOKUP	LIT,TE		;OPEN FOR INPUT
	  JRST	EBRP11		;CANNOT FIND IT--MONITOR TROUBLE
>
IFN TOPS20,<
	PUSHJ	PP,CLSLIT##	;CLOSE IT
	PUSHJ	PP,SETLIT##	;SET UP LITFIL TO READ BACK IN DUMP MODE
>

	SETZM	EWORDB		;CLEAR COUNT OF WORDS IN TABLE
	MOVE	TE,LITLOC	;RESET LITNXT
	MOVEM	TE,LITNXT

	PUSHJ	PP,EBRPL2	;[167] GO GET LITERAL FROM LITFIL
;WRITE LITAB ONTO ASYFIL (CONT'D)

EBRPL3:	HRRZ	EACC,LITLOC	;START AT TOP OF TABLE
	JRST	EBRPLA		;[167] GO GET LITERALL

EBRPL4:	SOSG	EWORDB		;[167] SEE IF MORE LITERAL IN CORE.
	PUSHJ	PP,EBMOR	;[167] NO READ IN MORE FROM LITFIL

EBRPLA:	HRRZ	TE,1(EACC)	;[167] GET CODE AND SIZE
	LSH	TE,6		;SEPARATE CODE
	HLLM	TE,1(EACC)	;STORE IN LHS WHERE EXPECTED
	MOVEI	TE,770000
	ANDCAM	TE,1(EACC)	;CLEAR CODE FROM COUNT SIDE
	HLRZ	TE,1(EACC)	;GET LITAB CODE
	CAILE	TE,MAXLIT##	;IF ILLEGAL,
	JRST	EBRPLX		;  TROUBLE

	HRRZ	EACB,1(EACC)	;GET GROUP SIZE

	MOVE	TE,EWORDB	;IS ENTIRE GROUP IN CORE?
	CAIL	TE,1(EACB)
	JRST	EBRPL6		;YES
	CAIG	TE,1000		;[167] NOT ALL OF LITERAL IN CORE. IS THERE A MINIMAL AMOUNT?
	PUSHJ	PP,EBMOR	;[167] GET READ MORE


EBRPL6:	HLRZ	TE,1(EACC)	;[167] GET CODE BACK
	XCT	BRPTAB(TE)	;EXECUTE SOME ROUTINE
	HRRI	CH,(EACB)	;IT WASN'T BYTE OR XWD--GET SIZE
	PUSHJ	PP,PUTASN	;WRITE OUT HEADER WORD

EBRPL7:	SOSG	TE,EWORDB	;[167] SEE IF MORE IN CORE
	PUSHJ	PP,EBMORA	;[210] NO READ IN MORE
	MOVE	CH,2(EACC)	;WRITE OUT DATA WORD
	PUSHJ	PP,PUTASY
	ADDI	EACC,1		;BUMP LOCATION
	SOJG	EACB,EBRPL7	;LOOP UNTIL DONE
	AOJA	EACC,EBRPL4	;BUMP LOCATION AND LOOP

EBRPL9:	POP	PP,(PP)		;[167] POP OFF CALL TO EBMOR
	MOVE	TE,LITLOC	;RESET LITNXT
	MOVEM	TE,LITNXT
EBRPLE:	POPJ	PP,
;WRITE LITAB ONTO ASYFIL (CONT'D)

EBRPLX:	OUTSTR	[ASCIZ "?Bad LITAB code--compiler error
"]
	SKIPL	LITBLK
	SETZM	LITBLK
	JRST	EBRPL9

;NOTHING WAS WRITTEN ON LITFIL

EBRP10:	MOVE	TE,LITNXT
	SUB	TE,LITLOC
	JUMPE	TE,EBRPLE
	HRRZM	TE,EWORDB
	JRST	EBRPL3

IFE TOPS20,<
;CANNOT FIND LITFIL

EBRP11:	OUTSTR	[ASCIZ "?Cannot find LITFIL--compiler error
"]
	JRST	KILL
>


;[167]	READ MORE LITERALS FROM THE LITFIL
;[167]	CODE EBRPL5 AND EBRPL2 MADE INTO A SUBROUTINE HERE
;[167]	INSERTED AT EBRP11+2

EBMORA:	SKIPG	LITBLK		;[210] ANYMORE ON LITFIL
	JRST	EBRPL9		;[210] NO QUIT
	PUSHJ	PP,EBMOR	;[210] READ IN MORE
	JRST	EBMORC		;[210] FINISH UP
EBMORB:	SKIPG	LITBLK		;[210] ANY MORE ON LITFIL?
	JRST	EBRPL9		;[210] NO QUIT
	AOS	EWORDB		;[210] KEEP ANY WORDS NOT USED
	PUSHJ	PP,EBMOR	;[210] GET MORE
	SOS	EWORDB		;[210] FIX UP WORD COUNT
EBMORC:	SOS	EACC		;[210] FIX LITTAB POINTER
	POPJ	PP,		;[210] RETURN
EBMOR:	SKIPG	TE,EWORDB	;[167] MAKE SURE WE DONT GO NEGATIVE
	SETZB	TE,EWORDB	;[167] SET NEGATIVE TO ZERO
	HLRE	TD,LITLOC	;RESET THE NUMBER OF WORDS LEFT FOR
	ADD	TD,TE		; LITNXT.
	HRLM	TD,LITNXT
	HRRZ	TD,LITLOC	;[167] NO-- WAS BRPPL5
	ADDI	TD,1		;MOVE UP
	HRLI	TD,1(EACC)	;  UNUSED
	ADD	TE,LITLOC	;  WORDS
	CAME	TE,LITLOC
	BLT	TD,0(TE)	;[210]

	HRRM	TE,LITNXT	;RESET LITNXT
	SKIPG	LITBLK		;ANYTHING LEFT IN FILE?
	JRST	EBRPL9		;NO--QUIT
EBRPL2:	MOVE	TE,LITBLK	;GET NUMBER OF WORDS IN FILE
	CAILE	TE,1600		;IF MORE THAN ^D768,
	MOVEI	TE,1600		;  USE ^D768
	ADDM	TE,EWORDB	;INCREMENT TABLE COUNT

EBRP12:	HLRE	TD,LITNXT	;WILL LITFIL READ IN OVER TAGTAB?
	ADDI	TD,(TE)		;  (THE TABLE AFTER LITTAB)
	JUMPLE	TD,EBRP13	;NO
	PUSHJ	PP,XPNLIT	;YES, EXPAND LITTAB
	JRST	EBRP12

EBRP13:	MOVNS	TE		;DECREMENT
	ADDM	TE,LITBLK	;  FILE WORD COUNT

	MOVSS	TE		;CREATE
	HRR	TE,LITNXT	;  IOWD LIST
	SETZ	TD,		;  FOR INPUT
IFE TOPS20,<
	IN	LIT,TE		;READ SOME WORDS
	  JRST	EBRP1A		;OK
	MOVEI	CH,LITDEV	;ERROR--KILL
	POP	PP,(PP)		;[167] REMOVE CALL
	JRST	DEVDED
>
IFN TOPS20,<
	DMOVEM	TE,IOWLIT	;STORE IOWD
	PUSHJ	PP,GETLIT##	;READ IT
>

EBRP1A:	HRRZ	EACC,LITLOC	;[167] GET LITTAB START
	POPJ	PP,		;[167] RETURN
;WRITE LITAB ONTO ASYFIL (CONT'D)

BRPTAB:	JRST	EBRPLX		;0 --ERROR
	JRST	BRPXWD		;1 --XWD
	JRST	BRPBYT		;2 --BYTE POINTER
	MOVSI	CH,6B20!ASCASC	;3 --ASCII
	MOVSI	CH,6B20!ASCSIX	;4 --SIXBIT
	MOVSI	CH,6B20!ASCD1	;5 --ONE-WORD DECIMAL
	MOVSI	CH,6B20!ASCD2	;6 --TWO-WORD DECIMAL
	MOVSI	CH,6B20!ASCFLT	;7 --FLOATING POINT
	MOVSI	CH,6B20!ASCOCT	;10--OCTAL
	MOVSI	CH,6B20!ASCEBC	;11--EBCDIC
	AOJA	EACC,BRPXTN	;12--EXTEND OPCODE
	MOVSI	CH,6B20!ASCF2	;[762] 13--D. P. FLOATING POINT

;ITEM IS AN XWD

BRPXWD:	LSH	EACB,-1		;HALVE THE COUNT
	MOVEI	CH,(EACB)	;BUILD A HEADER WORD
	HRLI	CH,5B20
	PUSHJ	PP,PUTASN	;WRITE IT OUT

BRPX1:	SOS	EWORDB		;[167] COUNT DOWN TWO WORDS
	SOSG	TE,EWORDB	;[167]  AND SEE IF ANY LITERALS IN CORE
	PUSHJ	PP,EBMORB	;[210] TABLE EMPTY READ IN MORE
	MOVE	CH,2(EACC)	;GET LEFT-HALF INFO
	PUSHJ	PP,PUTASN	;WRITE IT OUT
	MOVE	CH,3(EACC)	;GET RIGHT-HALF INFO
	PUSHJ	PP,PUTASY	;WRITE IT OUT

	ADDI	EACC,2		;BUMP TO NEXT DATUM
	SOJG	EACB,BRPX1	;LOOP IF MORE DATA FOR THIS ITEM

	AOJA	EACC,EBRPL4	;LOOP BACK TO GET NEXT ITEM


;ITEM IS A BYTE POINTER.

BRPBYT:	LSH	EACB,-1		;HALVE THE COUNT

BRPB1:	SOS	EWORDB		;[167] COUNT DOWN TWO WORDS
	SOSG	TE,EWORDB	;[167]  AND SEE IF ANY LITERALS IN CORE
	PUSHJ	PP,EBMORB	;[210] TABLE EMPTY READ IN MORE
	MOVSI	CH,4B20		;BUILD HEADER WORD
	HRR	CH,2(EACC)
	LDB	TE,[POINT 3,CH,20] ;GET TYPE OF ADDRESS
	CAIN	TE,AC.EXT##	;EXTERNAL?
	 JRST	[PUSHJ PP,PUT.EX	 ;YES, CHECK FOR NON-RES
		JRST .+2]
	PUSHJ	PP,PUTASY	;NORMAL ADDRESS PART--WRITE THAT OUT
	MOVE	CH,3(EACC)	;GET INCREMENT WORD
	PUSHJ	PP,PUTASN	;WRITE THAT OUT
	ADDI	EACC,2		;BUMP TO NEXT DATUM
	SOJG	EACB,BRPB1	;LOOP IF MORE DATA FOR THIS ITEM
	AOJA	EACC,EBRPL4	;LOOP TO GET NEXT ITEM
;ITEM IS AN EXTEND [OPCODE]

BRPXTN:	PUSHJ	PP,PUTASA	;THEY ARE IN OTHER OPCODE SET
	SOSG	EWORDB		;ONLY ONE WORD?
	PUSHJ	PP,EBMORB	;TABLE EMPTY READ IN MORE
	MOVSI	CH,ZOP.##	;GET BASE OPCODE
	ADD	CH,1(EACC)	;GET WHICH EXTEND
	LDB	TE,[POINT 3,CH,20]	;GET CODE
	PUSHJ	PP,[CAIE TE,AC.EXT##	;EXTERNAL
		AOJA	EACC,PUTASY	;NO
		TLNN	CH,(@)		;YES, INDIRECT SIGN ON?
		AOJA	EACC,PUT.EX	;NO
		AOJA	EACC,PUT.SX]	;YES
BRPXT1:	SOJLE	EACB,EBRPL4	;ONLY ONE WORD
	SOSG	TE,EWORDB	;SEE IF TABLE EMPTY
	PUSHJ	PP,EBMORB	;YES, FILL IT
	MOVE	CH,1(EACC)	;GET NEXT
	PUSHJ	PP,PUTASN
	AOJA	EACC,BRPXT1	;LOOP
;PUT AN ENTRY INTO SECTAB

	PUSHJ	PP,XPNSEC
PUTSEC:	MOVE	TA,SECNXT
	AOBJP	TA,.-2
	MOVEM	TB,(TA)
	MOVEM	TA,SECNXT
	POPJ	PP,


;UPDATE SECTAB, BURP OUT LITAB AND ALTAB

SEGCLN:	PUSHJ	PP,CKEXIT	;CHECK FOR EXITS REQUIRING GENERATION
	TSWF	FAS3		;ARE WE IN A NON-RESIDENT SEGMENT?
	SKIPA	TB,EAS3PC	;YES--USE EAS3PC
	MOVE	TB,EAS2PC	;NO--USE EAS2PC
	MOVSI	TB,(TB)		;LH _ RH
	PUSHJ	PP,PUTSEC	;STASH THAT IN SECTAB

	MOVEI	TB,0
	PUSHJ	PP,PUTSEC	;MAKE ROOM FOR 2ND ENTRY
				;IF REQUIRED. IF NOT NEEDED, 2ND
				;ENTRY WILL BE 0'S.///


	SETOM	LITASY##	;FLAG FOR UUO CONVERSION - LITTAB TO ASY

				;PUT OUT A RELOC OPERATOR & DUMP LITAB (IF NECESSARY)
	SKIPN	W2,ELITPC	;ANYTHING IN LITAB?
	JRST	ETSTAL		;NOTHING IN LITAB, CHECK ALTERS.

	MOVE	CH,[XWD	AS.REL+1,AS.MSC]	;RELOC OPERATOR OUT
	PUSHJ	PP,PUTASN	;WRITE IT OUT
	MOVEI	CH,AS.LIT	;ADD TO BASE OF LITERALS FLAG + 0.




	PUSHJ	PP,PUTASN	;WRITE IT OUT
;SPILL CONTENTS OF LITAB TO ASYFIL

	PUSHJ	PP,EBURPL

ETSTAL:	SKIPE	W2,EALTPC	;IF PPC IS 0, NO DUMPING
	PUSHJ	PP,EBPALT	;BURP OUT ALTER FOR > 50.

	TSWT	FAS3		;ARE WE IN A NON-RESIDENT SEGMENT?
	JRST	ETSTA1		;NO
	MOVE	TA,EAS3PC	;YES--IF BIGGER
	CAMLE	TA,HILOC	;	THAN LAST ONE,
	MOVEM	TA,HILOC	;	RESET PROGRAM BREAK

ETSTA1:	JUMPE	EACA,EBURPX	;IF END OF PROG--NO CHECKS
	HRRZ	TA,(EACA)	;GET OPERAND'S FLAGS
				;IN THE CASE OF THE CALL FROM ERAPUP,
				;THIS MAY BE A DUMMY CREATED BY SELF.
	PUSHJ	PP,LNKSET
	HRRZ	TA,2(TA)	;THERE, GOT THE PRIORITY # FOR NEXT GUY <OR DUMMY>
	CAIL	TA,^D1B24	;GOING TO RES ?
	SWON	FAS3		; _ NOPE, SET "IN NON-RES FLAG.
				; _ YEP, INITIAL CASE = SET TO
				;RESIDENT, SO CONTINUE THINKING YOU ARE
				;IN RESIDENT UNTIL YOU SEE NON-RES.
				;FROM THE 1ST TIME YOU SEE NON-RES,
				;ALL SUBSEQUENT SEGS WILL BE NON-RES.
	TSWF	FAS3		;ANY NON-RESIDENTS SEEN?
IFN TOPS20,<
	SKIPE	SEGFLG		;YES, FIRST TIME?
	JRST	EBURPX		;NO
>
	SETOM	SEGFLG		;YES--SET INDICATOR FOR PHASE G

;CLEAR SOME WORK AREA

EBURPX:	SETZB	TB,EZEROL
	SETZM	ELITPC		;CLEAR LIT'S PPC.
	SETZM	EALTPC		;AND ALT'S PPC.
	SETZM	LITASY##	;CLEAR LITTAB TO ASY FLAG
	MOVE	TE,[XWD EZEROL,EZEROL+1]
	BLT	TE,EZEROH

	JRST	POOLINI##	;RESET LITERAL POOLER AND RETURN
EBPALT:	HRRZ	EACB,EAS3PC		;SAVE EAS3 PC
	HRLI	EACB,(W2)		;SAVE EALT PC TOO.

	MOVSI	CH,5B20			;XWD HEADER
	HRRI	CH,(W2)			;WITH TYPE  CODE  AND # 2-WORD ENTRIES.
	PUSHJ	PP,PUTASN		;ONTO WRITE-LOCKED AS2 OR AS3.
	SKIPA	TA,ALTLOC		;ENTER DUMP
MORALT:	MOVEI	TA,2(TA)		;GET NEXT GUY & CONTINUE

	MOVE	CH,1(TA)		;1ST WORD
	PUSHJ	PP,PUTASN		;= LEFT HALF OF XWD
	MOVE	CH,2(TA)		;
	PUSHJ	PP,PUTASY		;2ND WORD = RIGHT HALF OF XWD
	SOJG	W2,MORALT		;MORE?  YES ^; NO FALLS THRU


					;NOPE _

;ALTAB HAS BEEN DUMPED, RESET IT TO ITS INITIAL VALUE SO THAT IF
; SUBSEQUENT SECTIONS CONTAIN ALTERS, THEY WILL BE DUMPED.

	MOVE	TA,ALTLOC##
	MOVEM	TA,ALTNXT##

					;UPDATE 2ND WORD IN SECTAB NOW!
					;SECNXT POINTS TO WORD YOU ARE GOING
					;TO UPDATE:
	HRRZ	TA,SECNXT		;GET POINTER

	MOVEM	EACB,(TA)		;SECTAB ENTRY FOR THIS SEG COMPLETED!
					;NOW SEE WHO IS LARGER,
	HLRZ	EACB,EACB		;EALTPC FOR THIS SEG?
	CAMLE	EACB,EALTMX		;OR BIGGEST SEEN TO DATE?
	HRRZM	EACB,EALTMX		;PRESENT ONE BECOMES CONTENDER.
	POPJ	PP,			;EVERTYTHING TAKEN CARE OF, RETURN.
					;ALTERS WERE BURPED OUT
CKEXIT:	SKIPGE	W2,EPPARA	;CLEAN UP PRESENT PARAGRAPH
				;FIRST: CHECK FOR PREVIOUS PARAGRAPH'S REQUIRING EXIT.
	PUSHJ	PP,SETUPP	;SET UP FOR GENERATING PARAGRAPH'S EXIT
	SKIPGE	W2,EPSECT	;SECOND: DO SAME FOR SECTION LAST SEEN
	PUSHJ	PP,SETUPS	;SET UP FOR GENERATING SECTION'S EXIT
	POPJ	PP,		;---------------> RETURN






SETUPP:	MOVEI	EACC,EPPARA	;SET POINTER TO INFORMATION ABOUT PREVIOUS PARAGRAPH
	JRST	EXITRP		;GO GENERATE THE EXIT


SETUPS:	MOVEI	EACC,EPSECT
	JRST	EXITRP
MAKXWD:	MOVE	CH,[XWD	AS.XWD,1]		;BUILD UP 1ST 3 WORDS OF AN XWD
	PUSHJ	PP,PUTAS1
	TRNE	EACC,40			;ARE ALL ALTERS IN THIS SEG?
	JRST	ADDBIT			;NOPE! <NOT ALL OF DESTINATIONS IN THIS SEG>.

	MOVEI	CH,0
	PUSHJ	PP,PUTAS1		;AND WRITE OUT THE LEFT HALF
	MOVE	CH,EACB			;ADDRESS FOR JRST @ ALTERED GO
					;GOES IN RIGHT HALF OF XWD
ENDXWD:	PUSHJ	PP,PUTAS1		;XWD & THERE IS 1 OF ME
					;LEFT HALD IS 0

	AOS	CH,EAS1PC
	MOVEI	CH,100000-1(CH)		;BUMP PPC FOR THE WHOLE WORD TO BE PUT OUT
					;RESTORE PPC COUNT TO PRIOR SETTING & GET F-G
					;TABLE INTO CH

	POPJ	PP,			;--------------- RETURN


ADDBIT:	MOVE	CH,EACB			;ADDRESS FOR THIS GUY GOES IN LEFT HALF
	PUSHJ	PP,PUTAS1
	CAMN	CH,EGOTO		;WHETHER IT'S EGOTO

	PUSHJ	PP,GOTOSG
	PUSHJ	PP,GETBIT		;PRIORITY BITS INTO RIGHT HALF
	JRST	ENDXWD			;FINISH UP THE OVLAY. XWD
SOLVER:	SKIPA	TA,-2(EACA)	;GET PROCEEDING LINK [NEXT EARLIER ONE ENTERED]
RESOLV:	MOVE	TA,(EACA)	;GET LINK AS POINTED TO BY EACA IN EOPTAB.
	TLNN	TA,EUNREZ	;IS THIS A FLOTAB ENTRY WHICH NEEDS TO BE RESOLVED
				;INTO A PROTAB ENTRY ?
	JRST	ITISOK		;IT'S OK, THAT IS, IT'S ALREADY A PROTAB ENTRY.
	ANDI	TA,77777		;GET JUST THE OFFSET BITS
	ADD	TA,FLOLOC	;ADD TO RELATIVE OFFSET, THE STARTING TABLE ADDRESS
				;HELD IN FLOLOC.
	LDB	TE,FL.TAG##
	HRRZ	TA,(TA)		;GET WHERE YOU ARE POINTED.
	JUMPN	TE,CPOPJ	;If its a TAGTAB entry, exit
ITISOK:	MOVEI	TA,(TA)		;INSURE LEFT HALF OF TA CLEAR
	CAIL	TA,400001	;NOW THAT YOU HAVE RESOLVED ENTRY, IS IT
				;REALLY A PROTAB ENTRY /
				;BETWEEN 400001 AND 500000 IS IT ?
	CAIL	TA,500000
	POP	PP,TE
	POPJ	PP,		;THE POP IS THE ERROR CONDITION, WHICH
				;WILL THEN POPJ YOU TO CALLING ROUTINE.
OVLHDR:	MOVE	TA,[XWD XWDLIT,2];HEADER FOR XWD
	PUSHJ	PP,STASHP	;OUT ON FILE AS2, OR 3

	HLRZ	TA,CURPRO	;ADDRESS INTO LEFT HALF OF
				;THE XWD YOU ARE BUILDING.

	PUSHJ	PP,STASHQ
				;INTO THE RIGHT HALF OF XWD YOU ARE BUILDING:
	MOVEI	TA,ENREZE	;MASK FOR ALL BUT PRIORITY BITS
	ANDI	TA,(EACD)	;NOW THE PRIORITY BITS FOR   THE DESTINATION.
				; PRI BITS/ PRI BITS,AS.CNB
				;= WORD OUT
	LSH	TA,^D7		;MAKING ROOM FOR THE
	MOVEI	TC,(EACC)	;SAVE OLD EACC 1ST THOUGH!!!!
	ANDI	TC,ENREZE	;STRIP OFF ALL BUT PRITOITY BITS
	LSH	TC,-^D2		;SHIFTED
	TLO	TA,(TC)		;SOURCE PRIORITY BITS INTO TB, RIGHT[TEST] HALF.
	HRRI	TA,AS.CNB	;CONSTANT INCREMENT TYPE CODE

	PUSHJ	PP,POOLIT	;PUT OUT LAST WORD
	SKIPN	CH,PLITPC
	AOSA	CH,ELITPC	;BUMP PC
	TROA	CH,AS.LIT
	MOVEI	CH,AS.LIT-1(CH)	;ADD IN TYPE CODE & READJUST PPC COUNT TO LOOK
				;AT WORD JUST OUTPUT, NOT NEXT WORD.
	POPJ	PP,
GETBIT:	MOVEI	TA,-ECPFLG(CH)		;RESTORE LINK TO E NOTATION.

GTBIT1:	PUSHJ	PP,LNKSET
	HRRZ	CH,2(TA)		;GET PRIORITY BITS


	ANDI	CH,ENREZE
	LSH	CH,^D7			;POSITION SEG # BITS.
	MOVEI	TC,(EACC)		;SAVE OLD EACC!!
	ANDI	TC,ENREZE		;INSURE THAT NO MORE BITS THAN
					;THE PRIORITY BITS GET INTO XWD.
	LSH	TC,-^D2
	TLO	CH,(TC)			;SEG PRIORITY BITS IN LEFT
					;HALF, AS.CNB INTO RIGHT HALF.
	HRRI	CH,AS.CNB
	POPJ	PP,
	ENREZF=774B27		;THE NON-RESIDENT MASK USED
				;TO DISCERN A RESIDENT PROCEDURE NAME
				;[ENREZF = ALL 0] FROM A NON-RESIDENT ONE.
				;THE CODE KEY KEPT IN EPPARA AND EPSECT
				;IS SLIGHTLY DIFFERENT FROM THE FORMAT
				;AS IT IS STORED IN PROTAB...
				;THE PRIORITY # IS SHIFTED RIGHT 1.
				;... SEE PARGEN FOR FURTHER DESCRIPTION.

	ENREZE=774B26		;MASK FOR PRIORITY # [AS ABOVE] BUT SHIFTED 1
				;TO THE LEFT. PRIORITY # & FLAGS 
				;LINE UP WITH PROTAB ENTRY..

	EUNREZ=1B20		;UNRESOLVED 1ST PASS OPERAND FLAG

FLAGPP:	POINT 18,EPPARA,18	;ALL OF EPPARA'S FLAGS SHIFTED LEFT 1 BIT
				;SO THAT THEY ARE IN SYNC WITH FLAGS IN PROTAB.
FLAGPS:	POINT 18,EPSECT,18	;DITTO FOR SECTION FLAGS


EXTERNAL FPMODE,F2MODE,PTFLAG,CURPRO,EWORDB,LNKCOD,TM.TAG
EXTERNAL ALTLOC,ALTNXT,EALTMX,EALTPC
EXTERNAL EAS1PC,EAS2PC,EAS3PC,EZEROH,EZEROL
EXTERNAL LITLOC,LITNXT,SECNXT,FLOLOC,FLONXT
EXTERNAL OVLAY.
EXTERNAL MOVSI.,JRST.,MOVEI.,MOVEM.,EPJPP
EXTERNAL ELITPC,EPPARA,EPSECT,XWDLIT,AS.XWD,TB.PRO,HILOC,SEGFLG
EXTERNAL LITBLK
EXTERNAL AS.CNB,AS.GO,AS.MSC,AS.TAG,AS.LIT,AS.REL,AS.PRO
EXTERNAL TM.PRO
IFN TOPS20,<
EXTERNAL LITDEV,LITHDR
>

	END