Google
 

Trailing-Edge - PDP-10 Archives - cobol12c - ifgen.mac
There are 22 other files named ifgen.mac in the archive. Click here to see a list.
; UPD ID= 3515 on 5/5/81 at 4:06 PM by NIXON                            
TITLE	IFGEN FOR COBOL V12C
SUBTTL	CODE GENERATORS FOR ALL "IF" OPERATORS	AL BLACKINGTON/CAM



	SEARCH	COPYRT
	SALL

;COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1974, 1985
;ALL RIGHTS RESERVED.
;
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH LICENSE.

	SEARCH	P
	%%P==:%%P
	DBMS==:DBMS

	IFN TOPS20,< SEARCH MONSYM,MACSYM>
	IFE TOPS20,< SEARCH MACTEN,UUOSYM>

;EDITS
;NAME	DATE		COMMENTS

;[1457] IF SET-NAME SET GENERATED LITERAL CONTAINS GARBAGE
;[1416] 68274 Generate warning if size of literal and data item not the same.
;[1404] If LITTAB is expanded, update byte pointer to literal.
;[1374] Check coll. seq. when generating high-values
;[1353] If literal generated by call to LITD. too large, FERROR set to force 
;		exit
;[1351] STORE READ .. INTO OPERANDS IN A FIXED LOCATION - AVOID LINK FAILURES
;[1317] FIX COBOL-74 COMPARE NUMERIC TO NON-NUMERIC ITEMS

;V12B****************

;[1067] FIX COBOL-74 COMPARE NUMERIC TO NON-NUMERIC ITEMS
;[1060] FIX IF DATA-ITEM = ZEROES FOR FIELD GREATER THAN 2040 CHARACTERS
;[1057] GIVE ERROR ON ILLEGAL USE OF ALL IN NUMERIC COMPARISONS.
;[1040] FIX NON-BIS CASE OF EDIT 1034; "IF ..NOT SPACES" DIDN'T WORK
;[1037] FIX ?ASSEMBLY ERRORS WHEN DEP. VAR. ON "READ..INTO" AND COMP ITEM
;[1034] MAKE IF = ZERO TEST GENERATE INLINE CODE, FIXES LARGE RECORD PROBLEM.
;[1027] BUILD RECORD NAME TABLE IF NESTED READS
;[1004] MAKE ASCII & EBCDIC COLLATING SEQUENCES WORK.

;V12A****************

;[720] FIX COBOL-74 COMPARE TO SPACES WITH PROGRAM COLLATING SEQUENCE
;[717] FIX IF A NOT = SPACES FOR A ALPHANUMERIC AND LONGER THAN 2040 CHARACTERS
;[630] FIX EDIT 562 FOR NON-BIS CASE
;[611] FIX IF DBMS-STATEMENT TO GENERATE CORRECT CODE (THIS WAS IN BWR FILE)
;[605] STORE DEPENDING ITEM AFTER READ OF VARIABLE LENGTH RECORD

;V12*****************

;[600] ADJUST D.P. OF "A" IN ACCS IF LESS THAN D.P. OF "B"
;[562] FIX SIXBIT 6 CHAR FIG-CON COMPARE WHEN SIGN GETS IN THE WAY
;[550] FIX IF SUBSCRIPTED ITEM IS ALPHABETIC
;[547] FIX EXAMINE REPLACING HIGH-VALUES BY
;[544] FIX HIGH-VALUES COMPARES FOR SIXBIT VARIABLES
;[542] FIX NUMERIC COMPARE OF FIELD WITH DECIMAL PLACES WITH EXPRESSION
;	WITH NO DECIMAL PLACES

;V10*****************

;[473] FIX COMPARE OF NON-NUMERICS OF UNEQUAL LENGTH
;[445] TEST FOR ERRORS AFTER RETURN FROM SETED
;[444] GIVE WARNING WHEN MAXIMUM COMPARE LENGTH FOR IF STATEMENT IS EXCEEDED
;[441] FOR NONNUMERIC TEST OF ZEROES OF FORM 'IF A OP ZERO' USE CHAR COMPARE
;[437] FIX DBMS IF STATEMENTS INCASE OF LITTAB TABLE OVERFLOWS
;********************
;[436] FIX DBMS IF STATEMENTS IN SEGMENTED SECTIONS
;[426] FIX ZERO TESTING.
;[413] HANDLE NEGATIVE EXPRESSIONS IN IF STATEMENTS

;[374] /JEC	FLAG ERROR WHEN SIXBIT LITERAL HAS A NON-SIXBIT CHAR IN IT
;[372] /JEC	MAKE SURE %PARAM IS PUT INTO AS1 FILE FOR DBMS IF STATEMENTS
;[322] FIX "IF CONDITION" SO THAT AN ERROR IN PREVIOUS STATMENT DOES NOT CAUSE A COMPILER ERROR MESSAGE
;[217] /ACK	FIX FATAL DIAG PRODUCED IN A VALID PROGRAM.
;[174] FIXES D.P. COMPARES WITH ZERO FOR >, AND NOT <
;[170-A] FIXES EDIT 170
;[170] FIXES COMPARES OF NON-NUMERIC ITEMS OF FORM
;	IF A(I) = B(J)  OR IF A(I) = C; WHERE AN ITEM
;	OF A IS SMALLER THAN B (OR C).
;[154] FIXES DOUBLE PRECISION COMPARES AND ALSO SIGN PROBLEMS.

TWOSEG
	.COPYRIGHT		;Put COPYRIGHT statement in .REL file.

RELOC	400000
SALL

	ENTRY ENDIFG	;"ENDIF" OPERATOR
	ENTRY SPIFGN	;"SPIF" OPERATOR
	ENTRY IFCGEN	;"IFC" OPERATOR
	ENTRY IFTGEN	;"IFT" OPERATOR
	ENTRY IFGEN	;"IF" OPERATOR
	ENTRY IFUGEN	;"IF" OPERATOR IN PERFORM VARYING UNTIL CASE
	ENTRY ELSEGN	;"ELSE" OPERATOR
	ENTRY IFGNZC	;ENTRY POINT FOR RPWGEN & SEARCH
	ENTRY IFPOS	;ENTRY POINT FOR SEARCH
IFN DBMS,<ENTRY IFDBGN>	;"IFDB" OPERATOR
	INTERN	IFZROS	;VALUES OF ZERO CHARACTER IN SIXBIT, ASCII, AND EBCDIC
	INTERN	IFSPCS	;VALUE OF SPACE CHARACTER IN SIXBIT, ASCII, AND EBCDIC


EXTERNAL COMEBK,MOVGN.,PUTASN,PUTASY,SETOPN,B1PAR,B2PAR,SUBSCA
EXTERN	STASHI,STASHL,STASHP,STASHQ,POOL,POOLIT,PLITPC
EXTERN	MBYTPA,MBYTPB,CPOPJ1,CPOPJ
EXTERNAL LNKSET,GETTAG,KILLF,WARN,FATAL,PUTEMP,CCXFP.,CCXF2.,MSFP%L,MSF2%L,PUSEOP
EXTERNAL BMPEOP,PUTTAG,CONVNL,NEGATL,MAKEL,MAKEL2,GETEMP
EXTERNAL FORCX0,MBYTEA,BADEOP,OPNFAT,JOUT,NOTNUM,NOTDAT
EXTERNAL PUT.A,PUT.AA,PUT.B,PUT.BA,PUT.L,PUT.LA,PUT.LB,PUT.LC,PUT.LD
EXTERNAL PUT.P,PUT.PA,PUT.PC,PUT.XA,PUT.XB
EXTERNAL M1CAC.,M2CAC.,MDAC.,CC1C2.,CCXFP.,ADJDP.,ADJSL.,SWAPAB
EXTERNAL M.IA,M.IB,MXAC.,MXFPA.,LITD.,LITN.,LITN.A,SCANL
EXTERNAL FPLOV.
EXTERNAL SUBSCR,SUBSCA,SUBSCB,SUBSCC,SUBSCD
;"IF" GENERATOR


IFUGEN:
IFN ANS74,<
	SETOM	INPERF##	;SIGNAL WE ARE IN PERFORM CONTROL
>

IFGEN:	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANYTHING IN EOPTAB?
	POPJ	PP,		;NO--WE MUST HAVE HAD A YECCH
IFN ANS74,<
	MOVE	TC,OPLINE	;SAVE W1 (LN & CP) OF PREVIOUS OPERATOR
	MOVEM	TC,EXPLNC##	;FOR FIPS FLAGGER
>
	MOVEM	W1,OPLINE
	PUSHJ	PP,IFGENZ

IFDONE:	HRRZ	TC,EOPLOC	;RESET EACA SUCH THAT THERE IS ONE OPERAND
	ADDI	TC,1
	MOVEM	TC,CUREOP
	PUSHJ	PP,BMPEOP
	  JFCL

	MOVE	EACA,CUREOP
	SUB	EACA,EOPLOC
	HRLS	EACA
	ADD	EACA,EOPLOC

	MOVEM	EACA,EOPNXT
IFN ANS74,<
	MOVE	TC,CURXSQ	;COPY CURRENT SEQ #
	MOVEM	TC,LSTXSQ	;TO LAST FOR FIPS FLAGGER
>
	JRST	COMEBK
;"IFT" GENERATOR
IFTGEN:	SETZM	TAGTRU
	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	POPJ	PP,		;NO--MUST HAVE HAD A YECCH

	MOVEM	W1,OPLINE	;SAVE LN&CP OF OPERATOR
	PUSHJ	PP,IFTGNZ	;GENERATE CODE
	JRST	IFDONE		;GO HOME


IFTGNZ:	SWOFF	FEOFF1		;TURN OFF MOST FLAGS
	PUSHJ	PP,MAK1OP	;INSURE THAT THERE IS ONLY ONE OPERAND
	TSWF	FERROR;
	JRST	BADEOP

	MOVE	TC,CUREOP
	MOVSM	TC,OPERND

	MOVE	TE,1(TC)	;IS OPERAND %TEMP OR AC'S?
	TLNN	TE,GNNOTD
	JRST	IFTGNY
	HRRZ	TE,0(TC)	;YES--IS IT AC'S?
	CAIG	TE,17
	SWON	FAINAC		;YES--SET FLAG
	JRST	IFTGNX

IFTGNY:	LDB	TE,[POINT 3,1(TC),20]
IFN ANS68,<
	CAIN	TE,TB.DAT
	JRST	IFTGNX
	LDB	TE,[POINT 1,(TC),9]	;CHECK FOR TALLY.
	JUMPE	TE,NOTDAT	;NEITHER DATAB NOR TALLY - ERROR.
>
IFN ANS74,<
	CAIE	TE,TB.DAT
	JRST	NOTDAT		;NOT DATAB - ERROR
>

IFTGNX:	MOVEI	LN,EBASEA
	PUSHJ	PP,SETED

	MOVEI	TA,BADIFT
	TLNE	W1,1B27
	MOVEI	TA,IFNUM
	TLNE	W1,1B28
	MOVEI	TA,IFALF
	TLNE	W1,1B29
	MOVEI	TA,IFPOS
	TLNE	W1,1B30
	MOVEI	TA,IFNEG
	TLNE	W1,1B31
	MOVEI	TA,IFZERO

	TLZ	W1,CONCMP
	TLO	W1,EQUALF
	TLON	W1,GOFALS
	TLC	W1,NOTF

	JRST	@TA
;"IFC" GENERATOR

IFCGEN:	MOVEM	W1,OPLINE
	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	JRST	IFCSW7		;NO--MUST BE "IF SWITCH"

	SWOFF	FEOFF1		; [322] TURN OFF ALL ERROR INDICATORS
	MOVE	CH,[XWD 2,2]	;MAKE THIS LOOK LIKE EXPRESSION
	PUSHJ	PP,PUSEOP
	SETZM	TAGTRU
	PUSHJ	PP,MAK1OP
	TSWF	FERROR;
	JRST	BADEOP

	LDB	TE,[POINT 3,-1(EACA),20]
	CAIN	TE,TB.MNE
	JRST	IFCSW

	TLON	W1,GOFALS	;GO IF FALSE?
	TLC	W1,NOTF		;NO--COMPLEMENT "NOT"
	TLNN	W1,NOTF		;"NOT"?
	JRST	IFCGNF		;NO
	HLRZM	W2,ECTRUE	;YES--SET "TRUE" TAG
	SETZM	ECFALS		;CLEAR "FALSE" TAG
	JRST	IFCGNA

IFCGNF:	HLRZM	W2,ECFALS	;SET UP TAG FOR "FALSE"
	SETZM	ECTRUE

IFCGNA:	SETZM	ECXTRA		;TURN OFF "EXTRA TAG NEEDED"
	TLZ	W1,CONCMP	;CLEAR CONDITION FLAGS
	MOVEM	W1,OPLINE

	MOVEI	TC,ECNAME
	MOVEM	TC,OPERND

	SWOFF	FEOFF1		;CLEAR MOST FLAGS

	MOVE	TC,EOPLOC	;CONVERT COND. NAME LINK TO TABLE ADDRESS
	ADDI	TC,1

	MOVE	TA,TC		;SET UP DUMMY "B"
	TLZ	TA,-4
	TLO	TA,1B18
	MOVEM	TA,ECNAME

	MOVE	TA,1(TC)
	PUSHJ	PP,LNKSET

	MOVE	TE,1(TA)	;GET LITERAL COUNT
	HRRZM	TE,CONCTR
	SKIPN	CONCTR		;ANY THERE?
	POPJ	PP,		;NO--MUST HAVE HAD TROUBLE--QUIT

	HLRM	TE,1(TC)	;RESET "A" TO BE DATA-NAME

	MOVEM	TC,CUREOP
	ROT	TE,3
	ANDI	TE,7
	CAIE	TE,TB.DAT
	JRST	NOTDAT

	MOVEI	TE,2(TA)	;CREATE A BYTE POINTER TO CONTAB ENTRIES
	HRLI	TE,442200
	MOVEM	TE,ECNBP

	HRRZ	CH,CUREOP	;GET PTR TO DATA OPERAND
	HRRZ	TA,1(CH)
	PUSHJ	PP,LNKSET
	LDB	TB,DA.LKS##	;IS IT IN LINKAGE SECTION?
	SKIPE	TB		;NO
	MOVSI	TB,(LKSFLG)	;YES, SET GENFIL FLAG
	IORM	TB,(CH)
