Annotation of researchv10no/cmd/spitbol/4.3/spitv43.min, revision 1.1

1.1     ! root        1: *      CHANGES [SGD]
        !             2: *      -------------
        !             3: *      1. COMMENTED OUT DEFAULT .DEF, .UNDEF AS THESE MACHINE-
        !             4: *         DEPENDENT.  I SUGGEST AGAIN THAT THESE DO NOT BELONG
        !             5: *         IN MINIMAL SOURCE, UNLESS SOMETHING OF THE FORM .*DEF
        !             6: *         IS TO BE INCORPORTATED INTO MINIMAL LANGUAGE DEFN.
        !             7: *
        !             8: *      2. NOTED THAT DESCRIPTION OF BEV, BOD MISSING FROM
        !             9: *         SBL42.CMT MINIMAL DESCRIPTION, AND DISCUSSION OF
        !            10: *         "ODD"/"EVEN" AND REQUIREMENTS PERTAINING THERETO
        !            11: *         SEEMS INSUFFICIENT.
        !            12: *
        !            13: *      3. PERMIT CODE KEYWORD TO CONTAIN ANY INTEGER VALUE.
        !            14: *         THIS CONSISTS OF REMOVING THE ENFORCED RESTRICTION
        !            15: *         IN ASIGN (SEE ASG24), SINCE CODE CONTAINS NO RELOC.
        !            16: *         USE OF KEYWORD VALUE (AS IT SHOULDNT).  SBL DOC.
        !            17: *         MUST BE UPDATED.  ADDRESS OF CODE VALUE NOW PASSED TO
        !            18: *         OSINT (KVCOD), INSTEAD OF VALUE ITSELF.  HENCE OSINT
        !            19: *         DOCUMENTATION MUST LIKEWISE BE REVISED.  CHANGES
        !            20: *         MADE IN KEYWORD DEFINITION TABLES, PROCEDURES ACESS
        !            21: *         AND ASIGN SINCE CODE NOW SPECIAL KEYWORD.
        !            22: *
        !            23: *         EROSI RETURNS NOW CONTAIN NEW CODE KEYWORD VALUE IN
        !            24: *         IA. OSINT DOCUMENTATION MUST BE REVISED.
        !            25: *
        !            26: *         INTERESTINGLY, THIS SHOULD PERMIT THE SPITBOL PROGRAM
        !            27: *         TO INTERROGATE THE CODE KEYWORD AT THE START OF
        !            28: *         EXECUTION TO DETERMINE IF COMPILATION ERRORS
        !            29: *         OCCURRED.
        !            30: *
        !            31: *      4. ADD -COPY "FILETAG" CONTROL CARD.  -COPY PERMITTED IN
        !            32: *         CODE STRINGS.  NESTING IS PERMITTED TO ANY LEVEL,
        !            33: *         THOUGH OSINT IS FREE TO RESTRICT THE MAXIMUM LEVEL.
        !            34: *         NOTE REQUIREMENT FOR FILETAG SPECIFIED AS
        !            35: *         STRING CONSTANT SINCE FILETAGS MAY CONTAIN SEMICOLONS.
        !            36: *         I HAVE TRIED TO MAKE THIS ENHANCEMENT WITH MINIMUM
        !            37: *         (MINIMAL?) AMOUNT OF NEW CODE, SO THE FEATURE IS
        !            38: *         NOT CONDITIONALIZED.  THE SOLUTION
        !            39: *         REQUIRED THE ADDITION OF A NEW BLOCK TYPE (COBLK) TO
        !            40: *         BUILD THE INPUT CONTEXT SAVE STACK AS A CHAIN OF
        !            41: *         COBLKS.  A RECUSIVE SOLUTION ON CMPIL/READR/NEXTS
        !            42: *         WOULD HAVE REQUIRED EXTENSIVE MODIFICATIONS AND
        !            43: *         SUBSTANTIAL NEW CODE.  NOTE THAT FORMS SUCH AS
        !            44: *         CODE('-COPY "FILE.SBL"') ARE ACCEPTABLE, WHICH IS
        !            45: *         VIEWED AS SIGNIFICANT ENHANCEMENT IN ADDITION TO
        !            46: *         COMPILE-TIME INCLUDE.
        !            47: *
        !            48: *         TO SUPPORT THIS FEATURE, TWO NEW OSINT ROUTINES ARE
        !            49: *         DEFINED, SYSSC (START COPY) AND SYSEC (END COPY) WITH
        !            50: *         LOGICS DESCRIBED IN THE .CMT FILE.
        !            51: *
        !            52: *         BECAUSE OF ANNOYANCE FACTOR, SOURCE LISTING OF
        !            53: *         CODE() INFO VIA -LIST, INCLUDING -COPY INPUT, IS
        !            54: *         NO LONGER POSSIBLE.  IF THIS IS PERMITTED, THEN
        !            55: *         ONE FINDS -COPY INPUT BEING PRINTED ON STD.
        !            56: *         OUTPUT CHANNEL (DEPENDING ON STATE OF -LIST),
        !            57: *         UNLESS EXPLICIT -NOLIST IS GIVEN.
        !            58: *
        !            59: *      5. THE DOCUMENTATION FOR SYSIO IS INCONSISTENT.  IT
        !            60: *         SHOWS 0,1,2,3 BEING POSSIBLE INPUTS DEPENDING ON
        !            61: *         INPUT/OUTPUT, STD/NONSTD.  HOWEVER, IT ALSO APPEARS
        !            62: *         (AND IS STATED) THAT SYSIO IS NOT CALLED FOR STD
        !            63: *         INPUT/OUTPUT.
        !            64: *
        !            65: *      6. SINCE -PRINT,-NOPRINT REMOVED IN V4, I HAVE
        !            66: *         REINSTATED THE CIRCUIT IN NEXTS TO AVOID LISTING
        !            67: *         CONTROL CARDS (-COPY FORCES LIST IN CNCRD THOUGH).
        !            68: *
        !            69: *      7. WA NOW CONTAINS THE INITIAL VALUE OF &CODE ON ENTRY
        !            70: *         TO SPITBOL.
        !            71: *
        !            72: *      8. ADDED DDC (DEFINE DISPLAY CONSTANT).  IS IDENTICAL
        !            73: *         TO DTC EXCEPT THAT ON SYSTEMS SUPPORTING LOWER CASE,
        !            74: *         THE DISPLAY TEXT CAN BE TRANSLATED WITH A
        !            75: *         CASE MIX.  FOR EXAMPLE, CAPITALIZE ONLY THE FIRST
        !            76: *         LETTER, OR THE FIRST LETTER OF EVERY WORD, OR NO
        !            77: *         UPPER CASE (FOR EUNICHS), ETC.
        !            78: *
        !            79: *      9. FIX MINOR OVERSIGHT IN FAILING TO CLEAR R$PMB AT
        !            80: *         END OF PATTERN MATCH, THUS LEAVING PTR TO BCBLK
        !            81: *         THAT CANNOT BE COLLECTED.
        !            82: *
        !            83: *     10. AFTER CONSULTATION WITH DAVE SHIELDS, IT WAS AGREED
        !            84: *         TO REINSTATE ARG,FIELD,ITEM AND LOCAL FUNCTIONS.
        !            85: *         COMMENTS WERE RECEIVED THAT REMOVING THEM BREAKS
        !            86: *         EXISTING CODE IN DIFFICULT-TO-FIX WAYS, INCLUDING
        !            87: *         A NUMBER OF THE UTILITY ROUTINES IN GIMPELS BOOK.
        !            88: *         IN ANY EVENT, THESE ARE SNOBOL4 COMPATIBILITY
        !            89: *         FUNCTIONS THAT TAKE LITTLE CODE SPACE.  AS A
        !            90: *         RESULT OF THIS, AND -COPY, ERROR NUMBERS HAVE
        !            91: *         BEEN PUSHED BACK OVER THE 255 THRESHOLD, WHICH
        !            92: *         SEEMS UNAVOIDABLE UNLESS MAJOR SURGERY IS DONE.
        !            93: *
        !            94: *     11. VERSION ID CHANGED TO V4.3 DUE TO SUBSTANTIAL
        !            95: *         CHANGES.
        !            96: *
        !            97: *     12. PERMIT DOLLAR SIGN IN VARIABLE NAMES.  MINOR
        !            98: *         CHANGE TO OPERATOR TABLE AND SCANE.
        !            99: *
        !           100: *     13. PERMIT BUFFER TYPE FOR LOAD SPECIFICATION.  AS
        !           101: *         A SIDE-EFFECT, THE CODE FOR BUFFER CONVERSION HAS
        !           102: *         BEEN CENTRALIZED IN GTBUF.  ALSO FIXED PADDING
        !           103: *         BUG IN INSBF RELATED TO ZERO PADDING.
        !           104: *
        !           105: *     14. DOCUMENT THAT SYSIL MUST NEVER REQUEST ZERO BYTES.
        !           106: *         DOING SO CAUSES ACESS TO POTENTIALLY CREATE
        !           107: *         INVALID MEMORY CAUSING LATER GARBAGE COLLECTOR
        !           108: *         PROBLEMS OR MISADJUSTMENTS OF DNAMP, ETC.
        !           109: *
        !           110: *     15. VDIFFER FUNCTION ADDED.  VDIFFER(X,Y) RETURNS X
        !           111: *         IF DIFFERENT FROM Y.  IN MOST CASES IT IS EXPECTED
        !           112: *         THAT Y WOULD BE NULL.
        !           113: *
        !           114:        SEC                   FORMAL START OF PROCEDURES SECTION
        !           115:        EJC
        !           116: *
        !           117: *      SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
        !           118: *      ------------------------------------
        !           119: *
        !           120: *      IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
        !           121: *      ASSEMBLY SYMBOLS ARE REFERRED TO.
        !           122: *      A PARTICULAR SET OF DEFAULT SETTINGS IS GIVEN IN THIS
        !           123: *      SOURCE BY USE OF .DEF AND .UNDEF PSEUDO OPS.
        !           124: *      A DIFFERENT SELECTION MAY BE MADE BY VARYING THE
        !           125: *      DEFINITIONS. AS AN ALTERNATIVE, THIS SECTION MAY BE
        !           126: *      COMMENTED OUT AND THE MINIMAL TRANSLATOR PRELOADED WITH
        !           127: *      THE SELECTED DEFINITIONS, THUS ALLOWING A MORE DYNAMIC
        !           128: *      CHOICE TO BE MADE.
        !           129: *      SOME OF THE CONDITIONAL FEATURES CHOOSE AMONGST A VARIETY
        !           130: *      OF OPTIONS. OTHERS ARE DEFINED PRINCIPALLY TO ALLOW
        !           131: *      OMISSION OF A FEATURE WHICH IS NOT WANTED IN ORDER TO
        !           132: *      SAVE MEMORY OR BECAUSE IT CANNOT BE SUPPORTED.
        !           133: *      NOTE THAT IF .CPLC OPTION IS CHOSEN, TRANSLATION OF DTC,
        !           134: *      ERR, ERB ARGUMENTS SHOULD BE TO LOWER CASE.
        !           135: *
        !           136: *.DEF   .CAHT                 DEFINE TO INCLUDE HORIZONTAL TAB
        !           137: *.DEF   .CASL                 DEFINE TO INCLUDE 26 SHIFTED LETTRS
        !           138: *.DEF   .CAVT                 DEFINE TO INCLUDE VERTICAL TAB
        !           139: *.UNDEF .CEPP                 DEFINE FOR ODD PARITY ENTRY POINTS
        !           140: *.UNDEF .CNBF                 DEFINE TO OMIT BUFFER EXTENSION
        !           141: *.UNDEF .CNBT                 DEFINE TO OMIT BATCH INITIALISATION
        !           142: *.UNDEF .CNEX                 DEFINE TO OMIT EXIT() CODE
        !           143: *.UNDEF .CNFN                 DEFINE TO OMIT FENCE() CODE
        !           144: *.UNDEF .CNLD                 DEFINE TO OMIT LOAD() CODE
        !           145: *.UNDEF .CNPF                 DEFINE TO OMIT PROFILE CODE
        !           146: *.UNDEF .CNRA                 DEFINE TO OMIT ALL REAL ARITHMETIC
        !           147: *.UNDEF .CNSR                 DEFINE TO OMIT SORT, RSORT CODE
        !           148: *.DEF   .CPLC                 DEFINE IF HOST PREFERS LOWER CASE
        !           149: *.UNDEF .CRPP                 DEFINE FOR ODD PARITY RETURN POINTS
        !           150: *.UNDEF .CS16                 DEFINE TO INITIALIZE STLIM TO 32767
        !           151: *.UNDEF .CSAX                 DEFINE IF SYSAX IS TO BE CALLED
        !           152: *.UNDEF .CSCI                 DEFINE TO ENABLE SYSCI ROUTINE
        !           153: *.UNDEF .CSCV                 DEFINE FOR CLU, CUL CASE CONVERSION
        !           154: *.DEF   .CSIG                 DEFINE TO IGNORE CASE OF LETTERS
        !           155: *.UNDEF .CSN6                 DEFINE TO PAD STMT NOS TO 6 CHARS
        !           156: *.DEF   .CSN8                 DEFINE TO PAD STMT NOS TO 8 CHARS
        !           157: *.UNDEF .CTMD                 DEFINE IF SYSTM UNIT IS DECISECOND
        !           158: .IF    .CASL
        !           159: .ELSE
        !           160: .UNDEF .CSIG                 .CSIG USELESS WITHOUT LC LETTERS
        !           161: .UNDEF .CPLC                 .CPLC ERRONEOUS WITHOUT LC LETTERS
        !           162: .FI
        !           163:        EJC
        !           164: *
        !           165: *      ACTUAL PROCESSABLE EXP PROCEDURE DEFINITIONS
        !           166: *
        !           167: .IF    .CSAX
        !           168: SYSAX  EXP  E,0
        !           169: .ELSE
        !           170: .FI
        !           171: SYSBX  EXP  E,0
        !           172: .IF    .CSCI
        !           173: SYSCI  EXP  E,0
        !           174: .FI
        !           175: SYSDT  EXP  E,0
        !           176: SYSEC  EXP  E,2
        !           177: SYSEF  EXP  E,2
        !           178: SYSEJ  EXP  E,0
        !           179: SYSEM  EXP  E,0
        !           180: SYSEN  EXP  E,2
        !           181: SYSEP  EXP  E,2
        !           182: .IF    .CNLD
        !           183: .ELSE
        !           184: SYSEX  EXP  E,1
        !           185: .FI
        !           186: SYSHS  EXP  E,2
        !           187: SYSID  EXP  E,0
        !           188: SYSIL  EXP  E,0
        !           189: SYSIN  EXP  E,2
        !           190: SYSIO  EXP  E,2
        !           191: .IF    .CNLD
        !           192: .ELSE
        !           193: SYSLD  EXP  E,2
        !           194: .FI
        !           195: SYSMM  EXP  E,0
        !           196: SYSMX  EXP  E,0
        !           197: SYSOU  EXP  E,2
        !           198: SYSPI  EXP  E,2
        !           199: SYSPP  EXP  E,0
        !           200: SYSPR  EXP  E,2
        !           201: SYSRD  EXP  E,2
        !           202: SYSRI  EXP  E,2
        !           203: SYSSC  EXP  E,2
        !           204: .IF    .CUST
        !           205: SYSST  EXP  E,2
        !           206: .FI
        !           207: SYSTM  EXP  E,0
        !           208: SYSTT  EXP  E,0
        !           209: .IF    .CNLD
        !           210: .ELSE
        !           211: SYSUL  EXP  E,0
        !           212: .FI
        !           213: .IF    .CNEX
        !           214: .ELSE
        !           215: SYSXI  EXP  E,2
        !           216: .FI
        !           217:        EJC
        !           218: *      NAME GLOBAL LABELS, INTERNAL PROCEDURES AND ROUTINES.
        !           219: *
        !           220: CMPCE  GLB
        !           221: CMPEL  GLB
        !           222: CMPLE  GLB
        !           223: CMPSE  GLB
        !           224: EVLXF  GLB
        !           225: EVLXN  GLB
        !           226: EVLXV  GLB
        !           227: LCNXE  GLB
        !           228: TRXQR  GLB
        !           229: ACESS  INP  R,1
        !           230: ACOMP  INP  N,5
        !           231: ALLOC  INP  E,0
        !           232: .IF    .CNBF
        !           233: .ELSE
        !           234: ALOBF  INP  E,0
        !           235: .FI
        !           236: ALOCS  INP  E,0
        !           237: ALOST  INP  E,0
        !           238: .IF    .CNRA
        !           239: ARITH  INP  N,2
        !           240: .ELSE
        !           241: ARITH  INP  N,3
        !           242: .FI
        !           243: ASIGN  INP  R,1
        !           244: ASINP  INP  R,1
        !           245: BLKLN  INP  E,0
        !           246: CBLCK  INP  N,1
        !           247: CDGCG  INP  E,0
        !           248: CDGEX  INP  R,0
        !           249: CDGNM  INP  R,0
        !           250: CDGVL  INP  R,0
        !           251: CDWRD  INP  E,0
        !           252: CMGEN  INP  R,0
        !           253: CMPIL  INP  E,0
        !           254: CNCRD  INP  E,0
        !           255: COPND  INP  E,0
        !           256: DFFNC  INP  E,0
        !           257: DTYPE  INP  E,0
        !           258: DUMPR  INP  E,0
        !           259: ERMSG  INP  E,0
        !           260: ERTEX  INP  E,0
        !           261: EVALI  INP  R,3
        !           262: EVALP  INP  R,1
        !           263: EVALS  INP  R,2
        !           264: EVALX  INP  R,1
        !           265: EXBLD  INP  E,0
        !           266: EXPAN  INP  E,0
        !           267: EXPAP  INP  E,1
        !           268: EXPDM  INP  N,0
        !           269: EXPOP  INP  N,0
        !           270: GBCOL  INP  E,0
        !           271: GBCPF  INP  E,0
        !           272: GTARR  INP  E,1
        !           273: .IF    .CNBF
        !           274: .ELSE
        !           275: GTBUF  INP  E,1
        !           276: .FI
        !           277:        EJC
        !           278: GTCOD  INP  E,1
        !           279: GTEXP  INP  E,1
        !           280: GTINT  INP  E,1
        !           281: GTNUM  INP  E,1
        !           282: GTNVR  INP  E,1
        !           283: GTPAT  INP  E,1
        !           284: .IF    .CNRA
        !           285: .ELSE
        !           286: GTREA  INP  E,1
        !           287: .FI
        !           288: GTSMI  INP  N,2
        !           289: GTSTG  INP  N,1
        !           290: GTVAR  INP  E,1
        !           291: HASHS  INP  E,0
        !           292: ICBLD  INP  E,0
        !           293: IDENT  INP  E,1
        !           294: INOUT  INP  E,0
        !           295: .IF    .CNBF
        !           296: .ELSE
        !           297: INSBF  INP  E,2
        !           298: .FI
        !           299: IOFTG  INP  N,1
        !           300: IOPUT  INP  N,4
        !           301: KTREX  INP  R,0
        !           302: KWNAM  INP  N,0
        !           303: LCOMP  INP  N,5
        !           304: LISTR  INP  E,0
        !           305: LISTT  INP  E,0
        !           306: NEXTS  INP  E,0
        !           307: PATIN  INP  N,2
        !           308: PATST  INP  N,1
        !           309: PBILD  INP  E,0
        !           310: PCONC  INP  E,0
        !           311: PCOPY  INP  N,0
        !           312: .IF    .CNPF
        !           313: .ELSE
        !           314: PRFLR  INP  E,0
        !           315: PRFLU  INP  E,0
        !           316: .FI
        !           317: PRPAR  INP  E,0
        !           318: PRTCF  INP  E,0
        !           319: PRTCH  INP  E,0
        !           320: PRTFB  INP  E,0
        !           321: PRTFH  INP  R,0
        !           322: PRTIN  INP  E,0
        !           323: PRTMI  INP  E,0
        !           324: PRTNM  INP  R,0
        !           325: PRTNV  INP  E,0
        !           326: PRTPG  INP  E,0
        !           327: PRTPS  INP  E,0
        !           328: PRTSF  INP  E,0
        !           329: PRTSN  INP  E,0
        !           330: PRTST  INP  R,0
        !           331:        EJC
        !           332: PRTVF  INP  E,0
        !           333: PRTVL  INP  R,0
        !           334: PRTVN  INP  E,0
        !           335: PTTFH  INP  E,0
        !           336: PTTST  INP  E,0
        !           337: .IF    .CNRA
        !           338: .ELSE
        !           339: RCBLD  INP  E,0
        !           340: .FI
        !           341: READR  INP  E,0
        !           342: .IF    .CASL
        !           343: SBSCC  INP  E,0
        !           344: SBSTG  INP  E,0
        !           345: .FI
        !           346: SBSTR  INP  E,0
        !           347: SCANE  INP  E,0
        !           348: SCNGF  INP  E,0
        !           349: SETVR  INP  E,0
        !           350: .IF    .CNSR
        !           351: .ELSE
        !           352: SORTA  INP  N,1
        !           353: SORTC  INP  E,1
        !           354: SORTF  INP  E,0
        !           355: SORTH  INP  N,0
        !           356: .FI
        !           357: TFIND  INP  E,1
        !           358: TRACE  INP  N,3
        !           359: TRBLD  INP  E,0
        !           360: TRCHN  INP  E,1
        !           361: TRIMR  INP  E,0
        !           362: TRXEQ  INP  R,0
        !           363: XSCAN  INP  E,0
        !           364: XSCNI  INP  N,2
        !           365: ARREF  INR
        !           366: CFUNC  INR
        !           367: EROSI  INR
        !           368: ERROR  INR
        !           369: EXFAL  INR
        !           370: EXINT  INR
        !           371: EXITS  INR
        !           372: EXIXR  INR
        !           373: EXNAM  INR
        !           374: EXNUL  INR
        !           375: .IF    .CNRA
        !           376: .ELSE
        !           377: EXREA  INR
        !           378: .FI
        !           379: EXSID  INR
        !           380: EXVNM  INR
        !           381: FAILP  INR
        !           382: FLPOP  INR
        !           383: INDIR  INR
        !           384: INITL  INR
        !           385: MATCH  INR
        !           386: RETRN  INR
        !           387: STAKV  INR
        !           388: STCOV  INR
        !           389: STMGO  INR
        !           390: STOPR  INR
        !           391: SUCCP  INR
        !           392:        TTL  S P I T B O L -- DEFINITIONS AND DATA STRUCTURES
        !           393: *      THIS SECTION CONTAINS ALL SYMBOL DEFINITIONS AND ALSO
        !           394: *      PICTURES OF ALL DATA STRUCTURES USED IN THE SYSTEM.
        !           395: *
        !           396:        SEC                   START OF DEFINITIONS SECTION
        !           397: *
        !           398: *      DEFINITIONS OF MACHINE PARAMETERS
        !           399: *
        !           400: *      THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
        !           401: *      FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
        !           402: *      EQU  *
        !           403: *      DEFINITIONS GIVEN AT THE START OF THIS SECTION.
        !           404: *      NOTE THAT EVEN IF CONDITIONAL ASSEMBLY IS USED TO OMIT
        !           405: *      SOME FEATURE (E.G. REAL ARITHMETIC) A FULL SET OF CFP$-
        !           406: *      VALUES MUST BE SUPPLIED. USE DUMMY VALUES IF GENUINE
        !           407: *      ONES ARE NOT NEEDED.
        !           408: *
        !           409: CFP$A  EQU  *                NUMBER OF CHARACTERS IN ALPHABET
        !           410: *
        !           411: CFP$B  EQU  *                BAUS/WORD ADDRESSING FACTOR
        !           412: *
        !           413: CFP$C  EQU  *                NUMBER OF CHARACTERS PER WORD
        !           414: *
        !           415: CFP$F  EQU  *                OFFSET IN BAUS TO CHARS IN
        !           416: *                            SCBLK. SEE SCBLK FORMAT.
        !           417: *
        !           418: CFP$I  EQU  *                NUMBER OF WORDS IN INTEGER CONSTANT
        !           419: *
        !           420: CFP$M  EQU  *                MAX POSITIVE INTEGER IN ONE WORD
        !           421: *
        !           422: CFP$N  EQU  *                NUMBER OF BITS IN ONE WORD
        !           423: *
        !           424: CFP$R  EQU  *                NUMBER OF WORDS IN REAL CONSTANT
        !           425: *
        !           426: CFP$S  EQU  *                NUMBER OF SIG DIGS FOR REAL OUTPUT
        !           427: *
        !           428: *      THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
        !           429: *      UPPER BOUND ON THE SIZE OF THE ALPHABET.  CFP$U IS USED
        !           430: *      TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
        !           431: *      TRANSLATION STORAGE REQUIREMENTS.
        !           432: *
        !           433: CFP$U  EQU  *                REALISTIC UPPER BOUND ON ALPHABET
        !           434: *
        !           435: CFP$X  EQU  *                MAX DIGITS IN REAL EXPONENT
        !           436: *
        !           437: MXDGS  EQU  CFP$S+CFP$X      MAX DIGITS IN REAL NUMBER
        !           438: *
        !           439: NSTMX  EQU  MXDGS+5          MAX SPACE FOR REAL (FOR +0.E+)
        !           440:        EJC
        !           441: *
        !           442: *      ENVIRONMENT PARAMETERS
        !           443: *
        !           444: *      THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
        !           445: *      THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
        !           446: *      EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
        !           447: *      THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
        !           448: *      THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
        !           449: *
        !           450: *      E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
        !           451: *      STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
        !           452: *      SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
        !           453: *      IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
        !           454: *      AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
        !           455: *      AN SCBLK CONTAINING SAY 30 CHARACTERS.
        !           456: *
        !           457: E$SRS  EQU  *                30 WORDS
        !           458: *
        !           459: *      E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
        !           460: *      STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
        !           461: *      PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
        !           462: *      TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
        !           463: *
        !           464: E$STS  EQU  *                500 WORDS
        !           465: *
        !           466: *      E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
        !           467: *      THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
        !           468: *      IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
        !           469: *      WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
        !           470: *      IN THE CASE OF A TOO LARGE VALUE.
        !           471: *
        !           472: E$CBS  EQU  *                500 WORDS
        !           473: *
        !           474: *      E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
        !           475: *      HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
        !           476: *      SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
        !           477: *      EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
        !           478: *
        !           479: E$HNB  EQU  *                127 BUCKET HEADERS
        !           480: *
        !           481: *      E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
        !           482: *      NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
        !           483: *      LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
        !           484: *      LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
        !           485: *
        !           486: E$HNW  EQU  *                6 WORDS
        !           487: *
        !           488: *      E$FSP .  IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
        !           489: *      COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
        !           490: *      IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
        !           491: *      THIS SPACE IS USED UP.  E$FSP IS A MEASURE OF THE
        !           492: *      MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
        !           493: *      BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
        !           494: *      OBTAIN MORE MEMORY.
        !           495: *
        !           496: E$FSP  EQU  *                15 PERCENT
        !           497:        EJC
        !           498: *
        !           499: *      DEFINITIONS OF CODES FOR LETTERS
        !           500: *
        !           501: CH$LA  EQU  *                LETTER A
        !           502: CH$LB  EQU  *                LETTER B
        !           503: CH$LC  EQU  *                LETTER C
        !           504: CH$LD  EQU  *                LETTER D
        !           505: CH$LE  EQU  *                LETTER E
        !           506: CH$LF  EQU  *                LETTER F
        !           507: CH$LG  EQU  *                LETTER G
        !           508: CH$LH  EQU  *                LETTER H
        !           509: CH$LI  EQU  *                LETTER I
        !           510: CH$LJ  EQU  *                LETTER J
        !           511: CH$LK  EQU  *                LETTER K
        !           512: CH$LL  EQU  *                LETTER L
        !           513: CH$LM  EQU  *                LETTER M
        !           514: CH$LN  EQU  *                LETTER N
        !           515: CH$LO  EQU  *                LETTER O
        !           516: CH$LP  EQU  *                LETTER P
        !           517: CH$LQ  EQU  *                LETTER Q
        !           518: CH$LR  EQU  *                LETTER R
        !           519: CH$LS  EQU  *                LETTER S
        !           520: CH$LT  EQU  *                LETTER T
        !           521: CH$LU  EQU  *                LETTER U
        !           522: CH$LV  EQU  *                LETTER V
        !           523: CH$LW  EQU  *                LETTER W
        !           524: CH$LX  EQU  *                LETTER X
        !           525: CH$LY  EQU  *                LETTER Y
        !           526: CH$L$  EQU  *                LETTER Z
        !           527: *
        !           528: *      DEFINITIONS OF CODES FOR DIGITS
        !           529: *
        !           530: CH$D0  EQU  *                DIGIT 0
        !           531: CH$D1  EQU  *                DIGIT 1
        !           532: CH$D2  EQU  *                DIGIT 2
        !           533: CH$D3  EQU  *                DIGIT 3
        !           534: CH$D4  EQU  *                DIGIT 4
        !           535: CH$D5  EQU  *                DIGIT 5
        !           536: CH$D6  EQU  *                DIGIT 6
        !           537: CH$D7  EQU  *                DIGIT 7
        !           538: CH$D8  EQU  *                DIGIT 8
        !           539: CH$D9  EQU  *                DIGIT 9
        !           540:        EJC
        !           541: *
        !           542: *      DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
        !           543: *
        !           544: *      THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
        !           545: *      ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
        !           546: *      TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
        !           547: *
        !           548: CH$AM  EQU  *                KEYWORD OPERATOR (AMPERSAND)
        !           549: CH$AS  EQU  *                MULTIPLICATION SYMBOL (ASTERISK)
        !           550: CH$AT  EQU  *                CURSOR POSITION OPERATOR (AT)
        !           551: CH$BB  EQU  *                LEFT ARRAY BRACKET (LESS THAN)
        !           552: CH$BL  EQU  *                BLANK
        !           553: CH$BR  EQU  *                ALTERNATION OPERATOR (VERTICAL BAR)
        !           554: CH$CL  EQU  *                GOTO SYMBOL (COLON)
        !           555: CH$CM  EQU  *                COMMA
        !           556: CH$DL  EQU  *                INDIRECTION OPERATOR (DOLLAR)
        !           557: CH$DT  EQU  *                NAME OPERATOR (DOT)
        !           558: CH$DQ  EQU  *                DOUBLE QUOTE
        !           559: CH$EQ  EQU  *                EQUAL SIGN
        !           560: CH$EX  EQU  *                EXPONENTIATION OPERATOR (EXCLM)
        !           561: CH$MN  EQU  *                MINUS SIGN
        !           562: CH$NM  EQU  *                NUMBER SIGN
        !           563: CH$NT  EQU  *                NEGATION OPERATOR (NOT)
        !           564: CH$PC  EQU  *                PERCENT
        !           565: CH$PL  EQU  *                PLUS SIGN
        !           566: CH$PP  EQU  *                LEFT PARENTHESIS
        !           567: CH$RB  EQU  *                RIGHT ARRAY BRACKET (GRTR THAN)
        !           568: CH$RP  EQU  *                RIGHT PARENTHESIS
        !           569: CH$QU  EQU  *                INTERROGATION OPERATOR (QUESTION)
        !           570: CH$SL  EQU  *                SLASH
        !           571: CH$SM  EQU  *                SEMICOLON
        !           572: CH$SQ  EQU  *                SINGLE QUOTE
        !           573: CH$UN  EQU  *                SPECIAL IDENTIFIER CHAR (UNDERLINE)
        !           574: CH$OB  EQU  *                OPENING BRACKET
        !           575: CH$CB  EQU  *                CLOSING BRACKET
        !           576:        EJC
        !           577: *
        !           578: *      REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
        !           579: *      THEY ARE ALL UNDER CONDITIONAL ASSEMBLY.
        !           580: .IF    .CAHT
        !           581: *
        !           582: *      TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
        !           583: *
        !           584: CH$HT  EQU  *                HORIZONTAL TAB
        !           585: .FI
        !           586: .IF    .CAVT
        !           587: CH$VT  EQU  *                VERTICAL TAB
        !           588: .FI
        !           589: .IF    .CASL
        !           590: *
        !           591: *      LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
        !           592: *
        !           593: CH$$A  EQU  *                SHIFTED A
        !           594: CH$$B  EQU  *                SHIFTED B
        !           595: CH$$C  EQU  *                SHIFTED C
        !           596: CH$$D  EQU  *                SHIFTED D
        !           597: CH$$E  EQU  *                SHIFTED E
        !           598: CH$$F  EQU  *                SHIFTED F
        !           599: CH$$G  EQU  *                SHIFTED G
        !           600: CH$$H  EQU  *                SHIFTED H
        !           601: CH$$I  EQU  *                SHIFTED I
        !           602: CH$$J  EQU  *                SHIFTED J
        !           603: CH$$K  EQU  *                SHIFTED K
        !           604: CH$$L  EQU  *                SHIFTED L
        !           605: CH$$M  EQU  *                SHIFTED M
        !           606: CH$$N  EQU  *                SHIFTED N
        !           607: CH$$O  EQU  *                SHIFTED O
        !           608: CH$$P  EQU  *                SHIFTED P
        !           609: CH$$Q  EQU  *                SHIFTED Q
        !           610: CH$$R  EQU  *                SHIFTED R
        !           611: CH$$S  EQU  *                SHIFTED S
        !           612: CH$$T  EQU  *                SHIFTED T
        !           613: CH$$U  EQU  *                SHIFTED U
        !           614: CH$$V  EQU  *                SHIFTED V
        !           615: CH$$W  EQU  *                SHIFTED W
        !           616: CH$$X  EQU  *                SHIFTED X
        !           617: CH$$Y  EQU  *                SHIFTED Y
        !           618: CH$$$  EQU  *                SHIFTED Z
        !           619: .IF    .CASL
        !           620: DFA$A  EQU  CH$$A-CH$LA      DIFF BETWEEN LC AND UC LETTERS
        !           621: .FI
        !           622: .FI
        !           623:        EJC
        !           624: *
        !           625: *      DATA BLOCK FORMATS AND DEFINITIONS
        !           626: *
        !           627: *      THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
        !           628: *      ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
        !           629: *
        !           630: *      EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
        !           631: *      UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
        !           632: *      BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
        !           633: *      INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
        !           634: *      CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
        !           635: *      IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
        !           636: *      DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
        !           637: *
        !           638: *      IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
        !           639: *      FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
        !           640: *      TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
        !           641: *      CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
        !           642: *      WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
        !           643: *      POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
        !           644: *
        !           645: *      IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
        !           646: *      MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
        !           647: *      IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
        !           648: *      A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
        !           649: *      TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
        !           650: *      COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
        !           651: *      IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
        !           652: *      PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
        !           653: *      FIELDS IN A BLOCK MUST BE CONTIGUOUS.
        !           654:        EJC
        !           655: *
        !           656: *      THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
        !           657: *
        !           658: *      1)   BLOCK TITLE AND TWO CHARACTER IDENTIFIER
        !           659: *
        !           660: *      2)   DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
        !           661: *           OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
        !           662: *
        !           663: *      3)   PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
        !           664: *           MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
        !           665: *           LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
        !           666: *           WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
        !           667: *           ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
        !           668: *           (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
        !           669: *           BY / (SLASH).
        !           670: *
        !           671: *      4)   DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
        !           672: *           BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
        !           673: *           OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
        !           674: *           BLOCK IS VARIABLE LENGTH.
        !           675: *           NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
        !           676: *           CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
        !           677: *           GIVEN HERE ENFORCE THIS.  MAKE CHANGES TO
        !           678: *           THEM ONLY WITH DUE CARE.
        !           679: *
        !           680: *      DEFINITIONS OF COMMON OFFSETS
        !           681: *
        !           682: OFFS1  EQU  1
        !           683: OFFS2  EQU  2
        !           684: OFFS3  EQU  3
        !           685: *
        !           686: *      5)   DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
        !           687: *           OF THE VARIOUS FIELDS.
        !           688: *
        !           689: *      THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
        !           690:        EJC
        !           691: *
        !           692: *      DEFINITIONS OF BLOCK CODES
        !           693: *
        !           694: *      THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
        !           695: *      EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
        !           696: *      THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
        !           697: *      ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
        !           698: *      THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
        !           699: *      USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
        !           700: *
        !           701: *      BLOCK CODES FOR ACCESSIBLE DATATYPES
        !           702: *
        !           703: BL$AR  EQU  0                ARBLK     ARRAY
        !           704: .IF    .CNBF
        !           705: BL$CD  EQU  BL$AR+1          CDBLK     CODE
        !           706: .ELSE
        !           707: BL$BC  EQU  BL$AR+1          BCBLK     BUFFER
        !           708: BL$CD  EQU  BL$BC+1          CDBLK     CODE
        !           709: .FI
        !           710: BL$EX  EQU  BL$CD+1          EXBLK     EXPRESSION
        !           711: BL$IC  EQU  BL$EX+1          ICBLK     INTEGER
        !           712: BL$NM  EQU  BL$IC+1          NMBLK     NAME
        !           713: BL$P0  EQU  BL$NM+1          P0BLK     PATTERN
        !           714: BL$P1  EQU  BL$P0+1          P1BLK     PATTERN
        !           715: BL$P2  EQU  BL$P1+1          P2BLK     PATTERN
        !           716: .IF    .CNRA
        !           717: BL$SC  EQU  BL$P2+1          SCBLK     STRING
        !           718: .ELSE
        !           719: BL$RC  EQU  BL$P2+1          RCBLK     REAL
        !           720: BL$SC  EQU  BL$RC+1          SCBLK     STRING
        !           721: .FI
        !           722: BL$SE  EQU  BL$SC+1          SEBLK     EXPRESSION
        !           723: BL$TB  EQU  BL$SE+1          TBBLK     TABLE
        !           724: BL$VC  EQU  BL$TB+1          VCBLK     ARRAY
        !           725: BL$XN  EQU  BL$VC+1          XNBLK     EXTERNAL
        !           726: BL$XR  EQU  BL$XN+1          XRBLK     EXTERNAL
        !           727: BL$PD  EQU  BL$XR+1          PDBLK     PROGRAM DEFINED DATATYPE
        !           728: *
        !           729: BL$$D  EQU  BL$PD+1          NUMBER OF BLOCK CODES FOR DATA
        !           730: *
        !           731: *      OTHER BLOCK CODES
        !           732: *
        !           733: BL$TR  EQU  BL$PD+1          TRBLK
        !           734: .IF    .CNBF
        !           735: BL$CC  EQU  BL$TR+1          CCBLK
        !           736: .ELSE
        !           737: BL$BF  EQU  BL$TR+1          BFBLK
        !           738: BL$CC  EQU  BL$BF+1          CCBLK
        !           739: .FI
        !           740: BL$CM  EQU  BL$CC+1          CMBLK
        !           741: BL$CO  EQU  BL$CM+1          COBLK
        !           742: BL$CT  EQU  BL$CO+1          CTBLK
        !           743: BL$DF  EQU  BL$CT+1          DFBLK
        !           744: BL$EF  EQU  BL$DF+1          EFBLK
        !           745: BL$EV  EQU  BL$EF+1          EVBLK
        !           746: BL$FF  EQU  BL$EV+1          FFBLK
        !           747: BL$KV  EQU  BL$FF+1          KVBLK
        !           748: BL$PF  EQU  BL$KV+1          PFBLK
        !           749: BL$TE  EQU  BL$PF+1          TEBLK
        !           750: *
        !           751: BL$$I  EQU  0                DEFAULT IDENTIFICATION CODE
        !           752: BL$$T  EQU  BL$TR+1          CODE FOR DATA OR TRACE BLOCK
        !           753: BL$$$  EQU  BL$TE+1          NUMBER OF BLOCK CODES
        !           754:        EJC
        !           755: *
        !           756: *      FIELD REFERENCES
        !           757: *
        !           758: *      REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
        !           759: *      (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
        !           760: *      EXCEPTIONS.
        !           761: *
        !           762: *      1)   REFERENCES TO THE FIRST WORD ARE USUALLY NOT
        !           763: *           SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
        !           764: *
        !           765: *      2)   THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
        !           766: *           SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
        !           767: *           BLOCK FORMAT IS MODIFIED.
        !           768: *
        !           769: *      3)   THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
        !           770: *           CORRESPONDING TO THE DEFINITION OF CFP$F.
        !           771: *
        !           772: *      4)   THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
        !           773: *           IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
        !           774: *
        !           775: *      5)   THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
        !           776: *           AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
        !           777: *           BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
        !           778: *           TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
        !           779: *           LISTED EXCEPTIONS.
        !           780: *
        !           781: *      6)   SEVERAL SPOTS IN THE CODE ASSUME THAT THE
        !           782: *           DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
        !           783: *           THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
        !           784: *           OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
        !           785: *
        !           786: *      7)   REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
        !           787: *           ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
        !           788: *
        !           789: *      APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
        !           790: *      AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
        !           791: *      OF FIELDS WILL NOT REQUIRE CHANGES.
        !           792:        EJC
        !           793: *
        !           794: *      COMMON FIELDS FOR FUNCTION BLOCKS
        !           795: *
        !           796: *      BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
        !           797: *      COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
        !           798: *
        !           799: *           +------------------------------------+
        !           800: *           I                FCODE               I
        !           801: *           +------------------------------------+
        !           802: *           I                FARGS               I
        !           803: *           +------------------------------------+
        !           804: *           /                                    /
        !           805: *           /       REST OF FUNCTION BLOCK       /
        !           806: *           /                                    /
        !           807: *           +------------------------------------+
        !           808: *
        !           809: FCODE  EQU  0                POINTER TO CODE FOR FUNCTION
        !           810: FARGS  EQU  1                NUMBER OF ARGUMENTS
        !           811: *
        !           812: *      FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
        !           813: *      PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
        !           814: *
        !           815: *      FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
        !           816: *      NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
        !           817: *      DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
        !           818: *      FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
        !           819: *      A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
        !           820: *      VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
        !           821: *
        !           822: *      THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
        !           823: *
        !           824: *      FFBLK                 FIELD FUNCTION
        !           825: *      DFBLK                 DATATYPE FUNCTION
        !           826: *      PFBLK                 PROGRAM DEFINED FUNCTION
        !           827: *      EFBLK                 EXTERNAL LOADED FUNCTION
        !           828:        EJC
        !           829: *
        !           830: *      IDENTIFICATION FIELD
        !           831: *
        !           832: *
        !           833: *      ID   FIELD
        !           834: *
        !           835: *      CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
        !           836: *      OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
        !           837: *      IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
        !           838: *      ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
        !           839: *
        !           840: IDVAL  EQU  1                ID VALUE FIELD
        !           841: *
        !           842: *      THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
        !           843: *
        !           844: *      ARBLK                 ARRAY
        !           845: *      PDBLK                 PROGRAM DEFINED DATATYPE
        !           846: *      TBBLK                 TABLE
        !           847: *      VCBLK                 VECTOR BLOCK (ARRAY)
        !           848: *
        !           849: *      NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
        !           850: *      HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
        !           851:        EJC
        !           852: *
        !           853: *      ARRAY BLOCK (ARBLK)
        !           854: *
        !           855: *      AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
        !           856: *      WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
        !           857: *      AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
        !           858: *      (S$CNV) OR ARRAY (S$ARR).
        !           859: *
        !           860: *           +------------------------------------+
        !           861: *           I                ARTYP               I
        !           862: *           +------------------------------------+
        !           863: *           I                IDVAL               I
        !           864: *           +------------------------------------+
        !           865: *           I                ARLEN               I
        !           866: *           +------------------------------------+
        !           867: *           I                AROFS               I
        !           868: *           +------------------------------------+
        !           869: *           I                ARNDM               I
        !           870: *           +------------------------------------+
        !           871: *           *                ARLBD               *
        !           872: *           +------------------------------------+
        !           873: *           *                ARDIM               *
        !           874: *           +------------------------------------+
        !           875: *           *                                    *
        !           876: *           * ABOVE 2 FLDS REPEATED FOR EACH DIM *
        !           877: *           *                                    *
        !           878: *           +------------------------------------+
        !           879: *           I                ARPRO               I
        !           880: *           +------------------------------------+
        !           881: *           /                                    /
        !           882: *           /                ARVLS               /
        !           883: *           /                                    /
        !           884: *           +------------------------------------+
        !           885:        EJC
        !           886: *
        !           887: *      ARRAY BLOCK (CONTINUED)
        !           888: *
        !           889: ARTYP  EQU  0                POINTER TO DUMMY ROUTINE B$ART
        !           890: ARLEN  EQU  IDVAL+1          LENGTH OF ARBLK IN BAUS
        !           891: AROFS  EQU  ARLEN+1          OFFSET IN ARBLK TO ARPRO FIELD
        !           892: ARNDM  EQU  AROFS+1          NUMBER OF DIMENSIONS
        !           893: ARLBD  EQU  ARNDM+1          LOW BOUND (FIRST SUBSCRIPT)
        !           894: ARDIM  EQU  ARLBD+CFP$I      DIMENSION (FIRST SUBSCRIPT)
        !           895: ARLB2  EQU  ARDIM+CFP$I      LOW BOUND (SECOND SUBSCRIPT)
        !           896: ARDM2  EQU  ARLB2+CFP$I      DIMENSION (SECOND SUBSCRIPT)
        !           897: ARPRO  EQU  ARDIM+CFP$I      ARRAY PROTOTYPE (ONE DIMENSION)
        !           898: ARVLS  EQU  ARPRO+1          START OF VALUES (ONE DIMENSION)
        !           899: ARPR2  EQU  ARDM2+CFP$I      ARRAY PROTOTYPE (TWO DIMENSIONS)
        !           900: ARVL2  EQU  ARPR2+1          START OF VALUES (TWO DIMENSIONS)
        !           901: ARSI$  EQU  ARLBD            NUMBER OF STANDARD FIELDS IN BLOCK
        !           902: ARDMS  EQU  ARLB2-ARLBD      SIZE OF INFO FOR ONE SET OF BOUNDS
        !           903: *
        !           904: *      THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
        !           905: *      VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
        !           906: *
        !           907: *      THE LENGTH OF AN ARBLK IN BAUS MAY NOT EXCEED MXLEN.
        !           908: *      THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
        !           909: *
        !           910: *      THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
        !           911: *      CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
        !           912: .IF    .CNBF
        !           913: .ELSE
        !           914:        EJC
        !           915: *      BUFFER CONTROL BLOCK (BCBLK)
        !           916: *
        !           917: *      A BCBLK IS BUILT FOR EVERY BFBLK.
        !           918: *
        !           919: *           +------------------------------------+
        !           920: *           I                BCTYP               I
        !           921: *           +------------------------------------+
        !           922: *           I                IDVAL               I
        !           923: *           +------------------------------------+
        !           924: *           I                BCLEN               I
        !           925: *           +------------------------------------+
        !           926: *           I                BCBUF               I
        !           927: *           +------------------------------------+
        !           928: *
        !           929: BCTYP  EQU  0                PTR TO DUMMY ROUTINE B$BCT
        !           930: BCLEN  EQU  IDVAL+1          DEFINED BUFFER LENGTH
        !           931: BCBUF  EQU  BCLEN+1          PTR TO BFBLK
        !           932: BCSI$  EQU  BCBUF+1          SIZE OF BCBLK
        !           933: *
        !           934: *      A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
        !           935: *      THE REASON FOR NOT STORING THIS DATA DIRECTLY
        !           936: *      IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
        !           937: *      MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
        !           938: *      THUS FACILITATING TRANSPARENT STRING OPERATIONS
        !           939: *      (FOR THE MOST PART).  SPECIFICALLY, CFP$F IS THE
        !           940: *      SAME FOR A BFBLK AS FOR AN SCBLK.  BY CONVENTION,
        !           941: *      WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
        !           942: *      IS POINTED TO.
        !           943: *
        !           944: *      THE CORRESPONDING BFBLK IS POINTED TO BY THE
        !           945: *      BCBUF POINTER IN THE BCBLK.
        !           946: *
        !           947: *      BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
        !           948: *      ARRAY IN THE BFBLK.  CHARACTERS FOLLOWING THE OFFSET
        !           949: *      OF BCLEN ARE UNDEFINED.
        !           950: *
        !           951:        EJC
        !           952: *
        !           953: *      STRING BUFFER BLOCK (BFBLK)
        !           954: *
        !           955: *      A BFBLK IS BUILT BY A CALL TO BUFFER(...)
        !           956: *
        !           957: *           +------------------------------------+
        !           958: *           I                BFTYP               I
        !           959: *           +------------------------------------+
        !           960: *           I                BFALC               I
        !           961: *           +------------------------------------+
        !           962: *           /                                    /
        !           963: *           /                BFCHR               /
        !           964: *           /                                    /
        !           965: *           +------------------------------------+
        !           966: *
        !           967: BFTYP  EQU  0                PTR TO DUMMY ROUTINE B$BFT
        !           968: BFALC  EQU  BFTYP+1          ALLOCATED SIZE OF BUFFER
        !           969: BFCHR  EQU  BFALC+1          CHARACTERS OF STRING
        !           970: BFSI$  EQU  BFCHR            SIZE OF STANDARD FIELDS IN BFBLK
        !           971: *
        !           972: *      THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
        !           973: *      THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
        !           974: *      (CHARACTER) PADDED.  ANY TRAILING ALLOCATION PAST THE
        !           975: *      WORD CONTAINING THE LAST CHARACTER CONTAINS
        !           976: *      UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
        !           977: *
        !           978: *      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
        !           979: *      IS GIVEN BY CFP$F, AS WITH AN SCBLK.  HOWEVER, THE
        !           980: *      OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
        !           981: *      IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
        !           982: *      DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
        !           983: *
        !           984: *      THE VALUE OF BFALC MAY NOT EXCEED MXLEN.  THE VALUE OF
        !           985: *      BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
        !           986: *
        !           987: .FI
        !           988:        EJC
        !           989: *
        !           990: *      CODE CONSTRUCTION BLOCK (CCBLK)
        !           991: *
        !           992: *      AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
        !           993: *      WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
        !           994: *
        !           995: *           +------------------------------------+
        !           996: *           I                CCTYP               I
        !           997: *           +------------------------------------+
        !           998: *           I                CCLEN               I
        !           999: *           +------------------------------------+
        !          1000: *           I                CCUSE               I
        !          1001: *           +------------------------------------+
        !          1002: *           /                                    /
        !          1003: *           /                CCCOD               /
        !          1004: *           /                                    /
        !          1005: *           +------------------------------------+
        !          1006: *
        !          1007: CCTYP  EQU  0                POINTER TO DUMMY ROUTINE B$CCT
        !          1008: CCLEN  EQU  CCTYP+1          LENGTH OF CCBLK IN BAUS
        !          1009: CCUSE  EQU  CCLEN+1          OFFSET PAST LAST USED WORD (BAUS)
        !          1010: CCCOD  EQU  CCUSE+1          START OF GENERATED CODE IN BLOCK
        !          1011: *
        !          1012: *      THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
        !          1013: *      THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
        !          1014: *      ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
        !          1015:        EJC
        !          1016: *
        !          1017: *      CODE BLOCK (CDBLK)
        !          1018: *
        !          1019: *      A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
        !          1020: *      THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
        !          1021: *
        !          1022: *           +------------------------------------+
        !          1023: *           I                CDJMP               I
        !          1024: *           +------------------------------------+
        !          1025: *           I                CDSTM               I
        !          1026: *           +------------------------------------+
        !          1027: *           I                CDLEN               I
        !          1028: *           +------------------------------------+
        !          1029: *           I                CDFAL               I
        !          1030: *           +------------------------------------+
        !          1031: *           /                                    /
        !          1032: *           /                CDCOD               /
        !          1033: *           /                                    /
        !          1034: *           +------------------------------------+
        !          1035: *
        !          1036: CDJMP  EQU  0                PTR TO ROUTINE TO EXECUTE STATEMENT
        !          1037: CDSTM  EQU  CDJMP+1          STATEMENT NUMBER
        !          1038: CDLEN  EQU  OFFS2            LENGTH OF CDBLK IN BAUS
        !          1039: CDFAL  EQU  OFFS3            FAILURE EXIT (SEE BELOW)
        !          1040: CDCOD  EQU  CDFAL+1          EXECUTABLE PSEUDO-CODE
        !          1041: CDSI$  EQU  CDCOD            NUMBER OF STANDARD FIELDS IN CDBLK
        !          1042: *
        !          1043: *      CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
        !          1044: *
        !          1045: *      CDJMP, CDFAL ARE SET AS FOLLOWS.
        !          1046: *
        !          1047: *      1)   IF THE FAILURE EXIT IS THE NEXT STATEMENT
        !          1048: *
        !          1049: *           CDJMP = B$CDS
        !          1050: *           CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
        !          1051: *
        !          1052: *      2)   IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
        !          1053: *
        !          1054: *           CDJMP = B$CDS
        !          1055: *           CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
        !          1056: *
        !          1057: *      3)   IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
        !          1058: *
        !          1059: *           CDJMP = B$CDS
        !          1060: *           CDFAL = O$UNF
        !          1061: *
        !          1062: *      4)   IF THE FAILURE EXIT IS COMPLEX OR DIRECT
        !          1063: *
        !          1064: *           CDJMP = B$CDC
        !          1065: *           CDFAL IS THE OFFSET TO THE O$GOF WORD
        !          1066:        EJC
        !          1067: *
        !          1068: *      CODE BLOCK (CONTINUED)
        !          1069: *
        !          1070: *      CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
        !          1071: *      THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
        !          1072: *      ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
        !          1073: *      THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
        !          1074: *      BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
        !          1075: *      CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
        !          1076: *      SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
        !          1077: *
        !          1078: *      GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
        !          1079: *
        !          1080: *      EXPRESSION            POINTER TO EXBLK OR SEBLK
        !          1081: *
        !          1082: *      INTEGER CONSTANT      POINTER TO ICBLK
        !          1083: *
        !          1084: *      NULL CONSTANT         POINTER TO NULLS
        !          1085: *
        !          1086: *      PATTERN               (RESULTING FROM PREEVALUATION)
        !          1087: *                            =O$LPT
        !          1088: *                            POINTER TO P0BLK,P1BLK OR P2BLK
        !          1089: *
        !          1090: *      REAL CONSTANT         POINTER TO RCBLK
        !          1091: *
        !          1092: *      STRING CONSTANT       POINTER TO SCBLK
        !          1093: *
        !          1094: *      VARIABLE              POINTER TO VRGET FIELD OF VRBLK
        !          1095: *
        !          1096: *      ADDITION              VALUE CODE FOR LEFT OPERAND
        !          1097: *                            VALUE CODE FOR RIGHT OPERAND
        !          1098: *                            =O$ADD
        !          1099: *
        !          1100: *      AFFIRMATION           VALUE CODE FOR OPERAND
        !          1101: *                            =O$AFF
        !          1102: *
        !          1103: *      ALTERNATION           VALUE CODE FOR LEFT OPERAND
        !          1104: *                            VALUE CODE FOR RIGHT OPERAND
        !          1105: *                            =O$ALT
        !          1106: *
        !          1107: *      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
        !          1108: *                            VALUE CODE FOR ARRAY OPERAND
        !          1109: *                            VALUE CODE FOR SUBSCRIPT OPERAND
        !          1110: *                            =O$AOV
        !          1111: *
        !          1112: *                            (CASE OF MORE THAN ONE SUBSCRIPT)
        !          1113: *                            VALUE CODE FOR ARRAY OPERAND
        !          1114: *                            VALUE CODE FOR FIRST SUBSCRIPT
        !          1115: *                            VALUE CODE FOR SECOND SUBSCRIPT
        !          1116: *                            ...
        !          1117: *                            VALUE CODE FOR LAST SUBSCRIPT
        !          1118: *                            =O$AMV
        !          1119: *                            NUMBER OF SUBSCRIPTS
        !          1120:        EJC
        !          1121: *
        !          1122: *      CODE BLOCK (CONTINUED)
        !          1123: *
        !          1124: *      ASSIGNMENT            (TO NATURAL VARIABLE)
        !          1125: *                            VALUE CODE FOR RIGHT OPERAND
        !          1126: *                            POINTER TO VRSTO FIELD OF VRBLK
        !          1127: *
        !          1128: *                            (TO ANY OTHER VARIABLE)
        !          1129: *                            NAME CODE FOR LEFT OPERAND
        !          1130: *                            VALUE CODE FOR RIGHT OPERAND
        !          1131: *                            =O$ASS
        !          1132: *
        !          1133: *      COMPILE ERROR         =O$CER
        !          1134: *
        !          1135: *
        !          1136: *      COMPLEMENTATION       VALUE CODE FOR OPERAND
        !          1137: *                            =O$COM
        !          1138: *
        !          1139: *      CONCATENATION         (CASE OF PRED FUNC LEFT OPERAND)
        !          1140: *                            VALUE CODE FOR LEFT OPERAND
        !          1141: *                            =O$POP
        !          1142: *                            VALUE CODE FOR RIGHT OPERAND
        !          1143: *
        !          1144: *                            (ALL OTHER CASES)
        !          1145: *                            VALUE CODE FOR LEFT OPERAND
        !          1146: *                            VALUE CODE FOR RIGHT OPERAND
        !          1147: *                            =O$CNC
        !          1148: *
        !          1149: *      CURSOR ASSIGNMENT     NAME CODE FOR OPERAND
        !          1150: *                            =O$CAS
        !          1151: *
        !          1152: *      DIVISION              VALUE CODE FOR LEFT OPERAND
        !          1153: *                            VALUE CODE FOR RIGHT OPERAND
        !          1154: *                            =O$DVD
        !          1155: *
        !          1156: *      EXPONENTIATION        VALUE CODE FOR LEFT OPERAND
        !          1157: *                            VALUE CODE FOR RIGHT OPERAND
        !          1158: *                            =O$EXP
        !          1159: *
        !          1160: *      FUNCTION CALL         (CASE OF CALL TO SYSTEM FUNCTION)
        !          1161: *                            VALUE CODE FOR FIRST ARGUMENT
        !          1162: *                            VALUE CODE FOR SECOND ARGUMENT
        !          1163: *                            ...
        !          1164: *                            VALUE CODE FOR LAST ARGUMENT
        !          1165: *                            POINTER TO SVFNC FIELD OF SVBLK
        !          1166: *
        !          1167:        EJC
        !          1168: *
        !          1169: *      CODE BLOCK (CONTINUED)
        !          1170: *
        !          1171: *      FUNCTION CALL         (CASE OF NON-SYSTEM FUNCTION 1 ARG)
        !          1172: *                            VALUE CODE FOR ARGUMENT
        !          1173: *                            =O$FNS
        !          1174: *                            POINTER TO VRBLK FOR FUNCTION
        !          1175: *
        !          1176: *                            (NON-SYSTEM FUNCTION, GT 1 ARG)
        !          1177: *                            VALUE CODE FOR FIRST ARGUMENT
        !          1178: *                            VALUE CODE FOR SECOND ARGUMENT
        !          1179: *                            ...
        !          1180: *                            VALUE CODE FOR LAST ARGUMENT
        !          1181: *                            =O$FNC
        !          1182: *                            NUMBER OF ARGUMENTS
        !          1183: *                            POINTER TO VRBLK FOR FUNCTION
        !          1184: *
        !          1185: *      IMMEDIATE ASSIGNMENT  VALUE CODE FOR LEFT OPERAND
        !          1186: *                            NAME CODE FOR RIGHT OPERAND
        !          1187: *                            =O$IMA
        !          1188: *
        !          1189: *      INDIRECTION           VALUE CODE FOR OPERAND
        !          1190: *                            =O$INV
        !          1191: *
        !          1192: *      INTERROGATION         VALUE CODE FOR OPERAND
        !          1193: *                            =O$INT
        !          1194: *
        !          1195: *      KEYWORD REFERENCE     NAME CODE FOR OPERAND
        !          1196: *                            =O$KWV
        !          1197: *
        !          1198: *      MULTIPLICATION        VALUE CODE FOR LEFT OPERAND
        !          1199: *                            VALUE CODE FOR RIGHT OPERAND
        !          1200: *                            =O$MLT
        !          1201: *
        !          1202: *      NAME REFERENCE        (NATURAL VARIABLE CASE)
        !          1203: *                            POINTER TO NMBLK FOR NAME
        !          1204: *
        !          1205: *                            (ALL OTHER CASES)
        !          1206: *                            NAME CODE FOR OPERAND
        !          1207: *                            =O$NAM
        !          1208: *
        !          1209: *      NEGATION              =O$NTA
        !          1210: *                            CDBLK OFFSET OF O$NTC WORD
        !          1211: *                            VALUE CODE FOR OPERAND
        !          1212: *                            =O$NTB
        !          1213: *                            =O$NTC
        !          1214:        EJC
        !          1215: *
        !          1216: *      CODE BLOCK (CONTINUED)
        !          1217: *
        !          1218: *      PATTERN ASSIGNMENT    VALUE CODE FOR LEFT OPERAND
        !          1219: *                            NAME CODE FOR RIGHT OPERAND
        !          1220: *                            =O$PAS
        !          1221: *
        !          1222: *      PATTERN MATCH         VALUE CODE FOR LEFT OPERAND
        !          1223: *                            VALUE CODE FOR RIGHT OPERAND
        !          1224: *                            =O$PMV
        !          1225: *
        !          1226: *      PATTERN REPLACEMENT   NAME CODE FOR SUBJECT
        !          1227: *                            VALUE CODE FOR PATTERN
        !          1228: *                            =O$PMN
        !          1229: *                            VALUE CODE FOR REPLACEMENT
        !          1230: *                            =O$RPL
        !          1231: *
        !          1232: *      SELECTION             (FOR FIRST ALTERNATIVE)
        !          1233: *                            =O$SLA
        !          1234: *                            CDBLK OFFSET TO NEXT O$SLC WORD
        !          1235: *                            VALUE CODE FOR FIRST ALTERNATIVE
        !          1236: *                            =O$SLB
        !          1237: *                            CDBLK OFFSET PAST ALTERNATIVES
        !          1238: *
        !          1239: *                            (FOR SUBSEQUENT ALTERNATIVES)
        !          1240: *                            =O$SLC
        !          1241: *                            CDBLK OFFSET TO NEXT O$SLC,O$SLD
        !          1242: *                            VALUE CODE FOR ALTERNATIVE
        !          1243: *                            =O$SLB
        !          1244: *                            OFFSET IN CDBLK PAST ALTERNATIVES
        !          1245: *
        !          1246: *                            (FOR LAST ALTERNATIVE)
        !          1247: *                            =O$SLD
        !          1248: *                            VALUE CODE FOR LAST ALTERNATIVE
        !          1249: *
        !          1250: *      SUBTRACTION           VALUE CODE FOR LEFT OPERAND
        !          1251: *                            VALUE CODE FOR RIGHT OPERAND
        !          1252: *                            =O$SUB
        !          1253:        EJC
        !          1254: *
        !          1255: *      CODE BLOCK (CONTINUED)
        !          1256: *
        !          1257: *      GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
        !          1258: *
        !          1259: *      VARIABLE              =O$LVN
        !          1260: *                            POINTER TO VRBLK
        !          1261: *
        !          1262: *      EXPRESSION            (CASE OF *NATURAL VARIABLE)
        !          1263: *                            =O$LVN
        !          1264: *                            POINTER TO VRBLK
        !          1265: *
        !          1266: *                            (ALL OTHER CASES)
        !          1267: *                            =O$LEX
        !          1268: *                            POINTER TO EXBLK
        !          1269: *
        !          1270: *
        !          1271: *      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
        !          1272: *                            VALUE CODE FOR ARRAY OPERAND
        !          1273: *                            VALUE CODE FOR SUBSCRIPT OPERAND
        !          1274: *                            =O$AON
        !          1275: *
        !          1276: *                            (CASE OF MORE THAN ONE SUBSCRIPT)
        !          1277: *                            VALUE CODE FOR ARRAY OPERAND
        !          1278: *                            VALUE CODE FOR FIRST SUBSCRIPT
        !          1279: *                            VALUE CODE FOR SECOND SUBSCRIPT
        !          1280: *                            ...
        !          1281: *                            VALUE CODE FOR LAST SUBSCRIPT
        !          1282: *                            =O$AMN
        !          1283: *                            NUMBER OF SUBSCRIPTS
        !          1284: *
        !          1285: *      COMPILE ERROR         =O$CER
        !          1286: *
        !          1287: *      FUNCTION CALL         (SAME CODE AS FOR VALUE CALL)
        !          1288: *                            =O$FNE
        !          1289: *
        !          1290: *      INDIRECTION           VALUE CODE FOR OPERAND
        !          1291: *                            =O$INN
        !          1292: *
        !          1293: *      KEYWORD REFERENCE     NAME CODE FOR OPERAND
        !          1294: *                            =O$KWN
        !          1295: *
        !          1296: *      ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
        !          1297: *
        !          1298: *      NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
        !          1299: *      GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
        !          1300: *      WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
        !          1301:        EJC
        !          1302: *
        !          1303: *      CODE BLOCK (CONTINUED)
        !          1304: *
        !          1305: *      NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
        !          1306: *      FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
        !          1307: *
        !          1308: *      FIRST COMES THE CODE FOR THE STATEMENT BODY.
        !          1309: *      THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
        !          1310: *      BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
        !          1311: *      NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
        !          1312: *      STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
        !          1313: *      VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
        !          1314: *
        !          1315: *                            VALUE CODE FOR LEFT OPERAND
        !          1316: *                            VALUE CODE FOR RIGHT OPERAND
        !          1317: *                            =O$PMS
        !          1318: *
        !          1319: *      NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
        !          1320: *      SEVERAL CASES AS FOLLOWS.
        !          1321: *
        !          1322: *      1)   NO SUCCESS GOTO  PTR TO CDBLK FOR NEXT STATEMENT
        !          1323: *
        !          1324: *      2)   SIMPLE LABEL     PTR TO VRTRA FIELD OF VRBLK
        !          1325: *
        !          1326: *      3)   COMPLEX GOTO     (CODE BY NAME FOR GOTO OPERAND)
        !          1327: *                            =O$GOC
        !          1328: *
        !          1329: *      4)   DIRECT GOTO      (CODE BY VALUE FOR GOTO OPERAND)
        !          1330: *                            =O$GOD
        !          1331: *
        !          1332: *      FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
        !          1333: *      IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
        !          1334: *      HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
        !          1335: *      CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
        !          1336: *      OF THE FOLLOWING.
        !          1337: *
        !          1338: *      1)   COMPLEX FGOTO    =O$FIF
        !          1339: *                            =O$GOF
        !          1340: *                            NAME CODE FOR GOTO OPERAND
        !          1341: *                            =O$GOC
        !          1342: *
        !          1343: *      2)   DIRECT FGOTO     =O$FIF
        !          1344: *                            =O$GOF
        !          1345: *                            VALUE CODE FOR GOTO OPERAND
        !          1346: *                            =O$GOD
        !          1347: *
        !          1348: *      AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
        !          1349: *      ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
        !          1350: *      NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
        !          1351: *      IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
        !          1352:        EJC
        !          1353: *
        !          1354: *      COMPILER BLOCK (CMBLK)
        !          1355: *
        !          1356: *      A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
        !          1357: *      ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
        !          1358: *
        !          1359: *           +------------------------------------+
        !          1360: *           I                CMIDN               I
        !          1361: *           +------------------------------------+
        !          1362: *           I                CMLEN               I
        !          1363: *           +------------------------------------+
        !          1364: *           I                CMTYP               I
        !          1365: *           +------------------------------------+
        !          1366: *           I                CMOPN               I
        !          1367: *           +------------------------------------+
        !          1368: *           /           CMVLS OR CMROP           /
        !          1369: *           /                                    /
        !          1370: *           /                CMLOP               /
        !          1371: *           /                                    /
        !          1372: *           +------------------------------------+
        !          1373: *
        !          1374: CMIDN  EQU  0                POINTER TO DUMMY ROUTINE B$CMT
        !          1375: CMLEN  EQU  CMIDN+1          LENGTH OF CMBLK IN BAUS
        !          1376: CMTYP  EQU  CMLEN+1          TYPE (C$XXX, SEE LIST BELOW)
        !          1377: CMOPN  EQU  CMTYP+1          OPERAND POINTER (SEE BELOW)
        !          1378: CMVLS  EQU  CMOPN+1          OPERAND VALUE POINTERS (SEE BELOW)
        !          1379: CMROP  EQU  CMVLS            RIGHT (ONLY) OPERATOR OPERAND
        !          1380: CMLOP  EQU  CMVLS+1          LEFT OPERATOR OPERAND
        !          1381: CMSI$  EQU  CMVLS            NUMBER OF STANDARD FIELDS IN CMBLK
        !          1382: CMUS$  EQU  CMSI$+1          SIZE OF UNARY OPERATOR CMBLK
        !          1383: CMBS$  EQU  CMSI$+2          SIZE OF BINARY OPERATOR CMBLK
        !          1384: CMAR1  EQU  CMVLS+1          ARRAY SUBSCRIPT POINTERS
        !          1385: *
        !          1386: *      THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
        !          1387: *
        !          1388: *      ARRAY REFERENCE       CMOPN = PTR TO ARRAY OPERAND
        !          1389: *                            CMVLS = PTRS TO SUBSCRIPT OPERANDS
        !          1390: *
        !          1391: *      FUNCTION CALL         CMOPN = PTR TO VRBLK FOR FUNCTION
        !          1392: *                            CMVLS = PTRS TO ARGUMENT OPERANDS
        !          1393: *
        !          1394: *      SELECTION             CMOPN = ZERO
        !          1395: *                            CMVLS = PTRS TO ALTERNATE OPERANDS
        !          1396: *
        !          1397: *      UNARY OPERATOR        CMOPN = PTR TO OPERATOR DVBLK
        !          1398: *                            CMROP = PTR TO OPERAND
        !          1399: *
        !          1400: *      BINARY OPERATOR       CMOPN = PTR TO OPERATOR DVBLK
        !          1401: *                            CMROP = PTR TO RIGHT OPERAND
        !          1402: *                            CMLOP = PTR TO LEFT OPERAND
        !          1403:        EJC
        !          1404: *
        !          1405: *      CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
        !          1406: *      AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
        !          1407: *
        !          1408: C$ARR  EQU  0                ARRAY REFERENCE
        !          1409: C$FNC  EQU  C$ARR+1          FUNCTION CALL
        !          1410: C$DEF  EQU  C$FNC+1          DEFERRED EXPRESSION (UNARY *)
        !          1411: C$IND  EQU  C$DEF+1          INDIRECTION (UNARY $)
        !          1412: C$KEY  EQU  C$IND+1          KEYWORD REFERENCE (UNARY AMPERSAND)
        !          1413: C$UBO  EQU  C$KEY+1          UNDEFINED BINARY OPERATOR
        !          1414: C$UUO  EQU  C$UBO+1          UNDEFINED UNARY OPERATOR
        !          1415: C$UO$  EQU  C$UUO+1          TEST VALUE (=C$UUO+1=C$UBO+2)
        !          1416: C$$NM  EQU  C$UUO+1          NUMBER OF CODES FOR NAME OPERANDS
        !          1417: *
        !          1418: *      THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
        !          1419: *      CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
        !          1420: *
        !          1421: C$BVL  EQU  C$UUO+1          BINARY OP WITH VALUE OPERANDS
        !          1422: C$UVL  EQU  C$BVL+1          UNARY OPERATOR WITH VALUE OPERAND
        !          1423: C$ALT  EQU  C$UVL+1          ALTERNATION (BINARY BAR)
        !          1424: C$CNC  EQU  C$ALT+1          CONCATENATION
        !          1425: C$CNP  EQU  C$CNC+1          CONCATENATION, NOT PATTERN MATCH
        !          1426: C$UNM  EQU  C$CNP+1          UNARY OP WITH NAME OPERAND
        !          1427: C$BVN  EQU  C$UNM+1          BINARY OP (OPERANDS BY VALUE, NAME)
        !          1428: C$ASS  EQU  C$BVN+1          ASSIGNMENT
        !          1429: C$INT  EQU  C$ASS+1          INTERROGATION
        !          1430: C$NEG  EQU  C$INT+1          NEGATION (UNARY NOT)
        !          1431: C$SEL  EQU  C$NEG+1          SELECTION
        !          1432: C$PMT  EQU  C$SEL+1          PATTERN MATCH
        !          1433: *
        !          1434: C$PR$  EQU  C$BVN            LAST PREEVALUABLE CODE
        !          1435: C$$NV  EQU  C$PMT+1          NUMBER OF DIFFERENT CMBLK TYPES
        !          1436:        EJC
        !          1437: *
        !          1438: *      COPY FILE BLOCK (COBLK)
        !          1439: *
        !          1440: *      A CHAIN STACK OF COPY BLOCKS IS BUILT FOR EVERY NESTED
        !          1441: *      -COPY CONTROL CARD.  THE CONTROL BLOCK IS USED TO PRESERVE
        !          1442: *      THE INPUT CONTEXT OF THE FILE CONTAINING THE -COPY.
        !          1443: *      AS -COPYS ARE ENDED, THESE BLOCKS ARE POPPED OFF THE CHAIN
        !          1444: *      AND THE STATE RESTORED.  SEE ROUTINES CNCRD, COPND.
        !          1445: *
        !          1446: *           +------------------------------------+
        !          1447: *           I                COTYP               I
        !          1448: *           +------------------------------------+
        !          1449: *           I                CONXT               I
        !          1450: *           +------------------------------------+
        !          1451: *           I                COIOT               I
        !          1452: *           +------------------------------------+
        !          1453: *           I                COTTI               I
        !          1454: *           +------------------------------------+
        !          1455: *           I                COCIM               I
        !          1456: *           +------------------------------------+
        !          1457: *           I                COSPT               I
        !          1458: *           +------------------------------------+
        !          1459: *           I                COSLS               I
        !          1460: *           +------------------------------------+
        !          1461: *           I                COSIN               I
        !          1462: *           +------------------------------------+
        !          1463: *           I                COSTL               I
        !          1464: *           +------------------------------------+
        !          1465: *
        !          1466: COTYP  EQU  0                POINTER TO DUMMY ROUTINE B$COP
        !          1467: CONXT  EQU  COTYP+1          POINT TO NEXT (OUTER -COPY) COBLK
        !          1468: COIOT  EQU  CONXT+1          RECORD IOTAG FOR OSINT
        !          1469: COTTI  EQU  COIOT+1          RECORD TTINS FLAG
        !          1470: COCIM  EQU  COTTI+1          RECORD R$CIM COMPILER IMAGE
        !          1471: COSPT  EQU  COCIM+1          RECORD SCNPT SCAN POINTER
        !          1472: COSLS  EQU  COSPT+1          RECORD CSWLS LISTING FLAG
        !          1473: COSIN  EQU  COSLS+1          RECORD CSWIN -INXXX VALUE
        !          1474: COSTL  EQU  COSIN+1          RECORD R$STL -STITL STRING PTR
        !          1475: COSI$  EQU  COSTL+1          SIZE OF COBLK
        !          1476:        EJC
        !          1477: *
        !          1478: *      CHARACTER TABLE BLOCK (CTBLK)
        !          1479: *
        !          1480: *      A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
        !          1481: *      TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
        !          1482: *      PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
        !          1483: *      CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
        !          1484: *      ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
        !          1485: *      IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
        !          1486: *
        !          1487: *           +------------------------------------+
        !          1488: *           I                CTTYP               I
        !          1489: *           +------------------------------------+
        !          1490: *           *                                    *
        !          1491: *           *                                    *
        !          1492: *           *                CTCHS               *
        !          1493: *           *                                    *
        !          1494: *           *                                    *
        !          1495: *           +------------------------------------+
        !          1496: *
        !          1497: CTTYP  EQU  0                POINTER TO DUMMY ROUTINE B$CTT
        !          1498: CTCHS  EQU  CTTYP+1          START OF CHARACTER TABLE WORDS
        !          1499: CTSI$  EQU  CTCHS+CFP$A      NUMBER OF WORDS IN CTBLK
        !          1500: *
        !          1501: *      CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
        !          1502: *      BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
        !          1503: *      INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
        !          1504: *      A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
        !          1505: *      A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
        !          1506: *      IF THE CHARACTER IS NOT PRESENT.
        !          1507:        EJC
        !          1508: *
        !          1509: *      DATATYPE FUNCTION BLOCK (DFBLK)
        !          1510: *
        !          1511: *      A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
        !          1512: *      OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
        !          1513: *      SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
        !          1514: *
        !          1515: *      NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
        !          1516: *      LENGTH IS GOT FROM DFLEN FIELD.  IF DFBLK WAS IN DYNAMIC
        !          1517: *      STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
        !          1518: *      COLLECTION.  SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
        !          1519: *      IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
        !          1520: *      GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
        !          1521: *      LIKELY TO BE PRESENT IN LARGE NUMBERS.
        !          1522: *
        !          1523: *           +------------------------------------+
        !          1524: *           I                FCODE               I
        !          1525: *           +------------------------------------+
        !          1526: *           I                FARGS               I
        !          1527: *           +------------------------------------+
        !          1528: *           I                DFLEN               I
        !          1529: *           +------------------------------------+
        !          1530: *           I                DFPDL               I
        !          1531: *           +------------------------------------+
        !          1532: *           I                DFNAM               I
        !          1533: *           +------------------------------------+
        !          1534: *           /                                    /
        !          1535: *           /                DFFLD               /
        !          1536: *           /                                    /
        !          1537: *           +------------------------------------+
        !          1538: *
        !          1539: DFLEN  EQU  FARGS+1          LENGTH OF DFBLK IN BAUS
        !          1540: DFPDL  EQU  DFLEN+1          LENGTH OF CORRESPONDING PDBLK
        !          1541: DFNAM  EQU  DFPDL+1          POINTER TO SCBLK FOR DATATYPE NAME
        !          1542: DFFLD  EQU  DFNAM+1          START OF VRBLK PTRS FOR FIELD NAMES
        !          1543: DFFLB  EQU  DFFLD-1          OFFSET BEHIND DFFLD FOR FIELD FUNC
        !          1544: DFSI$  EQU  DFFLD            NUMBER OF STANDARD FIELDS IN DFBLK
        !          1545: *
        !          1546: *      THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
        !          1547: *
        !          1548: *      FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
        !          1549:        EJC
        !          1550: *
        !          1551: *      DOPE VECTOR BLOCK (DVBLK)
        !          1552: *
        !          1553: *      A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
        !          1554: *      THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
        !          1555: *
        !          1556: *           +------------------------------------+
        !          1557: *           I                DVOPN               I
        !          1558: *           +------------------------------------+
        !          1559: *           I                DVTYP               I
        !          1560: *           +------------------------------------+
        !          1561: *           I                DVLPR               I
        !          1562: *           +------------------------------------+
        !          1563: *           I                DVRPR               I
        !          1564: *           +------------------------------------+
        !          1565: *
        !          1566: DVOPN  EQU  0                ENTRY ADDRESS (PTR TO O$XXX)
        !          1567: DVTYP  EQU  DVOPN+1          TYPE CODE (C$XXX, SEE CMBLK)
        !          1568: DVLPR  EQU  DVTYP+1          LEFT PRECEDENCE (LLXXX, SEE BELOW)
        !          1569: DVRPR  EQU  DVLPR+1          RIGHT PRECEDENCE (RRXXX, SEE BELOW)
        !          1570: DVUS$  EQU  DVLPR+1          SIZE OF UNARY OPERATOR DV
        !          1571: DVBS$  EQU  DVRPR+1          SIZE OF BINARY OPERATOR DV
        !          1572: DVUBS  EQU  DVUS$+DVBS$      SIZE OF UNOP + BINOP (SEE SCANE)
        !          1573: *
        !          1574: *      THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
        !          1575: *      FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
        !          1576: *
        !          1577: *      THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
        !          1578: *      ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
        !          1579: *
        !          1580: *      FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
        !          1581: *      FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
        !          1582: *      BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
        !          1583: *      FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
        !          1584: *      REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
        !          1585: *
        !          1586: *      THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
        !          1587: *      THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
        !          1588: *      PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
        !          1589: *
        !          1590: *      THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
        !          1591: *      THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
        !          1592: *      THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
        !          1593: *
        !          1594: *      HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
        !          1595: *      CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
        !          1596: *      (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
        !          1597: *      ASSOCIATIVE BINARY OPERATORS.
        !          1598: *
        !          1599: *      THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
        !          1600: *      ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
        !          1601: *      CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
        !          1602:        EJC
        !          1603: *
        !          1604: *      TABLE OF OPERATOR PRECEDENCE VALUES
        !          1605: *
        !          1606: RRASS  EQU  10               RIGHT     EQUAL
        !          1607: LLASS  EQU  00               LEFT      EQUAL
        !          1608: RRPMT  EQU  20               RIGHT     QUESTION MARK
        !          1609: LLPMT  EQU  30               LEFT      QUESTION MARK
        !          1610: RRAMP  EQU  40               RIGHT     AMPERSAND
        !          1611: LLAMP  EQU  50               LEFT      AMPERSAND
        !          1612: RRALT  EQU  70               RIGHT     VERTICAL BAR
        !          1613: LLALT  EQU  60               LEFT      VERTICAL BAR
        !          1614: RRCNC  EQU  90               RIGHT     BLANK
        !          1615: LLCNC  EQU  80               LEFT      BLANK
        !          1616: RRATS  EQU  110              RIGHT     AT
        !          1617: LLATS  EQU  100              LEFT      AT
        !          1618: RRPLM  EQU  120              RIGHT     PLUS, MINUS
        !          1619: LLPLM  EQU  130              LEFT      PLUS, MINUS
        !          1620: RRNUM  EQU  140              RIGHT     NUMBER
        !          1621: LLNUM  EQU  150              LEFT      NUMBER
        !          1622: RRDVD  EQU  160              RIGHT     SLASH
        !          1623: LLDVD  EQU  170              LEFT      SLASH
        !          1624: RRMLT  EQU  180              RIGHT     ASTERISK
        !          1625: LLMLT  EQU  190              LEFT      ASTERISK
        !          1626: RRPCT  EQU  200              RIGHT     PERCENT
        !          1627: LLPCT  EQU  210              LEFT      PERCENT
        !          1628: RREXP  EQU  230              RIGHT     EXCLAMATION
        !          1629: LLEXP  EQU  220              LEFT      EXCLAMATION
        !          1630: RRDLD  EQU  240              RIGHT     DOLLAR, DOT
        !          1631: LLDLD  EQU  250              LEFT      DOLLAR, DOT
        !          1632: RRNOT  EQU  270              RIGHT     NOT
        !          1633: LLNOT  EQU  260              LEFT      NOT
        !          1634: LLUNO  EQU  999              LEFT      ALL UNARY OPERATORS
        !          1635: *
        !          1636: *      PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
        !          1637: *      FOLLOWING EXCEPTIONS.
        !          1638: *
        !          1639: *      1)   BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
        !          1640: *           IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
        !          1641: *
        !          1642: *      2)   ALTERNATION AND CONCATENATION ARE MADE RIGHT
        !          1643: *           ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
        !          1644: *           CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
        !          1645: *           IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
        !          1646: *
        !          1647: *      3)   THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
        !          1648: *           OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
        !          1649: *           MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
        !          1650: .IF    .CNLD
        !          1651: .ELSE
        !          1652:        EJC
        !          1653: *
        !          1654: *      EXTERNAL FUNCTION BLOCK (EFBLK)
        !          1655: *
        !          1656: *      AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
        !          1657: *      OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
        !          1658: *
        !          1659: *           +------------------------------------+
        !          1660: *           I                FCODE               I
        !          1661: *           +------------------------------------+
        !          1662: *           I                FARGS               I
        !          1663: *           +------------------------------------+
        !          1664: *           I                EFLEN               I
        !          1665: *           +------------------------------------+
        !          1666: *           I                EFUSE               I
        !          1667: *           +------------------------------------+
        !          1668: *           I                EFCOD               I
        !          1669: *           +------------------------------------+
        !          1670: *           I                EFVAR               I
        !          1671: *           +------------------------------------+
        !          1672: *           I                EFRSL               I
        !          1673: *           +------------------------------------+
        !          1674: *           /                                    /
        !          1675: *           /                EFTAR               /
        !          1676: *           /                                    /
        !          1677: *           +------------------------------------+
        !          1678: *
        !          1679: EFLEN  EQU  FARGS+1          LENGTH OF EFBLK IN BAUS
        !          1680: EFUSE  EQU  EFLEN+1          USE COUNT (FOR OPSYN)
        !          1681: EFCOD  EQU  EFUSE+1          PTR TO CODE (FROM SYSLD)
        !          1682: EFVAR  EQU  EFCOD+1          PTR TO ASSOCIATED VRBLK
        !          1683: EFRSL  EQU  EFVAR+1          RESULT TYPE (SEE BELOW)
        !          1684: EFTAR  EQU  EFRSL+1          ARGUMENT TYPES (SEE BELOW)
        !          1685: EFSI$  EQU  EFTAR            NUMBER OF STANDARD FIELDS IN EFBLK
        !          1686: *
        !          1687: *      THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
        !          1688: *
        !          1689: *      EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
        !          1690: *      IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
        !          1691: *      WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
        !          1692: *
        !          1693: *      EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
        !          1694: *
        !          1695: *           0                TYPE IS UNCONVERTED
        !          1696: *           1                TYPE IS STRING
        !          1697: *           2                TYPE IS INTEGER
        !          1698: *           3                TYPE IS REAL
        !          1699: *           4                TYPE IS BUFFER
        !          1700: .FI
        !          1701:        EJC
        !          1702: *
        !          1703: *      EXPRESSION VARIABLE BLOCK (EVBLK)
        !          1704: *
        !          1705: *      IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
        !          1706: *      ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
        !          1707: *      EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
        !          1708: *      ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
        !          1709: *      OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
        !          1710: *      AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
        !          1711: *
        !          1712: *           +------------------------------------+
        !          1713: *           I                EVTYP               I
        !          1714: *           +------------------------------------+
        !          1715: *           I                EVEXP               I
        !          1716: *           +------------------------------------+
        !          1717: *           I                EVVAR               I
        !          1718: *           +------------------------------------+
        !          1719: *
        !          1720: EVTYP  EQU  0                POINTER TO DUMMY ROUTINE B$EVT
        !          1721: EVEXP  EQU  EVTYP+1          POINTER TO EXBLK FOR EXPRESSION
        !          1722: EVVAR  EQU  EVEXP+1          POINTER TO TRBEV DUMMY TRBLK
        !          1723: EVSI$  EQU  EVVAR+1          SIZE OF EVBLK
        !          1724: *
        !          1725: *      THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
        !          1726: *      BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
        !          1727: *      VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
        !          1728: *
        !          1729: *      NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
        !          1730: *      EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
        !          1731: *      VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
        !          1732:        EJC
        !          1733: *
        !          1734: *      EXPRESSION BLOCK (EXBLK)
        !          1735: *
        !          1736: *      AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
        !          1737: *      REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
        !          1738: *      DURING EXECUTION OF A PROGRAM.
        !          1739: *
        !          1740: *           +------------------------------------+
        !          1741: *           I                EXTYP               I
        !          1742: *           +------------------------------------+
        !          1743: *           I                EXSTM               I
        !          1744: *           +------------------------------------+
        !          1745: *           I                EXLEN               I
        !          1746: *           +------------------------------------+
        !          1747: *           I                EXFLC               I
        !          1748: *           +------------------------------------+
        !          1749: *           /                                    /
        !          1750: *           /                EXCOD               /
        !          1751: *           /                                    /
        !          1752: *           +------------------------------------+
        !          1753: *
        !          1754: EXTYP  EQU  0                PTR TO ROUTINE B$EXL TO LOAD EXPR
        !          1755: EXSTM  EQU  CDSTM            STORES STMNT NO. DURING EVALUATION
        !          1756: EXLEN  EQU  EXSTM+1          LENGTH OF EXBLK IN BAUS
        !          1757: EXFLC  EQU  EXLEN+1          FAILURE CODE (=O$FEX)
        !          1758: EXCOD  EQU  EXFLC+1          PSEUDO-CODE FOR EXPRESSION
        !          1759: EXSI$  EQU  EXCOD            NUMBER OF STANDARD FIELDS IN EXBLK
        !          1760: *
        !          1761: *      THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
        !          1762: *      EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
        !          1763: *      OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
        !          1764: *
        !          1765: *      IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
        !          1766: *
        !          1767: *                            (CODE FOR EXPR BY NAME)
        !          1768: *                            =O$RNM
        !          1769: *
        !          1770: *      IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
        !          1771: *
        !          1772: *                            (CODE FOR EXPR BY VALUE)
        !          1773: *                            =O$RVL
        !          1774:        EJC
        !          1775: *
        !          1776: *      FIELD FUNCTION BLOCK (FFBLK)
        !          1777: *
        !          1778: *      A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
        !          1779: *      OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
        !          1780: *      A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
        !          1781: *
        !          1782: *           +------------------------------------+
        !          1783: *           I                FCODE               I
        !          1784: *           +------------------------------------+
        !          1785: *           I                FARGS               I
        !          1786: *           +------------------------------------+
        !          1787: *           I                FFDFP               I
        !          1788: *           +------------------------------------+
        !          1789: *           I                FFNXT               I
        !          1790: *           +------------------------------------+
        !          1791: *           I                FFOFS               I
        !          1792: *           +------------------------------------+
        !          1793: *
        !          1794: FFDFP  EQU  FARGS+1          POINTER TO ASSOCIATED DFBLK
        !          1795: FFNXT  EQU  FFDFP+1          PTR TO NEXT FFBLK ON CHAIN OR ZERO
        !          1796: FFOFS  EQU  FFNXT+1          OFFSET (BAUS) TO FIELD IN PDBLK
        !          1797: FFSI$  EQU  FFOFS+1          SIZE OF FFBLK IN WORDS
        !          1798: *
        !          1799: *      THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
        !          1800: *
        !          1801: *      FARGS ALWAYS CONTAINS ONE.
        !          1802: *
        !          1803: *      FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
        !          1804: *      DATATYPE IS BEING ACCESSED BY THIS CALL.
        !          1805: *      FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
        !          1806: *
        !          1807: *      FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
        !          1808: *      IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
        !          1809: *
        !          1810: *      FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
        !          1811: *      IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
        !          1812: *      NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
        !          1813:        EJC
        !          1814: *
        !          1815: *      INTEGER CONSTANT BLOCK (ICBLK)
        !          1816: *
        !          1817: *      AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
        !          1818: *      CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
        !          1819: *      INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
        !          1820: *      FIELD IN A STRING CONSTANT BLOCK)
        !          1821: *
        !          1822: *           +------------------------------------+
        !          1823: *           I                ICGET               I
        !          1824: *           +------------------------------------+
        !          1825: *           *                ICVAL               *
        !          1826: *           +------------------------------------+
        !          1827: *
        !          1828: ICGET  EQU  0                PTR TO ROUTINE B$ICL TO LOAD INT
        !          1829: ICVAL  EQU  ICGET+1          INTEGER VALUE
        !          1830: ICSI$  EQU  ICVAL+CFP$I      SIZE OF ICBLK
        !          1831: *
        !          1832: *      THE LENGTH OF THE ICVAL FIELD IS CFP$I.
        !          1833:        EJC
        !          1834: *
        !          1835: *      KEYWORD VARIABLE BLOCK (KVBLK)
        !          1836: *
        !          1837: *      A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
        !          1838: *      A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
        !          1839: *
        !          1840: *           +------------------------------------+
        !          1841: *           I                KVTYP               I
        !          1842: *           +------------------------------------+
        !          1843: *           I                KVVAR               I
        !          1844: *           +------------------------------------+
        !          1845: *           I                KVNUM               I
        !          1846: *           +------------------------------------+
        !          1847: *
        !          1848: KVTYP  EQU  0                POINTER TO DUMMY ROUTINE B$KVT
        !          1849: KVVAR  EQU  KVTYP+1          POINTER TO DUMMY BLOCK TRBKV
        !          1850: KVNUM  EQU  KVVAR+1          KEYWORD NUMBER
        !          1851: KVSI$  EQU  KVNUM+1          SIZE OF KVBLK
        !          1852: *
        !          1853: *      THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
        !          1854: *      BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
        !          1855: *      VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
        !          1856:        EJC
        !          1857: *
        !          1858: *      NAME BLOCK (NMBLK)
        !          1859: *
        !          1860: *      A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
        !          1861: *      A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
        !          1862: *
        !          1863: *           +------------------------------------+
        !          1864: *           I                NMTYP               I
        !          1865: *           +------------------------------------+
        !          1866: *           I                NMBAS               I
        !          1867: *           +------------------------------------+
        !          1868: *           I                NMOFS               I
        !          1869: *           +------------------------------------+
        !          1870: *
        !          1871: NMTYP  EQU  0                PTR TO ROUTINE B$NML TO LOAD NAME
        !          1872: NMBAS  EQU  NMTYP+1          BASE POINTER FOR VARIABLE
        !          1873: NMOFS  EQU  NMBAS+1          OFFSET FOR VARIABLE
        !          1874: NMSI$  EQU  NMOFS+1          SIZE OF NMBLK
        !          1875: *
        !          1876: *      THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
        !          1877: *      IS FOUND NMOFS BAUS PAST THE ADDRESS IN NMBAS.
        !          1878: *
        !          1879: *      THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
        !          1880: *      CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
        !          1881: *      COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
        !          1882: *
        !          1883: *      A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
        !          1884: *      REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
        !          1885: *      CASES OF PSEUDO-VARIABLES.
        !          1886:        EJC
        !          1887: *
        !          1888: *      PATTERN BLOCK, NO PARAMETERS (P0BLK)
        !          1889: *
        !          1890: *      A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
        !          1891: *      NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
        !          1892: *
        !          1893: *           +------------------------------------+
        !          1894: *           I                PCODE               I
        !          1895: *           +------------------------------------+
        !          1896: *           I                PTHEN               I
        !          1897: *           +------------------------------------+
        !          1898: *
        !          1899: PCODE  EQU  0                PTR TO MATCH ROUTINE (P$XXX)
        !          1900: PTHEN  EQU  PCODE+1          POINTER TO SUBSEQUENT NODE
        !          1901: PASI$  EQU  PTHEN+1          SIZE OF P0BLK
        !          1902: *
        !          1903: *      PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
        !          1904: *      NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
        !          1905: *      BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
        !          1906: *
        !          1907: *      PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
        !          1908:        EJC
        !          1909: *
        !          1910: *      PATTERN BLOCK (ONE PARAMETER)
        !          1911: *
        !          1912: *      A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
        !          1913: *      REQUIRE ONE PARAMETER VALUE.
        !          1914: *
        !          1915: *           +------------------------------------+
        !          1916: *           I                PCODE               I
        !          1917: *           +------------------------------------+
        !          1918: *           I                PTHEN               I
        !          1919: *           +------------------------------------+
        !          1920: *           I                PARM1               I
        !          1921: *           +------------------------------------+
        !          1922: *
        !          1923: PARM1  EQU  PTHEN+1          FIRST PARAMETER VALUE
        !          1924: PBSI$  EQU  PARM1+1          SIZE OF P1BLK IN WORDS
        !          1925: *
        !          1926: *      SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
        !          1927: *
        !          1928: *      PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
        !          1929: *      NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
        !          1930: *      ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
        !          1931: *      FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
        !          1932: *      MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
        !          1933: *      IS PROCESSED BY THE GARBAGE COLLECTOR.
        !          1934:        EJC
        !          1935: *
        !          1936: *      PATTERN BLOCK (TWO PARAMETERS)
        !          1937: *
        !          1938: *      A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
        !          1939: *      REQUIRE TWO PARAMETER VALUES.
        !          1940: *
        !          1941: *           +------------------------------------+
        !          1942: *           I                PCODE               I
        !          1943: *           +------------------------------------+
        !          1944: *           I                PTHEN               I
        !          1945: *           +------------------------------------+
        !          1946: *           I                PARM1               I
        !          1947: *           +------------------------------------+
        !          1948: *           I                PARM2               I
        !          1949: *           +------------------------------------+
        !          1950: *
        !          1951: PARM2  EQU  PARM1+1          SECOND PARAMETER VALUE
        !          1952: PCSI$  EQU  PARM2+1          SIZE OF P2BLK IN WORDS
        !          1953: *
        !          1954: *      SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
        !          1955: *
        !          1956: *      PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
        !          1957: *      FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
        !          1958: *
        !          1959: *      PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
        !          1960: *      PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
        !          1961: *      NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
        !          1962:        EJC
        !          1963: *
        !          1964: *      PROGRAM-DEFINED DATATYPE BLOCK
        !          1965: *
        !          1966: *      A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
        !          1967: *      DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
        !          1968: *
        !          1969: *           +------------------------------------+
        !          1970: *           I                PDTYP               I
        !          1971: *           +------------------------------------+
        !          1972: *           I                IDVAL               I
        !          1973: *           +------------------------------------+
        !          1974: *           I                PDDFP               I
        !          1975: *           +------------------------------------+
        !          1976: *           /                                    /
        !          1977: *           /                PDFLD               /
        !          1978: *           /                                    /
        !          1979: *           +------------------------------------+
        !          1980: *
        !          1981: PDTYP  EQU  0                PTR TO DUMMY ROUTINE B$PDT
        !          1982: PDDFP  EQU  IDVAL+1          PTR TO ASSOCIATED DFBLK
        !          1983: PDFLD  EQU  PDDFP+1          START OF FIELD VALUE POINTERS
        !          1984: PDFOF  EQU  DFFLD-PDFLD      DIFFERENCE IN OFFSET TO FIELD PTRS
        !          1985: PDSI$  EQU  PDFLD            SIZE OF STANDARD FIELDS IN PDBLK
        !          1986: PDDFS  EQU  DFSI$-PDSI$      DIFFERENCE IN DFBLK, PDBLK SIZES
        !          1987: *
        !          1988: *      THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
        !          1989: *      AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
        !          1990: *      CONTAINS THE LENGTH OF THE PDBLK IN BAUS (FIELD DFPDL).
        !          1991: *      PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
        !          1992: *
        !          1993: *      PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
        !          1994: *      THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
        !          1995:        EJC
        !          1996: *
        !          1997: *      PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
        !          1998: *
        !          1999: *      A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
        !          2000: *      AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
        !          2001: *
        !          2002: *           +------------------------------------+
        !          2003: *           I                FCODE               I
        !          2004: *           +------------------------------------+
        !          2005: *           I                FARGS               I
        !          2006: *           +------------------------------------+
        !          2007: *           I                PFLEN               I
        !          2008: *           +------------------------------------+
        !          2009: *           I                PFVBL               I
        !          2010: *           +------------------------------------+
        !          2011: *           I                PFNLO               I
        !          2012: *           +------------------------------------+
        !          2013: *           I                PFCOD               I
        !          2014: *           +------------------------------------+
        !          2015: *           I                PFCTR               I
        !          2016: *           +------------------------------------+
        !          2017: *           I                PFRTR               I
        !          2018: *           +------------------------------------+
        !          2019: *           /                                    /
        !          2020: *           /                PFARG               /
        !          2021: *           /                                    /
        !          2022: *           +------------------------------------+
        !          2023: *
        !          2024: PFLEN  EQU  FARGS+1          LENGTH OF PFBLK IN BAUS
        !          2025: PFVBL  EQU  PFLEN+1          POINTER TO VRBLK FOR FUNCTION NAME
        !          2026: PFNLO  EQU  PFVBL+1          NUMBER OF LOCALS
        !          2027: PFCOD  EQU  PFNLO+1          PTR TO CDBLK FOR FIRST STATEMENT
        !          2028: PFCTR  EQU  PFCOD+1          TRBLK PTR IF CALL TRACED ELSE 0
        !          2029: PFRTR  EQU  PFCTR+1          TRBLK PTR IF RETURN TRACED ELSE 0
        !          2030: PFARG  EQU  PFRTR+1          VRBLK PTRS FOR ARGUMENTS AND LOCALS
        !          2031: PFAGB  EQU  PFARG-1          OFFSET BEHIND PFARG FOR ARG,LOCAL
        !          2032: PFSI$  EQU  PFARG            NUMBER OF STANDARD FIELDS IN PFBLK
        !          2033: *
        !          2034: *      THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
        !          2035: *
        !          2036: *      PFARG IS STORED IN THE FOLLOWING ORDER.
        !          2037: *
        !          2038: *           ARGUMENTS (LEFT TO RIGHT)
        !          2039: *           LOCALS (LEFT TO RIGHT)
        !          2040: .IF    .CNRA
        !          2041: .ELSE
        !          2042:        EJC
        !          2043: *
        !          2044: *      REAL CONSTANT BLOCK (RCBLK)
        !          2045: *
        !          2046: *      AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
        !          2047: *      CREATED BY A PROGRAM.
        !          2048: *
        !          2049: *           +------------------------------------+
        !          2050: *           I                RCGET               I
        !          2051: *           +------------------------------------+
        !          2052: *           *                RCVAL               *
        !          2053: *           +------------------------------------+
        !          2054: *
        !          2055: RCGET  EQU  0                PTR TO ROUTINE B$RCL TO LOAD REAL
        !          2056: RCVAL  EQU  RCGET+1          REAL VALUE
        !          2057: RCSI$  EQU  RCVAL+CFP$R      SIZE OF RCBLK
        !          2058: *
        !          2059: *      THE LENGTH OF THE RCVAL FIELD IS CFP$R.
        !          2060: .FI
        !          2061:        EJC
        !          2062: *
        !          2063: *      STRING CONSTANT BLOCK (SCBLK)
        !          2064: *
        !          2065: *      AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
        !          2066: *      BY A PROGRAM.
        !          2067: *
        !          2068: *           +------------------------------------+
        !          2069: *           I                SCGET               I
        !          2070: *           +------------------------------------+
        !          2071: *           I                SCLEN               I
        !          2072: *           +------------------------------------+
        !          2073: *           /                                    /
        !          2074: *           /                SCHAR               /
        !          2075: *           /                                    /
        !          2076: *           +------------------------------------+
        !          2077: *
        !          2078: SCGET  EQU  0                PTR TO ROUTINE B$SCL TO LOAD STRING
        !          2079: SCLEN  EQU  SCGET+1          LENGTH OF STRING IN CHARACTERS
        !          2080: SCHAR  EQU  SCLEN+1          CHARACTERS OF STRING
        !          2081: SCSI$  EQU  SCHAR            SIZE OF STANDARD FIELDS IN SCBLK
        !          2082: *
        !          2083: *      THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
        !          2084: *      THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
        !          2085: *      (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
        !          2086: *
        !          2087: *      THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
        !          2088: *      THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
        !          2089: *      CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
        !          2090: *
        !          2091: *      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
        !          2092: *      IS GIVEN IN BAUS BY CFP$F AND THAT THIS VALUE IS
        !          2093: *      AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
        !          2094: *      NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
        !          2095: *      IS GIVEN BY CFP$B*SCHAR.
        !          2096:        EJC
        !          2097: *
        !          2098: *      SIMPLE EXPRESSION BLOCK (SEBLK)
        !          2099: *
        !          2100: *      AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
        !          2101: *      *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
        !          2102: *
        !          2103: *           +------------------------------------+
        !          2104: *           I                SETYP               I
        !          2105: *           +------------------------------------+
        !          2106: *           I                SEVAR               I
        !          2107: *           +------------------------------------+
        !          2108: *
        !          2109: SETYP  EQU  0                PTR TO ROUTINE B$SEL TO LOAD EXPR
        !          2110: SEVAR  EQU  SETYP+1          PTR TO VRBLK FOR VARIABLE
        !          2111: SESI$  EQU  SEVAR+1          LENGTH OF SEBLK IN WORDS
        !          2112:        EJC
        !          2113: *
        !          2114: *      STANDARD VARIABLE BLOCK (SVBLK)
        !          2115: *
        !          2116: *      AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
        !          2117: *      VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
        !          2118: *
        !          2119: *      1)   IT IS THE NAME OF A SYSTEM FUNCTION
        !          2120: *      2)   IT HAS AN INITIAL VALUE
        !          2121: *      3)   IT HAS A KEYWORD ASSOCIATION
        !          2122: *      4)   IT HAS A STANDARD I/O ASSOCIATION
        !          2123: *      6)   IT HAS A STANDARD LABEL ASSOCIATION
        !          2124: *
        !          2125: *      IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
        !          2126: *      THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
        !          2127: *
        !          2128: *           +------------------------------------+
        !          2129: *           I                SVBIT               I
        !          2130: *           +------------------------------------+
        !          2131: *           I                SVLEN               I
        !          2132: *           +------------------------------------+
        !          2133: *           /                SVCHS               /
        !          2134: *           +------------------------------------+
        !          2135: *           I                SVKNM               I
        !          2136: *           +------------------------------------+
        !          2137: *           I                SVFNC               I
        !          2138: *           +------------------------------------+
        !          2139: *           I                SVNAR               I
        !          2140: *           +------------------------------------+
        !          2141: *           I                SVLBL               I
        !          2142: *           +------------------------------------+
        !          2143: *           I                SVVAL               I
        !          2144: *           +------------------------------------+
        !          2145:        EJC
        !          2146: *
        !          2147: *      STANDARD VARIABLE BLOCK (CONTINUED)
        !          2148: *
        !          2149: SVBIT  EQU  0                BIT STRING INDICATING ATTRIBUTES
        !          2150: SVLEN  EQU  1                (=SCLEN) LENGTH OF NAME IN CHARS
        !          2151: SVCHS  EQU  2                (=SCHAR) CHARACTERS OF NAME
        !          2152: SVSI$  EQU  2                NUMBER OF STANDARD FIELDS IN SVBLK
        !          2153: SVPRE  EQU  1                SET IF PREEVALUATION PERMITTED
        !          2154: SVFFC  EQU  SVPRE+SVPRE      SET ON IF FAST CALL PERMITTED
        !          2155: SVCKW  EQU  SVFFC+SVFFC      SET ON IF KEYWORD VALUE CONSTANT
        !          2156: SVPRD  EQU  SVCKW+SVCKW      SET ON IF PREDICATE FUNCTION
        !          2157: SVNBT  EQU  4                NUMBER OF BITS TO RIGHT OF SVKNM
        !          2158: SVKNM  EQU  SVPRD+SVPRD      SET ON IF KEYWORD ASSOCIATION
        !          2159: SVFNC  EQU  SVKNM+SVKNM      SET ON IF SYSTEM FUNCTION
        !          2160: SVNAR  EQU  SVFNC+SVFNC      SET ON IF SYSTEM FUNCTION
        !          2161: SVLBL  EQU  SVNAR+SVNAR      SET ON IF SYSTEM LABEL
        !          2162: SVVAL  EQU  SVLBL+SVLBL      SET ON IF PREDEFINED VALUE
        !          2163: *
        !          2164: *      NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
        !          2165: *      TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
        !          2166: *
        !          2167: *      THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
        !          2168: *
        !          2169: SVFNF  EQU  SVFNC+SVNAR      FUNCTION WITH NO FAST CALL
        !          2170: SVFNN  EQU  SVFNF+SVFFC      FUNCTION WITH FAST CALL, NO PREEVAL
        !          2171: SVFNP  EQU  SVFNN+SVPRE      FUNCTION ALLOWING PREEVALUATION
        !          2172: SVFPR  EQU  SVFNN+SVPRD      PREDICATE FUNCTION
        !          2173: SVFNK  EQU  SVFNN+SVKNM      NO PREEVAL FUNC + KEYWORD
        !          2174: SVKWV  EQU  SVKNM+SVVAL      KEYWORD + VALUE
        !          2175: SVKWC  EQU  SVCKW+SVKNM      KEYWORD WITH CONSTANT VALUE
        !          2176: SVKVC  EQU  SVKWV+SVCKW      CONSTANT KEYWORD + VALUE
        !          2177: SVKVL  EQU  SVKVC+SVLBL      CONSTANT KEYWORD + VALUE + LABEL
        !          2178: .IF    .CNFN
        !          2179: .ELSE
        !          2180: SVFPK  EQU  SVFNP+SVKVC      PREEVAL FUNC + CONST KEYWD+VAL
        !          2181: .FI
        !          2182: *
        !          2183: *      THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
        !          2184: *      TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
        !          2185: *      ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
        !          2186: *      MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
        !          2187: *      THE CALL MAY GENERATE AN ERROR CONDITION.
        !          2188: *
        !          2189: *      THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
        !          2190: *      FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
        !          2191: *      THE APPLY FUNCTION FALLS OUTSIDE THIS CATEGORY.
        !          2192: *
        !          2193: *      THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
        !          2194: *      A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
        !          2195: *
        !          2196: *      THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
        !          2197: *      ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
        !          2198:        EJC
        !          2199: *
        !          2200: *      SVBLK (CONTINUED)
        !          2201: *
        !          2202: *      SVKNM                 KEYWORD NUMBER
        !          2203: *
        !          2204: *           SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
        !          2205: *           IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
        !          2206: *           KEYWORD NUMBER TABLE GIVEN LATER ON.
        !          2207: *
        !          2208: *      SVFNC                 SYSTEM FUNCTION POINTER
        !          2209: *
        !          2210: *           SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
        !          2211: *           IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
        !          2212: *           FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
        !          2213: *           POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
        !          2214: *           FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
        !          2215: *           THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
        !          2216: *           FCODE FIELD FOR THE FUNCTION CALL.
        !          2217: *
        !          2218: *      SVNAR                 NUMBER OF FUNCTION ARGUMENTS
        !          2219: *
        !          2220: *           SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
        !          2221: *           IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
        !          2222: *           TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
        !          2223: *           VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
        !          2224: *           CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
        !          2225: *           THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
        !          2226: *           SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
        !          2227: *           CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
        !          2228: *           USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
        !          2229: *           NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
        !          2230: *           WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
        !          2231: *           PREDEFINED FUNCTION USING THIS IS APPLY.
        !          2232: *
        !          2233: *      SVLBL                 SYSTEM LABEL POINTER
        !          2234: *
        !          2235: *           SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
        !          2236: *           IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
        !          2237: *           THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
        !          2238: *           THE SVLBL FIELD OF THE SVBLK.
        !          2239: *
        !          2240: *      SVVAL                 SYSTEM VALUE POINTER
        !          2241: *
        !          2242: *           SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
        !          2243: *           IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
        !          2244: *           IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
        !          2245: *           THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
        !          2246:        EJC
        !          2247: *
        !          2248: *      SVBLK (CONTINUED)
        !          2249: *
        !          2250: *      KEYWORD NUMBER TABLE
        !          2251: *
        !          2252: *      THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
        !          2253: *      NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
        !          2254: *      SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
        !          2255: *      PROCEDURES ASIGN, ACESS AND KWNAM.
        !          2256: *
        !          2257: *      UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
        !          2258: *
        !          2259: K$ANC  EQU  0                ANCHOR
        !          2260: K$DMP  EQU  K$ANC+CFP$B      DUMP
        !          2261: K$ERL  EQU  K$DMP+CFP$B      ERRLIMIT
        !          2262: K$ERT  EQU  K$ERL+CFP$B      ERRTYPE
        !          2263: K$FTR  EQU  K$ERT+CFP$B      FTRACE
        !          2264: K$INP  EQU  K$FTR+CFP$B      INPUT
        !          2265: K$MXL  EQU  K$INP+CFP$B      MAXLENGTH
        !          2266: K$OUP  EQU  K$MXL+CFP$B      OUTPUT
        !          2267: .IF    .CNPF
        !          2268: K$TRA  EQU  K$OUP+CFP$B      TRACE
        !          2269: .ELSE
        !          2270: K$PFL  EQU  K$OUP+CFP$B      PROFILE
        !          2271: K$TRA  EQU  K$PFL+CFP$B      TRACE
        !          2272: .FI
        !          2273: K$TRM  EQU  K$TRA+CFP$B      TRIM
        !          2274: *
        !          2275: *      PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
        !          2276: *
        !          2277: K$FNC  EQU  K$TRM+CFP$B      FNCLEVEL
        !          2278: K$LST  EQU  K$FNC+CFP$B      LASTNO
        !          2279: K$STN  EQU  K$LST+CFP$B      STNO
        !          2280: *
        !          2281: *      KEYWORDS WITH CONSTANT PATTERN VALUES
        !          2282: *
        !          2283: K$ABO  EQU  K$STN+CFP$B      ABORT
        !          2284: K$ARB  EQU  K$ABO+PASI$      ARB
        !          2285: K$BAL  EQU  K$ARB+PASI$      BAL
        !          2286: K$FAL  EQU  K$BAL+PASI$      FAIL
        !          2287: K$FEN  EQU  K$FAL+PASI$      FENCE
        !          2288: K$REM  EQU  K$FEN+PASI$      REM
        !          2289: K$SUC  EQU  K$REM+PASI$      SUCCEED
        !          2290:        EJC
        !          2291: *
        !          2292: *      KEYWORD NUMBER TABLE (CONTINUED)
        !          2293: *
        !          2294: *      SPECIAL KEYWORDS
        !          2295: *
        !          2296: K$ALP  EQU  K$SUC+1          ALPHABET
        !          2297: K$RTN  EQU  K$ALP+1          RTNTYPE
        !          2298: K$COD  EQU  K$RTN+1          CODE
        !          2299: K$STC  EQU  K$COD+1          STCOUNT
        !          2300: K$ETX  EQU  K$STC+1          ERRTEXT
        !          2301: K$STL  EQU  K$ETX+1          STLIMIT
        !          2302: *
        !          2303: *      RELATIVE OFFSETS OF SPECIAL KEYWORDS
        !          2304: *
        !          2305: K$$AL  EQU  K$ALP-K$ALP      ALPHABET
        !          2306: K$$RT  EQU  K$RTN-K$ALP      RTNTYPE
        !          2307: K$$CD  EQU  K$COD-K$ALP      CODE
        !          2308: K$$SC  EQU  K$STC-K$ALP      STCOUNT
        !          2309: K$$ET  EQU  K$ETX-K$ALP      ERRTEXT
        !          2310: K$$SL  EQU  K$STL-K$ALP      STLIMIT
        !          2311: *
        !          2312: *      SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
        !          2313: *
        !          2314: K$P$$  EQU  K$FNC            FIRST PROTECTED KEYWORD
        !          2315: K$V$$  EQU  K$ABO            FIRST KEYWORD WITH CONSTANT VALUE
        !          2316: K$S$$  EQU  K$ALP            FIRST KEYWORD WITH SPECIAL ACESS
        !          2317:        EJC
        !          2318: *
        !          2319: *      FORMAT OF A TABLE BLOCK (TBBLK)
        !          2320: *
        !          2321: *      A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
        !          2322: *      IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
        !          2323: *
        !          2324: *           +------------------------------------+
        !          2325: *           I                TBTYP               I
        !          2326: *           +------------------------------------+
        !          2327: *           I                IDVAL               I
        !          2328: *           +------------------------------------+
        !          2329: *           I                TBLEN               I
        !          2330: *           +------------------------------------+
        !          2331: *           I                TBINV               I
        !          2332: *           +------------------------------------+
        !          2333: *           /                                    /
        !          2334: *           /                TBBUK               /
        !          2335: *           /                                    /
        !          2336: *           +------------------------------------+
        !          2337: *
        !          2338: TBTYP  EQU  0                POINTER TO DUMMY ROUTINE B$TBT
        !          2339: TBLEN  EQU  OFFS2            LENGTH OF TBBLK IN BAUS
        !          2340: TBINV  EQU  OFFS3            DEFAULT INITIAL LOOKUP VALUE
        !          2341: TBBUK  EQU  TBINV+1          START OF HASH BUCKET POINTERS
        !          2342: TBSI$  EQU  TBBUK            SIZE OF STANDARD FIELDS IN TBBLK
        !          2343: TBNBK  EQU  11               DEFAULT NO. OF BUCKETS
        !          2344: *
        !          2345: *      THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
        !          2346: *      OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
        !          2347: *      IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
        !          2348: *
        !          2349: *      TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
        !          2350: *      CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
        !          2351: *      END OF THE CHAIN.
        !          2352:        EJC
        !          2353: *
        !          2354: *      TABLE ELEMENT BLOCK (TEBLK)
        !          2355: *
        !          2356: *      A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
        !          2357: *      A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
        !          2358: *
        !          2359: *           +------------------------------------+
        !          2360: *           I                TETYP               I
        !          2361: *           +------------------------------------+
        !          2362: *           I                TESUB               I
        !          2363: *           +------------------------------------+
        !          2364: *           I                TEVAL               I
        !          2365: *           +------------------------------------+
        !          2366: *           I                TENXT               I
        !          2367: *           +------------------------------------+
        !          2368: *
        !          2369: TETYP  EQU  0                POINTER TO DUMMY ROUTINE B$TET
        !          2370: TESUB  EQU  TETYP+1          SUBSCRIPT VALUE
        !          2371: TEVAL  EQU  TESUB+1          (=VRVAL) TABLE ELEMENT VALUE
        !          2372: TENXT  EQU  TEVAL+1          LINK TO NEXT TEBLK
        !          2373: *      SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
        !          2374: TESI$  EQU  TENXT+1          SIZE OF TEBLK IN WORDS
        !          2375: *
        !          2376: *      TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
        !          2377: *      TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
        !          2378: *      TENXT POINTS BACK TO THE START OF THE TBBLK.
        !          2379: *
        !          2380: *      TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
        !          2381: *
        !          2382: *      TESUB CONTAINS A DATA POINTER.
        !          2383:        EJC
        !          2384: *
        !          2385: *      TRAP BLOCK (TRBLK)
        !          2386: *
        !          2387: *      A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
        !          2388: *      OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
        !          2389: *      INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
        !          2390: *
        !          2391: *           +------------------------------------+
        !          2392: *           I                TRIDN               I
        !          2393: *           +------------------------------------+
        !          2394: *           I                TRTYP               I
        !          2395: *           +------------------------------------+
        !          2396: *           I  TRVAL OR TRLBL OR TRNXT OR TRKVR  I
        !          2397: *           +------------------------------------+
        !          2398: *           I            TRTAG OR TRTER          I
        !          2399: *           +------------------------------------+
        !          2400: *           I            TRFNC OR TRTRI          I
        !          2401: *           +------------------------------------+
        !          2402: *
        !          2403: TRIDN  EQU  0                POINTER TO DUMMY ROUTINE B$TRT
        !          2404: TRTYP  EQU  TRIDN+1          TRAP TYPE CODE
        !          2405: TRVAL  EQU  TRTYP+1          VALUE OF TRAPPED VARIABLE (=VRVAL)
        !          2406: TRNXT  EQU  TRVAL            PTR TO NEXT TRBLK ON TRBLK CHAIN
        !          2407: TRLBL  EQU  TRVAL            PTR TO ACTUAL LABEL (TRACED LABEL)
        !          2408: TRKVR  EQU  TRVAL            VRBLK POINTER FOR KEYWORD TRACE
        !          2409: TRTAG  EQU  TRVAL+1          TRACE TAG OR IOTAG
        !          2410: TRTER  EQU  TRTAG            PTR TO TERMINAL VRBLK OR NULL
        !          2411: TRFNC  EQU  TRTAG+1          TRACE FUNCTION VRBLK (ZERO IF NONE)
        !          2412: TRTRI  EQU  TRFNC            PTR TO TRACE BLOCK HOLDING IOTAG
        !          2413: TRSI$  EQU  TRFNC+1          NUMBER OF WORDS IN TRBLK
        !          2414: *
        !          2415: TRTIN  EQU  0                TRACE TYPE FOR INPUT ASSOCIATION
        !          2416: TRTAC  EQU  TRTIN+1          TRACE TYPE FOR ACCESS TRACE
        !          2417: TRTVL  EQU  TRTAC+1          TRACE TYPE FOR VALUE TRACE
        !          2418: TRTIO  EQU  TRTVL+1          TRACE TYPE FOR IOTAG TRACE BLOCK
        !          2419: TRTOU  EQU  TRTIO+1          TRACE TYPE FOR OUTPUT ASSOCIATION
        !          2420:        EJC
        !          2421: *
        !          2422: *      TRAP BLOCK (CONTINUED)
        !          2423: *
        !          2424: *      VARIABLE INPUT ASSOCIATION
        !          2425: *
        !          2426: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
        !          2427: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
        !          2428: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
        !          2429: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
        !          2430: *
        !          2431: *           TRTYP IS SET TO TRTIN
        !          2432: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
        !          2433: *           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
        !          2434: *           FOR INPUT, TERMINAL, ELSE IT IS NULL.
        !          2435: *           TRTRI IS A PTR TO IOTAG TRBLK FROM SYSIO OR ZERO.
        !          2436: *
        !          2437: *      VARIABLE ACCESS TRACE ASSOCIATION
        !          2438: *
        !          2439: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
        !          2440: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
        !          2441: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
        !          2442: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
        !          2443: *
        !          2444: *           TRTYP IS SET TO TRTAC
        !          2445: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
        !          2446: *           TRTAG IS THE TRACE TAG (0 IF NONE)
        !          2447: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
        !          2448: *
        !          2449: *      VARIABLE VALUE TRACE ASSOCIATION
        !          2450: *
        !          2451: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
        !          2452: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
        !          2453: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
        !          2454: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
        !          2455: *
        !          2456: *           TRTYP IS SET TO TRTVL
        !          2457: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
        !          2458: *           TRTAG IS THE TRACE TAG (0 IF NONE)
        !          2459: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
        !          2460:        EJC
        !          2461: *      TRAP BLOCK (CONTINUED)
        !          2462: *
        !          2463: *      VARIABLE OUTPUT ASSOCIATION
        !          2464: *
        !          2465: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
        !          2466: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
        !          2467: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
        !          2468: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
        !          2469: *
        !          2470: *           TRTYP IS SET TO TRTOU
        !          2471: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
        !          2472: *           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
        !          2473: *           FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
        !          2474: *           TRTRI IS A PTR TO IOTAG TRBLK FROM SYSIO OR ZERO.
        !          2475: *
        !          2476: *      FUNCTION CALL TRACE
        !          2477: *
        !          2478: *           THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
        !          2479: *           TO POINT TO A TRBLK.
        !          2480: *
        !          2481: *           TRTYP IS SET TO TRTIN
        !          2482: *           TRNXT IS ZERO
        !          2483: *           TRTAG IS THE TRACE TAG (0 IF NONE)
        !          2484: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
        !          2485: *
        !          2486: *      FUNCTION RETURN TRACE
        !          2487: *
        !          2488: *           THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
        !          2489: *           TO POINT TO A TRBLK
        !          2490: *
        !          2491: *           TRTYP IS SET TO TRTIN
        !          2492: *           TRNXT IS ZERO
        !          2493: *           TRTAG IS THE TRACE TAG (0 IF NONE)
        !          2494: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
        !          2495: *
        !          2496: *      LABEL TRACE
        !          2497: *
        !          2498: *           THE VRLBL OF THE VRBLK FOR THE LABEL IS
        !          2499: *           CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
        !          2500: *           SET TO B$VRT TO ACTIVATE THE CHECK.
        !          2501: *
        !          2502: *           TRTYP IS SET TO TRTIN
        !          2503: *           TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
        !          2504: *           TRTAG IS THE TRACE TAG (0 IF NONE)
        !          2505: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
        !          2506:        EJC
        !          2507: *
        !          2508: *      TRAP BLOCK (CONTINUED)
        !          2509: *
        !          2510: *      KEYWORD TRACE
        !          2511: *
        !          2512: *           KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
        !          2513: *           LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
        !          2514: *           POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
        !          2515: *           ARE AS FOLLOWS.
        !          2516: *
        !          2517: *           R$ERT            ERRTYPE
        !          2518: *           R$FNC            FNCLEVEL
        !          2519: *           R$STC            STCOUNT
        !          2520: *
        !          2521: *           THE FORMAT OF THE TRBLK IS AS FOLLOWS.
        !          2522: *
        !          2523: *           TRTYP IS SET TO TRTIN
        !          2524: *           TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
        !          2525: *           TRTAG IS THE TRACE TAG (0 IF NONE)
        !          2526: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
        !          2527: *
        !          2528: *      INPUT/OUTPUT FILETAG TRAP BLOCK (TRTIO)
        !          2529: *
        !          2530: *           THE VALUE FIELD OF THE FILETAG VBL POINTS TO A TRBLK
        !          2531: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
        !          2532: *           A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
        !          2533: *           CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
        !          2534: *           TO HOLD THE IOTAG RETURNED BY A SYSIO CALL
        !          2535: *
        !          2536: *           TRTYP IS SET TO TRTIO
        !          2537: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
        !          2538: *           TRTAG HOLDS THE IOTAG.
        !          2539: *
        !          2540: *      NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
        !          2541: *      THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
        !          2542: *
        !          2543: *      INPUT ASSOCIATION (IF PRESENT)
        !          2544: *      ACCESS TRACE (IF PRESENT)
        !          2545: *      VALUE TRACE (IF PRESENT)
        !          2546: *      FILETAG ASSOCIATION (IF PRESENT)
        !          2547: *      OUTPUT ASSOCIATION (IF PRESENT)
        !          2548: *
        !          2549: *      THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
        !          2550: *      FIELD OF THE LAST TRBLK ON THE CHAIN.
        !          2551: *
        !          2552: *      THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
        !          2553: *      ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
        !          2554:        EJC
        !          2555: *
        !          2556: *      VECTOR BLOCK (VCBLK)
        !          2557: *
        !          2558: *      A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
        !          2559: *      ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
        !          2560: *      ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
        !          2561: *      SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
        !          2562: *
        !          2563: *           +------------------------------------+
        !          2564: *           I                VCTYP               I
        !          2565: *           +------------------------------------+
        !          2566: *           I                IDVAL               I
        !          2567: *           +------------------------------------+
        !          2568: *           I                VCLEN               I
        !          2569: *           +------------------------------------+
        !          2570: *           I                VCVLS               I
        !          2571: *           +------------------------------------+
        !          2572: *
        !          2573: VCTYP  EQU  0                POINTER TO DUMMY ROUTINE B$VCT
        !          2574: VCLEN  EQU  OFFS2            LENGTH OF VCBLK IN BAUS
        !          2575: VCVLS  EQU  OFFS3            START OF VECTOR VALUES
        !          2576: VCSI$  EQU  VCVLS            SIZE OF STANDARD FIELDS IN VCBLK
        !          2577: VCVLB  EQU  VCVLS-1          OFFSET ONE WORD BEHIND VCVLS
        !          2578: VCTBD  EQU  TBSI$-VCSI$      DIFFERENCE IN SIZES - SEE PRTVL
        !          2579: *
        !          2580: *      VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
        !          2581: *
        !          2582: *      THE DIMENSION CAN BE DEDUCED FROM VCLEN.
        !          2583:        EJC
        !          2584: *
        !          2585: *      VARIABLE BLOCK (VRBLK)
        !          2586: *
        !          2587: *      A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
        !          2588: *      FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
        !          2589: *
        !          2590: *      NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
        !          2591: *      REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
        !          2592: *      THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
        !          2593: *      ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
        !          2594: *
        !          2595: *      1)   POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
        !          2596: *           VALUE OF THE VARIABLE ONTO THE MAIN STACK.
        !          2597: *
        !          2598: *      2)   POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
        !          2599: *           TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
        !          2600: *
        !          2601: *      3)   POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
        !          2602: *           THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
        !          2603: *
        !          2604: *           +------------------------------------+
        !          2605: *           I                VRGET               I
        !          2606: *           +------------------------------------+
        !          2607: *           I                VRSTO               I
        !          2608: *           +------------------------------------+
        !          2609: *           I                VRVAL               I
        !          2610: *           +------------------------------------+
        !          2611: *           I                VRTRA               I
        !          2612: *           +------------------------------------+
        !          2613: *           I                VRLBL               I
        !          2614: *           +------------------------------------+
        !          2615: *           I                VRFNC               I
        !          2616: *           +------------------------------------+
        !          2617: *           I                VRNXT               I
        !          2618: *           +------------------------------------+
        !          2619: *           I                VRLEN               I
        !          2620: *           +------------------------------------+
        !          2621: *           /                                    /
        !          2622: *           /            VRCHS = VRSVP           /
        !          2623: *           /                                    /
        !          2624: *           +------------------------------------+
        !          2625:        EJC
        !          2626: *
        !          2627: *      VARIABLE BLOCK (CONTINUED)
        !          2628: *
        !          2629: VRGET  EQU  0                POINTER TO ROUTINE TO LOAD VALUE
        !          2630: VRSTO  EQU  VRGET+1          POINTER TO ROUTINE TO STORE VALUE
        !          2631: VRVAL  EQU  VRSTO+1          VARIABLE VALUE
        !          2632: VRVLO  EQU  VRVAL-VRSTO      OFFSET TO VALUE FROM STORE FIELD
        !          2633: VRTRA  EQU  VRVAL+1          POINTER TO ROUTINE TO JUMP TO LABEL
        !          2634: VRLBL  EQU  VRTRA+1          POINTER TO CODE FOR LABEL
        !          2635: VRLBO  EQU  VRLBL-VRTRA      OFFSET TO LABEL FROM TRANSFER FIELD
        !          2636: VRFNC  EQU  VRLBL+1          POINTER TO FUNCTION BLOCK
        !          2637: VRNXT  EQU  VRFNC+1          POINTER TO NEXT VRBLK ON HASH CHAIN
        !          2638: VRLEN  EQU  VRNXT+1          LENGTH OF NAME (OR ZERO)
        !          2639: VRCHS  EQU  VRLEN+1          CHARACTERS OF NAME (VRLEN GT 0)
        !          2640: VRSVP  EQU  VRLEN+1          PTR TO SVBLK (VRLEN EQ 0)
        !          2641: VRSI$  EQU  VRCHS+1          NUMBER OF STANDARD FIELDS IN VRBLK
        !          2642: VRSOF  EQU  VRLEN-SCLEN      OFFSET TO DUMMY SCBLK FOR NAME
        !          2643: VRSVO  EQU  VRSVP-VRSOF      PSEUDO-OFFSET TO VRSVP FIELD
        !          2644: *
        !          2645: *      VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
        !          2646: *      VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
        !          2647: *
        !          2648: *      VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
        !          2649: *      VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
        !          2650: *      VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
        !          2651: *
        !          2652: *      VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
        !          2653: *      VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
        !          2654: *      POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
        !          2655: *
        !          2656: *      VRTRA = B$VRG IF THE LABEL IS NOT TRACED
        !          2657: *      VRTRA = B$VRT IF THE LABEL IS TRACED
        !          2658: *
        !          2659: *      VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
        !          2660: *      VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
        !          2661: *      VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
        !          2662: *      VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
        !          2663: *
        !          2664: *      VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
        !          2665: *      VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
        !          2666: *      VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
        !          2667: *      VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
        !          2668: *      VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
        !          2669: *      VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
        !          2670: *
        !          2671: *      VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
        !          2672: *      THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
        !          2673: *
        !          2674: *      VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
        !          2675: *      VRLEN IS ZERO FOR A SYSTEM VARIABLE.
        !          2676: *
        !          2677: *      VRCHS IS THE NAME IF VRLEN IS NON-ZERO.
        !          2678: *      VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
        !          2679:        EJC
        !          2680: *
        !          2681: *      FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
        !          2682: *
        !          2683: *      AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
        !          2684: *      DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
        !          2685: *      RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
        !          2686: *      PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
        !          2687: *      THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
        !          2688: *
        !          2689: *           +------------------------------------+
        !          2690: *           I                XNTYP               I
        !          2691: *           +------------------------------------+
        !          2692: *           I                XNLEN               I
        !          2693: *           +------------------------------------+
        !          2694: *           /                                    /
        !          2695: *           /                XNDTA               /
        !          2696: *           /                                    /
        !          2697: *           +------------------------------------+
        !          2698: *
        !          2699: XNTYP  EQU  0                POINTER TO DUMMY ROUTINE B$XNT
        !          2700: XNLEN  EQU  XNTYP+1          LENGTH OF XNBLK IN BAUS
        !          2701: XNDTA  EQU  XNLEN+1          DATA WORDS
        !          2702: XNSI$  EQU  XNDTA            SIZE OF STANDARD FIELDS IN XNBLK
        !          2703: *
        !          2704: *      NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
        !          2705: *      AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
        !          2706: *      IT IS BUILT IN THE DYNAMIC MEMORY AREA.
        !          2707:        EJC
        !          2708: *
        !          2709: *      RELOCATABLE EXTERNAL BLOCK (XRBLK)
        !          2710: *
        !          2711: *      AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
        !          2712: *      DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
        !          2713: *      OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
        !          2714: *      DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
        !          2715: *      DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
        !          2716: *
        !          2717: *           +------------------------------------+
        !          2718: *           I                XRTYP               I
        !          2719: *           +------------------------------------+
        !          2720: *           I                XRLEN               I
        !          2721: *           +------------------------------------+
        !          2722: *           /                                    /
        !          2723: *           /                XRPTR               /
        !          2724: *           /                                    /
        !          2725: *           +------------------------------------+
        !          2726: *
        !          2727: XRTYP  EQU  0                POINTER TO DUMMY ROUTINE B$XRT
        !          2728: XRLEN  EQU  XRTYP+1          LENGTH OF XRBLK IN BAUS
        !          2729: XRPTR  EQU  XRLEN+1          START OF ADDRESS POINTERS
        !          2730: XRSI$  EQU  XRPTR            SIZE OF STANDARD FIELDS IN XRBLK
        !          2731:        EJC
        !          2732: *
        !          2733: *      S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS.  THE VALUES
        !          2734: *      ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
        !          2735: *      AND HENCE TO THE BRANCH TABLE IN S$CNV.
        !          2736: *
        !          2737: CNVST  EQU  8                MAX STANDARD TYPE CODE FOR CONVERT
        !          2738: .IF    .CNRA
        !          2739: CNVRT  EQU  CNVST            NO REALS - SAME AS STANDARD TYPES
        !          2740: .ELSE
        !          2741: CNVRT  EQU  CNVST+1          CONVERT CODE FOR REALS
        !          2742: .FI
        !          2743: .IF    .CNBF
        !          2744: CNVBT  EQU  CNVRT            NO BUFFERS - SAME AS REAL CODE
        !          2745: .ELSE
        !          2746: CNVBT  EQU  CNVRT+1          CONVERT CODE FOR BUFFER
        !          2747: .FI
        !          2748: CNVTT  EQU  CNVBT+1          BSW CODE FOR CONVERT
        !          2749: *
        !          2750: *      INPUT IMAGE LENGTH
        !          2751: *
        !          2752: INILN  EQU  160              DEFAULT IMAGE LENGTH FOR COMPILER
        !          2753: *
        !          2754: *      IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
        !          2755: *      OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
        !          2756: *      LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
        !          2757: *
        !          2758: NUM01  EQU  1
        !          2759: NUM02  EQU  2
        !          2760: NUM03  EQU  3
        !          2761: NUM04  EQU  4
        !          2762: NUM05  EQU  5
        !          2763: NUM06  EQU  6
        !          2764: NUM07  EQU  7
        !          2765: NUM08  EQU  8
        !          2766: NUM09  EQU  9
        !          2767: NUM10  EQU  10
        !          2768: NINI9  EQU  999
        !          2769: THSND  EQU  1000
        !          2770: *
        !          2771: *      NUMBERS OF UNDEFINED SPITBOL OPERATORS
        !          2772: *
        !          2773: OPBUN  EQU  5                NO. OF BINARY UNDEFINED OPS
        !          2774: OPUUN  EQU  6                NO OF UNARY UNDEFINED OPS
        !          2775: *
        !          2776: *      OFFSETS USED IN PRTSN, PRTMI AND ACESS
        !          2777: *
        !          2778: PRSNF  EQU  13               OFFSET USED IN PRTSN
        !          2779: PRTMF  EQU  15               OFFSET TO COL 15 (PRTMI)
        !          2780: RILEN  EQU  160              BUFFER LENGTH FOR SYSRI
        !          2781: *
        !          2782: *      CODES FOR STAGES OF PROCESSING
        !          2783: *
        !          2784: STGIC  EQU  0                INITIAL COMPILE
        !          2785: STGXC  EQU  STGIC+1          EXECUTION COMPILE (CODE)
        !          2786: STGEV  EQU  STGXC+1          EXPRESSION EVAL DURING EXECUTION
        !          2787: STGXT  EQU  STGEV+1          EXECUTION TIME
        !          2788: STGCE  EQU  STGXT+1          INITIAL COMPILE AFTER END LINE
        !          2789: STGXE  EQU  STGCE+1          EXEC. COMPILE AFTER END LINE
        !          2790: STGND  EQU  STGCE-STGIC      DIFFERENCE IN STAGE AFTER END
        !          2791: STGEE  EQU  STGXE+1          EVAL EVALUATING EXPRESSION
        !          2792: STGNO  EQU  STGEE+1          NUMBER OF CODES
        !          2793:        EJC
        !          2794: *
        !          2795: *
        !          2796: *      STATEMENT NUMBER PAD COUNT FOR LISTR
        !          2797: *
        !          2798: .DEF   .CSN5
        !          2799: .IF    .CSN6
        !          2800: STNPD  EQU  6                STATEMENT NO. PAD COUNT
        !          2801: .UNDEF .CSN5
        !          2802: .FI
        !          2803: .IF    .CSN8
        !          2804: STNPD  EQU  8                STATEMENT NO. PAD COUNT
        !          2805: .UNDEF .CSN5
        !          2806: .FI
        !          2807: .IF    .CSN5
        !          2808: STNPD  EQU  5                STATEMENT NO. PAD COUNT
        !          2809: .FI
        !          2810: *
        !          2811: *      SYNTAX TYPE CODES
        !          2812: *
        !          2813: *      THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
        !          2814: *
        !          2815: *      THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
        !          2816: *
        !          2817: T$UOP  EQU  0                UNARY OPERATOR
        !          2818: T$LPR  EQU  T$UOP+3          LEFT PAREN
        !          2819: T$LBR  EQU  T$LPR+3          LEFT BRACKET
        !          2820: T$CMA  EQU  T$LBR+3          COMMA
        !          2821: T$FNC  EQU  T$CMA+3          FUNCTION CALL
        !          2822: T$VAR  EQU  T$FNC+3          VARIABLE
        !          2823: T$CON  EQU  T$VAR+3          CONSTANT
        !          2824: T$BOP  EQU  T$CON+3          BINARY OPERATOR
        !          2825: T$RPR  EQU  T$BOP+3          RIGHT PAREN
        !          2826: T$RBR  EQU  T$RPR+3          RIGHT BRACKET
        !          2827: T$COL  EQU  T$RBR+3          COLON
        !          2828: T$SMC  EQU  T$COL+3          SEMI-COLON
        !          2829: *
        !          2830: *      THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
        !          2831: *
        !          2832: T$FGO  EQU  T$SMC+1          FAILURE GOTO
        !          2833: T$SGO  EQU  T$FGO+1          SUCCESS GOTO
        !          2834: *
        !          2835: *      THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
        !          2836: *      WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
        !          2837: *      OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
        !          2838: *
        !          2839: T$UOK  EQU  T$FNC            LAST CODE OK BEFORE UNARY OPERATOR
        !          2840:        EJC
        !          2841: *
        !          2842: *      DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
        !          2843: *
        !          2844: T$UO0  EQU  T$UOP+0          UNARY OPERATOR, STATE ZERO
        !          2845: T$UO1  EQU  T$UOP+1          UNARY OPERATOR, STATE ONE
        !          2846: T$UO2  EQU  T$UOP+2          UNARY OPERATOR, STATE TWO
        !          2847: T$LP0  EQU  T$LPR+0          LEFT PAREN, STATE ZERO
        !          2848: T$LP1  EQU  T$LPR+1          LEFT PAREN, STATE ONE
        !          2849: T$LP2  EQU  T$LPR+2          LEFT PAREN, STATE TWO
        !          2850: T$LB0  EQU  T$LBR+0          LEFT BRACKET, STATE ZERO
        !          2851: T$LB1  EQU  T$LBR+1          LEFT BRACKET, STATE ONE
        !          2852: T$LB2  EQU  T$LBR+2          LEFT BRACKET, STATE TWO
        !          2853: T$CM0  EQU  T$CMA+0          COMMA, STATE ZERO
        !          2854: T$CM1  EQU  T$CMA+1          COMMA, STATE ONE
        !          2855: T$CM2  EQU  T$CMA+2          COMMA, STATE TWO
        !          2856: T$FN0  EQU  T$FNC+0          FUNCTION CALL, STATE ZERO
        !          2857: T$FN1  EQU  T$FNC+1          FUNCTION CALL, STATE ONE
        !          2858: T$FN2  EQU  T$FNC+2          FUNCTION CALL, STATE TWO
        !          2859: T$VA0  EQU  T$VAR+0          VARIABLE, STATE ZERO
        !          2860: T$VA1  EQU  T$VAR+1          VARIABLE, STATE ONE
        !          2861: T$VA2  EQU  T$VAR+2          VARIABLE, STATE TWO
        !          2862: T$CO0  EQU  T$CON+0          CONSTANT, STATE ZERO
        !          2863: T$CO1  EQU  T$CON+1          CONSTANT, STATE ONE
        !          2864: T$CO2  EQU  T$CON+2          CONSTANT, STATE TWO
        !          2865: T$BO0  EQU  T$BOP+0          BINARY OPERATOR, STATE ZERO
        !          2866: T$BO1  EQU  T$BOP+1          BINARY OPERATOR, STATE ONE
        !          2867: T$BO2  EQU  T$BOP+2          BINARY OPERATOR, STATE TWO
        !          2868: T$RP0  EQU  T$RPR+0          RIGHT PAREN, STATE ZERO
        !          2869: T$RP1  EQU  T$RPR+1          RIGHT PAREN, STATE ONE
        !          2870: T$RP2  EQU  T$RPR+2          RIGHT PAREN, STATE TWO
        !          2871: T$RB0  EQU  T$RBR+0          RIGHT BRACKET, STATE ZERO
        !          2872: T$RB1  EQU  T$RBR+1          RIGHT BRACKET, STATE ONE
        !          2873: T$RB2  EQU  T$RBR+2          RIGHT BRACKET, STATE TWO
        !          2874: T$CL0  EQU  T$COL+0          COLON, STATE ZERO
        !          2875: T$CL1  EQU  T$COL+1          COLON, STATE ONE
        !          2876: T$CL2  EQU  T$COL+2          COLON, STATE TWO
        !          2877: T$SM0  EQU  T$SMC+0          SEMICOLON, STATE ZERO
        !          2878: T$SM1  EQU  T$SMC+1          SEMICOLON, STATE ONE
        !          2879: T$SM2  EQU  T$SMC+2          SEMICOLON, STATE TWO
        !          2880: *
        !          2881: T$NES  EQU  T$SM2+1          NUMBER OF ENTRIES IN BRANCH TABLE
        !          2882:        EJC
        !          2883: *
        !          2884: *       DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
        !          2885: *
        !          2886: .IF    .CASL
        !          2887: CC$CI  EQU  0                -CASEIG
        !          2888: CC$CO  EQU  CC$CI+1          -COPY
        !          2889: .ELSE
        !          2890: CC$CO  EQU  0                -COPY
        !          2891: .FI
        !          2892: CC$EJ  EQU  CC$CO+1          -EJECT
        !          2893: CC$FA  EQU  CC$EJ+1          -FAIL
        !          2894: CC$LI  EQU  CC$FA+1          -LIST
        !          2895: .IF    .CASL
        !          2896: CC$NC  EQU  CC$LI+1          -NOCASEIG
        !          2897: CC$NF  EQU  CC$NC+1          -NOFAIL
        !          2898: .ELSE
        !          2899: CC$NF  EQU  CC$LI+1          -NOFAIL
        !          2900: .FI
        !          2901: CC$NL  EQU  CC$NF+1          -NOLIST
        !          2902: CC$ST  EQU  CC$NL+1          -STITL
        !          2903: CC$TI  EQU  CC$ST+1          -TITLE
        !          2904: CC$TR  EQU  CC$TI+1          -TRACE
        !          2905: CC$CT  EQU  CC$TR+1          NUMBER OF CONTROL CARDS
        !          2906: CCNOC  EQU  4                NO. OF CHARS INCLUDED IN MATCH
        !          2907: CCOFS  EQU  7                OFFSET TO START OF TITLE/SUBTITLE
        !          2908: *
        !          2909: *      DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
        !          2910: *
        !          2911: *      SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
        !          2912: *      OF USE OF THESE LOCATIONS ON THE STACK.
        !          2913: *
        !          2914: CMSTM  EQU  0                TREE FOR STATEMENT BODY
        !          2915: CMSGO  EQU  CMSTM+1          TREE FOR SUCCESS GOTO
        !          2916: CMFGO  EQU  CMSGO+1          TREE FOR FAIL GOTO
        !          2917: CMCGO  EQU  CMFGO+1          CONDITIONAL GOTO FLAG
        !          2918: CMPCD  EQU  CMCGO+1          PREVIOUS CDBLK POINTER
        !          2919: CMFFP  EQU  CMPCD+1          FAILURE FILL IN FLAG FOR PREVIOUS
        !          2920: CMFFC  EQU  CMFFP+1          FAILURE FILL IN FLAG FOR CURRENT
        !          2921: CMSOP  EQU  CMFFC+1          SUCCESS FILL IN OFFSET FOR PREVIOUS
        !          2922: CMSOC  EQU  CMSOP+1          SUCCESS FILL IN OFFSET FOR CURRENT
        !          2923: CMLBL  EQU  CMSOC+1          PTR TO VRBLK FOR CURRENT LABEL
        !          2924: CMTRA  EQU  CMLBL+1          PTR TO ENTRY CDBLK
        !          2925: *
        !          2926: CMNEN  EQU  CMTRA+1          COUNT OF STACK ENTRIES FOR CMPIL
        !          2927: .IF    .CNPF
        !          2928: .ELSE
        !          2929: *
        !          2930: *      A FEW CONSTANTS USED BY THE PROFILER
        !          2931: PFPD1  EQU  8                PAD POSITIONS ...
        !          2932: PFPD2  EQU  20               ... FOR PROFILE ...
        !          2933: PFPD3  EQU  32               ... PRINTOUT
        !          2934: PF$I2  EQU  CFP$I+CFP$I      SIZE OF TABLE ENTRY (2 INTS)
        !          2935: .FI
        !          2936:        TTL  S P I T B O L -- CONSTANT SECTION
        !          2937: *
        !          2938: *      THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
        !          2939: *
        !          2940: *      ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
        !          2941: *      APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
        !          2942: *      DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
        !          2943: *      ORDER WHICH MUST NOT BE DISTURBED.
        !          2944: *
        !          2945: *      IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
        !          2946: *      FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
        !          2947: *      ALPHABETICAL ORDER IN SOME CASES.
        !          2948: *
        !          2949:        SEC                   START OF CONSTANT SECTION
        !          2950: *
        !          2951: *      FREE STORE PERCENTAGE (USED BY ALLOC)
        !          2952: *
        !          2953: ALFSP  DAC  E$FSP            FREE STORE PERCENTAGE
        !          2954: *
        !          2955: *      BIT CONSTANTS FOR GENERAL USE
        !          2956: *
        !          2957: BITS0  DBC  0                ALL ZERO BITS
        !          2958: BITS1  DBC  1                ONE BIT IN LOW ORDER POSITION
        !          2959: BITS2  DBC  2                BIT IN POSITION 2
        !          2960: BITS3  DBC  4                BIT IN POSITION 3
        !          2961: BITS4  DBC  8                BIT IN POSITION 4
        !          2962: BITS5  DBC  16               BIT IN POSITION 5
        !          2963: BITS6  DBC  32               BIT IN POSITION 6
        !          2964: BITS7  DBC  64               BIT IN POSITION 7
        !          2965: BITS8  DBC  128              BIT IN POSITION 8
        !          2966: BITS9  DBC  256              BIT IN POSITION 9
        !          2967: BIT10  DBC  512              BIT IN POSITION 10
        !          2968: BITSM  DBC  CFP$M            MASK FOR MAX INTEGER
        !          2969: *
        !          2970: *      BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
        !          2971: *
        !          2972: BTFNC  DBC  SVFNC            BIT TO TEST FOR FUNCTION
        !          2973: BTKNM  DBC  SVKNM            BIT TO TEST FOR KEYWORD NUMBER
        !          2974: BTLBL  DBC  SVLBL            BIT TO TEST FOR LABEL
        !          2975: BTFFC  DBC  SVFFC            BIT TO TEST FOR FAST CALL
        !          2976: BTCKW  DBC  SVCKW            BIT TO TEST FOR CONSTANT KEYWORD
        !          2977: BTPRD  DBC  SVPRD            BIT TO TEST FOR PREDICATE FUNCTION
        !          2978: BTPRE  DBC  SVPRE            BIT TO TEST FOR PREEVALUATION
        !          2979: BTVAL  DBC  SVVAL            BIT TO TEST FOR VALUE
        !          2980:        EJC
        !          2981: *
        !          2982: *      LIST OF NAMES USED FOR CONTROL CARD PROCESSING
        !          2983: *
        !          2984: .IF    .CASL
        !          2985: CCNMS  DTC  /CASE/
        !          2986:        DTC  /COPY/
        !          2987: .ELSE
        !          2988: CCNMS  DTC  /COPY/
        !          2989: .FI
        !          2990:        DTC  /EJEC/
        !          2991:        DTC  /FAIL/
        !          2992:        DTC  /LIST/
        !          2993: .IF    .CASL
        !          2994:        DTC  /NOCA/
        !          2995: .FI
        !          2996:        DTC  /NOFA/
        !          2997:        DTC  /NOLI/
        !          2998:        DTC  /STIT/
        !          2999:        DTC  /TITL/
        !          3000:        DTC  /TRAC/
        !          3001: *
        !          3002: *      HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
        !          3003: *
        !          3004: DMHDK  DAC  B$SCL
        !          3005:        DAC  22
        !          3006:        DDC  /DUMP OF KEYWORD VALUES/
        !          3007: *
        !          3008: DMHDV  DAC  B$SCL
        !          3009:        DAC  25
        !          3010:        DDC  /DUMP OF NATURAL VARIABLES/
        !          3011: *
        !          3012: *      MESSAGE TEXT FOR COMPILATION STATISTICS
        !          3013: *
        !          3014: ENCM1  DAC  B$SCL
        !          3015:        DAC  10
        !          3016:        DDC  /STORE USED/
        !          3017: *
        !          3018: ENCM2  DAC  B$SCL
        !          3019:        DAC  10
        !          3020:        DDC  /STORE LEFT/
        !          3021: *
        !          3022: ENCM3  DAC  B$SCL
        !          3023:        DAC  11
        !          3024:        DDC  /COMP ERRORS/
        !          3025: *
        !          3026: ENCM4  DAC  B$SCL
        !          3027:        DAC  14
        !          3028: .IF    .CTMD
        !          3029:        DDC  /COMP TIME-DSEC/
        !          3030: .ELSE
        !          3031:        DDC  /COMP TIME-MSEC/
        !          3032: .FI
        !          3033: *
        !          3034: ENCM5  DAC  B$SCL
        !          3035:        DAC  20
        !          3036:        DDC  /EXECUTION SUPPRESSED/
        !          3037:        EJC
        !          3038: *
        !          3039: *      FOR TERMINATION IN COMPILATION
        !          3040: *
        !          3041: ENDIC  DAC  B$SCL
        !          3042:        DAC  14
        !          3043:        DDC  /IN COMPILATION/
        !          3044: *
        !          3045: *      MEMORY OVERFLOW DURING INITIALISATION
        !          3046: *
        !          3047: ENDMO  DAC  B$SCL
        !          3048: ENDML  DAC  15
        !          3049:        DDC  /MEMORY OVERFLOW/
        !          3050: *
        !          3051: *      STRING CONSTANT FOR MESSAGE ISSUED BY L$END
        !          3052: *
        !          3053: ENDMS  DAC  B$SCL
        !          3054:        DAC  10
        !          3055:        DDC  /NORMAL END/
        !          3056: *
        !          3057: *      FAIL MESSAGE FOR STACK FAIL SECTION
        !          3058: *
        !          3059: ENDSO  DAC  B$SCL
        !          3060:        DAC  36
        !          3061:        DDC  /STACK OVERFLOW IN GARBAGE COLLECTION/
        !          3062:        EJC
        !          3063: *
        !          3064: *      STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
        !          3065: *
        !          3066: ERMMS  DAC  B$SCL
        !          3067:        DAC  5
        !          3068:        DDC  /ERROR/
        !          3069: *
        !          3070: ERMNS  DAC  B$SCL
        !          3071:        DAC  4
        !          3072:        DTC  / -- /
        !          3073: *
        !          3074: *
        !          3075: ERRTF  DAC  251              FATAL ERROR CODE - SEE LABEL ERRAF
        !          3076: *
        !          3077: *      STRING CONSTANT FOR PAGE NUMBERING
        !          3078: *
        !          3079: LSTMS  DAC  B$SCL
        !          3080:        DAC  5
        !          3081:        DDC  /PAGE /
        !          3082: *
        !          3083: *      LISTING HEADER MESSAGE
        !          3084: *
        !          3085: HEADR  DAC  B$SCL
        !          3086:        DAC  25
        !          3087:        DDC  /MACRO SPITBOL VERSION 4.3/
        !          3088: *
        !          3089: HEADV  DAC  B$SCL            FOR EXIT() VERSION NO. CHECK
        !          3090:        DAC  3
        !          3091:        DTC  /4.3/
        !          3092: *
        !          3093: *      INTEGER CONSTANTS FOR GENERAL USE
        !          3094: *      ICBLD OPTIMISATION USES THE FIRST THREE.
        !          3095: *
        !          3096: INT$R  DAC  B$ICL
        !          3097: INTV0  DIC  +0               0
        !          3098: INTON  DAC  B$ICL
        !          3099: INTV1  DIC  +1               1
        !          3100: INTTW  DAC  B$ICL
        !          3101: INTV2  DIC  +2               2
        !          3102: INTVT  DIC  +10              10
        !          3103: INTVH  DIC  +100             100
        !          3104: INTTH  DIC  +1000            1000
        !          3105: *
        !          3106: *      TABLE USED IN ICBLD OPTIMISATION
        !          3107: *
        !          3108: INTAB  DAC  INT$R            POINTER TO 0
        !          3109:        DAC  INTON            POINTER TO 1
        !          3110:        DAC  INTTW            POINTER TO 2
        !          3111:        EJC
        !          3112: *
        !          3113: *      SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
        !          3114: *      CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
        !          3115: *      (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
        !          3116: *
        !          3117: NDABB  DAC  P$ABB            ARBNO
        !          3118: NDABD  DAC  P$ABD            ARBNO
        !          3119: NDARC  DAC  P$ARC            ARB
        !          3120: NDEXB  DAC  P$EXB            EXPRESSION
        !          3121: NDEXC  DAC  P$EXC            EXPRESSION
        !          3122: .IF    .CNFN
        !          3123: .ELSE
        !          3124: NDFNB  DAC  P$FNB            FENCE()
        !          3125: NDFND  DAC  P$FND            FENCE()
        !          3126: .FI
        !          3127: NDIMB  DAC  P$IMB            IMMEDIATE ASSIGNMENT
        !          3128: NDIMD  DAC  P$IMD            IMMEDIATE ASSIGNMENT
        !          3129: NDNTH  DAC  P$NTH            PATTERN END (NULL PATTERN)
        !          3130: NDPAB  DAC  P$PAB            PATTERN ASSIGNMENT
        !          3131: NDPAD  DAC  P$PAD            PATTERN ASSIGNMENT
        !          3132: NDUNA  DAC  P$UNA            ANCHOR POINT MOVEMENT
        !          3133: *
        !          3134: *      KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
        !          3135: *      USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
        !          3136: *      VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
        !          3137: *      NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
        !          3138: *      DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
        !          3139: *
        !          3140: NDABO  DAC  P$ABO            ABORT
        !          3141:        DAC  NDNTH
        !          3142: NDARB  DAC  P$ARB            ARB
        !          3143:        DAC  NDNTH
        !          3144: NDBAL  DAC  P$BAL            BAL
        !          3145:        DAC  NDNTH
        !          3146: NDFAL  DAC  P$FAL            FAIL
        !          3147:        DAC  NDNTH
        !          3148: NDFEN  DAC  P$FEN            FENCE
        !          3149:        DAC  NDNTH
        !          3150: NDREM  DAC  P$REM            REM
        !          3151:        DAC  NDNTH
        !          3152: NDSUC  DAC  P$SUC            SUCCEED
        !          3153:        DAC  NDNTH
        !          3154: *
        !          3155: *      NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
        !          3156: *      SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
        !          3157: *      PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
        !          3158: *      NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
        !          3159: *      BUT FOR VERY EXCEPTIONAL MACHINES.
        !          3160: *
        !          3161: NULLS  DAC  B$SCL            NULL STRING VALUE
        !          3162:        DAC  0                SCLEN = 0
        !          3163: NULLW  DTC  /          /
        !          3164:        EJC
        !          3165: *
        !          3166: *      OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
        !          3167: *
        !          3168: OPDVC  DAC  O$CNC            CONCATENATION
        !          3169:        DAC  C$CNC
        !          3170:        DAC  LLCNC
        !          3171:        DAC  RRCNC
        !          3172: *
        !          3173: *      OPDVP IS USED WHEN SCANNING BELOW TOP LEVEL TO ENSURE
        !          3174: *      THE CONCATENATION WILL NOT LATER BE MISTAKEN FOR
        !          3175: *      PATTERN MATCHING
        !          3176: *
        !          3177: OPDVP  DAC  O$CNC            PROVEN CONCATENATION
        !          3178:        DAC  C$CNP
        !          3179:        DAC  LLCNC
        !          3180:        DAC  RRCNC
        !          3181: *
        !          3182: *      NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
        !          3183: *      THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
        !          3184: *
        !          3185: OPDVS  DAC  O$ASS            ASSIGNMENT
        !          3186:        DAC  C$ASS
        !          3187:        DAC  LLASS
        !          3188:        DAC  RRASS
        !          3189: *
        !          3190:        DAC  6                UNARY EQUAL
        !          3191:        DAC  C$UUO
        !          3192:        DAC  LLUNO
        !          3193: *
        !          3194:        DAC  O$PMV            PATTERN MATCH
        !          3195:        DAC  C$PMT
        !          3196:        DAC  LLPMT
        !          3197:        DAC  RRPMT
        !          3198: *
        !          3199:        DAC  O$INT            INTERROGATION
        !          3200:        DAC  C$UVL
        !          3201:        DAC  LLUNO
        !          3202: *
        !          3203:        DAC  1                BINARY AMPERSAND
        !          3204:        DAC  C$UBO
        !          3205:        DAC  LLAMP
        !          3206:        DAC  RRAMP
        !          3207: *
        !          3208:        DAC  O$KWV            KEYWORD REFERENCE
        !          3209:        DAC  C$KEY
        !          3210:        DAC  LLUNO
        !          3211: *
        !          3212:        DAC  O$ALT            ALTERNATION
        !          3213:        DAC  C$ALT
        !          3214:        DAC  LLALT
        !          3215:        DAC  RRALT
        !          3216:        EJC
        !          3217: *
        !          3218: *      OPERATOR DOPE VECTORS (CONTINUED)
        !          3219: *
        !          3220:        DAC  5                UNARY VERTICAL BAR
        !          3221:        DAC  C$UUO
        !          3222:        DAC  LLUNO
        !          3223: *
        !          3224:        DAC  0                BINARY AT
        !          3225:        DAC  C$UBO
        !          3226:        DAC  LLATS
        !          3227:        DAC  RRATS
        !          3228: *
        !          3229:        DAC  O$CAS            CURSOR ASSIGNMENT
        !          3230:        DAC  C$UNM
        !          3231:        DAC  LLUNO
        !          3232: *
        !          3233:        DAC  2                BINARY NUMBER SIGN
        !          3234:        DAC  C$UBO
        !          3235:        DAC  LLNUM
        !          3236:        DAC  RRNUM
        !          3237: *
        !          3238:        DAC  7                UNARY NUMBER SIGN
        !          3239:        DAC  C$UUO
        !          3240:        DAC  LLUNO
        !          3241: *
        !          3242:        DAC  O$DVD            DIVISION
        !          3243:        DAC  C$BVL
        !          3244:        DAC  LLDVD
        !          3245:        DAC  RRDVD
        !          3246: *
        !          3247:        DAC  9                UNARY SLASH
        !          3248:        DAC  C$UUO
        !          3249:        DAC  LLUNO
        !          3250: *
        !          3251:        DAC  O$MLT            MULTIPLICATION
        !          3252:        DAC  C$BVL
        !          3253:        DAC  LLMLT
        !          3254:        DAC  RRMLT
        !          3255:        EJC
        !          3256: *
        !          3257: *      OPERATOR DOPE VECTORS (CONTINUED)
        !          3258: *
        !          3259:        DAC  0                DEFERRED EXPRESSION
        !          3260:        DAC  C$DEF
        !          3261:        DAC  LLUNO
        !          3262: *
        !          3263:        DAC  3                BINARY PERCENT
        !          3264:        DAC  C$UBO
        !          3265:        DAC  LLPCT
        !          3266:        DAC  RRPCT
        !          3267: *
        !          3268:        DAC  8                UNARY PERCENT
        !          3269:        DAC  C$UUO
        !          3270:        DAC  LLUNO
        !          3271: *
        !          3272:        DAC  O$EXP            EXPONENTIATION
        !          3273:        DAC  C$BVL
        !          3274:        DAC  LLEXP
        !          3275:        DAC  RREXP
        !          3276: *
        !          3277:        DAC  10               UNARY EXCLAMATION
        !          3278:        DAC  C$UUO
        !          3279:        DAC  LLUNO
        !          3280: *
        !          3281:        DAC  4                BINARY NOT
        !          3282:        DAC  C$UBO
        !          3283:        DAC  LLNOT
        !          3284:        DAC  RRNOT
        !          3285: *
        !          3286:        DAC  0                NEGATION
        !          3287:        DAC  C$NEG
        !          3288:        DAC  LLUNO
        !          3289:        EJC
        !          3290: *
        !          3291: *      OPERATOR DOPE VECTORS (CONTINUED)
        !          3292: *
        !          3293:        DAC  O$SUB            SUBTRACTION
        !          3294:        DAC  C$BVL
        !          3295:        DAC  LLPLM
        !          3296:        DAC  RRPLM
        !          3297: *
        !          3298:        DAC  O$COM            COMPLEMENTATION
        !          3299:        DAC  C$UVL
        !          3300:        DAC  LLUNO
        !          3301: *
        !          3302:        DAC  O$ADD            ADDITION
        !          3303:        DAC  C$BVL
        !          3304:        DAC  LLPLM
        !          3305:        DAC  RRPLM
        !          3306: *
        !          3307:        DAC  O$AFF            AFFIRMATION
        !          3308:        DAC  C$UVL
        !          3309:        DAC  LLUNO
        !          3310: *
        !          3311:        DAC  O$IMA            IMMEDIATE ASSIGNMENT
        !          3312:        DAC  C$BVN
        !          3313:        DAC  LLDLD
        !          3314:        DAC  RRDLD
        !          3315: *
        !          3316:        DAC  O$INV            INDIRECTION
        !          3317:        DAC  C$IND
        !          3318:        DAC  LLUNO
        !          3319: *
        !          3320:        DAC  O$PAS            PATTERN ASSIGNMENT
        !          3321:        DAC  C$BVN
        !          3322:        DAC  LLDLD
        !          3323:        DAC  RRDLD
        !          3324: *
        !          3325:        DAC  O$NAM            NAME REFERENCE
        !          3326:        DAC  C$UNM
        !          3327:        DAC  LLUNO
        !          3328: *
        !          3329: *      SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
        !          3330: *
        !          3331: OPDVD  DAC  O$GOD            DIRECT GOTO
        !          3332:        DAC  C$UVL
        !          3333:        DAC  LLUNO
        !          3334: *
        !          3335: OPDVN  DAC  O$GOC            COMPLEX NORMAL GOTO
        !          3336:        DAC  C$UNM
        !          3337:        DAC  LLUNO
        !          3338:        EJC
        !          3339: *
        !          3340: *      OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
        !          3341: *
        !          3342: OAMN$  DAC  O$AMN            ARRAY REF (MULTI-SUBS BY VALUE)
        !          3343: OAMV$  DAC  O$AMV            ARRAY REF (MULTI-SUBS BY VALUE)
        !          3344: OAON$  DAC  O$AON            ARRAY REF (ONE SUB BY NAME)
        !          3345: OAOV$  DAC  O$AOV            ARRAY REF (ONE SUB BY VALUE)
        !          3346: OCER$  DAC  O$CER            COMPILATION ERROR
        !          3347: OFEX$  DAC  O$FEX            FAILURE IN EXPRESSION EVALUATION
        !          3348: OFIF$  DAC  O$FIF            FAILURE DURING GOTO EVALUATION
        !          3349: OFNC$  DAC  O$FNC            FUNCTION CALL (MORE THAN ONE ARG)
        !          3350: OFNE$  DAC  O$FNE            FUNCTION NAME ERROR
        !          3351: OFNS$  DAC  O$FNS            FUNCTION CALL (SINGLE ARGUMENT)
        !          3352: OGOF$  DAC  O$GOF            SET GOTO FAILURE TRAP
        !          3353: OINN$  DAC  O$INN            INDIRECTION BY NAME
        !          3354: OKWN$  DAC  O$KWN            KEYWORD REFERENCE BY NAME
        !          3355: OLEX$  DAC  O$LEX            LOAD EXPRESSION BY NAME
        !          3356: OLPT$  DAC  O$LPT            LOAD PATTERN
        !          3357: OLVN$  DAC  O$LVN            LOAD VARIABLE NAME
        !          3358: ONTA$  DAC  O$NTA            NEGATION, FIRST ENTRY
        !          3359: ONTB$  DAC  O$NTB            NEGATION, SECOND ENTRY
        !          3360: ONTC$  DAC  O$NTC            NEGATION, THIRD ENTRY
        !          3361: OPMN$  DAC  O$PMN            PATTERN MATCH BY NAME
        !          3362: OPMS$  DAC  O$PMS            PATTERN MATCH (STATEMENT)
        !          3363: OPOP$  DAC  O$POP            POP TOP STACK ITEM
        !          3364: ORNM$  DAC  O$RNM            RETURN NAME FROM EXPRESSION
        !          3365: ORPL$  DAC  O$RPL            PATTERN REPLACEMENT
        !          3366: ORVL$  DAC  O$RVL            RETURN VALUE FROM EXPRESSION
        !          3367: OSLA$  DAC  O$SLA            SELECTION, FIRST ENTRY
        !          3368: OSLB$  DAC  O$SLB            SELECTION, SECOND ENTRY
        !          3369: OSLC$  DAC  O$SLC            SELECTION, THIRD ENTRY
        !          3370: OSLD$  DAC  O$SLD            SELECTION, FOURTH ENTRY
        !          3371: OSTP$  DAC  O$STP            STOP EXECUTION
        !          3372: OUNF$  DAC  O$UNF            UNEXPECTED FAILURE
        !          3373:        EJC
        !          3374: *
        !          3375: *      TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
        !          3376: *
        !          3377: OPSNB  DAC  CH$AT            AT
        !          3378:        DAC  CH$AM            AMPERSAND
        !          3379:        DAC  CH$NM            NUMBER
        !          3380:        DAC  CH$PC            PERCENT
        !          3381:        DAC  CH$NT            NOT
        !          3382: *
        !          3383: *      TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
        !          3384: *
        !          3385: OPNSU  DAC  CH$BR            VERTICAL BAR
        !          3386:        DAC  CH$EQ            EQUAL
        !          3387:        DAC  CH$NM            NUMBER
        !          3388:        DAC  CH$PC            PERCENT
        !          3389:        DAC  CH$SL            SLASH
        !          3390:        DAC  CH$EX            EXCLAMATION
        !          3391: .IF    .CNPF
        !          3392: .ELSE
        !          3393: *
        !          3394: *      ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
        !          3395: *
        !          3396: PFI2A  DAC  PF$I2
        !          3397: *
        !          3398: *      PROFILER MESSAGE STRINGS
        !          3399: *
        !          3400: PFMS1  DAC  B$SCL
        !          3401:        DAC  15
        !          3402:        DDC  /PROGRAM PROFILE/
        !          3403: PFMS2  DAC  B$SCL
        !          3404:        DAC  42
        !          3405:        DDC  /STMT    NUMBER OF     -- EXECUTION TIME --/
        !          3406: PFMS3  DAC  B$SCL
        !          3407:        DAC  47
        !          3408:        DDC  /NUMBER  EXECUTIONS  TOTAL(MSEC) PER EXCN(MCSEC)/
        !          3409: .FI
        !          3410: .IF    .CNRA
        !          3411: .ELSE
        !          3412: *
        !          3413: *      REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
        !          3414: *      STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
        !          3415: *
        !          3416: REAV0  DRC  +0.0             0.0
        !          3417: REAP1  DRC  +0.1             0.1
        !          3418: REAP5  DRC  +0.5             0.5
        !          3419: REAV1  DRC  +1.0             10**0
        !          3420: REAVT  DRC  +1.0E+1          10**1
        !          3421:        DRC  +1.0E+2          10**2
        !          3422:        DRC  +1.0E+3          10**3
        !          3423:        DRC  +1.0E+4          10**4
        !          3424:        DRC  +1.0E+5          10**5
        !          3425:        DRC  +1.0E+6          10**6
        !          3426:        DRC  +1.0E+7          10**7
        !          3427:        DRC  +1.0E+8          10**8
        !          3428:        DRC  +1.0E+9          10**9
        !          3429: REATT  DRC  +1.0E+10         10**10
        !          3430: .FI
        !          3431:        EJC
        !          3432: *
        !          3433: *      STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
        !          3434: *
        !          3435: SCARR  DAC  B$SCL            ARRAY
        !          3436:        DAC  5
        !          3437:        DTC  /ARRAY/
        !          3438: .IF    .CNBF
        !          3439: .ELSE
        !          3440: *
        !          3441: SCBUF  DAC  B$SCL
        !          3442:        DAC  6
        !          3443:        DTC  /BUFFER/
        !          3444: .FI
        !          3445: *
        !          3446: SCCOD  DAC  B$SCL            CODE
        !          3447:        DAC  4
        !          3448:        DTC  /CODE/
        !          3449: *
        !          3450: SCEXP  DAC  B$SCL            EXPRESSION
        !          3451:        DAC  10
        !          3452:        DTC  /EXPRESSION/
        !          3453: *
        !          3454: SCEXT  DAC  B$SCL            EXTERNAL
        !          3455:        DAC  8
        !          3456:        DTC  /EXTERNAL/
        !          3457: *
        !          3458: SCINT  DAC  B$SCL            INTEGER
        !          3459:        DAC  7
        !          3460:        DTC  /INTEGER/
        !          3461: *
        !          3462: SCNAM  DAC  B$SCL            NAME
        !          3463:        DAC  4
        !          3464:        DTC  /NAME/
        !          3465: *
        !          3466: SCNUM  DAC  B$SCL            NUMERIC
        !          3467:        DAC  7
        !          3468:        DTC  /NUMERIC/
        !          3469: *
        !          3470: SCPAT  DAC  B$SCL            PATTERN
        !          3471:        DAC  7
        !          3472:        DTC  /PATTERN/
        !          3473: .IF    .CNRA
        !          3474: .ELSE
        !          3475: *
        !          3476: SCREA  DAC  B$SCL            REAL
        !          3477:        DAC  4
        !          3478:        DTC  /REAL/
        !          3479: .FI
        !          3480: *
        !          3481: SCSTR  DAC  B$SCL            STRING
        !          3482:        DAC  6
        !          3483:        DTC  /STRING/
        !          3484: *
        !          3485: SCTAB  DAC  B$SCL            TABLE
        !          3486:        DAC  5
        !          3487:        DTC  /TABLE/
        !          3488:        EJC
        !          3489: *
        !          3490: *      STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
        !          3491: *
        !          3492: SCFRT  DAC  B$SCL            FRETURN
        !          3493:        DAC  7
        !          3494:        DTC  /FRETURN/
        !          3495: *
        !          3496: SCNRT  DAC  B$SCL            NRETURN
        !          3497:        DAC  7
        !          3498:        DTC  /NRETURN/
        !          3499: *
        !          3500: SCRTN  DAC  B$SCL            RETURN
        !          3501:        DAC  6
        !          3502:        DTC  /RETURN/
        !          3503: *
        !          3504: *      DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
        !          3505: *      THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
        !          3506: *
        !          3507: SCNMT  DAC  SCARR            ARBLK     ARRAY
        !          3508: .IF    .CNBF
        !          3509: .ELSE
        !          3510:        DAC  SCBUF            BFBLK     BUFFER
        !          3511: .FI
        !          3512:        DAC  SCCOD            CDBLK     CODE
        !          3513:        DAC  SCEXP            EXBLK     EXPRESSION
        !          3514:        DAC  SCINT            ICBLK     INTEGER
        !          3515:        DAC  SCNAM            NMBLK     NAME
        !          3516:        DAC  SCPAT            P0BLK     PATTERN
        !          3517:        DAC  SCPAT            P1BLK     PATTERN
        !          3518:        DAC  SCPAT            P2BLK     PATTERN
        !          3519: .IF    .CNRA
        !          3520: .ELSE
        !          3521:        DAC  SCREA            RCBLK     REAL
        !          3522: .FI
        !          3523:        DAC  SCSTR            SCBLK     STRING
        !          3524:        DAC  SCEXP            SEBLK     EXPRESSION
        !          3525:        DAC  SCTAB            TBBLK     TABLE
        !          3526:        DAC  SCARR            VCBLK     ARRAY
        !          3527:        DAC  SCEXT            XNBLK     EXTERNAL
        !          3528:        DAC  SCEXT            XRBLK     EXTERNAL
        !          3529: *
        !          3530: .IF    .CNRA
        !          3531: .ELSE
        !          3532: *      STRING CONSTANT FOR REAL ZERO
        !          3533: *
        !          3534: SCRE0  DAC  B$SCL
        !          3535:        DAC  2
        !          3536:        DTC  /0./
        !          3537: .FI
        !          3538:        EJC
        !          3539: *
        !          3540: *      USED TO RE-INITIALISE KVSTL
        !          3541: *
        !          3542: .IF    .CS16
        !          3543: STLIM  DIC  +32767           DEFAULT STATEMENT LIMIT
        !          3544: .ELSE
        !          3545: STLIM  DIC  +50000           DEFAULT STATEMENT LIMIT
        !          3546: .FI
        !          3547: *
        !          3548: *      DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
        !          3549: *
        !          3550: STNDF  DAC  O$FUN            PTR TO UNDEFINED FUNCTION ERR CALL
        !          3551:        DAC  0                DUMMY FARGS COUNT FOR CALL CIRCUIT
        !          3552: *
        !          3553: *      DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
        !          3554: *
        !          3555: STNDL  DAC  L$UND            CODE PTR POINTS TO UNDEFINED LBL
        !          3556: *
        !          3557: *      DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
        !          3558: *
        !          3559: STNDO  DAC  O$OUN            PTR TO UNDEFINED OPERATOR ERR CALL
        !          3560:        DAC  0                DUMMY FARGS COUNT FOR CALL CIRCUIT
        !          3561: *
        !          3562: *      STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
        !          3563: *      THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
        !          3564: *      ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
        !          3565: *
        !          3566: STNVR  DAC  B$VRL            VRGET
        !          3567:        DAC  B$VRS            VRSTO
        !          3568:        DAC  NULLS            VRVAL
        !          3569:        DAC  B$VRG            VRTRA
        !          3570:        DAC  STNDL            VRLBL
        !          3571:        DAC  STNDF            VRFNC
        !          3572:        DAC  0                VRNXT
        !          3573:        EJC
        !          3574: *
        !          3575: *      MESSAGES USED IN END OF RUN PROCESSING (STOPR)
        !          3576: *
        !          3577: STPM1  DAC  B$SCL
        !          3578:        DAC  12
        !          3579:        DDC  /IN STATEMENT/
        !          3580: *
        !          3581: STPM2  DAC  B$SCL
        !          3582:        DAC  14
        !          3583:        DDC  /STMTS EXECUTED/
        !          3584: *
        !          3585: STPM3  DAC  B$SCL
        !          3586:        DAC  13
        !          3587: .IF    .CTMD
        !          3588:        DDC  /RUN TIME-DSEC/
        !          3589: .ELSE
        !          3590:        DDC  /RUN TIME-MSEC/
        !          3591: .FI
        !          3592: *
        !          3593: STPM4  DAC  B$SCL
        !          3594:        DAC  12
        !          3595:        DDC  $MCSEC / STMT$
        !          3596: *
        !          3597: STPM5  DAC  B$SCL
        !          3598:        DAC  13
        !          3599:        DDC  /REGENERATIONS/
        !          3600: *
        !          3601: *      TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
        !          3602: *      THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
        !          3603: *      IN S$CNV
        !          3604: *
        !          3605: SVCTB  DAC  SCSTR            STRING
        !          3606:        DAC  SCINT            INTEGER
        !          3607:        DAC  SCNAM            NAME
        !          3608:        DAC  SCPAT            PATTERN
        !          3609:        DAC  SCARR            ARRAY
        !          3610:        DAC  SCTAB            TABLE
        !          3611:        DAC  SCEXP            EXPRESSION
        !          3612:        DAC  SCCOD            CODE
        !          3613:        DAC  SCNUM            NUMERIC
        !          3614: .IF    .CNRA
        !          3615: .ELSE
        !          3616:        DAC  SCREA            REAL
        !          3617: .FI
        !          3618: .IF    .CNBF
        !          3619: .ELSE
        !          3620:        DAC  SCBUF            BUFFER
        !          3621: .FI
        !          3622:        DAC  0                ZERO MARKS END OF LIST
        !          3623:        EJC
        !          3624: *
        !          3625: *      MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
        !          3626: *
        !          3627: *
        !          3628: TMASB  DAC  B$SCL
        !          3629:        DAC  13
        !          3630:        DTC  /************ /
        !          3631: *
        !          3632: TMBEB  DAC  B$SCL
        !          3633:        DAC  3
        !          3634:        DTC  / = /
        !          3635: *
        !          3636: *      DUMMY TRBLK FOR EXPRESSION VARIABLE
        !          3637: *
        !          3638: TRBEV  DAC  B$TRT            DUMMY TRBLK
        !          3639: *
        !          3640: *      DUMMY TRBLK FOR KEYWORD VARIABLE
        !          3641: *
        !          3642: TRBKV  DAC  B$TRT            DUMMY TRBLK
        !          3643: *
        !          3644: *      DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
        !          3645: *
        !          3646: TRXDR  DAC  O$TXR            BLOCK POINTS TO RETURN ROUTINE
        !          3647: TRXDC  DAC  TRXDR            POINTER TO BLOCK
        !          3648:        EJC
        !          3649: *
        !          3650: *      STANDARD VARIABLE BLOCKS
        !          3651: *
        !          3652: *      SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
        !          3653: *      VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
        !          3654: *      ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
        !          3655: *
        !          3656: V$EQF  DBC  SVFPR            EQ
        !          3657:        DAC  2
        !          3658:        DTC  /EQ/
        !          3659:        DAC  S$EQF
        !          3660:        DAC  2
        !          3661: *
        !          3662: V$GEF  DBC  SVFPR            GE
        !          3663:        DAC  2
        !          3664:        DTC  /GE/
        !          3665:        DAC  S$GEF
        !          3666:        DAC  2
        !          3667: *
        !          3668: V$GTF  DBC  SVFPR            GT
        !          3669:        DAC  2
        !          3670:        DTC  /GT/
        !          3671:        DAC  S$GTF
        !          3672:        DAC  2
        !          3673: *
        !          3674: V$LEF  DBC  SVFPR            LE
        !          3675:        DAC  2
        !          3676:        DTC  /LE/
        !          3677:        DAC  S$LEF
        !          3678:        DAC  2
        !          3679: *
        !          3680: V$LTF  DBC  SVFPR            LT
        !          3681:        DAC  2
        !          3682:        DTC  /LT/
        !          3683:        DAC  S$LTF
        !          3684:        DAC  2
        !          3685: *
        !          3686: V$NEF  DBC  SVFPR            NE
        !          3687:        DAC  2
        !          3688:        DTC  /NE/
        !          3689:        DAC  S$NEF
        !          3690:        DAC  2
        !          3691: *
        !          3692: V$ANY  DBC  SVFNP            ANY
        !          3693:        DAC  3
        !          3694:        DTC  /ANY/
        !          3695:        DAC  S$ANY
        !          3696:        DAC  1
        !          3697: *
        !          3698: V$ARB  DBC  SVKVC            ARB
        !          3699:        DAC  3
        !          3700:        DTC  /ARB/
        !          3701:        DAC  K$ARB
        !          3702:        DAC  NDARB
        !          3703:        EJC
        !          3704: *
        !          3705: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3706: *
        !          3707: V$ARG  DBC  SVFNN            ARG
        !          3708:        DAC  3
        !          3709:        DTC  /ARG/
        !          3710:        DAC  S$ARG
        !          3711:        DAC  2
        !          3712: *
        !          3713: V$BAL  DBC  SVKVC            BAL
        !          3714:        DAC  3
        !          3715:        DTC  /BAL/
        !          3716:        DAC  K$BAL
        !          3717:        DAC  NDBAL
        !          3718: *
        !          3719: V$CTI  DBC  SVFNP            CTI
        !          3720:        DAC  3
        !          3721:        DTC  /CTI/
        !          3722:        DAC  S$CTI
        !          3723:        DAC  1
        !          3724: *
        !          3725: V$END  DBC  SVLBL            END
        !          3726:        DAC  3
        !          3727:        DTC  /END/
        !          3728:        DAC  L$END
        !          3729: *
        !          3730: V$ITC  DBC  SVFNN            ITC
        !          3731:        DAC  3
        !          3732:        DTC  /ITC/
        !          3733:        DAC  S$ITC
        !          3734:        DAC  1
        !          3735: *
        !          3736: V$LEN  DBC  SVFNP            LEN
        !          3737:        DAC  3
        !          3738:        DTC  /LEN/
        !          3739:        DAC  S$LEN
        !          3740:        DAC  1
        !          3741: *
        !          3742: V$LEQ  DBC  SVFPR            LEQ
        !          3743:        DAC  3
        !          3744:        DTC  /LEQ/
        !          3745:        DAC  S$LEQ
        !          3746:        DAC  2
        !          3747: *
        !          3748: V$LGE  DBC  SVFPR            LGE
        !          3749:        DAC  3
        !          3750:        DTC  /LGE/
        !          3751:        DAC  S$LGE
        !          3752:        DAC  2
        !          3753: *
        !          3754: V$LGT  DBC  SVFPR            LGT
        !          3755:        DAC  3
        !          3756:        DTC  /LGT/
        !          3757:        DAC  S$LGT
        !          3758:        DAC  2
        !          3759: *
        !          3760: V$LLE  DBC  SVFPR            LLE
        !          3761:        DAC  3
        !          3762:        DTC  /LLE/
        !          3763:        DAC  S$LLE
        !          3764:        DAC  2
        !          3765:        EJC
        !          3766: *
        !          3767: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3768: *
        !          3769: V$LLT  DBC  SVFPR            LLT
        !          3770:        DAC  3
        !          3771:        DTC  /LLT/
        !          3772:        DAC  S$LLT
        !          3773:        DAC  2
        !          3774: *
        !          3775: V$LNE  DBC  SVFPR            LNE
        !          3776:        DAC  3
        !          3777:        DTC  /LNE/
        !          3778:        DAC  S$LNE
        !          3779:        DAC  2
        !          3780: *
        !          3781: V$POS  DBC  SVFNP            POS
        !          3782:        DAC  3
        !          3783:        DTC  /POS/
        !          3784:        DAC  S$POS
        !          3785:        DAC  1
        !          3786: *
        !          3787: V$REM  DBC  SVKVC            REM
        !          3788:        DAC  3
        !          3789:        DTC  /REM/
        !          3790:        DAC  K$REM
        !          3791:        DAC  NDREM
        !          3792: .IF    .CUST
        !          3793: *
        !          3794: V$SET  DBC  SVFNN            SET
        !          3795:        DAC  3
        !          3796:        DTC  /SET/
        !          3797:        DAC  S$SET
        !          3798:        DAC  3
        !          3799: .FI
        !          3800: *
        !          3801: V$TAB  DBC  SVFNP            TAB
        !          3802:        DAC  3
        !          3803:        DTC  /TAB/
        !          3804:        DAC  S$TAB
        !          3805:        DAC  1
        !          3806: *
        !          3807: V$COD  DBC  SVFNK            CODE
        !          3808:        DAC  4
        !          3809:        DTC  /CODE/
        !          3810:        DAC  K$COD
        !          3811:        DAC  S$COD
        !          3812:        DAC  1
        !          3813: *
        !          3814: V$COP  DBC  SVFNN            COPY
        !          3815:        DAC  4
        !          3816:        DTC  /COPY/
        !          3817:        DAC  S$COP
        !          3818:        DAC  1
        !          3819:        EJC
        !          3820: *
        !          3821: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3822: *
        !          3823: V$DAT  DBC  SVFNN            DATA
        !          3824:        DAC  4
        !          3825:        DTC  /DATA/
        !          3826:        DAC  S$DAT
        !          3827:        DAC  1
        !          3828: *
        !          3829: V$DTE  DBC  SVFNN            DATE
        !          3830:        DAC  4
        !          3831:        DTC  /DATE/
        !          3832:        DAC  S$DTE
        !          3833:        DAC  0
        !          3834: *
        !          3835: V$DMP  DBC  SVFNK            DUMP
        !          3836:        DAC  4
        !          3837:        DTC  /DUMP/
        !          3838:        DAC  K$DMP
        !          3839:        DAC  S$DMP
        !          3840:        DAC  1
        !          3841: *
        !          3842: V$DUP  DBC  SVFNN            DUPL
        !          3843:        DAC  4
        !          3844:        DTC  /DUPL/
        !          3845:        DAC  S$DUP
        !          3846:        DAC  2
        !          3847: *
        !          3848: V$EVL  DBC  SVFNN            EVAL
        !          3849:        DAC  4
        !          3850:        DTC  /EVAL/
        !          3851:        DAC  S$EVL
        !          3852:        DAC  1
        !          3853: .IF    .CNEX
        !          3854: .ELSE
        !          3855: *
        !          3856: V$EXT  DBC  SVFNN            EXIT
        !          3857:        DAC  4
        !          3858:        DTC  /EXIT/
        !          3859:        DAC  S$EXT
        !          3860:        DAC  1
        !          3861: .FI
        !          3862: *
        !          3863: V$FAL  DBC  SVKVC            FAIL
        !          3864:        DAC  4
        !          3865:        DTC  /FAIL/
        !          3866:        DAC  K$FAL
        !          3867:        DAC  NDFAL
        !          3868: *
        !          3869: V$HST  DBC  SVFNN            HOST
        !          3870:        DAC  4
        !          3871:        DTC  /HOST/
        !          3872:        DAC  S$HST
        !          3873:        DAC  3
        !          3874:        EJC
        !          3875: *
        !          3876: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3877: *
        !          3878: V$ITM  DBC  SVFNF            ITEM
        !          3879:        DAC  4
        !          3880:        DTC  /ITEM/
        !          3881:        DAC  S$ITM
        !          3882:        DAC  999
        !          3883: .IF    .CNLD
        !          3884: .ELSE
        !          3885: *
        !          3886: V$LOD  DBC  SVFNN            LOAD
        !          3887:        DAC  4
        !          3888:        DTC  /LOAD/
        !          3889:        DAC  S$LOD
        !          3890:        DAC  2
        !          3891: .FI
        !          3892: *
        !          3893: V$LPD  DBC  SVFNP            LPAD
        !          3894:        DAC  4
        !          3895:        DTC  /LPAD/
        !          3896:        DAC  S$LPD
        !          3897:        DAC  3
        !          3898: *
        !          3899: V$RPD  DBC  SVFNP            RPAD
        !          3900:        DAC  4
        !          3901:        DTC  /RPAD/
        !          3902:        DAC  S$RPD
        !          3903:        DAC  3
        !          3904:        EJC
        !          3905: *
        !          3906: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3907: *
        !          3908: *
        !          3909: V$RPS  DBC  SVFNP            RPOS
        !          3910:        DAC  4
        !          3911:        DTC  /RPOS/
        !          3912:        DAC  S$RPS
        !          3913:        DAC  1
        !          3914: *
        !          3915: V$RTB  DBC  SVFNP            RTAB
        !          3916:        DAC  4
        !          3917:        DTC  /RTAB/
        !          3918:        DAC  S$RTB
        !          3919:        DAC  1
        !          3920: *
        !          3921: V$SI$  DBC  SVFNP            SIZE
        !          3922:        DAC  4
        !          3923:        DTC  /SIZE/
        !          3924:        DAC  S$SI$
        !          3925:        DAC  1
        !          3926: *
        !          3927: .IF    .CNSR
        !          3928: .ELSE
        !          3929: *
        !          3930: V$SRT  DBC  SVFNN            SORT
        !          3931:        DAC  4
        !          3932:        DTC  /SORT/
        !          3933:        DAC  S$SRT
        !          3934:        DAC  2
        !          3935: .FI
        !          3936: V$SPN  DBC  SVFNP            SPAN
        !          3937:        DAC  4
        !          3938:        DTC  /SPAN/
        !          3939:        DAC  S$SPN
        !          3940:        DAC  1
        !          3941:        EJC
        !          3942: *
        !          3943: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3944: *
        !          3945: V$STN  DBC  SVKNM            STNO
        !          3946:        DAC  4
        !          3947:        DTC  /STNO/
        !          3948:        DAC  K$STN
        !          3949: *
        !          3950: V$TIM  DBC  SVFNN            TIME
        !          3951:        DAC  4
        !          3952:        DTC  /TIME/
        !          3953:        DAC  S$TIM
        !          3954:        DAC  0
        !          3955: *
        !          3956: V$TRM  DBC  SVFNK            TRIM
        !          3957:        DAC  4
        !          3958:        DTC  /TRIM/
        !          3959:        DAC  K$TRM
        !          3960:        DAC  S$TRM
        !          3961:        DAC  1
        !          3962: *
        !          3963: V$ABO  DBC  SVKVL            ABORT
        !          3964:        DAC  5
        !          3965:        DTC  /ABORT/
        !          3966:        DAC  K$ABO
        !          3967:        DAC  L$ABO
        !          3968:        DAC  NDABO
        !          3969: *
        !          3970: V$APP  DBC  SVFNF            APPLY
        !          3971:        DAC  5
        !          3972:        DTC  /APPLY/
        !          3973:        DAC  S$APP
        !          3974:        DAC  999
        !          3975: *
        !          3976: V$ABN  DBC  SVFNP            ARBNO
        !          3977:        DAC  5
        !          3978:        DTC  /ARBNO/
        !          3979:        DAC  S$ABN
        !          3980:        DAC  1
        !          3981: *
        !          3982: V$ARR  DBC  SVFNN            ARRAY
        !          3983:        DAC  5
        !          3984:        DTC  /ARRAY/
        !          3985:        DAC  S$ARR
        !          3986:        DAC  2
        !          3987:        EJC
        !          3988: *
        !          3989: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          3990: *
        !          3991: V$BRK  DBC  SVFNP            BREAK
        !          3992:        DAC  5
        !          3993:        DTC  /BREAK/
        !          3994:        DAC  S$BRK
        !          3995:        DAC  1
        !          3996: *
        !          3997: V$CLR  DBC  SVFNN            CLEAR
        !          3998:        DAC  5
        !          3999:        DTC  /CLEAR/
        !          4000:        DAC  S$CLR
        !          4001:        DAC  1
        !          4002: *
        !          4003: V$EJC  DBC  SVFNN            EJECT
        !          4004:        DAC  5
        !          4005:        DTC  /EJECT/
        !          4006:        DAC  S$EJC
        !          4007:        DAC  1
        !          4008: *
        !          4009: .IF    .CNFN
        !          4010: V$FEN  DBC  SVKVC            FENCE
        !          4011: .ELSE
        !          4012: V$FEN  DBC  SVFPK            FENCE
        !          4013: .FI
        !          4014:        DAC  5
        !          4015:        DTC  /FENCE/
        !          4016:        DAC  K$FEN
        !          4017: .IF    .CNFN
        !          4018: .ELSE
        !          4019:        DAC  S$FNC
        !          4020:        DAC  1
        !          4021: .FI
        !          4022:        DAC  NDFEN
        !          4023: *
        !          4024: V$FLD  DBC  SVFNN            FIELD
        !          4025:        DAC  5
        !          4026:        DTC  /FIELD/
        !          4027:        DAC  S$FLD
        !          4028:        DAC  2
        !          4029: *
        !          4030: V$IDN  DBC  SVFPR            IDENT
        !          4031:        DAC  5
        !          4032:        DTC  /IDENT/
        !          4033:        DAC  S$IDN
        !          4034:        DAC  2
        !          4035: *
        !          4036: V$INP  DBC  SVFNK            INPUT
        !          4037:        DAC  5
        !          4038:        DTC  /INPUT/
        !          4039:        DAC  K$INP
        !          4040:        DAC  S$INP
        !          4041:        DAC  3
        !          4042: *
        !          4043: V$LOC  DBC  SVFNN            LOCAL
        !          4044:        DAC  5
        !          4045:        DTC  /LOCAL/
        !          4046:        DAC  S$LOC
        !          4047:        DAC  2
        !          4048:        EJC
        !          4049: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          4050: *
        !          4051: V$OPS  DBC  SVFNN            OPSYN
        !          4052:        DAC  5
        !          4053:        DTC  /OPSYN/
        !          4054:        DAC  S$OPS
        !          4055:        DAC  3
        !          4056: *
        !          4057: V$RMD  DBC  SVFNP            REMDR
        !          4058:        DAC  5
        !          4059:        DTC  /REMDR/
        !          4060:        DAC  S$RMD
        !          4061:        DAC  2
        !          4062: .IF    .CNSR
        !          4063: .ELSE
        !          4064: *
        !          4065: V$RSR  DBC  SVFNN            RSORT
        !          4066:        DAC  5
        !          4067:        DTC  /RSORT/
        !          4068:        DAC  S$RSR
        !          4069:        DAC  2
        !          4070: .FI
        !          4071: *
        !          4072: V$TBL  DBC  SVFNN            TABLE
        !          4073:        DAC  5
        !          4074:        DTC  /TABLE/
        !          4075:        DAC  S$TBL
        !          4076:        DAC  3
        !          4077: *
        !          4078: V$TRA  DBC  SVFNK            TRACE
        !          4079:        DAC  5
        !          4080:        DTC  /TRACE/
        !          4081:        DAC  K$TRA
        !          4082:        DAC  S$TRA
        !          4083:        DAC  4
        !          4084: *
        !          4085: V$ANC  DBC  SVKNM            ANCHOR
        !          4086:        DAC  6
        !          4087:        DTC  /ANCHOR/
        !          4088:        DAC  K$ANC
        !          4089:        EJC
        !          4090: *
        !          4091: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          4092: *
        !          4093: .IF    .CNBF
        !          4094: .ELSE
        !          4095: V$APN  DBC  SVFNN            APPEND
        !          4096:        DAC  6
        !          4097:        DTC  /APPEND/
        !          4098:        DAC  S$APN
        !          4099:        DAC  2
        !          4100: .FI
        !          4101: *
        !          4102: V$BKX  DBC  SVFNP            BREAKX
        !          4103:        DAC  6
        !          4104:        DTC  /BREAKX/
        !          4105:        DAC  S$BKX
        !          4106:        DAC  1
        !          4107: .IF    .CNBF
        !          4108: .ELSE
        !          4109: V$BUF  DBC  SVFNN            BUFFER
        !          4110:        DAC  6
        !          4111:        DTC  /BUFFER/
        !          4112:        DAC  S$BUF
        !          4113:        DAC  2
        !          4114: .FI
        !          4115: *
        !          4116: V$DEF  DBC  SVFNN            DEFINE
        !          4117:        DAC  6
        !          4118:        DTC  /DEFINE/
        !          4119:        DAC  S$DFN
        !          4120:        DAC  2
        !          4121: *
        !          4122: V$DET  DBC  SVFNN            DETACH
        !          4123:        DAC  6
        !          4124:        DTC  /DETACH/
        !          4125:        DAC  S$DET
        !          4126:        DAC  1
        !          4127: *
        !          4128: V$DIF  DBC  SVFPR            DIFFER
        !          4129:        DAC  6
        !          4130:        DTC  /DIFFER/
        !          4131:        DAC  S$DIF
        !          4132:        DAC  2
        !          4133: *
        !          4134: V$FTR  DBC  SVKNM            FTRACE
        !          4135:        DAC  6
        !          4136:        DTC  /FTRACE/
        !          4137:        DAC  K$FTR
        !          4138:        EJC
        !          4139: .IF    .CNBF
        !          4140: .ELSE
        !          4141: *
        !          4142: V$INS  DBC  SVFNN            INSERT
        !          4143:        DAC  6
        !          4144:        DTC  /INSERT/
        !          4145:        DAC  S$INS
        !          4146:        DAC  4
        !          4147: .FI
        !          4148: *
        !          4149: V$LST  DBC  SVKNM            LASTNO
        !          4150:        DAC  6
        !          4151:        DTC  /LASTNO/
        !          4152:        DAC  K$LST
        !          4153: *
        !          4154: V$NAY  DBC  SVFNP            NOTANY
        !          4155:        DAC  6
        !          4156:        DTC  /NOTANY/
        !          4157:        DAC  S$NAY
        !          4158:        DAC  1
        !          4159: *
        !          4160: V$OUP  DBC  SVFNK            OUTPUT
        !          4161:        DAC  6
        !          4162:        DTC  /OUTPUT/
        !          4163:        DAC  K$OUP
        !          4164:        DAC  S$OUP
        !          4165:        DAC  3
        !          4166: *
        !          4167: V$RET  DBC  SVLBL            RETURN
        !          4168:        DAC  6
        !          4169:        DTC  /RETURN/
        !          4170:        DAC  L$RTN
        !          4171: *
        !          4172: V$STT  DBC  SVFNN            STOPTR
        !          4173:        DAC  6
        !          4174:        DTC  /STOPTR/
        !          4175:        DAC  S$STT
        !          4176:        DAC  2
        !          4177:        EJC
        !          4178: *
        !          4179: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          4180: *
        !          4181: V$SUB  DBC  SVFNN            SUBSTR
        !          4182:        DAC  6
        !          4183:        DTC  /SUBSTR/
        !          4184:        DAC  S$SUB
        !          4185:        DAC  3
        !          4186: *
        !          4187: V$UNL  DBC  SVFNN            UNLOAD
        !          4188:        DAC  6
        !          4189:        DTC  /UNLOAD/
        !          4190:        DAC  S$UNL
        !          4191:        DAC  1
        !          4192: *
        !          4193: V$COL  DBC  SVFNN            COLLECT
        !          4194:        DAC  7
        !          4195:        DTC  /COLLECT/
        !          4196:        DAC  S$COL
        !          4197:        DAC  1
        !          4198: *
        !          4199: V$CNV  DBC  SVFNN            CONVERT
        !          4200:        DAC  7
        !          4201:        DTC  /CONVERT/
        !          4202:        DAC  S$CVT
        !          4203:        DAC  2
        !          4204: *
        !          4205: V$ENF  DBC  SVFNN            ENDFILE
        !          4206:        DAC  7
        !          4207:        DTC  /ENDFILE/
        !          4208:        DAC  S$ENF
        !          4209:        DAC  2
        !          4210: *
        !          4211: V$ETX  DBC  SVKNM            ERRTEXT
        !          4212:        DAC  7
        !          4213:        DTC  /ERRTEXT/
        !          4214:        DAC  K$ETX
        !          4215: *
        !          4216: V$ERT  DBC  SVKNM            ERRTYPE
        !          4217:        DAC  7
        !          4218:        DTC  /ERRTYPE/
        !          4219:        DAC  K$ERT
        !          4220: *
        !          4221: V$FRT  DBC  SVLBL            FRETURN
        !          4222:        DAC  7
        !          4223:        DTC  /FRETURN/
        !          4224:        DAC  L$FRT
        !          4225: *
        !          4226: V$INT  DBC  SVFPR            INTEGER
        !          4227:        DAC  7
        !          4228:        DTC  /INTEGER/
        !          4229:        DAC  S$INT
        !          4230:        DAC  1
        !          4231: *
        !          4232: V$NRT  DBC  SVLBL            NRETURN
        !          4233:        DAC  7
        !          4234:        DTC  /NRETURN/
        !          4235:        DAC  L$NRT
        !          4236:        EJC
        !          4237: *
        !          4238: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          4239: .IF    .CNPF
        !          4240: .ELSE
        !          4241: *
        !          4242: V$PFL  DBC  SVKNM            PROFILE
        !          4243:        DAC  7
        !          4244:        DTC  /PROFILE/
        !          4245:        DAC  K$PFL
        !          4246: .FI
        !          4247: *
        !          4248: *
        !          4249: V$RPL  DBC  SVFNP            REPLACE
        !          4250:        DAC  7
        !          4251:        DTC  /REPLACE/
        !          4252:        DAC  S$RPL
        !          4253:        DAC  3
        !          4254: *
        !          4255: V$RVS  DBC  SVFNP            REVERSE
        !          4256:        DAC  7
        !          4257:        DTC  /REVERSE/
        !          4258:        DAC  S$RVS
        !          4259:        DAC  1
        !          4260: *
        !          4261: V$RTN  DBC  SVKNM            RTNTYPE
        !          4262:        DAC  7
        !          4263:        DTC  /RTNTYPE/
        !          4264:        DAC  K$RTN
        !          4265: *
        !          4266: V$STX  DBC  SVFNN            SETEXIT
        !          4267:        DAC  7
        !          4268:        DTC  /SETEXIT/
        !          4269:        DAC  S$STX
        !          4270:        DAC  1
        !          4271: *
        !          4272: V$STC  DBC  SVKNM            STCOUNT
        !          4273:        DAC  7
        !          4274:        DTC  /STCOUNT/
        !          4275:        DAC  K$STC
        !          4276: *
        !          4277: V$STL  DBC  SVKNM            STLIMIT
        !          4278:        DAC  7
        !          4279:        DTC  /STLIMIT/
        !          4280:        DAC  K$STL
        !          4281: *
        !          4282: V$SUC  DBC  SVKVC            SUCCEED
        !          4283:        DAC  7
        !          4284:        DTC  /SUCCEED/
        !          4285:        DAC  K$SUC
        !          4286:        DAC  NDSUC
        !          4287: *
        !          4288: V$VDF  DBC  SVFPR            VDIFFER
        !          4289:        DAC  7
        !          4290:        DTC  /VDIFFER/
        !          4291:        DAC  S$VDF
        !          4292:        DAC  2
        !          4293: *
        !          4294: V$ALP  DBC  SVKWC            ALPHABET
        !          4295:        DAC  8
        !          4296:        DTC  /ALPHABET/
        !          4297:        DAC  K$ALP
        !          4298:        EJC
        !          4299: *
        !          4300: *      STANDARD VARIABLE BLOCKS (CONTINUED)
        !          4301: *
        !          4302: V$CNT  DBC  SVLBL            CONTINUE
        !          4303:        DAC  8
        !          4304:        DTC  /CONTINUE/
        !          4305:        DAC  L$CNT
        !          4306: *
        !          4307: V$DTP  DBC  SVFNP            DATATYPE
        !          4308:        DAC  8
        !          4309:        DTC  /DATATYPE/
        !          4310:        DAC  S$DTP
        !          4311:        DAC  1
        !          4312: *
        !          4313: V$ERL  DBC  SVKNM            ERRLIMIT
        !          4314:        DAC  8
        !          4315:        DTC  /ERRLIMIT/
        !          4316:        DAC  K$ERL
        !          4317: *
        !          4318: V$FNC  DBC  SVKNM            FNCLEVEL
        !          4319:        DAC  8
        !          4320:        DTC  /FNCLEVEL/
        !          4321:        DAC  K$FNC
        !          4322: *
        !          4323: V$MXL  DBC  SVKNM            MAXLNGTH
        !          4324:        DAC  8
        !          4325:        DTC  /MAXLNGTH/
        !          4326:        DAC  K$MXL
        !          4327: *
        !          4328: V$TER  DBC  0                TERMINAL
        !          4329:        DAC  8
        !          4330:        DTC  /TERMINAL/
        !          4331:        DAC  0
        !          4332: *
        !          4333: V$PRO  DBC  SVFNN            PROTOTYPE
        !          4334:        DAC  9
        !          4335:        DTC  /PROTOTYPE/
        !          4336:        DAC  S$PRO
        !          4337:        DAC  1
        !          4338: *
        !          4339:        DBC  0                DUMMY ENTRY TO END LIST
        !          4340:        DAC  10               LENGTH GT 9 (PROTOTYPE)
        !          4341:        EJC
        !          4342: *
        !          4343: *      LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
        !          4344: *      LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
        !          4345: *
        !          4346: VDMKW  DAC  V$ANC            ANCHOR
        !          4347:        DAC  V$COD            CODE
        !          4348:        DAC  V$DMP            DUMP
        !          4349:        DAC  V$ERL            ERRLIMIT
        !          4350:        DAC  V$ETX            ERRTEXT
        !          4351:        DAC  V$ERT            ERRTYPE
        !          4352:        DAC  V$FNC            FNCLEVEL
        !          4353:        DAC  V$FTR            FTRACE
        !          4354:        DAC  V$INP            INPUT
        !          4355:        DAC  V$LST            LASTNO
        !          4356:        DAC  V$MXL            MAXLENGTH
        !          4357:        DAC  V$OUP            OUTPUT
        !          4358: .IF    .CNPF
        !          4359: .ELSE
        !          4360:        DAC  V$PFL            PROFILE
        !          4361: .FI
        !          4362:        DAC  V$RTN            RTNTYPE
        !          4363:        DAC  V$STC            STCOUNT
        !          4364:        DAC  V$STL            STLIMIT
        !          4365:        DAC  V$STN            STNO
        !          4366:        DAC  V$TRA            TRACE
        !          4367:        DAC  V$TRM            TRIM
        !          4368:        DAC  0                END OF LIST
        !          4369: *
        !          4370: *      TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
        !          4371: *
        !          4372: VSRCH  DAC  0                DUMMY ENTRY TO GET PROPER INDEXING
        !          4373:        DAC  V$EQF            START OF 1 CHAR VARIABLES (NONE)
        !          4374:        DAC  V$EQF            START OF 2 CHAR VARIABLES
        !          4375:        DAC  V$ANY            START OF 3 CHAR VARIABLES
        !          4376:        DAC  V$COD            START OF 4 CHAR VARIABLES
        !          4377:        DAC  V$ABO            START OF 5 CHAR VARIABLES
        !          4378:        DAC  V$ANC            START OF 6 CHAR VARIABLES
        !          4379:        DAC  V$COL            START OF 7 CHAR VARIABLES
        !          4380:        DAC  V$ALP            START OF 8 CHAR VARIABLES
        !          4381:        DAC  V$PRO            START OF 9 CHAR VARIABLES
        !          4382:        TTL  S P I T B O L -- WORKING STORAGE SECTION
        !          4383: *
        !          4384: *      THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
        !          4385: *      CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
        !          4386: *      ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
        !          4387: *
        !          4388: *      ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
        !          4389: *      DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
        !          4390: *      ALLOCATED DATA AREAS.
        !          4391: *
        !          4392: *      THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
        !          4393: *      AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
        !          4394: *      EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
        !          4395: *      ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
        !          4396: *      LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
        !          4397: *      CALL TO ANOTHER.
        !          4398: *
        !          4399: *      A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
        !          4400: *      TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
        !          4401: *      SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
        !          4402: *      CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
        !          4403: *      INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
        !          4404: *
        !          4405: *      THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
        !          4406: *      (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
        !          4407: *      ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
        !          4408: *      ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
        !          4409: *
        !          4410: *      UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
        !          4411: *      DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
        !          4412: *
        !          4413:        SEC                   START OF WORKING STORAGE SECTION
        !          4414:        EJC
        !          4415: *
        !          4416: *      THIS AREA IS NOT CLEARED BY INITIAL CODE
        !          4417: *
        !          4418: CMLAB  DAC  B$SCL            STRING USED TO CHECK LABEL LEGALITY
        !          4419:        DAC  2
        !          4420:        DTC  /  /
        !          4421: *
        !          4422: *      LABEL TO MARK START OF WORK AREA WHICH IS CLEARED
        !          4423: *
        !          4424: AAAAA  DAC  0
        !          4425: *
        !          4426: *      WORK AREAS FOR ALLOC PROCEDURE
        !          4427: *
        !          4428: ALDYN  DAC  0                AMOUNT OF DYNAMIC STORE
        !          4429: ALFSF  DIC  +0               FACTOR IN FREE STORE PCNTAGE CHECK
        !          4430: ALLIA  DIC  +0               DUMP IA
        !          4431: ALLSV  DAC  0                SAVE WB IN ALLOC
        !          4432: *
        !          4433: *      WORK AREAS FOR ALOST PROCEDURE
        !          4434: *
        !          4435: ALSTA  DAC  0                SAVE WA IN ALOST
        !          4436: *
        !          4437: *      SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
        !          4438: *
        !          4439: ARCDM  DAC  0                COUNT DIMENSIONS
        !          4440: ARNEL  DIC  +0               COUNT ELEMENTS
        !          4441: ARPTR  DAC  0                OFFSET PTR INTO ARBLK
        !          4442: ARSVL  DIC  +0               SAVE INTEGER LOW BOUND
        !          4443:        EJC
        !          4444: *      WORK AREAS FOR ARREF ROUTINE
        !          4445: *
        !          4446: ARFSI  DIC  +0               SAVE CURRENT EVOLVING SUBSCRIPT
        !          4447: ARFXS  DAC  0                SAVE BASE STACK POINTER
        !          4448: *
        !          4449: *      WORK AREAS FOR B$EFC BLOCK ROUTINE
        !          4450: *
        !          4451: BEFOF  DAC  0                SAVE OFFSET PTR INTO EFBLK
        !          4452: *
        !          4453: *      WORK AREAS FOR B$PFC BLOCK ROUTINE
        !          4454: *
        !          4455: BPFPF  DAC  0                SAVE PFBLK POINTER
        !          4456: BPFSV  DAC  0                SAVE OLD FUNCTION VALUE
        !          4457: BPFXT  DAC  0                POINTER TO STACKED ARGUMENTS
        !          4458: *
        !          4459: *      SAVE AREAS FOR COLLECT FUNCTION (S$COL)
        !          4460: *
        !          4461: CLSVI  DIC  +0               SAVE INTEGER ARGUMENT
        !          4462: *
        !          4463: *      GLOBAL VALUES FOR CMPIL PROCEDURE
        !          4464: *
        !          4465: CMERC  DAC  0                COUNT OF INITIAL COMPILE ERRORS
        !          4466: CMPXS  DAC  0                SAVE STACK PTR IN CASE OF ERRORS
        !          4467: CMPSN  DAC  1                NUMBER OF NEXT STATEMENT TO COMPILE
        !          4468: CMPSS  DAC  0                SAVE SUBROUTINE STACK PTR
        !          4469: *
        !          4470: *      WORK AREA FOR CNCRD
        !          4471: *
        !          4472: CNSCC  DAC  0                POINTER TO CONTROL CARD STRING
        !          4473: CNSWC  DAC  0                WORD COUNT
        !          4474: CNR$T  DAC  0                POINTER TO R$TTL OR R$STL
        !          4475: CNTTL  DAC  0                FLAG FOR -TITLE, -STITL
        !          4476: *
        !          4477: *      WORK AREAS FOR CONVERT FUNCTION (S$CNV)
        !          4478: *
        !          4479: CNVTP  DAC  0                SAVE PTR INTO SCVTB
        !          4480: *
        !          4481: *      FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
        !          4482: *
        !          4483: CPSTS  DAC  0                SUPPRESS COMP. STATS IF NON ZERO
        !          4484: *
        !          4485: *      GLOBAL VALUES FOR CONTROL CARD SWITCHES
        !          4486: *
        !          4487: .IF    .CASL
        !          4488: CSWCI  DAC  0                0/1 FOR -NOCASEIG/CASEIG
        !          4489: .FI
        !          4490: CSWFL  DAC  1                0/1 FOR -NOFAIL/-FAIL
        !          4491: CSWIN  DAC  INILN            XXX FOR -INXXX
        !          4492: CSWLS  DAC  1                0/1 FOR -NOLIST/-LIST
        !          4493:        EJC
        !          4494: *
        !          4495: *      GLOBAL LOCATION USED BY PATST PROCEDURE
        !          4496: *
        !          4497: CTMSK  DBC  0                LAST BIT POSITION USED IN R$CTP
        !          4498: CURID  DAC  0                CURRENT ID VALUE
        !          4499: *
        !          4500: *      GLOBAL VALUE FOR CDWRD PROCEDURE
        !          4501: *
        !          4502: CWCOF  DAC  0                NEXT WORD OFFSET IN CURRENT CCBLK
        !          4503: *
        !          4504: *      WORK AREAS FOR DATA FUNCTION (S$DAT)
        !          4505: *
        !          4506: DATDV  DAC  0                SAVE VRBLK PTR FOR DATATYPE NAME
        !          4507: DATXS  DAC  0                SAVE INITIAL STACK POINTER
        !          4508: *
        !          4509: *      WORK AREAS FOR DEFINE FUNCTION (S$DEF)
        !          4510: *
        !          4511: DEFLB  DAC  0                SAVE VRBLK PTR FOR LABEL
        !          4512: DEFNA  DAC  0                COUNT FUNCTION ARGUMENTS
        !          4513: DEFVR  DAC  0                SAVE VRBLK PTR FOR FUNCTION NAME
        !          4514: DEFXS  DAC  0                SAVE INITIAL STACK POINTER
        !          4515: *
        !          4516: *      WORK AREAS FOR DUMPR PROCEDURE
        !          4517: *
        !          4518: DMARG  DAC  0                DUMP ARGUMENT
        !          4519: DMPKB  DAC  B$KVT            DUMMY KVBLK FOR USE IN DUMPR
        !          4520: DMPKT  DAC  TRBKV            KVVAR TRBLK POINTER
        !          4521: DMPKN  DAC  0                KEYWORD NUMBER (MUST FOLLOW DMPKB)
        !          4522: DMPSA  DAC  0                PRESERVE WA OVER PRTVL CALL
        !          4523: DMPSV  DAC  0                GENERAL SCRATCH SAVE
        !          4524: DMVCH  DAC  0                CHAIN POINTER FOR VARIABLE BLOCKS
        !          4525: DMPCH  DAC  0                SAVE SORTED VRBLK CHAIN POINTER
        !          4526: *
        !          4527: *      GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
        !          4528: *
        !          4529: DNAMB  DAC  0                START OF DYNAMIC AREA
        !          4530: DNAMP  DAC  0                NEXT AVAILABLE LOC IN DYNAMIC AREA
        !          4531: DNAME  DAC  0                END OF AVAILABLE DYNAMIC AREA
        !          4532: *
        !          4533: *      WORK AREAS FOR DUPL FUNCTION (S$DUP)
        !          4534: *
        !          4535: DUPSI  DIC  +0               STORE INTEGER STRING LENGTH
        !          4536: *
        !          4537: *      WORK AREA FOR ENDFILE (S$ENF)
        !          4538: *
        !          4539: ENFCH  DAC  0                FOR IOCHN CHAIN HEAD
        !          4540: *
        !          4541: *      WORK AREA FOR ERROR PROCESSING.
        !          4542: *
        !          4543: EROSN  DAC  0                FLAG FOR SPECIAL EROSI RETURN
        !          4544: ERRFT  DAC  0                FATAL ERROR FLAG
        !          4545: ERRSP  DAC  0                ERROR SUPPRESSION FLAG
        !          4546:        EJC
        !          4547: *
        !          4548: *      DUMP AREA FOR ERTEX
        !          4549: *
        !          4550: ERTWA  DAC  0                SAVE WA
        !          4551: ERTWB  DAC  0                SAVE WB
        !          4552: *
        !          4553: *      GLOBAL VALUES FOR EVALI
        !          4554: *
        !          4555: EVLIN  DAC  P$LEN            DUMMY PATTERN BLOCK PCODE
        !          4556: EVLIS  DAC  0                POINTER TO SUBSEQUENT NODE
        !          4557: EVLIV  DAC  0                VALUE OF PARAMETER
        !          4558: *
        !          4559: *      WORK AREA FOR EXPAN
        !          4560: *
        !          4561: EXPSV  DAC  0                SAVE OP DOPE VECTOR POINTER
        !          4562: *
        !          4563: *      FLAG FOR SUPPRESSION OF EXECUTION STATS
        !          4564: *
        !          4565: EXSTS  DAC  0                SUPPRESS EXEC STATS IF SET
        !          4566: *
        !          4567: *      GLOBAL VALUES FOR EXFAL AND RETURN
        !          4568: *
        !          4569: FLPRT  DAC  0                LOCATION OF FAIL OFFSET FOR RETURN
        !          4570: FLPTR  DAC  0                LOCATION OF FAILURE OFFSET ON STACK
        !          4571: *
        !          4572: *      WORK AREAS FOR GBCOL PROCEDURE
        !          4573: *
        !          4574: GBCFL  DAC  0                GARBAGE COLLECTOR ACTIVE FLAG
        !          4575: GBCLM  DAC  0                POINTER TO LAST MOVE BLOCK (PASS 3)
        !          4576: GBCNM  DAC  0                DUMMY FIRST MOVE BLOCK
        !          4577: GBCNS  DAC  0                REST OF DUMMY BLOCK (FOLLOWS GBCNM)
        !          4578: GBSVA  DAC  0                SAVE WA
        !          4579: GBSVB  DAC  0                SAVE WB
        !          4580: GBSVC  DAC  0                SAVE WC
        !          4581: *
        !          4582: *      GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
        !          4583: *
        !          4584: GBCNT  DAC  0                COUNT OF GARBAGE COLLECTIONS
        !          4585: *
        !          4586: *      WORK AREAS FOR GTNVR PROCEDURE
        !          4587: *
        !          4588: GNVHE  DAC  0                PTR TO END OF HASH CHAIN
        !          4589: GNVNW  DAC  0                NUMBER OF WORDS IN STRING NAME
        !          4590: GNVSA  DAC  0                SAVE WA
        !          4591: GNVSB  DAC  0                SAVE WB
        !          4592: GNVSP  DAC  0                POINTER INTO VSRCH TABLE
        !          4593: GNVST  DAC  0                POINTER TO CHARS OF STRING
        !          4594: *
        !          4595: *      GLOBAL VALUE FOR GTCOD AND GTEXP
        !          4596: *
        !          4597: GTCEF  DAC  0                SAVE FAIL PTR IN CASE OF ERROR
        !          4598: *
        !          4599: *      WORK AREAS FOR GTINT
        !          4600: *
        !          4601: GTINA  DAC  0                SAVE WA
        !          4602: GTINB  DAC  0                SAVE WB
        !          4603:        EJC
        !          4604: *
        !          4605: *      WORK AREAS FOR GTNUM PROCEDURE
        !          4606: *
        !          4607: GTNNF  DAC  0                ZERO/NONZERO FOR RESULT +/-
        !          4608: GTNSI  DIC  +0               GENERAL INTEGER SAVE
        !          4609: .IF    .CNRA
        !          4610: .ELSE
        !          4611: GTNDF  DAC  0                0/1 FOR DEC POINT SO FAR NO/YES
        !          4612: GTNES  DAC  0                ZERO/NONZERO EXPONENT +/-
        !          4613: GTNEX  DIC  +0               REAL EXPONENT
        !          4614: GTNSC  DAC  0                SCALE (PLACES AFTER POINT)
        !          4615: GTNSR  DRC  +0.0             GENERAL REAL SAVE
        !          4616: GTNSV  DIC  +0               SAVE IA
        !          4617: GTNRD  DAC  0                FLAG FOR OK REAL NUMBER
        !          4618: .FI
        !          4619: *
        !          4620: *      WORK AREAS FOR GTPAT PROCEDURE
        !          4621: *
        !          4622: GTPSB  DAC  0                SAVE WB
        !          4623: *
        !          4624: *      WORK AREAS FOR GTSTG PROCEDURE
        !          4625: *
        !          4626: GTSSF  DAC  0                0/1 FOR RESULT +/-
        !          4627: GTSVC  DAC  0                SAVE WC
        !          4628: GTSVB  DAC  0                SAVE WB
        !          4629: GTSWK  DAC  0                PTR TO WORK AREA FOR GTSTG
        !          4630: .IF    .CNRA
        !          4631: .ELSE
        !          4632: GTSES  DAC  0                CHAR + OR - FOR EXPONENT +/-
        !          4633: GTSRS  DRC  +0.0             GENERAL REAL SAVE
        !          4634: *
        !          4635: *      GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
        !          4636: *
        !          4637: GTSRN  DRC  +0.0             ROUNDING FACTOR 0.5*10**-CFP$S
        !          4638: GTSSC  DRC  +0.0             SCALING VALUE 10**CFP$S
        !          4639: .FI
        !          4640:        EJC
        !          4641: *
        !          4642: *      WORK AREAS FOR GTVAR PROCEDURE
        !          4643: *
        !          4644: GTVRC  DAC  0                SAVE WC
        !          4645: *
        !          4646: *      FLAGS FOR HEADER PRINTING
        !          4647: *
        !          4648: HEADN  DAC  0                NON-ZERO IF HDRS NOT TO BE PRINTED
        !          4649: HEADP  DAC  0                HEADER PRINTED FLAG
        !          4650: *
        !          4651: *      GLOBAL VALUES FOR VARIABLE HASH TABLE
        !          4652: *
        !          4653: HSHNB  DIC  +0               NUMBER OF HASH BUCKETS
        !          4654: HSHTB  DAC  0                POINTER TO START OF VRBLK HASH TABL
        !          4655: HSHTE  DAC  0                POINTER PAST END OF VRBLK HASH TABL
        !          4656: *
        !          4657: *      WORK AREA FOR INIT
        !          4658: *
        !          4659: INICD  DIC  +0               CODE KWD VAL (NEEDED FOR BATCH)
        !          4660: INISS  DAC  0                SAVE SUBROUTINE STACK PTR
        !          4661: INITR  DAC  0                SAVE TERMINAL FLAG
        !          4662: .IF    .CNBF
        !          4663: .ELSE
        !          4664: *
        !          4665: *      SAVE AREA FOR INSBF
        !          4666: *
        !          4667: INSAB  DAC  0                ENTRY WA PLUS ENTRY WB
        !          4668: INSBB  DAC  0                BFBLK POINTER
        !          4669: INSBC  DAC  0                BCBLK POINTER
        !          4670: INSSA  DAC  0                SAVE ENTRY WA
        !          4671: INSSB  DAC  0                SAVE ENTRY WB
        !          4672: .FI
        !          4673: *
        !          4674: *      WORK AREAS FOR IOPUT
        !          4675: *
        !          4676: IOPNF  DAC  0                NAME OFFSET
        !          4677: IOPVR  DAC  0                FILETAG VRBLK
        !          4678: IOPWA  DAC  0                KEEP WA
        !          4679: IOPWB  DAC  0                KEEP WB
        !          4680: IOPWC  DAC  0                KEEP WC
        !          4681:        EJC
        !          4682: *
        !          4683: *      GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
        !          4684: *      WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
        !          4685: *      FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
        !          4686: *
        !          4687: KVANC  DAC  0                ANCHOR
        !          4688: KVDMP  DAC  0                DUMP
        !          4689: KVERL  DAC  0                ERRLIMIT
        !          4690: KVERT  DAC  0                ERRTYPE
        !          4691: KVFTR  DAC  0                FTRACE
        !          4692: KVINP  DAC  1                INPUT
        !          4693: KVMXL  DAC  5000             MAXLENGTH
        !          4694: KVOUP  DAC  1                OUTPUT
        !          4695: .IF    .CNPF
        !          4696: .ELSE
        !          4697: KVPFL  DAC  0                PROFILE
        !          4698: .FI
        !          4699: KVTRA  DAC  0                TRACE
        !          4700: KVTRM  DAC  0                TRIM
        !          4701: KVFNC  DAC  0                FNCLEVEL
        !          4702: KVLST  DAC  0                LASTNO
        !          4703: KVSTN  DAC  0                STNO
        !          4704: *
        !          4705: *      GLOBAL VALUES FOR OTHER KEYWORDS
        !          4706: *
        !          4707: KVALP  DAC  0                ALPHABET
        !          4708: KVRTN  DAC  NULLS            RTNTYPE (SCBLK POINTER)
        !          4709: KVCOD  DIC  0                CODE
        !          4710: .IF    .CS16
        !          4711: KVSTL  DIC  +32767           STLIMIT
        !          4712: KVSTC  DIC  +32767           STCOUNT (COUNTS DOWN FROM STLIMIT)
        !          4713: .ELSE
        !          4714: KVSTL  DIC  +50000           STLIMIT
        !          4715: KVSTC  DIC  +50000           STCOUNT (COUNTS DOWN FROM STLIMIT)
        !          4716: .FI
        !          4717: .IF    .CNLD
        !          4718: .ELSE
        !          4719: *
        !          4720: *      WORK AREAS FOR LOAD FUNCTION
        !          4721: *
        !          4722: LODFN  DAC  0                POINTER TO VRBLK FOR FUNC NAME
        !          4723: LODNA  DAC  0                COUNT NUMBER OF ARGUMENTS
        !          4724: .FI
        !          4725:        EJC
        !          4726: *
        !          4727: *      GLOBAL VALUES FOR LISTR PROCEDURE
        !          4728: *
        !          4729: LSTLC  DAC  0                COUNT LINES ON SOURCE LIST PAGE
        !          4730: LSTNP  DAC  0                MAX NUMBER OF LINES ON PAGE
        !          4731: LSTPF  DAC  1                SET NONZERO IF CURRENT IMAGE LISTED
        !          4732: LSTPG  DAC  0                CURRENT SOURCE LIST PAGE NUMBER
        !          4733: LSTPO  DAC  0                OFFSET TO   PAGE NNN   MESSAGE
        !          4734: LSTSN  DAC  0                REMEMBER LAST STMNUM LISTED
        !          4735: *
        !          4736: *      MAXIMUM SIZE OF SPITBOL OBJECTS
        !          4737: *
        !          4738: MXLEN  DAC  0                INITIALISED BY SYSMX CALL
        !          4739: *
        !          4740: *      EXECUTION CONTROL VARIABLE
        !          4741: *
        !          4742: NOXEQ  DAC  0                SET NON-ZERO TO INHIBIT EXECUTION
        !          4743: .IF    .CNPF
        !          4744: .ELSE
        !          4745: *
        !          4746: *      PROFILER GLOBAL VALUES AND WORK LOCATIONS
        !          4747: *
        !          4748: PFDMP  DAC  0                SET NON-0 IF PROFILE SET NON-0
        !          4749: PFFNC  DAC  0                SET NON-0 IF FUNCT JUST ENTERED
        !          4750: PFSTM  DIC  +0               TO STORE STARTING TIME OF STMT
        !          4751: PFETM  DIC  +0               TO STORE ENDING TIME OF STMT
        !          4752: PFSVW  DAC  0                TO SAVE A W-REG
        !          4753: PFTBL  DAC  0                GETS ADRS OF (IMAG) TABLE BASE
        !          4754: PFNTE  DAC  0                NR OF TABLE ENTRIES
        !          4755: PFSTE  DIC  +0               TABLE ENTRY SIZE IN BAUS
        !          4756: .FI
        !          4757:        EJC
        !          4758: *
        !          4759: *      GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
        !          4760: *
        !          4761: PMDFL  DAC  0                PATTERN ASSIGNMENT FLAG
        !          4762: PMHBS  DAC  0                HISTORY STACK BASE POINTER
        !          4763: PMSSL  DAC  0                LENGTH OF SUBJECT STRING IN CHARS
        !          4764: *
        !          4765: *      GLOBAL VALUE FOR PRTNM PROCEDURE
        !          4766: *
        !          4767: PRNMV  DAC  0                VRBLK PTR FROM LAST NAME SEARCH
        !          4768: *
        !          4769: *      WORK AREAS FOR PRTNM PROCEDURE
        !          4770: *
        !          4771: PRNSI  DIC  +0               SCRATCH INTEGER LOC
        !          4772: *
        !          4773: *      WORK AREAS FOR PRTSN PROCEDURE
        !          4774: *
        !          4775: PRSNA  DAC  0                SAVE WA
        !          4776: *
        !          4777: *      GLOBAL VALUES FOR PRINT PROCEDURES
        !          4778: *
        !          4779: PRAVL  DAC  0                SET IF PRINT FILE AVAILABLE
        !          4780: PRBLK  DAC  0                ADDRESS OF BUFFER BLANKING STRING
        !          4781: PRBUF  DAC  0                PTR TO PRINT BFR IN STATIC
        !          4782: PRCHS  DAC  0                ADDRESS OF CHARS IN PRINT BUFFER
        !          4783: PRCMV  DAC  0                NO. OF BAUS TO MOVE IN BFR CLEARING
        !          4784: PRECL  DAC  0                EXTENDED/COMPACT LISTING FLAG
        !          4785: PRLEN  DAC  0                LENGTH OF PRINT BUFFER IN CHARS
        !          4786: PROFS  DAC  0                OFFSET TO NEXT LOCATION IN PRBUF
        !          4787: PRPUT  DAC  0                SET IF CHARS TO BE PUT IN BFR
        !          4788: PRSTD  DAC  0                TESTED BY PRTPG
        !          4789: PRSTO  DAC  0                STANDARD LISTING OPTION FLAG
        !          4790: PRTEF  DAC  0                ENDFILE FLAG
        !          4791: *
        !          4792: *      WORK AREAS FOR PRTST, PTTST PROCEDURES
        !          4793: *
        !          4794: PRSVA  DAC  0                SAVE WA
        !          4795: PRSVB  DAC  0                SAVE WB
        !          4796: PRTVA  DAC  0                SAVE WA
        !          4797: PRTVB  DAC  0                SAVE WB
        !          4798: *
        !          4799: *      WORK AREA FOR PRTVL
        !          4800: *
        !          4801: PRVSI  DAC  0                SAVE IDVAL
        !          4802: *
        !          4803: *      WORK AREAS FOR PATTERN MATCH ROUTINES
        !          4804: *
        !          4805: PSAVE  DAC  0                TEMPORARY SAVE FOR CURRENT NODE PTR
        !          4806: PSAVC  DAC  0                SAVE CURSOR IN P$SPN, P$STR
        !          4807:        EJC
        !          4808: *
        !          4809: *      FLAG TO TELL ERROR THAT WE ARE READING SOURCE LINE
        !          4810: *
        !          4811: RDRER  DAC  0                READ-SOURCE-LINE IN PROGRESS FLAG
        !          4812: *
        !          4813: *      AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
        !          4814: *
        !          4815: RSMEM  DAC  0                RESERVE MEMORY
        !          4816: *
        !          4817: *      WORK AREAS FOR RETRN ROUTINE
        !          4818: *
        !          4819: RTNBP  DAC  0                TO SAVE A BLOCK POINTER
        !          4820: RTNFV  DAC  0                NEW FUNCTION VALUE (RESULT)
        !          4821: RTNSV  DAC  0                OLD FUNCTION VALUE (SAVED VALUE)
        !          4822: *
        !          4823: *      RELOCATABLE GLOBAL VALUES
        !          4824: *
        !          4825: *      ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
        !          4826: *      THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
        !          4827: *      GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
        !          4828: *
        !          4829: R$AAA  DAC  0                START OF RELOCATABLE VALUES
        !          4830: R$ARF  DAC  0                ARRAY BLOCK POINTER FOR ARREF
        !          4831: R$CCB  DAC  0                PTR TO CCBLK BEING BUILT (CDWRD)
        !          4832: R$CIM  DAC  0                PTR TO CURRENT COMPILER INPUT STR
        !          4833: R$CMP  DAC  0                COPY OF R$CIM USED IN CMPIL
        !          4834: R$CNI  DAC  0                PTR TO NEXT COMPILER INPUT STRING
        !          4835: R$CNT  DAC  0                CDBLK POINTER FOR SETEXIT CONTINUE
        !          4836: R$COD  DAC  0                POINTER TO CURRENT CDBLK OR EXBLK
        !          4837: R$COP  DAC  0                PTR TO -COPY CHAIN STACK
        !          4838: R$CTP  DAC  0                PTR TO CURRENT CTBLK FOR PATST
        !          4839: R$ERT  DAC  0                TRBLK POINTER FOR ERRTYPE TRACE
        !          4840: R$ETX  DAC  NULLS            POINTER TO ERRTEXT STRING
        !          4841: R$EXS  DAC  0                = SAVE XL IN EXPDM
        !          4842: R$FNC  DAC  0                TRBLK POINTER FOR FNCLEVEL TRACE
        !          4843: R$GTC  DAC  0                KEEP CODE PTR FOR GTCOD,GTEXP
        !          4844: R$IO1  DAC  0                FIRST ARGUMENT
        !          4845: R$IOL  DAC  0                SECOND ARGUMENT (FILETAG) SCBLK PTR
        !          4846: R$IOR  DAC  0                FILEPROPS SCBLK PTR
        !          4847: R$IOT  DAC  0                TRTIO TRACE BLK PTR
        !          4848: .IF    .CNBF
        !          4849: .ELSE
        !          4850: R$PMB  DAC  0                BUFFER PTR IN PATTERN MATCH
        !          4851: .FI
        !          4852: R$PMS  DAC  0                SUBJECT STRING PTR IN PATTERN MATCH
        !          4853: R$RA2  DAC  0                REPLACE SECOND ARGUMENT LAST TIME
        !          4854: R$RA3  DAC  0                REPLACE THIRD ARGUMENT LAST TIME
        !          4855: R$RPT  DAC  0                PTR TO CTBLK REPLACE TABLE LAST USD
        !          4856: R$SCP  DAC  0                SAVE POINTER FROM LAST SCANE CALL
        !          4857: R$SXL  DAC  0                PRESERVE XL IN SORTC
        !          4858: R$SXR  DAC  0                PRESERVE XR IN SORTA/SORTC
        !          4859: R$STC  DAC  0                TRBLK POINTER FOR STCOUNT TRACE
        !          4860: R$STL  DAC  0                SOURCE LISTING SUB-TITLE
        !          4861: R$SXC  DAC  0                CODE (CDBLK) PTR FOR SETEXIT TRAP
        !          4862: R$TTL  DAC  NULLS            SOURCE LISTING TITLE
        !          4863: R$XSC  DAC  0                STRING POINTER FOR XSCAN
        !          4864:        EJC
        !          4865: *
        !          4866: *      THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
        !          4867: *      TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
        !          4868: *
        !          4869: R$UBA  DAC  STNDO            BINARY AT
        !          4870: R$UBM  DAC  STNDO            BINARY AMPERSAND
        !          4871: R$UBN  DAC  STNDO            BINARY NUMBER SIGN
        !          4872: R$UBP  DAC  STNDO            BINARY PERCENT
        !          4873: R$UBT  DAC  STNDO            BINARY NOT
        !          4874: R$UUB  DAC  STNDO            UNARY VERTICAL BAR
        !          4875: R$UUE  DAC  STNDO            UNARY EQUAL
        !          4876: R$UUN  DAC  STNDO            UNARY NUMBER SIGN
        !          4877: R$UUP  DAC  STNDO            UNARY PERCENT
        !          4878: R$UUS  DAC  STNDO            UNARY SLASH
        !          4879: R$UUX  DAC  STNDO            UNARY EXCLAMATION
        !          4880: R$YYY  DAC  0                LAST RELOCATABLE LOCATION
        !          4881: *
        !          4882: *      WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
        !          4883: *
        !          4884: SBSSV  DAC  0                SAVE THIRD ARGUMENT
        !          4885: *
        !          4886: *      GLOBAL LOCATIONS USED IN SCAN PROCEDURE
        !          4887: *
        !          4888: SCNBL  DAC  0                SET NON-ZERO IF SCANNED PAST BLANKS
        !          4889: SCNCC  DAC  0                NON-ZERO TO SCAN CONTROL CARD NAME
        !          4890: SCNGO  DAC  0                SET NON-ZERO TO SCAN GOTO FIELD
        !          4891: SCNIL  DAC  0                LENGTH OF CURRENT INPUT IMAGE
        !          4892: SCNPT  DAC  0                POINTER TO NEXT LOCATION IN R$CIM
        !          4893: SCNRS  DAC  0                SET NON-ZERO TO SIGNAL RESCAN
        !          4894: SCNTP  DAC  0                SAVE SYNTAX TYPE FROM LAST CALL
        !          4895: *
        !          4896: *      WORK AREAS FOR SCAN PROCEDURE
        !          4897: *
        !          4898: SCNSA  DAC  0                SAVE WA
        !          4899: SCNSB  DAC  0                SAVE WB
        !          4900: SCNSC  DAC  0                SAVE WC
        !          4901: SCNSE  DAC  0                START OF CURRENT ELEMENT
        !          4902: SCNOF  DAC  0                SAVE OFFSET
        !          4903: *
        !          4904: *      WORK AREA FOR DETACH PROCEDURE
        !          4905: *
        !          4906: SDETF  DAC  0                TRACE BLOCK FLAG
        !          4907: *
        !          4908: *      WORK AREA FOR ENDFILE PROCEDURE
        !          4909: *
        !          4910: SENFR  DAC  0                SAVE XR
        !          4911: .IF    .CNSR
        !          4912: .ELSE
        !          4913:        EJC
        !          4914: *
        !          4915: *      WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
        !          4916: *
        !          4917: SRTDF  DAC  0                DATATYPE FIELD NAME
        !          4918: SRTFD  DAC  0                FOUND DFBLK ADDRESS
        !          4919: SRTFF  DAC  0                FOUND FIELD NAME
        !          4920: SRTFO  DAC  0                OFFSET TO FIELD NAME
        !          4921: SRTNR  DAC  0                NUMBER OF ROWS
        !          4922: SRTOF  DAC  0                OFFSET WITHIN ROW TO SORT KEY
        !          4923: SRTRT  DAC  0                ROOT OFFSET
        !          4924: SRTS1  DAC  0                SAVE OFFSET 1
        !          4925: SRTS2  DAC  0                SAVE OFFSET 2
        !          4926: SRTSC  DAC  0                SAVE WC
        !          4927: SRTSF  DAC  0                SORT ARRAY FIRST ROW OFFSET
        !          4928: SRTSN  DAC  0                SAVE N
        !          4929: SRTSO  DAC  0                OFFSET TO A(0)
        !          4930: SRTSR  DAC  0                0 , NON-ZERO FOR SORT, RSORT
        !          4931: SRTST  DAC  0                STRIDE FROM ONE ROW TO NEXT
        !          4932: SRTWC  DAC  0                DUMP WC
        !          4933: .FI
        !          4934: *
        !          4935: *      VALUES FOR INDICATING COMPILATION/EXECUTION STAGE
        !          4936: *
        !          4937: STAGE  DAC  0                INITIAL VALUE = INITIAL COMPILE
        !          4938: STAGX  DAC  0                NON-ZERO IF EXECUTING
        !          4939: *
        !          4940: *      GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
        !          4941: *
        !          4942: STATB  DAC  0                START OF STATIC AREA
        !          4943: STATE  DAC  0                END OF STATIC AREA
        !          4944:        EJC
        !          4945: *
        !          4946: *      GLOBAL STACK POINTER
        !          4947: *
        !          4948: STBAS  DAC  0                POINTER PAST STACK BASE
        !          4949: *
        !          4950: *      WORK AREAS FOR STOPR ROUTINE
        !          4951: *
        !          4952: STPSI  DIC  +0               SAVE VALUE OF STCOUNT
        !          4953: STPTI  DIC  +0               SAVE TIME ELAPSED
        !          4954: STPXR  DAC  0                SAVE XR
        !          4955: *
        !          4956: *      GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
        !          4957: *
        !          4958: STXOF  DAC  0                FAILURE OFFSET
        !          4959: STXVR  DAC  NULLS            VRBLK POINTER OR NULL
        !          4960: *
        !          4961: *      WORK AREAS FOR TFIND PROCEDURE
        !          4962: *
        !          4963: TFNSI  DIC  +0               NUMBER OF HEADERS
        !          4964: *
        !          4965: *      GLOBAL VALUE FOR TIME KEEPING
        !          4966: *
        !          4967: TIMSX  DIC  +0               TIME AT START OF EXECUTION
        !          4968: *
        !          4969: *      TERMINAL BUFFER ADDRESSES, FLAGS ETC
        !          4970: *
        !          4971: TTBLK  DAC  0                BLANKING STRING ADRS
        !          4972: TTBUF  DAC  0                BUFFER ADRS
        !          4973: TTCHS  DAC  0                START OF BUFFER CHARACTERS
        !          4974: TTCMV  DAC  0                COUNT OF BLANKING CHARS TO MOVE
        !          4975: TTERL  DAC  0                ERROR FLAG
        !          4976: TTINS  DAC  0                NON-ZERO IF STD INPUT FROM TERML
        !          4977: TTLEN  DAC  0                LENGTH OF TERMINAL BUFFER
        !          4978: TTLST  DAC  0                COPY STD O/P TO TERML IF SET
        !          4979: TTOFS  DAC  0                OFFSET TO POSITION IN TERML BFR
        !          4980: TTOUS  DAC  0                SET IF STD OUTPUT TO TERMINAL
        !          4981: *
        !          4982: *      WORK AREAS FOR XSCAN PROCEDURE
        !          4983: *
        !          4984: XSCBL  DAC  0                COUNT OF TRAILING BLANKS
        !          4985: XSCNB  DAC  0                NON-ZERO IF NON-BLANKS SEEN
        !          4986: XSCRT  DAC  0                SAVE RETURN CODE
        !          4987: XSCWB  DAC  0                SAVE REGISTER WB
        !          4988: *
        !          4989: *      GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
        !          4990: *
        !          4991: XSOFS  DAC  0                OFFSET TO CURRENT LOCATION IN R$XSC
        !          4992: *
        !          4993: *      LABEL TO MARK END OF WORK AREA
        !          4994: *
        !          4995: YYYYY  DAC  0
        !          4996:        TTL  S P I T B O L -- INITIALIZATION
        !          4997: *
        !          4998: *      INITIALISATION
        !          4999: *      THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
        !          5000: *      AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
        !          5001: *
        !          5002: *      (XS)                  POINTS PAST STACK BASE
        !          5003: *      (XR)                  POINTS TO FIRST WORD OF DATA AREA
        !          5004: *      (XL)                  POINTS TO LAST WORD OF DATA AREA
        !          5005: *      (WA)                  INITIAL &CODE VALUE
        !          5006: *
        !          5007:        SEC                   START OF PROGRAM SECTION
        !          5008: *
        !          5009: INITL  RTN                   INITIALISATION CODE
        !          5010:        MOV  WA,INICD         SAVE INITIAL CODE KYWD VALUE
        !          5011: .IF    .CNBT
        !          5012:        MOV  XR,STATB         START ADDRESS OF STATIC
        !          5013: .ELSE
        !          5014: *
        !          5015: *      INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
        !          5016: *
        !          5017:        MOV  XR,WB            PRESERVE XR
        !          5018:        MOV  =YYYYY,WA        POINT TO END OF WORK AREA
        !          5019:        SUB  =AAAAA,WA        GET LENGTH OF WORK AREA
        !          5020:        BTW  WA               CONVERT TO WORDS
        !          5021:        LCT  WA,WA            COUNT FOR LOOP
        !          5022:        MOV  =AAAAA,XR        SET UP INDEX REGISTER
        !          5023: *
        !          5024: *      CLEAR WORK SPACE
        !          5025: *
        !          5026: INI01  ZER  (XR)+            CLEAR A WORD
        !          5027:        BCT  WA,INI01         LOOP TILL DONE
        !          5028:        MOV  =STNDO,WA        UNDEFINED OPERATORS POINTER
        !          5029:        MOV  =R$YYY,WC        POINT TO TABLE END
        !          5030:        SUB  =R$UBA,WC        LENGTH OF UNDEF. OPERATORS TABLE
        !          5031:        BTW  WC               CONVERT TO WORDS
        !          5032:        LCT  WC,WC            LOOP COUNTER
        !          5033:        MOV  =R$UBA,XR        SET UP XR
        !          5034: *
        !          5035: *      SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
        !          5036: *
        !          5037: INI02  MOV  WA,(XR)+         STORE VALUE
        !          5038:        BCT  WC,INI02         LOOP TILL ALL DONE
        !          5039:        MOV  =NUM01,WA        GET A 1
        !          5040:        MOV  WA,CMPSN         STATEMENT NO
        !          5041:        MOV  WA,CSWFL         NOFAIL
        !          5042:        MOV  WA,CSWLS         LIST
        !          5043:        MOV  WA,KVINP         INPUT
        !          5044:        MOV  WA,KVOUP         OUTPUT
        !          5045:        MOV  WA,LSTPF         NOTHING FOR LISTR YET
        !          5046:        MOV  =INILN,WA        INPUT IMAGE LENGTH
        !          5047:        MOV  WA,CSWIN         STORE FOR LATER USE
        !          5048:        MOV  =B$KVT,DMPKB     DUMP
        !          5049:        MOV  =TRBKV,DMPKT     DUMP
        !          5050:        MOV  =P$LEN,EVLIN     EVAL
        !          5051:        EJC
        !          5052:        MOV  =NULLS,WA        GET NULLSTRING POINTER
        !          5053:        MOV  WA,KVRTN         RETURN
        !          5054:        MOV  WA,R$ETX         ERRTEXT
        !          5055:        MOV  WA,R$TTL         TITLE FOR LISTING
        !          5056:        MOV  WA,STXVR         SETEXIT
        !          5057:        LDI  STLIM            GET DEFAULT STLIMIT
        !          5058:        STI  KVSTL            STATEMENT LIMIT
        !          5059:        STI  KVSTC            STATEMENT COUNT
        !          5060:        MOV  WB,STATB         STORE START ADRS OF STATIC
        !          5061: .FI
        !          5062: .IF    .CSIG
        !          5063:        MNZ  CSWCI            -CASEIG
        !          5064: .FI
        !          5065:        JSR  SYSTM            INITIALISE TIMER
        !          5066:        STI  TIMSX            STORE TIME
        !          5067:        LDI  INICD            LOAD INITIAL CODE KWD VALUE
        !          5068:        STI  KVCOD            STORE
        !          5069:        MOV  *E$SRS,RSMEM     RESERVE MEMORY
        !          5070:        MOV  XS,STBAS         STORE STACK BASE
        !          5071:        SSS  INISS            SAVE S-R STACK PTR
        !          5072: *
        !          5073: *      NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
        !          5074: *      FOR EASY TESTING IN ALLOC ROUTINE.
        !          5075: *
        !          5076:        LDI  INTVH            GET 100
        !          5077:        DVI  ALFSP            FORM 100 / ALFSP
        !          5078:        STI  ALFSF            STORE THE FACTOR
        !          5079: .IF    .CNRA
        !          5080: .ELSE
        !          5081: *
        !          5082: *      INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
        !          5083: *
        !          5084:        LCT  WB,=CFP$S        LOAD COUNTER FOR SIGNIFICANT DIGITS
        !          5085:        LDR  REAV1            LOAD 1.0
        !          5086: *
        !          5087: *      LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
        !          5088: *
        !          5089: INI03  MLR  REAVT            * 10.0
        !          5090:        BCT  WB,INI03         LOOP TILL DONE
        !          5091:        STR  GTSSC            STORE 10**(MAX SIG DIGITS)
        !          5092:        LDR  REAP5            LOAD 0.5
        !          5093:        DVR  GTSSC            COMPUTE 0.5*10**(MAX SIG DIGITS)
        !          5094:        STR  GTSRN            STORE AS ROUNDING BIAS
        !          5095: .FI
        !          5096:        ZER  WC               SET TO READ PARAMETERS
        !          5097:        JSR  PRPAR            READ THEM
        !          5098:        EJC
        !          5099: *
        !          5100: *      NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
        !          5101: *      NECESSARY REQUEST MORE MEMORY.
        !          5102: *
        !          5103:        SUB  *E$SRS,XL        ALLOW FOR RESERVE MEMORY
        !          5104:        MOV  PRLEN,WA         GET PRINT BUFFER LENGTH
        !          5105:        ADD  TTLEN,WA         ADD TERMINAL BUFFER LENGTH
        !          5106:        ADD  WA,WA            ALLOW FOR EQUALLY BIG BLANK STRINGS
        !          5107:        ADD  =CFP$A,WA        ADD NO. OF CHARS IN ALPHABET
        !          5108:        ADD  =NSTMX,WA        ADD CHARS FOR GTSTG BFR
        !          5109:        CTB  WA,8             CONVERT TO BAUS, ALLOWING A MARGIN
        !          5110:        MOV  STATB,XR         POINT TO STATIC BASE
        !          5111:        ADD  WA,XR            INCREMENT FOR ABOVE BUFFERS
        !          5112:        ADD  *E$HNB,XR        INCREMENT FOR HASH TABLE
        !          5113:        ADD  *E$STS,XR        BUMP FOR INITIAL STATIC BLOCK
        !          5114:        JSR  SYSMX            GET MXLEN
        !          5115:        MOV  WA,KVMXL         PROVISIONALLY STORE AS MAXLNGTH
        !          5116:        MOV  WA,MXLEN         AND AS MXLEN
        !          5117:        BGT  XR,WA,INI05      SKIP IF STATIC HI EXCEEDS MXLEN
        !          5118:        MOV  WA,XR            USE MXLEN INSTEAD
        !          5119:        ICA  XR               MAKE BIGGER THAN MXLEN
        !          5120: *
        !          5121: *      HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
        !          5122: *      OF DATA AREA INTO STATIC AND DYNAMIC
        !          5123: *
        !          5124: INI05  MOV  XR,DNAMB         DYNAMIC BASE ADRS
        !          5125:        MOV  XR,DNAMP         DYNAMIC PTR
        !          5126:        BNZ  WA,INI06         SKIP IF NON-ZERO MXLEN
        !          5127:        DCA  XR               POINT A WORD IN FRONT
        !          5128:        MOV  XR,KVMXL         USE AS MAXLNGTH
        !          5129:        MOV  XR,MXLEN         AND AS MXLEN
        !          5130: *
        !          5131: *      LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
        !          5132: *      SO THAT DNAME IS ABOVE DNAMB
        !          5133: *
        !          5134: INI06  MOV  XL,DNAME         STORE DYNAMIC END ADDRESS
        !          5135:        BLT  DNAMB,XL,INI08   SKIP IF HIGH ENOUGH
        !          5136:        JSR  SYSMM            REQUEST MORE MEMORY
        !          5137:        WTB  XR               CONVERT TO BAUS
        !          5138:        ADD  XR,XL            BUMP BY AMOUNT OBTAINED
        !          5139:        BNZ  XR,INI06         TRY AGAIN
        !          5140:        MOV  =ENDMO,XR        POINT TO FAILURE MESSAGE
        !          5141:        MOV  ENDML,WC         MESSAGE LENGTH
        !          5142:        JSR  SYSPR            PRINT IT (PRTST NOT YET USABLE)
        !          5143:        PPM  INI07
        !          5144:        PPM  INI07
        !          5145: *
        !          5146: *      EMERGENCY SHUTDOWN
        !          5147: *
        !          5148: INI07  MOV  =KVCOD,WA        CODE KEYWORD
        !          5149:        JSR  SYSEJ            PACK UP (STOPR NOT YET USABLE)
        !          5150:        EJC
        !          5151: *
        !          5152: *      INITIALISE PRINT BUFFER WITH BLANK WORDS
        !          5153: *
        !          5154: INI08  MOV  PRLEN,WA         NO. OF CHARS IN PRINT BFR
        !          5155:        MOV  STATB,XR         POINT TO STATIC AGAIN
        !          5156:        MOV  XR,PRBUF         PRINT BFR IS PUT AT STATIC START
        !          5157:        MOV  =B$SCL,(XR)+     STORE STRING TYPE CODE
        !          5158:        MOV  WA,(XR)+         AND STRING LENGTH
        !          5159:        MOV  XR,PRCHS         KEEP ADRS OF BUFFER PROPER
        !          5160:        MOV  XR,XL            COPY IT
        !          5161:        CTB  WA,0             WORDS NEEDED EXPRESSED IN BAUS
        !          5162:        MOV  WA,PRCMV         KEEP FOR CLEARING BUFFER
        !          5163:        MOV  XR,PRBLK         CONSTRUCT ADRS OF BLANKING STRING
        !          5164:        ADD  WA,PRBLK         ADD OFFSET TO BLANKING STRING
        !          5165:        ADD  WA,WA            CLEAR BOTH BFR AND BLANKING STRING
        !          5166:        MOV  NULLW,(XR)+      CLEAR FIRST WORD
        !          5167:        BZE  WA,INI09         SKIP IF NO PRINT BUFFER
        !          5168:        DCA  WA               ADJUST FOR FIRST WORD
        !          5169:        MVW                   PERFORM BLANKING
        !          5170: *
        !          5171: *      SET UP TERMINAL BUFFER
        !          5172: *
        !          5173: INI09  MOV  TTLEN,WA         LENGTH OF TERMINAL BUFFER
        !          5174:        MOV  XR,TTBUF         ADRS OF TERMINAL STRING BUFFER
        !          5175:        MOV  =B$SCL,(XR)+     STRING TYPE CODE
        !          5176:        MOV  WA,(XR)+         STRING LENGTH
        !          5177:        MOV  XR,TTCHS         KEEP ADRS OF BUFFER PROPER
        !          5178:        MOV  XR,XL            COPY IT
        !          5179:        CTB  WA,0             WORDS NEEDED EXPRESSED IN BAUS
        !          5180:        MOV  WA,TTCMV         KEEP FOR CLEARING BUFFER
        !          5181:        MOV  XR,TTBLK         CONSTRUCT ADRS OF BLANKING STRING
        !          5182:        ADD  WA,TTBLK         ADD OFFSET TO BLANKING STRING
        !          5183:        ADD  WA,WA            CLEAR BOTH BFR AND BLANKING STRING
        !          5184:        MOV  NULLW,(XR)+      CLEAR FIRST WORD
        !          5185:        BZE  WA,INI10         SKIP IF NO PRINT BUFFER
        !          5186:        DCA  WA               ADJUST FOR FIRST WORD
        !          5187:        MVW                   PERFORM BLANKING
        !          5188: *
        !          5189: *      INITIALIZE NUMBER OF HASH HEADERS
        !          5190: *
        !          5191: INI10  MOV  =E$HNB,WA        GET NUMBER OF HASH HEADERS
        !          5192:        MTI  WA               CONVERT TO INTEGER
        !          5193:        STI  HSHNB            STORE FOR USE BY GTNVR PROCEDURE
        !          5194:        LCT  WA,WA            COUNTER FOR CLEARING HASH TABLE
        !          5195:        MOV  XR,HSHTB         POINTER TO HASH TABLE
        !          5196: *
        !          5197: *      LOOP TO CLEAR HASH TABLE
        !          5198: *
        !          5199: INI11  ZER  (XR)+            BLANK A WORD
        !          5200:        BCT  WA,INI11         LOOP
        !          5201:        MOV  XR,HSHTE         END OF HASH TABLE ADRS IS KEPT
        !          5202: *
        !          5203: *      ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
        !          5204: *
        !          5205:        MOV  =NSTMX,WA        GET MAX NUM CHARS IN OUTPUT NUMBER
        !          5206:        CTB  WA,SCSI$         NO OF BAUS NEEDED
        !          5207:        MOV  XR,GTSWK         STORE BFR ADRS
        !          5208:        ADD  WA,XR            BUMP FOR WORK BFR
        !          5209:        EJC
        !          5210: *
        !          5211: *      BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
        !          5212: *
        !          5213:        MOV  XR,KVALP         SAVE ALPHABET POINTER
        !          5214:        MOV  =B$SCL,(XR)      STRING BLK TYPE
        !          5215:        MOV  =CFP$A,WC        NO OF CHARS IN ALPHABET
        !          5216:        MOV  WC,SCLEN(XR)     STORE AS STRING LENGTH
        !          5217:        MOV  WC,WB            COPY CHAR COUNT
        !          5218:        CTB  WB,SCSI$         NO. OF BAUS NEEDED
        !          5219:        ADD  XR,WB            CURRENT END ADDRESS FOR STATIC
        !          5220:        MOV  WB,STATE         STORE STATIC END ADRS
        !          5221:        LCT  WC,WC            LOOP COUNTER
        !          5222:        PSC  XR               POINT TO CHARS OF STRING
        !          5223:        ZER  WB               SET INITIAL CHARACTER VALUE
        !          5224: *
        !          5225: *      LOOP TO ENTER CHARACTER CODES IN ORDER
        !          5226: *
        !          5227: INI12  SCH  WB,(XR)+         STORE NEXT CODE
        !          5228:        ICV  WB               BUMP CODE VALUE
        !          5229:        BCT  WC,INI12         LOOP TILL ALL STORED
        !          5230:        CSC  XR               COMPLETE STORE CHARACTERS
        !          5231: *
        !          5232: *      INITIALIZE VARIABLE BLOCKS FOR INPUT OUTPUT TERMINAL
        !          5233: *
        !          5234:        MOV  =V$INP,XL        POINT TO STRING /INPUT/
        !          5235:        MOV  =TRTIN,WB        TRBLK TYPE FOR INPUT
        !          5236:        JSR  INOUT            PERFORM INPUT ASSOCIATION
        !          5237:        MOV  =V$OUP,XL        POINT TO STRING /OUTPUT/
        !          5238:        MOV  =TRTOU,WB        TRBLK TYPE FOR OUTPUT
        !          5239:        JSR  INOUT            PERFORM OUTPUT ASSOCIATION
        !          5240:        BZE  TTLEN,INI13      SKIP IF NO TERMINAL I/O
        !          5241:        MOV  =V$TER,XL        POINT TO STRING /TERMINAL/
        !          5242:        MOV  =TRTOU,WB        TRTYP FOR OUTPUT
        !          5243:        JSR  INOUT            PERFORM ASSOCIATION
        !          5244:        MOV  =V$TER,XL
        !          5245:        MOV  =TRTIN,WB        TRTYP FOR INPUT
        !          5246:        JSR  INOUT            PERFORM ASSOCIATION
        !          5247:        EJC
        !          5248: *
        !          5249: *
        !          5250: *      PREPARE FOR COMPILATION
        !          5251: *
        !          5252: INI13  MOV  XS,FLPTR         IN CASE STACK OVERFLOWS IN COMPILER
        !          5253: *
        !          5254: *      NOW COMPILE SOURCE INPUT CODE
        !          5255: *
        !          5256:        JSR  CMPIL            CALL COMPILER
        !          5257:        MOV  XR,R$COD         SET PTR TO FIRST CODE BLOCK
        !          5258:        MOV  =NULLS,R$TTL     FORGET TITLE
        !          5259:        MOV  =NULLS,R$STL     FORGET SUB-TITLE
        !          5260:        ZER  R$CIM            FORGET COMPILER INPUT IMAGE
        !          5261:        ZER  XL               CLEAR DUD VALUE
        !          5262:        ZER  WB               DONT SHIFT DYNAMIC STORE UP
        !          5263:        JSR  GBCOL            CLEAR GARBAGE LEFT FROM COMPILE
        !          5264:        BNZ  CPSTS,INIX1      SKIP IF NO LISTING OF COMP STATS
        !          5265:        JSR  PRTPG            EJECT PAGE
        !          5266: *
        !          5267: *      PRINT COMPILE STATISTICS
        !          5268: *
        !          5269:        MOV  DNAMP,WA         NEXT AVAILABLE LOC
        !          5270:        SUB  STATB,WA         MINUS START
        !          5271:        BTW  WA               CONVERT TO WORDS
        !          5272:        MTI  WA               CONVERT TO INTEGER
        !          5273:        MOV  =ENCM1,XR        POINT TO /MEMORY USED (WORDS)/
        !          5274:        JSR  PRTMI            PRINT MESSAGE
        !          5275:        MOV  DNAME,WA         END OF MEMORY
        !          5276:        SUB  DNAMP,WA         MINUS NEXT AVAILABLE LOC
        !          5277:        BTW  WA               CONVERT TO WORDS
        !          5278:        MTI  WA               CONVERT TO INTEGER
        !          5279:        MOV  =ENCM2,XR        POINT TO /MEMORY AVAILABLE (WORDS)/
        !          5280:        JSR  PRTMI            PRINT LINE
        !          5281:        MTI  CMERC            GET COUNT OF ERRORS AS INTEGER
        !          5282:        MOV  =ENCM3,XR        POINT TO /COMPILE ERRORS/
        !          5283:        JSR  PRTMI            PRINT IT
        !          5284:        MTI  GBCNT            GARBAGE COLLECTION COUNT
        !          5285:        SBI  INTV1            ADJUST FOR UNAVOIDABLE COLLECT
        !          5286:        MOV  =STPM5,XR        POINT TO /STORAGE REGENERATIONS/
        !          5287:        JSR  PRTMI            PRINT GBCOL COUNT
        !          5288:        JSR  SYSTM            GET TIME
        !          5289:        SBI  TIMSX            GET COMPILATION TIME
        !          5290:        MOV  =ENCM4,XR        POINT TO COMPILATION TIME (MSEC)/
        !          5291:        JSR  PRTMI            PRINT MESSAGE
        !          5292:        ADD  =NUM05,LSTLC     BUMP LINE COUNT
        !          5293:        EJC
        !          5294: *
        !          5295: *      PREPARE NOW TO START EXECUTION
        !          5296: *
        !          5297: *
        !          5298: *      CHECK FOR NOEXECUTE
        !          5299: *
        !          5300: INIX1  BNZ  NOXEQ,INIX3      JUMP IF EXECUTION SUPPRESSED
        !          5301:        ZER  GBCNT            INITIALISE COLLECT COUNT
        !          5302:        BZE  HEADP,INIX2      SKIP IF NO PRTPG CALLS IN COMPILN
        !          5303:        JSR  PRTPG            EJECT STANDARD PRINTER FILE
        !          5304: *
        !          5305: *      INFORM OSINT OF STAGE
        !          5306: *
        !          5307: INIX2  JSR  SYSBX            CALL BEFORE STARTING EXECUTION
        !          5308:        ZER  -(XS)            SET FAILURE LOCATION ON STACK
        !          5309:        MOV  XS,FLPTR         SAVE PTR TO FAILURE OFFSET WORD
        !          5310:        MOV  R$COD,XR         LOAD PTR TO ENTRY CODE BLOCK
        !          5311:        MOV  =STGXT,STAGE     SET STAGE FOR EXECUTE TIME
        !          5312:        JSR  SYSTM            GET TIME
        !          5313:        STI  TIMSX            STORE FOR END RUN PROCESSING
        !          5314: .IF    .CNPF
        !          5315: .ELSE
        !          5316:        STI  PFSTM            STORE TIME FOR PROFILER
        !          5317:        MOV  CMPSN,PFNTE      COPY STATEMENTS COMPILED COUNT
        !          5318: .FI
        !          5319:        BRI  (XR)             START XEQ WITH FIRST STATEMENT
        !          5320: *
        !          5321: *      HERE IF EXECUTION IS SUPPRESSED
        !          5322: *
        !          5323: INIX3  JSR  PRTFH            PRINT A BLANK LINE
        !          5324:        MOV  =ENCM5,XR        POINT TO /EXECUTION SUPPRESSED/
        !          5325:        MOV  TTERL,TTLST      TO FORCE MSG TO TERMINAL
        !          5326:        JSR  PRTSF            PRINT NOEXECUTE MESSAGE
        !          5327:        MOV  =KVCOD,WA        ENDING CODE
        !          5328:        JSR  SYSEJ            END OF JOB, EXIT TO SYSTEM
        !          5329:        TTL  S P I T B O L -- SNOBOL4 OPERATOR ROUTINES
        !          5330: *
        !          5331: *      THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
        !          5332: *      DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
        !          5333: *
        !          5334: *      ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
        !          5335: *      FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
        !          5336: *      CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
        !          5337: *
        !          5338: *      SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
        !          5339: *      POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
        !          5340: *      ACTUAL ENTRY POINT LABEL (O$XXX).
        !          5341: *
        !          5342: *      THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
        !          5343: *      ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
        !          5344: *
        !          5345: *      THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
        !          5346: *
        !          5347: *      (CP)                  POINTER TO NEXT CODE WORD
        !          5348: *      (XS)                  CURRENT STACK POINTER
        !          5349:        EJC
        !          5350: *
        !          5351: *      BINARY PLUS (ADDITION)
        !          5352: *
        !          5353: O$ADD  ENT                   ENTRY POINT
        !          5354:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
        !          5355:        ERR  001,ADDITION LEFT OPERAND IS NOT NUMERIC
        !          5356:        ERR  002,ADDITION RIGHT OPERAND IS NOT NUMERIC
        !          5357: .IF    .CNRA
        !          5358: .ELSE
        !          5359:        PPM  OADD1            JUMP IF REAL OPERANDS
        !          5360: .FI
        !          5361: *
        !          5362: *      HERE TO ADD TWO INTEGERS
        !          5363: *
        !          5364:        ADI  ICVAL(XL)        ADD RIGHT OPERAND TO LEFT
        !          5365:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
        !          5366:        ERB  003,ADDITION CAUSED INTEGER OVERFLOW
        !          5367: .IF    .CNRA
        !          5368: .ELSE
        !          5369: *
        !          5370: *      HERE TO ADD TWO REALS
        !          5371: *
        !          5372: OADD1  ADR  RCVAL(XL)        ADD RIGHT OPERAND TO LEFT
        !          5373:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
        !          5374:        ERB  004,ADDITION CAUSED REAL OVERFLOW
        !          5375: .FI
        !          5376:        EJC
        !          5377: *
        !          5378: *      UNARY PLUS (AFFIRMATION)
        !          5379: *
        !          5380: O$AFF  ENT                   ENTRY POINT
        !          5381:        MOV  (XS)+,XR         LOAD OPERAND
        !          5382:        JSR  GTNUM            CONVERT TO NUMERIC
        !          5383:        ERR  005,AFFIRMATION OPERAND IS NOT NUMERIC
        !          5384:        BRN  EXIXR            RETURN IF CONVERTED TO NUMERIC
        !          5385:        EJC
        !          5386: *
        !          5387: *      BINARY BAR (ALTERNATION)
        !          5388: *
        !          5389: O$ALT  ENT                   ENTRY POINT
        !          5390:        MOV  (XS)+,XR         LOAD RIGHT OPERAND
        !          5391:        JSR  GTPAT            CONVERT TO PATTERN
        !          5392:        ERR  006,ALTERNATION RIGHT OPERAND IS NOT PATTERN
        !          5393: *
        !          5394: *      MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
        !          5395: *
        !          5396: OALT1  MOV  =P$ALT,WB        SET PCODE FOR ALTERNATIVE NODE
        !          5397:        JSR  PBILD            BUILD ALTERNATIVE NODE
        !          5398:        MOV  XR,XL            SAVE ADDRESS OF ALTERNATIVE NODE
        !          5399:        MOV  (XS)+,XR         LOAD LEFT OPERAND
        !          5400:        JSR  GTPAT            CONVERT TO PATTERN
        !          5401:        ERR  007,ALTERNATION LEFT OPERAND IS NOT PATTERN
        !          5402:        BEQ  XR,=P$ALT,OALT2  JUMP IF LEFT ARG IS ALTERNATION
        !          5403:        MOV  XR,PTHEN(XL)     SET LEFT OPERAND AS SUCCESSOR
        !          5404:        MOV  XL,XR            MOVE RESULT TO PROPER REGISTER
        !          5405:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          5406: *
        !          5407: *      COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
        !          5408: *
        !          5409: *      THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
        !          5410: *
        !          5411: *      (A / B) / C = A / (B / C)
        !          5412: *
        !          5413: OALT2  MOV  PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE
        !          5414:        MOV  PTHEN(XR),-(XS)  SET A AS NEW LEFT ARG
        !          5415:        MOV  XL,XR            SET (B / C) AS NEW RIGHT ARG
        !          5416:        BRN  OALT1            MERGE BACK TO BUILD A / (B / C)
        !          5417:        EJC
        !          5418: *
        !          5419: *      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
        !          5420: *
        !          5421: O$AMN  ENT                   ENTRY POINT
        !          5422:        LCW  XR               LOAD NUMBER OF SUBSCRIPTS
        !          5423:        MOV  XR,WB            SET FLAG FOR BY NAME
        !          5424:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
        !          5425: *
        !          5426: *      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
        !          5427: *
        !          5428: O$AMV  ENT                   ENTRY POINT
        !          5429:        LCW  XR               LOAD NUMBER OF SUBSCRIPTS
        !          5430:        ZER  WB               SET FLAG FOR BY VALUE
        !          5431:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
        !          5432: *
        !          5433: *      ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
        !          5434: *
        !          5435: O$AON  ENT                   ENTRY POINT
        !          5436:        MOV  (XS),XR          LOAD SUBSCRIPT VALUE
        !          5437:        MOV  1(XS),XL         LOAD ARRAY VALUE
        !          5438:        MOV  (XL),WA          LOAD FIRST WORD OF ARRAY OPERAND
        !          5439:        BEQ  WA,=B$VCT,OAON2  JUMP IF VECTOR REFERENCE
        !          5440:        BEQ  WA,=B$TBT,OAON3  JUMP IF TABLE REFERENCE
        !          5441: *
        !          5442: *      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
        !          5443: *
        !          5444: OAON1  MOV  =NUM01,XR        SET NUMBER OF SUBSCRIPTS TO ONE
        !          5445:        MOV  XR,WB            SET FLAG FOR BY NAME
        !          5446:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
        !          5447: *
        !          5448: *      HERE IF WE HAVE A VECTOR REFERENCE
        !          5449: *
        !          5450: OAON2  BNE  (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER
        !          5451:        LDI  ICVAL(XR)        LOAD INTEGER SUBSCRIPT VALUE
        !          5452:        MFI  WA,EXFAL         COPY AS ADDRESS INT, FAIL IF OVFLO
        !          5453:        BZE  WA,EXFAL         FAIL IF ZERO
        !          5454:        ADD  =VCVLB,WA        COMPUTE OFFSET IN WORDS
        !          5455:        WTB  WA               CONVERT TO BAUS
        !          5456:        MOV  WA,(XS)          COMPLETE NAME ON STACK
        !          5457:        BLT  WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE
        !          5458:        BRN  EXFAL            ELSE FAIL
        !          5459: *
        !          5460: *      HERE FOR TABLE REFERENCE
        !          5461: *
        !          5462: OAON3  MNZ  WB               SET FLAG FOR NAME REFERENCE
        !          5463:        JSR  TFIND            LOCATE/CREATE TABLE ELEMENT
        !          5464:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          5465:        MOV  XL,1(XS)         STORE NAME BASE ON STACK
        !          5466:        MOV  WA,(XS)          STORE NAME OFFSET ON STACK
        !          5467:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          5468:        EJC
        !          5469: *
        !          5470: *      ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
        !          5471: *
        !          5472: O$AOV  ENT                   ENTRY POINT
        !          5473:        MOV  (XS)+,XR         LOAD SUBSCRIPT VALUE
        !          5474:        MOV  (XS)+,XL         LOAD ARRAY VALUE
        !          5475:        MOV  (XL),WA          LOAD FIRST WORD OF ARRAY OPERAND
        !          5476:        BEQ  WA,=B$VCT,OAOV2  JUMP IF VECTOR REFERENCE
        !          5477:        BEQ  WA,=B$TBT,OAOV3  JUMP IF TABLE REFERENCE
        !          5478: *
        !          5479: *      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
        !          5480: *
        !          5481: OAOV1  MOV  XL,-(XS)         RESTACK ARRAY VALUE
        !          5482:        MOV  XR,-(XS)         RESTACK SUBSCRIPT
        !          5483:        MOV  =NUM01,XR        SET NUMBER OF SUBSCRIPTS TO ONE
        !          5484:        ZER  WB               SET FLAG FOR VALUE CALL
        !          5485:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
        !          5486: *
        !          5487: *      HERE IF WE HAVE A VECTOR REFERENCE
        !          5488: *
        !          5489: OAOV2  BNE  (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER
        !          5490:        LDI  ICVAL(XR)        LOAD INTEGER SUBSCRIPT VALUE
        !          5491:        MFI  WA,EXFAL         MOVE AS ONE WORD INT, FAIL IF OVFLO
        !          5492:        BZE  WA,EXFAL         FAIL IF ZERO
        !          5493:        ADD  =VCVLB,WA        COMPUTE OFFSET IN WORDS
        !          5494:        WTB  WA               CONVERT TO BAUS
        !          5495:        BGE  WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE
        !          5496:        JSR  ACESS            ACCESS VALUE
        !          5497:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          5498:        BRN  EXIXR            ELSE RETURN VALUE TO CALLER
        !          5499: *
        !          5500: *      HERE FOR TABLE REFERENCE BY VALUE
        !          5501: *
        !          5502: OAOV3  ZER  WB               SET FLAG FOR VALUE REFERENCE
        !          5503:        JSR  TFIND            CALL TABLE SEARCH ROUTINE
        !          5504:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          5505:        BRN  EXIXR            EXIT WITH RESULT IN XR
        !          5506:        EJC
        !          5507: *
        !          5508: *      ASSIGNMENT (O$RPL MERGES)
        !          5509: *
        !          5510: O$ASS  ENT                   ENTRY POINT
        !          5511:        MOV  (XS)+,WB         LOAD VALUE TO BE ASSIGNED
        !          5512:        MOV  (XS)+,WA         LOAD NAME OFFSET
        !          5513:        MOV  (XS),XL          LOAD NAME BASE
        !          5514:        MOV  WB,(XS)          STORE ASSIGNED VALUE AS RESULT
        !          5515:        JSR  ASIGN            PERFORM ASSIGNMENT
        !          5516:        PPM  EXFAL            FAIL IF ASSIGNMENT FAILS
        !          5517:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          5518: *
        !          5519: *      COMPILATION ERROR
        !          5520: *
        !          5521: O$CER  ENT                   ENTRY POINT
        !          5522:        ERB  008,COMPILATION ERROR ENCOUNTERED DURING EXECUTION
        !          5523: *
        !          5524: *      UNARY AT (CURSOR ASSIGNMENT)
        !          5525: *
        !          5526: O$CAS  ENT                   ENTRY POINT
        !          5527:        MOV  (XS)+,WC         LOAD NAME OFFSET (PARM2)
        !          5528:        MOV  (XS)+,XR         LOAD NAME BASE (PARM1)
        !          5529:        MOV  =P$CAS,WB        SET PCODE FOR CURSOR ASSIGNMENT
        !          5530:        JSR  PBILD            BUILD NODE
        !          5531:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          5532:        EJC
        !          5533: *
        !          5534: *      CONCATENATION
        !          5535: *
        !          5536: O$CNC  ENT                   ENTRY POINT
        !          5537:        MOV  (XS),XR          LOAD RIGHT ARGUMENT
        !          5538:        BEQ  XR,=NULLS,OCNC3  JUMP IF RIGHT ARG IS NULL
        !          5539:        MOV  1(XS),XL         LOAD LEFT ARGUMENT
        !          5540:        BEQ  XL,=NULLS,OCNC4  JUMP IF LEFT ARGUMENT IS NULL
        !          5541:        MOV  =B$SCL,WA        GET CONSTANT TO TEST FOR STRING
        !          5542:        BNE  WA,(XL),OCNC2    JUMP IF LEFT ARG NOT A STRING
        !          5543:        BNE  WA,(XR),OCNC2    JUMP IF RIGHT ARG NOT A STRING
        !          5544: *
        !          5545: *      MERGE HERE TO CONCATENATE TWO STRINGS
        !          5546: *
        !          5547: OCNC1  MOV  SCLEN(XL),WA     LOAD LEFT ARGUMENT LENGTH
        !          5548:        ADD  SCLEN(XR),WA     COMPUTE RESULT LENGTH
        !          5549:        JSR  ALOCS            ALLOCATE SCBLK FOR RESULT
        !          5550:        MOV  XR,1(XS)         STORE RESULT PTR OVER LEFT ARGUMENT
        !          5551:        PSC  XR               PREPARE TO STORE CHARS OF RESULT
        !          5552:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARS IN LEFT ARG
        !          5553:        PLC  XL               PREPARE TO LOAD LEFT ARG CHARS
        !          5554:        MVC                   MOVE CHARACTERS OF LEFT ARGUMENT
        !          5555:        MOV  (XS)+,XL         LOAD RIGHT ARG POINTER, POP STACK
        !          5556:        MOV  SCLEN(XL),WA     LOAD NUMBER OF CHARS IN RIGHT ARG
        !          5557:        PLC  XL               PREPARE TO LOAD RIGHT ARG CHARS
        !          5558:        MVC                   MOVE CHARACTERS OF RIGHT ARGUMENT
        !          5559:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          5560: *
        !          5561: *      COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
        !          5562: *
        !          5563: OCNC2  JSR  GTSTG            CONVERT RIGHT ARG TO STRING
        !          5564:        PPM  OCNC5            JUMP IF RIGHT ARG IS NOT STRING
        !          5565:        MOV  XR,XL            SAVE RIGHT ARG PTR
        !          5566:        JSR  GTSTG            CONVERT LEFT ARG TO STRING
        !          5567:        PPM  OCNC6            JUMP IF LEFT ARG IS NOT A STRING
        !          5568:        MOV  XR,-(XS)         STACK LEFT ARGUMENT
        !          5569:        MOV  XL,-(XS)         STACK RIGHT ARGUMENT
        !          5570:        MOV  XR,XL            MOVE LEFT ARG TO PROPER REG
        !          5571:        MOV  (XS),XR          MOVE RIGHT ARG TO PROPER REG
        !          5572:        BRN  OCNC1            MERGE BACK TO CONCATENATE STRINGS
        !          5573:        EJC
        !          5574: *
        !          5575: *      CONCATENATION (CONTINUED)
        !          5576: *
        !          5577: *      COME HERE FOR NULL RIGHT ARGUMENT
        !          5578: *
        !          5579: OCNC3  ICA  XS               REMOVE RIGHT ARG FROM STACK
        !          5580:        BRN  EXITS            RETURN WITH LEFT ARGUMENT ON STACK
        !          5581: *
        !          5582: *      HERE FOR NULL LEFT ARGUMENT
        !          5583: *
        !          5584: OCNC4  ICA  XS               UNSTACK ONE ARGUMENT
        !          5585:        MOV  XR,(XS)          STORE RIGHT ARGUMENT
        !          5586:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          5587: *
        !          5588: *      HERE IF RIGHT ARGUMENT IS NOT A STRING
        !          5589: *
        !          5590: OCNC5  MOV  XR,XL            MOVE RIGHT ARGUMENT PTR
        !          5591:        MOV  (XS)+,XR         LOAD LEFT ARG POINTER
        !          5592: *
        !          5593: *      MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
        !          5594: *
        !          5595: OCNC6  JSR  GTPAT            CONVERT LEFT ARG TO PATTERN
        !          5596:        ERR  009,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN
        !          5597:        MOV  XR,-(XS)         SAVE RESULT ON STACK
        !          5598:        MOV  XL,XR            POINT TO RIGHT OPERAND
        !          5599:        JSR  GTPAT            CONVERT TO PATTERN
        !          5600:        ERR  010,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN
        !          5601:        MOV  XR,XL            MOVE FOR PCONC
        !          5602:        MOV  (XS)+,XR         RELOAD LEFT OPERAND PTR
        !          5603:        JSR  PCONC            CONCATENATE PATTERNS
        !          5604:        BRN  EXIXR            EXIT WITH RESULT IN XR
        !          5605:        EJC
        !          5606: *
        !          5607: *      COMPLEMENTATION
        !          5608: *
        !          5609: O$COM  ENT                   ENTRY POINT
        !          5610:        MOV  (XS)+,XR         LOAD OPERAND
        !          5611:        MOV  (XR),WA          LOAD TYPE WORD
        !          5612: *
        !          5613: *      MERGE BACK HERE AFTER CONVERSION
        !          5614: *
        !          5615: OCOM1  BEQ  WA,=B$ICL,OCOM2  JUMP IF INTEGER
        !          5616: .IF    .CNRA
        !          5617: .ELSE
        !          5618:        BEQ  WA,=B$RCL,OCOM3  JUMP IF REAL
        !          5619: .FI
        !          5620:        JSR  GTNUM            ELSE CONVERT TO NUMERIC
        !          5621:        ERR  011,COMPLEMENTATION OPERAND IS NOT NUMERIC
        !          5622:        BRN  OCOM1            BACK TO CHECK CASES
        !          5623: *
        !          5624: *      HERE TO COMPLEMENT INTEGER
        !          5625: *
        !          5626: OCOM2  LDI  ICVAL(XR)        LOAD INTEGER VALUE
        !          5627:        NGI                   NEGATE
        !          5628:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
        !          5629:        ERB  012,COMPLEMENTATION CAUSED INTEGER OVERFLOW
        !          5630: .IF    .CNRA
        !          5631: .ELSE
        !          5632: *
        !          5633: *      HERE TO COMPLEMENT REAL
        !          5634: *
        !          5635: OCOM3  LDR  RCVAL(XR)        LOAD REAL VALUE
        !          5636:        NGR                   NEGATE
        !          5637:        BRN  EXREA            RETURN REAL RESULT
        !          5638: .FI
        !          5639:        EJC
        !          5640: *
        !          5641: *      BINARY SLASH (DIVISION)
        !          5642: *
        !          5643: O$DVD  ENT                   ENTRY POINT
        !          5644:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
        !          5645:        ERR  013,DIVISION LEFT OPERAND IS NOT NUMERIC
        !          5646:        ERR  014,DIVISION RIGHT OPERAND IS NOT NUMERIC
        !          5647: .IF    .CNRA
        !          5648: .ELSE
        !          5649:        PPM  ODVD2            JUMP IF REAL OPERANDS
        !          5650: .FI
        !          5651: *
        !          5652: *      HERE TO DIVIDE TWO INTEGERS
        !          5653: *
        !          5654:        DVI  ICVAL(XL)        DIVIDE LEFT OPERAND BY RIGHT
        !          5655:        INO  EXINT            RESULT OK IF NO OVERFLOW
        !          5656:        ERB  015,DIVISION CAUSED INTEGER OVERFLOW
        !          5657: .IF    .CNRA
        !          5658: .ELSE
        !          5659: *
        !          5660: *      HERE TO DIVIDE TWO REALS
        !          5661: *
        !          5662: ODVD2  DVR  RCVAL(XL)        DIVIDE LEFT OPERAND BY RIGHT
        !          5663:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
        !          5664:        ERB  016,DIVISION CAUSED REAL OVERFLOW
        !          5665: .FI
        !          5666:        EJC
        !          5667: *
        !          5668: *      EXPONENTIATION
        !          5669: *
        !          5670: O$EXP  ENT                   ENTRY POINT
        !          5671:        MOV  (XS)+,XR         LOAD EXPONENT
        !          5672:        JSR  GTNUM            CONVERT TO NUMBER
        !          5673:        ERR  017,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC
        !          5674: .IF    .CNRA
        !          5675: .ELSE
        !          5676:        BNE  WA,=B$ICL,OEXP7  JUMP IF REAL
        !          5677: .FI
        !          5678:        MOV  XR,XL            MOVE EXPONENT
        !          5679:        MOV  (XS)+,XR         LOAD BASE
        !          5680:        JSR  GTNUM            CONVERT TO NUMERIC
        !          5681:        ERR  018,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC
        !          5682:        LDI  ICVAL(XL)        LOAD EXPONENT
        !          5683:        ILT  OEXP8            ERROR IF NEGATIVE EXPONENT
        !          5684: .IF    .CNRA
        !          5685: .ELSE
        !          5686:        BEQ  WA,=B$RCL,OEXP3  JUMP IF BASE IS REAL
        !          5687: .FI
        !          5688: *
        !          5689: *      HERE TO EXPONENTIATE AN INTEGER
        !          5690: *
        !          5691:        MFI  WA,OEXP2         CONVERT EXPONENT TO 1 WORD INTEGER
        !          5692:        LCT  WA,WA            SET LOOP COUNTER
        !          5693:        LDI  INTV1            LOAD INITIAL VALUE OF 1
        !          5694:        BNZ  WA,OEXP1         JUMP IF NON-ZERO EXPONENT
        !          5695:        INE  EXINT            GIVE ZERO AS RESULT FOR NONZERO**0
        !          5696:        BRN  OEXP4            ELSE ERROR OF 0**0
        !          5697: *
        !          5698: *      LOOP TO PERFORM EXPONENTIATION
        !          5699: *
        !          5700: OEXP1  MLI  ICVAL(XR)        MULTIPLY BY BASE
        !          5701:        IOV  OEXP2            JUMP IF OVERFLOW
        !          5702:        BCT  WA,OEXP1         LOOP BACK TILL COMPUTATION COMPLETE
        !          5703:        BRN  EXINT            THEN RETURN INTEGER RESULT
        !          5704: *
        !          5705: *      HERE IF INTEGER OVERFLOW
        !          5706: *
        !          5707: OEXP2  ERB  019,EXPONENTIATION CAUSED INTEGER OVERFLOW
        !          5708:        EJC
        !          5709: *
        !          5710: *      EXPONENTIATION (CONTINUED)
        !          5711: .IF    .CNRA
        !          5712: .ELSE
        !          5713: *
        !          5714: *      HERE TO EXPONENTIATE A REAL
        !          5715: *
        !          5716: OEXP3  MFI  WA,OEXP6         CONVERT EXPONENT TO ONE WORD
        !          5717:        LCT  WA,WA            SET LOOP COUNTER
        !          5718:        LDR  REAV1            LOAD 1.0 AS INITIAL VALUE
        !          5719:        BNZ  WA,OEXP5         JUMP IF NON-ZERO EXPONENT
        !          5720:        RNE  EXREA            RETURN 1.0 IF NONZERO**ZERO
        !          5721: .FI
        !          5722: *
        !          5723: *      HERE FOR ERROR OF 0**0 OR 0.0**0
        !          5724: *
        !          5725: OEXP4  ERB  020,EXPONENTIATION RESULT IS UNDEFINED
        !          5726: .IF    .CNRA
        !          5727: .ELSE
        !          5728: *
        !          5729: *      LOOP TO PERFORM EXPONENTIATION
        !          5730: *
        !          5731: OEXP5  MLR  RCVAL(XR)        MULTIPLY BY BASE
        !          5732:        ROV  OEXP6            JUMP IF OVERFLOW
        !          5733:        BCT  WA,OEXP5         LOOP TILL COMPUTATION COMPLETE
        !          5734:        BRN  EXREA            THEN RETURN REAL RESULT
        !          5735: *
        !          5736: *      HERE IF REAL OVERFLOW
        !          5737: *
        !          5738: OEXP6  ERB  021,EXPONENTIATION CAUSED REAL OVERFLOW
        !          5739: *
        !          5740: *      HERE IF REAL EXPONENT
        !          5741: *
        !          5742: OEXP7  ERB  022,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER
        !          5743: .FI
        !          5744: *
        !          5745: *      HERE FOR NEGATIVE EXPONENT
        !          5746: *
        !          5747: OEXP8  ERB  023,EXPONENTIATION RIGHT OPERAND IS NEGATIVE
        !          5748:        EJC
        !          5749: *
        !          5750: *      FAILURE IN EXPRESSION EVALUATION
        !          5751: *
        !          5752: *      THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
        !          5753: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
        !          5754: *      CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
        !          5755: *
        !          5756: O$FEX  ENT                   ENTRY POINT
        !          5757:        JMG  EVLXF            JUMP TO FAILURE LOC IN EVALX
        !          5758: *
        !          5759: *      FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
        !          5760: *
        !          5761: O$FIF  ENT                   ENTRY POINT
        !          5762:        ERB  024,GOTO EVALUATION FAILURE
        !          5763: *
        !          5764: *      FUNCTION CALL (MORE THAN ONE ARGUMENT)
        !          5765: *
        !          5766: O$FNC  ENT                   ENTRY POINT
        !          5767:        LCW  WA               LOAD NUMBER OF ARGUMENTS
        !          5768:        LCW  XR               LOAD FUNCTION VRBLK POINTER
        !          5769:        MOV  VRFNC(XR),XL     LOAD FUNCTION POINTER
        !          5770:        BNE  WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
        !          5771:        BRI  (XL)             JUMP TO FUNCTION IF ARG COUNT OK
        !          5772: *
        !          5773: *      FUNCTION NAME ERROR
        !          5774: *
        !          5775: O$FNE  ENT                   ENTRY POINT
        !          5776:        LCW  WA               GET NEXT CODE WORD
        !          5777:        BNE  WA,=ORNM$,OFNE1  FAIL IF NOT EVALUATING EXPRESSION
        !          5778:        BNZ  2(XS),OFNE1      FAIL UNLESS EXPRN WANTED BY VALUE
        !          5779:        JMG  EVLXV            JOIN EXPRESSION BY VALUE CODE
        !          5780: *
        !          5781: *      HERE FOR ERROR
        !          5782: *
        !          5783: OFNE1  ERB  025,FUNCTION CALLED BY NAME RETURNED A VALUE
        !          5784: *
        !          5785: *      FUNCTION CALL (SINGLE ARGUMENT)
        !          5786: *
        !          5787: O$FNS  ENT                   ENTRY POINT
        !          5788:        LCW  XR               LOAD FUNCTION VRBLK POINTER
        !          5789:        MOV  =NUM01,WA        SET NUMBER OF ARGUMENTS TO ONE
        !          5790:        MOV  VRFNC(XR),XL     LOAD FUNCTION POINTER
        !          5791:        BNE  WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
        !          5792:        BRI  (XL)             JUMP TO FUNCTION IF ARG COUNT OK
        !          5793:        EJC
        !          5794: *      CALL TO UNDEFINED FUNCTION
        !          5795: *
        !          5796: O$FUN  ENT                   ENTRY POINT
        !          5797:        ERB  026,UNDEFINED FUNCTION CALLED
        !          5798: *
        !          5799: *      EXECUTE COMPLEX GOTO
        !          5800: *
        !          5801: O$GOC  ENT                   ENTRY POINT
        !          5802:        MOV  1(XS),XR         LOAD NAME BASE POINTER
        !          5803:        BHI  XR,STATE,OGOC1   JUMP IF NOT NATURAL VARIABLE
        !          5804:        ADD  *VRTRA,XR        ELSE POINT TO VRTRA FIELD
        !          5805:        BRI  (XR)             AND JUMP THROUGH IT
        !          5806: *
        !          5807: *      HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
        !          5808: *
        !          5809: OGOC1  ERB  027,GOTO OPERAND IS NOT A NATURAL VARIABLE
        !          5810: *
        !          5811: *      EXECUTE DIRECT GOTO
        !          5812: *
        !          5813: O$GOD  ENT                   ENTRY POINT
        !          5814:        MOV  (XS),XR          LOAD OPERAND
        !          5815:        MOV  (XR),WA          LOAD FIRST WORD
        !          5816:        BEQ  WA,=B$CDC,OGOD1  JUMP IF CODE BLOCK
        !          5817:        BEQ  WA,=B$CDS,OGOD2  JUMP IF CODE BLOCK
        !          5818:        ERB  028,GOTO OPERAND IN DIRECT GOTO IS NOT CODE
        !          5819: *
        !          5820: *      CASE OF COMPLEX FAILURE CODE
        !          5821: *
        !          5822: OGOD1  MOV  FLPTR,XS         POP GARBAGE OFF STACK
        !          5823:        MOV  CDFAL(XR),(XS)   SET NEW FAILURE OFFSET
        !          5824:        BRN  STMGO            JUMP TO EXECUTE CODE
        !          5825: *
        !          5826: *      CASE OF SIMPLE FAILURE CODE
        !          5827: *
        !          5828: OGOD2  MOV  FLPTR,XS         POP GARBAGE OFF STACK
        !          5829:        MOV  *CDFAL,(XS)      SET NEW FAILURE OFFSET
        !          5830:        BRN  STMGO            JUMP TO EXECUTE CODE
        !          5831: *
        !          5832: *      SET GOTO FAILURE TRAP
        !          5833: *
        !          5834: *      THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
        !          5835: *      DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
        !          5836: *
        !          5837: O$GOF  ENT                   ENTRY POINT
        !          5838:        MOV  FLPTR,XR         POINT TO FAIL OFFSET ON STACK
        !          5839:        ICA  (XR)             POINT FAILURE TO O$FIF WORD
        !          5840:        ICP                   POINT TO NEXT CODE WORD
        !          5841:        BRN  EXITS            EXIT TO CONTINUE
        !          5842:        EJC
        !          5843: *
        !          5844: *      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
        !          5845: *
        !          5846: *      THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
        !          5847: *      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
        !          5848: *      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
        !          5849: *
        !          5850: O$IMA  ENT                   ENTRY POINT
        !          5851:        MOV  =P$IMC,WB        SET PCODE FOR LAST NODE
        !          5852:        MOV  (XS)+,WC         POP NAME OFFSET (PARM2)
        !          5853:        MOV  (XS)+,XR         POP NAME BASE (PARM1)
        !          5854:        JSR  PBILD            BUILD P$IMC NODE
        !          5855:        MOV  XR,XL            SAVE PTR TO NODE
        !          5856:        MOV  (XS),XR          LOAD LEFT ARGUMENT
        !          5857:        JSR  GTPAT            CONVERT TO PATTERN
        !          5858:        ERR  029,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN
        !          5859:        MOV  XR,(XS)          SAVE PTR TO LEFT OPERAND PATTERN
        !          5860:        MOV  =P$IMA,WB        SET PCODE FOR FIRST NODE
        !          5861:        JSR  PBILD            BUILD P$IMA NODE
        !          5862:        MOV  (XS)+,PTHEN(XR)  SET LEFT OPERAND AS P$IMA SUCCESSOR
        !          5863:        JSR  PCONC            CONCATENATE TO FORM FINAL PATTERN
        !          5864:        BRN  EXIXR            ALL DONE
        !          5865: *
        !          5866: *      INDIRECTION (BY NAME)
        !          5867: *
        !          5868: O$INN  ENT                   ENTRY POINT
        !          5869:        MNZ  WB               SET FLAG FOR RESULT BY NAME
        !          5870:        BRN  INDIR            JUMP TO COMMON ROUTINE
        !          5871: *
        !          5872: *      INTERROGATION
        !          5873: *
        !          5874: O$INT  ENT                   ENTRY POINT
        !          5875:        MOV  =NULLS,(XS)      REPLACE OPERAND WITH NULL
        !          5876:        BRN  EXITS            EXIT FOR NEXT CODE WORD
        !          5877: *
        !          5878: *      INDIRECTION (BY VALUE)
        !          5879: *
        !          5880: O$INV  ENT                   ENTRY POINT
        !          5881:        ZER  WB               SET FLAG FOR BY VALUE
        !          5882:        BRN  INDIR            JUMP TO COMMON ROUTINE
        !          5883:        EJC
        !          5884: *
        !          5885: *      KEYWORD REFERENCE (BY NAME)
        !          5886: *
        !          5887: O$KWN  ENT                   ENTRY POINT
        !          5888:        JSR  KWNAM            GET KEYWORD NAME
        !          5889:        BRN  EXNAM            EXIT WITH RESULT NAME
        !          5890: *
        !          5891: *      KEYWORD REFERENCE (BY VALUE)
        !          5892: *
        !          5893: O$KWV  ENT                   ENTRY POINT
        !          5894:        JSR  KWNAM            GET KEYWORD NAME
        !          5895:        MOV  XR,DNAMP         DELETE KVBLK
        !          5896:        JSR  ACESS            ACCESS VALUE
        !          5897:        PPM  EXNUL            DUMMY (UNUSED) FAILURE RETURN
        !          5898:        BRN  EXIXR            JUMP WITH VALUE IN XR
        !          5899: *
        !          5900: *      LOAD EXPRESSION BY NAME
        !          5901: *
        !          5902: O$LEX  ENT                   ENTRY POINT
        !          5903:        MOV  *EVSI$,WA        SET SIZE OF EVBLK
        !          5904:        JSR  ALLOC            ALLOCATE SPACE FOR EVBLK
        !          5905:        MOV  =B$EVT,(XR)      SET TYPE WORD
        !          5906:        MOV  =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER
        !          5907:        LCW  WA               LOAD EXBLK POINTER
        !          5908:        MOV  WA,EVEXP(XR)     SET EXBLK POINTER
        !          5909:        MOV  XR,XL            MOVE NAME BASE TO PROPER REG
        !          5910:        MOV  *EVVAR,WA        SET NAME OFFSET = ZERO
        !          5911:        BRN  EXNAM            EXIT WITH NAME IN (XL,WA)
        !          5912: *
        !          5913: *      LOAD PATTERN VALUE
        !          5914: *
        !          5915: O$LPT  ENT                   ENTRY POINT
        !          5916:        LCW  XR               LOAD PATTERN POINTER
        !          5917:        BRN  EXIXR            STACK PTR AND OBEY NEXT CODE WORD
        !          5918:        EJC
        !          5919: *
        !          5920: *      LOAD VARIABLE NAME
        !          5921: *
        !          5922: O$LVN  ENT                   ENTRY POINT
        !          5923:        LCW  WA               LOAD VRBLK POINTER
        !          5924:        MOV  WA,-(XS)         STACK VRBLK PTR (NAME BASE)
        !          5925:        MOV  *VRVAL,-(XS)     STACK NAME OFFSET
        !          5926:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          5927: *
        !          5928: *      BINARY ASTERISK (MULTIPLICATION)
        !          5929: *
        !          5930: O$MLT  ENT                   ENTRY POINT
        !          5931:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
        !          5932:        ERR  030,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC
        !          5933:        ERR  031,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC
        !          5934: .IF    .CNRA
        !          5935: .ELSE
        !          5936:        PPM  OMLT1            JUMP IF REAL OPERANDS
        !          5937: .FI
        !          5938: *
        !          5939: *      HERE TO MULTIPLY TWO INTEGERS
        !          5940: *
        !          5941:        MLI  ICVAL(XL)        MULTIPLY LEFT OPERAND BY RIGHT
        !          5942:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
        !          5943:        ERB  032,MULTIPLICATION CAUSED INTEGER OVERFLOW
        !          5944: .IF    .CNRA
        !          5945: .ELSE
        !          5946: *
        !          5947: *      HERE TO MULTIPLY TWO REALS
        !          5948: *
        !          5949: OMLT1  MLR  RCVAL(XL)        MULTIPLY LEFT OPERAND BY RIGHT
        !          5950:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
        !          5951:        ERB  033,MULTIPLICATION CAUSED REAL OVERFLOW
        !          5952: .FI
        !          5953: *
        !          5954: *      NAME REFERENCE
        !          5955: *
        !          5956: O$NAM  ENT                   ENTRY POINT
        !          5957:        MOV  *NMSI$,WA        SET LENGTH OF NMBLK
        !          5958:        JSR  ALLOC            ALLOCATE NMBLK
        !          5959:        MOV  =B$NML,(XR)      SET NAME BLOCK CODE
        !          5960:        MOV  (XS)+,NMOFS(XR)  SET NAME OFFSET FROM OPERAND
        !          5961:        MOV  (XS)+,NMBAS(XR)  SET NAME BASE FROM OPERAND
        !          5962:        BRN  EXIXR            EXIT WITH RESULT IN XR
        !          5963:        EJC
        !          5964: *
        !          5965: *      NEGATION
        !          5966: *
        !          5967: *      INITIAL ENTRY
        !          5968: *
        !          5969: O$NTA  ENT                   ENTRY POINT
        !          5970:        LCW  WA               LOAD NEW FAILURE OFFSET
        !          5971:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
        !          5972:        MOV  WA,-(XS)         STACK NEW FAILURE OFFSET
        !          5973:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
        !          5974:        BRN  EXITS            JUMP TO CONTINUE EXECUTION
        !          5975: *
        !          5976: *      ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
        !          5977: *
        !          5978: O$NTB  ENT                   ENTRY POINT
        !          5979:        MOV  2(XS),FLPTR      RESTORE OLD FAILURE POINTER
        !          5980:        BRN  EXFAL            AND FAIL
        !          5981: *
        !          5982: *      ENTRY FOR FAILURE DURING OPERAND EVALUATION
        !          5983: *
        !          5984: O$NTC  ENT                   ENTRY POINT
        !          5985:        ICA  XS               POP FAILURE OFFSET
        !          5986:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
        !          5987:        BRN  EXNUL            EXIT GIVING NULL RESULT
        !          5988: *
        !          5989: *      USE OF UNDEFINED OPERATOR
        !          5990: *
        !          5991: O$OUN  ENT                   ENTRY POINT
        !          5992:        ERB  034,UNDEFINED OPERATOR REFERENCED
        !          5993: *
        !          5994: *      BINARY DOT (PATTERN ASSIGNMENT)
        !          5995: *
        !          5996: *      THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
        !          5997: *      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
        !          5998: *      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
        !          5999: *
        !          6000: O$PAS  ENT                   ENTRY POINT
        !          6001:        MOV  =P$PAC,WB        LOAD PCODE FOR P$PAC NODE
        !          6002:        MOV  (XS)+,WC         LOAD NAME OFFSET (PARM2)
        !          6003:        MOV  (XS)+,XR         LOAD NAME BASE (PARM1)
        !          6004:        JSR  PBILD            BUILD P$PAC NODE
        !          6005:        MOV  XR,XL            SAVE PTR TO NODE
        !          6006:        MOV  (XS),XR          LOAD LEFT OPERAND
        !          6007:        JSR  GTPAT            CONVERT TO PATTERN
        !          6008:        ERR  035,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN
        !          6009:        MOV  XR,(XS)          SAVE PTR TO LEFT OPERAND PATTERN
        !          6010:        MOV  =P$PAA,WB        SET PCODE FOR P$PAA NODE
        !          6011:        JSR  PBILD            BUILD P$PAA NODE
        !          6012:        MOV  (XS)+,PTHEN(XR)  SET LEFT OPERAND AS P$PAA SUCCESSOR
        !          6013:        JSR  PCONC            CONCATENATE TO FORM FINAL PATTERN
        !          6014:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          6015:        EJC
        !          6016: *
        !          6017: *      PATTERN MATCH (BY NAME, FOR REPLACEMENT)
        !          6018: *
        !          6019: O$PMN  ENT                   ENTRY POINT
        !          6020:        ZER  WB               SET TYPE CODE FOR MATCH BY NAME
        !          6021:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
        !          6022: *
        !          6023: *      PATTERN MATCH (STATEMENT)
        !          6024: *
        !          6025: *      O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
        !          6026: *      OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
        !          6027: *      CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
        !          6028: *
        !          6029: O$PMS  ENT                   ENTRY POINT
        !          6030:        MOV  =NUM02,WB        SET FLAG FOR STATEMENT TO MATCH
        !          6031:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
        !          6032: *
        !          6033: *      PATTERN MATCH (BY VALUE)
        !          6034: *
        !          6035: O$PMV  ENT                   ENTRY POINT
        !          6036:        MOV  =NUM01,WB        SET TYPE CODE FOR VALUE MATCH
        !          6037:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
        !          6038: *
        !          6039: *      POP TOP ITEM ON STACK
        !          6040: *
        !          6041: O$POP  ENT                   ENTRY POINT
        !          6042:        ICA  XS               POP TOP STACK ENTRY
        !          6043:        BRN  EXITS            OBEY NEXT CODE WORD
        !          6044: *
        !          6045: *      TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
        !          6046: *
        !          6047: O$STP  ENT                   ENTRY POINT
        !          6048:        MOV  =ENDMS,XR        ENDING MESSAGE
        !          6049:        ZER  WA               NO ERROR CODE
        !          6050:        BRN  STOPR            STOP THE RUN
        !          6051: *
        !          6052: *      RETURN NAME FROM EXPRESSION
        !          6053: *      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
        !          6054: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
        !          6055: *      A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
        !          6056: *
        !          6057: O$RNM  ENT                   ENTRY POINT
        !          6058:        JMG  EVLXN            RETURN TO EVALX PROCEDURE
        !          6059:        EJC
        !          6060: *
        !          6061: *      PATTERN REPLACEMENT
        !          6062: *
        !          6063: *      WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
        !          6064: *      ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
        !          6065: *
        !          6066: *                            SUBJECT NAME BASE
        !          6067: *                            SUBJECT NAME OFFSET
        !          6068: *                            INITIAL CURSOR VALUE
        !          6069: *                            FINAL CURSOR VALUE
        !          6070: *                            SUBJECT STRING POINTER
        !          6071: *      (XS) ---------------- REPLACEMENT VALUE
        !          6072: *
        !          6073: O$RPL  ENT                   ENTRY POINT
        !          6074:        JSR  GTSTG            CONVERT REPLACEMENT VAL TO STRING
        !          6075:        ERR  036,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING
        !          6076: *
        !          6077: *      GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
        !          6078: *
        !          6079:        MOV  (XS),XL          LOAD SUBJECT STRING POINTER
        !          6080: .IF    .CNBF
        !          6081: .ELSE
        !          6082:        BEQ  (XL),=B$BCT,ORPL5 BRANCH IF BUFFER ASSIGNMENT
        !          6083: .FI
        !          6084:        ADD  SCLEN(XL),WA     ADD SUBJECT STRING LENGTH
        !          6085:        ADD  2(XS),WA         ADD STARTING CURSOR
        !          6086:        SUB  1(XS),WA         MINUS FINAL CURSOR = TOTAL LENGTH
        !          6087:        BZE  WA,ORPL3         JUMP IF RESULT IS NULL
        !          6088:        MOV  XR,-(XS)         RESTACK REPLACEMENT STRING
        !          6089:        JSR  ALOCS            ALLOCATE SCBLK FOR RESULT
        !          6090:        MOV  3(XS),WA         GET INITIAL CURSOR (PART 1 LEN)
        !          6091:        MOV  XR,3(XS)         STACK RESULT POINTER
        !          6092:        PSC  XR               POINT TO CHARACTERS OF RESULT
        !          6093: *
        !          6094: *      MOVE PART 1 (START OF SUBJECT) TO RESULT
        !          6095: *
        !          6096:        BZE  WA,ORPL1         JUMP IF FIRST PART IS NULL
        !          6097:        MOV  1(XS),XL         ELSE POINT TO SUBJECT STRING
        !          6098:        PLC  XL               POINT TO SUBJECT STRING CHARS
        !          6099:        MVC                   MOVE FIRST PART TO RESULT
        !          6100:        EJC
        !          6101: *      PATTERN REPLACEMENT (CONTINUED)
        !          6102: *
        !          6103: *      NOW MOVE IN REPLACEMENT VALUE
        !          6104: *
        !          6105: ORPL1  MOV  (XS)+,XL         LOAD REPLACEMENT STRING, POP
        !          6106:        MOV  SCLEN(XL),WA     LOAD LENGTH
        !          6107:        BZE  WA,ORPL2         JUMP IF NULL REPLACEMENT
        !          6108:        PLC  XL               ELSE POINT TO CHARS OF REPLACEMENT
        !          6109:        MVC                   MOVE IN CHARS (PART 2)
        !          6110: *
        !          6111: *      NOW MOVE IN REMAINDER OF STRING (PART 3)
        !          6112: *
        !          6113: ORPL2  MOV  (XS)+,XL         LOAD SUBJECT STRING POINTER, POP
        !          6114:        MOV  (XS)+,WC         LOAD FINAL CURSOR, POP
        !          6115:        MOV  SCLEN(XL),WA     LOAD SUBJECT STRING LENGTH
        !          6116:        SUB  WC,WA            MINUS FINAL CURSOR = PART 3 LENGTH
        !          6117:        BZE  WA,ORPL4         JUMP TO ASSIGN IF PART 3 IS NULL
        !          6118:        PLC  XL,WC            ELSE POINT TO LAST PART OF STRING
        !          6119:        MVC                   MOVE PART 3 TO RESULT
        !          6120:        BRN  ORPL4            JUMP TO PERFORM ASSIGNMENT
        !          6121: *
        !          6122: *      HERE IF RESULT IS NULL
        !          6123: *
        !          6124: ORPL3  ADD  *NUM02,XS        POP SUBJECT STR PTR, FINAL CURSOR
        !          6125:        MOV  =NULLS,(XS)      SET NULL RESULT
        !          6126: *
        !          6127: *      MERGE WITH ASSIGNMENT ROUTINE
        !          6128: *
        !          6129: ORPL4  MOV  =O$ASS,XL        CONTINUATION ROUTINE
        !          6130:        BRI  XL               ENTER ROUTINE
        !          6131: .IF    .CNBF
        !          6132: .ELSE
        !          6133: *
        !          6134: *      HERE FOR BUFFER SUBSTRING ASSIGNMENT
        !          6135: *
        !          6136: ORPL5  MOV  XR,XL            COPY SCBLK REPLACEMENT PTR
        !          6137:        MOV  (XS)+,XR         UNSTACK BCBLK PTR
        !          6138:        MOV  (XS)+,WB         GET FINAL CURSOR VALUE
        !          6139:        MOV  (XS)+,WA         GET INITIAL CURSOR
        !          6140:        SUB  WA,WB            GET LENGTH IN WB
        !          6141:        ADD  *NUM02,XS        GET RID OF NAME BASE/OFFSET
        !          6142:        JSR  INSBF            INSERT SUBSTRING
        !          6143:        PPM                   CONVERT FAIL IMPOSSIBLE
        !          6144:        PPM  EXFAL            FAIL IF INSERT FAILS
        !          6145:        BRN  EXNUL            ELSE NULL RESULT
        !          6146: .FI
        !          6147:        EJC
        !          6148: *
        !          6149: *      RETURN VALUE FROM EXPRESSION
        !          6150: *
        !          6151: *      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
        !          6152: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
        !          6153: *      A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
        !          6154: *
        !          6155: O$RVL  ENT                   ENTRY POINT
        !          6156:        BRN  EVLXV            RETURN TO EVALX PROCEDURE
        !          6157:        EJC
        !          6158: *
        !          6159: *      SELECTION
        !          6160: *
        !          6161: *      INITIAL ENTRY
        !          6162: *
        !          6163: O$SLA  ENT                   ENTRY POINT
        !          6164:        LCW  WA               LOAD NEW FAILURE OFFSET
        !          6165:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
        !          6166:        MOV  WA,-(XS)         STACK NEW FAILURE OFFSET
        !          6167:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
        !          6168:        BRN  EXITS            JUMP TO EXECUTE FIRST ALTERNATIVE
        !          6169: *
        !          6170: *      ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
        !          6171: *
        !          6172: O$SLB  ENT                   ENTRY POINT
        !          6173:        MOV  (XS)+,XR         LOAD RESULT
        !          6174:        ICA  XS               POP FAIL OFFSET
        !          6175:        MOV  (XS),FLPTR       RESTORE OLD FAILURE POINTER
        !          6176:        MOV  XR,(XS)          RESTACK RESULT
        !          6177:        LCW  WA               LOAD NEW CODE OFFSET
        !          6178:        ADD  R$COD,WA         POINT TO ABSOLUTE CODE LOCATION
        !          6179:        LCP  WA               SET NEW CODE POINTER
        !          6180:        BRN  EXITS            JUMP TO CONTINUE PAST SELECTION
        !          6181: *
        !          6182: *      ENTRY AT START OF SUBSEQUENT ALTERNATIVES
        !          6183: *
        !          6184: O$SLC  ENT                   ENTRY POINT
        !          6185:        LCW  WA               LOAD NEW FAIL OFFSET
        !          6186:        MOV  WA,(XS)          STORE NEW FAIL OFFSET
        !          6187:        BRN  EXITS            JUMP TO EXECUTE NEXT ALTERNATIVE
        !          6188: *
        !          6189: *      ENTRY AT START OF LAST ALTERNATIVE
        !          6190: *
        !          6191: O$SLD  ENT                   ENTRY POINT
        !          6192:        ICA  XS               POP FAILURE OFFSET
        !          6193:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
        !          6194:        BRN  EXITS            JUMP TO EXECUTE LAST ALTERNATIVE
        !          6195:        EJC
        !          6196: *
        !          6197: *      BINARY MINUS (SUBTRACTION)
        !          6198: *
        !          6199: O$SUB  ENT                   ENTRY POINT
        !          6200:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
        !          6201:        ERR  037,SUBTRACTION LEFT OPERAND IS NOT NUMERIC
        !          6202:        ERR  038,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC
        !          6203: .IF    .CNRA
        !          6204: .ELSE
        !          6205:        PPM  OSUB1            JUMP IF REAL OPERANDS
        !          6206: .FI
        !          6207: *
        !          6208: *      HERE TO SUBTRACT TWO INTEGERS
        !          6209: *
        !          6210:        SBI  ICVAL(XL)        SUBTRACT RIGHT OPERAND FROM LEFT
        !          6211:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
        !          6212:        ERB  039,SUBTRACTION CAUSED INTEGER OVERFLOW
        !          6213: .IF    .CNRA
        !          6214: .ELSE
        !          6215: *
        !          6216: *      HERE TO SUBTRACT TWO REALS
        !          6217: *
        !          6218: OSUB1  SBR  RCVAL(XL)        SUBTRACT RIGHT OPERAND FROM LEFT
        !          6219:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
        !          6220:        ERB  040,SUBTRACTION CAUSED REAL OVERFLOW
        !          6221: .FI
        !          6222: *
        !          6223: *      DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
        !          6224: *
        !          6225: O$TXR  ENT                   ENTRY POINT
        !          6226:        JMG  TRXQR            JUMP INTO TRXEQ PROCEDURE
        !          6227: *
        !          6228: *      UNEXPECTED FAILURE
        !          6229: *
        !          6230: *      NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
        !          6231: *      TRANSFER TO SYSTEM LABEL CONTINUE
        !          6232: *      WILL RESULT IN LOOPING HERE.  DIFFICULT TO AVOID EXCEPT
        !          6233: *      WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
        !          6234: *      ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
        !          6235: *
        !          6236: O$UNF  ENT                   ENTRY POINT
        !          6237:        ERB  041,UNEXPECTED FAILURE IN -NOFAIL MODE
        !          6238:        TTL  S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
        !          6239: *
        !          6240: *      THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
        !          6241: *      WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
        !          6242: *
        !          6243: *      CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
        !          6244: *
        !          6245: *      ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
        !          6246: *      LETTER VARIABLE NAME IDENTIFIER.
        !          6247: *
        !          6248: *      ENTRIES ARE IN ALPHABETICAL ORDER
        !          6249: *
        !          6250: *      ABORT
        !          6251: *
        !          6252: L$ABO  ENT                   ENTRY POINT
        !          6253:        MOV  KVERT,WA         LOAD ERROR CODE
        !          6254:        ZER  XR               INDICATE NO ENDING MESSAGE
        !          6255:        BNZ  WA,STOPR         STOP RUN
        !          6256: *
        !          6257: *
        !          6258: *      FAIL IF NO ERROR HAD OCCURED
        !          6259: *
        !          6260:        ERB  042,GOTO ABORT WITH NO PRECEDING ERROR
        !          6261: *
        !          6262: *      CONTINUE
        !          6263: *
        !          6264: L$CNT  ENT                   ENTRY POINT
        !          6265: *
        !          6266: *      MERGE HERE AFTER EXECUTION ERROR
        !          6267: *
        !          6268: LCNXE  MOV  R$CNT,XR         LOAD CONTINUATION CODE BLOCK PTR
        !          6269:        BZE  XR,LCNT1         JUMP IF NO PREVIOUS ERROR
        !          6270:        ZER  R$CNT            CLEAR FLAG
        !          6271:        MOV  XR,R$COD         ELSE STORE AS NEW CODE BLOCK PTR
        !          6272:        ADD  STXOF,XR         ADD FAILURE OFFSET
        !          6273:        LCP  XR               LOAD CODE POINTER
        !          6274:        MOV  FLPTR,XS         RESET STACK POINTER
        !          6275:        BRN  EXITS            JUMP TO TAKE INDICATED FAILURE
        !          6276: *
        !          6277: *      HERE IF NO PREVIOUS ERROR
        !          6278: *
        !          6279: LCNT1  ERB  043,GOTO CONTINUE WITH NO PRECEDING ERROR
        !          6280:        EJC
        !          6281: *
        !          6282: *      END
        !          6283: *
        !          6284: L$END  ENT                   ENTRY POINT
        !          6285:        MOV  =ENDMS,XR        POINT TO MESSAGE /NORMAL TERM../
        !          6286:        ZER  WA               NO ERROR CODE
        !          6287:        BRN  STOPR            JUMP TO ROUTINE TO STOP RUN
        !          6288: *
        !          6289: *      FRETURN
        !          6290: *
        !          6291: L$FRT  ENT                   ENTRY POINT
        !          6292:        MOV  =SCFRT,WA        POINT TO STRING /FRETURN/
        !          6293:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
        !          6294: *
        !          6295: *      NRETURN
        !          6296: *
        !          6297: L$NRT  ENT                   ENTRY POINT
        !          6298:        MOV  =SCNRT,WA        POINT TO STRING /NRETURN/
        !          6299:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
        !          6300: *
        !          6301: *      RETURN
        !          6302: *
        !          6303: L$RTN  ENT                   ENTRY POINT
        !          6304:        MOV  =SCRTN,WA        POINT TO STRING /RETURN/
        !          6305:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
        !          6306: *
        !          6307: *      UNDEFINED LABEL
        !          6308: *
        !          6309: L$UND  ENT                   ENTRY POINT
        !          6310:        ERB  044,GOTO UNDEFINED LABEL
        !          6311:        TTL  S P I T B O L -- BLOCK ACTION ROUTINES
        !          6312: *
        !          6313: *      THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
        !          6314: *      VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
        !          6315: *      POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
        !          6316: *      POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
        !          6317: *      PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
        !          6318: *      LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
        !          6319: *      (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
        !          6320: *      THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
        !          6321: *
        !          6322: *      THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
        !          6323: *      FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
        !          6324: *      THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
        !          6325: *
        !          6326: *      IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
        !          6327: *      TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
        !          6328: *      IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
        !          6329: *
        !          6330: *      FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
        !          6331: *      AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
        !          6332: *
        !          6333: *      THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
        !          6334: *      WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
        !          6335: *      THE INDIVIDUAL ROUTINES AS REQUIRED.
        !          6336: *
        !          6337: *      THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
        !          6338: *      FOLLOWING EXCEPTIONS.
        !          6339: *
        !          6340: *      THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
        !          6341: *      THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
        !          6342: *      THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
        !          6343: *
        !          6344: *      THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
        !          6345: *      SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
        !          6346: *      TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
        !          6347: *
        !          6348: *      THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
        !          6349: *      PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
        !          6350: *      AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
        !          6351: *
        !          6352: *      THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
        !          6353: *      ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
        !          6354: *      MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
        !          6355: *
        !          6356: B$AAA  ENT  BL$$I            ENTRY POINT OF FIRST BLOCK ROUTINE
        !          6357:        EJC
        !          6358: *
        !          6359: *      EXBLK
        !          6360: *
        !          6361: *      THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
        !          6362: *      THE STACK AS A VALUE.
        !          6363: *
        !          6364: *      (XR)                  POINTER TO EXBLK
        !          6365: *
        !          6366: B$EXL  ENT  BL$EX            ENTRY POINT (EXBLK)
        !          6367:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
        !          6368: *
        !          6369: *      SEBLK
        !          6370: *
        !          6371: *      THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
        !          6372: *      CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
        !          6373: *
        !          6374: B$SEL  ENT  BL$SE            ENTRY POINT (SEBLK)
        !          6375:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
        !          6376: *
        !          6377: *      DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
        !          6378: *
        !          6379: B$E$$  ENT  BL$$I            ENTRY POINT
        !          6380: *
        !          6381: *      TRBLK
        !          6382: *
        !          6383: *      THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
        !          6384: *
        !          6385: B$TRT  ENT  BL$TR            ENTRY POINT (TRBLK)
        !          6386: *
        !          6387: *      DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
        !          6388: *
        !          6389: B$T$$  ENT  BL$$I            END OF TRBLK,SEBLK,EXBLK ENTRIES
        !          6390: *
        !          6391: *      ARBLK
        !          6392: *
        !          6393: *      THE ROUTINE FOR ARBLK IS NEVER EXECUTED
        !          6394: *
        !          6395: B$ART  ENT  BL$AR            ENTRY POINT (ARBLK)
        !          6396:        EJC
        !          6397: .IF    .CNBF
        !          6398: .ELSE
        !          6399: *
        !          6400: *      BCBLK
        !          6401: *
        !          6402: *      THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
        !          6403: *
        !          6404: *      (XR)                  POINTER TO BCBLK
        !          6405: *
        !          6406: B$BCT  ENT  BL$BC            ENTRY POINT (BCBLK)
        !          6407: *
        !          6408: *      BFBLK
        !          6409: *
        !          6410: *      THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
        !          6411: *
        !          6412: *      (XR)                  POINTER TO BFBLK
        !          6413: *
        !          6414: B$BFT  ENT  BL$BF            ENTRY POINT (BFBLK)
        !          6415:        EJC
        !          6416: .FI
        !          6417: *
        !          6418: *      CCBLK
        !          6419: *
        !          6420: *      THE ROUTINE FOR CCBLK IS NEVER ENTERED
        !          6421: *
        !          6422: B$CCT  ENT  BL$CC            ENTRY POINT (CCBLK)
        !          6423: *
        !          6424: *      CDBLK
        !          6425: *
        !          6426: *      THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
        !          6427: *      THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
        !          6428: *
        !          6429: *      ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
        !          6430: *
        !          6431: *      (XR)                  POINTER TO CDBLK
        !          6432: *
        !          6433: B$CDC  ENT  BL$CD            ENTRY POINT (CDBLK)
        !          6434:        MOV  FLPTR,XS         POP GARBAGE OFF STACK
        !          6435:        MOV  CDFAL(XR),(XS)   SET FAILURE OFFSET
        !          6436:        BRN  STMGO            ENTER STMT
        !          6437: *
        !          6438: *      ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
        !          6439: *
        !          6440: *      (XR)                  POINTER TO CDBLK
        !          6441: *
        !          6442: B$CDS  ENT  BL$CD            ENTRY POINT (CDBLK)
        !          6443:        MOV  FLPTR,XS         POP GARBAGE OFF STACK
        !          6444:        MOV  *CDFAL,(XS)      SET FAILURE OFFSET
        !          6445:        BRN  STMGO            ENTER STMT
        !          6446: *
        !          6447: *      CMBLK
        !          6448: *
        !          6449: *      THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
        !          6450: *
        !          6451: B$CMT  ENT  BL$CM            ENTRY POINT (CMBLK)
        !          6452: *
        !          6453: *      COBLK
        !          6454: *
        !          6455: *      THE ROUTINE FOR A COBLK IS NEVER EXECUTED
        !          6456: *
        !          6457: B$COP  ENT  BL$CO            ENTRY POINT (COBLK)
        !          6458: *
        !          6459: *      CTBLK
        !          6460: *
        !          6461: *      THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
        !          6462: *
        !          6463: B$CTT  ENT  BL$CT            ENTRY POINT (CTBLK)
        !          6464:        EJC
        !          6465: *
        !          6466: *      DFBLK
        !          6467: *
        !          6468: *      THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
        !          6469: *      TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
        !          6470: *
        !          6471: *      (XL)                  POINTER TO DFBLK
        !          6472: *
        !          6473: B$DFC  ENT  BL$DF            ENTRY POINT
        !          6474:        MOV  DFPDL(XL),WA     LOAD LENGTH OF PDBLK
        !          6475:        JSR  ALLOC            ALLOCATE PDBLK
        !          6476:        MOV  =B$PDT,(XR)      STORE TYPE WORD
        !          6477:        MOV  XL,PDDFP(XR)     STORE DFBLK POINTER
        !          6478:        MOV  XR,WC            SAVE POINTER TO PDBLK
        !          6479:        ADD  WA,XR            POINT PAST PDBLK
        !          6480:        LCT  WA,FARGS(XL)     SET TO COUNT FIELDS
        !          6481: *
        !          6482: *      LOOP TO ACQUIRE FIELD VALUES FROM STACK
        !          6483: *
        !          6484: BDFC1  MOV  (XS)+,-(XR)      MOVE A FIELD VALUE
        !          6485:        BCT  WA,BDFC1         LOOP TILL ALL MOVED
        !          6486:        MOV  WC,XR            RECALL POINTER TO PDBLK
        !          6487:        BRN  EXSID            EXIT SETTING ID FIELD
        !          6488: .IF    .CNLD
        !          6489: .ELSE
        !          6490:        EJC
        !          6491: *
        !          6492: *      EFBLK
        !          6493: *
        !          6494: *      THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
        !          6495: *      ENTRY TO CALL AN EXTERNAL FUNCTION.
        !          6496: *
        !          6497: *      (XL)                  POINTER TO EFBLK
        !          6498: *
        !          6499: B$EFC  ENT  BL$EF            ENTRY POINT (EFBLK)
        !          6500:        MOV  FARGS(XL),WC     LOAD NUMBER OF ARGUMENTS
        !          6501:        WTB  WC               CONVERT TO OFFSET
        !          6502:        MOV  XL,-(XS)         SAVE POINTER TO EFBLK
        !          6503:        MOV  XS,XT            COPY POINTER TO ARGUMENTS
        !          6504: *
        !          6505: *      LOOP TO CONVERT ARGUMENTS
        !          6506: *
        !          6507: BEFC1  ICA  XT               POINT TO NEXT ENTRY
        !          6508:        MOV  (XS),XR          LOAD POINTER TO EFBLK
        !          6509:        DCA  WC               DECREMENT EFTAR OFFSET
        !          6510:        ADD  WC,XR            POINT TO NEXT EFTAR ENTRY
        !          6511:        MOV  EFTAR(XR),XR     LOAD EFTAR ENTRY
        !          6512:        BSW  XR,5,BEFC7       SWITCH ON EFTAR TYPE
        !          6513:        IFF  1,BEFC2          STRING
        !          6514:        IFF  2,BEFC3          INTEGER
        !          6515: .IF    .CNRA
        !          6516: .ELSE
        !          6517:        IFF  3,BEFC4          REAL
        !          6518: .FI
        !          6519: .IF    .CNBF
        !          6520: .ELSE
        !          6521:        IFF  4,BEFCA          BUFFER
        !          6522: .FI
        !          6523:        ESW                   END OF SWITCH ON TYPE
        !          6524: *
        !          6525: *      HERE TO CONVERT TO STRING
        !          6526: *
        !          6527: BEFC2  MOV  (XT),-(XS)       STACK ARG PTR
        !          6528:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
        !          6529:        ERR  045,EXTERNAL FUNCTION ARGUMENT IS NOT STRING
        !          6530:        BRN  BEFC6            JUMP TO MERGE
        !          6531:        EJC
        !          6532: *
        !          6533: *      EFBLK (CONTINUED)
        !          6534: *
        !          6535: *      HERE TO CONVERT AN INTEGER
        !          6536: *
        !          6537: BEFC3  MOV  (XT),XR          LOAD NEXT ARGUMENT
        !          6538:        MOV  WC,BEFOF         SAVE OFFSET
        !          6539:        JSR  GTINT            CONVERT TO INTEGER
        !          6540:        ERR  046,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER
        !          6541: .IF    .CNRA
        !          6542: .ELSE
        !          6543:        BRN  BEFC5            MERGE WITH REAL CASE
        !          6544: *
        !          6545: *      HERE TO CONVERT A REAL
        !          6546: *
        !          6547: BEFC4  MOV  (XT),XR          LOAD NEXT ARGUMENT
        !          6548:        MOV  WC,BEFOF         SAVE OFFSET
        !          6549:        JSR  GTREA            CONVERT TO REAL
        !          6550:        ERR  047,EXTERNAL FUNCTION ARGUMENT IS NOT REAL
        !          6551: *
        !          6552: *      INTEGER CASE MERGES HERE
        !          6553: *
        !          6554: .FI
        !          6555: .IF    .CNBF
        !          6556: .ELSE
        !          6557:        BRN  BEFC5            MERGE
        !          6558: *
        !          6559: *      HERE TO CONVERT BUFFER
        !          6560: *
        !          6561: BEFCA  MOV  (XT),XR          LOAD ARGUMENT
        !          6562:        MOV  WC,BEFOF         SAVE OFFSET
        !          6563:        MOV  XL,-(XS)         SAVE EFBLK PTR
        !          6564:        JSR  GTBUF            GET A BUFFER
        !          6565:        ERR  259,EXTERNAL FUNCTION ARGUMENT IS NOT BUFFER
        !          6566:        MOV  (XS)+,XL         RESTORE EFBLK PTR
        !          6567: *
        !          6568: *      INTEGER AND REAL CASE MERGES HERE
        !          6569: *
        !          6570: .FI
        !          6571: BEFC5  MOV  BEFOF,WC         RESTORE OFFSET
        !          6572: *
        !          6573: *      STRING MERGES HERE
        !          6574: *
        !          6575: BEFC6  MOV  XR,(XT)          STORE CONVERTED RESULT
        !          6576: *
        !          6577: *      NO CONVERSION MERGES HERE
        !          6578: *
        !          6579: BEFC7  BNZ  WC,BEFC1         LOOP BACK IF MORE TO GO
        !          6580: *
        !          6581: *      HERE AFTER CONVERTING ALL THE ARGUMENTS
        !          6582: *
        !          6583:        MOV  (XS)+,XL         RESTORE EFBLK POINTER
        !          6584:        MOV  FARGS(XL),WA     GET NUMBER OF ARGS
        !          6585:        JSR  SYSEX            CALL ROUTINE TO CALL EXTERNAL FNC
        !          6586:        PPM  EXFAL            FAIL IF FAILURE
        !          6587:        EJC
        !          6588: *
        !          6589: *      EFBLK (CONTINUED)
        !          6590: *
        !          6591: *      RETURN HERE WITH RESULT IN XR
        !          6592: *
        !          6593: *      FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
        !          6594: *
        !          6595:        MOV  EFRSL(XL),WB     GET RESULT TYPE
        !          6596:        BNZ  WB,BEFA8         BRANCH IF NOT UNCONVERTED
        !          6597:        BNE  (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING
        !          6598:        BZE  SCLEN(XR),EXNUL  RETURN NULL IF NULL
        !          6599: *
        !          6600: *      HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
        !          6601: *
        !          6602: BEFA8  BNE  WB,=NUM01,BEFC8  JUMP IF NOT A STRING
        !          6603:        BZE  SCLEN(XR),EXNUL  RETURN NULL IF NULL
        !          6604: *
        !          6605: *      RETURN IF RESULT IS IN DYNAMIC STORAGE
        !          6606: *
        !          6607: BEFC8  BLT  XR,DNAMB,BEFC9   JUMP IF NOT IN DYNAMIC STORAGE
        !          6608:        BLE  XR,DNAMP,EXIXR   RETURN RESULT IF ALREADY DYNAMIC
        !          6609: *
        !          6610: *      HERE WE COPY A RESULT INTO THE DYNAMIC REGION
        !          6611: *
        !          6612: BEFC9  MOV  (XR),WA          GET POSSIBLE TYPE WORD
        !          6613:        BZE  WB,BEF11         JUMP IF UNCONVERTED RESULT
        !          6614:        MOV  =B$SCL,WA        STRING
        !          6615:        BEQ  WB,=NUM01,BEF10  YES JUMP
        !          6616:        MOV  =B$ICL,WA        INTEGER
        !          6617:        BEQ  WB,=NUM02,BEF10  YES JUMP
        !          6618: .IF    .CNRA
        !          6619: .ELSE
        !          6620:        MOV  =B$RCL,WA        REAL
        !          6621:        BEQ  WB,=NUM03,BEF10  YES JUMP
        !          6622: .FI
        !          6623: .IF    .CNBF
        !          6624: .ELSE
        !          6625:        MOV  =B$BCT,WA        BUFFER
        !          6626:        BEQ  WB,=NUM04,BEF10  YES JUMP
        !          6627: .FI
        !          6628: *
        !          6629: *      STORE TYPE WORD IN RESULT
        !          6630: *
        !          6631: BEF10  MOV  WA,(XR)          STORED BEFORE COPYING TO DYNAMIC
        !          6632: *
        !          6633: *      MERGE FOR UNCONVERTED RESULT
        !          6634: *
        !          6635: BEF11  JSR  BLKLN            GET LENGTH OF BLOCK
        !          6636:        MOV  XR,XL            COPY ADDRESS OF OLD BLOCK
        !          6637:        JSR  ALLOC            ALLOCATE DYNAMIC BLOCK SAME SIZE
        !          6638:        MOV  XR,-(XS)         SET POINTER TO NEW BLOCK AS RESULT
        !          6639:        MVW                   COPY OLD BLOCK TO DYNAMIC BLOCK
        !          6640:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          6641: .FI
        !          6642: *
        !          6643: *      EVBLK
        !          6644: *
        !          6645: *      THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
        !          6646: *
        !          6647: B$EVT  ENT  BL$EV            ENTRY POINT (EVBLK)
        !          6648:        EJC
        !          6649: *
        !          6650: *      FFBLK
        !          6651: *
        !          6652: *      THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
        !          6653: *      TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
        !          6654: *
        !          6655: *      (XL)                  POINTER TO FFBLK
        !          6656: *
        !          6657: B$FFC  ENT  BL$FF            ENTRY POINT (FFBLK)
        !          6658:        MOV  XL,XR            COPY FFBLK POINTER
        !          6659:        LCW  WC               LOAD NEXT CODE WORD
        !          6660:        MOV  (XS),XL          LOAD PDBLK POINTER
        !          6661:        BNE  (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL
        !          6662:        MOV  PDDFP(XL),WA     LOAD DFBLK POINTER FROM PDBLK
        !          6663: *
        !          6664: *      LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
        !          6665: *
        !          6666: BFFC1  BEQ  WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK
        !          6667:        MOV  FFNXT(XR),XR     ELSE LINK TO NEXT FFBLK ON CHAIN
        !          6668:        BNZ  XR,BFFC1         LOOP BACK IF ANOTHER ENTRY TO CHECK
        !          6669: *
        !          6670: *      HERE FOR BAD ARGUMENT
        !          6671: *
        !          6672: BFFC2  ERB  048,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE
        !          6673: *
        !          6674: *      HERE AFTER LOCATING CORRECT FFBLK
        !          6675: *
        !          6676: BFFC3  MOV  FFOFS(XR),WA     LOAD FIELD OFFSET
        !          6677:        BEQ  WC,=OFNE$,BFFC5  JUMP IF CALLED BY NAME
        !          6678:        ADD  WA,XL            ELSE POINT TO VALUE FIELD
        !          6679:        MOV  (XL),XR          LOAD VALUE
        !          6680:        BNE  (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED
        !          6681:        SUB  WA,XL            ELSE RESTORE NAME BASE,OFFSET
        !          6682:        MOV  WC,(XS)          SAVE NEXT CODE WORD OVER PDBLK PTR
        !          6683:        JSR  ACESS            ACCESS VALUE
        !          6684:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          6685:        MOV  (XS),WC          RESTORE NEXT CODE WORD
        !          6686: *
        !          6687: *      HERE AFTER GETTING VALUE IN (XR)
        !          6688: *
        !          6689: BFFC4  MOV  XR,(XS)          STORE VALUE ON STACK (OVER PDBLK)
        !          6690:        MOV  WC,XR            COPY NEXT CODE WORD
        !          6691:        MOV  (XR),XL          LOAD ENTRY ADDRESS
        !          6692:        BRI  XL               JUMP TO ROUTINE FOR NEXT CODE WORD
        !          6693: *
        !          6694: *      HERE IF CALLED BY NAME
        !          6695: *
        !          6696: BFFC5  MOV  WA,-(XS)         STORE NAME OFFSET (BASE IS SET)
        !          6697:        BRN  EXITS            EXIT WITH NAME ON STACK
        !          6698:        EJC
        !          6699: *
        !          6700: *      ICBLK
        !          6701: *
        !          6702: *      THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
        !          6703: *      CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
        !          6704: *
        !          6705: *      (XR)                  POINTER TO ICBLK
        !          6706: *
        !          6707: B$ICL  ENT  BL$IC            ENTRY POINT (ICBLK)
        !          6708:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
        !          6709: *
        !          6710: *      KVBLK
        !          6711: *
        !          6712: *      THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
        !          6713: *
        !          6714: B$KVT  ENT  BL$KV            ENTRY POINT (KVBLK)
        !          6715: *
        !          6716: *      NMBLK
        !          6717: *
        !          6718: *      THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
        !          6719: *      CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
        !          6720: *      WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
        !          6721: *      BE PREEVALUATED AT COMPILE TIME.
        !          6722: *
        !          6723: *      (XR)                  POINTER TO NMBLK
        !          6724: *
        !          6725: B$NML  ENT  BL$NM            ENTRY POINT (NMBLK)
        !          6726:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
        !          6727: *
        !          6728: *      PDBLK
        !          6729: *
        !          6730: *      THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
        !          6731: *
        !          6732: B$PDT  ENT  BL$PD            ENTRY POINT (PDBLK)
        !          6733:        EJC
        !          6734: *
        !          6735: *      PFBLK
        !          6736: *
        !          6737: *      THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
        !          6738: *      TO CALL A PROGRAM DEFINED FUNCTION.
        !          6739: *
        !          6740: *      (XL)                  POINTER TO PFBLK
        !          6741: *
        !          6742: *      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
        !          6743: *      CONTROL TO THE PROGRAM DEFINED FUNCTION.
        !          6744: *
        !          6745: *                            SAVED VALUE OF FIRST ARGUMENT
        !          6746: *                            .
        !          6747: *                            SAVED VALUE OF LAST ARGUMENT
        !          6748: *                            SAVED VALUE OF FIRST LOCAL
        !          6749: *                            .
        !          6750: *                            SAVED VALUE OF LAST LOCAL
        !          6751: *                            SAVED VALUE OF FUNCTION NAME
        !          6752: *                            SAVED CODE BLOCK PTR (R$COD)
        !          6753: *                            SAVED CODE POINTER (-R$COD)
        !          6754: *                            SAVED VALUE OF FLPRT
        !          6755: *                            SAVED VALUE OF FLPTR
        !          6756: *                            POINTER TO PFBLK
        !          6757: *      FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
        !          6758: *
        !          6759: B$PFC  ENT  BL$PF            ENTRY POINT (PFBLK)
        !          6760:        MOV  XL,BPFPF         SAVE PFBLK PTR (NEED NOT BE RELOC)
        !          6761:        MOV  XL,XR            COPY FOR THE MOMENT
        !          6762:        MOV  PFVBL(XR),XL     POINT TO VRBLK FOR FUNCTION
        !          6763: *
        !          6764: *      LOOP TO FIND OLD VALUE OF FUNCTION
        !          6765: *
        !          6766: BPF01  MOV  XL,WB            SAVE POINTER
        !          6767:        MOV  VRVAL(XL),XL     LOAD VALUE
        !          6768:        BEQ  (XL),=B$TRT,BPF01 LOOP IF TRBLK
        !          6769: *
        !          6770: *      SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
        !          6771: *
        !          6772:        MOV  XL,BPFSV         SAVE OLD VALUE
        !          6773:        MOV  WB,XL            POINT BACK TO BLOCK WITH VALUE
        !          6774:        MOV  =NULLS,VRVAL(XL) SET VALUE TO NULL
        !          6775:        MOV  FARGS(XR),WA     LOAD NUMBER OF ARGUMENTS
        !          6776:        ADD  *PFARG,XR        POINT TO PFARG ENTRIES
        !          6777:        BZE  WA,BPF04         JUMP IF NO ARGUMENTS
        !          6778:        MOV  XS,XT            PTR TO LAST ARG
        !          6779:        WTB  WA               CONVERT NO. OF ARGS TO BAUS OFFSET
        !          6780:        ADD  WA,XT            POINT BEFORE FIRST ARG
        !          6781:        MOV  XT,BPFXT         REMEMBER ARG POINTER
        !          6782:        EJC
        !          6783: *
        !          6784: *      PFBLK (CONTINUED)
        !          6785: *
        !          6786: *      LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
        !          6787: *
        !          6788: BPF02  MOV  (XR)+,XL         LOAD VRBLK PTR FOR NEXT ARGUMENT
        !          6789: *
        !          6790: *      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
        !          6791: *
        !          6792: BPF03  MOV  XL,WC            SAVE POINTER
        !          6793:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE
        !          6794:        BEQ  (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK
        !          6795: *
        !          6796: *      SAVE OLD VALUE AND GET NEW VALUE
        !          6797: *
        !          6798:        MOV  XL,WA            KEEP OLD VALUE
        !          6799:        MOV  BPFXT,XT         POINT BEFORE NEXT STACKED ARG
        !          6800:        MOV  -(XT),WB         LOAD ARGUMENT (NEW VALUE)
        !          6801:        MOV  WA,(XT)          SAVE OLD VALUE
        !          6802:        MOV  XT,BPFXT         KEEP ARG PTR FOR NEXT TIME
        !          6803:        MOV  WC,XL            POINT BACK TO BLOCK WITH VALUE
        !          6804:        MOV  WB,VRVAL(XL)     SET NEW VALUE
        !          6805:        BNE  XS,BPFXT,BPF02   LOOP IF NOT ALL DONE
        !          6806: *
        !          6807: *      NOW PROCESS LOCALS
        !          6808: *
        !          6809: BPF04  MOV  BPFPF,XL         RESTORE PFBLK POINTER
        !          6810:        MOV  PFNLO(XL),WA     LOAD NUMBER OF LOCALS
        !          6811:        BZE  WA,BPF07         JUMP IF NO LOCALS
        !          6812:        MOV  =NULLS,WB        GET NULL CONSTANT
        !          6813:        LCT  WA,WA            SET LOCAL COUNTER
        !          6814: *
        !          6815: *      LOOP TO PROCESS LOCALS
        !          6816: *
        !          6817: BPF05  MOV  (XR)+,XL         LOAD VRBLK PTR FOR NEXT LOCAL
        !          6818: *
        !          6819: *      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
        !          6820: *
        !          6821: BPF06  MOV  XL,WC            SAVE POINTER
        !          6822:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE
        !          6823:        BEQ  (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK
        !          6824: *
        !          6825: *      SAVE OLD VALUE AND SET NULL AS NEW VALUE
        !          6826: *
        !          6827:        MOV  XL,-(XS)         STACK OLD VALUE
        !          6828:        MOV  WC,XL            POINT BACK TO BLOCK WITH VALUE
        !          6829:        MOV  WB,VRVAL(XL)     SET NULL AS NEW VALUE
        !          6830:        BCT  WA,BPF05         LOOP TILL ALL LOCALS PROCESSED
        !          6831:        EJC
        !          6832: *
        !          6833: *      PFBLK (CONTINUED)
        !          6834: *
        !          6835: *      HERE AFTER PROCESSING ARGUMENTS AND LOCALS
        !          6836: *
        !          6837: .IF    .CNPF
        !          6838: BPF07  MOV  R$COD,WA         LOAD OLD CODE BLOCK POINTER
        !          6839: .ELSE
        !          6840: BPF07  ZER  XR               ZERO REG XR IN CASE
        !          6841:        BZE  KVPFL,BPF7C      SKIP IF PROFILING IS OFF
        !          6842:        BEQ  KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE
        !          6843: *
        !          6844: *      HERE IF PROFILE = 1
        !          6845: *
        !          6846:        JSR  SYSTM            GET CURRENT TIME
        !          6847:        STI  PFETM            SAVE FOR A SEC
        !          6848:        SBI  PFSTM            FIND TIME USED BY CALLER
        !          6849:        JSR  ICBLD            BUILD INTO AN ICBLK
        !          6850:        LDI  PFETM            RELOAD CURRENT TIME
        !          6851:        BRN  BPF7B            MERGE
        !          6852: *
        !          6853: *      HERE IF PROFILE = 2
        !          6854: *
        !          6855: BPF7A  LDI  PFSTM            GET START TIME OF CALLING STMT
        !          6856:        JSR  ICBLD            ASSEMBLE AN ICBLK ROUND IT
        !          6857:        JSR  SYSTM            GET NOW TIME
        !          6858: *
        !          6859: *      BOTH TYPES OF PROFILE MERGE HERE
        !          6860: *
        !          6861: BPF7B  STI  PFSTM            SET START TIME OF 1ST FUNC STMT
        !          6862:        MNZ  PFFNC            FLAG FUNCTION ENTRY
        !          6863:        EJC
        !          6864: *
        !          6865: *      PFBLK (CONTINUED)
        !          6866: *
        !          6867: *      NO PROFILING MERGES HERE
        !          6868: *
        !          6869: BPF7C  MOV  XR,-(XS)         STACK ICBLK PTR (OR ZERO)
        !          6870:        MOV  R$COD,WA         LOAD OLD CODE BLOCK POINTER
        !          6871: .FI
        !          6872:        SCP  WB               GET CODE POINTER
        !          6873:        SUB  WA,WB            MAKE CODE POINTER INTO OFFSET
        !          6874:        MOV  BPFPF,XL         RECALL PFBLK POINTER
        !          6875:        MOV  BPFSV,-(XS)      STACK OLD VALUE OF FUNCTION NAME
        !          6876:        MOV  WA,-(XS)         STACK CODE BLOCK POINTER
        !          6877:        MOV  WB,-(XS)         STACK CODE OFFSET
        !          6878:        MOV  FLPRT,-(XS)      STACK OLD FLPRT
        !          6879:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
        !          6880:        MOV  XL,-(XS)         STACK POINTER TO PFBLK
        !          6881:        ZER  -(XS)            DUMMY ZERO ENTRY FOR FAIL RETURN
        !          6882:        CHK                   CHECK FOR STACK OVERFLOW
        !          6883:        MOV  XS,FLPTR         SET NEW FAIL RETURN VALUE
        !          6884:        MOV  XS,FLPRT         SET NEW FLPRT
        !          6885:        MOV  KVTRA,WA         LOAD TRACE VALUE
        !          6886:        ADD  KVFTR,WA         ADD FTRACE VALUE
        !          6887:        BNZ  WA,BPF09         JUMP IF TRACING POSSIBLE
        !          6888:        ICV  KVFNC            ELSE BUMP FNCLEVEL
        !          6889: *
        !          6890: *      HERE TO ACTUALLY JUMP TO FUNCTION
        !          6891: *
        !          6892: BPF08  MOV  PFCOD(XL),XR     POINT TO CODE
        !          6893:        BRI  (XR)             OFF TO EXECUTE FUNCTION
        !          6894: *
        !          6895: *      HERE IF TRACING IS POSSIBLE
        !          6896: *
        !          6897: BPF09  MOV  PFCTR(XL),XR     LOAD POSSIBLE CALL TRACE TRBLK
        !          6898:        MOV  PFVBL(XL),XL     LOAD VRBLK POINTER FOR FUNCTION
        !          6899:        MOV  *VRVAL,WA        SET NAME OFFSET FOR VARIABLE
        !          6900:        BZE  KVTRA,BPF10      JUMP IF TRACE MODE IS OFF
        !          6901:        BZE  XR,BPF10         OR IF THERE IS NO CALL TRACE
        !          6902: *
        !          6903: *      HERE IF CALL TRACED
        !          6904: *
        !          6905:        DCV  KVTRA            DECREMENT TRACE COUNT
        !          6906:        BZE  TRFNC(XR),BPF11  JUMP IF PRINT TRACE
        !          6907:        JSR  TRXEQ            EXECUTE FUNCTION TYPE TRACE
        !          6908:        EJC
        !          6909: *
        !          6910: *      PFBLK (CONTINUED)
        !          6911: *
        !          6912: *      HERE TO TEST FOR FTRACE TRACE
        !          6913: *
        !          6914: BPF10  BZE  KVFTR,BPF16      JUMP IF FTRACE IS OFF
        !          6915:        DCV  KVFTR            ELSE DECREMENT FTRACE
        !          6916: *
        !          6917: *      HERE FOR PRINT TRACE
        !          6918: *
        !          6919: BPF11  JSR  PRTSN            PRINT STATEMENT NUMBER
        !          6920:        JSR  PRTNM            PRINT FUNCTION NAME
        !          6921:        MOV  =CH$PP,WA        LOAD LEFT PAREN
        !          6922:        JSR  PRTCH            PRINT LEFT PAREN
        !          6923:        MOV  1(XS),XL         RECOVER PFBLK POINTER
        !          6924:        BZE  FARGS(XL),BPF15  SKIP IF NO ARGUMENTS
        !          6925:        ZER  WB               ELSE SET ARGUMENT COUNTER
        !          6926:        BRN  BPF13            JUMP INTO LOOP
        !          6927: *
        !          6928: *      LOOP TO PRINT ARGUMENT VALUES
        !          6929: *
        !          6930: BPF12  MOV  =CH$CM,WA        LOAD COMMA
        !          6931:        JSR  PRTCH            PRINT TO SEPARATE FROM LAST ARG
        !          6932: *
        !          6933: *      MERGE HERE FIRST TIME (NO COMMA REQUIRED)
        !          6934: *
        !          6935: BPF13  MOV  WB,(XS)          SAVE ARG CTR (OVER FAILOFFS IS OK)
        !          6936:        WTB  WB               CONVERT TO BAU OFFSET
        !          6937:        ADD  WB,XL            POINT TO NEXT ARGUMENT POINTER
        !          6938:        MOV  PFARG(XL),XR     LOAD NEXT ARGUMENT VRBLK PTR
        !          6939:        SUB  WB,XL            RESTORE PFBLK POINTER
        !          6940:        MOV  VRVAL(XR),XR     LOAD NEXT VALUE
        !          6941:        JSR  PRTVL            PRINT ARGUMENT VALUE
        !          6942:        EJC
        !          6943: *
        !          6944: *      HERE AFTER DEALING WITH ONE ARGUMENT
        !          6945: *
        !          6946:        MOV  (XS),WB          RESTORE ARGUMENT COUNTER
        !          6947:        ICV  WB               INCREMENT ARGUMENT COUNTER
        !          6948:        BLT  WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT
        !          6949: *
        !          6950: *      MERGE HERE IN NO ARGS CASE TO PRINT PAREN
        !          6951: *
        !          6952: BPF15  MOV  =CH$RP,WA        LOAD RIGHT PAREN
        !          6953:        JSR  PRTCF            PRINT TO TERMINATE OUTPUT
        !          6954: *
        !          6955: *      MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
        !          6956: *
        !          6957: BPF16  ICV  KVFNC            INCREMENT FNCLEVEL
        !          6958:        MOV  R$FNC,XL         LOAD PTR TO POSSIBLE TRBLK
        !          6959:        JSR  KTREX            CALL KEYWORD TRACE ROUTINE
        !          6960: *
        !          6961: *      CALL FUNCTION AFTER TRACE TESTS COMPLETE
        !          6962: *
        !          6963:        MOV  1(XS),XL         RESTORE PFBLK POINTER
        !          6964:        BRN  BPF08            JUMP BACK TO EXECUTE FUNCTION
        !          6965: .IF    .CNRA
        !          6966: .ELSE
        !          6967:        EJC
        !          6968: *
        !          6969: *      RCBLK
        !          6970: *
        !          6971: *      THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
        !          6972: *      CODE TO LOAD A REAL VALUE ONTO THE STACK.
        !          6973: *
        !          6974: *      (XR)                  POINTER TO RCBLK
        !          6975: *
        !          6976: B$RCL  ENT  BL$RC            ENTRY POINT (RCBLK)
        !          6977:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
        !          6978: .FI
        !          6979: *
        !          6980: *      SCBLK
        !          6981: *
        !          6982: *      THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
        !          6983: *      CODE TO LOAD A STRING VALUE ONTO THE STACK.
        !          6984: *
        !          6985: *      (XR)                  POINTER TO SCBLK
        !          6986: *
        !          6987: B$SCL  ENT  BL$SC            ENTRY POINT (SCBLK)
        !          6988:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
        !          6989: *
        !          6990: *      TBBLK
        !          6991: *
        !          6992: *      THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
        !          6993: *
        !          6994: B$TBT  ENT  BL$TB            ENTRY POINT (TBBLK)
        !          6995: *
        !          6996: *      TEBLK
        !          6997: *
        !          6998: *      THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
        !          6999: *
        !          7000: B$TET  ENT  BL$TE            ENTRY POINT (TEBLK)
        !          7001: *
        !          7002: *      VCBLK
        !          7003: *
        !          7004: *      THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
        !          7005: *
        !          7006: B$VCT  ENT  BL$VC            ENTRY POINT (VCBLK)
        !          7007:        EJC
        !          7008: *
        !          7009: *      VRBLK
        !          7010: *
        !          7011: *      THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
        !          7012: *      THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
        !          7013: *
        !          7014: B$VR$  ENT  BL$$I            MARK START OF VRBLK ENTRY POINTS
        !          7015: *
        !          7016: *      ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
        !          7017: *      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
        !          7018: *      THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
        !          7019: *      ASSOCIATION IS CURRENTLY ACTIVE.
        !          7020: *
        !          7021: *      (XR)                  POINTER TO VRGET FIELD OF VRBLK
        !          7022: *
        !          7023: B$VRA  ENT  BL$$I            ENTRY POINT
        !          7024:        MOV  XR,XL            COPY NAME BASE (VRGET = 0)
        !          7025:        MOV  *VRVAL,WA        SET NAME OFFSET
        !          7026:        JSR  ACESS            ACCESS VALUE
        !          7027:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          7028:        BRN  EXIXR            ELSE EXIT WITH RESULT IN XR
        !          7029: *
        !          7030: *      ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
        !          7031: *      THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
        !          7032: *      OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
        !          7033: *
        !          7034: B$VRE  ENT                   ENTRY POINT
        !          7035:        ERB  049,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE
        !          7036: *
        !          7037: *      ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
        !          7038: *      FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
        !          7039: *
        !          7040: *      (XR)                  POINTER TO VRTRA FIELD OF VRBLK
        !          7041: *
        !          7042: B$VRG  ENT                   ENTRY POINT
        !          7043:        MOV  VRLBO(XR),XR     LOAD CODE POINTER
        !          7044:        MOV  (XR),XL          LOAD ENTRY ADDRESS
        !          7045:        BRI  XL               JUMP TO ROUTINE FOR NEXT CODE WORD
        !          7046: *
        !          7047: *      ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
        !          7048: *      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
        !          7049: *
        !          7050: *      (XR)                  POINTS TO VRGET FIELD OF VRBLK
        !          7051: *
        !          7052: B$VRL  ENT                   ENTRY POINT
        !          7053:        MOV  VRVAL(XR),-(XS)  LOAD VALUE ONTO STACK (VRGET = 0)
        !          7054:        BRN  EXITS            OBEY NEXT CODE WORD
        !          7055:        EJC
        !          7056: *
        !          7057: *      VRBLK (CONTINUED)
        !          7058: *
        !          7059: *      ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
        !          7060: *      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
        !          7061: *
        !          7062: *      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
        !          7063: *
        !          7064: B$VRS  ENT                   ENTRY POINT
        !          7065:        MOV  (XS),VRVLO(XR)   STORE VALUE, LEAVE ON STACK
        !          7066:        BRN  EXITS            OBEY NEXT CODE WORD
        !          7067: *
        !          7068: *      VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
        !          7069: *      GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
        !          7070: *      TRACE IS CURRENTLY ACTIVE.
        !          7071: *
        !          7072: B$VRT  ENT                   ENTRY POINT
        !          7073:        SUB  *VRTRA,XR        POINT BACK TO START OF VRBLK
        !          7074:        MOV  XR,XL            COPY VRBLK POINTER
        !          7075:        MOV  *VRVAL,WA        SET NAME OFFSET
        !          7076:        MOV  VRLBL(XL),XR     LOAD POINTER TO TRBLK
        !          7077:        BZE  KVTRA,BVRT2      JUMP IF TRACE IS OFF
        !          7078:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
        !          7079:        BZE  TRFNC(XR),BVRT1  JUMP IF PRINT TRACE CASE
        !          7080:        JSR  TRXEQ            ELSE EXECUTE FULL TRACE
        !          7081:        BRN  BVRT2            MERGE TO JUMP TO LABEL
        !          7082: *
        !          7083: *      HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
        !          7084: *
        !          7085: BVRT1  JSR  PRTSN            PRINT STATEMENT NUMBER
        !          7086:        MOV  XL,XR            COPY VRBLK POINTER
        !          7087:        MOV  =CH$CL,WA        COLON
        !          7088:        JSR  PRTCH            PRINT IT
        !          7089:        MOV  =CH$PP,WA        LEFT PAREN
        !          7090:        JSR  PRTCH            PRINT IT
        !          7091:        JSR  PRTVN            PRINT LABEL NAME
        !          7092:        MOV  =CH$RP,WA        RIGHT PAREN
        !          7093:        JSR  PRTCF            PRINT IT
        !          7094:        MOV  VRLBL(XL),XR     POINT BACK TO TRBLK
        !          7095: *
        !          7096: *      MERGE HERE TO JUMP TO LABEL
        !          7097: *
        !          7098: BVRT2  MOV  TRLBL(XR),XR     LOAD POINTER TO ACTUAL CODE
        !          7099:        BRI  (XR)             EXECUTE STATEMENT AT LABEL
        !          7100:        EJC
        !          7101: *
        !          7102: *      VRBLK (CONTINUED)
        !          7103: *
        !          7104: *      ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
        !          7105: *      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
        !          7106: *      THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
        !          7107: *      ASSOCIATION IS CURRENTLY ACTIVE.
        !          7108: *
        !          7109: *      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
        !          7110: *
        !          7111: B$VRV  ENT                   ENTRY POINT
        !          7112:        MOV  (XS),WB          LOAD VALUE (LEAVE COPY ON STACK)
        !          7113:        SUB  *VRSTO,XR        POINT TO VRBLK
        !          7114:        MOV  XR,XL            COPY VRBLK POINTER
        !          7115:        MOV  *VRVAL,WA        SET OFFSET
        !          7116:        JSR  ASIGN            CALL ASSIGNMENT ROUTINE
        !          7117:        PPM  EXFAL            FAIL IF ASSIGNMENT FAILS
        !          7118:        BRN  EXITS            ELSE RETURN WITH RESULT ON STACK
        !          7119:        EJC
        !          7120: *
        !          7121: *      XNBLK
        !          7122: *
        !          7123: *      THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
        !          7124: *
        !          7125: B$XNT  ENT  BL$XN            ENTRY POINT (XNBLK)
        !          7126: *
        !          7127: *      XRBLK
        !          7128: *
        !          7129: *      THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
        !          7130: *
        !          7131: B$XRT  ENT  BL$XR            ENTRY POINT (XRBLK)
        !          7132: *
        !          7133: *      MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
        !          7134: *
        !          7135: B$YYY  ENT  BL$$I            LAST BLOCK ROUTINE ENTRY POINT
        !          7136:        TTL  S P I T B O L -- PATTERN MATCHING ROUTINES
        !          7137: *
        !          7138: *      THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
        !          7139: *      ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
        !          7140: *      TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
        !          7141: *
        !          7142: *      NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
        !          7143: *      ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
        !          7144: *
        !          7145: P$AAA  ENT  BL$$I            ENTRY TO MARK FIRST PATTERN
        !          7146: *
        !          7147: *
        !          7148: *      THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
        !          7149: *      (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
        !          7150: *
        !          7151: *      STACK CONTENTS.
        !          7152: *
        !          7153: *                            NAME BASE (O$PMN ONLY)
        !          7154: *                            NAME OFFSET (O$PMN ONLY)
        !          7155: *                            TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
        !          7156: *      PMHBS --------------- INITIAL CURSOR (ZERO)
        !          7157: *                            INITIAL NODE POINTER
        !          7158: *      XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
        !          7159: *
        !          7160: *      REGISTER VALUES.
        !          7161: *
        !          7162: *           (XS)             SET AS SHOWN IN STACK DIAGRAM
        !          7163: *           (XR)             POINTER TO INITIAL PATTERN NODE
        !          7164: *           (WB)             INITIAL CURSOR (ZERO)
        !          7165: *
        !          7166: *      GLOBAL PATTERN VALUES
        !          7167: *
        !          7168: *           R$PMS            POINTER TO SUBJECT STRING SCBLK
        !          7169: *           PMSSL            LENGTH OF SUBJECT STRING IN CHARS
        !          7170: *           PMDFL            DOT FLAG, INITIALLY ZERO
        !          7171: *           PMHBS            SET AS SHOWN IN STACK DIAGRAM
        !          7172: *
        !          7173: *      CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
        !          7174: *      FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
        !          7175:        EJC
        !          7176: *
        !          7177: *      DESCRIPTION OF ALGORITHM
        !          7178: *
        !          7179: *      A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
        !          7180: *      OF NODES WITH THE FOLLOWING STRUCTURE.
        !          7181: *
        !          7182: *           +------------------------------------+
        !          7183: *           I                PCODE               I
        !          7184: *           +------------------------------------+
        !          7185: *           I                PTHEN               I
        !          7186: *           +------------------------------------+
        !          7187: *           I                PARM1               I
        !          7188: *           +------------------------------------+
        !          7189: *           I                PARM2               I
        !          7190: *           +------------------------------------+
        !          7191: *
        !          7192: *      PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
        !          7193: *      THE MATCH OF THIS PARTICULAR NODE TYPE.
        !          7194: *
        !          7195: *      PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
        !          7196: *      TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
        !          7197: *      IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
        !          7198: *      TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
        !          7199: *
        !          7200: *      PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
        !          7201: *      PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
        !          7202: *
        !          7203: *      ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
        !          7204: *      NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
        !          7205: *      IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
        !          7206: *
        !          7207: *      THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
        !          7208: *      THE STRUCTURE IS BUILT UP. THE PATTERN IS
        !          7209: *
        !          7210: *      (A / B / C) (D / E)   WHERE / IS ALTERNATION
        !          7211: *
        !          7212: *      IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
        !          7213: *      ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
        !          7214: *      REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
        !          7215: *
        !          7216: *      +---+     +---+     +---+     +---+
        !          7217: *      I + I-----I A I-----I + I-----I D I-----
        !          7218: *      +---+     +---+  I  +---+     +---+
        !          7219: *        .              I    .
        !          7220: *        .              I    .
        !          7221: *      +---+     +---+  I  +---+
        !          7222: *      I + I-----I B I--I  I E I-----
        !          7223: *      +---+     +---+  I  +---+
        !          7224: *        .              I
        !          7225: *        .              I
        !          7226: *      +---+            I
        !          7227: *      I C I------------I
        !          7228: *      +---+
        !          7229:        EJC
        !          7230: *
        !          7231: *      DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
        !          7232: *
        !          7233: *      (XR)                  POINTS TO THE CURRENT NODE
        !          7234: *      (XL)                  SCRATCH
        !          7235: *      (XS)                  MAIN STACK POINTER
        !          7236: *      (WB)                  CURSOR (NUMBER OF CHARS MATCHED)
        !          7237: *      (WA,WC)               SCRATCH
        !          7238: *
        !          7239: *      TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
        !          7240: *      A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
        !          7241: *
        !          7242: *      WORD 1                SAVED CURSOR VALUE
        !          7243: *      WORD 2                NODE TO MATCH ON FAILURE
        !          7244: *
        !          7245: *      WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
        !          7246: *      STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
        !          7247: *      TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
        !          7248: *      AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
        !          7249: *      SPECIAL NODES DEPENDING ON THE SCAN MODE.
        !          7250: *
        !          7251: *      ANCHORED MODE         THE BOTTOM ENTRY POINTS TO THE
        !          7252: *                            SPECIAL NODE NDABO WHICH CAUSES AN
        !          7253: *                            ABORT. THE CURSOR VALUE STORED
        !          7254: *                            WITH THIS ENTRY IS ALWAYS ZERO.
        !          7255: *
        !          7256: *      UNANCHORED MODE       THE BOTTOM ENTRY POINTS TO THE
        !          7257: *                            SPECIAL NODE NDUNA WHICH MOVES THE
        !          7258: *                            ANCHOR POINT AND RESTARTS THE MATCH
        !          7259: *                            THE CURSOR SAVED WITH THIS ENTRY
        !          7260: *                            IS THE NUMBER OF CHARACTERS WHICH
        !          7261: *                            LIE BEFORE THE INITIAL ANCHOR POINT
        !          7262: *                            (I.E. THE NUMBER OF ANCHOR MOVES).
        !          7263: *                            THIS ENTRY IS THREE WORDS LONG AND
        !          7264: *                            ALSO CONTAINS THE INITIAL PATTERN.
        !          7265: *
        !          7266: *      ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
        !          7267: *      NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
        !          7268: *      LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
        !          7269: *      PATTERN MATCHING.
        !          7270: *
        !          7271: *      R$PMS                 POINTER TO SUBJECT STRING
        !          7272: *      PMSSL                 LENGTH OF SUBJECT STRING
        !          7273: *      PMDFL                 FLAG SET NON-ZERO FOR DOT PATTERNS
        !          7274: *      PMHBS                 BASE PTR FOR CURRENT HISTORY STACK
        !          7275: *
        !          7276: *      THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
        !          7277: *
        !          7278: *      SUCCP                 SUCCESS IN MATCHING CURRENT NODE
        !          7279: *      FAILP                 FAILURE IN MATCHING CURRENT NODE
        !          7280:        EJC
        !          7281: *
        !          7282: *      COMPOUND PATTERNS
        !          7283: *
        !          7284: *      SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
        !          7285: *      REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
        !          7286: *      LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
        !          7287: *
        !          7288: *      AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
        !          7289: *      THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
        !          7290: *      TO THE ALTERNATIVE PATTERN.
        !          7291: *
        !          7292: *      ARB
        !          7293: *      ---
        !          7294: *
        !          7295: *           +---+            THIS NODE (P$ARB) MATCHES NULL
        !          7296: *           I B I-----       AND STACKS CURSOR, SUCCESSOR PTR,
        !          7297: *           +---+            CURSOR (COPY) AND A PTR TO NDARC.
        !          7298: *
        !          7299: *
        !          7300: *
        !          7301: *
        !          7302: *      BAL
        !          7303: *      ---
        !          7304: *
        !          7305: *           +---+            THE P$BAL NODE SCANS A BALANCED
        !          7306: *           I B I-----       STRING AND THEN STACKS A POINTER
        !          7307: *           +---+            TO ITSELF ON THE HISTORY STACK.
        !          7308:        EJC
        !          7309: *
        !          7310: *      COMPOUND PATTERN STRUCTURES (CONTINUED)
        !          7311: *
        !          7312: *
        !          7313: *      ARBNO
        !          7314: *      -----
        !          7315: *
        !          7316: *           +---+            THIS ALTERNATIVE NODE MATCHES NULL
        !          7317: *      +----I + I-----       THE FIRST TIME AND STACKS A POINTER
        !          7318: *      I    +---+            TO THE ARGUMENT PATTERN X.
        !          7319: *      I      .
        !          7320: *      I      .
        !          7321: *      I    +---+            NODE (P$ABA) TO STACK CURSOR
        !          7322: *      I    I A I            AND HISTORY STACK BASE PTR.
        !          7323: *      I    +---+
        !          7324: *      I      I
        !          7325: *      I      I
        !          7326: *      I    +---+            THIS IS THE ARGUMENT PATTERN. AS
        !          7327: *      I    I X I            INDICATED, THE SUCCESSOR OF THE
        !          7328: *      I    +---+            PATTERN IS THE P$ABC NODE
        !          7329: *      I      I
        !          7330: *      I      I
        !          7331: *      I    +---+            THIS NODE (P$ABC) POPS PMHBS,
        !          7332: *      +----I C I            STACKS OLD PMHBS AND PTR TO NDABD
        !          7333: *           +---+            (UNLESS OPTIMISATION HAS OCCURRED)
        !          7334: *
        !          7335: *      STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
        !          7336: *      RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
        !          7337: *      THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
        !          7338: *      NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
        !          7339: *      TO MATCH THE ARGUMENT.  BEFORE THE ARGUMENT IS MATCHED
        !          7340: *      P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB.  IF
        !          7341: *      THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
        !          7342: *      STACK ENTRY AND FAILS.
        !          7343: *      IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
        !          7344: *      VALUE (SAVED BY P$ABA) .  THEN IF THE ARGUMENT HAS LEFT
        !          7345: *      ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
        !          7346: *      AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
        !          7347: *      IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA.  FINALLY
        !          7348: *      A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
        !          7349: *      STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
        !          7350: *      IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
        !          7351: *      HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
        !          7352: *      TO MATCH THE ARG IF NECESSARY.  IF NOT , THE SUCCESSOR TO
        !          7353: *      ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP.  P$ABD
        !          7354: *      RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
        !          7355: *      ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
        !          7356:        EJC
        !          7357: *
        !          7358: *      COMPOUND PATTERN STRUCTURES (CONTINUED)
        !          7359: *
        !          7360: *      BREAKX
        !          7361: *      ------
        !          7362: *
        !          7363: *           +---+            THIS NODE IS A BREAK NODE FOR
        !          7364: *      +----I B I            THE ARGUMENT TO BREAKX, IDENTICAL
        !          7365: *      I    +---+            TO AN ORDINARY BREAK NODE.
        !          7366: *      I      I
        !          7367: *      I      I
        !          7368: *      I    +---+            THIS ALTERNATIVE NODE STACKS A
        !          7369: *      I    I + I-----       POINTER TO THE BREAKX NODE TO
        !          7370: *      I    +---+            ALLOW FOR SUBSEQUENT FAILURE
        !          7371: *      I      .
        !          7372: *      I      .
        !          7373: *      I    +---+            THIS IS THE BREAKX NODE ITSELF. IT
        !          7374: *      +----I X I            MATCHES ONE CHARACTER AND THEN
        !          7375: *           +---+            PROCEEDS BACK TO THE BREAK NODE.
        !          7376: *
        !          7377: *
        !          7378: *
        !          7379: *
        !          7380: *      FENCE
        !          7381: *      -----
        !          7382: *
        !          7383: *           +---+            THE FENCE NODE MATCHES NULL AND
        !          7384: *           I F I-----       STACKS A POINTER TO NODE NDABO TO
        !          7385: *           +---+            ABORT ON A SUBSEQUENT REMATCH
        !          7386: *
        !          7387: *
        !          7388: *
        !          7389: *
        !          7390: *      SUCCEED
        !          7391: *      -------
        !          7392: *
        !          7393: *           +---+            THE NODE FOR SUCCEED MATCHES NULL
        !          7394: *           I S I-----       AND STACKS A POINTER TO ITSELF
        !          7395: *           +---+            TO REPEAT THE MATCH ON A FAILURE.
        !          7396:        EJC
        !          7397: *
        !          7398: *      COMPOUND PATTERNS (CONTINUED)
        !          7399: *
        !          7400: *      BINARY DOT (PATTERN ASSIGNMENT)
        !          7401: *      -------------------------------
        !          7402: *
        !          7403: *           +---+            THIS NODE (P$PAA) SAVES THE CURRENT
        !          7404: *           I A I            CURSOR AND A POINTER TO THE
        !          7405: *           +---+            SPECIAL NODE NDPAB ON THE STACK.
        !          7406: *             I
        !          7407: *             I
        !          7408: *           +---+            THIS IS THE STRUCTURE FOR THE
        !          7409: *           I X I            PATTERN LEFT ARGUMENT OF THE
        !          7410: *           +---+            PATTERN ASSIGNMENT CALL.
        !          7411: *             I
        !          7412: *             I
        !          7413: *           +---+            THIS NODE (P$PAC) SAVES THE CURSOR,
        !          7414: *           I C I-----       A PTR TO ITSELF, THE CURSOR (COPY)
        !          7415: *           +---+            AND A PTR TO NDPAD ON THE STACK.
        !          7416: *
        !          7417: *
        !          7418: *      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
        !          7419: *      IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
        !          7420: *
        !          7421: *      THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
        !          7422: *      FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
        !          7423: *      MAY HAVE OCCURED IN THE PATTERN MATCH
        !          7424: *
        !          7425: *      IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
        !          7426: *      HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
        !          7427: *      AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
        !          7428: *
        !          7429: *      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
        !          7430: *      IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
        !          7431: *      THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
        !          7432: *      IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
        !          7433: .IF    .CNFN
        !          7434: .ELSE
        !          7435:        EJC
        !          7436: *
        !          7437: *      FENCE (FUNCTION)
        !          7438: *      ----------------
        !          7439: *
        !          7440: *           +---+            THIS NODE (P$FNA) SAVES THE
        !          7441: *           I A I            CURRENT HISTORY STACK AND A
        !          7442: *           +---+            POINTER TO NDFNB ON THE STACK.
        !          7443: *             I
        !          7444: *             I
        !          7445: *           +---+            THIS IS THE PATTERN STRUCTURE
        !          7446: *           I X I            GIVEN AS THE ARGUMENT TO THE
        !          7447: *           +---+            FENCE FUNCTION.
        !          7448: *             I
        !          7449: *             I
        !          7450: *           +---+            THIS NODE P$FNC RESTORES THE OUTER
        !          7451: *           I C I            HISTORY STACK PTR SAVED IN P$FNA,
        !          7452: *           +---+            AND STACKS THE INNER STACK BASE
        !          7453: *                            PTR AND A POINTER TO NDFND ON THE
        !          7454: *                            STACK.
        !          7455: *
        !          7456: *      NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
        !          7457: *      ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
        !          7458: *      STACK.
        !          7459: *
        !          7460: *      THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
        !          7461: *      THE FENCE PATTERN LEAVES NO ALTERNATIVES.  IN THIS CASE,
        !          7462: *      THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
        !          7463: *
        !          7464: *      NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
        !          7465: *      GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
        !          7466: *      STACK BACK PAST THE INNER STACK BASE CREATED BY P$FNA
        !          7467: .FI
        !          7468:        EJC
        !          7469: *
        !          7470: *      COMPOUND PATTERNS (CONTINUED)
        !          7471: *
        !          7472: *      EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
        !          7473: *      -----------------------------------------------
        !          7474: *
        !          7475: *      INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
        !          7476: *      IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
        !          7477: *      PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
        !          7478: *      FOR PROPER RECURSIVE PROCESSING.
        !          7479: *
        !          7480: *      1)   A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
        !          7481: *           STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
        !          7482: *
        !          7483: *      2)   A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
        !          7484: *           NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
        !          7485: *           IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
        !          7486: *           THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
        !          7487: *           FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
        !          7488: *           POINTER AND FAILS.
        !          7489: *
        !          7490: *      3)   THE RESULTING HISTORY STACK POINTER IS SAVED IN
        !          7491: *           PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
        !          7492: *
        !          7493: *      AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
        !          7494: *      CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
        !          7495: *
        !          7496: *      1)   LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
        !          7497: *           OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
        !          7498: *           CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
        !          7499: *           WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
        !          7500: *           CASE AND CONTINUE EXECUTION OF THE PROGRAM.
        !          7501: *
        !          7502: *      2)   OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
        !          7503: *           WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
        !          7504: *           NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
        !          7505: *           THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
        !          7506: *           THIS (INNER) VALUE AND AND THEN FAILS.
        !          7507: *
        !          7508: *      3)   USING THE HISTORY STACK ENTRY MADE ON STARTING THE
        !          7509: *           EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
        !          7510: *           PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
        !          7511: *           PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
        !          7512: *
        !          7513: *      AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
        !          7514: *      MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
        !          7515: *      INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
        !          7516: *      EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
        !          7517: *      ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
        !          7518:        EJC
        !          7519: *
        !          7520: *      COMPOUND PATTERNS (CONTINUED)
        !          7521: *
        !          7522: *      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
        !          7523: *      ------------------------------------
        !          7524: *
        !          7525: *           +---+            THIS NODE (P$IMA) STACKS THE CURSOR
        !          7526: *           I A I            PMHBS AND A PTR TO NDIMB AND RESETS
        !          7527: *           +---+            THE STACK PTR PMHBS.
        !          7528: *             I
        !          7529: *             I
        !          7530: *           +---+            THIS IS THE LEFT STRUCTURE FOR THE
        !          7531: *           I X I            PATTERN LEFT ARGUMENT OF THE
        !          7532: *           +---+            IMMEDIATE ASSIGNMENT CALL.
        !          7533: *             I
        !          7534: *             I
        !          7535: *           +---+            THIS NODE (P$IMC) PERFORMS THE
        !          7536: *           I C I-----       ASSIGNMENT, POPS PMHBS AND STACKS
        !          7537: *           +---+            THE OLD PMHBS AND A PTR TO NDIMD.
        !          7538: *
        !          7539: *
        !          7540: *      THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
        !          7541: *      TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
        !          7542: *
        !          7543: *      THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
        !          7544: *      LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
        !          7545: *
        !          7546: *      THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
        !          7547: *      TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
        !          7548: *      THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
        !          7549: *      PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
        !          7550: *      POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
        !          7551: *
        !          7552: *      THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
        !          7553: *      LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
        !          7554: *
        !          7555: *      AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
        !          7556: *      ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
        !          7557: *      THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
        !          7558:        EJC
        !          7559: *
        !          7560: *      ARBNO
        !          7561: *
        !          7562: *      SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
        !          7563: *      ALGORITHM FOR MATCHING THIS NODE TYPE.
        !          7564: *
        !          7565: *      NO PARAMETERS
        !          7566: *
        !          7567: P$ABA  ENT  BL$P0            P0BLK
        !          7568:        MOV  WB,-(XS)         STACK CURSOR
        !          7569:        MOV  XR,-(XS)         STACK DUMMY NODE PTR
        !          7570:        MOV  PMHBS,-(XS)      STACK OLD STACK BASE PTR
        !          7571:        MOV  =NDABB,-(XS)     STACK PTR TO NODE NDABB
        !          7572:        MOV  XS,PMHBS         STORE NEW STACK BASE PTR
        !          7573:        BRN  SUCCP            SUCCEED
        !          7574: *
        !          7575: *      ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
        !          7576: *
        !          7577: *      NO PARAMETERS (DUMMY PATTERN)
        !          7578: *
        !          7579: P$ABB  ENT                   ENTRY POINT
        !          7580:        MOV  WB,PMHBS         RESTORE HISTORY STACK BASE PTR
        !          7581:        BRN  FLPOP            FAIL AND POP DUMMY NODE PTR
        !          7582: *
        !          7583: *      ARBNO (CHECK IF ARG MATCHED NULL STRING)
        !          7584: *
        !          7585: *      NO PARAMETERS (DUMMY PATTERN)
        !          7586: *
        !          7587: P$ABC  ENT  BL$P0            P0BLK
        !          7588:        MOV  PMHBS,XT         KEEP P$ABB STACK BASE
        !          7589:        MOV  3(XT),WA         LOAD INITIAL CURSOR
        !          7590:        MOV  1(XT),PMHBS      RESTORE OUTER STACK BASE PTR
        !          7591:        BEQ  XT,XS,PABC1      JUMP IF NO HISTORY STACK ENTRIES
        !          7592:        MOV  XT,-(XS)         ELSE SAVE INNER PMHBS ENTRY
        !          7593:        MOV  =NDABD,-(XS)     STACK PTR TO SPECIAL NODE NDABD
        !          7594:        BRN  PABC2            MERGE
        !          7595: *
        !          7596: *      OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
        !          7597: *
        !          7598: PABC1  ADD  *NUM04,XS        REMOVE NDABB ENTRY AND CURSOR
        !          7599: *
        !          7600: *      MERGE TO CHECK FOR MATCHING OF NULL STRING
        !          7601: *
        !          7602: PABC2  BNE  WA,WB,SUCCP      ALLOW FURTHER ATTEMPT IF NON-NULL
        !          7603:        MOV  PTHEN(XR),XR     BYPASS ALTERNATIVE NODE SO AS TO ..
        !          7604:        BRN  SUCCP            ... REFUSE FURTHER MATCH ATTEMPTS
        !          7605: *
        !          7606: *      ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
        !          7607: *
        !          7608: *      NO PARAMETERS (DUMMY PATTERN)
        !          7609: *
        !          7610: P$ABD  ENT                   ENTRY POINT
        !          7611:        MOV  WB,PMHBS         RESTORE INNER STACK BASE PTR
        !          7612:        BRN  FAILP            AND FAIL
        !          7613:        EJC
        !          7614: *
        !          7615: *      ABORT
        !          7616: *
        !          7617: *      NO PARAMETERS
        !          7618: *
        !          7619: P$ABO  ENT  BL$P0            P0BLK
        !          7620:        BRN  EXFAL            SIGNAL STATEMENT FAILURE
        !          7621: *
        !          7622: *      ALTERNATION
        !          7623: *
        !          7624: *      PARM1                 ALTERNATIVE NODE
        !          7625: *
        !          7626: P$ALT  ENT  BL$P1            P1BLK
        !          7627:        MOV  WB,-(XS)         STACK CURSOR
        !          7628:        MOV  PARM1(XR),-(XS)  STACK POINTER TO ALTERNATIVE
        !          7629:        CHK                   CHECK FOR STACK OVERFLOW
        !          7630:        BRN  SUCCP            IF ALL OK, THEN SUCCEED
        !          7631:        EJC
        !          7632: *
        !          7633: *      ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
        !          7634: *
        !          7635: *      PARM1                 CHARACTER ARGUMENT
        !          7636: *
        !          7637: P$ANS  ENT  BL$P1            P1BLK
        !          7638:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARS LEFT
        !          7639:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
        !          7640:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          7641:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
        !          7642:        BNE  WA,PARM1(XR),FAILP FAIL IF NO MATCH
        !          7643:        ICV  WB               ELSE BUMP CURSOR
        !          7644:        BRN  SUCCP            AND SUCCEED
        !          7645: *
        !          7646: *      ANY (MULTI-CHARACTER ARGUMENT CASE)
        !          7647: *      EXPRESSION ARGUMENT CASE MERGES
        !          7648: *
        !          7649: *      PARM1                 POINTER TO CTBLK
        !          7650: *      PARM2                 BIT MASK TO SELECT BIT IN CTBLK
        !          7651: *
        !          7652: P$ANY  ENT  BL$P2            P2BLK
        !          7653:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARACTERS LEFT
        !          7654:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
        !          7655:        PLC  XL,WB            GET CHAR PTR TO CURRENT CHARACTER
        !          7656:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
        !          7657:        MOV  PARM1(XR),XL     POINT TO CTBLK
        !          7658:        WTB  WA               CHANGE TO BAU OFFSET
        !          7659:        ADD  WA,XL            POINT TO ENTRY IN CTBLK
        !          7660:        MOV  CTCHS(XL),WA     LOAD WORD FROM CTBLK
        !          7661:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
        !          7662:        ZRB  WA,FAILP         FAIL IF NO MATCH
        !          7663:        ICV  WB               ELSE BUMP CURSOR
        !          7664:        BRN  SUCCP            AND SUCCEED
        !          7665: *
        !          7666: *      ANY (EXPRESSION ARGUMENT)
        !          7667: *
        !          7668: *      PARM1                 EXPRESSION POINTER
        !          7669: *
        !          7670: P$AYD  ENT  BL$P1            P1BLK
        !          7671:        MOV  =P$ANY,WA        PCODE FOR NEW NODE
        !          7672:        JSR  EVALS            EVALUATE STRING ARGUMENT
        !          7673:        ERR  050,ANY EVALUATED ARGUMENT IS NOT STRING
        !          7674:        PPM  FAILP            FAIL IF EVALUATION FAILURE
        !          7675:        BRI  XL               MERGE MULTI-CHAR CASE IF OK
        !          7676:        EJC
        !          7677: *
        !          7678: *      P$ARB                 INITIAL ARB MATCH
        !          7679: *
        !          7680: *      NO PARAMETERS
        !          7681: *
        !          7682: *      THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
        !          7683: *      FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
        !          7684: *
        !          7685: P$ARB  ENT  BL$P0            P0BLK
        !          7686:        MOV  PTHEN(XR),XR     LOAD SUCCESSOR POINTER
        !          7687:        MOV  WB,-(XS)         STACK DUMMY CURSOR
        !          7688:        MOV  XR,-(XS)         STACK SUCCESSOR POINTER
        !          7689:        MOV  WB,-(XS)         STACK CURSOR
        !          7690:        MOV  =NDARC,-(XS)     STACK PTR TO SPECIAL NODE NDARC
        !          7691:        BRI  (XR)             EXECUTE NEXT NODE MATCHING NULL
        !          7692: *
        !          7693: *      P$ARC                 EXTEND ARB MATCH
        !          7694: *
        !          7695: *      NO PARAMETERS (DUMMY PATTERN)
        !          7696: *
        !          7697: P$ARC  ENT                   ENTRY POINT
        !          7698:        BEQ  WB,PMSSL,FLPOP   FAIL AND POP STACK TO SUCCESSOR
        !          7699:        ICV  WB               ELSE BUMP CURSOR
        !          7700:        MOV  WB,-(XS)         STACK UPDATED CURSOR
        !          7701:        MOV  XR,-(XS)         RESTACK POINTER TO NDARC NODE
        !          7702:        MOV  2(XS),XR         LOAD SUCCESSOR POINTER
        !          7703:        BRI  (XR)             OFF TO REEXECUTE SUCCESSOR NODE
        !          7704:        EJC
        !          7705: *
        !          7706: *      BAL
        !          7707: *
        !          7708: *      NO PARAMETERS
        !          7709: *
        !          7710: *      THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
        !          7711: *      FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
        !          7712: *
        !          7713: P$BAL  ENT  BL$P0            P0BLK
        !          7714:        ZER  WC               ZERO PARENTHESES LEVEL COUNTER
        !          7715:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
        !          7716:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          7717:        BRN  PBAL2            JUMP INTO SCAN LOOP
        !          7718: *
        !          7719: *      LOOP TO SCAN OUT CHARACTERS
        !          7720: *
        !          7721: PBAL1  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
        !          7722:        ICV  WB               PUSH CURSOR FOR CHARACTER
        !          7723:        BEQ  WA,=CH$PP,PBAL3  JUMP IF LEFT PAREN
        !          7724:        BEQ  WA,=CH$RP,PBAL4  JUMP IF RIGHT PAREN
        !          7725:        BZE  WC,PBAL5         ELSE SUCCEED IF AT OUTER LEVEL
        !          7726: *
        !          7727: *      HERE AFTER PROCESSING ONE CHARACTER
        !          7728: *
        !          7729: PBAL2  BNE  WB,PMSSL,PBAL1   LOOP BACK UNLESS END OF STRING
        !          7730:        BRN  FAILP            IN WHICH CASE, FAIL
        !          7731: *
        !          7732: *      HERE ON LEFT PAREN
        !          7733: *
        !          7734: PBAL3  ICV  WC               BUMP PAREN LEVEL
        !          7735:        BRN  PBAL2            LOOP BACK TO CHECK END OF STRING
        !          7736: *
        !          7737: *      HERE FOR RIGHT PAREN
        !          7738: *
        !          7739: PBAL4  BZE  WC,FAILP         FAIL IF NO MATCHING LEFT PAREN
        !          7740:        DCV  WC               ELSE DECREMENT LEVEL COUNTER
        !          7741:        BNZ  WC,PBAL2         LOOP BACK IF NOT AT OUTER LEVEL
        !          7742: *
        !          7743: *      HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
        !          7744: *
        !          7745: PBAL5  MOV  WB,-(XS)         STACK CURSOR
        !          7746:        MOV  XR,-(XS)         STACK PTR TO BAL NODE FOR EXTEND
        !          7747:        BRN  SUCCP            AND SUCCEED
        !          7748:        EJC
        !          7749: *
        !          7750: *      BREAK (EXPRESSION ARGUMENT)
        !          7751: *
        !          7752: *      PARM1                 EXPRESSION POINTER
        !          7753: *
        !          7754: P$BKD  ENT  BL$P1            P1BLK
        !          7755:        MOV  =P$BRK,WA        PCODE FOR NEW NODE
        !          7756:        JSR  EVALS            EVALUATE STRING EXPRESSION
        !          7757:        ERR  051,BREAK EVALUATED ARGUMENT IS NOT STRING
        !          7758:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          7759:        BRI  XL               MERGE WITH MULTI-CHAR CASE IF OK
        !          7760: *
        !          7761: *      BREAK (ONE CHARACTER ARGUMENT)
        !          7762: *
        !          7763: *      PARM1                 CHARACTER ARGUMENT
        !          7764: *
        !          7765: P$BKS  ENT  BL$P1            P1BLK
        !          7766:        MOV  PMSSL,WC         GET SUBJECT STRING LENGTH
        !          7767:        SUB  WB,WC            GET NUMBER OF CHARACTERS LEFT
        !          7768:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
        !          7769:        LCT  WC,WC            SET COUNTER FOR CHARS LEFT
        !          7770:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
        !          7771:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          7772: *
        !          7773: *      LOOP TO SCAN TILL BREAK CHARACTER FOUND
        !          7774: *
        !          7775: PBKS1  LCH  WA,(XL)+         LOAD NEXT CHAR, BUMP POINTER
        !          7776:        BEQ  WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND
        !          7777:        ICV  WB               ELSE PUSH CURSOR
        !          7778:        BCT  WC,PBKS1         LOOP BACK IF MORE TO GO
        !          7779:        BRN  FAILP            FAIL IF END OF STRING, NO BREAK CHR
        !          7780:        EJC
        !          7781: *
        !          7782: *      BREAK (MULTI-CHARACTER ARGUMENT)
        !          7783: *      EXPRESSION ARGUMENT CASE MERGES
        !          7784: *
        !          7785: *      PARM1                 POINTER TO CTBLK
        !          7786: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
        !          7787: *
        !          7788: P$BRK  ENT  BL$P2            P2BLK
        !          7789:        MOV  PMSSL,WC         LOAD SUBJECT STRING LENGTH
        !          7790:        SUB  WB,WC            GET NUMBER OF CHARACTERS LEFT
        !          7791:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
        !          7792:        LCT  WC,WC            SET COUNTER FOR CHARACTERS LEFT
        !          7793:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
        !          7794:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          7795:        MOV  XR,PSAVE         SAVE NODE POINTER
        !          7796: *
        !          7797: *      LOOP TO SEARCH FOR BREAK CHARACTER
        !          7798: *
        !          7799: PBRK2  LCH  WA,(XL)+         LOAD NEXT CHAR, BUMP POINTER
        !          7800:        MOV  PARM1(XR),XR     LOAD POINTER TO CTBLK
        !          7801:        WTB  WA               CONVERT TO BAU OFFSET
        !          7802:        ADD  WA,XR            POINT TO CTBLK ENTRY
        !          7803:        MOV  CTCHS(XR),WA     LOAD CTBLK WORD
        !          7804:        MOV  PSAVE,XR         RESTORE NODE POINTER
        !          7805:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
        !          7806:        NZB  WA,SUCCP         SUCCEED IF BREAK CHARACTER FOUND
        !          7807:        ICV  WB               ELSE PUSH CURSOR
        !          7808:        BCT  WC,PBRK2         LOOP BACK UNLESS END OF STRING
        !          7809:        BRN  FAILP            FAIL IF END OF STRING, NO BREAK CHR
        !          7810:        EJC
        !          7811: *
        !          7812: *      BREAKX (EXTENSION)
        !          7813: *
        !          7814: *      THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
        !          7815: *      MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
        !          7816: *      PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
        !          7817: *
        !          7818: *      NO PARAMETERS
        !          7819: *
        !          7820: P$BKX  ENT  BL$P0            P0BLK
        !          7821:        ICV  WB               STEP CURSOR PAST PREVIOUS BREAK CHR
        !          7822:        BRN  SUCCP            SUCCEED TO REMATCH BREAK
        !          7823: *
        !          7824: *      BREAKX (EXPRESSION ARGUMENT)
        !          7825: *
        !          7826: *      SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
        !          7827: *      BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
        !          7828: *      BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
        !          7829: *      ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
        !          7830: *
        !          7831: *      PARM1                 EXPRESSION POINTER
        !          7832: *
        !          7833: P$BXD  ENT  BL$P1            P1BLK
        !          7834:        MOV  =P$BRK,WA        PCODE FOR NEW NODE
        !          7835:        JSR  EVALS            EVALUATE STRING ARGUMENT
        !          7836:        ERR  052,BREAKX EVALUATED ARGUMENT IS NOT STRING
        !          7837:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          7838:        BRI  XL               MERGE WITH BREAK IF ALL OK
        !          7839: *
        !          7840: *      CURSOR ASSIGNMENT
        !          7841: *
        !          7842: *      PARM1                 NAME BASE
        !          7843: *      PARM2                 NAME OFFSET
        !          7844: *
        !          7845: P$CAS  ENT  BL$P2            P2BLK
        !          7846:        MOV  XR,-(XS)         SAVE NODE POINTER
        !          7847:        MOV  WB,-(XS)         SAVE CURSOR
        !          7848:        MOV  PARM1(XR),XL     LOAD NAME BASE
        !          7849:        MTI  WB               LOAD CURSOR AS INTEGER
        !          7850:        MOV  PARM2(XR),WB     LOAD NAME OFFSET
        !          7851:        JSR  ICBLD            GET ICBLK FOR CURSOR VALUE
        !          7852:        MOV  WB,WA            MOVE NAME OFFSET
        !          7853:        MOV  XR,WB            MOVE VALUE TO ASSIGN
        !          7854:        JSR  ASINP            PERFORM ASSIGNMENT
        !          7855:        PPM  FLPOP            FAIL ON ASSIGNMENT FAILURE
        !          7856:        MOV  (XS)+,WB         ELSE RESTORE CURSOR
        !          7857:        MOV  (XS)+,XR         RESTORE NODE POINTER
        !          7858:        BRN  SUCCP            AND SUCCEED MATCHING NULL
        !          7859:        EJC
        !          7860: *
        !          7861: *      EXPRESSION NODE (P$EXA, INITIAL ENTRY)
        !          7862: *
        !          7863: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          7864: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
        !          7865: *
        !          7866: *      PARM1                 EXPRESSION POINTER
        !          7867: *
        !          7868: P$EXA  ENT  BL$P1            P1BLK
        !          7869:        JSR  EVALP            EVALUATE EXPRESSION
        !          7870:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          7871:        BLO  WA,=P$AAA,PEXA1  JUMP IF RESULT IS NOT A PATTERN
        !          7872: *
        !          7873: *      HERE IF RESULT OF EXPRESSION IS A PATTERN
        !          7874: *
        !          7875:        MOV  WB,-(XS)         STACK DUMMY CURSOR
        !          7876:        MOV  XR,-(XS)         STACK PTR TO P$EXA NODE
        !          7877:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE PTR
        !          7878:        MOV  =NDEXB,-(XS)     STACK PTR TO SPECIAL NODE NDEXB
        !          7879:        MOV  XS,PMHBS         STORE NEW STACK BASE POINTER
        !          7880:        MOV  XL,XR            COPY NODE POINTER
        !          7881:        BRI  (XR)             MATCH FIRST NODE IN EXPRESSION PAT
        !          7882: *
        !          7883: *      HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
        !          7884: *
        !          7885: PEXA1  BEQ  WA,=B$SCL,PEXA2  JUMP IF IT IS ALREADY A STRING
        !          7886:        MOV  XL,-(XS)         ELSE STACK RESULT
        !          7887:        MOV  XR,XL            SAVE NODE POINTER
        !          7888:        JSR  GTSTG            CONVERT RESULT TO STRING
        !          7889:        ERR  053,EXPRESSION DOES NOT EVALUATE TO PATTERN
        !          7890:        MOV  XR,WC            COPY STRING POINTER
        !          7891:        MOV  XL,XR            RESTORE NODE POINTER
        !          7892:        MOV  WC,XL            COPY STRING POINTER AGAIN
        !          7893: *
        !          7894: *      MERGE HERE WITH STRING POINTER IN XL
        !          7895: *
        !          7896: PEXA2  BZE  SCLEN(XL),SUCCP  JUST SUCCEED IF NULL STRING
        !          7897:        MOV  XR,PSAVE         SAVE NODE PTR
        !          7898:        MOV  R$PMS,XR         LOAD SUBJECT STRING PTR
        !          7899:        PLC  XR,WB            POINT TO CURRENT CHAR
        !          7900:        ADD  SCLEN(XL),WB     COMPUTE NEW CURSOR POSITION
        !          7901:        BGT  WB,PMSSL,FAILP   FAIL IF PAST END OF STRING
        !          7902:        MOV  WB,PSAVC         SAVE UPDATED CURSOR
        !          7903:        MOV  SCLEN(XL),WA     NUMBER OF CHARS TO COMPARE
        !          7904:        PLC  XL               POINT TO TEST STRING CHARS
        !          7905:        CMC  FAILP,FAILP      COMPARE, FAIL IF UNEQUAL
        !          7906:        MOV  PSAVE,XR         IF ALL MATCHED, RESTORE NODE PTR
        !          7907:        MOV  PSAVC,WB         RESTORE UPDATED CURSOR
        !          7908:        BRN  SUCCP            AND SUCCEED
        !          7909:        EJC
        !          7910: *
        !          7911: *      EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
        !          7912: *
        !          7913: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          7914: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
        !          7915: *
        !          7916: *      NO PARAMETERS (DUMMY PATTERN)
        !          7917: *
        !          7918: P$EXB  ENT                   ENTRY POINT
        !          7919:        MOV  WB,PMHBS         RESTORE OUTER LEVEL STACK POINTER
        !          7920:        BRN  FLPOP            FAIL AND POP P$EXA NODE PTR
        !          7921:        EJC
        !          7922: *
        !          7923: *      EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
        !          7924: *
        !          7925: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          7926: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
        !          7927: *
        !          7928: *      NO PARAMETERS (DUMMY PATTERN)
        !          7929: *
        !          7930: P$EXC  ENT                   ENTRY POINT
        !          7931:        MOV  WB,PMHBS         RESTORE INNER STACK BASE POINTER
        !          7932:        BRN  FAILP            AND FAIL INTO EXPR PATTERN ALTERNVS
        !          7933: *
        !          7934: *      FAIL
        !          7935: *
        !          7936: *      NO PARAMETERS
        !          7937: *
        !          7938: P$FAL  ENT  BL$P0            P0BLK
        !          7939:        BRN  FAILP            JUST SIGNAL FAILURE
        !          7940:        EJC
        !          7941: *      FENCE
        !          7942: *
        !          7943: *      SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
        !          7944: *      ALGORITHM FOR MATCHING THIS NODE TYPE.
        !          7945: *
        !          7946: *      NO PARAMETERS
        !          7947: *
        !          7948: P$FEN  ENT  BL$P0            P0BLK
        !          7949:        MOV  WB,-(XS)         STACK DUMMY CURSOR
        !          7950:        MOV  =NDABO,-(XS)     STACK PTR TO ABORT NODE
        !          7951:        BRN  SUCCP            AND SUCCEED MATCHING NULL
        !          7952: .IF    .CNFN
        !          7953: .ELSE
        !          7954: *
        !          7955: *      FENCE (FUNCTION)
        !          7956: *
        !          7957: *      SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
        !          7958: *      FOR DETAILS OF SCHEME
        !          7959: *
        !          7960: *      NO PARAMETERS
        !          7961: *
        !          7962: P$FNA  ENT  BL$P0            P0BLK
        !          7963:        MOV  PMHBS,-(XS)      STACK CURRENT HISTORY STACK BASE
        !          7964:        MOV  =NDFNB,-(XS)     STACK INDIR PTR TO P$FNB (FAILURE)
        !          7965:        MOV  XS,PMHBS         BEGIN NEW HISTORY STACK
        !          7966:        BRN  SUCCP            SUCCEED
        !          7967: *
        !          7968: *      FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
        !          7969: *
        !          7970: *      NO PARAMETERS (DUMMY PATTERN)
        !          7971: *
        !          7972: P$FNB  ENT  BL$P0            P0BLK
        !          7973:        MOV  WB,PMHBS         RESTORE OUTER PMHBS STACK BASE
        !          7974:        BRN  FAILP            ...AND FAIL
        !          7975: *
        !          7976: *      FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
        !          7977: *
        !          7978: *      NO PARAMETERS (DUMMY PATTERN)
        !          7979: *
        !          7980: P$FNC  ENT  BL$P0            P0BLK
        !          7981:        MOV  PMHBS,XT         GET INNER STACK BASE PTR
        !          7982:        MOV  NUM01(XT),PMHBS  RESTORE OUTER STACK BASE
        !          7983:        BEQ  XT,XS,PFNC1      OPTIMIZE IF NO ALTERNATIVES
        !          7984:        MOV  XT,-(XS)         ELSE STACK INNER STACK BASE
        !          7985:        MOV  =NDFND,-(XS)     STACK PTR TO NDFND
        !          7986:        BRN  SUCCP            SUCCEED
        !          7987: *
        !          7988: *      HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
        !          7989: *
        !          7990: PFNC1  ADD  *NUM02,XS        POP OFF P$FNB ENTRY
        !          7991:        BRN  SUCCP            SUCCEED
        !          7992: *
        !          7993: *      FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
        !          7994: *
        !          7995: *      NO PARAMETERS (DUMMY PATTERN)
        !          7996: *
        !          7997: P$FND  ENT  BL$P0            P0BLK
        !          7998:        MOV  WB,XS            POP STACK TO FENCE() HISTORY BASE
        !          7999:        BRN  FLPOP            POP BASE ENTRY AND FAIL
        !          8000: .FI
        !          8001:        EJC
        !          8002: *
        !          8003: *      IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
        !          8004: *
        !          8005: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
        !          8006: *      STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
        !          8007: *
        !          8008: *      NO PARAMETERS
        !          8009: *
        !          8010: P$IMA  ENT  BL$P0            P0BLK
        !          8011:        MOV  WB,-(XS)         STACK CURSOR
        !          8012:        MOV  XR,-(XS)         STACK DUMMY NODE POINTER
        !          8013:        MOV  PMHBS,-(XS)      STACK OLD STACK BASE POINTER
        !          8014:        MOV  =NDIMB,-(XS)     STACK PTR TO SPECIAL NODE NDIMB
        !          8015:        MOV  XS,PMHBS         STORE NEW STACK BASE POINTER
        !          8016:        BRN  SUCCP            AND SUCCEED
        !          8017: *
        !          8018: *      IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
        !          8019: *
        !          8020: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
        !          8021: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8022: *
        !          8023: *      NO PARAMETERS (DUMMY PATTERN)
        !          8024: *
        !          8025: P$IMB  ENT                   ENTRY POINT
        !          8026:        MOV  WB,PMHBS         RESTORE HISTORY STACK BASE PTR
        !          8027:        BRN  FLPOP            FAIL AND POP DUMMY NODE PTR
        !          8028:        EJC
        !          8029: *
        !          8030: *      IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
        !          8031: *
        !          8032: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
        !          8033: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8034: *
        !          8035: *      PARM1                 NAME BASE OF VARIABLE
        !          8036: *      PARM2                 NAME OFFSET OF VARIABLE
        !          8037: *
        !          8038: P$IMC  ENT  BL$P2            P2BLK
        !          8039:        MOV  PMHBS,XT         LOAD POINTER TO P$IMB ENTRY
        !          8040:        MOV  WB,WA            COPY FINAL CURSOR
        !          8041:        MOV  3(XT),WB         LOAD INITIAL CURSOR
        !          8042:        MOV  1(XT),PMHBS      RESTORE OUTER STACK BASE POINTER
        !          8043:        BEQ  XT,XS,PIMC1      JUMP IF NO HISTORY STACK ENTRIES
        !          8044:        MOV  XT,-(XS)         ELSE SAVE INNER PMHBS POINTER
        !          8045:        MOV  =NDIMD,-(XS)     AND A PTR TO SPECIAL NODE NDIMD
        !          8046:        BRN  PIMC2            MERGE
        !          8047: *
        !          8048: *      HERE IF NO ENTRIES MADE ON HISTORY STACK
        !          8049: *
        !          8050: PIMC1  ADD  *NUM04,XS        REMOVE NDIMB ENTRY AND CURSOR
        !          8051: *
        !          8052: *      MERGE HERE TO PERFORM ASSIGNMENT
        !          8053: *
        !          8054: PIMC2  MOV  WA,-(XS)         SAVE CURRENT (FINAL) CURSOR
        !          8055:        MOV  XR,-(XS)         SAVE CURRENT NODE POINTER
        !          8056:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
        !          8057:        SUB  WB,WA            COMPUTE SUBSTRING LENGTH
        !          8058:        JSR  SBSTR            BUILD SUBSTRING
        !          8059:        MOV  XR,WB            MOVE RESULT
        !          8060:        MOV  (XS),XR          RELOAD NODE POINTER
        !          8061:        MOV  PARM1(XR),XL     LOAD NAME BASE
        !          8062:        MOV  PARM2(XR),WA     LOAD NAME OFFSET
        !          8063:        JSR  ASINP            PERFORM ASSIGNMENT
        !          8064:        PPM  FLPOP            FAIL IF ASSIGNMENT FAILS
        !          8065:        MOV  (XS)+,XR         ELSE RESTORE NODE POINTER
        !          8066:        MOV  (XS)+,WB         RESTORE CURSOR
        !          8067:        BRN  SUCCP            AND SUCCEED
        !          8068: *
        !          8069: *      IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
        !          8070: *
        !          8071: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
        !          8072: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8073: *
        !          8074: *      NO PARAMETERS (DUMMY PATTERN)
        !          8075: *
        !          8076: P$IMD  ENT                   ENTRY POINT
        !          8077:        MOV  WB,PMHBS         RESTORE INNER STACK BASE POINTER
        !          8078:        BRN  FAILP            AND FAIL
        !          8079:        EJC
        !          8080: *
        !          8081: *      LEN (INTEGER ARGUMENT)
        !          8082: *
        !          8083: *      PARM1                 INTEGER ARGUMENT
        !          8084: *
        !          8085: P$LEN  ENT  BL$P1            P1BLK
        !          8086:        ADD  PARM1(XR),WB     PUSH CURSOR INDICATED AMOUNT
        !          8087:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
        !          8088:        BRN  FAILP            ELSE FAIL
        !          8089: *
        !          8090: *      LEN (EXPRESSION ARGUMENT)
        !          8091: *
        !          8092: *      PARM1                 EXPRESSION POINTER
        !          8093: *
        !          8094: P$LND  ENT  BL$P1            P1BLK
        !          8095:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
        !          8096:        ERR  054,LEN EVALUATED ARGUMENT IS NOT INTEGER
        !          8097:        ERR  055,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
        !          8098:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8099:        ADD  PARM1(XR),WB     PUSH CURSOR INDICATED AMOUNT
        !          8100:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
        !          8101:        BRN  FAILP            ELSE FAIL
        !          8102:        EJC
        !          8103: *
        !          8104: *      NOTANY (EXPRESSION ARGUMENT)
        !          8105: *
        !          8106: *      PARM1                 EXPRESSION POINTER
        !          8107: *
        !          8108: P$NAD  ENT  BL$P1            P1BLK
        !          8109:        MOV  =P$NAY,WA        PCODE FOR NEW NODE
        !          8110:        JSR  EVALS            EVALUATE STRING ARGUMENT
        !          8111:        ERR  056,NOTANY EVALUATED ARGUMENT IS NOT STRING
        !          8112:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8113:        BRI  XL               MERGE WITH MULTI-CHAR CASE IF OK
        !          8114:        EJC
        !          8115: *
        !          8116: *      NOTANY (ONE CHARACTER ARGUMENT)
        !          8117: *
        !          8118: *      PARM1                 CHARACTER ARGUMENT
        !          8119: *
        !          8120: P$NAS  ENT  BL$P1            ENTRY POINT
        !          8121:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARS LEFT
        !          8122:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
        !          8123:        PLC  XL,WB            POINT TO CURRENT CHARACTER IN STRIN
        !          8124:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
        !          8125:        BEQ  WA,PARM1(XR),FAILP FAIL IF MATCH
        !          8126:        ICV  WB               ELSE BUMP CURSOR
        !          8127:        BRN  SUCCP            AND SUCCEED
        !          8128:        EJC
        !          8129: *
        !          8130: *      NOTANY (MULTI-CHARACTER STRING ARGUMENT)
        !          8131: *      EXPRESSION ARGUMENT CASE MERGES
        !          8132: *
        !          8133: *      PARM1                 POINTER TO CTBLK
        !          8134: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
        !          8135: *
        !          8136: P$NAY  ENT  BL$P2            P2BLK
        !          8137:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARACTERS LEFT
        !          8138:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
        !          8139:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          8140:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
        !          8141:        WTB  WA               CONVERT TO BAU OFFSET
        !          8142:        MOV  PARM1(XR),XL     LOAD POINTER TO CTBLK
        !          8143:        ADD  WA,XL            POINT TO ENTRY IN CTBLK
        !          8144:        MOV  CTCHS(XL),WA     LOAD ENTRY FROM CTBLK
        !          8145:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
        !          8146:        NZB  WA,FAILP         FAIL IF CHARACTER IS MATCHED
        !          8147:        ICV  WB               ELSE BUMP CURSOR
        !          8148:        BRN  SUCCP            AND SUCCEED
        !          8149:        EJC
        !          8150: *
        !          8151: *      END OF PATTERN MATCH
        !          8152: *
        !          8153: *      THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
        !          8154: *      SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
        !          8155: *      PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
        !          8156: *
        !          8157: *      NO PARAMETERS (DUMMY PATTERN)
        !          8158: *
        !          8159: P$NTH  ENT                   ENTRY POINT
        !          8160:        MOV  PMHBS,XT         LOAD POINTER TO BASE OF STACK
        !          8161:        MOV  1(XT),WA         LOAD SAVED PMHBS (OR PATTERN TYPE)
        !          8162:        BLE  WA,=NUM02,PNTH2  JUMP IF OUTER LEVEL (PATTERN TYPE)
        !          8163: *
        !          8164: *      HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
        !          8165: *
        !          8166:        MOV  WA,PMHBS         RESTORE OUTER STACK BASE POINTER
        !          8167:        MOV  2(XT),XR         RESTORE POINTER TO P$EXA NODE
        !          8168:        BEQ  XT,XS,PNTH1      JUMP IF NO HISTORY STACK ENTRIES
        !          8169:        MOV  XT,-(XS)         ELSE STACK INNER STACK BASE PTR
        !          8170:        MOV  =NDEXC,-(XS)     STACK PTR TO SPECIAL NODE NDEXC
        !          8171:        BRN  SUCCP            AND SUCCEED
        !          8172: *
        !          8173: *      HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
        !          8174: *
        !          8175: PNTH1  ADD  *NUM04,XS        REMOVE P$EXB ENTRY AND NODE PTR
        !          8176:        BRN  SUCCP            AND SUCCEED
        !          8177: *
        !          8178: *      HERE IF END OF MATCH AT OUTER LEVEL
        !          8179: *
        !          8180: PNTH2  MOV  WB,PMSSL         SAVE FINAL CURSOR IN SAFE PLACE
        !          8181:        BZE  PMDFL,PNTH6      JUMP IF NO PATTERN ASSIGNMENTS
        !          8182:        EJC
        !          8183: *
        !          8184: *      END OF PATTERN MATCH (CONTINUED)
        !          8185: *
        !          8186: *      NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
        !          8187: *      SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
        !          8188: *
        !          8189: PNTH3  DCA  XT               POINT PAST CURSOR ENTRY
        !          8190:        MOV  -(XT),WA         LOAD NODE POINTER
        !          8191:        BEQ  WA,=NDPAD,PNTH4  JUMP IF NDPAD ENTRY
        !          8192:        BNE  WA,=NDPAB,PNTH5  JUMP IF NOT NDPAB ENTRY
        !          8193: *
        !          8194: *      HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
        !          8195: *      NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
        !          8196: *
        !          8197:        MOV  1(XT),-(XS)      STACK INITIAL CURSOR
        !          8198:        CHK                   CHECK FOR STACK OVERFLOW
        !          8199:        BRN  PNTH3            LOOP BACK IF OK
        !          8200: *
        !          8201: *      HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
        !          8202: *      MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
        !          8203: *
        !          8204: PNTH4  MOV  1(XT),WA         LOAD FINAL CURSOR
        !          8205:        MOV  (XS),WB          LOAD INITIAL CURSOR FROM STACK
        !          8206:        MOV  XT,(XS)          SAVE HISTORY STACK SCAN PTR
        !          8207:        SUB  WB,WA            COMPUTE LENGTH OF STRING
        !          8208: *
        !          8209: *      BUILD SUBSTRING AND PERFORM ASSIGNMENT
        !          8210: *
        !          8211:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
        !          8212:        JSR  SBSTR            CONSTRUCT SUBSTRING
        !          8213:        MOV  XR,WB            COPY SUBSTRING POINTER
        !          8214:        MOV  (XS),XT          RELOAD HISTORY STACK SCAN PTR
        !          8215:        MOV  2(XT),XL         LOAD POINTER TO P$PAC NODE WITH NAM
        !          8216:        MOV  PARM2(XL),WA     LOAD NAME OFFSET
        !          8217:        MOV  PARM1(XL),XL     LOAD NAME BASE
        !          8218:        JSR  ASINP            PERFORM ASSIGNMENT
        !          8219:        PPM  EXFAL            MATCH FAILS IF NAME EVAL FAILS
        !          8220:        MOV  (XS)+,XT         ELSE RESTORE HISTORY STACK PTR
        !          8221:        EJC
        !          8222: *
        !          8223: *      END OF PATTERN MATCH (CONTINUED)
        !          8224: *
        !          8225: *      HERE CHECK FOR END OF ENTRIES
        !          8226: *
        !          8227: PNTH5  BNE  XT,XS,PNTH3      LOOP IF MORE ENTRIES TO SCAN
        !          8228: *
        !          8229: *      HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
        !          8230: *
        !          8231: PNTH6  MOV  PMHBS,XS         WIPE OUT HISTORY STACK
        !          8232:        MOV  (XS)+,WB         LOAD INITIAL CURSOR
        !          8233:        MOV  (XS)+,WC         LOAD MATCH TYPE CODE
        !          8234:        MOV  PMSSL,WA         LOAD FINAL CURSOR VALUE
        !          8235:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
        !          8236:        ZER  R$PMS            CLEAR SUBJECT STRING PTR FOR GBCOL
        !          8237:        BZE  WC,PNTH7         JUMP IF CALL BY NAME
        !          8238:        ZER  R$PMB            CLEAR POSSIBLE BCBLK PTR FOR GBCOL
        !          8239:        BEQ  WC,=NUM02,EXITS  EXIT IF STATEMENT LEVEL CALL
        !          8240: *
        !          8241: *      HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
        !          8242: *
        !          8243:        SUB  WB,WA            COMPUTE LENGTH OF STRING
        !          8244:        JSR  SBSTR            BUILD SUBSTRING
        !          8245:        BRN  EXIXR            AND EXIT WITH SUBSTRING VALUE
        !          8246: *
        !          8247: *      HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
        !          8248: *
        !          8249: PNTH7  MOV  WB,-(XS)         STACK INITIAL CURSOR
        !          8250:        MOV  WA,-(XS)         STACK FINAL CURSOR
        !          8251: .IF    .CNBF
        !          8252:        MOV  XL,-(XS)         STACK SUBJECT STRING POINTER
        !          8253: .ELSE
        !          8254:        BZE  R$PMB,PNTH8      SKIP IF SUBJECT NOT BUFFER
        !          8255:        MOV  R$PMB,XL         ELSE GET PTR TO BCBLK INSTEAD
        !          8256:        ZER  R$PMB            CLEAR BCBLK PTR FOR GBCOL
        !          8257: *
        !          8258: *      HERE WITH XL POINTING TO SCBLK OR BCBLK
        !          8259: *
        !          8260: PNTH8  MOV  XL,-(XS)         STACK SUBJECT POINTER
        !          8261: .FI
        !          8262:        BRN  EXITS            EXIT WITH SPECIAL ENTRY ON STACK
        !          8263:        EJC
        !          8264: *
        !          8265: *      POS (INTEGER ARGUMENT)
        !          8266: *
        !          8267: *      PARM1                 INTEGER ARGUMENT
        !          8268: *
        !          8269: P$POS  ENT  BL$P1            P1BLK
        !          8270:        BEQ  WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
        !          8271:        BRN  FAILP            ELSE FAIL
        !          8272: *
        !          8273: *      POS (EXPRESSION ARGUMENT)
        !          8274: *
        !          8275: *      PARM1                 EXPRESSION POINTER
        !          8276: *
        !          8277: P$PSD  ENT  BL$P1            P1BLK
        !          8278:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
        !          8279:        ERR  057,POS EVALUATED ARGUMENT IS NOT INTEGER
        !          8280:        ERR  058,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
        !          8281:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8282:        BEQ  WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
        !          8283:        BRN  FAILP            ELSE FAIL
        !          8284:        EJC
        !          8285: *
        !          8286: *      PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
        !          8287: *
        !          8288: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          8289: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8290: *
        !          8291: *      NO PARAMETERS
        !          8292: *
        !          8293: P$PAA  ENT  BL$P0            P0BLK
        !          8294:        MOV  WB,-(XS)         STACK INITIAL CURSOR
        !          8295:        MOV  =NDPAB,-(XS)     STACK PTR TO NDPAB SPECIAL NODE
        !          8296:        BRN  SUCCP            AND SUCCEED MATCHING NULL
        !          8297: *
        !          8298: *      PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
        !          8299: *
        !          8300: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          8301: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8302: *
        !          8303: *      NO PARAMETERS (DUMMY PATTERN)
        !          8304: *
        !          8305: P$PAB  ENT                   ENTRY POINT
        !          8306:        BRN  FAILP            JUST FAIL (ENTRY IS ALREADY POPPED)
        !          8307: *
        !          8308: *      PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
        !          8309: *
        !          8310: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          8311: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8312: *
        !          8313: *      PARM1                 NAME BASE OF VARIABLE
        !          8314: *      PARM2                 NAME OFFSET OF VARIABLE
        !          8315: *
        !          8316: P$PAC  ENT  BL$P2            P2BLK
        !          8317:        MOV  WB,-(XS)         STACK DUMMY CURSOR VALUE
        !          8318:        MOV  XR,-(XS)         STACK POINTER TO P$PAC NODE
        !          8319:        MOV  WB,-(XS)         STACK FINAL CURSOR
        !          8320:        MOV  =NDPAD,-(XS)     STACK PTR TO SPECIAL NDPAD NODE
        !          8321:        MNZ  PMDFL            SET DOT FLAG NON-ZERO
        !          8322:        BRN  SUCCP            AND SUCCEED
        !          8323: *
        !          8324: *      PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
        !          8325: *
        !          8326: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
        !          8327: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
        !          8328: *
        !          8329: *      NO PARAMETERS (DUMMY NODE)
        !          8330: *
        !          8331: P$PAD  ENT                   ENTRY POINT
        !          8332:        BRN  FLPOP            FAIL AND REMOVE P$PAC NODE
        !          8333:        EJC
        !          8334: *
        !          8335: *      REM
        !          8336: *
        !          8337: *      NO PARAMETERS
        !          8338: *
        !          8339: P$REM  ENT  BL$P0            P0BLK
        !          8340:        MOV  PMSSL,WB         POINT CURSOR TO END OF STRING
        !          8341:        BRN  SUCCP            AND SUCCEED
        !          8342: *
        !          8343: *      RPOS (EXPRESSION ARGUMENT)
        !          8344: *
        !          8345: *      PARM1                 EXPRESSION POINTER
        !          8346: *
        !          8347: P$RPD  ENT  BL$P1            P1BLK
        !          8348:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
        !          8349:        ERR  059,RPOS EVALUATED ARGUMENT IS NOT INTEGER
        !          8350:        ERR  060,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
        !          8351:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8352:        MOV  =P$RPS,XL        CONTINUATION ROUTINE
        !          8353:        BRI  XL               ENTER ROUTINE
        !          8354: *
        !          8355: *      RPOS (INTEGER ARGUMENT)
        !          8356: *      EXPRESSION ARGUMENT CASE MERGES
        !          8357: *
        !          8358: *      PARM1                 INTEGER ARGUMENT
        !          8359: *
        !          8360: P$RPS  ENT  BL$P1            P1BLK
        !          8361:        MOV  PMSSL,WC         GET LENGTH OF STRING
        !          8362:        SUB  WB,WC            GET NUMBER OF CHARACTERS REMAINING
        !          8363:        BEQ  WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
        !          8364:        BRN  FAILP            ELSE FAIL
        !          8365:        EJC
        !          8366: *
        !          8367: *      RTAB (INTEGER ARGUMENT)
        !          8368: *      EXPRESSION ARGUMENT CASE MERGES
        !          8369: *
        !          8370: *      PARM1                 INTEGER ARGUMENT
        !          8371: *
        !          8372: P$RTB  ENT  BL$P1            P1BLK
        !          8373:        MOV  WB,WC            SAVE INITIAL CURSOR
        !          8374:        MOV  PMSSL,WB         POINT TO END OF STRING
        !          8375:        BLT  WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH
        !          8376:        SUB  PARM1(XR),WB     ELSE SET NEW CURSOR
        !          8377:        BGE  WB,WC,SUCCP      AND SUCCEED IF NOT TOO FAR ALREADY
        !          8378:        BRN  FAILP            IN WHICH CASE, FAIL
        !          8379: *
        !          8380: *      RTAB (EXPRESSION ARGUMENT)
        !          8381: *
        !          8382: *      PARM1                 EXPRESSION POINTER
        !          8383: *
        !          8384: P$RTD  ENT  BL$P1            P1BLK
        !          8385:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
        !          8386:        ERR  061,RTAB EVALUATED ARGUMENT IS NOT INTEGER
        !          8387:        ERR  062,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
        !          8388:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8389:        MOV  =P$RTB,XL        CONTINUATION ROUTINE
        !          8390:        BRI  XL               ENTER ROUTINE
        !          8391:        EJC
        !          8392: *
        !          8393: *      SPAN (EXPRESSION ARGUMENT)
        !          8394: *
        !          8395: *      PARM1                 EXPRESSION POINTER
        !          8396: *
        !          8397: P$SPD  ENT  BL$P1            P1BLK
        !          8398:        MOV  =P$SPN,WA        PCODE FOR NEW NODE
        !          8399:        JSR  EVALS            EVALUATE STRING ARGUMENT
        !          8400:        ERR  063,SPAN EVALUATED ARGUMENT IS NOT STRING
        !          8401:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8402:        BRI  XL               MERGE WITH MULTI-CHAR CASE IF OK
        !          8403: *
        !          8404: *      SPAN (MULTI-CHARACTER ARGUMENT CASE)
        !          8405: *      EXPRESSION ARGUMENT CASE MERGES
        !          8406: *
        !          8407: *      PARM1                 POINTER TO CTBLK
        !          8408: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
        !          8409: *
        !          8410: P$SPN  ENT  BL$P2            P2BLK
        !          8411:        MOV  PMSSL,WC         COPY SUBJECT STRING LENGTH
        !          8412:        SUB  WB,WC            CALCULATE NUMBER OF CHARACTERS LEFT
        !          8413:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
        !          8414:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
        !          8415:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          8416:        MOV  WB,PSAVC         SAVE INITIAL CURSOR
        !          8417:        MOV  XR,PSAVE         SAVE NODE POINTER
        !          8418:        LCT  WC,WC            SET COUNTER FOR CHARS LEFT
        !          8419: *
        !          8420: *      LOOP TO SCAN MATCHING CHARACTERS
        !          8421: *
        !          8422: PSPN2  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
        !          8423:        WTB  WA               CONVERT TO BAU OFFSET
        !          8424:        MOV  PARM1(XR),XR     POINT TO CTBLK
        !          8425:        ADD  WA,XR            POINT TO CTBLK ENTRY
        !          8426:        MOV  CTCHS(XR),WA     LOAD CTBLK ENTRY
        !          8427:        MOV  PSAVE,XR         RESTORE NODE POINTER
        !          8428:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
        !          8429:        ZRB  WA,PSPN3         JUMP IF NO MATCH
        !          8430:        ICV  WB               ELSE PUSH CURSOR
        !          8431:        BCT  WC,PSPN2         LOOP BACK UNLESS END OF STRING
        !          8432: *
        !          8433: *      HERE AFTER SCANNING MATCHING CHARACTERS
        !          8434: *
        !          8435: PSPN3  BNE  WB,PSAVC,SUCCP   SUCCEED IF CHARS MATCHED
        !          8436:        BRN  FAILP            ELSE FAIL IF NULL STRING MATCHED
        !          8437:        EJC
        !          8438: *
        !          8439: *      SPAN (ONE CHARACTER ARGUMENT)
        !          8440: *
        !          8441: *      PARM1                 CHARACTER ARGUMENT
        !          8442: *
        !          8443: P$SPS  ENT  BL$P1            P1BLK
        !          8444:        MOV  PMSSL,WC         GET SUBJECT STRING LENGTH
        !          8445:        SUB  WB,WC            CALCULATE NUMBER OF CHARACTERS LEFT
        !          8446:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
        !          8447:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
        !          8448:        PLC  XL,WB            POINT TO CURRENT CHARACTER
        !          8449:        MOV  WB,PSAVC         SAVE INITIAL CURSOR
        !          8450:        LCT  WC,WC            SET COUNTER FOR CHARACTERS LEFT
        !          8451: *
        !          8452: *      LOOP TO SCAN MATCHING CHARACTERS
        !          8453: *
        !          8454: PSPS1  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
        !          8455:        BNE  WA,PARM1(XR),PSPS2 JUMP IF NO MATCH
        !          8456:        ICV  WB               ELSE PUSH CURSOR
        !          8457:        BCT  WC,PSPS1         AND LOOP UNLESS END OF STRING
        !          8458: *
        !          8459: *      HERE AFTER SCANNING MATCHING CHARACTERS
        !          8460: *
        !          8461: PSPS2  BNE  WB,PSAVC,SUCCP   SUCCEED IF CHARS MATCHED
        !          8462:        BRN  FAILP            FAIL IF NULL STRING MATCHED
        !          8463: *
        !          8464: *      MULTI-CHARACTER STRING (MERGE FROM P$EXA)
        !          8465: *
        !          8466: *      NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
        !          8467: *      ONE CHARACTER ANY ARGUMENTS (P$AN1).
        !          8468: *
        !          8469: *      PARM1                 POINTER TO SCBLK FOR STRING ARG
        !          8470: *
        !          8471: P$STR  ENT  BL$P1            P1BLK
        !          8472:        MOV  PARM1(XR),XL     GET POINTER TO STRING
        !          8473:        MOV  XR,PSAVE         SAVE NODE POINTER
        !          8474:        MOV  R$PMS,XR         LOAD SUBJECT STRING POINTER
        !          8475:        PLC  XR,WB            POINT TO CURRENT CHARACTER
        !          8476:        ADD  SCLEN(XL),WB     COMPUTE NEW CURSOR POSITION
        !          8477:        BGT  WB,PMSSL,FAILP   FAIL IF PAST END OF STRING
        !          8478:        MOV  WB,PSAVC         SAVE UPDATED CURSOR
        !          8479:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARS TO COMPARE
        !          8480:        PLC  XL               POINT TO CHARS OF TEST STRING
        !          8481:        CMC  FAILP,FAILP      COMPARE, FAIL IF NOT EQUAL
        !          8482:        MOV  PSAVE,XR         IF ALL MATCHED, RESTORE NODE PTR
        !          8483:        MOV  PSAVC,WB         RESTORE UPDATED CURSOR
        !          8484:        BRN  SUCCP            AND SUCCEED
        !          8485:        EJC
        !          8486: *
        !          8487: *      SUCCEED
        !          8488: *
        !          8489: *      SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
        !          8490: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
        !          8491: *
        !          8492: *      NO PARAMETERS
        !          8493: *
        !          8494: P$SUC  ENT  BL$P0            P0BLK
        !          8495:        MOV  WB,-(XS)         STACK CURSOR
        !          8496:        MOV  XR,-(XS)         STACK POINTER TO THIS NODE
        !          8497:        BRN  SUCCP            SUCCEED MATCHING NULL
        !          8498:        EJC
        !          8499: *
        !          8500: *      TAB (INTEGER ARGUMENT)
        !          8501: *      EXPRESSION CASE MERGES
        !          8502: *
        !          8503: *      PARM1                 INTEGER ARGUMENT
        !          8504: *
        !          8505: P$TAB  ENT  BL$P1            P1BLK
        !          8506:        BGT  WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY
        !          8507:        MOV  PARM1(XR),WB     ELSE SET NEW CURSOR POSITION
        !          8508:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
        !          8509:        BRN  FAILP            ELSE FAIL
        !          8510: *
        !          8511: *      TAB (EXPRESSION ARGUMENT)
        !          8512: *
        !          8513: *      PARM1                 EXPRESSION POINTER
        !          8514: *
        !          8515: P$TBD  ENT  BL$P1            P1BLK
        !          8516:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
        !          8517:        ERR  064,TAB EVALUATED ARGUMENT IS NOT INTEGER
        !          8518:        ERR  065,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
        !          8519:        PPM  FAILP            FAIL IF EVALUATION FAILS
        !          8520:        MOV  =P$TAB,XL        CONTINUATION ROUTINE
        !          8521:        BRI  XL               ENTER ROUTINE
        !          8522: *
        !          8523: *      ANCHOR MOVEMENT
        !          8524: *
        !          8525: *      NO PARAMETERS (DUMMY NODE)
        !          8526: *
        !          8527: P$UNA  ENT                   ENTRY POINT
        !          8528:        MOV  WB,XR            COPY INITIAL PATTERN NODE POINTER
        !          8529:        MOV  (XS),WB          GET INITIAL CURSOR
        !          8530:        BEQ  WB,PMSSL,EXFAL   MATCH FAILS IF AT END OF STRING
        !          8531:        ICV  WB               ELSE INCREMENT CURSOR
        !          8532:        MOV  WB,(XS)          STORE INCREMENTED CURSOR
        !          8533:        MOV  XR,-(XS)         RESTACK INITIAL NODE PTR
        !          8534:        MOV  =NDUNA,-(XS)     RESTACK UNANCHORED NODE
        !          8535:        BRI  (XR)             REMATCH FIRST NODE
        !          8536: *
        !          8537: *      END OF PATTERN MATCH ROUTINES
        !          8538: *
        !          8539: *      THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
        !          8540: *      MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
        !          8541: *      REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
        !          8542: *
        !          8543: P$YYY  ENT  BL$$I            MARK LAST ENTRY IN PATTERN SECTION
        !          8544:        TTL  S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
        !          8545: *
        !          8546: *      THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
        !          8547: *      WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
        !          8548: *
        !          8549: *      THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
        !          8550: *      INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
        !          8551: *      IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
        !          8552: *
        !          8553: *      THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
        !          8554: *      HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
        !          8555: *
        !          8556: *      IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
        !          8557: *      AND IN THESE INSTANCES WE ALSO HAVE.
        !          8558: *
        !          8559: *      (WA)                  ACTUAL NUMBER OF ARGUMENTS IN CALL
        !          8560: *
        !          8561: *      CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
        !          8562: *      ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
        !          8563: *      WORD FROM THE GENERATED CODE.
        !          8564: *
        !          8565: *      THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
        !          8566: *      THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
        !          8567: *      THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
        !          8568: *      ALPHABETICALLY BY THEIR ENTRY NAMES.
        !          8569:        EJC
        !          8570: *
        !          8571: *      ANY
        !          8572: *
        !          8573: S$ANY  ENT                   ENTRY POINT
        !          8574:        MOV  =P$ANS,WB        SET PCODE FOR SINGLE CHAR CASE
        !          8575:        MOV  =P$ANY,XL        PCODE FOR MULTI-CHAR CASE
        !          8576:        MOV  =P$AYD,WC        PCODE FOR EXPRESSION CASE
        !          8577:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
        !          8578:        ERR  066,ANY ARGUMENT IS NOT STRING OR EXPRESSION
        !          8579:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          8580: .IF    .CNBF
        !          8581: .ELSE
        !          8582:        EJC
        !          8583: *
        !          8584: *      APPEND
        !          8585: *
        !          8586: S$APN  ENT                   ENTRY POINT
        !          8587:        MOV  (XS)+,XL         GET APPEND ARGUMENT
        !          8588:        MOV  (XS)+,XR         GET BCBLK
        !          8589:        BEQ  (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK
        !          8590:        ERB  067,APPEND FIRST ARGUMENT IS NOT BUFFER
        !          8591: *
        !          8592: *      HERE TO DO THE APPEND
        !          8593: *
        !          8594: SAPN1  MOV  BCLEN(XR),WA     OFFSET TO BUFFER END
        !          8595:        ZER  WB               NO CHARS TO BE REPLACED
        !          8596:        JSR  INSBF            DO THE APPEND
        !          8597:        ERR  068,APPEND SECOND ARGUMENT IS NOT STRING
        !          8598:        PPM  EXFAL            NO ROOM - FAIL
        !          8599:        BRN  EXNUL            EXIT WITH NULL RESULT
        !          8600: .FI
        !          8601:        EJC
        !          8602: *
        !          8603: *      APPLY
        !          8604: *
        !          8605: *      APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
        !          8606: *      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
        !          8607: *
        !          8608: S$APP  ENT                   ENTRY POINT
        !          8609:        BZE  WA,SAPP3         JUMP IF NO ARGUMENTS
        !          8610:        DCV  WA               ELSE GET APPLIED FUNC ARG COUNT
        !          8611:        MOV  WA,WB            COPY
        !          8612:        WTB  WB               CONVERT TO BAUS
        !          8613:        MOV  XS,XT            COPY STACK POINTER
        !          8614:        ADD  WB,XT            POINT TO FUNCTION ARGUMENT ON STACK
        !          8615:        MOV  (XT),XR          LOAD FUNCTION PTR (APPLY 1ST ARG)
        !          8616:        BZE  WA,SAPP2         JUMP IF NO ARGS FOR APPLIED FUNC
        !          8617:        LCT  WB,WA            ELSE SET COUNTER FOR LOOP
        !          8618: *
        !          8619: *      LOOP TO MOVE ARGUMENTS UP ON STACK
        !          8620: *
        !          8621: SAPP1  DCA  XT               POINT TO NEXT ARGUMENT
        !          8622:        MOV  (XT),1(XT)       MOVE ARGUMENT UP
        !          8623:        BCT  WB,SAPP1         LOOP TILL ALL MOVED
        !          8624: *
        !          8625: *      MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
        !          8626: *
        !          8627: SAPP2  ICA  XS               ADJUST STACK PTR FOR APPLY 1ST ARG
        !          8628:        JSR  GTNVR            GET VARIABLE BLOCK ADDR FOR FUNC
        !          8629:        PPM  SAPP3            JUMP IF NOT NATURAL VARIABLE
        !          8630:        MOV  VRFNC(XR),XL     ELSE POINT TO FUNCTION BLOCK
        !          8631:        BRN  CFUNC            GO CALL APPLIED FUNCTION
        !          8632: *
        !          8633: *      HERE FOR INVALID FIRST ARGUMENT
        !          8634: *
        !          8635: SAPP3  ERB  069,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME
        !          8636:        EJC
        !          8637: *
        !          8638: *      ARBNO
        !          8639: *
        !          8640: *      ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
        !          8641: *      START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
        !          8642: *
        !          8643: S$ABN  ENT                   ENTRY POINT
        !          8644:        ZER  XR               SET PARM1 = 0 FOR THE MOMENT
        !          8645:        MOV  =P$ALT,WB        SET PCODE FOR ALTERNATIVE NODE
        !          8646:        JSR  PBILD            BUILD ALTERNATIVE NODE
        !          8647:        MOV  XR,XL            SAVE PTR TO ALTERNATIVE PATTERN
        !          8648:        MOV  =P$ABC,WB        PCODE FOR P$ABC
        !          8649:        ZER  XR               P0BLK
        !          8650:        JSR  PBILD            BUILD P$ABC NODE
        !          8651:        MOV  XL,PTHEN(XR)     PUT ALTERNATIVE NODE AS SUCCESSOR
        !          8652:        MOV  XL,WA            REMEMBER ALTERNATIVE NODE POINTER
        !          8653:        MOV  XR,XL            COPY P$ABC NODE PTR
        !          8654:        MOV  (XS),XR          LOAD ARBNO ARGUMENT
        !          8655:        MOV  WA,(XS)          STACK ALTERNATIVE NODE POINTER
        !          8656:        JSR  GTPAT            GET ARBNO ARGUMENT AS PATTERN
        !          8657:        ERR  070,ARBNO ARGUMENT IS NOT PATTERN
        !          8658:        JSR  PCONC            CONCAT ARG WITH P$ABC NODE
        !          8659:        MOV  XR,XL            REMEMBER PTR TO CONCD PATTERNS
        !          8660:        MOV  =P$ABA,WB        PCODE FOR P$ABA
        !          8661:        ZER  XR               P0BLK
        !          8662:        JSR  PBILD            BUILD P$ABA NODE
        !          8663:        MOV  XL,PTHEN(XR)     CONCATENATE NODES
        !          8664:        MOV  (XS),XL          RECALL PTR TO ALTERNATIVE NODE
        !          8665:        MOV  XR,PARM1(XL)     POINT ALTERNATIVE BACK TO ARGUMENT
        !          8666:        BRN  EXITS            JUMP FOR NEXT CODE WORD
        !          8667:        EJC
        !          8668: *
        !          8669: *      ARG
        !          8670: *
        !          8671: S$ARG  ENT                   ENTRY POINT
        !          8672:        JSR  GTSMI            GET SECOND ARG AS SMALL INTEGER
        !          8673:        ERR  253,ARG SECOND ARGUMENT IS NOT INTEGER
        !          8674:        PPM  EXFAL            FAIL IF OUT OF RANGE OR NEGATIVE
        !          8675:        MOV  XR,WA            SAVE ARGUMENT NUMBER
        !          8676:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
        !          8677:        JSR  GTNVR            LOCATE VRBLK
        !          8678:        PPM  SARG1            JUMP IF NOT NATURAL VARIABLE
        !          8679:        MOV  VRFNC(XR),XR     ELSE LOAD FUNCTION BLOCK POINTER
        !          8680:        BNE  (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED
        !          8681:        BZE  WA,EXFAL         FAIL IF ARG NUMBER IS ZERO
        !          8682:        BGT  WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE
        !          8683:        WTB  WA               ELSE CONVERT TO BYTE OFFSET
        !          8684:        ADD  WA,XR            POINT TO ARGUMENT SELECTED
        !          8685:        MOV  PFAGB(XR),XR     LOAD ARGUMENT VRBLK POINTER
        !          8686:        BRN  EXVNM            EXIT TO BUILD NMBLK
        !          8687: *
        !          8688: *      HERE IF 1ST ARGUMENT IS BAD
        !          8689: *
        !          8690: SARG1  ERB  252,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
        !          8691:        EJC
        !          8692: *
        !          8693: *      ARRAY
        !          8694: *
        !          8695: S$ARR  ENT                   ENTRY POINT
        !          8696:        MOV  (XS)+,XL         LOAD INITIAL ELEMENT VALUE
        !          8697:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
        !          8698:        JSR  GTINT            CONVERT FIRST ARG TO INTEGER
        !          8699:        PPM  SAR02            JUMP IF NOT INTEGER
        !          8700: *
        !          8701: *      HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
        !          8702: *
        !          8703:        LDI  ICVAL(XR)        LOAD INTEGER VALUE
        !          8704:        ILE  SAR10            JUMP IF ZERO OR NEG (BAD DIMENSION)
        !          8705:        MFI  WA,SAR11         ELSE CONVERT TO ONE WORD, TEST OVFL
        !          8706:        LCT  WB,WA            COPY ELEMENTS FOR LOOP LATER ON
        !          8707:        ADD  =VCSI$,WA        ADD SPACE FOR STANDARD FIELDS
        !          8708:        WTB  WA               CONVERT LENGTH TO BAUS
        !          8709:        BGE  WA,MXLEN,SAR11   FAIL IF TOO LARGE
        !          8710:        JSR  ALLOC            ALLOCATE SPACE FOR VCBLK
        !          8711:        MOV  =B$VCT,(XR)      STORE TYPE WORD
        !          8712:        MOV  WA,VCLEN(XR)     SET LENGTH
        !          8713:        MOV  XL,WC            COPY DEFAULT VALUE
        !          8714:        MOV  XR,XL            COPY VCBLK POINTER
        !          8715:        ADD  *VCVLS,XL        POINT TO FIRST ELEMENT VALUE
        !          8716: *
        !          8717: *      LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
        !          8718: *
        !          8719: SAR01  MOV  WC,(XL)+         STORE ONE VALUE
        !          8720:        BCT  WB,SAR01         LOOP TILL ALL STORED
        !          8721:        BRN  EXSID            EXIT SETTING IDVAL
        !          8722:        EJC
        !          8723: *
        !          8724: *      ARRAY (CONTINUED)
        !          8725: *
        !          8726: *      HERE IF FIRST ARGUMENT IS NOT AN INTEGER
        !          8727: *
        !          8728: SAR02  MOV  XR,-(XS)         REPLACE ARGUMENT ON STACK
        !          8729:        JSR  XSCNI            INITIALIZE SCAN OF FIRST ARGUMENT
        !          8730:        ERR  071,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING
        !          8731:        PPM  EXNUL            DUMMY (UNUSED) NULL STRING EXIT
        !          8732:        MOV  R$XSC,-(XS)      SAVE PROTOTYPE POINTER
        !          8733:        MOV  XL,-(XS)         SAVE DEFAULT VALUE
        !          8734:        ZER  ARCDM            ZERO COUNT OF DIMENSIONS
        !          8735:        ZER  ARPTR            ZERO OFFSET TO INDICATE PASS ONE
        !          8736:        LDI  INTV1            LOAD INTEGER ONE
        !          8737:        STI  ARNEL            INITIALIZE ELEMENT COUNT
        !          8738: *
        !          8739: *      THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
        !          8740: *      (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
        !          8741: *      AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
        !          8742: *      USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
        !          8743: *
        !          8744: SAR03  LDI  INTV1            LOAD ONE AS DEFAULT LOW BOUND
        !          8745:        STI  ARSVL            SAVE AS LOW BOUND
        !          8746:        MOV  =CH$CL,WC        SET DELIMITER ONE = COLON
        !          8747:        MOV  =CH$CM,XL        SET DELIMITER TWO = COMMA
        !          8748:        JSR  XSCAN            SCAN NEXT BOUND
        !          8749:        BNE  WA,=NUM01,SAR04  JUMP IF NOT COLON
        !          8750: *
        !          8751: *      HERE WE HAVE A COLON ENDING A LOW BOUND
        !          8752: *
        !          8753:        JSR  GTINT            CONVERT LOW BOUND
        !          8754:        ERR  072,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
        !          8755:        LDI  ICVAL(XR)        LOAD VALUE OF LOW BOUND
        !          8756:        STI  ARSVL            STORE LOW BOUND VALUE
        !          8757:        MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
        !          8758:        MOV  WC,XL            AND DELIMITER TWO = COMMA
        !          8759:        JSR  XSCAN            SCAN HIGH BOUND
        !          8760:        EJC
        !          8761: *
        !          8762: *      ARRAY (CONTINUED)
        !          8763: *
        !          8764: *      MERGE HERE TO PROCESS UPPER BOUND
        !          8765: *
        !          8766: SAR04  BNZ  WA,SAR4A         SKIP IF DELIMITER 1 OR 2
        !          8767:        BNZ  XSCNB,SAR10      JUMP IF ILLEGALLY PLACED BLANK
        !          8768: *
        !          8769: *      CHECK FOR INTEGER BOUND
        !          8770: *
        !          8771: SAR4A  JSR  GTINT            CONVERT HIGH BOUND TO INTEGER
        !          8772:        ERR  073,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
        !          8773:        LDI  ICVAL(XR)        GET HIGH BOUND
        !          8774:        SBI  ARSVL            SUBTRACT LOWER BOUND
        !          8775:        IOV  SAR10            BAD DIMENSION IF OVERFLOW
        !          8776:        ILT  SAR10            BAD DIMENSION IF NEGATIVE
        !          8777:        ADI  INTV1            ADD 1 TO GET DIMENSION
        !          8778:        IOV  SAR10            BAD DIMENSION IF OVERFLOW
        !          8779:        MOV  ARPTR,XL         LOAD OFFSET (ALSO PASS INDICATOR)
        !          8780:        BZE  XL,SAR05         JUMP IF FIRST PASS
        !          8781: *
        !          8782: *      HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
        !          8783: *
        !          8784:        ADD  (XS),XL          POINT TO CURRENT LOCATION IN ARBLK
        !          8785:        STI  CFP$I(XL)        STORE DIMENSION
        !          8786:        LDI  ARSVL            LOAD LOW BOUND
        !          8787:        STI  (XL)             STORE LOW BOUND
        !          8788:        ADD  *ARDMS,ARPTR     BUMP OFFSET TO NEXT BOUNDS
        !          8789:        BRN  SAR06            JUMP TO CHECK FOR END OF BOUNDS
        !          8790: *
        !          8791: *      HERE IN PASS 1
        !          8792: *
        !          8793: SAR05  ICV  ARCDM            BUMP DIMENSION COUNT
        !          8794:        MLI  ARNEL            MULTIPLY DIMENSION BY COUNT SO FAR
        !          8795:        IOV  SAR11            TOO LARGE IF OVERFLOW
        !          8796:        STI  ARNEL            ELSE STORE UPDATED ELEMENT COUNT
        !          8797: *
        !          8798: *      MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
        !          8799: *
        !          8800: SAR06  BNZ  WA,SAR03         LOOP BACK UNLESS END OF BOUNDS
        !          8801:        BNZ  ARPTR,SAR09      JUMP IF END OF PASS 2
        !          8802:        EJC
        !          8803: *
        !          8804: *      ARRAY (CONTINUED)
        !          8805: *
        !          8806: *      HERE AT END OF PASS ONE, BUILD ARBLK
        !          8807: *
        !          8808:        LDI  ARNEL            GET NUMBER OF ELEMENTS
        !          8809:        MFI  WB,SAR11         GET AS ADDR INTEGER, TEST OVFLO
        !          8810:        WTB  WB               ELSE CONVERT TO LENGTH IN BAUS
        !          8811:        MOV  *ARSI$,WA        SET SIZE OF STANDARD FIELDS
        !          8812:        LCT  WC,ARCDM         SET DIMENSION COUNT TO CONTROL LOOP
        !          8813: *
        !          8814: *      LOOP TO ALLOW SPACE FOR DIMENSIONS
        !          8815: *
        !          8816: SAR07  ADD  *ARDMS,WA        ALLOW SPACE FOR ONE SET OF BOUNDS
        !          8817:        BCT  WC,SAR07         LOOP BACK TILL ALL ACCOUNTED FOR
        !          8818:        MOV  WA,XL            SAVE SIZE (=AROFS)
        !          8819: *
        !          8820: *      NOW ALLOCATE SPACE FOR ARBLK
        !          8821: *
        !          8822:        ADD  WB,WA            ADD SPACE FOR ELEMENTS
        !          8823:        ICA  WA               ALLOW FOR ARPRO PROTOTYPE FIELD
        !          8824:        BGE  WA,MXLEN,SAR11   FAIL IF TOO LARGE
        !          8825:        JSR  ALLOC            ELSE ALLOCATE ARBLK
        !          8826:        MOV  (XS),WB          LOAD DEFAULT VALUE
        !          8827:        MOV  XR,(XS)          SAVE ARBLK POINTER
        !          8828:        MOV  WA,WC            SAVE LENGTH IN BAUS
        !          8829:        BTW  WA               CONVERT LENGTH BACK TO WORDS
        !          8830:        LCT  WA,WA            SET COUNTER TO CONTROL LOOP
        !          8831: *
        !          8832: *      LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
        !          8833: *
        !          8834: SAR08  MOV  WB,(XR)+         SET ONE WORD
        !          8835:        BCT  WA,SAR08         LOOP TILL ALL SET
        !          8836:        EJC
        !          8837: *
        !          8838: *      ARRAY (CONTINUED)
        !          8839: *
        !          8840: *      NOW SET INITIAL FIELDS OF ARBLK
        !          8841: *
        !          8842:        MOV  (XS)+,XR         RELOAD ARBLK POINTER
        !          8843:        MOV  (XS),WB          LOAD PROTOTYPE
        !          8844:        MOV  =B$ART,(XR)      SET TYPE WORD
        !          8845:        MOV  WC,ARLEN(XR)     STORE LENGTH IN BAUS
        !          8846:        ZER  IDVAL(XR)        ZERO ID TILL WE GET IT BUILT
        !          8847:        MOV  XL,AROFS(XR)     SET PROTOTYPE FIELD PTR
        !          8848:        MOV  ARCDM,ARNDM(XR)  SET NUMBER OF DIMENSIONS
        !          8849:        MOV  XR,WC            SAVE ARBLK POINTER
        !          8850:        ADD  XL,XR            POINT TO PROTOTYPE FIELD
        !          8851:        MOV  WB,(XR)          STORE PROTOTYPE PTR IN ARBLK
        !          8852:        MOV  *ARLBD,ARPTR     SET OFFSET FOR PASS 2 BOUNDS SCAN
        !          8853:        MOV  WB,R$XSC         RESET STRING POINTER FOR XSCAN
        !          8854:        MOV  WC,(XS)          STORE ARBLK POINTER ON STACK
        !          8855:        ZER  XSOFS            RESET OFFSET PTR TO START OF STRING
        !          8856:        BRN  SAR03            JUMP BACK TO RESCAN BOUNDS
        !          8857: *
        !          8858: *      HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
        !          8859: *
        !          8860: SAR09  MOV  (XS)+,XR         RELOAD POINTER TO ARBLK
        !          8861:        BRN  EXSID            EXIT SETTING IDVAL
        !          8862: *
        !          8863: *      HERE FOR BAD DIMENSION
        !          8864: *
        !          8865: SAR10  ERB  074,BAD DIMENSION, ZERO, NEGATIVE OR OUT OF RANGE
        !          8866: *
        !          8867: *      HERE IF ARRAY IS TOO LARGE
        !          8868: *
        !          8869: SAR11  ERB  075,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED
        !          8870:        EJC
        !          8871: *
        !          8872: *      BREAK
        !          8873: *
        !          8874: S$BRK  ENT                   ENTRY POINT
        !          8875:        MOV  =P$BKS,WB        SET PCODE FOR SINGLE CHAR CASE
        !          8876:        MOV  =P$BRK,XL        PCODE FOR MULTI-CHAR CASE
        !          8877:        MOV  =P$BKD,WC        PCODE FOR EXPRESSION CASE
        !          8878:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
        !          8879:        ERR  076,BREAK ARGUMENT IS NOT STRING OR EXPRESSION
        !          8880:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          8881:        EJC
        !          8882: *
        !          8883: *      BREAKX
        !          8884: *
        !          8885: *      BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
        !          8886: *      OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
        !          8887: *
        !          8888: S$BKX  ENT                   ENTRY POINT
        !          8889:        MOV  =P$BKS,WB        PCODE FOR SINGLE CHAR ARGUMENT
        !          8890:        MOV  =P$BRK,XL        PCODE FOR MULTI-CHAR ARGUMENT
        !          8891:        MOV  =P$BXD,WC        PCODE FOR EXPRESSION CASE
        !          8892:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
        !          8893:        ERR  077,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION
        !          8894: *
        !          8895: *      NOW HOOK BREAKX NODE ON AT FRONT END
        !          8896: *
        !          8897:        MOV  XR,-(XS)         SAVE PTR TO BREAK NODE
        !          8898:        MOV  =P$BKX,WB        SET PCODE FOR BREAKX NODE
        !          8899:        JSR  PBILD            BUILD IT
        !          8900:        MOV  (XS),PTHEN(XR)   SET BREAK NODE AS SUCCESSOR
        !          8901:        MOV  =P$ALT,WB        SET PCODE FOR ALTERNATION NODE
        !          8902:        JSR  PBILD            BUILD (PARM1=ALT=BREAKX NODE)
        !          8903:        MOV  XR,WA            SAVE PTR TO ALTERNATION NODE
        !          8904:        MOV  (XS),XR          POINT TO BREAK NODE
        !          8905:        MOV  WA,PTHEN(XR)     SET ALTERNATE NODE AS SUCCESSOR
        !          8906:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          8907: .IF    .CNBF
        !          8908: .ELSE
        !          8909:        EJC
        !          8910: *
        !          8911: *      BUFFER
        !          8912: *
        !          8913: S$BUF  ENT                   ENTRY POINT
        !          8914:        MOV  (XS)+,XL         GET INITIAL STRING
        !          8915:        JSR  GTSMI            CONVERT MEMORY REQUEST TO INTEGER
        !          8916:        ERR  078,BUFFER FIRST ARGUMENT IS NOT INTEGER
        !          8917:        PPM  SBF01            FAIL IF OUT OF RANGE
        !          8918:        MOV  WC,WA            MOVE LENGTH TO CORRECT REGISTER
        !          8919:        JSR  ALOBF            ALLOCATE THE BUFFER
        !          8920:        JSR  INSBF            COPY INITIAL ARG IN
        !          8921:        ERR  079,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER
        !          8922:        ERR  080,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION
        !          8923:        BRN  EXSID            EXIT SETTING IDVAL
        !          8924: *
        !          8925: *      HERE FOR INVALID ALLOCATION SIZE
        !          8926: *
        !          8927: SBF01  ERB  081,BUFFER FIRST ARGUMENT IS OUT OF RANGE
        !          8928: .FI
        !          8929:        EJC
        !          8930: *
        !          8931: *      CLEAR
        !          8932: *
        !          8933: S$CLR  ENT                   ENTRY POINT
        !          8934:        JSR  XSCNI            INITIALIZE TO SCAN ARGUMENT
        !          8935:        ERR  082,CLEAR ARGUMENT IS NOT STRING
        !          8936:        PPM  SCLR2            JUMP IF NULL
        !          8937: *
        !          8938: *      LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
        !          8939: *      THE LIST ARE FLAGGED BY SETTING VRGET OF VRBLK TO ZERO.
        !          8940: *
        !          8941: SCLR1  MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
        !          8942:        MOV  WC,XL            DELIMITER TWO = COMMA
        !          8943:        JSR  XSCAN            SCAN NEXT VARIABLE NAME
        !          8944:        JSR  GTNVR            LOCATE VRBLK
        !          8945:        PPM  SCLR7            ERRONEOUS NAME
        !          8946:        ZER  VRGET(XR)        ELSE FLAG BY ZEROING VRGET FIELD
        !          8947:        BNZ  WA,SCLR1         LOOP BACK IF STOPPED BY COMMA
        !          8948:        BNZ  XSCNB,SCLR7      BADLY PLACED BLANK
        !          8949: *
        !          8950: *      HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
        !          8951: *
        !          8952: SCLR2  MOV  HSHTB,WB         POINT TO START OF HASH TABLE
        !          8953: *
        !          8954: *      LOOP THROUGH SLOTS IN HASH TABLE
        !          8955: *
        !          8956: SCLR3  BEQ  WB,HSHTE,EXNUL   EXIT RETURNING NULL IF NONE LEFT
        !          8957:        MOV  WB,XR            ELSE COPY SLOT POINTER
        !          8958:        ICA  WB               BUMP SLOT POINTER
        !          8959:        SUB  *VRNXT,XR        SET OFFSET TO MERGE INTO LOOP
        !          8960: *
        !          8961: *      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
        !          8962: *
        !          8963: SCLR4  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON CHAIN
        !          8964:        BZE  XR,SCLR3         JUMP FOR NEXT BUCKET IF CHAIN END
        !          8965:        BNZ  VRGET(XR),SCLR5  JUMP IF NOT FLAGGED
        !          8966:        EJC
        !          8967: *
        !          8968: *      CLEAR (CONTINUED)
        !          8969: *
        !          8970: *      HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
        !          8971: *
        !          8972:        JSR  SETVR            FOR FLAGGED VAR, RESTORE VRGET
        !          8973:        BRN  SCLR4            AND LOOP BACK FOR NEXT VRBLK
        !          8974: *
        !          8975: *      HERE TO SET VALUE OF A VARIABLE TO NULL
        !          8976: *      PROTECTED VARIABLES (ARB ETC) ARE EXEMPT
        !          8977: *
        !          8978: SCLR5  BEQ  VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE
        !          8979:        MOV  XR,XL            COPY VRBLK POINTER
        !          8980: *
        !          8981: *      LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
        !          8982: *
        !          8983: SCLR6  MOV  XL,WA            SAVE BLOCK POINTER
        !          8984:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE FIELD
        !          8985:        BEQ  (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED
        !          8986: *
        !          8987: *      NOW STORE THE NULL VALUE
        !          8988: *
        !          8989:        MOV  WA,XL            RESTORE BLOCK POINTER
        !          8990:        MOV  =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE
        !          8991:        BRN  SCLR4            LOOP BACK FOR NEXT VRBLK
        !          8992: *
        !          8993: *      ERROR POINT
        !          8994: *
        !          8995: SCLR7  ERB  083,NULL VARIABLE NAME OR ILLEGAL BLANK IN CLEAR ARG
        !          8996:        EJC
        !          8997: *
        !          8998: *      CODE
        !          8999: *
        !          9000: S$COD  ENT                   ENTRY POINT
        !          9001:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          9002:        JSR  GTCOD            CONVERT TO CODE
        !          9003:        PPM  EXFAL            FAIL IF CONVERSION IS IMPOSSIBLE
        !          9004:        BRN  EXIXR            ELSE RETURN CODE AS RESULT
        !          9005:        EJC
        !          9006: *
        !          9007: *      COLLECT
        !          9008: *
        !          9009: S$COL  ENT                   ENTRY POINT
        !          9010:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          9011:        JSR  GTINT            CONVERT TO INTEGER
        !          9012:        ERR  084,COLLECT ARGUMENT IS NOT INTEGER
        !          9013:        LDI  ICVAL(XR)        LOAD COLLECT ARGUMENT
        !          9014:        STI  CLSVI            SAVE COLLECT ARGUMENT
        !          9015:        ZER  WB               SET NO MOVE UP
        !          9016:        JSR  GBCOL            PERFORM GARBAGE COLLECTION
        !          9017:        MOV  DNAME,WA         POINT TO END OF MEMORY
        !          9018:        SUB  DNAMP,WA         SUBTRACT NEXT LOCATION
        !          9019:        BTW  WA               CONVERT BAUS TO WORDS
        !          9020:        MTI  WA               CONVERT WORDS AVAILABLE AS INTEGER
        !          9021:        SBI  CLSVI            SUBTRACT ARGUMENT
        !          9022:        IOV  EXFAL            FAIL IF OVERFLOW
        !          9023:        ILT  EXFAL            FAIL IF NOT ENOUGH
        !          9024:        ADI  CLSVI            ELSE RECOMPUTE AVAILABLE
        !          9025:        BRN  EXINT            AND EXIT WITH INTEGER RESULT
        !          9026:        EJC
        !          9027: *
        !          9028: *      CONVERT
        !          9029: *
        !          9030: S$CVT  ENT                   ENTRY POINT
        !          9031:        JSR  GTSTG            CONVERT SECOND ARGUMENT TO STRING
        !          9032:        ERR  085,CONVERT SECOND ARGUMENT IS NOT STRING
        !          9033: .IF    .CASL
        !          9034:        MOV  XR,XL            COPY STRING PTR TO XL
        !          9035:        ZER  WB               ZERO OFFSET
        !          9036:        JSR  SBSTG            CONVERT CASE OF ARG IF NECESSARY
        !          9037: .FI
        !          9038:        MOV  (XS),XL          LOAD FIRST ARGUMENT
        !          9039:        BNE  (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED
        !          9040: *
        !          9041: *      HERE FOR PROGRAM DEFINED DATATYPE
        !          9042: *
        !          9043:        MOV  PDDFP(XL),XL     POINT TO DFBLK
        !          9044:        MOV  DFNAM(XL),XL     LOAD DATATYPE NAME
        !          9045:        JSR  IDENT            COMPARE WITH SECOND ARG
        !          9046:        PPM  EXITS            EXIT IF IDENT WITH ARG AS RESULT
        !          9047:        BRN  EXFAL            ELSE FAIL
        !          9048: *
        !          9049: *      HERE IF NOT PROGRAM DEFINED DATATYPE
        !          9050: *
        !          9051: SCV01  MOV  XR,-(XS)         SAVE STRING ARGUMENT
        !          9052:        MOV  =SVCTB,XL        POINT TO TABLE OF NAMES TO COMPARE
        !          9053:        ZER  WB               INITIALIZE COUNTER
        !          9054:        MOV  SCLEN(XR),WC     SAVE LENGTH OF ARGUMENT STRING
        !          9055: *
        !          9056: *      LOOP THROUGH TABLE ENTRIES
        !          9057: *
        !          9058: SCV02  MOV  (XL)+,XR         LOAD NEXT TABLE ENTRY, BUMP POINTER
        !          9059:        BZE  XR,EXFAL         FAIL IF ZERO MARKING END OF LIST
        !          9060:        BNE  WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH
        !          9061:        MOV  XL,CNVTP         ELSE STORE TABLE POINTER
        !          9062:        PLC  XR               POINT TO CHARS OF TABLE ENTRY
        !          9063:        MOV  (XS),XL          LOAD POINTER TO STRING ARGUMENT
        !          9064:        PLC  XL               POINT TO CHARS OF STRING ARG
        !          9065:        MOV  WC,WA            SET NUMBER OF CHARS TO COMPARE
        !          9066:        CMC  SCV04,SCV04      COMPARE, JUMP IF NO MATCH
        !          9067:        EJC
        !          9068: *
        !          9069: *      CONVERT (CONTINUED)
        !          9070: *
        !          9071: *      HERE WE HAVE A MATCH
        !          9072: *
        !          9073: SCV03  MOV  WB,XL            COPY ENTRY NUMBER
        !          9074:        ICA  XS               POP STRING ARG OFF STACK
        !          9075:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
        !          9076:        BSW  XL,CNVTT         JUMP TO APPROPRIATE ROUTINE
        !          9077:        IFF  0,SCV06          STRING
        !          9078:        IFF  1,SCV07          INTEGER
        !          9079:        IFF  2,SCV09          NAME
        !          9080:        IFF  3,SCV10          PATTERN
        !          9081:        IFF  4,SCV11          ARRAY
        !          9082:        IFF  5,SCV19          TABLE
        !          9083:        IFF  6,SCV25          EXPRESSION
        !          9084:        IFF  7,SCV26          CODE
        !          9085:        IFF  8,SCV27          NUMERIC
        !          9086: .IF    .CNRA
        !          9087: .ELSE
        !          9088:        IFF  9,SCV08          REAL
        !          9089: .FI
        !          9090: .IF    .CNBF
        !          9091: .ELSE
        !          9092:        IFF  CNVBT,SCV28      BUFFER
        !          9093: .FI
        !          9094:        ESW                   END OF SWITCH TABLE
        !          9095: *
        !          9096: *      HERE IF NO MATCH WITH TABLE ENTRY
        !          9097: *
        !          9098: SCV04  MOV  CNVTP,XL         RESTORE TABLE POINTER, MERGE
        !          9099: *
        !          9100: *      MERGE HERE IF LENGTHS DID NOT MATCH
        !          9101: *
        !          9102: SCV05  ICV  WB               BUMP ENTRY NUMBER
        !          9103:        BRN  SCV02            LOOP BACK TO CHECK NEXT ENTRY
        !          9104: *
        !          9105: *      HERE TO CONVERT TO STRING
        !          9106: *
        !          9107: SCV06  MOV  XR,-(XS)         REPLACE STRING ARGUMENT ON STACK
        !          9108:        JSR  GTSTG            CONVERT TO STRING
        !          9109:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9110:        BRN  EXIXR            ELSE RETURN STRING
        !          9111:        EJC
        !          9112: *
        !          9113: *      CONVERT (CONTINUED)
        !          9114: *
        !          9115: *      HERE TO CONVERT TO INTEGER
        !          9116: *
        !          9117: SCV07  JSR  GTINT            CONVERT TO INTEGER
        !          9118:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9119:        BRN  EXIXR            ELSE RETURN INTEGER
        !          9120: .IF    .CNRA
        !          9121: .ELSE
        !          9122: *
        !          9123: *      HERE TO CONVERT TO REAL
        !          9124: *
        !          9125: SCV08  JSR  GTREA            CONVERT TO REAL
        !          9126:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9127:        BRN  EXIXR            ELSE RETURN REAL
        !          9128: .FI
        !          9129: *
        !          9130: *      HERE TO CONVERT TO NAME
        !          9131: *
        !          9132: SCV09  BEQ  (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME
        !          9133:        JSR  GTNVR            ELSE TRY STRING TO NAME CONVERT
        !          9134:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9135:        BRN  EXVNM            ELSE EXIT BUILDING NMBLK FOR VRBLK
        !          9136: *
        !          9137: *      HERE TO CONVERT TO PATTERN
        !          9138: *
        !          9139: SCV10  JSR  GTPAT            CONVERT TO PATTERN
        !          9140:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9141:        BRN  EXIXR            ELSE RETURN PATTERN
        !          9142: *
        !          9143: *      CONVERT TO ARRAY
        !          9144: *
        !          9145: SCV11  JSR  GTARR            GET AN ARRAY
        !          9146:        PPM  EXFAL            FAIL IF NOT CONVERTIBLE
        !          9147:        BRN  EXSID            EXIT SETTING ID FIELD
        !          9148: *
        !          9149: *      CONVERT TO TABLE
        !          9150: *
        !          9151: SCV19  MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
        !          9152:        MOV  XR,-(XS)         REPLACE ARBLK POINTER ON STACK
        !          9153:        BEQ  WA,=B$TBT,EXITS  RETURN ARG IF ALREADY A TABLE
        !          9154:        BNE  WA,=B$ART,EXFAL  ELSE FAIL IF NOT AN ARRAY
        !          9155:        EJC
        !          9156: *
        !          9157: *      CONVERT (CONTINUED)
        !          9158: *
        !          9159: *      HERE TO CONVERT AN ARRAY TO TABLE
        !          9160: *
        !          9161:        BNE  ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY
        !          9162:        LDI  ARDM2(XR)        LOAD DIM 2
        !          9163:        SBI  INTV2            SUBTRACT 2 TO COMPARE
        !          9164:        INE  EXFAL            FAIL IF DIM2 NOT 2
        !          9165: *
        !          9166: *      HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
        !          9167: *
        !          9168:        LDI  ARDIM(XR)        LOAD DIM 1 (NUMBER OF ELEMENTS)
        !          9169:        MFI  WA               GET AS ONE WORD INTEGER
        !          9170:        LCT  WB,WA            COPY TO CONTROL LOOP
        !          9171:        ADD  =TBSI$,WA        ADD SPACE FOR STANDARD FIELDS
        !          9172:        WTB  WA               CONVERT LENGTH TO BAUS
        !          9173:        JSR  ALLOC            ALLOCATE SPACE FOR TBBLK
        !          9174:        MOV  XR,WC            COPY TBBLK POINTER
        !          9175:        MOV  XR,-(XS)         SAVE TBBLK POINTER
        !          9176:        MOV  =B$TBT,(XR)+     STORE TYPE WORD
        !          9177:        ZER  (XR)+            STORE ZERO FOR IDVAL FOR NOW
        !          9178:        MOV  WA,(XR)+         STORE LENGTH
        !          9179:        MOV  =NULLS,(XR)+     NULL INITIAL LOOKUP VALUE
        !          9180: *
        !          9181: *      LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
        !          9182: *
        !          9183: SCV20  MOV  WC,(XR)+         SET BUCKET PTR TO POINT TO TBBLK
        !          9184:        BCT  WB,SCV20         LOOP TILL ALL INITIALIZED
        !          9185:        MOV  *ARVL2,WB        SET OFFSET TO FIRST ARBLK ELEMENT
        !          9186: *
        !          9187: *      LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
        !          9188: *
        !          9189: SCV21  MOV  1(XS),XL         POINT TO ARBLK
        !          9190:        BEQ  WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED
        !          9191:        ADD  WB,XL            ELSE POINT TO CURRENT LOCATION
        !          9192:        ADD  *NUM02,WB        BUMP OFFSET
        !          9193:        MOV  (XL),XR          LOAD SUBSCRIPT NAME
        !          9194:        DCA  XL               ADJUST PTR TO MERGE (TRVAL=1+1)
        !          9195:        EJC
        !          9196: *
        !          9197: *      CONVERT (CONTINUED)
        !          9198: *
        !          9199: *      LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
        !          9200: *
        !          9201: SCV22  MOV  TRVAL(XL),XL     POINT TO NEXT VALUE
        !          9202:        BEQ  (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED
        !          9203: *
        !          9204: *      HERE WITH NAME IN XR, VALUE IN XL
        !          9205: *
        !          9206: SCV23  MOV  XL,-(XS)         STACK VALUE
        !          9207:        MOV  1(XS),XL         LOAD TBBLK POINTER
        !          9208:        JSR  TFIND            BUILD TEBLK (NOTE WB GT 0 BY NAME)
        !          9209:        PPM  EXFAL            FAIL IF ACESS FAILS
        !          9210:        MOV  (XS)+,TEVAL(XL)  STORE VALUE IN TEBLK
        !          9211:        BRN  SCV21            LOOP BACK FOR NEXT ELEMENT
        !          9212: *
        !          9213: *      HERE AFTER MOVING ALL ELEMENTS TO TBBLK
        !          9214: *
        !          9215: SCV24  MOV  (XS)+,XR         LOAD TBBLK POINTER
        !          9216:        ICA  XS               POP ARBLK POINTER
        !          9217:        BRN  EXSID            EXIT SETTING IDVAL
        !          9218: *
        !          9219: *      CONVERT TO EXPRESSION
        !          9220: *
        !          9221: SCV25  JSR  GTEXP            CONVERT TO EXPRESSION
        !          9222:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9223:        BRN  EXIXR            ELSE RETURN EXPRESSION
        !          9224: *
        !          9225: *      CONVERT TO CODE
        !          9226: *
        !          9227: SCV26  JSR  GTCOD            CONVERT TO CODE
        !          9228:        PPM  EXFAL            FAIL IF CONVERSION IS NOT POSSIBLE
        !          9229:        BRN  EXIXR            ELSE RETURN CODE
        !          9230: *
        !          9231: *      CONVERT TO NUMERIC
        !          9232: *
        !          9233: SCV27  JSR  GTNUM            CONVERT TO NUMERIC
        !          9234:        PPM  EXFAL            FAIL IF UNCONVERTIBLE
        !          9235:        BRN  EXIXR            RETURN NUMBER
        !          9236:        EJC
        !          9237: .IF    .CNBF
        !          9238: .ELSE
        !          9239: *
        !          9240: *      CONVERT TO BUFFER
        !          9241: *
        !          9242: SCV28  JSR  GTBUF            CONVERT TO BUFFER
        !          9243:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
        !          9244:        BRN  EXSID            EXIT SETTING IDVAL FIELD
        !          9245: .FI
        !          9246:        EJC
        !          9247: *
        !          9248: *      COPY
        !          9249: *
        !          9250: S$COP  ENT                   ENTRY POINT
        !          9251:        JSR  CBLCK            COPY THE BLOCK
        !          9252:        PPM  EXITS            RETURN IF NO IDVAL FIELD
        !          9253:        BRN  EXSID            EXIT SETTING ID VALUE
        !          9254: *
        !          9255: *      CTI
        !          9256: *
        !          9257: S$CTI  ENT
        !          9258:        LDI  INTV0            ZERO IN CASE NULL STRING
        !          9259:        JSR  GTSTG            GET ARG AS A STRING
        !          9260:        ERR  086,CTI ARGUMENT IS NOT A STRING
        !          9261:        BZE  WA,SCT01         SKIP IF NULL
        !          9262:        PLC  XR               PREPARE TO READ THE CHARACTER
        !          9263:        LCH  WB,(XR)          GET THE CHARACTER
        !          9264:        MTI  WB               CONVERT TO INTEGER
        !          9265:        ZER  XR               CLEAR GARBAGE
        !          9266: *
        !          9267: *      MAKE ICBLK AND RETURN
        !          9268: *
        !          9269: SCT01  JSR  ICBLD            BUILD ICBLK
        !          9270:        BRN  EXIXR            RETURN INTEGER RESULT
        !          9271:        EJC
        !          9272: *
        !          9273: *      DATA
        !          9274: *
        !          9275: S$DAT  ENT                   ENTRY POINT
        !          9276:        JSR  XSCNI            PREPARE TO SCAN ARGUMENT
        !          9277:        ERR  087,DATA ARGUMENT IS NOT STRING
        !          9278:        ERR  088,DATA ARGUMENT IS NULL
        !          9279: *
        !          9280: *      SCAN OUT DATATYPE NAME
        !          9281: *
        !          9282:        MOV  =CH$PP,WC        DELIMITER ONE = LEFT PAREN
        !          9283:        MOV  WC,XL            DELIMITER TWO = LEFT PAREN
        !          9284:        JSR  XSCAN            SCAN DATATYPE NAME
        !          9285:        BNZ  WA,SDAT1         SKIP IF LEFT PAREN FOUND
        !          9286:        ERB  089,DATA ARGUMENT IS MISSING A LEFT PAREN
        !          9287: *
        !          9288: *      HERE AFTER SCANNING DATATYPE NAME
        !          9289: *
        !          9290: SDAT1  MOV  XR,XL            SAVE NAME PTR
        !          9291:        MOV  SCLEN(XR),WA     GET LENGTH
        !          9292:        CTB  WA,SCSI$         COMPUTE SPACE NEEDED
        !          9293:        JSR  ALOST            REQUEST STATIC STORE FOR NAME
        !          9294:        MOV  XR,-(XS)         SAVE DATATYPE NAME
        !          9295:        MVW                   COPY NAME TO STATIC
        !          9296:        MOV  (XS),XR          GET NAME PTR
        !          9297:        ZER  XL               SCRUB DUD REGISTER
        !          9298:        JSR  GTNVR            LOCATE VRBLK FOR DATATYPE NAME
        !          9299:        ERR  090,DATA ARGUMENT HAS NULL DATATYPE NAME
        !          9300:        MOV  XR,DATDV         SAVE VRBLK POINTER FOR DATATYPE
        !          9301:        MOV  XS,DATXS         STORE STARTING STACK VALUE
        !          9302:        ZER  WB               ZERO COUNT OF FIELD NAMES
        !          9303: *
        !          9304: *      LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
        !          9305: *
        !          9306: SDAT2  MOV  =CH$RP,WC        DELIMITER ONE = RIGHT PAREN
        !          9307:        MOV  =CH$CM,XL        DELIMITER TWO = COMMA
        !          9308:        JSR  XSCAN            SCAN NEXT FIELD NAME
        !          9309:        BNZ  WA,SDAT3         JUMP IF DELIMITER FOUND
        !          9310:        ERB  091,BAD BLANK OR MISSING RIGHT PAREN IN DATA ARG
        !          9311: *
        !          9312: *      HERE AFTER SCANNING OUT ONE FIELD NAME
        !          9313: *
        !          9314: SDAT3  JSR  GTNVR            LOCATE VRBLK FOR FIELD NAME
        !          9315:        ERR  092,DATA ARGUMENT HAS NULL FIELD NAME
        !          9316:        MOV  XR,-(XS)         STACK VRBLK POINTER
        !          9317:        ICV  WB               INCREMENT COUNTER
        !          9318:        BEQ  WA,=NUM02,SDAT2  LOOP BACK IF STOPPED BY COMMA
        !          9319:        EJC
        !          9320: *
        !          9321: *      DATA (CONTINUED)
        !          9322: *
        !          9323: *      NOW BUILD THE DFBLK
        !          9324: *
        !          9325:        MOV  =DFSI$,WA        SET SIZE OF DFBLK STANDARD FIELDS
        !          9326:        ADD  WB,WA            ADD NUMBER OF FIELDS
        !          9327:        WTB  WA               CONVERT LENGTH TO BAUS
        !          9328:        MOV  WB,WC            PRESERVE NO. OF FIELDS
        !          9329:        JSR  ALOST            ALLOCATE SPACE FOR DFBLK
        !          9330:        MOV  WC,WB            GET NO OF FIELDS
        !          9331:        MOV  DATXS,XT         POINT TO START OF STACK
        !          9332:        MOV  (XT),WC          LOAD DATATYPE NAME
        !          9333:        MOV  XR,(XT)          SAVE DFBLK POINTER ON STACK
        !          9334:        MOV  =B$DFC,(XR)+     STORE TYPE WORD
        !          9335:        MOV  WB,(XR)+         STORE NUMBER OF FIELDS (FARGS)
        !          9336:        MOV  WA,(XR)+         STORE LENGTH (DFLEN)
        !          9337:        SUB  *PDDFS,WA        COMPUTE PDBLK LENGTH (FOR DFPDL)
        !          9338:        MOV  WA,(XR)+         STORE PDBLK LENGTH (DFPDL)
        !          9339:        MOV  WC,(XR)+         STORE DATATYPE NAME (DFNAM)
        !          9340:        LCT  WC,WB            COPY NUMBER OF FIELDS
        !          9341: *
        !          9342: *      LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
        !          9343: *
        !          9344: SDAT4  MOV  -(XT),(XR)+      MOVE ONE FIELD NAME VRBLK POINTER
        !          9345:        BCT  WC,SDAT4         LOOP TILL ALL MOVED
        !          9346: *
        !          9347: *      NOW DEFINE THE DATATYPE FUNCTION
        !          9348: *
        !          9349:        MOV  WA,WC            COPY LENGTH OF PDBLK FOR LATER LOOP
        !          9350:        MOV  DATDV,XR         POINT TO VRBLK
        !          9351:        MOV  DATXS,XT         POINT BACK ON STACK
        !          9352:        MOV  (XT),XL          LOAD DFBLK POINTER
        !          9353:        JSR  DFFNC            DEFINE FUNCTION
        !          9354:        EJC
        !          9355: *
        !          9356: *      DATA (CONTINUED)
        !          9357: *
        !          9358: *      LOOP TO BUILD FFBLKS
        !          9359: *
        !          9360: *
        !          9361: *      NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
        !          9362: *      SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
        !          9363: *      SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
        !          9364: *
        !          9365: SDAT5  MOV  *FFSI$,WA        SET LENGTH OF FFBLK
        !          9366:        JSR  ALLOC            ALLOCATE SPACE FOR FFBLK
        !          9367:        MOV  =B$FFC,(XR)      SET TYPE WORD
        !          9368:        MOV  =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE)
        !          9369:        MOV  DATXS,XT         POINT BACK ON STACK
        !          9370:        MOV  (XT),FFDFP(XR)   COPY DFBLK PTR TO FFBLK
        !          9371:        DCA  WC               DECREMENT OLD DFPDL TO GET NEXT OFS
        !          9372:        MOV  WC,FFOFS(XR)     SET OFFSET TO THIS FIELD
        !          9373:        ZER  FFNXT(XR)        TENTATIVELY SET ZERO FORWARD PTR
        !          9374:        MOV  XR,XL            COPY FFBLK POINTER FOR DFFNC
        !          9375:        MOV  (XS),XR          LOAD VRBLK POINTER FOR FIELD
        !          9376:        MOV  VRFNC(XR),XR     LOAD CURRENT FUNCTION POINTER
        !          9377:        BNE  (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC
        !          9378: *
        !          9379: *      HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
        !          9380: *      CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
        !          9381: *
        !          9382:        MOV  XR,FFNXT(XL)     LINK NEW FFBLK TO PREVIOUS CHAIN
        !          9383: *
        !          9384: *      MERGE HERE TO DEFINE FIELD FUNCTION
        !          9385: *
        !          9386: SDAT6  MOV  (XS)+,XR         LOAD VRBLK POINTER
        !          9387:        JSR  DFFNC            DEFINE FIELD FUNCTION
        !          9388:        BNE  XS,DATXS,SDAT5   LOOP BACK TILL ALL DONE
        !          9389:        ICA  XS               POP DFBLK POINTER
        !          9390:        BRN  EXNUL            RETURN WITH NULL RESULT
        !          9391:        EJC
        !          9392: *
        !          9393: *      DATATYPE
        !          9394: *
        !          9395: S$DTP  ENT                   ENTRY POINT
        !          9396:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          9397:        JSR  DTYPE            GET DATATYPE
        !          9398:        BRN  EXIXR            AND RETURN IT AS RESULT
        !          9399:        EJC
        !          9400: *
        !          9401: *      DATE
        !          9402: *
        !          9403: S$DTE  ENT                   ENTRY POINT
        !          9404:        JSR  SYSDT            CALL SYSTEM DATE ROUTINE
        !          9405:        MOV  1(XL),WA         LOAD LENGTH FOR SBSTR
        !          9406:        BZE  WA,EXNUL         RETURN NULL IF LENGTH IS ZERO
        !          9407:        ZER  WB               SET ZERO OFFSET
        !          9408:        JSR  SBSTR            USE SBSTR TO BUILD SCBLK
        !          9409:        BRN  EXIXR            RETURN DATE STRING
        !          9410:        EJC
        !          9411: *
        !          9412: *      DEFINE
        !          9413: *
        !          9414: S$DFN  ENT                   ENTRY POINT
        !          9415:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
        !          9416:        ZER  DEFLB            ZERO LABEL POINTER IN CASE NULL
        !          9417:        BEQ  XR,=NULLS,SDF01  JUMP IF NULL SECOND ARGUMENT
        !          9418:        JSR  GTNVR            ELSE FIND VRBLK FOR LABEL
        !          9419:        PPM  SDF13            JUMP IF NOT A VARIABLE NAME
        !          9420:        MOV  XR,DEFLB         ELSE SET SPECIFIED ENTRY
        !          9421: *
        !          9422: *      SCAN FUNCTION NAME
        !          9423: *
        !          9424: SDF01  JSR  XSCNI            PREPARE TO SCAN FIRST ARGUMENT
        !          9425:        ERR  093,DEFINE FIRST ARGUMENT IS NOT STRING
        !          9426:        ERR  094,DEFINE FIRST ARGUMENT IS NULL
        !          9427:        MOV  =CH$PP,WC        DELIMITER ONE = LEFT PAREN
        !          9428:        MOV  WC,XL            DELIMITER TWO = LEFT PAREN
        !          9429:        JSR  XSCAN            SCAN OUT FUNCTION NAME
        !          9430:        BNZ  WA,SDF02         JUMP IF LEFT PAREN FOUND
        !          9431:        ERB  095,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN
        !          9432: *
        !          9433: *      HERE AFTER SCANNING OUT FUNCTION NAME
        !          9434: *
        !          9435: SDF02  JSR  GTNVR            GET VARIABLE NAME
        !          9436:        ERR  096,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME
        !          9437:        MOV  XR,DEFVR         SAVE VRBLK POINTER FOR FUNCTION NAM
        !          9438:        ZER  WB               ZERO COUNT OF ARGUMENTS
        !          9439:        MOV  XS,DEFXS         SAVE INITIAL STACK POINTER
        !          9440:        BNZ  DEFLB,SDF03      JUMP IF SECOND ARGUMENT GIVEN
        !          9441:        MOV  XR,DEFLB         ELSE DEFAULT IS FUNCTION NAME
        !          9442: *
        !          9443: *      LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
        !          9444: *
        !          9445: SDF03  MOV  =CH$RP,WC        DELIMITER ONE = RIGHT PAREN
        !          9446:        MOV  =CH$CM,XL        DELIMITER TWO = COMMA
        !          9447:        JSR  XSCAN            SCAN OUT NEXT ARGUMENT NAME
        !          9448:        BZE  WA,SDF14         FAIL IF RUNOUT
        !          9449:        JSR  GTNVR            GET VRBLK POINTER
        !          9450:        PPM  SDF04            IGNORE NULL NAME
        !          9451:        MOV  XR,-(XS)         STACK ARGUMENT VRBLK POINTER
        !          9452:        ICV  WB               INCREMENT COUNTER
        !          9453:        BEQ  WA,=NUM02,SDF03  LOOP BACK IF STOPPED BY A COMMA
        !          9454:        BRN  SDF05            JUMP FOR RIGHT PAREN
        !          9455:        EJC
        !          9456: *
        !          9457: *      DEFINE (CONTINUED)
        !          9458: *
        !          9459: *      NULL ARG FOUND. CONTINUE IF STOPPED BY COMMA
        !          9460: *
        !          9461: SDF04  BEQ  WA,=NUM02,SDF03  LOOP IF COMMA
        !          9462: *
        !          9463: *      HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
        !          9464: *
        !          9465: SDF05  MOV  WB,DEFNA         SAVE NUMBER OF ARGUMENTS
        !          9466:        ZER  WB               ZERO COUNT OF LOCALS
        !          9467: *
        !          9468: *      LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
        !          9469: *
        !          9470: SDF06  MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
        !          9471:        MOV  WC,XL            SET DELIMITER TWO = COMMA
        !          9472:        JSR  XSCAN            SCAN OUT NEXT LOCAL NAME
        !          9473:        BNZ  WA,SDF07         SKIP IF COMMA FOUND
        !          9474:        BNZ  XSCNB,SDF14      FAIL IF BAD BLANK, OK IF LAST LOC
        !          9475: *
        !          9476: *      HERE AFTER SCANNING OUT A LOCAL NAME
        !          9477: *
        !          9478: SDF07  JSR  GTNVR            GET VRBLK POINTER
        !          9479:        PPM  SDF08            IGNORE NULL NAME
        !          9480:        ICV  WB               IF OK, INCREMENT COUNT
        !          9481:        MOV  XR,-(XS)         STACK VRBLK POINTER
        !          9482:        BNZ  WA,SDF06         LOOP BACK IF STOPPED BY A COMMA
        !          9483:        BRN  SDF09            JUMP FOR END OF STRING
        !          9484: *
        !          9485: *      NULL LOCAL
        !          9486: *
        !          9487: SDF08  BNZ  WA,SDF06         LOOP IF COMMA AFTER NULL LOCAL
        !          9488:        EJC
        !          9489: *
        !          9490: *      DEFINE (CONTINUED)
        !          9491: *
        !          9492: *      HERE AFTER SCANNING LOCALS, BUILD PFBLK
        !          9493: *
        !          9494: SDF09  MOV  WB,WA            COPY COUNT OF LOCALS
        !          9495:        ADD  DEFNA,WA         ADD NUMBER OF ARGUMENTS
        !          9496:        MOV  WA,WC            SET SUM ARGS+LOCALS AS LOOP COUNT
        !          9497:        ADD  =PFSI$,WA        ADD SPACE FOR STANDARD FIELDS
        !          9498:        WTB  WA               CONVERT LENGTH TO BAUS
        !          9499:        JSR  ALLOC            ALLOCATE SPACE FOR PFBLK
        !          9500:        MOV  XR,XL            SAVE POINTER TO PFBLK
        !          9501:        MOV  =B$PFC,(XR)+     STORE FIRST WORD
        !          9502:        MOV  DEFNA,(XR)+      STORE NUMBER OF ARGUMENTS
        !          9503:        MOV  WA,(XR)+         STORE LENGTH (PFLEN)
        !          9504:        MOV  DEFVR,(XR)+      STORE VRBLK PTR FOR FUNCTION NAME
        !          9505:        MOV  WB,(XR)+         STORE NUMBER OF LOCALS
        !          9506:        ZER  (XR)+            DEAL WITH LABEL LATER
        !          9507:        ZER  (XR)+            ZERO PFCTR
        !          9508:        ZER  (XR)+            ZERO PFRTR
        !          9509:        BZE  WC,SDF11         SKIP IF NO ARGS OR LOCALS
        !          9510:        MOV  XL,WA            KEEP PFBLK POINTER
        !          9511:        MOV  DEFXS,XT         POINT BEFORE ARGUMENTS
        !          9512:        LCT  WC,WC            GET COUNT OF ARGS+LOCALS FOR LOOP
        !          9513: *
        !          9514: *      LOOP TO MOVE LOCALS AND ARGS TO PFBLK
        !          9515: *
        !          9516: SDF10  MOV  -(XT),(XR)+      STORE ONE ENTRY AND BUMP POINTERS
        !          9517:        BCT  WC,SDF10         LOOP TILL ALL STORED
        !          9518:        MOV  WA,XL            RECOVER PFBLK POINTER
        !          9519:        EJC
        !          9520: *
        !          9521: *      DEFINE (CONTINUED)
        !          9522: *
        !          9523: *      NOW DEAL WITH LABEL
        !          9524: *
        !          9525: SDF11  MOV  DEFXS,XS         POP STACK
        !          9526:        MOV  DEFLB,XR         POINT TO VRBLK FOR LABEL
        !          9527:        MOV  VRLBL(XR),XR     LOAD LABEL POINTER
        !          9528:        BNE  (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED
        !          9529:        MOV  TRLBL(XR),XR     ELSE POINT TO REAL LABEL
        !          9530: *
        !          9531: *      HERE AFTER LOCATING REAL LABEL POINTER
        !          9532: *
        !          9533: SDF12  BEQ  XR,=STNDL,SDF13  JUMP IF LABEL IS NOT DEFINED
        !          9534:        MOV  XR,PFCOD(XL)     ELSE STORE LABEL POINTER
        !          9535:        MOV  DEFVR,XR         POINT BACK TO VRBLK FOR FUNCTION
        !          9536:        JSR  DFFNC            DEFINE FUNCTION
        !          9537:        BRN  EXNUL            AND EXIT RETURNING NULL
        !          9538: *
        !          9539: *      HERE FOR ERRONEOUS LABEL
        !          9540: *
        !          9541: SDF13  ERB  097,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL
        !          9542: *
        !          9543: *      ERRONEOUS ARG OR LOCAL
        !          9544: *
        !          9545: SDF14  ERB  098,BAD BLANK OR MISSING RIGHT PAREN IN DEFINE ARG
        !          9546:        EJC
        !          9547: *
        !          9548: *      DETACH
        !          9549: *
        !          9550: S$DET  ENT                   ENTRY POINT
        !          9551:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          9552:        JSR  GTVAR            LOCATE VARIABLE
        !          9553:        ERR  099,DETACH ARGUMENT IS NOT APPROPRIATE NAME
        !          9554:        MOV  WA,-(XS)         KEEP OFFSET
        !          9555:        ZER  SDETF            CLEAR FAIL FLAG
        !          9556:        MOV  =TRTIN,WB        TRACE TYPE
        !          9557:        ZER  XR               REMOVE TRBLK
        !          9558:        JSR  TRCHN            REMOVE ANY INPUT ASSOCIATION
        !          9559:        PPM  SDET1            SKIP IF NO INPUT TRBLK
        !          9560:        MNZ  SDETF            NOTE TRBLK REMOVED
        !          9561: *
        !          9562: *      REPEAT FOR OUTPUT TRBLK
        !          9563: *
        !          9564: SDET1  MOV  (XS)+,WA         RECOVER OFFSET
        !          9565:        MOV  =TRTOU,WB        TRTYP
        !          9566:        JSR  TRCHN            REMOVE ANY OUTPUT ASSOCIATION
        !          9567:        PPM  SDET2            SKIP IF NO TRBLK
        !          9568:        BRN  EXNUL            SUCCEED
        !          9569: *
        !          9570: *      CHECK AT LEAST ONE TRBLK REMOVED
        !          9571: *
        !          9572: SDET2  BNZ  SDETF,EXNUL      SUCCEED IF SO
        !          9573:        BRN  EXFAL            ELSE FAIL
        !          9574:        EJC
        !          9575: *
        !          9576: *      DIFFER
        !          9577: *
        !          9578: S$DIF  ENT                   ENTRY POINT
        !          9579:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
        !          9580:        MOV  (XS)+,XL         LOAD FIRST ARGUMENT
        !          9581:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
        !          9582:        PPM  EXFAL            FAIL IF IDENT
        !          9583:        BRN  EXNUL            RETURN NULL IF DIFFER
        !          9584:        EJC
        !          9585: *
        !          9586: *      DUMP
        !          9587: *
        !          9588: S$DMP  ENT                   ENTRY POINT
        !          9589:        JSR  GTSMI            LOAD DUMP ARG AS SMALL INTEGER
        !          9590:        ERR  100,DUMP ARGUMENT IS NOT INTEGER
        !          9591:        ERR  101,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE
        !          9592:        JSR  DUMPR            ELSE CALL DUMP ROUTINE
        !          9593:        BRN  EXNUL            AND RETURN NULL AS RESULT
        !          9594:        EJC
        !          9595: *
        !          9596: *      DUPL
        !          9597: *
        !          9598: S$DUP  ENT                   ENTRY POINT
        !          9599:        JSR  GTSMI            GET SECOND ARGUMENT AS SMALL INTEGE
        !          9600:        ERR  102,DUPL SECOND ARGUMENT IS NOT INTEGER
        !          9601:        PPM  SDUP7            JUMP IF NEGATIVE OT TOO BIG
        !          9602:        MOV  XR,WB            SAVE DUPLICATION FACTOR
        !          9603:        JSR  GTSTG            GET FIRST ARG AS STRING
        !          9604:        PPM  SDUP4            JUMP IF NOT A STRING
        !          9605: *
        !          9606: *      HERE FOR CASE OF DUPLICATION OF A STRING
        !          9607: *
        !          9608:        MTI  WA               ACQUIRE LENGTH AS INTEGER
        !          9609:        STI  DUPSI            SAVE FOR THE MOMENT
        !          9610:        MTI  WB               GET DUPLICATION FACTOR AS INTEGER
        !          9611:        MLI  DUPSI            FORM PRODUCT
        !          9612:        IOV  SDUP3            JUMP IF OVERFLOW
        !          9613:        IEQ  EXNUL            RETURN NULL IF RESULT LENGTH = 0
        !          9614:        MFI  WA,SDUP3         GET AS ADDR INTEGER, CHECK OVFLO
        !          9615: *
        !          9616: *      MERGE HERE WITH RESULT LENGTH IN WA
        !          9617: *
        !          9618: SDUP1  MOV  XR,XL            SAVE STRING POINTER
        !          9619:        JSR  ALOCS            ALLOCATE SPACE FOR STRING
        !          9620:        MOV  XR,-(XS)         SAVE AS RESULT POINTER
        !          9621:        MOV  XL,WC            SAVE POINTER TO ARGUMENT STRING
        !          9622:        PSC  XR               PREPARE TO STORE CHARS OF RESULT
        !          9623:        LCT  WB,WB            SET COUNTER TO CONTROL LOOP
        !          9624: *
        !          9625: *      LOOP THROUGH DUPLICATIONS
        !          9626: *
        !          9627: SDUP2  MOV  WC,XL            POINT BACK TO ARGUMENT STRING
        !          9628:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARACTERS
        !          9629:        PLC  XL               POINT TO CHARS IN ARGUMENT STRING
        !          9630:        MVC                   MOVE CHARACTERS TO RESULT STRING
        !          9631:        BCT  WB,SDUP2         LOOP TILL ALL DUPLICATIONS DONE
        !          9632:        BRN  EXITS            THEN EXIT FOR NEXT CODE WORD
        !          9633:        EJC
        !          9634: *
        !          9635: *      DUPL (CONTINUED)
        !          9636: *
        !          9637: *      HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
        !          9638: *
        !          9639: SDUP3  MOV  DNAME,WA         SET IMPOSSIBLE LENGTH FOR ALOCS
        !          9640:        BRN  SDUP1            MERGE BACK
        !          9641: *
        !          9642: *      HERE IF NOT A STRING
        !          9643: *
        !          9644: SDUP4  JSR  GTPAT            CONVERT ARGUMENT TO PATTERN
        !          9645:        ERR  103,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN
        !          9646: *
        !          9647: *      HERE TO DUPLICATE A PATTERN ARGUMENT
        !          9648: *
        !          9649:        MOV  XR,-(XS)         STORE PATTERN ON STACK
        !          9650:        MOV  =NDNTH,XR        START OFF WITH NULL PATTERN
        !          9651:        BZE  WB,SDUP6         NULL PATTERN IS RESULT IF DUPFAC=0
        !          9652:        MOV  WB,-(XS)         PRESERVE LOOP COUNT
        !          9653: *
        !          9654: *      LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
        !          9655: *
        !          9656: SDUP5  MOV  XR,XL            COPY CURRENT VALUE AS RIGHT ARGUMNT
        !          9657:        MOV  1(XS),XR         GET A NEW COPY OF LEFT
        !          9658:        JSR  PCONC            CONCATENATE
        !          9659:        DCV  (XS)             COUNT DOWN
        !          9660:        BNZ  (XS),SDUP5       LOOP
        !          9661:        ICA  XS               POP LOOP COUNT
        !          9662: *
        !          9663: *      HERE TO EXIT AFTER CONSTRUCTING PATTERN
        !          9664: *
        !          9665: SDUP6  MOV  XR,(XS)          STORE RESULT ON STACK
        !          9666:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          9667: *
        !          9668: *      FAIL IF SECOND ARG IS OUT OF RANGE
        !          9669: *
        !          9670: SDUP7  ICA  XS               POP FIRST ARGUMENT
        !          9671:        BRN  EXFAL            FAIL
        !          9672:        EJC
        !          9673: *
        !          9674: *      EJECT
        !          9675: *
        !          9676: S$EJC  ENT                   ENTRY POINT
        !          9677:        MOV  (XS)+,WB         GET ARGUMENT
        !          9678:        MOV  WB,-(XS)         RESTACK IT
        !          9679:        JSR  GTSTG            CONVERT TO STRING
        !          9680:        PPM  SEJC2            FAIL IF CANT
        !          9681:        BZE  WA,SEJC1         SKIP IF NULL STRING
        !          9682:        MOV  WB,-(XS)         RESTACK ORIGINAL ARG
        !          9683:        JSR  IOFTG            CALL FILETAG ROUTINE
        !          9684:        PPM  SEJC2            FAIL
        !          9685:        BZE  WA,EXFAL         FAIL IF NOT ASSOCIATED
        !          9686:        JSR  SYSEF            CALL EJECT FILE FUNCTION
        !          9687:        PPM  EXFAL            FAIL RETURN
        !          9688:        PPM  EROSI            ERROR RETURN
        !          9689:        BRN  EXNUL            RETURN NULL AS RESULT
        !          9690: *
        !          9691: *      HERE TO EJECT STANDARD OUTPUT FILE
        !          9692: *
        !          9693: SEJC1  JSR  SYSEP            CALL ROUTINE TO EJECT PRINTER
        !          9694:        PPM  EXFAL            FAIL RETURN
        !          9695:        PPM  EROSI            ERROR RETURN
        !          9696:        BRN  EXNUL            EXIT WITH NULL RESULT
        !          9697: *
        !          9698: *      ERROR POINT
        !          9699: *
        !          9700: SEJC2  ERB  104,EJECT ARGUMENT IS NOT A SUITABLE FILETAG
        !          9701:        EJC
        !          9702: *
        !          9703: *      ENDFILE
        !          9704: *
        !          9705: S$ENF  ENT                   ENTRY POINT
        !          9706:        JSR  GTSTG            CONVERT SECOND ARG TO STRING
        !          9707:        ERR  105,ENDFILE SECOND ARGUMENT IS NOT A STRING
        !          9708:        BNZ  WA,SENF1         SKIP IF NON NULL SECOND ARG
        !          9709:        ZER  XR               0 IF NULL
        !          9710: *
        !          9711: *      NOW PROCESS FILETAG
        !          9712: *
        !          9713: SENF1  MOV  XR,SENFR         KEEP SECOND ARG
        !          9714:        JSR  IOFTG            CALL FILETAG PROC (WB = VRBLK PTR)
        !          9715:        ERR  106,ENDFILE FIRST ARGUMENT IS NOT A SUITABLE FILETAG
        !          9716:        BZE  WA,EXFAL         FAIL IF NO IOTAG
        !          9717:        MOV  SENFR,XR         RECOVER SECOND ARG
        !          9718:        JSR  SYSEN            CALL ENDFILE ROUTINE
        !          9719:        PPM  EXFAL            FAIL RETURN
        !          9720:        PPM  EROSI            ERROR RETURN
        !          9721:        BNZ  WA,EXNUL         RETURN NULL IF NO FILE CLOSURE
        !          9722:        MOV  WB,XL            POINT TO FILETAG VRBLK
        !          9723:        MOV  *VRVAL,WA        OFFSET TO VALUE FIELD
        !          9724:        ZER  XR               FOR TRBLK REMOVAL
        !          9725:        MOV  =TRTIO,WB        TRTYP
        !          9726:        JSR  TRCHN            REMOVE TRBLK
        !          9727:        PPM  EXFAL            (CANT FAIL HERE)
        !          9728:        BRN  EXNUL            RETURN NULL
        !          9729:        EJC
        !          9730: *
        !          9731: *      EQ
        !          9732: *
        !          9733: S$EQF  ENT                   ENTRY POINT
        !          9734:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
        !          9735:        ERR  107,EQ FIRST ARGUMENT IS NOT NUMERIC
        !          9736:        ERR  108,EQ SECOND ARGUMENT IS NOT NUMERIC
        !          9737:        PPM  EXFAL            FAIL IF LT
        !          9738:        PPM  EXNUL            RETURN NULL IF EQ
        !          9739:        PPM  EXFAL            FAIL IF GT
        !          9740:        EJC
        !          9741: *
        !          9742: *      EVAL
        !          9743: *
        !          9744: S$EVL  ENT                   ENTRY POINT
        !          9745:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          9746:        JSR  GTEXP            CONVERT TO EXPRESSION
        !          9747:        ERR  109,EVAL ARGUMENT IS NOT EXPRESSION
        !          9748:        LCW  WC               LOAD NEXT CODE WORD
        !          9749:        BNE  WC,=OFNE$,SEVL1  JUMP IF CALLED BY VALUE
        !          9750:        SCP  XL               COPY CODE POINTER
        !          9751:        MOV  (XL),WA          GET NEXT CODE WORD
        !          9752:        BNE  WA,=ORNM$,SEVL2  BY NAME UNLESS EXPRESSION
        !          9753:        BNZ  1(XS),SEVL2      JUMP IF BY NAME
        !          9754: *
        !          9755: *      HERE IF CALLED BY VALUE
        !          9756: *
        !          9757: SEVL1  ZER  WB               SET FLAG FOR BY VALUE
        !          9758:        MOV  WC,-(XS)         SAVE CODE WORD
        !          9759:        JSR  EVALX            EVALUATE EXPRESSION BY VALUE
        !          9760:        PPM  EXFAL            FAIL IF EVALUATION FAILS
        !          9761:        MOV  XR,XL            COPY RESULT
        !          9762:        MOV  (XS),XR          RELOAD NEXT CODE WORD
        !          9763:        MOV  XL,(XS)          STACK RESULT
        !          9764:        BRI  (XR)             JUMP TO EXECUTE NEXT CODE WORD
        !          9765: *
        !          9766: *      HERE IF CALLED BY NAME
        !          9767: *
        !          9768: SEVL2  MOV  =NUM01,WB        SET FLAG FOR BY NAME
        !          9769:        JSR  EVALX            EVALUATE EXPRESSION BY NAME
        !          9770:        PPM  EXFAL            FAIL IF EVALUATION FAILS
        !          9771:        BRN  EXNAM            EXIT WITH NAME
        !          9772: .IF    .CNEX
        !          9773: .ELSE
        !          9774:        EJC
        !          9775: *
        !          9776: *      EXIT
        !          9777: *
        !          9778: S$EXT  ENT                   ENTRY POINT
        !          9779:        ZER  WB               CLEAR AMOUNT OF STATIC SHIFT
        !          9780:        JSR  GBCOL            COMPACT MEMORY BY COLLECTING
        !          9781:        JSR  GTSTG            CONVERT ARG TO STRING
        !          9782:        ERR  110,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING
        !          9783:        MOV  XR,XL            COPY STRING PTR
        !          9784:        JSR  GTINT            CHECK IT IS INTEGER
        !          9785:        PPM  SEXT1            SKIP IF UNCONVERTIBLE
        !          9786:        ZER  XL               NOTE IT IS INTEGER
        !          9787:        LDI  ICVAL(XR)        GET INTEGER ARG
        !          9788: *
        !          9789: *      MERGE TO CALL OSINT EXIT ROUTINE
        !          9790: *
        !          9791: SEXT1  MOV  =HEADV,XR        POINT TO V.V STRING
        !          9792:        MOV  =KVCOD,WA        VALUE OF CODE KEYWORD
        !          9793:        JSR  SYSXI            CALL EXTERNAL ROUTINE
        !          9794:        PPM  EXFAL            FAIL RETURN
        !          9795:        PPM  EROSI            ERROR RETURN
        !          9796:        IEQ  EXNUL            RETURN IF ARGUMENT 0
        !          9797:        ZER  GBCNT            RESUMING EXECUTION SO.
        !          9798:        IGT  SEXT2            SKIP IF POSITIVE
        !          9799:        NGI                   MAKE POSITIVE
        !          9800: *
        !          9801: *      CHECK FOR OPTION RESPECIFICATION
        !          9802: *
        !          9803: SEXT2  MFI  WC               GET VALUE IN WORK REGISTER
        !          9804:        BEQ  WC,=NUM03,SEXT3  SKIP IF WAS 3
        !          9805:        MOV  WC,-(XS)         SAVE VALUE
        !          9806:        ZER  WC               SET TO READ OPTIONS
        !          9807:        JSR  PRPAR            READ SYSPP OPTIONS
        !          9808:        MOV  (XS)+,WA         RESTORE VALUE
        !          9809: *
        !          9810: *      DEAL WITH HEADER OPTIONS (FIDDLED BY PRPAR)
        !          9811: *
        !          9812: SEXT3  MNZ  HEADP            ASSUME NO HEADERS
        !          9813:        BNE  WC,=NUM01,SEXT4  SKIP IF NOT 1
        !          9814:        ZER  HEADP            REQUEST HEADER PRINTING
        !          9815: *
        !          9816: *      ALMOST READY TO RESUME RUNNING
        !          9817: *
        !          9818: SEXT4  JSR  SYSTM            GET RECOMMENCEMENT TIME
        !          9819:        STI  TIMSX            SAVE AS INITIAL TIME
        !          9820:        LDI  KVSTC            RESET TO ENSURE ...
        !          9821:        STI  KVSTL            ... CORRECT EXECUTION STATS
        !          9822:        BRN  EXNUL            RESUME EXECUTION
        !          9823: .FI
        !          9824: .IF    .CNFN
        !          9825: .ELSE
        !          9826:        EJC
        !          9827: *
        !          9828: *      FENCE
        !          9829: *
        !          9830: S$FNC  ENT                   ENTRY POINT
        !          9831:        MOV  =P$FNC,WB        SET PCODE FOR P$FNC
        !          9832:        ZER  XR               P0BLK
        !          9833:        JSR  PBILD            BUILD P$FNC NODE
        !          9834:        MOV  XR,XL            SAVE POINTER TO IT
        !          9835:        MOV  (XS)+,XR         GET ARGUMENT
        !          9836:        JSR  GTPAT            CONVERT TO PATTERN
        !          9837:        ERR  180,FENCE ARGUMENT IS NOT PATTERN
        !          9838:        JSR  PCONC            CONCATENATE TO P$FNC NODE
        !          9839:        MOV  XR,XL            SAVE PTR TO CONCATENATED PATTERN
        !          9840:        MOV  =P$FNA,WB        SET FOR P$FNA PCODE
        !          9841:        ZER  XR               P0BLK
        !          9842:        JSR  PBILD            CONSTRUCT P$FNA NODE
        !          9843:        MOV  XL,PTHEN(XR)     SET PATTERN AS PTHEN
        !          9844:        MOV  XR,-(XS)         SET AS RESULT
        !          9845:        BRN  EXITS            DO NEXT CODE WORD
        !          9846:        EJC
        !          9847: .FI
        !          9848: *
        !          9849: *      FIELD
        !          9850: *
        !          9851: S$FLD  ENT                   ENTRY POINT
        !          9852:        JSR  GTSMI            GET SECOND ARGUMENT (FIELD NUMBER)
        !          9853:        ERR  255,FIELD SECOND ARGUMENT IS NOT INTEGER
        !          9854:        PPM  EXFAL            FAIL IF OUT OF RANGE
        !          9855:        MOV  XR,WB            ELSE SAVE INTEGER VALUE
        !          9856:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
        !          9857:        JSR  GTNVR            POINT TO VRBLK
        !          9858:        PPM  SFLD1            JUMP (ERROR) IF NOT VARIABLE NAME
        !          9859:        MOV  VRFNC(XR),XR     ELSE POINT TO FUNCTION BLOCK
        !          9860:        BNE  (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION
        !          9861: *
        !          9862: *      HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
        !          9863: *
        !          9864:        BZE  WB,EXFAL         FAIL IF ARGUMENT NUMBER IS ZERO
        !          9865:        BGT  WB,FARGS(XR),EXFAL FAIL IF TOO LARGE
        !          9866:        WTB  WB               ELSE CONVERT TO BYTE OFFSET
        !          9867:        ADD  WB,XR            POINT TO FIELD NAME
        !          9868:        MOV  DFFLB(XR),XR     LOAD VRBLK POINTER
        !          9869:        BRN  EXVNM            EXIT TO BUILD NMBLK
        !          9870: *
        !          9871: *      HERE FOR BAD FIRST ARGUMENT
        !          9872: *
        !          9873: SFLD1  ERB  254,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME
        !          9874:        EJC
        !          9875: *
        !          9876: *      GE
        !          9877: *
        !          9878: S$GEF  ENT                   ENTRY POINT
        !          9879:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
        !          9880:        ERR  111,GE FIRST ARGUMENT IS NOT NUMERIC
        !          9881:        ERR  112,GE SECOND ARGUMENT IS NOT NUMERIC
        !          9882:        PPM  EXFAL            FAIL IF LT
        !          9883:        PPM  EXNUL            RETURN NULL IF EQ
        !          9884:        PPM  EXNUL            RETURN NULL IF GT
        !          9885: *
        !          9886: *      GT
        !          9887: *
        !          9888: S$GTF  ENT                   ENTRY POINT
        !          9889:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
        !          9890:        ERR  113,GT FIRST ARGUMENT IS NOT NUMERIC
        !          9891:        ERR  114,GT SECOND ARGUMENT IS NOT NUMERIC
        !          9892:        PPM  EXFAL            FAIL IF LT
        !          9893:        PPM  EXFAL            FAIL IF EQ
        !          9894:        PPM  EXNUL            RETURN NULL IF GT
        !          9895:        EJC
        !          9896: *
        !          9897: *      HOST
        !          9898: *
        !          9899: S$HST  ENT                   ENTRY POINT
        !          9900:        JSR  GTSTG            CONVERT ARG TO STRING
        !          9901:        ERR  115,ERRONEOUS THIRD ARGUMENT FOR HOST
        !          9902:        MOV  WA,WB            KEEP LENGTH
        !          9903:        MOV  XR,WC            KEEP THIRD ARG
        !          9904:        JSR  GTSTG            CONVERT ARG TO STRING
        !          9905:        ERR  116,ERRONEOUS SECOND ARGUMENT FOR HOST
        !          9906:        ORB  WA,WB            NON ZERO UNLESS TWO ARGS NULL
        !          9907:        MOV  XR,XL            KEEP SECOND ARG
        !          9908:        JSR  GTSTG            CONVERT ARG TO STRING
        !          9909:        ERR  117,ERRONEOUS FIRST ARGUMENT FOR HOST
        !          9910:        ORB  WA,WB            NON ZERO UNLESS ALL ARGS NULL
        !          9911:        MOV  XR,WA            KEEP FIRST ARG
        !          9912:        MOV  WC,XR            GET THIRD ARG
        !          9913:        JSR  SYSHS            CALL SYSHS ROUTINE
        !          9914:        PPM  EXFAL            FAIL RETURN
        !          9915:        PPM  EROSI            ERROR RETURN
        !          9916:        MOV  SCLEN(XL),WA     LENGTH OF RETURNED STRING
        !          9917:        ZER  WB               ZERO OFFSET
        !          9918:        JSR  SBSTR            BUILD COPY OF STRING
        !          9919:        MOV  XR,-(XS)         STACK THE RESULT
        !          9920:        BRN  EXITS            RETURN RESULT ON STACK
        !          9921:        EJC
        !          9922: *
        !          9923: *      IDENT
        !          9924: *
        !          9925: S$IDN  ENT                   ENTRY POINT
        !          9926:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
        !          9927:        MOV  (XS)+,XL         LOAD FIRST ARGUMENT
        !          9928:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
        !          9929:        PPM  EXNUL            RETURN NULL IF IDENT
        !          9930:        BRN  EXFAL            FAIL IF DIFFER
        !          9931:        EJC
        !          9932: *
        !          9933: *      INPUT
        !          9934: *
        !          9935: S$INP  ENT                   ENTRY POINT
        !          9936:        ZER  WB               INPUT FLAG
        !          9937:        JSR  IOPUT            CALL INPUT/OUTPUT ASSOC. ROUTINE
        !          9938:        ERR  118,INPUT THIRD ARGUMENT (FILEPROPS) IS NOT A STRING
        !          9939:        ERR  119,INAPPROPRIATE SECOND ARGUMENT (FILETAG) FOR INPUT
        !          9940:        ERR  120,INAPPROPRIATE FIRST ARGUMENT FOR INPUT
        !          9941:        PPM  EXFAL            FAIL RETURN
        !          9942:        BRN  EXNUL            RETURN NULL STRING
        !          9943: .IF    .CNBF
        !          9944: .ELSE
        !          9945:        EJC
        !          9946: *
        !          9947: *      INSERT
        !          9948: *
        !          9949: S$INS  ENT                   ENTRY POINT
        !          9950:        MOV  (XS)+,XL         GET STRING ARG
        !          9951:        JSR  GTSMI            GET REPLACE LENGTH
        !          9952:        ERR  121,INSERT THIRD ARGUMENT NOT INTEGER
        !          9953:        PPM  EXFAL            FAIL IF OUT OF RANGE
        !          9954:        MOV  WC,WB            COPY TO PROPER REG
        !          9955:        JSR  GTSMI            GET REPLACE POSITION
        !          9956:        ERR  122,INSERT SECOND ARGUMENT NOT INTEGER
        !          9957:        PPM  EXFAL            FAIL IF OUT OF RANGE
        !          9958:        BZE  WC,EXFAL         FAIL IF ZERO
        !          9959:        DCV  WC               DECREMENT TO GET OFFSET
        !          9960:        MOV  WC,WA            PUT IN PROPER REGISTER
        !          9961:        MOV  (XS)+,XR         GET BUFFER
        !          9962:        BEQ  (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK
        !          9963:        ERB  123,INSERT FIRST ARGUMENT NOT BUFFER
        !          9964: *
        !          9965: *      HERE WHEN EVERYTHING LOADED UP
        !          9966: *
        !          9967: SINS1  JSR  INSBF            CALL TO INSERT
        !          9968:        ERR  124,INSERT FOURTH ARGUMENT NOT A STRING
        !          9969:        PPM  EXFAL            FAIL IF OUT OF RANGE
        !          9970:        BRN  EXNUL            ELSE OK - EXIT WITH NULL
        !          9971: .FI
        !          9972:        EJC
        !          9973: *
        !          9974: *      INTEGER
        !          9975: *
        !          9976: S$INT  ENT                   ENTRY POINT
        !          9977:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          9978:        JSR  GTNUM            CONVERT TO NUMERIC
        !          9979:        PPM  EXFAL            FAIL IF NON-NUMERIC
        !          9980:        BEQ  WA,=B$ICL,EXNUL  RETURN NULL IF INTEGER
        !          9981:        BRN  EXFAL            FAIL IF REAL
        !          9982:        EJC
        !          9983: *
        !          9984: *      ITC
        !          9985: *
        !          9986: S$ITC  ENT
        !          9987:        JSR  GTSMI            OBTAIN ARG AS AN INTEGER
        !          9988:        ERR  125,ITC ARGUMENT IS NOT A SMALL INTEGER
        !          9989:        PPM  EXFAL            FAIL IF OUT OF RANGE
        !          9990:        BGE  WC,=CFP$A,EXFAL  FURTHER RANGE CHECK
        !          9991:        MOV  WC,WB            PRESERVE WC
        !          9992:        MOV  =NUM01,WA        FOR SCBLK REQUEST
        !          9993:        JSR  ALOCS            BUILD STRING BLOCK
        !          9994:        MOV  XR,XL            COPY STRING PTR
        !          9995:        PSC  XL               READY TO STORE CHAR
        !          9996:        SCH  WB,(XL)          STORE IT
        !          9997:        ZER  XL               CLEAR GARBAGE
        !          9998:        BRN  EXIXR            RETURN STRING RESULT
        !          9999:        EJC
        !          10000: *
        !          10001: *      ITEM
        !          10002: *
        !          10003: *      ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
        !          10004: *      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
        !          10005: *
        !          10006: S$ITM  ENT                   ENTRY POINT
        !          10007: *
        !          10008: *      DEAL WITH CASE OF NO ARGS
        !          10009: *
        !          10010:        BNZ  WA,SITM1         JUMP IF AT LEAST ONE ARG
        !          10011:        MOV  =NULLS,-(XS)     ELSE SUPPLY GARBAGE NULL ARG
        !          10012:        MOV  =NUM01,WA        AND FIX ARGUMENT COUNT
        !          10013: *
        !          10014: *      CHECK FOR NAME/VALUE CASES
        !          10015: *
        !          10016: SITM1  SCP  XR               GET CURRENT CODE POINTER
        !          10017:        MOV  (XR),XL          LOAD NEXT CODE WORD
        !          10018:        DCV  WA               GET NUMBER OF SUBSCRIPTS
        !          10019:        MOV  WA,XR            COPY FOR ARREF
        !          10020:        BEQ  XL,=OFNE$,SITM2  JUMP IF CALLED BY NAME
        !          10021: *
        !          10022: *      HERE IF CALLED BY VALUE
        !          10023: *
        !          10024:        ZER  WB               SET CODE FOR CALL BY VALUE
        !          10025:        BRN  ARREF            OFF TO ARRAY REFERENCE ROUTINE
        !          10026: *
        !          10027: *      HERE FOR CALL BY NAME
        !          10028: *
        !          10029: SITM2  MNZ  WB               SET CODE FOR CALL BY NAME
        !          10030:        LCW  WA               LOAD AND IGNORE OFNE$ CALL
        !          10031:        BRN  ARREF            OFF TO ARRAY REFERENCE ROUTINE
        !          10032:        EJC
        !          10033: *
        !          10034: *      LE
        !          10035: *
        !          10036: S$LEF  ENT                   ENTRY POINT
        !          10037:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
        !          10038:        ERR  126,LE FIRST ARGUMENT IS NOT NUMERIC
        !          10039:        ERR  127,LE SECOND ARGUMENT IS NOT NUMERIC
        !          10040:        PPM  EXNUL            RETURN NULL IF LT
        !          10041:        PPM  EXNUL            RETURN NULL IF EQ
        !          10042:        PPM  EXFAL            FAIL IF GT
        !          10043:        EJC
        !          10044: *
        !          10045: *      LEN
        !          10046: *
        !          10047: S$LEN  ENT                   ENTRY POINT
        !          10048:        MOV  =P$LEN,WB        SET PCODE FOR INTEGER ARG CASE
        !          10049:        MOV  =P$LND,WA        SET PCODE FOR EXPR ARG CASE
        !          10050:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
        !          10051:        ERR  128,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION
        !          10052:        ERR  129,LEN ARGUMENT IS NEGATIVE OR TOO LARGE
        !          10053:        BRN  EXIXR            RETURN PATTERN NODE
        !          10054:        EJC
        !          10055: *
        !          10056: *      LEQ
        !          10057: *
        !          10058: S$LEQ  ENT                   ENTRY POINT
        !          10059:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
        !          10060:        ERR  130,LEQ FIRST ARGUMENT IS NOT STRING
        !          10061:        ERR  131,LEQ SECOND ARGUMENT IS NOT STRING
        !          10062:        PPM  EXFAL            FAIL IF LLT
        !          10063:        PPM  EXNUL            RETURN NULL IF LEQ
        !          10064:        PPM  EXFAL            FAIL IF LGT
        !          10065:        EJC
        !          10066: *
        !          10067: *      LGE
        !          10068: *
        !          10069: S$LGE  ENT                   ENTRY POINT
        !          10070:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
        !          10071:        ERR  132,LGE FIRST ARGUMENT IS NOT STRING
        !          10072:        ERR  133,LGE SECOND ARGUMENT IS NOT STRING
        !          10073:        PPM  EXFAL            FAIL IF LLT
        !          10074:        PPM  EXNUL            RETURN NULL IF LEQ
        !          10075:        PPM  EXNUL            RETURN NULL IF LGT
        !          10076:        EJC
        !          10077: *
        !          10078: *      LGT
        !          10079: *
        !          10080: S$LGT  ENT                   ENTRY POINT
        !          10081:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
        !          10082:        ERR  134,LGT FIRST ARGUMENT IS NOT STRING
        !          10083:        ERR  135,LGT SECOND ARGUMENT IS NOT STRING
        !          10084:        PPM  EXFAL            FAIL IF LLT
        !          10085:        PPM  EXFAL            FAIL IF LEQ
        !          10086:        PPM  EXNUL            RETURN NULL IF LGT
        !          10087:        EJC
        !          10088: *
        !          10089: *      LLE
        !          10090: *
        !          10091: S$LLE  ENT                   ENTRY POINT
        !          10092:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
        !          10093:        ERR  136,LLE FIRST ARGUMENT IS NOT STRING
        !          10094:        ERR  137,LLE SECOND ARGUMENT IS NOT STRING
        !          10095:        PPM  EXNUL            RETURN NULL IF LLT
        !          10096:        PPM  EXNUL            RETURN NULL IF LEQ
        !          10097:        PPM  EXFAL            FAIL IF LGT
        !          10098:        EJC
        !          10099: *
        !          10100: *      LLT
        !          10101: *
        !          10102: S$LLT  ENT                   ENTRY POINT
        !          10103:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
        !          10104:        ERR  138,LLT FIRST ARGUMENT IS NOT STRING
        !          10105:        ERR  139,LLT SECOND ARGUMENT IS NOT STRING
        !          10106:        PPM  EXNUL            RETURN NULL IF LLT
        !          10107:        PPM  EXFAL            FAIL IF LEQ
        !          10108:        PPM  EXFAL            FAIL IF LGT
        !          10109:        EJC
        !          10110: *
        !          10111: *      LNE
        !          10112: *
        !          10113: S$LNE  ENT                   ENTRY POINT
        !          10114:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
        !          10115:        ERR  140,LNE FIRST ARGUMENT IS NOT STRING
        !          10116:        ERR  141,LNE SECOND ARGUMENT IS NOT STRING
        !          10117:        PPM  EXNUL            RETURN NULL IF LLT
        !          10118:        PPM  EXFAL            FAIL IF LEQ
        !          10119:        PPM  EXNUL            RETURN NULL IF LGT
        !          10120: .IF    .CNLD
        !          10121: .ELSE
        !          10122:        EJC
        !          10123: *
        !          10124: *      LOAD
        !          10125: *
        !          10126: S$LOD  ENT                   ENTRY POINT
        !          10127:        JSR  GTSTG            LOAD LIBRARY NAME
        !          10128:        ERR  142,LOAD SECOND ARGUMENT IS NOT STRING
        !          10129:        MOV  XR,XL            SAVE LIBRARY NAME
        !          10130:        JSR  XSCNI            PREPARE TO SCAN FIRST ARGUMENT
        !          10131:        ERR  143,LOAD FIRST ARGUMENT IS NOT STRING
        !          10132:        ERR  144,LOAD FIRST ARGUMENT IS NULL
        !          10133:        MOV  XL,-(XS)         STACK LIBRARY NAME
        !          10134:        MOV  =CH$PP,WC        SET DELIMITER ONE = LEFT PAREN
        !          10135:        MOV  WC,XL            SET DELIMITER TWO = LEFT PAREN
        !          10136:        JSR  XSCAN            SCAN FUNCTION NAME
        !          10137:        MOV  XR,-(XS)         SAVE PTR TO FUNCTION NAME
        !          10138:        BNZ  WA,SLOD1         JUMP IF LEFT PAREN FOUND
        !          10139:        ERB  145,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN
        !          10140: *
        !          10141: *      HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
        !          10142: *
        !          10143: SLOD1  JSR  GTNVR            LOCATE VRBLK
        !          10144:        ERR  146,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME
        !          10145:        MOV  XR,LODFN         SAVE VRBLK POINTER
        !          10146:        ZER  LODNA            ZERO COUNT OF ARGUMENTS
        !          10147: *
        !          10148: *      LOOP TO SCAN ARGUMENT DATATYPE NAMES
        !          10149: *
        !          10150: SLOD2  MOV  =CH$RP,WC        DELIMITER ONE IS RIGHT PAREN
        !          10151:        MOV  =CH$CM,XL        DELIMITER TWO IS COMMA
        !          10152:        JSR  XSCAN            SCAN NEXT ARGUMENT NAME
        !          10153:        ICV  LODNA            BUMP ARGUMENT COUNT
        !          10154:        BNZ  WA,SLOD3         JUMP IF OK DELIMITER WAS FOUND
        !          10155:        ERB  147,BAD BLANK OR MISSING RIGHT PAREN IN LOAD ARG
        !          10156:        EJC
        !          10157: *
        !          10158: *      LOAD (CONTINUED)
        !          10159: *
        !          10160: *      COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
        !          10161: *      CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
        !          10162: *      RESULT DATATYPE (WITH WA SET TO ZERO).
        !          10163: *
        !          10164: SLOD3  MOV  XR,-(XS)         STACK DATATYPE NAME POINTER
        !          10165:        MOV  =NUM01,WB        SET STRING CODE IN CASE (1)
        !          10166:        MOV  =SCSTR,XL        POINT TO /STRING/
        !          10167:        JSR  IDENT            CHECK FOR MATCH
        !          10168:        PPM  SLOD4            JUMP IF MATCH
        !          10169:        MOV  (XS),XR          ELSE RELOAD NAME
        !          10170:        ADD  WB,WB            SET CODE FOR INTEGER (2)
        !          10171:        MOV  =SCINT,XL        POINT TO /INTEGER/
        !          10172:        JSR  IDENT            CHECK FOR MATCH
        !          10173:        PPM  SLOD4            JUMP IF MATCH
        !          10174:        ICV  WB               ELSE SET CODE FOR REAL (3)
        !          10175: .IF    .CNRA
        !          10176: .ELSE
        !          10177:        MOV  (XS),XR          RELOAD STRING POINTER
        !          10178:        MOV  =SCREA,XL        POINT TO /REAL/
        !          10179:        JSR  IDENT            CHECK FOR MATCH
        !          10180:        PPM  SLOD4            JUMP IF MATCH
        !          10181: .FI
        !          10182:        ICV  WB               SET CODE FOR BUFFER (4)
        !          10183: .IF    .CNBF
        !          10184: .ELSE
        !          10185:        MOV  (XS),XR          RELOAD STRING POINTER
        !          10186:        MOV  =SCBUF,XL        POINT TO /BUFFER/
        !          10187:        JSR  IDENT            CHECK FOR MATCH
        !          10188:        PPM  SLOD4            JUMP IF MATCH
        !          10189: .FI
        !          10190:        ZER  WB               ELSE GET CODE FOR NO CONVERT
        !          10191: *
        !          10192: *      MERGE HERE WITH PROPER DATATYPE CODE IN WB
        !          10193: *
        !          10194: SLOD4  MOV  WB,(XS)          STORE CODE ON STACK
        !          10195:        BEQ  WA,=NUM02,SLOD2  LOOP BACK IF ARG STOPPED BY COMMA
        !          10196:        BZE  WA,SLOD5         JUMP IF THAT WAS THE RESULT TYPE
        !          10197: *
        !          10198: *      HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
        !          10199: *
        !          10200:        MOV  MXLEN,WC         SET DUMMY (IMPOSSIBLE) DELIMITER 1
        !          10201:        MOV  WC,XL            AND DELIMITER TWO
        !          10202:        JSR  XSCAN            SCAN RESULT NAME
        !          10203:        ZER  WA               SET CODE FOR PROCESSING RESULT
        !          10204:        BRN  SLOD3            JUMP BACK TO PROCESS RESULT NAME
        !          10205:        EJC
        !          10206: *
        !          10207: *      LOAD (CONTINUED)
        !          10208: *
        !          10209: *      HERE AFTER PROCESSING ALL ARGS AND RESULT
        !          10210: *
        !          10211: SLOD5  MOV  LODNA,WA         GET NUMBER OF ARGUMENTS
        !          10212:        MOV  WA,WC            COPY FOR LATER
        !          10213:        WTB  WA               CONVERT LENGTH TO BAUS
        !          10214:        ADD  *EFSI$,WA        ADD SPACE FOR STANDARD FIELDS
        !          10215:        JSR  ALLOC            ALLOCATE EFBLK
        !          10216:        MOV  =B$EFC,(XR)      SET TYPE WORD
        !          10217:        MOV  WC,FARGS(XR)     SET NUMBER OF ARGUMENTS
        !          10218:        ZER  EFUSE(XR)        SET USE COUNT (DFFNC WILL SET TO 1)
        !          10219:        ZER  EFCOD(XR)        ZERO CODE POINTER FOR NOW
        !          10220:        MOV  (XS)+,EFRSL(XR)  STORE RESULT TYPE CODE
        !          10221:        MOV  LODFN,EFVAR(XR)  STORE FUNCTION VRBLK POINTER
        !          10222:        MOV  WA,EFLEN(XR)     STORE EFBLK LENGTH
        !          10223:        MOV  XR,WB            SAVE EFBLK POINTER
        !          10224:        ADD  WA,XR            POINT PAST END OF EFBLK
        !          10225:        LCT  WC,WC            SET NUMBER OF ARGUMENTS FOR LOOP
        !          10226: *
        !          10227: *      LOOP TO SET ARGUMENT TYPE CODES FROM STACK
        !          10228: *
        !          10229: SLOD6  MOV  (XS)+,-(XR)      STORE ONE TYPE CODE FROM STACK
        !          10230:        BCT  WC,SLOD6         LOOP TILL ALL STORED
        !          10231: *
        !          10232: *      NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
        !          10233: *
        !          10234:        MOV  (XS)+,XR         LOAD FUNCTION STRING NAME
        !          10235:        MOV  (XS),XL          LOAD LIBRARY NAME
        !          10236:        MOV  WB,(XS)          STORE EFBLK POINTER
        !          10237:        JSR  SYSLD            CALL FUNCTION TO LOAD EXTERNAL FUNC
        !          10238:        PPM  EXFAL            FAIL RETURN
        !          10239:        PPM  EROSI            ERROR RETURN
        !          10240:        MOV  (XS)+,XL         RECALL EFBLK POINTER
        !          10241:        MOV  XR,EFCOD(XL)     STORE CODE POINTER
        !          10242:        MOV  LODFN,XR         POINT TO VRBLK FOR FUNCTION
        !          10243:        JSR  DFFNC            PERFORM FUNCTION DEFINITION
        !          10244:        BRN  EXNUL            RETURN NULL RESULT
        !          10245: .FI
        !          10246:        EJC
        !          10247: *
        !          10248: *      LOCAL
        !          10249: *
        !          10250: S$LOC  ENT                   ENTRY POINT
        !          10251:        JSR  GTSMI            GET SECOND ARGUMENT (LOCAL NUMBER)
        !          10252:        ERR  256,LOCAL SECOND ARGUMENT IS NOT INTEGER
        !          10253:        PPM  EXFAL            FAIL IF OUT OF RANGE
        !          10254:        MOV  XR,WB            SAVE LOCAL NUMBER
        !          10255:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
        !          10256:        JSR  GTNVR            POINT TO VRBLK
        !          10257:        PPM  SLOC1            JUMP IF NOT VARIABLE NAME
        !          10258:        MOV  VRFNC(XR),XR     ELSE LOAD FUNCTION POINTER
        !          10259:        BNE  (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED
        !          10260: *
        !          10261: *      HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
        !          10262: *
        !          10263:        BZE  WB,EXFAL         FAIL IF SECOND ARG IS ZERO
        !          10264:        BGT  WB,PFNLO(XR),EXFAL OR TOO LARGE
        !          10265:        ADD  FARGS(XR),WB     ELSE ADJUST OFFSET TO INCLUDE ARGS
        !          10266:        WTB  WB               CONVERT TO BYTES
        !          10267:        ADD  WB,XR            POINT TO LOCAL POINTER
        !          10268:        MOV  PFAGB(XR),XR     LOAD VRBLK POINTER
        !          10269:        BRN  EXVNM            EXIT BUILDING NMBLK
        !          10270: *
        !          10271: *      HERE IF FIRST ARGUMENT IS NO GOOD
        !          10272: *
        !          10273: SLOC1  ERB  257,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME
        !          10274:        EJC
        !          10275: *
        !          10276: *      LPAD
        !          10277: *
        !          10278: S$LPD  ENT                   ENTRY POINT
        !          10279:        JSR  GTSTG            GET PAD CHARACTER
        !          10280:        ERR  148,LPAD THIRD ARGUMENT NOT A STRING
        !          10281:        PLC  XR               POINT TO CHARACTER (NULL IS BLANK)
        !          10282:        LCH  WB,(XR)          LOAD PAD CHARACTER
        !          10283:        JSR  GTSMI            GET PAD LENGTH
        !          10284:        ERR  149,LPAD SECOND ARGUMENT IS NOT INTEGER
        !          10285:        PPM  SLPD3            SKIP IF NEGATIVE OR LARGE
        !          10286: *
        !          10287: *      MERGE TO CHECK FIRST ARG
        !          10288: *
        !          10289: SLPD1  JSR  GTSTG            GET FIRST ARGUMENT (STRING TO PAD)
        !          10290:        ERR  150,LPAD FIRST ARGUMENT IS NOT STRING
        !          10291:        BGE  WA,WC,EXIXR      RETURN 1ST ARG IF TOO LONG TO PAD
        !          10292:        MOV  XR,XL            ELSE MOVE PTR TO STRING TO PAD
        !          10293: *
        !          10294: *      NOW WE ARE READY FOR THE PAD
        !          10295: *
        !          10296: *      (XL)                  POINTER TO STRING TO PAD
        !          10297: *      (WB)                  PAD CHARACTER
        !          10298: *      (WC)                  LENGTH TO PAD STRING TO
        !          10299: *
        !          10300:        MOV  WC,WA            COPY LENGTH
        !          10301:        JSR  ALOCS            ALLOCATE SCBLK FOR NEW STRING
        !          10302:        MOV  XR,-(XS)         SAVE AS RESULT
        !          10303:        MOV  SCLEN(XL),WA     LOAD LENGTH OF ARGUMENT
        !          10304:        SUB  WA,WC            CALCULATE NUMBER OF PAD CHARACTERS
        !          10305:        PSC  XR               POINT TO CHARS IN RESULT STRING
        !          10306:        LCT  WC,WC            SET COUNTER FOR PAD LOOP
        !          10307: *
        !          10308: *      LOOP TO PERFORM PAD
        !          10309: *
        !          10310: SLPD2  SCH  WB,(XR)+         STORE PAD CHARACTER, BUMP PTR
        !          10311:        BCT  WC,SLPD2         LOOP TILL ALL PAD CHARS STORED
        !          10312:        CSC  XR               COMPLETE STORE CHARACTERS
        !          10313: *
        !          10314: *      NOW COPY STRING
        !          10315: *
        !          10316:        BZE  WA,EXITS         EXIT IF NULL STRING
        !          10317:        PLC  XL               ELSE POINT TO CHARS IN ARGUMENT
        !          10318:        MVC                   MOVE CHARACTERS TO RESULT STRING
        !          10319:        BRN  EXITS            JUMP FOR NEXT CODE WORD
        !          10320: *
        !          10321: *      HERE IF 2ND ARG IS NEGATIVE OR LARGE
        !          10322: *
        !          10323: SLPD3  ZER  WC               ZERO PAD COUNT
        !          10324:        BRN  SLPD1            MERGE
        !          10325:        EJC
        !          10326: *
        !          10327: *      LT
        !          10328: *
        !          10329: S$LTF  ENT                   ENTRY POINT
        !          10330:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
        !          10331:        ERR  151,LT FIRST ARGUMENT IS NOT NUMERIC
        !          10332:        ERR  152,LT SECOND ARGUMENT IS NOT NUMERIC
        !          10333:        PPM  EXNUL            RETURN NULL IF LT
        !          10334:        PPM  EXFAL            FAIL IF EQ
        !          10335:        PPM  EXFAL            FAIL IF GT
        !          10336:        EJC
        !          10337: *
        !          10338: *      NE
        !          10339: *
        !          10340: S$NEF  ENT                   ENTRY POINT
        !          10341:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
        !          10342:        ERR  153,NE FIRST ARGUMENT IS NOT NUMERIC
        !          10343:        ERR  154,NE SECOND ARGUMENT IS NOT NUMERIC
        !          10344:        PPM  EXNUL            RETURN NULL IF LT
        !          10345:        PPM  EXFAL            FAIL IF EQ
        !          10346:        PPM  EXNUL            RETURN NULL IF GT
        !          10347:        EJC
        !          10348: *
        !          10349: *      NOTANY
        !          10350: *
        !          10351: S$NAY  ENT                   ENTRY POINT
        !          10352:        MOV  =P$NAS,WB        SET PCODE FOR SINGLE CHAR ARG
        !          10353:        MOV  =P$NAY,XL        PCODE FOR MULTI-CHAR ARG
        !          10354:        MOV  =P$NAD,WC        SET PCODE FOR EXPR ARG
        !          10355:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
        !          10356:        ERR  155,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION
        !          10357:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          10358:        EJC
        !          10359: *
        !          10360: *      OPSYN
        !          10361: *
        !          10362: S$OPS  ENT                   ENTRY POINT
        !          10363:        JSR  GTSMI            LOAD THIRD ARGUMENT
        !          10364:        ERR  156,OPSYN THIRD ARGUMENT IS NOT INTEGER
        !          10365:        ERR  157,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
        !          10366:        MOV  WC,WB            IF OK, SAVE THIRD ARGUMNET
        !          10367:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
        !          10368:        JSR  GTNVR            LOCATE VARIABLE BLOCK
        !          10369:        ERR  158,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME
        !          10370:        MOV  VRFNC(XR),XL     IF OK, LOAD FUNCTION BLOCK POINTER
        !          10371:        BNZ  WB,SOPS2         JUMP IF OPERATOR OPSYN CASE
        !          10372: *
        !          10373: *      HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
        !          10374: *
        !          10375:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
        !          10376:        JSR  GTNVR            GET VRBLK POINTER
        !          10377:        ERR  159,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME
        !          10378: *
        !          10379: *      MERGE HERE TO PERFORM FUNCTION DEFINITION
        !          10380: *
        !          10381: SOPS1  JSR  DFFNC            CALL FUNCTION DEFINER
        !          10382:        BRN  EXNUL            EXIT WITH NULL RESULT
        !          10383: *
        !          10384: *      HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
        !          10385: *
        !          10386: SOPS2  JSR  GTSTG            GET OPERATOR NAME
        !          10387:        PPM  SOPS5            JUMP IF NOT STRING
        !          10388:        BNE  WA,=NUM01,SOPS5  ERROR IF NOT ONE CHAR LONG
        !          10389:        PLC  XR               ELSE POINT TO CHARACTER
        !          10390:        LCH  WC,(XR)          LOAD CHARACTER NAME
        !          10391:        EJC
        !          10392: *
        !          10393: *      OPSYN (CONTINUED)
        !          10394: *
        !          10395: *      NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
        !          10396: *      NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
        !          10397: *      BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
        !          10398: *
        !          10399:        MOV  =R$UUB,WA        POINT TO UNOP POINTERS IN CASE
        !          10400:        MOV  =OPNSU,XR        POINT TO NAMES OF UNARY OPERATORS
        !          10401:        ADD  =OPBUN,WB        ADD NO. OF UNDEFINED BINARY OPS
        !          10402:        BEQ  WB,=OPUUN,SOPS3  JUMP IF UNOP (THIRD ARG WAS 1)
        !          10403:        MOV  =R$UBA,WA        ELSE POINT TO BINARY OPERATOR PTRS
        !          10404:        MOV  =OPSNB,XR        POINT TO NAMES OF BINARY OPERATORS
        !          10405:        MOV  =OPBUN,WB        SET NUMBER OF UNDEFINED BINOPS
        !          10406: *
        !          10407: *      MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
        !          10408: *
        !          10409: SOPS3  LCT  WB,WB            SET COUNTER TO CONTROL LOOP
        !          10410: *
        !          10411: *      LOOP TO SEARCH FOR NAME MATCH
        !          10412: *
        !          10413: SOPS4  BEQ  WC,(XR),SOPS6    JUMP IF NAMES MATCH
        !          10414:        ICA  WA               ELSE PUSH POINTER TO FUNCTION PTR
        !          10415:        ICA  XR               BUMP POINTER
        !          10416:        BCT  WB,SOPS4         LOOP BACK TILL ALL CHECKED
        !          10417: *
        !          10418: *      HERE IF BAD OPERATOR NAME
        !          10419: *
        !          10420: SOPS5  ERB  160,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME
        !          10421: *
        !          10422: *      COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
        !          10423: *
        !          10424: SOPS6  MOV  WA,XR            COPY POINTER TO FUNCTION BLOCK PTR
        !          10425:        SUB  *VRFNC,XR        MAKE IT LOOK LIKE DUMMY VRBLK
        !          10426:        BRN  SOPS1            MERGE BACK TO DEFINE OPERATOR
        !          10427:        EJC
        !          10428: *
        !          10429: *      OUTPUT
        !          10430: *
        !          10431: S$OUP  ENT                   ENTRY POINT
        !          10432:        MOV  =NUM02,WB        OUTPUT FLAG
        !          10433:        JSR  IOPUT            CALL INPUT/OUTPUT ASSOC. ROUTINE
        !          10434:        ERR  161,OUTPUT THIRD ARGUMENT (FILEPROPS) IS NOT A STRING
        !          10435:        ERR  162,INAPPROPRIATE SECOND ARGUMENT (FILETAG) FOR OUTPUT
        !          10436:        ERR  163,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT
        !          10437:        PPM  EXFAL            FAIL RETURN
        !          10438:        BRN  EXNUL            RETURN NULL STRING
        !          10439:        EJC
        !          10440: *
        !          10441: *      POS
        !          10442: *
        !          10443: S$POS  ENT                   ENTRY POINT
        !          10444:        MOV  =P$POS,WB        SET PCODE FOR INTEGER ARG CASE
        !          10445:        MOV  =P$PSD,WA        SET PCODE FOR EXPRESSION ARG CASE
        !          10446:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
        !          10447:        ERR  164,POS ARGUMENT IS NOT INTEGER OR EXPRESSION
        !          10448:        ERR  165,POS ARGUMENT IS NEGATIVE OR TOO LARGE
        !          10449:        BRN  EXIXR            RETURN PATTERN NODE
        !          10450:        EJC
        !          10451: *
        !          10452: *      PROTOTYPE
        !          10453: *
        !          10454: S$PRO  ENT                   ENTRY POINT
        !          10455:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          10456:        MOV  TBLEN(XR),WB     LENGTH IF TABLE, VECTOR (=VCLEN)
        !          10457:        BTW  WB               CONVERT TO WORDS
        !          10458:        MOV  (XR),WA          LOAD TYPE WORD OF ARGUMENT BLOCK
        !          10459:        BEQ  WA,=B$ART,SPRO4  JUMP IF ARRAY
        !          10460:        BEQ  WA,=B$TBT,SPRO1  JUMP IF TABLE
        !          10461:        BEQ  WA,=B$VCT,SPRO3  JUMP IF VECTOR
        !          10462: .IF    .CNBF
        !          10463: .ELSE
        !          10464:        BEQ  WA,=B$BCT,SPR05  JUMP IF BUFFER
        !          10465: .FI
        !          10466:        ERB  166,PROTOTYPE ARGUMENT IS NOT TABLE OR ARRAY
        !          10467: *
        !          10468: *      HERE FOR TABLE
        !          10469: *
        !          10470: SPRO1  SUB  =TBSI$,WB        SUBTRACT STANDARD FIELDS
        !          10471: *
        !          10472: *      MERGE FOR VECTOR
        !          10473: *
        !          10474: SPRO2  MTI  WB               CONVERT TO INTEGER
        !          10475:        BRN  EXINT            EXIT WITH INTEGER RESULT
        !          10476: *
        !          10477: *      HERE FOR VECTOR
        !          10478: *
        !          10479: SPRO3  SUB  =VCSI$,WB        SUBTRACT STANDARD FIELDS
        !          10480:        BRN  SPRO2            MERGE
        !          10481: *
        !          10482: *      HERE FOR ARRAY
        !          10483: *
        !          10484: SPRO4  ADD  AROFS(XR),XR     POINT TO PROTOTYPE FIELD
        !          10485:        MOV  (XR),XR          LOAD PROTOTYPE
        !          10486:        BRN  EXIXR            RETURN PROTOTYPE AS RESULT
        !          10487: .IF    .CNBF
        !          10488: .ELSE
        !          10489: *
        !          10490: *      HERE FOR BUFFER
        !          10491: *
        !          10492: SPR05  MOV  BCBUF(XR),XR     POINT TO BFBLK
        !          10493:        MTI  BFALC(XR)        LOAD ALLOCATED LENGTH
        !          10494:        BRN  EXINT            EXIT WITH INTEGER ALLOCATION
        !          10495: .FI
        !          10496:        EJC
        !          10497: *
        !          10498: *      REMDR
        !          10499: *
        !          10500: S$RMD  ENT                   ENTRY POINT
        !          10501:        ZER  WB               SET POSITIVE FLAG
        !          10502:        MOV  (XS),XR          LOAD SECOND ARGUMENT
        !          10503:        JSR  GTINT            CONVERT TO INTEGER
        !          10504:        ERR  167,REMDR SECOND ARGUMENT IS NOT INTEGER
        !          10505:        JSR  ARITH            CONVERT ARGS
        !          10506:        PPM  SRM01            FIRST ARG NOT INTEGER
        !          10507:        PPM                   SECOND ARG CHECKED ABOVE
        !          10508: .IF    .CNRA
        !          10509: .ELSE
        !          10510:        PPM  SRM01            FIRST ARG REAL
        !          10511: .FI
        !          10512:        LDI  ICVAL(XR)        LOAD LEFT ARGUMENT VALUE
        !          10513:        RMI  ICVAL(XL)        GET REMAINDER
        !          10514:        INO  EXINT            JUMP IF NO OVERFLOW
        !          10515:        ERB  168,REMDR CAUSED INTEGER OVERFLOW
        !          10516: *
        !          10517: *      FAIL FIRST ARGUMENT
        !          10518: *
        !          10519: SRM01  ERB  169,REMDR FIRST ARGUMENT IS NOT INTEGER
        !          10520:        EJC
        !          10521: *
        !          10522: *      REPLACE
        !          10523: *
        !          10524: *      THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
        !          10525: *      CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
        !          10526: *      THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
        !          10527: *      THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
        !          10528: *
        !          10529: S$RPL  ENT                   ENTRY POINT
        !          10530:        JSR  GTSTG            LOAD THIRD ARGUMENT AS STRING
        !          10531:        ERR  170,REPLACE THIRD ARGUMENT IS NOT STRING
        !          10532:        MOV  XR,XL            SAVE THIRD ARG PTR
        !          10533:        JSR  GTSTG            GET SECOND ARGUMENT
        !          10534:        ERR  171,REPLACE SECOND ARGUMENT IS NOT STRING
        !          10535: *
        !          10536: *      CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
        !          10537: *
        !          10538:        BNE  XR,R$RA2,SRPL1   JUMP IF 2ND ARGUMENT DIFFERENT
        !          10539:        BEQ  XL,R$RA3,SRPL4   JUMP IF ARGS SAME AS LAST TIME
        !          10540: *
        !          10541: *      HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
        !          10542: *
        !          10543: SRPL1  MOV  SCLEN(XL),WB     LOAD 3RD ARGUMENT LENGTH
        !          10544:        BNE  WA,WB,SRPL5      JUMP IF ARGUMENTS NOT SAME LENGTH
        !          10545:        BZE  WB,SRPL5         JUMP IF NULL 2ND ARGUMENT
        !          10546:        MOV  XL,R$RA3         SAVE THIRD ARG FOR NEXT TIME IN
        !          10547:        MOV  XR,R$RA2         SAVE SECOND ARG FOR NEXT TIME IN
        !          10548:        MOV  KVALP,XL         POINT TO ALPHABET STRING
        !          10549:        MOV  SCLEN(XL),WA     LOAD ALPHABET SCBLK LENGTH
        !          10550:        MOV  R$RPT,XR         POINT TO CURRENT TABLE (IF ANY)
        !          10551:        BNZ  XR,SRPL2         JUMP IF WE ALREADY HAVE A TABLE
        !          10552: *
        !          10553: *      HERE WE ALLOCATE A NEW TABLE
        !          10554: *
        !          10555:        JSR  ALOCS            ALLOCATE NEW TABLE
        !          10556:        MOV  WC,WA            KEEP SCBLK LENGTH
        !          10557:        MOV  XR,R$RPT         SAVE TABLE POINTER FOR NEXT TIME
        !          10558: *
        !          10559: *      MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
        !          10560: *
        !          10561: SRPL2  CTB  WA,SCSI$         COMPUTE LENGTH OF SCBLK
        !          10562:        MVW                   COPY TO GET INITIAL TABLE VALUES
        !          10563:        EJC
        !          10564: *
        !          10565: *      REPLACE (CONTINUED)
        !          10566: *
        !          10567: *      NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
        !          10568: *      WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
        !          10569: *      HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
        !          10570: *
        !          10571:        MOV  R$RA2,XL         POINT TO SECOND ARGUMENT
        !          10572:        LCT  WB,WB            NUMBER OF CHARS TO PLUG
        !          10573:        ZER  WC               ZERO CHAR OFFSET
        !          10574:        MOV  R$RA3,XR         POINT TO 3RD ARG
        !          10575:        PLC  XR               GET CHAR PTR FOR 3RD ARG
        !          10576: *
        !          10577: *      LOOP TO PLUG CHARS
        !          10578: *
        !          10579: SRPL3  MOV  R$RA2,XL         POINT TO 2ND ARG
        !          10580:        PLC  XL,WC            POINT TO NEXT CHAR
        !          10581:        ICV  WC               INCREMENT OFFSET
        !          10582:        LCH  WA,(XL)          GET NEXT CHAR
        !          10583:        MOV  R$RPT,XL         POINT TO TRANSLATE TABLE
        !          10584:        PSC  XL,WA            CONVERT CHAR TO OFFSET INTO TABLE
        !          10585:        LCH  WA,(XR)+         GET TRANSLATED CHAR
        !          10586:        SCH  WA,(XL)          STORE IN TABLE
        !          10587:        CSC  XL               COMPLETE STORE CHARACTERS
        !          10588:        BCT  WB,SRPL3         LOOP TILL DONE
        !          10589:        EJC
        !          10590: *
        !          10591: *      REPLACE (CONTINUED)
        !          10592: *
        !          10593: *      HERE TO PERFORM TRANSLATE
        !          10594: *
        !          10595: SRPL4  JSR  GTSTG            GET FIRST ARGUMENT
        !          10596:        ERR  172,REPLACE FIRST ARGUMENT IS NOT STRING
        !          10597:        BZE  WA,EXNUL         RETURN NULL IF NULL ARGUMENT
        !          10598:        MOV  XR,XL            COPY POINTER
        !          10599:        MOV  WA,WC            SAVE LENGTH
        !          10600:        CTB  WA,SCHAR         GET SCBLK LENGTH
        !          10601:        JSR  ALLOC            ALLOCATE SPACE FOR COPY
        !          10602:        MOV  XR,WB            SAVE ADDRESS OF COPY
        !          10603:        MVW                   MOVE SCBLK CONTENTS TO COPY
        !          10604:        MOV  R$RPT,XR         POINT TO REPLACE TABLE
        !          10605:        PLC  XR               POINT TO CHARS OF TABLE
        !          10606:        MOV  WB,XL            POINT TO STRING TO TRANSLATE
        !          10607:        PLC  XL               POINT TO CHARS OF STRING
        !          10608:        MOV  WC,WA            SET NUMBER OF CHARS TO TRANSLATE
        !          10609:        TRC                   PERFORM TRANSLATION
        !          10610:        MOV  WB,-(XS)         STACK NEW STRING AS RESULT
        !          10611:        BRN  EXITS            RETURN WITH RESULT ON STACK
        !          10612: *
        !          10613: *      ERROR POINT
        !          10614: *
        !          10615: SRPL5  ERB  173,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
        !          10616:        EJC
        !          10617: *
        !          10618: *      REVERSE
        !          10619: *
        !          10620: S$RVS  ENT                   ENTRY POINT
        !          10621:        JSR  GTSTG            LOAD STRING ARGUMENT
        !          10622:        ERR  174,REVERSE ARGUMENT IS NOT STRING
        !          10623:        BZE  WA,EXIXR         RETURN ARGUMENT IF NULL
        !          10624:        MOV  XR,XL            ELSE SAVE POINTER TO STRING ARG
        !          10625:        JSR  ALOCS            ALLOCATE SPACE FOR NEW SCBLK
        !          10626:        MOV  XR,-(XS)         STORE SCBLK PTR ON STACK AS RESULT
        !          10627:        PSC  XR               PREPARE TO STORE IN NEW SCBLK
        !          10628:        PLC  XL,WC            POINT PAST LAST CHAR IN ARGUMENT
        !          10629:        LCT  WC,WC            SET LOOP COUNTER
        !          10630: *
        !          10631: *      LOOP TO MOVE CHARS IN REVERSE ORDER
        !          10632: *
        !          10633: SRVS1  LCH  WB,-(XL)         LOAD NEXT CHAR FROM ARGUMENT
        !          10634:        SCH  WB,(XR)+         STORE IN RESULT
        !          10635:        BCT  WC,SRVS1         LOOP TILL ALL MOVED
        !          10636:        CSC  XR               COMPLETE STORE CHARACTERS
        !          10637:        BRN  EXITS            AND THEN JUMP FOR NEXT CODE WORD
        !          10638:        EJC
        !          10639: *
        !          10640: *      RPAD
        !          10641: *
        !          10642: S$RPD  ENT                   ENTRY POINT
        !          10643:        JSR  GTSTG            GET PAD CHARACTER
        !          10644:        ERR  175,RPAD THIRD ARGUMENT IS NOT STRING
        !          10645:        PLC  XR               POINT TO CHARACTER (NULL IS BLANK)
        !          10646:        LCH  WB,(XR)          LOAD PAD CHARACTER
        !          10647:        JSR  GTSMI            GET PAD LENGTH
        !          10648:        ERR  176,RPAD SECOND ARGUMENT IS NOT INTEGER
        !          10649:        PPM  SRPD3            SKIP IF NEGATIVE OR LARGE
        !          10650: *
        !          10651: *      MERGE TO CHECK FIRST ARG.
        !          10652: *
        !          10653: SRPD1  JSR  GTSTG            GET FIRST ARGUMENT (STRING TO PAD)
        !          10654:        ERR  177,RPAD FIRST ARGUMENT IS NOT STRING
        !          10655:        BGE  WA,WC,EXIXR      RETURN 1ST ARG IF TOO LONG TO PAD
        !          10656:        MOV  XR,XL            ELSE MOVE PTR TO STRING TO PAD
        !          10657: *
        !          10658: *      NOW WE ARE READY FOR THE PAD
        !          10659: *
        !          10660: *      (XL)                  POINTER TO STRING TO PAD
        !          10661: *      (WB)                  PAD CHARACTER
        !          10662: *      (WC)                  LENGTH TO PAD STRING TO
        !          10663: *
        !          10664:        MOV  WC,WA            COPY LENGTH
        !          10665:        JSR  ALOCS            ALLOCATE SCBLK FOR NEW STRING
        !          10666:        MOV  XR,-(XS)         SAVE AS RESULT
        !          10667:        MOV  SCLEN(XL),WA     LOAD LENGTH OF ARGUMENT
        !          10668:        SUB  WA,WC            CALCULATE NUMBER OF PAD CHARACTERS
        !          10669:        PSC  XR               POINT TO CHARS IN RESULT STRING
        !          10670:        LCT  WC,WC            SET COUNTER FOR PAD LOOP
        !          10671: *
        !          10672: *      COPY ARGUMENT STRING
        !          10673: *
        !          10674:        BZE  WA,SRPD2         JUMP IF ARGUMENT IS NULL
        !          10675:        PLC  XL               ELSE POINT TO ARGUMENT CHARS
        !          10676:        MVC                   MOVE CHARACTERS TO RESULT STRING
        !          10677: *
        !          10678: *      LOOP TO SUPPLY PAD CHARACTERS
        !          10679: *
        !          10680: SRPD2  SCH  WB,(XR)+         STORE PAD CHARACTER, BUMP PTR
        !          10681:        BCT  WC,SRPD2         LOOP TILL ALL PAD CHARS STORED
        !          10682:        CSC  XR               COMPLETE CHARACTER STORING
        !          10683:        BRN  EXITS            AND EXIT FOR NEXT WORD
        !          10684: *
        !          10685: *      HERE IF 2ND ARG IS NEGATIVE OR LARGE
        !          10686: *
        !          10687: SRPD3  ZER  WC               ZERO PAD COUNT
        !          10688:        BRN  SRPD1            MERGE
        !          10689:        EJC
        !          10690: *
        !          10691: *      RTAB
        !          10692: *
        !          10693: S$RTB  ENT                   ENTRY POINT
        !          10694:        MOV  =P$RTB,WB        SET PCODE FOR INTEGER ARG CASE
        !          10695:        MOV  =P$RTD,WA        SET PCODE FOR EXPRESSION ARG CASE
        !          10696:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
        !          10697:        ERR  178,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION
        !          10698:        ERR  179,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE
        !          10699:        BRN  EXIXR            RETURN PATTERN NODE
        !          10700:        EJC
        !          10701: .IF    .CUST
        !          10702: *
        !          10703: *      SET
        !          10704: *
        !          10705: S$SET  ENT                   ENTRY POINT
        !          10706:        MOV  (XS)+,R$IOL      SAVE THIRD ARG
        !          10707:        MOV  (XS)+,R$IO1      SAVE SECOND ARG
        !          10708:        JSR  IOFTG            CALL IOTAG ROUTINE
        !          10709:        ERR  180,SET FIRST ARGUMENT IS NOT A SUITABLE NAME
        !          10710:        BZE  WA,EXFAL         FAIL IF NO IOTAG
        !          10711:        MOV  R$IO1,WB         LOAD SECOND ARG
        !          10712:        MOV  R$IOL,WC         LOAD THIRD ARG
        !          10713:        JSR  SYSST            CALL SYSTEM SET ROUTINE
        !          10714:        PPM  EXFAL            FAILURE RETURN
        !          10715:        PPM  EROSI            ERROR RETURN
        !          10716:        BRN  EXNUL            OTHERWISE RETURN NULL
        !          10717:        EJC
        !          10718: .FI
        !          10719: *
        !          10720: *      RPOS
        !          10721: *
        !          10722: S$RPS  ENT                   ENTRY POINT
        !          10723:        MOV  =P$RPS,WB        SET PCODE FOR INTEGER ARG CASE
        !          10724:        MOV  =P$RPD,WA        SET PCODE FOR EXPRESSION ARG CASE
        !          10725:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
        !          10726:        ERR  181,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION
        !          10727:        ERR  182,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE
        !          10728:        BRN  EXIXR            RETURN PATTERN NODE
        !          10729: .IF    .CNSR
        !          10730: .ELSE
        !          10731:        EJC
        !          10732: *
        !          10733: *      RSORT
        !          10734: *
        !          10735: S$RSR  ENT                   ENTRY POINT
        !          10736:        MNZ  WA               MARK AS RSORT
        !          10737:        JSR  SORTA            CALL SORT ROUTINE
        !          10738:        PPM  EXFAL            FAIL EMPTY TABLE
        !          10739:        BRN  EXSID            RETURN, SETTING IDVAL
        !          10740: .FI
        !          10741:        EJC
        !          10742: *
        !          10743: *      SETEXIT
        !          10744: *
        !          10745: S$STX  ENT                   ENTRY POINT
        !          10746:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          10747:        MOV  STXVR,WA         LOAD OLD VRBLK POINTER
        !          10748:        ZER  XL               LOAD ZERO IN CASE NULL ARG
        !          10749:        BEQ  XR,=NULLS,SSTX1  JUMP IF NULL ARGUMENT (RESET CALL)
        !          10750:        JSR  GTNVR            ELSE GET SPECIFIED VRBLK
        !          10751:        PPM  SSTX2            JUMP IF NOT NATURAL VARIABLE
        !          10752:        MOV  VRLBL(XR),XL     ELSE LOAD LABEL
        !          10753:        BEQ  XL,=STNDL,SSTX2  JUMP IF LABEL IS NOT DEFINED
        !          10754:        BNE  (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED
        !          10755:        MOV  TRLBL(XL),XL     ELSE LOAD PTR TO REAL LABEL CODE
        !          10756: *
        !          10757: *      HERE TO SET/RESET SETEXIT TRAP
        !          10758: *
        !          10759: SSTX1  MOV  XR,STXVR         STORE NEW VRBLK POINTER (OR NULL)
        !          10760:        MOV  XL,R$SXC         STORE NEW CODE PTR (OR ZERO)
        !          10761:        BEQ  WA,=NULLS,EXNUL  RETURN NULL IF NULL RESULT
        !          10762:        MOV  WA,XR            ELSE COPY VRBLK POINTER
        !          10763:        BRN  EXVNM            AND RETURN BUILDING NMBLK
        !          10764: *
        !          10765: *      HERE IF BAD ARGUMENT
        !          10766: *
        !          10767: SSTX2  ERB  183,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL
        !          10768: .IF    .CNSR
        !          10769: .ELSE
        !          10770:        EJC
        !          10771: *
        !          10772: *      SORT
        !          10773: *
        !          10774: S$SRT  ENT                   ENTRY POINT
        !          10775:        ZER  WA               MARK AS SORT
        !          10776:        JSR  SORTA            CALL SORT ROUTINE
        !          10777:        PPM  EXFAL            FAIL EMPTY TABLE
        !          10778:        BRN  EXSID            RETURN, SETTING IDVAL
        !          10779: .FI
        !          10780:        EJC
        !          10781: *
        !          10782: *      SPAN
        !          10783: *
        !          10784: S$SPN  ENT                   ENTRY POINT
        !          10785:        MOV  =P$SPS,WB        SET PCODE FOR SINGLE CHAR ARG
        !          10786:        MOV  =P$SPN,XL        SET PCODE FOR MULTI-CHAR ARG
        !          10787:        MOV  =P$SPD,WC        SET PCODE FOR EXPRESSION ARG
        !          10788:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
        !          10789:        ERR  184,SPAN ARGUMENT IS NOT STRING OR EXPRESSION
        !          10790:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
        !          10791:        EJC
        !          10792: *
        !          10793: *      SIZE
        !          10794: *
        !          10795: S$SI$  ENT                   ENTRY POINT
        !          10796: .IF    .CNBF
        !          10797:        JSR  GTSTG            LOAD STRING ARGUMENT
        !          10798: .ELSE
        !          10799:        MOV  (XS),XR          LOAD ARGUMENT
        !          10800:        BNE  (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER
        !          10801:        ICA  XS               ELSE POP ARGUMENT
        !          10802:        MTI  BCLEN(XR)        LOAD DEFINED LENGTH
        !          10803:        BRN  EXINT            EXIT WITH INTEGER
        !          10804: *
        !          10805: *      HERE IF NOT BUFFER
        !          10806: *
        !          10807: SSI$1  JSR  GTSTG            LOAD STRING ARGUMENT
        !          10808: .FI
        !          10809:        ERR  185,SIZE ARGUMENT IS NOT STRING
        !          10810:        MTI  WA               LOAD LENGTH AS INTEGER
        !          10811:        BRN  EXINT            EXIT WITH INTEGER RESULT
        !          10812:        EJC
        !          10813: *
        !          10814: *      STOPTR
        !          10815: *
        !          10816: S$STT  ENT                   ENTRY POINT
        !          10817:        ZER  XL               INDICATE STOPTR CASE
        !          10818:        JSR  TRACE            CALL TRACE PROCEDURE
        !          10819:        ERR  186,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME
        !          10820:        ERR  187,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE
        !          10821:        PPM  EXFAL            FAIL RETURN
        !          10822:        BRN  EXNUL            RETURN NULL
        !          10823:        EJC
        !          10824: *
        !          10825: *      SUBSTR
        !          10826: *
        !          10827: S$SUB  ENT                   ENTRY POINT
        !          10828:        JSR  GTSMI            LOAD THIRD ARGUMENT
        !          10829:        ERR  188,SUBSTR THIRD ARGUMENT IS NOT INTEGER
        !          10830:        PPM  EXFAL            JUMP IF NEGATIVE OR TOO LARGE
        !          10831:        MOV  XR,SBSSV         SAVE THIRD ARGUMENT
        !          10832:        JSR  GTSMI            LOAD SECOND ARGUMENT
        !          10833:        ERR  189,SUBSTR SECOND ARGUMENT IS NOT INTEGER
        !          10834:        PPM  EXFAL            JUMP IF OUT OF RANGE
        !          10835:        MOV  XR,WB            SAVE SECOND ARGUMENT
        !          10836:        BZE  WB,EXFAL         JUMP IF SECOND ARGUMENT ZERO
        !          10837:        DCV  WB               ELSE DECREMENT FOR ONES ORIGIN
        !          10838: .IF    .CNBF
        !          10839:        JSR  GTSTG            LOAD FIRST ARGUMENT
        !          10840: .ELSE
        !          10841:        MOV  (XS),XL          GET FIRST ARG PTR
        !          10842:        BNE  (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER
        !          10843:        MOV  BCBUF(XL),XR     GET BFBLK PTR
        !          10844:        MOV  BCLEN(XL),WA     GET LENGTH
        !          10845:        BRN  SSUBB            MERGE
        !          10846: *
        !          10847: *      HERE IF NOT BUFFER TO GET STRING
        !          10848: *
        !          10849: SSUBA  JSR  GTSTG            LOAD FIRST ARGUMENT
        !          10850: .FI
        !          10851:        ERR  190,SUBSTR FIRST ARGUMENT IS NOT STRING
        !          10852:        MOV  XR,XL            COPY POINTER TO FIRST ARG
        !          10853: .IF    .CNBF
        !          10854:        MOV  SBSSV,WC         RELOAD THIRD ARGUMENT
        !          10855: .ELSE
        !          10856: *
        !          10857: *      MERGE WITH BFBLK OR SCBLK IN XR, LENGTH IN WA
        !          10858: *
        !          10859: SSUBB  MOV  SBSSV,WC         RELOAD THIRD ARGUMENT
        !          10860: .FI
        !          10861:        BNZ  WC,SSUB1         SKIP IF THIRD ARG GIVEN
        !          10862:        MOV  SCLEN(XL),WC     ELSE GET STRING LENGTH
        !          10863:        BGT  WB,WC,EXFAL      FAIL IF IMPROPER
        !          10864:        SUB  WB,WC            REDUCE BY OFFSET TO START
        !          10865: *
        !          10866: *      MERGE
        !          10867: *
        !          10868: SSUB1  MOV  WC,WA            SET LENGTH OF SUBSTRING
        !          10869:        ADD  WB,WC            ADD 2ND ARG TO 3RD ARG
        !          10870:        BGT  WC,SCLEN(XL),EXFAL JUMP IF IMPROPER SUBSTRING
        !          10871:        JSR  SBSTR            BUILD SUBSTRING
        !          10872:        BRN  EXIXR            AND JUMP FOR NEXT CODE WORD
        !          10873:        EJC
        !          10874: *
        !          10875: *      TAB
        !          10876: *
        !          10877: S$TAB  ENT                   ENTRY POINT
        !          10878:        MOV  =P$TAB,WB        SET PCODE FOR INTEGER ARG CASE
        !          10879:        MOV  =P$TBD,WA        SET PCODE FOR EXPRESSION ARG CASE
        !          10880:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
        !          10881:        ERR  191,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION
        !          10882:        ERR  192,TAB ARGUMENT IS NEGATIVE OR TOO LARGE
        !          10883:        BRN  EXIXR            RETURN PATTERN NODE
        !          10884:        EJC
        !          10885: *
        !          10886: *      TABLE
        !          10887: *
        !          10888: S$TBL  ENT                   ENTRY POINT
        !          10889:        MOV  (XS)+,XL         GET INITIAL LOOKUP VALUE
        !          10890:        ICA  XS               POP SECOND ARGUMENT
        !          10891:        JSR  GTSMI            LOAD ARGUMENT
        !          10892:        ERR  193,TABLE ARGUMENT IS NOT INTEGER
        !          10893:        ERR  194,TABLE ARGUMENT IS OUT OF RANGE
        !          10894:        BNZ  WC,STBL1         JUMP IF NON-ZERO
        !          10895:        MOV  =TBNBK,WC        ELSE SUPPLY DEFAULT VALUE
        !          10896: *
        !          10897: *      MERGE HERE WITH NUMBER OF HEADERS IN WA
        !          10898: *
        !          10899: STBL1  MOV  WC,WA            COPY NUMBER OF HEADERS
        !          10900:        ADD  =TBSI$,WA        ADJUST FOR STANDARD FIELDS
        !          10901:        WTB  WA               CONVERT LENGTH TO BAUS
        !          10902:        JSR  ALLOC            ALLOCATE SPACE FOR TBBLK
        !          10903:        MOV  XR,WB            COPY POINTER TO TBBLK
        !          10904:        MOV  =B$TBT,(XR)+     STORE TYPE WORD
        !          10905:        ZER  (XR)+            ZERO ID FOR THE MOMENT
        !          10906:        MOV  WA,(XR)+         STORE LENGTH (TBLEN)
        !          10907:        MOV  XL,(XR)+         STORE INITIAL LOOKUP VALUE
        !          10908:        LCT  WC,WC            SET LOOP COUNTER (NUM HEADERS)
        !          10909: *
        !          10910: *      LOOP TO INITIALIZE ALL BUCKET POINTERS
        !          10911: *
        !          10912: STBL2  MOV  WB,(XR)+         STORE TBBLK PTR IN BUCKET HEADER
        !          10913:        BCT  WC,STBL2         LOOP TILL ALL STORED
        !          10914:        MOV  WB,XR            RECALL POINTER TO TBBLK
        !          10915:        BRN  EXSID            EXIT SETTING IDVAL
        !          10916:        EJC
        !          10917: *
        !          10918: *      TIME
        !          10919: *
        !          10920: S$TIM  ENT                   ENTRY POINT
        !          10921:        JSR  SYSTM            GET TIMER VALUE
        !          10922:        SBI  TIMSX            SUBTRACT STARTING TIME
        !          10923:        BRN  EXINT            EXIT WITH INTEGER VALUE
        !          10924:        EJC
        !          10925: *
        !          10926: *      TRACE
        !          10927: *
        !          10928: S$TRA  ENT                   ENTRY POINT
        !          10929:        BEQ  3(XS),=NULLS,STR03  JUMP IF FIRST ARGUMENT IS NULL
        !          10930:        MOV  (XS)+,XR         LOAD FOURTH ARGUMENT
        !          10931:        ZER  XL               TENTATIVELY SET ZERO POINTER
        !          10932:        BEQ  XR,=NULLS,STR02  JUMP IF 4TH ARGUMENT IS NULL
        !          10933:        JSR  GTNVR            ELSE POINT TO VRBLK
        !          10934:        PPM  STR01            JUMP IF NOT VARIABLE NAME
        !          10935:        MOV  VRFNC(XR),XL     ELSE LOAD FUNCTION POINTER
        !          10936:        BNE  XL,=STNDF,STR02  JUMP IF FUNCTION IS DEFINED
        !          10937: *
        !          10938: *      HERE FOR BAD FOURTH ARGUMENT
        !          10939: *
        !          10940: STR01  ERB  195,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL
        !          10941: *
        !          10942: *      HERE WITH FUNCTION POINTER IN XL
        !          10943: *
        !          10944: STR02  MOV  (XS)+,XR         LOAD THIRD ARGUMENT (TAG)
        !          10945:        ZER  WB               SET ZERO AS TRTYP VALUE FOR NOW
        !          10946:        JSR  TRBLD            BUILD TRBLK FOR TRACE CALL
        !          10947:        MOV  XR,XL            MOVE TRBLK POINTER FOR TRACE
        !          10948:        JSR  TRACE            CALL TRACE PROCEDURE
        !          10949:        ERR  196,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME
        !          10950:        ERR  197,TRACE SECOND ARGUMENT IS NOT TRACE TYPE
        !          10951:        PPM                   UNUSED RETURN
        !          10952:        BRN  EXNUL            RETURN NULL
        !          10953: *
        !          10954: *      HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
        !          10955: *
        !          10956: STR03  JSR  SYSTT            CALL IT
        !          10957:        ADD  *NUM04,XS        POP TRACE ARGUMENTS
        !          10958:        BRN  EXNUL            RETURN
        !          10959:        EJC
        !          10960: *
        !          10961: *      TRIM
        !          10962: *
        !          10963: S$TRM  ENT                   ENTRY POINT
        !          10964:        JSR  GTSTG            LOAD ARGUMENT AS STRING
        !          10965:        ERR  198,TRIM ARGUMENT IS NOT STRING
        !          10966:        BZE  WA,EXNUL         RETURN NULL IF ARGUMENT IS NULL
        !          10967:        MOV  XR,XL            COPY STRING POINTER
        !          10968:        CTB  WA,SCHAR         GET BLOCK LENGTH
        !          10969:        JSR  ALLOC            ALLOCATE COPY SAME SIZE
        !          10970:        MOV  XR,WB            SAVE POINTER TO COPY
        !          10971:        MVW                   COPY OLD STRING BLOCK TO NEW
        !          10972:        MOV  WB,XR            RESTORE PTR TO NEW BLOCK
        !          10973:        JSR  TRIMR            TRIM BLANKS (WB IS NON-ZERO)
        !          10974:        BRN  EXIXR            EXIT WITH RESULT IN XR
        !          10975:        EJC
        !          10976: *
        !          10977: *      UNLOAD
        !          10978: *
        !          10979: S$UNL  ENT                   ENTRY POINT
        !          10980:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          10981:        JSR  GTNVR            POINT TO VRBLK
        !          10982:        ERR  199,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME
        !          10983:        MOV  =STNDF,XL        GET PTR TO UNDEFINED FUNCTION
        !          10984:        JSR  DFFNC            UNDEFINE NAMED FUNCTION
        !          10985:        BRN  EXNUL            RETURN NULL AS RESULT
        !          10986:        EJC
        !          10987: *
        !          10988: *      VDIFFER
        !          10989: *
        !          10990: S$VDF  ENT                   ENTRY POINT
        !          10991:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
        !          10992:        MOV  (XS),XL          LOAD FIRST ARGUMENT
        !          10993:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
        !          10994:        PPM  EXFAL            FAIL IF IDENT
        !          10995:        BRN  EXITS            RETURN FIRST ARG IF DIFFER
        !          10996:        TTL  S P I T B O L -- UTILITY PROCEDURES
        !          10997: *
        !          10998: *      THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
        !          10999: *      USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
        !          11000: *
        !          11001: *      EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
        !          11002: *      CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
        !          11003: *      BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
        !          11004: *      PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
        !          11005: *
        !          11006: *      THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
        !          11007: *
        !          11008: *      1)   THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
        !          11009: *           CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
        !          11010: *
        !          11011: *      2)   REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
        !          11012: *           MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
        !          11013: *           CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
        !          11014: *           THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
        !          11015: *           MAY IF IT CHOOSES PRESERVE XR BY STACKING.
        !          11016: *
        !          11017: *      3)   REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
        !          11018: *           VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
        !          11019: *           XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
        !          11020: *
        !          11021: *      4)   REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
        !          11022: *           ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
        !          11023: *           (COLLECTABLE) POINTERS.
        !          11024: *
        !          11025: *      5)   THE CODE POINTER REGISTER POINTS TO THE CURRENT
        !          11026: *           CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
        !          11027: *
        !          11028: *      IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
        !          11029: *      WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
        !          11030: *      POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
        !          11031: *
        !          11032: *      IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
        !          11033: *      PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
        !          11034: *      THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
        !          11035: *      ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
        !          11036: *      IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
        !          11037: *
        !          11038: *      THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
        !          11039: *      AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
        !          11040:        EJC
        !          11041: *
        !          11042: *      ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
        !          11043: *
        !          11044: *      ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
        !          11045: *      ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
        !          11046: *      ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
        !          11047: *
        !          11048: *      (XL)                  VARIABLE NAME BASE
        !          11049: *      (WA)                  VARIABLE NAME OFFSET
        !          11050: *      JSR  ACESS            CALL TO ACCESS VALUE
        !          11051: *      PPM  LOC              TRANSFER LOC IF ACCESS FAILURE
        !          11052: *      (XR)                  VARIABLE VALUE
        !          11053: *      (WA,WB,WC)            DESTROYED
        !          11054: *      (XL,RA)               DESTROYED
        !          11055: *
        !          11056: *      FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
        !          11057: *      OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
        !          11058: *      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
        !          11059: *
        !          11060: ACESS  PRC  R,1              ENTRY POINT (RECURSIVE)
        !          11061:        MOV  XL,XR            COPY NAME BASE
        !          11062:        ADD  WA,XR            POINT TO VARIABLE LOCATION
        !          11063:        MOV  (XR),XR          LOAD VARIABLE VALUE
        !          11064: *
        !          11065: *      LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
        !          11066: *
        !          11067: ACS02  BNE  (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED
        !          11068: *
        !          11069: *      HERE IF TRAPPED
        !          11070: *
        !          11071:        BEQ  XR,=TRBKV,ACS12  JUMP IF KEYWORD VARIABLE
        !          11072:        BNE  XR,=TRBEV,ACS05  JUMP IF NOT EXPRESSION VARIABLE
        !          11073: *
        !          11074: *      HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
        !          11075: *
        !          11076:        MOV  EVEXP(XL),XR     LOAD EXPRESSION POINTER
        !          11077:        ZER  WB               EVALUATE BY VALUE
        !          11078:        JSR  EVALX            EVALUATE EXPRESSION
        !          11079:        PPM  ACS04            JUMP IF EVALUATION FAILURE
        !          11080:        BRN  ACS02            CHECK VALUE FOR MORE TRBLKS
        !          11081:        EJC
        !          11082: *
        !          11083: *      ACESS (CONTINUED)
        !          11084: *
        !          11085: *      HERE ON READING END OF FILE
        !          11086: *
        !          11087: ACS03  ADD  *NUM03,XS        POP TRBLK PTR, NAME BASE AND OFFSET
        !          11088:        MOV  XR,DNAMP         POP UNUSED SCBLK
        !          11089: *
        !          11090: *      MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
        !          11091: *
        !          11092: ACS04  EXI  1                TAKE ALTERNATE (FAILURE) RETURN
        !          11093: *
        !          11094: *      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
        !          11095: *
        !          11096: ACS05  MOV  TRTYP(XR),WB     LOAD TRAP TYPE CODE
        !          11097:        BNZ  WB,ACS10         JUMP IF NOT INPUT ASSOCIATION
        !          11098:        BZE  KVINP,ACS09      IGNORE INPUT ASSOC IF INPUT IS OFF
        !          11099: *
        !          11100: *      HERE FOR INPUT ASSOCIATION
        !          11101: *
        !          11102:        MOV  XL,-(XS)         STACK NAME BASE
        !          11103:        MOV  WA,-(XS)         STACK NAME OFFSET
        !          11104:        MOV  XR,-(XS)         STACK TRBLK POINTER
        !          11105:        MOV  TRTRI(XR),XL     GET TRTIO BLOCK PTR OR 0
        !          11106:        BNZ  XL,ACS06         JUMP IF NOT STANDARD INPUT FILE
        !          11107:        BEQ  TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL
        !          11108: *
        !          11109: *      HERE TO READ FROM STANDARD INPUT FILE
        !          11110: *
        !          11111:        MOV  CSWIN,WA         LENGTH FOR READ BUFFER
        !          11112:        JSR  ALOCS            BUILD STRING OF APPROPRIATE LENGTH
        !          11113:        BZE  TTINS,ACSA5      SKIP IF NOT TERML STD INPUT
        !          11114:        JSR  SYSRI            READ FROM TERMINAL
        !          11115:        PPM  ACS03            END FILE
        !          11116:        PPM  EROSI            ERROR
        !          11117:        BRN  ACS07            MERGE
        !          11118: *
        !          11119: *      GENUINE STD INPUT FILE
        !          11120: *
        !          11121: ACSA5  JSR  SYSRD            READ NEXT STANDARD INPUT IMAGE
        !          11122:        PPM  ACS03            JUMP TO FAIL EXIT IF END OF FILE
        !          11123:        PPM  EROSI            ERROR RETURN
        !          11124:        BRN  ACS07            ELSE MERGE WITH OTHER FILE CASE
        !          11125: *
        !          11126: *      HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
        !          11127: *
        !          11128: ACS06  MOV  TRTAG(XL),WA     OBTAIN IOTAG
        !          11129:        BZE  WA,ACS03         FAIL IF ENDFILE DONE
        !          11130:        JSR  SYSIL            GET INPUT RECORD MAX LENGTH (TO WA)
        !          11131:        JSR  ALOCS            ALLOCATE STRING OF CORRECT SIZE
        !          11132:        MOV  TRTAG(XL),WA     GET IOTAG
        !          11133:        JSR  SYSIN            CALL SYSTEM INPUT ROUTINE
        !          11134:        PPM  ACS03            JUMP TO FAIL EXIT IF END OF FILE
        !          11135:        PPM  ACS22            ERROR RETURN
        !          11136:        EJC
        !          11137: *
        !          11138: *      ACESS (CONTINUED)
        !          11139: *
        !          11140: *      MERGE HERE AFTER OBTAINING INPUT RECORD
        !          11141: *
        !          11142: ACS07  MOV  KVTRM,WB         LOAD TRIM INDICATOR
        !          11143:        JSR  TRIMR            TRIM RECORD AS REQUIRED
        !          11144:        MOV  XR,WB            COPY RESULT POINTER
        !          11145:        MOV  (XS),XR          RELOAD POINTER TO TRBLK
        !          11146: *
        !          11147: *      LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
        !          11148: *
        !          11149: ACS08  MOV  XR,XL            SAVE POINTER TO THIS TRBLK
        !          11150:        MOV  TRNXT(XR),XR     LOAD FORWARD POINTER
        !          11151:        BEQ  (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK
        !          11152:        MOV  WB,TRNXT(XL)     ELSE STORE RESULT AT END OF CHAIN
        !          11153:        MOV  (XS)+,XR         RESTORE INITIAL TRBLK POINTER
        !          11154:        MOV  (XS)+,WA         RESTORE NAME OFFSET
        !          11155:        MOV  (XS)+,XL         RESTORE NAME BASE POINTER
        !          11156: *
        !          11157: *      COME HERE TO MOVE TO NEXT TRBLK
        !          11158: *
        !          11159: ACS09  MOV  TRNXT(XR),XR     LOAD FORWARD PTR TO NEXT VALUE
        !          11160:        BRN  ACS02            BACK TO CHECK IF TRAPPED
        !          11161: *
        !          11162: *      HERE TO CHECK FOR ACCESS TRACE TRBLK
        !          11163: *
        !          11164: ACS10  BNE  WB,=TRTAC,ACS09  LOOP BACK IF NOT ACCESS TRACE
        !          11165:        BZE  KVTRA,ACS09      IGNORE ACCESS TRACE IF TRACE OFF
        !          11166:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
        !          11167:        BZE  TRFNC(XR),ACS11  JUMP IF PRINT TRACE
        !          11168:        EJC
        !          11169: *
        !          11170: *      ACESS (CONTINUED)
        !          11171: *
        !          11172: *      HERE FOR FULL FUNCTION TRACE
        !          11173: *
        !          11174:        JSR  TRXEQ            CALL ROUTINE TO EXECUTE TRACE
        !          11175:        BRN  ACS09            JUMP FOR NEXT TRBLK
        !          11176: *
        !          11177: *      HERE FOR CASE OF PRINT TRACE
        !          11178: *
        !          11179: ACS11  JSR  PRTSN            PRINT STATEMENT NUMBER
        !          11180:        JSR  PRTNV            PRINT NAME = VALUE
        !          11181:        BRN  ACS09            JUMP BACK FOR NEXT TRBLK
        !          11182: *
        !          11183: *      HERE FOR KEYWORD VARIABLE
        !          11184: *
        !          11185: ACS12  MOV  KVNUM(XL),XR     LOAD KEYWORD NUMBER
        !          11186:        BGE  XR,=K$V$$,ACS14  JUMP IF NOT ONE WORD VALUE
        !          11187:        MTI  KVANC(XR)        ELSE LOAD VALUE AS INTEGER
        !          11188: *
        !          11189: *      COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
        !          11190: *
        !          11191: ACS13  JSR  ICBLD            BUILD ICBLK
        !          11192:        BRN  ACS18            JUMP TO EXIT
        !          11193: *
        !          11194: *      HERE IF NOT ONE WORD KEYWORD VALUE
        !          11195: *
        !          11196: ACS14  BGE  XR,=K$S$$,ACS15  JUMP IF SPECIAL CASE
        !          11197:        SUB  =K$V$$,XR        ELSE GET OFFSET
        !          11198:        WTB  XR               CONVERT TO OFFSET IN BAUS
        !          11199:        ADD  =NDABO,XR        POINT TO PATTERN VALUE
        !          11200:        BRN  ACS18            JUMP TO EXIT
        !          11201: *
        !          11202: *      HERE IF SPECIAL KEYWORD CASE
        !          11203: *
        !          11204: ACS15  MOV  KVRTN,XL         LOAD RTNTYPE IN CASE
        !          11205:        LDI  KVSTL            LOAD STLIMIT IN CASE
        !          11206:        SUB  =K$S$$,XR        GET CASE NUMBER
        !          11207:        BSW  XR,6             SWITCH ON KEYWORD NUMBER
        !          11208:        IFF  K$$AL,ACS16      JUMP IF ALPHABET
        !          11209:        IFF  K$$RT,ACS17      RTNTYPE
        !          11210:        IFF  K$$CD,ACS23      CODE
        !          11211:        IFF  K$$SC,ACS19      STCOUNT
        !          11212:        IFF  K$$SL,ACS13      STLIMIT
        !          11213:        IFF  K$$ET,ACS20      ERRTEXT
        !          11214:        ESW                   END SWITCH ON KEYWORD NUMBER
        !          11215:        EJC
        !          11216: *
        !          11217: *      ACESS (CONTINUED)
        !          11218: *
        !          11219: *      ALPHABET
        !          11220: *
        !          11221: ACS16  MOV  KVALP,XL         LOAD POINTER TO ALPHABET STRING
        !          11222: *
        !          11223: *      RTNTYPE MERGES HERE
        !          11224: *
        !          11225: ACS17  MOV  XL,XR            COPY STRING PTR TO PROPER REG
        !          11226: *
        !          11227: *      COMMON RETURN POINT
        !          11228: *
        !          11229: ACS18  EXI                   RETURN TO ACESS CALLER
        !          11230: *
        !          11231: *      HERE FOR STCOUNT (IA HAS STLIMIT)
        !          11232: *
        !          11233: ACS19  SBI  KVSTC            STCOUNT = LIMIT - LEFT
        !          11234:        BRN  ACS13            MERGE BACK WITH INTEGER RESULT
        !          11235: *
        !          11236: *      ERRTEXT
        !          11237: *
        !          11238: ACS20  MOV  R$ETX,XR         GET ERRTEXT STRING
        !          11239:        BRN  ACS18            MERGE WITH RESULT
        !          11240: *
        !          11241: *      HERE TO READ A RECORD FROM TERMINAL
        !          11242: *
        !          11243: ACS21  MOV  =RILEN,WA        BUFFER LENGTH
        !          11244:        JSR  ALOCS            ALLOCATE BUFFER
        !          11245:        JSR  SYSRI            READ RECORD
        !          11246:        PPM  ACS03            ENDFILE
        !          11247:        PPM  EROSI            ERROR RETURN
        !          11248:        BRN  ACS07            MERGE WITH RECORD READ
        !          11249: *
        !          11250: *      ERROR RETURN
        !          11251: *
        !          11252: ACS22  MOV  XR,DNAMP         POP UNUSED SCBLK
        !          11253:        BRN  EROSI            GENERATE ERROR MESSAGE
        !          11254: *
        !          11255: *      ACCESS CODE KEYWORD
        !          11256: *
        !          11257: ACS23  LDI  KVCOD            GET CODE VALUE
        !          11258:        BRN  ACS13            EXIT
        !          11259:        ENP                   END PROCEDURE ACESS
        !          11260:        EJC
        !          11261: *
        !          11262: *      ACOMP -- COMPARE TWO ARITHMETIC VALUES
        !          11263: *
        !          11264: *      1(XS)                 FIRST ARGUMENT
        !          11265: *      0(XS)                 SECOND ARGUMENT
        !          11266: *      JSR  ACOMP            CALL TO COMPARE VALUES
        !          11267: *      PPM  LOC              TRANSFER LOC IF ARG1 IS NON-NUMERIC
        !          11268: *      PPM  LOC              TRANSFER LOC IF ARG2 IS NON-NUMERIC
        !          11269: *      PPM  LOC              TRANSFER LOC FOR ARG1 LT ARG2
        !          11270: *      PPM  LOC              TRANSFER LOC FOR ARG1 EQ ARG2
        !          11271: *      PPM  LOC              TRANSFER LOC FOR ARG1 GT ARG2
        !          11272: *      (NORMAL RETURN IS NEVER GIVEN)
        !          11273: *      (WA,WB,WC,IA,RA)      DESTROYED
        !          11274: *      (XL,XR)               DESTROYED
        !          11275: *
        !          11276: ACOMP  PRC  N,5              ENTRY POINT
        !          11277:        JSR  ARITH            LOAD ARITHMETIC OPERANDS
        !          11278:        PPM  ACMP7            JUMP IF FIRST ARG NON-NUMERIC
        !          11279:        PPM  ACMP8            JUMP IF SECOND ARG NON-NUMERIC
        !          11280: .IF    .CNRA
        !          11281: .ELSE
        !          11282:        PPM  ACMP4            JUMP IF REAL ARGUMENTS
        !          11283: .FI
        !          11284: *
        !          11285: *      HERE FOR INTEGER ARGUMENTS
        !          11286: *
        !          11287:        SBI  ICVAL(XL)        SUBTRACT TO COMPARE
        !          11288:        IOV  ACMP3            JUMP IF OVERFLOW
        !          11289:        ILT  ACMP5            ELSE JUMP IF ARG1 LT ARG2
        !          11290:        IEQ  ACMP2            JUMP IF ARG1 EQ ARG2
        !          11291: *
        !          11292: *      HERE IF ARG1 GT ARG2
        !          11293: *
        !          11294: ACMP1  EXI  5                TAKE GT EXIT
        !          11295: *
        !          11296: *      HERE IF ARG1 EQ ARG2
        !          11297: *
        !          11298: ACMP2  EXI  4                TAKE EQ EXIT
        !          11299:        EJC
        !          11300: *
        !          11301: *      ACOMP (CONTINUED)
        !          11302: *
        !          11303: *      HERE FOR INTEGER OVERFLOW ON SUBTRACT
        !          11304: *
        !          11305: ACMP3  LDI  ICVAL(XL)        LOAD SECOND ARGUMENT
        !          11306:        ILT  ACMP1            GT IF NEGATIVE
        !          11307:        BRN  ACMP5            ELSE LT
        !          11308: .IF    .CNRA
        !          11309: .ELSE
        !          11310: *
        !          11311: *      HERE FOR REAL OPERANDS
        !          11312: *
        !          11313: ACMP4  SBR  RCVAL(XL)        SUBTRACT TO COMPARE
        !          11314:        ROV  ACMP6            JUMP IF OVERFLOW
        !          11315:        RGT  ACMP1            ELSE JUMP IF ARG1 GT
        !          11316:        REQ  ACMP2            JUMP IF ARG1 EQ ARG2
        !          11317: .FI
        !          11318: *
        !          11319: *      HERE IF ARG1 LT ARG2
        !          11320: *
        !          11321: ACMP5  EXI  3                TAKE LT EXIT
        !          11322: .IF    .CNRA
        !          11323: .ELSE
        !          11324: *
        !          11325: *      HERE IF OVERFLOW ON REAL SUBTRACTION
        !          11326: *
        !          11327: ACMP6  LDR  RCVAL(XL)        RELOAD ARG2
        !          11328:        RLT  ACMP1            GT IF NEGATIVE
        !          11329:        BRN  ACMP5            ELSE LT
        !          11330: .FI
        !          11331: *
        !          11332: *      HERE IF ARG1 NON-NUMERIC
        !          11333: *
        !          11334: ACMP7  EXI  1                TAKE ERROR EXIT
        !          11335: *
        !          11336: *      HERE IF ARG2 NON-NUMERIC
        !          11337: *
        !          11338: ACMP8  EXI  2                TAKE ERROR EXIT
        !          11339:        ENP                   END PROCEDURE ACOMP
        !          11340:        EJC
        !          11341: *
        !          11342: *      ALLOC                 ALLOCATE BLOCK OF DYNAMIC STORAGE
        !          11343: *
        !          11344: *      (WA)                  LENGTH REQUIRED IN BAUS
        !          11345: *      JSR  ALLOC            CALL TO ALLOCATE BLOCK
        !          11346: *      (XR)                  POINTER TO ALLOCATED BLOCK
        !          11347: *
        !          11348: *      A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
        !          11349: *      MOV  DNAME,XR .  SUB  WA,XR .  BLO XR,DNAMP,ALOC2 .
        !          11350: *      MOV  DNAMP,XR .  ADD  WA,XR
        !          11351: *
        !          11352: ALLOC  PRC  E,0              ENTRY POINT
        !          11353: *
        !          11354: *      COMMON EXIT POINT
        !          11355: *
        !          11356: ALOC1  MOV  DNAMP,XR         POINT TO NEXT AVAILABLE LOC
        !          11357:        AOV  WA,XR,ALOC2      POINT PAST ALLOCATED BLOCK
        !          11358:        BGT  XR,DNAME,ALOC2   JUMP IF NOT ENOUGH ROOM
        !          11359:        MOV  XR,DNAMP         STORE NEW POINTER
        !          11360:        SUB  WA,XR            POINT BACK TO START OF ALLOCATED BK
        !          11361:        EXI                   RETURN TO CALLER
        !          11362: *
        !          11363: *      HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
        !          11364: *
        !          11365: ALOC2  MOV  WB,ALLSV         SAVE WB
        !          11366:        ZER  WB               SET NO UPWARD MOVE FOR GBCOL
        !          11367:        JSR  GBCOL            GARBAGE COLLECT
        !          11368: *
        !          11369: *      SEE IF ROOM AFTER GBCOL OR SYSMM CALL
        !          11370: *
        !          11371: ALOC3  MOV  DNAMP,XR         POINT TO FIRST AVAILABLE LOC
        !          11372:        AOV  WA,XR,ALC3A      POINT PAST NEW BLOCK
        !          11373:        BLO  XR,DNAME,ALOC4   JUMP IF THERE IS ROOM NOW
        !          11374: *
        !          11375: *      FAILED AGAIN, SEE IF WE CAN GET MORE CORE
        !          11376: *
        !          11377: ALC3A  JSR  SYSMM            TRY TO GET MORE MEMORY
        !          11378:        WTB  XR               CONVERT TO BAUS
        !          11379:        ADD  XR,DNAME         BUMP PTR BY AMOUNT OBTAINED
        !          11380:        BNZ  XR,ALOC3         JUMP IF GOT MORE CORE
        !          11381:        ADD  RSMEM,DNAME      GET THE RESERVE MEMORY
        !          11382:        ZER  RSMEM            ONLY PERMISSIBLE ONCE
        !          11383:        ICV  ERRFT            FATAL ERROR
        !          11384:        ERB  200,MEMORY OVERFLOW
        !          11385:        EJC
        !          11386: *
        !          11387: *      HERE AFTER SUCCESSFUL GARBAGE COLLECTION
        !          11388: *
        !          11389: ALOC4  STI  ALLIA            SAVE IA
        !          11390:        MOV  DNAME,WB         GET DYNAMIC END ADRS
        !          11391:        SUB  DNAMP,WB         COMPUTE FREE STORE
        !          11392:        BTW  WB               CONVERT BAUS TO WORDS
        !          11393:        MTI  WB               PUT FREE STORE IN IA
        !          11394:        MLI  ALFSF            MULTIPLY BY FREE STORE FACTOR
        !          11395:        IOV  ALOC5            JUMP IF OVERFLOWED
        !          11396:        MOV  DNAME,WB         DYNAMIC END ADRS
        !          11397:        SUB  DNAMB,WB         COMPUTE TOTAL AMOUNT OF DYNAMIC
        !          11398:        BTW  WB               CONVERT TO WORDS
        !          11399:        MOV  WB,ALDYN         STORE IT
        !          11400:        SBI  ALDYN            SUBTRACT FROM SCALED UP FREE STORE
        !          11401:        IGT  ALOC5            JUMP IF SUFFICIENT FREE STORE
        !          11402:        JSR  SYSMM            TRY TO GET MORE STORE
        !          11403:        WTB  XR               CONVERT TO BAUS
        !          11404:        ADD  XR,DNAME         ADJUST DYNAMIC END ADRS
        !          11405: *
        !          11406: *      MERGE TO RESTORE IA AND WB
        !          11407: *
        !          11408: ALOC5  LDI  ALLIA            RECOVER IA
        !          11409:        MOV  ALLSV,WB         RESTORE WB
        !          11410:        BRN  ALOC1            JUMP BACK TO EXIT
        !          11411:        ENP                   END PROCEDURE ALLOC
        !          11412:        EJC
        !          11413: .IF    .CNBF
        !          11414: .ELSE
        !          11415: *
        !          11416: *      ALOBF -- ALLOCATE BUFFER
        !          11417: *
        !          11418: *      THIS ROUTINES ALLOCATES A NEW BUFFER.  AS THE BFBLK
        !          11419: *      AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
        !          11420: *      AND XR POINTS TO THE BCBLK ON RETURN.  THE BFBLK
        !          11421: *      AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
        !          11422: *      IS ZERO ON RETURN.
        !          11423: *
        !          11424: *      (WA)                  BUFFER SIZE IN CHARACTERS
        !          11425: *      JSR  ALOBF            CALL TO CREATE BUFFER
        !          11426: *      (WA)                  0 (INITIAL OFFSET TO BFBLK CHARS)
        !          11427: *      (WB)                  0 (INITIAL BCLEN)
        !          11428: *      (XR)                  BCBLK PTR
        !          11429: *
        !          11430: ALOBF  PRC  E,0              ENTRY POINT
        !          11431:        MOV  WA,WB            HANG ONTO ALLOCATION SIZE
        !          11432:        CTB  WA,BFSI$         GET TOTAL BLOCK SIZE
        !          11433:        BGE  WA,MXLEN,ALB01   CHECK FOR MAXLEN EXCEEDED
        !          11434:        ADD  *BCSI$,WA        ADD IN ALLOCATION FOR BCBLK
        !          11435:        JSR  ALLOC            ALLOCATE FRAME
        !          11436:        MOV  =B$BCT,(XR)      SET TYPE
        !          11437:        ZER  IDVAL(XR)        NO ID YET
        !          11438:        ZER  BCLEN(XR)        NO DEFINED LENGTH
        !          11439:        MOV  XL,WA            SAVE XL
        !          11440:        MOV  XR,XL            COPY BCBLK PTR
        !          11441:        ADD  *BCSI$,XL        BIAS PAST PARTIALLY BUILT BCBLK
        !          11442:        MOV  =B$BFT,(XL)      SET BFBLK TYPE WORD
        !          11443:        MOV  WB,BFALC(XL)     SET ALLOCATED SIZE
        !          11444:        MOV  XL,BCBUF(XR)     SET POINTER IN BCBLK
        !          11445:        ZER  WB               CLEAR FOR RETURN
        !          11446:        MOV  WB,BFCHR(XL)     CLEAR FIRST WORD (NULL PAD)
        !          11447:        MOV  WA,XL            RESTORE ENTRY XL
        !          11448:        ZER  WA               CLEAR FOR RETURN
        !          11449:        EXI                   RETURN TO CALLER
        !          11450: *
        !          11451: *      HERE FOR MXLEN EXCEEDED
        !          11452: *
        !          11453: ALB01  ERB  201,REQUESTED BUFFER ALLOCATION EXCEEDS MAXLNGTH
        !          11454:        ENP                   END PROCEDURE ALOBF
        !          11455:        EJC
        !          11456: .FI
        !          11457: *
        !          11458: *      ALOCS -- ALLOCATE STRING BLOCK
        !          11459: *
        !          11460: *      ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
        !          11461: *      WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
        !          11462: *      ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
        !          11463: *      EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
        !          11464: *
        !          11465: *      (WA)                  LENGTH OF STRING TO BE ALLOCATED
        !          11466: *      JSR  ALOCS            CALL TO ALLOCATE SCBLK
        !          11467: *      (XR)                  POINTER TO RESULTING SCBLK
        !          11468: *      (WA)                  DESTROYED
        !          11469: *      (WC)                  CHARACTER COUNT (ENTRY VALUE OF WA)
        !          11470: *
        !          11471: *      THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
        !          11472: *      FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
        !          11473: *      TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
        !          11474: *
        !          11475: ALOCS  PRC  E,0              ENTRY POINT
        !          11476:        BGT  WA,KVMXL,ALCS2   JUMP IF LENGTH EXCEEEDS MAXLENGTH
        !          11477:        MOV  WA,WC            ELSE COPY LENGTH
        !          11478:        CTB  WA,SCSI$         COMPUTE LENGTH OF SCBLK IN BAUS
        !          11479:        MOV  DNAMP,XR         POINT TO NEXT AVAILABLE LOCATION
        !          11480:        AOV  WA,XR,ALCS0      POINT PAST BLOCK
        !          11481:        BLO  XR,DNAME,ALCS1   JUMP IF THERE IS ROOM
        !          11482: *
        !          11483: *      INSUFFICIENT MEMORY
        !          11484: *
        !          11485: ALCS0  ZER  XR               ELSE CLEAR GARBAGE XR VALUE
        !          11486:        JSR  ALLOC            AND USE STANDARD ALLOCATOR
        !          11487:        ADD  WA,XR            POINT PAST END OF BLOCK TO MERGE
        !          11488: *
        !          11489: *      MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
        !          11490: *
        !          11491: ALCS1  MOV  XR,DNAMP         SET UPDATED STORAGE POINTER
        !          11492:        ZER  -(XR)            STORE ZERO CHARS IN LAST WORD
        !          11493:        DCA  WA               DECREMENT LENGTH
        !          11494:        SUB  WA,XR            POINT BACK TO START OF BLOCK
        !          11495:        MOV  =B$SCL,(XR)      SET TYPE WORD
        !          11496:        MOV  WC,SCLEN(XR)     STORE LENGTH IN CHARS
        !          11497:        EXI                   RETURN TO ALOCS CALLER
        !          11498: *
        !          11499: *      COME HERE IF STRING IS TOO LONG
        !          11500: *
        !          11501: ALCS2  ERB  202,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
        !          11502:        ENP                   END PROCEDURE ALOCS
        !          11503:        EJC
        !          11504: *
        !          11505: *      ALOST -- ALLOCATE SPACE IN STATIC REGION
        !          11506: *
        !          11507: *      (WA)                  LENGTH REQUIRED IN BAUS
        !          11508: *      JSR  ALOST            CALL TO ALLOCATE SPACE
        !          11509: *      (XR)                  POINTER TO ALLOCATED BLOCK
        !          11510: *      (WB)                  DESTROYED
        !          11511: *
        !          11512: *      NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
        !          11513: *      OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
        !          11514: *      IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
        !          11515: *
        !          11516: ALOST  PRC  E,0              ENTRY POINT
        !          11517: *
        !          11518: *      MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
        !          11519: *
        !          11520: ALST1  MOV  STATE,XR         POINT TO CURRENT END OF AREA
        !          11521:        AOV  WA,XR,ALST2      POINT BEYOND PROPOSED BLOCK
        !          11522:        BGE  XR,DNAMB,ALST2   JUMP IF OVERLAP WITH DYNAMIC AREA
        !          11523:        MOV  XR,STATE         ELSE STORE NEW POINTER
        !          11524:        SUB  WA,XR            POINT BACK TO START OF BLOCK
        !          11525:        EXI                   RETURN TO ALOST CALLER
        !          11526: *
        !          11527: *      HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
        !          11528: *
        !          11529: ALST2  MOV  WA,ALSTA         SAVE WA
        !          11530:        BGE  WA,*E$STS,ALST3  SKIP IF REQUESTED CHUNK IS LARGE
        !          11531:        MOV  *E$STS,WA        ELSE SET TO GET LARGE ENOUGH CHUNK
        !          11532: *
        !          11533: *      HERE WITH AMOUNT TO MOVE UP IN WA
        !          11534: *
        !          11535: ALST3  JSR  ALLOC            ALLOCATE BLOCK TO ENSURE ROOM
        !          11536:        MOV  XR,DNAMP         AND DELETE IT
        !          11537:        MOV  WA,WB            COPY MOVE UP AMOUNT
        !          11538:        JSR  GBCOL            CALL GBCOL TO MOVE DYNAMIC AREA UP
        !          11539:        MOV  ALSTA,WA         RESTORE WA
        !          11540:        BRN  ALST1            LOOP BACK TO TRY AGAIN
        !          11541:        ENP                   END PROCEDURE ALOST
        !          11542:        EJC
        !          11543: *
        !          11544: *      ARITH -- FETCH ARITHMETIC OPERANDS
        !          11545: *
        !          11546: *      ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
        !          11547: *      TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
        !          11548: *      INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
        !          11549: *      THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
        !          11550: *
        !          11551: *      1(XS)                 FIRST ARGUMENT (LEFT OPERAND)
        !          11552: *      0(XS)                 SECOND ARGUMENT (RIGHT OPERAND)
        !          11553: *      JSR  ARITH            CALL TO FETCH NUMERIC ARGUMENTS
        !          11554: *      PPM  LOC              TRANSFER LOC FOR OPND 1 NON-NUMERIC
        !          11555: *      PPM  LOC              TRANSFER LOC FOR OPND 2 NON-NUMERIC
        !          11556: .IF    .CNRA
        !          11557: .ELSE
        !          11558: *      PPM  LOC              TRANSFER LOC FOR REAL OPERANDS
        !          11559: .FI
        !          11560: *
        !          11561: *      FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
        !          11562: *
        !          11563: *      (IA)                  LEFT OPERAND VALUE
        !          11564: *      (XR)                  PTR TO ICBLK FOR LEFT OPERAND
        !          11565: *      (XL)                  PTR TO ICBLK FOR RIGHT OPERAND
        !          11566: *      (XS)                  POPPED TWICE
        !          11567: *      (WA,WB,RA)            DESTROYED
        !          11568: .IF    .CNRA
        !          11569: .ELSE
        !          11570: *
        !          11571: *      FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
        !          11572: *      SPECIFIED BY THE THIRD PARAMETER.
        !          11573: *
        !          11574: *      (RA)                  LEFT OPERAND VALUE
        !          11575: *      (XR)                  PTR TO RCBLK FOR LEFT OPERAND
        !          11576: *      (XL)                  PTR TO RCBLK FOR RIGHT OPERAND
        !          11577: *      (WA,WB,WC)            DESTROYED
        !          11578: *      (XS)                  POPPED TWICE
        !          11579: .FI
        !          11580:        EJC
        !          11581: *
        !          11582: *      ARITH (CONTINUED)
        !          11583: *
        !          11584: *      ENTRY POINT
        !          11585: *
        !          11586: .IF    .CNRA
        !          11587: ARITH  PRC  N,2              ENTRY POINT
        !          11588: .ELSE
        !          11589: ARITH  PRC  N,3              ENTRY POINT
        !          11590: .FI
        !          11591:        MOV  (XS)+,XL         LOAD RIGHT OPERAND
        !          11592:        MOV  (XS)+,XR         LOAD LEFT OPERAND
        !          11593:        MOV  (XL),WA          GET RIGHT OPERAND TYPE WORD
        !          11594:        BEQ  WA,=B$ICL,ARTH1  JUMP IF INTEGER
        !          11595: .IF    .CNRA
        !          11596: .ELSE
        !          11597:        BEQ  WA,=B$RCL,ARTH4  JUMP IF REAL
        !          11598: .FI
        !          11599:        MOV  XR,-(XS)         ELSE REPLACE LEFT ARG ON STACK
        !          11600:        MOV  XL,XR            COPY LEFT ARG POINTER
        !          11601:        JSR  GTNUM            CONVERT TO NUMERIC
        !          11602:        PPM  ARTH6            JUMP IF UNCONVERTIBLE
        !          11603:        MOV  XR,XL            ELSE COPY CONVERTED RESULT
        !          11604:        MOV  (XL),WA          GET RIGHT OPERAND TYPE WORD
        !          11605:        MOV  (XS)+,XR         RELOAD LEFT ARGUMENT
        !          11606: .IF    .CNRA
        !          11607: .ELSE
        !          11608:        BEQ  WA,=B$RCL,ARTH4  JUMP IF RIGHT ARG IS REAL
        !          11609: .FI
        !          11610: *
        !          11611: *      HERE IF RIGHT ARG IS AN INTEGER
        !          11612: *
        !          11613: ARTH1  BNE  (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER
        !          11614: *
        !          11615: *      EXIT FOR INTEGER CASE
        !          11616: *
        !          11617: ARTH2  LDI  ICVAL(XR)        LOAD LEFT OPERAND VALUE
        !          11618:        EXI                   RETURN TO ARITH CALLER
        !          11619: *
        !          11620: *      HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
        !          11621: *
        !          11622: ARTH3  JSR  GTNUM            CONVERT LEFT ARG TO NUMERIC
        !          11623:        PPM  ARTH7            JUMP IF NOT CONVERTIBLE
        !          11624:        BEQ  WA,=B$ICL,ARTH2  JUMP BACK IF INTEGER-INTEGER
        !          11625: .IF    .CNRA
        !          11626: .ELSE
        !          11627: *
        !          11628: *      HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
        !          11629: *
        !          11630:        MOV  XR,-(XS)         PUT LEFT ARG BACK ON STACK
        !          11631:        LDI  ICVAL(XL)        LOAD RIGHT ARGUMENT VALUE
        !          11632:        ITR                   CONVERT TO REAL
        !          11633:        JSR  RCBLD            GET REAL BLOCK FOR RIGHT ARG, MERGE
        !          11634:        MOV  XR,XL            COPY RIGHT ARG PTR
        !          11635:        MOV  (XS)+,XR         LOAD LEFT ARGUMENT
        !          11636:        BRN  ARTH5            MERGE FOR REAL-REAL CASE
        !          11637:        EJC
        !          11638: *
        !          11639: *      ARITH (CONTINUED)
        !          11640: *
        !          11641: *      HERE IF RIGHT ARGUMENT IS REAL
        !          11642: *
        !          11643: ARTH4  BEQ  (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL
        !          11644:        JSR  GTREA            ELSE CONVERT TO REAL
        !          11645:        PPM  ARTH7            ERROR IF UNCONVERTIBLE
        !          11646: *
        !          11647: *      HERE FOR REAL-REAL
        !          11648: *
        !          11649: ARTH5  LDR  RCVAL(XR)        LOAD LEFT OPERAND VALUE
        !          11650:        EXI  3                TAKE REAL-REAL EXIT
        !          11651: .FI
        !          11652: *
        !          11653: *      HERE FOR ERROR CONVERTING RIGHT ARGUMENT
        !          11654: *
        !          11655: ARTH6  ICA  XS               POP UNWANTED LEFT ARG
        !          11656:        EXI  2                TAKE APPROPRIATE ERROR EXIT
        !          11657: *
        !          11658: *      HERE FOR ERROR CONVERTING LEFT OPERAND
        !          11659: *
        !          11660: ARTH7  EXI  1                TAKE APPROPRIATE ERROR RETURN
        !          11661:        ENP                   END PROCEDURE ARITH
        !          11662:        EJC
        !          11663: *
        !          11664: *      ASIGN -- PERFORM ASSIGNMENT
        !          11665: *
        !          11666: *      ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
        !          11667: *      WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
        !          11668: *      VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
        !          11669: *      ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
        !          11670: *      PATTERN AND EXPRESSION VARIABLES.
        !          11671: *
        !          11672: *      (WB)                  VALUE TO BE ASSIGNED
        !          11673: *      (XL)                  BASE POINTER FOR VARIABLE
        !          11674: *      (WA)                  OFFSET FOR VARIABLE
        !          11675: *      JSR  ASIGN            CALL TO ASSIGN VALUE TO VARIABLE
        !          11676: *      PPM  LOC              TRANSFER LOC FOR FAILURE
        !          11677: *      (XR,XL,WA,WB,WC)      DESTROYED
        !          11678: *      (RA)                  DESTROYED
        !          11679: *
        !          11680: *      FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
        !          11681: *      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
        !          11682: *
        !          11683: ASIGN  PRC  R,1              ENTRY POINT (RECURSIVE)
        !          11684: *
        !          11685: *      MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
        !          11686: *
        !          11687: ASG01  ADD  WA,XL            POINT TO VARIABLE VALUE
        !          11688:        MOV  (XL),XR          LOAD VARIABLE VALUE
        !          11689:        BEQ  (XR),=B$TRT,ASG02 JUMP IF TRAPPED
        !          11690:        MOV  WB,(XL)          ELSE PERFORM ASSIGNMENT
        !          11691:        ZER  XL               CLEAR GARBAGE VALUE IN XL
        !          11692:        EXI                   AND RETURN TO ASIGN CALLER
        !          11693: *
        !          11694: *      HERE IF VALUE IS TRAPPED
        !          11695: *
        !          11696: ASG02  SUB  WA,XL            RESTORE NAME BASE
        !          11697:        BEQ  XR,=TRBKV,ASG14  JUMP IF KEYWORD VARIABLE
        !          11698:        BNE  XR,=TRBEV,ASG04  JUMP IF NOT EXPRESSION VARIABLE
        !          11699: *
        !          11700: *      HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
        !          11701: *
        !          11702:        MOV  EVEXP(XL),XR     POINT TO EXPRESSION
        !          11703:        MOV  WB,-(XS)         STORE VALUE TO ASSIGN ON STACK
        !          11704:        MOV  =NUM01,WB        SET FOR EVALUATION BY NAME
        !          11705:        JSR  EVALX            EVALUATE EXPRESSION BY NAME
        !          11706:        PPM  ASG03            JUMP IF EVALUATION FAILS
        !          11707:        MOV  (XS)+,WB         ELSE RELOAD VALUE TO ASSIGN
        !          11708:        BRN  ASG01            LOOP BACK TO PERFORM ASSIGNMENT
        !          11709:        EJC
        !          11710: *
        !          11711: *      ASIGN (CONTINUED)
        !          11712: *
        !          11713: *      HERE FOR FAILURE RETURNS
        !          11714: *
        !          11715: ASG03  ICA  XS               REMOVE STACKED VALUE ENTRY
        !          11716: *
        !          11717: ASG3A  EXI  1                TAKE FAILURE EXIT
        !          11718: *
        !          11719: *      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
        !          11720: *
        !          11721: ASG04  MOV  XR,-(XS)         SAVE PTR TO FIRST TRBLK
        !          11722: *
        !          11723: *      LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
        !          11724: *
        !          11725: ASG05  MOV  XR,WC            SAVE PTR TO THIS TRBLK
        !          11726:        MOV  TRNXT(XR),XR     POINT TO NEXT TRBLK
        !          11727:        BEQ  (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK
        !          11728:        MOV  WC,XR            ELSE POINT BACK TO LAST TRBLK
        !          11729:        MOV  WB,TRVAL(XR)     STORE VALUE AT END OF CHAIN
        !          11730:        MOV  (XS)+,XR         RESTORE PTR TO FIRST TRBLK
        !          11731: *
        !          11732: *      LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
        !          11733: *
        !          11734: ASG06  MOV  TRTYP(XR),WB     LOAD TYPE CODE OF TRBLK
        !          11735:        BEQ  WB,=TRTVL,ASG08  JUMP IF VALUE TRACE
        !          11736:        BEQ  WB,=TRTOU,ASG10  JUMP IF OUTPUT ASSOCIATION
        !          11737: *
        !          11738: *      HERE TO MOVE TO NEXT TRBLK ON CHAIN
        !          11739: *
        !          11740: ASG07  MOV  TRNXT(XR),XR     POINT TO NEXT TRBLK ON CHAIN
        !          11741:        BEQ  (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK
        !          11742:        EXI                   ELSE END OF CHAIN, RETURN TO CALLER
        !          11743: *
        !          11744: *      HERE TO PROCESS VALUE TRACE
        !          11745: *
        !          11746: ASG08  BZE  KVTRA,ASG07      IGNORE VALUE TRACE IF TRACE OFF
        !          11747:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
        !          11748:        BZE  TRFNC(XR),ASG09  JUMP IF PRINT TRACE
        !          11749:        JSR  TRXEQ            ELSE EXECUTE FUNCTION TRACE
        !          11750:        BRN  ASG07            AND LOOP BACK
        !          11751:        EJC
        !          11752: *
        !          11753: *      ASIGN (CONTINUED)
        !          11754: *
        !          11755: *      HERE FOR PRINT TRACE
        !          11756: *
        !          11757: ASG09  JSR  PRTSN            PRINT STATEMENT NUMBER
        !          11758:        JSR  PRTNV            PRINT NAME = VALUE
        !          11759:        BRN  ASG07            LOOP BACK FOR NEXT TRBLK
        !          11760: *
        !          11761: *      HERE FOR OUTPUT ASSOCIATION
        !          11762: *
        !          11763: ASG10  BZE  KVOUP,ASG07      IGNORE OUTPUT ASSOC IF OUTPUT OFF
        !          11764:        MOV  XR,XL            ELSE COPY TRBLK POINTER
        !          11765:        MOV  TRVAL(XR),-(XS)  STACK VALUE TO OUTPUT
        !          11766:        JSR  GTSTG            CONVERT TO STRING
        !          11767:        PPM  ASG12            GET DATATYPE NAME IF UNCONVERTIBLE
        !          11768: *
        !          11769: *      MERGE WITH STRING FOR OUTPUT
        !          11770: *
        !          11771: ASG11  MOV  TRTRI(XL),WA     TRTIO BLK PTR
        !          11772:        BZE  WA,ASG13         JUMP IF STANDARD OUTPUT FILE
        !          11773: *
        !          11774: *      HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
        !          11775: *
        !          11776:        MOV  WA,XL            COPY TRTIO BLOCK PTR TO XL
        !          11777:        MOV  TRTAG(XL),WA     GET IOTAG
        !          11778:        BZE  WA,ASG3A         FAIL IF ENDFILE DONE
        !          11779:        MOV  SCLEN(XR),WC     STRING LENGTH
        !          11780:        JSR  SYSOU            CALL SYSTEM OUTPUT ROUTINE
        !          11781:        PPM  ASG3A            FAIL RETURN
        !          11782:        PPM  EROSI            ERROR RETURN
        !          11783:        EXI                   ELSE ALL DONE, RETURN TO CALLER
        !          11784: *
        !          11785: *      IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
        !          11786: *
        !          11787: ASG12  JSR  DTYPE            CALL DATATYPE ROUTINE
        !          11788:        BRN  ASG11            MERGE
        !          11789: *
        !          11790: *      HERE TO PRINT A STRING
        !          11791: *
        !          11792: ASG13  BEQ  TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT
        !          11793:        JSR  PRTSF            PRINT STRING AND FLUSH BUFFER
        !          11794:        EXI                   RETURN TO CALLER
        !          11795:        EJC
        !          11796: *
        !          11797: *      ASIGN (CONTINUED)
        !          11798: *
        !          11799: *      HERE FOR KEYWORD ASSIGNMENT
        !          11800: *
        !          11801: ASG14  MOV  KVNUM(XL),XL     LOAD KEYWORD NUMBER
        !          11802:        BEQ  XL,=K$ETX,ASG19  JUMP IF ERRTEXT
        !          11803:        MOV  WB,XR            COPY VALUE TO BE ASSIGNED
        !          11804:        JSR  GTINT            CONVERT TO INTEGER
        !          11805:        ERR  203,KEYWORD VALUE ASSIGNED IS NOT INTEGER
        !          11806:        LDI  ICVAL(XR)        ELSE LOAD VALUE
        !          11807:        BEQ  XL,=K$STL,ASG16  JUMP IF SPECIAL CASE OF STLIMIT
        !          11808:        BEQ  XL,=K$COD,ASG24  JUMP IF SPECIAL CASE OF CODE
        !          11809:        MFI  WA,ASG18         ELSE GET ADDR INTEGER, TEST OVFLOW
        !          11810:        BGE  WA,MXLEN,ASG18   FAIL IF TOO LARGE
        !          11811:        BEQ  XL,=K$ERT,ASG17  JUMP IF SPECIAL CASE OF ERRTYPE
        !          11812: .IF    .CNPF
        !          11813: .ELSE
        !          11814:        BEQ  XL,=K$PFL,ASG21  JUMP IF SPECIAL CASE OF PROFILE
        !          11815: .FI
        !          11816:        BLT  XL,=K$P$$,ASG15  JUMP UNLESS PROTECTED
        !          11817:        ERB  204,KEYWORD IN ASSIGNMENT IS PROTECTED
        !          11818: *
        !          11819: *      HERE TO DO ASSIGNMENT IF NOT PROTECTED
        !          11820: *
        !          11821: ASG15  MOV  WA,KVANC(XL)     STORE NEW VALUE
        !          11822:        EXI                   RETURN TO ASIGN CALLER
        !          11823: *
        !          11824: *      HERE FOR SPECIAL CASE OF STLIMIT
        !          11825: *
        !          11826: *      SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
        !          11827: *      IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
        !          11828: *
        !          11829: ASG16  SBI  KVSTL            SUBTRACT OLD LIMIT
        !          11830:        ADI  KVSTC            ADD OLD COUNTER
        !          11831:        STI  KVSTC            STORE NEW COUNTER VALUE
        !          11832:        LDI  ICVAL(XR)        RELOAD NEW LIMIT VALUE
        !          11833:        STI  KVSTL            STORE NEW LIMIT VALUE
        !          11834:        EXI                   RETURN TO ASIGN CALLER
        !          11835:        EJC
        !          11836: *
        !          11837: *      ASIGN (CONTINUED)
        !          11838: *
        !          11839: *      HERE FOR SPECIAL CASE OF ERRTYPE
        !          11840: *
        !          11841: ASG17  BLE  WA,=NINI9,ERROR  OK TO SIGNAL IF IN RANGE
        !          11842: *
        !          11843: *      HERE IF VALUE ASSIGNED IS OUT OF RANGE
        !          11844: *
        !          11845: ASG18  ERB  205,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
        !          11846: *
        !          11847: *      HERE FOR SPECIAL CASE OF ERRTEXT
        !          11848: *
        !          11849: ASG19  MOV  WB,-(XS)         STACK VALUE
        !          11850:        JSR  GTSTG            CONVERT TO STRING
        !          11851:        ERR  206,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
        !          11852:        MOV  XR,R$ETX         MAKE ASSIGNMENT
        !          11853:        EXI                   RETURN TO CALLER
        !          11854: *
        !          11855: *      PRINT STRING TO TERMINAL
        !          11856: *
        !          11857: ASG20  JSR  PTTST            PRINT STRING TO TERMINAL
        !          11858:        JSR  PTTFH            FLUSH TERMINAL BUFFER
        !          11859:        EXI                   RETURN
        !          11860: .IF    .CNPF
        !          11861: .ELSE
        !          11862: *      HERE FOR KEYWORD PROFILE
        !          11863: *
        !          11864: ASG21  BGT  WA,=NUM02,ASG18  MOAN IF NOT 0,1, OR 2
        !          11865:        BZE  WA,ASG15         JUST ASSIGN IF ZERO
        !          11866:        BZE  PFDMP,ASG22      BRANCH IF FIRST ASSIGNMENT
        !          11867:        BEQ  WA,PFDMP,ASG23   ALSO IF SAME VALUE AS BEFORE
        !          11868:        ERB  207,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE
        !          11869: *
        !          11870: ASG22  MOV  WA,PFDMP         NOTE VALUE ON FIRST ASSIGNMENT
        !          11871: ASG23  JSR  SYSTM            GET THE TIME
        !          11872:        STI  PFSTM            FUDGE SOME KIND OF START TIME
        !          11873:        BRN  ASG15            AND GO ASSIGN
        !          11874: .FI
        !          11875: *
        !          11876: *      HERE FOR KEYWORD ASSIGNMENT TO CODE
        !          11877: *
        !          11878: ASG24  STI  KVCOD            STORE VALUE
        !          11879:        EXI                   RETURN TO CALLER
        !          11880:        ENP                   END PROCEDURE ASIGN
        !          11881:        EJC
        !          11882: *
        !          11883: *      ASINP -- ASSIGN DURING PATTERN MATCH
        !          11884: *
        !          11885: *      ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
        !          11886: *      AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
        !          11887: *      VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
        !          11888: *
        !          11889: *      (XL)                  BASE POINTER FOR VARIABLE
        !          11890: *      (WA)                  OFFSET FOR VARIABLE
        !          11891: *      (WB)                  VALUE TO BE ASSIGNED
        !          11892: *      JSR  ASINP            CALL TO ASSIGN VALUE TO VARIABLE
        !          11893: *      PPM  LOC              TRANSFER LOC IF FAILURE
        !          11894: *      (XR,XL)               DESTROYED
        !          11895: *      (WA,WB,WC,RA)         DESTROYED
        !          11896: *
        !          11897: ASINP  PRC  R,1              ENTRY POINT, RECURSIVE
        !          11898:        ADD  WA,XL            POINT TO VARIABLE
        !          11899:        MOV  (XL),XR          LOAD CURRENT CONTENTS
        !          11900:        BEQ  (XR),=B$TRT,ASNP1 JUMP IF TRAPPED
        !          11901:        MOV  WB,(XL)          ELSE PERFORM ASSIGNMENT
        !          11902:        ZER  XL               CLEAR GARBAGE VALUE IN XL
        !          11903:        EXI                   RETURN TO ASINP CALLER
        !          11904: *
        !          11905: *      HERE IF VARIABLE IS TRAPPED
        !          11906: *
        !          11907: ASNP1  SUB  WA,XL            RESTORE BASE POINTER
        !          11908:        MOV  PMSSL,-(XS)      STACK SUBJECT STRING LENGTH
        !          11909:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE PTR
        !          11910:        MOV  R$PMS,-(XS)      STACK SUBJECT STRING POINTER
        !          11911:        MOV  PMDFL,-(XS)      STACK DOT FLAG
        !          11912:        JSR  ASIGN            CALL FULL-BLOWN ASSIGNMENT ROUTINE
        !          11913:        PPM  ASNP2            JUMP IF FAILURE
        !          11914:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
        !          11915:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
        !          11916:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
        !          11917:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
        !          11918:        EXI                   RETURN TO ASINP CALLER
        !          11919: *
        !          11920: *      HERE IF FAILURE IN ASIGN CALL
        !          11921: *
        !          11922: ASNP2  MOV  (XS)+,PMDFL      RESTORE DOT FLAG
        !          11923:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
        !          11924:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
        !          11925:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
        !          11926:        EXI  1                TAKE FAILURE EXIT
        !          11927:        ENP                   END PROCEDURE ASINP
        !          11928:        EJC
        !          11929: *
        !          11930: *      BLKLN -- DETERMINE LENGTH OF BLOCK
        !          11931: *
        !          11932: *      BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
        !          11933: *
        !          11934: *      (WA)                  FIRST WORD OF BLOCK
        !          11935: *      (XR)                  POINTER TO BLOCK
        !          11936: *      JSR  BLKLN            CALL TO GET BLOCK LENGTH
        !          11937: *      (WA)                  LENGTH OF BLOCK IN BAUS
        !          11938: *      (XL)                  DESTROYED
        !          11939: *
        !          11940: *      BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
        !          11941: *      PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
        !          11942: *
        !          11943: *      THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
        !          11944: *      BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
        !          11945: *
        !          11946: BLKLN  PRC  E,0              ENTRY POINT
        !          11947:        MOV  WA,XL            COPY FIRST WORD
        !          11948:        LEI  XL               GET ENTRY ID (BL$XX)
        !          11949:        BSW  XL,BL$$$,BLN00   SWITCH ON BLOCK TYPE
        !          11950:        IFF  BL$AR,BLN01      ARBLK
        !          11951:        IFF  BL$CD,BLN01      CDBLK
        !          11952:        IFF  BL$CO,BLN12      COBLK
        !          11953:        IFF  BL$DF,BLN01      DFBLK
        !          11954:        IFF  BL$EF,BLN01      EFBLK
        !          11955:        IFF  BL$EX,BLN01      EXBLK
        !          11956:        IFF  BL$PF,BLN01      PFBLK
        !          11957:        IFF  BL$TB,BLN01      TBBLK
        !          11958:        IFF  BL$VC,BLN01      VCBLK
        !          11959:        IFF  BL$EV,BLN03      EVBLK
        !          11960:        IFF  BL$KV,BLN03      KVBLK
        !          11961:        IFF  BL$P0,BLN02      P0BLK
        !          11962:        IFF  BL$SE,BLN02      SEBLK
        !          11963:        IFF  BL$NM,BLN03      NMBLK
        !          11964:        IFF  BL$P1,BLN03      P1BLK
        !          11965:        IFF  BL$P2,BLN04      P2BLK
        !          11966:        IFF  BL$TE,BLN04      TEBLK
        !          11967:        IFF  BL$FF,BLN05      FFBLK
        !          11968:        IFF  BL$TR,BLN05      TRBLK
        !          11969:        IFF  BL$CT,BLN06      CTBLK
        !          11970:        IFF  BL$IC,BLN07      ICBLK
        !          11971:        IFF  BL$PD,BLN08      PDBLK
        !          11972: .IF    .CNBF
        !          11973: .ELSE
        !          11974:        IFF  BL$BC,BLN04      BCBLK
        !          11975:        IFF  BL$BF,BLN11      BFBLK
        !          11976: .FI
        !          11977: .IF    .CNRA
        !          11978: .ELSE
        !          11979:        IFF  BL$RC,BLN09      RCBLK
        !          11980: .FI
        !          11981:        IFF  BL$SC,BLN10      SCBLK
        !          11982:        ESW                   END OF JUMP TABLE ON BLOCK TYPE
        !          11983:        EJC
        !          11984: *
        !          11985: *      BLKLN (CONTINUED)
        !          11986: *
        !          11987: *      HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
        !          11988: *
        !          11989: BLN00  MOV  1(XR),WA         LOAD LENGTH
        !          11990:        EXI                   RETURN TO BLKLN CALLER
        !          11991: *
        !          11992: *      HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
        !          11993: *
        !          11994: BLN01  MOV  2(XR),WA         LOAD LENGTH FROM THIRD WORD
        !          11995:        EXI                   RETURN TO BLKLN CALLER
        !          11996: *
        !          11997: *      HERE FOR TWO WORD BLOCKS (P0,SE)
        !          11998: *
        !          11999: BLN02  MOV  *NUM02,WA        LOAD LENGTH (TWO WORDS)
        !          12000:        EXI                   RETURN TO BLKLN CALLER
        !          12001: *
        !          12002: *      HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
        !          12003: *
        !          12004: BLN03  MOV  *NUM03,WA        LOAD LENGTH (THREE WORDS)
        !          12005:        EXI                   RETURN TO BLKLN CALLER
        !          12006: *
        !          12007: *      HERE FOR FOUR WORD BLOCKS (P2,TE)
        !          12008: *
        !          12009: BLN04  MOV  *NUM04,WA        LOAD LENGTH (FOUR WORDS)
        !          12010:        EXI                   RETURN TO BLKLN CALLER
        !          12011: *
        !          12012: *      HERE FOR FIVE WORD BLOCKS (FF,TR)
        !          12013: *
        !          12014: BLN05  MOV  *NUM05,WA        LOAD LENGTH
        !          12015:        EXI                   RETURN TO BLKLN CALLER
        !          12016:        EJC
        !          12017: *
        !          12018: *      BLKLN (CONTINUED)
        !          12019: *
        !          12020: *      HERE FOR CTBLK
        !          12021: *
        !          12022: BLN06  MOV  *CTSI$,WA        SET SIZE OF CTBLK
        !          12023:        EXI                   RETURN TO BLKLN CALLER
        !          12024: *
        !          12025: *      HERE FOR ICBLK
        !          12026: *
        !          12027: BLN07  MOV  *ICSI$,WA        SET SIZE OF ICBLK
        !          12028:        EXI                   RETURN TO BLKLN CALLER
        !          12029: *
        !          12030: *      HERE FOR PDBLK
        !          12031: *
        !          12032: BLN08  MOV  PDDFP(XR),XL     POINT TO DFBLK
        !          12033:        MOV  DFPDL(XL),WA     LOAD PDBLK LENGTH FROM DFBLK
        !          12034:        EXI                   RETURN TO BLKLN CALLER
        !          12035: .IF    .CNRA
        !          12036: .ELSE
        !          12037: *
        !          12038: *      HERE FOR RCBLK
        !          12039: *
        !          12040: BLN09  MOV  *RCSI$,WA        SET SIZE OF RCBLK
        !          12041:        EXI                   RETURN TO BLKLN CALLER
        !          12042: .FI
        !          12043: *
        !          12044: *      HERE FOR SCBLK
        !          12045: *
        !          12046: BLN10  MOV  SCLEN(XR),WA     LOAD LENGTH IN CHARACTERS
        !          12047:        CTB  WA,SCSI$         CALCULATE LENGTH IN BAUS
        !          12048:        EXI                   RETURN TO BLKLN CALLER
        !          12049: .IF    .CNBF
        !          12050: .ELSE
        !          12051: *
        !          12052: *      HERE FOR BFBLK
        !          12053: *
        !          12054: BLN11  MOV  BFALC(XR),WA     GET ALLOCATION IN BAUS
        !          12055:        CTB  WA,BFSI$         CALCULATE LENGTH IN BAUS
        !          12056:        EXI                   RETURN TO BLKLN CALLER
        !          12057: .FI
        !          12058: *
        !          12059: *      HERE FOR COBLK
        !          12060: *
        !          12061: BLN12  MOV  *COSI$,WA        GET SIZE IN BAUS
        !          12062:        EXI                   RETURN TO BLKLN CALLER
        !          12063:        ENP                   END PROCEDURE BLKLN
        !          12064:        EJC
        !          12065: *
        !          12066: *      CBLCK -- COPY A BLOCK
        !          12067: *
        !          12068: *      (XS)                  BLOCK TO BE COPIED
        !          12069: *      JSR  CBLCK            CALL TO COPY BLOCK
        !          12070: *      PPM  LOC              RETURN IF BLOCK HAS NO IDVAL FIELD
        !          12071: *                            NORMAL RETURN IF IDVAL FIELD
        !          12072: *      (XR)                  COPY OF BLOCK
        !          12073: *      (XS)                  POPPED
        !          12074: *      (XL,WA,WB,WC)         DESTROYED
        !          12075: *
        !          12076: CBLCK  PRC  N,1              ENTRY POINT
        !          12077:        MOV  (XS),XR          LOAD ARGUMENT
        !          12078:        BEQ  XR,=NULLS,CBL10  RETURN ARGUMENT IF IT IS NULL
        !          12079:        MOV  (XR),WA          ELSE LOAD TYPE WORD
        !          12080:        MOV  WA,WB            COPY TYPE WORD
        !          12081:        JSR  BLKLN            GET LENGTH OF ARGUMENT BLOCK
        !          12082:        MOV  XR,XL            COPY POINTER
        !          12083:        JSR  ALLOC            ALLOCATE BLOCK OF SAME SIZE
        !          12084:        MOV  XR,(XS)          STORE POINTER TO COPY
        !          12085:        MVW                   COPY CONTENTS OF OLD BLOCK TO NEW
        !          12086:        MOV  (XS),XR          RELOAD POINTER TO START OF COPY
        !          12087:        BEQ  WB,=B$TBT,CBL05  JUMP IF TABLE
        !          12088:        BEQ  WB,=B$VCT,CBL01  JUMP IF VECTOR
        !          12089:        BEQ  WB,=B$PDT,CBL01  JUMP IF PROGRAM DEFINED
        !          12090: .IF    .CNBF
        !          12091: .ELSE
        !          12092:        BEQ  WB,=B$BCT,CBL11  JUMP IF BUFFER
        !          12093: .FI
        !          12094:        BNE  WB,=B$ART,CBL10  RETURN COPY IF NOT ARRAY
        !          12095: *
        !          12096: *      HERE FOR ARRAY (ARBLK)
        !          12097: *
        !          12098:        ADD  AROFS(XR),XR     POINT TO PROTOTYPE FIELD
        !          12099:        BRN  CBL02            JUMP TO MERGE
        !          12100: *
        !          12101: *      HERE FOR VECTOR, PROGRAM DEFINED
        !          12102: *
        !          12103: CBL01  ADD  *PDFLD,XR        POINT TO PDFLD = VCVLS
        !          12104: *
        !          12105: *      MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
        !          12106: *      BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
        !          12107: *
        !          12108: CBL02  MOV  (XR),XL          LOAD NEXT POINTER
        !          12109: *
        !          12110: *      LOOP TO GET VALUE AT END OF TRBLK CHAIN
        !          12111: *
        !          12112: CBL03  BNE  (XL),=B$TRT,CBL04 JUMP IF NOT TRAPPED
        !          12113:        MOV  TRVAL(XL),XL     ELSE POINT TO NEXT VALUE
        !          12114:        BRN  CBL03            AND LOOP BACK
        !          12115:        EJC
        !          12116: *
        !          12117: *      CBLCK (CONTINUED)
        !          12118: *
        !          12119: *      HERE WITH UNTRAPPED VALUE IN XL
        !          12120: *
        !          12121: CBL04  MOV  XL,(XR)+         STORE REAL VALUE, BUMP POINTER
        !          12122:        BNE  XR,DNAMP,CBL02   LOOP BACK IF MORE TO GO
        !          12123:        BRN  CBL09            ELSE JUMP TO EXIT
        !          12124: *
        !          12125: *      HERE TO COPY A TABLE
        !          12126: *
        !          12127: CBL05  ZER  IDVAL(XR)        ZERO ID TO STOP DUMP BLOWING UP
        !          12128:        MOV  *TESI$,WA        SET SIZE OF TEBLK
        !          12129:        MOV  *TBBUK,WC        SET INITIAL OFFSET
        !          12130: *
        !          12131: *      LOOP THROUGH BUCKETS IN TABLE
        !          12132: *
        !          12133: CBL06  MOV  (XS),XR          LOAD TABLE POINTER
        !          12134:        BEQ  WC,TBLEN(XR),CBL09 JUMP TO EXIT IF ALL DONE
        !          12135:        ADD  WC,XR            ELSE POINT TO NEXT BUCKET HEADER
        !          12136:        ICA  WC               BUMP OFFSET
        !          12137:        SUB  *TENXT,XR        SUBTRACT LINK OFFSET TO MERGE
        !          12138: *
        !          12139: *      LOOP THROUGH TEBLKS ON ONE CHAIN
        !          12140: *
        !          12141: CBL07  MOV  TENXT(XR),XL     LOAD POINTER TO NEXT TEBLK
        !          12142:        MOV  (XS),TENXT(XR)   SET END OF CHAIN POINTER IN CASE
        !          12143:        BEQ  (XL),=B$TBT,CBL06 BACK FOR NEXT BUCKET IF CHAIN END
        !          12144:        MOV  XR,-(XS)         ELSE STACK PTR TO PREVIOUS BLOCK
        !          12145:        MOV  *TESI$,WA        SET SIZE OF TEBLK
        !          12146:        JSR  ALLOC            ALLOCATE NEW TEBLK
        !          12147:        MOV  XR,WB            SAVE PTR TO NEW TEBLK
        !          12148:        MVW                   COPY OLD TEBLK TO NEW TEBLK
        !          12149:        MOV  WB,XR            RESTORE POINTER TO NEW TEBLK
        !          12150:        MOV  (XS)+,XL         RESTORE POINTER TO PREVIOUS BLOCK
        !          12151:        MOV  XR,TENXT(XL)     LINK NEW BLOCK TO PREVIOUS
        !          12152:        MOV  XR,XL            COPY POINTER TO NEW BLOCK
        !          12153: *
        !          12154: *      LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
        !          12155: *
        !          12156: CBL08  MOV  TEVAL(XL),XL     LOAD VALUE
        !          12157:        BEQ  (XL),=B$TRT,CBL08 LOOP BACK IF TRAPPED
        !          12158:        MOV  XL,TEVAL(XR)     STORE UNTRAPPED VALUE IN TEBLK
        !          12159:        BRN  CBL07            BACK FOR NEXT TEBLK
        !          12160: *
        !          12161: *      COMMON EXIT POINT
        !          12162: *
        !          12163: CBL09  MOV  (XS)+,XR         LOAD POINTER TO BLOCK
        !          12164:        EXI                   RETURN
        !          12165: *
        !          12166: *      ALTERNATIVE RETURN
        !          12167: *
        !          12168: CBL10  EXI  1                RETURN
        !          12169: .IF    .CNBF
        !          12170: .ELSE
        !          12171:        EJC
        !          12172: *
        !          12173: *      HERE TO COPY BUFFER
        !          12174: *
        !          12175: CBL11  MOV  BCBUF(XR),XL     GET BFBLK PTR
        !          12176:        MOV  BFALC(XL),WA     GET ALLOCATION
        !          12177:        CTB  WA,BFSI$         SET TOTAL SIZE
        !          12178:        MOV  XR,XL            SAVE BCBLK PTR
        !          12179:        JSR  ALLOC            ALLOCATE BFBLK
        !          12180:        MOV  BCBUF(XL),WB     GET OLD BFBLK
        !          12181:        MOV  XR,BCBUF(XL)     SET POINTER TO NEW BFBLK
        !          12182:        MOV  WB,XL            POINT TO OLD BFBLK
        !          12183:        MVW                   COPY BFBLK TOO
        !          12184:        ZER  XL               CLEAR RUBBISH PTR
        !          12185:        BRN  CBL09            BRANCH TO EXIT
        !          12186: .FI
        !          12187:        ENP                   END PROCEDURE CBLCK
        !          12188:        EJC
        !          12189: *
        !          12190: *      CDGCG -- GENERATE CODE FOR COMPLEX GOTO
        !          12191: *
        !          12192: *      USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
        !          12193: *
        !          12194: *      (WB)                  MUST BE COLLECTABLE
        !          12195: *      (XR)                  EXPRESSION POINTER
        !          12196: *      JSR  CDGCG            CALL TO GENERATE COMPLEX GOTO
        !          12197: *      (XL,XR,WA)            DESTROYED
        !          12198: *
        !          12199: CDGCG  PRC  E,0              ENTRY POINT
        !          12200:        MOV  CMOPN(XR),XL     GET UNARY GOTO OPERATOR
        !          12201:        MOV  CMROP(XR),XR     POINT TO GOTO OPERAND
        !          12202:        BEQ  XL,=OPDVD,CDGC2  JUMP IF DIRECT GOTO
        !          12203:        JSR  CDGNM            GENERATE OPND BY NAME IF NOT DIRECT
        !          12204: *
        !          12205: *      RETURN POINT
        !          12206: *
        !          12207: CDGC1  MOV  XL,WA            GOTO OPERATOR
        !          12208:        JSR  CDWRD            GENERATE IT
        !          12209:        EXI                   RETURN TO CALLER
        !          12210: *
        !          12211: *      DIRECT GOTO
        !          12212: *
        !          12213: CDGC2  JSR  CDGVL            GENERATE OPERAND BY VALUE
        !          12214:        BRN  CDGC1            MERGE TO RETURN
        !          12215:        ENP                   END PROCEDURE CDGCG
        !          12216:        EJC
        !          12217: *
        !          12218: *      CDGEX -- BUILD EXPRESSION BLOCK
        !          12219: *
        !          12220: *      CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
        !          12221: *      EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
        !          12222: *
        !          12223: *      (WC)                  SOME COLLECTABLE VALUE
        !          12224: *      (WB)                  INTEGER IN RANGE 0 LE X LE MXLEN
        !          12225: *      (XL)                  PTR TO EXPRESSION TREE
        !          12226: *      JSR  CDGEX            CALL TO BUILD EXPRESSION
        !          12227: *      (XR)                  PTR TO SEBLK OR EXBLK
        !          12228: *      (XL,WA,WB)            DESTROYED
        !          12229: *
        !          12230: CDGEX  PRC  R,0              ENTRY POINT, RECURSIVE
        !          12231:        BLO  (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE
        !          12232: *
        !          12233: *      HERE FOR NATURAL VARIABLE, BUILD SEBLK
        !          12234: *
        !          12235:        MOV  *SESI$,WA        SET SIZE OF SEBLK
        !          12236:        JSR  ALLOC            ALLOCATE SPACE FOR SEBLK
        !          12237:        MOV  =B$SEL,(XR)      SET TYPE WORD
        !          12238:        MOV  XL,SEVAR(XR)     STORE VRBLK POINTER
        !          12239:        EXI                   RETURN TO CDGEX CALLER
        !          12240: *
        !          12241: *      HERE IF NOT VARIABLE, BUILD EXBLK
        !          12242: *
        !          12243: CDGX1  MOV  XL,XR            COPY TREE POINTER
        !          12244:        MOV  WC,-(XS)         SAVE WC
        !          12245:        MOV  CWCOF,XL         SAVE CURRENT OFFSET
        !          12246:        MOV  (XR),WA          GET TYPE WORD
        !          12247:        BNE  WA,=B$CMT,CDGX2  CALL BY VALUE IF NOT CMBLK
        !          12248:        BGE  CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE
        !          12249:        EJC
        !          12250: *
        !          12251: *      CDGEX (CONTINUED)
        !          12252: *
        !          12253: *      HERE IF EXPRESSION CAN BE EVALUATED BY NAME
        !          12254: *
        !          12255:        JSR  CDGNM            GENERATE CODE BY NAME
        !          12256:        MOV  =ORNM$,WA        LOAD RETURN BY NAME WORD
        !          12257:        BRN  CDGX3            MERGE WITH VALUE CASE
        !          12258: *
        !          12259: *      HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
        !          12260: *
        !          12261: CDGX2  JSR  CDGVL            GENERATE CODE BY VALUE
        !          12262:        MOV  =ORVL$,WA        LOAD RETURN BY VALUE WORD
        !          12263: *
        !          12264: *      MERGE HERE TO CONSTRUCT EXBLK
        !          12265: *
        !          12266: CDGX3  JSR  CDWRD            GENERATE RETURN WORD
        !          12267:        JSR  EXBLD            BUILD EXBLK
        !          12268:        MOV  (XS)+,WC         RESTORE WC
        !          12269:        EXI                   RETURN TO CDGEX CALLER
        !          12270:        ENP                   END PROCEDURE CDGEX
        !          12271:        EJC
        !          12272: *
        !          12273: *      CDGNM -- GENERATE CODE BY NAME
        !          12274: *
        !          12275: *      CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
        !          12276: *      GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
        !          12277: *      DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
        !          12278: *      TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
        !          12279: *
        !          12280: *      CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
        !          12281: *      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
        !          12282: *
        !          12283: *      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
        !          12284: *      (XR)                  PTR TO TREE GENERATED BY EXPAN
        !          12285: *      (WC)                  CONSTANT FLAG (SEE BELOW)
        !          12286: *      JSR  CDGNM            CALL TO GENERATE CODE BY NAME
        !          12287: *      (XR,WA)               DESTROYED
        !          12288: *      (WC)                  SET NON-ZERO IF NON-CONSTANT
        !          12289: *
        !          12290: *      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
        !          12291: *      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
        !          12292: *      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
        !          12293: *
        !          12294: *      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
        !          12295: *
        !          12296: CDGNM  PRC  R,0              ENTRY POINT, RECURSIVE
        !          12297:        MOV  XL,-(XS)         SAVE ENTRY XL
        !          12298:        MOV  WB,-(XS)         SAVE ENTRY WB
        !          12299:        CHK                   CHECK FOR STACK OVERFLOW
        !          12300:        MOV  (XR),WA          LOAD TYPE WORD
        !          12301:        BEQ  WA,=B$CMT,CGN04  JUMP IF CMBLK
        !          12302:        BHI  WA,=B$VR$,CGN02  JUMP IF SIMPLE VARIABLE
        !          12303: *
        !          12304: *      MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
        !          12305: *
        !          12306: CGN01  ERB  208,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED
        !          12307: *
        !          12308: *      HERE FOR NATURAL VARIABLE REFERENCE
        !          12309: *
        !          12310: CGN02  MOV  =OLVN$,WA        LOAD VARIABLE LOAD CALL
        !          12311:        JSR  CDWRD            GENERATE IT
        !          12312:        MOV  XR,WA            COPY VRBLK POINTER
        !          12313:        JSR  CDWRD            GENERATE VRBLK POINTER
        !          12314:        EJC
        !          12315: *
        !          12316: *      CDGNM (CONTINUED)
        !          12317: *
        !          12318: *      HERE TO EXIT WITH WC SET CORRECTLY
        !          12319: *
        !          12320: CGN03  MOV  (XS)+,WB         RESTORE ENTRY WB
        !          12321:        MOV  (XS)+,XL         RESTORE ENTRY XL
        !          12322:        EXI                   RETURN TO CDGNM CALLER
        !          12323: *
        !          12324: *      HERE FOR CMBLK
        !          12325: *
        !          12326: CGN04  MOV  XR,XL            COPY CMBLK POINTER
        !          12327:        MOV  CMTYP(XR),XR     LOAD CMBLK TYPE
        !          12328:        BGE  XR,=C$$NM,CGN01  ERROR IF NOT NAME OPERAND
        !          12329:        BSW  XR,C$$NM         ELSE SWITCH ON TYPE
        !          12330:        IFF  C$ARR,CGN05      ARRAY REFERENCE
        !          12331:        IFF  C$FNC,CGN08      FUNCTION CALL
        !          12332:        IFF  C$DEF,CGN09      DEFERRED EXPRESSION
        !          12333:        IFF  C$IND,CGN10      INDIRECT REFERENCE
        !          12334:        IFF  C$KEY,CGN11      KEYWORD REFERENCE
        !          12335:        IFF  C$UBO,CGN08      UNDEFINED BINARY OP
        !          12336:        IFF  C$UUO,CGN08      UNDEFINED UNARY OP
        !          12337:        ESW                   END SWITCH ON CMBLK TYPE
        !          12338: *
        !          12339: *      HERE TO GENERATE CODE FOR ARRAY REFERENCE
        !          12340: *
        !          12341: CGN05  MOV  *CMOPN,WB        POINT TO ARRAY OPERAND
        !          12342: *
        !          12343: *      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
        !          12344: *
        !          12345: CGN06  JSR  CMGEN            GENERATE CODE FOR NEXT OPERAND
        !          12346:        MOV  CMLEN(XL),WC     LOAD LENGTH OF CMBLK
        !          12347:        BLT  WB,WC,CGN06      LOOP TILL ALL GENERATED
        !          12348: *
        !          12349: *      GENERATE APPROPRIATE ARRAY CALL
        !          12350: *
        !          12351:        MOV  =OAON$,WA        LOAD ONE-SUBSCRIPT CASE CALL
        !          12352:        BEQ  WC,*CMAR1,CGN07  JUMP TO EXIT IF ONE SUBSCRIPT CASE
        !          12353:        MOV  =OAMN$,WA        ELSE LOAD MULTI-SUBSCRIPT CASE CALL
        !          12354:        JSR  CDWRD            GENERATE CALL
        !          12355:        MOV  WC,WA            COPY CMBLK LENGTH
        !          12356:        BTW  WA               CONVERT TO WORDS
        !          12357:        SUB  =CMVLS,WA        CALCULATE NUMBER OF SUBSCRIPTS
        !          12358:        EJC
        !          12359: *
        !          12360: *      CDGNM (CONTINUED)
        !          12361: *
        !          12362: *      HERE TO EXIT GENERATING WORD (NON-CONSTANT)
        !          12363: *
        !          12364: CGN07  MNZ  WC               SET RESULT NON-CONSTANT
        !          12365:        JSR  CDWRD            GENERATE WORD
        !          12366:        BRN  CGN03            BACK TO EXIT
        !          12367: *
        !          12368: *      HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
        !          12369: *
        !          12370: CGN08  MOV  XL,XR            COPY CMBLK POINTER
        !          12371:        JSR  CDGVL            GEN CODE BY VALUE FOR CALL
        !          12372:        MOV  =OFNE$,WA        GET EXTRA CALL FOR BY NAME
        !          12373:        BRN  CGN07            BACK TO GENERATE AND EXIT
        !          12374: *
        !          12375: *      HERE TO GENERATE CODE FOR DEFERED EXPRESSION
        !          12376: *
        !          12377: CGN09  MOV  CMROP(XL),XR     CHECK IF VARIABLE
        !          12378:        BHI  (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR
        !          12379:        MOV  XR,XL            COPY PTR TO EXPRESSION TREE
        !          12380:        JSR  CDGEX            ELSE BUILD EXBLK
        !          12381:        MOV  =OLEX$,WA        SET CALL TO LOAD EXPR BY NAME
        !          12382:        JSR  CDWRD            GENERATE IT
        !          12383:        MOV  XR,WA            COPY EXBLK POINTER
        !          12384:        JSR  CDWRD            GENERATE EXBLK POINTER
        !          12385:        BRN  CGN03            BACK TO EXIT
        !          12386: *
        !          12387: *      HERE TO GENERATE CODE FOR INDIRECT REFERENCE
        !          12388: *
        !          12389: CGN10  MOV  CMROP(XL),XR     GET OPERAND
        !          12390:        JSR  CDGVL            GENERATE CODE BY VALUE FOR IT
        !          12391:        MOV  =OINN$,WA        LOAD CALL FOR INDIRECT BY NAME
        !          12392:        BRN  CGN12            MERGE
        !          12393: *
        !          12394: *      HERE TO GENERATE CODE FOR KEYWORD REFERENCE
        !          12395: *
        !          12396: CGN11  MOV  CMROP(XL),XR     GET OPERAND
        !          12397:        JSR  CDGNM            GENERATE CODE BY NAME FOR IT
        !          12398:        MOV  =OKWN$,WA        LOAD CALL FOR KEYWORD BY NAME
        !          12399: *
        !          12400: *      KEYWORD, INDIRECT MERGE HERE
        !          12401: *
        !          12402: CGN12  JSR  CDWRD            GENERATE CODE FOR OPERATOR
        !          12403:        BRN  CGN03            EXIT
        !          12404:        ENP                   END PROCEDURE CDGNM
        !          12405:        EJC
        !          12406: *
        !          12407: *      CDGVL -- GENERATE CODE BY VALUE
        !          12408: *
        !          12409: *      CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
        !          12410: *      GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
        !          12411: *      DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
        !          12412: *      TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
        !          12413: *
        !          12414: *      CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
        !          12415: *      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
        !          12416: *
        !          12417: *      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
        !          12418: *      (XR)                  PTR TO TREE GENERATED BY EXPAN
        !          12419: *      (WC)                  CONSTANT FLAG (SEE BELOW)
        !          12420: *      JSR  CDGVL            CALL TO GENERATE CODE BY VALUE
        !          12421: *      (XR,WA)               DESTROYED
        !          12422: *      (WC)                  SET NON-ZERO IF NON-CONSTANT
        !          12423: *
        !          12424: *      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
        !          12425: *      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
        !          12426: *      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
        !          12427: *
        !          12428: *      IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
        !          12429: *      ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
        !          12430: *
        !          12431: *      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
        !          12432: *
        !          12433: CDGVL  PRC  R,0              ENTRY POINT, RECURSIVE
        !          12434:        MOV  (XR),WA          LOAD TYPE WORD
        !          12435:        BEQ  WA,=B$CMT,CGV01  JUMP IF CMBLK
        !          12436:        BLT  WA,=B$VRA,CGV00  JUMP IF ICBLK, RCBLK, SCBLK
        !          12437: *
        !          12438: *      HERE FOR VARIABLE VALUE REFERENCE
        !          12439: *
        !          12440: CGVL0  MNZ  WC               INDICATE NON-CONSTANT VALUE
        !          12441: *
        !          12442: *      MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
        !          12443: *      AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
        !          12444: *
        !          12445: CGV00  MOV  XR,WA            COPY PTR TO VAR OR CONSTANT
        !          12446:        JSR  CDWRD            GENERATE AS CODE WORD
        !          12447:        EXI                   RETURN TO CALLER
        !          12448:        EJC
        !          12449: *
        !          12450: *      CDGVL (CONTINUED)
        !          12451: *
        !          12452: *      HERE FOR TREE NODE (CMBLK)
        !          12453: *
        !          12454: CGV01  MOV  WB,-(XS)         SAVE ENTRY WB
        !          12455:        MOV  XL,-(XS)         SAVE ENTRY XL
        !          12456:        MOV  WC,-(XS)         SAVE ENTRY CONSTANT FLAG
        !          12457:        MOV  CWCOF,-(XS)      SAVE INITIAL CODE OFFSET
        !          12458:        CHK                   CHECK FOR STACK OVERFLOW
        !          12459: *
        !          12460: *      PREPARE TO GENERATE CODE FOR CMBLK. WC IS CLEARED TO
        !          12461: *      START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
        !          12462: *      CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
        !          12463: *      THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
        !          12464: *
        !          12465:        MOV  XR,XL            COPY CMBLK POINTER
        !          12466:        MOV  CMTYP(XR),XR     LOAD CMBLK TYPE
        !          12467:        ZER  WC               CLEAR OPTIMISE FLAG
        !          12468:        BLE  XR,=C$PR$,CGV02  JUMP IF NOT PREDICATE VALUE
        !          12469:        MNZ  WC               ELSE FORCE NON-CONSTANT CASE
        !          12470: *
        !          12471: *      HERE WITH WC SET APPROPRIATELY
        !          12472: *
        !          12473: CGV02  BSW  XR,C$$NV         SWITCH TO APPROPRIATE GENERATOR
        !          12474:        IFF  C$ARR,CGV03      ARRAY REFERENCE
        !          12475:        IFF  C$FNC,CGV05      FUNCTION CALL
        !          12476:        IFF  C$DEF,CGV14      DEFERRED EXPRESSION
        !          12477:        IFF  C$SEL,CGV15      SELECTION
        !          12478:        IFF  C$IND,CGV31      INDIRECT REFERENCE
        !          12479:        IFF  C$KEY,CGV27      KEYWORD REFERENCE
        !          12480:        IFF  C$UBO,CGV29      UNDEFINED BINOP
        !          12481:        IFF  C$UUO,CGV30      UNDEFINED UNOP
        !          12482:        IFF  C$BVL,CGV18      BINOPS WITH VAL OPDS
        !          12483:        IFF  C$ALT,CGV18      ALTERNATION
        !          12484:        IFF  C$UVL,CGV19      UNOPS WITH VALU OPND
        !          12485:        IFF  C$ASS,CGV21      ASSIGNMENT
        !          12486:        IFF  C$CNC,CGV24      CONCATENATION
        !          12487:        IFF  C$UNM,CGV27      UNOPS WITH NAME OPND
        !          12488:        IFF  C$CNP,CGV24      CONCAT. NOT PATTERN
        !          12489:        IFF  C$BVN,CGV26      BINARY $ AND .
        !          12490:        IFF  C$INT,CGV31      INTERROGATION
        !          12491:        IFF  C$NEG,CGV28      NEGATION
        !          12492:        IFF  C$PMT,CGV18      PATTERN MATCH
        !          12493:        ESW                   END SWITCH ON CMBLK TYPE
        !          12494:        EJC
        !          12495: *
        !          12496: *      CDGVL (CONTINUED)
        !          12497: *
        !          12498: *      HERE TO GENERATE CODE FOR ARRAY REFERENCE
        !          12499: *
        !          12500: CGV03  MOV  *CMOPN,WB        SET OFFSET TO ARRAY OPERAND
        !          12501: *
        !          12502: *      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
        !          12503: *
        !          12504: CGV04  JSR  CMGEN            GEN VALUE CODE FOR NEXT OPERAND
        !          12505:        MOV  CMLEN(XL),WC     LOAD CMBLK LENGTH
        !          12506:        BLT  WB,WC,CGV04      LOOP BACK IF MORE TO GO
        !          12507: *
        !          12508: *      GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
        !          12509: *
        !          12510:        MOV  =OAOV$,WA        SET ONE SUBSCRIPT CALL IN CASE
        !          12511:        BEQ  WC,*CMAR1,CGV32  JUMP TO EXIT IF 1-SUB CASE
        !          12512:        MOV  =OAMV$,WA        ELSE SET CALL FOR MULTI-SUBSCRIPTS
        !          12513:        JSR  CDWRD            GENERATE CALL
        !          12514:        MOV  WC,WA            COPY LENGTH OF CMBLK
        !          12515:        SUB  *CMVLS,WA        SUBTRACT STANDARD LENGTH
        !          12516:        BTW  WA               GET NUMBER OF WORDS
        !          12517:        BRN  CGV32            JUMP TO GENERATE SUBSCRIPT COUNT
        !          12518: *
        !          12519: *      HERE TO GENERATE CODE FOR FUNCTION CALL
        !          12520: *
        !          12521: CGV05  MOV  *CMVLS,WB        SET OFFSET TO FIRST ARGUMENT
        !          12522: *
        !          12523: *      LOOP TO GENERATE CODE FOR ARGUMENTS
        !          12524: *
        !          12525: CGV06  BEQ  WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED
        !          12526:        JSR  CMGEN            ELSE GEN VALUE CODE FOR NEXT ARG
        !          12527:        BRN  CGV06            BACK TO GENERATE NEXT ARGUMENT
        !          12528: *
        !          12529: *      HERE TO GENERATE ACTUAL FUNCTION CALL
        !          12530: *
        !          12531: CGV07  SUB  *CMVLS,WB        GET NUMBER OF ARG PTRS (BAUS)
        !          12532:        BTW  WB               CONVERT BAUS TO WORDS
        !          12533:        MOV  CMOPN(XL),XR     LOAD FUNCTION VRBLK POINTER
        !          12534:        BNZ  VRLEN(XR),CGV12  JUMP IF NOT SYSTEM FUNCTION
        !          12535:        MOV  VRSVP(XR),XL     LOAD SVBLK PTR IF SYSTEM VAR
        !          12536:        MOV  SVBIT(XL),WA     LOAD BIT MASK
        !          12537:        ANB  BTFFC,WA         TEST FOR FAST FUNCTION CALL ALLOWED
        !          12538:        ZRB  WA,CGV12         JUMP IF NOT
        !          12539:        EJC
        !          12540: *
        !          12541: *      CDGVL (CONTINUED)
        !          12542: *
        !          12543: *      HERE IF FAST FUNCTION CALL IS ALLOWED
        !          12544: *
        !          12545:        MOV  SVBIT(XL),WA     RELOAD BIT INDICATORS
        !          12546:        ANB  BTPRE,WA         TEST FOR PREEVALUATION OK
        !          12547:        NZB  WA,CGV08         JUMP IF PREEVALUATION PERMITTED
        !          12548:        MNZ  WC               ELSE SET RESULT NON-CONSTANT
        !          12549: *
        !          12550: *      TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
        !          12551: *
        !          12552: CGV08  MOV  VRFNC(XR),XL     LOAD PTR TO SVFNC FIELD
        !          12553:        MOV  FARGS(XL),WA     LOAD SVNAR FIELD VALUE
        !          12554:        BEQ  WA,WB,CGV11      JUMP IF ARGUMENT COUNT IS CORRECT
        !          12555:        BHI  WA,WB,CGV09      JUMP IF TOO FEW ARGUMENTS GIVEN
        !          12556: *
        !          12557: *      HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
        !          12558: *
        !          12559:        SUB  WA,WB            GET NUMBER OF EXTRA ARGS
        !          12560:        LCT  WB,WB            SET AS COUNT TO CONTROL LOOP
        !          12561:        MOV  =OPOP$,WA        SET POP CALL
        !          12562:        BRN  CGV10            JUMP TO COMMON LOOP
        !          12563: *
        !          12564: *      HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
        !          12565: *
        !          12566: CGV09  SUB  WB,WA            GET NUMBER OF MISSING ARGUMENTS
        !          12567:        LCT  WB,WA            LOAD AS COUNT TO CONTROL LOOP
        !          12568:        MOV  =NULLS,WA        LOAD PTR TO NULL CONSTANT
        !          12569: *
        !          12570: *      LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
        !          12571: *
        !          12572: CGV10  JSR  CDWRD            GENERATE ONE CALL
        !          12573:        BCT  WB,CGV10         LOOP TILL ALL GENERATED
        !          12574: *
        !          12575: *      HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
        !          12576: *
        !          12577: CGV11  MOV  XL,WA            COPY POINTER TO SVFNC FIELD
        !          12578:        BRN  CGV36            JUMP TO GENERATE CALL
        !          12579:        EJC
        !          12580: *
        !          12581: *      CDGVL (CONTINUED)
        !          12582: *
        !          12583: *      COME HERE IF FAST CALL IS NOT PERMITTED
        !          12584: *
        !          12585: CGV12  MOV  =OFNS$,WA        SET ONE ARG CALL IN CASE
        !          12586:        BEQ  WB,=NUM01,CGV13  JUMP IF ONE ARG CASE
        !          12587:        MOV  =OFNC$,WA        ELSE LOAD CALL FOR MORE THAN 1 ARG
        !          12588:        JSR  CDWRD            GENERATE IT
        !          12589:        MOV  WB,WA            COPY ARGUMENT COUNT
        !          12590: *
        !          12591: *      ONE ARG CASE MERGES HERE
        !          12592: *
        !          12593: CGV13  JSR  CDWRD            GENERATE =O$FNS OR ARG COUNT
        !          12594:        MOV  XR,WA            COPY VRBLK POINTER
        !          12595:        BRN  CGV32            JUMP TO GENERATE VRBLK PTR
        !          12596: *
        !          12597: *      HERE FOR DEFERRED EXPRESSION
        !          12598: *
        !          12599: CGV14  MOV  CMROP(XL),XL     POINT TO EXPRESSION TREE
        !          12600:        JSR  CDGEX            BUILD EXBLK OR SEBLK
        !          12601:        MOV  XR,WA            COPY BLOCK PTR
        !          12602:        JSR  CDWRD            GENERATE PTR TO EXBLK OR SEBLK
        !          12603:        BRN  CGV34            JUMP TO EXIT, CONSTANT TEST
        !          12604: *
        !          12605: *      HERE TO GENERATE CODE FOR SELECTION
        !          12606: *
        !          12607: CGV15  ZER  -(XS)            ZERO PTR TO CHAIN OF FORWARD JUMPS
        !          12608:        ZER  -(XS)            ZERO PTR TO PREV O$SLC FORWARD PTR
        !          12609:        MOV  *CMVLS,WB        POINT TO FIRST ALTERNATIVE
        !          12610:        MOV  =OSLA$,WA        SET INITIAL CODE WORD
        !          12611: *
        !          12612: *      0(XS)                 IS THE OFFSET TO THE PREVIOUS WORD
        !          12613: *                            WHICH REQUIRES FILLING IN WITH AN
        !          12614: *                            OFFSET TO THE FOLLOWING O$SLC,O$SLD
        !          12615: *
        !          12616: *      1(XS)                 IS THE HEAD OF A CHAIN OF OFFSET
        !          12617: *                            POINTERS INDICATING THOSE LOCATIONS
        !          12618: *                            TO BE FILLED WITH OFFSETS PAST
        !          12619: *                            THE END OF ALL THE ALTERNATIVES
        !          12620: *
        !          12621: CGV16  JSR  CDWRD            GENERATE O$SLC (O$SLA FIRST TIME)
        !          12622:        MOV  CWCOF,(XS)       SET CURRENT LOC AS PTR TO FILL IN
        !          12623:        JSR  CDWRD            GENERATE GARBAGE WORD THERE FOR NOW
        !          12624:        JSR  CMGEN            GEN VALUE CODE FOR ALTERNATIVE
        !          12625:        MOV  =OSLB$,WA        LOAD O$SLB POINTER
        !          12626:        JSR  CDWRD            GENERATE O$SLB CALL
        !          12627:        MOV  1(XS),WA         LOAD OLD CHAIN PTR
        !          12628:        MOV  CWCOF,1(XS)      SET CURRENT LOC AS NEW CHAIN HEAD
        !          12629:        JSR  CDWRD            GENERATE FORWARD CHAIN LINK
        !          12630:        EJC
        !          12631: *
        !          12632: *      CDGVL (CONTINUED)
        !          12633: *
        !          12634: *      NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
        !          12635: *
        !          12636:        MOV  (XS),XR          LOAD OFFSET TO WORD TO PLUG
        !          12637:        ADD  R$CCB,XR         POINT TO ACTUAL LOCATION TO PLUG
        !          12638:        MOV  CWCOF,(XR)       PLUG PROPER OFFSET IN
        !          12639:        MOV  =OSLC$,WA        LOAD O$SLC PTR FOR NEXT ALTERNATIVE
        !          12640:        MOV  WB,XR            COPY OFFSET (DESTROY GARBAGE XR)
        !          12641:        ICA  XR               BUMP EXTRA TIME FOR TEST
        !          12642:        BLT  XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE
        !          12643: *
        !          12644: *      HERE TO GENERATE CODE FOR LAST ALTERNATIVE
        !          12645: *
        !          12646:        MOV  =OSLD$,WA        GET HEADER CALL
        !          12647:        JSR  CDWRD            GENERATE O$SLD CALL
        !          12648:        JSR  CMGEN            GENERATE CODE FOR LAST ALTERNATIVE
        !          12649:        ICA  XS               POP OFFSET PTR
        !          12650:        MOV  (XS)+,XR         LOAD CHAIN PTR
        !          12651: *
        !          12652: *      LOOP TO PLUG OFFSETS PAST STRUCTURE
        !          12653: *
        !          12654: CGV17  ADD  R$CCB,XR         MAKE NEXT PTR ABSOLUTE
        !          12655:        MOV  (XR),WA          LOAD FORWARD PTR
        !          12656:        MOV  CWCOF,(XR)       PLUG REQUIRED OFFSET
        !          12657:        MOV  WA,XR            COPY FORWARD PTR
        !          12658:        BNZ  WA,CGV17         LOOP BACK IF MORE TO GO
        !          12659:        BRN  CGV33            ELSE JUMP TO EXIT (NOT CONSTANT)
        !          12660: *
        !          12661: *      HERE FOR BINARY OPS WITH VALUE OPERANDS
        !          12662: *
        !          12663: CGV18  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND POINTER
        !          12664:        JSR  CDGVL            GEN VALUE CODE FOR LEFT OPERAND
        !          12665: *
        !          12666: *      HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
        !          12667: *
        !          12668: CGV19  MOV  CMROP(XL),XR     LOAD RIGHT (ONLY) OPERAND PTR
        !          12669:        JSR  CDGVL            GEN CODE BY VALUE
        !          12670:        EJC
        !          12671: *
        !          12672: *      CDGVL (CONTINUED)
        !          12673: *
        !          12674: *      MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
        !          12675: *
        !          12676: CGV20  MOV  CMOPN(XL),WA     LOAD OPERATOR CALL POINTER
        !          12677:        BRN  CGV36            JUMP TO GENERATE IT WITH CONS TEST
        !          12678: *
        !          12679: *      HERE FOR ASSIGNMENT
        !          12680: *
        !          12681: CGV21  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND POINTER
        !          12682:        BLO  (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE
        !          12683: *
        !          12684: *      HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
        !          12685: *
        !          12686:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
        !          12687:        JSR  CDGVL            GENERATE CODE BY VALUE
        !          12688:        MOV  CMLOP(XL),WA     RELOAD LEFT OPERAND VRBLK PTR
        !          12689:        ADD  *VRSTO,WA        POINT TO VRSTO FIELD
        !          12690:        BRN  CGV32            JUMP TO GENERATE STORE PTR
        !          12691: *
        !          12692: *      HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
        !          12693: *
        !          12694: CGV22  JSR  EXPAP            TEST FOR PATTERN MATCH ON LEFT SIDE
        !          12695:        PPM  CGV23            JUMP IF NOT PATTERN MATCH
        !          12696: *
        !          12697: *      HERE FOR PATTERN REPLACEMENT
        !          12698: *
        !          12699:        MOV  CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE
        !          12700:        MOV  CMLOP(XR),XR     LOAD SUBJECT PTR
        !          12701:        JSR  CDGNM            GEN CODE BY NAME FOR SUBJECT
        !          12702:        MOV  CMLOP(XL),XR     LOAD PATTERN PTR
        !          12703:        JSR  CDGVL            GEN CODE BY VALUE FOR PATTERN
        !          12704:        MOV  =OPMN$,WA        LOAD MATCH BY NAME CALL
        !          12705:        JSR  CDWRD            GENERATE IT
        !          12706:        MOV  CMROP(XL),XR     LOAD REPLACEMENT VALUE PTR
        !          12707:        JSR  CDGVL            GEN CODE BY VALUE
        !          12708:        MOV  =ORPL$,WA        LOAD REPLACE CALL
        !          12709:        BRN  CGV32            JUMP TO GEN AND EXIT (NOT CONSTANT)
        !          12710: *
        !          12711: *      HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
        !          12712: *
        !          12713: CGV23  MNZ  WC               INHIBIT PRE-EVALUATION
        !          12714:        JSR  CDGNM            GEN CODE BY NAME FOR LEFT SIDE
        !          12715:        BRN  CGV31            MERGE WITH UNOP CIRCUIT
        !          12716:        EJC
        !          12717: *
        !          12718: *      CDGVL (CONTINUED)
        !          12719: *
        !          12720: *      HERE FOR CONCATENATION
        !          12721: *
        !          12722: CGV24  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND PTR
        !          12723:        BNE  (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK
        !          12724:        MOV  CMTYP(XR),WB     LOAD CMBLK TYPE CODE
        !          12725:        BEQ  WB,=C$INT,CGV25  SPECIAL CASE IF INTERROGATION
        !          12726:        BEQ  WB,=C$NEG,CGV25  OR NEGATION
        !          12727:        BNE  WB,=C$FNC,CGV18  ELSE ORDINARY BINOP IF NOT FUNCTION
        !          12728:        MOV  CMOPN(XR),XR     ELSE LOAD FUNCTION VRBLK PTR
        !          12729:        BNZ  VRLEN(XR),CGV18  ORDINARY BINOP IF NOT SYSTEM VAR
        !          12730:        MOV  VRSVP(XR),XR     ELSE POINT TO SVBLK
        !          12731:        MOV  SVBIT(XR),WA     LOAD BIT INDICATORS
        !          12732:        ANB  BTPRD,WA         TEST FOR PREDICATE FUNCTION
        !          12733:        ZRB  WA,CGV18         ORDINARY BINOP IF NOT
        !          12734: *
        !          12735: *      HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
        !          12736: *
        !          12737: CGV25  MOV  CMLOP(XL),XR     RELOAD LEFT ARG
        !          12738:        JSR  CDGVL            GEN CODE BY VALUE
        !          12739:        MOV  =OPOP$,WA        LOAD POP CALL
        !          12740:        JSR  CDWRD            GENERATE IT
        !          12741:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND
        !          12742:        JSR  CDGVL            GEN CODE BY VALUE AS RESULT CODE
        !          12743:        BRN  CGV33            EXIT (NOT CONSTANT)
        !          12744: *
        !          12745: *      HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
        !          12746: *
        !          12747: CGV26  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND
        !          12748:        JSR  CDGVL            GEN CODE BY VALUE, MERGE
        !          12749: *
        !          12750: *      HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
        !          12751: *
        !          12752: CGV27  MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
        !          12753:        JSR  CDGNM            GEN CODE BY NAME FOR RIGHT ARG
        !          12754:        MOV  CMOPN(XL),XR     GET OPERATOR CODE WORD
        !          12755:        BNE  (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE
        !          12756:        EJC
        !          12757: *
        !          12758: *      CDGVL (CONTINUED)
        !          12759: *
        !          12760: *      HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
        !          12761: *      THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
        !          12762: *      THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
        !          12763: *      NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
        !          12764: *
        !          12765:        BNZ  WC,CGV20         GEN CALL IF NON-CONSTANT (NOT VAR)
        !          12766:        MNZ  WC               ELSE SET NON-CONSTANT IN CASE
        !          12767:        MOV  CMROP(XL),XR     LOAD PTR TO OPERAND VRBLK
        !          12768:        BNZ  VRLEN(XR),CGV20  GEN (NON-CONSTANT) IF NOT SYS VAR
        !          12769:        MOV  VRSVP(XR),XR     ELSE LOAD PTR TO SVBLK
        !          12770:        MOV  SVBIT(XR),WA     LOAD BIT MASK
        !          12771:        ANB  BTCKW,WA         TEST FOR CONSTANT KEYWORD
        !          12772:        ZRB  WA,CGV20         GO GEN IF NOT CONSTANT
        !          12773:        ZER  WC               ELSE SET RESULT CONSTANT
        !          12774:        BRN  CGV20            AND JUMP BACK TO GENERATE CALL
        !          12775: *
        !          12776: *      HERE TO GENERATE CODE FOR NEGATION
        !          12777: *
        !          12778: CGV28  MOV  =ONTA$,WA        GET INITIAL WORD
        !          12779:        JSR  CDWRD            GENERATE IT
        !          12780:        MOV  CWCOF,WB         SAVE NEXT OFFSET
        !          12781:        JSR  CDWRD            GENERATE GUNK WORD FOR NOW
        !          12782:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
        !          12783:        JSR  CDGVL            GEN CODE BY VALUE
        !          12784:        MOV  =ONTB$,WA        LOAD END OF EVALUATION CALL
        !          12785:        JSR  CDWRD            GENERATE IT
        !          12786:        MOV  WB,XR            COPY OFFSET TO WORD TO PLUG
        !          12787:        ADD  R$CCB,XR         POINT TO ACTUAL WORD TO PLUG
        !          12788:        MOV  CWCOF,(XR)       PLUG WORD WITH CURRENT OFFSET
        !          12789:        MOV  =ONTC$,WA        LOAD FINAL CALL
        !          12790:        BRN  CGV32            JUMP TO GENERATE IT (NOT CONSTANT)
        !          12791: *
        !          12792: *      HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
        !          12793: *
        !          12794: CGV29  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND PTR
        !          12795:        JSR  CDGVL            GENERATE CODE BY VALUE
        !          12796:        EJC
        !          12797: *
        !          12798: *      CDGVL (CONTINUED)
        !          12799: *
        !          12800: *      HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
        !          12801: *
        !          12802: CGV30  MOV  =C$UO$,WB        SET UNOP CODE + 1
        !          12803:        SUB  CMTYP(XL),WB     SET NUMBER OF ARGS (1 OR 2)
        !          12804: *
        !          12805: *      MERGE HERE FOR UNDEFINED OPERATORS
        !          12806: *
        !          12807:        MOV  CMROP(XL),XR     LOAD RIGHT (ONLY) OPERAND POINTER
        !          12808:        JSR  CDGVL            GEN VALUE CODE FOR RIGHT OPERAND
        !          12809:        MOV  CMOPN(XL),XR     LOAD POINTER TO OPERATOR DV
        !          12810:        MOV  DVOPN(XR),XR     LOAD POINTER OFFSET
        !          12811:        WTB  XR               CONVERT WORD OFFSET TO BAUS
        !          12812:        ADD  =R$UBA,XR        POINT TO PROPER FUNCTION PTR
        !          12813:        SUB  *VRFNC,XR        SET STANDARD FUNCTION OFFSET
        !          12814:        BRN  CGV12            MERGE WITH FUNCTION CALL CIRCUIT
        !          12815: *
        !          12816: *      HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
        !          12817: *
        !          12818: CGV31  MNZ  WC               SET NON CONSTANT
        !          12819:        BRN  CGV19            MERGE
        !          12820: *
        !          12821: *      HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
        !          12822: *
        !          12823: CGV32  JSR  CDWRD            GENERATE WORD, MERGE
        !          12824: *
        !          12825: *      HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
        !          12826: *
        !          12827: CGV33  MNZ  WC               INDICATE RESULT IS NOT CONSTANT
        !          12828: *
        !          12829: *      COMMON EXIT POINT
        !          12830: *
        !          12831: CGV34  ICA  XS               POP INITIAL CODE OFFSET
        !          12832:        MOV  (XS)+,WA         RESTORE OLD CONSTANT FLAG
        !          12833:        MOV  (XS)+,XL         RESTORE ENTRY XL
        !          12834:        MOV  (XS)+,WB         RESTORE ENTRY WB
        !          12835:        BNZ  WC,CGV35         JUMP IF NOT CONSTANT
        !          12836:        MOV  WA,WC            ELSE RESTORE ENTRY CONSTANT FLAG
        !          12837: *
        !          12838: *      HERE TO RETURN AFTER DEALING WITH WC SETTING
        !          12839: *
        !          12840: CGV35  EXI                   RETURN TO CDGVL CALLER
        !          12841: *
        !          12842: *      EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
        !          12843: *
        !          12844: CGV36  JSR  CDWRD            GENERATE WORD
        !          12845:        BNZ  WC,CGV34         JUMP TO EXIT IF NOT CONSTANT
        !          12846:        EJC
        !          12847: *
        !          12848: *      CDGVL (CONTINUED)
        !          12849: *
        !          12850: *      HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
        !          12851: *
        !          12852:        MOV  =ORVL$,WA        LOAD CALL TO RETURN VALUE
        !          12853:        JSR  CDWRD            GENERATE IT
        !          12854:        MOV  (XS),XL          LOAD INITIAL CODE OFFSET
        !          12855:        JSR  EXBLD            BUILD EXBLK FOR EXPRESSION
        !          12856:        ZER  WB               SET TO EVALUATE BY VALUE
        !          12857:        JSR  EVALX            EVALUATE EXPRESSION
        !          12858:        PPM                   SHOULD NOT FAIL
        !          12859:        MOV  (XR),WA          LOAD TYPE WORD OF RESULT
        !          12860:        BLO  WA,=P$AAA,CGV37  JUMP IF NOT PATTERN
        !          12861:        MOV  =OLPT$,WA        ELSE LOAD SPECIAL PATTERN LOAD CALL
        !          12862:        JSR  CDWRD            GENERATE IT
        !          12863: *
        !          12864: *      MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
        !          12865: *
        !          12866: CGV37  MOV  XR,WA            COPY CONSTANT POINTER
        !          12867:        JSR  CDWRD            GENERATE PTR
        !          12868:        ZER  WC               SET RESULT CONSTANT
        !          12869:        BRN  CGV34            JUMP BACK TO EXIT
        !          12870:        ENP                   END PROCEDURE CDGVL
        !          12871:        EJC
        !          12872: *
        !          12873: *      CDWRD -- GENERATE ONE WORD OF CODE
        !          12874: *
        !          12875: *      CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
        !          12876: *      CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
        !          12877: *      IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
        !          12878: *      THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
        !          12879: *      AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
        !          12880: *      EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
        !          12881: *
        !          12882: *      (WA)                  WORD TO BE GENERATED
        !          12883: *      JSR  CDWRD            CALL TO GENERATE WORD
        !          12884: *
        !          12885: CDWRD  PRC  E,0              ENTRY POINT
        !          12886:        MOV  XR,-(XS)         SAVE ENTRY XR
        !          12887:        MOV  WA,-(XS)         SAVE CODE WORD TO BE GENERATED
        !          12888: *
        !          12889: *      MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
        !          12890: *
        !          12891: CDWD1  MOV  R$CCB,XR         LOAD PTR TO CCBLK BEING BUILT
        !          12892:        BNZ  XR,CDWD2         JUMP IF BLOCK ALLOCATED
        !          12893: *
        !          12894: *      HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
        !          12895: *
        !          12896:        MOV  *E$CBS,WA        LOAD INITIAL LENGTH
        !          12897:        JSR  ALLOC            ALLOCATE CCBLK
        !          12898:        MOV  =B$CCT,(XR)      STORE TYPE WORD
        !          12899:        MOV  *CCCOD,CWCOF     SET INITIAL OFFSET
        !          12900:        MOV  WA,CCLEN(XR)     STORE BLOCK LENGTH
        !          12901:        MOV  XR,R$CCB         STORE PTR TO NEW BLOCK
        !          12902: *
        !          12903: *      HERE WE HAVE A BLOCK WE CAN USE
        !          12904: *
        !          12905: CDWD2  MOV  CWCOF,WA         LOAD CURRENT OFFSET
        !          12906:        ADD  *NUM04,WA        ADJUST FOR TEST (FOUR WORDS)
        !          12907:        BLO  WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK
        !          12908: *
        !          12909: *      HERE IF NO ROOM IN CURRENT BLOCK
        !          12910: *
        !          12911:        BGE  WA,MXLEN,CDWD5   JUMP IF ALREADY AT MAX SIZE
        !          12912:        ADD  *E$CBS,WA        ELSE GET NEW SIZE
        !          12913:        MOV  XL,-(XS)         SAVE ENTRY XL
        !          12914:        MOV  XR,XL            COPY POINTER
        !          12915:        BLT  WA,MXLEN,CDWD3   JUMP IF NOT TOO LARGE
        !          12916:        MOV  MXLEN,WA         ELSE RESET TO MAX ALLOWED SIZE
        !          12917:        EJC
        !          12918: *
        !          12919: *      CDWRD (CONTINUED)
        !          12920: *
        !          12921: *      HERE WITH NEW BLOCK SIZE IN WA
        !          12922: *
        !          12923: CDWD3  JSR  ALLOC            ALLOCATE NEW BLOCK
        !          12924:        MOV  XR,R$CCB         STORE POINTER TO NEW BLOCK
        !          12925:        MOV  =B$CCT,(XR)+     STORE TYPE WORD IN NEW BLOCK
        !          12926:        MOV  WA,(XR)+         STORE BLOCK LENGTH
        !          12927:        ADD  *CCUSE,XL        POINT TO CCUSE,CCCOD FIELDS IN OLD
        !          12928:        MOV  (XL),WA          LOAD CCUSE VALUE
        !          12929:        MVW                   COPY USEFUL WORDS FROM OLD BLOCK
        !          12930:        MOV  (XS)+,XL         RESTORE XL
        !          12931:        BRN  CDWD1            MERGE BACK TO TRY AGAIN
        !          12932: *
        !          12933: *      HERE WITH ROOM IN CURRENT BLOCK
        !          12934: *
        !          12935: CDWD4  MOV  CWCOF,WA         LOAD CURRENT OFFSET
        !          12936:        ICA  WA               GET NEW OFFSET
        !          12937:        MOV  WA,CWCOF         STORE NEW OFFSET
        !          12938:        MOV  WA,CCUSE(XR)     STORE IN CCBLK FOR GBCOL
        !          12939:        DCA  WA               RESTORE PTR TO THIS WORD
        !          12940:        ADD  WA,XR            POINT TO CURRENT ENTRY
        !          12941:        MOV  (XS)+,WA         RELOAD WORD TO GENERATE
        !          12942:        MOV  WA,(XR)          STORE WORD IN BLOCK
        !          12943:        MOV  (XS)+,XR         RESTORE ENTRY XR
        !          12944:        EXI                   RETURN TO CALLER
        !          12945: *
        !          12946: *      HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
        !          12947: *
        !          12948: CDWD5  ERB  209,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED.
        !          12949:        ENP                   END PROCEDURE CDWRD
        !          12950:        EJC
        !          12951: *
        !          12952: *      CMGEN -- GENERATE CODE FOR CMBLK PTR
        !          12953: *
        !          12954: *      CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
        !          12955: *      CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
        !          12956: *
        !          12957: *      (XL)                  CMBLK POINTER
        !          12958: *      (WB)                  OFFSET TO POINTER IN CMBLK
        !          12959: *      JSR  CMGEN            CALL TO GENERATE CODE
        !          12960: *      (XR,WA)               DESTROYED
        !          12961: *      (WB)                  BUMPED BY ONE WORD
        !          12962: *
        !          12963: CMGEN  PRC  R,0              ENTRY POINT, RECURSIVE
        !          12964:        MOV  XL,XR            COPY CMBLK POINTER
        !          12965:        ADD  WB,XR            POINT TO CMBLK POINTER
        !          12966:        MOV  (XR),XR          LOAD CMBLK POINTER
        !          12967:        JSR  CDGVL            GENERATE CODE BY VALUE
        !          12968:        ICA  WB               BUMP OFFSET
        !          12969:        EXI                   RETURN TO CALLER
        !          12970:        ENP                   END PROCEDURE CMGEN
        !          12971:        EJC
        !          12972: *
        !          12973: *      CMPIL (COMPILE SOURCE CODE)
        !          12974: *
        !          12975: *      CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
        !          12976: *      FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
        !          12977: *      COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
        !          12978: *      THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
        !          12979: *      INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
        !          12980: *      DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
        !          12981: *      AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
        !          12982: *      RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
        !          12983: *
        !          12984: *      CMPCE                 RESUME AFTER CONTROL CARD ERROR
        !          12985: *      CMPLE                 RESUME AFTER LABEL ERROR
        !          12986: *      CMPSE                 RESUME AFTER STATEMENT ERROR
        !          12987: *
        !          12988: *      JSR  CMPIL            CALL TO COMPILE CODE
        !          12989: *      (XR)                  PTR TO CDBLK FOR ENTRY STATEMENT
        !          12990: *      (XL,WA,WB,WC,RA)      DESTROYED
        !          12991: *
        !          12992: *      THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
        !          12993: *
        !          12994: *      CMPSN                 NUMBER OF NEXT STATEMENT
        !          12995: *                            TO BE COMPILED.
        !          12996: *
        !          12997: *      CSWXX                 CONTROL CARD SWITCH VALUES ARE
        !          12998: *                            CHANGED WHEN RELEVANT CONTROL
        !          12999: *                            CARDS ARE MET.
        !          13000: *
        !          13001: *      CWCOF                 OFFSET TO NEXT WORD IN CODE BLOCK
        !          13002: *                            BEING BUILT (SEE CDWRD).
        !          13003: *
        !          13004: *      LSTSN                 NUMBER OF STATEMENT MOST RECENTLY
        !          13005: *                            COMPILED (INITIALLY SET TO ZERO).
        !          13006: *
        !          13007: *      R$CIM                 CURRENT (INITIAL) COMPILER IMAGE
        !          13008: *                            (ZERO FOR INITIAL COMPILE CALL)
        !          13009: *
        !          13010: *      R$CNI                 USED TO POINT TO FOLLOWING IMAGE.
        !          13011: *                            (SEE READR PROCEDURE).
        !          13012: *
        !          13013: *      SCNGO                 GOTO SWITCH FOR SCANE PROCEDURE
        !          13014: *
        !          13015: *      SCNIL                 LENGTH OF CURRENT IMAGE EXCLUDING
        !          13016: *                            CHARACTERS REMOVED BY -INPUT.
        !          13017: *
        !          13018: *      SCNPT                 CURRENT SCAN OFFSET, SEE SCANE.
        !          13019: *
        !          13020: *      SCNRS                 RESCAN SWITCH FOR SCANE PROCEDURE.
        !          13021: *
        !          13022: *      SCNSE                 OFFSET (IN R$CIM) OF MOST RECENTLY
        !          13023: *                            SCANNED ELEMENT. SET ZERO IF NOT
        !          13024: *                            CURRENTLY SCANNING ITEMS
        !          13025:        EJC
        !          13026: *
        !          13027: *      CMPIL (CONTINUED)
        !          13028: *
        !          13029: *      STAGE               STGIC  INITIAL COMPILE IN PROGRESS
        !          13030: *                          STGXC  CODE/CONVERT COMPILE
        !          13031: *                          STGEV  BUILDING EXBLK FOR EVAL
        !          13032: *                          STGXT  EXECUTE TIME (OUTSIDE COMPILE)
        !          13033: *                          STGCE  INITIAL COMPILE AFTER END LINE
        !          13034: *                          STGXE  EXECUTE COMPILE AFTER END LINE
        !          13035: *
        !          13036: *      CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
        !          13037: *      MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
        !          13038: *      OFFSETS ARE IN THE DEFINITIONS SECTION).
        !          13039: *
        !          13040: *      CMSTM(XS)             POINTER TO EXPAN TREE FOR BODY OF
        !          13041: *                            STATEMENT (SEE EXPAN PROCEDURE).
        !          13042: *
        !          13043: *      CMSGO(XS)             POINTER TO TREE REPRESENTATION OF
        !          13044: *                            SUCCESS GOTO (SEE PROCEDURE SCNGO)9
        !          13045: *                            ZERO IF NO SUCCESS GOTO IS GIVEN
        !          13046: *
        !          13047: *      CMFGO(XS)             LIKE CMSGO FOR FAILURE GOTO.
        !          13048: *
        !          13049: *      CMCGO(XS)             SET NON-ZERO ONLY IF THERE IS A
        !          13050: *                            CONDITIONAL GOTO. USED FOR -FAIL,
        !          13051: *                            -NOFAIL CODE GENERATION.
        !          13052: *
        !          13053: *      CMPCD(XS)             POINTER TO CDBLK FOR PREVIOUS
        !          13054: *                            STATEMENT. ZERO FOR 1ST STATEMENT.
        !          13055: *
        !          13056: *      CMFFP(XS)             SET NON-ZERO IF CDFAL IN PREVIOUS
        !          13057: *                            CDBLK NEEDS FILLING WITH FORWARD
        !          13058: *                            POINTER, ELSE SET TO ZERO.
        !          13059: *
        !          13060: *      CMFFC(XS)             SAME AS CMFFP FOR CURRENT CDBLK
        !          13061: *
        !          13062: *      CMSOP(XS)             OFFSET TO WORD IN PREVIOUS CDBLK
        !          13063: *                            TO BE FILLED IN WITH FORWARD PTR
        !          13064: *                            TO NEXT CDBLK FOR SUCCESS GOTO.
        !          13065: *                            ZERO IF NO FILL IN IS REQUIRED.
        !          13066: *
        !          13067: *      CMSOC(XS)             SAME AS CMSOP FOR CURRENT CDBLK.
        !          13068: *
        !          13069: *      CMLBL(XS)             POINTER TO VRBLK FOR LABEL OF
        !          13070: *                            CURRENT STATEMENT. ZERO IF NO LABEL
        !          13071: *
        !          13072: *      CMTRA(XS)             POINTER TO CDBLK FOR ENTRY STMNT.
        !          13073:        EJC
        !          13074: *
        !          13075: *      CMPIL (CONTINUED)
        !          13076: *
        !          13077: *      ENTRY POINT
        !          13078: *
        !          13079: CMPIL  PRC  E,0              ENTRY POINT
        !          13080:        LCT  WB,=CMNEN        SET NUMBER OF STACK WORK LOCATIONS
        !          13081: *
        !          13082: *      LOOP TO INITIALIZE STACK WORKING LOCATIONS
        !          13083: *
        !          13084: CMP00  ZER  -(XS)            STORE A ZERO, MAKE ONE ENTRY
        !          13085:        BCT  WB,CMP00         LOOP BACK UNTIL ALL SET
        !          13086:        MOV  XS,CMPXS         SAVE STACK POINTER FOR ERROR SEC
        !          13087:        SSS  CMPSS            SAVE S-R STACK POINTER IF ANY
        !          13088: *
        !          13089: *      LOOP THROUGH STATEMENTS
        !          13090: *
        !          13091: CMP01  MOV  SCNPT,WB         SET SCAN POINTER OFFSET
        !          13092:        MOV  WB,SCNSE         SET START OF ELEMENT LOCATION
        !          13093:        MOV  =OCER$,WA        POINT TO COMPILE ERROR CALL
        !          13094:        JSR  CDWRD            GENERATE AS TEMPORARY CDFAL
        !          13095:        BLT  WB,SCNIL,CMP04   JUMP IF CHARS LEFT ON THIS IMAGE
        !          13096: *
        !          13097: *      LOOP HERE AFTER COMMENT OR CONTROL CARD
        !          13098: *      ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
        !          13099: *
        !          13100: CMPCE  ZER  XR               CLEAR POSSIBLE GARBAGE XR VALUE
        !          13101:        BEQ  STAGE,=STGIC,CMPC1 READ IF INITIAL COMPILE
        !          13102:        BZE  R$COP,CMP02      ELSE SKIP IF NO -COPY IN FORCE
        !          13103: *
        !          13104: *      HERE TO ATTEMPT READ (STGIC OR -COPY)
        !          13105: *
        !          13106: CMPC1  JSR  READR            READ NEXT INPUT IMAGE
        !          13107:        BZE  XR,CMPC2         JUMP IF NO INPUT AVAILABLE
        !          13108:        JSR  NEXTS            ACQUIRE NEXT SOURCE IMAGE
        !          13109:        MOV  CMPSN,LSTSN      STORE STMT NO FOR USE BY LISTR
        !          13110:        ZER  SCNPT            RESET SCAN POINTER
        !          13111:        BRN  CMP04            GO PROCESS IMAGE
        !          13112: *
        !          13113: *      HERE IF READR HAD NOTHING TO RETURN.  IF NOT DURING
        !          13114: *      INITIAL COMPILE, THEN MUST BE AT OUTER LEVEL OF -COPY
        !          13115: *      IN CODE().  R$CIM HAS BEEN RESTORED TO CODE STRING
        !          13116: *      BY COPND SO WE CONTINUE FROM THE -COPY STMT.
        !          13117: *
        !          13118: CMPC2  BEQ  STAGE,=STGIC,CMP09 JUMP IF INITIAL COMPILE
        !          13119: *
        !          13120: *      FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
        !          13121: *      AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
        !          13122: *
        !          13123: CMP02  MOV  R$CIM,XR         GET CURRENT IMAGE
        !          13124:        MOV  SCNPT,WB         GET CURRENT OFFSET
        !          13125:        PLC  XR,WB            PREPARE TO GET CHARS
        !          13126: *
        !          13127: *      SKIP TO SEMI-COLON
        !          13128: *
        !          13129: CMP03  LCH  WC,(XR)+         GET CHAR
        !          13130:        ICV  SCNPT            ADVANCE OFFSET
        !          13131:        BEQ  WC,=CH$SM,CMP04  SKIP IF SEMI-COLON FOUND
        !          13132:        BLT  SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS
        !          13133:        ZER  XR               CLEAR GARBAGE XR VALUE
        !          13134:        BRN  CMP09            END OF IMAGE
        !          13135:        EJC
        !          13136: *
        !          13137: *      CMPIL (CONTINUED)
        !          13138: *
        !          13139: *      HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
        !          13140: *      STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
        !          13141: *      ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
        !          13142: *
        !          13143: CMP04  MOV  R$CIM,XR         POINT TO CURRENT IMAGE
        !          13144:        MOV  SCNPT,WB         LOAD CURRENT OFFSET
        !          13145:        MOV  WB,WA            COPY FOR LABEL SCAN
        !          13146:        PLC  XR,WB            POINT TO FIRST CHARACTER
        !          13147:        LCH  WC,(XR)+         LOAD FIRST CHARACTER
        !          13148:        BEQ  WC,=CH$SM,CMP12  NO LABEL IF SEMICOLON
        !          13149:        BEQ  WC,=CH$AS,CMPCE  LOOP BACK IF COMMENT CARD
        !          13150:        BEQ  WC,=CH$MN,CMP33  JUMP IF CONTROL CARD
        !          13151:        MOV  R$CIM,R$CMP      ABOUT TO DESTROY R$CIM
        !          13152:        MOV  =CMLAB,XL        POINT TO LABEL WORK STRING
        !          13153:        MOV  XL,R$CIM         SCANE IS TO SCAN WORK STRING
        !          13154:        PSC  XL               POINT TO FIRST CHARACTER POSITION
        !          13155:        SCH  WC,(XL)+         STORE CHAR JUST LOADED
        !          13156:        MOV  =CH$SM,WC        GET A SEMICOLON
        !          13157:        SCH  WC,(XL)          STORE AFTER FIRST CHAR
        !          13158:        CSC  XL               FINISHED CHARACTER STORING
        !          13159:        ZER  XL               CLEAR POINTER
        !          13160:        ZER  SCNPT            START AT FIRST CHARACTER
        !          13161:        MOV  SCNIL,-(XS)      PRESERVE IMAGE LENGTH
        !          13162:        MOV  =NUM02,SCNIL     READ 2 CHARS AT MOST
        !          13163:        JSR  SCANE            SCAN FIRST CHAR FOR TYPE
        !          13164:        MOV  (XS)+,SCNIL      RESTORE IMAGE LENGTH
        !          13165:        MOV  XL,WC            NOTE RETURN CODE
        !          13166:        MOV  R$CMP,XL         GET OLD R$CIM
        !          13167:        MOV  XL,R$CIM         PUT IT BACK
        !          13168:        MOV  WB,SCNPT         REINSTATE OFFSET
        !          13169:        BNZ  SCNBL,CMP12      BLANK SEEN - CANT BE LABEL
        !          13170:        MOV  XL,XR            POINT TO CURRENT IMAGE
        !          13171:        PLC  XR,WB            POINT TO FIRST CHAR AGAIN
        !          13172:        BEQ  WC,=T$VAR,CMP06  OK IF LETTER
        !          13173:        BEQ  WC,=T$CON,CMP06  OK IF DIGIT
        !          13174: *
        !          13175: *      DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
        !          13176: *
        !          13177: CMPLE  MOV  R$CMP,R$CIM      POINT TO BAD LINE
        !          13178:        ERB  210,BAD LABEL OR MISPLACED CONTINUATION LINE
        !          13179: *
        !          13180: *      LOOP TO SCAN LABEL
        !          13181: *
        !          13182: CMP05  BEQ  WC,=CH$SM,CMP07  SKIP IF SEMICOLON
        !          13183:        ICV  WA               BUMP OFFSET
        !          13184:        BEQ  WA,SCNIL,CMP07   JUMP IF END OF IMAGE (LABEL END)
        !          13185:        EJC
        !          13186: *
        !          13187: *      CMPIL (CONTINUED)
        !          13188: *
        !          13189: *      ENTER LOOP AT THIS POINT
        !          13190: *
        !          13191: CMP06  LCH  WC,(XR)+         ELSE LOAD NEXT CHARACTER
        !          13192: .IF    .CAHT
        !          13193:        BEQ  WC,=CH$HT,CMP07  JUMP IF HORIZONTAL TAB
        !          13194: .FI
        !          13195: .IF    .CAVT
        !          13196:        BEQ  WC,=CH$VT,CMP07  JUMP IF VERTICAL TAB
        !          13197: .FI
        !          13198:        BNE  WC,=CH$BL,CMP05  LOOP BACK IF NON-BLANK
        !          13199: *
        !          13200: *      HERE AFTER SCANNING OUT LABEL
        !          13201: *
        !          13202: CMP07  MOV  WA,SCNPT         SAVE UPDATED SCAN OFFSET
        !          13203:        SUB  WB,WA            GET LENGTH OF LABEL
        !          13204:        BZE  WA,CMP12         SKIP IF LABEL LENGTH ZERO
        !          13205:        ZER  XR               CLEAR GARBAGE XR VALUE
        !          13206:        JSR  SBSTR            BUILD SCBLK FOR LABEL NAME
        !          13207:        JSR  GTNVR            LOCATE/CONTRUCT VRBLK
        !          13208:        PPM                   DUMMY (IMPOSSIBLE) ERROR RETURN
        !          13209:        MOV  XR,CMLBL(XS)     STORE LABEL POINTER
        !          13210:        BNZ  VRLEN(XR),CMP11  JUMP IF NOT SYSTEM LABEL
        !          13211:        BNE  VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL
        !          13212: *
        !          13213: *      HERE FOR END LABEL SCANNED OUT
        !          13214: *
        !          13215:        ADD  =STGND,STAGE     ADJUST STAGE APPROPRIATELY
        !          13216:        JSR  SCANE            SCAN OUT NEXT ELEMENT
        !          13217:        BEQ  XL,=T$SMC,CMPEE  JUMP IF END OF IMAGE
        !          13218:        BNE  XL,=T$VAR,CMP08  ELSE ERROR IF NOT VARIABLE
        !          13219: *
        !          13220: *      HERE CHECK FOR VALID INITIAL TRANSFER
        !          13221: *
        !          13222:        BEQ  VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR)
        !          13223:        MOV  VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER
        !          13224:        JSR  SCANE            SCAN NEXT ELEMENT
        !          13225:        BEQ  XL,=T$SMC,CMPEE  JUMP IF OK (END OF IMAGE)
        !          13226: *
        !          13227: *      HERE FOR BAD TRANSFER LABEL
        !          13228: *
        !          13229: CMP08  ERB  211,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
        !          13230: *
        !          13231: *      HERE FOR END OF INPUT (NO END LABEL DETECTED)
        !          13232: *
        !          13233: CMP09  ADD  =STGND,STAGE     ADJUST STAGE APPROPRIATELY
        !          13234:        BEQ  STAGE,=STGXE,CMPEE JUMP IF CODE CALL (OK)
        !          13235:        ERB  212,SYNTAX ERROR. MISSING END LINE
        !          13236: *
        !          13237: *      HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
        !          13238: *
        !          13239: CMPEE  MOV  =OSTP$,WA        SET STOP CALL POINTER
        !          13240:        JSR  CDWRD            GENERATE AS STATEMENT CALL
        !          13241:        BRN  CMPSE            JUMP TO GENERATE AS FAILURE
        !          13242:        EJC
        !          13243: *
        !          13244: *      CMPIL (CONTINUED)
        !          13245: *
        !          13246: *      HERE AFTER PROCESSING LABEL OTHER THAN END
        !          13247: *
        !          13248: CMP11  BNE  STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK
        !          13249:        BEQ  VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION
        !          13250:        ZER  CMLBL(XS)        LEAVE FIRST LABEL DECLN UNDISTURBED
        !          13251:        ERB  213,SYNTAX ERROR. DUPLICATE LABEL
        !          13252: *
        !          13253: *      HERE AFTER DEALING WITH LABEL
        !          13254: *
        !          13255: CMP12  ZER  WB               SET FLAG FOR STATEMENT BODY
        !          13256:        JSR  EXPAN            GET TREE FOR STATEMENT BODY
        !          13257:        MOV  XR,CMSTM(XS)     STORE FOR LATER USE
        !          13258:        ZER  CMSGO(XS)        CLEAR SUCCESS GOTO POINTER
        !          13259:        ZER  CMFGO(XS)        CLEAR FAILURE GOTO POINTER
        !          13260:        ZER  CMCGO(XS)        CLEAR CONDITIONAL GOTO FLAG
        !          13261:        JSR  SCANE            SCAN NEXT ELEMENT
        !          13262:        BNE  XL,=T$COL,CMP18  JUMP IT NOT COLON (NO GOTO)
        !          13263: *
        !          13264: *      LOOP TO PROCESS GOTO FIELDS
        !          13265: *
        !          13266: CMP13  MNZ  SCNGO            SET GOTO FLAG
        !          13267:        JSR  SCANE            SCAN NEXT ELEMENT
        !          13268:        BEQ  XL,=T$SMC,CMP32  JUMP IF NO FIELDS LEFT
        !          13269:        BEQ  XL,=T$SGO,CMP14  JUMP IF S FOR SUCCESS GOTO
        !          13270:        BEQ  XL,=T$FGO,CMP16  JUMP IF F FOR FAILURE GOTO
        !          13271: *
        !          13272: *      HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
        !          13273: *
        !          13274:        MNZ  SCNRS            SET TO RESCAN ELEMENT NOT F,S
        !          13275:        JSR  SCNGF            SCAN OUT GOTO FIELD
        !          13276:        BNZ  CMFGO(XS),CMP17  ERROR IF FGOTO ALREADY
        !          13277:        MOV  XR,CMFGO(XS)     ELSE SET AS FGOTO
        !          13278:        BRN  CMP15            MERGE WITH SGOTO CIRCUIT
        !          13279: *
        !          13280: *      HERE FOR SUCCESS GOTO
        !          13281: *
        !          13282: CMP14  JSR  SCNGF            SCAN SUCCESS GOTO FIELD
        !          13283:        MOV  =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG
        !          13284: *
        !          13285: *      UNCONTIONAL GOTO MERGES HERE
        !          13286: *
        !          13287: CMP15  BNZ  CMSGO(XS),CMP17  ERROR IF SGOTO ALREADY GIVEN
        !          13288:        MOV  XR,CMSGO(XS)     ELSE SET SGOTO
        !          13289:        BRN  CMP13            LOOP BACK FOR NEXT GOTO FIELD
        !          13290: *
        !          13291: *      HERE FOR FAILURE GOTO
        !          13292: *
        !          13293: CMP16  JSR  SCNGF            SCAN GOTO FIELD
        !          13294:        MOV  =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG
        !          13295:        BNZ  CMFGO(XS),CMP17  ERROR IF FGOTO ALREADY GIVEN
        !          13296:        MOV  XR,CMFGO(XS)     ELSE STORE FGOTO POINTER
        !          13297:        BRN  CMP13            LOOP BACK FOR NEXT FIELD
        !          13298:        EJC
        !          13299: *
        !          13300: *      CMPIL (CONTINUED)
        !          13301: *
        !          13302: *      HERE FOR DUPLICATED GOTO FIELD
        !          13303: *
        !          13304: CMP17  ERB  214,SYNTAX ERROR. DUPLICATED GOTO FIELD
        !          13305: *
        !          13306: *      HERE TO GENERATE CODE
        !          13307: *
        !          13308: CMP18  ZER  SCNSE            STOP POSITIONAL ERROR FLAGS
        !          13309:        MOV  CMSTM(XS),XR     LOAD TREE PTR FOR STATEMENT BODY
        !          13310:        ZER  WB               COLLECTABLE VALUE FOR WB FOR CDGVL
        !          13311:        ZER  WC               RESET CONSTANT FLAG FOR CDGVL
        !          13312:        JSR  EXPAP            TEST FOR PATTERN MATCH
        !          13313:        PPM  CMP19            JUMP IF NOT PATTERN MATCH
        !          13314:        MOV  =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER
        !          13315:        MOV  =C$PMT,CMTYP(XR)
        !          13316: *
        !          13317: *      HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
        !          13318: *
        !          13319: CMP19  JSR  CDGVL            GENERATE CODE FOR BODY OF STATEMENT
        !          13320:        MOV  CMSGO(XS),XR     LOAD SGOTO POINTER
        !          13321:        MOV  XR,WA            COPY IT
        !          13322:        BZE  XR,CMP21         JUMP IF NO SUCCESS GOTO
        !          13323:        ZER  CMSOC(XS)        CLEAR SUCCESS OFFSET FILLIN PTR
        !          13324:        BHI  XR,STATE,CMP20   JUMP IF COMPLEX GOTO
        !          13325: *
        !          13326: *      HERE FOR SIMPLE SUCCESS GOTO (LABEL)
        !          13327: *
        !          13328:        ADD  *VRTRA,WA        POINT TO VRTRA FIELD AS REQUIRED
        !          13329:        JSR  CDWRD            GENERATE SUCCESS GOTO
        !          13330:        BRN  CMP22            JUMP TO DEAL WITH FGOTO
        !          13331: *
        !          13332: *      HERE FOR COMPLEX SUCCESS GOTO
        !          13333: *
        !          13334: CMP20  BEQ  XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO
        !          13335:        ZER  WB               ELSE SET OK VALUE FOR CDGVL IN WB
        !          13336:        JSR  CDGCG            GENERATE CODE FOR SUCCESS GOTO
        !          13337:        BRN  CMP22            JUMP TO DEAL WITH FGOTO
        !          13338: *
        !          13339: *      HERE FOR NO SUCCESS GOTO
        !          13340: *
        !          13341: CMP21  MOV  CWCOF,CMSOC(XS)  SET SUCCESS FILL IN OFFSET
        !          13342:        MOV  =OCER$,WA        POINT TO COMPILE ERROR CALL
        !          13343:        JSR  CDWRD            GENERATE AS TEMPORARY VALUE
        !          13344:        EJC
        !          13345: *
        !          13346: *      CMPIL (CONTINUED)
        !          13347: *
        !          13348: *      HERE TO DEAL WITH FAILURE GOTO
        !          13349: *
        !          13350: CMP22  MOV  CMFGO(XS),XR     LOAD FAILURE GOTO POINTER
        !          13351:        MOV  XR,WA            COPY IT
        !          13352:        ZER  CMFFC(XS)        SET NO FILL IN REQUIRED YET
        !          13353:        BZE  XR,CMP23         JUMP IF NO FAILURE GOTO GIVEN
        !          13354:        ADD  *VRTRA,WA        POINT TO VRTRA FIELD IN CASE
        !          13355:        BLO  XR,STATE,CMPSE   JUMP TO GEN IF SIMPLE FGOTO
        !          13356: *
        !          13357: *      HERE FOR COMPLEX FAILURE GOTO
        !          13358: *
        !          13359:        MOV  CWCOF,WB         SAVE OFFSET TO O$GOF CALL
        !          13360:        MOV  =OGOF$,WA        POINT TO FAILURE GOTO CALL
        !          13361:        JSR  CDWRD            GENERATE
        !          13362:        MOV  =OFIF$,WA        POINT TO FAIL IN FAIL WORD
        !          13363:        JSR  CDWRD            GENERATE
        !          13364:        JSR  CDGCG            GENERATE CODE FOR FAILURE GOTO
        !          13365:        MOV  WB,WA            COPY OFFSET TO O$GOF FOR CDFAL
        !          13366:        MOV  =B$CDC,WB        SET COMPLEX CASE CDTYP
        !          13367:        BRN  CMP25            JUMP TO BUILD CDBLK
        !          13368: *
        !          13369: *      HERE IF NO FAILURE GOTO GIVEN
        !          13370: *
        !          13371: CMP23  MOV  =OUNF$,WA        LOAD UNEXPECTED FAILURE CALL IN CAS
        !          13372:        MOV  CSWFL,WC         GET -NOFAIL FLAG
        !          13373:        ORB  CMCGO(XS),WC     CHECK IF CONDITIONAL GOTO
        !          13374:        ZRB  WC,CMPSE         JUMP IF -NOFAIL AND NO COND. GOTO
        !          13375:        MNZ  CMFFC(XS)        ELSE SET FILL IN FLAG
        !          13376:        MOV  =OCER$,WA        AND SET COMPILE ERROR FOR TEMPORARY
        !          13377: *
        !          13378: *      MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
        !          13379: *      ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
        !          13380: *
        !          13381: CMPSE  MOV  =B$CDS,WB        SET CDTYP FOR SIMPLE CASE
        !          13382:        EJC
        !          13383: *
        !          13384: *      CMPIL (CONTINUED)
        !          13385: *
        !          13386: *      MERGE HERE TO BUILD CDBLK
        !          13387: *
        !          13388: *      (WA)                  CDFAL VALUE TO BE GENERATED
        !          13389: *      (WB)                  CDTYP VALUE TO BE GENERATED
        !          13390: *
        !          13391: *      AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
        !          13392: *      CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
        !          13393: *      OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
        !          13394: *
        !          13395: CMP25  MOV  R$CCB,XR         POINT TO CCBLK
        !          13396:        MOV  CMLBL(XS),XL     GET POSSIBLE LABEL POINTER
        !          13397:        BZE  XL,CMP26         SKIP IF NO LABEL
        !          13398:        ZER  CMLBL(XS)        CLEAR FLAG FOR NEXT STATEMENT
        !          13399:        MOV  XR,VRLBL(XL)     PUT CDBLK PTR IN VRBLK LABEL FIELD
        !          13400: *
        !          13401: *      MERGE AFTER DOING LABEL
        !          13402: *
        !          13403: CMP26  MOV  WB,(XR)          SET TYPE WORD FOR NEW CDBLK
        !          13404:        MOV  WA,CDFAL(XR)     SET FAILURE WORD
        !          13405:        MOV  XR,XL            COPY POINTER TO CCBLK
        !          13406:        MOV  CCUSE(XR),WB     LOAD LENGTH GEN (= NEW CDLEN)
        !          13407:        MOV  CCLEN(XR),WC     LOAD TOTAL CCBLK LENGTH
        !          13408:        ADD  WB,XL            POINT PAST CDBLK
        !          13409:        SUB  WB,WC            GET LENGTH LEFT FOR CHOP OFF
        !          13410:        MOV  =B$CCT,(XL)      SET TYPE CODE FOR NEW CCBLK AT END
        !          13411:        MOV  *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET
        !          13412:        MOV  *CCCOD,CWCOF     REINITIALISE CWCOF
        !          13413:        MOV  WC,CCLEN(XL)     SET NEW LENGTH
        !          13414:        MOV  XL,R$CCB         SET NEW CCBLK POINTER
        !          13415:        MOV  CMPSN,CDSTM(XR)  SET STATEMENT NUMBER
        !          13416:        ICV  CMPSN            BUMP STATEMENT NUMBER
        !          13417: *
        !          13418: *      SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
        !          13419: *
        !          13420:        MOV  CMPCD(XS),XL     LOAD PTR TO PREVIOUS CDBLK
        !          13421:        BZE  CMFFP(XS),CMP27  JUMP IF NO FAILURE FILL IN REQUIRED
        !          13422:        MOV  XR,CDFAL(XL)     ELSE SET FAILURE PTR IN PREVIOUS
        !          13423: *
        !          13424: *      HERE TO DEAL WITH SUCCESS FORWARD POINTER
        !          13425: *
        !          13426: CMP27  MOV  CMSOP(XS),WA     LOAD SUCCESS OFFSET
        !          13427:        BZE  WA,CMP28         JUMP IF NO FILL IN REQUIRED
        !          13428:        ADD  WA,XL            ELSE POINT TO FILL IN LOCATION
        !          13429:        MOV  XR,(XL)          STORE FORWARD POINTER
        !          13430:        ZER  XL               CLEAR GARBAGE XL VALUE
        !          13431:        EJC
        !          13432: *
        !          13433: *      CMPIL (CONTINUED)
        !          13434: *
        !          13435: *      NOW SET FILL IN POINTERS FOR THIS STATEMENT
        !          13436: *
        !          13437: CMP28  MOV  CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG
        !          13438:        MOV  CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET
        !          13439:        MOV  XR,CMPCD(XS)     SAVE PTR TO THIS CDBLK
        !          13440:        BNZ  CMTRA(XS),CMP29  JUMP IF INITIAL ENTRY ALREADY SET
        !          13441:        MOV  XR,CMTRA(XS)     ELSE SET PTR HERE AS DEFAULT
        !          13442: *
        !          13443: *      HERE AFTER COMPILING ONE STATEMENT
        !          13444: *
        !          13445: CMP29  BLT  STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE
        !          13446:        BZE  CSWLS,CMP30      SKIP IF -NOLIST
        !          13447:        JSR  LISTR            LIST LAST LINE
        !          13448: *
        !          13449: *      RETURN
        !          13450: *
        !          13451: CMP30  MOV  CMTRA(XS),XR     LOAD INITIAL ENTRY CDBLK POINTER
        !          13452:        ADD  *CMNEN,XS        POP WORK LOCATIONS OFF STACK
        !          13453: *
        !          13454: *      LOOP TO UNNEST ANY OUTSTANDING -COPY LEVELS
        !          13455: *
        !          13456: CMP31  JSR  COPND            CALL TO UNNEST -COPY
        !          13457:        BNZ  R$COP,CMP31      LOOP IF NOT ALL -COPYS CLOSED
        !          13458:        EXI                   RETURN TO CMPIL CALLER
        !          13459: *
        !          13460: *      HERE AT END OF GOTO FIELD
        !          13461: *
        !          13462: CMP32  MOV  CMFGO(XS),WB     GET FAIL GOTO
        !          13463:        ORB  CMSGO(XS),WB     OR IN SUCCESS GOTO
        !          13464:        BNZ  WB,CMP18         OK IF NON-NULL FIELD
        !          13465:        ERB  215,SYNTAX ERROR. EMPTY GOTO FIELD
        !          13466: *
        !          13467: *      CONTROL CARD FOUND
        !          13468: *
        !          13469: CMP33  ICV  WB               POINT PAST CH$MN
        !          13470:        JSR  CNCRD            PROCESS CONTROL CARD
        !          13471:        ZER  SCNSE            CLEAR START OF ELEMENT LOC.
        !          13472:        BRN  CMPCE            LOOP FOR NEXT STATEMENT
        !          13473:        ENP                   END PROCEDURE CMPIL
        !          13474:        EJC
        !          13475: *
        !          13476: *      CNCRD -- CONTROL CARD PROCESSOR
        !          13477: *
        !          13478: *      CALLED TO DEAL WITH CONTROL CARDS
        !          13479: *
        !          13480: *      R$CIM                 POINTS TO CURRENT IMAGE
        !          13481: *      (WB)                  OFFSET TO 1ST CHAR OF CONTROL CARD
        !          13482: *      JSR  CNCRD            CALL TO PROCESS CONTROL CARDS
        !          13483: *      (XL,XR,WA,WB,WC,IA)   DESTROYED
        !          13484: *
        !          13485: CNCRD  PRC  E,0              ENTRY POINT
        !          13486:        MOV  WB,SCNPT         OFFSET FOR CONTROL CARD SCAN
        !          13487:        MOV  =CCNOC,WA        NUMBER OF CHARS FOR COMPARISON
        !          13488:        CTW  WA,0             CONVERT TO WORD COUNT
        !          13489:        MOV  WA,CNSWC         SAVE WORD COUNT
        !          13490: *
        !          13491: *      LOOP HERE IF MORE THAN ONE CONTROL CARD
        !          13492: *
        !          13493: CNC01  BGE  SCNPT,SCNIL,CNC10 RETURN IF END OF IMAGE
        !          13494:        MOV  R$CIM,XR         POINT TO IMAGE
        !          13495:        PLC  XR,SCNPT         CHAR PTR FOR FIRST CHAR
        !          13496:        LCH  WA,(XR)+         GET FIRST CHAR
        !          13497:        BEQ  WA,=CH$LI,CNC07  SPECIAL CASE OF -INXXX
        !          13498: .IF    .CASL
        !          13499:        BEQ  WA,=CH$$I,CNC07  DITTO (LC)
        !          13500: .FI
        !          13501:        MNZ  SCNCC            SET FLAG FOR SCANE
        !          13502:        JSR  SCANE            SCAN CARD NAME
        !          13503:        ZER  SCNCC            CLEAR SCANE FLAG
        !          13504:        BNZ  XL,CNC06         FAIL UNLESS CONTROL CARD NAME
        !          13505:        MOV  =CCNOC,WA        NO. OF CHARS TO BE COMPARED
        !          13506:        BLT  SCLEN(XR),WA,CNC06  FAIL IF TOO FEW CHARS
        !          13507:        MOV  XR,XL            POINT TO CONTROL CARD NAME
        !          13508:        ZER  WB               ZERO OFFSET FOR SUBSTRING
        !          13509: .IF    .CASL
        !          13510:        JSR  SBSCC            CONVERT CASE BEFORE COMPARISON
        !          13511: .ELSE
        !          13512:        JSR  SBSTR            EXTRACT SUBSTRING FOR COMPARISON
        !          13513: .FI
        !          13514:        MOV  XR,CNSCC         KEEP CONTROL CARD SUBSTRING PTR
        !          13515:        MOV  =CCNMS,XR        POINT TO LIST OF STANDARD NAMES
        !          13516:        ZER  WB               INITIALISE NAME OFFSET
        !          13517:        LCT  WC,=CC$CT        NUMBER OF STANDARD NAMES
        !          13518: *
        !          13519: *      TRY TO MATCH NAME
        !          13520: *
        !          13521: CNC02  MOV  CNSCC,XL         POINT TO NAME
        !          13522:        LCT  WA,CNSWC         COUNTER FOR INNER LOOP
        !          13523:        BRN  CNC04            JUMP INTO LOOP
        !          13524: *
        !          13525: *      INNER LOOP TO MATCH CARD NAME CHARS
        !          13526: *
        !          13527: CNC03  ICA  XR               BUMP STANDARD NAMES PTR
        !          13528:        ICA  XL               BUMP NAME POINTER
        !          13529: *
        !          13530: *      HERE TO INITIATE THE LOOP
        !          13531: *
        !          13532: CNC04  CNE  SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE
        !          13533:        BCT  WA,CNC03         LOOP IF MORE WORDS TO COMPARE
        !          13534:        EJC
        !          13535: *
        !          13536: *      CNCRD (CONTINUED)
        !          13537: *
        !          13538: *      MATCHED - BRANCH ON CARD OFFSET
        !          13539: *
        !          13540:        MOV  WB,XL            GET NAME OFFSET
        !          13541:        BSW  XL,CC$CT         SWITCH
        !          13542: .IF    .CASL
        !          13543:        IFF  CC$CI,CNC11      -CASEIG
        !          13544: .FI
        !          13545:        IFF  CC$CO,CNC23      -COPY
        !          13546:        IFF  CC$EJ,CNC12      -EJECT
        !          13547:        IFF  CC$FA,CNC13      -FAIL
        !          13548:        IFF  CC$LI,CNC14      -LIST
        !          13549: .IF    .CASL
        !          13550:        IFF  CC$NC,CNC15      -NOCASEIG
        !          13551: .FI
        !          13552:        IFF  CC$NF,CNC16      -NOFAIL
        !          13553:        IFF  CC$NL,CNC17      -NOLIST
        !          13554:        IFF  CC$ST,CNC18      -STITLE
        !          13555:        IFF  CC$TI,CNC19      -TITLE
        !          13556:        IFF  CC$TR,CNC22      -TRACE
        !          13557:        ESW                   END SWITCH
        !          13558: *
        !          13559: *      NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
        !          13560: *
        !          13561: CNC05  ICA  XR               BUMP STANDARD NAMES PTR
        !          13562:        BCT  WA,CNC05         LOOP
        !          13563:        ICV  WB               BUMP NAMES OFFSET
        !          13564:        BCT  WC,CNC02         CONTINUE IF MORE NAMES
        !          13565: *
        !          13566: *      INVALID CONTROL CARD NAME
        !          13567: *
        !          13568: CNC06  ERB  216,INVALID CONTROL CARD
        !          13569: *
        !          13570: *      SPECIAL PROCESSING FOR -INXXX
        !          13571: *
        !          13572: CNC07  LCH  WA,(XR)          GET NEXT CHAR
        !          13573: .IF    .CASL
        !          13574:        BEQ  WA,=CH$$N,CNC08  SKIP IF LC N
        !          13575: .FI
        !          13576:        BNE  WA,=CH$LN,CNC06  FAIL IF NOT LETTER N
        !          13577: .IF    .CASL
        !          13578: CNC08  ADD  =NUM02,SCNPT     BUMP OFFSET PAST -IN
        !          13579: .ELSE
        !          13580:        ADD  =NUM02,SCNPT     BUMP OFFSET PAST -IN
        !          13581: .FI
        !          13582:        JSR  SCANE            SCAN INTEGER AFTER -IN
        !          13583:        MOV  XR,-(XS)         STACK SCANNED ITEM
        !          13584:        JSR  GTSMI            CHECK IF INTEGER
        !          13585:        PPM  CNC06            FAIL IF NOT INTEGER
        !          13586:        PPM  CNC06            FAIL IF NEGATIVE OR LARGE
        !          13587:        MOV  XR,CSWIN         KEEP INTEGER
        !          13588:        EJC
        !          13589: *
        !          13590: *      CNCRD (CONTINUED)
        !          13591: *
        !          13592: *      CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
        !          13593: *
        !          13594: CNC09  MOV  SCNPT,WA         PRESERVE IN CASE XEQ TIME COMPILE
        !          13595:        JSR  SCANE            LOOK FOR COMMA
        !          13596:        BEQ  XL,=T$CMA,CNC01  LOOP IF COMMA FOUND
        !          13597:        MOV  WA,SCNPT         RESTORE SCNPT IN CASE XEQ TIME
        !          13598: *
        !          13599: *      RETURN POINT
        !          13600: *
        !          13601: CNC10  EXI                   RETURN
        !          13602: .IF    .CASL
        !          13603: *
        !          13604: *      -CASEIG
        !          13605: *
        !          13606: CNC11  MNZ  CSWCI            SET SWITCH
        !          13607:        BRN  CNC09            MERGE
        !          13608: .FI
        !          13609: *
        !          13610: *      -EJECT
        !          13611: *
        !          13612: CNC12  BZE  CSWLS,CNC10      RETURN IF -NOLIST
        !          13613:        JSR  PRTPS            EJECT
        !          13614:        JSR  LISTT            LIST TITLE
        !          13615:        BRN  CNC10            FINISHED
        !          13616: *
        !          13617: *      -FAIL
        !          13618: *
        !          13619: CNC13  MNZ  CSWFL            SET SWITCH
        !          13620:        BRN  CNC09            MERGE
        !          13621: *
        !          13622: *      -LIST
        !          13623: *
        !          13624: CNC14  MNZ  CSWLS            SET SWITCH
        !          13625:        BRN  CNC09            MERGE
        !          13626: .IF    .CASL
        !          13627: *
        !          13628: *      -NOCASEIG
        !          13629: *
        !          13630: CNC15  ZER  CSWCI            CLEAR SWITCH
        !          13631:        BRN  CNC09            MERGE
        !          13632: .FI
        !          13633: *
        !          13634: *      -NOFAIL
        !          13635: *
        !          13636: CNC16  ZER  CSWFL            CLEAR SWITCH
        !          13637:        BRN  CNC09            MERGE
        !          13638:        EJC
        !          13639: *
        !          13640: *      CNCRD (CONTINUED)
        !          13641: *
        !          13642: *      -NOLIST
        !          13643: *
        !          13644: CNC17  ZER  CSWLS            CLEAR SWITCH
        !          13645:        BRN  CNC09            MERGE
        !          13646: *
        !          13647: *      -STITL
        !          13648: *
        !          13649: CNC18  MOV  =R$STL,CNR$T     PTR TO R$STL
        !          13650:        BRN  CNC20            MERGE
        !          13651: *
        !          13652: *      -TITLE
        !          13653: *
        !          13654: CNC19  MOV  =NULLS,R$STL     CLEAR SUBTITLE
        !          13655:        MOV  =R$TTL,CNR$T     PTR TO R$TTL
        !          13656: *
        !          13657: *      COMMON PROCESSING FOR -TITLE, -STITL
        !          13658: *
        !          13659: CNC20  MOV  =NULLS,XR        NULL IN CASE NEEDED
        !          13660:        MNZ  CNTTL            SET FLAG FOR NEXT LISTR CALL
        !          13661:        MOV  =CCOFS,WB        OFFSET TO TITLE/SUBTITLE
        !          13662:        MOV  SCNIL,WA         INPUT IMAGE LENGTH
        !          13663:        BLO  WA,WB,CNC21      JUMP IF NO CHARS LEFT
        !          13664:        SUB  WB,WA            NO OF CHARS TO EXTRACT
        !          13665:        MOV  R$CIM,XL         POINT TO IMAGE
        !          13666:        JSR  SBSTR            GET TITLE/SUBTITLE
        !          13667: *
        !          13668: *      STORE TITLE/SUBTITLE
        !          13669: *
        !          13670: CNC21  MOV  CNR$T,XL         POINT TO STORAGE LOCATION
        !          13671:        MOV  XR,(XL)          STORE TITLE/SUBTITLE
        !          13672:        BRN  CNC10            RETURN
        !          13673: *
        !          13674: *      -TRACE
        !          13675: *
        !          13676: *      PROVIDED FOR SYSTEM DEBUGGING.  TOGGLES THE SYSTEM LABEL
        !          13677: *      TRACE SWITCH AT COMPILE TIME
        !          13678: *
        !          13679: CNC22  JSR  SYSTT            TOGGLE SWITCH
        !          13680:        BRN  CNC09            MERGE
        !          13681: *
        !          13682: *      -COPY
        !          13683: *
        !          13684: *      GET FILETAG AND NOTIFY OSINT THAT WE ARE NESTING
        !          13685: *
        !          13686: CNC23  JSR  SCANE            GET FILETAG
        !          13687:        BNE  =T$CON,XL,CNC06  ERR IF NOT CONSTANT
        !          13688:        BNE  =B$SCL,(XR),CNC06 ERR IF NOT SCBLK
        !          13689:        JSR  SYSSC            CALL TO START COPY
        !          13690:        ERR  258,COPY FILE DOES NOT EXIST
        !          13691:        PPM  EROSI            ERROR RETURN (ALWAYS)
        !          13692:        MOV  WA,WB            SAVE IOTAG FROM OSINT
        !          13693:        MOV  *COSI$,WA        GET SIZE OF COPY BLOCK
        !          13694:        JSR  ALLOC            ALLOCATE
        !          13695:        MOV  =B$COP,COTYP(XR) SET TYPE
        !          13696:        MOV  R$COP,CONXT(XR)  PLACE AT FRONT OF STACK CHN
        !          13697:        MOV  XR,R$COP         SPLICE IT IN
        !          13698:        MOV  WB,COIOT(XR)     SAVE OSINT IOTAG
        !          13699:        MOV  TTINS,COTTI(XR)  SAVE TTINS
        !          13700:        ZER  TTINS            INPUT NOT FROM TERMINAL NOW
        !          13701:        MOV  R$CIM,COCIM(XR)  SAVE R$CIM IN CASE EXEC TIME
        !          13702:        MOV  SCNPT,COSPT(XR)  SAVE SCNPT IN CASE EXEC TIME
        !          13703:        MOV  CSWLS,COSLS(XR)  SAVE LIST FLAG
        !          13704:        MOV  CSWIN,COSIN(XR)  SAVE -INXXX VALUE
        !          13705:        MOV  R$STL,COSTL(XR)  SAVE SUBTITLE
        !          13706:        BZE  CSWLS,CNC10      NO LIST -COPY IF -NOLIST
        !          13707:        JSR  LISTR            LIST -COPY CARD
        !          13708:        BRN  CNC10            EXIT
        !          13709:        ENP                   END PROCEDURE CNCRD
        !          13710:        EJC
        !          13711: *
        !          13712: *      COPND -- END -COPY NESTING
        !          13713: *
        !          13714: *      COPND IS CALLED FROM CMPIL AND READR IN ORDER TO
        !          13715: *      UNNEST ONE LEVEL OF -COPY AND RESTORE THE PREVIOUS
        !          13716: *      INPUT COMPILE STRING.  THE COPY BLOCK IS REMOVED
        !          13717: *      FROM THE CHAIN AND THE STATE RESTORED FROM IT.
        !          13718: *
        !          13719: *      JSR  COPND            CALL TO END -COPY AT CUR. LEVEL
        !          13720: *      (XL,WA,WB,WC)         DESTROYED
        !          13721: *
        !          13722: COPND  PRC  E,0              ENTRY POINT
        !          13723:        MOV  R$COP,XL         GET POINTER TO CURRENT COBLK
        !          13724:        BZE  XL,COP02         EXIT IF NONE
        !          13725:        MOV  CONXT(XL),R$COP  TAKE OFF CHAIN
        !          13726:        MOV  COIOT(XL),WA     GET IOTAG FOR OSINT
        !          13727:        JSR  SYSEC            CALL TO END COPY
        !          13728:        PPM                   DO NOT USE
        !          13729:        PPM  EROSI            ERROR EXIT
        !          13730:        BZE  CSWLS,COP01      SKIP LISTING IF -NOLIST
        !          13731:        JSR  LISTR            LIST CURRENT IMAGE
        !          13732: *
        !          13733: *      MERGE AFTER POSSIBLE LISTING OF CURRENT IMAGE
        !          13734: *
        !          13735: COP01  MOV  COTTI(XL),TTINS  RESTORE TERMINAL INPUT FLAG
        !          13736:        MOV  COSLS(XL),CSWLS  RESTORE LISTING STATE
        !          13737:        MOV  COSPT(XL),SCNPT  GET OLD SCAN POINTER
        !          13738:        MOV  COSIN(XL),CSWIN  OLD INPUT IMAGE LENGTH
        !          13739:        MOV  COSTL(XL),R$STL  RESTORE SUBTITLE STRING
        !          13740:        MNZ  LSTPF            THIS IMAGE LISTED IN CNCRD
        !          13741:        MOV  COCIM(XL),XL     GET OLD COMPILER IMAGE SCBLK
        !          13742:        MOV  XL,R$CIM         RESTORE IT
        !          13743:        MOV  SCLEN(XL),SCNIL  SET INPUT IMAGE LENGTH TOO
        !          13744: *
        !          13745: *      MERGE TO EXIT
        !          13746: *
        !          13747: COP02  EXI                   RETURN TO CALLER
        !          13748:        ENP                   END PROCEDURE COPND
        !          13749:        EJC
        !          13750: *
        !          13751: *      DFFNC -- DEFINE FUNCTION
        !          13752: *
        !          13753: *      DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
        !          13754: *      A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
        !          13755: *
        !          13756: *      (XR)                  POINTER TO VRBLK
        !          13757: *      (XL)                  POINTER TO NEW FUNCTION BLOCK
        !          13758: *      JSR  DFFNC            CALL TO DEFINE FUNCTION
        !          13759: *      (WA,WB)               DESTROYED
        !          13760: *
        !          13761: DFFNC  PRC  E,0              ENTRY POINT
        !          13762: .IF    .CNLD
        !          13763: .ELSE
        !          13764:        BNE  (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL
        !          13765:        ICV  EFUSE(XL)        ELSE INCREMENT ITS USE COUNT
        !          13766: *
        !          13767: *      HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
        !          13768: *
        !          13769: DFFN1  MOV  XR,WA            SAVE VRBLK POINTER
        !          13770:        MOV  VRFNC(XR),XR     LOAD OLD FUNCTION POINTER
        !          13771:        BNE  (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL
        !          13772:        MOV  EFUSE(XR),WB     ELSE GET USE COUNT
        !          13773:        DCV  WB               DECREMENT
        !          13774:        MOV  WB,EFUSE(XR)     STORE DECREMENTED VALUE
        !          13775:        BNZ  WB,DFFN2         JUMP IF USE COUNT STILL NON-ZERO
        !          13776:        JSR  SYSUL            ELSE CALL SYSTEM UNLOAD FUNCTION
        !          13777: *
        !          13778: *      HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
        !          13779: *
        !          13780: DFFN2  MOV  WA,XR            RESTORE VRBLK POINTER
        !          13781: .FI
        !          13782:        MOV  XL,WA            COPY FUNCTION BLOCK PTR
        !          13783:        BLT  XR,=R$YYY,DFFN3  SKIP CHECKS IF OPSYN OP DEFINITION
        !          13784:        BNZ  VRLEN(XR),DFFN3  JUMP IF NOT SYSTEM VARIABLE
        !          13785: *
        !          13786: *      FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
        !          13787: *
        !          13788:        MOV  VRSVP(XR),XL     POINT TO SVBLK
        !          13789:        MOV  SVBIT(XL),WB     LOAD BIT INDICATORS
        !          13790:        ANB  BTFNC,WB         IS IT A SYSTEM FUNCTION
        !          13791:        ZRB  WB,DFFN3         REDEF OK IF NOT
        !          13792:        ERB  217,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION
        !          13793: *
        !          13794: *      HERE IF REDEFINITION IS PERMITTED
        !          13795: *
        !          13796: DFFN3  MOV  WA,VRFNC(XR)     STORE NEW FUNCTION POINTER
        !          13797:        MOV  WA,XL            RESTORE FUNCTION BLOCK POINTER
        !          13798:        EXI                   RETURN TO DFFNC CALLER
        !          13799:        ENP                   END PROCEDURE DFFNC
        !          13800:        EJC
        !          13801: *
        !          13802: *      DTYPE -- GET DATATYPE NAME
        !          13803: *
        !          13804: *      (XR)                  OBJECT WHOSE DATATYPE IS REQUIRED
        !          13805: *      JSR  DTYPE            CALL TO GET DATATYPE
        !          13806: *      (XR)                  RESULT DATATYPE
        !          13807: *
        !          13808: DTYPE  PRC  E,0              ENTRY POINT
        !          13809:        BEQ  (XR),=B$PDT,DTYP1   JUMP IF PROG.DEFINED
        !          13810:        MOV  (XR),XR          LOAD TYPE WORD
        !          13811:        LEI  XR               GET ENTRY POINT ID (BLOCK CODE)
        !          13812:        WTB  XR               CONVERT TO BAU OFFSET
        !          13813:        MOV  SCNMT(XR),XR     LOAD TABLE ENTRY
        !          13814:        EXI                   EXIT TO DTYPE CALLER
        !          13815: *
        !          13816: *      HERE IF PROGRAM DEFINED
        !          13817: *
        !          13818: DTYP1  MOV  PDDFP(XR),XR     POINT TO DFBLK
        !          13819:        MOV  DFNAM(XR),XR     GET DATATYPE NAME FROM DFBLK
        !          13820:        EXI                   RETURN TO DTYPE CALLER
        !          13821:        ENP                   END PROCEDURE DTYPE
        !          13822:        EJC
        !          13823: *
        !          13824: *      DUMPR -- PRINT DUMP OF STORAGE
        !          13825: *
        !          13826: *      (XR)                  DUMP ARGUMENT (SEE BELOW)
        !          13827: *      JSR  DUMPR            CALL TO PRINT DUMP
        !          13828: *      (XR,XL)               DESTROYED
        !          13829: *      (WA,WB,WC,RA)         DESTROYED
        !          13830: *
        !          13831: *      THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
        !          13832: *
        !          13833: *      DMARG = 0             NO DUMP PRINTED
        !          13834: *      DMARG = 1             PARTIAL DUMP (NAT VARS, KEYWORDS)
        !          13835: *      DMARG GE 2            FULL DUMP (INCL ARRAYS ETC.)
        !          13836: *
        !          13837: *      SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
        !          13838: *      COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
        !          13839: *      AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
        !          13840: *
        !          13841: DUMPR  PRC  E,0              ENTRY POINT
        !          13842:        BZE  XR,DMP28         SKIP DUMP IF ARGUMENT IS ZERO
        !          13843:        ZER  XL               CLEAR XL
        !          13844:        ZER  WB               ZERO MOVE OFFSET
        !          13845:        MOV  XR,DMARG         SAVE DUMP ARGUMENT
        !          13846:        JSR  GBCOL            COLLECT GARBAGE
        !          13847:        JSR  PRTPG            EJECT PRINTER
        !          13848:        MOV  =DMHDV,XR        POINT TO HEADING FOR VARIABLES
        !          13849:        JSR  PRTFB            PRINT IT
        !          13850: *
        !          13851: *      FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
        !          13852: *      ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
        !          13853: *      THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
        !          13854: *      NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
        !          13855: *      INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME  OR
        !          13856: *      PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
        !          13857: *      FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
        !          13858: *      EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
        !          13859: *      ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
        !          13860: *      OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
        !          13861: *
        !          13862:        ZER  DMVCH            SET NULL CHAIN TO START
        !          13863:        MOV  HSHTB,WA         POINT TO HASH TABLE
        !          13864: *
        !          13865: *      LOOP THROUGH HEADERS IN HASH TABLE
        !          13866: *
        !          13867: DMP00  MOV  WA,XR            COPY HASH BUCKET POINTER
        !          13868:        ICA  WA               BUMP POINTER
        !          13869:        SUB  *VRNXT,XR        SET OFFSET TO MERGE
        !          13870: *
        !          13871: *      LOOP THROUGH VRBLKS ON ONE CHAIN
        !          13872: *
        !          13873: DMP01  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON CHAIN
        !          13874:        BZE  XR,DMP09         JUMP IF END OF THIS HASH CHAIN
        !          13875:        MOV  XR,XL            ELSE COPY VRBLK POINTER
        !          13876:        EJC
        !          13877: *
        !          13878: *      DUMPR (CONTINUED)
        !          13879: *
        !          13880: *      LOOP TO FIND VALUE AND SKIP IF NULL
        !          13881: *
        !          13882: DMP02  MOV  VRVAL(XL),XL     LOAD VALUE
        !          13883:        BEQ  XL,=NULLS,DMP01  LOOP FOR NEXT VRBLK IF NULL VALUE
        !          13884:        BEQ  (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED
        !          13885: *
        !          13886: *      NON-NULL VALUE, PREPARE TO SEARCH CHAIN
        !          13887: *
        !          13888:        MOV  XR,WC            SAVE VRBLK POINTER
        !          13889:        ADD  *VRSOF,XR        ADJUST PTR TO BE LIKE SCBLK PTR
        !          13890:        BNZ  SCLEN(XR),DMP03  JUMP IF NON-SYSTEM VARIABLE
        !          13891:        MOV  VRSVO(XR),XR     ELSE LOAD PTR TO NAME IN SVBLK
        !          13892: *
        !          13893: *      HERE WITH NAME POINTER FOR NEW BLOCK IN XR
        !          13894: *
        !          13895: DMP03  MOV  XR,WB            SAVE POINTER TO CHARS
        !          13896:        MOV  WA,DMPSV         SAVE HASH BUCKET POINTER
        !          13897:        MOV  =DMVCH,WA        POINT TO CHAIN HEAD
        !          13898: *
        !          13899: *      LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
        !          13900: *
        !          13901: DMP04  MOV  WA,DMPCH         SAVE CHAIN POINTER
        !          13902:        MOV  WA,XL            COPY IT
        !          13903:        MOV  (XL),XR          LOAD POINTER TO NEXT ENTRY
        !          13904:        BZE  XR,DMP08         JUMP IF END OF CHAIN TO INSERT
        !          13905:        ADD  *VRSOF,XR        ELSE GET NAME PTR FOR CHAINED VRBLK
        !          13906:        BNZ  SCLEN(XR),DMP05  JUMP IF NOT SYSTEM VARIABLE
        !          13907:        MOV  VRSVO(XR),XR     ELSE POINT TO NAME IN SVBLK
        !          13908: *
        !          13909: *      HERE PREPARE TO COMPARE THE NAMES
        !          13910: *
        !          13911: *      (WA)                  SCRATCH
        !          13912: *      (WB)                  POINTER TO STRING OF ENTERING VRBLK
        !          13913: *      (WC)                  POINTER TO ENTERING VRBLK
        !          13914: *      (XR)                  POINTER TO STRING OF CURRENT BLOCK
        !          13915: *      (XL)                  SCRATCH
        !          13916: *
        !          13917: DMP05  MOV  WB,XL            POINT TO ENTERING VRBLK STRING
        !          13918:        MOV  SCLEN(XL),WA     LOAD ITS LENGTH
        !          13919:        PLC  XL               POINT TO CHARS OF ENTERING STRING
        !          13920:        BHI  WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH
        !          13921:        PLC  XR               ELSE POINT TO CHARS OF OLD STRING
        !          13922:        CMC  DMP08,DMP07      COMPARE, INSERT IF NEW IS LLT OLD
        !          13923:        BRN  DMP08            OR IF LEQ (WE HAD SHORTER LENGTH)
        !          13924: *
        !          13925: *      HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
        !          13926: *
        !          13927: DMP06  MOV  SCLEN(XR),WA     LOAD SHORTER LENGTH
        !          13928:        PLC  XR               POINT TO CHARS OF OLD STRING
        !          13929:        CMC  DMP08,DMP07      COMPARE, INSERT IF NEW ONE LOW
        !          13930:        EJC
        !          13931: *
        !          13932: *      DUMPR (CONTINUED)
        !          13933: *
        !          13934: *      HERE WE MOVE OUT ON THE CHAIN
        !          13935: *
        !          13936: DMP07  MOV  DMPCH,XL         COPY CHAIN POINTER
        !          13937:        MOV  (XL),WA          MOVE TO NEXT ENTRY ON CHAIN
        !          13938:        BRN  DMP04            LOOP BACK
        !          13939: *
        !          13940: *      HERE AFTER LOCATING THE PROPER INSERTION POINT
        !          13941: *
        !          13942: DMP08  MOV  DMPCH,XL         COPY CHAIN POINTER
        !          13943:        MOV  DMPSV,WA         RESTORE HASH BUCKET POINTER
        !          13944:        MOV  WC,XR            RESTORE VRBLK POINTER
        !          13945:        MOV  (XL),VRGET(XR)   LINK VRBLK TO REST OF CHAIN
        !          13946:        MOV  XR,(XL)          LINK VRBLK INTO CURRENT CHAIN LOC
        !          13947:        BRN  DMP01            LOOP BACK FOR NEXT VRBLK
        !          13948: *
        !          13949: *      HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
        !          13950: *
        !          13951: DMP09  BNE  WA,HSHTE,DMP00   LOOP BACK IF MORE BUCKETS TO GO
        !          13952: *
        !          13953: *      LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
        !          13954: *
        !          13955: DMP10  MOV  DMVCH,XR         LOAD POINTER TO NEXT ENTRY ON CHAIN
        !          13956:        BZE  XR,DMP11         JUMP IF END OF CHAIN
        !          13957:        MOV  (XR),DMVCH       ELSE UPDATE CHAIN PTR TO NEXT ENTRY
        !          13958:        JSR  SETVR            RESTORE VRGET FIELD
        !          13959:        MOV  XR,XL            COPY VRBLK POINTER (NAME BASE)
        !          13960:        MOV  *VRVAL,WA        SET OFFSET FOR VRBLK NAME
        !          13961:        JSR  PRTNV            PRINT NAME = VALUE
        !          13962:        BRN  DMP10            LOOP BACK TILL ALL PRINTED
        !          13963: *
        !          13964: *      PREPARE TO PRINT KEYWORDS
        !          13965: *
        !          13966: DMP11  JSR  PRTFH            PRINT BLANK LINE
        !          13967:        JSR  PRTFH            AND ANOTHER
        !          13968:        MOV  =DMHDK,XR        POINT TO KEYWORD HEADING
        !          13969:        JSR  PRTFB            PRINT HEADING
        !          13970:        MOV  =VDMKW,XL        POINT TO LIST OF KEYWORD SVBLK PTRS
        !          13971:        EJC
        !          13972: *
        !          13973: *      DUMPR (CONTINUED)
        !          13974: *
        !          13975: *      LOOP TO DUMP KEYWORD VALUES
        !          13976: *
        !          13977: DMP12  MOV  (XL)+,XR         LOAD NEXT SVBLK PTR FROM TABLE
        !          13978:        BZE  XR,DMP13         JUMP IF END OF LIST
        !          13979:        MOV  =CH$AM,WA        LOAD AMPERSAND
        !          13980:        JSR  PRTCH            PRINT AMPERSAND
        !          13981:        JSR  PRTST            PRINT KEYWORD NAME
        !          13982:        MOV  SVLEN(XR),WA     LOAD NAME LENGTH FROM SVBLK
        !          13983:        CTB  WA,SVCHS         GET LENGTH OF NAME
        !          13984:        ADD  WA,XR            POINT TO SVKNM FIELD
        !          13985:        MOV  (XR),DMPKN       STORE IN DUMMY KVBLK
        !          13986:        MOV  =TMBEB,XR        POINT TO BLANK-EQUAL-BLANK
        !          13987:        JSR  PRTST            PRINT IT
        !          13988:        MOV  XL,DMPSV         SAVE TABLE POINTER
        !          13989:        MOV  =DMPKB,XL        POINT TO DUMMY KVBLK
        !          13990:        MOV  *KVVAR,WA        SET ZERO OFFSET
        !          13991:        JSR  ACESS            GET KEYWORD VALUE
        !          13992:        PPM                   FAILURE IS IMPOSSIBLE
        !          13993:        JSR  PRTVF            PRINT KEYWORD VALUE
        !          13994:        MOV  DMPSV,XL         RESTORE TABLE POINTER
        !          13995:        BRN  DMP12            LOOP BACK TILL ALL PRINTED
        !          13996: *
        !          13997: *      HERE AFTER COMPLETING PARTIAL DUMP
        !          13998: *
        !          13999: DMP13  BEQ  DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE
        !          14000:        MOV  DNAMB,XR         ELSE POINT TO FIRST DYNAMIC BLOCK
        !          14001: *
        !          14002: *      LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
        !          14003: *
        !          14004: DMP14  BEQ  XR,DNAMP,DMP27   JUMP IF END OF USED REGION
        !          14005:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF BLOCK
        !          14006:        BEQ  WA,=B$VCT,DMP16  JUMP IF VECTOR
        !          14007:        BEQ  WA,=B$ART,DMP17  JUMP IF ARRAY
        !          14008:        BEQ  WA,=B$PDT,DMP18  JUMP IF PROGRAM DEFINED
        !          14009:        BEQ  WA,=B$TBT,DMP19  JUMP IF TABLE
        !          14010: .IF    .CNBF
        !          14011: .ELSE
        !          14012:        BEQ  WA,=B$BCT,DMP29  JUMP IF BUFFER
        !          14013: .FI
        !          14014: *
        !          14015: *      MERGE HERE TO MOVE TO NEXT BLOCK
        !          14016: *
        !          14017: DMP15  JSR  BLKLN            GET LENGTH OF BLOCK
        !          14018:        ADD  WA,XR            POINT PAST THIS BLOCK
        !          14019:        BRN  DMP14            LOOP BACK FOR NEXT BLOCK
        !          14020:        EJC
        !          14021: *
        !          14022: *      DUMPR (CONTINUED)
        !          14023: *
        !          14024: *      HERE FOR VECTOR
        !          14025: *
        !          14026: DMP16  MOV  *VCVLS,WB        SET OFFSET TO FIRST VALUE
        !          14027:        BRN  DMP19            JUMP TO MERGE
        !          14028: *
        !          14029: *      HERE FOR ARRAY
        !          14030: *
        !          14031: DMP17  MOV  AROFS(XR),WB     SET OFFSET TO ARPRO FIELD
        !          14032:        ICA  WB               BUMP TO GET OFFSET TO VALUES
        !          14033:        BRN  DMP19            JUMP TO MERGE
        !          14034: *
        !          14035: *      HERE FOR PROGRAM DEFINED
        !          14036: *
        !          14037: DMP18  MOV  *PDFLD,WB        POINT TO VALUES, MERGE
        !          14038: *
        !          14039: *      HERE FOR TABLE (OTHERS MERGE)
        !          14040: *
        !          14041: DMP19  BZE  IDVAL(XR),DMP15  IGNORE BLOCK IF ZERO ID VALUE
        !          14042:        JSR  BLKLN            ELSE GET BLOCK LENGTH
        !          14043:        MOV  XR,XL            COPY BLOCK POINTER
        !          14044:        MOV  WA,DMPSV         SAVE LENGTH
        !          14045:        MOV  WB,WA            COPY OFFSET TO FIRST VALUE
        !          14046:        JSR  PRTFH            PRINT BLANK LINE
        !          14047:        MOV  WA,DMPSA         PRESERVE OFFSET
        !          14048:        JSR  PRTVF            PRINT BLOCK VALUE (FOR TITLE)
        !          14049:        MOV  DMPSA,WA         RECOVER OFFSET
        !          14050:        BEQ  (XR),=B$TBT,DMP22 JUMP IF TABLE
        !          14051:        DCA  WA               POINT BEFORE FIRST WORD
        !          14052: *
        !          14053: *      LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
        !          14054: *
        !          14055: DMP20  MOV  XL,XR            COPY BLOCK POINTER
        !          14056:        ICA  WA               BUMP OFFSET
        !          14057:        ADD  WA,XR            POINT TO NEXT VALUE
        !          14058:        BEQ  WA,DMPSV,DMP14   EXIT IF END (XR PAST BLOCK)
        !          14059:        SUB  *VRVAL,XR        SUBTRACT OFFSET TO MERGE INTO LOOP
        !          14060: *
        !          14061: *      LOOP TO FIND VALUE AND IGNORE NULLS
        !          14062: *
        !          14063: DMP21  MOV  VRVAL(XR),XR     LOAD NEXT VALUE
        !          14064:        BEQ  XR,=NULLS,DMP20  LOOP BACK IF NULL VALUE
        !          14065:        BEQ  (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED
        !          14066:        JSR  PRTNV            ELSE PRINT NAME = VALUE
        !          14067:        BRN  DMP20            LOOP BACK FOR NEXT FIELD
        !          14068:        EJC
        !          14069: *
        !          14070: *      DUMPR (CONTINUED)
        !          14071: *
        !          14072: *      HERE TO DUMP A TABLE
        !          14073: *
        !          14074: DMP22  MOV  *TBBUK,WC        SET OFFSET TO FIRST BUCKET
        !          14075:        MOV  *TEVAL,WA        SET NAME OFFSET FOR ALL TEBLKS
        !          14076: *
        !          14077: *      LOOP THROUGH TABLE BUCKETS
        !          14078: *
        !          14079: DMP23  MOV  XL,-(XS)         SAVE TBBLK POINTER
        !          14080:        ADD  WC,XL            POINT TO NEXT BUCKET HEADER
        !          14081:        ICA  WC               BUMP BUCKET OFFSET
        !          14082:        SUB  *TENXT,XL        SUBTRACT OFFSET TO MERGE INTO LOOP
        !          14083: *
        !          14084: *      LOOP TO PROCESS TEBLKS ON ONE CHAIN
        !          14085: *
        !          14086: DMP24  MOV  TENXT(XL),XL     POINT TO NEXT TEBLK
        !          14087:        BEQ  XL,(XS),DMP26    JUMP IF END OF CHAIN
        !          14088:        MOV  XL,XR            ELSE COPY TEBLK POINTER
        !          14089: *
        !          14090: *      LOOP TO FIND VALUE AND IGNORE IF NULL
        !          14091: *
        !          14092: DMP25  MOV  TEVAL(XR),XR     LOAD NEXT VALUE
        !          14093:        BEQ  XR,=NULLS,DMP24  IGNORE IF NULL VALUE
        !          14094:        BEQ  (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED
        !          14095:        MOV  WC,DMPSV         ELSE SAVE OFFSET POINTER
        !          14096:        JSR  PRTNV            PRINT NAME = VALUE
        !          14097:        MOV  DMPSV,WC         RELOAD OFFSET
        !          14098:        BRN  DMP24            LOOP BACK FOR NEXT TEBLK
        !          14099: *
        !          14100: *      HERE TO MOVE TO NEXT HASH CHAIN
        !          14101: *
        !          14102: DMP26  MOV  (XS)+,XL         RESTORE TBBLK POINTER
        !          14103:        BNE  WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO
        !          14104:        MOV  XL,XR            ELSE COPY TABLE POINTER
        !          14105:        ADD  WC,XR            POINT TO FOLLOWING BLOCK
        !          14106:        BRN  DMP14            LOOP BACK TO PROCESS NEXT BLOCK
        !          14107: *
        !          14108: *      HERE AFTER COMPLETING DUMP
        !          14109: *
        !          14110: DMP27  JSR  PRTPG            EJECT PRINTER
        !          14111: *
        !          14112: *      MERGE HERE IF NO DUMP GIVEN (DMARG=0)
        !          14113: *
        !          14114: DMP28  EXI                   RETURN TO DUMP CALLER
        !          14115: .IF    .CNBF
        !          14116: .ELSE
        !          14117:        EJC
        !          14118: *
        !          14119: *      DUMPR (CONTINUED)
        !          14120: *
        !          14121: *      HERE TO DUMP BUFFER BLOCK
        !          14122: *
        !          14123: DMP29  JSR  PRTFH            PRINT BLANK LINE
        !          14124:        JSR  PRTVF            PRINT VALUE ID FOR TITLE
        !          14125:        MOV  =CH$DQ,WA        LOAD DOUBLE QUOTE
        !          14126:        JSR  PRTCH            PRINT IT
        !          14127:        MOV  BCLEN(XR),WC     LOAD DEFINED LENGTH
        !          14128:        BZE  WC,DMP32         SKIP CHARACTERS IF NONE
        !          14129:        LCT  WC,WC            LOAD COUNT FOR LOOP
        !          14130:        MOV  XR,WB            SAVE BCBLK PTR
        !          14131:        MOV  BCBUF(XR),XR     POINT TO BFBLK
        !          14132:        PLC  XR               GET SET TO LOAD CHARACTERS
        !          14133: *
        !          14134: *      LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
        !          14135: *
        !          14136: DMP31  LCH  WA,(XR)+         GET NEXT CHARACTER
        !          14137:        JSR  PRTCH            STUFF IT
        !          14138:        BCT  WC,DMP31         BRANCH FOR NEXT ONE
        !          14139:        MOV  WB,XR            RESTORE BCBLK POINTER
        !          14140: *
        !          14141: *      MERGE TO STUFF CLOSING QUOTE MARK
        !          14142: *
        !          14143: DMP32  MOV  =CH$DQ,WA        STUFF QUOTE
        !          14144:        JSR  PRTCF            PRINT IT
        !          14145:        MOV  (XR),WA          GET FIRST WD FOR BLKLN
        !          14146:        BRN  DMP15            MERGE TO GET NEXT BLOCK
        !          14147: .FI
        !          14148:        ENP                   END PROCEDURE DUMPR
        !          14149:        EJC
        !          14150: *
        !          14151: *      ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
        !          14152: *
        !          14153: *      KVERT                 ERROR CODE
        !          14154: *      JSR  ERMSG            CALL TO PRINT MESSAGE
        !          14155: *      (XR,XL,WA,WB,WC,IA)   DESTROYED
        !          14156: *
        !          14157: ERMSG  PRC  E,0              ENTRY POINT
        !          14158:        JSR  PRTFH            PRINT ERROR PTR OR BLANK LINE
        !          14159:        MOV  KVERT,WA         LOAD ERROR CODE
        !          14160:        MOV  =ERMMS,XR        POINT TO ERROR MESSAGE /ERROR/
        !          14161:        JSR  PRTST            PRINT IT
        !          14162:        JSR  ERTEX            GET ERROR MESSAGE TEXT
        !          14163:        ADD  =THSND,WA        BUMP ERROR CODE FOR PRINT
        !          14164:        MTI  WA               FAIL CODE IN INT ACC
        !          14165:        JSR  PRTIN            PRINT CODE (NOW HAVE ERROR1XXX)
        !          14166:        MOV  PRBUF,XL         POINT TO PRINT BUFFER
        !          14167:        PSC  XL,=NUM05        POINT TO THE 1
        !          14168:        MOV  =CH$BL,WA        LOAD A BLANK
        !          14169:        SCH  WA,(XL)          STORE BLANK OVER 1 (ERROR XXX)
        !          14170:        CSC  XL               COMPLETE STORE CHARACTERS
        !          14171:        ZER  XL               CLEAR GARBAGE POINTER IN XL
        !          14172:        MOV  XR,WA            KEEP ERROR TEXT
        !          14173:        MOV  =ERMNS,XR        POINT TO / -- /
        !          14174:        JSR  PRTST            PRINT IT
        !          14175:        MOV  WA,XR            GET ERROR TEXT AGAIN
        !          14176:        JSR  PRTFB            PRINT ERROR MESSAGE TEXT
        !          14177:        EXI                   RETURN TO ERMSG CALLER
        !          14178:        ENP                   END PROCEDURE ERMSG
        !          14179:        EJC
        !          14180: *
        !          14181: *      ERTEX -- GET ERROR MESSAGE TEXT
        !          14182: *
        !          14183: *      (WA)                  ERROR CODE
        !          14184: *      JSR  ERTEX            CALL TO GET ERROR TEXT
        !          14185: *      (XR)                  PTR TO ERROR TEXT IN DYNAMIC
        !          14186: *      (R$ETX)               COPY OF PTR TO ERROR TEXT
        !          14187: *      (XL,WC,IA)            DESTROYED
        !          14188: *
        !          14189: ERTEX  PRC  E,0              ENTRY POINT
        !          14190:        MOV  WA,ERTWA         SAVE WA
        !          14191:        MOV  WB,ERTWB         SAVE WB
        !          14192:        BNZ  EROSN,ERT03      SKIP IF SPECIAL EROSI RETURN
        !          14193:        JSR  SYSEM            GET FAILURE MESSAGE TEXT
        !          14194:        MOV  XR,XL            COPY POINTER TO IT
        !          14195:        MOV  SCLEN(XR),WA     GET LENGTH OF STRING
        !          14196:        BZE  WA,ERT02         JUMP IF NULL
        !          14197:        ZER  WB               OFFSET OF ZERO
        !          14198:        JSR  SBSTR            COPY INTO DYNAMIC STORE
        !          14199:        MOV  XR,R$ETX         STORE FOR RELOCATION
        !          14200: *
        !          14201: *      RETURN
        !          14202: *
        !          14203: ERT01  MOV  ERTWB,WB         RESTORE WB
        !          14204:        MOV  ERTWA,WA         RESTORE WA
        !          14205:        EXI                   RETURN TO CALLER
        !          14206: *
        !          14207: *      RETURN ERRTEXT CONTENTS INSTEAD OF NULL
        !          14208: *
        !          14209: ERT02  MOV  R$ETX,XR         GET ERRTEXT
        !          14210:        BRN  ERT01            RETURN
        !          14211: *
        !          14212: *      SPECIAL CASE SET UP BY EROSI RETURN TO AVOID SYSEM CALL
        !          14213: *
        !          14214: ERT03  ZER  EROSN            CLEAR FLAG
        !          14215:        MOV  R$ETX,XR         GET ERROR MESSAGE TEXT
        !          14216:        BRN  ERT01            RETURN WITHOUT MAKING SYSEM CALL
        !          14217:        ENP
        !          14218:        EJC
        !          14219: *
        !          14220: *      EVALI -- EVALUATE INTEGER ARGUMENT
        !          14221: *
        !          14222: *      EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
        !          14223: *      WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
        !          14224: *
        !          14225: *      (XR)                  NODE POINTER
        !          14226: *      (WB)                  CURSOR
        !          14227: *      JSR  EVALI            CALL TO EVALUATE INTEGER
        !          14228: *      PPM  LOC              TRANSFER LOC FOR NON-INTEGER ARG
        !          14229: *      PPM  LOC              TRANSFER LOC FOR OUT OF RANGE ARG
        !          14230: *      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
        !          14231: *      (XR)                  PTR TO NODE WITH INTEGER ARGUMENT
        !          14232: *      (WC,XL,RA)            DESTROYED
        !          14233: *
        !          14234: *      ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
        !          14235: *      IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
        !          14236: *      THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
        !          14237: *
        !          14238: EVALI  PRC  R,3              ENTRY POINT (RECURSIVE)
        !          14239:        JSR  EVALP            EVALUATE EXPRESSION
        !          14240:        PPM  EVLI1            JUMP ON FAILURE
        !          14241:        MOV  XL,-(XS)         STACK RESULT FOR GTSMI
        !          14242:        MOV  PTHEN(XR),XL     LOAD SUCCESSOR POINTER
        !          14243:        JSR  GTSMI            CONVERT ARG TO SMALL INTEGER
        !          14244:        PPM  EVLI2            JUMP IF NOT INTEGER
        !          14245:        PPM  EVLI3            JUMP IF OUT OF RANGE
        !          14246:        MOV  XR,EVLIV         STORE RESULT IN SPECIAL DUMMY NODE
        !          14247:        MOV  XL,EVLIS         STORE SUCCESSOR POINTER
        !          14248:        MOV  =EVLIN,XR        POINT TO DUMMY NODE WITH RESULT
        !          14249:        EXI                   SUCCESSFUL RETURN
        !          14250: *
        !          14251: *      HERE IF EVALUATION FAILS
        !          14252: *
        !          14253: EVLI1  EXI  3                TAKE FAILURE RETURN
        !          14254: *
        !          14255: *      HERE IF ARGUMENT IS NOT INTEGER
        !          14256: *
        !          14257: EVLI2  EXI  1                TAKE NON-INTEGER ERROR EXIT
        !          14258: *
        !          14259: *      HERE IF ARGUMENT IS OUT OF RANGE
        !          14260: *
        !          14261: EVLI3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
        !          14262:        ENP                   END PROCEDURE EVALI
        !          14263:        EJC
        !          14264: *
        !          14265: *      EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
        !          14266: *
        !          14267: *      EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
        !          14268: *      A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
        !          14269: *      VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
        !          14270: *
        !          14271: *      EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
        !          14272: *      AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
        !          14273: *
        !          14274: *      (XR)                  NODE POINTER
        !          14275: *      (WB)                  PATTERN MATCH CURSOR
        !          14276: *      JSR  EVALP            CALL TO EVALUATE EXPRESSION
        !          14277: *      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
        !          14278: *      (XL)                  RESULT
        !          14279: *      (WA)                  FIRST WORD OF RESULT BLOCK
        !          14280: *      (XR,WB)               DESTROYED (FAILURE CASE ONLY)
        !          14281: *      (WC,RA)               DESTROYED
        !          14282: *
        !          14283: *      THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
        !          14284: *
        !          14285: *      CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
        !          14286: *
        !          14287: EVALP  PRC  R,1              ENTRY POINT (RECURSIVE)
        !          14288:        MOV  PARM1(XR),XL     LOAD EXPRESSION POINTER
        !          14289:        BEQ  (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE
        !          14290: *
        !          14291: *      HERE FOR CASE OF SEBLK
        !          14292: *
        !          14293: *      WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
        !          14294: *      NOT AN EXPRESSION AND IS NOT TRAPPED.
        !          14295: *
        !          14296:        MOV  SEVAR(XL),XL     LOAD VRBLK POINTER
        !          14297:        MOV  VRVAL(XL),XL     LOAD VALUE OF VRBLK
        !          14298:        MOV  (XL),WA          LOAD FIRST WORD OF VALUE
        !          14299:        BHI  WA,=B$T$$,EVLP3  JUMP IF NOT SEBLK, TRBLK OR EXBLK
        !          14300: *
        !          14301: *      HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
        !          14302: *
        !          14303: EVLP1  MOV  XR,-(XS)         STACK NODE POINTER
        !          14304:        MOV  WB,-(XS)         STACK CURSOR
        !          14305:        MOV  R$PMS,-(XS)      STACK SUBJECT STRING POINTER
        !          14306:        MOV  PMSSL,-(XS)      STACK SUBJECT STRING LENGTH
        !          14307:        MOV  PMDFL,-(XS)      STACK DOT FLAG
        !          14308:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE POINTER
        !          14309:        MOV  PARM1(XR),XR     LOAD EXPRESSION POINTER
        !          14310:        EJC
        !          14311: *
        !          14312: *      EVALP (CONTINUED)
        !          14313: *
        !          14314: *      LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
        !          14315: *
        !          14316: EVLP2  ZER  WB               SET FLAG FOR BY VALUE
        !          14317:        JSR  EVALX            EVALUATE EXPRESSION
        !          14318:        PPM  EVLP4            JUMP ON FAILURE
        !          14319:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF VALUE
        !          14320:        BLO  WA,=B$E$$,EVLP2  LOOP BACK TO REEVALUATE EXPRESSION
        !          14321: *
        !          14322: *      HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
        !          14323: *
        !          14324:        MOV  XR,XL            COPY RESULT POINTER
        !          14325:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
        !          14326:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
        !          14327:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
        !          14328:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
        !          14329:        MOV  (XS)+,WB         RESTORE CURSOR
        !          14330:        MOV  (XS)+,XR         RESTORE NODE POINTER
        !          14331: *
        !          14332: *      COMMON EXIT POINT
        !          14333: *
        !          14334: EVLP3  EXI                   RETURN TO EVALP CALLER
        !          14335: *
        !          14336: *      HERE FOR FAILURE DURING EVALUATION
        !          14337: *
        !          14338: EVLP4  MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
        !          14339:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
        !          14340:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
        !          14341:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
        !          14342:        ADD  *NUM02,XS        REMOVE NODE PTR, CURSOR
        !          14343:        EXI  1                TAKE FAILURE EXIT
        !          14344:        ENP                   END PROCEDURE EVALP
        !          14345:        EJC
        !          14346: *
        !          14347: *      EVALS -- EVALUATE STRING ARGUMENT
        !          14348: *
        !          14349: *      EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
        !          14350: *      THEY ARE PASSED AN EXPRESSION ARGUMENT.
        !          14351: *
        !          14352: *      (XR)                  NODE POINTER
        !          14353: *      (WA)                  APPROPRIATE MULTI CHARACTER PCODE
        !          14354: *      (WB)                  CURSOR
        !          14355: *      JSR  EVALS            CALL TO EVALUATE STRING
        !          14356: *      PPM  LOC              TRANSFER LOC FOR NON-STRING ARG
        !          14357: *      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
        !          14358: *      (XL)                  PCODE OF NEW NODE (ENTRY WA)
        !          14359: *      (XR)                  PTR TO NODE WITH PARMS SET
        !          14360: *      (WA,WC,RA)            DESTROYED
        !          14361: *
        !          14362: *      ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
        !          14363: *      POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
        !          14364: *      SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
        !          14365: *      OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
        !          14366: *      THIS IS DONE BY THE USUAL INDIRECT BRANCH THROUGH THE
        !          14367: *      PCODE PASSED IN WA.
        !          14368: *
        !          14369: EVALS  PRC  R,2              ENTRY POINT (RECURSIVE)
        !          14370:        MOV  WA,-(XS)         KEEP PCODE
        !          14371:        JSR  EVALP            EVALUATE EXPRESSION
        !          14372:        PPM  EVLS1            JUMP IF EVALUATION FAILS
        !          14373:        MOV  (XS)+,WA         RECOVER PCODE
        !          14374:        MOV  PTHEN(XR),-(XS)  SAVE SUCCESSOR POINTER
        !          14375:        MOV  WB,-(XS)         SAVE CURSOR
        !          14376:        MOV  XL,-(XS)         STACK RESULT PTR FOR PATST
        !          14377:        ZER  WB               DUMMY PCODE FOR ONE CHAR STRING
        !          14378:        ZER  WC               DUMMY PCODE FOR EXPRESSION ARG
        !          14379:        MOV  WA,XL            APPROPRIATE PCODE FOR OUR USE
        !          14380:        JSR  PATST            CALL ROUTINE TO BUILD NODE
        !          14381:        PPM  EVLS2            JUMP IF NOT STRING
        !          14382:        MOV  (XS)+,WB         RESTORE CURSOR
        !          14383:        MOV  (XS)+,PTHEN(XR)  STORE SUCCESSOR POINTER
        !          14384:        MOV  (XR),XL          GET PCODE
        !          14385:        EXI                   TAKE SUCCESS RETURN
        !          14386: *
        !          14387: *      HERE IF EVALUATION FAILS
        !          14388: *
        !          14389: EVLS1  MOV  (XS)+,WA         POP STACK
        !          14390:        EXI  2                TAKE FAILURE RETURN
        !          14391: *
        !          14392: *      HERE IF ARGUMENT IS NOT STRING
        !          14393: *
        !          14394: EVLS2  ADD  *NUM02,XS        POP SUCCESSOR AND CURSOR
        !          14395:        EXI  1                TAKE NON-STRING ERROR EXIT
        !          14396:        ENP                   END PROCEDURE EVALS
        !          14397:        EJC
        !          14398: *
        !          14399: *      EVALX -- EVALUATE EXPRESSION
        !          14400: *
        !          14401: *      EVALX IS CALLED TO EVALUATE AN EXPRESSION
        !          14402: *
        !          14403: *      (XR)                  POINTER TO EXBLK OR SEBLK
        !          14404: *      (WB)                  0 IF BY VALUE, 1 IF BY NAME
        !          14405: *      JSR  EVALX            CALL TO EVALUATE EXPRESSION
        !          14406: *      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
        !          14407: *      (XR)                  RESULT IF CALLED BY VALUE
        !          14408: *      (XL,WA)               RESULT NAME BASE,OFFSET IF BY NAME
        !          14409: *      (XR)                  DESTROYED (NAME CASE ONLY)
        !          14410: *      (XL,WA)               DESTROYED (VALUE CASE ONLY)
        !          14411: *      (WB,WC,RA)            DESTROYED
        !          14412: *
        !          14413: EVALX  PRC  R,1              ENTRY POINT, RECURSIVE
        !          14414:        BEQ  (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE
        !          14415: *
        !          14416: *      HERE FOR SEBLK
        !          14417: *
        !          14418:        MOV  SEVAR(XR),XL     LOAD VRBLK POINTER (NAME BASE)
        !          14419:        MOV  *VRVAL,WA        SET NAME OFFSET
        !          14420:        BNZ  WB,EVLX1         JUMP IF CALLED BY NAME
        !          14421:        JSR  ACESS            CALL ROUTINE TO ACCESS VALUE
        !          14422:        PPM  EVLX9            JUMP IF FAILURE ON ACCESS
        !          14423: *
        !          14424: *      MERGE HERE TO EXIT FOR SEBLK CASE
        !          14425: *
        !          14426: EVLX1  EXI                   RETURN TO EVALX CALLER
        !          14427:        EJC
        !          14428: *
        !          14429: *      EVALX (CONTINUED)
        !          14430: *
        !          14431: *      HERE FOR FULL EXPRESSION (EXBLK) CASE
        !          14432: *
        !          14433: *      IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
        !          14434: *      TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
        !          14435: *      WITHOUT RETURNING TO THIS ROUTINE.
        !          14436: *      THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
        !          14437: *      GIVING CONTROL TO THE EXPRESSION CODE
        !          14438: *
        !          14439: *                            EVALX RETURN POINT
        !          14440: *                            SAVED VALUE OF R$COD
        !          14441: *                            CODE POINTER (-R$COD)
        !          14442: *                            SAVED VALUE OF FLPTR
        !          14443: *                            0 IF BY VALUE, 1 IF BY NAME
        !          14444: *      FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
        !          14445: *
        !          14446: EVLX2  SCP  WC               GET CODE POINTER
        !          14447:        MOV  R$COD,WA         LOAD CODE BLOCK POINTER
        !          14448:        SUB  WA,WC            GET CODE POINTER AS OFFSET
        !          14449:        MOV  WA,-(XS)         STACK OLD CODE BLOCK POINTER
        !          14450:        MOV  WC,-(XS)         STACK RELATIVE CODE OFFSET
        !          14451:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
        !          14452:        MOV  WB,-(XS)         STACK NAME/VALUE INDICATOR
        !          14453:        MOV  *EXFLC,-(XS)     STACK NEW FAIL OFFSET
        !          14454:        MOV  FLPTR,GTCEF      KEEP IN CASE OF ERROR
        !          14455:        MOV  R$COD,R$GTC      KEEP CODE BLOCK POINTER SIMILARLY
        !          14456:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
        !          14457:        MOV  XR,R$COD         SET NEW CODE BLOCK POINTER
        !          14458:        MOV  KVSTN,EXSTM(XR)  REMEMBER STMNT NUMBER
        !          14459:        ADD  *EXCOD,XR        POINT TO FIRST CODE WORD
        !          14460:        LCP  XR               SET CODE POINTER
        !          14461:        BNE  STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME
        !          14462:        MOV  =STGEE,STAGE     EVALUATING EXPRESSION
        !          14463:        BRN  EXITS            JUMP TO EXECUTE FIRST CODE WORD
        !          14464:        EJC
        !          14465: *
        !          14466: *      EVALX (CONTINUED)
        !          14467: *
        !          14468: *      COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
        !          14469: *
        !          14470: EVLXV  MOV  (XS)+,XR         LOAD VALUE
        !          14471:        BZE  1(XS),EVLX5      JUMP IF CALLED BY VALUE
        !          14472:        ERB  218,EXPRESSION EVALUATED BY NAME RETURNED VALUE
        !          14473: *
        !          14474: *      HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
        !          14475: *
        !          14476: EVLXN  MOV  (XS)+,WA         LOAD NAME OFFSET
        !          14477:        MOV  (XS)+,XL         LOAD NAME BASE
        !          14478:        BNZ  1(XS),EVLX5      JUMP IF CALLED BY NAME
        !          14479:        JSR  ACESS            ELSE ACCESS VALUE FIRST
        !          14480:        PPM  EVLXF            JUMP IF FAILURE DURING ACCESS
        !          14481: *
        !          14482: *      HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
        !          14483: *
        !          14484: EVLX5  ZER  WB               NOTE SUCCESSFUL
        !          14485:        BRN  EVLX7            MERGE
        !          14486: *
        !          14487: *      HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
        !          14488: *
        !          14489: EVLXF  MNZ  WB               NOTE UNSUCCESSFUL
        !          14490: *
        !          14491: *      RESTORE ENVIRONMENT
        !          14492: *
        !          14493: EVLX7  BNE  STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT
        !          14494:        MOV  =STGXT,STAGE     EXECUTE TIME
        !          14495: *
        !          14496: *      MERGE WITH STAGE SET UP
        !          14497: *
        !          14498: EVLX8  ADD  *NUM02,XS        POP NAME/VALUE INDICATOR, *EXFAL
        !          14499:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
        !          14500:        MOV  (XS)+,WC         LOAD CODE OFFSET
        !          14501:        ADD  (XS),WC          MAKE CODE POINTER ABSOLUTE
        !          14502:        MOV  (XS)+,R$COD      RESTORE OLD CODE BLOCK POINTER
        !          14503:        LCP  WC               RESTORE OLD CODE POINTER
        !          14504:        BZE  WB,EVLX1         JUMP FOR SUCCESSFUL RETURN
        !          14505: *
        !          14506: *      MERGE HERE FOR FAILURE IN SEBLK CASE
        !          14507: *
        !          14508: EVLX9  EXI  1                TAKE FAILURE EXIT
        !          14509:        ENP                   END OF PROCEDURE EVALX
        !          14510:        EJC
        !          14511: *
        !          14512: *      EXBLD -- BUILD EXBLK
        !          14513: *
        !          14514: *      EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
        !          14515: *      CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
        !          14516: *
        !          14517: *      (XL)                  OFFSET IN CCBLK TO START OF CODE
        !          14518: *      (WB)                  INTEGER IN RANGE 0 LE N LE MXLEN
        !          14519: *      JSR  EXBLD            CALL TO BUILD EXBLK
        !          14520: *      (XR)                  PTR TO CONSTRUCTED EXBLK
        !          14521: *      (WA,WB,XL)            DESTROYED
        !          14522: *
        !          14523: EXBLD  PRC  E,0              ENTRY POINT
        !          14524:        MOV  XL,WA            COPY OFFSET TO START OF CODE
        !          14525:        SUB  *EXCOD,WA        CALC REDUCTION IN OFFSET IN EXBLK
        !          14526:        MOV  WA,-(XS)         STACK FOR LATER
        !          14527:        MOV  CWCOF,WA         LOAD FINAL OFFSET
        !          14528:        SUB  XL,WA            COMPUTE LENGTH OF CODE
        !          14529:        ADD  *EXSI$,WA        ADD SPACE FOR STANDARD FIELDS
        !          14530:        JSR  ALLOC            ALLOCATE SPACE FOR EXBLK
        !          14531:        MOV  XR,-(XS)         SAVE POINTER TO EXBLK
        !          14532:        MOV  =B$EXL,EXTYP(XR) STORE TYPE WORD
        !          14533:        ZER  EXSTM(XR)        ZEROISE STMNT NUMBER FIELD
        !          14534:        MOV  WA,EXLEN(XR)     STORE LENGTH
        !          14535:        MOV  =OFEX$,EXFLC(XR) STORE FAILURE WORD
        !          14536:        ADD  *EXSI$,XR        SET XR FOR SYSMW
        !          14537:        MOV  XL,CWCOF         RESET OFFSET TO START OF CODE
        !          14538:        ADD  R$CCB,XL         POINT TO START OF CODE
        !          14539:        SUB  *EXSI$,WA        LENGTH OF CODE TO MOVE
        !          14540:        MOV  WA,-(XS)         STACK LENGTH OF CODE
        !          14541:        MVW                   MOVE CODE TO EXBLK
        !          14542:        MOV  (XS)+,WA         GET LENGTH OF CODE
        !          14543:        BTW  WA               CONVERT BAU COUNT TO WORD COUNT
        !          14544:        LCT  WA,WA            PREPARE COUNTER FOR LOOP
        !          14545:        MOV  (XS),XL          COPY EXBLK PTR, DONT UNSTACK
        !          14546:        ADD  *EXCOD,XL        POINT TO CODE ITSELF
        !          14547:        MOV  1(XS),WB         GET REDUCTION IN OFFSET
        !          14548: *
        !          14549: *      THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
        !          14550: *      THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
        !          14551: *      CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
        !          14552: *      EXBLK.
        !          14553: *
        !          14554: EXBL1  MOV  (XL)+,XR         GET NEXT CODE WORD
        !          14555:        BEQ  XR,=OSLA$,EXBL3  JUMP IF SELECTION FOUND
        !          14556:        BEQ  XR,=ONTA$,EXBL3  JUMP IF NEGATION FOUND
        !          14557:        BCT  WA,EXBL1         LOOP TO END OF CODE
        !          14558: *
        !          14559: *      NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
        !          14560: *
        !          14561: EXBL2  MOV  (XS)+,XR         POP EXBLK PTR INTO XR
        !          14562:        MOV  (XS)+,XL         POP REDUCTION CONSTANT
        !          14563:        EXI                   RETURN TO CALLER
        !          14564:        EJC
        !          14565: *
        !          14566: *      EXBLD (CONTINUED)
        !          14567: *
        !          14568: *      SELECTION OR NEGATION FOUND
        !          14569: *      REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
        !          14570: *      FOLLOWING CODE WORDS -
        !          14571: *           =ONTA$, =OSLA$, =OSLB$, =OSLC$
        !          14572: *
        !          14573: EXBL3  SUB  WB,(XL)+         ADJUST OFFSET
        !          14574:        BCT  WA,EXBL4         DECREMENT COUNT
        !          14575: *
        !          14576: EXBL4  BCT  WA,EXBL5         DECREMENT COUNT
        !          14577: *
        !          14578: *      CONTINUE SEARCH FOR MORE OFFSETS
        !          14579: *
        !          14580: EXBL5  MOV  (XL)+,XR         GET NEXT CODE WORD
        !          14581:        BEQ  XR,=OSLA$,EXBL3  JUMP IF OFFSET FOUND
        !          14582:        BEQ  XR,=OSLB$,EXBL3  JUMP IF OFFSET FOUND
        !          14583:        BEQ  XR,=OSLC$,EXBL3  JUMP IF OFFSET FOUND
        !          14584:        BEQ  XR,=ONTA$,EXBL3  JUMP IF OFFSET FOUND
        !          14585:        BCT  WA,EXBL5         LOOP
        !          14586:        BRN  EXBL2            MERGE TO RETURN
        !          14587:        ENP                   END PROCEDURE EXBLD
        !          14588:        EJC
        !          14589: *
        !          14590: *      EXPAN -- ANALYZE EXPRESSION
        !          14591: *
        !          14592: *      THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
        !          14593: *      AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
        !          14594: *      SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
        !          14595: *      SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
        !          14596: *
        !          14597: *      THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
        !          14598: *      OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
        !          14599: *      AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
        !          14600: *      ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
        !          14601: *      VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
        !          14602: *
        !          14603: *      0    SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
        !          14604: *      1    SCANNING OUTER LEVEL OF NORMAL GOTO
        !          14605: *      2    SCANNING OUTER LEVEL OF DIRECT GOTO
        !          14606: *      3    SCANNING INSIDE ARRAY BRACKETS
        !          14607: *      4    SCANNING INSIDE GROUPING PARENTHESES
        !          14608: *      5    SCANNING INSIDE FUNCTION PARENTHESES
        !          14609: *
        !          14610: *      THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
        !          14611: *      GROUPING AND RESTORED AT THE END OF THE GROUPING.
        !          14612: *
        !          14613: *      ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
        !          14614: *      ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
        !          14615: *      COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
        !          14616: *
        !          14617: *      THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
        !          14618: *      A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
        !          14619: *
        !          14620: *      WA=0                  NOTHING SCANNED AT THIS LEVEL
        !          14621: *      WA=1                  OPERAND EXPECTED
        !          14622: *      WA=2                  OPERATOR EXPECTED
        !          14623: *
        !          14624: *      (WB)                  CALL TYPE (SEE BELOW)
        !          14625: *      JSR  EXPAN            CALL TO ANALYZE EXPRESSION
        !          14626: *      (XR)                  POINTER TO RESULTING TREE
        !          14627: *      (XL,WA,WB,WC,RA)      DESTROYED
        !          14628: *
        !          14629: *      THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
        !          14630: *
        !          14631: *      0    SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
        !          14632: *           TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
        !          14633: *           TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
        !          14634: *           SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
        !          14635: *
        !          14636: *      1    SCANNING A NORMAL GOTO. THE ONLY VALID
        !          14637: *           TERMINATOR IS A RIGHT PAREN.
        !          14638: *
        !          14639: *      2    SCANNING A DIRECT GOTO. THE ONLY VALID
        !          14640: *           TERMINATOR IS A RIGHT BRACKET.
        !          14641:        EJC
        !          14642: *
        !          14643: *      EXPAN (CONTINUED)
        !          14644: *
        !          14645: *      ENTRY POINT
        !          14646: *
        !          14647: EXPAN  PRC  E,0              ENTRY POINT
        !          14648:        ZER  -(XS)            SET TOP OF STACK INDICATOR
        !          14649:        ZER  WA               SET INITIAL STATE TO ZERO
        !          14650:        ZER  WC               ZERO COUNTER VALUE
        !          14651: *
        !          14652: *      LOOP HERE FOR SUCCESSIVE ENTRIES
        !          14653: *
        !          14654: EXP01  JSR  SCANE            SCAN NEXT ELEMENT
        !          14655:        ADD  WA,XL            ADD STATE TO SYNTAX CODE
        !          14656:        BSW  XL,T$NES         SWITCH ON ELEMENT TYPE/STATE
        !          14657:        IFF  T$VA0,EXP03      VARIABLE, S=0
        !          14658:        IFF  T$VA1,EXP03      VARIABLE, STATE ONE
        !          14659:        IFF  T$VA2,EXP04      VARIABLE, S=2
        !          14660:        IFF  T$CO0,EXP03      CONSTANT, S=0
        !          14661:        IFF  T$CO1,EXP03      CONSTANT, S=1
        !          14662:        IFF  T$CO2,EXP04      CONSTANT, S=2
        !          14663:        IFF  T$LP0,EXP06      LEFT PAREN, S=0
        !          14664:        IFF  T$LP1,EXP06      LEFT PAREN, S=1
        !          14665:        IFF  T$LP2,EXP04      LEFT PAREN, S=2
        !          14666:        IFF  T$FN0,EXP10      FUNCTION, S=0
        !          14667:        IFF  T$FN1,EXP10      FUNCTION, S=1
        !          14668:        IFF  T$FN2,EXP04      FUNCTION, S=2
        !          14669:        IFF  T$RP0,EXP02      RIGHT PAREN, S=0
        !          14670:        IFF  T$RP1,EXP05      RIGHT PAREN, S=1
        !          14671:        IFF  T$RP2,EXP12      RIGHT PAREN, S=2
        !          14672:        IFF  T$LB0,EXP08      LEFT BRKT, S=0
        !          14673:        IFF  T$LB1,EXP08      LEFT BRKT, S=1
        !          14674:        IFF  T$LB2,EXP09      LEFT BRKT, S=2
        !          14675:        IFF  T$RB0,EXP02      RIGHT BRKT, S=0
        !          14676:        IFF  T$RB1,EXP05      RIGHT BRKT, S=1
        !          14677:        IFF  T$RB2,EXP18      RIGHT BRKT, S=2
        !          14678:        IFF  T$UO0,EXP27      UNOP, S=0
        !          14679:        IFF  T$UO1,EXP27      UNOP, S=1
        !          14680:        IFF  T$UO2,EXP04      UNOP, S=2
        !          14681:        IFF  T$BO0,EXP05      BINOP, S=0
        !          14682:        IFF  T$BO1,EXP05      BINOP, S=1
        !          14683:        IFF  T$BO2,EXP26      BINOP, S=2
        !          14684:        IFF  T$CM0,EXP02      COMMA, S=0
        !          14685:        IFF  T$CM1,EXP05      COMMA, S=1
        !          14686:        IFF  T$CM2,EXP11      COMMA, S=2
        !          14687:        IFF  T$CL0,EXP02      COLON, S=0
        !          14688:        IFF  T$CL1,EXP05      COLON, S=1
        !          14689:        IFF  T$CL2,EXP19      COLON, S=2
        !          14690:        IFF  T$SM0,EXP02      SEMICOLON, S=0
        !          14691:        IFF  T$SM1,EXP05      SEMICOLON, S=1
        !          14692:        IFF  T$SM2,EXP19      SEMICOLON, S=2
        !          14693:        ESW                   END SWITCH ON ELEMENT TYPE/STATE
        !          14694:        EJC
        !          14695: *
        !          14696: *      EXPAN (CONTINUED)
        !          14697: *
        !          14698: *      HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
        !          14699: *
        !          14700: *      SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
        !          14701: *      A NULL CONSTANT (CASE OF OMITTED NULL)
        !          14702: *
        !          14703: EXP02  MNZ  SCNRS            SET TO RESCAN ELEMENT
        !          14704:        MOV  =NULLS,XR        POINT TO NULL, MERGE
        !          14705: *
        !          14706: *      HERE FOR VAR OR CON IN STATES 0,1
        !          14707: *
        !          14708: *      STACK THE VARIABLE/CONSTANT AND SET STATE=2
        !          14709: *
        !          14710: EXP03  MOV  XR,-(XS)         STACK POINTER TO OPERAND
        !          14711:        MOV  =NUM02,WA        SET STATE 2
        !          14712:        BRN  EXP01            JUMP FOR NEXT ELEMENT
        !          14713: *
        !          14714: *      HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
        !          14715: *
        !          14716: *      WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
        !          14717: *      THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
        !          14718: *
        !          14719: EXP04  MNZ  SCNRS            SET TO RESCAN ELEMENT
        !          14720:        MOV  =OPDVC,XR        POINT TO CONCAT OPERATOR DV
        !          14721:        BZE  WB,EXP4A         OK IF AT TOP LEVEL
        !          14722:        MOV  =OPDVP,XR        ELSE POINT TO UNMISTAKEABLE CONCAT
        !          14723: *
        !          14724: *      MERGE WITH CORRECT CONCATENATION DVBLK IN XR
        !          14725: *
        !          14726: EXP4A  BNZ  SCNBL,EXP26      MERGE BOP IF BLANKS, ELSE ERROR
        !          14727:        DCV  SCNSE            ADJUST START OF ELEMENT LOCATION
        !          14728:        ERB  219,SYNTAX ERROR. MISSING OPERATOR
        !          14729: *
        !          14730: *      HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
        !          14731: *
        !          14732: *      THIS IS AN ERRONOUS CONTRUCTION
        !          14733: *
        !          14734: EXP05  DCV  SCNSE            ADJUST START OF ELEMENT LOCATION
        !          14735:        ERB  220,SYNTAX ERROR. MISSING OPERAND
        !          14736: *
        !          14737: *      HERE FOR LPR (S=0,1)
        !          14738: *
        !          14739: EXP06  MOV  =NUM04,XL        SET NEW LEVEL INDICATOR
        !          14740:        ZER  XR               SET ZERO VALUE FOR CMOPN
        !          14741:        EJC
        !          14742: *
        !          14743: *      EXPAN (CONTINUED)
        !          14744: *
        !          14745: *      MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
        !          14746: *
        !          14747: EXP07  MOV  XR,-(XS)         STACK CMOPN VALUE
        !          14748:        MOV  WC,-(XS)         STACK OLD COUNTER
        !          14749:        MOV  WB,-(XS)         STACK OLD LEVEL INDICATOR
        !          14750:        CHK                   CHECK FOR STACK OVERFLOW
        !          14751:        ZER  WA               SET NEW STATE TO ZERO
        !          14752:        MOV  XL,WB            SET NEW LEVEL INDICATOR
        !          14753:        MOV  =NUM01,WC        INITIALIZE NEW COUNTER
        !          14754:        BRN  EXP01            JUMP TO SCAN NEXT ELEMENT
        !          14755: *
        !          14756: *      HERE FOR LBR (S=0,1)
        !          14757: *
        !          14758: *      THIS IS AN ILLEGAL USE OF LEFT BRACKET
        !          14759: *
        !          14760: EXP08  ERB  221,SYNTAX ERROR. INVALID USE OF LEFT BRACKET
        !          14761: *
        !          14762: *      HERE FOR LBR (S=2)
        !          14763: *
        !          14764: *      SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
        !          14765: *
        !          14766: EXP09  MOV  (XS)+,XR         LOAD ARRAY PTR FOR CMOPN
        !          14767:        MOV  =NUM03,XL        SET NEW LEVEL INDICATOR
        !          14768:        BRN  EXP07            JUMP TO STACK OLD AND START NEW
        !          14769: *
        !          14770: *      HERE FOR FNC (S=0,1)
        !          14771: *
        !          14772: *      STACK OLD LEVEL AND START TO SCAN ARGUMENTS
        !          14773: *
        !          14774: EXP10  MOV  =NUM05,XL        SET NEW LEV INDIC (XR=VRBLK=CMOPN)
        !          14775:        BRN  EXP07            JUMP TO STACK OLD AND START NEW
        !          14776: *
        !          14777: *      HERE FOR CMA (S=2)
        !          14778: *
        !          14779: *      INCREMENT ARGUMENT COUNT AND CONTINUE
        !          14780: *
        !          14781: EXP11  ICV  WC               INCREMENT COUNTER
        !          14782:        JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
        !          14783:        ZER  -(XS)            SET NEW LEVEL FOR PARAMETER
        !          14784:        ZER  WA               SET NEW STATE
        !          14785:        BGT  WB,=NUM02,EXP01  LOOP BACK UNLESS OUTER LEVEL
        !          14786:        ERB  222,SYNTAX ERROR. INVALID USE OF COMMA
        !          14787:        EJC
        !          14788: *
        !          14789: *      EXPAN (CONTINUED)
        !          14790: *
        !          14791: *      HERE FOR RPR (S=2)
        !          14792: *
        !          14793: *      AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
        !          14794: *      OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
        !          14795: *
        !          14796: EXP12  BEQ  WB,=NUM01,EXP20  END OF NORMAL GOTO
        !          14797:        BEQ  WB,=NUM05,EXP13  END OF FUNCTION ARGUMENTS
        !          14798:        BEQ  WB,=NUM04,EXP14  END OF GROUPING / SELECTION
        !          14799:        ERB  223,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS
        !          14800: *
        !          14801: *      HERE AT END OF FUNCTION ARGUMENTS
        !          14802: *
        !          14803: EXP13  MOV  =C$FNC,XL        SET CMTYP VALUE FOR FUNCTION
        !          14804:        BRN  EXP15            JUMP TO BUILD CMBLK
        !          14805: *
        !          14806: *      HERE FOR END OF GROUPING
        !          14807: *
        !          14808: EXP14  BEQ  WC,=NUM01,EXP17  JUMP IF END OF GROUPING
        !          14809:        MOV  =C$SEL,XL        ELSE SET CMTYP FOR SELECTION
        !          14810: *
        !          14811: *      MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
        !          14812: *      TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
        !          14813: *
        !          14814: EXP15  JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
        !          14815:        MOV  WC,WA            COPY COUNT
        !          14816:        ADD  =CMVLS,WA        ADD FOR STANDARD FIELDS AT START
        !          14817:        WTB  WA               CONVERT LENGTH TO BAUS
        !          14818:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
        !          14819:        MOV  =B$CMT,(XR)      STORE TYPE CODE FOR CMBLK
        !          14820:        MOV  XL,CMTYP(XR)     STORE CMBLK NODE TYPE INDICATOR
        !          14821:        MOV  WA,CMLEN(XR)     STORE LENGTH
        !          14822:        ADD  WA,XR            POINT PAST END OF BLOCK
        !          14823:        LCT  WC,WC            SET LOOP COUNTER
        !          14824: *
        !          14825: *      LOOP TO MOVE REMAINING WORDS TO CMBLK
        !          14826: *
        !          14827: EXP16  MOV  (XS)+,-(XR)      MOVE ONE OPERAND PTR FROM STACK
        !          14828:        MOV  (XS)+,WB         POP TO OLD LEVEL INDICATOR
        !          14829:        BCT  WC,EXP16         LOOP TILL ALL MOVED
        !          14830:        EJC
        !          14831: *
        !          14832: *      EXPAN (CONTINUED)
        !          14833: *
        !          14834: *      COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
        !          14835: *
        !          14836:        SUB  *CMVLS,XR        POINT BACK TO START OF BLOCK
        !          14837:        MOV  (XS)+,WC         RESTORE OLD COUNTER
        !          14838:        MOV  (XS),CMOPN(XR)   STORE OPERAND PTR IN CMBLK
        !          14839:        MOV  XR,(XS)          STACK CMBLK POINTER
        !          14840:        MOV  =NUM02,WA        SET NEW STATE
        !          14841:        BRN  EXP01            BACK FOR NEXT ELEMENT
        !          14842: *
        !          14843: *      HERE AT END OF A PARENTHESIZED EXPRESSION
        !          14844: *
        !          14845: EXP17  JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
        !          14846:        MOV  (XS)+,XR         RESTORE XR
        !          14847:        MOV  (XS)+,WB         RESTORE OUTER LEVEL
        !          14848:        MOV  (XS)+,WC         RESTORE OUTER COUNT
        !          14849:        MOV  XR,(XS)          STORE OPND OVER UNUSED CMOPN VAL
        !          14850:        MOV  =NUM02,WA        SET NEW STATE
        !          14851:        BRN  EXP01            BACK FOR NEXT ELE8ENT
        !          14852: *
        !          14853: *      HERE FOR RBR (S=2)
        !          14854: *
        !          14855: *      AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
        !          14856: *      OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
        !          14857: *
        !          14858: EXP18  MOV  =C$ARR,XL        SET CMTYP FOR ARRAY REFERENCE
        !          14859:        BEQ  WB,=NUM03,EXP15  JUMP TO BUILD CMBLK IF END ARRAYREF
        !          14860:        BEQ  WB,=NUM02,EXP20  JUMP IF END OF DIRECT GOTO
        !          14861:        ERB  224,SYNTAX ERROR. UNBALANCED RIGHT BRACKET
        !          14862:        EJC
        !          14863: *
        !          14864: *      EXPAN (CONTINUED)
        !          14865: *
        !          14866: *      HERE FOR COL,SMC (S=2)
        !          14867: *
        !          14868: *      ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
        !          14869: *
        !          14870: EXP19  MNZ  SCNRS            RESCAN TERMINATOR
        !          14871:        MOV  WB,XL            COPY LEVEL INDICATOR
        !          14872:        BSW  XL,6             SWITCH ON LEVEL INDICATOR
        !          14873:        IFF  0,EXP20          NORMAL OUTER LEVEL
        !          14874:        IFF  1,EXP22          FAIL IF NORMAL GOTO
        !          14875:        IFF  2,EXP23          FAIL IF DIRECT GOTO
        !          14876:        IFF  3,EXP24          FAIL ARRAY BRACKETS
        !          14877:        IFF  4,EXP21          FAIL IF IN GROUPING
        !          14878:        IFF  5,EXP21          FAIL FUNCTION ARGS
        !          14879:        ESW                   END SWITCH ON LEVEL
        !          14880: *
        !          14881: *      HERE AT NORMAL END OF EXPRESSION
        !          14882: *
        !          14883: EXP20  JSR  EXPDM            DUMP REMAINING OPERATORS
        !          14884:        MOV  (XS)+,XR         LOAD TREE POINTER
        !          14885:        ICA  XS               POP OFF BOTTOM OF STACK MARKER
        !          14886:        EXI                   RETURN TO EXPAN CALLER
        !          14887: *
        !          14888: *      MISSING RIGHT PAREN
        !          14889: *
        !          14890: EXP21  ERB  225,SYNTAX ERROR. MISSING RIGHT PAREN
        !          14891: *
        !          14892: *      MISSING RIGHT PAREN IN GOTO FIELD
        !          14893: *
        !          14894: EXP22  ERB  226,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO
        !          14895: *
        !          14896: *      MISSING BRACKET IN GOTO
        !          14897: *
        !          14898: EXP23  ERB  227,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO
        !          14899: *
        !          14900: *      MISSING ARRAY BRACKET
        !          14901: *
        !          14902: EXP24  ERB  228,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET
        !          14903:        EJC
        !          14904: *
        !          14905: *      EXPAN (CONTINUED)
        !          14906: *
        !          14907: *      LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
        !          14908: *
        !          14909: EXP25  MOV  XR,EXPSV
        !          14910:        JSR  EXPOP            POP ONE OPERATOR
        !          14911:        MOV  EXPSV,XR         RESTORE OP DV POINTER AND MERGE
        !          14912: *
        !          14913: *      HERE FOR BOP (S=2)
        !          14914: *
        !          14915: *      REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
        !          14916: *      LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
        !          14917: *      LOOP HERE TILL THIS CONDITION IS MET.
        !          14918: *
        !          14919: EXP26  MOV  1(XS),XL         LOAD OPERATOR DVPTR FROM STACK
        !          14920:        BLE  XL,=NUM05,EXP27  JUMP IF BOTTOM OF STACK LEVEL
        !          14921:        BLT  DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO
        !          14922: *
        !          14923: *      HERE FOR UOP (S=0,1)
        !          14924: *
        !          14925: *      BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
        !          14926: *
        !          14927: *      THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
        !          14928: *      CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
        !          14929: *
        !          14930: EXP27  MOV  XR,-(XS)         STACK OPERATOR DVPTR ON STACK
        !          14931:        CHK                   CHECK FOR STACK OVERFLOW
        !          14932:        MOV  =NUM01,WA        SET NEW STATE
        !          14933:        BNE  XR,=OPDVS,EXP01  BACK FOR NEXT ELEMENT UNLESS =
        !          14934: *
        !          14935: *      HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
        !          14936: *      NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
        !          14937: *      OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
        !          14938: *      ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
        !          14939: *
        !          14940:        ZER  WA               SET STATE ZERO
        !          14941:        BRN  EXP01            JUMP FOR NEXT ELEMENT
        !          14942:        ENP                   END PROCEDURE EXPAN
        !          14943:        EJC
        !          14944: *
        !          14945: *      EXPAP -- TEST FOR PATTERN MATCH TREE
        !          14946: *
        !          14947: *      EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
        !          14948: *      IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
        !          14949: *      MATCHES IN THE CONTEXT OF THIS CALL.
        !          14950: *
        !          14951: *      1)   AN EXPLICIT USE OF BINARY QUESTION MARK
        !          14952: *      2)   A CONCATENATION
        !          14953: *      3)   AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
        !          14954: *
        !          14955: *      (XR)                  PTR TO EXPAN TREE
        !          14956: *      JSR  EXPAP            CALL TO TEST FOR PATTERN MATCH
        !          14957: *      PPM  LOC              TRANSFER LOC IF NOT A PATTERN MATCH
        !          14958: *      (WA)                  DESTROYED
        !          14959: *      (XR)                  UNCHANGED (IF NOT MATCH)
        !          14960: *      (XR)                  PTR TO BINARY OPERATOR BLK IF MATCH
        !          14961: *
        !          14962: EXPAP  PRC  E,1              ENTRY POINT
        !          14963:        MOV  XL,-(XS)         SAVE XL
        !          14964:        BNE  (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX
        !          14965:        MOV  CMTYP(XR),WA     ELSE LOAD TYPE CODE
        !          14966:        BEQ  WA,=C$CNC,EXPP1  CONCATENATION IS A MATCH
        !          14967:        BEQ  WA,=C$PMT,EXPP1  BINARY QUESTION MARK IS A MATCH
        !          14968:        BNE  WA,=C$ALT,EXPP2  ELSE NOT MATCH UNLESS ALTERNATION
        !          14969: *
        !          14970: *      HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
        !          14971: *
        !          14972:        MOV  CMLOP(XR),XL     LOAD LEFT OPERAND POINTER
        !          14973:        BNE  (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX
        !          14974:        BNE  CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC
        !          14975:        MOV  CMROP(XL),CMLOP(XR) XR POINTS TO (B / C)
        !          14976:        MOV  XR,CMROP(XL)     SET XL OPNDS TO A, (B / C)
        !          14977:        MOV  XL,XR            POINT TO THIS ALTERED NODE
        !          14978: *
        !          14979: *      EXIT HERE FOR PATTERN MATCH
        !          14980: *
        !          14981: EXPP1  MOV  (XS)+,XL         RESTORE ENTRY XL
        !          14982:        EXI                   GIVE PATTERN MATCH RETURN
        !          14983: *
        !          14984: *      EXIT HERE IF NOT PATTERN MATCH
        !          14985: *
        !          14986: EXPP2  MOV  (XS)+,XL         RESTORE ENTRY XL
        !          14987:        EXI  1                GIVE NON-MATCH RETURN
        !          14988:        ENP                   END PROCEDURE EXPAP
        !          14989:        EJC
        !          14990: *
        !          14991: *      EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
        !          14992: *
        !          14993: *      EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
        !          14994: *      LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
        !          14995: *      VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
        !          14996: *
        !          14997: *      JSR  EXPDM            CALL TO DUMP OPERATORS
        !          14998: *      (XS)                  POPPED AS REQUIRED
        !          14999: *      (XR,WA)               DESTROYED
        !          15000: *
        !          15001: EXPDM  PRC  N,0              ENTRY POINT
        !          15002:        MOV  XL,R$EXS         SAVE XL VALUE
        !          15003: *
        !          15004: *      LOOP TO DUMP OPERATORS
        !          15005: *
        !          15006: EXDM1  BLE  1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL)
        !          15007:        JSR  EXPOP            ELSE POP ONE OPERATOR
        !          15008:        BRN  EXDM1            AND LOOP BACK
        !          15009: *
        !          15010: *      HERE AFTER POPPING ALL OPERATORS
        !          15011: *
        !          15012: EXDM2  MOV  R$EXS,XL         RESTORE XL
        !          15013:        ZER  R$EXS            RELEASE SAVE LOCATION
        !          15014:        EXI                   RETURN TO EXPDM CALLER
        !          15015:        ENP                   END PROCEDURE EXPDM
        !          15016:        EJC
        !          15017: *
        !          15018: *      EXPOP-- POP OPERATOR (FOR EXPAN)
        !          15019: *
        !          15020: *      EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
        !          15021: *      OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
        !          15022: *      CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
        !          15023: *      POINTER TO THIS CMBLK IS STACKED.
        !          15024: *
        !          15025: *      EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
        !          15026: *
        !          15027: *      JSR  EXPOP            CALL TO POP OPERATOR
        !          15028: *      (XS)                  POPPED APPROPRIATELY
        !          15029: *      (XR,XL,WA)            DESTROYED
        !          15030: *
        !          15031: EXPOP  PRC  N,0              ENTRY POINT
        !          15032:        MOV  1(XS),XR         LOAD OPERATOR DV POINTER
        !          15033:        BEQ  DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY
        !          15034: *
        !          15035: *      HERE FOR BINARY OPERATOR
        !          15036: *
        !          15037:        MOV  *CMBS$,WA        SET SIZE OF BINARY OPERATOR CMBLK
        !          15038:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
        !          15039:        MOV  (XS)+,CMROP(XR)  POP AND STORE RIGHT OPERAND PTR
        !          15040:        MOV  (XS)+,XL         POP AND LOAD OPERATOR DV PTR
        !          15041:        MOV  (XS),CMLOP(XR)   STORE LEFT OPERAND POINTER
        !          15042: *
        !          15043: *      COMMON EXIT POINT
        !          15044: *
        !          15045: EXPO1  MOV  =B$CMT,(XR)      STORE TYPE CODE FOR CMBLK
        !          15046:        MOV  DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE
        !          15047:        MOV  XL,CMOPN(XR)     STORE DVPTR (=PTR TO DAC O$XXX)
        !          15048:        MOV  WA,CMLEN(XR)     STORE CMBLK LENGTH
        !          15049:        MOV  XR,(XS)          STORE RESULTING NODE PTR ON STACK
        !          15050:        EXI                   RETURN TO EXPOP CALLER
        !          15051: *
        !          15052: *      HERE FOR UNARY OPERATOR
        !          15053: *
        !          15054: EXPO2  MOV  *CMUS$,WA        SET SIZE OF UNARY OPERATOR CMBLK
        !          15055:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
        !          15056:        MOV  (XS)+,CMROP(XR)  POP AND STORE OPERAND POINTER
        !          15057:        MOV  (XS),XL          LOAD OPERATOR DV POINTER
        !          15058:        BRN  EXPO1            MERGE BACK TO EXIT
        !          15059:        ENP                   END PROCEDURE EXPOP
        !          15060:        EJC
        !          15061: *
        !          15062: *      GBCOL -- PERFORM GARBAGE COLLECTION
        !          15063: *
        !          15064: *      GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
        !          15065: *      ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
        !          15066: *      BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
        !          15067: *      DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
        !          15068: *
        !          15069: *      (WB)                  MOVE OFFSET (SEE BELOW)
        !          15070: *      JSR  GBCOL            CALL TO COLLECT GARBAGE
        !          15071: *      (XR)                  DESTROYED
        !          15072: *
        !          15073: *      THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
        !          15074: *      GBCOL IS CALLED.
        !          15075: *
        !          15076: *      1)   ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
        !          15077: *           ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
        !          15078: *           THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
        !          15079: *
        !          15080: *           A)               MAIN STACK, WITH CURRENT TOP
        !          15081: *                            ELEMENT BEING INDICATED BY XS
        !          15082: *
        !          15083: *           B)               IN RELOCATABLE FIELDS OF VRBLKS.
        !          15084: *
        !          15085: *           C)               IN REGISTER XL AT THE TIME OF CALL
        !          15086: *
        !          15087: *           E)               IN THE SPECIAL REGION OF WORKING
        !          15088: *                            STORAGE WHERE NAMES BEGIN WITH R$.
        !          15089: *
        !          15090: *      2)   ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
        !          15091: *           THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
        !          15092: *           POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
        !          15093: *
        !          15094: *      3)   NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
        !          15095: *           INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
        !          15096: *           FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
        !          15097: *           POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
        !          15098: *           NOT BE CHANGED BY THE GARBAGE COLLECTOR.
        !          15099: *           IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
        !          15100: *           DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
        !          15101: *           CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
        !          15102: *
        !          15103: *      GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
        !          15104: *      RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
        !          15105: *      THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
        !          15106: *      ENTRY VALUE OF WB IS THE NUMBER OF BAUS TO MOVE UP.
        !          15107: *      THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
        !          15108: *      FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
        !          15109: *      LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
        !          15110:        EJC
        !          15111: *
        !          15112: *      GBCOL (CONTINUED)
        !          15113: *
        !          15114: *      THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
        !          15115: *      GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
        !          15116: *      TAKES THREE PASSES AS FOLLOWS.
        !          15117: *
        !          15118: *      1)   ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
        !          15119: *           DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
        !          15120: *           IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
        !          15121: *           THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
        !          15122: *           A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
        !          15123: *           ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
        !          15124: *
        !          15125: *           THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
        !          15126: *           CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
        !          15127: *           CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
        !          15128: *           TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
        !          15129: *           COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
        !          15130: *           OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
        !          15131: *           THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
        !          15132: *           OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
        !          15133: *           THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
        !          15134: *           INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
        !          15135: *           REFERENCES FOR THE RELOCATION PHASE.
        !          15136: *
        !          15137: *      2)   STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
        !          15138: *           BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
        !          15139: *           PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
        !          15140: *           ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
        !          15141: *           IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
        !          15142: *           IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
        !          15143: *           BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
        !          15144: *           AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
        !          15145: *           CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
        !          15146: *           THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
        !          15147: *           ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
        !          15148: *           THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
        !          15149: *           THE CHAIN IS RESTORED AT THIS POINT.
        !          15150: *
        !          15151: *           DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
        !          15152: *           DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
        !          15153: *           MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
        !          15154: *           EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
        !          15155: *           IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
        !          15156: *           CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
        !          15157: *           OF WORDS TO BE MOVED.
        !          15158: *
        !          15159: *      3)   IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
        !          15160: *           BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
        !          15161: *           THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
        !          15162: *           THE COLLECTION IS THEN COMPLETE AND THE NEXT
        !          15163: *           AVAILABLE LOCATION POINTER IS RESET.
        !          15164:        EJC
        !          15165: *
        !          15166: *      GBCOL (CONTINUED)
        !          15167: *
        !          15168: GBCOL  PRC  E,0              ENTRY POINT
        !          15169:        BNZ  DMVCH,GBC14      FAIL IF IN MID-DUMP
        !          15170:        MNZ  GBCFL            NOTE GBCOL ENTERED
        !          15171:        MOV  WA,GBSVA         SAVE ENTRY WA
        !          15172:        MOV  WB,GBSVB         SAVE ENTRY WB
        !          15173:        MOV  WC,GBSVC         SAVE ENTRY WC
        !          15174:        MOV  XL,-(XS)         SAVE ENTRY XL
        !          15175:        SCP  WA               GET CODE POINTER VALUE
        !          15176:        SUB  R$COD,WA         MAKE RELATIVE
        !          15177:        LCP  WA               AND RESTORE
        !          15178: *
        !          15179: *      PROCESS STACK ENTRIES
        !          15180: *
        !          15181:        MOV  XS,XR            POINT TO STACK FRONT
        !          15182:        MOV  STBAS,XL         POINT PAST END OF STACK
        !          15183:        BGE  XL,XR,GBC00      OK IF D-STACK
        !          15184:        MOV  XL,XR            REVERSE IF ...
        !          15185:        MOV  XS,XL            ... U-STACK
        !          15186: *
        !          15187: *      PROCESS THE STACK
        !          15188: *
        !          15189: GBC00  JSR  GBCPF            PROCESS POINTERS ON STACK
        !          15190: *
        !          15191: *      PROCESS SPECIAL WORK LOCATIONS
        !          15192: *
        !          15193:        MOV  =R$AAA,XR        POINT TO START OF RELOCATABLE LOCS
        !          15194:        MOV  =R$YYY,XL        POINT PAST END OF RELOCATABLE LOCS
        !          15195:        JSR  GBCPF            PROCESS WORK FIELDS
        !          15196: *
        !          15197: *      PREPARE TO PROCESS VARIABLE BLOCKS
        !          15198: *
        !          15199:        MOV  HSHTB,WA         POINT TO FIRST HASH SLOT POINTER
        !          15200: *
        !          15201: *      LOOP THROUGH HASH SLOTS
        !          15202: *
        !          15203: GBC01  MOV  WA,XL            POINT TO NEXT SLOT
        !          15204:        ICA  WA               BUMP BUCKET POINTER
        !          15205:        MOV  WA,GBCNM         SAVE BUCKET POINTER
        !          15206:        EJC
        !          15207: *
        !          15208: *      GBCOL (CONTINUED)
        !          15209: *
        !          15210: *      LOOP THROUGH VARIABLES ON ONE HASH CHAIN
        !          15211: *
        !          15212: GBC02  MOV  (XL),XR          LOAD PTR TO NEXT VRBLK
        !          15213:        BZE  XR,GBC03         JUMP IF END OF CHAIN
        !          15214:        MOV  XR,XL            ELSE COPY VRBLK POINTER
        !          15215:        ADD  *VRVAL,XR        POINT TO FIRST RELOC FLD
        !          15216:        ADD  *VRNXT,XL        POINT PAST LAST (AND TO LINK PTR)
        !          15217:        JSR  GBCPF            PROCESS RELOC FIELDS IN VRBLK
        !          15218:        BRN  GBC02            LOOP BACK FOR NEXT BLOCK
        !          15219: *
        !          15220: *      HERE AT END OF ONE HASH CHAIN
        !          15221: *
        !          15222: GBC03  MOV  GBCNM,WA         RESTORE BUCKET POINTER
        !          15223:        BNE  WA,HSHTE,GBC01   LOOP BACK IF MORE BUCKETS TO GO
        !          15224:        EJC
        !          15225: *
        !          15226: *      GBCOL (CONTINUED)
        !          15227: *
        !          15228: *      NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
        !          15229: *      AS FOLLOWS IN PASS TWO.
        !          15230: *
        !          15231: *      (XR)                  SCANS THROUGH ALL BLOCKS
        !          15232: *      (WC)                  POINTER TO EVENTUAL LOCATION
        !          15233: *
        !          15234: *      THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
        !          15235: *      THE FOLLOWING FORMAT.
        !          15236: *
        !          15237: *      WORD 1                POINTER TO NEXT MOVE BLOCK,
        !          15238: *                            ZERO IF END OF CHAIN OF BLOCKS
        !          15239: *
        !          15240: *      WORD 2                LENGTH OF BLOCKS TO BE MOVED IN
        !          15241: *                            BAUS. SET TO THE ADDRESS OF THE
        !          15242: *                            FIRST BAU WHILE ACTUALLY SCANNING
        !          15243: *                            THE BLOCKS.
        !          15244: *
        !          15245: *      THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
        !          15246: *      CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
        !          15247: *      BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
        !          15248: *      THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
        !          15249: *      BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
        !          15250: *      BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
        !          15251: *
        !          15252: GBC04  MOV  DNAMB,XR         POINT TO FIRST BLOCK
        !          15253:        MOV  XR,WC            SET AS FIRST EVENTUAL LOCATION
        !          15254:        ADD  GBSVB,WC         ADD OFFSET FOR EVENTUAL MOVE UP
        !          15255:        ZER  GBCNM            CLEAR INITIAL FORWARD POINTER
        !          15256:        MOV  =GBCNM,GBCLM     INITIALIZE PTR TO LAST MOVE BLOCK
        !          15257:        MOV  XR,GBCNS         INITIALIZE FIRST ADDRESS
        !          15258: *
        !          15259: *      LOOP THROUGH A SERIES OF BLOCKS IN USE
        !          15260: *
        !          15261: GBC05  BEQ  XR,DNAMP,GBC07   JUMP IF END OF USED REGION
        !          15262:        MOV  (XR),WA          ELSE GET FIRST WORD
        !          15263: .IF    .CEPP
        !          15264:        BOD  WA,GBC07         JUMP IF ENTRY POINTER (UNUSED)
        !          15265: .ELSE
        !          15266:        BHI  WA,=P$YYY,GBC06  SKIP IF NOT ENTRY PTR (IN USE)
        !          15267:        BHI  WA,=B$AAA,GBC07  JUMP IF ENTRY POINTER (UNUSED)
        !          15268: .FI
        !          15269: *
        !          15270: *      HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
        !          15271: *
        !          15272: GBC06  MOV  WA,XL            COPY POINTER
        !          15273:        MOV  (XL),WA          LOAD FORWARD POINTER
        !          15274:        MOV  WC,(XL)          RELOCATE REFERENCE
        !          15275: .IF    .CEPP
        !          15276:        BEV  WA,GBC06         LOOP BACK IF NOT END OF CHAIN
        !          15277: .ELSE
        !          15278:        BHI  WA,=P$YYY,GBC06  LOOP BACK IF NOT END OF CHAIN
        !          15279:        BLO  WA,=B$AAA,GBC06  LOOP BACK IF NOT END OF CHAIN
        !          15280: .FI
        !          15281:        EJC
        !          15282: *
        !          15283: *      GBCOL (CONTINUED)
        !          15284: *
        !          15285: *      AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
        !          15286: *
        !          15287:        MOV  WA,(XR)          RESTORE FIRST WORD
        !          15288:        JSR  BLKLN            GET LENGTH OF THIS BLOCK
        !          15289:        ADD  WA,XR            BUMP ACTUAL POINTER
        !          15290:        ADD  WA,WC            BUMP EVENTUAL POINTER
        !          15291:        BRN  GBC05            LOOP BACK FOR NEXT BLOCK
        !          15292: *
        !          15293: *      HERE AT END OF A SERIES OF BLOCKS IN USE
        !          15294: *
        !          15295: GBC07  MOV  XR,WA            COPY POINTER PAST LAST BLOCK
        !          15296:        MOV  GBCLM,XL         POINT TO PREVIOUS MOVE BLOCK
        !          15297:        SUB  1(XL),WA         SUBTRACT STARTING ADDRESS
        !          15298:        MOV  WA,1(XL)         STORE LENGTH OF BLOCK TO BE MOVED
        !          15299: *
        !          15300: *      LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
        !          15301: *
        !          15302: GBC08  BEQ  XR,DNAMP,GBC10   JUMP IF END OF USED REGION
        !          15303:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF NEXT BLOCK
        !          15304: .IF    .CEPP
        !          15305:        BEV  WA,GBC09         JUMP IF IN USE
        !          15306: .ELSE
        !          15307:        BHI  WA,=P$YYY,GBC09  JUMP IF IN USE
        !          15308:        BLO  WA,=B$AAA,GBC09  JUMP IF IN USE
        !          15309: .FI
        !          15310:        JSR  BLKLN            ELSE GET LENGTH OF NEXT BLOCK
        !          15311:        ADD  WA,XR            PUSH POINTER
        !          15312:        BRN  GBC08            AND LOOP BACK
        !          15313: *
        !          15314: *      HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
        !          15315: *      BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
        !          15316: *
        !          15317: GBC09  SUB  *NUM02,XR        POINT 2 WORDS BEHIND FOR MOVE BLOCK
        !          15318:        MOV  GBCLM,XL         POINT TO PREVIOUS MOVE BLOCK
        !          15319:        MOV  XR,(XL)          SET FORWARD PTR IN PREVIOUS BLOCK
        !          15320:        ZER  (XR)             ZERO FORWARD PTR OF NEW BLOCK
        !          15321:        MOV  XR,GBCLM         REMEMBER ADDRESS OF THIS BLOCK
        !          15322:        MOV  XR,XL            COPY PTR TO MOVE BLOCK
        !          15323:        ADD  *NUM02,XR        POINT BACK TO BLOCK IN USE
        !          15324:        MOV  XR,1(XL)         STORE STARTING ADDRESS
        !          15325:        BRN  GBC06            JUMP TO PROCESS BLOCK IN USE
        !          15326:        EJC
        !          15327: *
        !          15328: *      GBCOL (CONTINUED)
        !          15329: *
        !          15330: *      HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
        !          15331: *
        !          15332: *      (XL)                  POINTER TO OLD LOCATION
        !          15333: *      (XR)                  POINTER TO NEW LOCATION
        !          15334: *
        !          15335: GBC10  MOV  DNAMB,XR         POINT TO START OF STORAGE
        !          15336:        ADD  GBCNS,XR         BUMP PAST UNMOVED BLOCKS AT START
        !          15337: *
        !          15338: *      LOOP THROUGH MOVE DESCRIPTORS
        !          15339: *
        !          15340: GBC11  MOV  GBCNM,XL         POINT TO NEXT MOVE BLOCK
        !          15341:        BZE  XL,GBC12         JUMP IF END OF CHAIN
        !          15342:        MOV  (XL)+,GBCNM      MOVE POINTER DOWN CHAIN
        !          15343:        MOV  (XL)+,WA         GET LENGTH TO MOVE
        !          15344:        MVW                   PERFORM MOVE
        !          15345:        BRN  GBC11            LOOP BACK
        !          15346: *
        !          15347: *      NOW TEST FOR MOVE UP
        !          15348: *
        !          15349: GBC12  MOV  XR,DNAMP         SET NEXT AVAILABLE LOC PTR
        !          15350:        MOV  GBSVB,WB         RELOAD MOVE OFFSET
        !          15351:        BZE  WB,GBC13         JUMP IF NO MOVE REQUIRED
        !          15352:        MOV  XR,XL            ELSE COPY OLD TOP OF CORE
        !          15353:        ADD  WB,XR            POINT TO NEW TOP OF CORE
        !          15354:        MOV  XR,DNAMP         SAVE NEW TOP OF CORE POINTER
        !          15355:        MOV  XL,WA            COPY OLD TOP
        !          15356:        SUB  DNAMB,WA         MINUS OLD BOTTOM = LENGTH
        !          15357:        ADD  WB,DNAMB         BUMP BOTTOM TO GET NEW VALUE
        !          15358:        MWB                   PERFORM MOVE (BACKWARDS)
        !          15359: *
        !          15360: *      MERGE HERE TO EXIT
        !          15361: *
        !          15362: GBC13  MOV  GBSVA,WA         RESTORE WA
        !          15363:        SCP  WC               GET CODE POINTER
        !          15364:        ADD  R$COD,WC         MAKE ABSOLUTE AGAIN
        !          15365:        LCP  WC               AND REPLACE ABSOLUTE VALUE
        !          15366:        MOV  GBSVC,WC         RESTORE WC
        !          15367:        MOV  (XS)+,XL         RESTORE ENTRY XL
        !          15368:        ICV  GBCNT            INCREMENT COUNT OF COLLECTIONS
        !          15369:        ZER  XR               CLEAR GARBAGE VALUE IN XR
        !          15370:        ZER  GBCFL            NOTE EXIT FROM GBCOL
        !          15371:        EXI                   EXIT TO GBCOL CALLER
        !          15372: *
        !          15373: *      GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
        !          15374: *
        !          15375: GBC14  ICV  ERRFT            FATAL ERROR
        !          15376:        ERB  229,INSUFFICIENT MEMORY TO COMPLETE DUMP
        !          15377:        ENP                   END PROCEDURE GBCOL
        !          15378:        EJC
        !          15379: *
        !          15380: *      GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
        !          15381: *
        !          15382: *      THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
        !          15383: *      PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
        !          15384: *
        !          15385: *      (XR)                  PTR TO FIRST LOCATION TO PROCESS
        !          15386: *      (XL)                  PTR PAST LAST LOCATION TO PROCESS
        !          15387: *      JSR  GBCPF            CALL TO PROCESS FIELDS
        !          15388: *      (XR,WA,WB,WC,IA)      DESTROYED
        !          15389: *
        !          15390: *      NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
        !          15391: *      APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
        !          15392: *
        !          15393: GBCPF  PRC  E,0              ENTRY POINT
        !          15394:        ZER  -(XS)            SET ZERO TO MARK BOTTOM OF STACK
        !          15395:        MOV  XL,-(XS)         SAVE END POINTER
        !          15396: *
        !          15397: *      MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
        !          15398: *
        !          15399: *      1(XS)                 NEXT LVL FIELD PTR (0 AT OUTER LVL)
        !          15400: *      0(XS)                 PTR PAST LAST FIELD TO PROCESS
        !          15401: *      (XR)                  PTR TO FIRST FIELD TO PROCESS
        !          15402: *
        !          15403: *      LOOP TO PROCESS SUCCESSIVE FIELDS
        !          15404: *
        !          15405: GPF01  MOV  (XR),XL          LOAD FIELD CONTENTS
        !          15406:        MOV  XR,WC            SAVE FIELD POINTER
        !          15407: .IF    .CRPP
        !          15408:        BOD  XL,GPF02         JUMP IF NOT PTR INTO DYNAMIC AREA
        !          15409: .ELSE
        !          15410: .FI
        !          15411:        BLT  XL,DNAMB,GPF02   JUMP IF NOT PTR INTO DYNAMIC AREA
        !          15412:        BGE  XL,DNAMP,GPF02   JUMP IF NOT PTR INTO DYNAMIC AREA
        !          15413: *
        !          15414: *      HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
        !          15415: *      LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
        !          15416: *
        !          15417:        MOV  (XL),WA          LOAD PTR TO CHAIN (OR ENTRY PTR)
        !          15418:        MOV  XR,(XL)          SET THIS FIELD AS NEW HEAD OF CHAIN
        !          15419:        MOV  WA,(XR)          SET FORWARD POINTER
        !          15420: *
        !          15421: *      NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
        !          15422: *
        !          15423: .IF    .CEPP
        !          15424:        BOD  WA,GPF03         JUMP IF NOT ALREADY PROCESSED
        !          15425: .ELSE
        !          15426:        BHI  WA,=P$YYY,GPF02  JUMP IF ALREADY PROCESSED
        !          15427:        BHI  WA,=B$AAA,GPF03  JUMP IF NOT ALREADY PROCESSED
        !          15428: .FI
        !          15429: *
        !          15430: *      HERE TO MOVE TO NEXT FIELD
        !          15431: *
        !          15432: GPF02  MOV  WC,XR            RESTORE FIELD POINTER
        !          15433:        ICA  XR               BUMP TO NEXT FIELD
        !          15434:        BNE  XR,(XS),GPF01    LOOP BACK IF MORE TO GO
        !          15435:        EJC
        !          15436: *
        !          15437: *      GBCPF (CONTINUED)
        !          15438: *
        !          15439: *      HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
        !          15440: *
        !          15441:        MOV  (XS)+,XL         RESTORE POINTER PAST END
        !          15442:        MOV  (XS)+,WC         RESTORE BLOCK POINTER
        !          15443:        BNZ  WC,GPF02         CONTINUE LOOP UNLESS OUTER LEVL
        !          15444:        EXI                   RETURN TO CALLER IF OUTER LEVEL
        !          15445: *
        !          15446: *      HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
        !          15447: *
        !          15448: GPF03  MOV  XL,XR            COPY BLOCK POINTER
        !          15449:        MOV  WA,XL            COPY FIRST WORD OF BLOCK
        !          15450:        LEI  XL               LOAD ENTRY POINT ID (BL$XX)
        !          15451: *
        !          15452: *      BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
        !          15453: *      FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
        !          15454: *
        !          15455:        BSW  XL,BL$$$         SWITCH ON BLOCK TYPE
        !          15456:        IFF  BL$AR,GPF06      ARBLK
        !          15457: .IF    .CNBF
        !          15458: .ELSE
        !          15459:        IFF  BL$BC,GPF18      BCBLK
        !          15460:        IFF  BL$BF,GPF02      BFBLK
        !          15461: .FI
        !          15462:        IFF  BL$CC,GPF07      CCBLK
        !          15463:        IFF  BL$CD,GPF08      CDBLK
        !          15464:        IFF  BL$CM,GPF04      CMBLK
        !          15465:        IFF  BL$CO,GPF19      COBLK
        !          15466:        IFF  BL$DF,GPF02      DFBLK
        !          15467:        IFF  BL$EV,GPF10      EVBLK
        !          15468:        IFF  BL$EX,GPF17      EXBLK
        !          15469:        IFF  BL$FF,GPF11      FFBLK
        !          15470:        IFF  BL$NM,GPF10      NMBLK
        !          15471:        IFF  BL$P0,GPF10      P0BLK
        !          15472:        IFF  BL$P1,GPF12      P1BLK
        !          15473:        IFF  BL$P2,GPF12      P2BLK
        !          15474:        IFF  BL$PD,GPF13      PDBLK
        !          15475:        IFF  BL$PF,GPF14      PFBLK
        !          15476:        IFF  BL$TB,GPF08      TBBLK
        !          15477:        IFF  BL$TE,GPF15      TEBLK
        !          15478:        IFF  BL$TR,GPF16      TRBLK
        !          15479:        IFF  BL$VC,GPF08      VCBLK
        !          15480:        IFF  BL$XR,GPF09      XRBLK
        !          15481:        IFF  BL$CT,GPF02      CTBLK
        !          15482:        IFF  BL$EF,GPF02      EFBLK
        !          15483:        IFF  BL$IC,GPF02      ICBLK
        !          15484:        IFF  BL$KV,GPF02      KVBLK
        !          15485: .IF    .CNRA
        !          15486: .ELSE
        !          15487:        IFF  BL$RC,GPF02      RCBLK
        !          15488: .FI
        !          15489:        IFF  BL$SC,GPF02      SCBLK
        !          15490:        IFF  BL$SE,GPF02      SEBLK
        !          15491:        IFF  BL$XN,GPF02      XNBLK
        !          15492:        ESW                   END OF JUMP TABLE
        !          15493:        EJC
        !          15494: *
        !          15495: *      GBCPF (CONTINUED)
        !          15496: *
        !          15497: *      CMBLK
        !          15498: *
        !          15499: GPF04  MOV  CMLEN(XR),WA     LOAD LENGTH
        !          15500:        MOV  *CMTYP,WB        SET OFFSET
        !          15501: *
        !          15502: *      HERE TO PUSH DOWN TO NEW LEVEL
        !          15503: *
        !          15504: *      (WC)                  FIELD PTR AT PREVIOUS LEVEL
        !          15505: *      (XR)                  PTR TO NEW BLOCK
        !          15506: *      (WA)                  LENGTH (RELOC FLDS + FLDS AT START)
        !          15507: *      (WB)                  OFFSET TO FIRST RELOC FIELD
        !          15508: *
        !          15509: GPF05  ADD  XR,WA            POINT PAST LAST RELOC FIELD
        !          15510:        ADD  WB,XR            POINT TO FIRST RELOC FIELD
        !          15511:        MOV  WC,-(XS)         STACK OLD FIELD POINTER
        !          15512:        MOV  WA,-(XS)         STACK NEW LIMIT POINTER
        !          15513:        CHK                   CHECK FOR STACK OVERFLOW
        !          15514:        BRN  GPF01            IF OK, BACK TO PROCESS
        !          15515: *
        !          15516: *      ARBLK
        !          15517: *
        !          15518: GPF06  MOV  ARLEN(XR),WA     LOAD LENGTH
        !          15519:        MOV  AROFS(XR),WB     SET OFFSET TO 1ST RELOC FLD (ARPRO)
        !          15520:        BRN  GPF05            ALL SET
        !          15521: *
        !          15522: *      CCBLK
        !          15523: *
        !          15524: GPF07  MOV  CCUSE(XR),WA     SET LENGTH IN USE
        !          15525:        MOV  *CCUSE,WB        1ST WORD (MAKE SURE AT LEAST ONE)
        !          15526:        BRN  GPF05            ALL SET
        !          15527:        EJC
        !          15528: *
        !          15529: *      GBCPF (CONTINUED)
        !          15530: *
        !          15531: *      CDBLK, TBBLK, VCBLK
        !          15532: *
        !          15533: GPF08  MOV  OFFS2(XR),WA     LOAD LENGTH
        !          15534:        MOV  *OFFS3,WB        SET OFFSET
        !          15535:        BRN  GPF05            JUMP BACK
        !          15536: *
        !          15537: *      XRBLK
        !          15538: *
        !          15539: GPF09  MOV  XRLEN(XR),WA     LOAD LENGTH
        !          15540:        MOV  *XRPTR,WB        SET OFFSET
        !          15541:        BRN  GPF05            JUMP BACK
        !          15542: *
        !          15543: *      EVBLK, NMBLK, P0BLK
        !          15544: *
        !          15545: GPF10  MOV  *OFFS2,WA        POINT PAST SECOND FIELD
        !          15546:        MOV  *OFFS1,WB        OFFSET IS ONE (ONLY RELOC FLD IS 2)
        !          15547:        BRN  GPF05            ALL SET
        !          15548: *
        !          15549: *      FFBLK
        !          15550: *
        !          15551: GPF11  MOV  *FFOFS,WA        SET LENGTH
        !          15552:        MOV  *FFNXT,WB        SET OFFSET
        !          15553:        BRN  GPF05            ALL SET
        !          15554: *
        !          15555: *      P1BLK, P2BLK
        !          15556: *
        !          15557: GPF12  MOV  *PARM2,WA        LENGTH (PARM2 IS NON-RELOCATABLE)
        !          15558:        MOV  *PTHEN,WB        SET OFFSET
        !          15559:        BRN  GPF05            ALL SET
        !          15560:        EJC
        !          15561: *
        !          15562: *      GBCPF (CONTINUED)
        !          15563: *
        !          15564: *      PDBLK
        !          15565: *
        !          15566: GPF13  MOV  PDDFP(XR),XL     LOAD PTR TO DFBLK
        !          15567:        MOV  DFPDL(XL),WA     GET PDBLK LENGTH
        !          15568:        MOV  *PDFLD,WB        SET OFFSET
        !          15569:        BRN  GPF05            ALL SET
        !          15570: *
        !          15571: *      PFBLK
        !          15572: *
        !          15573: GPF14  MOV  *PFARG,WA        LENGTH PAST LAST RELOC
        !          15574:        MOV  *PFCOD,WB        OFFSET TO FIRST RELOC
        !          15575:        BRN  GPF05            ALL SET
        !          15576: *
        !          15577: *      TEBLK
        !          15578: *
        !          15579: GPF15  MOV  *TESI$,WA        SET LENGTH
        !          15580:        MOV  *TESUB,WB        AND OFFSET
        !          15581:        BRN  GPF05            ALL SET
        !          15582: *
        !          15583: *      TRBLK
        !          15584: *
        !          15585: GPF16  MOV  *TRSI$,WA        SET LENGTH
        !          15586:        MOV  *TRVAL,WB        AND OFFSET
        !          15587:        BRN  GPF05            ALL SET
        !          15588: *
        !          15589: *      EXBLK
        !          15590: *
        !          15591: GPF17  MOV  EXLEN(XR),WA     LOAD LENGTH
        !          15592:        MOV  *EXFLC,WB        SET OFFSET
        !          15593:        BRN  GPF05            JUMP BACK
        !          15594: .IF    .CNBF
        !          15595: .ELSE
        !          15596: *
        !          15597: *      BCBLK
        !          15598: *
        !          15599: GPF18  MOV  *BCSI$,WA        SET LENGTH
        !          15600:        MOV  *BCBUF,WB        AND OFFSET
        !          15601:        BRN  GPF05            ALL SET
        !          15602: .FI
        !          15603: *
        !          15604: *      COBLK
        !          15605: *
        !          15606: GPF19  MOV  *COSI$,WA        SET LENGTH
        !          15607:        MOV  *CONXT,WB        AND OFFSET
        !          15608:        BRN  GPF05            ALL SET
        !          15609:        ENP                   END PROCEDURE GBCPF
        !          15610: .IF    .CNBF
        !          15611: .ELSE
        !          15612:        EJC
        !          15613: *
        !          15614: *      GTBUF -- GET BUFFER
        !          15615: *
        !          15616: *      GTBUF IS PASSED AN OBJECT AND RETURNS A BUFFER IF
        !          15617: *      POSSIBLE.  UNLESS THE OBJECT IS ALREADY A BUFFER,
        !          15618: *      THIS INVOLVES A CONVERSION TO STRING AND THEN
        !          15619: *      STRING TO BUFFER.
        !          15620: *
        !          15621: *      (XR)                  OBJECT TO BE CONVERTED
        !          15622: *      JSR  GTBUF            CALL TO GET BUFFER
        !          15623: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
        !          15624: *      (XR)                  RESULTING BUFFER
        !          15625: *      (XL,WA,WB,WC)         DESTROYED
        !          15626: *
        !          15627: GTBUF  PRC  E,1              ENTRY POINT
        !          15628:        BEQ  (XR),=B$BCT,GTB01 EXIT IF ALREADY BUFFER
        !          15629:        MOV  XR,-(XS)         STACK TO CONVERT TO STRING
        !          15630:        JSR  GTSTG            CONVERT TO STRING
        !          15631:        PPM  GTB02            CONVERSION ERROR
        !          15632:        MOV  XR,XL            SAVE STRING POINTER
        !          15633:        JSR  ALOBF            ALLOCATE BUFFER OF SAME SIZE
        !          15634:        JSR  INSBF            COPY IN THE STRING
        !          15635:        PPM                   ALREADY STRING - CANT FAIL TO CNV
        !          15636:        PPM                   MUST BE ENOUGH ROOM
        !          15637: *
        !          15638: *      MERGE TO EXIT WITH BUFFER CONTROL BLK IN (XR)
        !          15639: *
        !          15640: GTB01  EXI                   RETURN TO CALLER
        !          15641: *
        !          15642: *      HERE ON CONVERSION FAILURE
        !          15643: *
        !          15644: GTB02  EXI  1                TAKE FAILURE EXIT
        !          15645:        ENP
        !          15646: .FI
        !          15647:        EJC
        !          15648: *
        !          15649: *      GTARR -- GET ARRAY
        !          15650: *
        !          15651: *      GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBLE
        !          15652: *
        !          15653: *      (XR)                  VALUE TO BE CONVERTED
        !          15654: *      JSR  GTARR            CALL TO GET ARRAY
        !          15655: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
        !          15656: *      (XR)                  RESULTING ARRAY
        !          15657: *      (XL,WA,WB,WC)         DESTROYED
        !          15658: *
        !          15659: GTARR  PRC  E,1              ENTRY POINT
        !          15660:        MOV  (XR),WA          LOAD TYPE WORD
        !          15661:        BEQ  WA,=B$ART,GTAR8  EXIT IF ALREADY AN ARRAY
        !          15662:        BEQ  WA,=B$VCT,GTAR8  EXIT IF ALREADY AN ARRAY
        !          15663:        MOV  XR,-(XS)         PLACE POSSIBLE TBBLK PTR ON STACK
        !          15664:        BNE  WA,=B$TBT,GTAR9  ELSE FAIL IF NOT A TABLE
        !          15665: *
        !          15666: *      HERE WE CONVERT A TABLE TO AN ARRAY
        !          15667: *
        !          15668:        ZER  XR               SIGNAL FIRST PASS
        !          15669:        ZER  WB               ZERO NON-NULL ELEMENT COUNT
        !          15670: *
        !          15671: *      THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
        !          15672: *      SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
        !          15673: *      THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
        !          15674: *      XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
        !          15675: *      ENTERED INTO THE CURRENT ARBLK LOCATION.
        !          15676: *
        !          15677: GTAR1  MOV  (XS),XL          POINT TO TABLE
        !          15678:        ADD  TBLEN(XL),XL     POINT PAST LAST BUCKET
        !          15679:        SUB  *TBBUK,XL        SET FIRST BUCKET OFFSET
        !          15680:        MOV  XL,WA            COPY ADJUSTED POINTER
        !          15681: *
        !          15682: *      LOOP THROUGH BUCKETS IN TABLE BLOCK
        !          15683: *      NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
        !          15684: *      1 LESS THAN TBBUK.
        !          15685: *
        !          15686: GTAR2  MOV  WA,XL            COPY BUCKET POINTER
        !          15687:        DCA  WA               DECREMENT BUCKET POINTER
        !          15688: *
        !          15689: *      LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
        !          15690: *
        !          15691: GTAR3  MOV  TENXT(XL),XL     POINT TO NEXT TEBLK
        !          15692:        BEQ  XL,(XS),GTAR6    JUMP IF CHAIN END (TBBLK PTR)
        !          15693:        MOV  XL,CNVTP         ELSE SAVE TEBLK POINTER
        !          15694: *
        !          15695: *      LOOP TO FIND VALUE DOWN TRBLK CHAIN
        !          15696: *
        !          15697: GTAR4  MOV  TEVAL(XL),XL     LOAD VALUE
        !          15698:        BEQ  (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND
        !          15699:        MOV  XL,WC            COPY VALUE
        !          15700:        MOV  CNVTP,XL         RESTORE TEBLK POINTER
        !          15701:        EJC
        !          15702: *
        !          15703: *      GTARR (CONTINUED)
        !          15704: *
        !          15705: *      NOW CHECK FOR NULL AND TEST CASES
        !          15706: *
        !          15707:        BEQ  WC,=NULLS,GTAR3  LOOP BACK TO IGNORE NULL VALUE
        !          15708:        BNZ  XR,GTAR5         JUMP IF SECOND PASS
        !          15709:        ICV  WB               FOR THE FIRST PASS, BUMP COUNT
        !          15710:        BRN  GTAR3            AND LOOP BACK FOR NEXT TEBLK
        !          15711: *
        !          15712: *      HERE IN SECOND PASS
        !          15713: *
        !          15714: GTAR5  MOV  TESUB(XL),(XR)+  STORE SUBSCRIPT NAME
        !          15715:        MOV  WC,(XR)+         STORE VALUE IN ARBLK
        !          15716:        BRN  GTAR3            LOOP BACK FOR NEXT TEBLK
        !          15717: *
        !          15718: *      HERE AFTER SCANNING TEBLKS ON ONE CHAIN
        !          15719: *
        !          15720: GTAR6  BNE  WA,(XS),GTAR2    LOOP BACK IF MORE BUCKETS TO GO
        !          15721:        BNZ  XR,GTAR7         ELSE JUMP IF SECOND PASS
        !          15722: *
        !          15723: *      HERE AFTER COUNTING NON-NULL ELEMENTS
        !          15724: *
        !          15725:        BZE  WB,GTAR9         FAIL IF NO NON-NULL ELEMENTS
        !          15726:        MOV  WB,WA            ELSE COPY COUNT
        !          15727:        ADD  WB,WA            DOUBLE (TWO WORDS/ELEMENT)
        !          15728:        ADD  =ARVL2,WA        ADD SPACE FOR STANDARD FIELDS
        !          15729:        WTB  WA               CONVERT LENGTH TO BAUS
        !          15730:        BGE  WA,MXLEN,GTAR9   FAIL IF TOO LONG FOR ARRAY
        !          15731:        JSR  ALLOC            ELSE ALLOCATE SPACE FOR ARBLK
        !          15732:        MOV  =B$ART,(XR)      STORE TYPE WORD
        !          15733:        ZER  IDVAL(XR)        ZERO ID FOR THE MOMENT
        !          15734:        MOV  WA,ARLEN(XR)     STORE LENGTH
        !          15735:        MOV  =NUM02,ARNDM(XR) SET DIMENSIONS = 2
        !          15736:        LDI  INTV1            GET INTEGER ONE
        !          15737:        STI  ARLBD(XR)        STORE AS LBD 1
        !          15738:        STI  ARLB2(XR)        STORE AS LBD 2
        !          15739:        LDI  INTV2            LOAD INTEGER TWO
        !          15740:        STI  ARDM2(XR)        STORE AS DIM 2
        !          15741:        MTI  WB               GET ELEMENT COUNT AS INTEGER
        !          15742:        STI  ARDIM(XR)        STORE AS DIM 1
        !          15743:        ZER  ARPR2(XR)        ZERO PROTOTYPE FIELD FOR NOW
        !          15744:        MOV  *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2)
        !          15745:        MOV  XR,WB            SAVE ARBLK POINTER
        !          15746:        ADD  *ARVL2,XR        POINT TO FIRST ELEMENT LOCATION
        !          15747:        BRN  GTAR1            JUMP BACK TO FILL IN ELEMENTS
        !          15748:        EJC
        !          15749: *
        !          15750: *      GTARR (CONTINUED)
        !          15751: *
        !          15752: *      HERE AFTER FILLING IN ELEMENT VALUES
        !          15753: *
        !          15754: GTAR7  MOV  WB,XR            RESTORE ARBLK POINTER
        !          15755:        MOV  WB,(XS)          STORE AS RESULT
        !          15756: *
        !          15757: *      NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
        !          15758: *      THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
        !          15759: *      CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
        !          15760: *
        !          15761:        LDI  ARDIM(XR)        GET NUMBER OF ELEMENTS (NN)
        !          15762:        MLI  INTVH            MULTIPLY BY 100
        !          15763:        ADI  INTV2            ADD 2 (NN02)
        !          15764:        JSR  ICBLD            BUILD INTEGER
        !          15765:        MOV  XR,-(XS)         STORE PTR FOR GTSTG
        !          15766:        JSR  GTSTG            CONVERT TO STRING
        !          15767:        PPM                   CONVERT FAIL IS IMPOSSIBLE
        !          15768:        MOV  XR,XL            COPY STRING POINTER
        !          15769:        MOV  (XS)+,XR         RELOAD ARBLK POINTER
        !          15770:        MOV  XL,ARPR2(XR)     STORE PROTOTYPE PTR (NN02)
        !          15771:        SUB  =NUM02,WA        ADJUST LENGTH TO POINT TO ZERO
        !          15772:        PSC  XL,WA            POINT TO ZERO
        !          15773:        MOV  =CH$CM,WB        LOAD A COMMA
        !          15774:        SCH  WB,(XL)          STORE A COMMA OVER THE ZERO
        !          15775:        CSC  XL               COMPLETE STORE CHARACTERS
        !          15776: *
        !          15777: *      NORMAL RETURN
        !          15778: *
        !          15779: GTAR8  EXI                   RETURN TO CALLER
        !          15780: *
        !          15781: *      NON-CONVERSION RETURN
        !          15782: *
        !          15783: GTAR9  MOV  (XS)+,XR         CLEAR UP STACK
        !          15784:        EXI  1                RETURN
        !          15785:        ENP                   PROCEDURE GTARR
        !          15786:        EJC
        !          15787: *
        !          15788: *      GTCOD -- CONVERT TO CODE
        !          15789: *
        !          15790: *      (XR)                  OBJECT TO BE CONVERTED
        !          15791: *      JSR  GTCOD            CALL TO CONVERT TO CODE
        !          15792: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          15793: *      (XR)                  POINTER TO RESULTING CDBLK
        !          15794: *      (XL,WA,WB,WC,RA)      DESTROYED
        !          15795: *
        !          15796: *      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
        !          15797: *      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
        !          15798: *      WITHOUT RETURNING TO THIS ROUTINE.
        !          15799: *
        !          15800: GTCOD  PRC  E,1              ENTRY POINT
        !          15801:        BEQ  (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE
        !          15802:        BEQ  (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE
        !          15803: *
        !          15804: *      HERE WE MUST GENERATE A CDBLK BY COMPILATION
        !          15805: *
        !          15806:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
        !          15807:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
        !          15808:        PPM  GTCD2            JUMP IF NON-CONVERTIBLE
        !          15809:        MOV  FLPTR,GTCEF      SAVE FAIL PTR IN CASE OF ERROR
        !          15810:        MOV  R$COD,R$GTC      ALSO SAVE CODE PTR
        !          15811:        MOV  XR,R$CIM         ELSE SET IMAGE POINTER
        !          15812:        MOV  WA,SCNIL         SET IMAGE LENGTH
        !          15813:        ZER  SCNPT            SET SCAN POINTER
        !          15814:        MOV  =STGXC,STAGE     SET STAGE FOR EXECUTE COMPILE
        !          15815:        MOV  CMPSN,LSTSN      IN CASE LISTR CALLED
        !          15816:        JSR  CMPIL            COMPILE STRING
        !          15817:        MOV  =STGXT,STAGE     RESET STAGE FOR EXECUTE TIME
        !          15818:        ZER  R$CIM            CLEAR IMAGE
        !          15819: *
        !          15820: *      MERGE HERE IF NO CONVERT REQUIRED
        !          15821: *
        !          15822: GTCD1  EXI                   GIVE NORMAL GTCOD RETURN
        !          15823: *
        !          15824: *      HERE IF UNCONVERTIBLE
        !          15825: *
        !          15826: GTCD2  EXI  1                GIVE ERROR RETURN
        !          15827:        ENP                   END PROCEDURE GTCOD
        !          15828:        EJC
        !          15829: *
        !          15830: *      GTEXP -- CONVERT TO EXPRESSION
        !          15831: *
        !          15832: *      (XR)                  INPUT VALUE TO BE CONVERTED
        !          15833: *      JSR  GTEXP            CALL TO CONVERT TO EXPRESSION
        !          15834: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          15835: *      (XR)                  POINTER TO RESULT EXBLK OR SEBLK
        !          15836: *      (XL,WA,WB,WC,RA)      DESTROYED
        !          15837: *
        !          15838: *      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
        !          15839: *      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
        !          15840: *      WITHOUT RETURNING TO THIS ROUTINE.
        !          15841: *
        !          15842: GTEXP  PRC  E,1              ENTRY POINT
        !          15843:        BLO  (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION
        !          15844:        MOV  XR,-(XS)         STORE ARGUMENT FOR GTSTG
        !          15845:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
        !          15846:        PPM  GTEX2            JUMP IF UNCONVERTIBLE
        !          15847: *
        !          15848: *      CHECK THE LAST CHAR OF STRING FOR COLON OR
        !          15849: *      SEMICOLON. THEY CAN LEGITIMATELY END AN EXPRESSION
        !          15850: *      IN OPEN CODE, SO EXPAN WILL NOT FAIL THEM BUT THEY ARE
        !          15851: *      INVALID AS TERMINATORS FOR A STRING WHICH IS TO BE
        !          15852: *      CONVERTED TO EXPRESSION FORM.
        !          15853: *
        !          15854:        MOV  XR,XL            COPY ARGUMENT STRING
        !          15855:        PLC  XL,WA            POINT PAST STRING END
        !          15856:        LCH  XL,-(XL)         GET LAST CHAR
        !          15857:        BEQ  XL,=CH$CL,GTEX2  FAIL IF COLON
        !          15858:        BEQ  XL,=CH$SM,GTEX2  FAIL IF SEMICOLON
        !          15859: *
        !          15860: *      HERE WE CONVERT A STRING BY COMPILATION
        !          15861: *
        !          15862:        MOV  XR,R$CIM         SET INPUT IMAGE POINTER
        !          15863:        ZER  SCNPT            SET SCAN POINTER
        !          15864:        MOV  WA,SCNIL         SET INPUT IMAGE LENGTH
        !          15865:        ZER  WB               SET CODE FOR NORMAL SCAN
        !          15866:        MOV  FLPTR,GTCEF      SAVE FAIL PTR IN CASE OF ERROR
        !          15867:        MOV  R$COD,R$GTC      ALSO SAVE CODE PTR
        !          15868:        MOV  =STGEV,STAGE     ADJUST STAGE FOR COMPILE
        !          15869:        MOV  =T$UOK,SCNTP     INDICATE UNARY OPERATOR ACCEPTABLE
        !          15870:        JSR  EXPAN            BUILD TREE FOR EXPRESSION
        !          15871:        ZER  SCNRS            RESET RESCAN FLAG
        !          15872:        BNE  SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE
        !          15873:        ZER  WB               SET OK VALUE FOR CDGEX CALL
        !          15874:        MOV  XR,XL            COPY TREE POINTER
        !          15875:        JSR  CDGEX            BUILD EXPRESSION BLOCK
        !          15876:        ZER  R$CIM            CLEAR POINTER
        !          15877:        MOV  =STGXT,STAGE     RESTORE STAGE FOR EXECUTE TIME
        !          15878: *
        !          15879: *      MERGE HERE IF NO CONVERSION REQUIRED
        !          15880: *
        !          15881: GTEX1  EXI                   RETURN TO GTEXP CALLER
        !          15882: *
        !          15883: *      HERE IF UNCONVERTIBLE
        !          15884: *
        !          15885: GTEX2  EXI  1                TAKE ERROR EXIT
        !          15886:        ENP                   END PROCEDURE GTEXP
        !          15887:        EJC
        !          15888: *
        !          15889: *      GTINT -- GET INTEGER VALUE
        !          15890: *
        !          15891: *      GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
        !          15892: *      PERFORMING ANY NECESSARY CONVERSIONS.
        !          15893: *
        !          15894: *      (XR)                  VALUE TO BE CONVERTED
        !          15895: *      JSR  GTINT            CALL TO CONVERT TO INTEGER
        !          15896: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
        !          15897: *      (XR)                  RESULTING INTEGER
        !          15898: *      (WC,RA)               DESTROYED
        !          15899: *      (WA,WB)               DESTROYED (ONLY ON CONVERSION ERR)
        !          15900: *      (XR)                  UNCHANGED (ON CONVERT ERROR)
        !          15901: *
        !          15902: GTINT  PRC  E,1              ENTRY POINT
        !          15903:        BEQ  (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER
        !          15904:        MOV  WA,GTINA         ELSE SAVE WA
        !          15905:        MOV  WB,GTINB         SAVE WB
        !          15906:        JSR  GTNUM            CONVERT TO NUMERIC
        !          15907:        PPM  GTIN3            JUMP IF UNCONVERTIBLE
        !          15908: .IF    .CNRA
        !          15909: .ELSE
        !          15910:        BEQ  WA,=B$ICL,GTIN1  JUMP IF INTEGER
        !          15911: *
        !          15912: *      HERE WE CONVERT A REAL TO INTEGER
        !          15913: *
        !          15914:        LDR  RCVAL(XR)        LOAD REAL VALUE
        !          15915:        RTI  GTIN3            CONVERT TO INTEGER (ERR IF OVFLOW)
        !          15916:        JSR  ICBLD            IF OK BUILD ICBLK
        !          15917: .FI
        !          15918: *
        !          15919: *      HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
        !          15920: *
        !          15921: GTIN1  MOV  GTINA,WA         RESTORE WA
        !          15922:        MOV  GTINB,WB         RESTORE WB
        !          15923: *
        !          15924: *      COMMON EXIT POINT
        !          15925: *
        !          15926: GTIN2  EXI                   RETURN TO GTINT CALLER
        !          15927: *
        !          15928: *      HERE ON CONVERSION ERROR
        !          15929: *
        !          15930: GTIN3  EXI  1                TAKE CONVERT ERROR EXIT
        !          15931:        ENP                   END PROCEDURE GTINT
        !          15932:        EJC
        !          15933: *
        !          15934: *      GTNUM -- GET NUMERIC VALUE
        !          15935: *
        !          15936: *      GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
        !          15937: *      OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
        !          15938: *
        !          15939: *      (XR)                  OBJECT TO BE CONVERTED
        !          15940: *      JSR  GTNUM            CALL TO CONVERT TO NUMERIC
        !          15941: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          15942: *      (XR)                  POINTER TO RESULT (INT OR REAL)
        !          15943: *      (WA)                  FIRST WORD OF RESULT BLOCK
        !          15944: *      (WB,WC,RA)            DESTROYED
        !          15945: *      (XR)                  UNCHANGED (ON CONVERT ERROR)
        !          15946: *
        !          15947: GTNUM  PRC  E,1              ENTRY POINT
        !          15948:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
        !          15949:        BEQ  WA,=B$ICL,GTN3A  JUMP IF INTEGER (NO CONVERSION)
        !          15950: .IF    .CNRA
        !          15951: .ELSE
        !          15952:        BEQ  WA,=B$RCL,GTN3A  JUMP IF REAL (NO CONVERSION)
        !          15953: .FI
        !          15954: *
        !          15955: *      AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
        !          15956: *      TO AN INTEGER OR REAL AS APPROPRIATE.
        !          15957: *
        !          15958:        STI  GTNSV            SAVE IA
        !          15959:        MOV  XR,-(XS)         STACK ARGUMENT IN CASE CONVERT ERR
        !          15960:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
        !          15961:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
        !          15962:        PPM  GTN36            JUMP IF UNCONVERTIBLE
        !          15963: *
        !          15964: *      INITIALIZE NUMERIC CONVERSION
        !          15965: *
        !          15966:        LDI  INTV0            INITIALIZE INTEGER RESULT TO ZERO
        !          15967:        BZE  WA,GTN32         JUMP TO EXIT WITH ZERO IF NULL
        !          15968:        LCT  WA,WA            SET BCT COUNTER FOR FOLLOWING LOOPS
        !          15969:        ZER  GTNNF            TENTATIVELY INDICATE RESULT +
        !          15970: .IF    .CNRA
        !          15971: .ELSE
        !          15972:        STI  GTNEX            INITIALISE EXPONENT TO ZERO
        !          15973:        ZER  GTNSC            ZERO SCALE IN CASE REAL
        !          15974:        ZER  GTNDF            RESET FLAG FOR DEC POINT FOUND
        !          15975:        ZER  GTNRD            RESET FLAG FOR DIGITS FOUND
        !          15976:        LDR  REAV0            ZERO REAL ACCUM IN CASE REAL
        !          15977: .FI
        !          15978:        PLC  XR               POINT TO ARGUMENT CHARACTERS
        !          15979: *
        !          15980: *      MERGE BACK HERE AFTER IGNORING LEADING BLANK
        !          15981: *
        !          15982: GTN01  LCH  WB,(XR)+         LOAD FIRST CHARACTER
        !          15983:        BLT  WB,=CH$D0,GTN02  JUMP IF NOT DIGIT
        !          15984:        BLE  WB,=CH$D9,GTN06  JUMP IF FIRST CHAR IS A DIGIT
        !          15985:        EJC
        !          15986: *
        !          15987: *      GTNUM (CONTINUED)
        !          15988: *
        !          15989: *      HERE IF FIRST DIGIT IS NON-DIGIT
        !          15990: *
        !          15991: GTN02  BNE  WB,=CH$BL,GTN03  JUMP IF NON-BLANK
        !          15992: GTNA2  BCT  WA,GTN01         ELSE DECR COUNT AND LOOP BACK
        !          15993:        BRN  GTN07            JUMP TO RETURN ZERO IF ALL BLANKS
        !          15994: *
        !          15995: *      HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
        !          15996: *
        !          15997: GTN03  BEQ  WB,=CH$PL,GTN04  JUMP IF PLUS SIGN
        !          15998: .IF    .CAHT
        !          15999:        BEQ  WB,=CH$HT,GTNA2  HORIZONTAL TAB EQUIV TO BLANK
        !          16000: .FI
        !          16001: .IF    .CAVT
        !          16002:        BEQ  WB,=CH$VT,GTNA2  VERTICAL TAB EQUIV TO BLANK
        !          16003: .FI
        !          16004: .IF    .CNRA
        !          16005:        BNE  WB,=CH$MN,GTN36  ELSE FAIL
        !          16006: .ELSE
        !          16007:        BNE  WB,=CH$MN,GTN12  JUMP IF NOT MINUS (MAY BE REAL)
        !          16008: .FI
        !          16009:        MNZ  GTNNF            IF MINUS SIGN, SET NEGATIVE FLAG
        !          16010: *
        !          16011: *      MERGE HERE AFTER PROCESSING SIGN
        !          16012: *
        !          16013: GTN04  BCT  WA,GTN05         JUMP IF CHARS LEFT
        !          16014:        BRN  GTN36            ELSE ERROR
        !          16015: *
        !          16016: *      LOOP TO FETCH CHARACTERS OF AN INTEGER
        !          16017: *
        !          16018: GTN05  LCH  WB,(XR)+         LOAD NEXT CHARACTER
        !          16019:        BLT  WB,=CH$D0,GTN08  JUMP IF NOT A DIGIT
        !          16020:        BGT  WB,=CH$D9,GTN08  JUMP IF NOT A DIGIT
        !          16021: *
        !          16022: *      MERGE HERE FOR FIRST DIGIT
        !          16023: *
        !          16024: GTN06  STI  GTNSI            SAVE CURRENT VALUE
        !          16025: .IF    .CNRA
        !          16026:        CVM  GTN36            CURRENT*10-(NEW DIG) JUMP IF OVFLOW
        !          16027: .ELSE
        !          16028:        CVM  GTN35            CURRENT*10-(NEW DIG) JUMP IF OVFLOW
        !          16029:        MNZ  GTNRD            SET DIGIT READ FLAG
        !          16030: .FI
        !          16031:        BCT  WA,GTN05         ELSE LOOP BACK IF MORE CHARS
        !          16032: *
        !          16033: *      HERE TO EXIT WITH CONVERTED INTEGER VALUE
        !          16034: *
        !          16035: GTN07  BNZ  GTNNF,GTN32      JUMP IF NEGATIVE (ALL SET)
        !          16036:        NGI                   ELSE NEGATE
        !          16037:        INO  GTN32            JUMP IF NO OVERFLOW
        !          16038:        BRN  GTN36            ELSE SIGNAL ERROR
        !          16039:        EJC
        !          16040: *
        !          16041: *      GTNUM (CONTINUED)
        !          16042: *
        !          16043: *      HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
        !          16044: *      CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
        !          16045: *
        !          16046: GTN08  BEQ  WB,=CH$BL,GTNA9  JUMP IF A BLANK
        !          16047: .IF    .CAHT
        !          16048:        BEQ  WB,=CH$HT,GTNA9  JUMP IF HORIZONTAL TAB
        !          16049: .FI
        !          16050: .IF    .CAVT
        !          16051:        BEQ  WB,=CH$VT,GTNA9  JUMP IF VERTICAL TAB
        !          16052: .FI
        !          16053: .IF    .CNRA
        !          16054:        BRN  GTN36            ERROR
        !          16055: .ELSE
        !          16056:        ITR                   ELSE CONVERT INTEGER TO REAL
        !          16057:        NGR                   NEGATE TO GET POSITIVE VALUE
        !          16058:        BRN  GTN12            JUMP TO TRY FOR REAL
        !          16059: .FI
        !          16060: *
        !          16061: *      HERE WE SCAN OUT BLANKS TO END OF STRING
        !          16062: *
        !          16063: GTN09  LCH  WB,(XR)+         GET NEXT CHAR
        !          16064: .IF    .CAHT
        !          16065:        BEQ  WB,=CH$HT,GTNA9  JUMP IF HORIZONTAL TAB
        !          16066: .FI
        !          16067: .IF    .CAVT
        !          16068:        BEQ  WB,=CH$VT,GTNA9  JUMP IF VERTICAL TAB
        !          16069: .FI
        !          16070:        BNE  WB,=CH$BL,GTN36  ERROR IF NON-BLANK
        !          16071: GTNA9  BCT  WA,GTN09         LOOP BACK IF MORE CHARS TO CHECK
        !          16072:        BRN  GTN07            RETURN INTEGER IF ALL BLANKS
        !          16073: .IF    .CNRA
        !          16074: .ELSE
        !          16075: *
        !          16076: *      LOOP TO COLLECT MANTISSA OF REAL
        !          16077: *
        !          16078: GTN10  LCH  WB,(XR)+         LOAD NEXT CHARACTER
        !          16079:        BLT  WB,=CH$D0,GTN12  JUMP IF NON-NUMERIC
        !          16080:        BGT  WB,=CH$D9,GTN12  JUMP IF NON-NUMERIC
        !          16081: *
        !          16082: *      MERGE HERE TO COLLECT FIRST REAL DIGIT
        !          16083: *
        !          16084: GTN11  SUB  =CH$D0,WB        CONVERT DIGIT TO NUMBER
        !          16085:        MLR  REAVT            MULTIPLY REAL BY 10.0
        !          16086:        ROV  GTN36            CONVERT ERROR IF OVERFLOW
        !          16087:        STR  GTNSR            SAVE RESULT
        !          16088:        MTI  WB               GET NEW DIGIT AS INTEGER
        !          16089:        ITR                   CONVERT NEW DIGIT TO REAL
        !          16090:        ADR  GTNSR            ADD TO GET NEW TOTAL
        !          16091:        ADD  GTNDF,GTNSC      INCREMENT SCALE IF AFTER DEC POINT
        !          16092:        MNZ  GTNRD            SET DIGIT FOUND FLAG
        !          16093:        BCT  WA,GTN10         LOOP BACK IF MORE CHARS
        !          16094:        BRN  GTN22            ELSE JUMP TO SCALE
        !          16095:        EJC
        !          16096: *
        !          16097: *      GTNUM (CONTINUED)
        !          16098: *
        !          16099: *      HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
        !          16100: *
        !          16101: GTN12  BNE  WB,=CH$DT,GTN13  JUMP IF NOT DEC POINT
        !          16102:        BNZ  GTNDF,GTN36      IF DEC POINT, ERROR IF ONE ALREADY
        !          16103:        MOV  =NUM01,GTNDF     ELSE SET FLAG FOR DEC POINT
        !          16104:        BCT  WA,GTN10         LOOP BACK IF MORE CHARS
        !          16105:        BRN  GTN22            ELSE JUMP TO SCALE
        !          16106: *
        !          16107: *      HERE IF NOT DECIMAL POINT
        !          16108: *
        !          16109: GTN13  BEQ  WB,=CH$LE,GTN15  JUMP IF E FOR EXPONENT
        !          16110:        BEQ  WB,=CH$LD,GTN15  JUMP IF D FOR EXPONENT
        !          16111: .IF    .CASL
        !          16112:        BEQ  WB,=CH$$E,GTN15  JUMP FOR EXPT
        !          16113:        BEQ  WB,=CH$$D,GTN15  JUMP FOR EXPT
        !          16114: .FI
        !          16115: *
        !          16116: *      HERE CHECK FOR TRAILING BLANKS
        !          16117: *
        !          16118: GTN14  BEQ  WB,=CH$BL,GTNB4  JUMP IF BLANK
        !          16119: .IF    .CAHT
        !          16120:        BEQ  WB,=CH$HT,GTNB4  JUMP IF HORIZONTAL TAB
        !          16121: .FI
        !          16122: .IF    .CAVT
        !          16123:        BEQ  WB,=CH$VT,GTNB4  JUMP IF VERTICAL TAB
        !          16124: .FI
        !          16125:        BRN  GTN36            ERROR IF NON-BLANK
        !          16126: *
        !          16127: GTNB4  LCH  WB,(XR)+         GET NEXT CHARACTER
        !          16128:        BCT  WA,GTN14         LOOP BACK TO CHECK IF MORE
        !          16129:        BRN  GTN22            ELSE JUMP TO SCALE
        !          16130: *
        !          16131: *      HERE TO READ AND PROCESS AN EXPONENT
        !          16132: *
        !          16133: GTN15  ZER  GTNES            SET EXPONENT SIGN POSITIVE
        !          16134:        LDI  INTV0            INITIALIZE EXPONENT TO ZERO
        !          16135:        MNZ  GTNDF            RESET NO DEC POINT INDICATION
        !          16136:        BCT  WA,GTN16         JUMP SKIPPING PAST E OR D
        !          16137:        BRN  GTN36            ERROR IF NULL EXPONENT
        !          16138: *
        !          16139: *      CHECK FOR EXPONENT SIGN
        !          16140: *
        !          16141: GTN16  LCH  WB,(XR)+         LOAD FIRST EXPONENT CHARACTER
        !          16142:        BEQ  WB,=CH$PL,GTN17  JUMP IF PLUS SIGN
        !          16143:        BNE  WB,=CH$MN,GTN19  ELSE JUMP IF NOT MINUS SIGN
        !          16144:        MNZ  GTNES            SET SIGN NEGATIVE IF MINUS SIGN
        !          16145: *
        !          16146: *      MERGE HERE AFTER PROCESSING EXPONENT SIGN
        !          16147: *
        !          16148: GTN17  BCT  WA,GTN18         JUMP IF CHARS LEFT
        !          16149:        BRN  GTN36            ELSE ERROR
        !          16150: *
        !          16151: *      LOOP TO CONVERT EXPONENT DIGITS
        !          16152: *
        !          16153: GTN18  LCH  WB,(XR)+         LOAD NEXT CHARACTER
        !          16154:        EJC
        !          16155: *
        !          16156: *      GTNUM (CONTINUED)
        !          16157: *
        !          16158: *      MERGE HERE FOR FIRST EXPONENT DIGIT
        !          16159: *
        !          16160: GTN19  BLT  WB,=CH$D0,GTN20  JUMP IF NOT DIGIT
        !          16161:        BGT  WB,=CH$D9,GTN20  JUMP IF NOT DIGIT
        !          16162:        CVM  GTN36            ELSE CURRENT*10, SUBTRACT NEW DIGIT
        !          16163:        BCT  WA,GTN18         LOOP BACK IF MORE CHARS
        !          16164:        BRN  GTN21            JUMP IF EXPONENT FIELD IS EXHAUSTED
        !          16165: *
        !          16166: *      HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
        !          16167: *
        !          16168: GTN20  BEQ  WB,=CH$BL,GTNC0  JUMP IF BLANK
        !          16169: .IF    .CAHT
        !          16170:        BEQ  WB,=CH$HT,GTNC0  JUMP IF HORIZONTAL TAB
        !          16171: .FI
        !          16172: .IF    .CAVT
        !          16173:        BEQ  WC,=CH$VT,GTNC0  JUMP IF VERTICAL TAB
        !          16174: .FI
        !          16175:        BRN  GTN36            ERROR IF NON-BLANK
        !          16176: *
        !          16177: GTNC0  LCH  WB,(XR)+         GET NEXT CHARACTER
        !          16178:        BCT  WA,GTN20         LOOP BACK TILL ALL BLANKS SCANNED
        !          16179: *
        !          16180: *      MERGE HERE AFTER COLLECTING EXPONENT
        !          16181: *
        !          16182: GTN21  STI  GTNEX            SAVE COLLECTED EXPONENT
        !          16183:        BNZ  GTNES,GTN22      JUMP IF IT WAS NEGATIVE
        !          16184:        NGI                   ELSE COMPLEMENT
        !          16185:        IOV  GTN36            ERROR IF OVERFLOW
        !          16186:        STI  GTNEX            AND STORE POSITIVE EXPONENT
        !          16187: *
        !          16188: *      MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
        !          16189: *
        !          16190: GTN22  BZE  GTNRD,GTN36      ERROR IF NOT DIGITS COLLECTED
        !          16191:        BZE  GTNDF,GTN36      ERROR IF NO EXPONENT OR DEC POINT
        !          16192:        MTI  GTNSC            ELSE LOAD SCALE AS INTEGER
        !          16193:        SBI  GTNEX            SUBTRACT EXPONENT
        !          16194:        IOV  GTN36            ERROR IF OVERFLOW
        !          16195:        ILT  GTN26            JUMP IF WE MUST SCALE UP
        !          16196: *
        !          16197: *      HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
        !          16198: *
        !          16199:        MFI  WA,GTN36         LOAD SCALE FACTOR, ERR IF OVFLOW
        !          16200: *
        !          16201: *      LOOP TO SCALE DOWN IN STEPS OF 10**10
        !          16202: *
        !          16203: GTN23  BLE  WA,=NUM10,GTN24  JUMP IF 10 OR LESS TO GO
        !          16204:        DVR  REATT            ELSE DIVIDE BY 10**10
        !          16205:        SUB  =NUM10,WA        DECREMENT SCALE
        !          16206:        BRN  GTN23            AND LOOP BACK
        !          16207:        EJC
        !          16208: *
        !          16209: *      GTNUM (CONTINUED)
        !          16210: *
        !          16211: *      HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
        !          16212: *
        !          16213: GTN24  BZE  WA,GTN30         JUMP IF SCALED
        !          16214:        LCT  WB,=CFP$R        ELSE GET INDEXING FACTOR
        !          16215:        MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
        !          16216:        WTB  WA               CONVERT REMAINING SCALE TO BAU OFS
        !          16217: *
        !          16218: *      LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
        !          16219: *
        !          16220: GTN25  ADD  WA,XR            BUMP POINTER
        !          16221:        BCT  WB,GTN25         ONCE FOR EACH VALUE WORD
        !          16222:        DVR  (XR)             SCALE DOWN AS REQUIRED
        !          16223:        BRN  GTN30            AND JUMP
        !          16224: *
        !          16225: *      COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
        !          16226: *
        !          16227: GTN26  NGI                   GET ABSOLUTE VALUE OF EXPONENT
        !          16228:        IOV  GTN36            ERROR IF OVERFLOW
        !          16229:        MFI  WA,GTN36         ACQUIRE SCALE, ERROR IF OVFLOW
        !          16230: *
        !          16231: *      LOOP TO SCALE UP IN STEPS OF 10**10
        !          16232: *
        !          16233: GTN27  BLE  WA,=NUM10,GTN28  JUMP IF 10 OR LESS TO GO
        !          16234:        MLR  REATT            ELSE MULTIPLY BY 10**10
        !          16235:        ROV  GTN36            ERROR IF OVERFLOW
        !          16236:        SUB  =NUM10,WA        ELSE DECREMENT SCALE
        !          16237:        BRN  GTN27            AND LOOP BACK
        !          16238: *
        !          16239: *      HERE TO SCALE UP REST OF WAY WITH TABLE
        !          16240: *
        !          16241: GTN28  BZE  WA,GTN30         JUMP IF SCALED
        !          16242:        LCT  WB,=CFP$R        ELSE GET INDEXING FACTOR
        !          16243:        MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
        !          16244:        WTB  WA               CONVERT REMAINING SCALE TO BAU OFS
        !          16245: *
        !          16246: *      LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
        !          16247: *
        !          16248: GTN29  ADD  WA,XR            BUMP POINTER
        !          16249:        BCT  WB,GTN29         ONCE FOR EACH WORD IN VALUE
        !          16250:        MLR  (XR)             SCALE UP
        !          16251:        ROV  GTN36            ERROR IF OVERFLOW
        !          16252:        EJC
        !          16253: *
        !          16254: *      GTNUM (CONTINUED)
        !          16255: *
        !          16256: *      HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
        !          16257: *
        !          16258: GTN30  BZE  GTNNF,GTN31      JUMP IF POSITIVE
        !          16259:        NGR                   ELSE NEGATE
        !          16260: *
        !          16261: *      HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
        !          16262: *
        !          16263: GTN31  JSR  RCBLD            BUILD REAL BLOCK
        !          16264:        BRN  GTN33            MERGE TO EXIT
        !          16265: .FI
        !          16266: *
        !          16267: *      HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
        !          16268: *
        !          16269: GTN32  JSR  ICBLD            BUILD ICBLK
        !          16270: *
        !          16271: *      REAL MERGES HERE
        !          16272: *
        !          16273: GTN33  MOV  (XR),WA          LOAD FIRST WORD OF RESULT BLOCK
        !          16274:        ICA  XS               POP ARGUMENT OFF STACK
        !          16275: *
        !          16276: *      COMMON EXIT POINT
        !          16277: *
        !          16278: GTN34  LDI  GTNSV            RECOVER IA
        !          16279: GTN3A  EXI                   RETURN TO GTNUM CALLER
        !          16280: .IF    .CNRA
        !          16281: .ELSE
        !          16282: *
        !          16283: *      COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
        !          16284: *
        !          16285: GTN35  LDI  GTNSI            RELOAD INTEGER SO FAR
        !          16286:        ITR                   CONVERT TO REAL
        !          16287:        NGR                   MAKE VALUE POSITIVE
        !          16288:        BRN  GTN11            MERGE WITH REAL CIRCUIT
        !          16289: .FI
        !          16290: *
        !          16291: *      HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
        !          16292: *
        !          16293: GTN36  MOV  (XS)+,XR         RELOAD ORIGINAL ARGUMENT
        !          16294:        LDI  GTNSV            RECOVER IA
        !          16295:        EXI  1                TAKE CONVERT-ERROR EXIT
        !          16296:        ENP                   END PROCEDURE GTNUM
        !          16297:        EJC
        !          16298: *
        !          16299: *      GTNVR -- CONVERT TO NATURAL VARIABLE
        !          16300: *
        !          16301: *      GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
        !          16302: *      APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
        !          16303: *
        !          16304: *      (XR)                  ARGUMENT
        !          16305: *      JSR  GTNVR            CALL TO CONVERT TO NATURAL VARIABLE
        !          16306: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          16307: *      (XR)                  POINTER TO VRBLK
        !          16308: *      (WC)                  DESTROYED
        !          16309: *
        !          16310: GTNVR  PRC  E,1              ENTRY POINT
        !          16311:        BNE  (XR),=B$NML,GNV02 JUMP IF NOT NAME
        !          16312:        MOV  NMBAS(XR),XR     ELSE LOAD NAME BASE IF NAME
        !          16313:        BLO  XR,STATE,GNV07   SKIP IF VRBLK (IN STATIC REGION)
        !          16314:        BRN  GNV01            FAIL
        !          16315: *
        !          16316: *      RESTORE REGS AND FAIL
        !          16317: *
        !          16318: GNV00  MOV  GNVSA,WA         RESTORE REGS
        !          16319:        MOV  GNVSB,WB
        !          16320: *
        !          16321: *      COMMON ERROR EXIT
        !          16322: *
        !          16323: GNV01  EXI  1                TAKE CONVERT-ERROR EXIT
        !          16324: *
        !          16325: *      HERE IF NOT NAME
        !          16326: *
        !          16327: GNV02  MOV  WA,GNVSA         SAVE WA
        !          16328:        MOV  WB,GNVSB         SAVE WB
        !          16329:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
        !          16330:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
        !          16331:        PPM  GNV00            JUMP IF CONVERSION ERROR
        !          16332:        BZE  WA,GNV00         NULL STRING IS AN ERROR
        !          16333:        MOV  XL,-(XS)         SAVE XL
        !          16334: .IF    .CASL
        !          16335:        MOV  XR,XL            COPY STRING POINTER
        !          16336:        ZER  WB               ZERO OFFSET
        !          16337:        JSR  SBSTG            CONVERT TO PREFERRED CASE
        !          16338:        MOV  SCLEN(XR),WA     RECOVER STRING LENGTH
        !          16339: .FI
        !          16340:        MOV  XR,-(XS)         STACK STRING PTR FOR LATER
        !          16341:        MOV  XR,WB            COPY STRING POINTER
        !          16342:        ADD  *SCHAR,WB        POINT TO CHARACTERS OF STRING
        !          16343:        MOV  WB,GNVST         SAVE POINTER TO CHARACTERS
        !          16344:        MOV  WA,WB            COPY LENGTH
        !          16345:        CTW  WB,0             GET NUMBER OF WORDS IN NAME
        !          16346:        MOV  WB,GNVNW         SAVE FOR LATER
        !          16347:        JSR  HASHS            COMPUTE HASH INDEX FOR STRING
        !          16348:        RMI  HSHNB            COMPUTE HASH OFFSET BY TAKING MOD
        !          16349:        MFI  WC               GET AS OFFSET
        !          16350:        WTB  WC               CONVERT OFFSET TO BAUS
        !          16351:        ADD  HSHTB,WC         POINT TO PROPER HASH CHAIN
        !          16352:        SUB  *VRNXT,WC        SUBTRACT OFFSET TO MERGE INTO LOOP
        !          16353:        EJC
        !          16354: *
        !          16355: *      GTNVR (CONTINUED)
        !          16356: *
        !          16357: *      LOOP TO SEARCH HASH CHAIN
        !          16358: *
        !          16359: GNV03  MOV  WC,XL            COPY HASH CHAIN POINTER
        !          16360:        MOV  VRNXT(XL),XL     POINT TO NEXT VRBLK ON CHAIN
        !          16361:        BZE  XL,GNV08         JUMP IF END OF CHAIN
        !          16362:        MOV  XL,WC            SAVE POINTER TO THIS VRBLK
        !          16363:        BNZ  VRLEN(XL),GNV04  JUMP IF NOT SYSTEM VARIABLE
        !          16364:        MOV  VRSVP(XL),XL     ELSE POINT TO SVBLK
        !          16365:        SUB  *VRSOF,XL        ADJUST OFFSET FOR MERGE
        !          16366: *
        !          16367: *      MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
        !          16368: *
        !          16369: GNV04  BNE  WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE
        !          16370:        ADD  *VRCHS,XL        ELSE POINT TO CHARS OF CHAIN ENTRY
        !          16371:        LCT  WB,GNVNW         GET WORD COUNTER TO CONTROL LOOP
        !          16372:        MOV  GNVST,XR         POINT TO CHARS OF NEW NAME
        !          16373: *
        !          16374: *      LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
        !          16375: *
        !          16376: GNV05  CNE  (XR),(XL),GNV03  JUMP IF NO MATCH FOR NEXT VRBLK
        !          16377:        ICA  XR               BUMP NEW NAME POINTER
        !          16378:        ICA  XL               BUMP VRBLK IN CHAIN NAME POINTER
        !          16379:        BCT  WB,GNV05         ELSE LOOP TILL ALL COMPARED
        !          16380:        MOV  WC,XR            WE HAVE FOUND A MATCH, GET VRBLK
        !          16381: *
        !          16382: *      EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
        !          16383: *
        !          16384: GNV06  MOV  GNVSA,WA         RESTORE WA
        !          16385:        MOV  GNVSB,WB         RESTORE WB
        !          16386:        ICA  XS               POP STRING POINTER
        !          16387:        MOV  (XS)+,XL         RESTORE XL
        !          16388: *
        !          16389: *      COMMON EXIT POINT
        !          16390: *
        !          16391: GNV07  EXI                   RETURN TO GTNVR CALLER
        !          16392: *
        !          16393: *      NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
        !          16394: *
        !          16395: GNV08  ZER  XR               CLEAR GARBAGE XR POINTER
        !          16396:        MOV  WC,GNVHE         SAVE PTR TO END OF HASH CHAIN
        !          16397:        BGT  WA,=NUM09,GNV14  CANNOT BE SYSTEM VAR IF LENGTH GT 9
        !          16398:        MOV  WA,XL            ELSE COPY LENGTH
        !          16399:        WTB  XL               CONVERT TO BAU OFFSET
        !          16400:        MOV  VSRCH(XL),XL     POINT TO FIRST SVBLK OF THIS LENGTH
        !          16401:        EJC
        !          16402: *
        !          16403: *      GTNVR (CONTINUED)
        !          16404: *
        !          16405: *      LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
        !          16406: *
        !          16407: GNV09  MOV  XL,GNVSP         SAVE TABLE POINTER
        !          16408:        MOV  (XL)+,WC         LOAD SVBIT BIT STRING
        !          16409:        MOV  (XL)+,WB         LOAD LENGTH FROM TABLE ENTRY
        !          16410:        BNE  WA,WB,GNV14      JUMP IF END OF RIGHT LENGTH ENTIRES
        !          16411:        LCT  WB,GNVNW         GET WORD COUNTER TO CONTROL LOOP
        !          16412:        MOV  GNVST,XR         POINT TO CHARS OF NEW NAME
        !          16413: *
        !          16414: *      LOOP TO CHECK FOR MATCHING NAMES
        !          16415: *
        !          16416: GNV10  CNE  (XR),(XL),GNV11  JUMP IF NAME MISMATCH
        !          16417:        ICA  XR               ELSE BUMP NEW NAME POINTER
        !          16418:        ICA  XL               BUMP SVBLK POINTER
        !          16419:        BCT  WB,GNV10         ELSE LOOP UNTIL ALL CHECKED
        !          16420: *
        !          16421: *      HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
        !          16422: *
        !          16423:        ZER  WC               SET VRLEN VALUE ZERO
        !          16424:        MOV  *VRSI$,WA        SET STANDARD SIZE
        !          16425:        BRN  GNV15            JUMP TO BUILD VRBLK
        !          16426: *
        !          16427: *      HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
        !          16428: *
        !          16429: GNV11  ICA  XL               BUMP PAST WORD OF CHARS
        !          16430:        BCT  WB,GNV11         LOOP BACK IF MORE TO GO
        !          16431:        RSH  WC,SVNBT         REMOVE UNINTERESTING BITS
        !          16432: *
        !          16433: *      LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
        !          16434: *
        !          16435: GNV12  MOV  BITS1,WB         LOAD BIT TO TEST
        !          16436:        ANB  WC,WB            TEST FOR WORD PRESENT
        !          16437:        ZRB  WB,GNV13         JUMP IF NOT PRESENT
        !          16438:        ICA  XL               ELSE BUMP TABLE POINTER
        !          16439: *
        !          16440: *      HERE AFTER DEALING WITH ONE WORD (ONE BIT)
        !          16441: *
        !          16442: GNV13  RSH  WC,1             REMOVE BIT ALREADY PROCESSED
        !          16443:        NZB  WC,GNV12         LOOP BACK IF MORE BITS TO TEST
        !          16444:        BRN  GNV09            ELSE LOOP BACK FOR NEXT SVBLK
        !          16445: *
        !          16446: *      HERE IF NOT SYSTEM VARIABLE
        !          16447: *
        !          16448: GNV14  MOV  WA,WC            COPY VRLEN VALUE
        !          16449:        MOV  =VRCHS,WA        LOAD STANDARD SIZE -CHARS
        !          16450:        ADD  GNVNW,WA         ADJUST FOR CHARS OF NAME
        !          16451:        WTB  WA               CONVERT LENGTH TO BAUS
        !          16452:        EJC
        !          16453: *
        !          16454: *      GTNVR (CONTINUED)
        !          16455: *
        !          16456: *      MERGE HERE TO BUILD VRBLK
        !          16457: *
        !          16458: GNV15  JSR  ALOST            ALLOCATE SPACE FOR VRBLK (STATIC)
        !          16459:        MOV  XR,WB            SAVE VRBLK POINTER
        !          16460:        MOV  =STNVR,XL        POINT TO MODEL VARIABLE BLOCK
        !          16461:        MOV  *VRLEN,WA        SET LENGTH OF STANDARD FIELDS
        !          16462:        MVW                   SET INITIAL FIELDS OF NEW BLOCK
        !          16463:        MOV  GNVHE,XL         LOAD POINTER TO END OF HASH CHAIN
        !          16464:        MOV  WB,VRNXT(XL)     ADD NEW BLOCK TO END OF CHAIN
        !          16465:        MOV  WC,(XR)+         SET VRLEN FIELD, BUMP PTR
        !          16466:        MOV  GNVNW,WA         GET LENGTH IN WORDS
        !          16467:        WTB  WA               CONVERT TO LENGTH IN BAUS
        !          16468:        BZE  WC,GNV16         JUMP IF SYSTEM VARIABLE
        !          16469: *
        !          16470: *      HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
        !          16471: *
        !          16472:        MOV  (XS),XL          POINT BACK TO STRING NAME
        !          16473:        ADD  *SCHAR,XL        POINT TO CHARS OF NAME
        !          16474:        MVW                   MOVE CHARACTERS INTO PLACE
        !          16475:        MOV  WB,XR            RESTORE VRBLK POINTER
        !          16476:        BRN  GNV06            JUMP BACK TO EXIT
        !          16477: *
        !          16478: *      HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
        !          16479: *      NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
        !          16480: *
        !          16481: GNV16  MOV  GNVSP,XL         LOAD POINTER TO SVBLK
        !          16482:        MOV  XL,(XR)          SET SVBLK PTR IN VRBLK
        !          16483:        MOV  WB,XR            RESTORE VRBLK POINTER
        !          16484:        MOV  SVBIT(XL),WB     LOAD BIT INDICATORS
        !          16485:        ADD  *SVCHS,XL        POINT TO CHARACTERS OF NAME
        !          16486:        ADD  WA,XL            POINT PAST CHARACTERS
        !          16487: *
        !          16488: *      SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
        !          16489: *
        !          16490:        MOV  BTKNM,WC         LOAD TEST BIT
        !          16491:        ANB  WB,WC            AND TO TEST
        !          16492:        ZRB  WC,GNV17         JUMP IF NO KEYWORD NUMBER
        !          16493:        ICA  XL               ELSE BUMP POINTER
        !          16494:        EJC
        !          16495: *
        !          16496: *      GTNVR (CONTINUED)
        !          16497: *
        !          16498: *      HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
        !          16499: *
        !          16500: GNV17  MOV  BTFNC,WC         GET TEST BIT
        !          16501:        ANB  WB,WC            AND TO TEST
        !          16502:        ZRB  WC,GNV18         SKIP IF NO SYSTEM FUNCTION
        !          16503:        MOV  XL,VRFNC(XR)     ELSE POINT VRFNC TO SVFNC FIELD
        !          16504:        ADD  *NUM02,XL        AND BUMP PAST SVFNC, SVNAR FIELDS
        !          16505: *
        !          16506: *      NOW TEST FOR LABEL (SVLBL)
        !          16507: *
        !          16508: GNV18  MOV  BTLBL,WC         GET TEST BIT
        !          16509:        ANB  WB,WC            AND TO TEST
        !          16510:        ZRB  WC,GNV19         JUMP IF BIT IS OFF (NO SYSTEM LABL)
        !          16511:        MOV  XL,VRLBL(XR)     ELSE POINT VRLBL TO SVLBL FIELD
        !          16512:        ICA  XL               BUMP PAST SVLBL FIELD
        !          16513: *
        !          16514: *      NOW TEST FOR VALUE (SVVAL)
        !          16515: *
        !          16516: GNV19  MOV  BTVAL,WC         LOAD TEST BIT
        !          16517:        ANB  WB,WC            AND TO TEST
        !          16518:        ZRB  WC,GNV06         ALL DONE IF NO VALUE
        !          16519:        MOV  (XL),VRVAL(XR)   ELSE SET INITIAL VALUE
        !          16520:        MOV  =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS
        !          16521:        BRN  GNV06            MERGE BACK TO EXIT TO CALLER
        !          16522:        ENP                   END PROCEDURE GTNVR
        !          16523:        EJC
        !          16524: *
        !          16525: *      GTPAT -- GET PATTERN
        !          16526: *
        !          16527: *      GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
        !          16528: *      PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
        !          16529: *
        !          16530: *      (XR)                  INPUT ARGUMENT
        !          16531: *      JSR  GTPAT            CALL TO CONVERT TO PATTERN
        !          16532: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          16533: *      (XR)                  RESULTING PATTERN
        !          16534: *      (WA)                  DESTROYED
        !          16535: *      (WB)                  DESTROYED (ONLY ON CONVERT ERROR)
        !          16536: *      (XR)                  UNCHANGED (ONLY ON CONVERT ERROR)
        !          16537: *
        !          16538: GTPAT  PRC  E,1              ENTRY POINT
        !          16539:        BHI  (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY
        !          16540: *
        !          16541: *      HERE IF NOT PATTERN, TRY FOR STRING
        !          16542: *
        !          16543:        MOV  WB,GTPSB         SAVE WB
        !          16544:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
        !          16545:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
        !          16546:        PPM  GTPT2            JUMP IF IMPOSSIBLE
        !          16547: *
        !          16548: *      HERE WE HAVE A STRING
        !          16549: *
        !          16550:        BNZ  WA,GTPT1         JUMP IF NON-NULL
        !          16551: *
        !          16552: *      HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
        !          16553: *
        !          16554:        MOV  =NDNTH,XR        POINT TO NOTHEN NODE
        !          16555:        BRN  GTPT4            JUMP TO EXIT
        !          16556:        EJC
        !          16557: *
        !          16558: *      GTPAT (CONTINUED)
        !          16559: *
        !          16560: *      HERE FOR NON-NULL STRING
        !          16561: *
        !          16562: GTPT1  MOV  =P$STR,WB        LOAD PCODE FOR MULTI-CHAR STRING
        !          16563:        BNE  WA,=NUM01,GTPT3  JUMP IF MULTI-CHAR STRING
        !          16564: *
        !          16565: *      HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
        !          16566: *
        !          16567:        PLC  XR               POINT TO CHARACTER
        !          16568:        LCH  WA,(XR)          LOAD CHARACTER
        !          16569:        MOV  WA,XR            SET AS PARM1
        !          16570:        MOV  =P$ANS,WB        POINT TO PCODE FOR 1-CHAR ANY
        !          16571:        BRN  GTPT3            JUMP TO BUILD NODE
        !          16572: *
        !          16573: *      HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
        !          16574: *
        !          16575: GTPT2  MOV  =P$EXA,WB        SET PCODE FOR EXPRESSION IN CASE
        !          16576:        BLO  (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION
        !          16577: *
        !          16578: *      HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
        !          16579: *
        !          16580:        EXI  1                TAKE CONVERT ERROR EXIT
        !          16581: *
        !          16582: *      MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
        !          16583: *
        !          16584: GTPT3  JSR  PBILD            CALL ROUTINE TO BUILD PATTERN NODE
        !          16585: *
        !          16586: *      COMMON EXIT AFTER SUCCESSFUL CONVERSION
        !          16587: *
        !          16588: GTPT4  MOV  GTPSB,WB         RESTORE WB
        !          16589: *
        !          16590: *      MERGE HERE TO EXIT IF NO CONVERSION REQUIRED
        !          16591: *
        !          16592: GTPT5  EXI                   RETURN TO GTPAT CALLER
        !          16593:        ENP                   END PROCEDURE GTPAT
        !          16594: .IF    .CNRA
        !          16595: .ELSE
        !          16596:        EJC
        !          16597: *
        !          16598: *      GTREA -- GET REAL VALUE
        !          16599: *
        !          16600: *      GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
        !          16601: *      PERFORMING ANY NECESSARY CONVERSIONS.
        !          16602: *
        !          16603: *      (XR)                  OBJECT TO BE CONVERTED
        !          16604: *      JSR  GTREA            CALL TO CONVERT OBJECT TO REAL
        !          16605: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          16606: *      (XR)                  POINTER TO RESULTING REAL
        !          16607: *      (WA,WB,WC,RA)         DESTROYED
        !          16608: *      (XR)                  UNCHANGED (CONVERT ERROR ONLY)
        !          16609: *
        !          16610: GTREA  PRC  E,1              ENTRY POINT
        !          16611:        MOV  (XR),WA          GET FIRST WORD OF BLOCK
        !          16612:        BEQ  WA,=B$RCL,GTRE2  JUMP IF REAL
        !          16613:        JSR  GTNUM            ELSE CONVERT ARGUMENT TO NUMERIC
        !          16614:        PPM  GTRE3            JUMP IF UNCONVERTIBLE
        !          16615:        BEQ  WA,=B$RCL,GTRE2  JUMP IF REAL WAS RETURNED
        !          16616: *
        !          16617: *      HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
        !          16618: *
        !          16619: GTRE1  LDI  ICVAL(XR)        LOAD INTEGER
        !          16620:        ITR                   CONVERT TO REAL
        !          16621:        JSR  RCBLD            BUILD RCBLK
        !          16622: *
        !          16623: *      EXIT WITH REAL
        !          16624: *
        !          16625: GTRE2  EXI                   RETURN TO GTREA CALLER
        !          16626: *
        !          16627: *      HERE ON CONVERSION ERROR
        !          16628: *
        !          16629: GTRE3  EXI  1                TAKE CONVERT ERROR EXIT
        !          16630:        ENP                   END PROCEDURE GTREA
        !          16631: .FI
        !          16632:        EJC
        !          16633: *
        !          16634: *      GTSMI -- GET SMALL INTEGER
        !          16635: *
        !          16636: *      GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
        !          16637: *      INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
        !          16638: *      ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
        !          16639: *      SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
        !          16640: *      THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
        !          16641: *
        !          16642: *      -(XS)                 ARGUMENT TO CONVERT (ON STACK)
        !          16643: *      JSR  GTSMI            CALL TO CONVERT TO SMALL INTEGER
        !          16644: *      PPM  LOC              TRANSFER LOC FOR NOT INTEGER
        !          16645: *      PPM  LOC              TRANSFER LOC FOR LT 0, GT DNAMB
        !          16646: *      (XR,WC)               RESULTING SMALL INT (TWO COPIES)
        !          16647: *      (XS)                  POPPED
        !          16648: *      (RA)                  DESTROYED
        !          16649: *      (WA,WB)               DESTROYED (ON CONVERT ERROR ONLY)
        !          16650: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
        !          16651: *
        !          16652: GTSMI  PRC  N,2              ENTRY POINT
        !          16653:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          16654:        BEQ  (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER
        !          16655: *
        !          16656: *      HERE IF NOT AN INTEGER
        !          16657: *
        !          16658:        JSR  GTINT            CONVERT ARGUMENT TO INTEGER
        !          16659:        PPM  GTSM2            JUMP IF CONVERT IS IMPOSSIBLE
        !          16660: *
        !          16661: *      MERGE HERE WITH INTEGER
        !          16662: *
        !          16663: GTSM1  LDI  ICVAL(XR)        LOAD INTEGER VALUE
        !          16664:        MFI  WC,GTSM3         MOVE AS ONE WORD, JUMP IF OVFLOW
        !          16665:        BGT  WC,MXLEN,GTSM3   OR IF TOO LARGE
        !          16666:        MOV  WC,XR            COPY RESULT TO XR
        !          16667:        EXI                   RETURN TO GTSMI CALLER
        !          16668: *
        !          16669: *      HERE IF UNCONVERTIBLE TO INTEGER
        !          16670: *
        !          16671: GTSM2  EXI  1                TAKE NON-INTEGER ERROR EXIT
        !          16672: *
        !          16673: *      HERE IF OUT OF RANGE
        !          16674: *
        !          16675: GTSM3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
        !          16676:        ENP                   END PROCEDURE GTSMI
        !          16677:        EJC
        !          16678: *
        !          16679: *      GTSTG -- GET STRING
        !          16680: *
        !          16681: *      GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
        !          16682: *      ANY NECESSARY CONVERSIONS PERFORMED.
        !          16683: *
        !          16684: *      -(XS)                 INPUT ARGUMENT (ON STACK)
        !          16685: *      JSR  GTSTG            CALL TO CONVERT TO STRING
        !          16686: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
        !          16687: *      (XR)                  POINTER TO RESULTING STRING
        !          16688: *      (WA)                  LENGTH OF STRING IN CHARACTERS
        !          16689: *      (XS)                  POPPED
        !          16690: *      (RA)                  DESTROYED
        !          16691: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
        !          16692: *
        !          16693: GTSTG  PRC  N,1              ENTRY POINT
        !          16694:        MOV  (XS)+,XR         LOAD ARGUMENT, POP STACK
        !          16695:        BEQ  (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING
        !          16696: *
        !          16697: *      HERE IF NOT A STRING ALREADY
        !          16698: *
        !          16699: GTS01  MOV  XR,-(XS)         RESTACK ARGUMENT IN CASE ERROR
        !          16700:        MOV  XL,-(XS)         SAVE XL
        !          16701:        MOV  WB,GTSVB         SAVE WB
        !          16702:        MOV  WC,GTSVC         SAVE WC
        !          16703:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
        !          16704:        BEQ  WA,=B$ICL,GTS05  JUMP TO CONVERT INTEGER
        !          16705: .IF    .CNRA
        !          16706: .ELSE
        !          16707:        BEQ  WA,=B$RCL,GTS10  JUMP TO CONVERT REAL
        !          16708: .FI
        !          16709:        BEQ  WA,=B$NML,GTS03  JUMP TO CONVERT NAME
        !          16710: .IF    .CNBF
        !          16711: .ELSE
        !          16712:        BEQ  WA,=B$BCT,GTS32  JUMP TO CONVERT BUFFER
        !          16713: .FI
        !          16714: *
        !          16715: *      HERE ON CONVERSION ERROR
        !          16716: *
        !          16717: GTS02  MOV  (XS)+,XL         RESTORE XL
        !          16718:        MOV  (XS)+,XR         RELOAD INPUT ARGUMENT
        !          16719:        EXI  1                TAKE CONVERT ERROR EXIT
        !          16720:        EJC
        !          16721: *
        !          16722: *      GTSTG (CONTINUED)
        !          16723: *
        !          16724: *      HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
        !          16725: *
        !          16726: GTS03  MOV  NMBAS(XR),XL     LOAD NAME BASE
        !          16727:        BHI  XL,STATE,GTS02   ERROR IF NOT NATURAL VAR (STATIC)
        !          16728:        ADD  *VRSOF,XL        ELSE POINT TO POSSIBLE STRING NAME
        !          16729:        MOV  SCLEN(XL),WA     LOAD LENGTH
        !          16730:        BNZ  WA,GTS04         JUMP IF NOT SYSTEM VARIABLE
        !          16731:        MOV  VRSVO(XL),XL     ELSE POINT TO SVBLK
        !          16732:        MOV  SVLEN(XL),WA     AND LOAD NAME LENGTH
        !          16733: *
        !          16734: *      MERGE HERE WITH STRING IN XR, LENGTH IN WA
        !          16735: *
        !          16736: GTS04  ZER  WB               SET OFFSET TO ZERO
        !          16737:        JSR  SBSTR            USE SBSTR TO COPY STRING
        !          16738:        BRN  GTS29            JUMP TO EXIT
        !          16739: *
        !          16740: *      COME HERE TO CONVERT AN INTEGER
        !          16741: *
        !          16742: GTS05  LDI  ICVAL(XR)        LOAD INTEGER VALUE
        !          16743: .IF    .CSCI
        !          16744:        JSR  SYSCI            CONVERT INTEGER
        !          16745:        MOV  SCLEN(XL),WA     GET LENGTH
        !          16746:        ZER  WB               ZERO OFFSET FOR SBSTR
        !          16747:        JSR  SBSTR            COPY IN RESULT FROM SYSCI
        !          16748:        BRN  GTS29            EXIT
        !          16749: .ELSE
        !          16750:        MOV  =NUM01,GTSSF     SET SIGN FLAG NEGATIVE
        !          16751:        ILT  GTS06            SKIP IF INTEGER IS NEGATIVE
        !          16752:        NGI                   ELSE NEGATE INTEGER
        !          16753:        ZER  GTSSF            AND RESET NEGATIVE FLAG
        !          16754:        EJC
        !          16755: *
        !          16756: *      GTSTG (CONTINUED)
        !          16757: *
        !          16758: *      HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
        !          16759: *      REQUIRED BY THE CVD INSTRUCTION.
        !          16760: *
        !          16761: GTS06  MOV  GTSWK,XR         POINT TO RESULT WORK AREA
        !          16762:        MOV  =NSTMX,WB        INITIALIZE COUNTER TO MAX LENGTH
        !          16763:        PSC  XR,WB            PREPARE TO STORE (RIGHT-LEFT)
        !          16764: *
        !          16765: *      LOOP TO CONVERT DIGITS INTO WORK AREA
        !          16766: *
        !          16767: GTS07  CVD                   CONVERT ONE DIGIT INTO WA
        !          16768:        SCH  WA,-(XR)         STORE IN WORK AREA
        !          16769:        DCV  WB               DECREMENT COUNTER
        !          16770:        INE  GTS07            LOOP IF MORE DIGITS TO GO
        !          16771:        CSC  XR               COMPLETE STORE CHARACTERS
        !          16772: *
        !          16773: *      MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
        !          16774: *      AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
        !          16775: *
        !          16776: GTS08  MOV  =NSTMX,WA        GET MAX NUMBER OF CHARACTERS
        !          16777:        SUB  WB,WA            COMPUTE LENGTH OF RESULT
        !          16778:        MOV  WA,XL            REMEMBER LENGTH FOR MOVE LATER ON
        !          16779:        ADD  GTSSF,WA         ADD ONE FOR NEGATIVE SIGN IF NEEDED
        !          16780:        JSR  ALOCS            ALLOCATE STRING FOR RESULT
        !          16781:        MOV  XR,WC            SAVE RESULT POINTER FOR THE MOMENT
        !          16782:        PSC  XR               POINT TO CHARS OF RESULT BLOCK
        !          16783:        BZE  GTSSF,GTS09      SKIP IF POSITIVE
        !          16784:        MOV  =CH$MN,WA        ELSE LOAD NEGATIVE SIGN
        !          16785:        SCH  WA,(XR)+         AND STORE IT
        !          16786:        CSC  XR               COMPLETE STORE CHARACTERS
        !          16787: .FI
        !          16788: *
        !          16789: *      HERE AFTER DEALING WITH SIGN
        !          16790: *
        !          16791: GTS09  MOV  XL,WA            RECALL LENGTH TO MOVE
        !          16792:        MOV  GTSWK,XL         POINT TO RESULT WORK AREA
        !          16793:        PLC  XL,WB            POINT TO FIRST RESULT CHARACTER
        !          16794:        MVC                   MOVE CHARS TO RESULT STRING
        !          16795:        MOV  WC,XR            RESTORE RESULT POINTER
        !          16796: .IF    .CNRA
        !          16797: .ELSE
        !          16798:        BRN  GTS29            JUMP TO EXIT
        !          16799:        EJC
        !          16800: *
        !          16801: *      GTSTG (CONTINUED)
        !          16802: *
        !          16803: *      HERE TO CONVERT A REAL
        !          16804: *
        !          16805: GTS10  LDR  RCVAL(XR)        LOAD REAL
        !          16806:        ZER  GTSSF            RESET NEGATIVE FLAG
        !          16807:        REQ  GTS31            SKIP IF ZERO
        !          16808:        RGE  GTS11            JUMP IF REAL IS POSITIVE
        !          16809:        MOV  =NUM01,GTSSF     ELSE SET NEGATIVE FLAG
        !          16810:        NGR                   AND GET ABSOLUTE VALUE OF REAL
        !          16811: *
        !          16812: *      NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
        !          16813: *
        !          16814: GTS11  LDI  INTV0            INITIALIZE EXPONENT TO ZERO
        !          16815: *
        !          16816: *      LOOP TO SCALE UP IN STEPS OF 10**10
        !          16817: *
        !          16818: GTS12  STR  GTSRS            SAVE REAL VALUE
        !          16819:        SBR  REAP1            SUBTRACT 0.1 TO COMPARE
        !          16820:        RGE  GTS13            JUMP IF SCALE UP NOT REQUIRED
        !          16821:        LDR  GTSRS            ELSE RELOAD VALUE
        !          16822:        MLR  REATT            MULTIPLY BY 10**10
        !          16823:        SBI  INTVT            DECREMENT EXPONENT BY 10
        !          16824:        BRN  GTS12            LOOP BACK TO TEST AGAIN
        !          16825: *
        !          16826: *      TEST FOR SCALE DOWN REQUIRED
        !          16827: *
        !          16828: GTS13  LDR  GTSRS            RELOAD VALUE
        !          16829:        SBR  REAV1            SUBTRACT 1.0
        !          16830:        RLT  GTS17            JUMP IF NO SCALE DOWN REQUIRED
        !          16831:        LDR  GTSRS            ELSE RELOAD VALUE
        !          16832: *
        !          16833: *      LOOP TO SCALE DOWN IN STEPS OF 10**10
        !          16834: *
        !          16835: GTS14  SBR  REATT            SUBTRACT 10**10 TO COMPARE
        !          16836:        RLT  GTS15            JUMP IF LARGE STEP NOT REQUIRED
        !          16837:        LDR  GTSRS            ELSE RESTORE VALUE
        !          16838:        DVR  REATT            DIVIDE BY 10**10
        !          16839:        STR  GTSRS            STORE NEW VALUE
        !          16840:        ADI  INTVT            INCREMENT EXPONENT BY 10
        !          16841:        BRN  GTS14            LOOP BACK
        !          16842:        EJC
        !          16843: *
        !          16844: *      GTSTG (CONTINUED)
        !          16845: *
        !          16846: *      AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
        !          16847: *      COMPLETE SCALING WITH POWERS OF TEN TABLE
        !          16848: *
        !          16849: GTS15  MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
        !          16850: *
        !          16851: *      LOOP TO LOCATE CORRECT ENTRY IN TABLE
        !          16852: *
        !          16853: GTS16  LDR  GTSRS            RELOAD VALUE
        !          16854:        ADI  INTV1            INCREMENT EXPONENT
        !          16855:        ADD  *CFP$R,XR        POINT TO NEXT ENTRY IN TABLE
        !          16856:        SBR  (XR)             SUBTRACT IT TO COMPARE
        !          16857:        RGE  GTS16            LOOP TILL WE FIND A LARGER ENTRY
        !          16858:        LDR  GTSRS            THEN RELOAD THE VALUE
        !          16859:        DVR  (XR)             AND COMPLETE SCALING
        !          16860:        STR  GTSRS            STORE VALUE
        !          16861: *
        !          16862: *      WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
        !          16863: *
        !          16864: GTS17  LDR  GTSRS            GET VALUE AGAIN
        !          16865:        ADR  GTSRN            ADD ROUNDING FACTOR
        !          16866:        STR  GTSRS            STORE RESULT
        !          16867: *
        !          16868: *      THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
        !          16869: *      1.0 AGAIN, SO CHECK ONE MORE TIME.
        !          16870: *
        !          16871:        SBR  REAV1            SUBTRACT 1.0 TO COMPARE
        !          16872:        RLT  GTS18            SKIP IF OK
        !          16873:        ADI  INTV1            ELSE INCREMENT EXPONENT
        !          16874:        LDR  GTSRS            RELOAD VALUE
        !          16875:        DVR  REAVT            DIVIDE BY 10.0 TO RESCALE
        !          16876:        BRN  GTS19            JUMP TO MERGE
        !          16877: *
        !          16878: *      HERE IF ROUNDING DID NOT MUCK UP SCALING
        !          16879: *
        !          16880: GTS18  LDR  GTSRS            RELOAD ROUNDED VALUE
        !          16881:        EJC
        !          16882: *
        !          16883: *      GTSTG (CONTINUED)
        !          16884: *
        !          16885: *      NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
        !          16886: *
        !          16887: *      (IA)                  SIGNED EXPONENT
        !          16888: *      (RA)                  SCALED REAL (ABSOLUTE VALUE)
        !          16889: *
        !          16890: *      IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
        !          16891: *      WE CONVERT THE NUMBER IN THE FORM.
        !          16892: *
        !          16893: *      (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
        !          16894: *
        !          16895: *      IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
        !          16896: *      CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
        !          16897: *
        !          16898: *      (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
        !          16899: *
        !          16900: *      IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
        !          16901: *      RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
        !          16902: *      DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
        !          16903: *      AND THE EXPONENT SIGN IS ALWAYS PRESENT.
        !          16904: *
        !          16905: GTS19  MOV  =CFP$S,XL        SET NUM DEC DIGITS = CFP$S
        !          16906:        MOV  =CH$MN,GTSES     SET EXPONENT SIGN NEGATIVE
        !          16907:        ILT  GTS21            ALL SET IF EXPONENT IS NEGATIVE
        !          16908:        MFI  WA               ELSE FETCH EXPONENT
        !          16909:        BLE  WA,=CFP$S,GTS20  SKIP IF WE CAN USE SPECIAL FORMAT
        !          16910:        MTI  WA               ELSE RESTORE EXPONENT
        !          16911:        NGI                   SET NEGATIVE FOR CVD
        !          16912:        MOV  =CH$PL,GTSES     SET PLUS SIGN FOR EXPONENT SIGN
        !          16913:        BRN  GTS21            JUMP TO GENERATE EXPONENT
        !          16914: *
        !          16915: *      HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
        !          16916: *
        !          16917: GTS20  SUB  WA,XL            COMPUTE DIGITS AFTER DECIMAL POINT
        !          16918:        LDI  INTV0            RESET EXPONENT TO ZERO
        !          16919:        EJC
        !          16920: *
        !          16921: *      GTSTG (CONTINUED)
        !          16922: *
        !          16923: *      MERGE HERE AS FOLLOWS
        !          16924: *
        !          16925: *      (IA)                  EXPONENT ABSOLUTE VALUE
        !          16926: *      GTSES                 CHARACTER FOR EXPONENT SIGN
        !          16927: *      (RA)                  POSITIVE FRACTION
        !          16928: *      (XL)                  NUMBER OF DIGITS AFTER DEC POINT
        !          16929: *
        !          16930: GTS21  MOV  GTSWK,XR         POINT TO WORK AREA
        !          16931:        MOV  =NSTMX,WB        SET CHARACTER CTR TO MAX LENGTH
        !          16932:        PSC  XR,WB            PREPARE TO STORE (RIGHT TO LEFT)
        !          16933:        IEQ  GTS23            SKIP EXPONENT IF IT IS ZERO
        !          16934: *
        !          16935: *      LOOP TO GENERATE DIGITS OF EXPONENT
        !          16936: *
        !          16937: GTS22  CVD                   CONVERT A DIGIT INTO WA
        !          16938:        SCH  WA,-(XR)         STORE IN WORK AREA
        !          16939:        DCV  WB               DECREMENT COUNTER
        !          16940:        INE  GTS22            LOOP BACK IF MORE DIGITS TO GO
        !          16941: *
        !          16942: *      HERE GENERATE EXPONENT SIGN AND E
        !          16943: *
        !          16944:        MOV  GTSES,WA         LOAD EXPONENT SIGN
        !          16945:        SCH  WA,-(XR)         STORE IN WORK AREA
        !          16946: .IF    .CPLC
        !          16947:        MOV  =CH$$E,WA        GET CHAR LETTER E
        !          16948: .ELSE
        !          16949:        MOV  =CH$LE,WA        GET CHARACTER LETTER E
        !          16950: .FI
        !          16951:        SCH  WA,-(XR)         STORE IN WORK AREA
        !          16952:        SUB  =NUM02,WB        DECREMENT COUNTER FOR SIGN AND E
        !          16953: *
        !          16954: *      HERE TO GENERATE THE FRACTION
        !          16955: *
        !          16956: GTS23  MLR  GTSSC            CONVERT REAL TO INTEGER (10**CFP$S)
        !          16957:        RTI                   GET INTEGER (OVERFLOW IMPOSSIBLE)
        !          16958:        NGI                   NEGATE AS REQUIRED BY CVD
        !          16959: *
        !          16960: *      LOOP TO SUPPRESS TRAILING ZEROS
        !          16961: *
        !          16962: GTS24  BZE  XL,GTS27         JUMP IF NO DIGITS LEFT TO DO
        !          16963:        CVD                   ELSE CONVERT ONE DIGIT
        !          16964:        BNE  WA,=CH$D0,GTS26  JUMP IF NOT A ZERO
        !          16965:        DCV  XL               DECREMENT COUNTER
        !          16966:        BRN  GTS24            LOOP BACK FOR NEXT DIGIT
        !          16967:        EJC
        !          16968: *
        !          16969: *      GTSTG (CONTINUED)
        !          16970: *
        !          16971: *      LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
        !          16972: *
        !          16973: GTS25  CVD                   CONVERT A DIGIT INTO WA
        !          16974: *
        !          16975: *      MERGE HERE FIRST TIME
        !          16976: *
        !          16977: GTS26  SCH  WA,-(XR)         STORE DIGIT
        !          16978:        DCV  WB               DECREMENT COUNTER
        !          16979:        DCV  XL               DECREMENT COUNTER
        !          16980:        BNZ  XL,GTS25         LOOP BACK IF MORE TO GO
        !          16981: *
        !          16982: *      HERE GENERATE THE DECIMAL POINT
        !          16983: *
        !          16984: GTS27  MOV  =CH$DT,WA        LOAD DECIMAL POINT
        !          16985:        SCH  WA,-(XR)         STORE IN WORK AREA
        !          16986:        DCV  WB               DECREMENT COUNTER
        !          16987: *
        !          16988: *      HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
        !          16989: *
        !          16990: GTS28  CVD                   CONVERT A DIGIT INTO WA
        !          16991:        SCH  WA,-(XR)         STORE IN WORK AREA
        !          16992:        DCV  WB               DECREMENT COUNTER
        !          16993:        INE  GTS28            LOOP BACK IF MORE TO GO
        !          16994:        CSC  XR               COMPLETE STORE CHARACTERS
        !          16995:        BRN  GTS08            ELSE JUMP BACK TO EXIT
        !          16996: .FI
        !          16997: *
        !          16998: *      EXIT POINT AFTER SUCCESSFUL CONVERSION
        !          16999: *
        !          17000: GTS29  MOV  (XS)+,XL         RESTORE XL
        !          17001:        ICA  XS               POP ARGUMENT
        !          17002:        MOV  GTSVB,WB         RESTORE WB
        !          17003:        MOV  GTSVC,WC         RESTORE WC
        !          17004: *
        !          17005: *      MERGE HERE IF NO CONVERSION REQUIRED
        !          17006: *
        !          17007: GTS30  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
        !          17008:        EXI                   RETURN TO CALLER
        !          17009: .IF    .CNRA
        !          17010: .ELSE
        !          17011: *
        !          17012: *      HERE TO RETURN STRING FOR REAL ZERO
        !          17013: *
        !          17014: GTS31  MOV  =SCRE0,XL        POINT TO STRING
        !          17015:        MOV  =NUM02,WA        2 CHARS
        !          17016:        ZER  WB               ZERO OFFSET
        !          17017:        JSR  SBSTR            COPY STRING
        !          17018:        BRN  GTS29            RETURN
        !          17019: .FI
        !          17020: .IF    .CNBF
        !          17021: .ELSE
        !          17022:        EJC
        !          17023: *
        !          17024: *      HERE TO CONVERT A BUFFER BLOCK
        !          17025: *
        !          17026: GTS32  MOV  XR,XL            COPY ARG PTR
        !          17027:        MOV  BCLEN(XL),WA     GET SIZE TO ALLOCATE
        !          17028:        BZE  WA,GTS33         IF NULL THEN RETURN NULL
        !          17029:        JSR  ALOCS            ALLOCATE STRING FRAME
        !          17030:        MOV  XR,WB            SAVE STRING PTR
        !          17031:        MOV  SCLEN(XR),WA     GET LENGTH TO MOVE
        !          17032:        CTB  WA,0             GET AS MULTIPLE OF WORD SIZE
        !          17033:        MOV  BCBUF(XL),XL     POINT TOBFBLK
        !          17034:        ADD  *SCSI$,XR        POINT TO START OF CHARACTER AREA
        !          17035:        ADD  *BFSI$,XL        POINT TO START OF BUFFER CHARS
        !          17036:        MVW                   COPY WORDS
        !          17037:        MOV  WB,XR            RESTORE SCBLK PTR
        !          17038:        BRN  GTS29            EXIT WITH SCBLK
        !          17039: *
        !          17040: *      HERE WHEN NULL BUFFER IS BEING CONVERTED
        !          17041: *
        !          17042: GTS33  MOV  =NULLS,XR        POINT TO NULL
        !          17043:        BRN  GTS29            EXIT WITH NULL
        !          17044: .FI
        !          17045:        ENP                   END PROCEDURE GTSTG
        !          17046:        EJC
        !          17047: *
        !          17048: *      GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
        !          17049: *
        !          17050: *      GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
        !          17051: *      FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
        !          17052: *
        !          17053: *      (XR)                  ARGUMENT TO FUNCTION
        !          17054: *      JSR  GTVAR            CALL TO LOCATE VARIABLE POINTER
        !          17055: *      PPM  LOC              TRANSFER LOC IF NOT OK VARIABLE
        !          17056: *      (XL,WA)               NAME BASE,OFFSET OF VARIABLE
        !          17057: *      (XR,RA)               DESTROYED
        !          17058: *      (WB,WC)               DESTROYED (CONVERT ERROR ONLY)
        !          17059: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
        !          17060: *
        !          17061: GTVAR  PRC  E,1              ENTRY POINT
        !          17062:        BNE  (XR),=B$NML,GTVR2 JUMP IF NOT A NAME
        !          17063:        MOV  NMOFS(XR),WA     ELSE LOAD NAME OFFSET
        !          17064:        MOV  NMBAS(XR),XL     LOAD NAME BASE
        !          17065:        BEQ  (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE
        !          17066:        BNE  (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE
        !          17067: *
        !          17068: *      HERE ON CONVERSION ERROR
        !          17069: *
        !          17070: GTVR1  EXI  1                TAKE CONVERT ERROR EXIT
        !          17071: *
        !          17072: *      HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
        !          17073: *
        !          17074: GTVR2  MOV  WC,GTVRC         SAVE WC
        !          17075:        JSR  GTNVR            LOCATE VRBLK IF POSSIBLE
        !          17076:        PPM  GTVR1            JUMP IF CONVERT ERROR
        !          17077:        MOV  XR,XL            ELSE COPY VRBLK NAME BASE
        !          17078:        MOV  *VRVAL,WA        AND SET OFFSET
        !          17079:        MOV  GTVRC,WC         RESTORE WC
        !          17080: *
        !          17081: *      HERE FOR NAME OBTAINED
        !          17082: *
        !          17083: GTVR3  BHI  XL,STATE,GTVR4   ALL OK IF NOT NATURAL VARIABLE
        !          17084:        BEQ  VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE
        !          17085: *
        !          17086: *      COMMON EXIT POINT
        !          17087: *
        !          17088: GTVR4  EXI                   RETURN TO CALLER
        !          17089:        ENP                   END PROCEDURE GTVAR
        !          17090:        EJC
        !          17091: *
        !          17092: *      HASHS -- COMPUTE HASH INDEX FOR STRING
        !          17093: *
        !          17094: *      HASHS REPRODUCIBLY MAPS A STRING TO AN INTEGER
        !          17095: *      VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
        !          17096: *      IN THE RANGE 0 TO CFP$M
        !          17097: *
        !          17098: *      (XR)                  STRING TO BE HASHED
        !          17099: *      JSR  HASHS            CALL TO HASH STRING
        !          17100: *      (IA)                  HASH VALUE
        !          17101: *      (XR,WB,WC)            DESTROYED
        !          17102: *
        !          17103: *      THE HASH FUNCTION USED IS AS FOLLOWS.
        !          17104: *
        !          17105: *      START WITH THE LENGTH OF THE STRING
        !          17106: *
        !          17107: *      TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
        !          17108: *      THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
        !          17109: *
        !          17110: *      COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
        !          17111: *      THEM AS ONE WORD BIT STRING VALUES.
        !          17112: *
        !          17113: *      MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
        !          17114: *
        !          17115: HASHS  PRC  E,0              ENTRY POINT
        !          17116:        MOV  SCLEN(XR),WC     LOAD STRING LENGTH IN CHARACTERS
        !          17117:        MOV  WC,WB            INITIALIZE WITH LENGTH
        !          17118:        BZE  WC,HSHS3         JUMP IF NULL STRING
        !          17119:        CTW  WC,0             ELSE GET NUMBER OF WORDS OF CHARS
        !          17120:        ADD  *SCHAR,XR        POINT TO CHARACTERS OF STRING
        !          17121:        BLO  WC,=E$HNW,HSHS1  USE WHOLE STRING IF SHORT
        !          17122:        MOV  =E$HNW,WC        ELSE SET TO INVOLVE FIRST E$HNW WDS
        !          17123: *
        !          17124: *      HERE WITH COUNT OF WORDS TO CHECK IN WC
        !          17125: *
        !          17126: HSHS1  LCT  WC,WC            SET COUNTER TO CONTROL LOOP
        !          17127: *
        !          17128: *      LOOP TO COMPUTE EXCLUSIVE OR
        !          17129: *
        !          17130: HSHS2  XOB  (XR)+,WB         EXCLUSIVE OR NEXT WORD OF CHARS
        !          17131:        BCT  WC,HSHS2         LOOP TILL ALL PROCESSED
        !          17132: *
        !          17133: *      MERGE HERE WITH EXCLUSIVE OR IN WB
        !          17134: *
        !          17135: HSHS3  ZGB  WB               ZEROISE UNDEFINED BITS
        !          17136:        ANB  BITSM,WB         ENSURE IN RANGE 0 TO CFP$M
        !          17137:        MTI  WB               MOVE RESULT AS INTEGER
        !          17138:        ZER  XR               CLEAR GARBAGE VALUE IN XR
        !          17139:        EXI                   RETURN TO HASHS CALLER
        !          17140:        ENP                   END PROCEDURE HASHS
        !          17141:        EJC
        !          17142: *
        !          17143: *      ICBLD -- BUILD INTEGER BLOCK
        !          17144: *
        !          17145: *      (IA)                  INTEGER VALUE FOR ICBLK
        !          17146: *      JSR  ICBLD            CALL TO BUILD INTEGER BLOCK
        !          17147: *      (XR)                  POINTER TO RESULT ICBLK
        !          17148: *      (WA)                  DESTROYED
        !          17149: *
        !          17150: ICBLD  PRC  E,0              ENTRY POINT
        !          17151:        ILT  ICBL1            SKIP IF NEGATIVE
        !          17152:        SBI  INTV2            REDUCE BY TWO
        !          17153:        ILE  ICBL3            JUMP IF 0 , 1 OR 2
        !          17154:        ADI  INTV2            RESTORE VALUE
        !          17155: *
        !          17156: *      CONSTRUCT ICBLK
        !          17157: *
        !          17158: ICBL1  MOV  DNAMP,XR         LOAD POINTER TO NEXT AVAILABLE LOC
        !          17159:        ADD  *ICSI$,XR        POINT PAST NEW ICBLK
        !          17160:        BLO  XR,DNAME,ICBL2   JUMP IF THERE IS ROOM
        !          17161:        MOV  *ICSI$,WA        ELSE LOAD LENGTH OF ICBLK
        !          17162:        JSR  ALLOC            USE STANDARD ALLOCATOR TO GET BLOCK
        !          17163:        ADD  WA,XR            POINT PAST BLOCK TO MERGE
        !          17164: *
        !          17165: *      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
        !          17166: *
        !          17167: ICBL2  MOV  XR,DNAMP         SET NEW POINTER
        !          17168:        SUB  *ICSI$,XR        POINT BACK TO START OF BLOCK
        !          17169:        MOV  =B$ICL,(XR)      STORE TYPE WORD
        !          17170:        STI  ICVAL(XR)        STORE INTEGER VALUE IN ICBLK
        !          17171:        EXI                   RETURN TO ICBLD CALLER
        !          17172: *
        !          17173: *      OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
        !          17174: *
        !          17175: ICBL3  ADI  INTV2            RESTORE VALUE
        !          17176:        MFI  XR               CONVERT TO SHORT INTEGER
        !          17177:        WTB  XR               CONVERT INTEGER TO OFFSET
        !          17178:        MOV  INTAB(XR),XR     POINT TO PRE-BUILT ICBLK
        !          17179:        EXI                   RETURN
        !          17180:        ENP                   END PROCEDURE ICBLD
        !          17181:        EJC
        !          17182: *
        !          17183: *      IDENT -- COMPARE TWO VALUES
        !          17184: *
        !          17185: *      IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
        !          17186: *      DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
        !          17187: *
        !          17188: *      (XR)                  FIRST ARGUMENT
        !          17189: *      (XL)                  SECOND ARGUMENT
        !          17190: *      JSR  IDENT            CALL TO COMPARE ARGUMENTS
        !          17191: *      PPM  LOC              TRANSFER LOC IF IDENT
        !          17192: *      (NORMAL RETURN IF DIFFER)
        !          17193: *      (XR,XL,WC,RA)         DESTROYED
        !          17194: *
        !          17195: IDENT  PRC  E,1              ENTRY POINT
        !          17196:        BEQ  XR,XL,IDEN7      JUMP IF SAME POINTER (IDENT)
        !          17197:        MOV  (XR),WC          ELSE LOAD ARG 1 TYPE WORD
        !          17198:        BNE  WC,(XL),IDEN1    DIFFER IF ARG 2 TYPE WORD DIFFER
        !          17199:        BEQ  WC,=B$SCL,IDEN2  JUMP IF STRINGS
        !          17200:        BEQ  WC,=B$ICL,IDEN4  JUMP IF INTEGERS
        !          17201: .IF    .CNRA
        !          17202: .ELSE
        !          17203:        BEQ  WC,=B$RCL,IDEN5  JUMP IF REALS
        !          17204: .FI
        !          17205:        BEQ  WC,=B$NML,IDEN6  JUMP IF NAMES
        !          17206: *
        !          17207: *      FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
        !          17208: *
        !          17209: *      MERGE HERE FOR DIFFER
        !          17210: *
        !          17211: IDEN1  EXI                   TAKE DIFFER EXIT
        !          17212: *
        !          17213: *      HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
        !          17214: *
        !          17215: IDEN2  MOV  SCLEN(XR),WC     LOAD ARG 1 LENGTH
        !          17216:        BNE  WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER
        !          17217:        CTW  WC,0             GET NUMBER OF WORDS IN STRINGS
        !          17218:        ADD  *SCHAR,XR        POINT TO CHARS OF ARG 1
        !          17219:        ADD  *SCHAR,XL        POINT TO CHARS OF ARG 2
        !          17220:        LCT  WC,WC            SET LOOP COUNTER
        !          17221: *
        !          17222: *      LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
        !          17223: *      SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
        !          17224: *
        !          17225: IDEN3  CNE  (XR),(XL),IDEN8  DIFFER IF CHARS DO NOT MATCH
        !          17226:        ICA  XR               ELSE BUMP ARG ONE POINTER
        !          17227:        ICA  XL               BUMP ARG TWO POINTER
        !          17228:        BCT  WC,IDEN3         LOOP BACK TILL ALL CHECKED
        !          17229:        EJC
        !          17230: *
        !          17231: *      IDENT (CONTINUED)
        !          17232: *
        !          17233: *      HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
        !          17234: *
        !          17235:        ZER  XL               CLEAR GARBAGE VALUE IN XL
        !          17236:        ZER  XR               CLEAR GARBAGE VALUE IN XR
        !          17237:        EXI  1                TAKE IDENT EXIT
        !          17238: *
        !          17239: *      HERE FOR INTEGERS, IDENT IF SAME VALUES
        !          17240: *
        !          17241: IDEN4  LDI  ICVAL(XR)        LOAD ARG 1
        !          17242:        SBI  ICVAL(XL)        SUBTRACT ARG 2 TO COMPARE
        !          17243:        IOV  IDEN1            DIFFER IF OVERFLOW
        !          17244:        INE  IDEN1            DIFFER IF RESULT IS NOT ZERO
        !          17245:        EXI  1                TAKE IDENT EXIT
        !          17246: .IF    .CNRA
        !          17247: .ELSE
        !          17248: *
        !          17249: *      HERE FOR REALS, IDENT IF SAME VALUES
        !          17250: *
        !          17251: IDEN5  LDR  RCVAL(XR)        LOAD ARG 1
        !          17252:        SBR  RCVAL(XL)        SUBTRACT ARG 2 TO COMPARE
        !          17253:        ROV  IDEN1            DIFFER IF OVERFLOW
        !          17254:        RNE  IDEN1            DIFFER IF RESULT IS NOT ZERO
        !          17255:        EXI  1                TAKE IDENT EXIT
        !          17256: .FI
        !          17257: *
        !          17258: *      HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
        !          17259: *
        !          17260: IDEN6  BNE  NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET
        !          17261:        BNE  NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE
        !          17262: *
        !          17263: *      MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
        !          17264: *
        !          17265: IDEN7  EXI  1                TAKE IDENT EXIT
        !          17266: *
        !          17267: *      HERE FOR DIFFER STRINGS
        !          17268: *
        !          17269: IDEN8  ZER  XR               CLEAR GARBAGE PTR IN XR
        !          17270:        ZER  XL               CLEAR GARBAGE PTR IN XL
        !          17271:        EXI                   RETURN TO CALLER (DIFFER)
        !          17272:        ENP                   END PROCEDURE IDENT
        !          17273:        EJC
        !          17274: *
        !          17275: *      INOUT - USED TO INITIALISE .INPUT .OUTPUT .TERMINAL
        !          17276: *
        !          17277: *      (XL)                  POINTER TO VBL NAME STRING
        !          17278: *      (WB)                  TRBLK TYPE (TRTYP FIELD)
        !          17279: *      JSR  INOUT            CALL TO PERFORM INITIALISATION
        !          17280: *      (WA,WC)               DESTROYED
        !          17281: *
        !          17282: *      NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
        !          17283: *      POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
        !          17284: *      CASE FOR ORDINARY VARIABLES.
        !          17285: *
        !          17286: INOUT  PRC  E,0              ENTRY POINT
        !          17287:        MOV  WB,-(XS)         STACK TRBLK TYPE
        !          17288:        MOV  SCLEN(XL),WA     GET NAME LENGTH
        !          17289:        ZER  WB               POINT TO START OF NAME
        !          17290:        JSR  SBSTR            BUILD A PROPER SCBLK
        !          17291:        JSR  GTNVR            FIND OR BUILD VRBLK
        !          17292:        PPM                   NO ERROR RETURN
        !          17293:        MOV  XR,WC            SAVE VRBLK POINTER
        !          17294:        MOV  (XS)+,WB         GET TRTYP FIELD
        !          17295:        ZER  XL               ZERO TRTRI
        !          17296:        MOV  VRSVP(XR),XR     GET SVBLK POINTER
        !          17297:        JSR  TRBLD            BUILD TRBLK
        !          17298:        MOV  WC,XL            RECALL VRBLK POINTER
        !          17299:        MOV  *VRVAL,WA        OFFSET TO VALUE FIELD
        !          17300:        JSR  TRCHN            PUT TRBLK IN TRACE CHAIN
        !          17301:        PPM                   CANT FAIL
        !          17302:        EXI                   RETURN TO CALLER
        !          17303:        ENP                   END PROCEDURE INOUT
        !          17304:        EJC
        !          17305: .IF    .CNBF
        !          17306: .ELSE
        !          17307: *
        !          17308: *      INSBF -- INSERT STRING IN BUFFER
        !          17309: *
        !          17310: *      THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
        !          17311: *      CONTENTS OF A GIVEN STRING.  IF THE LENGTH OF THE
        !          17312: *      SECTION TO BE REPLACED DIFFERS FROM THAT OF THE
        !          17313: *      GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
        !          17314: *      THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
        !          17315: *      DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
        !          17316: *
        !          17317: *      (XR)                  POINTER TO BCBLK
        !          17318: *      (XL)                  OBJECT WHICH IS STRING CONVERTIBLE
        !          17319: *      (WA)                  OFFSET OF START OF INSERT IN (XR)
        !          17320: *      (WB)                  LENGTH OF SECTION IN (XR) REPLACED
        !          17321: *      JSR  INSBF            CALL TO INSERT CHARACTERS IN BUFFER
        !          17322: *      PPM  LOC              ERROR IF (XR) NOT CONVERTIBLE
        !          17323: *      PPM  LOC              FAIL IF INSERT NOT POSSIBLE
        !          17324: *      (XL,WA,WB,WC)         DESTROYED
        !          17325: *
        !          17326: *      THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
        !          17327: *      OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
        !          17328: *      DEFINED END OF THE BUFFER AS GIVEN.
        !          17329: *
        !          17330: INSBF  PRC  E,2              ENTRY POINT
        !          17331:        MOV  WA,INSSA         SAVE ENTRY WA
        !          17332:        MOV  WB,INSSB         SAVE ENTRY WB
        !          17333:        ADD  WB,WA            ADD TO GET OFFSET PAST REPLACE PART
        !          17334:        MOV  WA,INSAB         SAVE WA+WB
        !          17335:        MOV  BCLEN(XR),WC     GET CURRENT DEFINED LENGTH
        !          17336:        BGT  INSSA,WC,INS07   FAIL IF START OFFSET TOO BIG
        !          17337:        BGT  WA,WC,INS07      FAIL IF FINAL OFFSET TOO BIG
        !          17338:        MOV  XR,-(XS)         SAVE BCBLK PTR
        !          17339:        MOV  XL,-(XS)         STACK STRING POINTER FOR GTSTG
        !          17340:        JSR  GTSTG            CALL TO CONVERT TO STRING
        !          17341:        PPM  INS06            TAKE STRING CONVERT ERR EXIT
        !          17342:        MOV  XR,XL            SAVE STRING PTR
        !          17343:        MOV  (XS)+,XR         RESTORE BCBLK PTR
        !          17344:        MOV  XR,INSBC         BCBLK PTR - NO DANGER OF GARB COLLN
        !          17345:        MOV  BCBUF(XR),XR     POINT TO BFBLK
        !          17346:        MOV  XR,INSBB         BFBLK PTR - NO DANGER OF GARB COLLN
        !          17347:        ADD  WC,WA            ADD BUFFER LEN TO STRING LEN
        !          17348:        SUB  INSSB,WA         BIAS OUT COMPONENT BEING REPLACED
        !          17349:        BGT  WA,BFALC(XR),INS07 FAIL IF RESULT EXCEEDS ALLOCATION
        !          17350:        MOV  INSBC,XR         RESTORE BCBLK PTR
        !          17351:        MOV  WC,WA            GET BUFFER LENGTH
        !          17352:        SUB  INSAB,WA         SUBTRACT TO GET SHIFT LENGTH
        !          17353:        ADD  SCLEN(XL),WC     ADD LENGTH OF NEW
        !          17354:        SUB  INSSB,WC         SUBTRACT OLD TO GET TOTAL NEW LEN
        !          17355:        MOV  BCLEN(XR),WB     GET OLD BCLEN
        !          17356:        MOV  WC,BCLEN(XR)     STUFF NEW LENGTH
        !          17357:        MOV  INSBB,XR         POINT TO BFBLK
        !          17358:        MOV  XL,-(XS)         SAVE SCBLK PTR
        !          17359:        BZE  WA,INS02         SKIP SHIFT IF NOTHING TO DO
        !          17360:        BEQ  INSSB,SCLEN(XL),INS02 SKIP SHIFT IF LENGTHS MATCH
        !          17361:        BLO  INSSB,SCLEN(XL),INS01 BRN IF SHIFT IS FOR MORE ROOM
        !          17362:        EJC
        !          17363: *
        !          17364: *      INSBF (CONTINUED)
        !          17365: *
        !          17366: *      WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
        !          17367: *      THE BUFFER.  (THE STRING LENGTH IS SMALLER THAN THE
        !          17368: *      SEGMENT BEING REPLACED). REGISTERS ARE SET AS -
        !          17369: *
        !          17370: *      (WA)                  MOVE (SHIFT DOWN) LENGTH
        !          17371: *      (WB)                  OLD BCLEN
        !          17372: *      (WC)                  NEW BCLEN
        !          17373: *      (XR)                  BFBLK PTR
        !          17374: *      (XL),(XS)             SCBLK PTR
        !          17375: *
        !          17376:        MOV  INSSA,WB         GET OFFSET TO INSERT
        !          17377:        ADD  SCLEN(XL),WB     ADD INSERT LENGTH TO GET DEST OFF
        !          17378:        MOV  XR,XL            MAKE COPY
        !          17379:        PLC  XL,INSAB         PREPARE SOURCE FOR MOVE
        !          17380:        PSC  XR,WB            PREPARE DESTINATION REG FOR MOVE
        !          17381:        MVC                   MOVE EM OUT
        !          17382:        BRN  INS02            BRANCH TO PAD
        !          17383: *
        !          17384: *      WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
        !          17385: *      THE BUFFER.  (THE STRING LENGTH IS LARGER THAN THE
        !          17386: *      SEGMENT BEING REPLACED.)
        !          17387: *
        !          17388: INS01  MOV  XR,XL            COPY BFBLK PTR
        !          17389:        PLC  XL,WB            SET SOURCE REG FOR MOVE BACKWARDS
        !          17390:        PSC  XR,WC            SET DESTINATION PTR FOR MOVE
        !          17391:        MCB                   MOVE BACKWARDS (POSSIBLE OVERLAP)
        !          17392: *
        !          17393: *      MERGE HERE AFTER POSSIBLE MOVE TO ADJUST ZERO FILL AT END
        !          17394: *
        !          17395: INS02  MOV  (XS)+,XL         RESTORE SCBLK PTR
        !          17396:        MOV  WC,WA            COPY NEW BUFFER END
        !          17397:        CTB  WA,0             ROUND OUT
        !          17398:        BTC  WA               CONVERT TO CHAR COUNT
        !          17399:        SUB  WC,WA            SUBTRACT TO GET REMAINDER
        !          17400:        BZE  WA,INS04         NO PAD IF ALREADY EVEN BOUNDARY
        !          17401:        MOV  INSBB,XR         POINT TO BFBLK
        !          17402:        PSC  XR,WC            PREPARE TO PAD
        !          17403:        ZER  WB               CLEAR WB
        !          17404:        LCT  WA,WA            LOAD LOOP COUNT
        !          17405:        EJC
        !          17406: *
        !          17407: *      INSBF (CONTINUED)
        !          17408: *
        !          17409: *      LOOP HERE TO STUFF PAD CHARACTERS
        !          17410: *
        !          17411: INS03  SCH  WB,(XR)+         STUFF ZERO PAD
        !          17412:        BCT  WA,INS03         BRANCH FOR MORE
        !          17413: *
        !          17414: *      MERGE HERE WHEN PADDING OK.  NOW COPY IN THE INSERT
        !          17415: *      STRING TO THE HOLE.
        !          17416: *
        !          17417: INS04  MOV  INSBB,XR         POINT TO BFBLK
        !          17418:        MOV  SCLEN(XL),WA     GET MOVE LENGTH
        !          17419:        BZE  WA,INS05         SKIP IF NO CHARS TO INSERT
        !          17420:        PLC  XL               PREPARE TO COPY FROM FIRST CHAR
        !          17421:        PSC  XR,INSSA         PREPARE TO STORE IN HOLE
        !          17422:        MVC                   COPY THE CHARACTERS
        !          17423: *
        !          17424: *      SUCCESSFUL RETURN
        !          17425: *
        !          17426: INS05  MOV  INSBC,XR         RESTORE ENTRY XR
        !          17427:        ZER  XL               CLEAR GARBAGE CHAR POINTER
        !          17428:        EXI                   RETURN TO CALLER
        !          17429: *
        !          17430: *      HERE TO TAKE STRING CONVERT ERROR EXIT
        !          17431: *
        !          17432: INS06  ICA  XS               DISCARD UNWANTED STACK TOP
        !          17433:        EXI  1                ALTERNATE EXIT
        !          17434: *
        !          17435: *      HERE FOR INVALID OFFSET OR LENGTH
        !          17436: *
        !          17437: INS07  EXI  2                ALTERNATE EXIT
        !          17438:        ENP                   END PROCEDURE INSBF
        !          17439:        EJC
        !          17440: .FI
        !          17441: *      IOFTG -- GET IOTAG
        !          17442: *
        !          17443: *      USED TO FIND THE IOTAG (IF ANY) CORRESPONDING TO THE
        !          17444: *      FILETAG ARGUMENT.
        !          17445: *
        !          17446: *      -(XS)                 FILETAG ARGUMENT
        !          17447: *      JSR  IOFTG            CALL TO FIND IOTAG
        !          17448: *      PPM  LOC              ARG IS AN UNSUITABLE FILETAG
        !          17449: *      (XS)                  POPPED
        !          17450: *      (XL)                  PTR TO FILETAG SCBLK
        !          17451: *      (XR)                  PTR TO TRTIO TRACE BLK OR ZERO
        !          17452: *      (WA)                  IOTAG OR ZERO
        !          17453: *      (WB)                  PTR TO FILETAG VRBLK
        !          17454: *      (WC)                  VALUE/0 FOR INTEGER/STRING FILETAG
        !          17455: *
        !          17456: IOFTG  PRC  N,1              ENTRY POINT
        !          17457:        JSR  GTSTG            GET ARG AS STRING
        !          17458:        PPM  IOFT4            FAIL
        !          17459:        MOV  XR,XL            COPY STRING PTR
        !          17460:        MOV  XR,-(XS)         STACK STRING
        !          17461:        JSR  GTSMI            TRY CONVERSION TO INTEGER
        !          17462:        PPM  IOFT5            SKIP IF CANT
        !          17463:        PPM  IOFT5            SKIP IF CANT
        !          17464: *
        !          17465: *      MERGE WITH WC SET UP
        !          17466: *
        !          17467: IOFT1  MOV  WC,WB            KEEP INTEGER OR ZERO
        !          17468:        MOV  XL,XR            FILETAG STRING TO XR FOR GTNVR CALL
        !          17469:        JSR  GTNVR            FIND VRBLK
        !          17470:        PPM  IOFT4            SKIP IF NULL STRING
        !          17471:        MOV  XL,-(XS)         KEEP SCBLK PTR
        !          17472:        ZER  XL               IN CASE NO TRTIO BLK FOUND
        !          17473:        MOV  WB,WC            KEEP INTEGER OR ZERO
        !          17474:        MOV  XR,WB            COPY VRBLK PTR FOR RETURN
        !          17475:        ZER  WA               IN CASE NO TRBLK FOUND
        !          17476: *
        !          17477: *      LOOP TO FIND FILE ARG1 TRBLK
        !          17478: *
        !          17479: IOFT2  MOV  VRVAL(XR),XR     GET POSSIBLE TRBLK PTR
        !          17480:        BNE  (XR),=B$TRT,IOFT3 SKIP IF END OF CHAIN
        !          17481:        BNE  TRTYP(XR),=TRTIO,IOFT2 LOOP IF NOT FILETAG TRBLK
        !          17482:        MOV  TRTAG(XR),WA     GET IOTAG OR 0
        !          17483:        MOV  XR,XL            TRTIO BLK PTR
        !          17484: *
        !          17485: *      RETURN POINT
        !          17486: *
        !          17487: IOFT3  MOV  XL,XR            TRTIO BLK PTR OR 0
        !          17488:        MOV  (XS)+,XL         RECOVER SCBLK PTR
        !          17489:        EXI                   SUCCESSFUL RETURN
        !          17490: *
        !          17491: *      FAIL RETURN
        !          17492: *
        !          17493: IOFT4  EXI  1                FAIL
        !          17494:        EJC
        !          17495: *
        !          17496: *      NON NUMERIC FILETAG
        !          17497: *
        !          17498: IOFT5  ZER  WC               NOTE NON NUMERIC
        !          17499:        BRN  IOFT1            MERGE
        !          17500:        ENP                   END PROCEDURE IOFTG
        !          17501:        EJC
        !          17502: *
        !          17503: *      IOPUT -- PROCESS INPUT AND OUTPUT ARGUMENTS
        !          17504: *
        !          17505: *      IOPUT CHECKS THE ARGUMENTS OF INPUT AND OUTPUT CALLS,
        !          17506: *      SETS UP THE REQUIRED ASSOCIATIONS AND CALLS SYSIO TO
        !          17507: *      OPEN THE REQUESTED FILES.
        !          17508: *
        !          17509: *      -(XS)                 1ST ARG (VBL TO BE ASSOCIATED)
        !          17510: *      -(XS)                 2ND ARG (FILETAG)
        !          17511: *      -(XS)                 3RD ARG (FILEPROPS)
        !          17512: *      (WB)                  0 FOR INPUT, 2 FOR OUTPUT ASSOC.
        !          17513: *      JSR  IOPUT            CALL FOR INPUT/OUTPUT ASSOCIATION
        !          17514: *      PPM  LOC              3RD ARG NOT A STRING
        !          17515: *      PPM  LOC              2ND ARG NOT A SUITABLE FILETAG
        !          17516: *      PPM  LOC              1ST ARG NOT A SUITABLE NAME
        !          17517: *      PPM  LOC              FAIL RETURN
        !          17518: *      (XS)                  POPPED
        !          17519: *      (XL,XR,WA,WB,WC)      DESTROYED
        !          17520: *
        !          17521:        EJC
        !          17522: *      FIRST ARG NAME
        !          17523: *      I      I
        !          17524: *      +------+
        !          17525: *      I      I-----+
        !          17526: *      +------+     V
        !          17527: *      I      I   +----------------+
        !          17528: *                 I     =B$TRT     I
        !          17529: *                 +----------------+
        !          17530: *                 I =TRTIN/=TRTOU  I
        !          17531: *                 +----------------+
        !          17532: *                 I VALUE OR TRCHN +
        !          17533: *                 +----------------+
        !          17534: *           TRTER I                I-----+
        !          17535: *                 +----------------+     V
        !          17536: *           TRTRI I        0       I   +------+
        !          17537: *                 +----------------+   I      I SVBLK
        !          17538: *                  I/O TRACE BLOCK     +------+
        !          17539: *
        !          17540: *      1. ASSOCIATION TO STANDARD FILES.
        !          17541: *
        !          17542: *      FIRST ARG NAME                      FILETAG VRBLK
        !          17543: *      I      I                              I      I
        !          17544: *      +------+  LK1                         +------+ LK2
        !          17545: *      I      I---+                  +---+   I      I---+
        !          17546: *      +------+   V                  I   V   +------+   V
        !          17547: *      I      I  +----------------+  I  +----------------+
        !          17548: *                I     =B$TRT     I  I  I     =B$TRT     I
        !          17549: *                +----------------+  I  +----------------+
        !          17550: *                I =TRTIN/=TRTOU  I  I  I     =TRTIO     I
        !          17551: *                +----------------+  I  +----------------+
        !          17552: *                I VALUE OR TRCHN I  I  I VALUE OR TRCHN I
        !          17553: *                +----------------+  I  +----------------+
        !          17554: *          TRTER I       0        I  I  I   0 OR IOTAG   I TRTAG
        !          17555: *                +----------------+  I  +----------------+
        !          17556: *          TRTRI I                I--+  I        0       I TRTRI
        !          17557: *                +----------------+     +----------------+
        !          17558: *                 I/O TRACE BLOCK           TRTIO BLOCK
        !          17559: *
        !          17560: *      2. REGULAR CASE.
        !          17561: *
        !          17562: *      THE STRUCTURES BUILT FOR I/O ASSOCIATIONS ARE AS SHOWN
        !          17563: *      ABOVE. A TRACE BLOCK CHAIN (TRCHN) MAY HOLD ANY OR ALL
        !          17564: *      OF THE TYPES, =TRTIN, =TRTOU, =TRTIO, BUT NOT MORE THAN
        !          17565: *      ONE BLOCK OF ANY GIVEN TYPE. CASES ARE -
        !          17566: *      1. NO FILETAG OR IOTAG IS USED FOR ASSOCIATING STANDARD
        !          17567: *         FILES (SYSRD, SYSPR, TERMINAL). THE I/O TRACE BLOCK
        !          17568: *         IS DISTINGUISHED BY A NON-NULL TRTER FIELD POINTING
        !          17569: *         TO THE RELEVANT SVBLK (V$INP, V$OUP, V$TER) AND A
        !          17570: *         ZERO TRTRI FIELD. FOR TERMINAL, TRBLKS OF BOTH
        !          17571: *         INPUT AND OUTPUT TYPE ARE CHAINED FROM THE FIRST ARG
        !          17572: *         VIA THE TRCHN FIELD.
        !          17573: *      2. THE I/O TRACE BLOCK FOR THE REGULAR CASE HAS A ZERO
        !          17574: *         TRTER FIELD AND A POINTER TO A TRTIO BLOCK IS IN
        !          17575: *         THE TRTRI FIELD. THE FILETAG MUST BE A NATURAL
        !          17576: *         VARIABLE AND THE TRTIO TRACE BLOCK ATTACHED TO IT
        !          17577: *         HOLDS THE IOTAG.
        !          17578: *      THE EFFECT OF ENDFILE() IS TO CLEAR IOTAG AND BREAK LK2.
        !          17579: *      THE EFFECT OF DETACH() IS TO BREAK LK1.
        !          17580:        EJC
        !          17581: IOPUT  PRC  N,4              ENTRY POINT
        !          17582:        MOV  WB,IOPWB         KEEP ASSOCIATION TYPE FLAG
        !          17583:        JSR  GTSTG            CONVERT THIRD ARG TO STRING
        !          17584:        PPM  IOP12            FAIL THIRD ARG
        !          17585:        BNZ  WA,IOP01         SKIP IF NON NULL
        !          17586:        ZER  XR               NOTE NULL ARG
        !          17587: *
        !          17588: *      PROCESS SECOND ARG
        !          17589: *
        !          17590: IOP01  MOV  XR,R$IOR         KEEP FILEPROPS STRING PTR
        !          17591:        JSR  IOFTG            CHECK SECOND ARG
        !          17592:        PPM  IOP07            FAIL SECOND ARG
        !          17593:        MOV  XL,R$IOL         KEEP SCBLK FOR FILETAG
        !          17594:        MOV  XR,R$IOT         KEEP TRTIO BLK PTR
        !          17595:        MOV  WA,IOPWA         KEEP IOTAG
        !          17596:        MOV  WB,IOPVR         KEEP FILETAG VRBLK PTR
        !          17597:        MOV  WC,IOPWC         KEEP FILETAG VALUE
        !          17598:        MOV  (XS)+,XR         GET FIRST ARG OFF STACK
        !          17599:        JSR  GTVAR            CONVERT TO NAME
        !          17600:        PPM  IOP13            FAIL FIRST ARG
        !          17601:        MOV  XL,R$IO1         SAVE FIRST ARG NAME BASE ADRS
        !          17602:        MOV  WA,IOPNF         SAVE FIRST ARG NAME OFFSET
        !          17603:        MOV  WB,XR            FILETAG VRBLK PTR
        !          17604:        BNZ  VRLEN(XR),IOP02  NOT SPECIAL CASE IF NOT SYS NAME
        !          17605:        MOV  VRSVP(XR),WC     GET SVBLK PTR
        !          17606:        MOV  =TRTIN,WB        IN CASE .INPUT
        !          17607:        BEQ  WC,=V$INP,IOP06  JUMP IF .INPUT
        !          17608:        MOV  =TRTOU,WB        IN CASE .OUTPUT OR .TERMINAL
        !          17609:        BEQ  WC,=V$OUP,IOP08  JUMP IF .OUTPUT
        !          17610:        BEQ  WC,=V$TER,IOP09  JUMP IF .TERMINAL
        !          17611:        EJC
        !          17612: *
        !          17613: *      NORMAL CASE
        !          17614: *
        !          17615: IOP02  BNZ  R$IOT,IOP03      SKIP IF TRTIO BLK EXISTS ALREADY
        !          17616:        MOV  =TRTIO,WB        TRACE BLOCK TYPE WORD
        !          17617:        ZER  XR               ZERO IOTAG WORD
        !          17618:        ZER  XL               ZERO TRTRI FIELD
        !          17619:        JSR  TRBLD            BUILD TRTIO TRBLK
        !          17620:        MOV  XR,R$IOT         SAVE TRTIO BLK PTR
        !          17621:        MOV  IOPVR,XL         GET FILETAG VRBLK
        !          17622:        MOV  *VRVAL,WA        OFFSET TO VALUE FIELD
        !          17623:        JSR  TRCHN            PLACE IN TRBLK CHAIN FOR FILETAG
        !          17624:        PPM                   UNUSED RETURN
        !          17625: *
        !          17626: *      MERGE TO BUILD TRBLK FOR FIRST ARG
        !          17627: *
        !          17628: IOP03  MOV  =TRTIN,WB        IN CASE INPUT
        !          17629:        BZE  IOPWB,IOP04      SKIP IF SO
        !          17630:        MOV  =TRTOU,WB        IN CASE OUTPUT
        !          17631: *
        !          17632: *      BUILD TRACE BLOCK
        !          17633: *
        !          17634: IOP04  ICV  IOPWB            NOTE NOT STANDARD I/O FILE
        !          17635:        MOV  R$IOT,XL         TRTIO BLK PTR TO TRTRI FIELD
        !          17636:        ZER  XR               ZERO TRTER FIELD
        !          17637:        JSR  TRBLD            BUILD I/O TRACE BLOCK
        !          17638:        MOV  R$IO1,XL         ASSOCIATED VBL NAME BASE
        !          17639:        MOV  IOPNF,WA         NAME OFFSET
        !          17640:        JSR  TRCHN            UPDATE TRACE CHAIN FOR FIRST ARG
        !          17641:        PPM                   UNUSED RETURN
        !          17642: *
        !          17643: *      PREPARE FOR AND MAKE SYSIO CALL
        !          17644: *
        !          17645: IOP05  MOV  R$IOL,XL         FILETAG SCBLK PTR
        !          17646:        MOV  R$IOR,XR         FILEPROPS SCBLK PTR
        !          17647:        MOV  IOPWA,WA         IOTAG OR ZERO
        !          17648:        MOV  IOPWB,WB         ASSOCIATION TYPE NUMBER
        !          17649:        MOV  IOPWC,WC         POSSIBLE FILETAG VALUE
        !          17650:        JSR  SYSIO            CALL SYSTEM ROUTINE TO OPEN FILE
        !          17651:        PPM  IOP14            FAIL RETURN
        !          17652:        PPM  EROSI            ERROR RETURN
        !          17653:        MOV  R$IOT,XL         TRTIO POINTER
        !          17654:        BZE  XL,IOP11         DONE IF ZERO
        !          17655:        MOV  WA,TRTAG(XL)     STORE RETURNED IOTAG
        !          17656:        BRN  IOP11            SUCCEED
        !          17657:        EJC
        !          17658: *
        !          17659: *      SPECIAL CASE OF .INPUT
        !          17660: *
        !          17661: IOP06  BZE  IOPWB,IOP09      FAIL OUTPUT(.X,.INPUT)
        !          17662: *
        !          17663: *      BAD FILETAG
        !          17664: *
        !          17665: IOP07  EXI  2                ERRONEOUS SECOND ARG
        !          17666: *
        !          17667: *      SPECIAL CASE OF .OUTPUT
        !          17668: *
        !          17669: IOP08  BZE  IOPWB,IOP07      FAIL INPUT(.X,.OUTPUT)
        !          17670: *
        !          17671: *      SPECIAL CASE OF .TERMINAL AND MERGE FOR OTHERS
        !          17672: *
        !          17673: IOP09  ZER  R$IOT            NOTE NO TRTIO BLOCK
        !          17674:        MOV  WC,XR            SVBLK PTR FOR TRTER FIELD
        !          17675:        ZER  XL               ZERO TRTRI FIELD
        !          17676:        JSR  TRBLD            BUILD TRBLK
        !          17677:        MOV  R$IO1,XL         ASSOCIATED VBL NAME BASE
        !          17678:        MOV  IOPNF,WA         NAME OFFSET
        !          17679:        JSR  TRCHN            UPDATE TRACE CHAIN FOR ARG 1
        !          17680:        PPM                   UNUSED RETURN
        !          17681:        BNE  TRTER(XR),=V$TER,IOP10 DONE UNLESS TERMINAL
        !          17682:        BNE  TRTYP(XR),=TRTOU,IOP10 DONE IF TERM. 2ND TIME ROUND
        !          17683:        MOV  =V$TER,WC        TRTER FIELD
        !          17684:        MOV  =TRTIN,WB        TRTYP FIELD
        !          17685:        BRN  IOP09            REPEAT LOOP FOR TERMINAL
        !          17686: *
        !          17687: *      CHECK SPECIAL CASES FOR NON-NULL THIRD ARGS
        !          17688: *
        !          17689: IOP10  ZER  IOPWA            NO IOTAG
        !          17690:        BNZ  R$IOR,IOP05      MERGE ONLY IF FILEPROPS NON-NULL
        !          17691: *
        !          17692: *      SUCCESS RETURN
        !          17693: *
        !          17694: IOP11  ZER  R$IO1            CLEAR GARBAGE
        !          17695:        ZER  R$IOL
        !          17696:        ZER  R$IOR
        !          17697:        ZER  R$IOT
        !          17698:        EXI                   RETURN TO CALLER
        !          17699: *
        !          17700: *      ERROR RETURNS
        !          17701: *
        !          17702: IOP12  EXI  1                ERRONEOUS THIRD ARG
        !          17703: *
        !          17704: IOP13  EXI  3                ERRONEOUS FIRST ARG
        !          17705: *
        !          17706: IOP14  EXI  4                FAIL RETURN FROM SYSIO
        !          17707:        ENP                   END PROCEDURE IOPUT
        !          17708:        EJC
        !          17709: *
        !          17710: *      KTREX -- EXECUTE KEYWORD TRACE
        !          17711: *
        !          17712: *      KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
        !          17713: *      INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
        !          17714: *
        !          17715: *      (XL)                  PTR TO TRBLK (OR 0 IF UNTRACED)
        !          17716: *      JSR  KTREX            CALL TO EXECUTE KEYWORD TRACE
        !          17717: *      (XL,WA,WB,WC)         DESTROYED
        !          17718: *      (RA)                  DESTROYED
        !          17719: *
        !          17720: KTREX  PRC  R,0              ENTRY POINT (RECURSIVE)
        !          17721:        BZE  XL,KTRX3         IMMEDIATE EXIT IF KEYWORD UNTRACED
        !          17722:        BZE  KVTRA,KTRX3      IMMEDIATE EXIT IF TRACE = 0
        !          17723:        DCV  KVTRA            ELSE DECREMENT TRACE
        !          17724:        MOV  XR,-(XS)         SAVE XR
        !          17725:        MOV  XL,XR            COPY TRBLK POINTER
        !          17726:        MOV  TRKVR(XR),XL     LOAD VRBLK POINTER (NMBAS)
        !          17727:        MOV  *VRVAL,WA        SET NAME OFFSET
        !          17728:        BZE  TRFNC(XR),KTRX1  JUMP IF PRINT TRACE
        !          17729:        JSR  TRXEQ            ELSE EXECUTE FULL TRACE
        !          17730:        BRN  KTRX2            AND JUMP TO EXIT
        !          17731: *
        !          17732: *      HERE FOR PRINT TRACE
        !          17733: *
        !          17734: KTRX1  MOV  XL,-(XS)         STACK VRBLK PTR FOR KWNAM
        !          17735:        MOV  WA,-(XS)         STACK OFFSET FOR KWNAM
        !          17736:        JSR  PRTSN            PRINT STATEMENT NUMBER
        !          17737:        MOV  =CH$AM,WA        LOAD AMPERSAND
        !          17738:        JSR  PRTCH            PRINT AMPERSAND
        !          17739:        JSR  PRTNM            PRINT KEYWORD NAME
        !          17740:        MOV  =TMBEB,XR        POINT TO BLANK-EQUAL-BLANK
        !          17741:        JSR  PRTST            PRINT BLANK-EQUAL-BLANK
        !          17742:        JSR  KWNAM            GET KEYWORD PSEUDO-VARIABLE NAME
        !          17743:        MOV  XR,DNAMP         RESET PTR TO DELETE KVBLK
        !          17744:        JSR  ACESS            GET KEYWORD VALUE
        !          17745:        PPM                   FAILURE IS IMPOSSIBLE
        !          17746:        JSR  PRTVF            PRINT KEYWORD VALUE
        !          17747: *
        !          17748: *      HERE TO EXIT AFTER COMPLETING TRACE
        !          17749: *
        !          17750: KTRX2  MOV  (XS)+,XR         RESTORE ENTRY XR
        !          17751: *
        !          17752: *      MERGE HERE TO EXIT IF NO TRACE REQUIRED
        !          17753: *
        !          17754: KTRX3  EXI                   RETURN TO KTREX CALLER
        !          17755:        ENP                   END PROCEDURE KTREX
        !          17756:        EJC
        !          17757: *
        !          17758: *      KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
        !          17759: *
        !          17760: *      1(XS)                 NAME BASE FOR VRBLK
        !          17761: *      0(XS)                 OFFSET (SHOULD BE *VRVAL)
        !          17762: *      JSR  KWNAM            CALL TO GET PSEUDO-VARIABLE NAME
        !          17763: *      (XS)                  POPPED TWICE
        !          17764: *      (XL,WA)               RESULTING PSEUDO-VARIABLE NAME
        !          17765: *      (XR,WA,WB)            DESTROYED
        !          17766: *
        !          17767: KWNAM  PRC  N,0              ENTRY POINT
        !          17768:        ICA  XS               IGNORE NAME OFFSET
        !          17769:        MOV  (XS)+,XR         LOAD NAME BASE
        !          17770:        BGE  XR,STATE,KWNM1   JUMP IF NOT NATURAL VARIABLE NAME
        !          17771:        BNZ  VRLEN(XR),KWNM1  ERROR IF NOT SYSTEM VARIABLE
        !          17772:        MOV  VRSVP(XR),XR     ELSE POINT TO SVBLK
        !          17773:        MOV  SVBIT(XR),WA     LOAD BIT MASK
        !          17774:        ANB  BTKNM,WA         AND WITH KEYWORD BIT
        !          17775:        ZRB  WA,KWNM1         ERROR IF NO KEYWORD ASSOCIATION
        !          17776:        MOV  SVLEN(XR),WA     ELSE LOAD NAME LENGTH IN CHARACTERS
        !          17777:        CTB  WA,SVCHS         COMPUTE OFFSET TO FIELD WE WANT
        !          17778:        ADD  WA,XR            POINT TO SVKNM FIELD
        !          17779:        MOV  (XR),WB          LOAD SVKNM VALUE
        !          17780:        MOV  *KVSI$,WA        SET SIZE OF KVBLK
        !          17781:        JSR  ALLOC            ALLOCATE KVBLK
        !          17782:        MOV  =B$KVT,(XR)      STORE TYPE WORD
        !          17783:        MOV  WB,KVNUM(XR)     STORE KEYWORD NUMBER
        !          17784:        MOV  =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER
        !          17785:        MOV  XR,XL            COPY KVBLK POINTER
        !          17786:        MOV  *KVVAR,WA        SET PROPER OFFSET
        !          17787:        EXI                   RETURN TO KVNAM CALLER
        !          17788: *
        !          17789: *      HERE IF NOT KEYWORD NAME
        !          17790: *
        !          17791: KWNM1  ERB  230,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD
        !          17792:        ENP                   END PROCEDURE KWNAM
        !          17793:        EJC
        !          17794: *
        !          17795: *      LCOMP-- COMPARE TWO STRINGS LEXICALLY
        !          17796: *
        !          17797: *      1(XS)                 FIRST ARGUMENT
        !          17798: *      0(XS)                 SECOND ARGUMENT
        !          17799: *      JSR  LCOMP            CALL TO COMPARE ARUMENTS
        !          17800: *      PPM  LOC              TRANSFER LOC FOR ARG1 NOT STRING
        !          17801: *      PPM  LOC              TRANSFER LOC FOR ARG2 NOT STRING
        !          17802: *      PPM  LOC              TRANSFER LOC IF ARG1 LLT ARG2
        !          17803: *      PPM  LOC              TRANSFER LOC IF ARG1 LEQ ARG2
        !          17804: *      PPM  LOC              TRANSFER LOC IF ARG1 LGT ARG2
        !          17805: *      (THE NORMAL RETURN IS NEVER TAKEN)
        !          17806: *      (XS)                  POPPED TWICE
        !          17807: *      (XR,XL)               DESTROYED
        !          17808: *      (WA,WB,WC,RA)         DESTROYED
        !          17809: *
        !          17810: LCOMP  PRC  N,5              ENTRY POINT
        !          17811:        JSR  GTSTG            CONVERT SECOND ARG TO STRING
        !          17812:        PPM  LCMP6            JUMP IF SECOND ARG NOT STRING
        !          17813:        MOV  XR,XL            ELSE SAVE POINTER
        !          17814:        MOV  WA,WB            AND LENGTH
        !          17815:        JSR  GTSTG            CONVERT FIRST ARGUMENT TO STRING
        !          17816:        PPM  LCMP5            JUMP IF NOT STRING
        !          17817:        MOV  WA,WC            SAVE ARG 1 LENGTH
        !          17818:        PLC  XR               POINT TO CHARS OF ARG 1
        !          17819:        PLC  XL               POINT TO CHARS OF ARG 2
        !          17820:        BLO  WA,WB,LCMP0      JUMP IF ARG 1 LENGTH IS SMALLER
        !          17821:        MOV  WB,WA            ELSE SET ARG 2 LENGTH AS SMALLER
        !          17822: *
        !          17823: *      HERE WITH SMALLER LENGTH IN (WA)
        !          17824: *
        !          17825: LCMP0  BZE  WA,LCMP1         SKIP IF A NULL ARG
        !          17826:        CMC  LCMP4,LCMP3      COMPARE STRINGS, JUMP IF UNEQUAL
        !          17827: *
        !          17828: *      EQUAL STRINGS OR AT LEAST ONE NULL ARG
        !          17829: *
        !          17830: LCMP1  BNE  WB,WC,LCMP2      IF EQUAL, JUMP IF LENGTHS UNEQUAL
        !          17831:        EXI  4                ELSE IDENTICAL STRINGS, LEQ EXIT
        !          17832:        EJC
        !          17833: *
        !          17834: *      LCOMP (CONTINUED)
        !          17835: *
        !          17836: *      HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
        !          17837: *
        !          17838: LCMP2  BHI  WC,WB,LCMP4      JUMP IF ARG 1 LENGTH GT ARG 2 LENG
        !          17839: *
        !          17840: *      HERE IF FIRST ARG LLT SECOND ARG
        !          17841: *
        !          17842: LCMP3  EXI  3                TAKE LLT EXIT
        !          17843: *
        !          17844: *      HERE IF FIRST ARG LGT SECOND ARG
        !          17845: *
        !          17846: LCMP4  EXI  5                TAKE LGT EXIT
        !          17847: *
        !          17848: *      HERE IF FIRST ARG IS NOT A STRING
        !          17849: *
        !          17850: LCMP5  EXI  1                TAKE BAD FIRST ARG EXIT
        !          17851: *
        !          17852: *      HERE FOR SECOND ARG NOT A STRING
        !          17853: *
        !          17854: LCMP6  EXI  2                TAKE BAD SECOND ARG ERROR EXIT
        !          17855:        ENP                   END PROCEDURE LCOMP
        !          17856:        EJC
        !          17857: *
        !          17858: *      LISTR -- LIST SOURCE LINE
        !          17859: *
        !          17860: *      LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
        !          17861: *      COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
        !          17862: *
        !          17863: *      JSR  LISTR            CALL TO LIST LINE
        !          17864: *      (XR,XL,WA,WB,WC)      DESTROYED
        !          17865: *
        !          17866: *      GLOBAL LOCATIONS USED BY LISTR
        !          17867: *
        !          17868: *      ERLST                 IF LISTING ON ACCOUNT OF AN ERROR
        !          17869: *
        !          17870: *      LSTLC                 COUNT LINES ON CURRENT PAGE
        !          17871: *
        !          17872: *      LSTNP                 MAX NUMBER OF LINES/PAGE
        !          17873: *
        !          17874: *      LSTPF                 SET NON-ZERO IF THE CURRENT SOURCE
        !          17875: *                            LINE HAS BEEN LISTED, ELSE ZERO.
        !          17876: *
        !          17877: *      LSTPG                 COMPILER LISTING PAGE NUMBER
        !          17878: *
        !          17879: *      LSTSN                 SET IF STMNT NUM TO BE LISTED
        !          17880: *
        !          17881: *      R$CIM                 POINTER TO CURRENT INPUT LINE.
        !          17882: *
        !          17883: *      R$TTL                 TITLE FOR SOURCE LISTING
        !          17884: *
        !          17885: *      R$STL                 PTR TO SUB-TITLE STRING
        !          17886: *
        !          17887: *      ENTRY POINT
        !          17888: *
        !          17889: LISTR  PRC  E,0              ENTRY POINT
        !          17890:        MOV  STAGE,WA         GET COMPILER STAGE
        !          17891:        BEQ  WA,=STGIC,LIST0  LIST OK IF INITIAL COMPILE
        !          17892:        BEQ  WA,=STGCE,LIST0  LIST OK IF END LINE
        !          17893:        BRN  LIST4            ELSE NO LISTING OF SOURCE
        !          17894: *
        !          17895: *      HERE WHEN STAGE IS OK TO LIST
        !          17896: *
        !          17897: LIST0  BNZ  CNTTL,LIST5      JUMP IF -TITLE OR -STITL
        !          17898:        BNZ  LSTPF,LIST4      IMMEDIATE EXIT IF ALREADY LISTED
        !          17899:        BGE  LSTLC,LSTNP,LIST6 JUMP IF NO ROOM
        !          17900: *
        !          17901: *      HERE AFTER PRINTING TITLE (IF NEEDED)
        !          17902: *
        !          17903: LIST1  MOV  R$CIM,XR         LOAD POINTER TO CURRENT IMAGE
        !          17904:        PLC  XR               POINT TO CHARACTERS
        !          17905:        LCH  WA,(XR)          LOAD FIRST CHARACTER
        !          17906:        MOV  LSTSN,XR         LOAD STATEMENT NUMBER
        !          17907:        BZE  XR,LIST2         JUMP IF NO STATEMENT NUMBER
        !          17908:        MTI  XR               ELSE GET STMNT NUMBER AS INTEGER
        !          17909:        BEQ  WA,=CH$AS,LIST2  NO STMNT NUMBER LIST IF COMMENT
        !          17910:        BEQ  WA,=CH$MN,LIST2  NO STMNT NO. IF CONTROL CARD
        !          17911:        JSR  PRTIN            ELSE PRINT STATEMENT NUMBER
        !          17912:        ZER  LSTSN            AND CLEAR FOR NEXT TIME IN
        !          17913:        EJC
        !          17914: *
        !          17915: *      LISTR (CONTINUED)
        !          17916: *
        !          17917: *      MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
        !          17918: *
        !          17919: LIST2  MOV  =STNPD,PROFS     POINT PAST STATEMENT NUMBER
        !          17920:        MOV  R$CIM,XR         LOAD POINTER TO CURRENT IMAGE
        !          17921:        JSR  PRTSF            PRINT IT
        !          17922:        ICV  LSTLC            BUMP LINE COUNTER
        !          17923:        MNZ  LSTPF            SET FLAG FOR LINE PRINTED
        !          17924: *
        !          17925: *      MERGE HERE TO EXIT
        !          17926: *
        !          17927: LIST4  EXI                   RETURN TO LISTR CALLER
        !          17928: *
        !          17929: *      PRINT TITLE AFTER -TITLE OR -STITL CARD
        !          17930: *
        !          17931: LIST5  ZER  CNTTL            CLEAR FLAG
        !          17932: *
        !          17933: *      EJECT TO NEW PAGE AND LIST TITLE
        !          17934: *
        !          17935: LIST6  JSR  PRTPS            EJECT
        !          17936:        BNZ  PRLEN,LIST7      SKIP IF LISTING TO REGULAR PRINTER
        !          17937:        BEQ  R$TTL,=NULLS,LIST1 TERMINAL LISTING OMITS NULL TITLE
        !          17938: *
        !          17939: *      LIST TITLE
        !          17940: *
        !          17941: LIST7  JSR  LISTT            LIST TITLE
        !          17942:        BRN  LIST1            MERGE
        !          17943:        ENP                   END PROCEDURE LISTR
        !          17944:        EJC
        !          17945: *
        !          17946: *      LISTT -- LIST TITLE AND SUBTITLE
        !          17947: *
        !          17948: *      USED DURING COMPILATION TO PRINT PAGE HEADING
        !          17949: *
        !          17950: *      JSR  LISTT            CALL TO LIST TITLE
        !          17951: *      (XR,WA)               DESTROYED
        !          17952: *
        !          17953: LISTT  PRC  E,0              ENTRY POINT
        !          17954:        MOV  R$TTL,XR         POINT TO SOURCE LISTING TITLE
        !          17955:        JSR  PRTST            PRINT TITLE
        !          17956:        MOV  LSTPO,PROFS      SET OFFSET
        !          17957:        MOV  =LSTMS,XR        SET PAGE MESSAGE
        !          17958:        JSR  PRTST            PRINT PAGE MESSAGE
        !          17959:        ICV  LSTPG            BUMP PAGE NUMBER
        !          17960:        MTI  LSTPG            LOAD PAGE NUMBER AS INTEGER
        !          17961:        JSR  PRTIN            PRINT PAGE NUMBER
        !          17962:        JSR  PRTFH            TERMINATE TITLE LINE
        !          17963:        ADD  =NUM02,LSTLC     COUNT TITLE LINE AND BLANK LINE
        !          17964: *
        !          17965: *      PRINT SUB-TITLE (IF ANY)
        !          17966: *
        !          17967:        MOV  R$STL,XR         LOAD POINTER TO SUB-TITLE
        !          17968:        BZE  XR,LSTT1         JUMP IF NO SUB-TITLE
        !          17969:        JSR  PRTSF            ELSE PRINT SUB-TITLE
        !          17970:        ICV  LSTLC            BUMP LINE COUNT
        !          17971: *
        !          17972: *      RETURN POINT
        !          17973: *
        !          17974: LSTT1  JSR  PRTFH            PRINT A BLANK LINE
        !          17975:        EXI                   RETURN TO CALLER
        !          17976:        ENP                   END PROCEDURE LISTT
        !          17977:        EJC
        !          17978: *
        !          17979: *      NEXTS -- ACQUIRE NEXT SOURCE IMAGE
        !          17980: *
        !          17981: *      NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
        !          17982: *      TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
        !          17983: *      A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
        !          17984: *      IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
        !          17985: *
        !          17986: *      JSR  NEXTS            CALL TO ACQUIRE NEXT INPUT LINE
        !          17987: *      (XR,XL,WA,WB,WC)      DESTROYED
        !          17988: *
        !          17989: *      GLOBAL VALUES AFFECTED
        !          17990: *
        !          17991: *      R$CNI                 ON INPUT, NEXT IMAGE. ON
        !          17992: *                            EXIT RESET TO ZERO
        !          17993: *
        !          17994: *      R$CIM                 ON EXIT, SET TO POINT TO IMAGE
        !          17995: *
        !          17996: *      SCNIL                 INPUT IMAGE LENGTH ON EXIT
        !          17997: *
        !          17998: *      SCNSE                 RESET TO ZERO ON EXIT
        !          17999: *
        !          18000: *      LSTPF                 SET ON EXIT IF LINE IS LISTED
        !          18001: *
        !          18002: NEXTS  PRC  E,0              ENTRY POINT
        !          18003:        BZE  CSWLS,NXTS1      JUMP IF -NOLIST
        !          18004:        MOV  R$CIM,XR         POINT TO IMAGE
        !          18005:        BZE  XR,NXTS1         JUMP IF NO IMAGE
        !          18006:        PLC  XR               GET CHAR PTR
        !          18007:        LCH  WA,(XR)          GET FIRST CHAR
        !          18008:        BEQ  WA,=CH$MN,NXTS1  SKIP LISTING IF CONTROL CARD
        !          18009:        JSR  LISTR            LIST LINE
        !          18010: *
        !          18011: *      HERE AFTER POSSIBLE LISTING
        !          18012: *
        !          18013: NXTS1  MOV  R$CNI,XR         POINT TO NEXT IMAGE
        !          18014:        MOV  XR,R$CIM         SET AS NEXT IMAGE
        !          18015:        ZER  R$CNI            CLEAR NEXT IMAGE POINTER
        !          18016:        MOV  SCLEN(XR),WA     GET INPUT IMAGE LENGTH
        !          18017:        MOV  CSWIN,WB         GET MAX ALLOWABLE LENGTH
        !          18018:        BLO  WA,WB,NXTS2      SKIP IF NOT TOO LONG
        !          18019:        MOV  WB,WA            ELSE TRUNCATE
        !          18020: *
        !          18021: *      HERE WITH LENGTH IN (WA)
        !          18022: *
        !          18023: NXTS2  MOV  WA,SCNIL         USE AS RECORD LENGTH
        !          18024:        ZER  SCNSE            RESET SCNSE
        !          18025:        ZER  LSTPF            SET LINE NOT LISTED YET
        !          18026:        EXI                   RETURN TO NEXTS CALLER
        !          18027:        ENP                   END PROCEDURE NEXTS
        !          18028:        EJC
        !          18029: *
        !          18030: *      PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
        !          18031: *
        !          18032: *      THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
        !          18033: *      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
        !          18034: *      FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
        !          18035: *
        !          18036: *      (WA)                  PCODE FOR EXPRESSION ARG CASE
        !          18037: *      (WB)                  PCODE FOR INTEGER ARG CASE
        !          18038: *      JSR  PATIN            CALL TO BUILD PATTERN NODE
        !          18039: *      PPM  LOC              TRANSFER LOC FOR NOT INTEGER OR EXP
        !          18040: *      PPM  LOC              TRANSFER LOC FOR INT OUT OF RANGE
        !          18041: *      (XR)                  POINTER TO CONSTRUCTED NODE
        !          18042: *      (XL,WA,WB,WC,IA)      DESTROYED
        !          18043: *
        !          18044: PATIN  PRC  N,2              ENTRY POINT
        !          18045:        MOV  WA,XL            PRESERVE EXPRESSION ARG PCODE
        !          18046:        JSR  GTSMI            TRY TO CONVERT ARG AS SMALL INTEGER
        !          18047:        PPM  PTIN2            JUMP IF NOT INTEGER
        !          18048:        PPM  PTIN3            JUMP IF OUT OF RANGE
        !          18049: *
        !          18050: *      COMMON SUCCESSFUL EXIT POINT
        !          18051: *
        !          18052: PTIN1  JSR  PBILD            BUILD PATTERN NODE
        !          18053:        EXI                   RETURN TO CALLER
        !          18054: *
        !          18055: *      HERE IF ARGUMENT IS NOT AN INTEGER
        !          18056: *
        !          18057: PTIN2  MOV  XL,WB            COPY EXPR ARG CASE PCODE
        !          18058:        BLO  (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG
        !          18059:        EXI  1                ELSE TAKE ERROR EXIT FOR WRONG TYPE
        !          18060: *
        !          18061: *      HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
        !          18062: *
        !          18063: PTIN3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
        !          18064:        ENP                   END PROCEDURE PATIN
        !          18065:        EJC
        !          18066: *
        !          18067: *      PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
        !          18068: *               BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
        !          18069: *
        !          18070: *      THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
        !          18071: *      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
        !          18072: *      FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
        !          18073: *
        !          18074: *      0(XS)                 STRING ARGUMENT
        !          18075: *      (WB)                  PCODE FOR ONE CHAR ARGUMENT
        !          18076: *      (XL)                  PCODE FOR MULTI-CHAR ARGUMENT
        !          18077: *      (WC)                  PCODE FOR EXPRESSION ARGUMENT
        !          18078: *      JSR  PATST            CALL TO BUILD NODE
        !          18079: *      PPM  LOC              TRANSFER LOC IF NOT STRING OR EXPR
        !          18080: *      (XS)                  POPPED PAST STRING ARGUMENT
        !          18081: *      (XR)                  POINTER TO CONSTRUCTED NODE
        !          18082: *      (XL)                  DESTROYED
        !          18083: *      (WA,WB,WC,RA)         DESTROYED
        !          18084: *
        !          18085: *      NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
        !          18086: *      PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
        !          18087: *      FOR DETAILS OF THE FORM OF THIS CALL.
        !          18088: *
        !          18089: PATST  PRC  N,1              ENTRY POINT
        !          18090:        JSR  GTSTG            CONVERT ARGUMENT AS STRING
        !          18091:        PPM  PATS7            JUMP IF NOT STRING
        !          18092:        BNE  WA,=NUM01,PATS2  JUMP IF NOT ONE CHAR STRING
        !          18093: *
        !          18094: *      HERE FOR ONE CHAR STRING CASE
        !          18095: *
        !          18096:        BZE  WB,PATS2         TREAT AS MULTI-CHAR IF EVALS CALL
        !          18097:        PLC  XR               POINT TO CHARACTER
        !          18098:        LCH  XR,(XR)          LOAD CHARACTER
        !          18099: *
        !          18100: *      COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
        !          18101: *
        !          18102: PATS1  JSR  PBILD            CALL ROUTINE TO BUILD NODE
        !          18103:        EXI                   RETURN TO PATST CALLER
        !          18104:        EJC
        !          18105: *
        !          18106: *      PATST (CONTINUED)
        !          18107: *
        !          18108: *      HERE FOR MULTI-CHARACTER STRING CASE
        !          18109: *
        !          18110: PATS2  MOV  XL,-(XS)         SAVE MULTI-CHAR PCODE
        !          18111:        MOV  XR,-(XS)         SAVE STRING POINTER
        !          18112:        MOV  CTMSK,WC         LOAD CURRENT MASK BIT
        !          18113:        LSH  WC,1             SHIFT TO NEXT POSITION
        !          18114:        NZB  WC,PATS4         SKIP IF POSITION LEFT IN THIS TBL
        !          18115: *
        !          18116: *      HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
        !          18117: *
        !          18118:        MOV  *CTSI$,WA        SET SIZE OF CTBLK
        !          18119:        JSR  ALLOC            ALLOCATE CTBLK
        !          18120:        MOV  XR,R$CTP         STORE PTR TO NEW CTBLK
        !          18121:        MOV  =B$CTT,(XR)+     STORE TYPE CODE, BUMP PTR
        !          18122:        LCT  WB,=CFP$A        SET NUMBER OF WORDS TO CLEAR
        !          18123:        MOV  BITS0,WC         LOAD ALL ZERO BITS
        !          18124: *
        !          18125: *      LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
        !          18126: *
        !          18127: PATS3  MOV  WC,(XR)+         MOVE WORD OF ZERO BITS
        !          18128:        BCT  WB,PATS3         LOOP TILL ALL CLEARED
        !          18129:        MOV  BITS1,WC         SET INITIAL BIT POSITION
        !          18130: *
        !          18131: *      MERGE HERE WITH BIT POSITION AVAILABLE
        !          18132: *
        !          18133: PATS4  MOV  WC,CTMSK         SAVE PARM2 (NEW BIT POSITION)
        !          18134:        MOV  (XS)+,XL         RESTORE POINTER TO ARGUMENT STRING
        !          18135:        MOV  SCLEN(XL),WB     LOAD STRING LENGTH
        !          18136:        BZE  WB,PATS6         JUMP IF NULL STRING CASE
        !          18137:        LCT  WB,WB            ELSE SET LOOP COUNTER
        !          18138:        PLC  XL               POINT TO CHARACTERS IN ARGUMENT
        !          18139:        EJC
        !          18140: *
        !          18141: *      PATST (CONTINUED)
        !          18142: *
        !          18143: *      LOOP TO SET BITS IN COLUMN OF TABLE
        !          18144: *
        !          18145: PATS5  LCH  WA,(XL)+         LOAD NEXT CHARACTER
        !          18146:        WTB  WA               CONVERT TO BAU OFFSET
        !          18147:        MOV  R$CTP,XR         POINT TO CTBLK
        !          18148:        ADD  WA,XR            POINT TO CTBLK ENTRY
        !          18149:        MOV  WC,WA            COPY BIT MASK
        !          18150:        ORB  CTCHS(XR),WA     OR IN BITS ALREADY SET
        !          18151:        MOV  WA,CTCHS(XR)     STORE RESULTING BIT STRING
        !          18152:        BCT  WB,PATS5         LOOP TILL ALL BITS SET
        !          18153: *
        !          18154: *      COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
        !          18155: *
        !          18156: PATS6  MOV  R$CTP,XR         LOAD CTBLK PTR AS PARM1 FOR PBILD
        !          18157:        ZER  XL               CLEAR GARBAGE PTR IN XL
        !          18158:        MOV  (XS)+,WB         LOAD PCODE FOR MULTI-CHAR STR CASE
        !          18159:        BRN  PATS1            BACK TO EXIT (WC=BITSTRING=PARM2)
        !          18160: *
        !          18161: *      HERE IF ARGUMENT IS NOT A STRING
        !          18162: *
        !          18163: *      NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
        !          18164: *      SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
        !          18165: *
        !          18166: PATS7  MOV  WC,WB            SET PCODE FOR EXPRESSION ARGUMENT
        !          18167:        BLO  (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG
        !          18168:        EXI  1                ELSE TAKE WRONG TYPE ERROR EXIT
        !          18169:        ENP                   END PROCEDURE PATST
        !          18170:        EJC
        !          18171: *
        !          18172: *      PBILD -- BUILD PATTERN NODE
        !          18173: *
        !          18174: *      (XR)                  PARM1 (ONLY IF REQUIRED)
        !          18175: *      (WB)                  PCODE FOR NODE
        !          18176: *      (WC)                  PARM2 (ONLY IF REQUIRED)
        !          18177: *      JSR  PBILD            CALL TO BUILD NODE
        !          18178: *      (XR)                  POINTER TO CONSTRUCTED NODE
        !          18179: *      (WA)                  DESTROYED
        !          18180: *
        !          18181: PBILD  PRC  E,0              ENTRY POINT
        !          18182:        MOV  XR,-(XS)         STACK POSSIBLE PARM1
        !          18183:        MOV  WB,XR            COPY PCODE
        !          18184:        LEI  XR               LOAD ENTRY POINT ID (BL$PX)
        !          18185:        BEQ  XR,=BL$P1,PBLD1  JUMP IF ONE PARAMETER
        !          18186:        BEQ  XR,=BL$P0,PBLD3  JUMP IF NO PARAMETERS
        !          18187: *
        !          18188: *      HERE FOR TWO PARAMETER CASE
        !          18189: *
        !          18190:        MOV  *PCSI$,WA        SET SIZE OF P2BLK
        !          18191:        JSR  ALLOC            ALLOCATE BLOCK
        !          18192:        MOV  WC,PARM2(XR)     STORE SECOND PARAMETER
        !          18193:        BRN  PBLD2            MERGE WITH ONE PARM CASE
        !          18194: *
        !          18195: *      HERE FOR ONE PARAMETER CASE
        !          18196: *
        !          18197: PBLD1  MOV  *PBSI$,WA        SET SIZE OF P1BLK
        !          18198:        JSR  ALLOC            ALLOCATE NODE
        !          18199: *
        !          18200: *      MERGE HERE FROM TWO PARM CASE
        !          18201: *
        !          18202: PBLD2  MOV  (XS),PARM1(XR)   STORE FIRST PARAMETER
        !          18203:        BRN  PBLD4            MERGE WITH NO PARAMETER CASE
        !          18204: *
        !          18205: *      HERE FOR CASE OF NO PARAMETERS
        !          18206: *
        !          18207: PBLD3  MOV  *PASI$,WA        SET SIZE OF P0BLK
        !          18208:        JSR  ALLOC            ALLOCATE NODE
        !          18209: *
        !          18210: *      MERGE HERE FROM OTHER CASES
        !          18211: *
        !          18212: PBLD4  MOV  WB,(XR)          STORE PCODE
        !          18213:        ICA  XS               POP FIRST PARAMETER
        !          18214:        MOV  =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER
        !          18215:        EXI                   RETURN TO PBILD CALLER
        !          18216:        ENP                   END PROCEDURE PBILD
        !          18217:        EJC
        !          18218: *
        !          18219: *      PCONC -- CONCATENATE TWO PATTERNS
        !          18220: *
        !          18221: *      (XL)                  PTR TO RIGHT PATTERN
        !          18222: *      (XR)                  PTR TO LEFT PATTERN
        !          18223: *      JSR  PCONC            CALL TO CONCATENATE PATTERNS
        !          18224: *      (XR)                  PTR TO CONCATENATED PATTERN
        !          18225: *      (XL,WA,WB,WC)         DESTROYED
        !          18226: *
        !          18227: *
        !          18228: *      TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
        !          18229: *      PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
        !          18230: *      POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
        !          18231: *      MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
        !          18232: *      THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
        !          18233: *      MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
        !          18234: *
        !          18235: *      ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
        !          18236: *      THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
        !          18237: *      NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
        !          18238: *      THE FOLLOWING ALGORITHM IS EMPLOYED.
        !          18239: *
        !          18240: *      THE STACK IS USED TO STORE A LIST OF NODES WHICH
        !          18241: *      HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
        !          18242: *      THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
        !          18243: *      IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
        !          18244: *      OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
        !          18245: *      ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
        !          18246: *      USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
        !          18247: *      A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
        !          18248: *      ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
        !          18249: *      ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
        !          18250: *      THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
        !          18251: *
        !          18252: PCONC  PRC  E,0              ENTRY POINT
        !          18253:        ZER  -(XS)            MAKE ROOM FOR ONE ENTRY AT BOTTOM
        !          18254:        MOV  XS,WC            STORE POINTER TO START OF LIST
        !          18255:        MOV  =NDNTH,-(XS)     STACK NOTHEN NODE AS OLD NODE
        !          18256:        MOV  XL,-(XS)         STORE RIGHT ARG AS COPY OF NOTHEN
        !          18257:        MOV  XS,XT            INITIALIZE POINTER TO STACK ENTRIES
        !          18258:        JSR  PCOPY            COPY FIRST NODE OF LEFT ARG
        !          18259:        MOV  WA,2(XT)         STORE AS RESULT UNDER LIST
        !          18260:        EJC
        !          18261: *
        !          18262: *      PCONC (CONTINUED)
        !          18263: *
        !          18264: *      THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
        !          18265: *      SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
        !          18266: *
        !          18267: PCNC1  BEQ  XT,XS,PCNC2      JUMP IF ALL ENTRIES PROCESSED
        !          18268:        MOV  -(XT),XR         ELSE LOAD NEXT OLD ADDRESS
        !          18269:        MOV  PTHEN(XR),XR     LOAD POINTER TO SUCCESSOR
        !          18270:        JSR  PCOPY            COPY SUCCESSOR NODE
        !          18271:        MOV  -(XT),XR         LOAD POINTER TO NEW NODE (COPY)
        !          18272:        MOV  WA,PTHEN(XR)     STORE PTR TO NEW SUCCESSOR
        !          18273: *
        !          18274: *      NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
        !          18275: *      PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
        !          18276: *
        !          18277:        BNE  (XR),=P$ALT,PCNC1 LOOP BACK IF NOT
        !          18278:        MOV  PARM1(XR),XR     ELSE LOAD POINTER TO ALTERNATIVE
        !          18279:        JSR  PCOPY            COPY IT
        !          18280:        MOV  (XT),XR          RESTORE PTR TO NEW NODE
        !          18281:        MOV  WA,PARM1(XR)     STORE PTR TO COPIED ALTERNATIVE
        !          18282:        BRN  PCNC1            LOOP BACK FOR NEXT ENTRY
        !          18283: *
        !          18284: *      HERE AT END OF COPY PROCESS
        !          18285: *
        !          18286: PCNC2  MOV  WC,XS            RESTORE STACK POINTER
        !          18287:        MOV  (XS)+,XR         LOAD POINTER TO COPY
        !          18288:        EXI                   RETURN TO PCONC CALLER
        !          18289:        ENP                   END PROCEDURE PCONC
        !          18290:        EJC
        !          18291: *
        !          18292: *      PCOPY -- COPY A PATTERN NODE
        !          18293: *
        !          18294: *      PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
        !          18295: *      PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
        !          18296: *      HAS NOT BEEN COPIED ALREADY.
        !          18297: *
        !          18298: *      (XR)                  POINTER TO NODE TO BE COPIED
        !          18299: *      (XT)                  PTR TO CURRENT LOC IN COPY LIST
        !          18300: *      (WC)                  POINTER TO LIST OF COPIED NODES
        !          18301: *      JSR  PCOPY            CALL TO COPY A NODE
        !          18302: *      (WA)                  POINTER TO COPY
        !          18303: *      (WB,XR)               DESTROYED
        !          18304: *
        !          18305: PCOPY  PRC  N,0              ENTRY POINT
        !          18306:        MOV  XT,WB            SAVE XT
        !          18307:        MOV  WC,XT            POINT TO START OF LIST
        !          18308: *
        !          18309: *      LOOP TO SEARCH LIST OF NODES COPIED ALREADY
        !          18310: *
        !          18311: PCOP1  DCA  XT               POINT TO NEXT ENTRY ON LIST
        !          18312:        BEQ  XR,(XT),PCOP2    JUMP IF MATCH
        !          18313:        DCA  XT               ELSE SKIP OVER COPIED ADDRESS
        !          18314:        BNE  XT,XS,PCOP1      LOOP BACK IF MORE TO TEST
        !          18315: *
        !          18316: *      HERE IF NOT IN LIST, PERFORM COPY
        !          18317: *
        !          18318:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
        !          18319:        JSR  BLKLN            GET LENGTH OF BLOCK
        !          18320:        MOV  XR,XL            SAVE POINTER TO OLD NODE
        !          18321:        JSR  ALLOC            ALLOCATE SPACE FOR COPY
        !          18322:        MOV  XL,-(XS)         STORE OLD ADDRESS ON LIST
        !          18323:        MOV  XR,-(XS)         STORE NEW ADDRESS ON LIST
        !          18324:        CHK                   CHECK FOR STACK OVERFLOW
        !          18325:        MVW                   MOVE WORDS FROM OLD BLOCK TO COPY
        !          18326:        MOV  (XS),WA          LOAD POINTER TO COPY
        !          18327:        BRN  PCOP3            JUMP TO EXIT
        !          18328: *
        !          18329: *      HERE IF WE FIND ENTRY IN LIST
        !          18330: *
        !          18331: PCOP2  MOV  -(XT),WA         LOAD ADDRESS OF COPY FROM LIST
        !          18332: *
        !          18333: *      COMMON EXIT POINT
        !          18334: *
        !          18335: PCOP3  MOV  WB,XT            RESTORE XT
        !          18336:        EXI                   RETURN TO PCOPY CALLER
        !          18337:        ENP                   END PROCEDURE PCOPY
        !          18338: .IF    .CNPF
        !          18339: .ELSE
        !          18340:        EJC
        !          18341: *
        !          18342: *      PRFLR -- PRINT PROFILE
        !          18343: *      PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
        !          18344: *      TABLE IN A FAIRLY READABLE TABULAR FORMAT.
        !          18345: *
        !          18346: *      JSR  PRFLR            CALL TO PRINT PROFILE
        !          18347: *      (WA,IA)               DESTROYED
        !          18348: *
        !          18349: PRFLR  PRC  E,0
        !          18350:        BZE  PFDMP,PRFL4      NO PRINTING IF NO PROFILING DONE
        !          18351:        MOV  XR,-(XS)         PRESERVE ENTRY XR
        !          18352:        MOV  WB,PFSVW         AND ALSO WB
        !          18353:        JSR  PRTPG            EJECT
        !          18354:        MOV  =PFMS1,XR        LOAD MSG /PROGRAM PROFILE/
        !          18355:        JSR  PRTFB            AND PRINT IT
        !          18356:        MOV  =PFMS2,XR        POINT TO FIRST HDR
        !          18357:        JSR  PRTSF            PRINT IT
        !          18358:        MOV  =PFMS3,XR        SECOND HDR
        !          18359:        JSR  PRTFB
        !          18360:        ZER  WB               INITIAL STMT COUNT
        !          18361:        MOV  PFTBL,XR         POINT TO TABLE ORIGIN
        !          18362:        ADD  *NUM02,XR        BIASS PAST XNBLK HEADER
        !          18363:        EJC
        !          18364: *
        !          18365: *      PRFLR (CONTINUED)
        !          18366: *
        !          18367: *      LOOP FOR PRINTING TABLE ENTRIES
        !          18368: *
        !          18369: PRFL1  ICV  WB               BUMP STMT NR
        !          18370:        LDI  (XR)             LOAD NR OF EXECUTIONS
        !          18371:        IEQ  PRFL3            NO PRINTING IF ZERO
        !          18372:        MOV  =PFPD1,PROFS     POINT WHERE TO PRINT
        !          18373:        JSR  PRTIN            AND PRINT IT
        !          18374:        ZER  PROFS            BACK TO START OF LINE
        !          18375:        MTI  WB               LOAD STMT NR
        !          18376:        JSR  PRTIN            PRINT IT THERE
        !          18377:        MOV  =PFPD2,PROFS     AND PAD PAST COUNT
        !          18378:        LDI  CFP$I(XR)        LOAD TOTAL EXEC TIME
        !          18379:        JSR  PRTIN            PRINT THAT TOO
        !          18380:        LDI  CFP$I(XR)        RELOAD TIME
        !          18381:        MLI  INTTH            CONVERT TO MICROSEC
        !          18382:        IOV  PRFL2            OMIT NEXT BIT IF OVERFLOW
        !          18383:        DVI  (XR)             DIVIDE BY EXECUTIONS
        !          18384:        MOV  =PFPD3,PROFS     PAD LAST PRINT
        !          18385:        JSR  PRTIN            AND PRINT MCSEC/EXECN
        !          18386: *
        !          18387: *      PRINT A BLANK
        !          18388: *
        !          18389: PRFL2  JSR  PRTFH            THATS ANOTHER LINE
        !          18390: *
        !          18391: *      TEST TO SEE IF LOOP FINISHED
        !          18392: *
        !          18393: PRFL3  ADD  *PF$I2,XR        BUMP INDEX POINTER
        !          18394:        BLT  WB,PFNTE,PRFL1   LOOP IF MORE STMTS
        !          18395:        MOV  (XS)+,XR         RESTORE CALLERS XR
        !          18396:        MOV  PFSVW,WB         AND WB TOO
        !          18397: *
        !          18398: *      RETURN POINT
        !          18399: *
        !          18400: PRFL4  EXI                   RETURN
        !          18401:        ENP                   END OF PRFLR
        !          18402:        EJC
        !          18403: *
        !          18404: *      PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
        !          18405: *
        !          18406: *      ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
        !          18407: *
        !          18408: *      JSR  PRFLU            CALL TO UPDATE ENTRY
        !          18409: *      (IA)                  DESTROYED
        !          18410: *
        !          18411: PRFLU  PRC  E,0
        !          18412:        BNZ  PFFNC,PFLU4      SKIP IF JUST ENTERED FUNCTION
        !          18413:        MOV  XR,-(XS)         PRESERVE ENTRY XR
        !          18414:        MOV  WA,PFSVW         SAVE WA
        !          18415:        BNZ  PFTBL,PFLU2      BRANCH IF TABLE ALLOCATED
        !          18416: *
        !          18417: *      HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
        !          18418: *      CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
        !          18419: *      INITIALIZE IT ALL TO ZERO.
        !          18420: *      THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
        !          18421: *      STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
        !          18422: *      TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
        !          18423: *      DOESNT REALLY MATTER...
        !          18424: *
        !          18425:        SUB  =NUM01,PFNTE     ADJUST FOR EXTRA COUNT
        !          18426:        MTI  PFI2A            CONVRT ENTRY SIZE TO INT
        !          18427:        STI  PFSTE            AND STORE SAFELY FOR LATER
        !          18428:        MTI  PFNTE            LOAD TABLE LENGTH AS INTEGER
        !          18429:        MLI  PFSTE            MULTIPLY BY ENTRY SIZE
        !          18430:        MFI  WA               GET BACK ADDRESS-STYLE
        !          18431:        ADD  =NUM02,WA        ADD ON 2 WORD OVERHEAD
        !          18432:        WTB  WA               CONVERT THE WHOLE LOT TO BYTES
        !          18433:        JSR  ALOST            GIMME THE SPACE
        !          18434:        MOV  XR,PFTBL         SAVE BLOCK POINTER
        !          18435:        MOV  =B$XNT,(XR)+     PUT BLOCK TYPE AND ...
        !          18436:        MOV  WA,(XR)+         ... LENGTH INTO HEADER
        !          18437:        MFI  WA               GET BACK NR OF WDS IN DATA AREA
        !          18438:        LCT  WA,WA            LOAD THE COUNTER
        !          18439: *
        !          18440: *      LOOP HERE TO ZERO THE BLOCK DATA
        !          18441: *
        !          18442: PFLU1  ZER  (XR)+            BLANK A WORD
        !          18443:        BCT  WA,PFLU1         AND ALL THE REST
        !          18444:        EJC
        !          18445: *
        !          18446: *      PRFLU (CONTINUED)
        !          18447: *
        !          18448: *      END OF ALLOCATION. MERGE BACK INTO ROUTINE
        !          18449: *
        !          18450: PFLU2  MTI  KVSTN            LOAD NR OF STMT JUST ENDED
        !          18451:        SBI  INTV1            MAKE INTO INDEX OFFSET
        !          18452:        MLI  PFSTE            MAKE OFFSET OF TABLE ENTRY
        !          18453:        MFI  WA               CONVERT TO ADDRESS
        !          18454:        WTB  WA               GET AS BAUS
        !          18455:        ADD  *NUM02,WA        OFFSET INCLUDES TABLE HEADER
        !          18456:        MOV  PFTBL,XR         GET TABLE START
        !          18457:        BGE  WA,NUM01(XR),PFLU3  IF OUT OF TABLE, SKIP IT
        !          18458:        ADD  WA,XR            ELSE POINT TO ENTRY
        !          18459:        LDI  (XR)             GET NR OF EXECUTIONS SO FAR
        !          18460:        ADI  INTV1            NUDGE UP ONE
        !          18461:        STI  (XR)             AND PUT BACK
        !          18462:        JSR  SYSTM            GET TIME NOW
        !          18463:        STI  PFETM            STASH ENDING TIME
        !          18464:        SBI  PFSTM            SUBTRACT START TIME
        !          18465:        ADI  CFP$I(XR)        ADD CUMULATIVE TIME SO FAR
        !          18466:        STI  CFP$I(XR)        AND PUT BACK NEW TOTAL
        !          18467:        LDI  PFETM            LOAD END TIME OF THIS STMT ...
        !          18468:        STI  PFSTM            ... WHICH IS START TIME OF NEXT
        !          18469: *
        !          18470: *      RETURN POINT
        !          18471: *
        !          18472: PFLU3  MOV  (XS)+,XR         RESTORE CALLERS XR
        !          18473:        MOV  PFSVW,WA         RESTORE WA
        !          18474:        EXI                   AND RETURN
        !          18475: *
        !          18476: *      HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
        !          18477: *      FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
        !          18478: *      HAS NOT YET FINISHED
        !          18479: *
        !          18480: PFLU4  ZER  PFFNC            RESET THE CONDITION FLAG
        !          18481:        EXI                   AND IMMEDIATE RETURN
        !          18482:        ENP                   END OF PROCEDURE PRFLU
        !          18483: .FI
        !          18484:        EJC
        !          18485: *
        !          18486: *      PRPAR -- PROCESS PRINT PARAMETERS
        !          18487: *
        !          18488: *      JSR  PRPAR            CALL TO PROCESS PRINT PARAMETERS
        !          18489: *      (XR,WA,WB,WC)         DESTROYED
        !          18490: *
        !          18491: PRPAR  PRC  E,0              ENTRY POINT
        !          18492:        MOV  XL,-(XS)         SAVE XL
        !          18493:        JSR  SYSPP            GET PRINT PARAMETERS
        !          18494:        BNZ  WB,PRPA1         JUMP IF LINES/PAGE SPECIFIED
        !          18495:        MOV  =CFP$M,WB        ELSE USE A LARGE VALUE
        !          18496:        RSH  WB,1             BUT NOT TOO LARGE
        !          18497: *
        !          18498: *      STORE LINE COUNT/PAGE
        !          18499: *
        !          18500: PRPA1  MOV  WB,LSTNP         STORE NUMBER OF LINES/PAGE
        !          18501:        MOV  WB,LSTLC         PRETEND PAGE IS FULL INITIALLY
        !          18502:        ZER  LSTPG            CLEAR PAGE NUMBER
        !          18503:        BZE  PRLEN,PRPA2      SKIP IF NOT SYSXI RESUMPTION
        !          18504:        BHI  WA,PRLEN,PRPA3   SKIP IF BIGGER THAN PRIOR BFRS
        !          18505: *
        !          18506: *      STORE PRINT BUFFER LENGTH
        !          18507: *
        !          18508: PRPA2  MOV  WA,PRLEN         STORE VALUE
        !          18509: *
        !          18510: *      CHECK TERMINAL BUFFER SIZE
        !          18511: *
        !          18512: PRPA3  BZE  TTLEN,PRPA4      SKIP IF NOT SYSXI RESUMPTION
        !          18513:        BHI  XL,TTLEN,PRPA5   SKIP IF TOO BIG
        !          18514: *
        !          18515: *      STORE TERMINAL BUFFER LENGTH
        !          18516: *
        !          18517: PRPA4  MOV  XL,TTLEN         BFR LENGTH
        !          18518: *
        !          18519: *      PROCESS BITS OPTIONS
        !          18520: *
        !          18521: PRPA5  MOV  BITS1,WB         BIT 1 MASK
        !          18522:        ANB  WC,WB            GET BIT
        !          18523:        MOV  WB,TTINS         INPUT FROM TERMINAL FLAG
        !          18524:        MOV  BITS2,WB         BIT 2 MASK
        !          18525:        ANB  WC,WB            GET BIT
        !          18526:        MOV  WB,TTOUS         STD OUTPUT TO TERMINAL FLAG
        !          18527:        MOV  TTLEN,TTERL      ERRORS TO TERML IF AVAILABLE
        !          18528:        MOV  PRLEN,PRAVL      NOTE IF A PRINT FILE IS AVAILABLE
        !          18529:        ZRB  WB,PRPA6         IF FLAG SET, CLEAR TTERL SINCE ...
        !          18530:        ZER  TTERL            ... TERML GETS ALL OUTPUT ALREADY
        !          18531:        MOV  TTLEN,TTOUS      REGULAR O/P TO TERML IF AVAILABLE
        !          18532:        MOV  TTLEN,PRLEN      REVISED PRINT BUFFER LENGTH
        !          18533:        ZER  TTLEN            DONT NEED SEPARATE TERML BUFFER
        !          18534:        EJC
        !          18535: *
        !          18536: *      PRPAR (CONTINUED)
        !          18537: *
        !          18538: *      GET OFFSET TO /PAGE NN/ PART OF HEADER
        !          18539: *
        !          18540: PRPA6  MOV  PRLEN,WA         STD BFR LENGTH
        !          18541:        BNZ  WA,PRPA7         USE IF NON-ZERO
        !          18542:        MOV  TTLEN,WA         ELSE TRY TERMINAL
        !          18543:        BZE  WA,PRPA8         GIVE UP IF ZERO ALSO
        !          18544: *
        !          18545: *      GET OFFSET
        !          18546: *
        !          18547: PRPA7  MOV  WA,PRLEN         STORE AS BUFFER LENGTH
        !          18548:        SUB  =NUM08,WA        JUST BEFORE END OF LINE
        !          18549:        MOV  WA,LSTPO         KEEP IT
        !          18550:        MOV  TTOUS,WB         CONSTRUCT VALUE FOR ...
        !          18551:        ORB  PRAVL,WB         ... USE IN DECIDING WHETHER TO ...
        !          18552:        MOV  WB,PRPUT         ... PUT STRINGS IN OUTPUT BUFFER
        !          18553: *
        !          18554: *      MORE BITS
        !          18555: *
        !          18556: PRPA8  MOV  BITS3,WB         BIT 3 MASK
        !          18557:        ANB  WC,WB            GET -NOLIST BIT
        !          18558:        ZRB  WB,PRPA9         SKIP IF CLEAR
        !          18559:        ZER  CSWLS            SET -NOLIST
        !          18560: *
        !          18561: *      MORE BITS
        !          18562: *
        !          18563: PRPA9  MOV  BITS4,WB         BIT 4 MASK
        !          18564:        ANB  WC,WB            GET BIT
        !          18565:        MOV  WB,CPSTS         FLAG FOR COMPILE STATS SUPPRESSN.
        !          18566:        MOV  BITS5,WB         BIT 5 MASK
        !          18567:        ANB  WC,WB            GET BIT
        !          18568:        MOV  WB,EXSTS         FLAG FOR EXEC STATS SUPPRESSION
        !          18569:        MOV  BITS6,WB         BIT 6 MASK
        !          18570:        ANB  WC,WB            GET BIT
        !          18571:        MOV  WB,NOXEQ         SET NOEXECUTE IF NON-ZERO
        !          18572:        MOV  BITS7,WB         BIT 7 MASK
        !          18573:        ANB  WC,WB            GET BIT
        !          18574:        ZRB  WB,PRP10         SKIP IF NOT SET
        !          18575:        ZER  TTERL            CLEAR ERRORS TO TERML IF SET
        !          18576: *
        !          18577: *      MORE BITS
        !          18578: *
        !          18579: PRP10  MOV  BITS8,WB         BIT 8 MASK
        !          18580:        ANB  WC,WB            GET BIT
        !          18581:        MOV  WB,HEADN         SYSID HEADERS INCLUDE/OMIT FLAG
        !          18582:        MOV  BITS9,WB         BIT 9 MASK
        !          18583:        ANB  WC,WB            GET BIT
        !          18584:        MOV  WB,PRSTO         STANDARD LISTING FLAG
        !          18585:        MOV  BIT10,WB         BIT 10 MASK
        !          18586:        ANB  WC,WB            GET BIT
        !          18587:        MOV  WB,PRECL         EXTENDED LISTING OPTION
        !          18588:        MOV  (XS)+,XL         RESTORE XL
        !          18589:        EXI                   RETURN
        !          18590:        ENP                   END PROCEDURE PRPAR
        !          18591:        EJC
        !          18592: *
        !          18593: *      PRTCF -- PRINT CHAR TO STD PRINTER AND FLUSH BFR
        !          18594: *
        !          18595: *      (WA)                  CHAR TO PRINT
        !          18596: *      JSR  PRTCF            CALL TO PRINT AND FLUSH
        !          18597: *
        !          18598: PRTCF  PRC  E,0              ENTRY POINT
        !          18599:        JSR  PRTCH            PRINT CHARACTER
        !          18600:        JSR  PRTFH            FLUSH BUFFER
        !          18601:        EXI                   RETURN TO CALLER
        !          18602:        ENP                   END PROCEDURE PRTCF
        !          18603: *
        !          18604: *      PRTCH -- PRINT A CHARACTER ON STANDARD PRINTER
        !          18605: *
        !          18606: *      PRTCH IS USED TO PRINT A SINGLE CHARACTER
        !          18607: *
        !          18608: *      (WA)                  CHARACTER TO BE PRINTED
        !          18609: *      JSR  PRTCH            CALL TO PRINT CHARACTER
        !          18610: *
        !          18611: PRTCH  PRC  E,0              ENTRY POINT
        !          18612:        BZE  PRLEN,PTCH2      SKIP IF NO PRINT FILE
        !          18613:        MOV  XR,-(XS)         SAVE XR
        !          18614:        BNE  PROFS,PRLEN,PTCH1 JUMP IF ROOM IN BUFFER
        !          18615:        JSR  PRTFH            ELSE PRINT THIS LINE
        !          18616: *
        !          18617: *      HERE AFTER MAKING SURE WE HAVE ROOM
        !          18618: *
        !          18619: PTCH1  MOV  PRBUF,XR         POINT TO PRINT BUFFER
        !          18620:        PSC  XR,PROFS         POINT TO NEXT CHARACTER LOCATION
        !          18621:        SCH  WA,(XR)          STORE NEW CHARACTER
        !          18622:        CSC  XR               COMPLETE STORE CHARACTERS
        !          18623:        ICV  PROFS            BUMP POINTER
        !          18624:        MOV  (XS)+,XR         RESTORE ENTRY XR
        !          18625: *
        !          18626: *      RETURN POINT
        !          18627: *
        !          18628: PTCH2  EXI                   RETURN TO PRTCH CALLER
        !          18629:        ENP                   END PROCEDURE PRTCH
        !          18630: *
        !          18631: *      PRTFB -- PRINT STRING, FLUSH BFR AND PRINT BLANK LINE
        !          18632: *
        !          18633: *      (XR)                  STRING TO PRINT
        !          18634: *      JSR  PRTFB            CALL FOR PRINT FLUSH AND BLANK
        !          18635: *
        !          18636: PRTFB  PRC  E,0              ENTRY POINT
        !          18637:        JSR  PRTSF            PRINT AND FLUSH
        !          18638:        JSR  PRTFH            PRINT BLANK
        !          18639:        EXI                   RETURN TO CALLER
        !          18640:        ENP                   END PROCEDURE PRTFB
        !          18641:        EJC
        !          18642: *
        !          18643: *      PRTFH -- FLUSH STANDARD PRINT BUFFER
        !          18644: *
        !          18645: *      PRTFH PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
        !          18646: *      THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
        !          18647: *      ON ITS FIRST CALL IT MAY PRINT LISTING HEADERS.
        !          18648: *      IF TTLST IS NON-ZERO, IT COPIES PRINT BUFFER TO
        !          18649: *      TERMINAL AND FLUSHES THIS ALSO.
        !          18650: *
        !          18651: *      JSR  PRTFH            CALL TO FLUSH BUFFER
        !          18652: *
        !          18653: PRTFH  PRC  R,0              ENTRY POINT
        !          18654:        BNZ  HEADP,PTFH1      WERE HEADERS PRINTED
        !          18655:        JSR  PRTPS            NO - PRINT THEM
        !          18656: *
        !          18657: *      HEADERS DONE
        !          18658: *
        !          18659: PTFH1  BZE  PRLEN,PTFH4      SKIP IF NO OUTPUT POSSIBLE
        !          18660:        MOV  XL,-(XS)         SAVE XL
        !          18661:        MOV  XR,-(XS)         SAVE XR
        !          18662:        MOV  WA,-(XS)         SAVE WA
        !          18663:        MOV  WC,-(XS)         SAVE WC
        !          18664:        MOV  PRBUF,XR         LOAD POINTER TO BUFFER
        !          18665:        MOV  PROFS,WC         LOAD NUMBER OF CHARS IN BUFFER
        !          18666:        BNZ  PRAVL,PTFH5      SKIP IF PRINT FILE AVAILABLE
        !          18667:        BNZ  TTOUS,PTFH2      SKIP IF STD OUTPUT TO TERML
        !          18668:        BZE  TTLST,PTFH3      LAST POSSIBILITY IS ERROR TO TERML
        !          18669: *
        !          18670: *       SEND TO TERMINAL
        !          18671: *
        !          18672: PTFH2  JSR  SYSPI            PRINT TO TERMINAL
        !          18673:        PPM  PTFH6            FAIL
        !          18674:        PPM  EROSI            ERROR
        !          18675:        EJC
        !          18676: *      PRTFH (CONTINUED)
        !          18677: *
        !          18678: *      BLANK BUFFER
        !          18679: *
        !          18680: PTFH3  MOV  PRBLK,XL         POINT TO BLANKING STRING
        !          18681:        MOV  PRCHS,XR         POINT TO BUFFER
        !          18682:        MOV  PRCMV,WA         COUNT OF BAUS TO MOVE
        !          18683:        MVW                   MOVE BLANKS INTO BUFFER
        !          18684:        ZER  PROFS            RESET OFFSET
        !          18685:        MOV  (XS)+,WC         RESTORE WC
        !          18686:        MOV  (XS)+,WA         RECOVER WA
        !          18687:        MOV  (XS)+,XR         RESTORE XR
        !          18688:        MOV  (XS)+,XL         RESTORE XL
        !          18689: *
        !          18690: *      RETURN POINT
        !          18691: *
        !          18692: PTFH4  EXI                   RETURN TO CALLER
        !          18693: *
        !          18694: *      HERE FOR REGULAR PRINT FILE
        !          18695: *
        !          18696: PTFH5  JSR  SYSPR            CALL SYSTEM PRINT ROUTINE
        !          18697:        PPM  PTFH6            JUMP IF FAILED
        !          18698:        PPM  EROSI            STOP IF ERROR
        !          18699:        BZE  TTLST,PTFH3      SKIP IF NO COPY TO TERMINAL
        !          18700:        MOV  PROFS,SCLEN(XR)  SET STRING LENGTH FOR PTTST
        !          18701:        JSR  PTTST            COPY STD BUFFER TO TERML BFR
        !          18702:        JSR  PTTFH            FLUSH IT
        !          18703:        MOV  PRLEN,SCLEN(XR)  RESTORE BUFFER LENGTH
        !          18704:        BRN  PTFH3            MERGE
        !          18705: *
        !          18706: *      A FAILURE SUCH AS FILE OVERFILLED OCCURRED
        !          18707: *
        !          18708: PTFH6  BZE  STAGX,PTFH3      IGNORE IF COMPILE TIME
        !          18709:        BRN  EXFAL            ELSE CAUSE STMT FAILURE
        !          18710:        ENP                   END PROCEDURE PRTFH
        !          18711:        EJC
        !          18712: *
        !          18713: *      PRTIN -- PRINT AN INTEGER
        !          18714: *
        !          18715: *      PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
        !          18716: *      ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
        !          18717: *      DURING THIS PROCESS ARE IMMEDIATELY DELETED.
        !          18718: *
        !          18719: *      (IA)                  INTEGER VALUE TO BE PRINTED
        !          18720: *      JSR  PRTIN            CALL TO PRINT INTEGER
        !          18721: *      (IA,RA)               DESTROYED
        !          18722: *
        !          18723: PRTIN  PRC  E,0              ENTRY POINT
        !          18724:        MOV  XR,-(XS)         SAVE XR
        !          18725:        JSR  ICBLD            BUILD INTEGER BLOCK
        !          18726:        BLO  XR,DNAMB,PRTI1   JUMP IF ICBLK BELOW DYNAMIC
        !          18727:        BHI  XR,DNAMP,PRTI1   JUMP IF ABOVE DYNAMIC
        !          18728:        MOV  XR,DNAMP         IMMEDIATELY DELETE IT
        !          18729: *
        !          18730: *      DELETE ICBLK FROM DYNAMIC STORE
        !          18731: *
        !          18732: PRTI1  MOV  XR,-(XS)         STACK PTR FOR GTSTG
        !          18733:        JSR  GTSTG            CONVERT TO STRING
        !          18734:        PPM                   CONVERT ERROR IS IMPOSSIBLE
        !          18735:        MOV  XR,DNAMP         RESET POINTER TO DELETE SCBLK
        !          18736:        JSR  PRTST            PRINT INTEGER STRING
        !          18737:        MOV  (XS)+,XR         RESTORE ENTRY XR
        !          18738:        EXI                   RETURN TO PRTIN CALLER
        !          18739:        ENP                   END PROCEDURE PRTIN
        !          18740: *
        !          18741: *      PRTMI -- PRINT MESSAGE AND INTEGER
        !          18742: *
        !          18743: *      PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
        !          18744: *      VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
        !          18745: *      THE END OF COMPILATION).
        !          18746: *
        !          18747: *      JSR  PRTMI            CALL TO PRINT MESSAGE AND INTEGER
        !          18748: *
        !          18749: PRTMI  PRC  E,0              ENTRY POINT
        !          18750:        JSR  PRTST            PRINT STRING MESSAGE
        !          18751:        MOV  =PRTMF,PROFS     SET OFFSET TO COL 15
        !          18752:        JSR  PRTIN            PRINT INTEGER
        !          18753:        JSR  PRTFH            PRINT LINE
        !          18754:        EXI                   RETURN TO PRTMI CALLER
        !          18755:        ENP                   END PROCEDURE PRTMI
        !          18756:        EJC
        !          18757: *
        !          18758: *      PRTNM -- PRINT VARIABLE NAME
        !          18759: *
        !          18760: *      PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
        !          18761: *      NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
        !          18762: *      NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
        !          18763: *
        !          18764: *      (XL)                  NAME BASE
        !          18765: *      (WA)                  NAME OFFSET
        !          18766: *      JSR  PRTNM            CALL TO PRINT NAME
        !          18767: *      (WB,WC,RA)            DESTROYED
        !          18768: *
        !          18769: PRTNM  PRC  R,0              ENTRY POINT (RECURSIVE, SEE PRTVL)
        !          18770:        MOV  WA,-(XS)         SAVE WA (OFFSET IS COLLECTABLE)
        !          18771:        MOV  XR,-(XS)         SAVE ENTRY XR
        !          18772:        MOV  XL,-(XS)         SAVE NAME BASE
        !          18773:        BHI  XL,STATE,PRN02   JUMP IF NOT NATURAL VARIABLE
        !          18774: *
        !          18775: *      HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
        !          18776: *      THAT THE NAME BASE POINTS INTO THE STATIC AREA.
        !          18777: *
        !          18778:        MOV  XL,XR            POINT TO VRBLK
        !          18779:        JSR  PRTVN            PRINT NAME OF VARIABLE
        !          18780: *
        !          18781: *      COMMON EXIT POINT
        !          18782: *
        !          18783: PRN01  MOV  (XS)+,XL         RESTORE NAME BASE
        !          18784:        MOV  (XS)+,XR         RESTORE ENTRY VALUE OF XR
        !          18785:        MOV  (XS)+,WA         RESTORE WA
        !          18786:        EXI                   RETURN TO PRTNM CALLER
        !          18787: *
        !          18788: *      HERE FOR CASE OF NON-NATURAL VARIABLE
        !          18789: *
        !          18790: PRN02  MOV  WA,WB            COPY NAME OFFSET
        !          18791:        BNE  (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE
        !          18792: *
        !          18793: *      FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
        !          18794: *
        !          18795:        MOV  PDDFP(XL),XR     LOAD POINTER TO DFBLK
        !          18796:        ADD  WA,XR            ADD NAME OFFSET
        !          18797:        MOV  PDFOF(XR),XR     LOAD VRBLK POINTER FOR FIELD
        !          18798:        JSR  PRTVN            PRINT FIELD NAME
        !          18799:        MOV  =CH$PP,WA        LOAD LEFT PAREN
        !          18800:        JSR  PRTCH            PRINT CHARACTER
        !          18801:        EJC
        !          18802: *
        !          18803: *      PRTNM (CONTINUED)
        !          18804: *
        !          18805: *      NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
        !          18806: *      CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
        !          18807: *      VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
        !          18808: *      VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
        !          18809: *      OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
        !          18810: *
        !          18811: *      FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
        !          18812: *      A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
        !          18813: *
        !          18814: PRN03  BNE  (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE)
        !          18815:        MOV  TENXT(XL),XL     ELSE MOVE OUT ON CHAIN
        !          18816:        BRN  PRN03            AND LOOP BACK
        !          18817: *
        !          18818: *      NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
        !          18819: *      THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
        !          18820: *      WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
        !          18821: *      WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
        !          18822: *      FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
        !          18823: *
        !          18824: PRN04  MOV  PRNMV,XR         POINT TO VRBLK WE FOUND LAST TIME
        !          18825:        MOV  HSHTB,WA         POINT TO HASH TABLE IN CASE NOT
        !          18826:        BRN  PRN07            JUMP INTO SEARCH FOR SPECIAL CHECK
        !          18827: *
        !          18828: *      LOOP THROUGH HASH SLOTS
        !          18829: *
        !          18830: PRN05  MOV  WA,XR            COPY SLOT POINTER
        !          18831:        ICA  WA               BUMP SLOT POINTER
        !          18832:        SUB  *VRNXT,XR        INTRODUCE STANDARD VRBLK OFFSET
        !          18833: *
        !          18834: *      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
        !          18835: *
        !          18836: PRN06  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON HASH CHAIN
        !          18837: *
        !          18838: *      MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
        !          18839: *
        !          18840: PRN07  MOV  XR,WC            COPY VRBLK POINTER
        !          18841:        BZE  WC,PRN09         JUMP IF CHAIN END (OR PRNMV ZERO)
        !          18842:        EJC
        !          18843: *
        !          18844: *      PRTNM (CONTINUED)
        !          18845: *
        !          18846: *      LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
        !          18847: *
        !          18848: PRN08  MOV  VRVAL(XR),XR     LOAD VALUE
        !          18849:        BEQ  (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK
        !          18850: *
        !          18851: *      NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
        !          18852: *
        !          18853:        BEQ  XR,XL,PRN10      JUMP IF THIS MATCHES THE NAME BASE
        !          18854:        MOV  WC,XR            ELSE POINT BACK TO THAT VRBLK
        !          18855:        BRN  PRN06            AND LOOP BACK
        !          18856: *
        !          18857: *      HERE TO MOVE TO NEXT HASH SLOT
        !          18858: *
        !          18859: PRN09  BLT  WA,HSHTE,PRN05   LOOP BACK IF MORE TO GO
        !          18860:        MOV  XL,XR            ELSE NOT FOUND, COPY VALUE POINTER
        !          18861:        JSR  PRTVL            PRINT VALUE
        !          18862:        BRN  PRN11            AND MERGE AHEAD
        !          18863: *
        !          18864: *      HERE WHEN WE FIND A MATCHING ENTRY
        !          18865: *
        !          18866: PRN10  MOV  WC,XR            COPY VRBLK POINTER
        !          18867:        MOV  XR,PRNMV         SAVE FOR NEXT TIME IN
        !          18868:        JSR  PRTVN            PRINT VARIABLE NAME
        !          18869: *
        !          18870: *      MERGE HERE IF NO ENTRY FOUND
        !          18871: *
        !          18872: PRN11  MOV  (XL),WC          LOAD FIRST WORD OF NAME BASE
        !          18873:        BNE  WC,=B$PDT,PRN13  JUMP IF NOT PROGRAM DEFINED
        !          18874: *
        !          18875: *      FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
        !          18876: *
        !          18877:        MOV  =CH$RP,WA        LOAD RIGHT PAREN, MERGE
        !          18878: *
        !          18879: *      MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
        !          18880: *
        !          18881: PRN12  JSR  PRTCH            PRINT FINAL CHARACTER
        !          18882:        MOV  WB,WA            RESTORE NAME OFFSET
        !          18883:        BRN  PRN01            MERGE BACK TO EXIT
        !          18884:        EJC
        !          18885: *
        !          18886: *      PRTNM (CONTINUED)
        !          18887: *
        !          18888: *      HERE FOR ARRAY OR TABLE
        !          18889: *
        !          18890: PRN13  MOV  =CH$BB,WA        LOAD LEFT BRACKET
        !          18891:        JSR  PRTCH            AND PRINT IT
        !          18892:        MOV  (XS),XL          RESTORE BLOCK POINTER
        !          18893:        MOV  (XL),WC          LOAD TYPE WORD AGAIN
        !          18894:        BNE  WC,=B$TET,PRN15  JUMP IF NOT TABLE
        !          18895: *
        !          18896: *      HERE FOR TABLE, PRINT SUBSCRIPT VALUE
        !          18897: *
        !          18898:        MOV  TESUB(XL),XR     LOAD SUBSCRIPT VALUE
        !          18899:        MOV  WB,XL            SAVE NAME OFFSET
        !          18900:        JSR  PRTVL            PRINT SUBSCRIPT VALUE
        !          18901:        MOV  XL,WB            RESTORE NAME OFFSET
        !          18902: *
        !          18903: *      MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
        !          18904: *
        !          18905: PRN14  MOV  =CH$RB,WA        LOAD RIGHT BRACKET
        !          18906:        BRN  PRN12            MERGE BACK TO PRINT IT
        !          18907: *
        !          18908: *      HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
        !          18909: *
        !          18910: PRN15  MOV  WB,WA            COPY NAME OFFSET
        !          18911:        BTW  WA               CONVERT TO WORDS
        !          18912:        BEQ  WC,=B$ART,PRN16  JUMP IF ARBLK
        !          18913: *
        !          18914: *      HERE FOR VECTOR
        !          18915: *
        !          18916:        SUB  =VCVLB,WA        ADJUST FOR STANDARD FIELDS
        !          18917:        MTI  WA               MOVE TO INTEGER ACCUM
        !          18918:        JSR  PRTIN            PRINT LINEAR SUBSCRIPT
        !          18919:        BRN  PRN14            MERGE BACK FOR RIGHT BRACKET
        !          18920:        EJC
        !          18921: *
        !          18922: *      PRTNM (CONTINUED)
        !          18923: *
        !          18924: *      HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
        !          18925: *      OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
        !          18926: *      THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
        !          18927: *      STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
        !          18928: *
        !          18929: PRN16  MOV  AROFS(XL),WC     LOAD LENGTH OF BOUNDS INFO
        !          18930:        ICA  WC               ADJUST FOR ARPRO FIELD
        !          18931:        BTW  WC               CONVERT TO WORDS
        !          18932:        SUB  WC,WA            GET LINEAR ZERO-ORIGIN SUBSCRIPT
        !          18933:        MTI  WA               GET INTEGER VALUE
        !          18934:        LCT  WA,ARNDM(XL)     SET NUM OF DIMENSIONS AS LOOP COUNT
        !          18935:        ADD  AROFS(XL),XL     POINT PAST BOUNDS INFORMATION
        !          18936:        SUB  *ARLBD,XL        SET OK OFFSET FOR PROPER PTR LATER
        !          18937: *
        !          18938: *      LOOP TO STACK SUBSCRIPT OFFSETS
        !          18939: *
        !          18940: PRN17  SUB  *ARDMS,XL        POINT TO NEXT SET OF BOUNDS
        !          18941:        STI  PRNSI            SAVE CURRENT OFFSET
        !          18942:        RMI  ARDIM(XL)        GET REMAINDER ON DIVIDING BY DIMENS
        !          18943:        MFI  -(XS)            STORE ON STACK (ONE WORD)
        !          18944:        LDI  PRNSI            RELOAD ARGUMENT
        !          18945:        DVI  ARDIM(XL)        DIVIDE TO GET QUOTIENT
        !          18946:        BCT  WA,PRN17         LOOP TILL ALL STACKED
        !          18947:        ZER  XR               SET OFFSET TO FIRST SET OF BOUNDS
        !          18948:        LCT  WB,ARNDM(XL)     LOAD COUNT OF DIMS TO CONTROL LOOP
        !          18949:        BRN  PRN19            JUMP INTO PRINT LOOP
        !          18950: *
        !          18951: *      LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
        !          18952: *      THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
        !          18953: *
        !          18954: PRN18  MOV  =CH$CM,WA        LOAD A COMMA
        !          18955:        JSR  PRTCH            PRINT IT
        !          18956: *
        !          18957: *      MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
        !          18958: *
        !          18959: PRN19  MTI  (XS)+            LOAD SUBSCRIPT OFFSET AS INTEGER
        !          18960:        ADD  XR,XL            POINT TO CURRENT LBD
        !          18961:        ADI  ARLBD(XL)        ADD LBD TO GET SIGNED SUBSCRIPT
        !          18962:        SUB  XR,XL            POINT BACK TO START OF ARBLK
        !          18963:        JSR  PRTIN            PRINT SUBSCRIPT
        !          18964:        ADD  *ARDMS,XR        BUMP OFFSET TO NEXT BOUNDS
        !          18965:        BCT  WB,PRN18         LOOP BACK TILL ALL PRINTED
        !          18966:        BRN  PRN14            MERGE BACK TO PRINT RIGHT BRACKET
        !          18967:        ENP                   END PROCEDURE PRTNM
        !          18968:        EJC
        !          18969: *
        !          18970: *      PRTNV -- PRINT NAME VALUE
        !          18971: *
        !          18972: *      PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
        !          18973: *      A LINE OF THE FORM
        !          18974: *
        !          18975: *      NAME = VALUE
        !          18976: *
        !          18977: *      NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
        !          18978: *
        !          18979: *      (XL)                  NAME BASE
        !          18980: *      (WA)                  NAME OFFSET
        !          18981: *      JSR  PRTNV            CALL TO PRINT NAME = VALUE
        !          18982: *      (WB,WC,RA)            DESTROYED
        !          18983: *
        !          18984: PRTNV  PRC  E,0              ENTRY POINT
        !          18985:        JSR  PRTNM            PRINT ARGUMENT NAME
        !          18986:        MOV  XR,-(XS)         SAVE ENTRY XR
        !          18987:        MOV  WA,-(XS)         SAVE NAME OFFSET (COLLECTABLE)
        !          18988:        MOV  =TMBEB,XR        POINT TO BLANK EQUAL BLANK
        !          18989:        JSR  PRTST            PRINT IT
        !          18990:        MOV  XL,XR            COPY NAME BASE
        !          18991:        ADD  WA,XR            POINT TO VALUE
        !          18992:        MOV  (XR),XR          LOAD VALUE POINTER
        !          18993:        JSR  PRTVF            PRINT VALUE
        !          18994:        MOV  (XS)+,WA         RESTORE NAME OFFSET
        !          18995:        MOV  (XS)+,XR         RESTORE ENTRY XR
        !          18996:        EXI                   RETURN TO CALLER
        !          18997:        ENP                   END PROCEDURE PRTNV
        !          18998:        EJC
        !          18999: *
        !          19000: *      PRTPG -- PRINT A PAGE THROW
        !          19001: *
        !          19002: *      PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
        !          19003: *      LISTING FILE DEPENDING ON THE LISTING OPTIONS CHOSEN.
        !          19004: *
        !          19005: *      JSR  PRTPG            CALL FOR PAGE EJECT
        !          19006: *
        !          19007: PRTPG  PRC  E,0              ENTRY POINT
        !          19008:        BNZ  STAGX,PTPG1      SKIP IF EXECUTION TIME
        !          19009:        BZE  LSTLC,PTPG6      RETURN IF TOP OF PAGE ALREADY
        !          19010:        ZER  LSTLC            CLEAR LINE COUNT
        !          19011: *
        !          19012: *      CHECK TYPE OF LISTING
        !          19013: *
        !          19014: PTPG1  MOV  XR,-(XS)         PRESERVE XR
        !          19015:        BNZ  PRECL,PTPG2      EJECT IF EXTENDED LISTING
        !          19016:        BZE  PRSTD,PTPG3      SKIP IF COMPACT LISTING
        !          19017:        BNZ  TTOUS,PTPG3      SKIP IF LISTING TO TERMINAL
        !          19018: *
        !          19019: *      PERFORM AN EJECT
        !          19020: *
        !          19021: PTPG2  JSR  SYSEP            EJECT
        !          19022:        PPM  PTPG4            IGNORE FAILURE
        !          19023:        PPM  EROSI            ERROR
        !          19024:        BRN  PTPG4            MERGE
        !          19025: *
        !          19026: *      COMPACT LISTING.
        !          19027: *
        !          19028: PTPG3  BNZ  HEADN,PTPG4      SKIP IF HEADERS OMITTED
        !          19029:        MOV  HEADP,XR         REMEMBER HEADP
        !          19030:        MNZ  HEADP            SET TO AVOID RECURSIVE PRTPG CALLS
        !          19031:        JSR  PRTFH            PRINT BLANK LINE
        !          19032:        JSR  PRTFH            PRINT BLANK LINE
        !          19033:        JSR  PRTFH            PRINT BLANK LINE
        !          19034:        MOV  =NUM03,LSTLC     COUNT BLANK LINES
        !          19035:        MOV  XR,HEADP         RESTORE HEADER FLAG
        !          19036:        EJC
        !          19037: *
        !          19038: *      PRPTG (CONTINUED)
        !          19039: *
        !          19040: *      PRINT THE HEADING
        !          19041: *
        !          19042: PTPG4  BNZ  HEADP,PTPG5      JUMP IF HEADER LISTED
        !          19043:        MNZ  HEADP            MARK HEADERS PRINTED
        !          19044:        BNZ  HEADN,PTPG5      SKIP IF HEADERS OMITTED
        !          19045:        MOV  XL,-(XS)         KEEP XL
        !          19046:        MOV  =HEADR,XR        POINT TO LISTING HEADER
        !          19047:        JSR  PRTST            PLACE IT
        !          19048:        JSR  SYSID            GET SYSTEM IDENTIFICATION
        !          19049:        JSR  PRTSF            APPEND EXTRA CHARS AND PRINT
        !          19050:        MOV  XL,XR            EXTRA HEADER LINE
        !          19051:        JSR  PRTFB            PLACE IT AND A BLANK
        !          19052:        JSR  PRTFH            AND ANOTHER
        !          19053:        ADD  =NUM04,LSTLC     FOUR HEADER LINES PRINTED
        !          19054:        MOV  (XS)+,XL         RESTORE XL
        !          19055: *
        !          19056: *      MERGE IF HEADER NOT PRINTED
        !          19057: *
        !          19058: PTPG5  MOV  (XS)+,XR         RESTORE XR
        !          19059: *
        !          19060: *      RETURN
        !          19061: *
        !          19062: PTPG6  EXI                   RETURN
        !          19063:        ENP                   END PROCEDURE PRTPG
        !          19064:        EJC
        !          19065: *
        !          19066: *      PRTPS -- PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
        !          19067: *
        !          19068: *      IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
        !          19069: *      AN EJECT BE DONE
        !          19070: *
        !          19071: *      JSR  PRTPS            CALL FOR EJECT
        !          19072: *
        !          19073: PRTPS  PRC  E,0              ENTRY POINT
        !          19074:        MOV  PRSTO,PRSTD      COPY OPTION FLAG
        !          19075:        JSR  PRTPG            PRINT PAGE
        !          19076:        ZER  PRSTD            CLEAR FLAG
        !          19077:        EXI                   RETURN
        !          19078:        ENP                   END PROCEDURE PRTPS
        !          19079: *
        !          19080: *      PRTSF -- PRINT STRING TO STD PRINTER AND FLUSH BFR
        !          19081: *
        !          19082: *      (XR)                  STRING TO PRINT
        !          19083: *      JSR  PRTSF            CALL TO PRINT AND FLUSH
        !          19084: *
        !          19085: PRTSF  PRC  E,0              ENTRY POINT
        !          19086:        JSR  PRTST            PRINT STRING
        !          19087:        JSR  PRTFH            FLUSH BUFFER
        !          19088:        EXI                   RETURN TO CALLER
        !          19089:        ENP                   END PROCEDURE PRTSF
        !          19090:        EJC
        !          19091: *
        !          19092: *      PRTSN -- PRINT STATEMENT NUMBER
        !          19093: *
        !          19094: *      PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
        !          19095: *      ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
        !          19096: *      FORMAT OF THE OUTPUT GENERATED IS.
        !          19097: *
        !          19098: *      ***NNNNN**** III.....IIII
        !          19099: *
        !          19100: *      NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
        !          19101: *      BY ASTERISKS (E.G. *******9****)
        !          19102: *
        !          19103: *      III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
        !          19104: *      OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
        !          19105: *
        !          19106: *      JSR  PRTSN            CALL TO PRINT STATEMENT NUMBER
        !          19107: *      (WC)                  DESTROYED
        !          19108: *
        !          19109: PRTSN  PRC  E,0              ENTRY POINT
        !          19110:        MOV  XR,-(XS)         SAVE ENTRY XR
        !          19111:        MOV  WA,PRSNA         SAVE ENTRY WA
        !          19112:        MOV  =TMASB,XR        POINT TO ASTERISKS
        !          19113:        JSR  PRTST            PRINT ASTERISKS
        !          19114:        MOV  =NUM04,PROFS     POINT INTO MIDDLE OF ASTERISKS
        !          19115:        MTI  KVSTN            LOAD STATEMENT NUMBER AS INTEGER
        !          19116:        JSR  PRTIN            PRINT INTEGER STATEMENT NUMBER
        !          19117:        MOV  =PRSNF,PROFS     POINT PAST ASTERISKS PLUS BLANK
        !          19118:        MOV  KVFNC,XR         GET FNCLEVEL
        !          19119:        MOV  =CH$LI,WA        SET LETTER I
        !          19120: *
        !          19121: *      LOOP TO GENERATE LETTER I FNCLEVEL TIMES
        !          19122: *
        !          19123: PRSN1  BZE  XR,PRSN2         JUMP IF ALL SET
        !          19124:        JSR  PRTCH            ELSE PRINT AN I
        !          19125:        DCV  XR               DECREMENT COUNTER
        !          19126:        BRN  PRSN1            LOOP BACK
        !          19127: *
        !          19128: *      MERRE WITH ALL LETTER I CHARACTERS GENERATED
        !          19129: *
        !          19130: PRSN2  MOV  =CH$BL,WA        GET BLANK
        !          19131:        JSR  PRTCH            PRINT BLANK
        !          19132:        MOV  PRSNA,WA         RESTORE ENTRY WA
        !          19133:        MOV  (XS)+,XR         RESTORE ENTRY XR
        !          19134:        EXI                   RETURN TO PRTSN CALLER
        !          19135:        ENP                   END PROCEDURE PRTSN
        !          19136:        EJC
        !          19137: *
        !          19138: *      PRTST -- PRINT STRING TO STANDARD FILE
        !          19139: *
        !          19140: *      PLACE A STRING OF CHARACTERS IN THE STANDARD PRINT BUFFER
        !          19141: *
        !          19142: *      NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
        !          19143: *      IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
        !          19144: *      IF GLOBAL TTOUS IS NON-ZERO, STRING IS SENT TO TERMINAL
        !          19145: *      INSTEAD OF STANDARD OUTPUT FILE.
        !          19146: *      IF GLOBAL TTLST IS NON-ZERO, STRING IS SENT TO
        !          19147: *      TERMINAL AS WELL AS STANDARD OUTPUT FILE
        !          19148: *
        !          19149: *      (XR)                  STRING TO BE PRINTED
        !          19150: *      JSR  PRTST            CALL TO PRINT STRING
        !          19151: *      (PROFS)               UPDATED PAST CHARS PLACED
        !          19152: *
        !          19153: PRTST  PRC  R,0              ENTRY POINT
        !          19154:        BNZ  HEADP,PTST1      WERE HEADERS PRINTED
        !          19155:        JSR  PRTPS            NO - PRINT THEM
        !          19156: *
        !          19157: *      HEADERS DEALT WITH
        !          19158: *
        !          19159: PTST1  BZE  PRLEN,PTST7      SKIP IF NO O/P POSSIBLE
        !          19160:        BNZ  PRPUT,PTST2      SKIP IF PUTTING IS OK
        !          19161:        BZE  TTLST,PTST7      SKIP OUT IF NOT ERROR TO TERML
        !          19162: *
        !          19163: *       KEEP REGISTERS
        !          19164: *
        !          19165: PTST2  MOV  WA,PRSVA         SAVE WA
        !          19166:        MOV  WB,PRSVB         SAVE WB
        !          19167:        ZER  WB               SET CHARS PRINTED COUNT TO ZERO
        !          19168: *
        !          19169: *      LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
        !          19170: *
        !          19171: PTST3  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
        !          19172:        SUB  WB,WA            SUBTRACT COUNT OF CHARS ALREADY OUT
        !          19173:        BZE  WA,PTST6         JUMP TO EXIT IF NONE LEFT
        !          19174:        MOV  XL,-(XS)         ELSE STACK ENTRY XL
        !          19175:        MOV  XR,-(XS)         SAVE ARGUMENT
        !          19176:        MOV  XR,XL            COPY FOR EVENTUAL MOVE
        !          19177:        MOV  PRLEN,XR         LOAD PRINT BUFFER LENGTH
        !          19178:        SUB  PROFS,XR         GET CHARS LEFT IN PRINT BUFFER
        !          19179:        BNZ  XR,PTST4         SKIP IF ROOM LEFT ON THIS LINE
        !          19180:        JSR  PRTFH            PRINT THIS LINE
        !          19181:        MOV  PRLEN,XR         AND SET FULL WIDTH AVAILABLE
        !          19182:        EJC
        !          19183: *
        !          19184: *      PRTST (CONTINUED)
        !          19185: *
        !          19186: *      HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
        !          19187: *
        !          19188: PTST4  BLO  WA,XR,PTST5      JUMP IF ROOM FOR REST OF STRING
        !          19189:        MOV  XR,WA            ELSE SET TO FILL LINE
        !          19190: *
        !          19191: *      MERGE HERE WITH CHARACTER COUNT IN WA
        !          19192: *
        !          19193: PTST5  MOV  PRBUF,XR         POINT TO PRINT BUFFER
        !          19194:        PLC  XL,WB            POINT TO LOCATION IN STRING
        !          19195:        PSC  XR,PROFS         POINT TO LOCATION IN BUFFER
        !          19196:        ADD  WA,WB            BUMP STRING CHARS COUNT
        !          19197:        ADD  WA,PROFS         BUMP BUFFER POINTER
        !          19198:        MVC                   MOVE CHARACTERS TO BUFFER
        !          19199:        MOV  (XS)+,XR         RESTORE ARGUMENT POINTER
        !          19200:        MOV  (XS)+,XL         RESTORE ENTRY XL
        !          19201:        BRN  PTST3            LOOP BACK TO TEST FOR MORE
        !          19202: *
        !          19203: *      HERE TO EXIT AFTER PRINTING STRING
        !          19204: *
        !          19205: PTST6  MOV  PRSVB,WB         RESTORE ENTRY WB
        !          19206:        MOV  PRSVA,WA         RESTORE ENTRY WA
        !          19207: *
        !          19208: *      RETURN POINT
        !          19209: *
        !          19210: PTST7  EXI                   RETURN TO PRTST CALLER
        !          19211:        ENP                   END PROCEDURE PRTST
        !          19212: *
        !          19213: *      PRTVF -- PLACE A VALUE AND FLUSH STANDARD BUFFER
        !          19214: *
        !          19215: *      (XR)                  VALUE TO PRINT
        !          19216: *      JSR  PRTVF            CALL TO PRINT AND FLUSH
        !          19217: *
        !          19218: PRTVF  PRC  E,0              ENTRY POINT
        !          19219:        JSR  PRTVL            PLACE VALUE
        !          19220:        JSR  PRTFH            FLUSH BUFFER
        !          19221:        EXI                   RETURN TO CALLER
        !          19222:        ENP                   END PROCEDURE PRTVF
        !          19223:        EJC
        !          19224: *
        !          19225: *      PRTVL -- PRINT A VALUE
        !          19226: *
        !          19227: *      PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
        !          19228: *      A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
        !          19229: *
        !          19230: *      (XR)                  VALUE TO BE PRINTED
        !          19231: *      JSR  PRTVL            CALL TO PRINT VALUE
        !          19232: *      (WA,WB,WC,RA)         DESTROYED
        !          19233: *
        !          19234: PRTVL  PRC  R,0              ENTRY POINT, RECURSIVE
        !          19235:        MOV  XL,-(XS)         SAVE ENTRY XL
        !          19236:        MOV  XR,-(XS)         SAVE ARGUMENT
        !          19237:        CHK                   CHECK FOR STACK OVERFLOW
        !          19238: *
        !          19239: *      LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
        !          19240: *
        !          19241: PRV01  MOV  IDVAL(XR),PRVSI  COPY IDVAL (IF ANY)
        !          19242:        MOV  (XR),XL          LOAD FIRST WORD OF BLOCK
        !          19243:        LEI  XL               LOAD ENTRY POINT ID
        !          19244:        BSW  XL,BL$$T,PRV02   SWITCH ON BLOCK TYPE
        !          19245:        IFF  BL$TR,PRV04      TRBLK
        !          19246:        IFF  BL$AR,PRV05      ARBLK
        !          19247:        IFF  BL$IC,PRV08      ICBLK
        !          19248:        IFF  BL$NM,PRV09      NMBLK
        !          19249:        IFF  BL$PD,PRV10      PDBLK
        !          19250: .IF    .CNRA
        !          19251: .ELSE
        !          19252:        IFF  BL$RC,PRV08      RCBLK
        !          19253: .FI
        !          19254:        IFF  BL$SC,PRV11      SCBLK
        !          19255:        IFF  BL$SE,PRV12      SEBLK
        !          19256:        IFF  BL$TB,PRV13      TBBLK
        !          19257:        IFF  BL$VC,PRV13      VCBLK
        !          19258: .IF    .CNBF
        !          19259: .ELSE
        !          19260:        IFF  BL$BC,PRV15      BCBLK
        !          19261: .FI
        !          19262:        ESW                   END OF SWITCH ON BLOCK TYPE
        !          19263: *
        !          19264: *      HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
        !          19265: *
        !          19266: PRV02  JSR  DTYPE            GET DATATYPE NAME
        !          19267:        JSR  PRTST            PRINT DATATYPE NAME
        !          19268: *
        !          19269: *      COMMON EXIT POINT
        !          19270: *
        !          19271: PRV03  MOV  (XS)+,XR         RELOAD ARGUMENT
        !          19272:        MOV  (XS)+,XL         RESTORE XL
        !          19273:        EXI                   RETURN TO PRTVL CALLER
        !          19274: *
        !          19275: *      HERE FOR TRBLK
        !          19276: *
        !          19277: PRV04  MOV  TRVAL(XR),XR     LOAD REAL VALUE
        !          19278:        BRN  PRV01            AND LOOP BACK
        !          19279:        EJC
        !          19280: *
        !          19281: *      PRTVL (CONTINUED)
        !          19282: *
        !          19283: *      HERE FOR ARRAY (ARBLK)
        !          19284: *
        !          19285: *      PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
        !          19286: *
        !          19287: PRV05  MOV  XR,XL            PRESERVE ARGUMENT
        !          19288:        MOV  =SCARR,XR        POINT TO DATATYPE NAME (ARRAY)
        !          19289:        JSR  PRTST            PRINT IT
        !          19290:        MOV  =CH$PP,WA        LOAD LEFT PAREN
        !          19291:        JSR  PRTCH            PRINT LEFT PAREN
        !          19292:        ADD  AROFS(XL),XL     POINT TO PROTOTYPE
        !          19293:        MOV  (XL),XR          LOAD PROTOTYPE
        !          19294:        JSR  PRTST            PRINT PROTOTYPE
        !          19295: *
        !          19296: *      VCBLK, TBBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
        !          19297: *
        !          19298: PRV06  MOV  =CH$RP,WA        LOAD RIGHT PAREN
        !          19299:        JSR  PRTCH            PRINT RIGHT PAREN
        !          19300: *
        !          19301: *      PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
        !          19302: *
        !          19303: PRV07  MOV  =CH$BL,WA        LOAD BLANK
        !          19304:        JSR  PRTCH            PRINT IT
        !          19305:        MOV  =CH$NM,WA        LOAD NUMBER SIGN
        !          19306:        JSR  PRTCH            PRINT IT
        !          19307:        MTI  PRVSI            GET IDVAL
        !          19308:        JSR  PRTIN            PRINT ID NUMBER
        !          19309:        BRN  PRV03            BACK TO EXIT
        !          19310: *
        !          19311: *      HERE FOR INTEGER (ICBLK), REAL (RCBLK)
        !          19312: *
        !          19313: *      PRINT CHARACTER REPRESENTATION OF VALUE
        !          19314: *
        !          19315: PRV08  MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
        !          19316:        JSR  GTSTG            CONVERT TO STRING
        !          19317:        PPM                   ERROR RETURN IS IMPOSSIBLE
        !          19318:        JSR  PRTST            PRINT THE STRING
        !          19319:        MOV  XR,DNAMP         DELETE GARBAGE STRING FROM STORAGE
        !          19320:        BRN  PRV03            BACK TO EXIT
        !          19321:        EJC
        !          19322: *
        !          19323: *      PRTVL (CONTINUED)
        !          19324: *
        !          19325: *      NAME (NMBLK)
        !          19326: *
        !          19327: *      FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
        !          19328: *      FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
        !          19329: *
        !          19330: PRV09  MOV  NMBAS(XR),XL     LOAD NAME BASE
        !          19331:        MOV  (XL),WA          LOAD FIRST WORD OF BLOCK
        !          19332:        BEQ  WA,=B$KVT,PRV02  JUST PRINT NAME IF KEYWORD
        !          19333:        BEQ  WA,=B$EVT,PRV02  JUST PRINT NAME IF EXPRESSION VAR
        !          19334:        MOV  =CH$DT,WA        ELSE GET DOT
        !          19335:        JSR  PRTCH            AND PRINT IT
        !          19336:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
        !          19337:        JSR  PRTNM            PRINT NAME
        !          19338:        BRN  PRV03            BACK TO EXIT
        !          19339: *
        !          19340: *      PROGRAM DATATYPE (PDBLK)
        !          19341: *
        !          19342: *      PRINT DATATYPE NAME CH$BL CH$NM IDVAL
        !          19343: *
        !          19344: PRV10  JSR  DTYPE            GET DATATYPE NAME
        !          19345:        JSR  PRTST            PRINT DATATYPE NAME
        !          19346:        BRN  PRV07            MERGE BACK TO PRINT ID
        !          19347: *
        !          19348: *      HERE FOR STRING (SCBLK)
        !          19349: *
        !          19350: *      PRINT QUOTE STRING-CHARACTERS QUOTE
        !          19351: *
        !          19352: PRV11  MOV  =CH$SQ,WA        LOAD SINGLE QUOTE
        !          19353:        JSR  PRTCH            PRINT QUOTE
        !          19354:        JSR  PRTST            PRINT STRING VALUE
        !          19355:        JSR  PRTCH            PRINT ANOTHER QUOTE
        !          19356:        BRN  PRV03            BACK TO EXIT
        !          19357:        EJC
        !          19358: *
        !          19359: *      PRTVL (CONTINUED)
        !          19360: *
        !          19361: *      HERE FOR SIMPLE EXPRESSION (SEBLK)
        !          19362: *
        !          19363: *      PRINT ASTERISK VARIABLE-NAME
        !          19364: *
        !          19365: PRV12  MOV  =CH$AS,WA        LOAD ASTERISK
        !          19366:        JSR  PRTCH            PRINT ASTERISK
        !          19367:        MOV  SEVAR(XR),XR     LOAD VARIABLE POINTER
        !          19368:        JSR  PRTVN            PRINT VARIABLE NAME
        !          19369:        BRN  PRV03            JUMP BACK TO EXIT
        !          19370: *
        !          19371: *      HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
        !          19372: *
        !          19373: *      PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
        !          19374: *
        !          19375: PRV13  MOV  XR,XL            PRESERVE ARGUMENT
        !          19376:        JSR  DTYPE            GET DATATYPE NAME
        !          19377:        JSR  PRTST            PRINT DATATYPE NAME
        !          19378:        MOV  =CH$PP,WA        LOAD LEFT PAREN
        !          19379:        JSR  PRTCH            PRINT LEFT PAREN
        !          19380:        MOV  TBLEN(XL),WA     LOAD LENGTH OF BLOCK (=VCLEN)
        !          19381:        BTW  WA               CONVERT TO WORD COUNT
        !          19382:        SUB  =TBSI$,WA        ALLOW FOR STANDARD FIELDS
        !          19383:        BEQ  (XL),=B$TBT,PRV14 JUMP IF TABLE
        !          19384:        ADD  =VCTBD,WA        FOR VCBLK, ADJUST SIZE
        !          19385: *
        !          19386: *      PRINT PROTOTYPE
        !          19387: *
        !          19388: PRV14  MTI  WA               MOVE AS INTEGER
        !          19389:        JSR  PRTIN            PRINT INTEGER PROTOTYPE
        !          19390:        BRN  PRV06            MERGE BACK FOR REST
        !          19391: .IF    .CNBF
        !          19392: .ELSE
        !          19393:        EJC
        !          19394: *
        !          19395: *      PRTVL (CONTINUED)
        !          19396: *
        !          19397: *      HERE FOR BUFFER (BCBLK)
        !          19398: *
        !          19399: PRV15  MOV  XR,XL            PRESERVE ARGUMENT
        !          19400:        MOV  =SCBUF,XR        POINT TO DATATYPE NAME (BUFFER)
        !          19401:        JSR  PRTST            PRINT IT
        !          19402:        MOV  =CH$PP,WA        LOAD LEFT PAREN
        !          19403:        JSR  PRTCH            PRINT LEFT PAREN
        !          19404:        MOV  BCBUF(XL),XR     POINT TO BFBLK
        !          19405:        MTI  BFALC(XR)        LOAD ALLOCATION SIZE
        !          19406:        JSR  PRTIN            PRINT IT
        !          19407:        MOV  =CH$CM,WA        LOAD COMMA
        !          19408:        JSR  PRTCH            PRINT IT
        !          19409:        MTI  BCLEN(XL)        LOAD DEFINED LENGTH
        !          19410:        JSR  PRTIN            PRINT IT
        !          19411:        BRN  PRV06            MERGE TO FINISH UP
        !          19412: .FI
        !          19413:        ENP                   END PROCEDURE PRTVL
        !          19414:        EJC
        !          19415: *
        !          19416: *      PRTVN -- PRINT NATURAL VARIABLE NAME
        !          19417: *
        !          19418: *      PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
        !          19419: *
        !          19420: *      (XR)                  POINTER TO VRBLK
        !          19421: *      JSR  PRTVN            CALL TO PRINT VARIABLE NAME
        !          19422: *
        !          19423: PRTVN  PRC  E,0              ENTRY POINT
        !          19424:        MOV  XR,-(XS)         STACK VRBLK POINTER
        !          19425:        ADD  *VRSOF,XR        POINT TO POSSIBLE STRING NAME
        !          19426:        BNZ  SCLEN(XR),PRVN1  JUMP IF NOT SYSTEM VARIABLE
        !          19427:        MOV  VRSVO(XR),XR     POINT TO SVBLK WITH NAME
        !          19428: *
        !          19429: *      MERGE HERE WITH DUMMY SCBLK POINTER IN XR
        !          19430: *
        !          19431: PRVN1  JSR  PRTST            PRINT STRING NAME OF VARIABLE
        !          19432:        MOV  (XS)+,XR         RESTORE VRBLK POINTER
        !          19433:        EXI                   RETURN TO PRTVN CALLER
        !          19434:        ENP                   END PROCEDURE PRTVN
        !          19435:        EJC
        !          19436: *
        !          19437: *      PTTFH -- FLUSH TERMINAL BUFFER
        !          19438: *
        !          19439: *      PRINTS THE CONTENTS OF THE TTY BUFFER, RESETS
        !          19440: *      THE BUFFER TO ALL BLANKS AND RESETS THE POINTER.
        !          19441: *
        !          19442: *      JSR  PTTFH            CALL TO FLUSH BUFFER
        !          19443: *
        !          19444: PTTFH  PRC  E,0              ENTRY POINT
        !          19445:        BZE  TTLEN,PTTF2      SKIP IF NO TERMINAL
        !          19446:        MOV  XL,-(XS)         SAVE XL
        !          19447:        MOV  XR,-(XS)         SAVE XR
        !          19448:        MOV  WA,-(XS)         SAVE WA
        !          19449:        MOV  WC,-(XS)         SAVE WC
        !          19450:        MOV  TTBUF,XR         LOAD POINTER TO BUFFER
        !          19451:        MOV  TTOFS,WC         LOAD NUMBER OF CHARS IN BUFFER
        !          19452:        JSR  SYSPI            CALL SYSTEM PRINT ROUTINE
        !          19453:        PPM  PTTF3            JUMP IF FAILED
        !          19454:        PPM  EROSI            STOP IF ERROR
        !          19455: *
        !          19456: *      BLANK BUFFER
        !          19457: *
        !          19458: PTTF1  MOV  TTBLK,XL         POINT TO BLANKING STRING
        !          19459:        MOV  TTCHS,XR         POINT TO BUFFER
        !          19460:        MOV  TTCMV,WA         COUNT OF BAUS TO MOVE
        !          19461:        MVW                   MOVE BLANKS INTO BUFFER
        !          19462:        ZER  TTOFS            RESET OFFSET
        !          19463:        MOV  (XS)+,WC         RESTORE WC
        !          19464:        MOV  (XS)+,WA         RECOVER WA
        !          19465:        MOV  (XS)+,XR         RESTORE XR
        !          19466:        MOV  (XS)+,XL         RESTORE XL
        !          19467: *
        !          19468: *      RETURN POINT
        !          19469: *
        !          19470: PTTF2  EXI                   RETURN TO CALLER
        !          19471: *
        !          19472: *      A FAILURE SUCH AS FILE OVERFILLED OCCURRED
        !          19473: *
        !          19474: PTTF3  BZE  STAGX,PTTF1      IGNORE IF COMPILE TIME
        !          19475:        BRN  EXFAL            ELSE CAUSE STMT FAILURE
        !          19476:        ENP                   END PROCEDURE
        !          19477:        EJC
        !          19478: *
        !          19479: *      PTTST -- PRINT STRING TO TERMINAL
        !          19480: *
        !          19481: *      PLACE A STRING OF CHARACTERS IN THE TERMINAL BUFFER
        !          19482: *
        !          19483: *      NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
        !          19484: *      IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
        !          19485: *
        !          19486: *      (XR)                  STRING TO BE PRINTED
        !          19487: *      JSR  PTTST            CALL TO PRINT STRING
        !          19488: *      (TTOFS)               UPDATED PAST CHARS PLACED
        !          19489: *
        !          19490: PTTST  PRC  E,0              ENTRY POINT
        !          19491:        BZE  TTLEN,PTTS5      SKIP IF NO TERMINAL
        !          19492:        MOV  WA,PRTVA         SAVE WA
        !          19493:        MOV  WB,PRTVB         SAVE WB
        !          19494:        ZER  WB               SET CHARS PRINTED COUNT TO ZERO
        !          19495: *
        !          19496: *      LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
        !          19497: *
        !          19498: PTTS1  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
        !          19499:        SUB  WB,WA            SUBTRACT COUNT OF CHARS ALREADY OUT
        !          19500:        BZE  WA,PTTS4         JUMP TO EXIT IF NONE LEFT
        !          19501:        MOV  XL,-(XS)         ELSE STACK ENTRY XL
        !          19502:        MOV  XR,-(XS)         SAVE ARGUMENT
        !          19503:        MOV  XR,XL            COPY FOR EVENTUAL MOVE
        !          19504:        MOV  TTLEN,XR         LOAD BUFFER LENGTH
        !          19505:        SUB  TTOFS,XR         GET CHARS LEFT IN BUFFER
        !          19506:        BNZ  XR,PTTS2         SKIP IF ROOM LEFT ON THIS LINE
        !          19507:        JSR  PTTFH            ELSE PRINT THIS LINE
        !          19508:        MOV  TTLEN,XR         AND SET FULL WIDTH AVAILABLE
        !          19509: *
        !          19510: *      HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
        !          19511: *
        !          19512: PTTS2  BLO  WA,XR,PTTS3      JUMP IF ROOM FOR REST OF STRING
        !          19513:        MOV  XR,WA            ELSE SET TO FILL LINE
        !          19514: *
        !          19515: *      MERGE HERE WITH CHARACTER COUNT IN WA
        !          19516: *
        !          19517: PTTS3  MOV  TTBUF,XR         POINT TO PRINT BUFFER
        !          19518:        PLC  XL,WB            POINT TO LOCATION IN STRING
        !          19519:        PSC  XR,TTOFS         POINT TO LOCATION IN BUFFER
        !          19520:        ADD  WA,WB            BUMP STRING CHARS COUNT
        !          19521:        ADD  WA,TTOFS         BUMP BUFFER POINTER
        !          19522:        MVC                   MOVE CHARACTERS TO BUFFER
        !          19523:        MOV  (XS)+,XR         RESTORE ARGUMENT POINTER
        !          19524:        MOV  (XS)+,XL         RESTORE ENTRY XL
        !          19525:        BRN  PTTS1            LOOP BACK TO TEST FOR MORE
        !          19526:        EJC
        !          19527: *
        !          19528: *      HERE TO EXIT AFTER PRINTING STRING
        !          19529: *
        !          19530: PTTS4  MOV  PRTVB,WB         RESTORE ENTRY WB
        !          19531:        MOV  PRTVA,WA         RESTORE ENTRY WA
        !          19532: *
        !          19533: *      RETURN POINT
        !          19534: *
        !          19535: PTTS5  EXI                   RETURN TO PTTST CALLER
        !          19536:        ENP                   END PROCEDURE PTTST
        !          19537: .IF    .CNRA
        !          19538: .ELSE
        !          19539:        EJC
        !          19540: *
        !          19541: *      RCBLD -- BUILD A REAL BLOCK
        !          19542: *
        !          19543: *      (RA)                  REAL VALUE FOR RCBLK
        !          19544: *      JSR  RCBLD            CALL TO BUILD REAL BLOCK
        !          19545: *      (XR)                  POINTER TO RESULT RCBLK
        !          19546: *      (WA)                  DESTROYED
        !          19547: *
        !          19548: RCBLD  PRC  E,0              ENTRY POINT
        !          19549:        MOV  DNAMP,XR         LOAD POINTER TO NEXT AVAILABLE LOC
        !          19550:        ADD  *RCSI$,XR        POINT PAST NEW RCBLK
        !          19551:        BLO  XR,DNAME,RCBL1   JUMP IF THERE IS ROOM
        !          19552:        MOV  *RCSI$,WA        ELSE LOAD RCBLK LENGTH
        !          19553:        JSR  ALLOC            USE STANDARD ALLOCATOR TO GET BLOCK
        !          19554:        ADD  WA,XR            POINT PAST BLOCK TO MERGE
        !          19555: *
        !          19556: *      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
        !          19557: *
        !          19558: RCBL1  MOV  XR,DNAMP         SET NEW POINTER
        !          19559:        SUB  *RCSI$,XR        POINT BACK TO START OF BLOCK
        !          19560:        MOV  =B$RCL,(XR)      STORE TYPE WORD
        !          19561:        STR  RCVAL(XR)        STORE REAL VALUE IN RCBLK
        !          19562:        EXI                   RETURN TO RCBLD CALLER
        !          19563:        ENP                   END PROCEDURE RCBLD
        !          19564: .FI
        !          19565:        EJC
        !          19566: *
        !          19567: *      READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
        !          19568: *
        !          19569: *      READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
        !          19570: *      CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
        !          19571: *      LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
        !          19572: *      SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
        !          19573: *
        !          19574: *      THE GLOBAL FLAG RDRER IS SET JUST BEFORE THE READ, AND
        !          19575: *      CLEARED AFTER IT.  THIS IS SO THAT IN THE EVENT SYSRD
        !          19576: *      OR SYSRI TAKE AN EROSI EXIT, THE ERROR APPENDAGE CAN
        !          19577: *      RECOGNIZE THE SITUATION AND TAKE APPROPRIATE ACTION.
        !          19578: *
        !          19579: *      JSR  READR            CALL TO READ NEXT IMAGE
        !          19580: *      (XR)                  PTR TO NEXT IMAGE (0 IF NONE)
        !          19581: *      (R$CNI)               COPY OF POINTER
        !          19582: *      (WA,WB,WC,XL)         DESTROYED
        !          19583: *
        !          19584: READR  PRC  E,0              ENTRY POINT
        !          19585:        MOV  R$CNI,XR         GET PTR TO NEXT IMAGE
        !          19586:        BNZ  XR,READ5         EXIT IF ALREADY READ
        !          19587: *
        !          19588: *      MERGE FROM -COPY EOF TO TRY READ
        !          19589: *
        !          19590: READ0  BEQ  STAGE,=STGIC,READ1 READ IF INITIAL COMPILE
        !          19591:        BZE  R$COP,READ6      ELSE EXIT IF NO -COPY IN FORCE
        !          19592: *
        !          19593: *      ATTEMPT READ
        !          19594: *
        !          19595: READ1  MOV  CSWIN,WA         MAX READ LENGTH
        !          19596:        MNZ  RDRER            NOTE IN-READR IN CASE EROSI
        !          19597:        JSR  ALOCS            ALLOCATE BUFFER
        !          19598:        BZE  TTINS,READ2      SKIP IF STANDARD INPUT FILE
        !          19599:        JSR  SYSRI            READ FROM TERMINAL
        !          19600:        PPM  READ7            FAIL
        !          19601:        PPM  EROSI            ERROR
        !          19602:        BRN  READ3            MERGE
        !          19603: *
        !          19604: *      READ FROM STANDARD FILE
        !          19605: *
        !          19606: READ2  JSR  SYSRD            READ INPUT IMAGE
        !          19607:        PPM  READ7            JUMP IF END OF FILE
        !          19608:        PPM  EROSI            ERROR RETURN
        !          19609: *
        !          19610: *      MERGE
        !          19611: *
        !          19612: READ3  ZER  RDRER            NOTE NOT-IN-READR FOR ERROR RTN
        !          19613:        MNZ  WB               SET TRIMR TO PERFORM TRIM
        !          19614:        BLE  SCLEN(XR),CSWIN,READ4  USE SMALLER OF STRING LNTH..
        !          19615:        MOV  CSWIN,SCLEN(XR)  ... AND XXX OF -INXXX
        !          19616: *
        !          19617: *      PERFORM THE TRIM
        !          19618: *
        !          19619: READ4  JSR  TRIMR            TRIM TRAILING BLANKS
        !          19620: *
        !          19621: *      MERGE HERE AFTER READ
        !          19622: *
        !          19623: READ5  MOV  XR,R$CNI         STORE COPY OF POINTER
        !          19624: *
        !          19625: *      MERGE HERE IF NO READ ATTEMPTED
        !          19626: *
        !          19627: READ6  EXI                   RETURN TO READR CALLER
        !          19628: *
        !          19629: *      HERE ON END OF FILE
        !          19630: *
        !          19631: READ7  ZER  RDRER            NOTE NOT-IN-READR FOR ERR
        !          19632:        MOV  XR,DNAMP         POP UNUSED SCBLK
        !          19633:        ZER  XR               ZERO PTR AS RESULT
        !          19634:        BZE  R$COP,READ5      SKIP IF NO -COPY IN FORCE
        !          19635:        JSR  COPND            CALL TO END THIS -COPY (EOF)
        !          19636:        BRN  READ0            TRY AGAIN
        !          19637:        ENP                   END PROCEDURE READR
        !          19638: .IF    .CASL
        !          19639:        EJC
        !          19640: *
        !          19641: *      SBSCC -- BUILD SUBSTRING WITH CASE CONVERSION
        !          19642: *
        !          19643: *      (XL)                  PTR TO SCBLK CONTAINING CHARS
        !          19644: *      (WA)                  CHAR COUNT
        !          19645: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
        !          19646: *      JSR  SBSCC            CALL TO BUILD SUBSTRING
        !          19647: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
        !          19648: *      (WA,WB,WC,XL,IA)      DESTROYED
        !          19649: *
        !          19650: *      IF OPTION .CPLC IS SELECTED (PREFER LOWER CASE), TARGET
        !          19651: *      CASE IS LOWER CASE, OTHERWISE IT IS UPPER CASE.
        !          19652: *
        !          19653: SBSCC  PRC  E,0              ENTRY POINT
        !          19654:        BZE  WA,SBSC4         JUMP IF NULL SUBSTRING
        !          19655:        JSR  ALOCS            ELSE ALLOCATE SCBLK
        !          19656:        MOV  WC,WA            MOVE NUMBER OF CHARACTERS
        !          19657:        MOV  XR,WC            SAVE PTR TO NEW SCBLK
        !          19658:        PLC  XL,WB            PREPARE TO LOAD CHARS FROM OLD BLK
        !          19659:        PSC  XR               PREPARE TO STORE CHARS IN NEW BLK
        !          19660:        LCT  WA,WA            TO COUNT ROUND LOOP
        !          19661: *
        !          19662: *      LOOP TO COPY AND TRANSLATE CHARS
        !          19663: *
        !          19664: SBSC1  LCH  WB,(XL)+         GET CHAR
        !          19665: .IF    .CPLC
        !          19666:        BGT  WB,=CH$L$,SBSC2  SKIP IF NOT UC LETTER
        !          19667:        BLT  WB,=CH$LA,SBSC2  SKIP IF NOT UC LETTER
        !          19668: .IF    .CSCV
        !          19669:        CUL  WB               CONVERT FROM UC TO LC
        !          19670: .ELSE
        !          19671:        ADD  =DFA$A,WB        CONVERT FROM UC TO LC
        !          19672: .FI
        !          19673: .ELSE
        !          19674:        BGT  WB,=CH$$$,SBSC2  SKIP IF NOT A LC LETTER
        !          19675:        BLT  WB,=CH$$A,SBSC2  SKIP IF NOT A LC LETTER
        !          19676: .IF    .CSCV
        !          19677:        CLU  WB               CONVERT FROM LC TO UC
        !          19678: .ELSE
        !          19679:        SUB  =DFA$A,WB        CONVERT FROM LC TO UC
        !          19680: .FI
        !          19681: .FI
        !          19682: *
        !          19683: *      STORE CHAR IN NEW SUBSTRING
        !          19684: *
        !          19685: SBSC2  SCH  WB,(XR)+         STORE CHAR
        !          19686:        BCT  WA,SBSC1         LOOP
        !          19687:        MOV  WC,XR            RESTORE SCBLK POINTER
        !          19688: *
        !          19689: *      RETURN POINT
        !          19690: *
        !          19691: SBSC3  ZER  XL               CLEAR GARBAGE POINTER IN XL
        !          19692:        EXI                   RETURN TO SBSCC CALLER
        !          19693: *
        !          19694: *      HERE FOR NULL SUBSTRING
        !          19695: *
        !          19696: SBSC4  MOV  =NULLS,XR        SET NULL STRING AS RESULT
        !          19697:        BRN  SBSC3            RETURN
        !          19698:        ENP                   END PROCEDURE SBSCC
        !          19699:        EJC
        !          19700: *
        !          19701: *      SBSTG -- BUILD SUBSTRING POSSIBLY CONVERTING CASE
        !          19702: *
        !          19703: *      (XL)                  PTR TO SCBLK CONTAINING CHARS
        !          19704: *      (WA)                  CHAR COUNT
        !          19705: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
        !          19706: *      JSR  SBSTG            CALL TO BUILD SUBSTRING
        !          19707: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
        !          19708: *      (WA,WB,WC,XL,IA)      DESTROYED
        !          19709: *
        !          19710: *      IF CASE IS TO BE IGNORED (-CASEIG OR .CSIG), SUBSTRING
        !          19711: *      IS CONVERTED TO PREFERRED CASE (DEFAULT UPPER),
        !          19712: *      OTHERWISE CASE IS LEFT ALONE.
        !          19713: *
        !          19714: SBSTG  PRC  E,0              ENTRY POINT
        !          19715:        BZE  CSWCI,SBSG1      SKIP IF CASE NOT IGNORED
        !          19716:        JSR  SBSCC            CONVERT TO IGNORE CASE
        !          19717:        EXI                   RETURN TO CALLER
        !          19718: *
        !          19719: SBSG1  JSR  SBSTR            READ SUBSTRING IN MIXED CASE
        !          19720:        EXI                   RETURN TO CALLER
        !          19721:        ENP                   END PROCEDURE SBSTG
        !          19722: .FI
        !          19723:        EJC
        !          19724: *
        !          19725: *      SBSTR -- BUILD A SUBSTRING
        !          19726: *
        !          19727: *      (XL)                  PTR TO SCBLK CONTAINING CHARS
        !          19728: *      (WA)                  NUMBER OF CHARS IN SUBSTRING
        !          19729: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
        !          19730: *      JSR  SBSTR            CALL TO BUILD SUBSTRING
        !          19731: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
        !          19732: *      (WA,WB,WC,XL,IA)      DESTROYED
        !          19733: *
        !          19734: *      NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
        !          19735: *      (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
        !          19736: *      VARIABLE AS A STANDARD STRING VALUE.
        !          19737: *
        !          19738: SBSTR  PRC  E,0              ENTRY POINT
        !          19739:        BZE  WA,SBST2         JUMP IF NULL SUBSTRING
        !          19740:        JSR  ALOCS            ELSE ALLOCATE SCBLK
        !          19741:        MOV  WC,WA            MOVE NUMBER OF CHARACTERS
        !          19742:        MOV  XR,WC            SAVE PTR TO NEW SCBLK
        !          19743:        PLC  XL,WB            PREPARE TO LOAD CHARS FROM OLD BLK
        !          19744:        PSC  XR               PREPARE TO STORE CHARS IN NEW BLK
        !          19745:        MVC                   MOVE CHARACTERS TO NEW STRING
        !          19746:        MOV  WC,XR            THEN RESTORE SCBLK POINTER
        !          19747: *
        !          19748: *      RETURN POINT
        !          19749: *
        !          19750: SBST1  ZER  XL               CLEAR GARBAGE POINTER IN XL
        !          19751:        EXI                   RETURN TO SBSTR CALLER
        !          19752: *
        !          19753: *      HERE FOR NULL SUBSTRING
        !          19754: *
        !          19755: SBST2  MOV  =NULLS,XR        SET NULL STRING AS RESULT
        !          19756:        BRN  SBST1            RETURN
        !          19757:        ENP                   END PROCEDURE SBSTR
        !          19758:        EJC
        !          19759: *
        !          19760: *      SCANE -- SCAN AN ELEMENT
        !          19761: *
        !          19762: *      SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
        !          19763: *      TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
        !          19764: *
        !          19765: *      (SCNCC)               NON-ZERO IF CALLED FROM CNCRD
        !          19766: *      JSR  SCANE            CALL TO SCAN ELEMENT
        !          19767: *      (XR)                  RESULT POINTER (SEE BELOW)
        !          19768: *      (XL)                  SYNTAX TYPE CODE (T$XXX)
        !          19769: *
        !          19770: *      THE FOLLOWING GLOBAL LOCATIONS ARE USED.
        !          19771: *
        !          19772: *      R$CIM                 POINTER TO STRING BLOCK (SCBLK)
        !          19773: *                            FOR CURRENT INPUT IMAGE.
        !          19774: *
        !          19775: *      R$CNI                 POINTER TO NEXT INPUT IMAGE STRING
        !          19776: *                            POINTER (ZERO IF NONE).
        !          19777: *
        !          19778: *      R$SCP                 SAVE POINTER (EXIT XR) FROM LAST
        !          19779: *                            CALL IN CASE RESCAN IS SET.
        !          19780: *
        !          19781: *      SCNBL                 THIS LOCATION IS SET NON-ZERO ON
        !          19782: *                            EXIT IF SCANE SCANNED PAST BLANKS
        !          19783: *                            BEFORE LOCATING THE CURRENT ELEMENT
        !          19784: *                            THE END OF A LINE COUNTS AS BLANKS.
        !          19785: *
        !          19786: *      SCNCC                 CNCRD SETS THIS NON-ZERO TO SCAN
        !          19787: *                            CONTROL CARD NAMES AND CLEARS IT
        !          19788: *                            ON RETURN
        !          19789: *
        !          19790: *      SCNIL                 LENGTH OF CURRENT INPUT IMAGE
        !          19791: *
        !          19792: *      SCNGO                 IF SET NON-ZERO ON ENTRY, F AND S
        !          19793: *                            ARE RETURNED AS SEPARATE SYNTAX
        !          19794: *                            TYPES (NOT LETTERS) (GOTO PRO-
        !          19795: *                            CESSING). SCNGO IS RESET ON EXIT.
        !          19796: *
        !          19797: *      SCNPT                 OFFSET TO CURRENT LOC IN R$CIM
        !          19798: *
        !          19799: *      SCNRS                 IF SET NON-ZERO ON ENTRY, SCANE
        !          19800: *                            RETURNS THE SAME RESULT AS ON THE
        !          19801: *                            LAST CALL (RESCAN). SCNRS IS RESET
        !          19802: *                            ON EXIT FROM ANY CALL TO SCANE.
        !          19803: *
        !          19804: *      SCNTP                 SAVE SYNTAX TYPE FROM LAST
        !          19805: *                            CALL (IN CASE RESCAN IS SET).
        !          19806:        EJC
        !          19807: *
        !          19808: *      SCANE (CONTINUED)
        !          19809: *
        !          19810: *
        !          19811: *
        !          19812: *      ELEMENT SCANNED       XL        XR
        !          19813: *      ---------------       --        --
        !          19814: *
        !          19815: *      CONTROL CARD NAME     0         POINTER TO SCBLK FOR NAME
        !          19816: *
        !          19817: *      UNARY OPERATOR        T$UOP     PTR TO OPERATOR DVBLK
        !          19818: *
        !          19819: *      LEFT PAREN            T$LPR     T$LPR
        !          19820: *
        !          19821: *      LEFT BRACKET          T$LBR     T$LBR
        !          19822: *
        !          19823: *      COMMA                 T$CMA     T$CMA
        !          19824: *
        !          19825: *      FUNCTION CALL         T$FNC     PTR TO FUNCTION VRBLK
        !          19826: *
        !          19827: *      VARIABLE              T$VAR     PTR TO VRBLK
        !          19828: *
        !          19829: *      STRING CONSTANT       T$CON     PTR TO SCBLK
        !          19830: *
        !          19831: *      INTEGER CONSTANT      T$CON     PTR TO ICBLK
        !          19832: *
        !          19833: .IF    .CNRA
        !          19834: .ELSE
        !          19835: *      REAL CONSTANT         T$CON     PTR TO RCBLK
        !          19836: *
        !          19837: .FI
        !          19838: *      BINARY OPERATOR       T$BOP     PTR TO OPERATOR DVBLK
        !          19839: *
        !          19840: *      RIGHT PAREN           T$RPR     T$RPR
        !          19841: *
        !          19842: *      RIGHT BRACKET         T$RBR     T$RBR
        !          19843: *
        !          19844: *      COLON                 T$COL     T$COL
        !          19845: *
        !          19846: *      SEMI-COLON            T$SMC     T$SMC
        !          19847: *
        !          19848: *      F (SCNGO NE 0)        T$FGO     T$FGO
        !          19849: *
        !          19850: *      S (SCNGO NE 0)        T$SGO     T$SGO
        !          19851:        EJC
        !          19852: *
        !          19853: *      SCANE (CONTINUED)
        !          19854: *
        !          19855: *      ENTRY POINT
        !          19856: *
        !          19857: SCANE  PRC  E,0              ENTRY POINT
        !          19858:        ZER  SCNBL            RESET BLANKS FLAG
        !          19859:        MOV  WA,SCNSA         SAVE WA
        !          19860:        MOV  WB,SCNSB         SAVE WB
        !          19861:        MOV  WC,SCNSC         SAVE WC
        !          19862:        BZE  SCNRS,SCN03      JUMP IF NO RESCAN
        !          19863: *
        !          19864: *      HERE FOR RESCAN REQUEST
        !          19865: *
        !          19866:        MOV  SCNTP,XL         SET PREVIOUS RETURNED SCAN TYPE
        !          19867:        MOV  R$SCP,XR         SET PREVIOUS RETURNED POINTER
        !          19868:        ZER  SCNRS            RESET RESCAN SWITCH
        !          19869:        BRN  SCN13            JUMP TO EXIT
        !          19870: *
        !          19871: *      COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
        !          19872: *
        !          19873: SCN01  JSR  READR            READ NEXT IMAGE
        !          19874:        MOV  *DVUBS,WB        SET WB FOR NOT READING NAME
        !          19875:        BZE  XR,SCN30         TREAT AS SEMI-COLON IF NONE
        !          19876:        PLC  XR               ELSE POINT TO FIRST CHARACTER
        !          19877:        LCH  WC,(XR)          LOAD FIRST CHARACTER
        !          19878:        BEQ  WC,=CH$DT,SCN02  JUMP IF DOT FOR CONTINUATION
        !          19879:        BNE  WC,=CH$PL,SCN30  ELSE TREAT AS SEMICOLON UNLESS PLUS
        !          19880: *
        !          19881: *      HERE FOR CONTINUATION LINE
        !          19882: *
        !          19883: SCN02  JSR  NEXTS            ACQUIRE NEXT SOURCE IMAGE
        !          19884:        MOV  =NUM01,SCNPT     SET SCAN POINTER PAST CONTINUATION
        !          19885:        MNZ  SCNBL            SET BLANKS FLAG
        !          19886:        EJC
        !          19887: *
        !          19888: *      SCANE (CONTINUED)
        !          19889: *
        !          19890: *      MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
        !          19891: *
        !          19892: SCN03  MOV  SCNPT,WA         LOAD CURRENT OFFSET
        !          19893:        BEQ  WA,SCNIL,SCN01   CHECK CONTINUATION IF END
        !          19894:        MOV  R$CIM,XL         POINT TO CURRENT LINE
        !          19895:        PLC  XL,WA            POINT TO CURRENT CHARACTER
        !          19896:        MOV  WA,SCNSE         SET START OF ELEMENT LOCATION
        !          19897:        MOV  =OPDVS,WC        POINT TO OPERATOR DV LIST
        !          19898:        MOV  *DVUBS,WB        SET CONSTANT FOR OPERATOR CIRCUIT
        !          19899:        BRN  SCN06            START SCANNING
        !          19900: *
        !          19901: *      LOOP HERE TO IGNORE LEADING BLANKS AND TABS
        !          19902: *
        !          19903: SCN05  BZE  WB,SCN10         JUMP IF TRAILING
        !          19904:        ICV  SCNSE            INCREMENT START OF ELEMENT
        !          19905:        BEQ  WA,SCNIL,SCN01   JUMP IF END OF IMAGE
        !          19906:        MNZ  SCNBL            NOTE BLANKS SEEN
        !          19907: *
        !          19908: *      THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
        !          19909: *      THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
        !          19910: *      THE REGISTERS ARE USED AS FOLLOWS.
        !          19911: *
        !          19912: *      (XR)                  SCRATCH
        !          19913: *      (XL)                  PTR TO NEXT CHARACTER
        !          19914: *      (WA)                  CURRENT SCAN OFFSET
        !          19915: *      (WB)                  *DVUBS (0 IF SCANNING NAME,CONST)
        !          19916: *      (WC)                  =OPDVS (0 IF SCANNING CONSTANT)
        !          19917: *
        !          19918: SCN06  LCH  XR,(XL)+         GET NEXT CHARACTER
        !          19919:        ICV  WA               BUMP SCAN OFFSET
        !          19920:        MOV  WA,SCNPT         STORE OFFSET PAST CHAR SCANNED
        !          19921:        BGE  XR,=CFP$U,SCN07  QUICK CHECK FOR OTHER CHAR
        !          19922:        BSW  XR,CFP$U,SCN07   SWITCH ON SCANNED CHARACTER
        !          19923: *
        !          19924: *      SWITCH TABLE FOR SWITCH ON CHARACTER
        !          19925: *
        !          19926:        IFF  CH$BL,SCN05      BLANK
        !          19927: .IF    .CAHT
        !          19928:        IFF  CH$HT,SCN05      HORIZONTAL TAB
        !          19929: .FI
        !          19930: .IF    .CAVT
        !          19931:        IFF  CH$VT,SCN05      VERTICAL TAB
        !          19932: .FI
        !          19933:        IFF  CH$D0,SCN08      DIGIT 0
        !          19934:        IFF  CH$D1,SCN08      DIGIT 1
        !          19935:        IFF  CH$D2,SCN08      DIGIT 2
        !          19936:        IFF  CH$D3,SCN08      DIGIT 3
        !          19937:        IFF  CH$D4,SCN08      DIGIT 4
        !          19938:        IFF  CH$D5,SCN08      DIGIT 5
        !          19939:        IFF  CH$D6,SCN08      DIGIT 6
        !          19940:        IFF  CH$D7,SCN08      DIGIT 7
        !          19941:        IFF  CH$D8,SCN08      DIGIT 8
        !          19942:        IFF  CH$D9,SCN08      DIGIT 9
        !          19943:        EJC
        !          19944: *
        !          19945: *      SCANE (CONTINUED)
        !          19946: *
        !          19947:        IFF  CH$LA,SCN09      LETTER A
        !          19948:        IFF  CH$LB,SCN09      LETTER B
        !          19949:        IFF  CH$LC,SCN09      LETTER C
        !          19950:        IFF  CH$LD,SCN09      LETTER D
        !          19951:        IFF  CH$LE,SCN09      LETTER E
        !          19952:        IFF  CH$LG,SCN09      LETTER G
        !          19953:        IFF  CH$LH,SCN09      LETTER H
        !          19954:        IFF  CH$LI,SCN09      LETTER I
        !          19955:        IFF  CH$LJ,SCN09      LETTER J
        !          19956:        IFF  CH$LK,SCN09      LETTER K
        !          19957:        IFF  CH$LL,SCN09      LETTER L
        !          19958:        IFF  CH$LM,SCN09      LETTER M
        !          19959:        IFF  CH$LN,SCN09      LETTER N
        !          19960:        IFF  CH$LO,SCN09      LETTER O
        !          19961:        IFF  CH$LP,SCN09      LETTER P
        !          19962:        IFF  CH$LQ,SCN09      LETTER Q
        !          19963:        IFF  CH$LR,SCN09      LETTER R
        !          19964:        IFF  CH$LT,SCN09      LETTER T
        !          19965:        IFF  CH$LU,SCN09      LETTER U
        !          19966:        IFF  CH$LV,SCN09      LETTER V
        !          19967:        IFF  CH$LW,SCN09      LETTER W
        !          19968:        IFF  CH$LX,SCN09      LETTER X
        !          19969:        IFF  CH$LY,SCN09      LETTER Y
        !          19970:        IFF  CH$L$,SCN09      LETTER Z
        !          19971: .IF    .CASL
        !          19972:        IFF  CH$$A,SCN09      SHIFTED A
        !          19973:        IFF  CH$$B,SCN09      SHIFTED B
        !          19974:        IFF  CH$$C,SCN09      SHIFTED C
        !          19975:        IFF  CH$$D,SCN09      SHIFTED D
        !          19976:        IFF  CH$$E,SCN09      SHIFTED E
        !          19977:        IFF  CH$$F,SCN20      SHIFTED F
        !          19978:        IFF  CH$$G,SCN09      SHIFTED G
        !          19979:        IFF  CH$$H,SCN09      SHIFTED H
        !          19980:        IFF  CH$$I,SCN09      SHIFTED I
        !          19981:        IFF  CH$$J,SCN09      SHIFTED J
        !          19982:        IFF  CH$$K,SCN09      SHIFTED K
        !          19983:        IFF  CH$$L,SCN09      SHIFTED L
        !          19984:        IFF  CH$$M,SCN09      SHIFTED M
        !          19985:        IFF  CH$$N,SCN09      SHIFTED N
        !          19986:        IFF  CH$$O,SCN09      SHIFTED O
        !          19987:        IFF  CH$$P,SCN09      SHIFTED P
        !          19988:        IFF  CH$$Q,SCN09      SHIFTED Q
        !          19989:        IFF  CH$$R,SCN09      SHIFTED R
        !          19990:        IFF  CH$$S,SCN21      SHIFTED S
        !          19991:        IFF  CH$$T,SCN09      SHIFTED T
        !          19992:        IFF  CH$$U,SCN09      SHIFTED U
        !          19993:        IFF  CH$$V,SCN09      SHIFTED V
        !          19994:        IFF  CH$$W,SCN09      SHIFTED W
        !          19995:        IFF  CH$$X,SCN09      SHIFTED X
        !          19996:        IFF  CH$$Y,SCN09      SHIFTED Y
        !          19997:        IFF  CH$$$,SCN09      SHIFTED Z
        !          19998: .FI
        !          19999:        EJC
        !          20000: *
        !          20001: *      SCANE (CONTINUED)
        !          20002: *
        !          20003:        IFF  CH$SQ,SCN16      SINGLE QUOTE
        !          20004:        IFF  CH$DQ,SCN17      DOUBLE QUOTE
        !          20005:        IFF  CH$LF,SCN20      LETTER F
        !          20006:        IFF  CH$LS,SCN21      LETTER S
        !          20007:        IFF  CH$UN,SCN24      UNDERLINE
        !          20008:        IFF  CH$PP,SCN25      LEFT PAREN
        !          20009:        IFF  CH$RP,SCN26      RIGHT PAREN
        !          20010:        IFF  CH$RB,SCN27      RIGHT BRACKET
        !          20011:        IFF  CH$BB,SCN28      LEFT BRACKET
        !          20012:        IFF  CH$CB,SCN27      RIGHT BRACKET
        !          20013:        IFF  CH$OB,SCN28      LEFT BRACKET
        !          20014:        IFF  CH$CL,SCN29      COLON
        !          20015:        IFF  CH$SM,SCN30      SEMI-COLON
        !          20016:        IFF  CH$CM,SCN31      COMMA
        !          20017:        IFF  CH$DT,SCN32      DOT
        !          20018:        IFF  CH$PL,SCN34      PLUS
        !          20019:        IFF  CH$MN,SCN35      MINUS
        !          20020:        IFF  CH$NT,SCN36      NOT
        !          20021:        IFF  CH$DL,SCN33      DOLLAR
        !          20022:        IFF  CH$EX,SCN37      EXCLAMATION MARK
        !          20023:        IFF  CH$PC,SCN38      PERCENT
        !          20024:        IFF  CH$SL,SCN40      SLASH
        !          20025:        IFF  CH$NM,SCN41      NUMBER SIGN
        !          20026:        IFF  CH$AT,SCN42      AT
        !          20027:        IFF  CH$BR,SCN43      VERTICAL BAR
        !          20028:        IFF  CH$AM,SCN44      AMPERSAND
        !          20029:        IFF  CH$QU,SCN45      QUESTION MARK
        !          20030:        IFF  CH$EQ,SCN46      EQUAL
        !          20031:        IFF  CH$AS,SCN49      ASTERISK
        !          20032:        ESW                   END SWITCH ON CHARACTER
        !          20033: *
        !          20034: *      HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
        !          20035: *
        !          20036: SCN07  BZE  WB,SCN10         JUMP IF SCANNING NAME OR CONSTANT
        !          20037:        ERB  232,SYNTAX ERROR. ILLEGAL CHARACTER
        !          20038:        EJC
        !          20039: *
        !          20040: *      SCANE (CONTINUED)
        !          20041: *
        !          20042: *      HERE FOR DIGITS 0-9
        !          20043: *
        !          20044: SCN08  BZE  WB,SCN09         KEEP SCANNING IF NAME/CONSTANT
        !          20045:        ZER  WC               ELSE SET FLAG FOR SCANNING CONSTANT
        !          20046: *
        !          20047: *      HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
        !          20048: *
        !          20049: SCN09  BEQ  WA,SCNIL,SCN11   JUMP IF END OF IMAGE
        !          20050:        ZER  WB               SET FLAG FOR SCANNING NAME/CONST
        !          20051:        BRN  SCN06            MERGE BACK TO CONTINUE SCAN
        !          20052: *
        !          20053: *      COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
        !          20054: *
        !          20055: SCN10  DCV  WA               RESET OFFSET TO POINT TO DELIMITER
        !          20056: *
        !          20057: *      COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
        !          20058: *
        !          20059: SCN11  MOV  WA,SCNPT         STORE UPDATED SCAN OFFSET
        !          20060:        MOV  SCNSE,WB         POINT TO START OF ELEMENT
        !          20061:        SUB  WB,WA            GET NUMBER OF CHARACTERS
        !          20062:        MOV  R$CIM,XL         POINT TO LINE IMAGE
        !          20063:        BNZ  WC,SCN15         JUMP IF NAME
        !          20064: *
        !          20065: *      HERE AFTER SCANNING OUT NUMERIC CONSTANT
        !          20066: *
        !          20067:        JSR  SBSTR            GET STRING FOR CONSTANT
        !          20068:        MOV  XR,DNAMP         DELETE FROM STORAGE (NOT NEEDED)
        !          20069:        JSR  GTNUM            CONVERT TO NUMERIC
        !          20070:        PPM  SCN14            JUMP IF CONVERSION FAILURE
        !          20071: *
        !          20072: *      MERGE HERE TO EXIT WITH CONSTANT
        !          20073: *
        !          20074: SCN12  MOV  =T$CON,XL        SET RESULT TYPE OF CONSTANT
        !          20075:        EJC
        !          20076: *
        !          20077: *      SCANE (CONTINUED)
        !          20078: *
        !          20079: *      COMMON EXIT POINT (XR,XL) SET
        !          20080: *
        !          20081: SCN13  MOV  SCNSA,WA         RESTORE WA
        !          20082:        MOV  SCNSB,WB         RESTORE WB
        !          20083:        MOV  SCNSC,WC         RESTORE WC
        !          20084:        MOV  XR,R$SCP         SAVE XR IN CASE RESCAN
        !          20085:        MOV  XL,SCNTP         SAVE XL IN CASE RESCAN
        !          20086:        ZER  SCNGO            RESET POSSIBLE GOTO FLAG
        !          20087:        EXI                   RETURN TO SCANE CALLER
        !          20088: *
        !          20089: *      HERE IF CONVERSION ERROR ON NUMERIC ITEM
        !          20090: *
        !          20091: SCN14  ERB  233,SYNTAX ERROR. INVALID NUMERIC ITEM
        !          20092: *
        !          20093: *      HERE AFTER SCANNING OUT VARIABLE NAME
        !          20094: *
        !          20095: .IF    .CASL
        !          20096: SCN15  JSR  SBSTG            BUILD STRING NAME OF VARIABLE
        !          20097: .ELSE
        !          20098: SCN15  JSR  SBSTR            BUILD STRING NAME OF VARIABLE
        !          20099: .FI
        !          20100:        BNZ  SCNCC,SCN13      RETURN IF CNCRD CALL
        !          20101:        JSR  GTNVR            LOCATE/BUILD VRBLK
        !          20102:        PPM                   DUMMY (UNUSED) ERROR RETURN
        !          20103:        MOV  =T$VAR,XL        SET TYPE AS VARIABLE
        !          20104:        BRN  SCN13            BACK TO EXIT
        !          20105: *
        !          20106: *      HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
        !          20107: *
        !          20108: SCN16  BZE  WB,SCN10         TERMINATOR IF SCANNING NAME OR CNST
        !          20109:        MOV  =CH$SQ,WB        SET TERMINATOR AS SINGLE QUOTE
        !          20110:        BRN  SCN18            MERGE
        !          20111: *
        !          20112: *      HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
        !          20113: *
        !          20114: SCN17  BZE  WB,SCN10         TERMINATOR IF SCANNING NAME OR CNST
        !          20115:        MOV  =CH$DQ,WB        SET DOUBLE QUOTE TERMINATOR, MERGE
        !          20116: *
        !          20117: *      LOOP TO SCAN OUT STRING CONSTANT
        !          20118: *
        !          20119: SCN18  BEQ  WA,SCNIL,SCN19   ERROR IF END OF IMAGE
        !          20120:        LCH  WC,(XL)+         ELSE LOAD NEXT CHARACTER
        !          20121:        ICV  WA               BUMP OFFSET
        !          20122:        BNE  WC,WB,SCN18      LOOP BACK IF NOT TERMINATOR
        !          20123:        EJC
        !          20124: *
        !          20125: *      SCANE (CONTINUED)
        !          20126: *
        !          20127: *      HERE AFTER SCANNING OUT STRING CONSTANT
        !          20128: *
        !          20129:        MOV  SCNPT,WB         POINT TO FIRST CHARACTER
        !          20130:        MOV  WA,SCNPT         SAVE OFFSET PAST FINAL QUOTE
        !          20131:        DCV  WA               POINT BACK PAST LAST CHARACTER
        !          20132:        SUB  WB,WA            GET NUMBER OF CHARACTERS
        !          20133:        MOV  R$CIM,XL         POINT TO INPUT IMAGE
        !          20134:        JSR  SBSTR            BUILD SUBSTRING VALUE
        !          20135:        BRN  SCN12            BACK TO EXIT WITH CONSTANT RESULT
        !          20136: *
        !          20137: *      HERE IF NO MATCHING QUOTE FOUND
        !          20138: *
        !          20139: SCN19  MOV  WA,SCNPT         SET UPDATED SCAN POINTER
        !          20140:        ERB  234,SYNTAX ERROR. UNMATCHED STRING QUOTE
        !          20141: *
        !          20142: *      HERE FOR F (POSSIBLE FAILURE GOTO)
        !          20143: *
        !          20144: SCN20  MOV  =T$FGO,XR        SET RETURN CODE FOR FAIL GOTO
        !          20145:        BRN  SCN22            JUMP TO MERGE
        !          20146: *
        !          20147: *      HERE FOR S (POSSIBLE SUCCESS GOTO)
        !          20148: *
        !          20149: SCN21  MOV  =T$SGO,XR        SET SUCCESS GOTO AS RETURN CODE
        !          20150: *
        !          20151: *      SPECIAL GOTO CASES MERGE HERE
        !          20152: *
        !          20153: SCN22  BZE  SCNGO,SCN09      TREAT AS NORMAL LETTER IF NOT GOTO
        !          20154: *
        !          20155: *      MERGE HERE FOR SPECIAL CHARACTER EXIT
        !          20156: *
        !          20157: SCN23  BZE  WB,SCN10         JUMP IF END OF NAME/CONSTANT
        !          20158:        MOV  XR,XL            ELSE COPY CODE
        !          20159:        BRN  SCN13            AND JUMP TO EXIT
        !          20160: *
        !          20161: *      HERE FOR UNDERLINE
        !          20162: *
        !          20163: SCN24  BZE  WB,SCN09         PART OF NAME IF SCANNING NAME
        !          20164:        BRN  SCN07            ELSE ILLEGAL
        !          20165:        EJC
        !          20166: *
        !          20167: *      SCANE (CONTINUED)
        !          20168: *
        !          20169: *      HERE FOR LEFT PAREN
        !          20170: *
        !          20171: SCN25  MOV  =T$LPR,XR        SET LEFT PAREN RETURN CODE
        !          20172:        BNZ  WB,SCN23         RETURN LEFT PAREN UNLESS NAME
        !          20173:        BZE  WC,SCN10         DELIMITER IF SCANNING CONSTANT
        !          20174: *
        !          20175: *      HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
        !          20176: *
        !          20177:        MOV  SCNSE,WB         POINT TO START OF NAME
        !          20178:        MOV  WA,SCNPT         SET POINTER PAST LEFT PAREN
        !          20179:        DCV  WA               POINT BACK PAST LAST CHAR OF NAME
        !          20180:        SUB  WB,WA            GET NAME LENGTH
        !          20181:        MOV  R$CIM,XL         POINT TO INPUT IMAGE
        !          20182:        JSR  SBSTR            GET STRING NAME FOR FUNCTION
        !          20183:        JSR  GTNVR            LOCATE/BUILD VRBLK
        !          20184:        PPM                   DUMMY (UNUSED) ERROR RETURN
        !          20185:        MOV  =T$FNC,XL        SET CODE FOR FUNCTION CALL
        !          20186:        BRN  SCN13            BACK TO EXIT
        !          20187: *
        !          20188: *      PROCESSING FOR SPECIAL CHARACTERS
        !          20189: *
        !          20190: SCN26  MOV  =T$RPR,XR        RIGHT PAREN, SET CODE
        !          20191:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
        !          20192: *
        !          20193: SCN27  MOV  =T$RBR,XR        RIGHT BRACKET, SET CODE
        !          20194:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
        !          20195: *
        !          20196: SCN28  MOV  =T$LBR,XR        LEFT BRACKET, SET CODE
        !          20197:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
        !          20198: *
        !          20199: SCN29  MOV  =T$COL,XR        COLON, SET CODE
        !          20200:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
        !          20201: *
        !          20202: SCN30  MOV  =T$SMC,XR        SEMI-COLON, SET CODE
        !          20203:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
        !          20204: *
        !          20205: SCN31  MOV  =T$CMA,XR        COMMA, SET CODE
        !          20206:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
        !          20207:        EJC
        !          20208: *
        !          20209: *      SCANE (CONTINUED)
        !          20210: *
        !          20211: *      HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
        !          20212: *      OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
        !          20213: *      TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
        !          20214: *      LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
        !          20215: *      POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
        !          20216: *      THE FIRST FOUR ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
        !          20217: *      AS PART OF A VARIABLE NAME (.$) OR CONSTANT (.+-).
        !          20218: *
        !          20219: SCN32  BZE  WB,SCN09         DOT CAN BE PART OF NAME OR CONSTANT
        !          20220:        ADD  WB,WC            ELSE BUMP POINTER
        !          20221: *
        !          20222: SCN33  BZE  WB,SCN09         DOLLAR CAN BE PART OF NAME
        !          20223:        ADD  WB,WC            ELSE BUMP POINTER
        !          20224: *
        !          20225: SCN34  BZE  WC,SCN09         PLUS CAN BE PART OF CONSTANT
        !          20226:        BZE  WB,SCN48         PLUS CANNOT BE PART OF NAME
        !          20227:        ADD  WB,WC            ELSE BUMP POINTER
        !          20228: *
        !          20229: SCN35  BZE  WC,SCN09         MINUS CAN BE PART OF CONSTANT
        !          20230:        BZE  WB,SCN48         MINUS CANNOT BE PART OF NAME
        !          20231:        ADD  WB,WC            ELSE BUMP POINTER
        !          20232:        LCH  XR,(XL)          GET NEXT CHARACTER
        !          20233:        BLT  XR,=CH$D0,SCN36  SKIP IF NOT DIGIT
        !          20234:        BLE  XR,=CH$D9,SCN08  JUMP IF DIGIT
        !          20235: *
        !          20236: SCN36  ADD  WB,WC            NOT
        !          20237: SCN37  ADD  WB,WC            EXCLAMATION
        !          20238: SCN38  ADD  WB,WC            PERCENT
        !          20239: SCN39  ADD  WB,WC            ASTERISK
        !          20240: SCN40  ADD  WB,WC            SLASH
        !          20241: SCN41  ADD  WB,WC            NUMBER SIGN
        !          20242: SCN42  ADD  WB,WC            AT SIGN
        !          20243: SCN43  ADD  WB,WC            VERTICAL BAR
        !          20244: SCN44  ADD  WB,WC            AMPERSAND
        !          20245: SCN45  ADD  WB,WC            QUESTION MARK
        !          20246:        EJC
        !          20247: *
        !          20248: *      SCANE (CONTINUED)
        !          20249: *
        !          20250: *      ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
        !          20251: *      (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
        !          20252: *
        !          20253: SCN46  BZE  WB,SCN10         OPERATOR TERMINATES NAME/CONSTANT
        !          20254:        MOV  WC,XR            ELSE COPY DV POINTER
        !          20255:        LCH  WC,(XL)          LOAD NEXT CHARACTER
        !          20256:        MOV  =T$BOP,XL        SET BINARY OP IN CASE
        !          20257:        BEQ  WA,SCNIL,SCN47   SHOULD BE BINARY IF IMAGE END
        !          20258:        BEQ  WC,=CH$BL,SCN47  SHOULD BE BINARY IF FOLLOWED BY BLK
        !          20259: .IF    .CAHT
        !          20260:        BEQ  WC,=CH$HT,SCN47  JUMP IF HORIZONTAL TAB
        !          20261: .FI
        !          20262: .IF    .CAVT
        !          20263:        BEQ  WC,=CH$VT,SCN47  JUMP IF VERTICAL TAB
        !          20264: .FI
        !          20265:        BEQ  WC,=CH$SM,SCN47  SEMICOLON CAN IMMEDIATELY FOLLOW =
        !          20266: *
        !          20267: *      HERE FOR UNARY OPERATOR
        !          20268: *
        !          20269:        ADD  *DVBS$,XR        POINT TO DV FOR UNARY OP
        !          20270:        MOV  =T$UOP,XL        SET TYPE FOR UNARY OPERATOR
        !          20271:        BLE  SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT
        !          20272:        EJC
        !          20273: *
        !          20274: *      SCANE (CONTINUED)
        !          20275: *
        !          20276: *      MERGE HERE TO REQUIRE PRECEDING BLANKS
        !          20277: *
        !          20278: SCN47  BNZ  SCNBL,SCN13      ALL OK IF PRECEDING BLANKS, EXIT
        !          20279: *
        !          20280: *      FAIL OPERATOR IN THIS POSITION
        !          20281: *
        !          20282: SCN48  ERB  235,SYNTAX ERROR. INVALID USE OF OPERATOR
        !          20283: *
        !          20284: *      HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
        !          20285: *
        !          20286: SCN49  BZE  WB,SCN10         END OF NAME IF SCANNING NAME
        !          20287:        BEQ  WA,SCNIL,SCN39   NOT ** IF * AT IMAGE END
        !          20288:        MOV  WA,XR            ELSE SAVE OFFSET PAST FIRST *
        !          20289:        MOV  WA,SCNOF         SAVE ANOTHER COPY
        !          20290:        LCH  WA,(XL)+         LOAD NEXT CHARACTER
        !          20291:        BNE  WA,=CH$AS,SCN50  NOT ** IF NEXT CHAR NOT *
        !          20292:        ICV  XR               ELSE STEP OFFSET PAST SECOND *
        !          20293:        BEQ  XR,SCNIL,SCN51   OK EXCLAM IF END OF IMAGE
        !          20294:        LCH  WA,(XL)          ELSE LOAD NEXT CHARACTER
        !          20295:        BEQ  WA,=CH$BL,SCN51  EXCLAMATION IF BLANK
        !          20296: .IF    .CAHT
        !          20297:        BEQ  WA,=CH$HT,SCN51  EXCLAMATION IF HORIZONTAL TAB
        !          20298: .FI
        !          20299: .IF    .CAVT
        !          20300:        BEQ  WA,=CH$VT,SCN51  EXCLAMATION IF VERTICAL TAB
        !          20301: .FI
        !          20302: *
        !          20303: *      UNARY *
        !          20304: *
        !          20305: SCN50  MOV  SCNOF,WA         RECOVER STORED OFFSET
        !          20306:        MOV  R$CIM,XL         POINT TO LINE AGAIN
        !          20307:        PLC  XL,WA            POINT TO CURRENT CHAR
        !          20308:        BRN  SCN39            MERGE WITH UNARY *
        !          20309: *
        !          20310: *      HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
        !          20311: *
        !          20312: SCN51  MOV  XR,SCNPT         SAVE SCAN POINTER PAST 2ND *
        !          20313:        MOV  XR,WA            COPY SCAN POINTER
        !          20314:        BRN  SCN37            MERGE WITH EXCLAMATION
        !          20315:        ENP                   END PROCEDURE SCANE
        !          20316:        EJC
        !          20317: *
        !          20318: *      SCNGF -- SCAN GOTO FIELD
        !          20319: *
        !          20320: *      SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
        !          20321: *      FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
        !          20322: *      FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
        !          20323: *      POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
        !          20324: *      EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
        !          20325: *      (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
        !          20326: *      POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
        !          20327: *      UNARY OPERATOR O$GOD.
        !          20328: *
        !          20329: *      JSR  SCNGF            CALL TO SCAN GOTO FIELD
        !          20330: *      (XR)                  RESULT (SEE ABOVE)
        !          20331: *      (XL,WA,WB,WC)         DESTROYED
        !          20332: *
        !          20333: SCNGF  PRC  E,0              ENTRY POINT
        !          20334:        JSR  SCANE            SCAN INITIAL ELEMENT
        !          20335:        BEQ  XL,=T$LPR,SCNG1  SKIP IF LEFT PAREN (NORMAL GOTO)
        !          20336:        BEQ  XL,=T$LBR,SCNG2  SKIP IF LEFT BRACKET (DIRECT GOTO)
        !          20337:        ERB  236,SYNTAX ERROR. GOTO FIELD INCORRECT
        !          20338: *
        !          20339: *      HERE FOR LEFT PAREN (NORMAL GOTO)
        !          20340: *
        !          20341: SCNG1  MOV  =NUM01,WB        SET EXPAN FLAG FOR NORMAL GOTO
        !          20342:        JSR  EXPAN            ANALYZE GOTO FIELD
        !          20343:        MOV  =OPDVN,WA        ELSE POINT TO OPDV FOR COMPLEX GOTO
        !          20344:        BLE  XR,STATB,SCNG3   JUMP IF NOT IN STATIC
        !          20345:        BLO  XR,STATE,SCNG4   JUMP TO EXIT IF SIMPLE LABEL NAME
        !          20346:        BRN  SCNG3            AND MERGE
        !          20347: *
        !          20348: *      HERE FOR LEFT BRACKET (DIRECT GOTO)
        !          20349: *
        !          20350: SCNG2  MOV  =NUM02,WB        SET EXPAN FLAG FOR DIRECT GOTO
        !          20351:        JSR  EXPAN            SCAN GOTO FIELD
        !          20352:        MOV  =OPDVD,WA        SET OPDV POINTER FOR DIRECT GOTO
        !          20353:        EJC
        !          20354: *
        !          20355: *      SCNGF (CONTINUED)
        !          20356: *
        !          20357: *      MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
        !          20358: *
        !          20359: SCNG3  MOV  WA,-(XS)         STACK OPERATOR DV POINTER
        !          20360:        MOV  XR,-(XS)         STACK POINTER TO EXPRESSION TREE
        !          20361:        JSR  EXPOP            POP OPERATOR OFF
        !          20362:        MOV  (XS)+,XR         RELOAD NEW EXPRESSION TREE POINTER
        !          20363: *
        !          20364: *      COMMON EXIT POINT
        !          20365: *
        !          20366: SCNG4  EXI                   RETURN TO CALLER
        !          20367:        ENP                   END PROCEDURE SCNGF
        !          20368:        EJC
        !          20369: *
        !          20370: *      SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
        !          20371: *
        !          20372: *      SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
        !          20373: *      FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
        !          20374: *      ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
        !          20375: *
        !          20376: *      (XR)                  POINTER TO VRBLK
        !          20377: *      JSR  SETVR            CALL TO SET FIELDS
        !          20378: *      (XL,WA)               DESTROYED
        !          20379: *
        !          20380: *      NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
        !          20381: *      INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
        !          20382: *
        !          20383: SETVR  PRC  E,0              ENTRY POINT
        !          20384:        BHI  XR,STATE,SETV1   EXIT IF NOT NATURAL VARIABLE
        !          20385: *
        !          20386: *      HERE IF WE HAVE A VRBLK
        !          20387: *
        !          20388:        MOV  XR,XL            COPY VRBLK POINTER
        !          20389:        MOV  =B$VRL,VRGET(XR) STORE NORMAL GET VALUE
        !          20390:        BEQ  VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE
        !          20391:        MOV  =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE
        !          20392:        MOV  VRVAL(XL),XL     POINT TO NEXT ENTRY ON CHAIN
        !          20393:        BNE  (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN
        !          20394:        MOV  =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS
        !          20395:        MOV  =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS
        !          20396: *
        !          20397: *      MERGE HERE TO EXIT TO CALLER
        !          20398: *
        !          20399: SETV1  EXI                   RETURN TO SETVR CALLER
        !          20400:        ENP                   END PROCEDURE SETVR
        !          20401: .IF    .CNSR
        !          20402: .ELSE
        !          20403:        EJC
        !          20404: *
        !          20405: *      SORTA -- SORT ARRAY
        !          20406: *
        !          20407: *      ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
        !          20408: *      SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
        !          20409: *      DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
        !          20410: *      WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
        !          20411: *      ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
        !          20412: *      REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
        !          20413: *      FOR A VECTOR.
        !          20414: *      THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURES,
        !          20415: *      HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
        !          20416: *      IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
        !          20417: *      TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
        !          20418: *      IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
        !          20419: *      SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BAU
        !          20420: *      OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
        !          20421: *      ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
        !          20422: *      COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
        !          20423: *      OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
        !          20424: *      COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
        !          20425: *      OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
        !          20426: *      THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
        !          20427: *      REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
        !          20428: *      PRECEDING FIRST ACTUAL ITEM.
        !          20429: *      REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
        !          20430: *      TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
        !          20431: *      GREATER THAN TEST.
        !          20432: *      GIVES ERROR MESSAGES FOR INCORRECT ARGS, RETURNS EXI 1
        !          20433: *      FOR EMPTY TABLE.
        !          20434: *
        !          20435: *      1(XS)                 FIRST ARG - ARRAY OR TABLE
        !          20436: *      0(XS)                 2ND ARG - INDEX OR PDTYPE NAME
        !          20437: *      (WA)                  0 , NON-ZERO FOR SORT , RSORT
        !          20438: *      JSR  SORTA            CALL TO SORT ARRAY
        !          20439: *      PPM  LOC              FAIL RETURN FOR EMPTY TABLE
        !          20440: *      (XR)                  SORTED ARRAY
        !          20441: *      (XL,WA,WB,WC)         DESTROYED
        !          20442:        EJC
        !          20443: *
        !          20444: *      SORTA (CONTINUED)
        !          20445: *
        !          20446: SORTA  PRC  N,1              ENTRY POINT
        !          20447:        MOV  WA,SRTSR         SORT/RSORT INDICATOR
        !          20448:        MOV  *NUM01,SRTST     DEFAULT STRIDE OF 1
        !          20449:        ZER  SRTOF            DEFAULT ZERO OFFSET TO SORT KEY
        !          20450:        MOV  =NULLS,SRTDF     CLEAR DATATYPE FIELD NAME
        !          20451:        MOV  (XS)+,R$SXR      UNSTACK ARGUMENT 2
        !          20452:        MOV  (XS)+,XR         GET FIRST ARGUMENT
        !          20453:        MOV  (XR),WA          GET ARG TYPE
        !          20454:        BEQ  WA,=B$ART,SRT00  SKIP IF ARRAY
        !          20455:        BNE  WA,=B$TBT,SRT16  ERROR IF NOT TABLE
        !          20456:        JSR  GTARR            CONVERT TO ARRAY
        !          20457:        PPM  SRT18            FAIL
        !          20458: *
        !          20459: *      MAKE COPY OF ARRAY
        !          20460: *
        !          20461: SRT00  MOV  XR,-(XS)         STACK PTR TO RESULTING KEY ARRAY
        !          20462:        MOV  XR,-(XS)         ANOTHER COPY FOR CBLCK
        !          20463:        JSR  CBLCK            GET COPY ARRAY FOR SORTING INTO
        !          20464:        PPM                   CANT FAIL
        !          20465:        MOV  XR,-(XS)         STACK POINTER TO SORT ARRAY
        !          20466:        MOV  R$SXR,XR         GET SECOND ARG
        !          20467:        MOV  1(XS),XL         GET PTR TO KEY ARRAY
        !          20468:        BNE  (XL),=B$VCT,SRT02 JUMP IF ARBLK
        !          20469:        BEQ  XR,=NULLS,SRT01  JUMP IF NULL SECOND ARG
        !          20470:        JSR  GTNVR            GET VRBLK PTR FOR IT
        !          20471:        ERR  237,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR
        !          20472:        MOV  XR,SRTDF         STORE DATATYPE FIELD NAME VRBLK
        !          20473: *
        !          20474: *      COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
        !          20475: *
        !          20476: SRT01  MOV  *VCLEN,WC        OFFSET TO A(0)
        !          20477:        MOV  *VCVLS,WB        OFFSET TO FIRST ITEM
        !          20478:        MOV  VCLEN(XL),WA     GET BLOCK LENGTH
        !          20479:        SUB  *VCSI$,WA        GET NO. OF ENTRIES, N (IN BAUS)
        !          20480:        BRN  SRT04            MERGE
        !          20481: *
        !          20482: *      HERE FOR ARRAY
        !          20483: *
        !          20484: SRT02  LDI  ARDIM(XL)        GET POSSIBLE DIMENSION
        !          20485:        MFI  WA               CONVERT TO SHORT INTEGER
        !          20486:        WTB  WA               FURTHER CONVERT TO BAUS
        !          20487:        MOV  *ARVLS,WB        OFFSET TO FIRST VALUE IF ONE DIM.
        !          20488:        MOV  *ARPRO,WC        OFFSET BEFORE VALUES IF ONE DIM.
        !          20489:        BEQ  ARNDM(XL),=NUM01,SRT04 JUMP IF IN FACT ONE DIMENSION
        !          20490:        BNE  ARNDM(XL),=NUM02,SRT16  FAIL UNLESS TWO DIMENSIONAL
        !          20491:        LDI  ARLB2(XL)        GET LOWER BOUND 2 AS DEFAULT COLUMN
        !          20492:        BEQ  XR,=NULLS,SRT03  JUMP IF DEFAULT SECOND ARG
        !          20493:        JSR  GTINT            CONVERT TO INTEGER
        !          20494:        PPM  SRT17            FAIL
        !          20495:        LDI  ICVAL(XR)        GET ACTUAL INTEGER VALUE
        !          20496:        EJC
        !          20497: *
        !          20498: *      SORTA (CONTINUED)
        !          20499: *
        !          20500: *      HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
        !          20501: *
        !          20502: SRT03  SBI  ARLB2(XL)        SUBTRACT LOW BOUND
        !          20503:        IOV  SRT17            FAIL IF OVERFLOW
        !          20504:        ILT  SRT17            FAIL IF BELOW LOW BOUND
        !          20505:        SBI  ARDM2(XL)        CHECK AGAINST DIMENSION
        !          20506:        IGE  SRT17            FAIL IF TOO LARGE
        !          20507:        ADI  ARDM2(XL)        RESTORE VALUE
        !          20508:        MFI  WA               GET AS SMALL INTEGER
        !          20509:        WTB  WA               OFFSET WITHIN ROW TO KEY
        !          20510:        MOV  WA,SRTOF         KEEP OFFSET
        !          20511:        LDI  ARDM2(XL)        SECOND DIMENSION IS ROW LENGTH
        !          20512:        MFI  WA               CONVERT TO SHORT INTEGER
        !          20513:        MOV  WA,XR            COPY ROW LENGTH
        !          20514:        WTB  WA               CONVERT TO BAUS
        !          20515:        MOV  WA,SRTST         STORE AS STRIDE
        !          20516:        LDI  ARDIM(XL)        GET NUMBER OF ROWS
        !          20517:        MFI  WA               AS A SHORT INTEGER
        !          20518:        WTB  WA               CONVERT N TO BAUS
        !          20519:        MOV  ARLEN(XL),WC     OFFSET PAST ARRAY END
        !          20520:        SUB  WA,WC            ADJUST, GIVING SPACE FOR N OFFSETS
        !          20521:        DCA  WC               POINT TO A(0)
        !          20522:        MOV  AROFS(XL),WB     OFFSET TO WORD BEFORE FIRST ITEM
        !          20523:        ICA  WB               OFFSET TO FIRST ITEM
        !          20524: *
        !          20525: *      SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
        !          20526: *      TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
        !          20527: *      TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
        !          20528: *
        !          20529: *      (XL) = 1(XS) = POINTER TO KEY ARRAY
        !          20530: *      (XS) = POINTER TO SORT ARRAY
        !          20531: *      WA = NUMBER OF ITEMS, N (CONVERTED TO BAUS).
        !          20532: *      WB = OFFSET TO FIRST ITEM OF ARRAYS.
        !          20533: *      WC = OFFSET TO A(0)
        !          20534: *
        !          20535: SRT04  BLE  WA,*NUM01,SRT15  RETURN IF ONLY A SINGLE ITEM
        !          20536:        MOV  WA,SRTSN         STORE NUMBER OF ITEMS (IN BAUS)
        !          20537:        MOV  WC,SRTSO         STORE OFFSET TO A(0)
        !          20538:        MOV  ARLEN(XL),WC     LENGTH OF ARRAY OR VEC (=VCLEN)
        !          20539:        ADD  XL,WC            POINT PAST END OF ARRAY OR VECTOR
        !          20540:        MOV  WB,SRTSF         STORE OFFSET TO FIRST ROW
        !          20541:        ADD  WB,XL            POINT TO FIRST ITEM IN KEY ARRAY
        !          20542: *
        !          20543: *      LOOP THROUGH ARRAY
        !          20544: *
        !          20545: SRT05  MOV  (XL),XR          GET AN ENTRY
        !          20546: *
        !          20547: *      HUNT ALONG TRBLK CHAIN
        !          20548: *
        !          20549: SRT06  BNE  (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK
        !          20550:        MOV  TRVAL(XR),XR     GET VALUE FIELD
        !          20551:        BRN  SRT06            LOOP
        !          20552:        EJC
        !          20553: *
        !          20554: *      SORTA (CONTINUED)
        !          20555: *
        !          20556: *      XR IS VALUE FROM END OF CHAIN
        !          20557: *
        !          20558: SRT07  MOV  XR,(XL)+         STORE AS ARRAY ENTRY
        !          20559:        BLT  XL,WC,SRT05      LOOP IF NOT DONE
        !          20560:        MOV  (XS),XL          GET ADRS OF SORT ARRAY
        !          20561:        MOV  SRTSF,XR         INITIAL OFFSET TO FIRST KEY
        !          20562:        MOV  SRTST,WB         GET STRIDE
        !          20563:        ADD  SRTSO,XL         OFFSET TO A(0)
        !          20564:        ICA  XL               POINT TO A(1)
        !          20565:        MOV  SRTSN,WC         GET N
        !          20566:        BTW  WC               CONVERT FROM BAUS
        !          20567:        MOV  WC,SRTNR         STORE AS ROW COUNT
        !          20568:        LCT  WC,WC            LOOP COUNTER
        !          20569: *
        !          20570: *      STORE KEY OFFSETS AT TOP OF SORT ARRAY
        !          20571: *
        !          20572: SRT08  MOV  XR,(XL)+         STORE AN OFFSET
        !          20573:        ADD  WB,XR            BUMP OFFSET BY STRIDE
        !          20574:        BCT  WC,SRT08         LOOP THROUGH ROWS
        !          20575: *
        !          20576: *      PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
        !          20577: *
        !          20578: *      (SRTSN)               NUMBER OF ITEMS TO SORT, N (BAUS)
        !          20579: *      (SRTSO)               OFFSET TO A(0)
        !          20580: *
        !          20581: SRT09  MOV  SRTSN,WA         GET N
        !          20582:        MOV  SRTNR,WC         GET NUMBER OF ROWS
        !          20583:        RSH  WC,1             I = N / 2 (WC=I, INDEX INTO ARRAY)
        !          20584:        WTB  WC               CONVERT BACK TO BAUS
        !          20585: *
        !          20586: *      LOOP TO FORM INITIAL HEAP
        !          20587: *
        !          20588: SRT10  JSR  SORTH            SORTH(I,N)
        !          20589:        DCA  WC               I = I - 1
        !          20590:        BNZ  WC,SRT10         LOOP IF I GT 0
        !          20591:        MOV  WA,WC            I = N
        !          20592: *
        !          20593: *      SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
        !          20594: *      ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAINS
        !          20595: *      IT AS, ROOT OF TREE.
        !          20596: *
        !          20597: SRT11  DCA  WC               I = I - 1 (N - 1 INITIALLY)
        !          20598:        BZE  WC,SRT12         JUMP IF DONE
        !          20599:        MOV  (XS),XR          GET SORT ARRAY ADDRESS
        !          20600:        ADD  SRTSO,XR         POINT TO A(0)
        !          20601:        MOV  XR,XL            A(0) ADDRESS
        !          20602:        ADD  WC,XL            A(I) ADDRESS
        !          20603:        MOV  1(XL),WB         COPY A(I+1)
        !          20604:        MOV  1(XR),1(XL)      MOVE A(1) TO A(I+1)
        !          20605:        MOV  WB,1(XR)         COMPLETE EXCHANGE OF A(1), A(I+1)
        !          20606:        MOV  WC,WA            N = I FOR SORTH
        !          20607:        MOV  *NUM01,WC        I = 1 FOR SORTH
        !          20608:        JSR  SORTH            SORTH(1,N)
        !          20609:        MOV  WA,WC            RESTORE WC
        !          20610:        BRN  SRT11            LOOP
        !          20611:        EJC
        !          20612: *
        !          20613: *      SORTA (CONTINUED)
        !          20614: *
        !          20615: *      OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
        !          20616: *      COPY ARRAY ELEMENTS OVER THEM.
        !          20617: *
        !          20618: SRT12  MOV  (XS),XL          BASE ADRS OF KEY ARRAY
        !          20619:        MOV  XL,WC            COPY IT
        !          20620:        ADD  SRTSO,WC         OFFSET OF A(0)
        !          20621:        ADD  SRTSF,XL         ADRS OF FIRST ROW OF SORT ARRAY
        !          20622:        MOV  SRTST,WB         GET STRIDE
        !          20623:        BTW  WB               CONVERT TO WORDS
        !          20624: *
        !          20625: *      COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
        !          20626: *      HELD AT END OF SORT ARRAY.
        !          20627: *
        !          20628: SRT13  ICA  WC               ADRS OF NEXT OF SORTED OFFSETS
        !          20629:        MOV  WC,XR            COPY IT FOR ACCESS
        !          20630:        MOV  (XR),XR          GET OFFSET
        !          20631:        ADD  1(XS),XR         ADD KEY ARRAY BASE ADRS
        !          20632:        LCT  WA,WB            GET COUNT OF WORDS IN ROW
        !          20633: *
        !          20634: *      COPY A COMPLETE ROW
        !          20635: *
        !          20636: SRT14  MOV  (XR)+,(XL)+      MOVE A WORD
        !          20637:        BCT  WA,SRT14         LOOP
        !          20638:        DCV  SRTNR            DECREMENT ROW COUNT
        !          20639:        BNZ  SRTNR,SRT13      REPEAT TILL ALL ROWS DONE
        !          20640: *
        !          20641: *      RETURN POINT
        !          20642: *
        !          20643: SRT15  MOV  (XS)+,XR         POP RESULT ARRAY PTR
        !          20644:        ICA  XS               POP KEY ARRAY PTR
        !          20645:        ZER  R$SXL            CLEAR JUNK
        !          20646:        ZER  R$SXR            CLEAR JUNK
        !          20647:        EXI                   RETURN
        !          20648: *
        !          20649: *      ERROR POINT
        !          20650: *
        !          20651: SRT16  ERB  238,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE
        !          20652: SRT17  ERB  239,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER
        !          20653: *
        !          20654: *      SOFT FAIL RETURN
        !          20655: *
        !          20656: SRT18  EXI  1                RETURN
        !          20657:        ENP                   END PROCUDURE SORTA
        !          20658:        EJC
        !          20659: *
        !          20660: *      SORTC --  COMPARE SORT KEYS
        !          20661: *
        !          20662: *      COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
        !          20663: *      EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
        !          20664: *      NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
        !          20665: *      SORT), THE QUOTED RETURNS ARE INVERTED.
        !          20666: *      FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
        !          20667: *      IDENTIFICATIONS ARE COMPARED.
        !          20668: *
        !          20669: *      (XL)                  BASE ADRS FOR KEYS
        !          20670: *      (WA)                  OFFSET TO KEY 1 ITEM
        !          20671: *      (WB)                  OFFSET TO KEY 2 ITEM
        !          20672: *      (SRTSR)               ZERO/NON-ZERO FOR SORT/RSORT
        !          20673: *      (SRTOF)               OFFSET WITHIN ROW TO COMPARANDS
        !          20674: *      JSR  SORTC            CALL TO COMPARE KEYS
        !          20675: *      PPM  LOC              KEY1 LESS THAN KEY2
        !          20676: *                            NORMAL RETURN, KEY1 GT THAN KEY2
        !          20677: *      (XL,XR,WA,WB)         DESTROYED
        !          20678: *
        !          20679: SORTC  PRC  E,1              ENTRY POINT
        !          20680:        MOV  WA,SRTS1         SAVE OFFSET 1
        !          20681:        MOV  WB,SRTS2         SAVE OFFSET 2
        !          20682:        MOV  WC,SRTSC         SAVE WC
        !          20683:        ADD  SRTOF,XL         ADD OFFSET TO COMPARAND FIELD
        !          20684:        MOV  XL,XR            COPY BASE + OFFSET
        !          20685:        ADD  WA,XL            ADD KEY1 OFFSET
        !          20686:        ADD  WB,XR            ADD KEY2 OFFSET
        !          20687:        MOV  (XL),XL          GET KEY1
        !          20688:        MOV  (XR),XR          GET KEY2
        !          20689:        BNE  SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED
        !          20690:        EJC
        !          20691: *
        !          20692: *      SORTC (CONTINUED)
        !          20693: *
        !          20694: *      MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
        !          20695: *
        !          20696: SRC01  MOV  (XL),WC          GET TYPE CODE
        !          20697:        BNE  WC,(XR),SRC02    SKIP IF NOT SAME DATATYPE
        !          20698:        BEQ  WC,=B$SCL,SRC09  JUMP IF BOTH STRINGS
        !          20699: *
        !          20700: *      NOW TRY FOR NUMERIC
        !          20701: *
        !          20702: SRC02  MOV  XL,R$SXL         KEEP ARG1
        !          20703:        MOV  XR,R$SXR         KEEP ARG2
        !          20704:        MOV  XL,-(XS)         STACK
        !          20705:        MOV  XR,-(XS)         ARGS
        !          20706:        JSR  ACOMP            COMPARE OBJECTS
        !          20707:        PPM  SRC10            NOT NUMERIC
        !          20708:        PPM  SRC10            NOT NUMERIC
        !          20709:        PPM  SRC03            KEY1 LESS
        !          20710:        PPM  SRC08            KEYS EQUAL
        !          20711:        PPM  SRC05            KEY1 GREATER
        !          20712: *
        !          20713: *      RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
        !          20714: *
        !          20715: SRC03  BNZ  SRTSR,SRC06      JUMP IF RSORT
        !          20716: *
        !          20717: SRC04  MOV  SRTSC,WC         RESTORE WC
        !          20718:        EXI  1                RETURN
        !          20719: *
        !          20720: *      RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
        !          20721: *
        !          20722: SRC05  BNZ  SRTSR,SRC04      JUMP IF RSORT
        !          20723: *
        !          20724: SRC06  MOV  SRTSC,WC         RESTORE WC
        !          20725:        EXI                   RETURN
        !          20726: *
        !          20727: *      KEYS ARE OF SAME DATATYPE
        !          20728: *
        !          20729: SRC07  BLT  XL,XR,SRC03      ITEM FIRST CREATED IS LESS
        !          20730:        BGT  XL,XR,SRC05      ADDRESSES RISE IN ORDER OF CREATION
        !          20731: *
        !          20732: *      DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
        !          20733: *
        !          20734: SRC08  BLT  SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD
        !          20735:        BRN  SRC06            OFFSET 1 GREATER
        !          20736:        EJC
        !          20737: *
        !          20738: *      SORTC (CONTINUED)
        !          20739: *
        !          20740: *      STRINGS
        !          20741: *
        !          20742: SRC09  MOV  XL,-(XS)         STACK
        !          20743:        MOV  XR,-(XS)         ARGS
        !          20744:        JSR  LCOMP            COMPARE OBJECTS
        !          20745:        PPM                   CANT
        !          20746:        PPM                   FAIL
        !          20747:        PPM  SRC03            KEY1 LESS
        !          20748:        PPM  SRC08            KEYS EQUAL
        !          20749:        PPM  SRC05            KEY1 GREATER
        !          20750: *
        !          20751: *      ARITHMETIC COMPARISON FAILED - RECOVER ARGS
        !          20752: *
        !          20753: SRC10  MOV  R$SXL,XL         GET ARG1
        !          20754:        MOV  R$SXR,XR         GET ARG2
        !          20755:        MOV  (XL),WC          GET TYPE OF KEY1
        !          20756:        BEQ  WC,(XR),SRC07    JUMP IF KEYS OF SAME TYPE
        !          20757:        MOV  WC,XL            GET BLOCK TYPE WORD
        !          20758:        MOV  (XR),XR          GET BLOCK TYPE WORD
        !          20759:        LEI  XL               ENTRY POINT ID FOR KEY1
        !          20760:        LEI  XR               ENTRY POINT ID FOR KEY2
        !          20761:        BGT  XL,XR,SRC05      JUMP IF KEY1 GT KEY2
        !          20762:        BRN  SRC03            KEY1 LT KEY2
        !          20763: *
        !          20764: *      DATATYPE FIELD NAME USED
        !          20765: *
        !          20766: SRC11  JSR  SORTF            CALL ROUTINE TO FIND FIELD 1
        !          20767:        MOV  XL,-(XS)         STACK ITEM POINTER
        !          20768:        MOV  XR,XL            GET KEY2
        !          20769:        JSR  SORTF            FIND FIELD 2
        !          20770:        MOV  XL,XR            PLACE AS KEY2
        !          20771:        MOV  (XS)+,XL         RECOVER KEY1
        !          20772:        BRN  SRC01            MERGE
        !          20773:        ENP                   PROCEDURE SORTC
        !          20774:        EJC
        !          20775: *
        !          20776: *      SORTF -- FIND FIELD FOR SORTC
        !          20777: *
        !          20778: *      ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
        !          20779: *      TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
        !          20780: *      DEFINED OBJECT PASSED AS ARGUMENT.
        !          20781: *      IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
        !          20782: *      NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
        !          20783: *      SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
        !          20784: *      DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
        !          20785: *
        !          20786: *      (SRTDF)               VRBLK POINTER OF FIELD NAME
        !          20787: *      (XL)                  POSSIBLE PDBLK POINTER
        !          20788: *      JSR  SORTF            CALL TO SEARCH FOR FIELD NAME
        !          20789: *      (XL)                  ITEM FOUND OR ORIGINAL PDBLK PTR
        !          20790: *      (WC)                  DESTROYED
        !          20791: *
        !          20792: SORTF  PRC  E,0              ENTRY POINT
        !          20793:        BNE  (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK
        !          20794:        MOV  XR,-(XS)         KEEP XR
        !          20795:        MOV  SRTFD,XR         GET POSSIBLE FORMER DFBLK PTR
        !          20796:        BZE  XR,SRTF4         JUMP IF NOT
        !          20797:        BNE  XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE
        !          20798:        BNE  SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME
        !          20799:        ADD  SRTFO,XL         ADD OFFSET TO REQUIRED FIELD
        !          20800: *
        !          20801: *      HERE WITH XL POINTING TO FOUND FIELD
        !          20802: *
        !          20803: SRTF1  MOV  (XL),XL          GET ITEM FROM FIELD
        !          20804: *
        !          20805: *      RETURN POINT
        !          20806: *
        !          20807: SRTF2  MOV  (XS)+,XR         RESTORE XR
        !          20808: *
        !          20809: SRTF3  EXI                   RETURN
        !          20810:        EJC
        !          20811: *
        !          20812: *      SORTF (CONTINUED)
        !          20813: *
        !          20814: *      CONDUCT A SEARCH
        !          20815: *
        !          20816: SRTF4  MOV  XL,XR            COPY ORIGINAL POINTER
        !          20817:        MOV  PDDFP(XR),XR     POINT TO DFBLK
        !          20818:        MOV  XR,SRTFD         KEEP A COPY
        !          20819:        MOV  FARGS(XR),WC     GET NUMBER OF FIELDS
        !          20820:        WTB  WC               CONVERT TO BAUS
        !          20821:        ADD  DFLEN(XR),XR     POINT PAST LAST FIELD
        !          20822: *
        !          20823: *      LOOP TO FIND NAME IN PDFBLK
        !          20824: *
        !          20825: SRTF5  DCA  WC               COUNT DOWN
        !          20826:        DCA  XR               POINT IN FRONT
        !          20827:        BEQ  (XR),SRTDF,SRTF6 SKIP OUT IF FOUND
        !          20828:        BNZ  WC,SRTF5         LOOP
        !          20829:        BRN  SRTF2            RETURN - NOT FOUND
        !          20830: *
        !          20831: *      FOUND
        !          20832: *
        !          20833: SRTF6  MOV  (XR),SRTFF       KEEP FIELD NAME PTR
        !          20834:        ADD  *PDFLD,WC        ADD OFFSET TO FIRST FIELD
        !          20835:        MOV  WC,SRTFO         STORE AS FIELD OFFSET
        !          20836:        ADD  WC,XL            POINT TO FIELD
        !          20837:        BRN  SRTF1            RETURN
        !          20838:        ENP                   PROCEDURE SORTF
        !          20839:        EJC
        !          20840: *
        !          20841: *      SORTH -- HEAP ROUTINE FOR SORTA
        !          20842: *
        !          20843: *      THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
        !          20844: *      IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
        !          20845: *      A KEY ARRAY.
        !          20846: *
        !          20847: *      (XS)                  POINTER TO SORT ARRAY BASE
        !          20848: *      1(XS)                 POINTER TO KEY ARRAY BASE
        !          20849: *      (WA)                  MAX ARRAY INDEX, N (IN BAUS)
        !          20850: *      (WC)                  OFFSET J IN A TO ROOT (IN *1 TO *N)
        !          20851: *      JSR  SORTH            CALL SORTH(J,N) TO MAKE HEAP
        !          20852: *      (XL,XR,WB)            DESTROYED
        !          20853: *
        !          20854: SORTH  PRC  N,0              ENTRY POINT
        !          20855:        MOV  WA,SRTSN         SAVE N
        !          20856:        MOV  WC,SRTWC         KEEP WC
        !          20857:        MOV  (XS),XL          SORT ARRAY BASE ADRS
        !          20858:        ADD  SRTSO,XL         ADD OFFSET TO A(0)
        !          20859:        ADD  WC,XL            POINT TO A(J)
        !          20860:        MOV  (XL),SRTRT       GET OFFSET TO ROOT
        !          20861:        ADD  WC,WC            DOUBLE J - CANT EXCEED N
        !          20862: *
        !          20863: *      LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
        !          20864: *
        !          20865: SRH01  BGT  WC,SRTSN,SRH03   DONE IF J GT N
        !          20866:        BEQ  WC,SRTSN,SRH02   SKIP IF J EQUALS N
        !          20867:        MOV  (XS),XR          SORT ARRAY BASE ADRS
        !          20868:        MOV  1(XS),XL         KEY ARRAY BASE ADRS
        !          20869:        ADD  SRTSO,XR         POINT TO A(0)
        !          20870:        ADD  WC,XR            ADRS OF A(J)
        !          20871:        MOV  1(XR),WA         GET A(J+1)
        !          20872:        MOV  (XR),WB          GET A(J)
        !          20873: *
        !          20874: *      COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
        !          20875: *
        !          20876:        JSR  SORTC            COMPARE KEYS - LT(A(J+1),A(J))
        !          20877:        PPM  SRH02            A(J+1) LT A(J)
        !          20878:        ICA  WC               POINT TO GREATER SON, A(J+1)
        !          20879:        EJC
        !          20880: *
        !          20881: *      SORTH (CONTINUED)
        !          20882: *
        !          20883: *      COMPARE ROOT WITH GREATER SON
        !          20884: *
        !          20885: SRH02  MOV  1(XS),XL         KEY ARRAY BASE ADRS
        !          20886:        MOV  (XS),XR          GET SORT ARRAY ADDRESS
        !          20887:        ADD  SRTSO,XR         ADRS OF A(0)
        !          20888:        MOV  XR,WB            COPY THIS ADRS
        !          20889:        ADD  WC,XR            ADRS OF GREATER SON, A(J)
        !          20890:        MOV  (XR),WA          GET A(J)
        !          20891:        MOV  WB,XR            POINT BACK TO A(0)
        !          20892:        MOV  SRTRT,WB         GET ROOT
        !          20893:        JSR  SORTC            COMPARE THEM - LT(A(J),ROOT)
        !          20894:        PPM  SRH03            FATHER EXCEEDS SONS - DONE
        !          20895:        MOV  (XS),XR          GET SORT ARRAY ADRS
        !          20896:        ADD  SRTSO,XR         POINT TO A(0)
        !          20897:        MOV  XR,XL            COPY IT
        !          20898:        MOV  WC,WA            COPY J
        !          20899:        BTW  WC               CONVERT TO WORDS
        !          20900:        RSH  WC,1             GET J/2
        !          20901:        WTB  WC               CONVERT BACK TO BAUS
        !          20902:        ADD  WA,XL            POINT TO A(J)
        !          20903:        ADD  WC,XR            ADRS OF A(J/2)
        !          20904:        MOV  (XL),(XR)        A(J/2) = A(J)
        !          20905:        MOV  WA,WC            RECOVER J
        !          20906:        AOV  WC,WC,SRH03      J = J*2. DONE IF TOO BIG
        !          20907:        BRN  SRH01            LOOP
        !          20908: *
        !          20909: *      FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
        !          20910: *
        !          20911: SRH03  BTW  WC               CONVERT TO WORDS
        !          20912:        RSH  WC,1             J = J/2
        !          20913:        WTB  WC               CONVERT BACK TO BAUS
        !          20914:        MOV  (XS),XR          SORT ARRAY ADRS
        !          20915:        ADD  SRTSO,XR         ADRS OF A(0)
        !          20916:        ADD  WC,XR            ADRS OF A(J/2)
        !          20917:        MOV  SRTRT,(XR)       A(J/2) = ROOT
        !          20918:        MOV  SRTSN,WA         RESTORE WA
        !          20919:        MOV  SRTWC,WC         RESTORE WC
        !          20920:        EXI                   RETURN
        !          20921:        ENP                   END PROCEDURE SORTH
        !          20922:        EJC
        !          20923: .FI
        !          20924:        EJC
        !          20925: *
        !          20926: *      TFIND -- LOCATE TABLE ELEMENT
        !          20927: *
        !          20928: *      (XR)                  SUBSCRIPT VALUE FOR ELEMENT
        !          20929: *      (XL)                  POINTER TO TABLE
        !          20930: *      (WB)                  ZERO BY VALUE, NON-ZERO BY NAME
        !          20931: *      JSR  TFIND            CALL TO LOCATE ELEMENT
        !          20932: *      PPM  LOC              TRANSFER LOCATION IF ACCESS FAILS
        !          20933: *      (XR)                  ELEMENT VALUE (IF BY VALUE)
        !          20934: *      (XR)                  DESTROYED (IF BY NAME)
        !          20935: *      (XL,WA)               TEBLK NAME (IF BY NAME)
        !          20936: *      (XL,WA)               DESTROYED (IF BY VALUE)
        !          20937: *      (WC,RA)               DESTROYED
        !          20938: *
        !          20939: *      NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
        !          20940: *      SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
        !          20941: *
        !          20942: TFIND  PRC  E,1              ENTRY POINT
        !          20943:        MOV  WB,-(XS)         SAVE NAME/VALUE INDICATOR
        !          20944:        MOV  XR,-(XS)         SAVE SUBSCRIPT VALUE
        !          20945:        MOV  XL,-(XS)         SAVE TABLE POINTER
        !          20946:        MOV  TBLEN(XL),WA     LOAD LENGTH OF TBBLK
        !          20947:        BTW  WA               CONVERT TO WORD COUNT
        !          20948:        SUB  =TBBUK,WA        GET NUMBER OF BUCKETS
        !          20949:        MTI  WA               CONVERT TO INTEGER VALUE
        !          20950:        STI  TFNSI            SAVE FOR LATER
        !          20951:        MOV  (XR),XL          LOAD FIRST WORD OF SUBSCRIPT
        !          20952:        LEI  XL               LOAD BLOCK ENTRY ID (BL$XX)
        !          20953:        BSW  XL,BL$$D,TFN00   SWITCH ON BLOCK TYPE
        !          20954:        IFF  BL$IC,TFN02      JUMP IF INTEGER
        !          20955: .IF    .CNRA
        !          20956: .ELSE
        !          20957:        IFF  BL$RC,TFN02      REAL
        !          20958: .FI
        !          20959:        IFF  BL$P0,TFN03      JUMP IF PATTERN
        !          20960:        IFF  BL$P1,TFN03      JUMP IF PATTERN
        !          20961:        IFF  BL$P2,TFN03      JUMP IF PATTERN
        !          20962:        IFF  BL$NM,TFN04      JUMP IF NAME
        !          20963:        IFF  BL$SC,TFN05      JUMP IF STRING
        !          20964:        ESW                   END SWITCH ON BLOCK TYPE
        !          20965: *
        !          20966: *      HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
        !          20967: *      BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
        !          20968: *
        !          20969: TFN00  MOV  1(XR),WA         LOAD SECOND WORD
        !          20970: *
        !          20971: *      MERGE HERE WITH ONE WORD HASH SOURCE IN WA
        !          20972: *
        !          20973: TFN01  MTI  WA               CONVERT TO INTEGER
        !          20974:        BRN  TFN06            JUMP TO MERGE
        !          20975:        EJC
        !          20976: *
        !          20977: *      TFIND (CONTINUED)
        !          20978: *
        !          20979: *      HERE FOR INTEGER OR REAL
        !          20980: *      POSSIBILITY OF OVERFLOW EXIST ON TWOS COMPLEMENT
        !          20981: *      MACHINE IF HASH SOURCE IS MOST NEGATIVE INTEGER OR IS
        !          20982: *      A REAL HAVING THE SAME BIT PATTERN.
        !          20983: *
        !          20984: TFN02  LDI  1(XR)            LOAD VALUE AS HASH SOURCE
        !          20985:        IGE  TFN06            OK IF POSITIVE OR ZERO
        !          20986:        NGI                   MAKE POSITIVE
        !          20987:        IOV  TFN06            CLEAR POSSIBLE OVERFLOW
        !          20988:        BRN  TFN06            MERGE
        !          20989: *
        !          20990: *      FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
        !          20991: *
        !          20992: TFN03  MOV  (XR),WA          LOAD FIRST WORD AS HASH SOURCE
        !          20993:        BRN  TFN01            MERGE BACK
        !          20994: *
        !          20995: *      FOR NAME, USE OFFSET AS HASH SOURCE
        !          20996: *
        !          20997: TFN04  MOV  NMOFS(XR),WA     LOAD OFFSET AS HASH SOURCE
        !          20998:        BRN  TFN01            MERGE BACK
        !          20999: *
        !          21000: *      HERE FOR STRING
        !          21001: *
        !          21002: TFN05  JSR  HASHS            CALL ROUTINE TO COMPUTE HASH
        !          21003: *
        !          21004: *      MERGE HERE WITH HASH SOURCE IN (IA)
        !          21005: *
        !          21006: TFN06  RMI  TFNSI            COMPUTE HASH INDEX BY REMAINDERING
        !          21007:        MFI  WC               GET AS ONE WORD INTEGER
        !          21008:        WTB  WC               CONVERT TO BAU OFFSET
        !          21009:        MOV  (XS),XL          GET TABLE PTR AGAIN
        !          21010:        ADD  WC,XL            POINT TO PROPER BUCKET
        !          21011:        MOV  TBBUK(XL),XR     LOAD FIRST TEBLK POINTER
        !          21012:        BEQ  XR,(XS),TFN10    JUMP IF NO TEBLKS ON CHAIN
        !          21013: *
        !          21014: *      LOOP THROUGH TEBLKS ON HASH CHAIN
        !          21015: *
        !          21016: TFN07  MOV  XR,WB            SAVE TEBLK POINTER
        !          21017:        MOV  TESUB(XR),XR     LOAD SUBSCRIPT VALUE
        !          21018:        MOV  1(XS),XL         LOAD INPUT ARGUMENT SUBSCRIPT VAL
        !          21019:        JSR  IDENT            COMPARE THEM
        !          21020:        PPM  TFN08            JUMP IF EQUAL (IDENT)
        !          21021: *
        !          21022: *      HERE IF NO MATCH WITH THAT TEBLK
        !          21023: *
        !          21024:        MOV  WB,XL            RESTORE TEBLK POINTER
        !          21025:        MOV  TENXT(XL),XR     POINT TO NEXT TEBLK ON CHAIN
        !          21026:        BNE  XR,(XS),TFN07    JUMP IF THERE IS ONE
        !          21027: *
        !          21028: *      HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
        !          21029: *
        !          21030:        MOV  *TENXT,WC        SET OFFSET TO LINK FIELD (XL BASE)
        !          21031:        BRN  TFN11            JUMP TO MERGE
        !          21032:        EJC
        !          21033: *
        !          21034: *      TFIND (CONTINUED)
        !          21035: *
        !          21036: *      HERE WE HAVE FOUND A MATCHING ELEMENT
        !          21037: *
        !          21038: TFN08  MOV  WB,XL            RESTORE TEBLK POINTER
        !          21039:        MOV  *TEVAL,WA        SET TEBLK NAME OFFSET
        !          21040:        MOV  2(XS),WB         RESTORE NAME/VALUE INDICATOR
        !          21041:        BNZ  WB,TFN09         JUMP IF CALLED BY NAME
        !          21042:        JSR  ACESS            ELSE GET VALUE
        !          21043:        PPM  TFN12            JUMP IF REFERENCE FAILS
        !          21044:        ZER  WB               RESTORE NAME/VALUE INDICATOR
        !          21045: *
        !          21046: *      COMMON EXIT FOR ENTRY FOUND
        !          21047: *
        !          21048: TFN09  ADD  *NUM03,XS        POP STACK ENTRIES
        !          21049:        EXI                   RETURN TO TFIND CALLER
        !          21050: *
        !          21051: *      HERE IF NO TEBLKS ON THE HASH CHAIN
        !          21052: *
        !          21053: TFN10  ADD  *TBBUK,WC        GET OFFSET TO BUCKET PTR
        !          21054:        MOV  (XS),XL          SET TBBLK PTR AS BASE
        !          21055: *
        !          21056: *      MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
        !          21057: *
        !          21058: TFN11  MOV  (XS),XR          TBBLK POINTER
        !          21059:        MOV  TBINV(XR),XR     LOAD DEFAULT VALUE IN CASE
        !          21060:        MOV  2(XS),WB         LOAD NAME/VALUE INDICATOR
        !          21061:        BZE  WB,TFN09         EXIT WITH DEFAULT IF VALUE CALL
        !          21062:        MOV  XR,WB            COPY DEFAULT VALUE
        !          21063: *
        !          21064: *      HERE WE MUST BUILD A NEW TEBLK
        !          21065: *
        !          21066:        MOV  *TESI$,WA        SET SIZE OF TEBLK
        !          21067:        JSR  ALLOC            ALLOCATE TEBLK
        !          21068:        ADD  WC,XL            POINT TO HASH LINK
        !          21069:        MOV  XR,(XL)          LINK NEW TEBLK AT END OF CHAIN
        !          21070:        MOV  =B$TET,(XR)      STORE TYPE WORD
        !          21071:        MOV  WB,TEVAL(XR)     SET DEFAULT AS INITIAL VALUE
        !          21072:        MOV  (XS)+,TENXT(XR)  SET TBBLK PTR TO MARK END OF CHAIN
        !          21073:        MOV  (XS)+,TESUB(XR)  STORE SUBSCRIPT VALUE
        !          21074:        MOV  (XS)+,WB         RESTORE NAME/VALUE INDICATOR
        !          21075:        MOV  XR,XL            COPY TEBLK POINTER (NAME BASE)
        !          21076:        MOV  *TEVAL,WA        SET OFFSET
        !          21077:        EXI                   RETURN TO CALLER WITH NEW TEBLK
        !          21078: *
        !          21079: *      ACESS FAIL RETURN
        !          21080: *
        !          21081: TFN12  EXI  1                ALTERNATIVE RETURN
        !          21082:        ENP                   END PROCEDURE TFIND
        !          21083:        EJC
        !          21084: *
        !          21085: *      TRACE -- SET/RESET A TRACE ASSOCIATION
        !          21086: *
        !          21087: *      THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
        !          21088: *      EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
        !          21089: *
        !          21090: *      (XL)                  TRBLK PTR (TRACE) OR ZERO (STOPTR)
        !          21091: *      1(XS)                 FIRST ARGUMENT (NAME)
        !          21092: *      0(XS)                 SECOND ARGUMENT (TRACE TYPE)
        !          21093: *      JSR  TRACE            CALL TO SET/RESET TRACE
        !          21094: *      PPM  LOC              TRANSFER LOC IF 1ST ARG IS BAD NAME
        !          21095: *      PPM  LOC              TRANSFER LOC IF 2ND ARG IS BAD TYPE
        !          21096: *      PPM  LOC              FAIL STOPTR IF NON-EXISTENT TRACE
        !          21097: *      (XS)                  POPPED
        !          21098: *      (XL,XR,WA,WB,WC,IA)   DESTROYED
        !          21099: *
        !          21100: TRACE  PRC  N,3              ENTRY POINT
        !          21101:        JSR  GTSTG            GET TRACE TYPE STRING
        !          21102:        PPM  TRC15            JUMP IF NOT STRING
        !          21103:        PLC  XR               ELSE POINT TO STRING
        !          21104:        LCH  WA,(XR)          LOAD FIRST CHARACTER
        !          21105: .IF    .CASL
        !          21106:        BLT  WA,=CH$$A,TRC00  SKIP IF NOT LOWER CASE
        !          21107:        SUB  =DFA$A,WA        CONVERT LOWER TO UPPER CASE
        !          21108: *
        !          21109: *      HERE WITH UPPER CASE TRACE TYPE CODE
        !          21110: *
        !          21111: TRC00  MOV  (XS),XR          LOAD NAME ARGUMENT
        !          21112: .ELSE
        !          21113:        MOV  (XS),XR          LOAD NAME ARGUMENT
        !          21114: .FI
        !          21115:        MOV  XL,(XS)          STACK TRBLK PTR OR ZERO
        !          21116:        MOV  =TRTAC,WC        SET TRTYP FOR ACCESS TRACE
        !          21117:        BEQ  WA,=CH$LA,TRC10  JUMP IF A (ACCESS)
        !          21118:        MOV  =TRTVL,WC        SET TRTYP FOR VALUE TRACE
        !          21119:        BEQ  WA,=CH$LV,TRC10  JUMP IF V (VALUE)
        !          21120:        BEQ  WA,=CH$BL,TRC10  JUMP IF BLANK (VALUE)
        !          21121: *
        !          21122: *      HERE FOR L,K,F,C,R
        !          21123: *
        !          21124:        BEQ  WA,=CH$LF,TRC01  JUMP IF F (FUNCTION)
        !          21125:        BEQ  WA,=CH$LR,TRC01  JUMP IF R (RETURN)
        !          21126:        BEQ  WA,=CH$LL,TRC03  JUMP IF L (LABEL)
        !          21127:        BEQ  WA,=CH$LK,TRC06  JUMP IF K (KEYWORD)
        !          21128:        BNE  WA,=CH$LC,TRC15  ELSE ERROR IF NOT C (CALL)
        !          21129: *
        !          21130: *      HERE FOR F,C,R
        !          21131: *
        !          21132: TRC01  JSR  GTNVR            POINT TO VRBLK FOR NAME
        !          21133:        PPM  TRC16            JUMP IF BAD NAME
        !          21134:        ICA  XS               POP STACK
        !          21135:        MOV  VRFNC(XR),XR     POINT TO FUNCTION BLOCK
        !          21136:        BNE  (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION
        !          21137:        MOV  XL,WB            COPY TRBLK PTR OR 0
        !          21138:        BEQ  WA,=CH$LR,TRC02  JUMP IF R (RETURN)
        !          21139:        EJC
        !          21140: *
        !          21141: *      TRACE (CONTINUED)
        !          21142: *
        !          21143: *      HERE FOR F,C TO SET/RESET CALL TRACE
        !          21144: *
        !          21145:        ORB  PFCTR(XR),WB     STOPTR FAIL CHECK
        !          21146:        MOV  XL,PFCTR(XR)     SET/RESET CALL TRACE
        !          21147:        BEQ  WA,=CH$LC,TRC11  RETURN IF LETTER C
        !          21148: *
        !          21149: *      HERE FOR F,R TO SET/RESET RETURN TRACE
        !          21150: *
        !          21151: TRC02  ORB  PFRTR(XR),WB     STOPTR FAIL CHECK
        !          21152:        MOV  XL,PFRTR(XR)     SET/RESET RETURN TRACE
        !          21153:        BRN  TRC11            RETURN
        !          21154: *
        !          21155: *      HERE FOR L TO SET/RESET LABEL TRACE
        !          21156: *
        !          21157: TRC03  JSR  GTNVR            POINT TO VRBLK
        !          21158:        PPM  TRC16            JUMP IF BAD NAME
        !          21159:        MOV  (XS)+,WB         GET TRBLK OR ZERO
        !          21160:        MOV  VRLBL(XR),XL     LOAD LABEL POINTER
        !          21161:        BNE  (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE
        !          21162:        MOV  TRLBL(XL),XL     ELSE DELETE OLD TRACE ASSOCIATION
        !          21163:        BRN  TRCA4            MERGE
        !          21164: *
        !          21165: *      HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
        !          21166: *
        !          21167: TRC04  BZE  WB,TRC12         FAIL IF STOPTR OF UNTRACED LABEL
        !          21168: *
        !          21169: *      TEST FOR UNDEFINED LABEL
        !          21170: *
        !          21171: TRCA4  BEQ  XL,=STNDL,TRC17  ERROR IF UNDEFINED LABEL
        !          21172:        BZE  WB,TRC05         JUMP IF STOPTR CASE
        !          21173:        MOV  WB,VRLBL(XR)     ELSE SET NEW TRBLK POINTER
        !          21174:        MOV  =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS
        !          21175:        MOV  WB,XR            COPY TRBLK POINTER
        !          21176:        MOV  XL,TRLBL(XR)     STORE REAL LABEL IN TRBLK
        !          21177:        EXI                   RETURN
        !          21178: *
        !          21179: *      HERE FOR STOPTR CASE FOR LABEL
        !          21180: *
        !          21181: TRC05  MOV  XL,VRLBL(XR)     STORE LABEL PTR BACK IN VRBLK
        !          21182:        MOV  =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS
        !          21183:        EXI                   RETURN
        !          21184:        EJC
        !          21185: *
        !          21186: *      TRACE (CONTINUED)
        !          21187: *
        !          21188: *      HERE FOR K (KEYWORD)
        !          21189: *
        !          21190: TRC06  JSR  GTNVR            POINT TO VRBLK
        !          21191:        PPM  TRC16            ERROR IF NOT NATURAL VAR
        !          21192:        BNZ  VRLEN(XR),TRC16  ERROR IF NOT SYSTEM VAR
        !          21193:        ICA  XS               POP STACK
        !          21194:        BZE  XL,TRC07         JUMP IF STOPTR CASE
        !          21195:        MOV  XR,TRKVR(XL)     STORE VRBLK PTR IN TRBLK FOR KTREX
        !          21196: *
        !          21197: *      MERGE HERE WITH TRBLK SET UP IN XL (OR ZERO)
        !          21198: *
        !          21199: TRC07  MOV  VRSVP(XR),XR     POINT TO SVBLK
        !          21200:        MOV  XL,WB            COPY TRBLK PR OR 0
        !          21201:        BEQ  XR,=V$ERT,TRC08  JUMP IF ERRTYPE
        !          21202:        BEQ  XR,=V$STC,TRC09  JUMP IF STCOUNT
        !          21203:        BNE  XR,=V$FNC,TRC17  ELSE ERROR IF NOT FNCLEVEL
        !          21204: *
        !          21205: *      FNCLEVEL
        !          21206: *
        !          21207:        ORB  R$FNC,WB         STOPTR FAIL CHECK
        !          21208:        MOV  XL,R$FNC         SET/RESET FNCLEVEL TRACE
        !          21209:        BRN  TRC11            RETURN
        !          21210: *
        !          21211: *      ERRTYPE
        !          21212: *
        !          21213: TRC08  ORB  R$ERT,WB         STOPTR FAIL CHECK
        !          21214:        MOV  XL,R$ERT         SET/RESET ERRTYPE TRACE
        !          21215:        BRN  TRC11            RETURN
        !          21216: *
        !          21217: *      STCOUNT
        !          21218: *
        !          21219: TRC09  ORB  R$STC,WB         STOPTR FAIL CHECK
        !          21220:        MOV  XL,R$STC         SET/RESET STCOUNT TRACE
        !          21221:        BRN  TRC11            RETURN
        !          21222:        EJC
        !          21223: *
        !          21224: *      TRACE (CONTINUED)
        !          21225: *
        !          21226: *      A,V MERGE HERE WITH TRTYP VALUE IN WC
        !          21227: *
        !          21228: TRC10  JSR  GTVAR            LOCATE VARIABLE
        !          21229:        PPM  TRC16            ERROR IF NOT APPROPRIATE NAME
        !          21230:        MOV  (XS)+,XR         GET NEW TRBLK PTR AGAIN
        !          21231:        MOV  WC,WB            COPY TRACE TYPE
        !          21232:        JSR  TRCHN            UPDATE TRACE CHAIN
        !          21233:        PPM  TRC12            FAIL
        !          21234:        EXI                   RETURN
        !          21235: *
        !          21236: *      RETURN AFTER CHECKING STOPTR FAIL CONDITION (WB = 0)
        !          21237: *
        !          21238: TRC11  ZRB  WB,TRC12         FAIL IF NECESSARY
        !          21239:        EXI                   ELSE RETURN
        !          21240: *
        !          21241: *      FAIL STOPTR
        !          21242: *
        !          21243: TRC12  EXI  3                FAIL RETURN
        !          21244: *
        !          21245: *      HERE FOR BAD TRACE TYPE
        !          21246: *
        !          21247: TRC15  EXI  2                TAKE BAD TRACE TYPE ERROR EXIT
        !          21248: *
        !          21249: *      POP STACK BEFORE FAILING
        !          21250: *
        !          21251: TRC16  ICA  XS               POP STACK
        !          21252: *
        !          21253: *      HERE FOR BAD NAME ARGUMENT
        !          21254: *
        !          21255: TRC17  EXI  1                TAKE BAD NAME ERROR EXIT
        !          21256:        ENP                   END PROCEDURE TRACE
        !          21257:        EJC
        !          21258: *
        !          21259: *      TRBLD -- BUILD TRBLK
        !          21260: *
        !          21261: *      TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
        !          21262: *      TO CONSTRUCT A TRBLK (TRAP BLOCK)
        !          21263: *
        !          21264: *      (XR)                  TRTAG OR TRTER
        !          21265: *      (XL)                  TRFNC OR TRTRI
        !          21266: *      (WB)                  TRTYP
        !          21267: *      JSR  TRBLD            CALL TO BUILD TRBLK
        !          21268: *      (XR)                  POINTER TO TRBLK
        !          21269: *      (WA)                  DESTROYED
        !          21270: *
        !          21271: TRBLD  PRC  E,0              ENTRY POINT
        !          21272:        MOV  XR,-(XS)         STACK TRTAG (OR TRFNM)
        !          21273:        MOV  *TRSI$,WA        SET SIZE OF TRBLK
        !          21274:        JSR  ALLOC            ALLOCATE TRBLK
        !          21275:        MOV  =B$TRT,(XR)      STORE FIRST WORD
        !          21276:        MOV  XL,TRFNC(XR)     STORE TRFNC (OR TRTRI)
        !          21277:        MOV  (XS)+,TRTAG(XR)  STORE TRTAG (OR TRTER)
        !          21278:        MOV  WB,TRTYP(XR)     STORE TYPE
        !          21279:        MOV  =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE
        !          21280:        EXI                   RETURN TO CALLER
        !          21281:        ENP                   END PROCEDURE TRBLD
        !          21282:        EJC
        !          21283: *
        !          21284: *      TRCHN -- UPDATE TRACE BLOCK CHAIN
        !          21285: *
        !          21286: *      CALLED WHEN A TRACE BLOCK CHAIN IS TO BE UPDATED BY
        !          21287: *      ADDITION OR REMOVAL OF A TRBLK.
        !          21288: *      IF A TRBLK OF THE SAME TYPE AS AN ADDITION IS ALREADY
        !          21289: *      PRESENT IT IS DELETED. THE TRTAG FIELD OF ANY DELETED
        !          21290: *      TRBLK IS CLEARED AS REQUIRED BY S$ENF.
        !          21291: *
        !          21292: *      (XL,WA)               POINTER, OFFSET TO TRACED VARIABLE
        !          21293: *      (XR)                  PTR TO NEW TRBLK OR 0 FOR REMOVAL
        !          21294: *      (WB)                  TRACE TYPE (TRTYP)
        !          21295: *      JSR  TRCHN            CALL TO UPDATE TRACE CHAIN
        !          21296: *      PPM  LOC              NO TRACE BLK OF REQD DELETION TYPE
        !          21297: *      (WA,WC)               DESTROYED
        !          21298: *
        !          21299: TRCHN  PRC  E,1              ENTRY POINT
        !          21300:        ADD  XL,WA            KEEP POINTER TO TRACED LOCATION
        !          21301:        MOV  WA,XL            COPY POINTER
        !          21302:        SUB  *TRNXT,XL        ADJUST OFFSET BEFORE ENTERING LOOP
        !          21303:        MOV  XR,WC            COPY TRBLK PTR
        !          21304: *
        !          21305: *      LOOP TO FIND TRACE BLOCK
        !          21306: *
        !          21307: TRCH1  MOV  XL,XR            COPY SO XR POINTS TO PREDECESSOR
        !          21308:        MOV  TRNXT(XL),XL     POINT TO POSSIBLE TRACE BLOCK
        !          21309:        BNE  (XL),=B$TRT,TRCH2 SKIP OUT AT CHAIN END
        !          21310:        BLT  WB,TRTYP(XL),TRCH2 SKIP IF TOO FAR OUT ON CHAIN
        !          21311:        BNE  WB,TRTYP(XL),TRCH1 LOOP UNLESS TYPE MATCHES
        !          21312:        MOV  TRNXT(XL),TRNXT(XR) REMOVE LINK TO OLD TRBLK
        !          21313:        ZER  TRTAG(XL)        CLEAR IOTAG FIELD OF DELETED BLOCK
        !          21314:        BZE  WC,TRCH3         DONE IF NO NEW TRBLK
        !          21315: *
        !          21316: *      OLD TRBLK REMOVED AND/OR END OF CHAIN REACHED
        !          21317: *
        !          21318: TRCH2  BZE  WC,TRCH4         FAIL IF REQD BLOCK TYPE NOT FOUND
        !          21319:        MOV  WC,XL            POINT TO NEW TRBLK
        !          21320:        MOV  TRNXT(XR),TRNXT(XL) ATTACH TAIL OF CHAIN TO IT
        !          21321:        MOV  WC,TRNXT(XR)     LINK NEW BLOCK IN
        !          21322:        MOV  WB,TRTYP(XL)     ENSURE TRTYP FIELD SET UP
        !          21323: *
        !          21324: *      UPDATE ACCESS FIELDS OF NAME IF IT IS A VRBLK
        !          21325: *
        !          21326: TRCH3  MOV  WA,XR            POINT TO VBL
        !          21327:        SUB  *VRVAL,XR        ADJUST TO POSSIBLE VRBLK NAME BASE
        !          21328:        JSR  SETVR            UPDATE ACCESS FIELDS
        !          21329:        MOV  WA,XL            RECOVER XL
        !          21330:        MOV  WC,XR            RECOVER XR
        !          21331:        EXI                   RETURN TO CALLER
        !          21332: *
        !          21333: *      FAIL RETURN
        !          21334: *
        !          21335: TRCH4  MOV  WA,XL            RECOVER XL
        !          21336:        MOV  WC,XR            RECOVER XR
        !          21337:        EXI  1                FAIL
        !          21338:        ENP                   END PROCEDURE TRCHN
        !          21339:        EJC
        !          21340: *
        !          21341: *      TRIMR -- TRIM TRAILING BLANKS
        !          21342: *
        !          21343: *      TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
        !          21344: *      LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
        !          21345: *      TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
        !          21346: *      THE END OF THE (POSSIBLY) SHORTENED BLOCK.
        !          21347: *
        !          21348: *      (WB)                  NON-ZERO TO TRIM TRAILING BLANKS
        !          21349: *      (XR)                  POINTER TO STRING TO TRIM
        !          21350: *      JSR  TRIMR            CALL TO TRIM STRING
        !          21351: *      (XR)                  POINTER TO TRIMMED STRING
        !          21352: *      (XL,WA,WB,WC)         DESTROYED
        !          21353: *
        !          21354: *      THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
        !          21355: *      AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
        !          21356: *
        !          21357: TRIMR  PRC  E,0              ENTRY POINT
        !          21358:        MOV  XR,XL            COPY STRING POINTER
        !          21359:        MOV  SCLEN(XR),WA     LOAD STRING LENGTH
        !          21360:        BZE  WA,TRIM2         JUMP IF NULL INPUT
        !          21361:        PLC  XL,WA            ELSE POINT PAST LAST CHARACTER
        !          21362:        BZE  WB,TRIM3         JUMP IF NO TRIM
        !          21363:        MOV  =CH$BL,WC        LOAD BLANK CHARACTER
        !          21364: *
        !          21365: *      LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
        !          21366: *
        !          21367: TRIM0  LCH  WB,-(XL)         LOAD NEXT CHARACTER
        !          21368: .IF    .CAHT
        !          21369:        BEQ  WB,=CH$HT,TRIM1  JUMP IF HORIZONTAL TAB
        !          21370: .FI
        !          21371:        BNE  WB,WC,TRIM3      JUMP IF NON-BLANK FOUND
        !          21372: TRIM1  DCV  WA               ELSE DECREMENT CHARACTER COUNT
        !          21373:        BNZ  WA,TRIM0         LOOP BACK IF MORE TO CHECK
        !          21374: *
        !          21375: *      HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
        !          21376: *
        !          21377: TRIM2  MOV  XR,DNAMP         WIPE OUT INPUT STRING BLOCK
        !          21378:        MOV  =NULLS,XR        LOAD NULL RESULT
        !          21379:        BRN  TRIM5            MERGE TO EXIT
        !          21380:        EJC
        !          21381: *
        !          21382: *      TRIMR (CONTINUED)
        !          21383: *
        !          21384: *      HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
        !          21385: *
        !          21386: TRIM3  MOV  WA,SCLEN(XR)     SET NEW LENGTH
        !          21387:        MOV  XR,XL            COPY STRING POINTER
        !          21388:        PSC  XL,WA            READY FOR STORING ZEROES
        !          21389:        CTB  WA,SCHAR         GET LENGTH OF BLOCK IN BAUS
        !          21390:        ADD  XR,WA            POINT PAST NEW BLOCK
        !          21391:        MOV  WA,DNAMP         SET NEW TOP OF STORAGE POINTER
        !          21392:        LCT  WA,=CFP$C        GET COUNT OF CHARS IN WORD
        !          21393:        ZER  WC               SET ZERO CHAR
        !          21394: *
        !          21395: *      LOOP TO ZERO PAD LAST WORD OF CHARACTERS
        !          21396: *
        !          21397: TRIM4  SCH  WC,(XL)+         STORE ZERO CHARACTER
        !          21398:        BCT  WA,TRIM4         LOOP BACK TILL ALL STORED
        !          21399:        CSC  XL               COMPLETE STORE CHARACTERS
        !          21400: *
        !          21401: *      COMMON EXIT POINT
        !          21402: *
        !          21403: TRIM5  ZER  XL               CLEAR GARBAGE XL POINTER
        !          21404:        EXI                   RETURN TO CALLER
        !          21405:        ENP                   END PROCEDURE TRIMR
        !          21406:        EJC
        !          21407: *
        !          21408: *      TRXEQ -- EXECUTE FUNCTION TYPE TRACE
        !          21409: *
        !          21410: *      TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
        !          21411: *      HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
        !          21412: *
        !          21413: *      (XR)                  POINTER TO TRBLK
        !          21414: *      (XL,WA)               NAME BASE,OFFSET FOR VARIABLE
        !          21415: *      JSR  TRXEQ            CALL TO EXECUTE TRACE
        !          21416: *      (WB,WC,RA)            DESTROYED
        !          21417: *
        !          21418: *      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
        !          21419: *      CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
        !          21420: *
        !          21421: *                            TRXEQ RETURN POINT WORD(S)
        !          21422: *                            SAVED VALUE OF TRACE KEYWORD
        !          21423: *                            TRBLK POINTER
        !          21424: *                            NAME BASE
        !          21425: *                            NAME OFFSET
        !          21426: *                            SAVED VALUE OF R$COD
        !          21427: *                            SAVED CODE PTR (-R$COD)
        !          21428: *                            SAVED VALUE OF FLPTR
        !          21429: *      FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
        !          21430: *                            NMBLK FOR VARIABLE NAME
        !          21431: *      XS ------------------ TRACE TAG
        !          21432: *
        !          21433: *      R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
        !          21434: *      CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
        !          21435: *      OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
        !          21436: *
        !          21437: TRXEQ  PRC  R,0              ENTRY POINT (RECURSIVE)
        !          21438:        MOV  R$COD,WC         LOAD CODE BLOCK POINTER
        !          21439:        SCP  WB               GET CURRENT CODE POINTER
        !          21440:        SUB  WC,WB            MAKE CODE POINTER INTO OFFSET
        !          21441:        MOV  KVTRA,-(XS)      STACK TRACE KEYWORD VALUE
        !          21442:        MOV  XR,-(XS)         STACK TRBLK POINTER
        !          21443:        MOV  XL,-(XS)         STACK NAME BASE
        !          21444:        MOV  WA,-(XS)         STACK NAME OFFSET
        !          21445:        MOV  WC,-(XS)         STACK CODE BLOCK POINTER
        !          21446:        MOV  WB,-(XS)         STACK CODE POINTER OFFSET
        !          21447:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
        !          21448:        ZER  -(XS)            SET DUMMY FAIL OFFSET
        !          21449:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
        !          21450:        ZER  KVTRA            RESET TRACE KEYWORD TO ZERO
        !          21451:        MOV  =TRXDC,WC        LOAD NEW (DUMMY) CODE BLK POINTER
        !          21452:        MOV  WC,R$COD         SET AS CODE BLOCK POINTER
        !          21453:        LCP  WC               AND NEW CODE POINTER
        !          21454:        EJC
        !          21455: *
        !          21456: *      TRXEQ (CONTINUED)
        !          21457: *
        !          21458: *      NOW PREPARE ARGUMENTS FOR FUNCTION
        !          21459: *
        !          21460:        MOV  WA,WB            SAVE NAME OFFSET
        !          21461:        MOV  *NMSI$,WA        LOAD NMBLK SIZE
        !          21462:        JSR  ALLOC            ALLOCATE SPACE FOR NMBLK
        !          21463:        MOV  =B$NML,(XR)      SET TYPE WORD
        !          21464:        MOV  XL,NMBAS(XR)     STORE NAME BASE
        !          21465:        MOV  WB,NMOFS(XR)     STORE NAME OFFSET
        !          21466:        MOV  6(XS),XL         RELOAD POINTER TO TRBLK
        !          21467:        MOV  XR,-(XS)         STACK NMBLK POINTER (1ST ARGUMENT)
        !          21468:        MOV  TRTAG(XL),-(XS)  STACK TRACE TAG (2ND ARGUMENT)
        !          21469:        MOV  TRFNC(XL),XL     LOAD TRACE FUNCTION POINTER
        !          21470:        MOV  =NUM02,WA        SET NUMBER OF ARGUMENTS TO TWO
        !          21471:        BRN  CFUNC            JUMP TO CALL FUNCTION
        !          21472: *
        !          21473: *      SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
        !          21474: *
        !          21475: TRXQR  MOV  FLPTR,XS         POINT BACK TO OUR STACK ENTRIES
        !          21476:        ICA  XS               POP OFF GARBAGE FAIL OFFSET
        !          21477:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
        !          21478:        MOV  (XS)+,WB         RELOAD CODE OFFSET
        !          21479:        MOV  (XS)+,WC         LOAD OLD CODE BASE POINTER
        !          21480:        MOV  WC,XR            COPY CDBLK POINTER
        !          21481:        MOV  CDSTM(XR),KVSTN  RESTORE STMNT NO
        !          21482:        MOV  (XS)+,WA         RELOAD NAME OFFSET
        !          21483:        MOV  (XS)+,XL         RELOAD NAME BASE
        !          21484:        MOV  (XS)+,XR         RELOAD TRBLK POINTER
        !          21485:        MOV  (XS)+,KVTRA      RESTORE TRACE KEYWORD VALUE
        !          21486:        ADD  WC,WB            RECOMPUTE ABSOLUTE CODE POINTER
        !          21487:        LCP  WB               RESTORE CODE POINTER
        !          21488:        MOV  WC,R$COD         AND CODE BLOCK POINTER
        !          21489:        EXI                   RETURN TO TRXEQ CALLER
        !          21490:        ENP                   END PROCEDURE TRXEQ
        !          21491:        EJC
        !          21492: *
        !          21493: *      XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
        !          21494: *
        !          21495: *      XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
        !          21496: *      ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
        !          21497: *      CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
        !          21498: *      PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
        !          21499: *
        !          21500: *      R$XSC                 POINTER TO SCBLK FOR FUNCTION ARG
        !          21501: *      XSOFS                 OFFSET (NUM CHARS SCANNED SO FAR)
        !          21502: *
        !          21503: *      (WC)                  DELIMITER ONE (CH$XX)
        !          21504: *      (XL)                  DELIMITER TWO (CH$XX)
        !          21505: *      JSR  XSCAN            CALL TO SCAN NEXT ITEM
        !          21506: *      (XR)                  POINTER TO SCBLK FOR TOKEN SCANNED
        !          21507: *      (WA)                  COMPLETION CODE (SEE BELOW)
        !          21508: *      (WC,XL)               DESTROYED
        !          21509: *      (XSCNB)               ERROR INDICATOR - SEE 4) BELOW
        !          21510: *
        !          21511: *      LEADING BLANKS AND TRAILING BLANKS POSITIONED BEFORE A
        !          21512: *      DELIMITER OR AT THE END OF THE ARGUMENT STRING ARE
        !          21513: *      IGNORED. OTHER BLANKS ARE ILLEGAL.
        !          21514: *      THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
        !          21515: *      UNTIL ONE OF THE FOLLOWING CONDITIONS OCCURS.
        !          21516: *
        !          21517: *      1)   DELIMITER ONE IS ENCOUNTERED  (WA SET TO 1)
        !          21518: *
        !          21519: *      2)   DELIMITER TWO ENCOUNTERED  (WA SET TO 2)
        !          21520: *
        !          21521: *      3)   END OF STRING ENCOUNTERED  (WA AND XSCNB SET TO 0)
        !          21522: *
        !          21523: *      4)   ILLEGAL BLANK  (WA 0, XSCNB NON-ZERO)
        !          21524: *
        !          21525: *      THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
        !          21526: *      UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
        !          21527: *      THE POINTER IS LEFT POINTING PAST THE DELIMITER.
        !          21528: *
        !          21529: *      IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
        !          21530: *      AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
        !          21531: *
        !          21532: *      IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
        !          21533: *      STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
        !          21534: *      STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
        !          21535: *      XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
        !          21536:        EJC
        !          21537: *
        !          21538: *      XSCAN (CONTINUED)
        !          21539: *
        !          21540: XSCAN  PRC  E,0              ENTRY POINT
        !          21541:        MOV  WB,XSCWB         PRESERVE WB
        !          21542:        ZER  XSCBL            CLEAR COUNT OF TRAILING BLANKS
        !          21543:        ZER  XSCNB            CLEAR NON-BLANK SEEN FLAG
        !          21544:        MOV  R$XSC,XR         POINT TO ARGUMENT STRING
        !          21545:        MOV  SCLEN(XR),WA     LOAD STRING LENGTH
        !          21546:        MOV  XSOFS,WB         LOAD CURRENT OFFSET
        !          21547:        SUB  WB,WA            GET NUMBER OF REMAINING CHARACTERS
        !          21548:        BZE  WA,XSCN2         JUMP IF NO CHARACTERS LEFT
        !          21549:        PLC  XR,WB            POINT TO CURRENT CHARACTER
        !          21550: *
        !          21551: *      LOOP TO SEARCH FOR DELIMITER
        !          21552: *
        !          21553: XSCN0  LCH  WB,(XR)+         LOAD NEXT CHARACTER
        !          21554:        BEQ  WB,WC,XSCN3      JUMP IF DELIMITER ONE FOUND
        !          21555:        BEQ  WB,XL,XSCN4      JUMP IF DELIMITER TWO FOUND
        !          21556:        BEQ  WB,=CH$BL,XSCN7  SKIP IF IT IS A BLANK
        !          21557: .IF    .CAHT
        !          21558:        BEQ  WB,=CH$HT,XSCN7  SKIP IF IT IS A TAB
        !          21559: .FI
        !          21560:        BNZ  XSCBL,XSCN2      FAIL CHAR AFTER TRAILING BLANK
        !          21561:        MNZ  XSCNB            NOTE A NON-BLANK SEEN
        !          21562: *
        !          21563: *      COUNT CHARS DONE
        !          21564: *
        !          21565: XSCN1  DCV  WA               DECREMENT COUNT OF CHARS LEFT
        !          21566:        BNZ  WA,XSCN0         LOOP BACK IF MORE CHARS TO GO
        !          21567:        ZER  XSCNB            CLEAR ERRONEOUS BLANKS FLAG
        !          21568: *
        !          21569: *      HERE FOR RUNOUT
        !          21570: *
        !          21571: XSCN2  MOV  R$XSC,XL         POINT TO STRING BLOCK
        !          21572:        MOV  SCLEN(XL),WA     GET STRING LENGTH
        !          21573:        MOV  XSOFS,WB         LOAD OFFSET
        !          21574:        SUB  WB,WA            GET SUBSTRING LENGTH
        !          21575:        SUB  XSCBL,WA         ADJUST FOR TRAILING BLANKS
        !          21576:        ZER  R$XSC            CLEAR STRING PTR FOR COLLECTOR
        !          21577:        ZER  XSCRT            SET ZERO (RUNOUT) RETURN CODE
        !          21578:        BRN  XSCN6            JUMP TO EXIT
        !          21579:        EJC
        !          21580: *
        !          21581: *      XSCAN (CONTINUED)
        !          21582: *
        !          21583: *      HERE IF DELIMITER ONE FOUND
        !          21584: *
        !          21585: XSCN3  MOV  =NUM01,XSCRT     SET RETURN CODE
        !          21586:        BRN  XSCN5            JUMP TO MERGE
        !          21587: *
        !          21588: *      HERE IF DELIMITER TWO FOUND
        !          21589: *
        !          21590: XSCN4  MOV  =NUM02,XSCRT     SET RETURN CODE
        !          21591: *
        !          21592: *      MERGE HERE AFTER DETECTING A DELIMITER
        !          21593: *
        !          21594: XSCN5  MOV  R$XSC,XL         RELOAD POINTER TO STRING
        !          21595:        MOV  SCLEN(XL),WC     GET ORIGINAL LENGTH OF STRING
        !          21596:        SUB  WA,WC            MINUS CHARS LEFT = CHARS SCANNED
        !          21597:        MOV  WC,WA            MOVE TO REG FOR SBSTR
        !          21598:        SUB  XSCBL,WA         ADJUST FOR TRAILING BLANKS
        !          21599:        MOV  XSOFS,WB         SET OFFSET
        !          21600:        SUB  WB,WA            COMPUTE LENGTH FOR SBSTR
        !          21601:        ICV  WC               ADJUST NEW CURSOR PAST DELIMITER
        !          21602:        MOV  WC,XSOFS         STORE NEW OFFSET
        !          21603: *
        !          21604: *      COMMON EXIT POINT
        !          21605: *
        !          21606: XSCN6  ZER  XR               CLEAR GARBAGE CHARACTER PTR IN XR
        !          21607: .IF    .CASL
        !          21608:        JSR  SBSTG            BUILD SUBSTRING
        !          21609: .ELSE
        !          21610:        JSR  SBSTR            BUILD SUB-STRING
        !          21611: .FI
        !          21612:        MOV  XSCRT,WA         LOAD RETURN CODE
        !          21613:        MOV  XSCWB,WB         RESTORE WB
        !          21614:        EXI                   RETURN TO XSCAN CALLER
        !          21615: *
        !          21616: *      DEAL WITH BLANK
        !          21617: *
        !          21618: XSCN7  BZE  XSCNB,XSCN8      SKIP IF LEADING BLANK
        !          21619:        ICV  XSCBL            ELSE COUNT TRAILING BLANK
        !          21620:        BRN  XSCN1            LOOP
        !          21621: *
        !          21622: *      LEADING BLANK
        !          21623: *
        !          21624: XSCN8  ICV  XSOFS            PUSH OFFSET PAST BLANK
        !          21625:        BRN  XSCN1            LOOP
        !          21626:        ENP                   END PROCEDURE XSCAN
        !          21627:        EJC
        !          21628: *
        !          21629: *      XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
        !          21630: *
        !          21631: *      XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
        !          21632: *      IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
        !          21633: *      XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
        !          21634: *
        !          21635: *      -(XS)                 ARGUMENT TO BE SCANNED (ON STACK)
        !          21636: *      JSR  XSCNI            CALL TO SCAN ARGUMENT
        !          21637: *      PPM  LOC              TRANSFER LOC IF ARG IS NOT STRING
        !          21638: *      PPM  LOC              TRANSFER LOC IF ARGUMENT IS NULL
        !          21639: *      (XS)                  POPPED
        !          21640: *      (XR,R$XSC)            ARGUMENT (SCBLK PTR)
        !          21641: *      (WA)                  ARGUMENT LENGTH
        !          21642: *      (IA,RA)               DESTROYED
        !          21643: *
        !          21644: XSCNI  PRC  N,2              ENTRY POINT
        !          21645:        JSR  GTSTG            FETCH ARGUMENT AS STRING
        !          21646:        PPM  XSCI1            JUMP IF NOT CONVERTIBLE
        !          21647:        MOV  XR,R$XSC         ELSE STORE SCBLK PTR FOR XSCAN
        !          21648:        ZER  XSOFS            SET OFFSET TO ZERO
        !          21649:        BZE  WA,XSCI2         JUMP IF NULL STRING
        !          21650:        EXI                   RETURN TO XSCNI CALLER
        !          21651: *
        !          21652: *      HERE IF ARGUMENT IS NOT A STRING
        !          21653: *
        !          21654: XSCI1  EXI  1                TAKE NOT-STRING ERROR EXIT
        !          21655: *
        !          21656: *      HERE FOR NULL STRING
        !          21657: *
        !          21658: XSCI2  EXI  2                TAKE NULL-STRING ERROR EXIT
        !          21659:        ENP                   END PROCEDURE XSCNI
        !          21660:        TTL  S P I T B O L -- UTILITY ROUTINES
        !          21661: *
        !          21662: *      THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
        !          21663: *      VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
        !          21664: *      FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
        !          21665: *      THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
        !          21666: *      TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
        !          21667: *      INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
        !          21668: *      PARAMETER VALUES.
        !          21669: *
        !          21670: *      THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
        !          21671: *      DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
        !          21672: *      MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
        !          21673: *      CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
        !          21674: *
        !          21675: *      SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
        !          21676: *      IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
        !          21677: *      EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
        !          21678: *      EXITING AFTER COMPLETING ITS TASK.
        !          21679: *
        !          21680: *      THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
        !          21681: *      AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
        !          21682:        EJC
        !          21683: *      ARREF -- ARRAY REFERENCE
        !          21684: *
        !          21685: *      (XL)                  MAY BE NON-COLLECTABLE
        !          21686: *      (XR)                  NUMBER OF SUBSCRIPTS
        !          21687: *      (WB)                  SET ZERO/NONZERO FOR VALUE/NAME
        !          21688: *                            THE VALUE IN WB MUST BE COLLECTABLE
        !          21689: *      STACK                 SUBSCRIPTS AND ARRAY OPERAND
        !          21690: *      BRN  ARREF            JUMP TO CALL FUNCTION
        !          21691: *
        !          21692: *      ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
        !          21693: *      THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
        !          21694: *      TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
        !          21695: *      ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
        !          21696: *      WORKING BELOW THE STACK POINTER.
        !          21697: *
        !          21698: ARREF  RTN
        !          21699:        MOV  XR,WA            COPY NUMBER OF SUBSCRIPTS
        !          21700:        MOV  XS,XT            POINT TO STACK FRONT
        !          21701:        WTB  XR               CONVERT TO BAU OFFSET
        !          21702:        ADD  XR,XT            POINT TO ARRAY OPERAND ON STACK
        !          21703:        ICA  XT               FINAL VALUE FOR STACK POPPING
        !          21704:        MOV  XT,ARFXS         KEEP FOR LATER
        !          21705:        MOV  -(XT),XR         LOAD ARRAY OPERAND POINTER
        !          21706:        MOV  XR,R$ARF         KEEP ARRAY POINTER
        !          21707:        MOV  XT,XR            SAVE POINTER TO SUBSCRIPTS
        !          21708:        MOV  R$ARF,XL         POINT XL TO POSSIBLE VCBLK OR TBBLK
        !          21709:        MOV  (XL),WC          LOAD FIRST WORD
        !          21710:        BEQ  WC,=B$ART,ARF01  JUMP IF ARBLK
        !          21711:        BEQ  WC,=B$VCT,ARF07  JUMP IF VCBLK
        !          21712:        BEQ  WC,=B$TBT,ARF10  JUMP IF TBBLK
        !          21713:        ERB  240,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY
        !          21714: *
        !          21715: *      HERE FOR ARRAY (ARBLK)
        !          21716: *
        !          21717: ARF01  BNE  WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS
        !          21718:        LDI  INTV0            GET INITIAL SUBSCRIPT OF ZERO
        !          21719:        MOV  XR,XT            POINT BEFORE SUBSCRIPTS
        !          21720:        ZER  WA               INITIAL OFFSET TO BOUNDS
        !          21721:        BRN  ARF03            JUMP INTO LOOP
        !          21722: *
        !          21723: *      LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
        !          21724: *
        !          21725: ARF02  MLI  ARDM2(XR)        MULTIPLY TOTAL BY NEXT DIMENSION
        !          21726: *
        !          21727: *      MERGE HERE FIRST TIME
        !          21728: *
        !          21729: ARF03  MOV  -(XT),XR         LOAD NEXT SUBSCRIPT
        !          21730:        STI  ARFSI            SAVE CURRENT SUBSCRIPT
        !          21731:        LDI  ICVAL(XR)        LOAD INTEGER VALUE IN CASE
        !          21732:        BEQ  (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER
        !          21733:        EJC
        !          21734: *
        !          21735: *      ARREF (CONTINUED)
        !          21736: *
        !          21737: *
        !          21738:        JSR  GTINT            CONVERT TO INTEGER
        !          21739:        PPM  ARF12            JUMP IF NOT INTEGER
        !          21740:        LDI  ICVAL(XR)        IF OK, LOAD INTEGER VALUE
        !          21741: *
        !          21742: *      HERE WITH INTEGER SUBSCRIPT IN (IA)
        !          21743: *
        !          21744: ARF04  MOV  R$ARF,XR         POINT TO ARRAY
        !          21745:        ADD  WA,XR            OFFSET TO NEXT BOUNDS
        !          21746:        SBI  ARLBD(XR)        SUBTRACT LOW BOUND TO COMPARE
        !          21747:        IOV  ARF13            OUT OF RANGE FAIL IF OVERFLOW
        !          21748:        ILT  ARF13            OUT OF RANGE FAIL IF TOO SMALL
        !          21749:        SBI  ARDIM(XR)        SUBTRACT DIMENSION
        !          21750:        IGE  ARF13            OUT OF RANGE FAIL IF TOO LARGE
        !          21751:        ADI  ARDIM(XR)        ELSE RESTORE SUBSCRIPT OFFSET
        !          21752:        ADI  ARFSI            ADD TO CURRENT TOTAL
        !          21753:        ADD  *ARDMS,WA        POINT TO NEXT BOUNDS
        !          21754:        BNE  XT,XS,ARF02      LOOP BACK IF MORE TO GO
        !          21755: *
        !          21756: *      HERE WITH INTEGER SUBSCRIPT COMPUTED
        !          21757: *
        !          21758:        MFI  WA               GET AS ONE WORD INTEGER
        !          21759:        WTB  WA               CONVERT TO OFFSET
        !          21760:        MOV  R$ARF,XL         POINT TO ARBLK
        !          21761:        ADD  AROFS(XL),WA     ADD OFFSET PAST BOUNDS
        !          21762:        ICA  WA               ADJUST FOR ARPRO FIELD
        !          21763:        BNZ  WB,ARF08         EXIT WITH NAME IF NAME CALL
        !          21764: *
        !          21765: *      MERGE HERE TO GET VALUE FOR VALUE CALL
        !          21766: *
        !          21767: ARF05  JSR  ACESS            GET VALUE
        !          21768:        PPM  ARF13            FAIL IF ACESS FAILS
        !          21769: *
        !          21770: *      RETURN VALUE
        !          21771: *
        !          21772: ARF06  MOV  ARFXS,XS         POP STACK ENTRIES
        !          21773:        ZER  R$ARF            FINISHED WITH ARRAY POINTER
        !          21774:        BRN  EXIXR            EXIT WITH VALUE IN XR
        !          21775:        EJC
        !          21776: *
        !          21777: *      ARREF (CONTINUED)
        !          21778: *
        !          21779: *      HERE FOR VECTOR
        !          21780: *
        !          21781: ARF07  BNE  WA,=NUM01,ARF09  ERROR IF MORE THAN 1 SUBSCRIPT
        !          21782:        MOV  (XS),XR          ELSE LOAD SUBSCRIPT
        !          21783:        JSR  GTINT            CONVERT TO INTEGER
        !          21784:        PPM  ARF12            ERROR IF NOT INTEGER
        !          21785:        LDI  ICVAL(XR)        ELSE LOAD INTEGER VALUE
        !          21786:        SBI  INTV1            SUBTRACT FOR ONES OFFSET
        !          21787:        MFI  WA,ARF13         GET SUBSCRIPT AS ONE WORD
        !          21788:        ADD  =VCVLS,WA        ADD OFFSET FOR STANDARD FIELDS
        !          21789:        WTB  WA               CONVERT OFFSET TO BAUS
        !          21790:        BGE  WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT
        !          21791:        BZE  WB,ARF05         BACK TO GET VALUE IF VALUE CALL
        !          21792: *
        !          21793: *      RETURN NAME
        !          21794: *
        !          21795: ARF08  MOV  ARFXS,XS         POP STACK ENTRIES
        !          21796:        ZER  R$ARF            FINISHED WITH ARRAY POINTER
        !          21797:        BRN  EXNAM            ELSE EXIT WITH NAME
        !          21798: *
        !          21799: *      HERE IF SUBSCRIPT COUNT IS WRONG
        !          21800: *
        !          21801: ARF09  ERB  241,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
        !          21802: *
        !          21803: *      TABLE
        !          21804: *
        !          21805: ARF10  BNE  WA,=NUM01,ARF11  ERROR IF MORE THAN 1 SUBSCRIPT
        !          21806:        MOV  (XS),XR          ELSE LOAD SUBSCRIPT
        !          21807:        JSR  TFIND            CALL TABLE SEARCH ROUTINE
        !          21808:        PPM  ARF13            FAIL IF FAILED
        !          21809:        BNZ  WB,ARF08         EXIT WITH NAME IF NAME CALL
        !          21810:        BRN  ARF06            ELSE EXIT WITH VALUE
        !          21811: *
        !          21812: *      HERE FOR BAD TABLE REFERENCE
        !          21813: *
        !          21814: ARF11  ERB  242,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT
        !          21815: *
        !          21816: *      HERE FOR BAD SUBSCRIPT
        !          21817: *
        !          21818: ARF12  ERB  243,ARRAY SUBSCRIPT IS NOT INTEGER
        !          21819: *
        !          21820: *      HERE TO SIGNAL FAILURE
        !          21821: *
        !          21822: ARF13  ZER  R$ARF            FINISHED WITH ARRAY POINTER
        !          21823:        BRN  EXFAL            FAIL
        !          21824:        EJC
        !          21825: *
        !          21826: *      CFUNC -- CALL A FUNCTION
        !          21827: *
        !          21828: *      CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
        !          21829: *      USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
        !          21830: *      TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
        !          21831: *      (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
        !          21832: *      IF THE NUMBER OF ARGUMENTS IS INCORRECT.
        !          21833: *
        !          21834: *      (XL)                  POINTER TO FUNCTION BLOCK
        !          21835: *      (WA)                  ACTUAL NUMBER OF ARGUMENTS
        !          21836: *      (XS)                  POINTS TO STACKED ARGUMENTS
        !          21837: *      BRN  CFUNC            JUMP TO CALL FUNCTION
        !          21838: *
        !          21839: *      CFUNC CONTINUES BY EXECUTING THE FUNCTION
        !          21840: *
        !          21841: CFUNC  RTN
        !          21842:        BLT  WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS
        !          21843:        BEQ  WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS
        !          21844: *
        !          21845: *      HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
        !          21846: *
        !          21847:        MOV  WA,WB            COPY ACTUAL NUMBER
        !          21848:        SUB  FARGS(XL),WB     GET NUMBER OF EXTRA ARGS
        !          21849:        WTB  WB               CONVERT TO BAUS
        !          21850:        ADD  WB,XS            POP OFF UNWANTED ARGUMENTS
        !          21851:        BRN  CFNC3            JUMP TO GO OFF TO FUNCTION
        !          21852: *
        !          21853: *      HERE IF TOO FEW ARGUMENTS
        !          21854: *
        !          21855: CFNC1  MOV  FARGS(XL),WB     LOAD REQUIRED NUMBER OF ARGUMENTS
        !          21856:        BEQ  WB,=NINI9,CFNC3  JUMP IF CASE OF VAR NUM OF ARGS
        !          21857:        SUB  WA,WB            CALCULATE NUMBER MISSING
        !          21858:        LCT  WB,WB            SET COUNTER TO CONTROL LOOP
        !          21859: *
        !          21860: *      LOOP TO SUPPLY EXTRA NULL ARGUMENTS
        !          21861: *
        !          21862: CFNC2  MOV  =NULLS,-(XS)     STACK A NULL ARGUMENT
        !          21863:        BCT  WB,CFNC2         LOOP TILL PROPER NUMBER STACKED
        !          21864: *
        !          21865: *      MERGE HERE TO JUMP TO FUNCTION
        !          21866: *
        !          21867: CFNC3  BRI  (XL)             JUMP THROUGH FCODE FIELD
        !          21868:        EJC
        !          21869: *
        !          21870: *      EROSI -- PROCESS ERROR RETURN FROM OSINT
        !          21871: *
        !          21872: *      (WA)                  0 OR ERROR CODE IN 256 TO 998
        !          21873: *      (XL)                  0 OR PSEUDO SCBLK FOR ERROR MESSAGE
        !          21874: *      (IA)                  NEW VALUE FOR CODE KEYWORD
        !          21875: *      BRN  EROSI            JUMP TO PROCESS ERROR
        !          21876: *
        !          21877: EROSI  RTN
        !          21878:        STI  KVCOD            STORE NEW CODE KEYWORD VALUE
        !          21879:        MOV  WA,KVERT         STORE ERROR CODE
        !          21880:        BZE  XL,ERROR         FAIL AT ONCE IF NO ERROR MSG TEXT
        !          21881:        MOV  SCLEN(XL),WA     STRING LENGTH
        !          21882:        ZER  WB               ZERO OFFSET
        !          21883:        JSR  SBSTR            COPY ERROR MESSAGE STRING
        !          21884:        MOV  XR,R$ETX         AND STORE IT
        !          21885:        MNZ  EROSN            NOTE NO CALL OF SYSEM
        !          21886:        MOV  KVERT,WA         RECALL ERROR CODE
        !          21887:        BRN  ERROR            ENTER ERROR SECTION
        !          21888: *
        !          21889: *      EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
        !          21890: *
        !          21891: *      (XL,XR)               MAY BE NON-COLLECTABLE
        !          21892: *      BRN  EXFAL            JUMP TO FAIL
        !          21893: *
        !          21894: *      EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
        !          21895: *
        !          21896: EXFAL  RTN
        !          21897:        MOV  FLPTR,XS         POP STACK
        !          21898:        MOV  (XS),XR          LOAD FAILURE OFFSET
        !          21899:        ADD  R$COD,XR         POINT TO FAILURE CODE LOCATION
        !          21900:        LCP  XR               SET CODE POINTER
        !          21901:        BRN  EXITS            DO NEXT CODE WORD
        !          21902: *
        !          21903: *      EXINT -- EXIT WITH INTEGER RESULT
        !          21904: *
        !          21905: *      (XL,XR)               MAY BE NONCOLLECTABLE
        !          21906: *      (IA)                  INTEGER VALUE
        !          21907: *      BRN  EXINT            JUMP TO EXIT WITH INTEGER
        !          21908: *
        !          21909: *      EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          21910: *      WHICH IT DOES BY FALLING THROUGH TO EXIXR
        !          21911: *
        !          21912: EXINT  RTN
        !          21913:        JSR  ICBLD            BUILD ICBLK
        !          21914:        EJC
        !          21915: *      EXIXR -- EXIT WITH RESULT IN (XR)
        !          21916: *
        !          21917: *      (XR)                  RESULT
        !          21918: *      (XL)                  MAY BE NON-COLLECTABLE
        !          21919: *      BRN  EXIXR            JUMP TO EXIT WITH RESULT IN (XR)
        !          21920: *
        !          21921: *      EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          21922: *      WHICH IT DOES BY FALLING THROUGH TO EXITS.
        !          21923: EXIXR  RTN
        !          21924: *
        !          21925:        MOV  XR,-(XS)         STACK RESULT
        !          21926: *
        !          21927: *
        !          21928: *      EXITS -- EXIT WITH RESULT IF ANY STACKED
        !          21929: *
        !          21930: *      (XR,XL)               MAY BE NON-COLLECTABLE
        !          21931: *
        !          21932: *      BRN  EXITS            ENTER EXITS ROUTINE
        !          21933: *
        !          21934: EXITS  RTN
        !          21935:        LCW  XR               LOAD NEXT CODE WORD
        !          21936:        MOV  (XR),XL          LOAD ENTRY ADDRESS
        !          21937:        BRI  XL               JUMP TO EXECUTE NEXT CODE WORD
        !          21938: *
        !          21939: *      EXNAM -- EXIT WITH NAME IN (XL,WA)
        !          21940: *
        !          21941: *      (XL)                  NAME BASE
        !          21942: *      (WA)                  NAME OFFSET
        !          21943: *      (XR)                  MAY BE NON-COLLECTABLE
        !          21944: *      BRN  EXNAM            JUMP TO EXIT WITH NAME IN (XL,WA)
        !          21945: *
        !          21946: *      EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          21947: *
        !          21948: EXNAM  RTN
        !          21949:        MOV  XL,-(XS)         STACK NAME BASE
        !          21950:        MOV  WA,-(XS)         STACK NAME OFFSET
        !          21951:        BRN  EXITS            DO NEXT CODE WORD
        !          21952:        EJC
        !          21953: *
        !          21954: *      EXNUL -- EXIT WITH NULL RESULT
        !          21955: *
        !          21956: *      (XL,XR)               MAY BE NON-COLLECTABLE
        !          21957: *      BRN  EXNUL            JUMP TO EXIT WITH NULL VALUE
        !          21958: *
        !          21959: *      EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          21960: *
        !          21961: EXNUL  RTN
        !          21962:        MOV  =NULLS,-(XS)     STACK NULL VALUE
        !          21963:        BRN  EXITS            DO NEXT CODE WORD
        !          21964: .IF    .CNRA
        !          21965: .ELSE
        !          21966: *
        !          21967: *      EXREA -- EXIT WITH REAL RESULT
        !          21968: *
        !          21969: *      (XL,XR)               MAY BE NON-COLLECTABLE
        !          21970: *      (RA)                  REAL VALUE
        !          21971: *      BRN  EXREA            JUMP TO EXIT WITH REAL VALUE
        !          21972: *
        !          21973: *      EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          21974: *
        !          21975: EXREA  RTN
        !          21976:        JSR  RCBLD            BUILD RCBLK
        !          21977:        BRN  EXIXR            JUMP TO EXIT WITH RESULT IN XR
        !          21978: .FI
        !          21979: *
        !          21980: *      EXSID -- EXIT SETTING ID FIELD
        !          21981: *
        !          21982: *      EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
        !          21983: *      BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
        !          21984: *
        !          21985: *      (XR)                  PTR TO BLOCK WITH IDVAL FIELD
        !          21986: *      (XL)                  MAY BE NON-COLLECTABLE
        !          21987: *      BRN  EXSID            JUMP TO EXIT AFTER SETTING ID FIELD
        !          21988: *
        !          21989: *      EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          21990: *
        !          21991: EXSID  RTN
        !          21992:        MOV  CURID,WA         LOAD CURRENT ID VALUE
        !          21993:        BNE  WA,=CFP$M,EXSI1  JUMP IF NO OVERFLOW
        !          21994:        ZER  WA               ELSE RESET FOR WRAPAROUND
        !          21995: *
        !          21996: *      HERE WITH OLD IDVAL IN WA
        !          21997: *
        !          21998: EXSI1  ICV  WA               BUMP ID VALUE
        !          21999:        MOV  WA,CURID         STORE FOR NEXT TIME
        !          22000:        MOV  WA,IDVAL(XR)     STORE ID VALUE
        !          22001:        BRN  EXIXR            EXIT WITH RESULT IN (XR)
        !          22002:        EJC
        !          22003: *
        !          22004: *      EXVNM -- EXIT WITH NAME OF VARIABLE
        !          22005: *
        !          22006: *      EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
        !          22007: *      REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
        !          22008: *
        !          22009: *      (XR)                  VRBLK POINTER
        !          22010: *      (XL)                  MAY BE NON-COLLECTABLE
        !          22011: *      BRN  EXVNM            EXIT WITH VRBLK POINTER IN XR
        !          22012: *
        !          22013: EXVNM  RTN
        !          22014:        MOV  XR,XL            COPY NAME BASE POINTER
        !          22015:        MOV  *NMSI$,WA        SET SIZE OF NMBLK
        !          22016:        JSR  ALLOC            ALLOCATE NMBLK
        !          22017:        MOV  =B$NML,(XR)      STORE TYPE WORD
        !          22018:        MOV  XL,NMBAS(XR)     STORE NAME BASE
        !          22019:        MOV  *VRVAL,NMOFS(XR) STORE NAME OFFSET
        !          22020:        BRN  EXIXR            EXIT WITH RESULT IN XR
        !          22021: *
        !          22022: *      FLPOP -- FAIL AND POP IN PATTERN MATCHING
        !          22023: *
        !          22024: *      FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
        !          22025: *      DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
        !          22026: *
        !          22027: *      (XL,XR)               MAY BE NON-COLLECTABLE
        !          22028: *      BRN  FLPOP            JUMP TO FAIL AND POP STACK
        !          22029: *
        !          22030: FLPOP  RTN
        !          22031:        ADD  *NUM02,XS        POP TWO ENTRIES OFF STACK
        !          22032: *
        !          22033: *      FAILP -- FAILURE IN MATCHING PATTERN NODE
        !          22034: *
        !          22035: *      FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
        !          22036: *      SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
        !          22037: *
        !          22038: *      (XL,XR)               MAY BE NON-COLLECTABLE
        !          22039: *      BRN  FAILP            SIGNAL FAILURE TO MATCH
        !          22040: *
        !          22041: *      FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
        !          22042: *
        !          22043: FAILP  RTN
        !          22044:        MOV  (XS)+,XR         LOAD ALTERNATIVE NODE POINTER
        !          22045:        MOV  (XS)+,WB         RESTORE OLD CURSOR
        !          22046:        MOV  (XR),XL          LOAD PCODE ENTRY POINTER
        !          22047:        BRI  XL               JUMP TO EXECUTE CODE FOR NODE
        !          22048:        EJC
        !          22049: *
        !          22050: *      INDIR -- COMPUTE INDIRECT REFERENCE
        !          22051: *
        !          22052: *      (WB)                  NONZERO/ZERO FOR BY NAME/VALUE
        !          22053: *      BRN  INDIR            JUMP TO GET INDIRECT REF ON STACK
        !          22054: *
        !          22055: *      INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
        !          22056: *
        !          22057: INDIR  RTN
        !          22058:        MOV  (XS)+,XR         LOAD ARGUMENT
        !          22059:        BEQ  (XR),=B$NML,INDR2 JUMP IF A NAME
        !          22060:        JSR  GTNVR            ELSE CONVERT TO VARIABLE
        !          22061:        ERR  244,INDIRECTION OPERAND IS NOT NAME
        !          22062:        BZE  WB,INDR1         SKIP IF BY VALUE
        !          22063:        MOV  XR,-(XS)         ELSE STACK VRBLK PTR
        !          22064:        MOV  *VRVAL,-(XS)     STACK NAME OFFSET
        !          22065:        BRN  EXITS            EXIT WITH RESULT ON STACK
        !          22066: *
        !          22067: *      HERE TO GET VALUE OF NATURAL VARIABLE
        !          22068: *
        !          22069: INDR1  BRI  (XR)             JUMP THROUGH VRGET FIELD OF VRBLK
        !          22070: *
        !          22071: *      HERE IF OPERAND IS A NAME
        !          22072: *
        !          22073: INDR2  MOV  NMBAS(XR),XL     LOAD NAME BASE
        !          22074:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
        !          22075:        BNZ  WB,EXNAM         EXIT IF CALLED BY NAME
        !          22076:        JSR  ACESS            ELSE GET VALUE FIRST
        !          22077:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          22078:        BRN  EXIXR            ELSE RETURN WITH VALUE IN XR
        !          22079:        EJC
        !          22080: *
        !          22081: *      MATCH -- INITIATE PATTERN MATCH
        !          22082: *
        !          22083: *      (WB)                  MATCH TYPE CODE
        !          22084: *      BRN  MATCH            JUMP TO INITIATE PATTERN MATCH
        !          22085: *
        !          22086: *      MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
        !          22087: *      PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
        !          22088: *
        !          22089: MATCH  RTN
        !          22090:        MOV  (XS)+,XR         LOAD PATTERN OPERAND
        !          22091:        JSR  GTPAT            CONVERT TO PATTERN
        !          22092:        ERR  245,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN
        !          22093:        MOV  XR,XL            IF OK, SAVE PATTERN POINTER
        !          22094:        BNZ  WB,MTCH1         JUMP IF NOT MATCH BY NAME
        !          22095:        MOV  (XS),WA          ELSE LOAD NAME OFFSET
        !          22096:        MOV  XL,-(XS)         SAVE PATTERN POINTER
        !          22097:        MOV  2(XS),XL         LOAD NAME BASE
        !          22098:        JSR  ACESS            ACCESS SUBJECT VALUE
        !          22099:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          22100:        MOV  (XS),XL          RESTORE PATTERN POINTER
        !          22101:        MOV  XR,(XS)          STACK SUBJECT STRING VAL FOR MERGE
        !          22102:        ZER  WB               RESTORE TYPE CODE
        !          22103: *
        !          22104: *      MERGE HERE WITH SUBJECT VALUE ON STACK
        !          22105: *
        !          22106: .IF    .CNBF
        !          22107: MTCH1  JSR  GTSTG            CONVERT SUBJECT TO STRING
        !          22108: .ELSE
        !          22109: MTCH1  MOV  (XS),XR          LOAD SUBJECT VALUE
        !          22110:        ZER  R$PMB            ASSUME NOT A BUFFER
        !          22111:        BNE  (XR),=B$BCT,MTCHA BRANCH IF NOT
        !          22112:        ICA  XS               ELSE POP VALUE
        !          22113:        MOV  XR,R$PMB         SAVE POINTER
        !          22114:        MOV  BCLEN(XR),WA     GET DEFINED LENGTH
        !          22115:        MOV  BCBUF(XR),XR     POINT TO BFBLK
        !          22116:        BRN  MTCHB
        !          22117: *
        !          22118: *      HERE IF NOT BUFFER TO CONVERT TO STRING
        !          22119: *
        !          22120: MTCHA  JSR  GTSTG            NOT BUFFER - CONVERT TO STRING
        !          22121: .FI
        !          22122:        ERR  246,PATTERN MATCH LEFT OPERAND IS NOT STRING
        !          22123: .IF    .CNBF
        !          22124:        MOV  XR,R$PMS         IF OK, STORE SUBJECT STRING POINTER
        !          22125: .ELSE
        !          22126: *
        !          22127: *      MERGE WITH NULL STRING OR BUFFER
        !          22128: *
        !          22129: MTCHB  MOV  XR,R$PMS         IF OK, STORE SUBJECT STRING POINTER
        !          22130: .FI
        !          22131:        MOV  WA,PMSSL         AND LENGTH
        !          22132:        MOV  WB,-(XS)         STACK MATCH TYPE CODE
        !          22133:        ZER  -(XS)            STACK INITIAL CURSOR (ZERO)
        !          22134:        ZER  WB               SET INITIAL CURSOR
        !          22135:        MOV  XS,PMHBS         SET HISTORY STACK BASE PTR
        !          22136:        ZER  PMDFL            RESET PATTERN ASSIGNMENT FLAG
        !          22137:        MOV  XL,XR            SET INITIAL NODE POINTER
        !          22138:        BNZ  KVANC,MTCH2      JUMP IF ANCHORED
        !          22139:        EJC
        !          22140: *
        !          22141: *      MATCH (CONTINUED)
        !          22142: *
        !          22143: *      HERE FOR UNANCHORED
        !          22144: *
        !          22145:        MOV  XR,-(XS)         STACK INITIAL NODE POINTER
        !          22146:        MOV  =NDUNA,-(XS)     STACK POINTER TO ANCHOR MOVE NODE
        !          22147:        BRI  (XR)             START MATCH OF FIRST NODE
        !          22148: *
        !          22149: *      HERE IN ANCHORED MODE
        !          22150: *
        !          22151: MTCH2  ZER  -(XS)            DUMMY CURSOR VALUE
        !          22152:        MOV  =NDABO,-(XS)     STACK POINTER TO ABORT NODE
        !          22153:        BRI  (XR)             START MATCH OF FIRST NODE
        !          22154:        EJC
        !          22155: *
        !          22156: *      RETRN -- RETURN FROM FUNCTION
        !          22157: *
        !          22158: *      (WA)                  STRING POINTER FOR RETURN TYPE
        !          22159: *      BRN  RETRN            JUMP TO RETURN FROM (SNOBOL) FUNC
        !          22160: *
        !          22161: *      RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
        !          22162: *      THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
        !          22163: *      ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
        !          22164: *      ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
        !          22165: *      FUNCTION CALL AND RETURN.
        !          22166: *
        !          22167: RETRN  RTN
        !          22168:        BNZ  KVFNC,RTN01      JUMP IF NOT LEVEL ZERO
        !          22169:        ERB  247,FUNCTION RETURN FROM LEVEL ZERO
        !          22170: *
        !          22171: *      HERE IF NOT LEVEL ZERO RETURN
        !          22172: *
        !          22173: RTN01  MOV  FLPRT,XS         POP STACK
        !          22174:        ICA  XS               REMOVE FAILURE OFFSET
        !          22175:        MOV  (XS)+,XR         POP PFBLK POINTER
        !          22176:        MOV  (XS)+,FLPTR      POP FAILURE POINTER
        !          22177:        MOV  (XS)+,FLPRT      POP OLD FLPRT
        !          22178:        MOV  (XS)+,WB         POP CODE POINTER OFFSET
        !          22179:        MOV  (XS)+,WC         POP OLD CODE BLOCK POINTER
        !          22180:        ADD  WC,WB            MAKE OLD CODE POINTER ABSOLUTE
        !          22181:        LCP  WB               RESTORE OLD CODE POINTER
        !          22182:        MOV  WC,R$COD         RESTORE OLD CODE BLOCK POINTER
        !          22183:        DCV  KVFNC            DECREMENT FUNCTION LEVEL
        !          22184:        MOV  KVTRA,WB         LOAD TRACE
        !          22185:        ADD  KVFTR,WB         ADD FTRACE
        !          22186:        BZE  WB,RTN06         JUMP IF NO TRACING POSSIBLE
        !          22187: *
        !          22188: *      HERE IF THERE MAY BE A TRACE
        !          22189: *
        !          22190:        MOV  WA,-(XS)         SAVE FUNCTION RETURN TYPE
        !          22191:        MOV  XR,-(XS)         SAVE PFBLK POINTER
        !          22192:        MOV  WA,KVRTN         SET RTNTYPE FOR TRACE FUNCTION
        !          22193:        MOV  R$FNC,XL         LOAD FNCLEVEL TRBLK PTR (IF ANY)
        !          22194:        JSR  KTREX            EXECUTE POSSIBLE FNCLEVEL TRACE
        !          22195:        MOV  PFVBL(XR),XL     LOAD VRBLK POINTER
        !          22196:        BZE  KVTRA,RTN02      JUMP IF TRACE IS OFF
        !          22197:        MOV  PFRTR(XR),XR     ELSE LOAD RETURN TRACE TRBLK PTR
        !          22198:        BZE  XR,RTN02         JUMP IF NOT RETURN TRACED
        !          22199:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
        !          22200:        BZE  TRFNC(XR),RTN03  JUMP IF PRINT TRACE
        !          22201:        MOV  *VRVAL,WA        ELSE SET NAME OFFSET
        !          22202:        MOV  1(XS),KVRTN      MAKE SURE RTNTYPE IS SET RIGHT
        !          22203:        JSR  TRXEQ            EXECUTE FULL TRACE
        !          22204:        EJC
        !          22205: *
        !          22206: *      RETRN (CONTINUED)
        !          22207: *
        !          22208: *      HERE TO TEST FOR FTRACE
        !          22209: *
        !          22210: RTN02  BZE  KVFTR,RTN05      JUMP IF FTRACE IS OFF
        !          22211:        DCV  KVFTR            ELSE DECREMENT FTRACE
        !          22212: *
        !          22213: *      HERE FOR PRINT TRACE OF FUNCTION RETURN
        !          22214: *
        !          22215: RTN03  JSR  PRTSN            PRINT STATEMENT NUMBER
        !          22216:        MOV  1(XS),XR         LOAD RETURN TYPE
        !          22217:        JSR  PRTST            PRINT IT
        !          22218:        MOV  =CH$BL,WA        LOAD BLANK
        !          22219:        JSR  PRTCH            PRINT IT
        !          22220:        MOV  0(XS),XL         LOAD PFBLK PTR
        !          22221:        MOV  PFVBL(XL),XL     LOAD FUNCTION VRBLK PTR
        !          22222:        MOV  *VRVAL,WA        SET VRBLK NAME OFFSET
        !          22223:        BNE  XR,=SCFRT,RTN04  JUMP IF NOT FRETURN CASE
        !          22224: *
        !          22225: *      FOR FRETURN, JUST PRINT FUNCTION NAME
        !          22226: *
        !          22227:        JSR  PRTNM            PRINT NAME
        !          22228:        JSR  PRTFH            TERMINATE PRINT LINE
        !          22229:        BRN  RTN05            MERGE
        !          22230: *
        !          22231: *      HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
        !          22232: *
        !          22233: RTN04  JSR  PRTNV            PRINT NAME = VALUE
        !          22234: *
        !          22235: *      HERE AFTER COMPLETING TRACE
        !          22236: *
        !          22237: RTN05  MOV  (XS)+,XR         POP PFBLK POINTER
        !          22238:        MOV  (XS)+,WA         POP RETURN TYPE STRING
        !          22239: *
        !          22240: *      MERGE HERE IF NO TRACE REQUIRED
        !          22241: *
        !          22242: RTN06  MOV  WA,KVRTN         SET RTNTYPE KEYWORD
        !          22243:        MOV  PFVBL(XR),XL     LOAD POINTER TO FN VRBLK
        !          22244:        EJC
        !          22245: *      RETRN (CONTINUED)
        !          22246: *
        !          22247: *      GET VALUE OF FUNCTION
        !          22248: *
        !          22249: RTN07  MOV  XL,RTNBP         SAVE BLOCK POINTER
        !          22250:        MOV  VRVAL(XL),XL     LOAD VALUE
        !          22251:        BEQ  (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED
        !          22252:        MOV  XL,RTNFV         ELSE SAVE FUNCTION RESULT VALUE
        !          22253:        MOV  (XS)+,RTNSV      SAVE ORIGINAL FUNCTION VALUE
        !          22254: .IF    .CNPF
        !          22255:        MOV  FARGS(XR),WB     GET NUMBER OF ARGUMENTS
        !          22256: .ELSE
        !          22257:        MOV  (XS)+,XL         POP SAVED POINTER
        !          22258:        BZE  XL,RTN7C         NO ACTION IF NONE
        !          22259:        BZE  KVPFL,RTN7C      JUMP IF NO PROFILING
        !          22260:        JSR  PRFLU            ELSE PROFILE LAST FUNC STMT
        !          22261:        BEQ  KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD
        !          22262: *
        !          22263: *      HERE IF PROFILE = 1. START TIME MUST BE FRIGGED TO
        !          22264: *      APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
        !          22265: *      THE CALL.
        !          22266: *
        !          22267:        LDI  PFSTM            LOAD CURRENT TIME
        !          22268:        SBI  ICVAL(XL)        FRIG BY SUBTRACTING SAVED AMOUNT
        !          22269:        BRN  RTN7B            AND MERGE
        !          22270: *
        !          22271: *      HERE IF PROFILE = 2
        !          22272: *
        !          22273: RTN7A  LDI  ICVAL(XL)        LOAD SAVED TIME
        !          22274: *
        !          22275: *      BOTH PROFILE TYPES MERGE HERE
        !          22276: *
        !          22277: RTN7B  STI  PFSTM            STORE BACK CORRECT START TIME
        !          22278: *
        !          22279: *      MERGE HERE IF NO PROFILING
        !          22280: *
        !          22281: RTN7C  MOV  FARGS(XR),WB     GET NUMBER OF ARGS
        !          22282: .FI
        !          22283:        ADD  PFNLO(XR),WB     ADD NUMBER OF LOCALS
        !          22284:        BZE  WB,RTN10         JUMP IF NO ARGS/LOCALS
        !          22285:        LCT  WB,WB            ELSE SET LOOP COUNTER
        !          22286:        ADD  PFLEN(XR),XR     AND POINT TO END OF PFBLK
        !          22287: *
        !          22288: *      LOOP TO RESTORE FUNCTIONS AND LOCALS
        !          22289: *
        !          22290: RTN08  MOV  -(XR),XL         LOAD NEXT VRBLK POINTER
        !          22291: *
        !          22292: *      LOOP TO FIND VALUE BLOCK
        !          22293: *
        !          22294: RTN09  MOV  XL,WA            SAVE BLOCK POINTER
        !          22295:        MOV  VRVAL(XL),XL     LOAD POINTER TO NEXT VALUE
        !          22296:        BEQ  (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED
        !          22297:        MOV  WA,XL            ELSE RESTORE LAST BLOCK POINTER
        !          22298:        MOV  (XS)+,VRVAL(XL)  RESTORE OLD VARIABLE VALUE
        !          22299:        BCT  WB,RTN08         LOOP TILL ALL PROCESSED
        !          22300:        EJC
        !          22301: *
        !          22302: *      RETRN (CONTINUED)
        !          22303: *
        !          22304: *      NOW RESTORE FUNCTION VALUE AND EXIT
        !          22305: *
        !          22306: RTN10  MOV  RTNBP,XL         RESTORE PTR TO LAST FUNCTION BLOCK
        !          22307:        MOV  RTNSV,VRVAL(XL)  RESTORE OLD FUNCTION VALUE
        !          22308:        MOV  RTNFV,XR         RELOAD FUNCTION RESULT
        !          22309:        MOV  R$COD,XL         POINT TO NEW CODE BLOCK
        !          22310:        MOV  KVSTN,KVLST      SET LASTNO FROM STNO
        !          22311:        MOV  CDSTM(XL),KVSTN  RESET PROPER STNO VALUE
        !          22312:        MOV  KVRTN,WA         LOAD RETURN TYPE
        !          22313:        BEQ  WA,=SCRTN,EXIXR  EXIT WITH RESULT IN XR IF RETURN
        !          22314:        BEQ  WA,=SCFRT,EXFAL  FAIL IF FRETURN
        !          22315: *
        !          22316: *      HERE FOR NRETURN
        !          22317: *
        !          22318:        BEQ  (XR),=B$NML,RTN11 JUMP IF IS A NAME
        !          22319:        JSR  GTNVR            ELSE TRY CONVERT TO VARIABLE NAME
        !          22320:        ERR  248,FUNCTION RESULT IN NRETURN IS NOT NAME
        !          22321:        MOV  XR,XL            IF OK, COPY VRBLK (NAME BASE) PTR
        !          22322:        MOV  *VRVAL,WA        SET NAME OFFSET
        !          22323:        BRN  RTN12            AND MERGE
        !          22324: *
        !          22325: *      HERE IF RETURNED RESULT IS A NAME
        !          22326: *
        !          22327: RTN11  MOV  NMBAS(XR),XL     LOAD NAME BASE
        !          22328:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
        !          22329: *
        !          22330: *      MERGE HERE WITH RETURNED NAME IN (XL,WA)
        !          22331: *
        !          22332: RTN12  MOV  XL,XR            PRESERVE XL
        !          22333:        LCW  WB               LOAD NEXT WORD
        !          22334:        MOV  XR,XL            RESTORE XL
        !          22335:        BEQ  WB,=OFNE$,EXNAM  EXIT IF CALLED BY NAME
        !          22336:        MOV  WB,-(XS)         ELSE SAVE CODE WORD
        !          22337:        JSR  ACESS            GET VALUE
        !          22338:        PPM  EXFAL            FAIL IF ACCESS FAILS
        !          22339:        MOV  XR,XL            IF OK, COPY RESULT
        !          22340:        MOV  (XS),XR          RELOAD NEXT CODE WORD
        !          22341:        MOV  XL,(XS)          STORE RESULT ON STACK
        !          22342:        MOV  (XR),XL          LOAD ROUTINE ADDRESS
        !          22343:        BRI  XL               JUMP TO EXECUTE NEXT CODE WORD
        !          22344:        EJC
        !          22345: *
        !          22346: *      STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
        !          22347: *
        !          22348: *      BRN  STCOV            JUMP TO SIGNAL STATEMENT COUNT OFLO
        !          22349: *
        !          22350: *      PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
        !          22351: *      SETEXIT TRAP CAN REGAIN CONTROL.
        !          22352: *      STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
        !          22353: *
        !          22354: STCOV  RTN
        !          22355:        ICV  ERRFT            FATAL ERROR
        !          22356:        LDI  INTVT            GET 10
        !          22357:        ADI  KVSTL            ADD TO FORMER LIMIT
        !          22358:        STI  KVSTL            STORE AS NEW STLIMIT
        !          22359:        LDI  INTVT            GET 10
        !          22360:        STI  KVSTC            SET AS NEW COUNT
        !          22361:        ERB  249,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
        !          22362:        EJC
        !          22363: *
        !          22364: *      STMGO -- START EXECUTION OF NEW STATEMENT
        !          22365: *
        !          22366: *      (XR)                  POINTER TO CDBLK FOR NEW STATEMENT
        !          22367: *      BRN  STMGO            JUMP TO EXECUTE NEW STATEMENT
        !          22368: *
        !          22369: *      STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
        !          22370: *
        !          22371: STMGO  RTN
        !          22372:        MOV  XR,R$COD         SET NEW CODE BLOCK POINTER
        !          22373: .IF    .CNPF
        !          22374:        MOV  KVSTN,KVLST      SET LASTNO
        !          22375: .ELSE
        !          22376:        BZE  KVPFL,STGO1      SKIP IF NO PROFILING
        !          22377:        JSR  PRFLU            ELSE PROFILE THE STATEMENT
        !          22378: *
        !          22379: *      MERGE PROFILE, NO-PROFILE CASES
        !          22380: *
        !          22381: STGO1  MOV  KVSTN,KVLST      SET LASTNO
        !          22382: .FI
        !          22383:        MOV  CDSTM(XR),KVSTN  SET STNO
        !          22384:        ADD  *CDCOD,XR        POINT TO FIRST CODE WORD
        !          22385:        LCP  XR               SET CODE POINTER
        !          22386:        LDI  KVSTC            GET STMT COUNT
        !          22387:        ILT  EXITS            OMIT COUNTING IF NEGATIVE
        !          22388:        IEQ  STCOV            FAIL IF STLIMIT REACHED
        !          22389:        SBI  INTV1            DECREMENT
        !          22390:        STI  KVSTC            REPLACE IT
        !          22391:        BZE  R$STC,EXITS      EXIT IF NO STCOUNT TRACE
        !          22392: *
        !          22393: *      HERE FOR STCOUNT TRACE
        !          22394: *
        !          22395:        ZER  XR               CLEAR GARBAGE VALUE IN XR
        !          22396:        MOV  R$STC,XL         LOAD POINTER TO STCOUNT TRBLK
        !          22397:        JSR  KTREX            EXECUTE KEYWORD TRACE
        !          22398:        BRN  EXITS            AND THEN EXIT FOR NEXT CODE WORD
        !          22399:        EJC
        !          22400: *
        !          22401: *      STOPR -- TERMINATE RUN
        !          22402: *
        !          22403: *      (WA)                  0 OR ERROR MESSAGE CODE
        !          22404: *      (XR)                  0 OR ENDING MESSAGE POINTER
        !          22405: *      BRN STOPR             JUMP TO TERMINATE RUN
        !          22406: *
        !          22407: *      TERMINATE RUN AND PRINT STATISTICS.  ON ENTRY XR POINTS
        !          22408: *      TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY.
        !          22409: *      (WA) AND (XR) ARE BOTH NON-ZERO ONLY IN THE CASE OF FATAL
        !          22410: *      ERRORS DURING INITIAL COMPILE.
        !          22411: *
        !          22412: STOPR  RTN
        !          22413: .IF    .CSAX
        !          22414:        JSR  SYSAX            CALL AFTER EXECUTION PROC
        !          22415: .ELSE
        !          22416: .FI
        !          22417:        ADD  RSMEM,DNAME      USE THE RESERVE MEMORY
        !          22418:        BZE  WA,STPR1         SKIP IF NO ERROR MESSAGE
        !          22419:        MOV  XR,STPXR         KEEP 0 OR ENDING MESSAGE
        !          22420:        MOV  TTERL,TTLST      SEND ERROR AND STATS TO TERML
        !          22421:        JSR  PRTPG            PAGE THROW
        !          22422:        JSR  ERMSG            PRINT ERROR MESSAGE
        !          22423:        MOV  STPXR,XR         RECOVER 0 OR ENDING MESSAGE
        !          22424:        ZER  EXSTS            TO FORCE ENDING STATS OUT FOR ERROR
        !          22425: *
        !          22426: *      PROCESS ENDING STATISTICS
        !          22427: *
        !          22428: STPR1  MTI  KVSTN            GET STATEMENT NUMBER
        !          22429:        IEQ  STPR6            SKIP IF COMPILE TIME
        !          22430:        BNZ  EXSTS,STPR4      SKIP IF NO STATS TO BE PRINTED
        !          22431:        JSR  PRTPG            EJECT PRINTER
        !          22432:        BZE  XR,STPR2         SKIP IF NO MESSAGE
        !          22433:        JSR  PRTFB            PRINT MESSAGE
        !          22434: *
        !          22435: *      MERGE HERE IF NO MESSAGE TO PRINT
        !          22436: *
        !          22437: STPR2  JSR  PRTFH            PRINT BLANK LINE
        !          22438:        MOV  =STPM1,XR        POINT TO MESSAGE /IN STATEMENT XXX/
        !          22439:        JSR  PRTMI            PRINT IT
        !          22440:        JSR  SYSTM            GET CURRENT TIME
        !          22441:        SBI  TIMSX            MINUS START TIME = ELAPSED EXEC TIM
        !          22442:        STI  STPTI            SAVE FOR LATER
        !          22443:        MOV  =STPM3,XR        POINT TO MSG /EXECUTION TIME MSEC /
        !          22444:        JSR  PRTMI            PRINT IT
        !          22445:        LDI  KVSTL            GET STATEMENT LIMIT
        !          22446:        ILT  STPR3            SKIP IF NEGATIVE
        !          22447:        SBI  KVSTC            MINUS COUNTER = COUNT
        !          22448:        STI  STPSI            SAVE
        !          22449:        MOV  =STPM2,XR        POINT TO MESSAGE /STMTS EXECUTED/
        !          22450:        JSR  PRTMI            PRINT IT
        !          22451: .IF    .CTMD
        !          22452: .ELSE
        !          22453:        LDI  STPTI            RELOAD ELAPSED TIME
        !          22454:        MLI  INTTH            *1000 (MICROSECS)
        !          22455:        IOV  STPR3            JUMP IF WE CANNOT COMPUTE
        !          22456:        DVI  STPSI            DIVIDE BY STATEMENT COUNT
        !          22457:        IOV  STPR3            JUMP IF OVERFLOW
        !          22458:        MOV  =STPM4,XR        POINT TO MSG (MCSEC PER STATEMENT /
        !          22459:        JSR  PRTMI            PRINT IT
        !          22460: .FI
        !          22461:        EJC
        !          22462: *
        !          22463: *      STOPR (CONTINUED)
        !          22464: *
        !          22465: *      MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
        !          22466: *
        !          22467: STPR3  MTI  GBCNT            LOAD COUNT OF COLLECTIONS
        !          22468:        MOV  =STPM5,XR        POINT TO MESSAGE /REGENERATIONS /
        !          22469:        JSR  PRTMI            PRINT IT
        !          22470:        JSR  PRTFH            ONE MORE BLANK FOR LUCK
        !          22471: *
        !          22472: *      CHECK IF DUMP REQUESTED
        !          22473: *
        !          22474: .IF    .CNPF
        !          22475: STPR4  MOV  KVDMP,XR         LOAD DUMP KEYWORD
        !          22476: .ELSE
        !          22477: STPR4  JSR  PRFLR            PRINT PROFILE IF WANTED
        !          22478:        MOV  KVDMP,XR         LOAD DUMP KEYWORD
        !          22479: .FI
        !          22480:        JSR  DUMPR            EXECUTE DUMP IF REQUESTED
        !          22481: *
        !          22482: *      MERGE TO END RUN FOR SEVERE COMPILATION ERRORS
        !          22483: *
        !          22484: STPR5  MOV  =KVCOD,WA        LOAD CODE VALUE
        !          22485:        JSR  SYSEJ            EXIT TO SYSTEM
        !          22486: *
        !          22487: *      TERMINATION DURING COMPILE
        !          22488: *
        !          22489: STPR6  BZE  XR,STPR7         SKIP IF NO MESSAGE
        !          22490:        JSR  PRTSF            ELSE PRINT IT
        !          22491: *
        !          22492: *      NOTIFICATION THAT IT IS COMPILE TIME
        !          22493: *
        !          22494: STPR7  MOV  =ENDIC,XR        NOTIFY USER
        !          22495:        JSR  PRTSF            SEND IT
        !          22496:        BRN  STPR5            END
        !          22497:        EJC
        !          22498: *
        !          22499: *      SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
        !          22500: *
        !          22501: *      SEE PATTERN MATCH ROUTINES FOR DETAILS
        !          22502: *
        !          22503: *      (XR)                  CURRENT NODE
        !          22504: *      (WB)                  CURRENT CURSOR
        !          22505: *      (XL)                  MAY BE NON-COLLECTABLE
        !          22506: *      BRN  SUCCP            SIGNAL SUCCESSFUL PATTERN MATCH
        !          22507: *
        !          22508: *      SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
        !          22509: *
        !          22510: SUCCP  RTN
        !          22511:        MOV  PTHEN(XR),XR     LOAD SUCCESSOR NODE
        !          22512:        MOV  (XR),XL          LOAD NODE CODE ENTRY ADDRESS
        !          22513:        BRI  XL               JUMP TO MATCH SUCCESSOR NODE
        !          22514:        TTL  S P I T B O L -- STACK OVERFLOW SECTION
        !          22515: *
        !          22516: *      CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
        !          22517: *
        !          22518:        SEC                   START OF STACK OVERFLOW SECTION
        !          22519: *
        !          22520: STAKV  RTN                   ENTRY POINT FOR STACK OVERFLOW
        !          22521:        ICV  ERRFT            FATAL ERROR
        !          22522:        MOV  FLPTR,XS         POP STACK TO AVOID MORE FAILS
        !          22523:        BNZ  GBCFL,STAK1      JUMP IF GARBAGE COLLECTING
        !          22524:        ERB  250,STACK OVERFLOW
        !          22525: *
        !          22526: *      NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
        !          22527: *
        !          22528: STAK1  MOV  =ENDSO,XR        POINT TO MESSAGE
        !          22529:        ZER  KVDMP            MEMORY IS UNDUMPABLE
        !          22530:        ZER  WA               NO ERROR MESSAGE
        !          22531:        MOV  TTERL,TTLST      SEND MESSAGE TO TERML IF POSSIBLE
        !          22532:        BRN  STOPR            GIVE UP
        !          22533:        TTL  S P I T B O L -- ERROR SECTION
        !          22534: *
        !          22535: *      THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
        !          22536: *      RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
        !          22537: *
        !          22538: *      (WA)                  IS THE ERROR CODE
        !          22539: *
        !          22540: *      THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
        !          22541: *      THE ERROR OCCURED AS FOLLOWS.
        !          22542: *
        !          22543: *      STAGE=STGIC           ERROR DURING INITIAL COMPILE
        !          22544: *
        !          22545: *      STAGE=STGXC           ERROR DURING COMPILE AT EXECUTE
        !          22546: *                            TIME (CODE, CONVERT FUNCTION CALLS)
        !          22547: *
        !          22548: *      STAGE=STGEV           ERROR DURING COMPILATION OF
        !          22549: *                            EXPRESSION AT EXECUTION TIME
        !          22550: *                            (EVAL, CONVERT FUNCTION CALL).
        !          22551: *
        !          22552: *      STAGE=STGXT           ERROR AT EXECUTE TIME. COMPILER
        !          22553: *                            NOT ACTIVE.
        !          22554: *
        !          22555: *      STAGE=STGCE           ERROR DURING INITIAL COMPILE AFTER
        !          22556: *                            SCANNING OUT THE END LINE.
        !          22557: *
        !          22558: *      STAGE=STGXE           ERROR DURING COMPILE AT EXECUTE
        !          22559: *                            TIME AFTER SCANNING END LINE.
        !          22560: *
        !          22561: *      STAGE=STGEE           ERROR DURING EXPRESSION EVALUATION
        !          22562: *
        !          22563:        SEC                   START OF ERROR SECTION
        !          22564: *
        !          22565: ERROR  RTN                   ERROR CODE ENTRY POINT
        !          22566:        BGE  ERRFT,=NUM03,ERR16 SKIP IF TOO MANY FATALS
        !          22567:        BEQ  R$CIM,=CMLAB,ERRG1 JUMP IF ERROR IN LABEL SCAN
        !          22568:        MOV  WA,KVERT         SAVE ERROR CODE
        !          22569:        ZER  SCNRS            RESET RESCAN SWITCH FOR SCANE
        !          22570:        ZER  SCNGO            RESET GOTO SWITCH FOR SCANE
        !          22571:        MOV  STAGE,XR         LOAD CURRENT STAGE
        !          22572:        BSW  XR,STGNO         JUMP TO APPROPRIATE ERROR CIRCUIT
        !          22573:        IFF  STGIC,ERR01      INITIAL COMPILE
        !          22574:        IFF  STGXC,ERR08      EXECUTE TIME COMPILE
        !          22575:        IFF  STGEV,ERR08      EVAL COMPILING EXPR.
        !          22576:        IFF  STGEE,ERR08      EVAL EVALUATING EXPR
        !          22577:        IFF  STGXT,ERR12      EXECUTE TIME
        !          22578:        IFF  STGCE,ERR01      COMPILE - AFTER END
        !          22579:        IFF  STGXE,ERR08      XEQ COMPILE-PAST END
        !          22580:        ESW                   END SWITCH ON ERROR TYPE
        !          22581: *
        !          22582: *      ERROR DURING INITIAL COMPILE
        !          22583: *      THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
        !          22584: *      OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
        !          22585: *      PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
        !          22586: *      COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
        !          22587: *      AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
        !          22588: *      MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
        !          22589: *      THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
        !          22590: *      IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
        !          22591: *      IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
        !          22592:        EJC
        !          22593: *
        !          22594: ERR01  MOV  CMPXS,XS         RESET STACK POINTER
        !          22595:        SSL  CMPSS            RESTORE S-R STACK PTR FOR CMPIL
        !          22596:        BNZ  ERRSP,ERR06      JUMP IF ERROR SUPPRESS FLAG SET
        !          22597:        JSR  PRTFH            PRINT A BLANK
        !          22598:        MOV  TTERL,TTLST      SET FLAG FOR LISTR
        !          22599:        ADD  =NUM03,LSTLC     CAUSE EJECT IF BELOW 4 LINES LEFT
        !          22600:        MOV  LSTLC,-(XS)      KEEP LINE COUNT
        !          22601:        JSR  LISTR            LIST LINE
        !          22602:        JSR  PRTFH            TERMINATE LISTING
        !          22603:        MOV  (XS)+,WA         RECOVER LINE COUNT
        !          22604:        BGT  LSTLC,WA,ERR02   SKIP IF NOT NEW PAGE
        !          22605:        ADD  =NUM04,LSTLC     BUMP FOR LINES PRINTED
        !          22606: *
        !          22607: *      PRINT FLAG UNDER BAD ELEMENT
        !          22608: *
        !          22609: ERR02  MOV  SCNSE,WA         LOAD SCAN ELEMENT OFFSET
        !          22610: .IF    .CAHT
        !          22611:        MOV  WA,WB            COPY OFFSET
        !          22612:        ICV  WA               INCREASE FOR CH$EX
        !          22613:        JSR  ALOCS            STRING BLOCK FOR ERROR FLAG
        !          22614:        MOV  XR,WA            REMEMBER STRING PTR
        !          22615:        PSC  XR               READY FOR CHARACTER STORING
        !          22616:        BZE  WB,ERR05         SKIP IF NO BLANKS BEFORE ERROR FLAG
        !          22617:        MOV  R$CIM,XL         POINT TO BAD STATEMENT
        !          22618:        PLC  XL               READY TO GET CHARS
        !          22619:        LCT  WB,WB            LOOP COUNTER
        !          22620: *
        !          22621: *      LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
        !          22622: *
        !          22623: ERR03  LCH  WC,(XL)+         GET NEXT CHAR
        !          22624:        BEQ  WC,=CH$HT,ERR04  SKIP IF TAB
        !          22625:        MOV  =CH$BL,WC        GET A BLANK
        !          22626:        EJC
        !          22627: *
        !          22628: *      MERGE TO STORE BLANK OR TAB IN ERROR LINE
        !          22629: *
        !          22630: ERR04  SCH  WC,(XR)+         STORE CHAR
        !          22631:        BCT  WB,ERR03         LOOP
        !          22632:        EJC
        !          22633: *
        !          22634: *      MERGE IN CASE OF NO PRECEDING BLANKS
        !          22635: *
        !          22636: ERR05  MOV  =CH$EX,XL        EXCLAMATION MARK
        !          22637:        SCH  XL,(XR)          STORE AT END OF ERROR LINE
        !          22638:        CSC  XR               END OF SCH LOOP
        !          22639:        MOV  =STNPD,PROFS     ALLOW FOR STATEMENT NUMBER
        !          22640:        MOV  WA,XR            POINT TO ERROR LINE
        !          22641:        JSR  PRTST            PRINT ERROR LINE
        !          22642: .ELSE
        !          22643:        MTI  PRLEN            GET PRINT BUFFER LENGTH
        !          22644:        STI  GTNSI            STORE AS SIGNED INTEGER
        !          22645:        ADD  =STNPD,WA        ADJUST FOR STATEMENT NUMBER
        !          22646:        MTI  WA               COPY TO INTEGER ACCUMULATOR
        !          22647:        RMI  GTNSI            REMAINDER MODULO PRINT BFR LENGTH
        !          22648:        MFI  PROFS            USE AS CHARACTER OFFSET
        !          22649:        MOV  =CH$EX,WA        GET EXCLAMATION MARK
        !          22650:        JSR  PRTCH            GENERATE UNDER BAD COLUMN
        !          22651: .FI
        !          22652: *
        !          22653: *      HERE AFTER PLACING ERROR FLAG AS REQUIRED
        !          22654: *
        !          22655:        JSR  ERMSG            GENERATE FLAG AND ERROR MESSAGE
        !          22656:        ZER  TTLST            REVERT TO REGULAR LISTING
        !          22657:        ZER  XR               IN CASE OF FATAL ERROR
        !          22658:        ICV  CMERC            BUMP ERROR COUNT
        !          22659:        BNE  STAGE,=STGIC,ERRG2  SPECIAL RETURN IF AFTER END LINE
        !          22660: *
        !          22661: *      IF ERROR IN READR THEN EITHER CLOSE OUT
        !          22662: *      CURRENT -COPY LEVEL, OR IF AT TOP THEN ABORT
        !          22663: *
        !          22664:        BZE  RDRER,ERR06      SKIP IF NOT ERROR WHILE READING
        !          22665:        BZE  R$COP,ERR16      ABORT IF AT TOP LEVEL INPUT FILE
        !          22666:        ZER  RDRER            ELSE CLEAR READR ERROR FLAG
        !          22667:        JSR  COPND            AND CLOSE OUT THIS COPY LEVEL
        !          22668: *
        !          22669: *      LOOP TO SCAN TO END OF STATEMENT
        !          22670: *
        !          22671: ERR06  MOV  R$CIM,XR         POINT TO START OF IMAGE
        !          22672:        BZE  XR,ERR07         SKIP IF NO INPUT IMAGE
        !          22673:        PLC  XR               POINT TO FIRST CHAR
        !          22674:        LCH  XR,(XR)          GET FIRST CHAR
        !          22675:        BEQ  XR,=CH$MN,ERRG3  JUMP IF ERROR IN CONTROL CARD
        !          22676:        ZER  SCNRS            CLEAR RESCAN FLAG
        !          22677:        MNZ  ERRSP            SET ERROR SUPPRESS FLAG
        !          22678:        JSR  SCANE            SCAN NEXT ELEMENT
        !          22679:        BNE  XL,=T$SMC,ERR06  LOOP BACK IF NOT STATEMENT END
        !          22680:        ZER  ERRSP            CLEAR ERROR SUPPRESS FLAG
        !          22681:        EJC
        !          22682: *
        !          22683: *      GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
        !          22684: *
        !          22685: ERR07  MOV  *CDCOD,CWCOF     RESET OFFSET IN CCBLK
        !          22686:        MOV  =OCER$,WA        LOAD COMPILE ERROR CALL
        !          22687:        JSR  CDWRD            GENERATE IT
        !          22688:        MOV  CWCOF,CMSOC(XS)  SET SUCCESS FILL IN OFFSET
        !          22689:        MNZ  CMFFC(XS)        SET FAILURE FILL IN FLAG
        !          22690:        JSR  CDWRD            GENERATE SUCC. FILL IN WORD
        !          22691:        JMG  CMPSE            MERGE TO GENERATE ERROR AS CDFAL
        !          22692:        EJC
        !          22693: *
        !          22694: *      ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATION.
        !          22695: *
        !          22696: *      EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
        !          22697: *      GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
        !          22698: *      BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
        !          22699: *      HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
        !          22700: *      THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
        !          22701: *
        !          22702: ERR08  JSR  COPND            CALL TO CLOSE OFF THIS LEVEL
        !          22703:        BNZ  R$COP,ERR08      LOOP IF NOT ALL -COPYS CLOSED
        !          22704:        ZER  R$CCB            FORGET GARBAGE CODE BLOCK
        !          22705:        SSL  INISS            RESTORE MAIN PROG S-R STACK PTR
        !          22706:        JSR  ERTEX            GET FAIL MESSAGE TEXT
        !          22707:        DCA  XS               ENSURE STACK OK ON LOOP START
        !          22708: *
        !          22709: *      POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
        !          22710: *      DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
        !          22711: *
        !          22712: ERR09  ICA  XS               POP STACK
        !          22713:        BEQ  XS,FLPRT,ERR11   JUMP IF PROG DEFINED FN CALL FOUND
        !          22714:        BNE  XS,GTCEF,ERR09   LOOP IF NOT EVAL OR CODE CALL YET
        !          22715:        MOV  =STGXT,STAGE     RE-SET STAGE FOR EXECUTE
        !          22716:        MOV  R$GTC,R$COD      RECOVER CODE PTR
        !          22717:        MOV  XS,FLPTR         RESTORE FAIL POINTER
        !          22718:        ZER  R$CIM            FORGET POSSIBLE IMAGE
        !          22719: *
        !          22720: *      TEST ERRLIMIT
        !          22721: *
        !          22722: ERR10  BNZ  KVERL,ERR14      JUMP IF ERRLIMIT NON-ZERO
        !          22723:        BRN  EXFAL            FAIL
        !          22724: *
        !          22725: *      RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
        !          22726: *
        !          22727: ERR11  MOV  FLPTR,XS         RESTORE STACK FROM FLPTR
        !          22728:        BRN  ERR10            MERGE
        !          22729: *
        !          22730: *      ERROR AT EXECUTE TIME.
        !          22731: *
        !          22732: *      THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
        !          22733: *
        !          22734: *      IF ERRLIMIT KEYWORD IS ZERO, THE RUN IS ABORTED.
        !          22735: *      OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
        !          22736: *      GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
        !          22737: *      TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
        !          22738: *      SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
        !          22739: *      IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT OCCURS
        !          22740: *      REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
        !          22741: *      PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
        !          22742: *      AND EXCEEDING STLIMIT.
        !          22743:        EJC
        !          22744: *
        !          22745: ERR12  SSL  INISS            RESTORE MAIN PROG S-R STACK PTR
        !          22746:        BNZ  DMVCH,ERR15      JUMP IF IN MID-DUMP
        !          22747: *
        !          22748: *      MERGE HERE AFTER DUMP TIDY UP
        !          22749: *
        !          22750: ERR13  ZER  XR               CLEAR XR FLAG
        !          22751:        BZE  KVERL,STOPR      ABORT IF ERRLIMIT IS ZERO
        !          22752:        JSR  ERTEX            GET FAIL MESSAGE TEXT
        !          22753: *
        !          22754: *      MERGE AFTER ERRLIMIT TEST
        !          22755: *
        !          22756: ERR14  DCV  KVERL            DECREMENT ERRLIMIT
        !          22757:        MOV  R$ERT,XL         LOAD ERRTYPE TRACE POINTER
        !          22758:        JSR  KTREX            GENERATE ERRTYPE TRACE IF REQUIRED
        !          22759:        MOV  R$COD,R$CNT      SET CDBLK PTR FOR CONTINUATION
        !          22760:        MOV  FLPTR,XR         SET PTR TO FAILURE OFFSET
        !          22761:        MOV  (XR),STXOF       SAVE FAILURE OFFSET FOR CONTINUE
        !          22762:        MOV  R$SXC,XR         LOAD SETEXIT CDBLK POINTER
        !          22763:        BZE  XR,ERRG4         CONTINUE IF NO SETEXIT TRAP
        !          22764:        ZER  R$SXC            ELSE RESET TRAP
        !          22765:        MOV  =NULLS,STXVR     RESET SETEXIT ARG TO NULL
        !          22766:        MOV  (XR),XL          LOAD PTR TO CODE BLOCK ROUTINE
        !          22767:        BRI  XL               EXECUTE FIRST TRAP STATEMENT
        !          22768: *
        !          22769: *      INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
        !          22770: *      MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
        !          22771: *
        !          22772: ERR15  MOV  DMVCH,XR         CHAIN HEAD FOR AFFECTED VRBLKS
        !          22773:        BZE  XR,ERR13         DONE IF ZERO
        !          22774:        MOV  (XR),DMVCH       SET NEXT LINK AS CHAIN HEAD
        !          22775:        JSR  SETVR            RESTORE VRGET FIELD
        !          22776:        BRN  ERR15            LOOP THROUGH CHAIN
        !          22777: *
        !          22778: *      TAKE DRACONIAN STEPS FOR REPEATED FATAL ERRORS
        !          22779: *
        !          22780: ERR16  MOV  ERRTF,WA         ERROR CODE
        !          22781:        MOV  WA,KVERT         PLACE ERROR CODE FOR ERMSG
        !          22782:        MNZ  XR               IN CASE COMPILE TIME
        !          22783:        BEQ  STAGE,=STGIC,STOPR JUMP IF SO
        !          22784:        BEQ  STAGE,=STGCE,STOPR ALSO COMPILE TIME
        !          22785:        ZER  XR               INDICATE EXECUTION
        !          22786:        BRN  STOPR            TERMINATE RUN
        !          22787: *
        !          22788: ERRAF  ERB  251,TOO MANY FATAL ERRORS
        !          22789: *
        !          22790: *      HERE FOR GLOBAL ERROR JUMPS
        !          22791: *
        !          22792: ERRG1  JMG  CMPLE
        !          22793: ERRG2  JMG  CMPEE
        !          22794: ERRG3  JMG  CMPCE
        !          22795: ERRG4  JMG  LCNXE
        !          22796:        TTL  S P I T B O L -- HERE ENDETH THE CODE
        !          22797: *
        !          22798: *      END OF ASSEMBLY
        !          22799: *
        !          22800:        END                   END MACRO-SPITBOL ASSEMBLY

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.