;"IFC" GENERATOR  (CONT'D).

;THIS IS THE START OF THE MAIN LOOP

IFCGN1:	SWOFF	FAINAC		;CLEAR "A IN AC'S" FLAG
	HRRZ	TC,EOPLOC
	ADDI	TC,1
	MOVEM	TC,CUREOP
	HRLM	TC,OPERND

	MOVEI	LN,EBASEA	;SET UP "A" PARAMETERS
	PUSHJ	PP,SETED

	ILDB	TA,ECNBP	;IS IT A RANGE?
	TRNE	TA,CRANGE
	JRST	IFCG10		;YES
;"IFC" GENERATOR  (CONT'D)

;NOT A RANGE

	PUSHJ	PP,SETUPB
	MOVE	W1,OPLINE

	IBP	ECNBP		;BUMP BYTE POINTER

	SOSG	CONCTR		;IS THIS THE LAST VALUE?
	JRST	IFCGN4		;YES

	TLZ	W1,NOTF		;YES--SHUT OFF "NOT"
	TLO	W1,LESSF!GREATF	;SET "NOT EQUAL"
	PUSHJ	PP,GETTRU	;TRUE IF EQUAL
	JRST	IFCGN6

IFCGN4:	TLZE	W1,NOTF		;"NOT"?
	JRST	IFCGN5		;YES

	TLO	W1,EQUALF	;SET "EQUAL"
	PUSHJ	PP,GETFLS	;FALSE IF NOT EQUAL
	JRST	IFCGN6

IFCGN5:	TLO	W1,LESSF!GREATF	;SET "NOT EQUAL"
	PUSHJ	PP,GETTRU	;TRUE IF EQUAL

IFCGN6:	PUSHJ	PP,GOTOIF
	SKIPE	CONCTR
	JRST	IFCGN1

	SKIPE	CH,ECXTRA
	PUSHJ	PP,PUTTAG
	POPJ	PP,
;"IFC" GENERATOR  (CONT'D).

;A RANGE

IFCG10:	PUSHJ	PP,SETUPB
	MOVE	W1,OPLINE
	TLZ	W1,NOTF		;TURN OFF "NOT" FOR NOW

	SOSLE	CONCTR##
	JRST	IFCG20

;THE LAST RANGE IN THE VALUE CLAUSE

;FIRST COMPARISON
;  <	FALSE
;  >	FALL THRU
;  =	FALL THRU

	PUSHJ	PP,GETFLS
	TLO	W1,GREATF!EQUALF
	PUSHJ	PP,GOTOIF

;SECOND COMPARISON

;	NOTF OFF	NOTF ON

;  <	FALL THRU	TRUE
;  >	FALSE		FALL THRU
;  =	FALL THRU	TRUE

	SWOFF	FAINAC		;CLEAR "A IN AC'S" FLAG
	HRRZ	TC,EOPLOC
	ADDI	TC,1
	MOVEI	LN,EBASEA
	PUSHJ	PP,SETED

	ILDB	TA,ECNBP
	PUSHJ	PP,SETUPB

	MOVE	TC,CUREOP	;SET LEFT HALF OF OPERAND PTR
	HRLM	TC,OPERND	;  FOR SUBSCR SO LINKAGE FLAG HANDLED RIGHT

	MOVE	W1,OPLINE
	TLZN	W1,NOTF
	JRST	IFCG13

	PUSHJ	PP,GETTRU
	TLO	W1,GREATF
	JRST	IFCGN6

IFCG13:	TLO	W1,LESSF!EQUALF
	PUSHJ	PP,GETFLS
	JRST	IFCGN6
;"IFC" GENERATOR  (CONT'D).

;A RANGE (CONT'D)

;ALL RANGE COMPARISONS EXCEPT THE LAST IN VALUE CLAUSE

;FIRST COMPARISON
;  <	NEXT COND'N
;  >	FALL THRU
;  =	FALL THRU

IFCG20:	TLO	W1,GREATF!EQUALF
	PUSHJ	PP,GETTAG
	MOVEM	CH,ECSTEP
	PUSHJ	PP,GOTOIF

;SECOND COMPARISON
;  <	TRUE
;  >	FALL THRU
;  =	TRUE

	SWOFF	FAINAC		;CLEAR "A IN AC'S" FLAG
	PUSHJ	PP,GETTRU

	HRRZ	TC,EOPLOC
	ADDI	TC,1
	MOVEI	LN,EBASEA
	PUSHJ	PP,SETED
	ILDB	TA,ECNBP
	PUSHJ	PP,SETUPB

	MOVE	TC,CUREOP	;[217]
	HRLM	TC,OPERND	;[217]

	MOVE	W1,OPLINE
	PUSHJ	PP,GETTRU
	TLZ	W1,NOTF
	TLO	W1,GREATF
	PUSHJ	PP,GOTOIF

	MOVE	CH,ECSTEP
	PUSHJ	PP,PUTTAG

	JRST	IFCGN1
;"IFC" GENERATOR  (CONT'D).

;CALL THE "IF" ROUTINE FROM "IFC"

GOTOIF:	HRRZ	TA,EBASEA	; IF ONE OF THE OPERANDS IS A TAG, UPDATE REF
				;COUNT SINCE A COMPARISON WILL REFERENCE THE TAG
	TRC	TA,AS.TAG##
	TRNN	TA,700000	;SKIP IF NOT AS.TAG+N
	PUSHJ	PP,REFTAG##
	HRRZ	TA,EBASEB
	TRC	TA,AS.TAG
	TRNN	TA,700000	;SAME FOR "B"
	PUSHJ	PP,REFTAG##
	MOVS	W2,CH		;SET UP FALSE PATH
	TSWT	FAINAC		;IS "A" IN THE AC'S?
	JRST	IFGNZC		;NO
	JRST	IFGN0		;YES

;GET A TAG FOR THE TRUE PATH

GETTRU:	SKIPN	CH,ECTRUE
	PUSHJ	PP,IFCTAG
	MOVEM	CH,ECTRUE
	POPJ	PP,

;GET A TAG FOR THE FALSE PATH

GETFLS:	SKIPN	CH,ECFALS
	PUSHJ	PP,IFCTAG
	MOVEM	CH,ECFALS
	POPJ	PP,

;GET A TAG FOR EITHER THE TRUE OR THE FALSE PATH

IFCTAG:	SKIPN	CH,ECXTRA
	PUSHJ	PP,GETTAG
	MOVEM	CH,ECXTRA
	POPJ	PP,
;"IFC" GENERATOR  (CONT'D).

;SET UP "B" OPERAND

SETUPB:	TRNN	TA,CNFIGC	;FIG. CONST.?
	JRST	SETUB1		;NO

	LDB	TE,[POINT 5,TA,25]	;PICK UP FLAGS FOR FIG. CONST.
	DPB	TE,[POINT 5,ECNAME,14]	;STASH THEM AWAY

	MOVSI	TE,GNLIT!GNFIGC!1B18
	IORM	TE,ECNAME
	SETZM	ECNAME+1
	MOVEI	TC,ECNAME
	MOVEI	LN,EBASEB
	JRST	SETOPN

SETUB1:	MOVE	TE,[XWD EBASEA,EBASEB]
	BLT	TE,EBASBX

	TSWF	FASIGN;
	SWONS	FBSIGN;
	SWOFF	FBSIGN;

	TSWF	FANUM;
	SWONS	FBNUM;
	SWOFF	FBNUM;

	SWOFF	FBSUB;


	ANDI	TA,77777
	IORI	TA,AS.TAG
	HRLI	TA,^D36
	MOVEM	TA,EBASEB
	SETZM	EINCRB

	POPJ	PP,
;"IFC" GENERATOR  (CONT'D).

;GENERATE A CONDITIONAL FOR HARDWARE SWITCHES

IFCSW:	HRRZ	TA,-1(EACA)	;GET "ON" OR "OFF"
	PUSHJ	PP,LNKSET
	MOVE	TE,1(TA)
	JUMPL	TE,IFCSW0
	LDB	TE,MNESF
	DPB	TE,W1SF
	TLNN	W1,SWITCH
	JRST	NOTSWC

IFCSW0:	LDB	TC,SWNUM	;PICK UP SWITCH NUMBER FROM MNETAB

IFCSWA:	TLNN	W1,SWCHON	;"ON" TEST?
	TLC	W1,NOTF		;NO--COMPLEMENT "NOT"
	TLNN	W1,GOFALS	;"GO IF FALSE"?
	TLC	W1,NOTF		;NO--COMPLEMENT "NOT"

IFN ANS68,<
	MOVE	CH,CALLSW	;GENERATE <CALLI 0,20>
	PUSHJ	PP,PUTASY

	MOVNS	TC		;SET
	MOVSI	TD,1B18		;	APPROPRIATE
	LSH	TD,0(TC)	;	BIT

	TLNN	TD,-1		;LEFT-HALF?
	JRST	IFCSW1
	HLRZS	TD		;YES--PUT IT IN RIGHT HALF
	TDCA	TC,TC		;USE "TLNX"
IFCSW1:	MOVEI	TC,1		;USE "TRNX"

	TLNN	W1,NOTF		;IS IT "NOT"
	SKIPA	CH,IFCSWT(TC)	;NO--USE TXNN"
	MOVS	CH,IFCSWT(TC)	;YES--USE "TXNE"

	HRRI	CH,AS.CNB
	PUSHJ	PP,PUTASY
	MOVE	CH,TD
	PUSHJ	PP,PUTASN
>
IFN ANS74,<
	MOVSI	CH,MOVEI.+AC16
	HRR	CH,TC		;GENERATE <MOVEI 16,SWITCH>
	PUSHJ	PP,PUTASY
	MOVEI	CH,SWT.ON##
	TLNE	W1,NOTF		;SEE IF SWITCH SHOULD BE OFF OR ON
	MOVEI	CH,SWT.OF##
	PUSHJ	PP,PUT.PJ	;GENERATE <PUSHJ 17,SWT.ON/SWT.OF>
>

	JRST	JFALSE		;PUT OUT <JRST FALSE> AND RETURN

IFN ANS68,<
IFCSWT:	XWD	TLNN.+ASINC,TLNE.+ASINC
	XWD	TRNN.+ASINC,TRNE.+ASINC
>

NOTSWC:	MOVEI	DW,E.290
	JRST	OPNFAT

;GENERATE CODE FOR "IF SWITCH (N)"

IFCSW7:	TLNN	W1,SWITCH		;IS EITHER SWITCH FLAG ON?
	JRST	BADEOP		;NO-TROUBLE

	LDB	TC,[POINT 6,W1,35]	;GET SWITCH NUMBER
	JRST	IFCSWA
;GENERATE CODE FOR "IF".

IFGENZ:	SETZM	TAGTRU
	LDB	TE,CONDIT	;INSURE VALIDITY OF FLAGS
	JUMPE	TE,BADIF
	CAIN	TE,7
	JRST	BADIF

	SWOFF	FEOFF1		;TURN OFF MOST FLAGS
	PUSHJ	PP,MAK2OP	;INSURE RIGHT NUMBER OF OPERANDS
	TSWF	FERROR		;ANY ERROR?
	JRST	BADEOP		;YES

	TLZE	W1,NOTF		;"NOT"?
	TLC	W1,CONCMP	;YES--COMPLEMENT CONDITION
	TLNN	W1,GOFALS	;IS TAG FOR "FALSE"?
	TLC	W1,CONCMP	;NO--COMPLEMENT CONDITION

	MOVE	TC,CUREOP	;SET UP FIRST OPERAND
	MOVSM	TC,OPERND
	MOVEI	LN,EBASEA
	PUSHJ	PP,SETED
	TSWF	FERROR		;ANY ERRORS YET?
	POPJ	PP,		;YES--QUIT

	PUSHJ	PP,BMPEOP	;SET UP SECOND OPERAND
	  JRST	BADEOP		;NO MORE-- WE LOSE
	AOS	TC,CUREOP
	HRRM	TC,OPERND
	MOVEI	LN,EBASEB
	PUSHJ	PP,SETED

	TSWF	FERROR		;[445] ERRORS?
	POPJ	PP,		;[445] YES--QUIT

IFN ANS74,<
	PUSHJ	PP,CDEBAB##	;STORE "A" AND "B" OPERANDS
	PUSHJ	PP,GDEBV##	;OUTPUT THEM PLUS ALL PREVIOUS EXPRESSIONS
	SETZM	INPERF		;CLEAR CONTROL FLAG NOW
>
	HRRZ	TE,OPERND	;IS "B" THE AC'S?
	MOVE	TD,1(TE)
	HRRZ	TE,0(TE)
	TLNE	TD,GNNOTD
	CAILE	TE,17
	JRST	IFGNZA		;NO
	PUSHJ	PP,SWAPIT	;YES--SWAP OPERANDS
	JRST	IFGNZB

IFGNZA:	HLRZ	TE,OPERND	;IS "A" THE AC'S?
	MOVE	TD,1(TE)
	HRRZ	TE,0(TE)
	TLNE	TD,GNNOTD
	CAILE	TE,17
	JRST	IFGNZC		;NO
IFGNZB:	SWON	FAINAC!FASIGN	;YES--SET "'A' IS AC'S"
	SWOFF	FASUB;
	HRROM	TE,IFEAC##	;SAVE "A" ACC TO UNDO "B" DAMAGE
	JRST	IFGNZD
;"IF" GENERATOR (CONT'D).

IFGNZC:	SETZM	EAC		;SET AC'S TO BE 0&1

	HRRZ	TA,EMODEA	;IS "A" A LITERAL?
	CAIN	TA,LTMODE
	JRST	IFGN1		;YES
	CAIN	TA,FCMODE	;FIG. CONST.?
	JRST	IFGN3		;YES

IFGNZD:	HRRZ	TB,EMODEB	;IS "B" A LITERAL?
	CAIN	TB,LTMODE
	JRST	IFGN2		;YES
	CAIN	TB,FCMODE	;FIG. CONST.?
	JRST	IFGN3E		;YES

;NEITHER OPERAND IS A LITERAL NOR A FIG. CONST.

	TSWT	FAINAC		;IS "A" IN THE AC'S?
	JRST	IFGN0A		;NO

;"A" IS IN THE AC'S

IFGN0:	HRRZ	TA,EMODEA
	HRRZ	TB,EMODEB

	TSWT	FBNUM		;IS "B" NUMERIC?
	JRST	NOTNMB		;NO--TROUBLE

	CAIE	TA,FPMODE	;IS EITHER "A" OR "B" COMP-1?
	CAIN	TB,FPMODE
	JRST	IFGN0N		;YES

	CAIE	TA,F2MODE	;NO, IS EITHER "A" OR "B" COMP-2?
	CAIN	TB,F2MODE
	JRST	IFGN0N		;YES

	MOVE	TE,EDPLA	;[600] DOES "A" HAVE SAME DECIMAL PLACES AS "B"?
	SUB	TE,EDPLB	;[600]
	JUMPE	TE,IFGN0N	;[600] YES
	JUMPL	TE,IFGN0L	;[600] "A" LESS THAN "B"

	PUSHJ	PP,SETBCX
	JRST	IFGN0E
;"IF" GENERATOR (CONT'D)

;"A" IS NOT THE AC'S

IFGN0A:	TSWF	FANUM		;IS "A" NUMERIC?
	JRST	IFGN0B		;YES
IFN ANS68,<
	CAILE	TB,DSMODE	;NO--IS "B" DISPLAY?
	JRST	NOTNMA		;NO--ERROR
	JRST	IFDD		;YES
>
IFN ANS74,<
	CAIG	TB,DSMODE	;IS "B" DISPLAY?
	TSWF	FBSIGN		;YES, BUT NOT SIGNED?
	 CAIA
	JRST	IFDD		;YES
	PUSHJ	PP,SWAPIT	;SWAP OPERANDS (and the CONDITION).
	JRST	IFKAD		;MOVE IT TO UNSIGNED DISPLAY, THEN COMPARE.
>;END IFN ANS74

;"A" ISN'T IN THE AC'S, BUT IS NUMERIC

IFGN0B:	CAIE	TB,FPMODE	;IS "B" COMP-1?
	CAIN	TB,F2MODE	;OR COMP-2?
	JRST	IFGN0E		;YES
	CAIE	TA,FPMODE	;NO--IS "A" COMP-1?
	CAIN	TA,F2MODE	;OR COMP-2?
	JRST	IFGN0G		;YES

	TSWF	FBNUM		;IS "B" NUMERIC?
	JRST	IFGN0C		;YES
IFN ANS68,<
	CAILE	TA,DSMODE	;NO--IS "A" DISPLAY?
	JRST	NOTNMB		;NO--ERROR
>
IFN ANS74,<
	CAIG	TA,DSMODE	;IS "A" DISPLAY
	TSWF	FASIGN		;YES, BUT NOT SIGNED?
	JRST	IFKAD		;NO, CONVERT "A" TO DISPLAY
>
	JRST	IFDD		;YES

;BOTH "A" AND "B" ARE NUMERIC

IFGN0C:	MOVE	TE,EDPLA	;COMPARE DECIMAL PLACES
	CAMN	TE,EDPLB	;THE SAME?
	JRST	IFGN0F		;YES
	CAML	TE,EDPLB	;NO--"A" HAVE MORE THAN "B"?
	JRST	IFGN0G		;YES--SWAP OPERANDS
	JRST	IFGN0E		;NO--NO POINT IN SWAPPING

;"A" AND "B" HAVE THE SAME NUMBER OF DECIMAL PLACES

IFGN0F:	CAIG	TA,DSMODE	;IS "A" DISPLAY?
	JRST	IFGN0E		;YES--NO POINT IN SWAPPING
	TSWT	FBSIGN		;NO--IS "B" SIGNED?

IFGN0G:	PUSHJ	PP,SWAPIT	;SWAP OPERANDS

IFGN0E:	PUSHJ	PP,MOVXAC	; [413] GET "A" INTO THE AC'S
	SWON	FAINAC;
IFGN0L:	PUSHJ	PP,ADJDP.	;[600] ADJUST THE DECIMAL PLACES OF "A"
;"A" IS NOW IN THE AC'S -- DISPATCH TO CORRECT ROUTINE

IFGN0N:	HRRZ	TE,EMODEA	;IS MODE OF "A" LEGAL?
IFN BIS,<
	CAIN	TE,D4MODE	;IS "A" A 4-WORD COMP?
	 JRST	IF4WD		;YES, MAKE IT 2-WD
>;END IFN BIS
	CAIL	TE,D1MODE
	CAILE	TE,F2MODE
	JRST	IFCONA		;NO--SOMEBODY IS CONFUZED
	CAIG	TE,FPMODE	;IN FIRST SET?
	JRST	IFGN0P		;YES
	CAIGE	TE,D4MODE	;IN SECOND SET?
	JRST	IFCONA		;NO, ERROR
	SUBI	TE,D4MODE-FPMODE-1	;REMOVE MODES NOT IN TABLE
IFGN0P:	SUBI	TE,D1MODE	;YES--REDUCE IT

	HRRZ	TD,EMODEB	;IS MODE OF "B" LEGAL?
IFN BIS,<
	CAIN	TD,D4MODE	;4-WORD COMP?
	 JRST	IF4WD		;YES--MAKE IT TWO WORDS
>;END IFN BIS
	CAILE	TD,F2MODE
	JRST	IFCONB		;NO

	IMULI	TE,<F2MODE+1>/2	;YES--DISPATCH THRU TABLE
	ROT	TD,-1
	ADDI	TE,(TD)
	TLNE	TD,1B18
	SKIPA	TE,IFACT(TE)
	MOVS	TE,IFACT(TE)
	JRST	(TE)

;DISPATCH TABLE

IFACT:	XWD	IFC1D,IFC1D	;1C-S,1C-A
	XWD	IFC1D,IFC1C1	;1C-E,1C-1C
	XWD	IFC1C2,IFCXFP	;1C-2C,1C-FP
	XWD	IFC1D,IFCONB	;1C-C3,1C-ED
	XWD	IFCONB,IFCONB	;1C-LT,1C-FG
	XWD	IFCONB,IFCXF2	;1C-4C,1C-F2

	XWD	IFC2D,IFC2D	;2C-S,2C-A
	XWD	IFC2D,IFC2C1	;2C-E,2C-1C
	XWD	IFC2C2,IFCXFP	;2C-2C,2C-FP
	XWD	IFC2D,IFCONB	;2C-C3,2C-ED
	XWD	IFCONB,IFCONB	;2C-LT,2C-FG
	XWD	IFCONB,IFCXF2	;2C-4C,2C-F2

	XWD	IFPAC.,IFPAC.	;FP-S,FP-A
	XWD	IFPAC.,IFPAC.	;FP-E,FP-1C
	XWD	IFPAC.,IC1C1A	;FP-2C,FP-FP
	XWD	IFPAC.,IFCONB	;FP-C3,FP-ED
	XWD	IFCONB,IFCONB	;FP-LT,FP-FG
	XWD	IFCONB,IFC2C2	;FP-4C,FP-F2

	XWD	IFCONA,IFCONA	;4C-S,4C-A
	XWD	IFCONA,IFCONA	;4C-E,4C-1C
	XWD	IFCONA,IC1C1A	;4C-2C,4C-FP
	XWD	IFCONA,IFCONA	;4C-C3,4C-ED
	XWD	IFCONA,IFCONA	;4C-LT,4C-FG
	XWD	IFCONA,IFCONA	;4C-4C,4C-F2

	XWD	IF2AC.,IF2AC.	;F2-S,F2-A
	XWD	IF2AC.,IF2AC.	;F2-E,F2-1C
	XWD	IF2AC.,IC1C1A	;F2-2C,F2-FP
	XWD	IF2AC.,IFCONB	;F2-C3,F2-ED
	XWD	IFCONB,IFCONB	;F2-LT,F2-FG
	XWD	IFCONB,IFC2C2	;F2-4C,F2-F2
;HERE IFCONA AND/OR "B" IS 4-WORD COMP

IFN BIS,<
IF4WD:	MOVE	TE,ESIZEA	;GET SIZE OF A
	CAIG	TE,MAXSIZ	;4-WORD COMP?
	 JRST	IF4WDB		;NO

;CUT DOWN "A"

	SUBI	TE,MAXSIZ	;POWER OF 10 TO DIVIDE BY
	PUSH	PP,TE
	MOVSI	CH,MOVEI.+AC15
	HRR	CH,EBASEA	;"MOVEI 15,A"
	PUSHJ	PP,PUTASY##
	POP	PP,TC		;GET POWER OF 10
	MOVEI	CH,DVI41.##	;GET A LIBOL ROUTINE
	CAILE	TC,^D10
	MOVEI	CH,DVI42.##	;SORRY--WRONG ONE
	PUSHJ	PP,PMOPC.##	;"MOVEI 16,[^D1000..]"
				;"PUSHJ PP,ROUTINE"
	MOVEI	TE,D2MODE	;NEW "A" PARAMETERS
	MOVEM	TE,EMODEA
	MOVEI	TE,^D18
	MOVEM	TE,ESIZEA

IF4WDB:	MOVE	TE,ESIZEB
	CAIG	TE,MAXSIZ
	 JRST	IFGN0N		;START AGAIN

;CUT DOWN "B"

	SUBI	TE,MAXSIZ
	PUSH	PP,TE		;SAVE POWER OF 10
	MOVSI	CH,MOVEI.+AC15
	PUSHJ	PP,PUT.B##	;"MOVEI AC15,B"
	POP	PP,TC
	MOVEI	CH,DVI41.##	;A LIBOL ROUTINE
	CAILE	TC,^D10
	MOVEI	CH,DVI42.##
	PUSHJ	PP,PMOPC.##
	MOVEI	TE,D2MODE	;NEW "B" PARAMETERS
	MOVEM	TE,EMODEB
	MOVEI	TE,^D18
	MOVEM	TE,ESIZEB
	JRST	IFGN0N		;NOW CAN DO THE IF GENERATION
>;END IFN BIS
;CONVERT NUMERIC TO DISPLAY UNSIGNED

IFN ANS74,<
;COME HERE WHEN "B" IS NON-NUMERIC DISPLAY, AND "A" IS NUMERIC.
;"A" IS MOVED TO A TEMP NON-NUMERIC, SAME MODE AS "B".
IFKAD:	MOVE	TD,EMODEB	;[1067] GET MODE TO CONVERT TO
	PUSHJ	PP,IFKADM	;[1067] CALL ROUTINE TO CONVERT "A" TO TEMP
	JRST	IFDD		;[1067] GO DO NON-NUMERIC COMPARISON

;[1067] ROUTINE TO MOVE "A" (A NUMERIC ITEM) TO A NON-NUMERIC TEMP
;[1067] FOR COMPARISON PURPOSES.
;[1067] CALL: TD/ MODE TO CONVERT TO (MUST BE DISPLAY)
;[1067]	PUSHJ PP,IFKADM
;[1067] <RETURN HERE>, "A" CHANGED TO BE THE TEMP, "B" NOT AFFECTED
IFKADM:	MOVE	TE,[EBASEB,,ESAVBI] ;[1067]
	BLT	TE,ESVIBX	;[1067] SAVE "B"
	MOVE	TE,[EBASEA,,EBASEB] ;[1067]
	BLT	TE,EBASBX	;[1067] COPY "A" TO "B"
	MOVEM	TD,EMODEB	;[1067] SET MODE OF RESULT
	MOVE	TE,ESIZEB	;[1067] GET SIZE
	ADD	TE,[EXP 6-1,7-1,^D9-1](TD) ;[1067]Round up
	IDIV	TE,[EXP 6,5,4](TD) ;[1067][1542] GET # OF WORDS
	PUSHJ	PP,GETEMP	;[1067]
	MOVEM	EACC,EINCRB	;[1067]
	MOVE	TE,[^D36,,AS.MSC] ;[1067]
	MOVEM	TE,EBASEB	;[1067]
	PUSH	PP,SW		;[1067] SAVE FLAGS
	SWOFF	FBSIGN!FBNUM!FBSUB ;[1067] MAKE DESTINATION ITEM
				;[1067] A SIMPLE NON-NUMERIC TEMP
	PUSH	PP,EACC		;[1067] SAVE %TEMP OFFSET
	PUSHJ	PP,MXX.##	;[1067] MOVE "A" TO TEMP
	POP	PP,EACC		;[1067] RESTORE %TEMP OFFSET
	MOVE	TE,[EBASEB,,EBASEA] ;[1067]
	BLT	TE,EBASAX	;[1067] COPY "B" TO "A"
	MOVEM	EACC,EINCRA	;[1067] RESET OFFSET,
	MOVE	TE,[^D36,,AS.MSC] ;[1067] AND BASE,
	MOVEM	TE,EBASEA	;[1067] INCASE MXX. CHANGED THEM
	MOVE	TE,[ESAVBI,,EBASEB] ;[1067]
	BLT	TE,EBASBX	;[1067] RESTORE "B"
	POP	PP,SW		;[1067] RESTORE ORIGINAL "B" FLAGS
	SWOFF	FASIGN!FANUM!FASUB ;[1067] THE NEW "A" IS THE TEMP
	POPJ	PP,		;[1067] RETURN
>;END IFN ANS74
;"A" IS A LITERAL

IFGN1:	HRRZ	TE,EMODEB
	CAIE	TE,LTMODE
	CAIN	TE,FCMODE
	JRST	TWOLIT

;"A" IS A LITERAL, "B" ISN'T

	TSWT	FBNUM		;IS "B" NUMERIC?
	JRST	IFGN2C		;NO

	PUSHJ	PP,SWAPIT	;YES--SWAP OPERANDS

;[1067] "A" IS A NUMERIC ITEM, "B" IS A LITERAL
IFN ANS74,<			;[1067]
	TSWT	FBNUM		;[1067] IS "B" A NUMERIC LITERAL?
	 JRST	IFGN2D		;[1067] NO
>;END IFN ANS74			;[1067]
	PUSHJ	PP,MOVXAC	; [413] PUT INTO ACS
	SWON	FAINAC;

;COME HERE WHEN "A" HAS BEEN MOVED TO ACS. SINCE THIS MAY HAVE
; EXPANDED THE TABLES, WE CAN NO LONGER BELIEVE THAT EBYTEB POINTS
; TO THE LITERAL.  WE HAVE TO SET IT UP AGAIN, THEN GO TO IFGN9.
IFGN1A:	HRRZ	TA,EBASEB	;SET UP ETABLB AGAIN,
	PUSHJ	PP,LNKSET	; INCASE THE TABLES EXPANDED
	HRRM	TA,EBYTEB
	JRST	IFGN9

;"B" IS A LITERAL, "A" ISN'T

IFGN2:	TSWT	FANUM!FAINAC	;IS "A" NUMERIC?
	JRST	IFGN2A		;NO
IFN ANS74,<
	TSWF	FBNUM		;[1067] SKIP IF "B" IS NOT NUMERIC
	 JRST	IFGN2E		;[1067] COMPARE NUMERICALLY

;[1067] "A" IS A NUMERIC ITEM, "B" IS A NON-NUMERIC LITERAL
IFGN2D:	MOVEI	TD,D7MODE	;[1067] MOVE "A" TO ASCII TEMP
	PUSHJ	PP,IFKADM	;[1067]
	PUSHJ	PP,SWAPIT	;[1067] SWAP SO "A" IS LITERAL,
				;[1067]  "B" IS NON-NUMERIC TEMP
	JRST	IFDD2		;[1067] GO DO NON-NUMERIC COMPARISON

;[1067] "A" IS A NUMERIC ITEM, "B" IS A NUMERIC LITERAL
IFGN2E:				;[1067]
>;END IFN ASN74

	TSWTS	FAINAC		;GET IT INTO AC'S UNLESS
	PUSHJ	PP,MOVXAC	; [413]  IT'S THERE ALREADY
	JRST	IFGN1A

IFGN2A:	PUSHJ	PP,SWAPIT	;"A" ISN'T NUMERIC--SWAP OPERANDS

;"A" IS A LITERAL, "B" IS NON-NUMERIC DISPLAY

IFGN2C:	TSWT	FANUM		;IS IT A NUMERIC LITERAL?
	JRST	IFDD2		;NO

;"A" IS A NUMERIC LITERAL,"B" IS NON-NUMERIC DISPLAY

	MOVE	TA,ETABLB	;IS
	PUSHJ	PP,LNKSET	;  'B'
	LDB	TE,DA.EDT	;  EDITED?
	JUMPN	TE,NOTNMA	;IF SO, ERROR

	PUSH	PP,EBYTEA	;NO--SEE IF ANY DECIMAL PLACES IN LITERAL
	PUSHJ	PP,SCANL
	POP	PP,EBYTEA
	TSWF	FERROR		;ANY ERRORS OF ANY KIND?
	POPJ	PP,		;YES--FORGET IT

	PUSHJ	PP,LITN.A	;NO--CREATE A NUMERIC DISPLAY LITERAL
	JRST	IFDD2		;DO COMPARISON
;"A" IS A FIGURATIVE CONSTANT

IFGN3:	HRRZ	TE,EMODEB
	CAIE	TE,LTMODE
	CAIN	TE,FCMODE
	JRST	TWOLIT

;"A" IS A FIG. CONST., "B" ISN'T

	PUSHJ	PP,SWAPIT	;SWAP OPERANDS

;NOW "B" IS THE FIG. CONST.

IFGN3A:	HRRZ	TE,EMODEA	;IS 'A' DISPLAY?
	CAIG	TE,DSMODE
	JRST	IFGN3C		;YES

	CAIN	TE,	C3MODE		;IS A COMP-3?
	JRST		IFGN4		;YES, SPECIAL CASE FOR HIGH AND
					; LOW VALUES.
	CAIE	TE,D1MODE	;IS IT COMP
	CAIN	TE,FPMODE	;OR COMP-1
	CAIA			;YES
	JRST	IFG3AM		;NO
	HRRZ	TE,EFLAGB	;GET WHICH FIGCON
	CAIN	TE,2		;ZERO IS SPECIAL
	JRST	IFGN3B		;YES, DON'T LOAD ACCS

IFG3AM:	PUSHJ	PP,MXAC.	;NO--GET IT INTO AC'S
	SWON	FAINAC;

IFGN3B:	HRRZ	TE,EFLAGB	;DISPATCH
	CAILE	TE,5		;  TO APPROPRIATE ROUTINE
	MOVEI	TE,1
	JRST	@IFFCTA(TE)

IFGN3C:	HRRZ	TE,EFLAGB
	CAILE	TE,5
	MOVEI	TE,1
	JRST	@IFFCT(TE)


;"B" IS A FIG. CONST., "A" ISN'T

IFGN3E:	TSWF	FAINAC		;IS "A" IN THE AC'S?
	JRST	IFGN3B		;YES
	JRST	IFGN3A		;NO
IFGN4:	HRRZ	TE,	EFLAGB		;SEE WHICH FIGURATIVE CONSTANT IT IS.
	CAIN	TE,	4		;IF IT'S HIGH-VALUES, SPECIAL CASE.
	JRST		IFGN4F
	CAIE	TE,	5		;IF IT'S NOT LOW-VALUES, USE
	JRST		IFG3AM		; THE STANDARD ROUTINE.

	TSWF	FASIGN;			;IT'S LOW VALUES, IF IT'S SIGNED
	JRST		IFGN4F		; SPECIAL CASE.
	HRRZI	TE,	2		;OTHERWISE, MAKE IT A COMPARISON
	HRRM	TE,	EFLAGB		; TO ZERO.
	JRST		IFG3AM

;COMPARE A COMP-3 ITEM TO HIGH OR LOW VALUES.

IFGN4F:	PUSHJ	PP,	MOVXAC		; [413] GET THE COMP-3 ITEM INTO THE AC'S.
	SWON	FAINAC;

	MOVE	TA,	ESIZEA		;SEE HOW MANY DIGITS THE ITEM HAS.
	CAILE	TA,	^D10
	JRST		IFGN4L

;	GET 10**N-1.

	SETZ	TD,			;ONE WORD COMP.
	MOVE	TC,	POWR10##(TA)
	JRST		IFGN4R

IFGN4L:	LSH	TA,	1		;TWO WORD COMP.
	MOVE	TD,	DPWR10##-^D22(TA)
	MOVE	TC,	DPWR10##-^D21(TA)

IFGN4R:	SOS		TC		;DON'T WORRY ABOUT UNDERFLOW, IT
					; CAN'T HAPPEN (FAMOUS LAST WORDS!)

;NOW WE HAVE THE THING TO COMPARE THE ITEM TO, MAKE IT LOOK LIKE A LITERAL.

	MOVEM	TC,	ELITLO
	MOVEM	TD,	ELITHI

	HRRZ	TA,	EFLAGB		;IF IT'S LOW VALUES, MAKE THE
	CAIN	TA,	5		; LITERAL NEGATIVE.
	SWON	FLNEG;

	MOVE	TA,	[XWD EBASEA,EBASEB]	;GIVE THE LITERAL ALL OF
	BLT	TA,	EBASBX			; THE ITEM'S CHARACTERISTICS
	SWON	FBNUM!FBSIGN;			; (EXCEPT SUBSCRIPTING
	SWOFF	FBSUB;				; AND MODE OF COURSE.)
	HRRZI	TA,	LTMODE
	MOVEM	TA,	EMODEB

	JRST		IFGN9B		;GO GENERATE THE COMPARE.
;THE "A" OPERAND IS IN THE AC'S, "B" IS A LITERAL

IFGN9:				;[1416]
IFN FT68274,<			;[1416]
	MOVEI	DW,E.765	;[1416] SET UP WARNING MESSAGE
	MOVE	TA,ESIZEA	;[1416] GET SIZE OF OPERATOR
	TSWT	FBNUM		;[1416] NUMERIC LITERAL ?
	CAMN	TA,ESIZEB	;[1416]   OR SIZE EQUAL ?
	SKIPA			;[1416] YES
	PUSHJ	PP,OPNWRN##	;[1416] NO, GENERATE WARNING
>				;[1416]
	MOVEI	LN,EBASEB	;[1416]
	HRRZ	TE,OPERND	;[1057] IS "ALL" SPECIFIED?
	MOVE	TE,0(TE)	;[1057]
	TLNE	TE,GNALL	;[1057]
	JRST	BADALL##	;[1057] YES
	HRRZ	TE,EMODEA
	CAIE	TE,FPMODE
	JRST	IFGN9A

	PUSHJ	PP,MSFP%L
	MOVEI	TA,FPMODE
	MOVEM	TA,EMODEB
	MOVEM	TC,EINCRB

	MOVEI	TE,AS.MSC
	MOVEM	TE,EBASEB
	JRST	IC1C1B

IFGN9A:	CAIN	TE,F2MODE
	JRST	IFGN9C
	PUSHJ	PP,CONVNL
	TSWF	FERROR		;ANY ERRORS?
	POPJ	PP,		;YES--FORGET THE WHOLE THING

	MOVE	TE,EDPLA
	SUB	TE,EDPLB
	PUSHJ	PP,ADJSL.

	MOVEM	TC,ELITLO
	MOVEM	TD,ELITHI
	PUSHJ	PP,ADJDP.
	MOVE	TC,ELITLO
	MOVE	TD,ELITHI

IFGN9B:	HRRZ	TE,EMODEA
	CAIE	TE,D2MODE	;IF "A" IS NOT A 2-WORD COMP, AND
	JUMPE	TD,IC1C1E	;	LITERAL ONLY 1-WORD, JUMP

	PUSHJ	PP,MAKEL2
	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPN	TE,IC2C2Z	; [413] IF NEGATED GO SEE TO IT.
	JRST	IC2C2E

IFGN9C:	PUSHJ	PP,MSF2%L
	MOVEI	TA,F2MODE
	MOVEM	TA,EMODEB
	MOVEM	TC,EINCRB
	MOVEI	TE,AS.MSC
	MOVEM	TE,EBASEB
	JRST	IC2C2E
;GENERATE CODE TO COMPARE 1-WORD COMP VERSUS 1-WORD COMP

IFC1C1:	HRRZ	TE,OPERND	; [413] IF NEGATED
	LDB	TE,EOPSGN	; [413] THEN MOVE NEGATIVE
	JUMPN	TE,IC1C1Z	; [413] TO ACS
	TSWF	FBSIGN		;IS "B" SIGNED?
	JRST	IC1C1A		;YES

IC1C1Z:	PUSHJ	PP,SETBCX	;SAVE LOCATION OF "A" & MAKE IT "B"
	PUSHJ	PP,MOVC1	; [413] GET NEW "A" INTO AC'S
	JRST	IC1C1B

IC1C1A:	PUSHJ	PP,SUBSCB

IC1C1B:	MOVSI	CH,CAM.		;GENERATE THE COMPARE
	LDB	TE,CONDIT
	ROT	TE,-^D8
	ADD	CH,TE
	PUSHJ	PP,PUT.BA
	JRST	JFALSE

;"B" IS A LITERAL.

IC1C1E:	SKIPN	ELITLO		;IS LITERAL 0?
	JRST	IC1C1G		;YES
	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	ROT	TE,-^D8
	ADD	CH,TE

	HRRZ	TE,OPERND	; [413] SEE IF "B" OPERAND
	LDB	TE,EOPSGN	; [413] IS NEGATED
	JUMPN	TE,IC1C1F	; [413] IF SO NEGATE IT
	TSWT	FLNEG		;IS LITERAL NEGATIVE?
	SKIPA	TC,ELITLO	;NO
IC1C1F:	MOVN	TC,ELITLO	;[413] YES

	PUSHJ	PP,PUT.LA	;GENERATE <CAMX AC,[LITERAL]>
	JRST	JFALSE		;GENERATE JRST TO FALSE, AND RETURN

;"B" IS A LITERAL OF ZERO

IC1C1G:	MOVSI	CH,JUMP.
	LDB	TE,CONDIT
	TRC	TE,CONCMP/100	;COMPLEMENT CONDITION
	ROT	TE,-9
	ADD	CH,TE		;GENERATE JUMPX
	MOVE	TE,EAC
	DPB	TE,CHAC		;LOAD AC FIELD
	JRST	JFLSEA		;GENERATE JUMPX AC,FALSE
;GENERATE CODE TO COMPARE A 1-WORD COMP OR INDEX VS. A 2-WORD COMP

IFC1C2:	MOVE	TC,EDPLB	;COMPUTE DIFFERENCE IN DECIMAL PLACES
	SUB	TC,EDPLA
	ADDM	TC,EDPLA	;ADJUST DECIMAL PLACES OF "A"
	ADDM	TC,ESIZEA	;ALSO SIZE

	MOVSI	CH,MUL.		;GENERATE <MUL. AC,[POWER OF 10]>
	PUSHJ	PP,PUT.PA
	MOVEI	TE,D2MODE	;"A" IS NOW A 2-WORD COMP
	MOVEM	TE,EMODEA
	JRST	IFC2C2		;DO DOUBLE-PRECISION COMPARE


;GENERATE CODE TO COMPARE A 2-WORD COMP VS. A 1-WORD COMP OR INDEX

IFC2C1:	PUSHJ	PP,SETBCX	;SWAP OPERANDS
	HRRZ	TE,EBASEA	;IF NEW 'A' IS
	CAILE	TE,17		;  NOT YET IN AC'S
	PUSHJ	PP,MOVC1	; [413]   GET IT THERE
	JRST	IFC1C2
;GENERATE CODE TO COMPARE 2-WORD COMPS.

IFC2C2:	HRRZ	TE,OPERND	; [413] GET "B" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPN	TE,IC2C2Z	; [413] IF SO NEGATE IT
	TSWF	FBSIGN		;IS "B" SIGNED?
	JRST	IC2C2D		;YES
	PUSHJ	PP,SETBCX	;SWAP OPERANDS
IC2C2Z:	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPE	TE,IC2C2Y	; [413]
	PUSHJ	PP,MNXAC.##	; [413] MOVE ITS NEGATIVE
	JRST	IC2C2E		; [413] DO COMPARISON.
IC2C2Y:	PUSHJ	PP,M2CAC.	;GET NEW "A" INTO AC'S
	JRST	IC2C2E

IC2C2D:	PUSHJ	PP,SUBSCB
IC2C2E:	SKIPE	EAC		;[154] MAKE SURE SETBCX DONE EVEN NO. OF TIMES
	PUSHJ	PP,SETBCX	;[154] TO FORCE CORRECT COMPARE UUO OF COMP. 2
	MOVSI	CH,CAMN.
	PUSHJ	PP,PUT.BA
	AOS	EAC
	HRRZ	TE,EBASEB
	CAIG	TE,17		;IN ACCS?
	AOSA	EBASEB		;YES
	AOS	EINCRB
	LDB	TE,CONDIT
	CAIE	TE,EQ
	CAIN	TE,NOTEQ
	JRST	IC2C2F		;EITHER EQUAL OR NOT EQUAL

;HERE FOR LESS, LESS EQUAL, GREATER, GREATER EQUAL
	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	TRC	TE,7		;INVERSE CONDITION
	ROT	TE,-8
	ADD	CH,TE		;CREATE CAMX
	PUSHJ	PP,PUT.BA
	SOS	EAC
	HRRZ	TE,EBASEB
	CAIG	TE,17		;IN ACCS?
	SOSA	EBASEB		;YES
	SOS	EINCRB
	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	TRO	TE,EQ		;TURN ON EQ
	ROT	TE,-8
	ADD	CH,TE		;CREATE CAMX
	PUSHJ	PP,PUT.BA
	JRST	JFALSE

;HERE FOR EQUAL OR NOTEQUAL
IC2C2F:	MOVSI	CH,CAME.
	PUSHJ	PP,PUT.BA
	MOVEI	TC,AS.DOT+2
	TLNN	W1,EQUALF
	PUSHJ	PP,JOUT		;NOT EQUAL
	SOS	EAC
	HRRZ	TE,EBASEB
	CAIG	TE,17		;IN ACCS?
	SOSA	EBASEB		;YES
	SOS	EINCRB
	JRST	JFALSE
;AC'S ARE FLOATING POINT, "B" IS NOT

IFPAC.:	PUSHJ	PP,PUTEMP
	SETZM	EAC
	PUSHJ	PP,SWAPIT
	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPE	TE,IFFPCY	; [413]
	PUSHJ	PP,MNXAC.##	; [413] MOVE NEGATIVE INTO ACS
	JRST	IC1C1B		; [413] DO COMPARISON

IFFPCY:	PUSHJ	PP,MXFPA.
	JRST	IC1C1B


;AC'S CONTAIN 1- OR 2-WORD COMP, "B" IS FLOATING POINT

IFCXFP:	PUSHJ	PP,CCXFP.
	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPN	TE,IC1C1Z	; [413] GO NEGATE "A"
	JRST	IC1C1A

;AC'S ARE COMP-2, "B" IS NOT

IF2AC.:	PUSHJ	PP,PUTEMP
	SETZM	EAC
	PUSHJ	PP,SWAPIT
	HLRZ	TE,OPERND	;GET "A" OPERAND
	LDB	TE,EOPSGN	;SEE IF NEGATED
	JUMPE	TE,IFF2CY
	PUSHJ	PP,MNXAC.##	;MOVE NEGATIVE INTO ACS
	JRST	IC2C2E		;DO COMPARISON

IFF2CY:	PUSHJ	PP,MXFPA.
	JRST	IC2C2E


;AC'S CONTAIN 1- OR 2-WORD COMP, "B" IS COMP-2

IFCXF2:	PUSHJ	PP,CCXF2.
	HLRZ	TE,OPERND	;GET "A" OPERAND
	LDB	TE,EOPSGN	;SEE IF NEGATED
	JUMPN	TE,IFC2C2	;GO NEGATE "A"
	JRST	IC2C2D
;"A" IS A 1-WORD COMP IN AC'S, "B" IS DISPLAY

IFC1D:	MOVE	TE,ESIZEB
	CAIG	TE,^D10
	JRST	IFC1DA

;"B" WILL BE 2 WORDS

	MOVE	TC,EDPLB	;[542] COMPUTE DIFF IN DECIMAL PLACES
	SUB	TC,EDPLA	;[542]
	ADDM	TC,EDPLA	;[542] ADJUST DECIMAL PLACES OF "A"
	ADDM	TC,ESIZEA	;[542] ALSO ADJUST SIZE

	MOVSI	CH,MUL.		;[542] GENERATE <MUL. AC,[POWER OF 10]>
	PUSHJ	PP,PUT.PA	;[542]
	MOVEI	TE,D2MODE	;[542] "A" IS NOW A 2-WORD COMP
	MOVEM	TE,EMODEA	;[542]
	PUSHJ	PP,SETBCX

	PUSHJ	PP,MOVXAC	; [413] MOVE INTO ACS
	PUSHJ	PP,SETBCX
	JRST	IC2C2E

;"B" WILL BE 1 WORD

IFC1DA:	PUSHJ	PP,SETBCX
	PUSHJ	PP,MOVXAC	; [413] MOVE INTO ACS
	JRST	IC1C1B
;"A" IS A 2-WORD COMP IN AC'S, "B" IS DISPLAY

IFC2D:	PUSHJ	PP,SETBCX
	PUSHJ	PP,MOVXAC	; [413] MOVE INTO ACS

	HRRZ	TE,EMODEA
	CAIN	TE,D1MODE
	PUSHJ	PP,CC1C2.

	PUSHJ	PP,SETBCX
	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPN	TE,IC2C2Z	; [413] IF NEGATED GO SEE TO IT.
	JRST	IC2C2E
;GENERATE CODE FOR NON-NUMERIC DISPLAY COMPARISON

IFDD:	HRRZ	TE,	EMODEA		;IF A IS DISPLAY-6 AND B IS
	CAMGE	TE,	EMODEB		; DISPLAY-7 OR DISPLAY-9, OR
	PUSHJ	PP,	SWAPIT		; A IS DISPLAY-7 AND B IS
					; DISPLAY-9, SWAP THE OPERANDS.
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] NEED TO WORRY ABOUT ASCII/EBCDIC COLL. SEQ.?
	  PUSHJ	PP,SWAPIT	;[1004] YES, SIGNAL BY EMODEA .LT. EMODEB
>

IFDD2:	MOVE	TE,ESIZEA	;COMPARE SIZES
	MOVEM	TE,ESIZEZ
	CAME	TE,ESIZEB
	JRST	IFDD4

;'A' IS SAME SIZE AS 'B'

IFDD3:	HRRZ	TE,EMODEA	;IS 'A' A
	CAIN	TE,LTMODE	;  LITERAL?
	JRST	IFDD30		;YES

	HRRZ	TD,EMODEB	;NO--IS MODE OF 'A'
	CAME	TD,TE		;  SAME AS MODE OF 'B'?
	JRST	IFDD3A		;NO
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SEE IF WE HAVE TO USE THE OTHER COL. SEQ.
	  JRST	IFDD3A		;[1004] YES
>
	MOVEI	LN,EBASEB	;YES--IS 'B'
	TSWT	FBSUB		;  NON-SUBSCRIPTED AND
	PUSHJ	PP,IFDD50	;  WORD-CONTAINED?
	JRST	IFDD3A		;IT IS SUBSCRIPTED OR NOT WORD-CONTAINED
	MOVEI	LN,EBASEA	;YES--IS 'A'
	TSWT	FASUB		;  NON-SUBSCRIPTED AND
	PUSHJ	PP,IFDD50	;  WORD-CONTAINED?
	JRST	IFDD3A		;IT IS SUBSCRIPTED OR NOT WORD-CONTAINED
IFN ANS74,<
	SKIPG	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
>
	JRST	IFDD40		;NO--SPECIAL CODE

IFDD3A:	HRRZ	TE,ESIZEZ
IFN BIS,<			;[1317]
	MOVE	TD,EMODEA	;[1317] NO NEED TO BREAK DOWN THE SIZE
	CAME	TD,EMODEB	;[1317]  IF THE MODES ARE THE SAME
	JRST	IFDD3F		;[1317]
IFN ANS74,<			;[1317]
	SKIPN	COLSEQ		;[1317]  AND NO SPECIAL COLLATING
>  ;END IFN ANS74		;[1317]
	JRST	IFDD3B		;[1317]  SO USE THE WHOLE SIZE
IFDD3F:				;[1317]
>  ;END IFN BIS			;[1317]
	CAIG	TE,MXPSZ.##	;TOO BIG
	JRST	IFDD3B		;NO
	SUBI	TE,3770		;GET REMAINDER
	PUSH	PP,EINCRA
	PUSH	PP,EINCRB
	PUSH	PP,TE
	PUSH	PP,TD		;[1317] SAVE TD FOR A SECOND
	IDIVI	TE,3770		;[1317] FIND OUT HOW MANY
	SKIPE	TD		;[1317]  PARTS LEFT
	ADDI	TE,1		;[1317] 
	MOVEM	TE,ECNTA	;[1317] SAVE PART COUNT
	POP	PP,TD		;[1317] RESTORE TD
	MOVEI	TE,3770		;DIVISIBLE BY 6, 5 AND 4
	MOVEM	TE,ESIZEZ	;SET SIZE
	PUSHJ	PP,IFDD3B	;AND DO FIRST PART
IFDD3C:	POP	PP,ESIZEZ
	HRROI	TE,-1		;[1317] DECREMENT NUMBER
	ADDM	TE,ECNTA	;[1317]  OF PARTS LEFT
	MOVE	TE,EMODEA	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRA	;MOVE DOWN STRING
	MOVE	TE,EMODEB	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRB
	MOVE	TE,ESIZEZ
	CAIG	TE,MXPSZ.	;STILL TOO BIG?
	 JRST	IFDD3D		;NO, DO LAST COMPARE
	SUBI	TE,3770		;YES, CUT DOWN AGAIN
	PUSH	PP,TE
	MOVEI	TE,3770
	MOVEM	TE,ESIZEZ
	PUSHJ	PP,IFDD3B
	JRST	IFDD3C
IFDD3D:	PUSHJ	PP,IFDD20
	POP	PP,EINCRB
	POP	PP,EINCRA
	CAIA
IFDD3B:	PUSHJ	PP,IFDD20
	HRRZ	TE,EMODEB
	CAME	TE,EMODEA	;[1004] IF NOT THE SAME MODE
	JRST	ADDRS3		;PUT OUT 3 JRSTS
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SAME MODE, BUT SEE IF OTHER COL. SEQ.
	  JRST	ADDRS3		;[1004] YES, SO NEED 3 JRSTS ALSO
>
	JRST	JFALSE		;  ONLY ONE JRST REQUIRED

;PRETEND 'A' AND 'B' ARE THE SAME SIZE

IFDD3E:	MOVE	TE,ESIZEA
	CAMLE	TE,ESIZEB
	MOVE	TE,ESIZEB
	MOVEM	TE,ESIZEA
	MOVEM	TE,ESIZEB
	JRST	IFDD3
;BOTH 'A' AND 'B' ARE NON-NUMERIC (CONT'D)

;'A' HAS DIFFERENT SIZE THAN 'B'

IFDD4:
IFN ANS74,<
	SKIPN	FLGSW##		;ARE WE CHECKING FIPS LEVEL?
	JRST	IFDD4E		;NO
	PUSHJ	PP,TST.N2##	;TEST AT HIGH-INTERMEDIATE LEVEL
	MOVE	TE,ESIZEA	;RELOAD SIZE OF "A"
IFDD4E:>
	CAML	TE,ESIZEB
	JRST	IFDD16		;"A" LARGER THAN "B"

;"A" SMALLER THAN "B"

	HRRZ	TE,EMODEA
	CAIN	TE,LTMODE
	JRST	IFDD30

IFN BIS,<
	CAMN	TE,EMODEB	;IS "A" SAME MODE AS "B"?
 IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SEE IF OTHER COL. SEQ.
	  CAIA			;[1004] YES, CANNOT USE EXTEND INST.
 >
	 JRST	GENEXD		;YES-- DIFF SIZE COMPARE USING EXTEND
>;END IFN BIS

	LDB	TE,CONDIT	;IS IT ">" OR "NOT >"?
	CAIE	TE,NOTGR
	CAIN	TE,GR
	JRST	IFDD3E		;YES

	MOVE	TD,ESIZEB	;[170-A] GET SIZE OF B
	PUSH	PP,TD		;[170-A] SAVE  SIZE OF B
	MOVE	TD,ESIZEA	;[170] GET A SIZE (SMALLER THAN B)
	MOVEM	TD,ESIZEB	;[170] SET B SIZE = TO A SIZE
	CAIG	TD,MXPSZ.	;TOO BIG
	JRST	IFDD4A		;NO
	SUBI	TD,3770		;GET REMAINDER
	PUSH	PP,EINCRA	;SO WE CAN GET END CONDITION RIGHT
	PUSH	PP,EINCRB
	PUSH	PP,TD
	MOVEI	TE,3770		;DIVISIBLE BY 6, 5 AND 4
	MOVEM	TE,ESIZEZ	;SET SIZE
	PUSHJ	PP,IFDD17	;AND DO FIRST PART
IFDD4B:	POP	PP,ESIZEZ
	MOVE	TE,EMODEA	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRA	;MOVE DOWN STRING
	MOVE	TE,EMODEB	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRB
	MOVE	TE,ESIZEZ
	CAIG	TE,MXPSZ.	;THIS THE LAST TIME WE HAVE TO LOOP?
	 JRST	IFDD4C		;YES, DO LAST COMPARE
	SUBI	TE,3770
	PUSH	PP,TE
	MOVEI	TE,3770
	MOVEM	TE,ESIZEZ
	PUSHJ	PP,IFD17A
	JRST	IFDD4B

IFDD4C:	PUSHJ	PP,IFD17A	;TAG IS ALREADY SET UP
	POP	PP,EINCRB
	POP	PP,EINCRA
	CAIA
IFDD4A:	PUSHJ	PP,IFDD17	;[170] GO GENERATE COMP CODE FOR 'A' SIZE
	PUSHJ	PP,SWAPIT	;[473] [170-A] MAKE 'B' OPERAND 'A' FOR SPACE COMPARE
	POP	PP,TD		;[170-A] GET BACK ORIGINAL B SIZE
	MOVE	TE,ESIZEA	;[170] GET A SIZE FOR ARGUMENT TO M.IA
	SUB	TD,TE		;[170] GET DIFFERENCE OF A AND B
	MOVEM	TD,ESIZEA	;[170-A] DIFFERENCE IS LEFT OVER CHARS OF ORIG B FOR SPACE COMP
	JRST	IFD16A

;"A" LARGER THAN "B"

IFDD16:	HRRZ	TE,EMODEA
	CAIN	TE,LTMODE
	PUSHJ	PP,IFDD51
IFN BIS,<
	HRRZ	TE,EMODEA	;GET "A" MODE NOW
 IFN ANS68,<
	CAME	TE,EMODEB	;SKIP IF "A" AND "B" SAME MODE
	 JRST	IFD6AA		; NO -- GO NORMAL ROUTE
 >
 IFN ANS74,<
	CAMN	TE,EMODEB	;SKIP IF "A" AND "B" NOT THE SAME MODE
	PUSHJ	PP,TSTCOL	;[1004] SEE IF OTHER COL. SEQ.
	  JRST	IFD6AA		;[1004] YES, CANNOT USE EXTEND
 >
	PUSHJ	PP,SWAPIT	;MAKE "A" THE SMALLER OPERAND
	JRST	GENEXD		; AND GENERATE THE EXTEND
IFD6AA:
>;END IFN BIS

	MOVE	TE,ESIZEB
	MOVEM	TE,ESIZEZ

	LDB	TE,CONDIT	;IS IT "<" OR "NOT <"?
	CAIE	TE,LS
	CAIN	TE,NOTLS
	JRST	IFDD3E		;YES

	MOVE	TE,ESIZEB
	MOVEM	TE,ESIZEZ
	CAIG	TE,MXPSZ.	;TOO BIG
	JRST	IFD16B		;NO
	SUBI	TE,3770		;GET REMAINDER
	PUSH	PP,EINCRA	;SO WE CAN GET END CONDITION RIGHT
	PUSH	PP,EINCRB
	PUSH	PP,TE
	MOVEI	TE,3770		;DIVISIBLE BY 6, 5 AND 4
	MOVEM	TE,ESIZEZ	;SET SIZE
	PUSHJ	PP,IFDD17	;AND DO FIRST PART
IFD16C:	POP	PP,ESIZEZ
	MOVE	TE,EMODEA	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRA	;MOVE DOWN STRING
	MOVE	TE,EMODEB	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRB
	MOVE	TE,ESIZEZ	;CAN WE FINISH NOW?
	CAIG	TE,MXPSZ.
	 JRST	IFD16D		;YES, DO LAST COMPARE
	SUBI	TE,3770		;NO, DO A 3770 COMPARE AGAIN
	PUSH	PP,TE
	MOVEI	TE,3770
	MOVEM	TE,ESIZEZ
	PUSHJ	PP,IFD17A
	JRST	IFD16C		;LOOP
IFD16D:	PUSHJ	PP,IFD17A	;TAG IS ALREADY SET UP
	POP	PP,EINCRB
	POP	PP,EINCRA
	CAIA
IFD16B:	PUSHJ	PP,IFDD17
	MOVE	TE,ESIZEB
	MOVN	TD,ESIZEB
	ADDM	TD,ESIZEA

IFD16A:	PUSHJ	PP,M.IA
	PUSHJ	PP,IFSPAC
	HRRZ	CH,TAGTRU
	SETZM	TAGTRU
	JRST	PUTTAG
;GENERATE CODE FOR NON-NUMERIC DISPLAY COMPARISON (CONT'D).
;ONE FIELD IS SMALLER THAN THE OTHER.  GENERATE COMPARISON FOR SMALLER SIZE.

IFDD17:	PUSHJ	PP,GETTAG	;GET A TAG FOR TRUE PATH
	HRLI	CH,JRST.
	MOVEM	CH,TAGTRU

IFD17A:	PUSHJ	PP,B2PAR
	PUSHJ	PP,IFDD24

	MOVEI	TC,5
	TLNE	W1,LESSF
	PUSHJ	PP,JTRUES
	PUSHJ	PP,JFALSE

	MOVEI	TC,4
	TLNE	W1,GREATF
	JRST	JTRUE
	JRST	JFALSE

;GENERATE THE ACTUAL COMPARISON INSTRUCTION

IFDD20:	PUSH	PP,EREMAN	;SAVE UNTIL PARAMETERS BUILT
IFN BIS,<
 IFN ANS74,<
	SKIPG	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	PUSHJ	PP,TSTCOL	;[1004] SEE IF WE HAVE TO USE OTHER COL. SEQ.
	 JRST	OLDF20		;[1004] YES, CAN'T USE EXTEND
 >;END IFN ANS74

	HRRZ	TE,EMODEB
	CAMN	TE,EMODEA	;MODES EQUAL?
	 JRST	NEWF20		;YES, USE NEW METHOD
OLDF20:
>;END IFN BIS
IFN ANS74,<
	SKIPLE	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	SETOM	COLSCP##	;[1004] YES, SIGNAL SUBSCRIPTER TO  USE IT
>;END IFN ANS74
	PUSHJ	PP,B2PAR	;BUILD PARAMETERS
IFN ANS74,<
	SETZM	COLSCP		;[1004] BACK TO NORMAL
>
	POP	PP,EREMAN
	HRRZ	TE,EMODEB	;SAME MODE?
	CAME	TE,EMODEA
	JRST	IFDD24
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SEE IF WE NEED OTHER COL. SEQ.
	  JRST	IFDD24		;[1004] YES
>

	MOVE	CH,[XWD CMP.+ASINC,AS.MSC]  ;YES--USE "COMP."
	LDB	TE,CONDIT
	ROT	TE,-^D13
	ADD	CH,TE

	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	JRST	PUTASN

IFN BIS,<
NEWF20:	PUSHJ	PP,EXTNGN	;GENERATE THE EXTEND
	POP	PP,EREMAN##	;RESTORE THIS
	POPJ	PP,		;AND RETURN

EXTNGN:	PUSHJ	PP,DEPCKK##	;SKIP IF ANY DEPENDING ITEMS
	 JRST	EXTNG1		;NO

;WE ASSUME 'ESIZEA' IS THE MAX SIZE OF 'A' AND 'ESIZEB' IS MAX SIZE FOR 'B'.
; ESIZEZ IS IGNORED.  AC4 WILL BE SETUP TO HAVE COUNT OF 'A' AND AC7 FOR 'B'.

	PUSHJ	PP,EXMAB##	;PUT SUBSCRIPTS IN %TEMP NOW
				; SO WE DON'T SMASH ACS 4 & 7 AT NB2PAR
	PUSHJ	PP,DEPTSA##	;DOES 'A' HAVE A DEPENDING ITEM?
	 JRST	NODPIA		;NO, DO 'MOVEI' LATER ON
	MOVEI	TE,4		;USE RUNTIME AC 4
	PUSHJ	PP,SZDPVA##	; SET IT UP
	 POPJ	PP,		; ?ERROR, GIVE UP NOW
	MOVEI	TE,4
	MOVEM	TE,CONVSV##	;HAVE TO PRESERVE THIS AC
NODPIA:	PUSHJ	PP,DEPTSB##	;DOES 'B' HAVE A DEPENDING ITEM?
	 JRST	NODPIB		;NO
	MOVEI	TE,7		;SETUP AC 7 WITH SIZE OF 'B'
	PUSHJ	PP,SZDPVB##	; SET IT UP
NODPIB:	SETZM	CONVSV##	;CLEAR 'AC TO SAVE'

EXTNG1:	MOVE	TA,ESIZEZ	;# CHARS TO MOVE
	MOVEM	TA,NCHARS##	;STORE FOR GETNB
	PUSHJ	PP,GETNB##	;CAN WE USE LARGER BYTES?
	MOVE	TE,NBYTES##	;CAN WE USE LARGER BYTES?
	CAIE	TE,1
	SETOM	USENBT##	;IF NOT 1, ANSWER IS YES!
	MOVE	TE,ESIZEZ	;NOW FIND OUT # BYTES
	IDIV	TE,NBYTES##
	SOJE	TE,[HRRZ TE,EMODEA	;[544] COMPARING ONE BYTE?
		CAIE	TE,D6MODE	;[544] YES, SIXBIT CAN BE PROBLEM
		JRST	ONEBYT		;[544] OK, DON'T USE EXTEND
		MOVE	TE,NBYTES	;[544] GET NUMBER OF BYTES
		CAIE	TE,6		;[544] A FULL WORD?
		JRST	ONEBYT		;[544] NO
		JRST	.+1]		;[544] YES, USE EXTEND INST
	PUSHJ	PP,NB2PAR##	;SETUP ACS 5-10

;IF 36-BIT BYTES ARE BEING USED, THE BYTE POINTER MUST BE SETUP.

	MOVE	TE,NBYTES##	;HOW MANY BYTES/BYTE?
	CAIE	TE,4
	CAIN	TE,6		;4 OR 6 MEANS OPTIMIZATION WAS APPLIED
	 CAIA
	JRST	GOTBPS		;B.P.'S OK

	TSWT	FASUB		;IS RH OF AC5 SETUP?
	 JRST	XXSET5		;NO
	MOVE	CH,[TLO.+ASINC+AC5,,AS.CNB]
	PUSHJ	PP,PUTASY
	MOVEI	CH,(POINT 36,)	;"TLO 5,(POINT 36,)"
	PUSHJ	PP,PUTASN
	JRST	XXSET7
XXSET5:	MOVE	TA,[XWD BYTLIT,2]
	PUSHJ	PP,STASHP
	PUSHJ	PP,MBYTPA
	PUSHJ	PP,POOL
	MOVSI	CH,MOV+AC5
	PUSHJ	PP,PUT.LD
	SKIPN	PLITPC
	 AOS	ELITPC
XXSET7:	TSWT	FBSUB		;IS RH OF AC10 SETUP?
	 JRST	XXSET8		;NO
	MOVE	CH,[TLO.+ASINC+AC10,,AS.CNB]
	PUSHJ	PP,PUTASY
	MOVEI	CH,(POINT 36,)	;"TLO 10,(POINT 36,)"
	PUSHJ	PP,PUTASN
	JRST	GOTBPS		;OK, GOT BYTE PTRS NOW
XXSET8:	MOVE	TA,[XWD BYTLIT,2]
	PUSHJ	PP,STASHP
	PUSHJ	PP,MBYTPB
	PUSHJ	PP,POOL
	MOVSI	CH,MOV+AC10
	PUSHJ	PP,PUT.LD
	SKIPN	PLITPC
	AOS	ELITPC

;GENERATE "MOVEI 4,<NUMBER OF BYTES>"

GOTBPS:	PUSHJ	PP,DEPTSA##	;'A' SIZE SETUP?
	  SKIPA	CH,[MOVEI.+AC4+ASINC,,AS.CNB]
	JRST	GOTBPA		;YES
	PUSHJ	PP,PUTASY
	MOVE	TE,ESIZEZ	;NUMBER OF SMALL BYTES TO COMPARE
	IDIV	TE,NBYTES##	; # OF "BIG" BYTES TO COMPARE
	MOVE	CH,TE
	PUSHJ	PP,PUTASN

;GENERATE "MOVEI 7,<NUMBER OF BYTES>"

GOTBPA:	PUSHJ	PP,DEPTSB##	;'B' SIZE SETUP?
	  SKIPA	CH,[MOVEI.+ASINC+AC7,,AS.CNB]
	JRST	GOTBPB		;YES
	PUSHJ	PP,PUTASY##
	MOVE	TE,ESIZEZ	;NUMBER OF SMALL BYTES TO COMPARE
	IDIV	TE,NBYTES##	; # OF 'BIG' BYTES TO COMPARE
	MOVE	CH,TE
	PUSHJ	PP,PUTASN##

;ACS HAVE BEEN SETUP. NOW GENERATE THE EXTEND

GOTBPB:	PUSHJ	PP,DEPCKK	;IF ANY DEPENDING ITEMS,
	  SKIPA	TA,[XTNLIT,,1]	;NO, OCTAL LITERAL
	PJRST	USE3EX		;YES, USE THE EXTEND WITH THE FILLER CHAR
	PUSHJ	PP,STASHP	; (FOR CMPXX EXTEND CODE)
	LDB	TE,CONDIT	;WHICH CONDITION TO TEST?
	HLLZ	TA,CMXTB(TE)
	PUSHJ	PP,POOLIT

	PUSHJ	PP,PUTASA##	;EXTEND IS IN 2ND SET OF OPCODES
	MOVSI	CH,XTND.+AC4
	PUSHJ	PP,PUT.LD##	;OUTPUT "EXTEND AC4,<CURRENT LITERAL>"
	SKIPN	PLITPC
	AOS	ELITPC
	SETZM	USENBT##	;CLEAR FLAG

	POPJ	PP,

CMXTB:	0
	CMPSE			;EQ
	CMPSG			;GREATER
	CMPSGE			;GREATER OR EQUAL
	CMPSL			;LESS
	CMPSLE			;LESS OR EQUAL
	CMPSN			;NOT EQUAL

;HERE FOR COMPARE WHEN "A" IS SMALLER THAN "B"
; GENERATE THE EXTEND USING SMALL BYTES & FILLER CHARS

GENEXD:	PUSHJ	PP,NB2PAR##	;SETUP BYTE PTRS TO "A" AND "B"

;GENERATE "MOVEI 4,<# BYTES IN A>
	MOVE	CH,[MOVEI.+AC4+ASINC,,AS.CNB]
	PUSHJ	PP,PUTASY##
	MOVE	CH,ESIZEA	;NUMBER OF BYTES IN A
	PUSHJ	PP,PUTASN##

;GENERATE "MOVEI 7,<# BYTES IN B>
	MOVE	CH,[MOVEI.+AC7+ASINC,,AS.CNB]
	PUSHJ	PP,PUTASY##
	MOVE	CH,ESIZEB
	PUSHJ	PP,PUTASN##
	PUSHJ	PP,USE2EX	; USE THE EXTEND WITH FILLER CHARS
	JRST	JFALSE		;GEN "JRST FALSE" THEN RETURN

;GENERATE THE LITERAL STUFF, WITH FILLER CHARACTER IN E0+1

USE2EX:	MOVE	TA,[XTNLIT,,1]
	PUSHJ	PP,STASHP	;FIRST IS TYPE OF EXTEND
	LDB	TE,CONDIT
	HLLZ	TA,CMXTB(TE)
	PUSHJ	PP,STASHQ
	AOS	ELITPC		;GET LITERAL PC RIGHT FOR POOL
	MOVE	TA,[OCTLIT,,1]
	PUSHJ	PP,STASHP
	HRRZ	TE,EMODEA
	HRRZ	TA,IFSPCS(TE)	;GET A SPACE
	PUSHJ	PP,POOLIT	;FINISH LITERAL BLOCK FOR EXTEND
	SOS	ELITPC

	PUSHJ	PP,PUTASA##	;READY FOR EXTEND
	MOVSI	CH,XTND.+AC4
	PUSHJ	PP,PUT.LD##

	SKIPE	PLITPC
	 POPJ	PP,		;RETURN
	MOVEI	TE,2		;UPDATE ELITPC IF WE DIDN'T POOL
	ADDM	TE,ELITPC
	POPJ	PP,		;RETURN

;GENERATE THE LITERAL STUFF, WITH FILLER CHARACTER IN E0+1 AND E0+2
;SINCE WE DON'T KNOW WHICH STRING WILL BE THE SHORTER

USE3EX:	MOVE	TA,[XTNLIT,,1]
	PUSHJ	PP,STASHP	;FIRST IS TYPE OF EXTEND
	LDB	TE,CONDIT
	HLLZ	TA,CMXTB(TE)
	PUSHJ	PP,STASHQ
	AOS	ELITPC		;GET LITERAL PC RIGHT FOR POOL
	MOVE	TA,[OCTLIT,,2]
	PUSHJ	PP,STASHP
	HRRZ	TE,EMODEA
	HRRZ	TA,IFSPCS(TE)	;GET A SPACE
	PUSHJ	PP,STASHQ	;E0+1
	HRRZ	TE,EMODEB
	HRRZ	TA,IFSPCS(TE)	;GET A SPACE
	PUSHJ	PP,POOLIT	;FINISH LITERAL BLOCK FOR EXTEND
	SOS	ELITPC

	PUSHJ	PP,PUTASA##	;READY FOR EXTEND
	MOVSI	CH,XTND.+AC4
	PUSHJ	PP,PUT.LD##

	SKIPE	PLITPC
	 POPJ	PP,		;RETURN
	MOVEI	TE,3		;UPDATE ELITPC IF WE DIDN'T POOL
	ADDM	TE,ELITPC
	POPJ	PP,		;RETURN

;HERE TO COMPARE ONE BYTE

ONEBYT:	PUSHJ	PP,PCXBP2##	;GEN PROPER BYTE PTRS
	MOVE	TE,EMODEA
	CAIN	TE,D7MODE
	 JRST	ONEBY1		;USE ILDB, CAMX
	MOVE	TE,ESIZEZ
	CAIGE	TE,4		;FULL WORD BYTE?
	 JRST	ONEBY1		;NO

;COMPARE FULL WORDS

	TSWT	FASUB		;WAS "A" SUBSCRIPTED?
	 JRST	FULWW1		;NO
	HLRZ	CH,PCXPTR##	;GET INDEX AC
	IORI	CH,MOV
	HRLZ	CH,CH
	PUSHJ	PP,PUT.XA##	;"MOVE AC, (SUBSC.AC)"
	JRST	FULWD2

FULWW1:	MOVSI	CH,MOV
	PUSHJ	PP,PUT.AA##	;"MOVE AC,A"

FULWD2:	TSWT	FBSUB		;SKIP IF "B" SUBSCRIPTED
	 JRST	FULWD4		;NO
; "B" WAS SUBSCRIPTED. ADDRESS OF IT IS IN AN AC.
FULWD3:	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	ROT	TE,-8
	ADD	CH,TE
	HRLZ	TE,PCXPTR##	;GET AC "B" IS IN
	OR	CH,TE		;INDEX BY IT
	SETZM	USENBT##	;CLEAR FLAG
	PJRST	PUT.XA##	;"CAMX AC,0(SUBSC.AC)"

FULWD4:	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	ROT	TE,-8
	ADD	CH,TE	
	SETZM	USENBT##	;CLEAR FLAG
	PJRST	PUT.BA##	;"CAMX AC,B"

;HERE TO GENERATE ILDB, ILDB, CAMX

ONEBY1:	HLRZ	TA,PCXPTR##	;WHERE IS "A" GOING TO END UP?
	CAIGE	TA,AS.LIT	;SKIP IF LITTAB
	 JRST	ONEBYA		;NO, IN AC
	MOVE	CH,[LDB.+ASINC,,AS.MSC]
	PUSHJ	PP,PUT.XA##	;"LDB AC,LIT00+N"
	HLRZ	CH,PCXPTR##
	PUSHJ	PP,PUTASN##	;. .
	JRST	ONEBYB

ONEBYA:	MOVSI	CH,ILDB.	;"ILDB AC,<SUBSC. AC>"
	HLR	CH,PCXPTR##
	PUSHJ	PP,PUT.XA##

ONEBYB:	HRRZ	TA,PCXPTR##	;WHERE IS "B" GOING TO END UP?
	CAIGE	TA,AS.LIT	;SKIP IF LITTAB
	 JRST	ONEBYC		;NO, IT WAS SUBSCRIPTED
	MOVE	CH,[LDB.+ASINC,,AS.MSC]
	PUSHJ	PP,PUT.XB##
	HRRZ	CH,PCXPTR##
	PUSHJ	PP,PUTASN##
	JRST	ONEBYD

ONEBYC:	MOVSI	CH,ILDB.
	HRR	CH,PCXPTR##
	PUSHJ	PP,PUT.XB##

;GENERATE "CAMX AC,AC+1"

ONEBYD:	SETZM	USENBT##	;CLEAR FLAG
	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	ROT	TE,-8
	ADD	CH,TE
	HRR	CH,EAC
	AOJA	CH,PUT.XA##
>;END IFN BIS
;GENERATE "HRRZI	16,	<PARAMETER ADDRESS>".

IFDD24:	MOVE	CH,	[XWD	HRRZI.+AC16+ASINC,AS.MSC]
	PUSHJ	PP,	PUTASY
	HRRZI	CH,	(EACC)
	PUSHJ	PP,	PUTASN

;GENERATE "PUSHJ	17,	<ROUTINE>".

	HRRZ	TE,	EMODEA		;FIGURE OUT WHICH ROUTINE TO USE.
	HRRZI	CH,	COMP%##		;ASSUME A AND B ARE OF THE SAME MODE.
	CAMN	TE,	EMODEB
IFN ANS68,<
	PJRST		GNPSX.##	;THEY ARE, GO GENERATE THE INSTRUCTION.
>
IFN ANS74,<
	JRST	IFDD25			;[1004] SEE IF SPECIAL COLLATING SEQ. SPECIFIED
	IMULI	TE,D9MODE+1		;[1004] INDEX IS EMODEA*3+EMODEB
>
	ADD	TE,	EMODEB		;THEY AREN'T, FORM THE INDEX.
	JUMPL	TE,	GNPSX.##	;IF AN ERROR OCCURED IN PHASE D
	CAIG	TE,	CDDSLN		;[1004] THE MODES MAY BE MESSED UP, SO
					; USE COMP.
	MOVE	CH,	CDDS-1(TE)	;GET THE ROUTINE.
	PJRST		GNPSX.##	;GO GENERATE THE INSTRUCTION.

CDDS:
IFN ANS74,<
;	XWD	0,COMP%			;[1004] CANNOT HAPPEN
	XWD	0,CMP.67##		;[1004] COMPARE DISPLAY-6 TO DISPLAY-7 IN EBCDIC.
	XWD	0,CMP.69##		;[1004] COMPARE DISPLAY-6 TO DISPLAY-9 IN EBCDIC.
>
	XWD	0,CMP%76##		;COMPARE DISPLAY-7 TO DISPLAY-6 IN ASCII.
IFN ANS74,<
	XWD	0,COMP%			;[1004] COMPARE DISPLAY-7 TO DISPLAY-7.
	XWD	0,CMP.79##		;[1004] COMPARE DISPLAY-7 TO DISPLAY-9 IN ASCII.
>
	XWD	0,CMP%96##		;COMPARE DISPLAY-9 TO DISPLAY-6.
	XWD	0,CMP%97##		;COMPARE DISPLAY-9 TO DISPLAY-7.
;	XWD	0,COMP%			;[1004] COMPARE DISPLAY-9 TO DISPLAY-9.

CDDSLN==.-CDDS				;[1004] LENGTH OF DISPATCH TABLE

IFN ANS74,<
IFDD25:	PUSHJ	PP,TSTCOL	;[1004] ASCII OR EBCDIC SPECIFIED?
	  SKIPA	TE,EMODEA	;[1004] YES, USE SPECIAL ROUTINE
	JRST	GNPSX.		;[1004] NO, ITS IN THE RIGHT MODE
	MOVE	CH,CDDSAE(TE)	;[1004] GET THE ROUTINE
	JRST	GNPSX.		;[1004] GENERATE THE INSTRUCTION

CDDSAE:	EXP	COMP.6##	;[1004] SIXBIT IN EBCDIC MODE
	EXP	COMP.7##	;[1004] ASCII  IN EBCDIC MODE
	EXP	COMP.9##	;[1004] EBCDIC IN ASCII MODE
>
;'A' IS A LITERAL WITH SIZE NOT GREATER THAN 'B', AND 'B' IS NON-NUMERIC

IFDD30:	MOVE	TE,ESIZEB	;IS 'B'
	CAIN	TE,1		;  A SINGLE CHARACTER?
	TSWF	FBSUB		;YES--SUBSCRIPTED?
	JRST	IFDD36		;SUBSCRIPTED, OR NOT SINGLE CHARACTER

	HRRZ	TE,VALLOC##	;MAKE EBYTEA RELATIVE TO VALTAB
	MOVNS	TE		; IN CASE LITTAB EXPANDS
	ADDM	TE,EBYTEA	;  AND CAUSES VALTAB TO MOVE
	PUSHJ	PP,IFDD42	;YES--GENERATE <LDB 0,B>
	HRRZ	TE,VALLOC	;PUT BACK THE VALTAB BASE
	ADDM	TE,EBYTEA	; SO EBYTEA POINTS TO CURRENT VALUE
	PUSHJ	PP,SWAPIT	;SWAP OPERANDS AND CONDITION

	HRRZ	TA,EBASEB	;[1404] SET UP ETABLB AGAIN
	PUSHJ	PP,LNKSET	;[1404]  INCASE THE TABLES EXPANDED
	HRRM	TA,EBYTEB	;[1404]
	ILDB	CH,EBYTEB	;GET LITERAL VALUE INTO 'CH'
	HRRZ	TE,EMODEA	;IS 'A'
	CAIE	TE,D6MODE	;  SIXBIT?
	JRST	IFDD31		;NO
	CAIG	CH,137		;YES-- IS LITERAL
	CAIGE	CH,40		;  REASONABLE?
	JRST	IFDD39		;NO
	SUBI	CH,40		;YES--CONVERT TO SIXBIT
	JRST	IFDD32

IFDD31:	CAIE	TE,	D9MODE##	;IS 'A' DISPLAY-9?
	JRST		IFDD32		;NO, MUST BE DISPLAY-7 THEN.
	MOVEI	TE,	(CH)		;SET UP FOR VLIT8. CALL.
	PUSHJ	PP,	VLIT8.##	;GO CONVERT THE CHAR.
	LDB	CH,	[POINT 9,TE,35]	;GET IT IN CH (THERE MAY BE 2 CHARS.)

IFDD32:
IFN ANS74,<
	SKIPG	COLSEQ		;[1004] PROGRAM COL SEQ = ALPHABET-NAME?
	JRST	IFDD33		;NO
	HRRZ	TE,EMODEA	;GET MODE AGAIN
	EXCH	TD,CH		;PUT CHAR IN RIGHT PLACE
	XCT	CSCHAR(TE)	;CONVERT
	EXCH	TD,CH		;RESTORE
>
IFDD33:	HRLI	CH,CAI.		;GET DUMMY CAI OPERATOR
	LDB	TE,CONDIT	;CONVERT
	ROT	TE,-^D8		;  OPERATOR TO
	ADD	CH,TE		;  SOMETHING VALID
	PUSHJ	PP,PUTASY	;GENERATE <CAIX 0,LITERAL>
	JRST	JFALSE		;PUT OUT FALSE JUMP AND LEAVE

;CANNOT USE SPECIAL CODE

IFDD36:	PUSHJ	PP,IFDD51	;PUT LITERAL IN LITAB
	TSWF	FERROR		;[1353] LITERAL TOO LARGE
	POPJ	PP,		;[1353]
	JRST	IFDD2		;TRY AGAIN

;LITERAL HAS NON-SIXBIT VALUE

IFDD39:	HRRZ	TE,OPERND
	MOVEM	TE,CUREOP
	MOVEI	DW,E.329	; [374] NON-SIXBIT CHAR ERROR
	PUSHJ	PP,OPNFAT
	MOVEI	CH,0
	JRST	IFDD33
;BOTH 'A' AND 'B' ARE WORD-CONTAINED, AND HAVE SAME MODE

IFDD40:	CAIN	TE,^D36		;ARE THEY FULL WORDS?
	JRST	IFDD44		;YES, SPECIAL TREATMENT
	PUSHJ	PP,IFDD42	;GENERATE <LDB 0,B>
	PUSHJ	PP,IFDD41	;GENERATE <LDB 1,A>
	MOVSI	CH,CAM.+AC1	;GET DUMMY CAM OPERATOR
	LDB	TE,CONDIT	;CONVERT
	ROT	TE,-^D8		;  OPERATOR TO
	ADD	CH,TE		;  SOMETHING REASONABLE
	PUSHJ	PP,PUTASY	;GENERATE <CAMX 1,0>
	JRST	JFALSE		;PUT OUT FALSE PATH AND QUIT

;GENERATE <LDB 1,A>

IFDD41:	MOVSI	CH,LDB.+AC1
	MOVEI	LN,EBASEA
	PUSHJ	PP,IFDD45	;SEE IF WE CAN USE HALF-WORD INST
IFN ANS74,<
	SKIPG	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
>
	JRST	IFDD43
IFN ANS74,<
	PUSHJ	PP,IFDD43	;YES, LOAD AC1
	MOVE	CH,[MOV+AC1+ASINC+1,,AS.MSC]
	PUSHJ	PP,PUTASY
	MOVE	CH,EMODEA
	MOVE	CH,COLSQS(CH)
	PJRST	PUTASN
>

;GENERATE <LDB 0,B>

IFDD42:	MOVSI	CH,LDB.
	MOVEI	LN,EBASEB
	PUSHJ	PP,IFDD45	;SEE IF WE CAN USE HALF-WORD INST
IFN ANS74,<
	SKIPG	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	JRST	IFDD43
	MOVSI	CH,LDB.+AC1
	PUSHJ	PP,IFDD43	;YES, LOAD AC1
	MOVE	CH,[MOV+ASINC+1,,AS.MSC]
	PUSHJ	PP,PUTASY
	MOVE	CH,EMODEB
	MOVE	CH,COLSQS(CH)
	PJRST	PUTASN
>


IFDD43:	JUMPE	CH,CPOPJ	;ALREADY DONE VIA HALF-WORD INST
	PUSH	PP,CH		;SAVE INST
	MOVE	TA,[XWD BYTLIT,2]
	PUSHJ	PP,STASHP
	HRRZ	TA,EBASEX(LN)
	PUSHJ	PP,STASHQ
	MOVE	TA,ESIZEX(LN)
	HRRZ	TD,EMODEX(LN)
	IMUL	TA,BYTE.S(TD)
	HLR	TD,ERESX(LN)
	SUB	TD,TA
	ROT	TA,-6
	HRRI	TA,(TD)
	ROT	TA,-6
	HRR	TA,EINCRX(LN)
	PUSHJ	PP,POOLIT
	POP	PP,CH
	PUSHJ	PP,PUT.LD	;GENERATE <LDB [CURRENT LITERAL]>
	SKIPN	PLITPC
	AOS	ELITPC
	POPJ	PP,

;BOTH 'A' AND 'B' ARE WORD-CONTAINED, HAVE SAME MODE, AND ARE 36 BITS

IFDD44:	LDB	TE,CONDIT	;IF CONDITION IS
	CAIE	TE,EQ		;  EQUAL OR
	CAIN	TE,NOTEQ	;  NOT EQUAL, GENERATE
	JRST	.+2		;  SPECIAL CODE, ELSE
	JRST	IFDD3A		;  RETURN TO NORMAL
	MOVSI	CH,MOV+AC1	;WE CAN USE MOVE RATHER THAN LDB
	PUSHJ	PP,PUT.A	;GENERATE <MOVE 1,A>
	MOVSI	CH,CAM.+AC1	;NO NEED TO LOAD B
	LDB	TE,CONDIT	;CONVERT
	ROT	TE,-^D8		;  CONDITION TO
	ADD	CH,TE		;  CAMX
	PUSHJ	PP,PUT.B	;GENERATE <CAMX 1,B>
	JRST	JFALSE		;PUT OUT FALSE AND QUIT

;SEE IF WE CAN USE HALF-WORD INST

IFDD45:	HLRZ	TA,ERESX(LN)	;GET BYTE OFFSET
	CAIE	TA,44		;MUST START ON HALF WORD BOUNDARY
	CAIN	TA,22
	CAIA			;SO FAR SO GOOD
	POPJ	PP,		;FAILED FIRST TEST
	MOVE	TA,ESIZEX(LN)
	HRRZ	TD,EMODEX(LN)
	IMUL	TA,BYTE.S(TD)
	CAIE	TA,^D18		;MUST BE EXACTLY 18 BITS
	POPJ	PP,		;FAILED 
	PUSHJ	PP,PUTASA	;SIGNAL SECOND INST SET
	HLRZ	TA,ERESX(LN)	;GET BYTE OFFSET AGAIN
	CAIE	LN,EBASEA	;SEE IF "A" OR "B"
	JRST	IFDD46		;"B"

;GENERATE	<HXRZ	1,A>

	CAIE	TA,22
	SKIPA	CH,[HLRZ.##+AC1,,0]
	MOVSI	CH,HRRZ.##+AC1
	PUSHJ	PP,PUT.A
	SETZ	CH,		;SIGNAL DONE
	POPJ	PP,

;GENERATE	<HXRZ	0,B>

IFDD46:	CAIE	TA,22
	SKIPA	CH,[HLRZ.##,,0]
	MOVSI	CH,HRRZ.##
	PUSHJ	PP,PUT.B
	SETZ	CH,		;SIGNAL DONE
	POPJ	PP,

;CHECK TO SEE IF FIELD IS WORD-CONTAINED.
;IF SO, RETURN TO CALL+2; IF NOT RETURN TO CALL+1.

IFDD50:	MOVE	TE,ESIZEX(LN)
	HRRZ	TD,EMODEX(LN)
	IMUL	TE,BYTE.S(TD)
	HLRZ	TD,ERESX(LN)
	CAML	TD,TE
	AOS	(PP)
	POPJ	PP,

;PUT VALUE OF THE LITERAL 'A' INTO LITAB

IFDD51:	PUSH	PP,ESIZEB
	HLRZ	TE,OPERND
	MOVE	TE,0(TE)
	TLNE	TE,GNALL
	JRST	IFDD52

	MOVE	TE,ESIZEA
	CAMLE	TE,ESIZEB
	MOVEM	TE,ESIZEB
IFDD52:	SETZM	LITERR##		; [374] CLEAR LITERAL ERROR SW
	PUSHJ	PP,LITD.0##		; [374] SET UP LITERAL
	POP	PP,ESIZEB
	SKIPN	LITERR			; [374] ERRORS IN CONVERSION?
	POPJ	PP,			;NO
	MOVEI	DW,E.329		; [374] SET UP FOR POSSIBLE ERROR
	HLRZ	TE,OPERND		; [374] GET LITERAL OPERAND
	MOVEM	TE, CUREOP		; [374] SET UP FOR ERROR
 	PUSHJ	PP,OPNFAT		; [374]	YES GIVE ERROR
	SETZM	LITERR			; [374] CLEAR ERROR SW
	POPJ	PP,
;TABLE OF FIG. CONST. ENTRY POINTS, WHEN "A" IS NOT AC'S

IFFCT:
IFN ANS68,<
	EXP	IFTODY	;TODAY
>
IFN ANS74,<
	EXP	0
>
	EXP	IFSPAC	;SPACE
	EXP	IFZERO	;ZERO
	EXP	IFQUOT	;QUOTE
	EXP	IFHIV	;HIGH-VALUES
	EXP	IFLOV	;LOW-VALUES

;TABLE OF FIG. CONST. ENTRY POINTS, WHEN "A" IS AC'S

IFFCTA:
IFN ANS68,<
	EXP	IFATDY	;TODAY
>
IFN ANS74,<
	EXP	0
>
	EXP	BADCLS	;SPACE
	EXP	IFZERO	;ZERO
	EXP	BADCLS	;QUOTE
	EXP	IFHIV	;HIGH-VALUES
	EXP	IFLOV	;LOW-VALUES
;ERROR ROUTINES

;TWO LITERALS BEING COMPARED

TWOLIT:	MOVEI	DW,E.331
	JRST	OPNFAT


;AC'S BEING COMPARED WITH SOMETHING NOT NUMERIC

BADCLS:	MOVEI	DW,E.211
	JRST	OPNFAT

;CONFUSION -- "B" AT FAULT

IFCONB:	SKIPA	TC,OPERND

;CONFUSION -- "A" AT FAULT

IFCONA:	MOVS	TC,OPERND
	HRRZM	TC,CUREOP
	MOVEI	DW,E.276
	JRST	OPNFAT

;"B" MUST BE NUMERIC

NOTNMB:	SKIPA	TC,OPERND

;"A" MUST BE NUMERIC

NOTNMA:	MOVS	TC,OPERND
	HRRZM	TC,CUREOP
	MOVEI	DW,E.211
	JRST	OPNFAT
;GENERATE CODE FOR "ENDIF"

ENDIFG:	TLNN	W1,GNENDS	;[605] IS THIS AN "END SPIF"?
	POPJ	PP,		;[605] NO
	TLNE	W1,(1B10)	;END SPIF, BUT NO I-O?
	 POPJ	PP,		;YES, NOTHING TO GENERATE

IFN ANS74,<ENDIFR::>

;[12B] Sometimes there is information passed to this routine from
;  the various I-O generators, such as the "READ INTO" item, or
;  the file-table pointer and flag saying that this is a READ INTO
;  a variable length item.
;   This information is stored in a HLDTAB entry. EVERY special IF
;creates a HLDTAB entry, and they are stored as a LIFO "stack" as follows:
;PTRHLD contains information about the last entry made, (entry flags
;and pointer into HLDTAB).
;  Each HLDTAB entry contains a header word which describes the
;NEXT entry in the chain (not the entry the header word is contained in!!!),
;and information that allows ENDIFG to generate the appropriate code.
;  If there is only one entry in HLDTAB, the header word of that entry
;is zero.
;  Every type of special IF must generate a HLDTAB entry. This includes
;all "INVALID KEY/AT END/AT END OF PAGE" etc.-type things.
;  This type of arrangement is necessary to preserve the "pushdown"
;stack data structure, so nested "SPECIAL IF's" will work.

; Guard against errors
	SKIPN	PTRHLD##	;A MISMATCH INDICATES SYNTAX ERRORS
	 POPJ	PP,		;SO JUST FORGET IT.

; Check for the various options

ENDIF0:	MOVE	TB,PTRHLD##	;GET PTRHLD WITH ITS FLAGS
	TXNE	TB,HE%VLR	; VARIABLE-LENGTH READ?
	  PUSHJ	PP,ENDF0B	;YES
IFN ANS74,<
	TXNE	TB,HE%DEB	; DEBUGGING CODE?
	  PUSHJ	PP,ENDF0C	;YES
>;END IFN ANS74
	TXNE	TB,HE%RIN	;READ..INTO OR RETURN..INTO?
	  PUSHJ	PP,ENDF0A	;YES
	HRRZ	TA,PTRHLD	;FIND HLDTAB ENTRY
	ADD	TA,HLDLOC##
	MOVE	TB,(TA)		;"POP" THE STACK
	MOVEM	TB,PTRHLD

;Return space to HLDTAB
	MOVE	TB,[.HESIZ,,.HESIZ] ; # WORDS IN ENTRY USED
	MOVE	TD,HLDNXT##
	SUB	TD,TB		;ADJUST HLDNXT
	MOVEM	TD,HLDNXT	;AS IF WE HAD NEVER USED THE SPACE
	POPJ	PP,		;RETURN FROM ENDIFG

;ENDIFG - SUBROUTINES

;READ--INTO   or  RETURN...INTO
ENDF0A:	MOVEI	TA,.HERIN	;START OF ENTRY
	ADD	TA,PTRHLD	;POINT INTO THIS ENTRY
	ADD	TA,HLDLOC	;START OF THE READ..INTO OPERANDS
	HRLI	TB,0(TA)	;[1351] MOVE HLDTAB ENTRY
	HRRI	TB,EINTO##	;[1351]  TO A FIXED LOCATION 
	MOVEI	TC,EINTO	;[1351]  BECAUSE TABLE EXPANSION
	ADDI	TC,OPNSIZ+OPNMAX;[1351]  IS CLOBBERING CUREOP'S PTR
	BLT	TB,-1(TC)	;[1351] 
	MOVEI	TA,EINTO	;[1351] TA POINTS TO RECORD ITEM
	MOVEI	TC,2(TA)	;[1351] TC POINTS TO INTO ITEM
	MOVEM	TC,CUREOP	;[1351] SETUP CUREOP THE WAY MOVGN. LIKES IT
;[1351]	HRRZI	TC,2(TA)	;TC POINTS TO INTO ITEM
;[1351]	HRRZI	TA,0(TA)	;TA POINTS TO RECORD ITEM
;[1351]	MOVEM	TC,CUREOP	;SETUP CUREOP THE WAY MOVGN. LIKES
	PUSHJ	PP,MOVGN.	;GENERATE THE MOVE CODE
	SETZM	EINTO		;[1351] RESET EINTO
	MOVE	TB,PTRHLD	;REGET PTRHLD
	POPJ	PP,		;RETURN


;READ--VARIABLE-LENGTH FLAG WAS ON
ENDF0B:	MOVEI	TA,.HEVLR	;GET OFFSET INTO ENTRY
	ADD	TA,PTRHLD	;POINT INTO THIS ENTRY
	ADD	TA,HLDLOC
	MOVE	TB,(TA)		;FETCH FILE-TABLE PTR
	MOVEM	TB,EDEPFT##	;STORE INFORMATION
	PUSHJ	PP,ENDFVL	;DO VARIABLE-LENGTH CODE
	MOVE	TB,PTRHLD	;RE-GET PTRHLD
	POPJ	PP,		;RETURN

;ENDIFG - SUBROUTINES

;CALLED BY ENDF0B TO DO THE VARIABLE LENGTH CODE
;INPUT:	EDEPFT = FILE-TABLE POINTER

ENDFVL:	HRRZ	TA,EDEPFT	;[605] GET FILE TABLE
	HRLZM	TA,CURFIL##	;[605] MAKE SURE IT POINTS TO FILE WE WANT
	PUSHJ	PP,LNKSET	;[605] CONVERT TO ADDRESS
	HRRM	TA,CURFIL	;[605] SAVE IT
	SETZM	EDEPFT		;[605] 
	PUSHJ	PP,VLTST##	;[605] CALL AGAIN TO SETUP POINTER TO RECORD
ENDIF1:	MOVEM	CH,EDEPFT	;[605] SOMEWHERE SAFE TO STORE POINTERS
	HLRZ	CH,CURFIL	;[605] GET FILE TABLE
	IOR	CH,[MOV+ASINC,,AS.FIL##]	;[605] GET RECORD COUNT
	PUSHJ	PP,PUTASY	;[605] PUT OUT FIRST PART
	MOVSI	CH,FI.CLR##	;[605] NEG OFFSET IN LHS.
	PUSHJ	PP,PUTASN	;[605] PUT OUT NEG. OFFSET
	SETZM	EAC		;[605] RESULT IS IN AC0
	HRRZ	TA,EDEPFT	;[605] GET OFFSET OF 01 RECORD
	PUSHJ	PP,LNKSET	;[605] ITS ADDRESS
	LDB	TB,DA.EXS	;[605] GET MAX. SIZE
	PUSH	PP,TB		;[605] SAVE
	LDB	TB,DA.USG	;[1037] GET USAGE OF 01 ITEM
	SUBI	TB,1		;[1037] CONVERT TO MODE
	MOVEM	TB,ESAVMD##	;[1037] SAVE FOR SUBSIZ
	HLRZ	TA,EDEPFT	;[605] GET OFFSET OF OCCURS ITEM
	PUSHJ	PP,LNKSET	;[605] ITS ADDRESS
	LDB	TC,DA.USG	;[1037] GET USAGE
	XCT	SUBSIZ##(TC)	;[1037] CALL ROUTINE TO GET SIZE IN BYTES
	MOVE	TB,TE		;[1037] PUT SIZE IN TB
	LDB	TC,DA.NOC##	;[605] NO. OF OCCURS
	IMULI	TC,(TB)		;[605] SIZE OF VARIABLE PART
	POP	PP,CH		;[605] REGET SIZE OF RECORD
	SUB	CH,TC		;[605] GET FIXED PART
	JUMPE	CH,ENDIF3	;[605] NO FIXED PART
	HRLI	CH,SUBI.##	;[605] GENERATE CODE TO SUBTRACT IT FROM CHAR COUNT
	PUSHJ	PP,PUTASY	;[605] SO OCCURS DEP. VARIABLE IS WHAT COBOL EXPECTS
ENDIF3:	CAIN	TB,1		;[605] IF SIZE IS 1
	JRST	ENDIF4		;[605] DON'T GENERATE DIVIDE INST
	MOVSI	CH,ADDI.##	;[605] FASTEST WAY TO ROUND UP
	HRRI	CH,-1(TB)	;[605] BY ADDING SIZE -1
	PUSHJ	PP,PUTASY	;[605] TO VALUE IN AC0
	MOVSI	CH,IDIVI.##	;[605] GENERATE DIVIDE
	HRRI	CH,(TB)		;[605] BY INDIVIDUAL ITEM
	PUSHJ	PP,PUTASY	;[605]
ENDIF4:	SETZM	EBASEA		;[605] SET UP A FAKE "A"
	MOVE	TA,[EBASEA,,EBASEA+1]	;[605]
	BLT	TA,EFLAGA	;[605] START WITH IT ALL ZERO
	MOVEI	TA,D1MODE	;[605] 1 WORD COMP
	MOVEM	TA,EMODEA	;[605]
	SWOFF	FEOFF1		;[605] GET THE FLAGS RIGHT
	SWON	FAINAC!FANUM!FASIGN	;[605]
				;[605] NOW TO FAKE "B"
	PUSH	PP,W1		;[605] SAVE W1
	PUSH	PP,W2		;[605]  AND W2.
	PUSH	PP,OPERND##	;[605] SAVE OPERND TOO. (IN CASE IT'S
				;[605]  IN THE LINKAGE SECTION.)
	HLRZ	TA,EDEPFT	;[605] GET OCCURS ITEM
	PUSHJ	PP,LNKSET	;[605] POINT TO IT
	LDB	W2,DA.DEP##	;[605] GET THE DEPENDING ITEM.
	MOVEI	TA,(W2)		;[605]  AND POINT AT IT.
	PUSHJ	PP,LNKSET##	;[605]
	MOVSI	W1,(1B0)	;[605] SET THE OPERAND FLAG.
	LDB	TD,DA.SYL##	;[605] SET THE SYNC FLAGS.
	DPB	TD,[POINT 1,W1,5]	;[605]
	LDB	TD,DA.SYR##	;[605]
	DPB	TD,[POINT 1,W1,6]	;[605]
	LDB	TD,DA.CLA##	;[605] SET THE NUMERIC FLAG.
	CAIN	TD,%CL.NU	;[605]
	TLO	W1,(1B7)	;[605]
	LDB	TD,DA.JST##	;[605] SET THE JUSTIFIED FLAG.
	DPB	TD,[POINT 1,W1,8]	;[605]
	LDB	TD,DA.LKS##	;[605] SET THE LINKAGE SECTION FLAG.
	DPB	TD,[POINT 1,W1,9]	;[605]
	LDB	TD,DA.USG##	;[605] SET THE USAGE.
	DPB	TD,[POINT 4,W1,13]	;[605]
	PUSHJ	PP,PUSH12##	;[605] STASH THE INFO IN EOPTAB.
	HRRZI	TC,-1(EACA)	;[605] POINT AT THE EOPTAB ENTRY.
	MOVEM	TC,CUREOP	;[605] MAKE IT THE CURRENT ENTRY.
	HRRZM	TC,OPERND##	;[605] MAKE IT THE CURRENT OPERAND TOO.
	MOVEI	LN,EBASEB	;[605] POINT TO "B"
	PUSHJ	PP,SETOPN	;[605] SET UP "B" OPERAND
	TSWT	FERROR		;[605] DON'T TRY TO STORE IF ERROR FOUND
	PUSHJ	PP,MACX.##	;[605] STORE DEPENDING ITEM
	POP	PP,OPERND##	;[605] RESTORE OPERND.
	POP	PP,W2		;[605] RESTORE W2
	POP	PP,W1		;[605]  AND W1.
	MOVE	EACA,EOPNXT##	;[605] RESET EOPTAB.
	POP	EACA,(EACA)	;[605]
	POP	EACA,(EACA)	;[605]
	HRRZ	TA,EDEPFT	;[605] GET CURRENT 01
	SETZM	EDEPFT		;[605] SO WE KNOW IF ANOTHER IS FOUND
	PUSHJ	PP,VLTSTN##	;[605] LOOK FOR ONE
	SKIPE	EDEPFT		;[605] DID WE FIND SOMETHING?
	JRST	ENDIF1		;[605] YES, GENERATE CODE FOR THIS DEP. VAR. ALSO
	POPJ	PP,		;DONE, RETURN
;ENDIFG - SUBROUTINES

IFN ANS74,<
;GENERATE DEBUGGING CODE
ENDF0C:	MOVEI	TA,.HEDEB	;GET PTR TO HLDTAB ENTRY
	ADD	TA,PTRHLD	;POINT INTO THIS ENTRY
	ADD	TA,HLDLOC
	MOVE	TC,(TA)		;GET THE DEBUGGING WORD
	MOVEM	TC,DBSPIF##	;REMEMBER IT WHILE WE GENERATE CODE.
	TXNE	TB,HE%RIN	;IF THIS IS READ..INTO
	 JRST	ENDIF5		; NO TAG NEEDED

;HAVE TO CREATE A TAG FOR DEBUGGING CODE
	TSWF	FAS3		;IN NON-RESIDENT SECTION?
	JRST	[LDB	CH,AS3BHO##+1	;YES
		JRST	.+2]
	LDB	CH,AS2BHO##+1
	HLRZ	TE,CH		;GET OP-CODE
	CAIE	TE,720000	;IS IT TAGGEN?
	JRST	ENDIF5		;NO, LEAVE IT ALONE, GENERATE WRONG CODE!
	LDB	TE,[POINT 3,CH,20]	;GET TABLE #
	CAIE	TE,AC.TAG##	;MAKE SURE ITS A TAG
	JRST	ENDIF5		;NO
	PUSH	PP,CH		;SAVE CURRENT INST
	MOVE	CH,[JRST.+ASINC,,AS.MSC]
	TSWF	FAS3
	JRST	[DPB	CH,AS3BHO+1	;CHANGE TO JRST .+3
		JRST	.+2]
	DPB	CH,AS2BHO+1
IFN MCS!TCS,<
	HRRZ	CH,DBSPIF
	CAIN	CH,DBCD.	;DBCD. NEEDS JRST .+4
	SKIPA	CH,[AS.DOT+4]
>
	MOVEI	CH,AS.DOT+3
	PUSHJ	PP,PUTASY	;FINISH OFF INST.
	POP	PP,CH
	HRRZ	TE,CH
	ANDI	TE,077777	;GET TAG NUMBER
	ADD	TE,TAGLOC##
	AOS	(TE)		;INCREMENT PC OF TAG
	PUSHJ	PP,PUTASN	;OUTPUT TAG AGAIN
ENDIF5:	HRRZ	CH,DBSPIF
	PUSHJ	PP,PUT.PJ##	;PUSHJ 17,DBXX.
	MOVE	CH,[AS.XWD##,,1]
	PUSHJ	PP,PUTASN
	LDB	CH,[POINT 13,DBSPIF+1,28]	;GET LINE NUMBER
	PUSHJ	PP,PUTASN
IFN MCS!TCS,<
	HRRZ	CH,DBSPIF	;GET ROUTINE
	CAIN	CH,DBCD.##	;CHECK FOR DEBUG ON CD-NAME
	JRST	[HLRZ	TA,DBSPIF	;YES, GET CD-NAME
		ADD	TA,CDLOC##	;ADD IN BASE
		PUSHJ	PP,DBGEN1##	;USE CODE IN MESGEN
		JRST	ENDIF6]
>
	HLRZ	CH,DBSPIF
	IORI	CH,AS.FIL	;CONVERT INTO FILTAB ADDRESS
	PUSHJ	PP,PUTASY	;XWD LINE #,FILTAB
ENDIF6:	SETZM	DBSPIF
	MOVE	TB,PTRHLD	;REGET PTRHLD
	POPJ	PP,		;RETURN
>;END IFN ANS74
;GENERATE CODE FOR "SPIF" OPERATOR

SPIFGN:
IFN ANS68,<
	TLNN	W1,ATINVK
>
IFN ANS74,<
	TLNN	W1,ATPINV##	;ALSO TEST FOR ATEOP
>
	JRST	SPIF5

SPIF3:	HLRZ	CH,W2
	ANDI	CH,LMASKS
	IORI	CH,AS.TAG
	HRLI	CH,XJRST.##	;SO OPTIMIZER WON'T REMOVE
	HRRZ	TA,CH
	PUSH	PP,CH
	PUSHJ	PP,REFTAG##	;REFERENCE THE TAG
	PUSHJ	PP,PUTASA	;OTHER CODE SET
	POP	PP,CH
	JRST	PUTASY

;NEITHER INVALID KEY NOR AT END--MUST BE SIZE ERROR

SPIF5:	MOVE	CH,[XWD SKIPN.,SZERA.]
	SKIPE	EMULSZ
	PUSHJ	PP,PUT.EX##
	SETZM	EMULSZ
	PUSHJ	PP,SPIF3	;PUT OUT THE JRST
	SKIPN	CH,ESZERA	;ANY TAG TO GO?
	POPJ	PP,		;NO--QUIT

	SETZM	ESZERA		;YES--CLEAR INDICATOR
	JRST	PUTTAG		;PUT OUT THE TAG--THEN QUIT
;GENERATE CODE TO COMPARE A FIELD TO ZEROES.

IFZERO:	TSWF	FAINAC		;IS 'A' IN AC'S?
	JRST	IFZ20		;YES

	MOVE	TE,ESIZEA
	MOVEM	TE,ESIZEZ

	HRRZ	TE,EMODEA
	CAILE	TE,DSMODE
	JRST	IFZ2
	TSWF	FANUM		;IS 'A' NUMERIC?
	JRST	IFZ19		;YES

	HRRZ	TD,W2		; [441] GET IF OPERATOR
	CAIN	TD,22		; [441] IFT ( IF A ZERO ) TYPE?
	 JRST	IFZZ0		; [441] YES USE ALGEBRAIC COMPARES

; IF A OP ZERO FOR A NON-NUMERIC USE CHAR COMPARE
	HRRZ	TD,IFZROS(TE)	;[1034]  [441] GET SOME KIND OF ZERO.
	SETO	CH,		;[1034] ALWAYS USE IN-LINE CODE
IFN ANS74,<
	SKIPLE	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	XCT	CSCHAR(TE)	;YES, GET CONVERTED ZERO
	PUSHJ	PP,TSTCOL	;[1004] NEED OTHER COL. SEQ.?
	  JRST	[MOVE	TE,EMODEA	;[1004] YES
		HRRZ	TD,OTHZRO(TE)	;[1004] GET OTHER MODE'S ZERO
		JRST	.+1]		;[1004]
>
	JRST	IFSP1		;[1034]

;NOT DISPLAY

IFZ2:	CAIN	TE,C3MODE	;IF THE OPERAND IS COMP-3,
	JRST	IFZ19		; GO GET IT INTO THE AC'S.

	TLZE	W1,NOTF
	TLC	W1,CONCMP
	PUSHJ	PP,SUBSCD
	HRRZ	TE,EMODEA
	CAIN	TE,D2MODE
	JRST	IFZ5

IFZ3:	MOVSI	CH,SKIP.
	LDB	TE,CONDIT
	ROT	TE,-^D9
	ADD	CH,TE
	PUSHJ	PP,PUT.A
	JRST	JFALSE

IFZZ0:	HRRZ	TD,IFZROS(TE)	;GET SOME KIND OF ZERO
	MOVEM	TD,ESAVAC	;SAVE ZERO CHAR
IFE BIS,< HLRZ CH,IFZROS(TE) >	;GET A ROUTINE'S EXTAB ADDRESS
IFN BIS,< SETO CH, >		;
	JRST	IFZ1D

IFZROS:	XWD	ZERO%6##,20		;DISPLAY-6 ZERO.
	XWD	ZERO%7##,60		;DISPLAY-7 ZERO.
	XWD	ZERO%9##,360		;DISPLAY-9 ZERO.

IFN ANS74,<
OTHZRO:	XWD	0,360		;[1004] DISPLAY-9 ZERO
	XWD	0,360		;[1004] DISPLAY-9 ZERO
	XWD	0,60		;[1004] DISPLAY-7 ZERO
>
IFZ5:	LDB	TE,CONDIT
	JRST	@.(TE)
	EXP	IFZ6		;=
	EXP	IFZ12		;> [177]
	EXP	IFZ9		;NOT <
	EXP	IFZ3		;<
	EXP	IFZ10		;NOT >
	EXP	IFZ8		;NOT =

IFZ6:	MOVSI	CH,SKIPN.
	PUSHJ	PP,PUT.A
	MOVSI	CH,SKIPE.
IFZ6A:	AOS	EINCRA		; SKIPX AC+1 [177]
	PUSHJ	PP,PUT.A

IFZ7:	SOS	EINCRA
	JRST	JFALSE

IFZ8:	MOVSI	CH,SKIPN.
	PUSHJ	PP,PUT.A
	AOS	EINCRA
	MOVSI	CH,SKIPE.
	PUSHJ	PP,PUT.A
	MOVSI	CH,SKIPA.
	PUSHJ	PP,PUTASY
	JRST	IFZ7

IFZ9:	MOVSI	CH,SKPGE.	;[177] SKIPGE AC
	PUSHJ	PP,PUT.A	;[177] PUT IN ASSEMBLY FILE
	JRST	JFALSE	 	;[177] ENTER JRST FALSE
				;[177] NO NEED TO CHECK 2ND WORD SINCE  G.E. 0

IFZ10:	MOVSI	CH,SKPGE.	;[177] SKIPGE AC
	PUSHJ	PP,IFZ13
	JRST	IFZ6

IFZ12:	MOVSI	CH,SKPLE.	;[177] SKIPLE AC,
	PUSHJ	PP,IFZ13
	MOVSI	CH,SKIPN.	;[177] SKIPN AC
	PUSHJ	PP,PUT.A	;[177] PUT IN ASSY FILE
	MOVSI	CH,SKIPN.	;[177] SKIPN AC+1
	JRST	IFZ6A		;[177] FINISH UP

IFZ13:	PUSHJ	PP,PUT.A	;[177] PUT IN ASSY FILE
	MOVE	CH,[XWD JRST.+ASINC,AS.MSC]	;[177] PUT IN JRST .+4
	PUSHJ	PP,PUTASY	;[177] PUT IN ASSY FILE
	HRRZI	CH,AS.DOT+4	;[177] .+4
	JRST	PUTASN		;[177]
;COMPARE A FIELD AGAINST ZEROES  (CONT'D).

;"A" IS NUMERIC DISPLAY OR COMP-3.

IFZ19:	PUSHJ	PP,MOVXAC	; [413] GET IT INTO AC'S
	SWON	FAINAC;


;"A" IS IN THE AC'S.

IFZ20:	HRRZ	TE,EMODEA
	CAIN	TE,D2MODE
	JRST	IFZ22
IFZ21:				;ENTER HERE FROM CAMX AC,0

	MOVSI	CH,JUMP.
	LDB	TE,CONDIT
	TLNN	W1,NOTF
	TRC	TE,CONCMP/100
	ROT	TE,-^D9
	ADD	CH,TE

	MOVE	TE,EAC
	DPB	TE,CHAC
	JRST	JFLSEA

IFZ22:	LDB	TE,CONDIT
	TLNE	W1,NOTF
	TRC	TE,CONCMP/100
	JRST	@.(TE)
	EXP	IFZ26		;=
	EXP	IFZ23		;>
	EXP	IFZ24		;NOT <
	EXP	IFZ23A
	EXP	IFZ25		;NOT >
	EXP	IFZ27		;NOT =

IFZ23:	MOVE	CH,[XWD JUMPG.+ASINC,AS.MSC]	;[177] JUMPG AC,
	PUSHJ	PP,PUT.XA	;[177] ASSEMBLE IT
	HRRZI	CH,AS.DOT+3	;[177] RH OF JUMPG .+3
	PUSHJ	PP,PUTASN	;[177] ASSEMBLE IT
	MOVSI	CH,JUMPN.	;[177] JUMPN AC,
	MOVE	TE,EAC		;[177] GET AC
	DPB	TE,CHAC		;[177] PUT IN AC FIELD
	PUSHJ	PP,JFLSEA	;[177] JUMPN AC, FALSE
	MOVSI	CH,JUMPE.	;[177] JUMPE AC+1,
	AOSA	EAC		;[177] BUMP AC
IFZ23A:	MOVSI	CH,JMPGE.	;[177] FOR <, JUMPGE AC,
IFZ23B:	MOVE	TE,EAC
	DPB	TE,CHAC
	JRST	JFLSEA

IFZ24:	MOVE	CH,[XWD JUMPG.+ASINC,AS.MSC]	;[177] JUMPG AC.
	PUSHJ	PP,PUT.XA	;[177] ASSEMBLE IT
	HRRZI	CH,AS.DOT+2	;[177] JUMPG AC,.+2
	PUSHJ	PP,PUTASN	;[177] ASSEMBLE
	MOVSI	CH,JUMPN.	;[177] JUMPN AC+1,
	JRST	IFZ23B		;[177] FINISH UP

IFZ25:	MOVE	CH,[XWD JUMPL.+ASINC,AS.MSC]
	MOVE	TE,EAC
	DPB	TE,CHAC

	PUSHJ	PP,PUTASY
	HRRZI	CH,AS.DOT+3
	PUSHJ	PP,PUTASN

IFZ26:	MOVSI	CH,JUMPN.
	MOVE	TE,EAC
	DPB	TE,CHAC
	PUSHJ	PP,JFLSEA

IFZ261:	MOVE	TE,EAC
	ADDI	TE,1
	DPB	TE,CHAC
	JRST	JFLSEA

IFZ27:	MOVE	CH,[XWD JUMPN.+ASINC,AS.MSC]
	PUSHJ	PP,PUT.XA
	HRRZI	CH,AS.DOT+2	; .+2
	PUSHJ	PP,PUTASN
	MOVSI	CH,JUMPE.
	JRST	IFZ261
;GENERATE CODE TO COMPARE AN ALPHANUMERIC FIELD TO SPACES.

IFSPAC:	MOVE	TE,ESIZEA
	MOVEM	TE,ESIZEZ
	SWOFF	FASIGN;

	MOVE	TE,EMODEA
	CAILE	TE,DSMODE	;IF IT'S NOT SOME KIND OF
	JRST	BADFIG		; DISPLAY, IT'S AN ERROR.

	HRRZ	TD,IFSPCS(TE)	;GET SOME KIND OF SPACE.
	SETO	CH,		;[1034] ALWAYS GENERATE INLINE CODE IF POSSIBLE
IFN ANS74,<
	SKIPLE	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	XCT	CSCHAR(TE)	;[1034] [720] YES, GET CONVERTED SPACE
	PUSHJ	PP,TSTCOL	;[1004] SEE IF OTHER COL. SEQ.
	  JRST	[MOVE	TE,EMODEA	;[1004]
		HRRZ	TD,OTHSPC(TE)	;[1004] GET THE OTHER COL. SEQ. SPACE
		JRST	.+1]		;[1004]
>;END IFN ANS74

IFSP1:	MOVEM	TD,ESAVAC	;[1034]
	PUSHJ	PP,SPECIL	;[1034]
	  POPJ	PP,		;[1034] "CAM" GENERATED--EXIT
IFN ANS74,<
	SKIPLE	COLSEQ		;[1034] IF PROGRAM COLL. SEQ. = ALPHABET-NAME
	JRST	IFQHV2		;[1034] WE MUST WORRY ABOUT EQUIVALENT CHARS.
>
IFZ1D:	LDB	TE,CONDIT	;[1034] IF CONDITION IS
	CAIE	TE,EQ		;[1034]  EQUAL OR
	CAIN	TE,NOTEQ	;[1034]  NOT EQUAL,
	JRST	IFSP3		;[1034]  SPECIAL PROCESSING
	JRST	IFQHV2		;[1034]  ELSE NORMAL

IFSP3:	JUMPL	CH,IFSP3A	;[1034] [717] IF GENERATING INLINE CODE SIZE DOES'NT MATTER
	HRRZ	TE,ESIZEA	;[717] GET LENGTH OF ITEM
	SUBI	TE,10		;[717] TO GET REMAINDER OF 3777
	IDIVI	TE,3770		;[717] FIND NUMBER OF PIECES TO BREAK IT INTO
	ADDI	TD,10		;[717] AVOIDS REMAINDER OF 0
	PUSH	PP,TD		;[717] SAVE REMAINDER
	MOVEM	TE,ECNTA	;[717] SAVE COUNT OF LEADING PIECES
	JUMPE	TE,IFSP3C	;[717] ONLY ONE PIECE
IFSP3B:	MOVEI	TE,3770		;[717] LENGTH OF FIRST PIECES IS CONSTANT
	MOVEM	TE,ESIZEA	;[717] ...
	MOVEM	TE,ESIZEZ	;[717] ...
	PUSH	PP,CH		;SAVE CONVERSION ROUTINE
	PUSHJ	PP,IFSP3A	;AND DO FIRST PART
	POP	PP,CH
	MOVE	TE,EMODEA	;GET MODE
	MOVE	TE,[EXP 3770/6,3770/5,3770/4](TE)
	ADDM	TE,EINCRA	;MOVE DOWN STRING
	SOSLE	ECNTA		;[717] DECREMENT PIECE COUNT
	JRST	IFSP3B		;[717] LOOP UNTIL STRING IS SMALL ENOUGH

IFSP3C:	POP	PP,TE		;[717] GET SIZE OF LAST PIECE
	MOVEM	TE,ESIZEA	;[717] RESTORE IT
	MOVEM	TE,ESIZEZ	;[717] ...
IFSP3A:	TLZE	W1,NOTF
	TLC	W1,CONCMP
	PUSH	PP,CH		;COULDN'T USE "CAM"

	;IF WE HAVE PUT -1 IN CH, USE INLINE CODE (EXTEND IF BIS).
	; ELSE, CH WILL CONTAIN AN EXTAB ADDRESS - USE OLD METHOD
	JUMPGE	CH,IFSP4	;[1034] NOT INLINE CODE, SETUP OPERAND OLD WAY
	PUSHJ	PP,NB1PAR##
	POP	PP,CH
	JRST	BFIGCM		;GENERATE INLINE COMPARISON, THEN "JRST FALSE"

IFSP4:	PUSHJ	PP,B1PAR	;[1034]
	POP	PP,CH
IFSP5:	TSWF	FASUB;			;IS THE OPERAND SUBSCRIPTED?
	SETZ	EACC,			;YES, NOTE IT FOR PMOPV.
	PUSHJ	PP,PMOPV.##		;GO GENERATE
					;	HRRZI	16,	PARM
					;	PUSHJ	17,	RTN
IFSP6:	SKIPLE	ECNTA			;[717] ON LAST PIECE?
	JRST	JMPOUT			;[717] NO
	MOVSI	CH,SKIPA.
	TLNN	W1,EQUALF
	PUSHJ	PP,PUTASY
	JRST	JFALSE

BADFIG:	MOVEI	DW,E.211
	MOVE	TC,OPERND
	MOVE	TC,0(TC)
	LDB	LN,TCLN
	LDB	CP,TCCP
	JRST	FATAL

IFSPCS: EXP	0			;DISPLAY-6 SPACE.
	EXP	40			;DISPLAY-7 SPACE.
	EXP	100			;DISPLAY-9 SPACE.

IFN ANS74,<
CSCHAR:	HLRZ	TD,PRGCOL##+240(TD)	;SIXBIT
	HLRZ	TD,PRGCOL(TD)		;ASCII
	HRRZ	TD,PRGCOL(TD)		;EBCDIC

OTHSPC:	XWD	177,100			;[1004] DISPLAY-9 QUOTE ,, SPACE
	XWD	177,100			;[1004] DISPLAY-9 QUOTE ,, SPACE
	XWD	 42, 40			;[1004] DISPLAY-7 QUOTE ,, SPACE
>
;HERE TO GENERATE INLINE CODE TO
;COMPARE A STRING AGAINST A FIG. CONSTANT
; (ZEROES OR SPACES)
;CALL:
;	<GEN CODE TO PUT BYTE PTR IN AC5>
;	ESAVAC/ A CHARACTER OF FIG. CONSTANT IN THE CORRECT MODE
;	GENERATES:
;		EXTEND OR EQUIVALENT CODE
;		JRST FALSE 	;CONDITION (EQ,NOTEQ) NOT MET

BFIGCM:
IFN BIS,<
	MOVE	TE,ESIZEA	;IF SIZE IS 1
	SOJE	TE,BFIGC1	;DON'T USE EXTEND
	MOVE	CH,[MOVEI.+AC4+ASINC,,AS.CNB]
	PUSHJ	PP,PUTASY##
	MOVE	CH,ESIZEA
	PUSHJ	PP,PUTASN##

	MOVE	CH,[SETZB.+AC7,,10]
	PUSHJ	PP,PUTASY##

	MOVE	TA,[XTNLIT,,1]
	PUSHJ	PP,STASHP
	MOVSI	TA,(CMPSE)
	TLNN	W1,EQUALF
	MOVSI	TA,(CMPSN)
	PUSHJ	PP,STASHQ
	MOVE	TA,[OCTLIT,,1]
	PUSHJ	PP,STASHP
	SETZ	TA,
	PUSHJ	PP,STASHQ
	MOVE	TA,[XWDLIT,,2]
	PUSHJ	PP,STASHP
	SETZ	TA,
	PUSHJ	PP,STASHQ
	MOVE	TA,ESAVAC	;GET CHARACTER VALUE
	PUSHJ	PP,POOLIT	;THAT'S ALL!

	PUSHJ	PP,PUTASA##	;EXTEND, IN 2ND SET OF OPCODES
	MOVSI	CH,XTND.+AC4
	PUSHJ	PP,PUT.LD##	;GENERATE THE EXTEND

	SKIPE	PLITPC
	 JRST	JFALSE		;"JRST FALSE"
	MOVEI	TE,3
	ADDM	TE,ELITPC##	;UPDATE ELITPC IF NOT POOLED
	JRST	JFALSE		;PUT OUT JUMP TO FALSE PATH
>;END IFN BIS
IFE BIS,<
	TLNN	W1,EQUALF	;[1040] IS CONDITION =?
	 JRST	BFIGC3		;[1040] NOT =, USE DIFFERENT CODE
	MOVE	CH,ESIZEA	;[1034]
	CAIG	CH,2		;[1034] IF SIZE IS 2 OR LESS
	JRST	BFIGC2		;[1034] USE STRAIGHT LINE CODE
	HRLI	CH,MOVEI.+AC7	;[1034] WE NEED A LOOP
	PUSHJ	PP,PUTASY	;[1034] GENERATE MOVEI 7,SIZE
BFIGC2:	PUSHJ	PP,BFIGC1	;[1034] GENERATE COMPARE CODE
	MOVE	CH,ESIZEA	;[1034] SEE IF WE NEED LOOP
	SOJE	CH,JFALSE	;[1034] NOT IF SIZE = 1
	PUSHJ	PP,JFALSE	;[1034] YES, PUT OUT FALSE JUMP
	MOVE	CH,ESIZEA	;[1034]
	CAIN	CH,2		;[1034] IS IT THE OTHER SPECIAL CASE?
	JRST	[PUSHJ PP,BFIGC1	;[1034] YES, GENERATE SECOND TEST
		JRST	JFALSE]		;[1034] AND EXIT
	MOVE	CH,[SOJG.+AC7+ASINC,,AS.MS2##]	;[1034] NO 
	PUSHJ	PP,PUTASY	;[1034] 
	MOVEI	CH,AS.DOT+3	;[1034] 
	JRST	PUTASN		;[1034] GENERATE SOJG 7,.-3
>

BFIGC1:	MOVE	CH,[ILDB.,,5]
	PUSHJ	PP,PUT.XA##	;GEN ILDB AC,5

;CAIE AC,"CHAR"

	MOVSI	CH,CAIE.
	TLNN	W1,EQUALF
	MOVSI	CH,CAIN.
	HRR	CH,ESAVAC##
IFN BIS,<
	PUSHJ	PP,PUT.XA##
	JRST	JFALSE
>
IFE BIS,<
	JRST	PUT.XA##	;[1034]
>
IFE BIS,<			;[1040] NOT = CODE
BFIGC3:	MOVE	CH,ESIZEA	;[1040] IF SIZE IS 1,
	CAIN	CH,1		;[1040]
	 JRST	[PUSHJ PP,BFIGC1 ;[1040] GENERATE THE "CAIN"
		JRST JFALSE]	;[1040] GEN "JRST FALSE"
	HRLI	CH,MOVEI.+AC7	;[1040] MAKE A LOOP
	PUSHJ	PP,PUTASY	;[1040]
	MOVE	CH,[ILDB.,,5]	;[1040] GEN "ILDB AC,5"
	PUSHJ	PP,PUT.XA##	;[1040]
	MOVSI	CH,CAIE.	;[1040] GEN "CAIE AC,CHAR"
	HRR	CH,ESAVAC##	;[1040]
	PUSHJ	PP,PUT.XA##	;[1040]
	MOVE	CH,[JRST.+ASINC,,AS.MSC##] ;[1040] GEN "JRST TRUE"
	PUSHJ	PP,PUTASY	;[1040]
	MOVEI	CH,AS.DOT+3	;[1040] ...WHICH IS .+3
	PUSHJ	PP,PUTASN	;[1040]
	MOVE	CH,[SOJG.+AC7+ASINC,,AS.MS2##] ;[1040] CHECK ALL CHARS
	PUSHJ	PP,PUTASY	;[1040] "SOJG AC7,.-3"
	MOVEI	CH,AS.DOT+3	;[1040]
	PUSHJ	PP,PUTASN	;[1040]
	JRST	JFALSE		;[1040] GEN "JRST FALSE"
>;[1040] END IFE BIS
;GENERATE CODE TO COMPARE A FIELD AGAINST QUOTES

IFQUOT:
IFN ANS68,<
	TSWF	FANUM		;IS "A" NUMERIC?
	JRST	BADFIG		;YES--ERROR
>
	HRRZ	TE,EMODEA	;SEE WHAT A'S
	HRRZ	TD,HIVQOT(TE)	;GET SOME KIND OF QUOTE.
IFN ANS74,<
	SKIPLE	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	XCT	CSCHAR(TE)	;YES, GET CONVERTED QUOTE
	PUSHJ	PP,TSTCOL	;[1004] NEED OTHER COL. SEQ.?
	  JRST	[MOVE	TE,EMODEA	;[1004] YES
		HLRZ	TD,OTHSPC(TE)	;[1004] GET OTHER MODE'S QUOTE
		JRST	.+1]		;[1004]
>
	JRST	IFQHV0		;GO GENERATE SOME CODE.


;GENERATE CODE TO COMPARE A FIELD AGAINST HIGH-VALUES

IFHIV:	HRRZ	TE,EMODEA

	CAILE	TE,DSMODE	;IS A SOME KIND OF DISPLAY?
	JRST	IFHV1		;NO, GO WORRY OVER NUMBERS.
IFN ANS74,<
	SKIPL	TD,COLSEQ	;[1374] WAS ASCII OR EBCDIC COLL SEQ DECLARED?
	JRST	IFHIVA		;[1374] NO, CONT
	TRNE	TD,%AN.EB	;[1374] YES, WAS IT EBCDIC?
	MOVEI	TE,D9MODE	;[1374] YES, CHANGE MODE OF HIGH-VAL TO EBCDIC
IFHIVA:				;[1374]
>
	HLRZ	TD,HIVQOT(TE)	;GET SOME KIND OF HIGH VALUES.
	JRST	IFQHV0		;GO GENERATE SOME CODE.

IFHV1:	PUSHJ	PP,HIVAL##
	MOVE	EACC,EHIVAL

IFHIV2:	TSWT	FAINAC		;IS "A" IN THE AC'S?
	PUSHJ	PP,MXAC.	;NO--GET IT THERE

	HRRZ	TE,EMODEA
	CAIN	TE,D2MODE
	JRST	IFHIV3

	MOVE	CH,[XWD CAM.+ASINC,AS.MSC]
	LDB	TE,CONDIT
	ROT	TE,-^D8
	ADD	CH,TE
	PUSHJ	PP,PUT.XA
	HRRZ	CH,EACC
	PUSHJ	PP,PUTASN

	JRST	JFALSE

	INTERN	HIVQOT			;[547] MAKE INTERN FOR MSCGEN
HIVQOT:	XWD	77,2			;DISPLAY-6 HIGH-VALUES, QUOTE.
	XWD	177,42			;DISPLAY-7 HIGH-VALUES, QUOTE.
	XWD	377,177			;DISPLAY-9 HIGH-VALUES, QUOTE.
;GENERATE CODE FOR 2-WORD COMPARE

IFHIV3:	LDB	TE,CONDIT
	JRST	@[EXP IFHV21,IFHV22,IFHV23,IFHV24,IFHV25,IFHV26]-1(TE)

;HERE FOR EQUAL OR NOTEQUAL
IFHV21: IFHV26:
	MOVE	CH,[CAMN.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	PUSHJ	PP,PUTASN
	MOVE	CH,[CAME.+ASINC+AC1,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	ADDI	CH,1
	PUSHJ	PP,PUTASN
	MOVEI	TC,AS.DOT+2
	TLNN	W1,EQUALF
	PUSHJ	PP,JOUT		;NOT EQUAL
	JRST	JFALSE

;HERE FOR LESS THAN OR LESS THAN OR EQUAL
IFHV24: IFHV25:
	MOVE	CH,[CAMGE.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	PUSHJ	PP,PUTASN
	MOVEI	TC,AS.DOT+4
	PUSHJ	PP,JOUT
	MOVE	CH,[CAMG.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	PUSHJ	PP,PUTASN
	MOVE	CH,[CAML.+ASINC+AC1,,AS.MSC]
	TLNE	W1,EQUALF
	HRLI	CH,CAMLE.+ASINC+AC1
IFHV20:	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	ADDI	CH,1
	PUSHJ	PP,PUTASN
	JRST	JFALSE

;HERE FOR GREATER THAN OR GREATER THAN OR EQUAL
IFHV22: IFHV23:
	MOVE	CH,[CAMLE.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	PUSHJ	PP,PUTASN
	MOVEI	TC,AS.DOT+4
	PUSHJ	PP,JOUT
	MOVE	CH,[CAML.+ASINC,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	CH,EACC
	PUSHJ	PP,PUTASN
	MOVE	CH,[CAMG.+ASINC+AC1,,AS.MSC]
	TLNE	W1,EQUALF
	HRLI	CH,CAMGE.+ASINC+AC1
	JRST	IFHV20
;GENERATE CODE TO COMPARE A FIELD AGAINST LOW-VALUES

IFLOV:	HRRZ	TE,EMODEA
	SETZM	ESAVAC
	CAIG	TE,DSMODE
	JRST	IFQHV1

	CAIE	TE,FPMODE
	CAIN	TE,F2MODE
	JRST	IFLOV2

	PUSHJ	PP,LOVAL##
	MOVE	EACC,ELOVAL
	JRST	IFHIV2

IFLOV2:	PUSHJ	PP,FPLOV.
	MOVE	EACC,EFPLOV
	JRST	IFHIV2
;GENERATE CODE TO COMPARE A DISPLAY FIELD AGAINST QUOTES OR HIGH-VALUES.
;EITHER A QUOTE OR A HI-VALUE IS IN TD.

IFQHV0:	MOVEM	TD,ESAVAC

;GENERATE CODE TO COMPARE A DISPLAY FIELD AGAINST QUOTES, HIGH-VALUES, OR
;LOW-VALUES.
;CHARACTER TO COMPARE AGAINST IS IN ESAVAC.

IFQHV1:	PUSHJ	PP,SPECIL
	  POPJ	PP,		;"CAM" GENERATED--EXIT

IFQHV2:	PUSHJ	PP,SUBSCA
	TSWF	FASUB;
	JRST	IFQHV3

	MOVE	TA,[XWD BYTLIT,2]
	PUSHJ	PP,STASHP
	PUSHJ	PP,MBYTPA
	PUSHJ	PP,POOL
	MOVE	CH,[XWD MOV+ASINC+SAC,AS.MSC]
	PUSHJ	PP,PUTASY
	SKIPN	CH,PLITPC
	HRRZ	CH,ELITPC
	IORI	CH,AS.LIT
	PUSHJ	PP,PUTASN
	SKIPN	PLITPC
	AOS	ELITPC

IFQHV3:	SETZM	EAC
	MOVSI	CH,MOV##	;GENERATE <MOVEI 0,SIZE>
	HRRZ	TC,ESIZEA
	PUSHJ	PP,PUT.LA

	PUSHJ	PP,GETTAG
	MOVEM	CH,ESAVAC+1
	PUSHJ	PP,PUTTAG

	MOVE	CH,[XWD ILDB.+AC2,SXR]
	PUSHJ	PP,PUTASY
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SEE IF WE NEED OTHER COL. SEQ.
	  JRST	[MOVE	TC,EMODEA	;[1004] YES
		MOVSI	CH,LDB.+AC2	;[1004] NEED TO CONVERT FROM ONE
		HRR	CH,SUTBL(TC)	;[1004] CHARACTER SET TO THE OTHER
	IFE TOPS20,<
		TSWT	FREENT		;[1004] NO INDIRECT IF /R
	>
	IFN TOPS20,<
		SKIPN	RENSW##		;[1004] NO INDIRECT IF /R
	>
		TLO	CH,(@)		;[1004] TURN ON INDIRECT BIT IF NOT /R
		PUSHJ	PP,PUT.EX	;[1004]
		JRST	IFQHV4]		;[1004]
	SKIPG	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	JRST	IFQHV4		;NO
	MOVE	CH,[MOV+AC2+ASINC+2,,AS.MSC]
	PUSHJ	PP,PUTASY
	HRRZ	TC,EMODEA
	MOVE	CH,COLSQS(TC)	;GET LITERAL BASE
	PUSHJ	PP,PUTASN
IFQHV4:>

	LDB	TE,CONDIT
	CAIE	TE,EQ
	JRST	IFQHV5

	SKIPN	CH,ESAVAC		;GET COMPARE VALUE
	JRST	[MOVSI	CH,JUMPN.+AC2		;SIXBIT LOW-VALUES
		PUSHJ	PP,JFLSEA		;GENERATE JUMPN 2,FALSE
		JRST	IFQHV7]
	HRLI	CH,CAIE.+AC2
	PUSHJ	PP,PUTASY
	PUSHJ	PP,JFALSE

IFQHV7:	HRRZ	TA,ESAVAC+1	;THIS IS A TAG WE ARE ABOUT TO REFERENCE
	PUSHJ	PP,REFTAG##	;SO REMEMBER THAT
	MOVSI	CH,SOJG.
	HRR	CH,ESAVAC+1
	JRST	PUTASY

IFN ANS74,<
SUTBL:	EXP	SU.S69##	;[1004] SIXBIT TO EBCDIC
	EXP	SU.S79##	;[1004] ASCII  TO EBCDIC
	EXP	SU.S97##	;[1004] EBCDIC TO ASCII
>
;GENERATE CODE TO COMPARE A DISPLAY FIELD AGAINST QUOTES, ETC.  (CONT'D)

;A "CAM" WOULDN'T DO, AND IT IS NOT "EQUALS".

IFQHV5:	MOVSI	CH,CAIN.+AC2	;GENERATE: CAIN 2,<VALUE>
	HRR	CH,ESAVAC
	PUSHJ	PP,PUTASY
	HRRZ	TA,ESAVAC+1	;GET TAG TO REFERENCE
	PUSHJ	PP,REFTAG##	; SO OPTIMIZER KNOWS
	MOVSI	CH,SOJG.	;		SOJG 0,%X
	HRR	CH,ESAVAC+1
	PUSHJ	PP,PUTASY

	LDB	TE,CONDIT	;IS IT
	CAIE	TE,NOTEQ	;  'NOT EQUAL'?
	JRST	IFQHV6		;NO
	MOVSI	CH,JMPLE.	;		JUMPLE 0,<FALSE>
	JRST	JFLSEA

;A "CAM" WOULDN'T DO, AND IT'S NEITHER "EQUALS" NOR "NOT EQUALS".

IFQHV6:	SKIPN	ESAVAC		;IS THE CONSTANT = 0?
	JRST	IFQHV8		;YES, USE JUMPX INSTEAD
	MOVSI	CH,CAI.+AC2
	ROT	TE,-^D8
	ADD	CH,TE
	HRR	CH,ESAVAC
	PUSHJ	PP,PUTASY
	JRST	JFALSE

IFQHV8:	MOVSI	CH,JUMP.+AC2
	LDB	TE,CONDIT
	TLNN	W1,NOTF
	TRC	TE,CONCMP/100
	ROT	TE,-^D9
	ADD	CH,TE
	JRST	JFLSEA
;COMPARE AC'S AGAINST "TODAY"

IFN ANS68,<

IFATDY:	PUSHJ	PP,PUTEMP

;COMPARE A FIELD AGAINST "TODAY"

IFTODY:	MOVE	CH,[XWD EPJPP,TODAY.##]
	PUSHJ	PP,PUTASY

	MOVSI	TE,^D36
	MOVEM	TE,EBASEB
	SETZM	TE,EINCRB
	MOVEI	TE,^D12
	MOVEM	TE,ESIZEB
	SETZM	EDPLB
	MOVEI	TE,D6MODE
	MOVEM	TE,EMODEB

	SWON	FBNUM;
	TSWT	FANUM;
	JRST	IFDD

	PUSHJ	PP,SWAPIT
	PUSHJ	PP,MXAC.T##	;SKIP CHECKING TO SEE IF A IS ALREADY IN
				; THE AC'S WHEN WE GO TO MOVE IT THERE 
				; SINCE IT IS.  THE ONLY PROBLEM IS IT
				; IS DISPLAY-6 AND WE WANT IT TO BE COMP.

	SWON	FAINAC;
	JRST	IFGN0
>
;GENERATE CODE TO SEE IF A FIELD IS ALPHABETIC

IFALF:  MOVE    TE,	EMODEA
	CAILE	TE,	DSMODE		;IF IT'S NOT DISPLAY,
	JRST		IFNM3		; IT'S AN ERROR.
	HLRZ	CH,	ALFNUM(TE)	;GET THE ROUTINE'S EXTAB LINK.
	TSWF		FANUM		;IS IT NUMERIC?
	JRST		IFNM3		;YES--ERROR
IFE BIS,<	JRST	IFNM2		;NO>
IFN BIS,<
	;GENERATE CODE TO DO EXTEND IN-LINE

	PUSHJ	PP,	NB1PAR		;[550] GET BP TO PARAM IN AC5
	MOVE	TA,	[OCTLIT,,1]	;GENERATE OCTAL LITERAL
	PUSHJ	PP,	STASHP		; POOLED, TO HOLD AC4 CONTENTS
	HRRZ	TA,	ESIZEA		;RH OF AC4 HAS SIZE
	TLO	TA,	400000		;LH HAS SIGNIFICANCE BIT
	PUSHJ	PP,	POOLIT		;GENERATE AND POOL LITERAL
	HRLZI	CH,	MOV+AC4		;NOW GENERATE MOVE AC4,LITERAL
	PUSHJ	PP,	PUT.LD		;
	SKIPN		PLITPC		;BUMP LITERAL COUNT IF NOT POOLED
	AOS		ELITPC		;
;[550]	PUSHJ	PP,	NB1PAR		;GET BP TO PARAM IN AC5
	MOVE	CH,	[MOVEI.+AC7+ASINC,,AS.CNB]	;GENERATE MOVE OF
	PUSHJ	PP,	PUTASY		;SIZE TO AC7 ALSO
	HRRZ	CH,	ESIZEA		;HALF WORD SIZE ALLOWED
	PUSHJ	PP,	PUTASN		;DONT INCR PC COUNT
	MOVSI	CH,	MOVEI.+AC10	;NOW GENERATE SETZ AC10,0
	PUSHJ	PP,	PUTASY		;SO NOT TO GET DESTINATION STRING
	MOVE	TA,	[XTNLIT,,1]	;GENERATE THE EXTEND INSTR
	PUSHJ	PP,	STASHP		;POOLED IF POSSIBLE.
	MOVE	TA,	EMODEA		;GET TABLE FOR EXTEND
	MOVE	TA,	ALPS.T(TA)	;BY LOOKUP IN TABLE
IFE TOPS20,<
	TSWF		FREENT		;NO INDIRECT IF /R
>
IFN TOPS20,<
	SKIPE		RENSW##		;NO INDIRECT IF /R
>
	TLZ	TA,	(@)		;SO TURN IT OFF
	PUSHJ	PP,	POOLIT		;GENERATE LITERAL POOLED
	PUSHJ	PP,	PUTASA		;EXTEND INSTR IS IN SECOND SET
	MOVSI	CH,	XTND.##+AC4	;
	PUSHJ	PP,	PUT.LD		;OUTPUT USING LAST LITERAL (THE MOVST)
	SKIPN		PLITPC		;BUMP LITERAL COUNT IF NECESSARY
	AOS		ELITPC		;
	PUSHJ	PP,	PUTASA
	MOVE	CH,	[ERROR.##+AC17,,XTND.E##]	;ERROR IF EXTEND NOT SKIP
	PUSHJ	PP,	PUT.EX		;
	MOVE	CH,	[TLNE.+AC4+ASINC,,AS.CNB]	;GENERATE TEST BIT
	TLNE	W1,	NOTF				;SKIP FOR "IF X IS ALPHABETIC"
	MOVE	CH,	[TLNN.+AC4+ASINC,,AS.CNB]	;AS OPPOSED TO "IF X NOT ALPHABETIC"
	PUSHJ	PP,	PUTASY		; INSTR TO SKIP IF TRUE
	MOVEI	CH,	100000		;WE ARE TESTING THE M BIT
	PUSHJ	PP,	PUTASN		;
	JRST		JFALSE		;GO TO FALSE BRANCH

ALPS.T:	MOVST	@ALPS.6##		;SIXBIT
	MOVST	@ALPS.7##		;SEVEN BIT
	MOVST	@ALPS.9##		;EBCDIC

>	;END IFN BIS
;GENERATE CODE TO SEE IF A FIELD IS NUMERIC

IFNUM:	MOVE	TE,EMODEA
	CAIN	TE,C3MODE		;COMP-3?
	SETO	TE,			;YES, MAKE INDEX VALID
	CAILE	TE,DSMODE		;IF IT'S NOT DISPLAY,
	JRST	IFNM4			; IT'S ALWAYS NUMERIC, COMPLAIN.
	HRRZ	CH,ALFNUM(TE)		;GET THE ROUTINE'S EXTAB LINK.

	MOVE	TA,ETABLA
	PUSHJ	PP,LNKSET
	LDB	TE,DA.CLA
	CAIN	TE,ALPHAB
	JRST	IFNM3

IFNM2:	MOVE	TE,ESIZEA
	MOVEM	TE,ESIZEZ
	JRST	IFSP3

IFNM3:	MOVEI	DW,E.211
	LDB	LN,W1LN
	LDB	CP,W1CP
	JRST	FATAL

IFNM4:	MOVEI	DW,E.212
	TLNE	W1,NOTF
	MOVEI	DW,E.213
	LDB	LN,W1LN
	LDB	CP,W1CP
	PUSHJ	PP,WARN
	TLNE	W1,NOTF
	JRST	JFALSE
	POPJ	PP,

;EXTAB LINKS FOR ALPHABETIC AND NUMERIC ROUTINES.

	EXP		NUM%3##		;COMP-3
ALFNUM:	XWD	ALF%6##,NUM%6##		;DISPLAY-6.
	XWD	ALF%7##,NUM%7##		;DISPLAY-7.
	XWD	ALF%9##,NUM%9##		;DISPLAY-9.
;GENERATE CODE TO SEE IF A FIELD IS POSITIVE

IFPOS:	MOVE	TE,EMODEA

	CAILE	TE,	DSMODE		;IF IT'S NOT DISPLAY, GO
	JRST		IFPOS3		; DO A NUMERIC COMPARISON.
	HLRZ	CH,	POSNEG(TE)	;SELECT THE ROUTINE'S EXTAB LINK.

IFPOS2:	MOVE	TA,ETABLA
	PUSHJ	PP,LNKSET
	LDB	TE,DA.CLA
	CAIE	TE,NUMERC
	JRST	IFNM3
	JRST	IFNM2

IFPOS3:	TSWT	FAINAC;			;IF THE OPERAND IS IN THE AC'S
	CAIN	TE,	C3MODE		; OR IS COMP-3, GO USE A JUMP.
	JRST		IFPOS4

	HRRZ	TE,EMODEA
	CAIN	TE,D2MODE	;TWO-WORD?
	JRST	IFPO31		;YES

	PUSHJ	PP,SUBSCA
	MOVSI	CH,SKIPG.
	TLNE	W1,NOTF
	MOVSI	CH,SKPLE.
	PUSHJ	PP,PUT.A
	JRST	JFALSE
	; TWO-WORD COMP, TEST FOR POSITIVE OR NOT POSITIVE

	; GENERATE	SKIPL <DATA-NAME>
	;		SKIPG <DATA-NAME>+1
	; FOR POSITIVE

	; GENERATE	SKIPG <DATA-NAME>
	;		SKIPLE <DATA-NAME>+1
	; FOR NOT POSITIVE


IFPO31:	PUSHJ	PP,SUBSCD
	MOVSI	CH,SKIPL.
	TLNE	W1,NOTF
	MOVSI	CH,SKIPG.
	PUSHJ	PP,PUT.A
	MOVSI	CH,SKIPG.
	TLNE	W1,NOTF
	MOVSI	CH,SKPLE.
	AOS	EINCRA
	PUSHJ	PP,PUT.A
	SOS	EINCRA
	JRST	JFALSE

IFPOS4:	TSWTS	FAINAC;			;IF THE OPERAND ISN'T IN THE
	PUSHJ	PP,	MOVXAC		; [413]  AC'S, GO GET IT THERE.

	HRRZ	TE,EMODEA
	CAIE	TE,D2MODE
	JRST	IFPO41		;ONE-WORD
	MOVE	CH,[XWD JUMPG.+ASINC,AS.MSC]
	TLNE	W1,NOTF
	MOVE	CH,[XWD JUMPL.+ASINC,AS.MSC]
	PUSHJ	PP,PUT.XB
	HRRZI	CH,AS.DOT+2
	PUSHJ	PP,PUTASN
	TLNN	W1,NOTF
	JRST	IFPO41
	MOVSI	CH,JUMPG.
	MOVE	TE,EAC
	ADDI	TE,1
	DPB	TE,CHAC
	PUSHJ	PP,JFLSEA
IFPO41:	MOVSI	CH,JMPLE.
	TLNE	W1,NOTF
	MOVSI	CH,JUMPG.

IFPOS5:	MOVE	TE,EAC
	DPB	TE,CHAC
	JRST	JFLSEA
;GENERATE CODE TO SEE IT A FIELD IS NEGATIVE

IFNEG:	MOVE	TE,EMODEA

	CAILE	TE,	DSMODE		;IF IT'S NOT DISPLAY, GO
	JRST		IFNEG2		; DO A NUMERIC COMPARISON.
	HRRZ	CH,	POSNEG(TE)	;SELECT THE APPROPRIATE ROUTINE.

	JRST	IFPOS2

IFNEG2:	TSWT	FAINAC;			;IF THE OPERAND IS IN THE AC'S
	CAIN	TE,	C3MODE		; OR IS COMP-3, GO USE A JUMP.
	JRST		IFNEG4

	PUSHJ	PP,SUBSCA
	MOVSI	CH,SKIPL.
	TLNE	W1,NOTF
	MOVSI	CH,SKPGE.
	PUSHJ	PP,PUT.A
	JRST	JFALSE

IFNEG4:	TSWTS	FAINAC;			;IF THE OPERAND ISN'T IN THE
	PUSHJ	PP,	MOVXAC		; [413]  AC'S, GO GET IT THERE.

	MOVSI	CH,JMPGE.
	TLNE	W1,NOTF
	MOVSI	CH,JUMPL.
	JRST	IFPOS5

;EXTAB LINKS FOR THE POSITIVE AND NEGATIVE ROUTINES.

POSNEG:	XWD	POS%6##,NEG%6##		;DISPLAY-6.
	XWD	POS%7##,NEG%7##		;DISPLAY-7.
	XWD	POS%9##,NEG%9##		;DISPLAY-9.
IFN DBMS,<

;GENERATE CODE FOR "IFDB" OPERATOR

IFDBGN:	MOVE	EACA,EOPNXT
	CAMN	EACA,EOPLOC	;ANY OPERANDS?
	POPJ	PP,		;NO, MUST BE A "YECCH"

;PUT "SET-NAME" IN LITERAL POOL

	HRRZ	CH,ELITPC	;GET LIT LOC
	IORI	CH,AS.LIT
	HRRZM	CH,LITNN##	; [437] STORE FOR USE IN BYTE STRING DESCRIPTOR

	HRRZ	TA,EOPLOC	;GET OPERAND
	HRRZ	TA,2(TA)
	PUSHJ	PP,LNKSET	;GET ITS VALTAB ADDR

	HRRZI	TD,(TA)		;MAKE BYTE PTR FOR ILDB LOOP
	MOVE	TB,[POINT 7,(TD)]
	ILDB	TC,TB		;GET BYTE COUNT FROM 1ST VALTAB BYTE
	HRLM	TC,LITNN	; [437] SAVE FOR USE IN BYTE STRING DESCRIPTOR

	MOVEI	TE,5(TC)	;CONVERT BYTE COUNT TO WORD COUNT
	MOVEI	TA,6		;[273]SIX SIXBIT BYTES PER WORD
	IDIVM	TE,TA

	PUSH	PP,TA		;SAVE LITERAL INCREMENT

	HRLI	TA,SIXLIT##	;PUT OUT "SIXLIT,,WORD-COUNT" HEADER
	PUSHJ	PP,STASHI
	POP	PP,TA
	ADDM	TA,ELITPC	;BUMP LITERAL POOL PC

IFDB0:	SETZ	TA,		;INIT FOR ACCUMULATION OF A SIXBIT WORD
	MOVE	TE,[POINT 6,TA]
IFDB1:	SOJL	TC,IFDB2	;CHECK BYTE COUNT
	ILDB	CH,TB		;GET VALTAB BYTE
	SUBI	CH,40		;CONVERT TO SIXBIT
	IDPB	CH,TE
	TRNN	TA,77		;TA FULL?
	JRST	IFDB1		;NO
IFDB2:	JUMPE	TA,IFDB3	;ANY REMAINDER?
	MOVEM	TD,CURVAL##	;[1457] MOVE VALTAB PTR IN CASE VALTAB MOVED
	PUSHJ	PP,STASHL	;YES, OUTPUT IT
	MOVE	TD,CURVAL##	;[1457] GET VALTAB PTR BACK, ASSUME IT MOVED
	JRST	IFDB0
;PUT BYTE STRING DESCRIPTOR IN LITERAL POOL

IFDB3:	MOVE	TA,[BYTLIT,,2]	;PUT OUT BYTE PTR TO "SET-NAME"
	PUSHJ	PP,STASHI
	HRRZI	TA,AS.MSC
	PUSHJ	PP,STASHL
	HRRZ	TA,LITNN	; [437] GET BACK BYTE STRING'S ADDR
	HRLI	TA,(POINT 6,)
	PUSHJ	PP,STASHL
	AOS	ELITPC

	MOVE	TA,[XWDLIT,,2]	;PUT OUT BYTE COUNT
	PUSHJ	PP,STASHI
	MOVEI	TA,AS.CNB	;LEFT HF = 0
	PUSHJ	PP,STASHL
	HLLZ	TA,LITNN	; [437] RIGHT = BYTE COUNT
	HRRI	TA,AS.CNB
	PUSHJ	PP,STASHL

	HRRZ	CH,ELITPC	;REMEMBER ADDR OF BYTE STRING DESC.
	SUBI	CH,1		;BACK UP TO IT
	HRRZM	CH,LITNN	; [437] SAVE BYTE STRING LITERAL LOCATION
	AOS	ELITPC		;BUMP LIT POOL PC
;PUT ARG LIST IN LITERAL POOL

	MOVE	TA,[OCTLIT,,1]	;PUT OUT ARG COUNT WORD
	PUSHJ	PP,STASHI
	MOVSI	TA,-2
	PUSHJ	PP,STASHL

	AOS	CH,ELITPC	;BUMP PC OVER ARG COUNT
	IORI	CH,AS.LIT
	HRLM	CH,LITNN	; [437] REMEMBER ARG LIST ADDR

	MOVE	TA,[XWDLIT,,2]	;1ST ARG = BYTE STRING DESCRIPTOR ADDR
	PUSHJ	PP,STASHI
	HRLZI	TA,(ARGBSD)	;LEFT HF = ARG TYPE
	HRRI	TA,AS.CNB
	PUSHJ	PP,STASHL
	HRLZ	TA,LITNN	; [437] GET ADDR OF BYTE STRING DESC.
	TLO	TA,AS.LIT
	HRRI	TA,AS.MSC
	PUSHJ	PP,STASHL
	AOS	ELITPC		;BUMP LIT PC

;GET A WORD IN %PARAMS FOR DBCS ROUTINE RETURN VALUE

	HRRZ	TB,EAS1PC##	;GET DATA PC
	AOS	EAS1PC
	HRRM	TB,LITNN	; [437] REMEMBER RET-VALUE ADDR

	PUSHJ	PP,PUTOC0##	;[372] SET %PARAM TO ZERO
;PUT PTR TO RETURN VALUE LOC IN ARG LIST

	MOVE	TA,[XWDLIT,,2]
	PUSHJ	PP,STASHI
	HRLZI	TA,(ARG1WB)	;LEFT HF = ARG TYPE
	HRRI	TA,AS.CNB
	PUSHJ	PP,STASHL
	HRLZI	TA,(TB)		;RT HF = ADDR OF RET-VALUE
	TLO	TA,AS.PAR##
	HRRI	TA,AS.MSC
	PUSHJ	PP,STASHL
	AOS	ELITPC

;PUT OUT DBCS SUBROUTINE CALL
;	IF SET EMPTY	= PUSHJ 17,SETCON
;	IF REC MEMBER	= PUSHJ	17,RECMEM
;	IF REC OWNER	= PUSHJ 17,RECOWN
;	IF REC MEM/OWN	= PUSHJ	17,RECMO

	MOVE	CH,[ASINC+AC16+MOVEI.,,AS.MSC]
	PUSHJ	PP,PUTASY	;"MOVEI 16,ARG-LIST"
	HLRZ	CH,LITNN	; [437] GET ARG LIST ADDR
	PUSHJ	PP,PUTASN

	SETZ	TB,		;FIND OUT WHICH DBCS ROUTINE TO CALL
	TLNE	W1,(GWFL10)
	MOVEI	TB,1
	TLNE	W1,(GWFL11)
	MOVEI	TB,2
	TLNE	W1,(GWFL12)
	MOVEI	TB,3
	HRRZ	CH,IFDBCS(TB)	;GET SELECTED NAME
	ANDI	CH,77777	;SET ASSEMBLY EXTAB FLAG
	IORI	CH,AS.EXT##
	PUSHJ	PP,GNPSX.##	; [436] "PUSHJ 17,DBCS-ROUTINE"

;NOW TEST RESULT OF SUBROUTINE CALL

	MOVE	CH,[ASINC+SKIPN.,,AS.MSC]	;ASSUME NOT NOT
	TLNE	W1,(GWFL15)	;'NOT' FLAG ON?
	HRLI	CH,ASINC+SKIPE.	;YES
	PUSHJ	PP,PUTASY
	HRRZ	CH,LITNN	; [437] GET BACK ADDR OF RET-VALUE LOC
	HRLI	CH,AS.MSC	;[160] MAKE IT INTO ASY FORMAT
	TRO	CH,AS.PAR	;[160] PUT IT INTO %PARAMS AREA
	PUSHJ	PP,PUTASN	;"SKIPN(E) RET-VALUE"

	JRST	JFALSE		;"JRST FALSE-PATH"
				;THEN RETURN TO COBOLE

;EXTAB ADDRESSES OF DBCS ROUTINES

IFDBCS:	EXP	SETCON##
	EXP	RECMEM##
	EXP	RECOWN##
	EXP	RECMO##

>;END IFN DBMS
;CHECK TO SEE IF A DISPLAY COMPARISON COULD BE A "CAM" COMPARE.

;TRUE IF FIELD IS WORD-CONTAINED.
;ENTER WITH COMPARISON CONSTANT IN "ESAVAC"

;IF FALSE - EXIT TO CALL+2.

;IF TRUE - GENERATE A "CAM" TYPE COMPARISON AND EXIT TO CALL+1.

SPECIL:	TSWF	FASUB;
	JRST	CPOPJ1
	HLRZ	TC,ERESA	;GET RESIDUE OF "A"
	MOVE	TB,ESIZEA	;AND IT'S SIZE
	HRRZ	TD,EMODEA	;AND IT'S USAGE
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SEE IF WE WANT OTHER COL. SEQ.
	  JRST	.+3		;[1004] YES, ONLY SPECIAL IF 1 CHAR.
	SKIPG	COLSEQ##	;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	JRST	SPECL0		;NO
	CAIE	TB,1		;YES, 1 CHAR. IS OK
	JRST	CPOPJ1		;FAILED
	PUSH	PP,EAC		;SAVE AC INCASE 0
	SKIPN	EAC		;IF SO
	AOS	EAC		;USE 1
	MOVEI	TE,2		;[1004] IF OTHER COL. SEQ.
	SKIPGE	COLSEQ		;[1004] WE NEED AC2
	MOVEM	TE,EAC		;[1004] TO BE ABLE TO DO INDEXING
SPECL0:>

	IMUL	TB,BYTE.S(TD)	;COMPUTE SIZE IN BITS
	SUB	TC,TB		;SUBTRACT THAT FROM RESIDUE
	JUMPL	TC,CPOPJ1	;IS "A" WORD-CONTAINED?

	CAIN	TB,^D36		;YES--IS IT A FULL WORD?
	JRST	SPECL1		;YES

	LSH	TC,6		;NO--NEW RESIDUE IS IN "TC"
	ADD	TB,TC		;NOW RESIDUE AND FIELD SIZE ARE IN "TB"

	MOVE	TA,[XWD BYTLIT,2];CREATE BYTE POINTER IN LITAB
	PUSHJ	PP,STASHP
	HRRZ	TA,EBASEA
	PUSHJ	PP,STASHQ
	LSHC	TB,-14
	HRR	TA,EINCRA
	PUSHJ	PP,POOLIT

	MOVSI	CH,LDB.
	PUSHJ	PP,PUT.LC
	SKIPN	PLITPC
	AOS	ELITPC
IFN ANS74,<
	PUSHJ	PP,TSTCOL	;[1004] SEE IF WE NEED OTHER COL. SEQ.
	  JRST	[MOVE	TC,EMODEA	;[1004] YES
		POP	PP,EAC		;[1004] RESTORE ORIGINAL ACC
		MOVSI	CH,LDB.		;[1004] NEED TO CONVERT FROM ONE
		HRR	CH,EAC		;[1004]
		DPB	CH,CHAC		;[1004] LOAD AC FIELD
		HRR	CH,SUTBL(TC)	;[1004] CHARACTER SET TO THE OTHER
	IFE TOPS20,<
		TSWT	FREENT		;[1004] NO INDIRECT IF /R
	>
	IFN TOPS20,<
		SKIPN	RENSW##		;[1004] NO INDIRECT IF /R
	>
		TLO	CH,(@)		;[1004] TURN ON INDIRECT BIT IF NOT /R
		PUSHJ	PP,PUT.EX	;[1004]
		JRST	SPECL2]		;[1004]
	SKIPG	COLSEQ		;[1004] PROGRAM COLLATING SEQUENCE = ALPHABET-NAME?
	JRST	SPECL2		;NO
	HRLZ	CH,EAC		;INDEX BY NEW ACC
	IOR	CH,[MOV+ASINC,,AS.MSC]
	POP	PP,EAC		;ORIGINAL ACC
	PUSHJ	PP,PUT.XA	;WRITE IT OUT
	MOVE	TC,EMODEA	;GET USAGE
	MOVE	CH,COLSQS##(TC)	;GET LITERAL BASE
	PUSHJ	PP,PUTASN
>
	JRST	SPECL2

SPECL1:	PUSHJ	PP,SUBSCA
	MOVSI	CH,MOV
	PUSHJ	PP,PUT.AA

;[562] NOW WE MUST TEST FOR 6-CHAR SIXBIT ITEM SINCE SIGN GETS IN THE WAY

	MOVE	TA,ESIZEA	;[562] GET SIZE
	HRRZ	TC,EMODEA	;[562] GET MODE
	CAIN	TA,6		;[562] 6 CHAR?
	CAIE	TC,D6MODE	;[562] AND SIXBIT?
	JRST	SPECL2		;[562] NO
	LDB	TE,CONDIT	;[562] GET CONDITION
	CAIE	TE,EQ		;[562] EQUAL
	CAIN	TE,NOTEQ	;[562] AND NOT EQUAL
	JRST	SPECL2		;[562] ARE OK

	PUSHJ	PP,PUTASA##	;[630] [562] NEED OTHER OPCODE SET
	MOVE	CH,[TLC.##+ASINC,,AS.CNB]	;[562]
	PUSHJ	PP,PUT.XA	;[562] COMPLIMENT
	MOVEI	CH,400000	;[562] THE HIGH ORDER BIT
	PUSHJ	PP,PUTASN	;[562]

;[562] COPY THE CODE AT SPECL2 THRU SPECL4

	MOVE	TA,ESIZEA	;[562] CREATE NEW CONSTANT
	MOVE	TB,ESAVAC	;[562]
	HRRZ	TC,EMODEA	;[562]
	MOVE	TC,BYTE.S(TC)	;[562]

SPECL7:	LSH	TB,0(TC)	;[562]
	IORM	TB,ESAVAC	;[562]
	SOJG	TA,SPECL7	;[562]
	MOVSI	TA,(1B0)	;[562] COMPLIMEMT THE CONSTANT
	XORM	TA,ESAVAC	;[562]
	JRST	SPECL4		;[562]
;TRY FOR "CAM" COMPARISON FOR DISPLAY FIELD  (CONT'D).

;ITEM IS IN AC'S NOW.

SPECL2:	MOVE	TA,ESIZEA	;CREATE NEW CONSTANT
	MOVE	TB,ESAVAC
	HRRZ	TC,EMODEA
	MOVE	TC,BYTE.S(TC)

	SOJLE	TA,SPECL4

SPECL3:	LSH	TB,0(TC)
	IORM	TB,ESAVAC
	SOJG	TA,SPECL3

SPECL4:	SKIPN	TC,ESAVAC
	JRST	IFZ21		;USE JUMPX INSTEAD
	TLNE	TC,-1
	JRST	SPECL5

	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	TLNE	W1,NOTF
	TRC	TE,CONCMP/100
	ROT	TE,-^D8
	ADD	CH,TE
	PUSHJ	PP,PUT.LA

	JRST	JFALSE

SPECL5:	MOVE	TA,[XWD OCTLIT,1]
	PUSHJ	PP,STASHP
	MOVE	TA,TC
	PUSHJ	PP,POOLIT
	MOVSI	CH,CAM.
	LDB	TE,CONDIT
	TLNE	W1,NOTF
	TRC	TE,CONCMP/100
	ROT	TE,-^D8
	ADD	CH,TE
	PUSHJ	PP,PUT.LC
	SKIPN	PLITPC
	AOS	ELITPC
;	JRST	JFALSE		;FALL THRU
;PUT OUT <JRST %NNNNN> ;WHERE %NNNNN IS "ELSE" PATH.

JFALSE:	MOVSI	CH,JRST.
JFLSEA:	HLR	CH,W2
	ANDCMI	CH,7B20
	IORI	CH,AS.TAG
	SKIPN	IFEAC		;NEED TO RESET EAC?
	 JRST	JFLSEC		;NO
	EXCH	CH,IFEAC	;GET VALUE, SAVE ACC
	HRRZM	CH,EAC		;RESET INCASE "B" LOADED ACCS
	MOVE	CH,IFEAC	;RESTORE
	SETZM	IFEAC		;DONE

JFLSEC:	HRRZ	TA,CH
	PUSHJ	PP,REFTAG##
	JRST	PUTASY		;"JRST %NN"

;PUT OUT <JRST .+N> IF "EQUAL" FLAG OFF, <JRST .+N-1> IF "EQUAL"
;FLAG IS ON. ENTER WITH "N" IN ACCUMULATOR "TC".
;SKIP ONE INSTRUCTION UPON RETURN FROM JTRUES, BUT NOT FROM JTRUE.

JTRUES:	AOS	(PP)

JTRUE:	SKIPN	CH,IFEAC	;NEED TO RESET EAC?
	JRST	JTRUE1		;NO
	HRRZM	CH,EAC		;YES
	SETZM	IFEAC
JTRUE1:	SKIPE	CH,TAGTRU	;ANY TAG FOR TRUE PATH?
	 JRST	JFLSEC		;YES--PUT OUT <JRST %TAG>

	HRRZI	TC,AS.DOT(TC)
	HRRZ	TE,EFLAGB	;[1060] IF ZERO TESTING,
	CAIE	TE,2		;[1060]  TC HAS CORRECT VALUE
	JRST	JTRUE2		;[1060]  FOR = OR NOT =
	TLNN	W1,GLCMP	;[1060] IF > OR < , SKIP
	JRST	JOUT		;[1060]
JTRUE2:	TLNN	W1,EQUALF	;TRUE IF EQUAL?
	JRST	JOUT		;NO
	SOJA	TC,JOUT		;YES

;[717] PUT OUT "JRST FALSE" OR  "JRST TRUE" DEPENDING ON ECNTA

JMPOUT:	SKIPG	TC,ECNTA	;[717] GET COUNT OF PIECES LEFT
	JRST	JFALSE		;[717] LAST PIECE
	HRRZ	TE,EFLAGB	;[1060] MOVE B FLAGS TO TE
	CAIN	TE,2		;[1060] TEST FOR IFZERO FLAG
	JRST	JMP2		;[1060]
	TLNE	W1,GLCMP	;[1060] IF > OR <, SKIP
	JRST	JMP2		;[1060]
	IMULI	TC,3		;[1060]
	JRST	JTRUE		;[1060]
JMP2:	IMULI	TC,4		;[1060] [717] MULT. BY 4
	AOJA	TC,JTRUE	;[717] ADD ONE, AND GENERATE JRST TO TRUE PATH
;PUT OUT THE THREE INSTRUCTION FOR LESS,GREATER,EQUAL

ADDRS3:	MOVEI	TC,4		;[1317] OFFSET BASE FOR JRSTS EQUALS
	IMUL	TC,ECNTA	;[1317]  NUMBER OF PIECES  LEFT TIMES 4
	TLNE	W1,NOTF		;[1317]  UNLESS THIS IS A "NOT"
	SETZ	TC,		;[1317]   THEN THE OFFSET BASE = 0
	PUSH	PP,TC		;[1317] SAVE THE OFFSET BASE
	ADDI	TC,3		;[1317] FIRST OFFSET
	TLNE	W1,LESSF
	PUSHJ	PP,JTRUES
	PUSHJ	PP,JFALSE

	POP	PP,TC		;[1317] RESTORE OFFSET BASE
	ADDI 	TC,2		;[1317] SECOND OFFSET BASE

	TLNE	W1,GREATF
	PUSHJ	PP,JTRUES
	PUSHJ	PP,JFALSE

	SKIPE	ECNTA		;[1317] IF THIS ISN'T THE LAST PART
	POPJ	PP,		;[1317]  DON'T WANT THIRD JRST
	TLNN	W1,EQUALF
	JRST	JFALSE
	POPJ	PP,
;COUNT THE NUMBER OF OPERANDS FOR "IF".
;IF < 2 OR > 3, ERROR.
;IF 2, RETURN.
;IF 3, THROW AWAY ALL BUT SECOND AND THIRD AND THEN RETURN.


MAK2OP:	MOVEM	EACA,EOPNXT
	HRRZ	TA,EOPLOC
	ADDI	TA,1
	MOVEM	TA,CUREOP

	PUSHJ	PP,BMPEOP	;IS THERE AT LEAST 2?
	  JRST	OPCHK1		;NO--ERROR

	AOS	TB,CUREOP	;YES--TB_LOCATION OF SECOND ONE

	PUSHJ	PP,BMPEOP	;MORE THAN 2?
	  JRST	OPCHK3		;NO--GO HOME

	AOS	CUREOP


OPCHK2:	PUSHJ	PP,BMPEOP
	  AOSA	TC,CUREOP
	JRST	OPCHK1

OPCHK4:	SUBI	TC,0(TB)
	ADDI	TC,-1(TA)
	MOVSS	TB
	HRRI	TB,0(TA)
	BLT	TB,0(TC)
	SUB	TC,EOPLOC
	HRLS	TC
	ADD	TC,EOPLOC
	MOVE	EACA,TC
IFN ANS74,<
	JRST	OPCHK5
>

OPCHK3:
IFN ANS74,<
	SKIPN	FLGSW##		;NEED FIPS FLAGGER?
	JRST	OPCHK5		;NO
	MOVE	TC,CURXSQ##	;GET NUMBER OF EXPRESSION SEEN
	SUB	TC,LSTXSQ##	;MINUS NUMBER AT LAST IF
	SOJN	TC,OPCHK5	;PROBLEM IF ONLY 1
	LDB	LN,[POINT 13,EXPLNC,28]
	JUMPE	LN,OPCHK5	;*** NOT THE REAL FIX, BUT IT WORKS ***
				; OTHERWISE SINGLE VARIABLES WILL FAIL
	LDB	CP,[POINT 8,EXPLNC,35]
	PUSH	PP,TA
	MOVEI	TA,%LV.HI
	PUSHJ	PP,FLG.ES##	;FLAG POSSIBLE VIOLATION (ABREV CONDITIONA)
	POP	PP,TA
OPCHK5:>
	MOVEM	EACA,EOPNXT
	MOVEM	TA,CUREOP

	POPJ	PP,

OPCHK1:	SWON	FERROR;
	POPJ	PP,
;COUNT NUMBER OF OPERANDS FOR "IFT".
;IF 1, RETURN.
;IF >1, THROW AWAY ALL BUT LAST ONE.

MAK1OP:	MOVEM	EACA,EOPNXT
	HRRZ	TA,EOPLOC
	ADDI	TA,1
	MOVEM	TA,CUREOP
	CAIL	TA,(EACA)	;IF NO OPERANDS,
	SWONS	FERROR		;  TROUBLE

	PUSHJ	PP,BMPEOP	;ONLY 1?
	  JRST	OPCHK3		;YES--WE'RE DONE

MAK1A:	AOS	TB,CUREOP
	PUSHJ	PP,BMPEOP	;ANY MORE?
	  AOSA	TC,CUREOP	;NO
	JRST	MAK1A		;LOOP

	JRST	OPCHK4
;SET "A" PARAMETERS TO SHOW THAT IT IS IN AC'S

SETBCX:	MOVE	TE,EAC
	MOVEM	TE,EBASEA
	SETZM	EINCRA
	
	PUSHJ	PP,SWAPIT
	SWOFF	FBSUB;
	SWON	FBSIGN;

	SKIPE	EAC
	TDCA	TE,TE
	MOVEI	TE,2
	MOVEM	TE,EAC

	POPJ	PP,

;SWAP OPERANDS

SWAPIT:	PUSHJ	PP,SWAPAB

	LDB	TE,CONDIT	;IS CONDITION "EQUAL"?
	CAIE	TE,EQ
	CAIN	TE,NOTEQ	;NO--"UNEQUAL"?
	CAIA
	TLC	W1,GLCMP	;NO--COMPLEMENT THE CONDITION
	POPJ	PP,
;CHECK TO SEE IF AN ITEM IS EDITED.
;IF SO, USE EXTERNAL SIZE.

SETED:
IFN ANS74,<
	CAIE	LN,EBASEA	;SEE IF "A" OR "B"
	JRST	[SETOM	EDEBDB##
		SKIPL	INPERF	;ALWAYS IF IN PERFORM LOOP CONTROL
		SOS	EDEBDB		;OTHERWISE ONLY IF DB.ARO IS ON
		JRST	SETEDA]
	SETOM	EDEBDA##	;POSSIBLE DEBUG CODE WANTED
	SKIPL	INPERF		;ALWAYS IF IN PERFORM LOOP CONTROL
	SOS	EDEBDA		;OTHERWISE ONLY IF DB.ARO IS ON
SETEDA:>
	PUSHJ	PP,SETOPN	;SET UP PARAMETERS
	HRRZ	TE,EMODEX(LN)	;IS IT DISPLAY?
	CAILE	TE,DSMODE
	POPJ	PP,		;NO--RETURN

	MOVE	TC,CUREOP	;YES--GET DATAB FLAG WORD
	HRRZ	TA,1(TC)
	PUSHJ	PP,LNKSET
	LDB	TC,DA.EDT	;IS IT EDITED?
	JUMPE	TC,CPOPJ	;NO

	LDB	TE,DA.EXS	;YES--GET EXTERNAL SIZE
	MOVEM	TE,ESIZEX(LN)
	POPJ	PP,


;	CALL TO MOVGEN TO MOVE "A" INTO ACS
;	IF THE OPERAND IS NEGATED THEN MOVE ITS NEGATED VALUE INTO ACS

;	MOVE 1-COMP INTO ACS
MOVC1:	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPN	TE,MNXAC.##	; [413] NEGATE IT 
	JRST	M1CAC.##	; [413] NOT NEGATED

;	MOVE  ANY TYPE INTO ACS
MOVXAC:	HLRZ	TE,OPERND	; [413] GET "A" OPERAND
	LDB	TE,EOPSGN	; [413] SEE IF NEGATED
	JUMPN	TE,MNXAC.##	; [413] NEGATE IT 
	JRST	MXAC.##		; [413] NOT NEGATED


IFN ANS74,<

;HERE TO SEE IF OPERAND "A" IS IN THE SAME MODE AS PROGRAM COL. SEQ.
;AND CONDITION IS NEITHER "EQUAL" NOR "NOT EQUAL"

;RETURNS +1 IF NOT
;	 +2 IF YES

TSTCOL:	SKIPL	TE,COLSEQ	;[1004] ASCII OR EBCDIC SPECIFIED?
	JRST	CPOPJ1		;[1004] NO, GIVE SKIP RETURN
	TRNN	TE,%AN.EB	;[1004] DID USER SAY EBCDIC?
	TDZA	TE,TE		;[1004] NO, ASSUME ASCII
	MOVEI	TE,D9MODE+1	;[1004] YES
	ADD	TE,EMODEA	;[1004] FORM INDEX
	JRST	@[EXP	CPOPJ1		;[1004] SIXBIT IN ASCII MODE
		EXP	CPOPJ1		;[1004] ASCII  IN ASCII MODE
		EXP	.+1		;[1004] EBCDIC IN ASCII MODE
		EXP	.+1		;[1004] SIXBIT IN EBCDIC MODE
		EXP	.+1		;[1004] ASCII  IN EBCDIC MODE
		EXP	CPOPJ1](TE)	;[1004] EBCDIC IN EBCDIC MODE
	LDB	TE,CONDIT	;[1004] YES, BUT
	CAIE	TE,EQ		;[1004] EQUAL AND NOT EQUAL
	CAIN	TE,NOTEQ	;[1004] ARE INVARIANT UNDER
	AOS	(PP)		;[1004] THIS TRANSFORMATION
	POPJ	PP,		;[1004]
>
;IMPROPER CONDITIONS

BADIF:	OUTSTR	[ASCIZ /Bad "IF" flags
/]
	JRST	KILLF

BADCOD:	OUTSTR	[ASCIZ /Bad "IF" usage
/]
	POPJ	PP,


BADIFT:	OUTSTR	[ASCIZ /Bad "IFT" flags
/]
	JRST	KILLF

;GENERATE CODE FOR "ELSE"

ELSEGN:	JRST	KILLF		;SHOULD NEVER GET HERE
NUMERC==2	;NUMERIC USAGE
ALPHAB==1	;ALPHABETIC USAGE

GNENDS==1B27	;"END SPIF" FLAG IN OPERATOR

LESSF==1B27	;"LESS" FLAG IN CONDITIONAL OPERATOR
GREATF==1B28	;"GREATER" FLAG IN CONDITIONAL OPERATOR
EQUALF==1B29	;"EQUAL" FLAG IN CONDITIONAL OPERATOR
CONCMP==EQUALF!LESSF!GREATF
GLCMP==LESSF!GREATF
GOFALS==1B32	;"FALSE" OR "TRUE" FLAG IN "IF" OPERATOR
NOTF==1B33	;"NOT" FLAG IN CONDITIONAL

SWITCH==3B<^D18+^D10>	;"THIS IS FOR HARDWARE-SWITCH" FLAGS IN W1
SWCHON==1B<^D18+^D9>	;"TEST FOR HARDWARE SWITCH ON" FLAG IN W1

CRANGE==1B18		;"RANGE" FLAG IN CONTAB ENTRY
CNFIGC==1B19		;"FIG. CONST." FLAG IN CONTAB

EQ==EQUALF/1B29
NOTEQ==<LESSF!GREATF>/1B29
GR==GREATF/1B29
NOTGR==<LESSF!EQUALF>/1B29
LS==LESSF/1B29
NOTLS==<EQUALF!GREATF>/1B29

CONDIT:	POINT 3,W1,11	;CONDITIONAL FLAGS
IFN ANS68,<
CALLSW:	XWD CALLI.##,20	;INSTRUCTION WHICH READ HARDWARE SWITCHES
>
SWNUM:	POINT 6,1(TA),35	;LOCATION OF SWITCH NUMBER IN MNETAB ENTRY
MNESF:	POINT 2,1(TA),2	;LOCATION OF "ON" & "OFF" FLAGS IN MNETAB
W1SF:	POINT 2,W1,10	;LIKEWISE FOR OPERATOR
EOPSGN:	POINT 1,1(TE),6	; [413] NEGATED OPERAND BY NEGEOP SW IN EXPGEN
EXTERNAL LMASKS,TB.DAT,TB.MNE,ATINVK
EXTERNAL XWDLIT,BYTLIT,D1LIT,D2LIT,OCTLIT,XTNLIT
EXTERNAL ENDIFT,W1LN,W1CP,TCLN,TCCP
EXTERNAL ECTRUE,ECFALS,ECNAME,ECNBP,ECXTRA,ECSTEP,EREMAN,TAGTRU,ECNTA
EXTERNAL EOPLOC,EOPNXT,CUREOP,OPLINE,EHIVAL,ELOVAL,EFPLOV,EMULSZ
EXTERNAL AS.MSC,AS.TAG,AS.CNB,AS.DOT,AS.LIT,SZERA.,EPJPP
EXTERNAL EBASEA,EINCRA,ESIZEA,EDPLA,EMODEA,ERESA,EBYTEA,EFLAGA,ETABLA
EXTERNAL EBASEB,EINCRB,ESIZEB,EDPLB,EMODEB,ERESB,EBYTEB,EFLAGB,ETABLB
EXTERNAL EBASEX,EINCRX,ESIZEX,EDPLX,EMODEX,ERESX,EBYTEX,EFLAGX,ETABLX
EXTERNAL ESAVEA,ESAVEB,ESAVAX,ESAVBX,EBASAX,EBASBX
EXTERNAL ESAVBI,ESVIBX		;[1067]
EXTERNAL ESIZEZ,EAC,BYTE.W,ELITPC,OPERND,BYTE.S,ESAVAC,ESZERA,MAXSIZ
EXTERNAL ELITLO,ELITHI,POWR10,DPWR10,EWORDB,CHAC
EXTERNAL D1MODE,D2MODE,D6MODE,D7MODE,DSMODE,FPMODE,F2MODE,C3MODE,FCMODE,LTMODE,D4MODE
EXTERNAL SKIP.,SKIPE.,SKIPN.,SKIPA.,SKIPG.,SKIPL.,SKPGE.,SKPLE.,JRST.
EXTERNAL JUMP.,JUMPE.,JUMPL.,JUMPN.,JUMPG.,JMPLE.,JMPGE.
EXTERNAL CAME.,CAMN.,CAML.,CAMLE.,CAMG.,CAMGE.,XTND.,HRRZ.
EXTERNAL MOVM.,MOVEM.,MUL.,MULI.,IMUL.,HRRZI.,SETZB.
EXTERNAL CMP.
EXTERNAL HRLOI.,LDB.,ILDB.,CAI.,CAM.,MOVEI.,CAIE.,CAIN.,SOJG.
EXTERNAL TLNN.,TRNN.,TLNE.,TRNE.,TLO.,MOV
EXTERNAL DA.CLA,DA.EDT,DA.EXS

END