Annotation of researchv10no/cmd/spitbol/spitv35.min, revision 1.1.1.1

1.1       root        1:        TTL  S P I T B O L - REVISION HISTORY
                      2:        EJC
                      3: *      R E V I S I O N   H I S T O R Y
                      4: *      -------------------------------
                      5: *
                      6: *
                      7: *      VERSION 3.5B (FEB 81... - SGD PATCHES)
                      8: *      -----------------------------------
                      9: *
                     10: *      SGD03 - ADDITION OF .CNCI AND SYSCI (INT->STRING
                     11: *              SYSTEM ROUTINE OPTION)
                     12: *      SGD04 - (06-MAY-1981) MODIFIED INILN TO 132
                     13: *      SGD05 - (13-MAY-1981) INSERTED MISSING WTB AFTER SYSMM
                     14: *              CALLS
                     15: *      SGD06 - (25-MAY-1981) MERGED IN PROFILER PATCHES
                     16: *              (NOT MARKED)
                     17: *      SGD07 - (25-MAY-1981) MUCHO PATCHES TO PROFILER (MARKED,
                     18: *              BUT BEST JUST TO EXTRACT ENMASSE)
                     19: *      SGD08 - (25-MAY-1981) USE STRING LENGTH IN HASHS
                     20: *      SGD09 - (25-MAY-1981) FIXED SERIOUS PARSER PROBLEM
                     21: *              RELATING TO (X Y) ON LINE BEING VIEWED AS PATTERN
                     22: *              MATCH.  FIXED BY ADDITION OF NEW CMTYP VALUE
                     23: *              C$CNP (CONCATENATION - NOT PATTERN MATCH)
                     24: *      SGD10 - (01-AUG-1981) FIXED EXIT(N) RESPECIFICATION CODE
                     25: *              TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN.
                     26: *      SGD11 - (07-AUG-1981) BYPASS PRTPG CALL AT INITIALIZATION
                     27: *              FOLLOWING COMPILATION IF NO OUTPUT GENERATED.
                     28: *              THIS PREVENTS OUTPUT FILES CONSISTING OF THE
                     29: *              HEADERS AND A FEW BLANK LINES WHEN THERE IS NO
                     30: *              SOURCE LISTING AND NO COMPILATION STATS.
                     31: *              ALSO FIX TIMSX INITIALIZATION IN SAME CODE.
                     32: *      SGD12 - (17-AUG-1981) B$EFC CODE DID NOT CHECK FOR
                     33: *              UNCONVERTED RESULT RETURNING NULL STRING.  FIXED.
                     34: *      SGDBF - (   NOV-1981) ADDED BUFFER TYPE AND SYMBOL CNBF
                     35: *      SGD13 - (03-MAR-1982) LOAD PFVBL FIELD IN RETRN FOR
                     36: *              RETURN TRACING. THIS WAS CAUSING BUG ON RETURN
                     37: *              TRACES THAT TRIED TO ACCESS THE VARIABLE NAME
                     38: *      SGD14 - ADDED CHAR FUNCTION.  CHAR(N) RETURNS NTH
                     39: *              CHARACTER OF HOST MACHINE CHARACTER SET.
                     40: *              NOT CONDITIONALIZED OR MARKED.
                     41: *      SGD15 - FIXED PROBLEM RELATING TO COMPILATION OF GOTO
                     42: *              FIELDS CONTAINING SMALL INTEGERS (IN CONST SEC).
                     43: *
                     44: *      REG01 - (XX-AUG-82)
                     45: *              ADDED CFP$U TO EASE TRANSLATION ON SMALLER
                     46: *              SYSTEMS                  - CONDITIONAL .CUCF
                     47: *              ADDED LOWER CASE SUPPORT - CONDITIONAL .CULC
                     48: *              ADDED SET I/O FUNCTION   - CONDITIONAL .CUST
                     49: *
                     50: *      REG02 - (XX-SEP-82)
                     51: *              CHANGED INILN AND AND INILS TO 258
                     52: *
                     53: *      REG03 - (XX-OCT-82)
                     54: *              CONDITIONALIZED THE PAGE EJECT AFTER CALL TO SYSBX
                     55: *              AND ADDED ANOTHER BEFORE CALL TO SYSBX, SO THAT,
                     56: *              IF DESIRED BY THE IMPLEMENTOR, STANDARD OUTPUT
                     57: *              WILL REFLECT ASSIGNMENTS MADE BY EXECUTING PROGRAM
                     58: *              ONLY. CONDITIONAL .CUEJ CONTROLS - IF DEFINED
                     59: *              EJECT IS BEFORE CALL TO SYSBX.
                     60: *
                     61: *      REG04 - (XX-NOV-82)
                     62: *              FIXED DIFFICULTIES WITH LISTINGS DURING EXECUTION
                     63: *              WHEN NO LISTING GENERATED DURING COMPILATION.
                     64: *
                     65: *              -LIST TO CODE() CAUSED BOMB. FIX IS TO RESET
                     66: *              R$TTL AND R$STL TO NULLS NOT 0 AFTER COMPILATION.
                     67: *              (LISTR AND LISTT EXPECT NULLS)
                     68: *
                     69: *              WHEN LISTING AND STATISTICS ROUTED TO DIFFERENT
                     70: *              FILE THAN EXECUTION OUTPUT, ERROR MESSAGE IS SENT
                     71: *              TO EXECUTION OUTPUT (AND GETS SEPARATED FROM
                     72: *              ... IN STATEMENT ... MSG). LABO1 CALLS SYSAX AND
                     73: *              STOPR DOES NOT CALL SYSAX IF ENTERED FROM LABO1.
                     74: *
                     75: *      REG05 - (XX-NOV-82)
                     76: *              PREVENT CLEAR() FROM CLOBBERING PROTECTED VARIABLES
                     77: *              AT LABEL SCLR5.
                     78: *
                     79: *      REG06 - (XX-NOV-82)
                     80: *              FIXED GTEXP FROM ACCEPTING TRAILING SEMICOLON OR
                     81: *              COLON. NOT LEGAL WAY TO END AN EXPRESSION.
                     82: *
                     83: *      VERSION 3.5A (OCT 79 - SGD PATCHES)
                     84: *      -----------------------------------
                     85: *
                     86: *      SGD01 - PATCH IN ASIGN TO FIX MULTIPLE TRAP BLOCK PROBLEM
                     87: *              (ASG10+2)
                     88: *      SGD02 - PATCH IN GTARR TO FIX NULL CONVERT (GTAR9+0)
                     89: *
                     90:        TTL  S P I T B O L  -- BASIC INFORMATION
                     91:        EJC
                     92: *
                     93: *      GENERAL STRUCTURE
                     94: *      -----------------
                     95: *
                     96: *      THIS PROGRAM IS A TRANSLATOR FOR A VERSION OF THE SNOBOL4
                     97: *      PROGRAMMING LANGUAGE. LANGUAGE DETAILS ARE CONTAINED IN
                     98: *      THE MANUAL MACRO SPITBOL BY DEWAR AND MCCANN, TECHNICAL
                     99: *      REPORT 90, UNIVERSITY OF LEEDS 1976.  THE LANGUAGE
                    100: *      IS IDENTICAL TO THAT IMPLEMENTED BY THE BTL TRANSLATOR
                    101: *      (R. E. GRISWOLD ET AL.) WITH THE FOLLOWING EXCEPTIONS.
                    102: *
                    103: *      1)   REDEFINITION OF STANDARD SYSTEM FUNCTIONS AND
                    104: *           OPERATORS IS NOT PERMITTED.
                    105: *
                    106: *      2)   THE VALUE FUNCTION IS NOT PROVIDED.
                    107: *
                    108: *      3)   ACCESS TRACING IS PROVIDED IN ADDITION TO THE
                    109: *           OTHER STANDARD TRACE MODES.
                    110: *
                    111: *      4)   THE KEYWORD STFCOUNT IS NOT PROVIDED.
                    112: *
                    113: *      5)   THE KEYWORD FULLSCAN IS NOT PROVIDED AND ALL PATTERN
                    114: *           MATCHING TAKES PLACE IN FULLSCAN MODE (I.E. WITH NO
                    115: *           HEURISTICS APPLIED).
                    116: *
                    117: *      6)   A SERIES OF EXPRESSIONS SEPARATED BY COMMAS MAY
                    118: *           BE GROUPED WITHIN PARENTHESES TO PROVIDE A SELECTION
                    119: *           CAPABILITY. THE SEMANTICS ARE THAT THE SELECTION
                    120: *           ASSUMES THE VALUE OF THE FIRST EXPRESSION WITHIN IT
                    121: *           WHICH SUCCEEDS AS THEY ARE EVALUATED FROM THE LEFT.
                    122: *           IF NO EXPRESSION SUCCEEDS THE ENTIRE STATEMENT FAILS
                    123: *
                    124: *      7)   AN EXPLICIT PATTERN MATCHING OPERATOR IS PROVIDED.
                    125: *           THIS IS THE BINARY QUERY (SEE GIMPEL SIGPLAN OCT 74)
                    126: *
                    127: *      8)   THE ASSIGNMENT OPERATOR IS INTRODUCED AS IN THE
                    128: *           GIMPEL REFERENCE.
                    129: *
                    130: *      9)   THE EXIT FUNCTION IS PROVIDED FOR GENERATING LOAD
                    131: *           MODULES - CF. GIMPELS SITBOL.
                    132: *
                    133: *
                    134: *      THE METHOD USED IN THIS PROGRAM IS TO TRANSLATE THE
                    135: *      SOURCE CODE INTO AN INTERNAL PSEUDO-CODE (SEE FOLLOWING
                    136: *      SECTION). AN INTERPRETOR IS THEN USED TO EXECUTE THIS
                    137: *      GENERATED PSEUDO-CODE. THE NATURE OF THE SNOBOL4 LANGUAGE
                    138: *      IS SUCH THAT THE LATTER TASK IS MUCH MORE COMPLEX THAN
                    139: *      THE ACTUAL TRANSLATION PHASE. ACCORDINGLY, NEARLY ALL THE
                    140: *      CODE IN THE PROGRAM SECTION IS CONCERNED WITH THE ACTUAL
                    141: *      EXECUTION OF THE SNOBOL4 PROGRAM.
                    142:        EJC
                    143: *
                    144: *      INTERPRETIVE CODE FORMAT
                    145: *      ------------------------
                    146: *
                    147: *      THE INTERPRETIVE PSEUDO-CODE CONSISTS OF A SERIES OF
                    148: *      ADDRESS POINTERS. THE EXACT FORMAT OF THE CODE IS
                    149: *      DESCRIBED IN CONNECTION WITH THE CDBLK FORMAT. THE
                    150: *      PURPOSE OF THIS SECTION IS TO GIVE GENERAL INSIGHT INTO
                    151: *      THE INTERPRETIVE APPROACH INVOLVED.
                    152: *
                    153: *      THE BASIC FORM OF THE CODE IS RELATED TO REVERSE POLISH.
                    154: *      IN OTHER WORDS, THE OPERANDS PRECEDE THE OPERATORS WHICH
                    155: *      ARE ZERO ADDRESS OPERATORS. THERE ARE SOME EXCEPTIONS TO
                    156: *      THESE RULES, NOTABLY THE UNARY NOT OPERATOR AND THE
                    157: *      SELECTION CONSTRUCTION WHICH CLEARLY REQUIRE ADVANCE
                    158: *      KNOWLEDGE OF THE OPERATOR INVOLVED.
                    159: *
                    160: *      THE OPERANDS ARE MOVED TO THE TOP OF THE MAIN STACK AND
                    161: *      THE OPERATORS ARE APPLIED TO THE TOP STACK ENTRIES. LIKE
                    162: *      OTHER VERSIONS OF SPITBOL, THIS PROCESSOR DEPENDS ON
                    163: *      KNOWING WHETHER OPERANDS ARE REQUIRED BY NAME OR BY VALUE
                    164: *      AND MOVES THE APPROPRIATE OBJECT TO THE STACK. THUS NO
                    165: *      NAME/VALUE CHECKS ARE INCLUDED IN THE OPERATOR CIRCUITS.
                    166: *
                    167: *      THE ACTUAL POINTERS IN THE CODE POINT TO A BLOCK WHOSE
                    168: *      FIRST WORD IS THE ADDRESS OF THE INTERPRETOR ROUTINE
                    169: *      TO BE EXECUTED FOR THE CODE WORD.
                    170: *
                    171: *      IN THE CASE OF OPERATORS, THE POINTER IS TO A WORD WHICH
                    172: *      CONTAINS THE ADDRESS OF THE OPERATOR TO BE EXECUTED. IN
                    173: *      THE CASE OF OPERANDS SUCH AS CONSTANTS, THE POINTER IS TO
                    174: *      THE OPERAND ITSELF. ACCORDINGLY, ALL OPERANDS CONTAIN
                    175: *      A FIELD WHICH POINTS TO THE ROUTINE TO LOAD THE VALUE OF
                    176: *      THE OPERAND ONTO THE STACK. IN THE CASE OF A VARIABLE,
                    177: *      THERE ARE THREE SUCH POINTERS. ONE TO LOAD THE VALUE,
                    178: *      ONE TO STORE THE VALUE AND A THIRD TO JUMP TO THE LABEL.
                    179: *
                    180: *      THE HANDLING OF FAILURE RETURNS DESERVES SPECIAL COMMENT.
                    181: *      THE LOCATION FLPTR CONTAINS THE POINTER TO THE LOCATION
                    182: *      ON THE MAIN STACK WHICH CONTAINS THE FAILURE RETURN
                    183: *      WHICH IS IN THE FORM OF A BYTE OFFSET IN THE CURRENT
                    184: *      CODE BLOCK (CDBLK OR EXBLK). WHEN A FAILURE OCCURS, THE
                    185: *      STACK IS POPPED AS INDICATED BY THE SETTING OF FLPTR AND
                    186: *      CONTROL IS PASSED TO THE APPROPRIATE LOCATION IN THE
                    187: *      CURRENT CODE BLOCK WITH THE STACK POINTER POINTING TO THE
                    188: *      FAILURE OFFSET ON THE STACK AND FLPTR UNCHANGED.
                    189:        EJC
                    190: *
                    191: *      INTERNAL DATA REPRESENTATIONS
                    192: *      -----------------------------
                    193: *
                    194: *      REPRESENTATION OF VALUES
                    195: *
                    196: *      A VALUE IS REPRESENTED BY A POINTER TO A BLOCK WHICH
                    197: *      DESCRIBES THE TYPE AND PARTICULARS OF THE DATA VALUE.
                    198: *      IN GENERAL, A VARIABLE IS A LOCATION CONTAINING SUCH A
                    199: *      POINTER (ALTHOUGH IN THE CASE OF TRACE ASSOCIATIONS THIS
                    200: *      IS MODIFIED, SEE DESCRIPTION OF TRBLK).
                    201: *
                    202: *      THE FOLLOWING IS A LIST OF POSSIBLE DATATYPES SHOWING THE
                    203: *      TYPE OF BLOCK USED TO HOLD THE VALUE. THE DETAILS OF
                    204: *      EACH BLOCK FORMAT ARE GIVEN LATER.
                    205: *
                    206: *      DATATYPE              BLOCK TYPE
                    207: *      --------              ----------
                    208: *
                    209: *
                    210: *      ARRAY                 ARBLK OR VCBLK
                    211: *
                    212: *      CODE                  CDBLK
                    213: *
                    214: *      EXPRESSION            EXBLK OR SEBLK
                    215: *
                    216: *      INTEGER               ICBLK
                    217: *
                    218: *      NAME                  NMBLK
                    219: *
                    220: *      PATTERN               P0BLK OR P1BLK OR P2BLK
                    221: *
                    222: *      REAL                  RCBLK
                    223: *
                    224: *      STRING                SCBLK
                    225: *
                    226: *      TABLE                 TBBLK
                    227: *
                    228: *      PROGRAM DATATYPE      PDBLK
                    229:        EJC
                    230: *
                    231: *      REPRESENTATION OF VARIABLES
                    232: *      ---------------------------
                    233: *
                    234: *      DURING THE COURSE OF EVALUATING EXPRESSIONS, IT IS
                    235: *      NECESSARY TO GENERATE NAMES OF VARIABLES (FOR EXAMPLE
                    236: *      ON THE LEFT SIDE OF A BINARY EQUALS OPERATOR). THESE ARE
                    237: *      NOT TO BE CONFUSED WITH OBJECTS OF DATATYPE NAME WHICH
                    238: *      ARE IN FACT VALUES.
                    239: *
                    240: *      FROM A LOGICAL POINT OF VIEW, SUCH NAMES COULD BE SIMPLY
                    241: *      REPRESENTED BY A POINTER TO THE APPROPRIATE VALUE CELL.
                    242: *      HOWEVER IN THE CASE OF ARRAYS AND PROGRAM DEFINED
                    243: *      DATATYPES, THIS WOULD VIOLATE THE RULE THAT THERE MUST BE
                    244: *      NO POINTERS INTO THE MIDDLE OF A BLOCK IN DYNAMIC STORE.
                    245: *      ACCORDINGLY, A NAME IS ALWAYS REPRESENTED BY A BASE AND
                    246: *      OFFSET. THE BASE POINTS TO THE START OF THE BLOCK
                    247: *      CONTAINING THE VARIABLE VALUE AND THE OFFSET IS THE
                    248: *      OFFSET WITHIN THIS BLOCK IN BYTES. THUS THE ADDRESS
                    249: *      OF THE ACTUAL VARIABLE IS DETERMINED BY ADDING THE BASE
                    250: *      AND OFFSET VALUES.
                    251: *
                    252: *      THE FOLLOWING ARE THE INSTANCES OF VARIABLES REPRESENTED
                    253: *      IN THIS MANNER.
                    254: *
                    255: *      1)   NATURAL VARIABLE BASE IS PTR TO VRBLK
                    256: *                            OFFSET IS *VRVAL
                    257: *
                    258: *      2)   TABLE ELEMENT    BASE IS PTR TO TEBLK
                    259: *                            OFFSET IS *TEVAL
                    260: *
                    261: *      3)   ARRAY ELEMENT    BASE IS PTR TO ARBLK
                    262: *                            OFFSET IS OFFSET TO ELEMENT
                    263: *
                    264: *      4)   VECTOR ELEMENT   BASE IS PTR TO VCBLK
                    265: *                            OFFSET IS OFFSET TO ELEMENT
                    266: *
                    267: *      5)   PROG DEF DTP     BASE IS PTR TO PDBLK
                    268: *                            OFFSET IS OFFSET TO FIELD VALUE
                    269: *
                    270: *      IN ADDITION THERE ARE TWO CASES OF OBJECTS WHICH ARE
                    271: *      LIKE VARIABLES BUT CANNOT BE HANDLED IN THIS MANNER.
                    272: *      THESE ARE CALLED PSEUDO-VARIABLES AND ARE REPRESENTED
                    273: *      WITH A SPECIAL BASE POINTER AS FOLLOWS=
                    274: *
                    275: *      EXPRESSION VARIABLE   PTR TO EVBLK (SEE EVBLK)
                    276: *
                    277: *      KEYWORD VARIABLE      PTR TO KVBLK (SEE KVBLK)
                    278: *
                    279: *      PSEUDO-VARIABLES ARE HANDLED AS SPECIAL CASES BY THE
                    280: *      ACCESS PROCEDURE (ACESS) AND THE ASSIGNMENT PROCEDURE
                    281: *      (ASIGN). SEE THESE TWO PROCEDURES FOR DETAILS.
                    282:        EJC
                    283: *
                    284: *      ORGANIZATION OF DATA AREA
                    285: *      -------------------------
                    286: *
                    287: *
                    288: *      THE DATA AREA IS DIVIDED INTO TWO REGIONS.
                    289: *
                    290: *      STATIC AREA
                    291: *
                    292: *      THE STATIC AREA BUILDS UP FROM THE BOTTOM AND CONTAINS
                    293: *      DATA AREAS WHICH ARE ALLOCATED DYNAMICALLY BUT ARE NEVER
                    294: *      DELETED OR MOVED AROUND. THE MACRO-PROGRAM ITSELF
                    295: *      USES THE STATIC AREA FOR THE FOLLOWING.
                    296: *
                    297: *      1)   ALL VARIABLE BLOCKS (VRBLK).
                    298: *
                    299: *      2)   THE HASH TABLE FOR VARIABLE BLOCKS.
                    300: *
                    301: *      3)   MISCELLANEOUS BUFFERS AND WORK AREAS (SEE PROGRAM
                    302: *           INITIALIZATION SECTION).
                    303: *
                    304: *      IN ADDITION, THE SYSTEM PROCEDURES MAY USE THIS AREA FOR
                    305: *      INPUT/OUTPUT BUFFERS, EXTERNAL FUNCTIONS ETC. SPACE IN
                    306: *      THE STATIC REGION IS ALLOCATED BY CALLING PROCEDURE ALOST
                    307: *
                    308: *      THE FOLLOWING GLOBAL VARIABLES DEFINE THE CURRENT
                    309: *      LOCATION AND SIZE OF THE STATIC AREA.
                    310: *
                    311: *      STATB                 ADDRESS OF START OF STATIC AREA
                    312: *      STATE                 ADDRESS+1 OF LAST WORD IN AREA.
                    313: *
                    314: *      THE MINIMUM SIZE OF STATIC IS GIVEN APPROXIMATELY BY
                    315: *           12 + *E$HNB + *E$STS + SPACE FOR ALPHABET STRING
                    316: *           AND STANDARD PRINT BUFFER.
                    317:        EJC
                    318: *
                    319: *      DYNAMIC AREA
                    320: *
                    321: *      THE DYNAMIC AREA IS BUILT UPWARDS IN MEMORY AFTER THE
                    322: *      STATIC REGION. DATA IN THIS AREA MUST ALL BE IN STANDARD
                    323: *      BLOCK FORMATS SO THAT IT CAN BE PROCESSED BY THE GARBAGE
                    324: *      COLLECTOR (PROCEDURE GBCOL). GBCOL COMPACTS BLOCKS DOWN
                    325: *      IN THIS REGION AS REQUIRED BY SPACE EXHAUSTION AND CAN
                    326: *      ALSO MOVE ALL BLOCKS UP TO ALLOW FOR EXPANSION OF THE
                    327: *      STATIC REGION.
                    328: *      WITH THE EXCEPTION OF TABLES AND ARRAYS, NO SPITBOL
                    329: *      OBJECT ONCE BUILT IN DYNAMIC MEMORY IS EVER SUBSEQUENTLY
                    330: *      MODIFIED. OBSERVING THIS RULE NECESSITATES A COPYING
                    331: *      ACTION DURING STRING AND PATTERN CONCATENATION.
                    332: *
                    333: *      GARBAGE COLLECTION IS FUNDAMENTAL TO THE ALLOCATION OF
                    334: *      SPACE FOR VALUES. SPITBOL USES A VERY EFFICIENT GARBAGE
                    335: *      COLLECTOR WHICH INSISTS THAT POINTERS INTO DYNAMIC STORE
                    336: *      SHOULD BE IDENTIFIABLE WITHOUT USE OF BIT TABLES,
                    337: *      MARKER BITS ETC. TO SATISFY THIS REQUIREMENT, DYNAMIC
                    338: *      MEMORY MUST NOT START AT TOO LOW AN ADDRESS AND LENGTHS
                    339: *      OF ARRAYS, TABLES, STRINGS, CODE AND EXPRESSION BLOCKS
                    340: *      MAY NOT EXCEED THE NUMERICAL VALUE OF THE LOWEST DYNAMIC
                    341: *      ADDRESS. TO AVOID EITHER PENALIZING USERS WITH MODEST
                    342: *      REQUIREMENTS OR RESTRICTING THOSE WITH GREATER NEEDS ON
                    343: *      HOST SYSTEMS WHERE DYNAMIC MEMORY IS ALLOCATED IN LOW
                    344: *      ADDRESSES, THE MINIMUM DYNAMIC ADDRESS MAY BE SPECIFIED
                    345: *      SUFFICIENTLY HIGH TO PERMIT ARBITRARILY LARGE SPITBOL
                    346: *      OBJECTS TO BE CREATED ( WITH THE POSSIBILITY IN EXTREME
                    347: *      CASES OF WASTING LARGE AMOUNTS OF MEMORY BELOW THE
                    348: *      START ADDRESS). THIS MINIMUM VALUE IS MADE AVAILABLE
                    349: *      IN VARIABLE MXLEN BY A SYSTEM ROUTINE, SYSMX.
                    350: *      ALTERNATIVELY SYSMX MAY INDICATE THAT A
                    351: *      DEFAULT MAY BE USED IN WHICH DYNAMIC IS PLACED
                    352: *      AT THE LOWEST POSSIBLE ADDRESS FOLLOWING STATIC.
                    353: *
                    354: *      THE FOLLOWING GLOBAL WORK CELLS DEFINE THE LOCATION AND
                    355: *      LENGTH OF THE DYNAMIC AREA.
                    356: *
                    357: *      DNAMB                 START OF DYNAMIC AREA
                    358: *      DNAMP                 NEXT AVAILABLE LOCATION
                    359: *      DNAME                 LAST AVAILABLE LOCATION + 1
                    360: *
                    361: *      DNAMB IS ALWAYS HIGHER THAN STATE SINCE THE ALOST
                    362: *      PROCEDURE MAINTAINS SOME EXPANSION SPACE ABOVE STATE.
                    363: *      *** DNAMB MUST NEVER BE PERMITTED TO HAVE A VALUE LESS
                    364: *      THAN THAT IN MXLEN ***
                    365: *
                    366: *      SPACE IN THE DYNAMIC REGION IS ALLOCATED BY THE ALLOC
                    367: *      PROCEDURE. THE DYNAMIC REGION MAY BE USED BY SYSTEM
                    368: *      PROCEDURES PROVIDED THAT ALL THE RULES ARE OBEYED.
                    369:        EJC
                    370: *
                    371: *      REGISTER USAGE
                    372: *      --------------
                    373: *
                    374: *      (CP)                  CODE POINTER REGISTER. USED TO
                    375: *                            HOLD A POINTER TO THE CURRENT
                    376: *                            LOCATION IN THE INTERPRETIVE PSEUDO
                    377: *                            CODE (I.E. PTR INTO A CDBLK).
                    378: *
                    379: *      (XL,XR)               GENERAL INDEX REGISTERS. USUALLY
                    380: *                            USED TO HOLD POINTERS TO BLOCKS IN
                    381: *                            DYNAMIC STORAGE. AN IMPORTANT
                    382: *                            RESTRICTION IS THAT THE VALUE IN
                    383: *                            XL MUST BE COLLECTABLE FOR
                    384: *                            A GARBAGE COLLECT CALL. A VALUE
                    385: *                            IS COLLECTABLE IF IT EITHER POINTS
                    386: *                            OUTSIDE THE DYNAMIC AREA, OR IF IT
                    387: *                            POINTS TO THE START OF A BLOCK IN
                    388: *                            THE DYNAMIC AREA.
                    389: *
                    390: *      (XS)                  STACK POINTER. USED TO POINT TO
                    391: *                            THE STACK FRONT. THE STACK MAY
                    392: *                            BUILD UP OR DOWN AND IS USED
                    393: *                            TO STACK SUBROUTINE RETURN POINTS
                    394: *                            AND OTHER RECURSIVELY SAVED DATA.
                    395: *
                    396: *      (XT)                  AN ALTERNATIVE NAME FOR XL DURING
                    397: *                            ITS USE IN ACCESSING STACKED ITEMS.
                    398: *
                    399: *      (WA,WB,WC)            GENERAL WORK REGISTERS. CANNOT BE
                    400: *                            USED FOR INDEXING, BUT MAY HOLD
                    401: *                            VARIOUS TYPES OF DATA.
                    402: *
                    403: *      (IA)                  USED FOR ALL SIGNED INTEGER
                    404: *                            ARITHMETIC, BOTH THAT USED BY THE
                    405: *                            TRANSLATOR AND THAT ARISING FROM
                    406: *                            USE OF SNOBOL4 ARITHMETIC OPERATORS
                    407: *
                    408: *      (RA)                  REAL ACCUMULATOR. USED FOR ALL
                    409: *                            FLOATING POINT ARITHMETIC.
                    410:        EJC
                    411: *
                    412: *      SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
                    413: *      ------------------------------------
                    414: *
                    415: *      IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
                    416: *      ASSEMBLY SYMBOLS ARE REFERRED TO. TO INCORPORATE THE
                    417: *      FEATURES REFERRED TO, THE MINIMAL SOURCE SHOULD BE
                    418: *      PREFACED BY SUITABLE CONDITIONAL ASSEMBLY SYMBOL
                    419: *      DEFINITIONS.
                    420: *      IN ALL CASES IT IS PERMISSIBLE TO DEFAULT THE DEFINITIONS
                    421: *      IN WHICH CASE THE ADDITIONAL FEATURES WILL BE OMITTED
                    422: *      FROM THE TARGET CODE.
                    423: *
                    424: *      .CASL                 DEFINE TO INCLUDE 26 SHIFTED LETTRS
                    425: *      .CAHT                 DEFINE TO INCLUDE HORIZONTAL TAB
                    426: *      .CAVT                 DEFINE TO INCLUDE VERTICAL TAB
                    427: *      .CIOD                 IF DEFINED, DEFAULT DELIMITER IS
                    428: *                            NOT USED IN PROCESSING 3RD ARG OF
                    429: *                            INPUT() AND OUTPUT()
                    430: *      .CNBT                 DEFINE TO OMIT BATCH INITIALISATION
                    431: *      .CNCI                 DEFINE TO ENABLE SYSCI ROUTINE
                    432: *      .CNEX                 DEFINE TO OMIT EXIT() CODE.
                    433: *      .CNLD                 DEFINE TO OMIT LOAD() CODE.
                    434: *      .CNPF                 DEFINE TO OMIT PROFILE STUFF
                    435: *      .CNRA                 DEFINE TO OMIT ALL REAL ARITHMETIC
                    436: *      .CNSR                 DEFINE TO OMIT SORT, RSORT
                    437: *      .CSAX                 DEFINE IF SYSAX IS TO BE CALLED
                    438: *      .CSN6                 DEFINE TO PAD STMT NOS TO 6 CHARS
                    439: *      .CSN8                 DEFINE TO PAD STMT NOS TO 8 CHARS
                    440: *      .CUCF                 DEFINE TO INCLUDE CFP$U
                    441: *      .CULC                 DEFINE TO INCLUDE &CASE (LC NAMES)
                    442: *      .CUST                 DEFINE TO INCLUDE SET() CODE
                    443: .DEF   .CASL
                    444: .DEF   .CAHT
                    445: .DEF   .CIOD
                    446: .DEF   .CSAX
                    447: .DEF   .CSN8
                    448: .DEF   .CUCF
                    449: .DEF   .CUEJ
                    450: .DEF   .CULC
                    451: .DEF   .CUST
                    452:        TTL  S P I T B O L -- PROCEDURES SECTION
                    453: *
                    454: *      THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING
                    455: *      SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL
                    456: *      TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES
                    457: *      BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL
                    458: *      ORDER.
                    459: *      ALL PROCEDURES HAVE A  SPECIFICATION CONSISTING OF A
                    460: *      MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER
                    461: *      CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND
                    462: *      FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS
                    463: *      REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD
                    464: *      THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY
                    465: *      MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR
                    466: *      VALUES CHANGED.
                    467: *      THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS
                    468: *      CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM
                    469: *      INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE
                    470: *      FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN
                    471: *      ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES,
                    472: *      IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH
                    473: *      DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS
                    474: *      OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT.
                    475: *      E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB,
                    476: *      JSR SYSTC IN SOME IMPLEMENTATIONS.
                    477: *
                    478: *      IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK
                    479: *      FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL
                    480: *      DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL
                    481: *      SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD
                    482: *      BE CONSULTED.
                    483: *
                    484: *      SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL
                    485: *      PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR
                    486: *      INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS
                    487: *      IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT
                    488: *      TYPES IF THIS PROVES NECESSARY.
                    489: *
                    490:        SEC                   START OF PROCEDURES SECTION
                    491: .IF    .CSAX
                    492:        EJC
                    493: *
                    494: *      SYSAX -- AFTER EXECUTION
                    495: *
                    496: SYSAX  EXP                   DEFINE EXTERNAL ENTRY POINT
                    497: *
                    498: *      IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED,
                    499: *      THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND
                    500: *      BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT.
                    501: *      PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND
                    502: *      IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX
                    503: *      IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED.
                    504: *
                    505: *      JSR  SYSAX            CALL AFTER EXECUTION
                    506: .ELSE
                    507: .FI
                    508:        EJC
                    509: *
                    510: *      SYSBX -- BEFORE EXECUTION
                    511: *
                    512: SYSBX  EXP                   DEFINE EXTERNAL ENTRY POINT
                    513: *
                    514: *      CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE
                    515: *      COMMENCING EXECUTION IN CASE OSINT NEEDS
                    516: *      TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES.
                    517: *      OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE
                    518: *      TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING.
                    519: *
                    520: *      JSR  SYSBX            CALL BEFORE EXECUTION STARTS
                    521:        EJC
                    522: .IF    .CNCI
                    523: *
                    524: *      SYSCI -- CONVERT INTEGER
                    525: *
                    526: SYSCI  EXP
                    527: *
                    528: *      SYSCI IS AN OPTIONAL OSINT ROUTINE THAT CAUSES SPITBOL TO
                    529: *      CALL SYSCI TO CONVERT INTEGER VALUES TO STRINGS, RATHER
                    530: *      THAN USING SPITBOL'S OWN INTERNAL CONVERSION CODE.  THIS
                    531: *      CODE MAY BE LESS EFFICIENT ON MACHINES WITH HARDWARE
                    532: *      CONVERSION INSTRUCTIONS AND IN SUCH CASES, IT MAY BE AN
                    533: *      ADVANTAGE TO INCLUDE SYSCI.  THE SYMBOL .CNCI MUST BE
                    534: *      DEFINED IF THIS ROUTINE IS TO BE USED.
                    535: *
                    536: *      THE RULES FOR CONVERTING INTEGERS TO STRINGS ARE THAT
                    537: *      POSITIVE VALUES ARE REPRESENTED WITHOUT ANY SIGN, AND
                    538: *      THERE ARE NEVER ANY LEADING BLANKS OR ZEROS, EXCEPT IN
                    539: *      THE CASE OF ZERO ITSELF WHICH IS REPRESENTED AS A SINGLE
                    540: *      ZERO DIGIT.  NEGATIVE NUMBERS ARE REPRESENTED WITH A
                    541: *      PRECEEDING MINUS SIGN.  THERE ARE NEVER ANY TRAILING
                    542: *      BLANKS, AND CONVERSION CANNOT FAIL.
                    543: *
                    544: *      (IA)                  VALUE TO BE CONVERTED
                    545: *      JSR  SYSCI            CALL TO CONVERT INTEGER VALUE
                    546: *      (XL)                  POINTER TO PSEUDO-SCBLK WITH STRING
                    547:        EJC
                    548: .FI
                    549: *
                    550: *      SYSDC -- DATE CHECK
                    551: *
                    552: SYSDC  EXP                   DEFINE EXTERNAL ENTRY POINT
                    553: *
                    554: *      SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL
                    555: *      VERSION OF SPITBOL IS UNEXPIRED.
                    556: *
                    557: *      JSR  SYSDC            CALL TO CHECK DATE
                    558: *      RETURN ONLY IF DATE IS OK
                    559:        EJC
                    560: *
                    561: *      SYSDM  -- DUMP CORE
                    562: *
                    563: SYSDM  EXP                   DEFINE EXTERNAL ENTRY POINT
                    564: *
                    565: *      SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH
                    566: *      N GE 3.  ITS PURPOSE IS TO PROVIDE A CORE DUMP.
                    567: *      N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND
                    568: *      AMOUNT TO BE DUMPED E.G.  N = 256*A + S , S = START ADRS
                    569: *      IN KILOWORDS,  A = KILOWORDS TO DUMP
                    570: *
                    571: *      (XR)                  PARAMETER N OF CALL DUMP(N)
                    572: *      JSR  SYSDM            CALL TO ENTER ROUTINE
                    573:        EJC
                    574: *
                    575: *      SYSDT -- GET CURRENT DATE
                    576: *
                    577: SYSDT  EXP                   DEFINE EXTERNAL ENTRY POINT
                    578: *
                    579: *      SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS
                    580: *      RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE
                    581: *      TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE
                    582: *      CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE
                    583: *      SNOBOL4 FUNCTION DATE.
                    584: *
                    585: *      JSR  SYSDT            CALL TO GET DATE
                    586: *      (XL)                  POINTER TO BLOCK CONTAINING DATE
                    587: *
                    588: *      THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT
                    589: *      THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED
                    590: *      INTO SPITBOL DYNAMIC MEMORY ON RETURN.
                    591:        EJC
                    592: *
                    593: *      SYSEF -- EJECT FILE
                    594: *
                    595: SYSEF  EXP                   DEFINE EXTERNAL ENTRY POINT
                    596: *
                    597: *      SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT
                    598: *      MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES
                    599: *      SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE
                    600: *      STANDARD OUTPUT FILE (SEE SYSEP).
                    601: *
                    602: *      (WA)                  PTR TO FCBLK OR ZERO
                    603: *      (XR)                  EJECT ARGUMENT (SCBLK PTR)
                    604: *      JSR  SYSEF            CALL TO EJECT FILE
                    605: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
                    606: *      PPM  LOC              RETURN HERE IF INAPPROPRIATE FILE
                    607: *      PPM  LOC              RETURN HERE IF I/O ERROR
                    608:        EJC
                    609: *
                    610: *      SYSEJ -- END OF JOB
                    611: *
                    612: SYSEJ  EXP                   DEFINE EXTERNAL ENTRY POINT
                    613: *
                    614: *      SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO
                    615: *      TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND
                    616: *      CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE
                    617: *      VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE
                    618: *      ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS
                    619: *      A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER.
                    620: *      SEE SYSXI FOR DETAILS OF FCBLK CHAIN
                    621: *
                    622: *      (WA)                  VALUE OF ABEND KEYWORD
                    623: *      (WB)                  VALUE OF CODE KEYWORD
                    624: *      (XL)                  O OR PTR TO HEAD OF FCBLK CHAIN
                    625: *      JSR  SYSEJ            CALL TO END JOB
                    626: *
                    627: *      THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB)
                    628: *      999  EXECUTION SUPPRESSED
                    629: *      998  STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI
                    630: *           LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER
                    631: *           OF THE STATEMENT CAUSING PREMATURE TERMINATION.
                    632:        EJC
                    633: *
                    634: *      SYSEM -- GET ERROR MESSAGE TEXT
                    635: *
                    636: SYSEM  EXP                   DEFINE EXTERNAL ENTRY POINT
                    637: *
                    638: *      SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE
                    639: *      SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED
                    640: *      TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE.
                    641: *
                    642: *      (WA)                  ERROR CODE NUMBER
                    643: *      JSR  SYSEM            CALL TO GET TEXT
                    644: *      (XR)                  TEXT OF MESSAGE
                    645: *
                    646: *      THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK
                    647: *      FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE
                    648: *      STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN.
                    649: *      IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES
                    650: *      NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF
                    651: *      RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT
                    652: *      KEYWORD.
                    653:        EJC
                    654: *
                    655: *      SYSEN -- ENDFILE
                    656: *
                    657: SYSEN  EXP                   DEFINE EXTERNAL ENTRY POINT
                    658: *
                    659: *      SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE.
                    660: *      THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE
                    661: *      IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED,
                    662: *      BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE
                    663: *      SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ
                    664: *      OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE
                    665: *      NECESSARY TO REOPEN THE FILE VIA SYSIO.
                    666: *
                    667: *      (WA)                  PTR TO FCBLK OR ZERO
                    668: *      (XR)                  ENDFILE ARGUMENT (SCBLK PTR)
                    669: *      JSR  SYSEN            CALL TO ENDFILE
                    670: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
                    671: *      PPM  LOC              RETURN HERE IF ENDFILE NOT ALLOWED
                    672: *      PPM  LOC              RETURN HERE IF I/O ERROR
                    673: *      (WA,WB)               DESTROYED
                    674: *
                    675: *      THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH
                    676: *      ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED
                    677: *      THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS
                    678: *      CATEGORY.
                    679:        EJC
                    680: *
                    681: *      SYSEP -- EJECT PRINTER PAGE
                    682: *
                    683: SYSEP  EXP                   DEFINE EXTERNAL ENTRY POINT
                    684: *
                    685: *      SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD
                    686: *      PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT).
                    687: *
                    688: *      JSR  SYSEP            CALL TO EJECT PRINTER OUTPUT
                    689:        EJC
                    690: *
                    691: *      SYSEX -- CALL EXTERNAL FUNCTION
                    692: *
                    693: SYSEX  EXP                   DEFINE EXTERNAL ENTRY POINT
                    694: *
                    695: *      SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION
                    696: *      PREVIOUSLY LOADED WITH A CALL TO SYSLD.
                    697: *
                    698: *      (XS)                  POINTER TO ARGUMENTS ON STACK
                    699: *      (XL)                  POINTER TO CONTROL BLOCK (EFBLK)
                    700: *      (WA)                  NUMBER OF ARGUMENTS ON STACK
                    701: *      JSR  SYSEX            CALL TO PASS CONTROL TO FUNCTION
                    702: *      PPM  LOC              RETURN HERE IF FUNCTION CALL FAILS
                    703: *      (XS)                  POPPED PAST ARGUMENTS
                    704: *      (XR)                  RESULT RETURNED
                    705: *
                    706: *      THE ARGUMENTS ARE STORED ON THE STACK WITH
                    707: *      THE LAST ARGUMENT AT 0(XS). ON RETURN, XS
                    708: *      IS POPPED PAST THE ARGUMENTS.
                    709: *
                    710: *      THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE
                    711: *      SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES
                    712: *      SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED
                    713: *      (UNDER EFBLK) IN THIS SECTION.
                    714: *
                    715: *      THERE ARE TWO WAYS OF RETURNING A RESULT.
                    716: *
                    717: *      1)   RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS
                    718: *           BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING
                    719: *           THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE
                    720: *           KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY.
                    721: *
                    722: *      2)   STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY
                    723: *           POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY.
                    724: *           THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT
                    725: *           THAT THE FIRST WORD WILL BE OVERWRITTEN
                    726: *           BY A TYPE WORD ON RETURN AND SO NEED NOT
                    727: *           BE CORRECTLY SET. SUCH A RESULT IS
                    728: *           COPIED INTO MAIN STORAGE BEFORE PROCEEDING.
                    729: *           UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A
                    730: *           PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING
                    731: *           TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE
                    732: *           BLOCK IS COPIED INTO DYNAMIC MEMORY.
                    733:        EJC
                    734: *
                    735: *      SYSFC -- FILE CONTROL BLOCK ROUTINE
                    736: *
                    737: SYSFC  EXP                   DEFINE EXTERNAL ENTRY POINT
                    738: *
                    739: *      SEE ALSO SYSIO
                    740: *      INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN
                    741: *           INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
                    742: *           OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
                    743: *      FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY
                    744: *      AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING.
                    745: *      THE EXACT SIGNIFICANCE OF FILE ARG2
                    746: *      IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY,
                    747: *      THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL
                    748: *      SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS
                    749: *      A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$  WHERE
                    750: *      $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST.
                    751: *       REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER.
                    752: *      $R$ IS MAXIMUM RECORD LENGTH
                    753: *      $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING
                    754: *      $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE
                    755: *         ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE
                    756: *         WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT
                    757: *         SPITBOL LOAD TIME.
                    758: *      ,...,Z$Z$ ARE ADDITIONAL FIELDS.
                    759: *      IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD
                    760: *      SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY
                    761: *      ANOTHER DELIMITER (SEE
                    762: *        IODEL  EQU  *
                    763: *      EARLY IN DEFINITIONS SECTION).
                    764: *      SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT
                    765: *      ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND
                    766: *      TO  REPORT WHETHER AN FCBLK (FILE CONTROL
                    767: *      BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE.
                    768: *      THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO
                    769: *      ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED
                    770: *      OR ALTERNATIVELY IN STATIC MEMORY.
                    771: *      THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS
                    772: *      ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION
                    773: *      IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC
                    774: *      MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO
                    775: *      THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE
                    776: *      BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS
                    777: *      SPITBOL TO PROVIDE AN FCBLK).
                    778: *      AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN
                    779: *      XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR
                    780: *      WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER.
                    781: *      PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL
                    782: *      STORES NOTHING IN THEM.
                    783:        EJC
                    784: *      THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY
                    785: *      SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND
                    786: *      LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE
                    787: *      REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL
                    788: *      NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS
                    789: *      FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE
                    790: *      CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY
                    791: *      APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK
                    792: *      POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK
                    793: *      IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL.
                    794: *      IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED
                    795: *      TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF
                    796: *      WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH
                    797: *      FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY.
                    798: *      FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS
                    799: *      ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE
                    800: *      FOUND - SEE SYSXI FOR DETAILS.
                    801: *      IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC
                    802: *      AND SYSIO ARE OMITTED.
                    803: *      IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC
                    804: *      IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST
                    805: *      FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE
                    806: *      STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK
                    807: *      POINTERS FOR THEM.
                    808: *      FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING
                    809: *      MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS.
                    810: *      FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND
                    811: *      CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES
                    812: *      ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH
                    813: *      FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED
                    814: *      FIRST.
                    815: *      THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS,
                    816: *      POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS
                    817: *      STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER
                    818: *      ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO
                    819: *      PASSED A POINTER TO THIS FCBLK.
                    820: *
                    821: *      (XL)                  FILE ARG1 SCBLK PTR (2ND ARG)
                    822: *      (XR)                  FILEARG2 (3RD ARG) OR NULL
                    823: *      -(XS)...-(XS)         SCBLKS FOR $F$,$R$,$C$,...
                    824: *      (WC)                  NO. OF STACKED SCBLKS ABOVE
                    825: *      (WA)                  EXISTING FILE ARG1 FCBLK PTR OR 0
                    826: *      (WB)                  0/3 FOR INPUT/OUTPUT ASSOCN
                    827: *      JSR  SYSFC            CALL TO CHECK NEED FOR FCBLK
                    828: *      PPM  LOC              INVALID FILE ARGUMENT
                    829: *      (XS)                  POPPED (WC) TIMES
                    830: *      (WA NON ZERO)         BYTE SIZE OF REQUESTED FCBLK
                    831: *      (WA=0,XL NON ZERO)    PRIVATE FCBLK PTR IN XL
                    832: *      (WA=XL=0)             NO FCBLK WANTED, NO PRIVATE FCBLK
                    833: *      (WC)                  0/1/2 REQUEST ALLOC OF XRBLK/XNBLK
                    834: *                            /STATIC BLOCK FOR USE AS FCBLK
                    835: *      (WB)                  DESTROYED
                    836:        EJC
                    837: *
                    838: *      SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES
                    839: *
                    840: SYSHS  EXP                   DEFINE EXTERNAL ENTRY POINT
                    841: *
                    842: *      PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES
                    843: *      ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS
                    844: *      THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS
                    845: *      RETURNS AN SCBLK CONTAINING NAME OF COMPUTER,
                    846: *      NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY
                    847: *      COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD
                    848: *      AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY.
                    849: *      SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A
                    850: *      SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS
                    851: *      BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR
                    852: *      RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE
                    853: *      MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL
                    854: *      DOCUMENTATION, SECTION 10.
                    855: *      SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST
                    856: *      CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION
                    857: *      DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS
                    858: *      PERMIT RESPECTIVELY,  RETURN A NULL RESULT, RETURN WITH A
                    859: *      RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A
                    860: *      RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED
                    861: *      RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE
                    862: *      COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN
                    863: *      ARE STRINGS RETURNED VIA PPM LOC3 RETURN.
                    864: *
                    865: *      (WA)                  ARGUMENT 1
                    866: *      (XL)                  ARGUMENT 2
                    867: *      (XR)                  ARGUMENT 3
                    868: *      JSR  SYSHS            CALL TO GET HOST INFORMATION
                    869: *      PPM  LOC1             ERRONEOUS ARG
                    870: *      PPM  LOC2             EXECUTION ERROR
                    871: *      PPM  LOC3             SCBLK PTR IN XL OR 0 IF UNAVAILABLE
                    872: *      PPM  LOC4             RETURN A NULL RESULT
                    873: *      PPM  LOC5             RETURN RESULT IN XR
                    874: *      PPM  LOC6             CAUSE STATEMENT FAILURE
                    875:        EJC
                    876: *
                    877: *      SYSID -- RETURN SYSTEM IDENTIFICATION
                    878: *
                    879: SYSID  EXP                   DEFINE EXTERNAL ENTRY POINT
                    880: *
                    881: *      THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD
                    882: *      PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO
                    883: *      A HEADING LINE OF THE FORM
                    884: *           MACRO SPITBOL VERSION V.V
                    885: *      SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE
                    886: *      MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR
                    887: *      VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO
                    888: *      GIVE SAY
                    889: *           MACRO SPITBOL VERSION V.V(M.M)
                    890: *      THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE
                    891: *      AND OPERATING SYSTEM.  PREFERABLY IT SHOULD INCLUDE
                    892: *      THE DATE AND TIME OF THE RUN.
                    893: *      OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE
                    894: *      THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE,
                    895: *      UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS
                    896: *      APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A
                    897: *      NUISANCE TO USERS.
                    898: *      THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE
                    899: *      CORRECTLY SET.
                    900: *
                    901: *      JSR  SYSID            CALL FOR SYSTEM IDENTIFICATION
                    902: *      (XR)                  SCBLK PTR FOR ADDITION TO HEADER
                    903: *      (XL)                  PTR TO SECOND HEADER SCBLK
                    904:        EJC
                    905: *
                    906: *      SYSIL -- GET INPUT RECORD LENGTH
                    907: *
                    908: SYSIL  EXP                   DEFINE EXTERNAL ENTRY POINT
                    909: *
                    910: *      SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD
                    911: *      FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO
                    912: *      CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER
                    913: *      FOR A SUBSEQUENT SYSIN CALL.
                    914: *
                    915: *      (WA)                  PTR TO FCBLK OR ZERO
                    916: *      JSR  SYSIL            CALL TO GET RECORD LENGTH
                    917: *      (WA)                  LENGTH OR ZERO IF FILE CLOSED
                    918: *
                    919: *      NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE
                    920: *      UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL.
                    921: *
                    922: *      NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH
                    923: *      CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
                    924: *      RECORD INPUT FROM THE FILE.
                    925:        EJC
                    926: *
                    927: *      SYSIN -- READ INPUT RECORD
                    928: *
                    929: SYSIN  EXP                   DEFINE EXTERNAL ENTRY POINT
                    930: *
                    931: *      SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS
                    932: *      REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS
                    933: *      ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN
                    934: *      SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL.
                    935: *      IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH
                    936: *      FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING
                    937: *      UNLESS BUFFER IS RIGHT PADDED WITH ZEROES.
                    938: *      IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE
                    939: *      RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED.
                    940: *
                    941: *      (WA)                  PTR TO FCBLK OR ZERO
                    942: *      (XR)                  POINTER TO BUFFER (SCBLK PTR)
                    943: *      JSR  SYSIN            CALL TO READ RECORD
                    944: *      PPM  LOC              ENDFILE OR NO I/P FILE AFTER SYSXI
                    945: *      PPM  LOC              RETURN HERE IF I/O ERROR
                    946: *      PPM  LOC              RETURN HERE IF RECORD FORMAT ERROR
                    947: *      (WA,WB,WC)            DESTROYED
                    948:        EJC
                    949: *
                    950: *      SYSIO -- INPUT/OUTPUT FILE ASSOCIATION
                    951: *
                    952: SYSIO  EXP                   DEFINE EXTERNAL ENTRY POINT
                    953: *
                    954: *      SEE ALSO SYSFC.
                    955: *      SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT
                    956: *      FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2
                    957: *      ARE BOTH NULL.
                    958: *      ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL
                    959: *      OF SYSFC. IF SYSFC REQUESTED ALLOCATION
                    960: *      OF AN FCBLK, ITS ADDRESS WILL BE IN WA.
                    961: *      FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE
                    962: *      COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$
                    963: *      IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED.
                    964: *      ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT()
                    965: *      CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT
                    966: *      IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL
                    967: *      VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT
                    968: *      RESULT IN RE-OPENING THE FILE.
                    969: *      IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER
                    970: *      TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE.
                    971: *
                    972: *      (XL)                  FILE ARG1 SCBLK PTR (2ND ARG)
                    973: *      (XR)                  FILE ARG2 SCBLK PTR (3RD ARG)
                    974: *      (WA)                  FCBLK PTR (0 IF NONE)
                    975: *      (WB)                  0 FOR INPUT, 3 FOR OUTPUT
                    976: *      JSR  SYSIO            CALL TO ASSOCIATE FILE
                    977: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
                    978: *      PPM  LOC              RETURN IF INPUT/OUTPUT NOT ALLOWED
                    979: *      (XL)                  FCBLK POINTER (0 IF NONE)
                    980: *      (WC)                  0 (FOR DEFAULT) OR MAX RECORD LNGTH
                    981: *      (WA,WB)               DESTROYED
                    982: *
                    983: *      THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS
                    984: *      BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR
                    985: *      EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY
                    986: *      AS REGARDS INPUT ASSOCIATION.
                    987:        EJC
                    988: *
                    989: *      SYSLD -- LOAD EXTERNAL FUNCTION
                    990: *
                    991: SYSLD  EXP                   DEFINE EXTERNAL ENTRY POINT
                    992: *
                    993: *      SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4
                    994: *      LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER
                    995: *      THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL
                    996: *      BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX).
                    997: *
                    998: *      (XR)                  POINTER TO FUNCTION NAME (SCBLK)
                    999: *      (XL)                  POINTER TO LIBRARY NAME (SCBLK)
                   1000: *      JSR  SYSLD            CALL TO LOAD FUNCTION
                   1001: *      PPM  LOC              RETURN HERE IF FUNC DOES NOT EXIST
                   1002: *      PPM  LOC              RETURN HERE IF I/O ERROR
                   1003: *      (XR)                  POINTER TO LOADED CODE
                   1004: *
                   1005: *      THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE
                   1006: *      SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT
                   1007: *      IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE
                   1008: *      A PROPER BLOCK POINTER.
                   1009:        EJC
                   1010: *
                   1011: *      SYSMM -- GET MORE MEMORY
                   1012: *
                   1013: SYSMM  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1014: *
                   1015: *      SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC
                   1016: *      MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH
                   1017: *      THE CURRENT DYNAMIC DATA AREA.
                   1018: *
                   1019: *      THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY
                   1020: *      VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS
                   1021: *      IMPOSSIBLE.
                   1022: *
                   1023: *      JSR  SYSMM            CALL TO GET MORE MEMORY
                   1024: *      (XR)                  NUMBER OF ADDITIONAL WORDS OBTAINED
                   1025:        EJC
                   1026: *
                   1027: *      SYSMX -- SUPPLY MXLEN
                   1028: *
                   1029: SYSMX  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1030: *
                   1031: *      BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL
                   1032: *      OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN
                   1033: *      THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC
                   1034: *      (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO
                   1035: *      REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST
                   1036: *      USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY
                   1037: *      STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS,
                   1038: *      THERE IS NO PROBLEM.
                   1039: *      IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR
                   1040: *      20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A
                   1041: *      USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER
                   1042: *      OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF
                   1043: *      ANY. THE VALUE RETURNED IS EITHER AN INTEGER
                   1044: *      REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE
                   1045: *      MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN
                   1046: *      NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE
                   1047: *      IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED
                   1048: *      TO DYNAMIC STORE BEFORE COMPILATION STARTS.
                   1049: *      IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD
                   1050: *      MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC
                   1051: *      MEMORY IS USED FOR THIS KEYWORD.
                   1052: *
                   1053: *      JSR  SYSMX            CALL TO GET MXLEN
                   1054: *      (WA)                  EITHER MXLEN OR 0 FOR DEFAULT
                   1055:        EJC
                   1056: *
                   1057: *      SYSOU -- OUTPUT RECORD
                   1058: *
                   1059: SYSOU  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1060: *
                   1061: *      SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY
                   1062: *      ASSOCIATED WITH A SYSIO CALL.
                   1063: *
                   1064: *      (WA)                  PTR TO FCBLK OR ZERO
                   1065: *      (XR)                  RECORD TO BE WRITTEN (SCBLK)
                   1066: *      JSR  SYSOU            CALL TO OUTPUT RECORD
                   1067: *      PPM  LOC              FILE FULL OR NO FILE AFTER SYSXI
                   1068: *      PPM  LOC              RETURN HERE IF I/O ERROR
                   1069: *      (WA,WB,WC)            DESTROYED
                   1070: *
                   1071: *      NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH
                   1072: *      CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
                   1073: *      RECORD OUTPUT TO THE FILE.
                   1074:        EJC
                   1075: *
                   1076: *      SYSPI -- PRINT ON INTERACTIVE CHANNEL
                   1077: *
                   1078: SYSPI  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1079: *
                   1080: *      IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN
                   1081: *      REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION
                   1082: *      ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT
                   1083: *      REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH
                   1084: *      MESSAGES TO THE INTERACTIVE CHANNEL.
                   1085: *      SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL
                   1086: *      THROUGH THE SPECIAL VARIABLE NAME, TERMINAL.
                   1087: *
                   1088: *      (XR)                  PTR TO LINE BUFFER (SCBLK)
                   1089: *      (WA)                  LINE LENGTH
                   1090: *      JSR  SYSPI            CALL TO PRINT LINE
                   1091: *      PPM  LOC              FAILURE RETURN
                   1092: *      (WA,WB)               DESTROYED
                   1093:        EJC
                   1094: *
                   1095: *      SYSPP -- OBTAIN PRINT PARAMETERS
                   1096: *
                   1097: SYSPP  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1098: *
                   1099: *      SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN
                   1100: *      PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT
                   1101: *      AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN
                   1102: *      AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS
                   1103: *      CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL
                   1104: *      TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE
                   1105: *      GREATER.
                   1106: *      THE INFORMATION RETURNED IS -
                   1107: *      1.   LINE LENGTH IN CHARS FOR STANDARD PRINT FILE
                   1108: *      2.   NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED
                   1109: *           DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING
                   1110: *           PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS
                   1111: *           RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT.
                   1112: *      3.   AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS
                   1113: *           THE PROGRAM CONTAINS AN EXPLICIT -LIST.
                   1114: *      4.   OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR
                   1115: *           EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) -
                   1116: *           COMBINED WITH 3. GIVES POSSIBILITY OF LISTING
                   1117: *           FILE NEVER BEING OPENED.
                   1118: *      5.   OPTION TO HAVE COPIES OF ERRORS SENT TO AN
                   1119: *           INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER.
                   1120: *      6.   OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING
                   1121: *           TO AN ONLINE TERMINAL).
                   1122: *      7.   AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING
                   1123: *           FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER
                   1124: *           A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH
                   1125: *           OF-- LISTING, COMPILATION STATISTICS, EXECUTION
                   1126: *           OUTPUT AND EXECUTION STATISTICS.
                   1127: *      8.   AN OPTION TO SUPPRESS EXECUTION AS THOUGH A
                   1128: *           -NOEXECUTE CARD WERE SUPPLIED.
                   1129: *      9.   AN OPTION TO REQUEST THAT NAME /TERMINAL/  BE PRE-
                   1130: *           ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI
                   1131: *      10.  AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING
                   1132: *           THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT
                   1133: *           IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS
                   1134: *           COMPACT OPTION.
                   1135: *      11.  OPTION TO SUPPRESS SYSID IDENTIFICATION.
                   1136: *
                   1137: *      JSR  SYSPP            CALL TO GET PRINT PARAMETERS
                   1138: *      (WA)                  PRINT LINE LENGTH IN CHARS
                   1139: *      (WB)                  NUMBER OF LINES/PAGE
                   1140: *      (WC)                  BITS VALUE ...JIHGFEDCBA WHERE
                   1141: *                            A = 1 TO SEND ERROR COPY TO INT.CH.
                   1142: *                            B = 1 MEANS STD PRINTER IS INT. CH.
                   1143: *                            C = 1 FOR -NOLIST OPTION
                   1144: *                            D = 1 TO SUPPRESS COMPILN. STATS
                   1145: *                            E = 1 TO SUPPRESS EXECN. STATS
                   1146: *                            F = 1/0 FOR EXTNDED/COMPACT LISTING
                   1147: *                            G = 1 FOR -NOEXECUTE
                   1148: *                            H = 1 PRE-ASSOCIATE /TERMINAL/
                   1149: *                            I = 1 FOR STANDARD LISTING OPTION.
                   1150: *                            J = 1 SUPPRESSES LISTING HEADER
                   1151:        EJC
                   1152: *
                   1153: *      SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE
                   1154: *
                   1155: SYSPR  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1156: *
                   1157: *      SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD
                   1158: *      OUTPUT FILE.
                   1159: *
                   1160: *      (XR)                  POINTER TO LINE BUFFER (SCBLK)
                   1161: *      (WA)                  LINE LENGTH
                   1162: *      JSR  SYSPR            CALL TO PRINT LINE
                   1163: *      PPM  LOC              TOO MUCH O/P OR NO FILE AFTER SYSXI
                   1164: *      (WA,WB)               DESTROYED
                   1165: *
                   1166: *      THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE
                   1167: *      SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE
                   1168: *      VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS
                   1169: *      THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE
                   1170: *      CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED
                   1171: *      SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE
                   1172: *      IN WHICH CASE A BLANK LINE IS TO BE PRINTED.
                   1173: *
                   1174: *      THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT
                   1175: *      OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE
                   1176: *      PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO
                   1177: *      ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION.
                   1178: *      ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR
                   1179: *      CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION
                   1180: *      IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998.
                   1181:        EJC
                   1182: *
                   1183: *      SYSRD -- READ RECORD FROM STANDARD INPUT FILE
                   1184: *
                   1185: SYSRD  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1186: *
                   1187: *      SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT
                   1188: *      FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE
                   1189: *      LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS
                   1190: *      CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH
                   1191: *      SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT
                   1192: *      CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD
                   1193: *      (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT
                   1194: *      ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT()
                   1195: *      STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80).
                   1196: *      IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH
                   1197: *      FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING
                   1198: *      UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES.
                   1199: *      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN
                   1200: *      AFTER SUCH AN ADJUSTMENT HAS BEEN MADE.
                   1201: *      SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE
                   1202: *      RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE
                   1203: *      REPEATED ENDFILE RETURNS.
                   1204: *
                   1205: *      (XR)                  POINTER TO BUFFER (SCBLK PTR)
                   1206: *      (WC)                  LENGTH OF BUFFER IN CHARACTERS
                   1207: *      JSR  SYSRD            CALL TO READ LINE
                   1208: *      PPM  LOC              ENDFILE OR NO I/P FILE AFTER SYSXI
                   1209: *      (WA,WB,WC)            DESTROYED
                   1210:        EJC
                   1211: *
                   1212: *      SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL
                   1213: *
                   1214: SYSRI  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1215: *
                   1216: *      READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE,
                   1217: *      TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE
                   1218: *      ENDFILE RETURN ONLY.
                   1219: *      THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI
                   1220: *      SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK
                   1221: *      BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT
                   1222: *      PADDED WITH ZEROES.
                   1223: *      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE
                   1224: *      RETURN AFTER ADJUSTING THE COUNT.
                   1225: *      THE END OF FILE RETURN MAY BE USED IF THIS MAKES
                   1226: *      SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN
                   1227: *      EOF CHARACTER.)
                   1228: *
                   1229: *      (XR)                  PTR TO 120 CHAR BUFFER (SCBLK PTR)
                   1230: *      JSR  SYSRI            CALL TO READ LINE FROM TERMINAL
                   1231: *      PPM  LOC              END OF FILE RETURN
                   1232: *      (WA,WB,WC)            MAY BE DESTROYED
                   1233:        EJC
                   1234: *
                   1235: *      SYSRW -- REWIND FILE
                   1236: *
                   1237: SYSRW  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1238: *
                   1239: *      SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE
                   1240: *      AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE
                   1241: *      CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE
                   1242: *      FILE AT THE START.
                   1243: *
                   1244: *      (WA)                  PTR TO FCBLK OR ZERO
                   1245: *      (XR)                  REWIND ARG (SCBLK PTR)
                   1246: *      JSR  SYSRW            CALL TO REWIND FILE
                   1247: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
                   1248: *      PPM  LOC              RETURN HERE IF REWIND NOT ALLOWED
                   1249: *      PPM  LOC              RETURN HERE IF I/O ERROR
                   1250:        EJC
                   1251: .IF    .CUST
                   1252: *
                   1253: *      SYSST -- SET FILE POINTER
                   1254: *
                   1255: SYSST  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1256: *
                   1257: *      SYSST IS CALLED TO CHANGE THE POSITION OF A FILE
                   1258: *      POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT
                   1259: *      MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED
                   1260: *      UNCONVERTED.
                   1261: *
                   1262: *      (WA)                  FCBLK POINTER
                   1263: *      (WB)                  2ND ARGUMENT
                   1264: *      (WC)                  3RD ARGUMENT
                   1265: *      JSR  SYSST            CALL TO SET FILE POINTER
                   1266: *      PPM  LOC              RETURN HERE IF INVALID 2ND ARG
                   1267: *      PPM  LOC              RETURN HERE IF INVALID 3RD ARG
                   1268: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
                   1269: *      PPM  LOC              RETURN HERE IF SET NOT ALLOWED
                   1270: *      PPM  LOC              RETURN HERE IF I/O ERROR
                   1271: *
                   1272:        EJC
                   1273: .FI
                   1274: *
                   1275: *      SYSTM -- GET EXECUTION TIME SO FAR
                   1276: *
                   1277: SYSTM  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1278: *
                   1279: *      SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME
                   1280: *      USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS
                   1281: *      ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT
                   1282: *      THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE,
                   1283: *      THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK
                   1284: *      TIMING VALUES.
                   1285: *
                   1286: *      JSR  SYSTM            CALL TO GET TIMER VALUE
                   1287: *      (IA)                  TIME SO FAR IN MILLISECONDS
                   1288:        EJC
                   1289: *
                   1290: *      SYSTT -- TRACE TOGGLE
                   1291: *
                   1292: SYSTT  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1293: *
                   1294: *      CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO
                   1295: *      TOGGLE THE SYSTEM TRACE SWITCH.  THIS PERMITS TRACING OF
                   1296: *      LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF.
                   1297: *
                   1298: *      JSR  SYSTT            CALL TO TOGGLE TRACE SWITCH
                   1299:        EJC
                   1300: *
                   1301: *      SYSUL -- UNLOAD EXTERNAL FUNCTION
                   1302: *
                   1303: SYSUL  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1304: *
                   1305: *      SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY
                   1306: *      LOADED WITH A CALL TO SYSLD.
                   1307: *
                   1308: *      (XR)                  PTR TO CONTROL BLOCK (EFBLK)
                   1309: *      JSR  SYSUL            CALL TO UNLOAD FUNCTION
                   1310: *
                   1311: *      THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL
                   1312: *      UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION.
                   1313: *
                   1314: *      THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A
                   1315: *      POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE
                   1316: *      DEFINITIONS AND DATA STRUCTURES SECTION).
                   1317: .IF    .CNEX
                   1318: .ELSE
                   1319:        EJC
                   1320: *
                   1321: *      SYSXI -- EXIT TO PRODUCE LOAD MODULE
                   1322: *
                   1323: SYSXI  EXP                   DEFINE EXTERNAL ENTRY POINT
                   1324: *
                   1325: *      WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER
                   1326: *      OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE
                   1327: *      CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT
                   1328: *      SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND
                   1329: *      THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN
                   1330: *      EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY
                   1331: *      CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE.
                   1332: *      IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS
                   1333: *
                   1334: *      -1, -2, -3
                   1335: *           CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE
                   1336: *           IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH
                   1337: *           A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS.
                   1338: *           VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE
                   1339: *           KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING.
                   1340: *           TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A
                   1341: *           POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR
                   1342: *           VERSION NUMBER V.V (SEE SYSID).
                   1343: *
                   1344: *      0    IF POSSIBLE, RETURN CONTROL TO JOB CONTROL
                   1345: *           COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE
                   1346: *           SYSTEM DEPENDENT.
                   1347: *
                   1348: *      +1, +2, +3
                   1349: *           CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF
                   1350: *           MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE
                   1351: *           THIS MODULE DIRECTLY.
                   1352: *
                   1353: *      IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN
                   1354: *      FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO
                   1355: *      OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD
                   1356: *      MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE
                   1357: *      SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM.
                   1358: *      SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS,
                   1359: *      INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT
                   1360: *      CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS
                   1361: *      NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE.
                   1362: *      AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS
                   1363: *      RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH
                   1364: *      A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE
                   1365: *      PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE
                   1366: *      IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL
                   1367: *      ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A
                   1368: *      REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS
                   1369: *      BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998.
                   1370: *      AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT
                   1371: *      CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE.
                   1372: *
                   1373: *      IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL
                   1374: *      BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI
                   1375: *      AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD
                   1376: *      CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS
                   1377: *      FCBLK POINTER.
                   1378:        EJC
                   1379: *
                   1380: *      SYSXI (CONTINUED)
                   1381: *
                   1382: *      (XL)                  ZERO OR SCBLK PTR
                   1383: *      (XR)                  PTR TO V.V SCBLK
                   1384: *      (IA)                  SIGNED INTEGER ARGUMENT
                   1385: *      (WB)                  0 OR PTR TO HEAD OF FCBLK CHAIN
                   1386: *      JSR  SYSXI            CALL TO EXIT
                   1387: *      PPM  LOC              REQUESTED ACTION NOT POSSIBLE
                   1388: *      PPM  LOC              ACTION CAUSED IRRECOVERABLE ERROR
                   1389: *      (REGISTERS)           SHOULD BE PRESERVED OVER CALL
                   1390: *
                   1391: *      LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM
                   1392: *      JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT
                   1393: *      AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI.
                   1394: *      THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE
                   1395: *      OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE.
                   1396: *      +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE
                   1397: *      CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE.
                   1398: *      +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID
                   1399: *      AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE.
                   1400: *      ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A
                   1401: *      STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE.
                   1402: *      +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP
                   1403: *      AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE.
                   1404: *      NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM
                   1405: *      IS LOADED AND ENTERED.
                   1406: .FI
                   1407:        EJC
                   1408: *
                   1409: *      INTRODUCE THE INTERNAL PROCEDURES.
                   1410: *
                   1411: ACESS  INP  R,1
                   1412: ACOMP  INP  N,5
                   1413: ALLOC  INP  E,0
                   1414: .IF    .CNBF
                   1415: .ELSE
                   1416: ALOBF  INP  E,0
                   1417: .FI
                   1418: ALOCS  INP  E,0
                   1419: ALOST  INP  E,0
                   1420: APNDB  INP  E,2
                   1421: .IF    .CNRA
                   1422: ARITH  INP  N,2
                   1423: .ELSE
                   1424: ARITH  INP  N,3
                   1425: .FI
                   1426: ASIGN  INP  R,1
                   1427: ASINP  INP  R,1
                   1428: BLKLN  INP  E,0
                   1429: CDGCG  INP  E,0
                   1430: CDGEX  INP  R,0
                   1431: CDGNM  INP  R,0
                   1432: CDGVL  INP  R,0
                   1433: CDWRD  INP  E,0
                   1434: CMGEN  INP  R,0
                   1435: CMPIL  INP  E,0
                   1436: CNCRD  INP  E,0
                   1437: COPYB  INP  N,1
                   1438: DFFNC  INP  E,0
                   1439: DTACH  INP  E,0
                   1440: DTYPE  INP  E,0
                   1441: DUMPR  INP  E,0
                   1442: ERMSG  INP  E,0
                   1443: ERTEX  INP  E,0
                   1444: EVALI  INP  R,4
                   1445: EVALP  INP  R,1
                   1446: EVALS  INP  R,3
                   1447: EVALX  INP  R,1
                   1448: EXBLD  INP  E,0
                   1449: EXPAN  INP  E,0
                   1450: EXPAP  INP  E,1
                   1451: EXPDM  INP  N,0
                   1452: EXPOP  INP  N,0
                   1453: .IF    .CULC
                   1454: FLSTG  INP  R,0
                   1455: .FI
                   1456: GBCOL  INP  E,0
                   1457: GBCPF  INP  E,0
                   1458: GTARR  INP  E,1
                   1459:        EJC
                   1460: GTCOD  INP  E,1
                   1461: GTEXP  INP  E,1
                   1462: GTINT  INP  E,1
                   1463: GTNUM  INP  E,1
                   1464: GTNVR  INP  E,1
                   1465: GTPAT  INP  E,1
                   1466: .IF    .CNRA
                   1467: .ELSE
                   1468: GTREA  INP  E,1
                   1469: .FI
                   1470: GTSMI  INP  N,2
                   1471: GTSTG  INP  N,1
                   1472: GTVAR  INP  E,1
                   1473: HASHS  INP  E,0
                   1474: ICBLD  INP  E,0
                   1475: IDENT  INP  E,1
                   1476: INOUT  INP  E,0
                   1477: .IF    .CNBF
                   1478: .ELSE
                   1479: INSBF  INP  E,2
                   1480: .FI
                   1481: IOFCB  INP  N,2
                   1482: IOPPF  INP  N,0
                   1483: IOPUT  INP  N,6
                   1484: KTREX  INP  R,0
                   1485: KWNAM  INP  N,0
                   1486: LCOMP  INP  N,5
                   1487: LISTR  INP  E,0
                   1488: LISTT  INP  E,0
                   1489: NEXTS  INP  E,0
                   1490: PATIN  INP  N,2
                   1491: PATST  INP  N,1
                   1492: PBILD  INP  E,0
                   1493: PCONC  INP  E,0
                   1494: PCOPY  INP  N,0
                   1495: .IF    .CNPF
                   1496: .ELSE
                   1497: PRFLR  INP  E,0
                   1498: PRFLU  INP  E,0
                   1499: .FI
                   1500: PRPAR  INP  E,0
                   1501: PRTCH  INP  E,0
                   1502: PRTIC  INP  E,0
                   1503: PRTIS  INP  E,0
                   1504: PRTIN  INP  E,0
                   1505: PRTMI  INP  E,0
                   1506: PRTMX  INP  E,0
                   1507: PRTNL  INP  R,0
                   1508: PRTNM  INP  R,0
                   1509: PRTNV  INP  E,0
                   1510: PRTPG  INP  E,0
                   1511: PRTPS  INP  E,0
                   1512: PRTSN  INP  E,0
                   1513: PRTST  INP  R,0
                   1514:        EJC
                   1515: PRTTR  INP  E,0
                   1516: PRTVL  INP  R,0
                   1517: PRTVN  INP  E,0
                   1518: .IF    .CNRA
                   1519: .ELSE
                   1520: RCBLD  INP  E,0
                   1521: .FI
                   1522: READR  INP  E,0
                   1523: SBSTR  INP  E,0
                   1524: SCANE  INP  E,0
                   1525: SCNGF  INP  E,0
                   1526: SETVR  INP  E,0
                   1527: .IF    .CNSR
                   1528: .ELSE
                   1529: SORTA  INP  N,0
                   1530: SORTC  INP  E,1
                   1531: SORTF  INP  E,0
                   1532: SORTH  INP  E,0
                   1533: .FI
                   1534: TFIND  INP  E,1
                   1535: TRACE  INP  N,2
                   1536: TRBLD  INP  E,0
                   1537: TRIMR  INP  E,0
                   1538: TRXEQ  INP  R,0
                   1539: XSCAN  INP  E,0
                   1540: XSCNI  INP  N,2
                   1541: *
                   1542: *      INTRODUCE THE INTERNAL ROUTINES
                   1543: *
                   1544: ARREF  INR
                   1545: CFUNC  INR
                   1546: EXFAL  INR
                   1547: EXINT  INR
                   1548: EXITS  INR
                   1549: EXIXR  INR
                   1550: EXNAM  INR
                   1551: EXNUL  INR
                   1552: .IF    .CNRA
                   1553: .ELSE
                   1554: EXREA  INR
                   1555: .FI
                   1556: EXSID  INR
                   1557: EXVNM  INR
                   1558: FAILP  INR
                   1559: FLPOP  INR
                   1560: INDIR  INR
                   1561: MATCH  INR
                   1562: RETRN  INR
                   1563: STCOV  INR
                   1564: STMGO  INR
                   1565: STOPR  INR
                   1566: SUCCP  INR
                   1567: SYSAB  INR
                   1568: SYSTU  INR
                   1569:        TTL  S P I T B O L -- DEFINITIONS AND DATA STRUCTURES
                   1570:        SEC                   START OF DEFINITIONS SECTION
                   1571: *
                   1572: *      DEFINITIONS OF MACHINE PARAMETERS
                   1573: *
                   1574: *      THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
                   1575: *      FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
                   1576: *      EQU  *
                   1577: *      DEFINITIONS GIVEN AT THE START OF THIS SECTION.
                   1578: *
                   1579: CFP$A  EQU  *                NUMBER OF CHARACTERS IN ALPHABET
                   1580: *
                   1581: CFP$B  EQU  *                BYTES/WORD ADDRESSING FACTOR
                   1582: *
                   1583: CFP$C  EQU  *                NUMBER OF CHARACTERS PER WORD
                   1584: *
                   1585: CFP$F  EQU  *                OFFSET IN BYTES TO CHARS IN
                   1586: *                            SCBLK. SEE SCBLK FORMAT.
                   1587: *
                   1588: CFP$I  EQU  *                NUMBER OF WORDS IN INTEGER CONSTANT
                   1589: *
                   1590: CFP$M  EQU  *                MAX POSITIVE INTEGER IN ONE WORD
                   1591: *
                   1592: CFP$N  EQU  *                NUMBER OF BITS IN ONE WORD
                   1593: *
                   1594: *      THE FOLLOWING DEFINITIONS REQUIRE THE SUPPLY OF EITHER
                   1595: *      A SINGLE PARAMETER IF REAL ARITHMETIC IS OMITTED OR
                   1596: *      THREE PARAMETERS IF REAL ARITHMETIC IS INCLUDED.
                   1597: *
                   1598: .IF    .CNRA
                   1599: NSTMX  EQU  *                NO. OF DECIMAL DIGITS IN CFP$M
                   1600: .ELSE
                   1601: *
                   1602: CFP$R  EQU  *                NUMBER OF WORDS IN REAL CONSTANT
                   1603: *
                   1604: CFP$S  EQU  *                NUMBER OF SIG DIGS FOR REAL OUTPUT
                   1605: *
                   1606: CFP$X  EQU  *                MAX DIGITS IN REAL EXPONENT
                   1607: *
                   1608: MXDGS  EQU  CFP$S+CFP$X      MAX DIGITS IN REAL NUMBER
                   1609: *
                   1610: NSTMX  EQU  MXDGS+5          MAX SPACE FOR REAL (FOR +0.E+)
                   1611: .FI
                   1612: .IF    .CUCF
                   1613: *
                   1614: *      THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
                   1615: *      UPPER BOUND ON THE SIZE OF THE ALPHABET.  CFP$U IS USED
                   1616: *      TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
                   1617: *      TRANSLATION STORAGE REQUIREMENTS.
                   1618: *
                   1619: CFP$U  EQU  *                REALISTIC UPPER BOUND ON ALPHABET
                   1620: .FI
                   1621:        EJC
                   1622: *
                   1623: *      ENVIRONMENT PARAMETERS
                   1624: *
                   1625: *      THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
                   1626: *      THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
                   1627: *      EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
                   1628: *      THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
                   1629: *      THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
                   1630: *
                   1631: *      E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
                   1632: *      STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
                   1633: *      SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
                   1634: *      IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
                   1635: *      AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
                   1636: *      AN SCBLK CONTAINING SAY 30 CHARACTERS.
                   1637: *
                   1638: E$SRS  EQU  *                30 WORDS
                   1639: *
                   1640: *      E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
                   1641: *      STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
                   1642: *      PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
                   1643: *      TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
                   1644: *
                   1645: E$STS  EQU  *                500 WORDS
                   1646: *
                   1647: *      E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
                   1648: *      THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
                   1649: *      IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
                   1650: *      WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
                   1651: *      IN THE CASE OF A TOO LARGE VALUE.
                   1652: *
                   1653: E$CBS  EQU  *                500 WORDS
                   1654: *
                   1655: *      E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
                   1656: *      HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
                   1657: *      SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
                   1658: *      EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
                   1659: *
                   1660: E$HNB  EQU  *                127 BUCKET HEADERS
                   1661: *
                   1662: *      E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
                   1663: *      NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
                   1664: *      LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
                   1665: *      LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
                   1666: *
                   1667: E$HNW  EQU  *                6 WORDS
                   1668: *
                   1669: *      E$FSP .  IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
                   1670: *      COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
                   1671: *      IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
                   1672: *      THIS SPACE IS USED UP.  E$FSP IS A MEASURE OF THE
                   1673: *      MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
                   1674: *      BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
                   1675: *      OBTAIN MORE MEMORY.
                   1676: *
                   1677: E$FSP  EQU  *                15 PERCENT
                   1678:        EJC
                   1679: *
                   1680: *      DEFINITIONS OF CODES FOR LETTERS
                   1681: *
                   1682: CH$LA  EQU  *                LETTER A
                   1683: CH$LB  EQU  *                LETTER B
                   1684: CH$LC  EQU  *                LETTER C
                   1685: CH$LD  EQU  *                LETTER D
                   1686: CH$LE  EQU  *                LETTER E
                   1687: CH$LF  EQU  *                LETTER F
                   1688: CH$LG  EQU  *                LETTER G
                   1689: CH$LH  EQU  *                LETTER H
                   1690: CH$LI  EQU  *                LETTER I
                   1691: CH$LJ  EQU  *                LETTER J
                   1692: CH$LK  EQU  *                LETTER K
                   1693: CH$LL  EQU  *                LETTER L
                   1694: CH$LM  EQU  *                LETTER M
                   1695: CH$LN  EQU  *                LETTER N
                   1696: CH$LO  EQU  *                LETTER O
                   1697: CH$LP  EQU  *                LETTER P
                   1698: CH$LQ  EQU  *                LETTER Q
                   1699: CH$LR  EQU  *                LETTER R
                   1700: CH$LS  EQU  *                LETTER S
                   1701: CH$LT  EQU  *                LETTER T
                   1702: CH$LU  EQU  *                LETTER U
                   1703: CH$LV  EQU  *                LETTER V
                   1704: CH$LW  EQU  *                LETTER W
                   1705: CH$LX  EQU  *                LETTER X
                   1706: CH$LY  EQU  *                LETTER Y
                   1707: CH$L$  EQU  *                LETTER Z
                   1708: *
                   1709: *      DEFINITIONS OF CODES FOR DIGITS
                   1710: *
                   1711: CH$D0  EQU  *                DIGIT 0
                   1712: CH$D1  EQU  *                DIGIT 1
                   1713: CH$D2  EQU  *                DIGIT 2
                   1714: CH$D3  EQU  *                DIGIT 3
                   1715: CH$D4  EQU  *                DIGIT 4
                   1716: CH$D5  EQU  *                DIGIT 5
                   1717: CH$D6  EQU  *                DIGIT 6
                   1718: CH$D7  EQU  *                DIGIT 7
                   1719: CH$D8  EQU  *                DIGIT 8
                   1720: CH$D9  EQU  *                DIGIT 9
                   1721:        EJC
                   1722: *
                   1723: *      DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
                   1724: *
                   1725: *      THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
                   1726: *      ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
                   1727: *      TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
                   1728: *
                   1729: CH$AM  EQU  *                KEYWORD OPERATOR (AMPERSAND)
                   1730: CH$AS  EQU  *                MULTIPLICATION SYMBOL (ASTERISK)
                   1731: CH$AT  EQU  *                CURSOR POSITION OPERATOR (AT)
                   1732: CH$BB  EQU  *                LEFT ARRAY BRACKET (LESS THAN)
                   1733: CH$BL  EQU  *                BLANK
                   1734: CH$BR  EQU  *                ALTERNATION OPERATOR (VERTICAL BAR)
                   1735: CH$CL  EQU  *                GOTO SYMBOL (COLON)
                   1736: CH$CM  EQU  *                COMMA
                   1737: CH$DL  EQU  *                INDIRECTION OPERATOR (DOLLAR)
                   1738: CH$DT  EQU  *                NAME OPERATOR (DOT)
                   1739: CH$DQ  EQU  *                DOUBLE QUOTE
                   1740: CH$EQ  EQU  *                EQUAL SIGN
                   1741: CH$EX  EQU  *                EXPONENTIATION OPERATOR (EXCLM)
                   1742: CH$MN  EQU  *                MINUS SIGN
                   1743: CH$NM  EQU  *                NUMBER SIGN
                   1744: CH$NT  EQU  *                NEGATION OPERATOR (NOT)
                   1745: CH$PC  EQU  *                PERCENT
                   1746: CH$PL  EQU  *                PLUS SIGN
                   1747: CH$PP  EQU  *                LEFT PARENTHESIS
                   1748: CH$RB  EQU  *                RIGHT ARRAY BRACKET (GRTR THAN)
                   1749: CH$RP  EQU  *                RIGHT PARENTHESIS
                   1750: CH$QU  EQU  *                INTERROGATION OPERATOR (QUESTION)
                   1751: CH$SL  EQU  *                SLASH
                   1752: CH$SM  EQU  *                SEMICOLON
                   1753: CH$SQ  EQU  *                SINGLE QUOTE
                   1754: CH$UN  EQU  *                SPECIAL IDENTIFIER CHAR (UNDERLINE)
                   1755: CH$OB  EQU  *                OPENING BRACKET
                   1756: CH$CB  EQU  *                CLOSING BRACKET
                   1757:        EJC
                   1758: *
                   1759: *      REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
                   1760: .IF    .CAHT
                   1761: *
                   1762: *      TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
                   1763: *
                   1764: CH$HT  EQU  *                HORIZONTAL TAB
                   1765: .FI
                   1766: .IF    .CAVT
                   1767: CH$VT  EQU  *                VERTICAL TAB
                   1768: .FI
                   1769: .IF    .CASL
                   1770: *
                   1771: *      LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
                   1772: *
                   1773: CH$$A  EQU  *                SHIFTED A
                   1774: CH$$B  EQU  *                SHIFTED B
                   1775: CH$$C  EQU  *                SHIFTED C
                   1776: CH$$D  EQU  *                SHIFTED D
                   1777: CH$$E  EQU  *                SHIFTED E
                   1778: CH$$F  EQU  *                SHIFTED F
                   1779: CH$$G  EQU  *                SHIFTED G
                   1780: CH$$H  EQU  *                SHIFTED H
                   1781: CH$$I  EQU  *                SHIFTED I
                   1782: CH$$J  EQU  *                SHIFTED J
                   1783: CH$$K  EQU  *                SHIFTED K
                   1784: CH$$L  EQU  *                SHIFTED L
                   1785: CH$$M  EQU  *                SHIFTED M
                   1786: CH$$N  EQU  *                SHIFTED N
                   1787: CH$$O  EQU  *                SHIFTED O
                   1788: CH$$P  EQU  *                SHIFTED P
                   1789: CH$$Q  EQU  *                SHIFTED Q
                   1790: CH$$R  EQU  *                SHIFTED R
                   1791: CH$$S  EQU  *                SHIFTED S
                   1792: CH$$T  EQU  *                SHIFTED T
                   1793: CH$$U  EQU  *                SHIFTED U
                   1794: CH$$V  EQU  *                SHIFTED V
                   1795: CH$$W  EQU  *                SHIFTED W
                   1796: CH$$X  EQU  *                SHIFTED X
                   1797: CH$$Y  EQU  *                SHIFTED Y
                   1798: CH$$$  EQU  *                SHIFTED Z
                   1799: .FI
                   1800: *      IF A DELIMITER OTHER THAN CH$CM MUST BE USED IN
                   1801: *      THE THIRD ARGUMENT OF INPUT(),OUTPUT() THEN .CIOD SHOULD
                   1802: *      BE DEFINED AND A PARAMETER SUPPLIED FOR IODEL.
                   1803: *
                   1804: .IF    .CIOD
                   1805: IODEL  EQU  *
                   1806: .ELSE
                   1807: IODEL  EQU  CH$CM
                   1808: .FI
                   1809:        EJC
                   1810: *
                   1811: *      DATA BLOCK FORMATS AND DEFINITIONS
                   1812: *
                   1813: *      THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
                   1814: *      ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
                   1815: *
                   1816: *      EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
                   1817: *      UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
                   1818: *      BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
                   1819: *      INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
                   1820: *      CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
                   1821: *      IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
                   1822: *      DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
                   1823: *
                   1824: *      IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
                   1825: *      FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
                   1826: *      TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
                   1827: *      CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
                   1828: *      WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
                   1829: *      POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
                   1830: *
                   1831: *      IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
                   1832: *      MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
                   1833: *      IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
                   1834: *      A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
                   1835: *      TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
                   1836: *      COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
                   1837: *      IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
                   1838: *      PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
                   1839: *      FIELDS IN A BLOCK MUST BE CONTIGUOUS.
                   1840:        EJC
                   1841: *
                   1842: *      THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
                   1843: *
                   1844: *      1)   BLOCK TITLE AND TWO CHARACTER IDENTIFIER
                   1845: *
                   1846: *      2)   DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
                   1847: *           OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
                   1848: *
                   1849: *      3)   PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
                   1850: *           MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
                   1851: *           LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
                   1852: *           WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
                   1853: *           ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
                   1854: *           (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
                   1855: *           BY / (SLASH).
                   1856: *
                   1857: *      4)   DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
                   1858: *           BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
                   1859: *           OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
                   1860: *           BLOCK IS VARIABLE LENGTH.
                   1861: *           NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
                   1862: *           CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
                   1863: *           GIVEN HERE ENFORCE THIS.  MAKE CHANGES TO
                   1864: *           THEM ONLY WITH DUE CARE.
                   1865: *
                   1866: *      DEFINITIONS OF COMMON OFFSETS
                   1867: *
                   1868: OFFS1  EQU  1
                   1869: OFFS2  EQU  2
                   1870: OFFS3  EQU  3
                   1871: *
                   1872: *      5)   DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
                   1873: *           OF THE VARIOUS FIELDS.
                   1874: *
                   1875: *      THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
                   1876:        EJC
                   1877: *
                   1878: *      DEFINITIONS OF BLOCK CODES
                   1879: *
                   1880: *      THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
                   1881: *      EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
                   1882: *      THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
                   1883: *      ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
                   1884: *      THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
                   1885: *      USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
                   1886: *
                   1887: *      BLOCK CODES FOR ACCESSIBLE DATATYPES
                   1888: *
                   1889: BL$AR  EQU  0                ARBLK     ARRAY
                   1890: .IF    .CNBF
                   1891: BL$CD  EQU  BL$AR+1          CDBLK     CODE
                   1892: .ELSE
                   1893: BL$BC  EQU  BL$AR+1          BCBLK     BUFFER
                   1894: BL$CD  EQU  BL$BC+1          CDBLK     CODE
                   1895: .FI
                   1896: BL$EX  EQU  BL$CD+1          EXBLK     EXPRESSION
                   1897: BL$IC  EQU  BL$EX+1          ICBLK     INTEGER
                   1898: BL$NM  EQU  BL$IC+1          NMBLK     NAME
                   1899: BL$P0  EQU  BL$NM+1          P0BLK     PATTERN
                   1900: BL$P1  EQU  BL$P0+1          P1BLK     PATTERN
                   1901: BL$P2  EQU  BL$P1+1          P2BLK     PATTERN
                   1902: .IF    .CNRA
                   1903: BL$SC  EQU  BL$P2+1          SCBLK     STRING
                   1904: .ELSE
                   1905: BL$RC  EQU  BL$P2+1          RCBLK     REAL
                   1906: BL$SC  EQU  BL$RC+1          SCBLK     STRING
                   1907: .FI
                   1908: BL$SE  EQU  BL$SC+1          SEBLK     EXPRESSION
                   1909: BL$TB  EQU  BL$SE+1          TBBLK     TABLE
                   1910: BL$VC  EQU  BL$TB+1          VCBLK     ARRAY
                   1911: BL$XN  EQU  BL$VC+1          XNBLK     EXTERNAL
                   1912: BL$XR  EQU  BL$XN+1          XRBLK     EXTERNAL
                   1913: BL$PD  EQU  BL$XR+1          PDBLK     PROGRAM DEFINED DATATYPE
                   1914: *
                   1915: BL$$D  EQU  BL$PD+1          NUMBER OF BLOCK CODES FOR DATA
                   1916: *
                   1917: *      OTHER BLOCK CODES
                   1918: *
                   1919: BL$TR  EQU  BL$PD+1          TRBLK
                   1920: .IF    .CNBF
                   1921: BL$CC  EQU  BL$TR+1          CCBLK
                   1922: .ELSE
                   1923: BL$BF  EQU  BL$TR+1          BFBLK
                   1924: BL$CC  EQU  BL$BF+1          CCBLK
                   1925: .FI
                   1926: BL$CM  EQU  BL$CC+1          CMBLK
                   1927: BL$CT  EQU  BL$CM+1          CTBLK
                   1928: BL$DF  EQU  BL$CT+1          DFBLK
                   1929: BL$EF  EQU  BL$DF+1          EFBLK
                   1930: BL$EV  EQU  BL$EF+1          EVBLK
                   1931: BL$FF  EQU  BL$EV+1          FFBLK
                   1932: BL$KV  EQU  BL$FF+1          KVBLK
                   1933: BL$PF  EQU  BL$KV+1          PFBLK
                   1934: BL$TE  EQU  BL$PF+1          TEBLK
                   1935: *
                   1936: BL$$I  EQU  0                DEFAULT IDENTIFICATION CODE
                   1937: BL$$T  EQU  BL$TR+1          CODE FOR DATA OR TRACE BLOCK
                   1938: BL$$$  EQU  BL$TE+1          NUMBER OF BLOCK CODES
                   1939:        EJC
                   1940: *
                   1941: *      FIELD REFERENCES
                   1942: *
                   1943: *      REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
                   1944: *      (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
                   1945: *      EXCEPTIONS.
                   1946: *
                   1947: *      1)   REFERENCES TO THE FIRST WORD ARE USUALLY NOT
                   1948: *           SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
                   1949: *
                   1950: *      2)   THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
                   1951: *           SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
                   1952: *           BLOCK FORMAT IS MODIFIED.
                   1953: *
                   1954: *      3)   THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
                   1955: *           CORRESPONDING TO THE DEFINITION OF CFP$F.
                   1956: *
                   1957: *      4)   THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
                   1958: *           IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
                   1959: *
                   1960: *      5)   THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
                   1961: *           AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
                   1962: *           BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
                   1963: *           TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
                   1964: *           LISTED EXCEPTIONS.
                   1965: *
                   1966: *      6)   SEVERAL SPOTS IN THE CODE ASSUME THAT THE
                   1967: *           DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
                   1968: *           THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
                   1969: *           OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
                   1970: *
                   1971: *      7)   REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
                   1972: *           ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
                   1973: *
                   1974: *      APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
                   1975: *      AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
                   1976: *      OF FIELDS WILL NOT REQUIRE CHANGES.
                   1977:        EJC
                   1978: *
                   1979: *      COMMON FIELDS FOR FUNCTION BLOCKS
                   1980: *
                   1981: *      BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
                   1982: *      COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
                   1983: *
                   1984: *           +------------------------------------+
                   1985: *           I                FCODE               I
                   1986: *           +------------------------------------+
                   1987: *           I                FARGS               I
                   1988: *           +------------------------------------+
                   1989: *           /                                    /
                   1990: *           /       REST OF FUNCTION BLOCK       /
                   1991: *           /                                    /
                   1992: *           +------------------------------------+
                   1993: *
                   1994: FCODE  EQU  0                POINTER TO CODE FOR FUNCTION
                   1995: FARGS  EQU  1                NUMBER OF ARGUMENTS
                   1996: *
                   1997: *      FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
                   1998: *      PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
                   1999: *
                   2000: *      FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
                   2001: *      NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
                   2002: *      DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
                   2003: *      FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
                   2004: *      A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
                   2005: *      VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
                   2006: *
                   2007: *      THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
                   2008: *
                   2009: *      FFBLK                 FIELD FUNCTION
                   2010: *      DFBLK                 DATATYPE FUNCTION
                   2011: *      PFBLK                 PROGRAM DEFINED FUNCTION
                   2012: *      EFBLK                 EXTERNAL LOADED FUNCTION
                   2013:        EJC
                   2014: *
                   2015: *      IDENTIFICATION FIELD
                   2016: *
                   2017: *
                   2018: *      ID   FIELD
                   2019: *
                   2020: *      CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
                   2021: *      OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
                   2022: *      IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
                   2023: *      ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
                   2024: *
                   2025: IDVAL  EQU  1                ID VALUE FIELD
                   2026: *
                   2027: *      THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
                   2028: *
                   2029: *      ARBLK                 ARRAY
                   2030: .IF    .CNBF
                   2031: .ELSE
                   2032: *      BCBLK                 BUFFER CONTROL BLOCK
                   2033: .FI
                   2034: *      PDBLK                 PROGRAM DEFINED DATATYPE
                   2035: *      TBBLK                 TABLE
                   2036: *      VCBLK                 VECTOR BLOCK (ARRAY)
                   2037: *
                   2038: *      NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
                   2039: *      HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
                   2040:        EJC
                   2041: *
                   2042: *      ARRAY BLOCK (ARBLK)
                   2043: *
                   2044: *      AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
                   2045: *      WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
                   2046: *      AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
                   2047: *      (S$CNV) OR ARRAY (S$ARR).
                   2048: *
                   2049: *           +------------------------------------+
                   2050: *           I                ARTYP               I
                   2051: *           +------------------------------------+
                   2052: *           I                IDVAL               I
                   2053: *           +------------------------------------+
                   2054: *           I                ARLEN               I
                   2055: *           +------------------------------------+
                   2056: *           I                AROFS               I
                   2057: *           +------------------------------------+
                   2058: *           I                ARNDM               I
                   2059: *           +------------------------------------+
                   2060: *           *                ARLBD               *
                   2061: *           +------------------------------------+
                   2062: *           *                ARDIM               *
                   2063: *           +------------------------------------+
                   2064: *           *                                    *
                   2065: *           * ABOVE 2 FLDS REPEATED FOR EACH DIM *
                   2066: *           *                                    *
                   2067: *           +------------------------------------+
                   2068: *           I                ARPRO               I
                   2069: *           +------------------------------------+
                   2070: *           /                                    /
                   2071: *           /                ARVLS               /
                   2072: *           /                                    /
                   2073: *           +------------------------------------+
                   2074:        EJC
                   2075: *
                   2076: *      ARRAY BLOCK (CONTINUED)
                   2077: *
                   2078: ARTYP  EQU  0                POINTER TO DUMMY ROUTINE B$ART
                   2079: ARLEN  EQU  IDVAL+1          LENGTH OF ARBLK IN BYTES
                   2080: AROFS  EQU  ARLEN+1          OFFSET IN ARBLK TO ARPRO FIELD
                   2081: ARNDM  EQU  AROFS+1          NUMBER OF DIMENSIONS
                   2082: ARLBD  EQU  ARNDM+1          LOW BOUND (FIRST SUBSCRIPT)
                   2083: ARDIM  EQU  ARLBD+CFP$I      DIMENSION (FIRST SUBSCRIPT)
                   2084: ARLB2  EQU  ARDIM+CFP$I      LOW BOUND (SECOND SUBSCRIPT)
                   2085: ARDM2  EQU  ARLB2+CFP$I      DIMENSION (SECOND SUBSCRIPT)
                   2086: ARPRO  EQU  ARDIM+CFP$I      ARRAY PROTOTYPE (ONE DIMENSION)
                   2087: ARVLS  EQU  ARPRO+1          START OF VALUES (ONE DIMENSION)
                   2088: ARPR2  EQU  ARDM2+CFP$I      ARRAY PROTOTYPE (TWO DIMENSIONS)
                   2089: ARVL2  EQU  ARPR2+1          START OF VALUES (TWO DIMENSIONS)
                   2090: ARSI$  EQU  ARLBD            NUMBER OF STANDARD FIELDS IN BLOCK
                   2091: ARDMS  EQU  ARLB2-ARLBD      SIZE OF INFO FOR ONE SET OF BOUNDS
                   2092: *
                   2093: *      THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
                   2094: *      VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
                   2095: *
                   2096: *      THE LENGTH OF AN ARBLK IN BYTES MAY NOT EXCEED MXLEN.
                   2097: *      THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
                   2098: *
                   2099: *      THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
                   2100: *      CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
                   2101: .IF    .CNBF
                   2102: .ELSE
                   2103: *
                   2104: *      BUFFER CONTROL BLOCK (BCBLK)
                   2105: *
                   2106: *      A BCBLK IS BUILT FOR EVERY BFBLK.
                   2107: *
                   2108: *           +------------------------------------+
                   2109: *           I                BCTYP               I
                   2110: *           +------------------------------------+
                   2111: *           I                IDVAL               I
                   2112: *           +------------------------------------+
                   2113: *           I                BCLEN               I
                   2114: *           +------------------------------------+
                   2115: *           I                BCBUF               I
                   2116: *           +------------------------------------+
                   2117: *
                   2118: BCTYP  EQU  0                PTR TO DUMMY ROUTINE B$BCT
                   2119: BCLEN  EQU  IDVAL+1          DEFINED BUFFER LENGTH
                   2120: BCBUF  EQU  BCLEN+1          PTR TO BFBLK
                   2121: BCSI$  EQU  BCBUF+1          SIZE OF BCBLK
                   2122: *
                   2123: *      A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
                   2124: *      THE REASON FOR NOT STORING THIS DATA DIRECTLY
                   2125: *      IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
                   2126: *      MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
                   2127: *      THUS FACILITATING TRANSPARENT STRING OPERATIONS
                   2128: *      (FOR THE MOST PART).  SPECIFICALLY, CFP$F IS THE
                   2129: *      SAME FOR A BFBLK AS FOR AN SCBLK.  BY CONVENTION,
                   2130: *      WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
                   2131: *      IS POINTED TO.
                   2132: *
                   2133: *      THE CORRESPONDING BFBLK IS POINTED TO BY THE
                   2134: *      BCBUF POINTER IN THE BCBLK.
                   2135: *
                   2136: *      BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
                   2137: *      ARRAY IN THE BFBLK.  CHARACTERS FOLLOWING THE OFFSET
                   2138: *      OF BCLEN ARE UNDEFINED.
                   2139: *
                   2140:        EJC
                   2141: *
                   2142: *      STRING BUFFER BLOCK (BFBLK)
                   2143: *
                   2144: *      A BFBLK IS BUILT BY A CALL TO BUFFER(...)
                   2145: *
                   2146: *           +------------------------------------+
                   2147: *           I                BFTYP               I
                   2148: *           +------------------------------------+
                   2149: *           I                BFALC               I
                   2150: *           +------------------------------------+
                   2151: *           /                                    /
                   2152: *           /                BFCHR               /
                   2153: *           /                                    /
                   2154: *           +------------------------------------+
                   2155: *
                   2156: BFTYP  EQU  0                PTR TO DUMMY ROUTINE B$BFT
                   2157: BFALC  EQU  BFTYP+1          ALLOCATED SIZE OF BUFFER
                   2158: BFCHR  EQU  BFALC+1          CHARACTERS OF STRING
                   2159: BFSI$  EQU  BFCHR            SIZE OF STANDARD FIELDS IN BFBLK
                   2160: *
                   2161: *      THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
                   2162: *      THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
                   2163: *      (CHARACTER) PADDED.  ANY TRAILING ALLOCATION PAST THE
                   2164: *      WORD CONTAINING THE LAST CHARACTER CONTAINS
                   2165: *      UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
                   2166: *
                   2167: *      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
                   2168: *      IS GIVEN BY CFP$F, AS WITH AN SCBLK.  HOWEVER, THE
                   2169: *      OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
                   2170: *      IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
                   2171: *      DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
                   2172: *
                   2173: *      THE VALUE OF BFALC MAY NOT EXCEED MXLEN.  THE VALUE OF
                   2174: *      BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
                   2175: *
                   2176: .FI
                   2177:        EJC
                   2178: *
                   2179: *      CODE CONSTRUCTION BLOCK (CCBLK)
                   2180: *
                   2181: *      AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
                   2182: *      WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
                   2183: *
                   2184: *           +------------------------------------+
                   2185: *           I                CCTYP               I
                   2186: *           +------------------------------------+
                   2187: *           I                CCLEN               I
                   2188: *           +------------------------------------+
                   2189: *           I                CCUSE               I
                   2190: *           +------------------------------------+
                   2191: *           /                                    /
                   2192: *           /                CCCOD               /
                   2193: *           /                                    /
                   2194: *           +------------------------------------+
                   2195: *
                   2196: CCTYP  EQU  0                POINTER TO DUMMY ROUTINE B$CCT
                   2197: CCLEN  EQU  CCTYP+1          LENGTH OF CCBLK IN BYTES
                   2198: CCUSE  EQU  CCLEN+1          OFFSET PAST LAST USED WORD (BYTES)
                   2199: CCCOD  EQU  CCUSE+1          START OF GENERATED CODE IN BLOCK
                   2200: *
                   2201: *      THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
                   2202: *      THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
                   2203: *      ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
                   2204:        EJC
                   2205: *
                   2206: *      CODE BLOCK (CDBLK)
                   2207: *
                   2208: *      A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
                   2209: *      THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
                   2210: *
                   2211: *           +------------------------------------+
                   2212: *           I                CDJMP               I
                   2213: *           +------------------------------------+
                   2214: *           I                CDSTM               I
                   2215: *           +------------------------------------+
                   2216: *           I                CDLEN               I
                   2217: *           +------------------------------------+
                   2218: *           I                CDFAL               I
                   2219: *           +------------------------------------+
                   2220: *           /                                    /
                   2221: *           /                CDCOD               /
                   2222: *           /                                    /
                   2223: *           +------------------------------------+
                   2224: *
                   2225: CDJMP  EQU  0                PTR TO ROUTINE TO EXECUTE STATEMENT
                   2226: CDSTM  EQU  CDJMP+1          STATEMENT NUMBER
                   2227: CDLEN  EQU  OFFS2            LENGTH OF CDBLK IN BYTES
                   2228: CDFAL  EQU  OFFS3            FAILURE EXIT (SEE BELOW)
                   2229: CDCOD  EQU  CDFAL+1          EXECUTABLE PSEUDO-CODE
                   2230: CDSI$  EQU  CDCOD            NUMBER OF STANDARD FIELDS IN CDBLK
                   2231: *
                   2232: *      CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
                   2233: *
                   2234: *      CDJMP, CDFAL ARE SET AS FOLLOWS.
                   2235: *
                   2236: *      1)   IF THE FAILURE EXIT IS THE NEXT STATEMENT
                   2237: *
                   2238: *           CDJMP = B$CDS
                   2239: *           CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
                   2240: *
                   2241: *      2)   IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
                   2242: *
                   2243: *           CDJMP = B$CDS
                   2244: *           CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
                   2245: *
                   2246: *      3)   IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
                   2247: *
                   2248: *           CDJMP = B$CDS
                   2249: *           CDFAL = O$UNF
                   2250: *
                   2251: *      4)   IF THE FAILURE EXIT IS COMPLEX OR DIRECT
                   2252: *
                   2253: *           CDJMP = B$CDC
                   2254: *           CDFAL IS THE OFFSET TO THE O$GOF WORD
                   2255:        EJC
                   2256: *
                   2257: *      CODE BLOCK (CONTINUED)
                   2258: *
                   2259: *      CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
                   2260: *      THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
                   2261: *      ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
                   2262: *      THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
                   2263: *      BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
                   2264: *      CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
                   2265: *      SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
                   2266: *
                   2267: *      GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
                   2268: *
                   2269: *      EXPRESSION            POINTER TO EXBLK OR SEBLK
                   2270: *
                   2271: *      INTEGER CONSTANT      POINTER TO ICBLK
                   2272: *
                   2273: *      NULL CONSTANT         POINTER TO NULLS
                   2274: *
                   2275: *      PATTERN               (RESULTING FROM PREEVALUATION)
                   2276: *                            =O$LPT
                   2277: *                            POINTER TO P0BLK,P1BLK OR P2BLK
                   2278: *
                   2279: *      REAL CONSTANT         POINTER TO RCBLK
                   2280: *
                   2281: *      STRING CONSTANT       POINTER TO SCBLK
                   2282: *
                   2283: *      VARIABLE              POINTER TO VRGET FIELD OF VRBLK
                   2284: *
                   2285: *      ADDITION              VALUE CODE FOR LEFT OPERAND
                   2286: *                            VALUE CODE FOR RIGHT OPERAND
                   2287: *                            =O$ADD
                   2288: *
                   2289: *      AFFIRMATION           VALUE CODE FOR OPERAND
                   2290: *                            =O$AFF
                   2291: *
                   2292: *      ALTERNATION           VALUE CODE FOR LEFT OPERAND
                   2293: *                            VALUE CODE FOR RIGHT OPERAND
                   2294: *                            =O$ALT
                   2295: *
                   2296: *      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
                   2297: *                            VALUE CODE FOR ARRAY OPERAND
                   2298: *                            VALUE CODE FOR SUBSCRIPT OPERAND
                   2299: *                            =O$AOV
                   2300: *
                   2301: *                            (CASE OF MORE THAN ONE SUBSCRIPT)
                   2302: *                            VALUE CODE FOR ARRAY OPERAND
                   2303: *                            VALUE CODE FOR FIRST SUBSCRIPT
                   2304: *                            VALUE CODE FOR SECOND SUBSCRIPT
                   2305: *                            ...
                   2306: *                            VALUE CODE FOR LAST SUBSCRIPT
                   2307: *                            =O$AMV
                   2308: *                            NUMBER OF SUBSCRIPTS
                   2309:        EJC
                   2310: *
                   2311: *      CODE BLOCK (CONTINUED)
                   2312: *
                   2313: *      ASSIGNMENT            (TO NATURAL VARIABLE)
                   2314: *                            VALUE CODE FOR RIGHT OPERAND
                   2315: *                            POINTER TO VRSTO FIELD OF VRBLK
                   2316: *
                   2317: *                            (TO ANY OTHER VARIABLE)
                   2318: *                            NAME CODE FOR LEFT OPERAND
                   2319: *                            VALUE CODE FOR RIGHT OPERAND
                   2320: *                            =O$ASS
                   2321: *
                   2322: *      COMPILE ERROR         =O$CER
                   2323: *
                   2324: *
                   2325: *      COMPLEMENTATION       VALUE CODE FOR OPERAND
                   2326: *                            =O$COM
                   2327: *
                   2328: *      CONCATENATION         (CASE OF PRED FUNC LEFT OPERAND)
                   2329: *                            VALUE CODE FOR LEFT OPERAND
                   2330: *                            =O$POP
                   2331: *                            VALUE CODE FOR RIGHT OPERAND
                   2332: *
                   2333: *                            (ALL OTHER CASES)
                   2334: *                            VALUE CODE FOR LEFT OPERAND
                   2335: *                            VALUE CODE FOR RIGHT OPERAND
                   2336: *                            =O$CNC
                   2337: *
                   2338: *      CURSOR ASSIGNMENT     NAME CODE FOR OPERAND
                   2339: *                            =O$CAS
                   2340: *
                   2341: *      DIVISION              VALUE CODE FOR LEFT OPERAND
                   2342: *                            VALUE CODE FOR RIGHT OPERAND
                   2343: *                            =O$DVD
                   2344: *
                   2345: *      EXPONENTIATION        VALUE CODE FOR LEFT OPERAND
                   2346: *                            VALUE CODE FOR RIGHT OPERAND
                   2347: *                            =O$EXP
                   2348: *
                   2349: *      FUNCTION CALL         (CASE OF CALL TO SYSTEM FUNCTION)
                   2350: *                            VALUE CODE FOR FIRST ARGUMENT
                   2351: *                            VALUE CODE FOR SECOND ARGUMENT
                   2352: *                            ...
                   2353: *                            VALUE CODE FOR LAST ARGUMENT
                   2354: *                            POINTER TO SVFNC FIELD OF SVBLK
                   2355: *
                   2356:        EJC
                   2357: *
                   2358: *      CODE BLOCK (CONTINUED)
                   2359: *
                   2360: *      FUNCTION CALL         (CASE OF NON-SYSTEM FUNCTION 1 ARG)
                   2361: *                            VALUE CODE FOR ARGUMENT
                   2362: *                            =O$FNS
                   2363: *                            POINTER TO VRBLK FOR FUNCTION
                   2364: *
                   2365: *                            (NON-SYSTEM FUNCTION, GT 1 ARG)
                   2366: *                            VALUE CODE FOR FIRST ARGUMENT
                   2367: *                            VALUE CODE FOR SECOND ARGUMENT
                   2368: *                            ...
                   2369: *                            VALUE CODE FOR LAST ARGUMENT
                   2370: *                            =O$FNC
                   2371: *                            NUMBER OF ARGUMENTS
                   2372: *                            POINTER TO VRBLK FOR FUNCTION
                   2373: *
                   2374: *      IMMEDIATE ASSIGNMENT  VALUE CODE FOR LEFT OPERAND
                   2375: *                            NAME CODE FOR RIGHT OPERAND
                   2376: *                            =O$IMA
                   2377: *
                   2378: *      INDIRECTION           VALUE CODE FOR OPERAND
                   2379: *                            =O$INV
                   2380: *
                   2381: *      INTERROGATION         VALUE CODE FOR OPERAND
                   2382: *                            =O$INT
                   2383: *
                   2384: *      KEYWORD REFERENCE     NAME CODE FOR OPERAND
                   2385: *                            =O$KWV
                   2386: *
                   2387: *      MULTIPLICATION        VALUE CODE FOR LEFT OPERAND
                   2388: *                            VALUE CODE FOR RIGHT OPERAND
                   2389: *                            =O$MLT
                   2390: *
                   2391: *      NAME REFERENCE        (NATURAL VARIABLE CASE)
                   2392: *                            POINTER TO NMBLK FOR NAME
                   2393: *
                   2394: *                            (ALL OTHER CASES)
                   2395: *                            NAME CODE FOR OPERAND
                   2396: *                            =O$NAM
                   2397: *
                   2398: *      NEGATION              =O$NTA
                   2399: *                            CDBLK OFFSET OF O$NTC WORD
                   2400: *                            VALUE CODE FOR OPERAND
                   2401: *                            =O$NTB
                   2402: *                            =O$NTC
                   2403:        EJC
                   2404: *
                   2405: *      CODE BLOCK (CONTINUED)
                   2406: *
                   2407: *      PATTERN ASSIGNMENT    VALUE CODE FOR LEFT OPERAND
                   2408: *                            NAME CODE FOR RIGHT OPERAND
                   2409: *                            =O$PAS
                   2410: *
                   2411: *      PATTERN MATCH         VALUE CODE FOR LEFT OPERAND
                   2412: *                            VALUE CODE FOR RIGHT OPERAND
                   2413: *                            =O$PMV
                   2414: *
                   2415: *      PATTERN REPLACEMENT   NAME CODE FOR SUBJECT
                   2416: *                            VALUE CODE FOR PATTERN
                   2417: *                            =O$PMN
                   2418: *                            VALUE CODE FOR REPLACEMENT
                   2419: *                            =O$RPL
                   2420: *
                   2421: *      SELECTION             (FOR FIRST ALTERNATIVE)
                   2422: *                            =O$SLA
                   2423: *                            CDBLK OFFSET TO NEXT O$SLC WORD
                   2424: *                            VALUE CODE FOR FIRST ALTERNATIVE
                   2425: *                            =O$SLB
                   2426: *                            CDBLK OFFSET PAST ALTERNATIVES
                   2427: *
                   2428: *                            (FOR SUBSEQUENT ALTERNATIVES)
                   2429: *                            =O$SLC
                   2430: *                            CDBLK OFFSET TO NEXT O$SLC,O$SLD
                   2431: *                            VALUE CODE FOR ALTERNATIVE
                   2432: *                            =O$SLB
                   2433: *                            OFFSET IN CDBLK PAST ALTERNATIVES
                   2434: *
                   2435: *                            (FOR LAST ALTERNATIVE)
                   2436: *                            =O$SLD
                   2437: *                            VALUE CODE FOR LAST ALTERNATIVE
                   2438: *
                   2439: *      SUBTRACTION           VALUE CODE FOR LEFT OPERAND
                   2440: *                            VALUE CODE FOR RIGHT OPERAND
                   2441: *                            =O$SUB
                   2442:        EJC
                   2443: *
                   2444: *      CODE BLOCK (CONTINUED)
                   2445: *
                   2446: *      GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
                   2447: *
                   2448: *      VARIABLE              =O$LVN
                   2449: *                            POINTER TO VRBLK
                   2450: *
                   2451: *      EXPRESSION            (CASE OF *NATURAL VARIABLE)
                   2452: *                            =O$LVN
                   2453: *                            POINTER TO VRBLK
                   2454: *
                   2455: *                            (ALL OTHER CASES)
                   2456: *                            =O$LEX
                   2457: *                            POINTER TO EXBLK
                   2458: *
                   2459: *
                   2460: *      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
                   2461: *                            VALUE CODE FOR ARRAY OPERAND
                   2462: *                            VALUE CODE FOR SUBSCRIPT OPERAND
                   2463: *                            =O$AON
                   2464: *
                   2465: *                            (CASE OF MORE THAN ONE SUBSCRIPT)
                   2466: *                            VALUE CODE FOR ARRAY OPERAND
                   2467: *                            VALUE CODE FOR FIRST SUBSCRIPT
                   2468: *                            VALUE CODE FOR SECOND SUBSCRIPT
                   2469: *                            ...
                   2470: *                            VALUE CODE FOR LAST SUBSCRIPT
                   2471: *                            =O$AMN
                   2472: *                            NUMBER OF SUBSCRIPTS
                   2473: *
                   2474: *      COMPILE ERROR         =O$CER
                   2475: *
                   2476: *      FUNCTION CALL         (SAME CODE AS FOR VALUE CALL)
                   2477: *                            =O$FNE
                   2478: *
                   2479: *      INDIRECTION           VALUE CODE FOR OPERAND
                   2480: *                            =O$INN
                   2481: *
                   2482: *      KEYWORD REFERENCE     NAME CODE FOR OPERAND
                   2483: *                            =O$KWN
                   2484: *
                   2485: *      ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
                   2486: *
                   2487: *      NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
                   2488: *      GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
                   2489: *      WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
                   2490:        EJC
                   2491: *
                   2492: *      CODE BLOCK (CONTINUED)
                   2493: *
                   2494: *      NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
                   2495: *      FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
                   2496: *
                   2497: *      FIRST COMES THE CODE FOR THE STATEMENT BODY.
                   2498: *      THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
                   2499: *      BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
                   2500: *      NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
                   2501: *      STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
                   2502: *      VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
                   2503: *
                   2504: *                            VALUE CODE FOR LEFT OPERAND
                   2505: *                            VALUE CODE FOR RIGHT OPERAND
                   2506: *                            =O$PMS
                   2507: *
                   2508: *      NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
                   2509: *      SEVERAL CASES AS FOLLOWS.
                   2510: *
                   2511: *      1)   NO SUCCESS GOTO  PTR TO CDBLK FOR NEXT STATEMENT
                   2512: *
                   2513: *      2)   SIMPLE LABEL     PTR TO VRTRA FIELD OF VRBLK
                   2514: *
                   2515: *      3)   COMPLEX GOTO     (CODE BY NAME FOR GOTO OPERAND)
                   2516: *                            =O$GOC
                   2517: *
                   2518: *      4)   DIRECT GOTO      (CODE BY VALUE FOR GOTO OPERAND)
                   2519: *                            =O$GOD
                   2520: *
                   2521: *      FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
                   2522: *      IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
                   2523: *      HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
                   2524: *      CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
                   2525: *      OF THE FOLLOWING.
                   2526: *
                   2527: *      1)   COMPLEX FGOTO    =O$FIF
                   2528: *                            =O$GOF
                   2529: *                            NAME CODE FOR GOTO OPERAND
                   2530: *                            =O$GOC
                   2531: *
                   2532: *      2)   DIRECT FGOTO     =O$FIF
                   2533: *                            =O$GOF
                   2534: *                            VALUE CODE FOR GOTO OPERAND
                   2535: *                            =O$GOD
                   2536: *
                   2537: *      AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
                   2538: *      ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
                   2539: *      NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
                   2540: *      IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
                   2541:        EJC
                   2542: *
                   2543: *      COMPILER BLOCK (CMBLK)
                   2544: *
                   2545: *      A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
                   2546: *      ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
                   2547: *
                   2548: *           +------------------------------------+
                   2549: *           I                CMIDN               I
                   2550: *           +------------------------------------+
                   2551: *           I                CMLEN               I
                   2552: *           +------------------------------------+
                   2553: *           I                CMTYP               I
                   2554: *           +------------------------------------+
                   2555: *           I                CMOPN               I
                   2556: *           +------------------------------------+
                   2557: *           /           CMVLS OR CMROP           /
                   2558: *           /                                    /
                   2559: *           /                CMLOP               /
                   2560: *           /                                    /
                   2561: *           +------------------------------------+
                   2562: *
                   2563: CMIDN  EQU  0                POINTER TO DUMMY ROUTINE B$CMT
                   2564: CMLEN  EQU  CMIDN+1          LENGTH OF CMBLK IN BYTES
                   2565: CMTYP  EQU  CMLEN+1          TYPE (C$XXX, SEE LIST BELOW)
                   2566: CMOPN  EQU  CMTYP+1          OPERAND POINTER (SEE BELOW)
                   2567: CMVLS  EQU  CMOPN+1          OPERAND VALUE POINTERS (SEE BELOW)
                   2568: CMROP  EQU  CMVLS            RIGHT (ONLY) OPERATOR OPERAND
                   2569: CMLOP  EQU  CMVLS+1          LEFT OPERATOR OPERAND
                   2570: CMSI$  EQU  CMVLS            NUMBER OF STANDARD FIELDS IN CMBLK
                   2571: CMUS$  EQU  CMSI$+1          SIZE OF UNARY OPERATOR CMBLK
                   2572: CMBS$  EQU  CMSI$+2          SIZE OF BINARY OPERATOR CMBLK
                   2573: CMAR1  EQU  CMVLS+1          ARRAY SUBSCRIPT POINTERS
                   2574: *
                   2575: *      THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
                   2576: *
                   2577: *      ARRAY REFERENCE       CMOPN = PTR TO ARRAY OPERAND
                   2578: *                            CMVLS = PTRS TO SUBSCRIPT OPERANDS
                   2579: *
                   2580: *      FUNCTION CALL         CMOPN = PTR TO VRBLK FOR FUNCTION
                   2581: *                            CMVLS = PTRS TO ARGUMENT OPERANDS
                   2582: *
                   2583: *      SELECTION             CMOPN = ZERO
                   2584: *                            CMVLS = PTRS TO ALTERNATE OPERANDS
                   2585: *
                   2586: *      UNARY OPERATOR        CMOPN = PTR TO OPERATOR DVBLK
                   2587: *                            CMROP = PTR TO OPERAND
                   2588: *
                   2589: *      BINARY OPERATOR       CMOPN = PTR TO OPERATOR DVBLK
                   2590: *                            CMROP = PTR TO RIGHT OPERAND
                   2591: *                            CMLOP = PTR TO LEFT OPERAND
                   2592:        EJC
                   2593: *
                   2594: *      CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
                   2595: *      AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
                   2596: *
                   2597: C$ARR  EQU  0                ARRAY REFERENCE
                   2598: C$FNC  EQU  C$ARR+1          FUNCTION CALL
                   2599: C$DEF  EQU  C$FNC+1          DEFERRED EXPRESSION (UNARY *)
                   2600: C$IND  EQU  C$DEF+1          INDIRECTION (UNARY $)
                   2601: C$KEY  EQU  C$IND+1          KEYWORD REFERENCE (UNARY AMPERSAND)
                   2602: C$UBO  EQU  C$KEY+1          UNDEFINED BINARY OPERATOR
                   2603: C$UUO  EQU  C$UBO+1          UNDEFINED UNARY OPERATOR
                   2604: C$UO$  EQU  C$UUO+1          TEST VALUE (=C$UUO+1=C$UBO+2)
                   2605: C$$NM  EQU  C$UUO+1          NUMBER OF CODES FOR NAME OPERANDS
                   2606: *
                   2607: *      THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
                   2608: *      CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
                   2609: *
                   2610: C$BVL  EQU  C$UUO+1          BINARY OP WITH VALUE OPERANDS
                   2611: C$UVL  EQU  C$BVL+1          UNARY OPERATOR WITH VALUE OPERAND
                   2612: C$ALT  EQU  C$UVL+1          ALTERNATION (BINARY BAR)
                   2613: C$CNC  EQU  C$ALT+1          CONCATENATION
                   2614: C$CNP  EQU  C$CNC+1          CONCATENATION, NOT PATTERN MATCH
                   2615: C$UNM  EQU  C$CNP+1          UNARY OP WITH NAME OPERAND
                   2616: C$BVN  EQU  C$UNM+1          BINARY OP (OPERANDS BY VALUE, NAME)
                   2617: C$ASS  EQU  C$BVN+1          ASSIGNMENT
                   2618: C$INT  EQU  C$ASS+1          INTERROGATION
                   2619: C$NEG  EQU  C$INT+1          NEGATION (UNARY NOT)
                   2620: C$SEL  EQU  C$NEG+1          SELECTION
                   2621: C$PMT  EQU  C$SEL+1          PATTERN MATCH
                   2622: *
                   2623: C$PR$  EQU  C$BVN            LAST PREEVALUABLE CODE
                   2624: C$$NV  EQU  C$PMT+1          NUMBER OF DIFFERENT CMBLK TYPES
                   2625:        EJC
                   2626: *
                   2627: *      CHARACTER TABLE BLOCK (CTBLK)
                   2628: *
                   2629: *      A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
                   2630: *      TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
                   2631: *      PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
                   2632: *      CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
                   2633: *      ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
                   2634: *      IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
                   2635: *
                   2636: *           +------------------------------------+
                   2637: *           I                CTTYP               I
                   2638: *           +------------------------------------+
                   2639: *           *                                    *
                   2640: *           *                                    *
                   2641: *           *                CTCHS               *
                   2642: *           *                                    *
                   2643: *           *                                    *
                   2644: *           +------------------------------------+
                   2645: *
                   2646: CTTYP  EQU  0                POINTER TO DUMMY ROUTINE B$CTT
                   2647: CTCHS  EQU  CTTYP+1          START OF CHARACTER TABLE WORDS
                   2648: CTSI$  EQU  CTCHS+CFP$A      NUMBER OF WORDS IN CTBLK
                   2649: *
                   2650: *      CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
                   2651: *      BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
                   2652: *      INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
                   2653: *      A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
                   2654: *      A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
                   2655: *      IF THE CHARACTER IS NOT PRESENT.
                   2656:        EJC
                   2657: *
                   2658: *      DATATYPE FUNCTION BLOCK (DFBLK)
                   2659: *
                   2660: *      A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
                   2661: *      OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
                   2662: *      SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
                   2663: *
                   2664: *      NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
                   2665: *      LENGTH IS GOT FROM DFLEN FIELD.  IF DFBLK WAS IN DYNAMIC
                   2666: *      STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
                   2667: *      COLLECTION.  SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
                   2668: *      IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
                   2669: *      GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
                   2670: *      LIKELY TO BE PRESENT IN LARGE NUMBERS.
                   2671: *
                   2672: *           +------------------------------------+
                   2673: *           I                FCODE               I
                   2674: *           +------------------------------------+
                   2675: *           I                FARGS               I
                   2676: *           +------------------------------------+
                   2677: *           I                DFLEN               I
                   2678: *           +------------------------------------+
                   2679: *           I                DFPDL               I
                   2680: *           +------------------------------------+
                   2681: *           I                DFNAM               I
                   2682: *           +------------------------------------+
                   2683: *           /                                    /
                   2684: *           /                DFFLD               /
                   2685: *           /                                    /
                   2686: *           +------------------------------------+
                   2687: *
                   2688: DFLEN  EQU  FARGS+1          LENGTH OF DFBLK IN BYTES
                   2689: DFPDL  EQU  DFLEN+1          LENGTH OF CORRESPONDING PDBLK
                   2690: DFNAM  EQU  DFPDL+1          POINTER TO SCBLK FOR DATATYPE NAME
                   2691: DFFLD  EQU  DFNAM+1          START OF VRBLK PTRS FOR FIELD NAMES
                   2692: DFFLB  EQU  DFFLD-1          OFFSET BEHIND DFFLD FOR FIELD FUNC
                   2693: DFSI$  EQU  DFFLD            NUMBER OF STANDARD FIELDS IN DFBLK
                   2694: *
                   2695: *      THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
                   2696: *
                   2697: *      FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
                   2698:        EJC
                   2699: *
                   2700: *      DOPE VECTOR BLOCK (DVBLK)
                   2701: *
                   2702: *      A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
                   2703: *      THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
                   2704: *
                   2705: *           +------------------------------------+
                   2706: *           I                DVOPN               I
                   2707: *           +------------------------------------+
                   2708: *           I                DVTYP               I
                   2709: *           +------------------------------------+
                   2710: *           I                DVLPR               I
                   2711: *           +------------------------------------+
                   2712: *           I                DVRPR               I
                   2713: *           +------------------------------------+
                   2714: *
                   2715: DVOPN  EQU  0                ENTRY ADDRESS (PTR TO O$XXX)
                   2716: DVTYP  EQU  DVOPN+1          TYPE CODE (C$XXX, SEE CMBLK)
                   2717: DVLPR  EQU  DVTYP+1          LEFT PRECEDENCE (LLXXX, SEE BELOW)
                   2718: DVRPR  EQU  DVLPR+1          RIGHT PRECEDENCE (RRXXX, SEE BELOW)
                   2719: DVUS$  EQU  DVLPR+1          SIZE OF UNARY OPERATOR DV
                   2720: DVBS$  EQU  DVRPR+1          SIZE OF BINARY OPERATOR DV
                   2721: DVUBS  EQU  DVUS$+DVBS$      SIZE OF UNOP + BINOP (SEE SCANE)
                   2722: *
                   2723: *      THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
                   2724: *      FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
                   2725: *
                   2726: *      THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
                   2727: *      ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
                   2728: *
                   2729: *      FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
                   2730: *      FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
                   2731: *      BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
                   2732: *      FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
                   2733: *      REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
                   2734: *
                   2735: *      THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
                   2736: *      THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
                   2737: *      PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
                   2738: *
                   2739: *      THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
                   2740: *      THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
                   2741: *      THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
                   2742: *
                   2743: *      HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
                   2744: *      CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
                   2745: *      (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
                   2746: *      ASSOCIATIVE BINARY OPERATORS.
                   2747: *
                   2748: *      THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
                   2749: *      ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
                   2750: *      CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
                   2751:        EJC
                   2752: *
                   2753: *      TABLE OF OPERATOR PRECEDENCE VALUES
                   2754: *
                   2755: RRASS  EQU  10               RIGHT     EQUAL
                   2756: LLASS  EQU  00               LEFT      EQUAL
                   2757: RRPMT  EQU  20               RIGHT     QUESTION MARK
                   2758: LLPMT  EQU  30               LEFT      QUESTION MARK
                   2759: RRAMP  EQU  40               RIGHT     AMPERSAND
                   2760: LLAMP  EQU  50               LEFT      AMPERSAND
                   2761: RRALT  EQU  70               RIGHT     VERTICAL BAR
                   2762: LLALT  EQU  60               LEFT      VERTICAL BAR
                   2763: RRCNC  EQU  90               RIGHT     BLANK
                   2764: LLCNC  EQU  80               LEFT      BLANK
                   2765: RRATS  EQU  110              RIGHT     AT
                   2766: LLATS  EQU  100              LEFT      AT
                   2767: RRPLM  EQU  120              RIGHT     PLUS, MINUS
                   2768: LLPLM  EQU  130              LEFT      PLUS, MINUS
                   2769: RRNUM  EQU  140              RIGHT     NUMBER
                   2770: LLNUM  EQU  150              LEFT      NUMBER
                   2771: RRDVD  EQU  160              RIGHT     SLASH
                   2772: LLDVD  EQU  170              LEFT      SLASH
                   2773: RRMLT  EQU  180              RIGHT     ASTERISK
                   2774: LLMLT  EQU  190              LEFT      ASTERISK
                   2775: RRPCT  EQU  200              RIGHT     PERCENT
                   2776: LLPCT  EQU  210              LEFT      PERCENT
                   2777: RREXP  EQU  230              RIGHT     EXCLAMATION
                   2778: LLEXP  EQU  220              LEFT      EXCLAMATION
                   2779: RRDLD  EQU  240              RIGHT     DOLLAR, DOT
                   2780: LLDLD  EQU  250              LEFT      DOLLAR, DOT
                   2781: RRNOT  EQU  270              RIGHT     NOT
                   2782: LLNOT  EQU  260              LEFT      NOT
                   2783: LLUNO  EQU  999              LEFT      ALL UNARY OPERATORS
                   2784: *
                   2785: *      PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
                   2786: *      FOLLOWING EXCEPTIONS.
                   2787: *
                   2788: *      1)   BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
                   2789: *           IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
                   2790: *
                   2791: *      2)   ALTERNATION AND CONCATENATION ARE MADE RIGHT
                   2792: *           ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
                   2793: *           CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
                   2794: *           IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
                   2795: *
                   2796: *      3)   THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
                   2797: *           OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
                   2798: *           MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
                   2799:        EJC
                   2800: *
                   2801: *      EXTERNAL FUNCTION BLOCK (EFBLK)
                   2802: *
                   2803: *      AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
                   2804: *      OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
                   2805: *
                   2806: *           +------------------------------------+
                   2807: *           I                FCODE               I
                   2808: *           +------------------------------------+
                   2809: *           I                FARGS               I
                   2810: *           +------------------------------------+
                   2811: *           I                EFLEN               I
                   2812: *           +------------------------------------+
                   2813: *           I                EFUSE               I
                   2814: *           +------------------------------------+
                   2815: *           I                EFCOD               I
                   2816: *           +------------------------------------+
                   2817: *           I                EFVAR               I
                   2818: *           +------------------------------------+
                   2819: *           I                EFRSL               I
                   2820: *           +------------------------------------+
                   2821: *           /                                    /
                   2822: *           /                EFTAR               /
                   2823: *           /                                    /
                   2824: *           +------------------------------------+
                   2825: *
                   2826: EFLEN  EQU  FARGS+1          LENGTH OF EFBLK IN BYTES
                   2827: EFUSE  EQU  EFLEN+1          USE COUNT (FOR OPSYN)
                   2828: EFCOD  EQU  EFUSE+1          PTR TO CODE (FROM SYSLD)
                   2829: EFVAR  EQU  EFCOD+1          PTR TO ASSOCIATED VRBLK
                   2830: EFRSL  EQU  EFVAR+1          RESULT TYPE (SEE BELOW)
                   2831: EFTAR  EQU  EFRSL+1          ARGUMENT TYPES (SEE BELOW)
                   2832: EFSI$  EQU  EFTAR            NUMBER OF STANDARD FIELDS IN EFBLK
                   2833: *
                   2834: *      THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
                   2835: *
                   2836: *      EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
                   2837: *      IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
                   2838: *      WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
                   2839: *
                   2840: *      EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
                   2841: *
                   2842: *           0                TYPE IS UNCONVERTED
                   2843: *           1                TYPE IS STRING
                   2844: *           2                TYPE IS INTEGER
                   2845: *           3                TYPE IS REAL
                   2846:        EJC
                   2847: *
                   2848: *      EXPRESSION VARIABLE BLOCK (EVBLK)
                   2849: *
                   2850: *      IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
                   2851: *      ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
                   2852: *      EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
                   2853: *      ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
                   2854: *      OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
                   2855: *      AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
                   2856: *
                   2857: *           +------------------------------------+
                   2858: *           I                EVTYP               I
                   2859: *           +------------------------------------+
                   2860: *           I                EVEXP               I
                   2861: *           +------------------------------------+
                   2862: *           I                EVVAR               I
                   2863: *           +------------------------------------+
                   2864: *
                   2865: EVTYP  EQU  0                POINTER TO DUMMY ROUTINE B$EVT
                   2866: EVEXP  EQU  EVTYP+1          POINTER TO EXBLK FOR EXPRESSION
                   2867: EVVAR  EQU  EVEXP+1          POINTER TO TRBEV DUMMY TRBLK
                   2868: EVSI$  EQU  EVVAR+1          SIZE OF EVBLK
                   2869: *
                   2870: *      THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
                   2871: *      BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
                   2872: *      VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
                   2873: *
                   2874: *      NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
                   2875: *      EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
                   2876: *      VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
                   2877:        EJC
                   2878: *
                   2879: *      EXPRESSION BLOCK (EXBLK)
                   2880: *
                   2881: *      AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
                   2882: *      REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
                   2883: *      DURING EXECUTION OF A PROGRAM.
                   2884: *
                   2885: *           +------------------------------------+
                   2886: *           I                EXTYP               I
                   2887: *           +------------------------------------+
                   2888: *           I                EXSTM               I
                   2889: *           +------------------------------------+
                   2890: *           I                EXLEN               I
                   2891: *           +------------------------------------+
                   2892: *           I                EXFLC               I
                   2893: *           +------------------------------------+
                   2894: *           /                                    /
                   2895: *           /                EXCOD               /
                   2896: *           /                                    /
                   2897: *           +------------------------------------+
                   2898: *
                   2899: EXTYP  EQU  0                PTR TO ROUTINE B$EXL TO LOAD EXPR
                   2900: EXSTM  EQU  CDSTM            STORES STMNT NO. DURING EVALUATION
                   2901: EXLEN  EQU  EXSTM+1          LENGTH OF EXBLK IN BYTES
                   2902: EXFLC  EQU  EXLEN+1          FAILURE CODE (=O$FEX)
                   2903: EXCOD  EQU  EXFLC+1          PSEUDO-CODE FOR EXPRESSION
                   2904: EXSI$  EQU  EXCOD            NUMBER OF STANDARD FIELDS IN EXBLK
                   2905: *
                   2906: *      THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
                   2907: *      EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
                   2908: *      OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
                   2909: *
                   2910: *      IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
                   2911: *
                   2912: *                            (CODE FOR EXPR BY NAME)
                   2913: *                            =O$RNM
                   2914: *
                   2915: *      IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
                   2916: *
                   2917: *                            (CODE FOR EXPR BY VALUE)
                   2918: *                            =O$RVL
                   2919:        EJC
                   2920: *
                   2921: *      FIELD FUNCTION BLOCK (FFBLK)
                   2922: *
                   2923: *      A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
                   2924: *      OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
                   2925: *      A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
                   2926: *
                   2927: *           +------------------------------------+
                   2928: *           I                FCODE               I
                   2929: *           +------------------------------------+
                   2930: *           I                FARGS               I
                   2931: *           +------------------------------------+
                   2932: *           I                FFDFP               I
                   2933: *           +------------------------------------+
                   2934: *           I                FFNXT               I
                   2935: *           +------------------------------------+
                   2936: *           I                FFOFS               I
                   2937: *           +------------------------------------+
                   2938: *
                   2939: FFDFP  EQU  FARGS+1          POINTER TO ASSOCIATED DFBLK
                   2940: FFNXT  EQU  FFDFP+1          PTR TO NEXT FFBLK ON CHAIN OR ZERO
                   2941: FFOFS  EQU  FFNXT+1          OFFSET (BYTES) TO FIELD IN PDBLK
                   2942: FFSI$  EQU  FFOFS+1          SIZE OF FFBLK IN WORDS
                   2943: *
                   2944: *      THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
                   2945: *
                   2946: *      FARGS ALWAYS CONTAINS ONE.
                   2947: *
                   2948: *      FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
                   2949: *      DATATYPE IS BEING ACCESSED BY THIS CALL.
                   2950: *      FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
                   2951: *
                   2952: *      FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
                   2953: *      IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
                   2954: *
                   2955: *      FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
                   2956: *      IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
                   2957: *      NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
                   2958:        EJC
                   2959: *
                   2960: *      INTEGER CONSTANT BLOCK (ICBLK)
                   2961: *
                   2962: *      AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
                   2963: *      CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
                   2964: *      INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
                   2965: *      FIELD IN A STRING CONSTANT BLOCK)
                   2966: *
                   2967: *           +------------------------------------+
                   2968: *           I                ICGET               I
                   2969: *           +------------------------------------+
                   2970: *           *                ICVAL               *
                   2971: *           +------------------------------------+
                   2972: *
                   2973: ICGET  EQU  0                PTR TO ROUTINE B$ICL TO LOAD INT
                   2974: ICVAL  EQU  ICGET+1          INTEGER VALUE
                   2975: ICSI$  EQU  ICVAL+CFP$I      SIZE OF ICBLK
                   2976: *
                   2977: *      THE LENGTH OF THE ICVAL FIELD IS CFP$I.
                   2978:        EJC
                   2979: *
                   2980: *      KEYWORD VARIABLE BLOCK (KVBLK)
                   2981: *
                   2982: *      A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
                   2983: *      A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
                   2984: *
                   2985: *           +------------------------------------+
                   2986: *           I                KVTYP               I
                   2987: *           +------------------------------------+
                   2988: *           I                KVVAR               I
                   2989: *           +------------------------------------+
                   2990: *           I                KVNUM               I
                   2991: *           +------------------------------------+
                   2992: *
                   2993: KVTYP  EQU  0                POINTER TO DUMMY ROUTINE B$KVT
                   2994: KVVAR  EQU  KVTYP+1          POINTER TO DUMMY BLOCK TRBKV
                   2995: KVNUM  EQU  KVVAR+1          KEYWORD NUMBER
                   2996: KVSI$  EQU  KVNUM+1          SIZE OF KVBLK
                   2997: *
                   2998: *      THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
                   2999: *      BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
                   3000: *      VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
                   3001:        EJC
                   3002: *
                   3003: *      NAME BLOCK (NMBLK)
                   3004: *
                   3005: *      A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
                   3006: *      A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
                   3007: *
                   3008: *           +------------------------------------+
                   3009: *           I                NMTYP               I
                   3010: *           +------------------------------------+
                   3011: *           I                NMBAS               I
                   3012: *           +------------------------------------+
                   3013: *           I                NMOFS               I
                   3014: *           +------------------------------------+
                   3015: *
                   3016: NMTYP  EQU  0                PTR TO ROUTINE B$NML TO LOAD NAME
                   3017: NMBAS  EQU  NMTYP+1          BASE POINTER FOR VARIABLE
                   3018: NMOFS  EQU  NMBAS+1          OFFSET FOR VARIABLE
                   3019: NMSI$  EQU  NMOFS+1          SIZE OF NMBLK
                   3020: *
                   3021: *      THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
                   3022: *      IS FOUND NMOFS BYTES PAST THE ADDRESS IN NMBAS.
                   3023: *
                   3024: *      THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
                   3025: *      CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
                   3026: *      COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
                   3027: *
                   3028: *      A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
                   3029: *      REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
                   3030: *      CASES OF PSEUDO-VARIABLES.
                   3031:        EJC
                   3032: *
                   3033: *      PATTERN BLOCK, NO PARAMETERS (P0BLK)
                   3034: *
                   3035: *      A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
                   3036: *      NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
                   3037: *
                   3038: *           +------------------------------------+
                   3039: *           I                PCODE               I
                   3040: *           +------------------------------------+
                   3041: *           I                PTHEN               I
                   3042: *           +------------------------------------+
                   3043: *
                   3044: PCODE  EQU  0                PTR TO MATCH ROUTINE (P$XXX)
                   3045: PTHEN  EQU  PCODE+1          POINTER TO SUBSEQUENT NODE
                   3046: PASI$  EQU  PTHEN+1          SIZE OF P0BLK
                   3047: *
                   3048: *      PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
                   3049: *      NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
                   3050: *      BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
                   3051: *
                   3052: *      PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
                   3053:        EJC
                   3054: *
                   3055: *      PATTERN BLOCK (ONE PARAMETER)
                   3056: *
                   3057: *      A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
                   3058: *      REQUIRE ONE PARAMETER VALUE.
                   3059: *
                   3060: *           +------------------------------------+
                   3061: *           I                PCODE               I
                   3062: *           +------------------------------------+
                   3063: *           I                PTHEN               I
                   3064: *           +------------------------------------+
                   3065: *           I                PARM1               I
                   3066: *           +------------------------------------+
                   3067: *
                   3068: PARM1  EQU  PTHEN+1          FIRST PARAMETER VALUE
                   3069: PBSI$  EQU  PARM1+1          SIZE OF P1BLK IN WORDS
                   3070: *
                   3071: *      SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
                   3072: *
                   3073: *      PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
                   3074: *      NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
                   3075: *      ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
                   3076: *      FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
                   3077: *      MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
                   3078: *      IS PROCESSED BY THE GARBAGE COLLECTOR.
                   3079:        EJC
                   3080: *
                   3081: *      PATTERN BLOCK (TWO PARAMETERS)
                   3082: *
                   3083: *      A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
                   3084: *      REQUIRE TWO PARAMETER VALUES.
                   3085: *
                   3086: *           +------------------------------------+
                   3087: *           I                PCODE               I
                   3088: *           +------------------------------------+
                   3089: *           I                PTHEN               I
                   3090: *           +------------------------------------+
                   3091: *           I                PARM1               I
                   3092: *           +------------------------------------+
                   3093: *           I                PARM2               I
                   3094: *           +------------------------------------+
                   3095: *
                   3096: PARM2  EQU  PARM1+1          SECOND PARAMETER VALUE
                   3097: PCSI$  EQU  PARM2+1          SIZE OF P2BLK IN WORDS
                   3098: *
                   3099: *      SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
                   3100: *
                   3101: *      PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
                   3102: *      FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
                   3103: *
                   3104: *      PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
                   3105: *      PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
                   3106: *      NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
                   3107:        EJC
                   3108: *
                   3109: *      PROGRAM-DEFINED DATATYPE BLOCK
                   3110: *
                   3111: *      A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
                   3112: *      DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
                   3113: *
                   3114: *           +------------------------------------+
                   3115: *           I                PDTYP               I
                   3116: *           +------------------------------------+
                   3117: *           I                IDVAL               I
                   3118: *           +------------------------------------+
                   3119: *           I                PDDFP               I
                   3120: *           +------------------------------------+
                   3121: *           /                                    /
                   3122: *           /                PDFLD               /
                   3123: *           /                                    /
                   3124: *           +------------------------------------+
                   3125: *
                   3126: PDTYP  EQU  0                PTR TO DUMMY ROUTINE B$PDT
                   3127: PDDFP  EQU  IDVAL+1          PTR TO ASSOCIATED DFBLK
                   3128: PDFLD  EQU  PDDFP+1          START OF FIELD VALUE POINTERS
                   3129: PDFOF  EQU  DFFLD-PDFLD      DIFFERENCE IN OFFSET TO FIELD PTRS
                   3130: PDSI$  EQU  PDFLD            SIZE OF STANDARD FIELDS IN PDBLK
                   3131: PDDFS  EQU  DFSI$-PDSI$      DIFFERENCE IN DFBLK, PDBLK SIZES
                   3132: *
                   3133: *      THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
                   3134: *      AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
                   3135: *      CONTAINS THE LENGTH OF THE PDBLK IN BYTES (FIELD DFPDL).
                   3136: *      PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
                   3137: *
                   3138: *      PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
                   3139: *      THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
                   3140:        EJC
                   3141: *
                   3142: *      PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
                   3143: *
                   3144: *      A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
                   3145: *      AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
                   3146: *
                   3147: *           +------------------------------------+
                   3148: *           I                FCODE               I
                   3149: *           +------------------------------------+
                   3150: *           I                FARGS               I
                   3151: *           +------------------------------------+
                   3152: *           I                PFLEN               I
                   3153: *           +------------------------------------+
                   3154: *           I                PFVBL               I
                   3155: *           +------------------------------------+
                   3156: *           I                PFNLO               I
                   3157: *           +------------------------------------+
                   3158: *           I                PFCOD               I
                   3159: *           +------------------------------------+
                   3160: *           I                PFCTR               I
                   3161: *           +------------------------------------+
                   3162: *           I                PFRTR               I
                   3163: *           +------------------------------------+
                   3164: *           /                                    /
                   3165: *           /                PFARG               /
                   3166: *           /                                    /
                   3167: *           +------------------------------------+
                   3168: *
                   3169: PFLEN  EQU  FARGS+1          LENGTH OF PFBLK IN BYTES
                   3170: PFVBL  EQU  PFLEN+1          POINTER TO VRBLK FOR FUNCTION NAME
                   3171: PFNLO  EQU  PFVBL+1          NUMBER OF LOCALS
                   3172: PFCOD  EQU  PFNLO+1          PTR TO CDBLK FOR FIRST STATEMENT
                   3173: PFCTR  EQU  PFCOD+1          TRBLK PTR IF CALL TRACED ELSE 0
                   3174: PFRTR  EQU  PFCTR+1          TRBLK PTR IF RETURN TRACED ELSE 0
                   3175: PFARG  EQU  PFRTR+1          VRBLK PTRS FOR ARGUMENTS AND LOCALS
                   3176: PFAGB  EQU  PFARG-1          OFFSET BEHIND PFARG FOR ARG, LOCAL
                   3177: PFSI$  EQU  PFARG            NUMBER OF STANDARD FIELDS IN PFBLK
                   3178: *
                   3179: *      THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
                   3180: *
                   3181: *      PFARG IS STORED IN THE FOLLOWING ORDER.
                   3182: *
                   3183: *           ARGUMENTS (LEFT TO RIGHT)
                   3184: *           LOCALS (LEFT TO RIGHT)
                   3185: .IF    .CNRA
                   3186: .ELSE
                   3187:        EJC
                   3188: *
                   3189: *      REAL CONSTANT BLOCK (RCBLK)
                   3190: *
                   3191: *      AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
                   3192: *      CREATED BY A PROGRAM.
                   3193: *
                   3194: *           +------------------------------------+
                   3195: *           I                RCGET               I
                   3196: *           +------------------------------------+
                   3197: *           *                RCVAL               *
                   3198: *           +------------------------------------+
                   3199: *
                   3200: RCGET  EQU  0                PTR TO ROUTINE B$RCL TO LOAD REAL
                   3201: RCVAL  EQU  RCGET+1          REAL VALUE
                   3202: RCSI$  EQU  RCVAL+CFP$R      SIZE OF RCBLK
                   3203: *
                   3204: *      THE LENGTH OF THE RCVAL FIELD IS CFP$R.
                   3205: .FI
                   3206:        EJC
                   3207: *
                   3208: *      STRING CONSTANT BLOCK (SCBLK)
                   3209: *
                   3210: *      AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
                   3211: *      BY A PROGRAM.
                   3212: *
                   3213: *           +------------------------------------+
                   3214: *           I                SCGET               I
                   3215: *           +------------------------------------+
                   3216: *           I                SCLEN               I
                   3217: *           +------------------------------------+
                   3218: *           /                                    /
                   3219: *           /                SCHAR               /
                   3220: *           /                                    /
                   3221: *           +------------------------------------+
                   3222: *
                   3223: SCGET  EQU  0                PTR TO ROUTINE B$SCL TO LOAD STRING
                   3224: SCLEN  EQU  SCGET+1          LENGTH OF STRING IN CHARACTERS
                   3225: SCHAR  EQU  SCLEN+1          CHARACTERS OF STRING
                   3226: SCSI$  EQU  SCHAR            SIZE OF STANDARD FIELDS IN SCBLK
                   3227: *
                   3228: *      THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
                   3229: *      THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
                   3230: *      (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
                   3231: *
                   3232: *      THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
                   3233: *      THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
                   3234: *      CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
                   3235: *
                   3236: *      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
                   3237: *      IS GIVEN IN BYTES BY CFP$F AND THAT THIS VALUE IS
                   3238: *      AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
                   3239: *      NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
                   3240: *      IS GIVEN BY CFP$B*SCHAR.
                   3241:        EJC
                   3242: *
                   3243: *      SIMPLE EXPRESSION BLOCK (SEBLK)
                   3244: *
                   3245: *      AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
                   3246: *      *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
                   3247: *
                   3248: *           +------------------------------------+
                   3249: *           I                SETYP               I
                   3250: *           +------------------------------------+
                   3251: *           I                SEVAR               I
                   3252: *           +------------------------------------+
                   3253: *
                   3254: SETYP  EQU  0                PTR TO ROUTINE B$SEL TO LOAD EXPR
                   3255: SEVAR  EQU  SETYP+1          PTR TO VRBLK FOR VARIABLE
                   3256: SESI$  EQU  SEVAR+1          LENGTH OF SEBLK IN WORDS
                   3257:        EJC
                   3258: *
                   3259: *      STANDARD VARIABLE BLOCK (SVBLK)
                   3260: *
                   3261: *      AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
                   3262: *      VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
                   3263: *
                   3264: *      1)   IT IS THE NAME OF A SYSTEM FUNCTION
                   3265: *      2)   IT HAS AN INITIAL VALUE
                   3266: *      3)   IT HAS A KEYWORD ASSOCIATION
                   3267: *      4)   IT HAS A STANDARD I/O ASSOCIATION
                   3268: *      6)   IT HAS A STANDARD LABEL ASSOCIATION
                   3269: *
                   3270: *      IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
                   3271: *      THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
                   3272: *
                   3273: *           +------------------------------------+
                   3274: *           I                SVBIT               I
                   3275: *           +------------------------------------+
                   3276: *           I                SVLEN               I
                   3277: *           +------------------------------------+
                   3278: *           I                SVCHS               I
                   3279: *           +------------------------------------+
                   3280: *           I                SVKNM               I
                   3281: *           +------------------------------------+
                   3282: *           I                SVFNC               I
                   3283: *           +------------------------------------+
                   3284: *           I                SVNAR               I
                   3285: *           +------------------------------------+
                   3286: *           I                SVLBL               I
                   3287: *           +------------------------------------+
                   3288: *           I                SVVAL               I
                   3289: *           +------------------------------------+
                   3290:        EJC
                   3291: *
                   3292: *      STANDARD VARIABLE BLOCK (CONTINUED)
                   3293: *
                   3294: SVBIT  EQU  0                BIT STRING INDICATING ATTRIBUTES
                   3295: SVLEN  EQU  1                (=SCLEN) LENGTH OF NAME IN CHARS
                   3296: SVCHS  EQU  2                (=SCHAR) CHARACTERS OF NAME
                   3297: SVSI$  EQU  2                NUMBER OF STANDARD FIELDS IN SVBLK
                   3298: SVPRE  EQU  1                SET IF PREEVALUATION PERMITTED
                   3299: SVFFC  EQU  SVPRE+SVPRE      SET ON IF FAST CALL PERMITTED
                   3300: SVCKW  EQU  SVFFC+SVFFC      SET ON IF KEYWORD VALUE CONSTANT
                   3301: SVPRD  EQU  SVCKW+SVCKW      SET ON IF PREDICATE FUNCTION
                   3302: SVNBT  EQU  4                NUMBER OF BITS TO RIGHT OF SVKNM
                   3303: SVKNM  EQU  SVPRD+SVPRD      SET ON IF KEYWORD ASSOCIATION
                   3304: SVFNC  EQU  SVKNM+SVKNM      SET ON IF SYSTEM FUNCTION
                   3305: SVNAR  EQU  SVFNC+SVFNC      SET ON IF SYSTEM FUNCTION
                   3306: SVLBL  EQU  SVNAR+SVNAR      SET ON IF SYSTEM LABEL
                   3307: SVVAL  EQU  SVLBL+SVLBL      SET ON IF PREDEFINED VALUE
                   3308: *
                   3309: *      NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
                   3310: *      TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
                   3311: *
                   3312: *      THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
                   3313: *
                   3314: SVFNF  EQU  SVFNC+SVNAR      FUNCTION WITH NO FAST CALL
                   3315: SVFNN  EQU  SVFNF+SVFFC      FUNCTION WITH FAST CALL, NO PREEVAL
                   3316: SVFNP  EQU  SVFNN+SVPRE      FUNCTION ALLOWING PREEVALUATION
                   3317: SVFPR  EQU  SVFNN+SVPRD      PREDICATE FUNCTION
                   3318: SVFNK  EQU  SVFNN+SVKNM      NO PREEVAL FUNC + KEYWORD
                   3319: SVKWV  EQU  SVKNM+SVVAL      KEYWORD + VALUE
                   3320: SVKWC  EQU  SVCKW+SVKNM      KEYWORD WITH CONSTANT VALUE
                   3321: SVKVC  EQU  SVKWV+SVCKW      CONSTANT KEYWORD + VALUE
                   3322: SVKVL  EQU  SVKVC+SVLBL      CONSTANT KEYWORD + VALUE + LABEL
                   3323: SVFPK  EQU  SVFNP+SVKVC      PREEVAL FCN + CONST KEYWD + VAL
                   3324: *
                   3325: *      THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
                   3326: *      TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
                   3327: *      ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
                   3328: *      MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
                   3329: *      THE CALL MAY GENERATE AN ERROR CONDITION.
                   3330: *
                   3331: *      THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
                   3332: *      FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
                   3333: *      THE ITEM AND APPLY FUNCTIONS FALL OUTSIDE THIS CATEGORY.
                   3334: *
                   3335: *      THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
                   3336: *      A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
                   3337: *
                   3338: *      THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
                   3339: *      ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
                   3340:        EJC
                   3341: *
                   3342: *      SVBLK (CONTINUED)
                   3343: *
                   3344: *      SVKNM                 KEYWORD NUMBER
                   3345: *
                   3346: *           SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
                   3347: *           IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
                   3348: *           KEYWORD NUMBER TABLE GIVEN LATER ON.
                   3349: *
                   3350: *      SVFNC                 SYSTEM FUNCTION POINTER
                   3351: *
                   3352: *           SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
                   3353: *           IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
                   3354: *           FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
                   3355: *           POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
                   3356: *           FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
                   3357: *           THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
                   3358: *           FCODE FIELD FOR THE FUNCTION CALL.
                   3359: *
                   3360: *      SVNAR                 NUMBER OF FUNCTION ARGUMENTS
                   3361: *
                   3362: *           SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
                   3363: *           IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
                   3364: *           TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
                   3365: *           VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
                   3366: *           CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
                   3367: *           THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
                   3368: *           SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
                   3369: *           CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
                   3370: *           USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
                   3371: *           NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
                   3372: *           WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
                   3373: *           PREDEFINED FUNCTIONS USING THIS ARE APPLY AND ITEM.
                   3374: *
                   3375: *      SVLBL                 SYSTEM LABEL POINTER
                   3376: *
                   3377: *           SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
                   3378: *           IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
                   3379: *           THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
                   3380: *           THE SVLBL FIELD OF THE SVBLK.
                   3381: *
                   3382: *      SVVAL                 SYSTEM VALUE POINTER
                   3383: *
                   3384: *           SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
                   3385: *           IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
                   3386: *           IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
                   3387: *           THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
                   3388:        EJC
                   3389: *
                   3390: *      SVBLK (CONTINUED)
                   3391: *
                   3392: *      KEYWORD NUMBER TABLE
                   3393: *
                   3394: *      THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
                   3395: *      NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
                   3396: *      SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
                   3397: *      PROCEDURES ASIGN, ACESS AND KWNAM.
                   3398: *
                   3399: *      UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
                   3400: *
                   3401: K$ABE  EQU  0                ABEND
                   3402: K$ANC  EQU  K$ABE+CFP$B      ANCHOR
                   3403: .IF    .CULC
                   3404: K$CAS  EQU  K$ANC+CFP$B      CASE
                   3405: K$COD  EQU  K$CAS+CFP$B      CODE
                   3406: .ELSE
                   3407: K$COD  EQU  K$ANC+CFP$B      CODE
                   3408: .FI
                   3409: K$DMP  EQU  K$COD+CFP$B      DUMP
                   3410: K$ERL  EQU  K$DMP+CFP$B      ERRLIMIT
                   3411: K$ERT  EQU  K$ERL+CFP$B      ERRTYPE
                   3412: K$FTR  EQU  K$ERT+CFP$B      FTRACE
                   3413: K$INP  EQU  K$FTR+CFP$B      INPUT
                   3414: K$MXL  EQU  K$INP+CFP$B      MAXLENGTH
                   3415: K$OUP  EQU  K$MXL+CFP$B      OUTPUT
                   3416: .IF    .CNPF
                   3417: K$TRA  EQU  K$OUP+CFP$B      TRACE
                   3418: .ELSE
                   3419: K$PFL  EQU  K$OUP+CFP$B      PROFILE
                   3420: K$TRA  EQU  K$PFL+CFP$B      TRACE
                   3421: .FI
                   3422: K$TRM  EQU  K$TRA+CFP$B      TRIM
                   3423: *
                   3424: *      PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
                   3425: *
                   3426: K$FNC  EQU  K$TRM+CFP$B      FNCLEVEL
                   3427: K$LST  EQU  K$FNC+CFP$B      LASTNO
                   3428: K$STN  EQU  K$LST+CFP$B      STNO
                   3429: *
                   3430: *      KEYWORDS WITH CONSTANT PATTERN VALUES
                   3431: *
                   3432: K$ABO  EQU  K$STN+CFP$B      ABORT
                   3433: K$ARB  EQU  K$ABO+PASI$      ARB
                   3434: K$BAL  EQU  K$ARB+PASI$      BAL
                   3435: K$FAL  EQU  K$BAL+PASI$      FAIL
                   3436: K$FEN  EQU  K$FAL+PASI$      FENCE
                   3437: K$REM  EQU  K$FEN+PASI$      REM
                   3438: K$SUC  EQU  K$REM+PASI$      SUCCEED
                   3439:        EJC
                   3440: *
                   3441: *      KEYWORD NUMBER TABLE (CONTINUED)
                   3442: *
                   3443: *      SPECIAL KEYWORDS
                   3444: *
                   3445: K$ALP  EQU  K$SUC+1          ALPHABET
                   3446: K$RTN  EQU  K$ALP+1          RTNTYPE
                   3447: K$STC  EQU  K$RTN+1          STCOUNT
                   3448: K$ETX  EQU  K$STC+1          ERRTEXT
                   3449: K$STL  EQU  K$ETX+1          STLIMIT
                   3450: *
                   3451: *      RELATIVE OFFSETS OF SPECIAL KEYWORDS
                   3452: *
                   3453: K$$AL  EQU  K$ALP-K$ALP      ALPHABET
                   3454: K$$RT  EQU  K$RTN-K$ALP      RTNTYPE
                   3455: K$$SC  EQU  K$STC-K$ALP      STCOUNT
                   3456: K$$ET  EQU  K$ETX-K$ALP      ERRTEXT
                   3457: K$$SL  EQU  K$STL-K$ALP      STLIMIT
                   3458: *
                   3459: *      SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
                   3460: *
                   3461: K$P$$  EQU  K$FNC            FIRST PROTECTED KEYWORD
                   3462: K$V$$  EQU  K$ABO            FIRST KEYWORD WITH CONSTANT VALUE
                   3463: K$S$$  EQU  K$ALP            FIRST KEYWORD WITH SPECIAL ACESS
                   3464:        EJC
                   3465: *
                   3466: *      FORMAT OF A TABLE BLOCK (TBBLK)
                   3467: *
                   3468: *      A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
                   3469: *      IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
                   3470: *
                   3471: *           +------------------------------------+
                   3472: *           I                TBTYP               I
                   3473: *           +------------------------------------+
                   3474: *           I                IDVAL               I
                   3475: *           +------------------------------------+
                   3476: *           I                TBLEN               I
                   3477: *           +------------------------------------+
                   3478: *           +------------------------------------+
                   3479: *           I                TBINV               I
                   3480: *           +------------------------------------+
                   3481: *           /                                    /
                   3482: *           /                TBBUK               /
                   3483: *           /                                    /
                   3484: *           +------------------------------------+
                   3485: *
                   3486: TBTYP  EQU  0                POINTER TO DUMMY ROUTINE B$TBT
                   3487: TBLEN  EQU  OFFS2            LENGTH OF TBBLK IN BYTES
                   3488: TBINV  EQU  OFFS3            DEFAULT INITIAL LOOKUP VALUE
                   3489: TBBUK  EQU  TBINV+1          START OF HASH BUCKET POINTERS
                   3490: TBSI$  EQU  TBBUK            SIZE OF STANDARD FIELDS IN TBBLK
                   3491: TBNBK  EQU  11               DEFAULT NO. OF BUCKETS
                   3492: *
                   3493: *      THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
                   3494: *      OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
                   3495: *      IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
                   3496: *
                   3497: *      TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
                   3498: *      CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
                   3499: *      END OF THE CHAIN.
                   3500:        EJC
                   3501: *
                   3502: *      TABLE ELEMENT BLOCK (TEBLK)
                   3503: *
                   3504: *      A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
                   3505: *      A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
                   3506: *
                   3507: *           +------------------------------------+
                   3508: *           I                TETYP               I
                   3509: *           +------------------------------------+
                   3510: *           I                TESUB               I
                   3511: *           +------------------------------------+
                   3512: *           I                TEVAL               I
                   3513: *           +------------------------------------+
                   3514: *           I                TENXT               I
                   3515: *           +------------------------------------+
                   3516: *
                   3517: TETYP  EQU  0                POINTER TO DUMMY ROUTINE B$TET
                   3518: TESUB  EQU  TETYP+1          SUBSCRIPT VALUE
                   3519: TEVAL  EQU  TESUB+1          (=VRVAL) TABLE ELEMENT VALUE
                   3520: TENXT  EQU  TEVAL+1          LINK TO NEXT TEBLK
                   3521: *      SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
                   3522: TESI$  EQU  TENXT+1          SIZE OF TEBLK IN WORDS
                   3523: *
                   3524: *      TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
                   3525: *      TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
                   3526: *      TENXT POINTS BACK TO THE START OF THE TBBLK.
                   3527: *
                   3528: *      TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
                   3529: *
                   3530: *      TESUB CONTAINS A DATA POINTER.
                   3531:        EJC
                   3532: *
                   3533: *      TRAP BLOCK (TRBLK)
                   3534: *
                   3535: *      A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
                   3536: *      OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
                   3537: *      INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
                   3538: *
                   3539: *           +------------------------------------+
                   3540: *           I                TRIDN               I
                   3541: *           +------------------------------------+
                   3542: *           I                TRTYP               I
                   3543: *           +------------------------------------+
                   3544: *           I  TRVAL OR TRLBL OR TRNXT OR TRKVR  I
                   3545: *           +------------------------------------+
                   3546: *           I       TRTAG OR TRTER OR TRTRF      I
                   3547: *           +------------------------------------+
                   3548: *           I            TRFNC OR TRFPT          I
                   3549: *           +------------------------------------+
                   3550: *
                   3551: TRIDN  EQU  0                POINTER TO DUMMY ROUTINE B$TRT
                   3552: TRTYP  EQU  TRIDN+1          TRAP TYPE CODE
                   3553: TRVAL  EQU  TRTYP+1          VALUE OF TRAPPED VARIABLE (=VRVAL)
                   3554: TRNXT  EQU  TRVAL            PTR TO NEXT TRBLK ON TRBLK CHAIN
                   3555: TRLBL  EQU  TRVAL            PTR TO ACTUAL LABEL (TRACED LABEL)
                   3556: TRKVR  EQU  TRVAL            VRBLK POINTER FOR KEYWORD TRACE
                   3557: TRTAG  EQU  TRVAL+1          TRACE TAG
                   3558: TRTER  EQU  TRTAG            PTR TO TERMINAL VRBLK OR NULL
                   3559: TRTRF  EQU  TRTAG            PTR TO TRBLK HOLDING FCBLK PTR
                   3560: TRFNC  EQU  TRTAG+1          TRACE FUNCTION VRBLK (ZERO IF NONE)
                   3561: TRFPT  EQU  TRFNC            FCBLK PTR FOR SYSIO
                   3562: TRSI$  EQU  TRFNC+1          NUMBER OF WORDS IN TRBLK
                   3563: *
                   3564: TRTIN  EQU  0                TRACE TYPE FOR INPUT ASSOCIATION
                   3565: TRTAC  EQU  TRTIN+1          TRACE TYPE FOR ACCESS TRACE
                   3566: TRTVL  EQU  TRTAC+1          TRACE TYPE FOR VALUE TRACE
                   3567: TRTOU  EQU  TRTVL+1          TRACE TYPE FOR OUTPUT ASSOCIATION
                   3568: TRTFC  EQU  TRTOU+1          TRACE TYPE FOR FCBLK IDENTIFICATION
                   3569:        EJC
                   3570: *
                   3571: *      TRAP BLOCK (CONTINUED)
                   3572: *
                   3573: *      VARIABLE INPUT ASSOCIATION
                   3574: *
                   3575: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   3576: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   3577: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   3578: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   3579: *
                   3580: *           TRTYP IS SET TO TRTIN
                   3581: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   3582: *           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
                   3583: *           FOR INPUT, TERMINAL, ELSE IT IS NULL.
                   3584: *           TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
                   3585: *           TO AN FCBLK USED FOR I/O ASSOCIATION.
                   3586: *           TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
                   3587: *
                   3588: *      VARIABLE ACCESS TRACE ASSOCIATION
                   3589: *
                   3590: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   3591: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   3592: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   3593: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   3594: *
                   3595: *           TRTYP IS SET TO TRTAC
                   3596: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   3597: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   3598: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   3599: *
                   3600: *      VARIABLE VALUE TRACE ASSOCIATION
                   3601: *
                   3602: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   3603: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   3604: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   3605: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   3606: *
                   3607: *           TRTYP IS SET TO TRTVL
                   3608: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   3609: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   3610: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   3611:        EJC
                   3612: *      TRAP BLOCK (CONTINUED)
                   3613: *
                   3614: *      VARIABLE OUTPUT ASSOCIATION
                   3615: *
                   3616: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   3617: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   3618: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   3619: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   3620: *
                   3621: *           TRTYP IS SET TO TRTOU
                   3622: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   3623: *           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
                   3624: *           FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
                   3625: *           TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
                   3626: *           TO AN FCBLK USED FOR I/O ASSOCIATION.
                   3627: *           TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
                   3628: *
                   3629: *      FUNCTION CALL TRACE
                   3630: *
                   3631: *           THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
                   3632: *           TO POINT TO A TRBLK.
                   3633: *
                   3634: *           TRTYP IS SET TO TRTIN
                   3635: *           TRNXT IS ZERO
                   3636: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   3637: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   3638: *
                   3639: *      FUNCTION RETURN TRACE
                   3640: *
                   3641: *           THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
                   3642: *           TO POINT TO A TRBLK
                   3643: *
                   3644: *           TRTYP IS SET TO TRTIN
                   3645: *           TRNXT IS ZERO
                   3646: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   3647: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   3648: *
                   3649: *      LABEL TRACE
                   3650: *
                   3651: *           THE VRLBL OF THE VRBLK FOR THE LABEL IS
                   3652: *           CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
                   3653: *           SET TO B$VRT TO ACTIVATE THE CHECK.
                   3654: *
                   3655: *           TRTYP IS SET TO TRTIN
                   3656: *           TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
                   3657: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   3658: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   3659:        EJC
                   3660: *
                   3661: *      TRAP BLOCK (CONTINUED)
                   3662: *
                   3663: *      KEYWORD TRACE
                   3664: *
                   3665: *           KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
                   3666: *           LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
                   3667: *           POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
                   3668: *           ARE AS FOLLOWS.
                   3669: *
                   3670: *           R$ERT            ERRTYPE
                   3671: *           R$FNC            FNCLEVEL
                   3672: *           R$STC            STCOUNT
                   3673: *
                   3674: *           THE FORMAT OF THE TRBLK IS AS FOLLOWS.
                   3675: *
                   3676: *           TRTYP IS SET TO TRTIN
                   3677: *           TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
                   3678: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   3679: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   3680: *
                   3681: *      INPUT/OUTPUT FILE ARG1 TRAP BLOCK
                   3682: *
                   3683: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   3684: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
                   3685: *           A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   3686: *           CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
                   3687: *           TO HOLD A POINTER TO THE FCBLK WHICH AN
                   3688: *           IMPLEMENTATION MAY REQUEST TO HOLD INFORMATION
                   3689: *           ABOUT A FILE.
                   3690: *
                   3691: *           TRTYP IS SET TO TRTFC
                   3692: *           TRNEXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
                   3693: *           TRFNM IS 0
                   3694: *           TRFPT IS THE FCBLK POINTER.
                   3695: *
                   3696: *      NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
                   3697: *      THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
                   3698: *
                   3699: *      INPUT ASSOCIATION (IF PRESENT)
                   3700: *      ACCESS TRACE (IF PRESENT)
                   3701: *      VALUE TRACE (IF PRESENT)
                   3702: *      OUTPUT ASSOCIATION (IF PRESENT)
                   3703: *
                   3704: *      THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
                   3705: *      FIELD OF THE LAST TRBLK ON THE CHAIN.
                   3706: *
                   3707: *      THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
                   3708: *      ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
                   3709:        EJC
                   3710: *
                   3711: *      VECTOR BLOCK (VCBLK)
                   3712: *
                   3713: *      A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
                   3714: *      ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
                   3715: *      ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
                   3716: *      SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
                   3717: *
                   3718: *           +------------------------------------+
                   3719: *           I                VCTYP               I
                   3720: *           +------------------------------------+
                   3721: *           I                IDVAL               I
                   3722: *           +------------------------------------+
                   3723: *           I                VCLEN               I
                   3724: *           +------------------------------------+
                   3725: *           I                VCVLS               I
                   3726: *           +------------------------------------+
                   3727: *
                   3728: VCTYP  EQU  0                POINTER TO DUMMY ROUTINE B$VCT
                   3729: VCLEN  EQU  OFFS2            LENGTH OF VCBLK IN BYTES
                   3730: VCVLS  EQU  OFFS3            START OF VECTOR VALUES
                   3731: VCSI$  EQU  VCVLS            SIZE OF STANDARD FIELDS IN VCBLK
                   3732: VCVLB  EQU  VCVLS-1          OFFSET ONE WORD BEHIND VCVLS
                   3733: VCTBD  EQU  TBSI$-VCSI$      DIFFERENCE IN SIZES - SEE PRTVL
                   3734: *
                   3735: *      VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
                   3736: *
                   3737: *      THE DIMENSION CAN BE DEDUCED FROM VCLEN.
                   3738:        EJC
                   3739: *
                   3740: *      VARIABLE BLOCK (VRBLK)
                   3741: *
                   3742: *      A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
                   3743: *      FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
                   3744: *
                   3745: *      NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
                   3746: *      REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
                   3747: *      THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
                   3748: *      ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
                   3749: *
                   3750: *      1)   POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
                   3751: *           VALUE OF THE VARIABLE ONTO THE MAIN STACK.
                   3752: *
                   3753: *      2)   POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
                   3754: *           TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
                   3755: *
                   3756: *      3)   POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
                   3757: *           THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
                   3758: *
                   3759: *           +------------------------------------+
                   3760: *           I                VRGET               I
                   3761: *           +------------------------------------+
                   3762: *           I                VRSTO               I
                   3763: *           +------------------------------------+
                   3764: *           I                VRVAL               I
                   3765: *           +------------------------------------+
                   3766: *           I                VRTRA               I
                   3767: *           +------------------------------------+
                   3768: *           I                VRLBL               I
                   3769: *           +------------------------------------+
                   3770: *           I                VRFNC               I
                   3771: *           +------------------------------------+
                   3772: *           I                VRNXT               I
                   3773: *           +------------------------------------+
                   3774: *           I                VRLEN               I
                   3775: *           +------------------------------------+
                   3776: *           /                                    /
                   3777: *           /            VRCHS = VRSVP           /
                   3778: *           /                                    /
                   3779: *           +------------------------------------+
                   3780:        EJC
                   3781: *
                   3782: *      VARIABLE BLOCK (CONTINUED)
                   3783: *
                   3784: VRGET  EQU  0                POINTER TO ROUTINE TO LOAD VALUE
                   3785: VRSTO  EQU  VRGET+1          POINTER TO ROUTINE TO STORE VALUE
                   3786: VRVAL  EQU  VRSTO+1          VARIABLE VALUE
                   3787: VRVLO  EQU  VRVAL-VRSTO      OFFSET TO VALUE FROM STORE FIELD
                   3788: VRTRA  EQU  VRVAL+1          POINTER TO ROUTINE TO JUMP TO LABEL
                   3789: VRLBL  EQU  VRTRA+1          POINTER TO CODE FOR LABEL
                   3790: VRLBO  EQU  VRLBL-VRTRA      OFFSET TO LABEL FROM TRANSFER FIELD
                   3791: VRFNC  EQU  VRLBL+1          POINTER TO FUNCTION BLOCK
                   3792: VRNXT  EQU  VRFNC+1          POINTER TO NEXT VRBLK ON HASH CHAIN
                   3793: VRLEN  EQU  VRNXT+1          LENGTH OF NAME (OR ZERO)
                   3794: VRCHS  EQU  VRLEN+1          CHARACTERS OF NAME (VRLEN GT 0)
                   3795: VRSVP  EQU  VRLEN+1          PTR TO SVBLK (VRLEN EQ 0)
                   3796: VRSI$  EQU  VRCHS+1          NUMBER OF STANDARD FIELDS IN VRBLK
                   3797: VRSOF  EQU  VRLEN-SCLEN      OFFSET TO DUMMY SCBLK FOR NAME
                   3798: VRSVO  EQU  VRSVP-VRSOF      PSEUDO-OFFSET TO VRSVP FIELD
                   3799: *
                   3800: *      VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
                   3801: *      VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
                   3802: *
                   3803: *      VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
                   3804: *      VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
                   3805: *      VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
                   3806: *
                   3807: *      VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
                   3808: *      VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
                   3809: *      POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
                   3810: *
                   3811: *      VRTRA = B$VRG IF THE LABEL IS NOT TRACED
                   3812: *      VRTRA = B$VRT IF THE LABEL IS TRACED
                   3813: *
                   3814: *      VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
                   3815: *      VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
                   3816: *      VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
                   3817: *      VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
                   3818: *
                   3819: *      VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
                   3820: *      VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
                   3821: *      VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
                   3822: *      VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
                   3823: *      VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
                   3824: *      VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
                   3825: *
                   3826: *      VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
                   3827: *      THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
                   3828: *
                   3829: *      VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
                   3830: *      VRLEN IS ZERO FOR A SYSTEM VARIABLE.
                   3831: *
                   3832: *      VRCHS IS THE NAME (LJRZ) IF VRLEN IS NON-ZERO.
                   3833: *      VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
                   3834:        EJC
                   3835: *
                   3836: *      FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
                   3837: *
                   3838: *      AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
                   3839: *      DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
                   3840: *      RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
                   3841: *      PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
                   3842: *      THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
                   3843: *      THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
                   3844: *      SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
                   3845: *
                   3846: *           +------------------------------------+
                   3847: *           I                XNTYP               I
                   3848: *           +------------------------------------+
                   3849: *           I                XNLEN               I
                   3850: *           +------------------------------------+
                   3851: *           /                                    /
                   3852: *           /                XNDTA               /
                   3853: *           /                                    /
                   3854: *           +------------------------------------+
                   3855: *
                   3856: XNTYP  EQU  0                POINTER TO DUMMY ROUTINE B$XNT
                   3857: XNLEN  EQU  XNTYP+1          LENGTH OF XNBLK IN BYTES
                   3858: XNDTA  EQU  XNLEN+1          DATA WORDS
                   3859: XNSI$  EQU  XNDTA            SIZE OF STANDARD FIELDS IN XNBLK
                   3860: *
                   3861: *      NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
                   3862: *      AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
                   3863: *      IT IS BUILT IN THE DYNAMIC MEMORY AREA.
                   3864:        EJC
                   3865: *
                   3866: *      RELOCATABLE EXTERNAL BLOCK (XRBLK)
                   3867: *
                   3868: *      AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
                   3869: *      DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
                   3870: *      OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
                   3871: *      DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
                   3872: *      DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
                   3873: *      THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
                   3874: *      SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
                   3875: *
                   3876: *           +------------------------------------+
                   3877: *           I                XRTYP               I
                   3878: *           +------------------------------------+
                   3879: *           I                XRLEN               I
                   3880: *           +------------------------------------+
                   3881: *           /                                    /
                   3882: *           /                XRPTR               /
                   3883: *           /                                    /
                   3884: *           +------------------------------------+
                   3885: *
                   3886: XRTYP  EQU  0                POINTER TO DUMMY ROUTINE B$XRT
                   3887: XRLEN  EQU  XRTYP+1          LENGTH OF XRBLK IN BYTES
                   3888: XRPTR  EQU  XRLEN+1          START OF ADDRESS POINTERS
                   3889: XRSI$  EQU  XRPTR            SIZE OF STANDARD FIELDS IN XRBLK
                   3890:        EJC
                   3891: *
                   3892: *      S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS.  THE VALUES
                   3893: *      ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
                   3894: *      AND HENCE TO THE BRANCH TABLE IN S$CNV.
                   3895: *
                   3896: CNVST  EQU  8                MAX STANDARD TYPE CODE FOR CONVERT
                   3897: .IF    .CNRA
                   3898: CNVRT  EQU  CNVST            NO REALS - SAME AS STANDARD TYPES
                   3899: .ELSE
                   3900: CNVRT  EQU  CNVST+1          CONVERT CODE FOR REALS
                   3901: .FI
                   3902: .IF    .CNBF
                   3903: CNVBT  EQU  CNVRT            NO BUFFERS - SAME AS REAL CODE
                   3904: .ELSE
                   3905: CNVBT  EQU  CNVRT+1          CONVERT CODE FOR BUFFER
                   3906: .FI
                   3907: CNVTT  EQU  CNVBT+1          BSW CODE FOR CONVERT
                   3908: *
                   3909: *      INPUT IMAGE LENGTH
                   3910: *
                   3911: INILN  EQU  132              DEFAULT IMAGE LENGTH FOR COMPILER
                   3912: INILS  EQU  80               IMAGE LENGTH IF -SEQU IN EFFECT
                   3913: *
                   3914: IONMB  EQU  2                NAME BASE USED FOR IOCHN IN SYSIO
                   3915: IONMO  EQU  4                NAME OFFSET USED FOR IOCHN IN SYSIO
                   3916: *
                   3917: *      IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
                   3918: *      OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
                   3919: *      LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
                   3920: *
                   3921: NUM01  EQU  1
                   3922: NUM02  EQU  2
                   3923: NUM03  EQU  3
                   3924: NUM04  EQU  4
                   3925: NUM05  EQU  5
                   3926: NUM06  EQU  6
                   3927: NUM07  EQU  7
                   3928: NUM08  EQU  8
                   3929: NUM09  EQU  9
                   3930: NUM10  EQU  10
                   3931: NINI8  EQU  998
                   3932: NINI9  EQU  999
                   3933: THSND  EQU  1000
                   3934:        EJC
                   3935: *
                   3936: *      NUMBERS OF UNDEFINED SPITBOL OPERATORS
                   3937: *
                   3938: OPBUN  EQU  5                NO. OF BINARY UNDEFINED OPS
                   3939: OPUUN  EQU  6                NO OF UNARY UNDEFINED OPS
                   3940: *
                   3941: *      OFFSETS USED IN PRTSN, PRTMI AND ACESS
                   3942: *
                   3943: PRSNF  EQU  13               OFFSET USED IN PRTSN
                   3944: PRTMF  EQU  15               OFFSET TO COL 15 (PRTMI)
                   3945: RILEN  EQU  120              BUFFER LENGTH FOR SYSRI
                   3946: *
                   3947: *      CODES FOR STAGES OF PROCESSING
                   3948: *
                   3949: STGIC  EQU  0                INITIAL COMPILE
                   3950: STGXC  EQU  STGIC+1          EXECUTION COMPILE (CODE)
                   3951: STGEV  EQU  STGXC+1          EXPRESSION EVAL DURING EXECUTION
                   3952: STGXT  EQU  STGEV+1          EXECUTION TIME
                   3953: STGCE  EQU  STGXT+1          INITIAL COMPILE AFTER END LINE
                   3954: STGXE  EQU  STGCE+1          EXEC. COMPILE AFTER END LINE
                   3955: STGND  EQU  STGCE-STGIC      DIFFERENCE IN STAGE AFTER END
                   3956: STGEE  EQU  STGXE+1          EVAL EVALUATING EXPRESSION
                   3957: STGNO  EQU  STGEE+1          NUMBER OF CODES
                   3958:        EJC
                   3959: *
                   3960: *
                   3961: *      STATEMENT NUMBER PAD COUNT FOR LISTR
                   3962: *
                   3963: .DEF   .CSN5
                   3964: .IF    .CSN6
                   3965: STNPD  EQU  6                STATEMENT NO. PAD COUNT
                   3966: .UNDEF .CSN5
                   3967: .FI
                   3968: .IF    .CSN8
                   3969: STNPD  EQU  8                STATEMENT NO. PAD COUNT
                   3970: .UNDEF .CSN5
                   3971: .FI
                   3972: .IF    .CSN5
                   3973: STNPD  EQU  5                STATEMENT NO. PAD COUNT
                   3974: .FI
                   3975: *
                   3976: *      SYNTAX TYPE CODES
                   3977: *
                   3978: *      THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
                   3979: *
                   3980: *      THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
                   3981: *
                   3982: T$UOP  EQU  0                UNARY OPERATOR
                   3983: T$LPR  EQU  T$UOP+3          LEFT PAREN
                   3984: T$LBR  EQU  T$LPR+3          LEFT BRACKET
                   3985: T$CMA  EQU  T$LBR+3          COMMA
                   3986: T$FNC  EQU  T$CMA+3          FUNCTION CALL
                   3987: T$VAR  EQU  T$FNC+3          VARIABLE
                   3988: T$CON  EQU  T$VAR+3          CONSTANT
                   3989: T$BOP  EQU  T$CON+3          BINARY OPERATOR
                   3990: T$RPR  EQU  T$BOP+3          RIGHT PAREN
                   3991: T$RBR  EQU  T$RPR+3          RIGHT BRACKET
                   3992: T$COL  EQU  T$RBR+3          COLON
                   3993: T$SMC  EQU  T$COL+3          SEMI-COLON
                   3994: *
                   3995: *      THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
                   3996: *
                   3997: T$FGO  EQU  T$SMC+1          FAILURE GOTO
                   3998: T$SGO  EQU  T$FGO+1          SUCCESS GOTO
                   3999: *
                   4000: *      THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
                   4001: *      WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
                   4002: *      OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
                   4003: *
                   4004: T$UOK  EQU  T$FNC            LAST CODE OK BEFORE UNARY OPERATOR
                   4005:        EJC
                   4006: *
                   4007: *      DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
                   4008: *
                   4009: T$UO0  EQU  T$UOP+0          UNARY OPERATOR, STATE ZERO
                   4010: T$UO1  EQU  T$UOP+1          UNARY OPERATOR, STATE ONE
                   4011: T$UO2  EQU  T$UOP+2          UNARY OPERATOR, STATE TWO
                   4012: T$LP0  EQU  T$LPR+0          LEFT PAREN, STATE ZERO
                   4013: T$LP1  EQU  T$LPR+1          LEFT PAREN, STATE ONE
                   4014: T$LP2  EQU  T$LPR+2          LEFT PAREN, STATE TWO
                   4015: T$LB0  EQU  T$LBR+0          LEFT BRACKET, STATE ZERO
                   4016: T$LB1  EQU  T$LBR+1          LEFT BRACKET, STATE ONE
                   4017: T$LB2  EQU  T$LBR+2          LEFT BRACKET, STATE TWO
                   4018: T$CM0  EQU  T$CMA+0          COMMA, STATE ZERO
                   4019: T$CM1  EQU  T$CMA+1          COMMA, STATE ONE
                   4020: T$CM2  EQU  T$CMA+2          COMMA, STATE TWO
                   4021: T$FN0  EQU  T$FNC+0          FUNCTION CALL, STATE ZERO
                   4022: T$FN1  EQU  T$FNC+1          FUNCTION CALL, STATE ONE
                   4023: T$FN2  EQU  T$FNC+2          FUNCTION CALL, STATE TWO
                   4024: T$VA0  EQU  T$VAR+0          VARIABLE, STATE ZERO
                   4025: T$VA1  EQU  T$VAR+1          VARIABLE, STATE ONE
                   4026: T$VA2  EQU  T$VAR+2          VARIABLE, STATE TWO
                   4027: T$CO0  EQU  T$CON+0          CONSTANT, STATE ZERO
                   4028: T$CO1  EQU  T$CON+1          CONSTANT, STATE ONE
                   4029: T$CO2  EQU  T$CON+2          CONSTANT, STATE TWO
                   4030: T$BO0  EQU  T$BOP+0          BINARY OPERATOR, STATE ZERO
                   4031: T$BO1  EQU  T$BOP+1          BINARY OPERATOR, STATE ONE
                   4032: T$BO2  EQU  T$BOP+2          BINARY OPERATOR, STATE TWO
                   4033: T$RP0  EQU  T$RPR+0          RIGHT PAREN, STATE ZERO
                   4034: T$RP1  EQU  T$RPR+1          RIGHT PAREN, STATE ONE
                   4035: T$RP2  EQU  T$RPR+2          RIGHT PAREN, STATE TWO
                   4036: T$RB0  EQU  T$RBR+0          RIGHT BRACKET, STATE ZERO
                   4037: T$RB1  EQU  T$RBR+1          RIGHT BRACKET, STATE ONE
                   4038: T$RB2  EQU  T$RBR+2          RIGHT BRACKET, STATE TWO
                   4039: T$CL0  EQU  T$COL+0          COLON, STATE ZERO
                   4040: T$CL1  EQU  T$COL+1          COLON, STATE ONE
                   4041: T$CL2  EQU  T$COL+2          COLON, STATE TWO
                   4042: T$SM0  EQU  T$SMC+0          SEMICOLON, STATE ZERO
                   4043: T$SM1  EQU  T$SMC+1          SEMICOLON, STATE ONE
                   4044: T$SM2  EQU  T$SMC+2          SEMICOLON, STATE TWO
                   4045: *
                   4046: T$NES  EQU  T$SM2+1          NUMBER OF ENTRIES IN BRANCH TABLE
                   4047:        EJC
                   4048: *
                   4049: *       DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
                   4050: *
                   4051: .IF    .CULC
                   4052: CC$CA  EQU  0                -CASE
                   4053: CC$DO  EQU  CC$CA+1          -DOUBLE
                   4054: .ELSE
                   4055: CC$DO  EQU  0                -DOUBLE
                   4056: .FI
                   4057: CC$DU  EQU  CC$DO+1          -DUMP
                   4058: CC$EJ  EQU  CC$DU+1          -EJECT
                   4059: CC$ER  EQU  CC$EJ+1          -ERRORS
                   4060: CC$EX  EQU  CC$ER+1          -EXECUTE
                   4061: CC$FA  EQU  CC$EX+1          -FAIL
                   4062: CC$LI  EQU  CC$FA+1          -LIST
                   4063: CC$NR  EQU  CC$LI+1          -NOERRORS
                   4064: CC$NX  EQU  CC$NR+1          -NOEXECUTE
                   4065: CC$NF  EQU  CC$NX+1          -NOFAIL
                   4066: CC$NL  EQU  CC$NF+1          -NOLIST
                   4067: CC$NO  EQU  CC$NL+1          -NOOPT
                   4068: CC$NP  EQU  CC$NO+1          -NOPRINT
                   4069: CC$OP  EQU  CC$NP+1          -OPTIMISE
                   4070: CC$PR  EQU  CC$OP+1          -PRINT
                   4071: CC$SI  EQU  CC$PR+1          -SINGLE
                   4072: CC$SP  EQU  CC$SI+1          -SPACE
                   4073: CC$ST  EQU  CC$SP+1          -STITL
                   4074: CC$TI  EQU  CC$ST+1          -TITLE
                   4075: CC$TR  EQU  CC$TI+1          -TRACE
                   4076: CC$NC  EQU  CC$TR+1          NUMBER OF CONTROL CARDS
                   4077: CCNOC  EQU  4                NO. OF CHARS INCLUDED IN MATCH
                   4078: CCOFS  EQU  7                OFFSET TO START OF TITLE/SUBTITLE
                   4079:        EJC
                   4080: *
                   4081: *      DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
                   4082: *
                   4083: *      SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
                   4084: *      OF USE OF THESE LOCATIONS ON THE STACK.
                   4085: *
                   4086: CMSTM  EQU  0                TREE FOR STATEMENT BODY
                   4087: CMSGO  EQU  CMSTM+1          TREE FOR SUCCESS GOTO
                   4088: CMFGO  EQU  CMSGO+1          TREE FOR FAIL GOTO
                   4089: CMCGO  EQU  CMFGO+1          CONDITIONAL GOTO FLAG
                   4090: CMPCD  EQU  CMCGO+1          PREVIOUS CDBLK POINTER
                   4091: CMFFP  EQU  CMPCD+1          FAILURE FILL IN FLAG FOR PREVIOUS
                   4092: CMFFC  EQU  CMFFP+1          FAILURE FILL IN FLAG FOR CURRENT
                   4093: CMSOP  EQU  CMFFC+1          SUCCESS FILL IN OFFSET FOR PREVIOUS
                   4094: CMSOC  EQU  CMSOP+1          SUCCESS FILL IN OFFSET FOR CURRENT
                   4095: CMLBL  EQU  CMSOC+1          PTR TO VRBLK FOR CURRENT LABEL
                   4096: CMTRA  EQU  CMLBL+1          PTR TO ENTRY CDBLK
                   4097: *
                   4098: CMNEN  EQU  CMTRA+1          COUNT OF STACK ENTRIES FOR CMPIL
                   4099: .IF    .CNPF
                   4100: .ELSE
                   4101: *
                   4102: *      A FEW CONSTANTS USED BY THE PROFILER
                   4103: PFPD1  EQU  8                PAD POSITIONS ...
                   4104: PFPD2  EQU  20               ... FOR PROFILE ...
                   4105: PFPD3  EQU  32               ... PRINTOUT
                   4106: PF$I2  EQU  CFP$I+CFP$I      SIZE OF TABLE ENTRY (2 INTS)
                   4107: .FI
                   4108: *
                   4109:        TTL  S P I T B O L -- CONSTANT SECTION
                   4110: *
                   4111: *      THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
                   4112: *
                   4113: *      ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
                   4114: *      APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
                   4115: *      DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
                   4116: *      ORDER WHICH MUST NOT BE DISTURBED.
                   4117: *
                   4118: *      IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
                   4119: *      FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
                   4120: *      ALPHABETICAL ORDER IN SOME CASES.
                   4121: *
                   4122:        SEC                   START OF CONSTANT SECTION
                   4123: *
                   4124: *      FREE STORE PERCENTAGE (USED BY ALLOC)
                   4125: *
                   4126: ALFSP  DAC  E$FSP            FREE STORE PERCENTAGE
                   4127: *
                   4128: *      BIT CONSTANTS FOR GENERAL USE
                   4129: *
                   4130: BITS0  DBC  0                ALL ZERO BITS
                   4131: BITS1  DBC  1                ONE BIT IN LOW ORDER POSITION
                   4132: BITS2  DBC  2                BIT IN POSITION 2
                   4133: BITS3  DBC  4                BIT IN POSITION 3
                   4134: BITS4  DBC  8                BIT IN POSITION 4
                   4135: BITS5  DBC  16               BIT IN POSITION 5
                   4136: BITS6  DBC  32               BIT IN POSITION 6
                   4137: BITS7  DBC  64               BIT IN POSITION 7
                   4138: BITS8  DBC  128              BIT IN POSITION 8
                   4139: BITS9  DBC  256              BIT IN POSITION 9
                   4140: BIT10  DBC  512              BIT IN POSITION 10
                   4141: BITSM  DBC  CFP$M            MASK FOR MAX INTEGER
                   4142: *
                   4143: *      BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
                   4144: *
                   4145: BTFNC  DBC  SVFNC            BIT TO TEST FOR FUNCTION
                   4146: BTKNM  DBC  SVKNM            BIT TO TEST FOR KEYWORD NUMBER
                   4147: BTLBL  DBC  SVLBL            BIT TO TEST FOR LABEL
                   4148: BTFFC  DBC  SVFFC            BIT TO TEST FOR FAST CALL
                   4149: BTCKW  DBC  SVCKW            BIT TO TEST FOR CONSTANT KEYWORD
                   4150: BTPRD  DBC  SVPRD            BIT TO TEST FOR PREDICATE FUNCTION
                   4151: BTPRE  DBC  SVPRE            BIT TO TEST FOR PREEVALUATION
                   4152: BTVAL  DBC  SVVAL            BIT TO TEST FOR VALUE
                   4153:        EJC
                   4154: *
                   4155: *      LIST OF NAMES USED FOR CONTROL CARD PROCESSING
                   4156: *
                   4157: .IF    .CULC
                   4158: CCNMS  DTC  /CASE/
                   4159:        DTC  /DOUB/
                   4160: .ELSE
                   4161: CCNMS  DTC  /DOUB/
                   4162: .FI
                   4163:        DTC  /DUMP/
                   4164:        DTC  /EJEC/
                   4165:        DTC  /ERRO/
                   4166:        DTC  /EXEC/
                   4167:        DTC  /FAIL/
                   4168:        DTC  /LIST/
                   4169:        DTC  /NOER/
                   4170:        DTC  /NOEX/
                   4171:        DTC  /NOFA/
                   4172:        DTC  /NOLI/
                   4173:        DTC  /NOOP/
                   4174:        DTC  /NOPR/
                   4175:        DTC  /OPTI/
                   4176:        DTC  /PRIN/
                   4177:        DTC  /SING/
                   4178:        DTC  /SPAC/
                   4179:        DTC  /STIT/
                   4180:        DTC  /TITL/
                   4181:        DTC  /TRAC/
                   4182: *
                   4183: *      HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
                   4184: *
                   4185: DMHDK  DAC  B$SCL            DUMP OF KEYWORD VALUES
                   4186:        DAC  22
                   4187:        DTC  /DUMP OF KEYWORD VALUES/
                   4188: *
                   4189: DMHDV  DAC  B$SCL            DUMP OF NATURAL VARIABLES
                   4190:        DAC  25
                   4191:        DTC  /DUMP OF NATURAL VARIABLES/
                   4192:        EJC
                   4193: *
                   4194: *      MESSAGE TEXT FOR COMPILATION STATISTICS
                   4195: *
                   4196: ENCM1  DAC  B$SCL
                   4197:        DAC  10
                   4198:        DTC  /STORE USED/
                   4199: *
                   4200: ENCM2  DAC  B$SCL
                   4201:        DAC  10
                   4202:        DTC  /STORE LEFT/
                   4203: *
                   4204: ENCM3  DAC  B$SCL
                   4205:        DAC  11
                   4206:        DTC  /COMP ERRORS/
                   4207: *
                   4208: ENCM4  DAC  B$SCL
                   4209:        DAC  14
                   4210:        DTC  /COMP TIME-MSEC/
                   4211: *
                   4212: ENCM5  DAC  B$SCL            EXECUTION SUPPRESSED
                   4213:        DAC  20
                   4214:        DTC  /EXECUTION SUPPRESSED/
                   4215: *
                   4216: *      STRING CONSTANT FOR ABNORMAL END
                   4217: *
                   4218: ENDAB  DAC  B$SCL
                   4219:        DAC  12
                   4220:        DTC  /ABNORMAL END/
                   4221:        EJC
                   4222: *
                   4223: *      MEMORY OVERFLOW DURING INITIALISATION
                   4224: *
                   4225: ENDMO  DAC  B$SCL
                   4226: ENDML  DAC  15
                   4227:        DTC  /MEMORY OVERFLOW/
                   4228: *
                   4229: *      STRING CONSTANT FOR MESSAGE ISSUED BY L$END
                   4230: *
                   4231: ENDMS  DAC  B$SCL
                   4232:        DAC  10
                   4233:        DTC  /NORMAL END/
                   4234: *
                   4235: *      FAIL MESSAGE FOR STACK FAIL SECTION
                   4236: *
                   4237: ENDSO  DAC  B$SCL            STACK OVERFLOW IN GARBAGE COLLECTOR
                   4238:        DAC  36
                   4239:        DTC  /STACK OVERFLOW IN GARBAGE COLLECTION/
                   4240: *
                   4241: *      STRING CONSTANT FOR TIME UP
                   4242: *
                   4243: ENDTU  DAC  B$SCL
                   4244:        DAC  15
                   4245:        DTC  /ERROR - TIME UP/
                   4246:        EJC
                   4247: *
                   4248: *      STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
                   4249: *
                   4250: ERMMS  DAC  B$SCL            ERROR
                   4251:        DAC  5
                   4252:        DTC  /ERROR/
                   4253: *
                   4254: ERMNS  DAC  B$SCL            STRING / -- /
                   4255:        DAC  4
                   4256:        DTC  / -- /
                   4257: *
                   4258: *      STRING CONSTANT FOR PAGE NUMBERING
                   4259: *
                   4260: LSTMS  DAC  B$SCL            PAGE
                   4261:        DAC  5
                   4262:        DTC  /PAGE /
                   4263: *
                   4264: *      LISTING HEADER MESSAGE
                   4265: *
                   4266: HEADR  DAC  B$SCL
                   4267:        DAC  25
                   4268:        DTC  /MACRO SPITBOL VERSION 3.5/
                   4269: *
                   4270: HEADV  DAC  B$SCL            FOR EXIT() VERSION NO. CHECK
                   4271:        DAC  3
                   4272:        DTC  /3.5/
                   4273: *
                   4274: *      INTEGER CONSTANTS FOR GENERAL USE
                   4275: *      ICBLD OPTIMISATION USES THE FIRST THREE.
                   4276: *
                   4277: INT$R  DAC  B$ICL
                   4278: INTV0  DIC  +0               0
                   4279: INTON  DAC  B$ICL
                   4280: INTV1  DIC  +1               1
                   4281: INTTW  DAC  B$ICL
                   4282: INTV2  DIC  +2               2
                   4283: INTVT  DIC  +10              10
                   4284: INTVH  DIC  +100             100
                   4285: INTTH  DIC  +1000            1000
                   4286: *
                   4287: *      TABLE USED IN ICBLD OPTIMISATION
                   4288: *
                   4289: INTAB  DAC  INT$R            POINTER TO 0
                   4290:        DAC  INTON            POINTER TO 1
                   4291:        DAC  INTTW            POINTER TO 2
                   4292:        EJC
                   4293: *
                   4294: *      SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
                   4295: *      CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
                   4296: *      (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
                   4297: *
                   4298: NDABB  DAC  P$ABB            ARBNO
                   4299: NDABD  DAC  P$ABD            ARBNO
                   4300: NDARC  DAC  P$ARC            ARB
                   4301: NDEXB  DAC  P$EXB            EXPRESSION
                   4302: NDFNB  DAC  P$FNB            FENCE()
                   4303: NDFND  DAC  P$FND            FENCE()
                   4304: NDEXC  DAC  P$EXC            EXPRESSION
                   4305: NDIMB  DAC  P$IMB            IMMEDIATE ASSIGNMENT
                   4306: NDIMD  DAC  P$IMD            IMMEDIATE ASSIGNMENT
                   4307: NDNTH  DAC  P$NTH            PATTERN END (NULL PATTERN)
                   4308: NDPAB  DAC  P$PAB            PATTERN ASSIGNMENT
                   4309: NDPAD  DAC  P$PAD            PATTERN ASSIGNMENT
                   4310: NDUNA  DAC  P$UNA            ANCHOR POINT MOVEMENT
                   4311: *
                   4312: *      KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
                   4313: *      USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
                   4314: *      VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
                   4315: *      NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
                   4316: *      DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
                   4317: *
                   4318: NDABO  DAC  P$ABO            ABORT
                   4319:        DAC  NDNTH
                   4320: NDARB  DAC  P$ARB            ARB
                   4321:        DAC  NDNTH
                   4322: NDBAL  DAC  P$BAL            BAL
                   4323:        DAC  NDNTH
                   4324: NDFAL  DAC  P$FAL            FAIL
                   4325:        DAC  NDNTH
                   4326: NDFEN  DAC  P$FEN            FENCE
                   4327:        DAC  NDNTH
                   4328: NDREM  DAC  P$REM            REM
                   4329:        DAC  NDNTH
                   4330: NDSUC  DAC  P$SUC            SUCCEED
                   4331:        DAC  NDNTH
                   4332: *
                   4333: *      NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
                   4334: *      SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
                   4335: *      PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
                   4336: *      NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
                   4337: *      BUT FOR VERY EXCEPTIONAL MACHINES.
                   4338: *
                   4339: NULLS  DAC  B$SCL            NULL STRING VALUE
                   4340:        DAC  0                SCLEN = 0
                   4341: NULLW  DTC  /          /
                   4342:        EJC
                   4343: *
                   4344: *      OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
                   4345: *
                   4346: OPDVC  DAC  O$CNC            CONCATENATION
                   4347:        DAC  C$CNC
                   4348:        DAC  LLCNC
                   4349:        DAC  RRCNC
                   4350: *
                   4351: *      OPDVS IS USED WHEN SCANNING BELOW THE TOP LEVEL TO
                   4352: *      INSURE THAT THE CONCATENATION WILL NOT BE LATER
                   4353: *      MISTAKEN FOR PATTERN MATCHING
                   4354: *
                   4355: OPDVP  DAC  O$CNC            CONCATENATION - NOT PATTERN MATCH
                   4356:        DAC  C$CNP
                   4357:        DAC  LLCNC
                   4358:        DAC  RRCNC
                   4359: *
                   4360: *      NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
                   4361: *      THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
                   4362: *
                   4363: OPDVS  DAC  O$ASS            ASSIGNMENT
                   4364:        DAC  C$ASS
                   4365:        DAC  LLASS
                   4366:        DAC  RRASS
                   4367: *
                   4368:        DAC  6                UNARY EQUAL
                   4369:        DAC  C$UUO
                   4370:        DAC  LLUNO
                   4371: *
                   4372:        DAC  O$PMV            PATTERN MATCH
                   4373:        DAC  C$PMT
                   4374:        DAC  LLPMT
                   4375:        DAC  RRPMT
                   4376: *
                   4377:        DAC  O$INT            INTERROGATION
                   4378:        DAC  C$UVL
                   4379:        DAC  LLUNO
                   4380: *
                   4381:        DAC  1                BINARY AMPERSAND
                   4382:        DAC  C$UBO
                   4383:        DAC  LLAMP
                   4384:        DAC  RRAMP
                   4385: *
                   4386:        DAC  O$KWV            KEYWORD REFERENCE
                   4387:        DAC  C$KEY
                   4388:        DAC  LLUNO
                   4389: *
                   4390:        DAC  O$ALT            ALTERNATION
                   4391:        DAC  C$ALT
                   4392:        DAC  LLALT
                   4393:        DAC  RRALT
                   4394:        EJC
                   4395: *
                   4396: *      OPERATOR DOPE VECTORS (CONTINUED)
                   4397: *
                   4398:        DAC  5                UNARY VERTICAL BAR
                   4399:        DAC  C$UUO
                   4400:        DAC  LLUNO
                   4401: *
                   4402:        DAC  0                BINARY AT
                   4403:        DAC  C$UBO
                   4404:        DAC  LLATS
                   4405:        DAC  RRATS
                   4406: *
                   4407:        DAC  O$CAS            CURSOR ASSIGNMENT
                   4408:        DAC  C$UNM
                   4409:        DAC  LLUNO
                   4410: *
                   4411:        DAC  2                BINARY NUMBER SIGN
                   4412:        DAC  C$UBO
                   4413:        DAC  LLNUM
                   4414:        DAC  RRNUM
                   4415: *
                   4416:        DAC  7                UNARY NUMBER SIGN
                   4417:        DAC  C$UUO
                   4418:        DAC  LLUNO
                   4419: *
                   4420:        DAC  O$DVD            DIVISION
                   4421:        DAC  C$BVL
                   4422:        DAC  LLDVD
                   4423:        DAC  RRDVD
                   4424: *
                   4425:        DAC  9                UNARY SLASH
                   4426:        DAC  C$UUO
                   4427:        DAC  LLUNO
                   4428: *
                   4429:        DAC  O$MLT            MULTIPLICATION
                   4430:        DAC  C$BVL
                   4431:        DAC  LLMLT
                   4432:        DAC  RRMLT
                   4433:        EJC
                   4434: *
                   4435: *      OPERATOR DOPE VECTORS (CONTINUED)
                   4436: *
                   4437:        DAC  0                DEFERRED EXPRESSION
                   4438:        DAC  C$DEF
                   4439:        DAC  LLUNO
                   4440: *
                   4441:        DAC  3                BINARY PERCENT
                   4442:        DAC  C$UBO
                   4443:        DAC  LLPCT
                   4444:        DAC  RRPCT
                   4445: *
                   4446:        DAC  8                UNARY PERCENT
                   4447:        DAC  C$UUO
                   4448:        DAC  LLUNO
                   4449: *
                   4450:        DAC  O$EXP            EXPONENTIATION
                   4451:        DAC  C$BVL
                   4452:        DAC  LLEXP
                   4453:        DAC  RREXP
                   4454: *
                   4455:        DAC  10               UNARY EXCLAMATION
                   4456:        DAC  C$UUO
                   4457:        DAC  LLUNO
                   4458: *
                   4459:        DAC  O$IMA            IMMEDIATE ASSIGNMENT
                   4460:        DAC  C$BVN
                   4461:        DAC  LLDLD
                   4462:        DAC  RRDLD
                   4463: *
                   4464:        DAC  O$INV            INDIRECTION
                   4465:        DAC  C$IND
                   4466:        DAC  LLUNO
                   4467: *
                   4468:        DAC  4                BINARY NOT
                   4469:        DAC  C$UBO
                   4470:        DAC  LLNOT
                   4471:        DAC  RRNOT
                   4472: *
                   4473:        DAC  0                NEGATION
                   4474:        DAC  C$NEG
                   4475:        DAC  LLUNO
                   4476:        EJC
                   4477: *
                   4478: *      OPERATOR DOPE VECTORS (CONTINUED)
                   4479: *
                   4480:        DAC  O$SUB            SUBTRACTION
                   4481:        DAC  C$BVL
                   4482:        DAC  LLPLM
                   4483:        DAC  RRPLM
                   4484: *
                   4485:        DAC  O$COM            COMPLEMENTATION
                   4486:        DAC  C$UVL
                   4487:        DAC  LLUNO
                   4488: *
                   4489:        DAC  O$ADD            ADDITION
                   4490:        DAC  C$BVL
                   4491:        DAC  LLPLM
                   4492:        DAC  RRPLM
                   4493: *
                   4494:        DAC  O$AFF            AFFIRMATION
                   4495:        DAC  C$UVL
                   4496:        DAC  LLUNO
                   4497: *
                   4498:        DAC  O$PAS            PATTERN ASSIGNMENT
                   4499:        DAC  C$BVN
                   4500:        DAC  LLDLD
                   4501:        DAC  RRDLD
                   4502: *
                   4503:        DAC  O$NAM            NAME REFERENCE
                   4504:        DAC  C$UNM
                   4505:        DAC  LLUNO
                   4506: *
                   4507: *      SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
                   4508: *
                   4509: OPDVD  DAC  O$GOD            DIRECT GOTO
                   4510:        DAC  C$UVL
                   4511:        DAC  LLUNO
                   4512: *
                   4513: OPDVN  DAC  O$GOC            COMPLEX NORMAL GOTO
                   4514:        DAC  C$UNM
                   4515:        DAC  LLUNO
                   4516:        EJC
                   4517: *
                   4518: *      OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
                   4519: *
                   4520: OAMN$  DAC  O$AMN            ARRAY REF (MULTI-SUBS BY VALUE)
                   4521: OAMV$  DAC  O$AMV            ARRAY REF (MULTI-SUBS BY VALUE)
                   4522: OAON$  DAC  O$AON            ARRAY REF (ONE SUB BY NAME)
                   4523: OAOV$  DAC  O$AOV            ARRAY REF (ONE SUB BY VALUE)
                   4524: OCER$  DAC  O$CER            COMPILATION ERROR
                   4525: OFEX$  DAC  O$FEX            FAILURE IN EXPRESSION EVALUATION
                   4526: OFIF$  DAC  O$FIF            FAILURE DURING GOTO EVALUATION
                   4527: OFNC$  DAC  O$FNC            FUNCTION CALL (MORE THAN ONE ARG)
                   4528: OFNE$  DAC  O$FNE            FUNCTION NAME ERROR
                   4529: OFNS$  DAC  O$FNS            FUNCTION CALL (SINGLE ARGUMENT)
                   4530: OGOF$  DAC  O$GOF            SET GOTO FAILURE TRAP
                   4531: OINN$  DAC  O$INN            INDIRECTION BY NAME
                   4532: OKWN$  DAC  O$KWN            KEYWORD REFERENCE BY NAME
                   4533: OLEX$  DAC  O$LEX            LOAD EXPRESSION BY NAME
                   4534: OLPT$  DAC  O$LPT            LOAD PATTERN
                   4535: OLVN$  DAC  O$LVN            LOAD VARIABLE NAME
                   4536: ONTA$  DAC  O$NTA            NEGATION, FIRST ENTRY
                   4537: ONTB$  DAC  O$NTB            NEGATION, SECOND ENTRY
                   4538: ONTC$  DAC  O$NTC            NEGATION, THIRD ENTRY
                   4539: OPMN$  DAC  O$PMN            PATTERN MATCH BY NAME
                   4540: OPMS$  DAC  O$PMS            PATTERN MATCH (STATEMENT)
                   4541: OPOP$  DAC  O$POP            POP TOP STACK ITEM
                   4542: ORNM$  DAC  O$RNM            RETURN NAME FROM EXPRESSION
                   4543: ORPL$  DAC  O$RPL            PATTERN REPLACEMENT
                   4544: ORVL$  DAC  O$RVL            RETURN VALUE FROM EXPRESSION
                   4545: OSLA$  DAC  O$SLA            SELECTION, FIRST ENTRY
                   4546: OSLB$  DAC  O$SLB            SELECTION, SECOND ENTRY
                   4547: OSLC$  DAC  O$SLC            SELECTION, THIRD ENTRY
                   4548: OSLD$  DAC  O$SLD            SELECTION, FOURTH ENTRY
                   4549: OSTP$  DAC  O$STP            STOP EXECUTION
                   4550: OUNF$  DAC  O$UNF            UNEXPECTED FAILURE
                   4551:        EJC
                   4552: *
                   4553: *      TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
                   4554: *
                   4555: OPSNB  DAC  CH$AT            AT
                   4556:        DAC  CH$AM            AMPERSAND
                   4557:        DAC  CH$NM            NUMBER
                   4558:        DAC  CH$PC            PERCENT
                   4559:        DAC  CH$NT            NOT
                   4560: *
                   4561: *      TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
                   4562: *
                   4563: OPNSU  DAC  CH$BR            VERTICAL BAR
                   4564:        DAC  CH$EQ            EQUAL
                   4565:        DAC  CH$NM            NUMBER
                   4566:        DAC  CH$PC            PERCENT
                   4567:        DAC  CH$SL            SLASH
                   4568:        DAC  CH$EX            EXCLAMATION
                   4569: .IF    .CNPF
                   4570: .ELSE
                   4571: *
                   4572: *      ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
                   4573: *
                   4574: PFI2A  DAC  PF$I2
                   4575: *
                   4576: *      PROFILER MESSAGE STRINGS
                   4577: *
                   4578: PFMS1  DAC  B$SCL
                   4579:        DAC  15
                   4580:        DTC  /PROGRAM PROFILE/
                   4581: PFMS2  DAC  B$SCL
                   4582:        DAC  42
                   4583:        DTC  /STMT    NUMBER OF     -- EXECUTION TIME --/
                   4584: PFMS3  DAC  B$SCL
                   4585:        DAC  47
                   4586:        DTC  /NUMBER  EXECUTIONS  TOTAL(MSEC) PER EXCN(MCSEC)/
                   4587: .FI
                   4588: *
                   4589: .IF    .CNRA
                   4590: .ELSE
                   4591: *
                   4592: *      REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
                   4593: *      STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
                   4594: *
                   4595: REAV0  DRC  +0.0             0.0
                   4596: REAP1  DRC  +0.1             0.1
                   4597: REAP5  DRC  +0.5             0.5
                   4598: REAV1  DRC  +1.0             10**0
                   4599: REAVT  DRC  +1.0E+1          10**1
                   4600:        DRC  +1.0E+2          10**2
                   4601:        DRC  +1.0E+3          10**3
                   4602:        DRC  +1.0E+4          10**4
                   4603:        DRC  +1.0E+5          10**5
                   4604:        DRC  +1.0E+6          10**6
                   4605:        DRC  +1.0E+7          10**7
                   4606:        DRC  +1.0E+8          10**8
                   4607:        DRC  +1.0E+9          10**9
                   4608: REATT  DRC  +1.0E+10         10**10
                   4609: .FI
                   4610:        EJC
                   4611: *
                   4612: *      STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
                   4613: *
                   4614: SCARR  DAC  B$SCL            ARRAY
                   4615:        DAC  5
                   4616:        DTC  /ARRAY/
                   4617: *
                   4618: SCBUF  DAC  B$SCL            BUFFER
                   4619:        DAC  6
                   4620:        DTC  /BUFFER/
                   4621: *
                   4622: SCCOD  DAC  B$SCL            CODE
                   4623:        DAC  4
                   4624:        DTC  /CODE/
                   4625: *
                   4626: SCEXP  DAC  B$SCL            EXPRESSION
                   4627:        DAC  10
                   4628:        DTC  /EXPRESSION/
                   4629: *
                   4630: SCEXT  DAC  B$SCL            EXTERNAL
                   4631:        DAC  8
                   4632:        DTC  /EXTERNAL/
                   4633: *
                   4634: SCINT  DAC  B$SCL            INTEGER
                   4635:        DAC  7
                   4636:        DTC  /INTEGER/
                   4637: *
                   4638: SCNAM  DAC  B$SCL            NAME
                   4639:        DAC  4
                   4640:        DTC  /NAME/
                   4641: *
                   4642: SCNUM  DAC  B$SCL            NUMERIC
                   4643:        DAC  7
                   4644:        DTC  /NUMERIC/
                   4645: *
                   4646: SCPAT  DAC  B$SCL            PATTERN
                   4647:        DAC  7
                   4648:        DTC  /PATTERN/
                   4649: .IF    .CNRA
                   4650: .ELSE
                   4651: *
                   4652: SCREA  DAC  B$SCL            REAL
                   4653:        DAC  4
                   4654:        DTC  /REAL/
                   4655: .FI
                   4656: *
                   4657: SCSTR  DAC  B$SCL            STRING
                   4658:        DAC  6
                   4659:        DTC  /STRING/
                   4660: *
                   4661: SCTAB  DAC  B$SCL            TABLE
                   4662:        DAC  5
                   4663:        DTC  /TABLE/
                   4664:        EJC
                   4665: *
                   4666: *      STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
                   4667: *
                   4668: SCFRT  DAC  B$SCL            FRETURN
                   4669:        DAC  7
                   4670:        DTC  /FRETURN/
                   4671: *
                   4672: SCNRT  DAC  B$SCL            NRETURN
                   4673:        DAC  7
                   4674:        DTC  /NRETURN/
                   4675: *
                   4676: SCRTN  DAC  B$SCL            RETURN
                   4677:        DAC  6
                   4678:        DTC  /RETURN/
                   4679: *
                   4680: *      DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
                   4681: *      THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
                   4682: *
                   4683: SCNMT  DAC  SCARR            ARBLK     ARRAY
                   4684: .IF    .CNBF
                   4685: .ELSE
                   4686:        DAC  SCBUF            BFBLK     BUFFER
                   4687: .FI
                   4688:        DAC  SCCOD            CDBLK     CODE
                   4689:        DAC  SCEXP            EXBLK     EXPRESSION
                   4690:        DAC  SCINT            ICBLK     INTEGER
                   4691:        DAC  SCNAM            NMBLK     NAME
                   4692:        DAC  SCPAT            P0BLK     PATTERN
                   4693:        DAC  SCPAT            P1BLK     PATTERN
                   4694:        DAC  SCPAT            P2BLK     PATTERN
                   4695: .IF    .CNRA
                   4696: .ELSE
                   4697:        DAC  SCREA            RCBLK     REAL
                   4698: .FI
                   4699:        DAC  SCSTR            SCBLK     STRING
                   4700:        DAC  SCEXP            SEBLK     EXPRESSION
                   4701:        DAC  SCTAB            TBBLK     TABLE
                   4702:        DAC  SCARR            VCBLK     ARRAY
                   4703:        DAC  SCEXT            XNBLK     EXTERNAL
                   4704:        DAC  SCEXT            XRBLK     EXTERNAL
                   4705: *
                   4706: .IF    .CNRA
                   4707: .ELSE
                   4708: *      STRING CONSTANT FOR REAL ZERO
                   4709: *
                   4710: SCRE0  DAC  B$SCL
                   4711:        DAC  2
                   4712:        DTC  /0./
                   4713: .FI
                   4714:        EJC
                   4715: *
                   4716: *      USED TO RE-INITIALISE KVSTL
                   4717: *
                   4718: STLIM  DIC  +50000           DEFAULT STATEMENT LIMIT
                   4719: *
                   4720: *      DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
                   4721: *
                   4722: STNDF  DAC  O$FUN            PTR TO UNDEFINED FUNCTION ERR CALL
                   4723:        DAC  0                DUMMY FARGS COUNT FOR CALL CIRCUIT
                   4724: *
                   4725: *      DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
                   4726: *
                   4727: STNDL  DAC  L$UND            CODE PTR POINTS TO UNDEFINED LBL
                   4728: *
                   4729: *      DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
                   4730: *
                   4731: STNDO  DAC  O$OUN            PTR TO UNDEFINED OPERATOR ERR CALL
                   4732:        DAC  0                DUMMY FARGS COUNT FOR CALL CIRCUIT
                   4733: *
                   4734: *      STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
                   4735: *      THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
                   4736: *      ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
                   4737: *
                   4738: STNVR  DAC  B$VRL            VRGET
                   4739:        DAC  B$VRS            VRSTO
                   4740:        DAC  NULLS            VRVAL
                   4741:        DAC  B$VRG            VRTRA
                   4742:        DAC  STNDL            VRLBL
                   4743:        DAC  STNDF            VRFNC
                   4744:        DAC  0                VRNXT
                   4745:        EJC
                   4746: *
                   4747: *      MESSAGES USED IN END OF RUN PROCESSING (STOPR)
                   4748: *
                   4749: STPM1  DAC  B$SCL            IN STATEMENT
                   4750:        DAC  12
                   4751:        DTC  /IN STATEMENT/
                   4752: *
                   4753: STPM2  DAC  B$SCL
                   4754:        DAC  14
                   4755:        DTC  /STMTS EXECUTED/
                   4756: *
                   4757: STPM3  DAC  B$SCL
                   4758:        DAC  13
                   4759:        DTC  /RUN TIME-MSEC/
                   4760: *
                   4761: STPM4  DAC  B$SCL
                   4762:        DAC  12
                   4763:        DTC  $MCSEC / STMT$
                   4764: *
                   4765: STPM5  DAC  B$SCL
                   4766:        DAC  13
                   4767:        DTC  /REGENERATIONS/
                   4768: *
                   4769: *      CHARS FOR /TU/ ENDING CODE
                   4770: *
                   4771: STRTU  DTC  /TU/
                   4772: *
                   4773: *      TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
                   4774: *      THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
                   4775: *      IN S$CNV
                   4776: *
                   4777: SVCTB  DAC  SCSTR            STRING
                   4778:        DAC  SCINT            INTEGER
                   4779:        DAC  SCNAM            NAME
                   4780:        DAC  SCPAT            PATTERN
                   4781:        DAC  SCARR            ARRAY
                   4782:        DAC  SCTAB            TABLE
                   4783:        DAC  SCEXP            EXPRESSION
                   4784:        DAC  SCCOD            CODE
                   4785:        DAC  SCNUM            NUMERIC
                   4786: .IF    .CNRA
                   4787: .ELSE
                   4788:        DAC  SCREA            REAL
                   4789: .FI
                   4790: .IF    .CNBF
                   4791: .ELSE
                   4792:        DAC  SCBUF            BUFFER
                   4793: .FI
                   4794:        DAC  0                ZERO MARKS END OF LIST
                   4795:        EJC
                   4796: *
                   4797: *      MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
                   4798: *
                   4799: *
                   4800: TMASB  DAC  B$SCL            ASTERISKS FOR TRACE STATEMENT NO
                   4801:        DAC  13
                   4802:        DTC  /************ /
                   4803: 
                   4804: *
                   4805: TMBEB  DAC  B$SCL            BLANK-EQUAL-BLANK
                   4806:        DAC  3
                   4807:        DTC  / = /
                   4808: *
                   4809: *      DUMMY TRBLK FOR EXPRESSION VARIABLE
                   4810: *
                   4811: TRBEV  DAC  B$TRT            DUMMY TRBLK
                   4812: *
                   4813: *      DUMMY TRBLK FOR KEYWORD VARIABLE
                   4814: *
                   4815: TRBKV  DAC  B$TRT            DUMMY TRBLK
                   4816: *
                   4817: *      DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
                   4818: *
                   4819: TRXDR  DAC  O$TXR            BLOCK POINTS TO RETURN ROUTINE
                   4820: TRXDC  DAC  TRXDR            POINTER TO BLOCK
                   4821:        EJC
                   4822: *
                   4823: *      STANDARD VARIABLE BLOCKS
                   4824: *
                   4825: *      SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
                   4826: *      VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
                   4827: *      ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
                   4828: *
                   4829: V$EQF  DBC  SVFPR            EQ
                   4830:        DAC  2
                   4831:        DTC  /EQ/
                   4832:        DAC  S$EQF
                   4833:        DAC  2
                   4834: *
                   4835: V$GEF  DBC  SVFPR            GE
                   4836:        DAC  2
                   4837:        DTC  /GE/
                   4838:        DAC  S$GEF
                   4839:        DAC  2
                   4840: *
                   4841: V$GTF  DBC  SVFPR            GT
                   4842:        DAC  2
                   4843:        DTC  /GT/
                   4844:        DAC  S$GTF
                   4845:        DAC  2
                   4846: *
                   4847: V$LEF  DBC  SVFPR            LE
                   4848:        DAC  2
                   4849:        DTC  /LE/
                   4850:        DAC  S$LEF
                   4851:        DAC  2
                   4852: *
                   4853: V$LTF  DBC  SVFPR            LT
                   4854:        DAC  2
                   4855:        DTC  /LT/
                   4856:        DAC  S$LTF
                   4857:        DAC  2
                   4858: *
                   4859: V$NEF  DBC  SVFPR            NE
                   4860:        DAC  2
                   4861:        DTC  /NE/
                   4862:        DAC  S$NEF
                   4863:        DAC  2
                   4864: *
                   4865: V$ANY  DBC  SVFNP            ANY
                   4866:        DAC  3
                   4867:        DTC  /ANY/
                   4868:        DAC  S$ANY
                   4869:        DAC  1
                   4870: *
                   4871: V$ARB  DBC  SVKVC            ARB
                   4872:        DAC  3
                   4873:        DTC  /ARB/
                   4874:        DAC  K$ARB
                   4875:        DAC  NDARB
                   4876:        EJC
                   4877: *
                   4878: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4879: *
                   4880: V$ARG  DBC  SVFNN            ARG
                   4881:        DAC  3
                   4882:        DTC  /ARG/
                   4883:        DAC  S$ARG
                   4884:        DAC  2
                   4885: *
                   4886: V$BAL  DBC  SVKVC            BAL
                   4887:        DAC  3
                   4888:        DTC  /BAL/
                   4889:        DAC  K$BAL
                   4890:        DAC  NDBAL
                   4891: *
                   4892: V$END  DBC  SVLBL            END
                   4893:        DAC  3
                   4894:        DTC  /END/
                   4895:        DAC  L$END
                   4896: *
                   4897: V$LEN  DBC  SVFNP            LEN
                   4898:        DAC  3
                   4899:        DTC  /LEN/
                   4900:        DAC  S$LEN
                   4901:        DAC  1
                   4902: *
                   4903: V$LEQ  DBC  SVFPR            LEQ
                   4904:        DAC  3
                   4905:        DTC  /LEQ/
                   4906:        DAC  S$LEQ
                   4907:        DAC  2
                   4908: *
                   4909: V$LGE  DBC  SVFPR            LGE
                   4910:        DAC  3
                   4911:        DTC  /LGE/
                   4912:        DAC  S$LGE
                   4913:        DAC  2
                   4914: *
                   4915: V$LGT  DBC  SVFPR            LGT
                   4916:        DAC  3
                   4917:        DTC  /LGT/
                   4918:        DAC  S$LGT
                   4919:        DAC  2
                   4920: *
                   4921: V$LLE  DBC  SVFPR            LLE
                   4922:        DAC  3
                   4923:        DTC  /LLE/
                   4924:        DAC  S$LLE
                   4925:        DAC  2
                   4926:        EJC
                   4927: *
                   4928: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4929: *
                   4930: V$LLT  DBC  SVFPR            LLT
                   4931:        DAC  3
                   4932:        DTC  /LLT/
                   4933:        DAC  S$LLT
                   4934:        DAC  2
                   4935: *
                   4936: V$LNE  DBC  SVFPR            LNE
                   4937:        DAC  3
                   4938:        DTC  /LNE/
                   4939:        DAC  S$LNE
                   4940:        DAC  2
                   4941: *
                   4942: V$POS  DBC  SVFNP            POS
                   4943:        DAC  3
                   4944:        DTC  /POS/
                   4945:        DAC  S$POS
                   4946:        DAC  1
                   4947: *
                   4948: V$REM  DBC  SVKVC            REM
                   4949:        DAC  3
                   4950:        DTC  /REM/
                   4951:        DAC  K$REM
                   4952:        DAC  NDREM
                   4953: .IF    .CUST
                   4954: *
                   4955: V$SET  DBC  SVFNN            SET
                   4956:        DAC  3
                   4957:        DTC  /SET/
                   4958:        DAC  S$SET
                   4959:        DAC  3
                   4960: .FI
                   4961: *
                   4962: V$TAB  DBC  SVFNP            TAB
                   4963:        DAC  3
                   4964:        DTC  /TAB/
                   4965:        DAC  S$TAB
                   4966:        DAC  1
                   4967: .IF    .CULC
                   4968: *
                   4969: V$CAS  DBC  SVKNM            CASE
                   4970:        DAC  4
                   4971:        DTC  /CASE/
                   4972:        DAC  K$CAS
                   4973: .FI
                   4974: *
                   4975: V$CHR  DBC  SVFNP            CHAR
                   4976:        DAC  4
                   4977:        DTC  /CHAR/
                   4978:        DAC  S$CHR
                   4979:        DAC  1
                   4980: *
                   4981: V$COD  DBC  SVFNK            CODE
                   4982:        DAC  4
                   4983:        DTC  /CODE/
                   4984:        DAC  K$COD
                   4985:        DAC  S$COD
                   4986:        DAC  1
                   4987: *
                   4988: V$COP  DBC  SVFNN            COPY
                   4989:        DAC  4
                   4990:        DTC  /COPY/
                   4991:        DAC  S$COP
                   4992:        DAC  1
                   4993:        EJC
                   4994: *
                   4995: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4996: *
                   4997: V$DAT  DBC  SVFNN            DATA
                   4998:        DAC  4
                   4999:        DTC  /DATA/
                   5000:        DAC  S$DAT
                   5001:        DAC  1
                   5002: *
                   5003: V$DTE  DBC  SVFNN            DATE
                   5004:        DAC  4
                   5005:        DTC  /DATE/
                   5006:        DAC  S$DTE
                   5007:        DAC  0
                   5008: *
                   5009: V$DMP  DBC  SVFNK            DUMP
                   5010:        DAC  4
                   5011:        DTC  /DUMP/
                   5012:        DAC  K$DMP
                   5013:        DAC  S$DMP
                   5014:        DAC  1
                   5015: *
                   5016: V$DUP  DBC  SVFNN            DUPL
                   5017:        DAC  4
                   5018:        DTC  /DUPL/
                   5019:        DAC  S$DUP
                   5020:        DAC  2
                   5021: *
                   5022: V$EVL  DBC  SVFNN            EVAL
                   5023:        DAC  4
                   5024:        DTC  /EVAL/
                   5025:        DAC  S$EVL
                   5026:        DAC  1
                   5027: .IF    .CNEX
                   5028: .ELSE
                   5029: *
                   5030: V$EXT  DBC  SVFNN            EXIT
                   5031:        DAC  4
                   5032:        DTC  /EXIT/
                   5033:        DAC  S$EXT
                   5034:        DAC  1
                   5035: .FI
                   5036: *
                   5037: V$FAL  DBC  SVKVC            FAIL
                   5038:        DAC  4
                   5039:        DTC  /FAIL/
                   5040:        DAC  K$FAL
                   5041:        DAC  NDFAL
                   5042: *
                   5043: V$HST  DBC  SVFNN            HOST
                   5044:        DAC  4
                   5045:        DTC  /HOST/
                   5046:        DAC  S$HST
                   5047:        DAC  3
                   5048:        EJC
                   5049: *
                   5050: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5051: *
                   5052: V$ITM  DBC  SVFNF            ITEM
                   5053:        DAC  4
                   5054:        DTC  /ITEM/
                   5055:        DAC  S$ITM
                   5056:        DAC  999
                   5057: .IF    .CNLD
                   5058: .ELSE
                   5059: *
                   5060: V$LOD  DBC  SVFNN            LOAD
                   5061:        DAC  4
                   5062:        DTC  /LOAD/
                   5063:        DAC  S$LOD
                   5064:        DAC  2
                   5065: .FI
                   5066: *
                   5067: V$LPD  DBC  SVFNP            LPAD
                   5068:        DAC  4
                   5069:        DTC  /LPAD/
                   5070:        DAC  S$LPD
                   5071:        DAC  3
                   5072: *
                   5073: V$RPD  DBC  SVFNP            RPAD
                   5074:        DAC  4
                   5075:        DTC  /RPAD/
                   5076:        DAC  S$RPD
                   5077:        DAC  3
                   5078: *
                   5079: V$RPS  DBC  SVFNP            RPOS
                   5080:        DAC  4
                   5081:        DTC  /RPOS/
                   5082:        DAC  S$RPS
                   5083:        DAC  1
                   5084: *
                   5085: V$RTB  DBC  SVFNP            RTAB
                   5086:        DAC  4
                   5087:        DTC  /RTAB/
                   5088:        DAC  S$RTB
                   5089:        DAC  1
                   5090: *
                   5091: V$SI$  DBC  SVFNP            SIZE
                   5092:        DAC  4
                   5093:        DTC  /SIZE/
                   5094:        DAC  S$SI$
                   5095:        DAC  1
                   5096: *
                   5097: .IF    .CNSR
                   5098: .ELSE
                   5099: *
                   5100: V$SRT  DBC  SVFNN            SORT
                   5101:        DAC  4
                   5102:        DTC  /SORT/
                   5103:        DAC  S$SRT
                   5104:        DAC  2
                   5105: .FI
                   5106: V$SPN  DBC  SVFNP            SPAN
                   5107:        DAC  4
                   5108:        DTC  /SPAN/
                   5109:        DAC  S$SPN
                   5110:        DAC  1
                   5111:        EJC
                   5112: *
                   5113: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5114: *
                   5115: V$STN  DBC  SVKNM            STNO
                   5116:        DAC  4
                   5117:        DTC  /STNO/
                   5118:        DAC  K$STN
                   5119: *
                   5120: V$TIM  DBC  SVFNN            TIME
                   5121:        DAC  4
                   5122:        DTC  /TIME/
                   5123:        DAC  S$TIM
                   5124:        DAC  0
                   5125: *
                   5126: V$TRM  DBC  SVFNK            TRIM
                   5127:        DAC  4
                   5128:        DTC  /TRIM/
                   5129:        DAC  K$TRM
                   5130:        DAC  S$TRM
                   5131:        DAC  1
                   5132: *
                   5133: V$ABE  DBC  SVKNM            ABEND
                   5134:        DAC  5
                   5135:        DTC  /ABEND/
                   5136:        DAC  K$ABE
                   5137: *
                   5138: V$ABO  DBC  SVKVL            ABORT
                   5139:        DAC  5
                   5140:        DTC  /ABORT/
                   5141:        DAC  K$ABO
                   5142:        DAC  L$ABO
                   5143:        DAC  NDABO
                   5144: *
                   5145: V$APP  DBC  SVFNF            APPLY
                   5146:        DAC  5
                   5147:        DTC  /APPLY/
                   5148:        DAC  S$APP
                   5149:        DAC  999
                   5150: *
                   5151: V$ABN  DBC  SVFNP            ARBNO
                   5152:        DAC  5
                   5153:        DTC  /ARBNO/
                   5154:        DAC  S$ABN
                   5155:        DAC  1
                   5156: *
                   5157: V$ARR  DBC  SVFNN            ARRAY
                   5158:        DAC  5
                   5159:        DTC  /ARRAY/
                   5160:        DAC  S$ARR
                   5161:        DAC  2
                   5162:        EJC
                   5163: *
                   5164: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5165: *
                   5166: V$BRK  DBC  SVFNP            BREAK
                   5167:        DAC  5
                   5168:        DTC  /BREAK/
                   5169:        DAC  S$BRK
                   5170:        DAC  1
                   5171: *
                   5172: V$CLR  DBC  SVFNN            CLEAR
                   5173:        DAC  5
                   5174:        DTC  /CLEAR/
                   5175:        DAC  S$CLR
                   5176:        DAC  1
                   5177: *
                   5178: V$EJC  DBC  SVFNN            EJECT
                   5179:        DAC  5
                   5180:        DTC  /EJECT/
                   5181:        DAC  S$EJC
                   5182:        DAC  1
                   5183: *
                   5184: V$FEN  DBC  SVFPK            FENCE
                   5185:        DAC  5
                   5186:        DTC  /FENCE/
                   5187:        DAC  K$FEN
                   5188:        DAC  S$FNC
                   5189:        DAC  1
                   5190:        DAC  NDFEN
                   5191: *
                   5192: V$FLD  DBC  SVFNN            FIELD
                   5193:        DAC  5
                   5194:        DTC  /FIELD/
                   5195:        DAC  S$FLD
                   5196:        DAC  2
                   5197: *
                   5198: V$IDN  DBC  SVFPR            IDENT
                   5199:        DAC  5
                   5200:        DTC  /IDENT/
                   5201:        DAC  S$IDN
                   5202:        DAC  2
                   5203: *
                   5204: V$INP  DBC  SVFNK            INPUT
                   5205:        DAC  5
                   5206:        DTC  /INPUT/
                   5207:        DAC  K$INP
                   5208:        DAC  S$INP
                   5209:        DAC  3
                   5210: *
                   5211: V$LOC  DBC  SVFNN            LOCAL
                   5212:        DAC  5
                   5213:        DTC  /LOCAL/
                   5214:        DAC  S$LOC
                   5215:        DAC  2
                   5216:        EJC
                   5217: *
                   5218: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5219: *
                   5220: V$OPS  DBC  SVFNN            OPSYN
                   5221:        DAC  5
                   5222:        DTC  /OPSYN/
                   5223:        DAC  S$OPS
                   5224:        DAC  3
                   5225: *
                   5226: V$RMD  DBC  SVFNP            REMDR
                   5227:        DAC  5
                   5228:        DTC  /REMDR/
                   5229:        DAC  S$RMD
                   5230:        DAC  2
                   5231: .IF    .CNSR
                   5232: .ELSE
                   5233: *
                   5234: V$RSR  DBC  SVFNN            RSORT
                   5235:        DAC  5
                   5236:        DTC  /RSORT/
                   5237:        DAC  S$RSR
                   5238:        DAC  2
                   5239: .FI
                   5240: *
                   5241: V$TBL  DBC  SVFNN            TABLE
                   5242:        DAC  5
                   5243:        DTC  /TABLE/
                   5244:        DAC  S$TBL
                   5245:        DAC  3
                   5246: *
                   5247: V$TRA  DBC  SVFNK            TRACE
                   5248:        DAC  5
                   5249:        DTC  /TRACE/
                   5250:        DAC  K$TRA
                   5251:        DAC  S$TRA
                   5252:        DAC  4
                   5253: *
                   5254: V$ANC  DBC  SVKNM            ANCHOR
                   5255:        DAC  6
                   5256:        DTC  /ANCHOR/
                   5257:        DAC  K$ANC
                   5258: .IF    .CNBF
                   5259: .ELSE
                   5260: *
                   5261: V$APN  DBC  SVFNN
                   5262:        DAC  6
                   5263:        DTC  /APPEND/
                   5264:        DAC  S$APN
                   5265:        DAC  2
                   5266: .FI
                   5267: *
                   5268: V$BKX  DBC  SVFNP            BREAKX
                   5269:        DAC  6
                   5270:        DTC  /BREAKX/
                   5271:        DAC  S$BKX
                   5272:        DAC  1
                   5273: *
                   5274: .IF    .CNBF
                   5275: .ELSE
                   5276: V$BUF  DBC  SVFNN            BUFFER
                   5277:        DAC  6
                   5278:        DTC  /BUFFER/
                   5279:        DAC  S$BUF
                   5280:        DAC  2
                   5281: .FI
                   5282: *
                   5283: V$DEF  DBC  SVFNN            DEFINE
                   5284:        DAC  6
                   5285:        DTC  /DEFINE/
                   5286:        DAC  S$DEF
                   5287:        DAC  2
                   5288: *
                   5289: V$DET  DBC  SVFNN            DETACH
                   5290:        DAC  6
                   5291:        DTC  /DETACH/
                   5292:        DAC  S$DET
                   5293:        DAC  1
                   5294:        EJC
                   5295: *
                   5296: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5297: *
                   5298: V$DIF  DBC  SVFPR            DIFFER
                   5299:        DAC  6
                   5300:        DTC  /DIFFER/
                   5301:        DAC  S$DIF
                   5302:        DAC  2
                   5303: *
                   5304: V$FTR  DBC  SVKNM            FTRACE
                   5305:        DAC  6
                   5306:        DTC  /FTRACE/
                   5307:        DAC  K$FTR
                   5308: *
                   5309: .IF    .CNBF
                   5310: .ELSE
                   5311: V$INS  DBC  SVFNN            INSERT
                   5312:        DAC  6
                   5313:        DTC  /INSERT/
                   5314:        DAC  S$INS
                   5315:        DAC  4
                   5316: *
                   5317: .FI
                   5318: V$LST  DBC  SVKNM            LASTNO
                   5319:        DAC  6
                   5320:        DTC  /LASTNO/
                   5321:        DAC  K$LST
                   5322: *
                   5323: V$NAY  DBC  SVFNP            NOTANY
                   5324:        DAC  6
                   5325:        DTC  /NOTANY/
                   5326:        DAC  S$NAY
                   5327:        DAC  1
                   5328: *
                   5329: V$OUP  DBC  SVFNK            OUTPUT
                   5330:        DAC  6
                   5331:        DTC  /OUTPUT/
                   5332:        DAC  K$OUP
                   5333:        DAC  S$OUP
                   5334:        DAC  3
                   5335: *
                   5336: V$RET  DBC  SVLBL            RETURN
                   5337:        DAC  6
                   5338:        DTC  /RETURN/
                   5339:        DAC  L$RTN
                   5340: *
                   5341: V$REW  DBC  SVFNN            REWIND
                   5342:        DAC  6
                   5343:        DTC  /REWIND/
                   5344:        DAC  S$REW
                   5345:        DAC  1
                   5346: *
                   5347: V$STT  DBC  SVFNN            STOPTR
                   5348:        DAC  6
                   5349:        DTC  /STOPTR/
                   5350:        DAC  S$STT
                   5351:        DAC  2
                   5352:        EJC
                   5353: *
                   5354: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5355: *
                   5356: V$SUB  DBC  SVFNN            SUBSTR
                   5357:        DAC  6
                   5358:        DTC  /SUBSTR/
                   5359:        DAC  S$SUB
                   5360:        DAC  3
                   5361: *
                   5362: V$UNL  DBC  SVFNN            UNLOAD
                   5363:        DAC  6
                   5364:        DTC  /UNLOAD/
                   5365:        DAC  S$UNL
                   5366:        DAC  1
                   5367: *
                   5368: V$COL  DBC  SVFNN            COLLECT
                   5369:        DAC  7
                   5370:        DTC  /COLLECT/
                   5371:        DAC  S$COL
                   5372:        DAC  1
                   5373: *
                   5374: V$CNV  DBC  SVFNN            CONVERT
                   5375:        DAC  7
                   5376:        DTC  /CONVERT/
                   5377:        DAC  S$CNV
                   5378:        DAC  2
                   5379: *
                   5380: V$ENF  DBC  SVFNN            ENDFILE
                   5381:        DAC  7
                   5382:        DTC  /ENDFILE/
                   5383:        DAC  S$ENF
                   5384:        DAC  1
                   5385: *
                   5386: V$ETX  DBC  SVKNM            ERRTEXT
                   5387:        DAC  7
                   5388:        DTC  /ERRTEXT/
                   5389:        DAC  K$ETX
                   5390: *
                   5391: V$ERT  DBC  SVKNM            ERRTYPE
                   5392:        DAC  7
                   5393:        DTC  /ERRTYPE/
                   5394:        DAC  K$ERT
                   5395: *
                   5396: V$FRT  DBC  SVLBL            FRETURN
                   5397:        DAC  7
                   5398:        DTC  /FRETURN/
                   5399:        DAC  L$FRT
                   5400: *
                   5401: V$INT  DBC  SVFPR            INTEGER
                   5402:        DAC  7
                   5403:        DTC  /INTEGER/
                   5404:        DAC  S$INT
                   5405:        DAC  1
                   5406: *
                   5407: V$NRT  DBC  SVLBL            NRETURN
                   5408:        DAC  7
                   5409:        DTC  /NRETURN/
                   5410:        DAC  L$NRT
                   5411:        EJC
                   5412: *
                   5413: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5414: *
                   5415: .IF    .CNPF
                   5416: .ELSE
                   5417: *
                   5418: V$PFL  DBC  SVKNM            PROFILE
                   5419:        DAC  7
                   5420:        DTC  /PROFILE/
                   5421:        DAC  K$PFL
                   5422: .FI
                   5423: *
                   5424: V$RPL  DBC  SVFNP            REPLACE
                   5425:        DAC  7
                   5426:        DTC  /REPLACE/
                   5427:        DAC  S$RPL
                   5428:        DAC  3
                   5429: *
                   5430: V$RVS  DBC  SVFNP            REVERSE
                   5431:        DAC  7
                   5432:        DTC  /REVERSE/
                   5433:        DAC  S$RVS
                   5434:        DAC  1
                   5435: *
                   5436: V$RTN  DBC  SVKNM            RTNTYPE
                   5437:        DAC  7
                   5438:        DTC  /RTNTYPE/
                   5439:        DAC  K$RTN
                   5440: *
                   5441: V$STX  DBC  SVFNN            SETEXIT
                   5442:        DAC  7
                   5443:        DTC  /SETEXIT/
                   5444:        DAC  S$STX
                   5445:        DAC  1
                   5446: *
                   5447: V$STC  DBC  SVKNM            STCOUNT
                   5448:        DAC  7
                   5449:        DTC  /STCOUNT/
                   5450:        DAC  K$STC
                   5451: *
                   5452: V$STL  DBC  SVKNM            STLIMIT
                   5453:        DAC  7
                   5454:        DTC  /STLIMIT/
                   5455:        DAC  K$STL
                   5456: *
                   5457: V$SUC  DBC  SVKVC            SUCCEED
                   5458:        DAC  7
                   5459:        DTC  /SUCCEED/
                   5460:        DAC  K$SUC
                   5461:        DAC  NDSUC
                   5462: *
                   5463: V$ALP  DBC  SVKWC            ALPHABET
                   5464:        DAC  8
                   5465:        DTC  /ALPHABET/
                   5466:        DAC  K$ALP
                   5467: *
                   5468: V$CNT  DBC  SVLBL            CONTINUE
                   5469:        DAC  8
                   5470:        DTC  /CONTINUE/
                   5471:        DAC  L$CNT
                   5472:        EJC
                   5473: *
                   5474: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   5475: *
                   5476: V$DTP  DBC  SVFNP            DATATYPE
                   5477:        DAC  8
                   5478:        DTC  /DATATYPE/
                   5479:        DAC  S$DTP
                   5480:        DAC  1
                   5481: *
                   5482: V$ERL  DBC  SVKNM            ERRLIMIT
                   5483:        DAC  8
                   5484:        DTC  /ERRLIMIT/
                   5485:        DAC  K$ERL
                   5486: *
                   5487: V$FNC  DBC  SVKNM            FNCLEVEL
                   5488:        DAC  8
                   5489:        DTC  /FNCLEVEL/
                   5490:        DAC  K$FNC
                   5491: *
                   5492: V$MXL  DBC  SVKNM            MAXLNGTH
                   5493:        DAC  8
                   5494:        DTC  /MAXLNGTH/
                   5495:        DAC  K$MXL
                   5496: *
                   5497: V$TER  DBC  0                TERMINAL
                   5498:        DAC  8
                   5499:        DTC  /TERMINAL/
                   5500:        DAC  0
                   5501: *
                   5502: V$PRO  DBC  SVFNN            PROTOTYPE
                   5503:        DAC  9
                   5504:        DTC  /PROTOTYPE/
                   5505:        DAC  S$PRO
                   5506:        DAC  1
                   5507: *
                   5508:        DBC  0                DUMMY ENTRY TO END LIST
                   5509:        DAC  10               LENGTH GT 9 (PROTOTYPE)
                   5510:        EJC
                   5511: *
                   5512: *      LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
                   5513: *      LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
                   5514: *
                   5515: VDMKW  DAC  V$ANC            ANCHOR
                   5516: .IF    .CULC
                   5517:        DAC  V$CAS            CCASE
                   5518: .FI
                   5519:        DAC  V$COD            CODE
                   5520:        DAC  V$DMP            DUMP
                   5521:        DAC  V$ERL            ERRLIMIT
                   5522:        DAC  V$ETX            ERRTEXT
                   5523:        DAC  V$ERT            ERRTYPE
                   5524:        DAC  V$FNC            FNCLEVEL
                   5525:        DAC  V$FTR            FTRACE
                   5526:        DAC  V$INP            INPUT
                   5527:        DAC  V$LST            LASTNO
                   5528:        DAC  V$MXL            MAXLENGTH
                   5529:        DAC  V$OUP            OUTPUT
                   5530: .IF    .CNPF
                   5531: .ELSE
                   5532:        DAC  V$PFL            PROFILE
                   5533: .FI
                   5534:        DAC  V$RTN            RTNTYPE
                   5535:        DAC  V$STC            STCOUNT
                   5536:        DAC  V$STL            STLIMIT
                   5537:        DAC  V$STN            STNO
                   5538:        DAC  V$TRA            TRACE
                   5539:        DAC  V$TRM            TRIM
                   5540:        DAC  0                END OF LIST
                   5541: *
                   5542: *      TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
                   5543: *
                   5544: VSRCH  DAC  0                DUMMY ENTRY TO GET PROPER INDEXING
                   5545:        DAC  V$EQF            START OF 1 CHAR VARIABLES (NONE)
                   5546:        DAC  V$EQF            START OF 2 CHAR VARIABLES
                   5547:        DAC  V$ANY            START OF 3 CHAR VARIABLES
                   5548: .IF    .CULC
                   5549:        DAC  V$CAS            START OF 4 CHAR VARIABLES
                   5550: .ELSE
                   5551:        DAC  V$CHR            START OF 4 CHAR VARIABLES
                   5552: .FI
                   5553:        DAC  V$ABE            START OF 5 CHAR VARIABLES
                   5554:        DAC  V$ANC            START OF 6 CHAR VARIABLES
                   5555:        DAC  V$COL            START OF 7 CHAR VARIABLES
                   5556:        DAC  V$ALP            START OF 8 CHAR VARIABLES
                   5557:        DAC  V$PRO            START OF 9 CHAR VARIABLES
                   5558:        TTL  S P I T B O L -- WORKING STORAGE SECTION
                   5559: *
                   5560: *      THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
                   5561: *      CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
                   5562: *      ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
                   5563: *
                   5564: *      ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
                   5565: *      DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
                   5566: *      ALLOCATED DATA AREAS.
                   5567: *
                   5568: *      THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
                   5569: *      AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
                   5570: *      EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
                   5571: *      ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
                   5572: *      LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
                   5573: *      CALL TO ANOTHER.
                   5574: *
                   5575: *      A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
                   5576: *      TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
                   5577: *      SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
                   5578: *      CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
                   5579: *      INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
                   5580: *
                   5581: *      THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
                   5582: *      (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
                   5583: *      ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
                   5584: *      ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
                   5585: *
                   5586: *      UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
                   5587: *      DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
                   5588: *
                   5589:        SEC                   START OF WORKING STORAGE SECTION
                   5590:        EJC
                   5591: *
                   5592: *      THIS AREA IS NOT CLEARED BY INITIAL CODE
                   5593: *
                   5594: CMLAB  DAC  B$SCL            STRING USED TO CHECK LABEL LEGALITY
                   5595:        DAC  2
                   5596:        DTC  /  /
                   5597: *
                   5598: *      LABEL TO MARK START OF WORK AREA
                   5599: *
                   5600: AAAAA  DAC  0
                   5601: *
                   5602: *      WORK AREAS FOR ALLOC PROCEDURE
                   5603: *
                   5604: ALDYN  DAC  0                AMOUNT OF DYNAMIC STORE
                   5605: ALFSF  DIC  +0               FACTOR IN FREE STORE PCNTAGE CHECK
                   5606: ALLIA  DIC  +0               DUMP IA
                   5607: ALLSV  DAC  0                SAVE WB IN ALLOC
                   5608: *
                   5609: *      WORK AREAS FOR ALOST PROCEDURE
                   5610: *
                   5611: ALSTA  DAC  0                SAVE WA IN ALOST
                   5612: *
                   5613: *      SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
                   5614: *
                   5615: ARCDM  DAC  0                COUNT DIMENSIONS
                   5616: ARNEL  DIC  +0               COUNT ELEMENTS
                   5617: ARPTR  DAC  0                OFFSET PTR INTO ARBLK
                   5618: ARSVL  DIC  +0               SAVE INTEGER LOW BOUND
                   5619:        EJC
                   5620: *      WORK AREAS FOR ARREF ROUTINE
                   5621: *
                   5622: ARFSI  DIC  +0               SAVE CURRENT EVOLVING SUBSCRIPT
                   5623: ARFXS  DAC  0                SAVE BASE STACK POINTER
                   5624: *
                   5625: *      WORK AREAS FOR B$EFC BLOCK ROUTINE
                   5626: *
                   5627: BEFOF  DAC  0                SAVE OFFSET PTR INTO EFBLK
                   5628: *
                   5629: *      WORK AREAS FOR B$PFC BLOCK ROUTINE
                   5630: *
                   5631: BPFPF  DAC  0                SAVE PFBLK POINTER
                   5632: BPFSV  DAC  0                SAVE OLD FUNCTION VALUE
                   5633: BPFXT  DAC  0                POINTER TO STACKED ARGUMENTS
                   5634: *
                   5635: *      SAVE AREAS FOR COLLECT FUNCTION (S$COL)
                   5636: *
                   5637: CLSVI  DIC  +0               SAVE INTEGER ARGUMENT
                   5638: *
                   5639: *      GLOBAL VALUES FOR CMPIL PROCEDURE
                   5640: *
                   5641: CMERC  DAC  0                COUNT OF INITIAL COMPILE ERRORS
                   5642: CMPXS  DAC  0                SAVE STACK PTR IN CASE OF ERRORS
                   5643: CMPSN  DAC  1                NUMBER OF NEXT STATEMENT TO COMPILE
                   5644: CMPSS  DAC  0                SAVE SUBROUTINE STACK PTR
                   5645: *
                   5646: *      WORK AREA FOR CNCRD
                   5647: *
                   5648: CNSCC  DAC  0                POINTER TO CONTROL CARD STRING
                   5649: CNSWC  DAC  0                WORD COUNT
                   5650: CNR$T  DAC  0                POINTER TO R$TTL OR R$STL
                   5651: CNTTL  DAC  0                FLAG FOR -TITLE, -STITL
                   5652: *
                   5653: *      WORK AREAS FOR CONVERT FUNCTION (S$CNV)
                   5654: *
                   5655: CNVTP  DAC  0                SAVE PTR INTO SCVTB
                   5656: *
                   5657: *      FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
                   5658: *
                   5659: CPSTS  DAC  0                SUPPRESS COMP. STATS IF NON ZERO
                   5660: *
                   5661: *      GLOBAL VALUES FOR CONTROL CARD SWITCHES
                   5662: *
                   5663: CSWDB  DAC  0                0/1 FOR -SINGLE/-DOUBLE
                   5664: CSWER  DAC  0                0/1 FOR -ERRORS/-NOERRORS
                   5665: CSWEX  DAC  0                0/1 FOR -EXECUTE/-NOEXECUTE
                   5666: CSWFL  DAC  1                0/1 FOR -NOFAIL/-FAIL
                   5667: CSWIN  DAC  INILN            XXX FOR -INXXX
                   5668: CSWLS  DAC  1                0/1 FOR -NOLIST/-LIST
                   5669: CSWNO  DAC  0                0/1 FOR -OPTIMISE/-NOOPT
                   5670: CSWPR  DAC  0                0/1 FOR -NOPRINT/-PRINT
                   5671: *
                   5672: *      GLOBAL LOCATION USED BY PATST PROCEDURE
                   5673: *
                   5674: CTMSK  DBC  0                LAST BIT POSITION USED IN R$CTP
                   5675: CURID  DAC  0                CURRENT ID VALUE
                   5676:        EJC
                   5677: *
                   5678: *      GLOBAL VALUE FOR CDWRD PROCEDURE
                   5679: *
                   5680: CWCOF  DAC  0                NEXT WORD OFFSET IN CURRENT CCBLK
                   5681: *
                   5682: *      WORK AREAS FOR DATA FUNCTION (S$DAT)
                   5683: *
                   5684: DATDV  DAC  0                SAVE VRBLK PTR FOR DATATYPE NAME
                   5685: DATXS  DAC  0                SAVE INITIAL STACK POINTER
                   5686: *
                   5687: *      WORK AREAS FOR DEFINE FUNCTION (S$DEF)
                   5688: *
                   5689: DEFLB  DAC  0                SAVE VRBLK PTR FOR LABEL
                   5690: DEFNA  DAC  0                COUNT FUNCTION ARGUMENTS
                   5691: DEFVR  DAC  0                SAVE VRBLK PTR FOR FUNCTION NAME
                   5692: DEFXS  DAC  0                SAVE INITIAL STACK POINTER
                   5693: *
                   5694: *      WORK AREAS FOR DUMPR PROCEDURE
                   5695: *
                   5696: DMARG  DAC  0                DUMP ARGUMENT
                   5697: DMPKB  DAC  B$KVT            DUMMY KVBLK FOR USE IN DUMPR
                   5698: DMPKT  DAC  TRBKV            KVVAR TRBLK POINTER
                   5699: DMPKN  DAC  0                KEYWORD NUMBER (MUST FOLLOW DMPKB)
                   5700: DMPSA  DAC  0                PRESERVE WA OVER PRTVL CALL
                   5701: DMPSV  DAC  0                GENERAL SCRATCH SAVE
                   5702: DMVCH  DAC  0                CHAIN POINTER FOR VARIABLE BLOCKS
                   5703: DMPCH  DAC  0                SAVE SORTED VRBLK CHAIN POINTER
                   5704: *
                   5705: *      GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
                   5706: *
                   5707: DNAMB  DAC  0                START OF DYNAMIC AREA
                   5708: DNAMP  DAC  0                NEXT AVAILABLE LOC IN DYNAMIC AREA
                   5709: DNAME  DAC  0                END OF AVAILABLE DYNAMIC AREA
                   5710: *
                   5711: *      WORK AREA FOR DTACH
                   5712: *
                   5713: DTCNB  DAC  0                NAME BASE
                   5714: DTCNM  DAC  0                NAME PTR
                   5715: *
                   5716: *      WORK AREAS FOR DUPL FUNCTION (S$DUP)
                   5717: *
                   5718: DUPSI  DIC  +0               STORE INTEGER STRING LENGTH
                   5719: *
                   5720: *      WORK AREA FOR ENDFILE (S$ENF)
                   5721: *
                   5722: ENFCH  DAC  0                FOR IOCHN CHAIN HEAD
                   5723: *
                   5724: *      WORK AREA FOR ERROR PROCESSING.
                   5725: *
                   5726: ERICH  DAC  0                COPY ERROR REPORTS TO INT.CHAN IF 1
                   5727: ERLST  DAC  0                FOR LISTR WHEN ERRORS GO TO INT.CH.
                   5728: ERRFT  DAC  0                FATAL ERROR FLAG
                   5729: ERRSP  DAC  0                ERROR SUPPRESSION FLAG
                   5730:        EJC
                   5731: *
                   5732: *      DUMP AREA FOR ERTEX
                   5733: *
                   5734: ERTWA  DAC  0                SAVE WA
                   5735: ERTWB  DAC  0                SAVE WB
                   5736: *
                   5737: *      GLOBAL VALUES FOR EVALI
                   5738: *
                   5739: EVLIN  DAC  P$LEN            DUMMY PATTERN BLOCK PCODE
                   5740: EVLIS  DAC  0                POINTER TO SUBSEQUENT NODE
                   5741: EVLIV  DAC  0                VALUE OF PARAMETER
                   5742: *      WORK AREA FOR EXPAN
                   5743: *
                   5744: EXPSV  DAC  0                SAVE OP DOPE VECTOR POINTER
                   5745: *
                   5746: *      FLAG FOR SUPPRESSION OF EXECUTION STATS
                   5747: *
                   5748: EXSTS  DAC  0                SUPPRESS EXEC STATS IF SET
                   5749: *
                   5750: *      GLOBAL VALUES FOR EXFAL AND RETURN
                   5751: *
                   5752: FLPRT  DAC  0                LOCATION OF FAIL OFFSET FOR RETURN
                   5753: FLPTR  DAC  0                LOCATION OF FAILURE OFFSET ON STACK
                   5754: *
                   5755: *      WORK AREAS FOR GBCOL PROCEDURE
                   5756: *
                   5757: GBCFL  DAC  0                GARBAGE COLLECTOR ACTIVE FLAG
                   5758: GBCLM  DAC  0                POINTER TO LAST MOVE BLOCK (PASS 3)
                   5759: GBCNM  DAC  0                DUMMY FIRST MOVE BLOCK
                   5760: GBCNS  DAC  0                REST OF DUMMY BLOCK (FOLLOWS GBCNM)
                   5761: GBSVA  DAC  0                SAVE WA
                   5762: GBSVB  DAC  0                SAVE WB
                   5763: GBSVC  DAC  0                SAVE WC
                   5764: *
                   5765: *      GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
                   5766: *
                   5767: GBCNT  DAC  0                COUNT OF GARBAGE COLLECTIONS
                   5768: *
                   5769: *      WORK AREAS FOR GTNVR PROCEDURE
                   5770: *
                   5771: GNVHE  DAC  0                PTR TO END OF HASH CHAIN
                   5772: GNVNW  DAC  0                NUMBER OF WORDS IN STRING NAME
                   5773: GNVSA  DAC  0                SAVE WA
                   5774: GNVSB  DAC  0                SAVE WB
                   5775: GNVSP  DAC  0                POINTER INTO VSRCH TABLE
                   5776: GNVST  DAC  0                POINTER TO CHARS OF STRING
                   5777: *
                   5778: *      GLOBAL VALUE FOR GTCOD AND GTEXP
                   5779: *
                   5780: GTCEF  DAC  0                SAVE FAIL PTR IN CASE OF ERROR
                   5781: *
                   5782: *      WORK AREAS FOR GTINT
                   5783: *
                   5784: GTINA  DAC  0                SAVE WA
                   5785: GTINB  DAC  0                SAVE WB
                   5786:        EJC
                   5787: *
                   5788: *      WORK AREAS FOR GTNUM PROCEDURE
                   5789: *
                   5790: GTNNF  DAC  0                ZERO/NONZERO FOR RESULT +/-
                   5791: GTNSI  DIC  +0               GENERAL INTEGER SAVE
                   5792: .IF    .CNRA
                   5793: .ELSE
                   5794: GTNDF  DAC  0                0/1 FOR DEC POINT SO FAR NO/YES
                   5795: GTNES  DAC  0                ZERO/NONZERO EXPONENT +/-
                   5796: GTNEX  DIC  +0               REAL EXPONENT
                   5797: GTNSC  DAC  0                SCALE (PLACES AFTER POINT)
                   5798: GTNSR  DRC  +0.0             GENERAL REAL SAVE
                   5799: GTNRD  DAC  0                FLAG FOR OK REAL NUMBER
                   5800: .FI
                   5801: *
                   5802: *      WORK AREAS FOR GTPAT PROCEDURE
                   5803: *
                   5804: GTPSB  DAC  0                SAVE WB
                   5805: *
                   5806: *      WORK AREAS FOR GTSTG PROCEDURE
                   5807: *
                   5808: GTSSF  DAC  0                0/1 FOR RESULT +/-
                   5809: GTSVC  DAC  0                SAVE WC
                   5810: GTSVB  DAC  0                SAVE WB
                   5811: GTSWK  DAC  0                PTR TO WORK AREA FOR GTSTG
                   5812: .IF    .CNRA
                   5813: .ELSE
                   5814: GTSES  DAC  0                CHAR + OR - FOR EXPONENT +/-
                   5815: GTSRS  DRC  +0.0             GENERAL REAL SAVE
                   5816: *
                   5817: *      GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
                   5818: *
                   5819: GTSRN  DRC  +0.0             ROUNDING FACTOR 0.5*10**-CFP$S
                   5820: GTSSC  DRC  +0.0             SCALING VALUE 10**CFP$S
                   5821: .FI
                   5822: *
                   5823: *      WORK AREAS FOR GTVAR PROCEDURE
                   5824: *
                   5825: GTVRC  DAC  0                SAVE WC
                   5826: *
                   5827: *      FLAG FOR HEADER PRINTING
                   5828: *
                   5829: HEADP  DAC  0                HEADER PRINTED FLAG
                   5830: *
                   5831: *      GLOBAL VALUES FOR VARIABLE HASH TABLE
                   5832: *
                   5833: HSHNB  DIC  +0               NUMBER OF HASH BUCKETS
                   5834: HSHTB  DAC  0                POINTER TO START OF VRBLK HASH TABL
                   5835: HSHTE  DAC  0                POINTER PAST END OF VRBLK HASH TABL
                   5836: *
                   5837: *      WORK AREA FOR INIT
                   5838: *
                   5839: INISS  DAC  0                SAVE SUBROUTINE STACK PTR
                   5840: INITR  DAC  0                SAVE TERMINAL FLAG
                   5841: .IF    .CNBF
                   5842: .ELSE
                   5843: *
                   5844: *      SAVE AREA FOR INSBF
                   5845: *
                   5846: INSAB  DAC  0                ENTRY WA + ENTRY WB
                   5847: INSSA  DAC  0                SAVE ENTRY WA
                   5848: INSSB  DAC  0                SAVE ENTRY WB
                   5849: INSSC  DAC  0                SAVE ENTRY WC
                   5850: .FI
                   5851: *
                   5852: *      WORK AREAS FOR IOPUT
                   5853: *
                   5854: IOPTT  DAC  0                TYPE OF ASSOCIATION
                   5855:        EJC
                   5856: *
                   5857: *      GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
                   5858: *      WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
                   5859: *      FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
                   5860: *
                   5861: KVABE  DAC  0                ABEND
                   5862: KVANC  DAC  0                ANCHOR
                   5863: .IF    .CULC
                   5864: KVCAS  DAC  0                CASE
                   5865: .FI
                   5866: KVCOD  DAC  0                CODE
                   5867: KVDMP  DAC  0                DUMP
                   5868: KVERL  DAC  0                ERRLIMIT
                   5869: KVERT  DAC  0                ERRTYPE
                   5870: KVFTR  DAC  0                FTRACE
                   5871: KVINP  DAC  1                INPUT
                   5872: KVMXL  DAC  5000             MAXLENGTH
                   5873: KVOUP  DAC  1                OUTPUT
                   5874: .IF    .CNPF
                   5875: .ELSE
                   5876: KVPFL  DAC  0                PROFILE
                   5877: .FI
                   5878: KVTRA  DAC  0                TRACE
                   5879: KVTRM  DAC  0                TRIM
                   5880: KVFNC  DAC  0                FNCLEVEL
                   5881: KVLST  DAC  0                LASTNO
                   5882: KVSTN  DAC  0                STNO
                   5883: *
                   5884: *      GLOBAL VALUES FOR OTHER KEYWORDS
                   5885: *
                   5886: KVALP  DAC  0                ALPHABET
                   5887: KVRTN  DAC  NULLS            RTNTYPE (SCBLK POINTER)
                   5888: KVSTL  DIC  +50000           STLIMIT
                   5889: KVSTC  DIC  +50000           STCOUNT (COUNTS DOWN FROM STLIMIT)
                   5890: .IF    .CNLD
                   5891: .ELSE
                   5892: *
                   5893: *      WORK AREAS FOR LOAD FUNCTION
                   5894: *
                   5895: LODFN  DAC  0                POINTER TO VRBLK FOR FUNC NAME
                   5896: LODNA  DAC  0                COUNT NUMBER OF ARGUMENTS
                   5897: .FI
                   5898: *
                   5899: *      GLOBAL VALUES FOR LISTR PROCEDURE
                   5900: *
                   5901: LSTLC  DAC  0                COUNT LINES ON SOURCE LIST PAGE
                   5902: LSTNP  DAC  0                MAX NUMBER OF LINES ON PAGE
                   5903: LSTPF  DAC  1                SET NONZERO IF CURRENT IMAGE LISTED
                   5904: LSTPG  DAC  0                CURRENT SOURCE LIST PAGE NUMBER
                   5905: LSTPO  DAC  0                OFFSET TO   PAGE NNN   MESSAGE
                   5906: LSTSN  DAC  0                REMEMBER LAST STMNUM LISTED
                   5907: *
                   5908: *      MAXIMUM SIZE OF SPITBOL OBJECTS
                   5909: *
                   5910: MXLEN  DAC  0                INITIALISED BY SYSMX CALL
                   5911: *
                   5912: *      EXECUTION CONTROL VARIABLE
                   5913: *
                   5914: NOXEQ  DAC  0                SET NON-ZERO TO INHIBIT EXECUTION
                   5915: .IF    .CNPF
                   5916: .ELSE
                   5917: *
                   5918: *      PROFILER GLOBAL VALUES AND WORK LOCATIONS
                   5919: *
                   5920: PFDMP  DAC  0                SET NON-0 IF &PROFILE SET NON-0
                   5921: PFFNC  DAC  0                SET NON-0 IF FUNCT JUST ENTERED
                   5922: PFSTM  DIC  +0               TO STORE STARTING TIME OF STMT
                   5923: PFETM  DIC  +0               TO STORE ENDING TIME OF STMT
                   5924: PFSVW  DAC  0                TO SAVE A W-REG
                   5925: PFTBL  DAC  0                GETS ADRS OF (IMAG) TABLE BASE
                   5926: PFNTE  DAC  0                NR OF TABLE ENTRIES
                   5927: PFSTE  DIC  +0               GETS INT REP OF TABLE ENTRY SIZE
                   5928: .FI
                   5929: *
                   5930:        EJC
                   5931: *
                   5932: *      GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
                   5933: *
                   5934: PMDFL  DAC  0                PATTERN ASSIGNMENT FLAG
                   5935: PMHBS  DAC  0                HISTORY STACK BASE POINTER
                   5936: PMSSL  DAC  0                LENGTH OF SUBJECT STRING IN CHARS
                   5937: *
                   5938: *      FLAGS USED FOR STANDARD FILE LISTING OPTIONS
                   5939: *
                   5940: PRICH  DAC  0                PRINTER ON INTERACTIVE CHANNEL
                   5941: PRSTD  DAC  0                TESTED BY PRTPG
                   5942: PRSTO  DAC  0                STANDARD LISTING OPTION FLAG
                   5943: *
                   5944: *      GLOBAL VALUE FOR PRTNM PROCEDURE
                   5945: *
                   5946: PRNMV  DAC  0                VRBLK PTR FROM LAST NAME SEARCH
                   5947: *
                   5948: *      WORK AREAS FOR PRTNM PROCEDURE
                   5949: *
                   5950: PRNSI  DIC  +0               SCRATCH INTEGER LOC
                   5951: *
                   5952: *      WORK AREAS FOR PRTSN PROCEDURE
                   5953: *
                   5954: PRSNA  DAC  0                SAVE WA
                   5955: *
                   5956: *      GLOBAL VALUES FOR PRINT PROCEDURES
                   5957: *
                   5958: PRBUF  DAC  0                PTR TO PRINT BFR IN STATIC
                   5959: PRECL  DAC  0                EXTENDED/COMPACT LISTING FLAG
                   5960: PRLEN  DAC  0                LENGTH OF PRINT BUFFER IN CHARS
                   5961: PRLNW  DAC  0                LENGTH OF PRINT BUFFER IN WORDS
                   5962: PROFS  DAC  0                OFFSET TO NEXT LOCATION IN PRBUF
                   5963: PRTEF  DAC  0                ENDFILE FLAG
                   5964: *
                   5965: *      WORK AREAS FOR PRTST PROCEDURE
                   5966: *
                   5967: PRSVA  DAC  0                SAVE WA
                   5968: PRSVB  DAC  0                SAVE WB
                   5969: PRSVC  DAC  0                SAVE CHAR COUNTER
                   5970: *
                   5971: *      WORK AREA FOR PRTNL
                   5972: *
                   5973: PRTSA  DAC  0                SAVE WA
                   5974: PRTSB  DAC  0                SAVE WB
                   5975: *
                   5976: *      WORK AREA FOR PRTVL
                   5977: *
                   5978: PRVSI  DAC  0                SAVE IDVAL
                   5979: *
                   5980: *      WORK AREAS FOR PATTERN MATCH ROUTINES
                   5981: *
                   5982: PSAVE  DAC  0                TEMPORARY SAVE FOR CURRENT NODE PTR
                   5983: PSAVC  DAC  0                SAVE CURSOR IN P$SPN, P$STR
                   5984:        EJC
                   5985: *
                   5986: *      AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
                   5987: *
                   5988: RSMEM  DAC  0                RESERVE MEMORY
                   5989: *
                   5990: *      WORK AREAS FOR RETRN ROUTINE
                   5991: *
                   5992: RTNBP  DAC  0                TO SAVE A BLOCK POINTER
                   5993: RTNFV  DAC  0                NEW FUNCTION VALUE (RESULT)
                   5994: RTNSV  DAC  0                OLD FUNCTION VALUE (SAVED VALUE)
                   5995: *
                   5996: *      RELOCATABLE GLOBAL VALUES
                   5997: *
                   5998: *      ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
                   5999: *      THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
                   6000: *      GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
                   6001: *
                   6002: R$AAA  DAC  0                START OF RELOCATABLE VALUES
                   6003: R$ARF  DAC  0                ARRAY BLOCK POINTER FOR ARREF
                   6004: R$CCB  DAC  0                PTR TO CCBLK BEING BUILT (CDWRD)
                   6005: R$CIM  DAC  0                PTR TO CURRENT COMPILER INPUT STR
                   6006: R$CMP  DAC  0                COPY OF R$CIM USED IN CMPIL
                   6007: R$CNI  DAC  0                PTR TO NEXT COMPILER INPUT STRING
                   6008: R$CNT  DAC  0                CDBLK POINTER FOR SETEXIT CONTINUE
                   6009: R$COD  DAC  0                POINTER TO CURRENT CDBLK OR EXBLK
                   6010: R$CTP  DAC  0                PTR TO CURRENT CTBLK FOR PATST
                   6011: R$ERT  DAC  0                TRBLK POINTER FOR ERRTYPE TRACE
                   6012: R$ETX  DAC  NULLS            POINTER TO ERRTEXT STRING
                   6013: R$EXS  DAC  0                = SAVE XL IN EXPDM
                   6014: R$FCB  DAC  0                FCBLK CHAIN HEAD
                   6015: R$FNC  DAC  0                TRBLK POINTER FOR FNCLEVEL TRACE
                   6016: R$GTC  DAC  0                KEEP CODE PTR FOR GTCOD,GTEXP
                   6017: R$IO1  DAC  0                FILE ARG1 FOR IOPUT
                   6018: R$IO2  DAC  0                FILE ARG2 FOR IOPUT
                   6019: R$IOF  DAC  0                FCBLK PTR OR 0
                   6020: R$ION  DAC  0                NAME BASE PTR
                   6021: R$IOP  DAC  0                PREDECESSOR BLOCK PTR FOR IOPUT
                   6022: R$IOT  DAC  0                TRBLK PTR FOR IOPUT
                   6023: .IF    .CNBF
                   6024: .ELSE
                   6025: R$PMB  DAC  0                BUFFER PTR IN PATTERN MATCH
                   6026: .FI
                   6027: R$PMS  DAC  0                SUBJECT STRING PTR IN PATTERN MATCH
                   6028: R$RA2  DAC  0                REPLACE SECOND ARGUMENT LAST TIME
                   6029: R$RA3  DAC  0                REPLACE THIRD ARGUMENT LAST TIME
                   6030: R$RPT  DAC  0                PTR TO CTBLK REPLACE TABLE LAST USD
                   6031: R$SCP  DAC  0                SAVE POINTER FROM LAST SCANE CALL
                   6032: R$SXL  DAC  0                PRESERVE XL IN SORTC
                   6033: R$SXR  DAC  0                PRESERVE XR IN SORTA/SORTC
                   6034: R$STC  DAC  0                TRBLK POINTER FOR STCOUNT TRACE
                   6035: R$STL  DAC  0                SOURCE LISTING SUB-TITLE
                   6036: R$SXC  DAC  0                CODE (CDBLK) PTR FOR SETEXIT TRAP
                   6037: R$TTL  DAC  NULLS            SOURCE LISTING TITLE
                   6038: R$XSC  DAC  0                STRING POINTER FOR XSCAN
                   6039:        EJC
                   6040: *
                   6041: *      THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
                   6042: *      TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
                   6043: *
                   6044: R$UBA  DAC  STNDO            BINARY AT
                   6045: R$UBM  DAC  STNDO            BINARY AMPERSAND
                   6046: R$UBN  DAC  STNDO            BINARY NUMBER SIGN
                   6047: R$UBP  DAC  STNDO            BINARY PERCENT
                   6048: R$UBT  DAC  STNDO            BINARY NOT
                   6049: R$UUB  DAC  STNDO            UNARY VERTICAL BAR
                   6050: R$UUE  DAC  STNDO            UNARY EQUAL
                   6051: R$UUN  DAC  STNDO            UNARY NUMBER SIGN
                   6052: R$UUP  DAC  STNDO            UNARY PERCENT
                   6053: R$UUS  DAC  STNDO            UNARY SLASH
                   6054: R$UUX  DAC  STNDO            UNARY EXCLAMATION
                   6055: R$YYY  DAC  0                LAST RELOCATABLE LOCATION
                   6056: *
                   6057: *      WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
                   6058: *
                   6059: SBSSV  DAC  0                SAVE THIRD ARGUMENT
                   6060: *
                   6061: *      GLOBAL LOCATIONS USED IN SCAN PROCEDURE
                   6062: *
                   6063: SCNBL  DAC  0                SET NON-ZERO IF SCANNED PAST BLANKS
                   6064: SCNCC  DAC  0                NON-ZERO TO SCAN CONTROL CARD NAME
                   6065: SCNGO  DAC  0                SET NON-ZERO TO SCAN GOTO FIELD
                   6066: SCNIL  DAC  0                LENGTH OF CURRENT INPUT IMAGE
                   6067: SCNPT  DAC  0                POINTER TO NEXT LOCATION IN R$CIM
                   6068: SCNRS  DAC  0                SET NON-ZERO TO SIGNAL RESCAN
                   6069: SCNTP  DAC  0                SAVE SYNTAX TYPE FROM LAST CALL
                   6070: *
                   6071: *      WORK AREAS FOR SCAN PROCEDURE
                   6072: *
                   6073: SCNSA  DAC  0                SAVE WA
                   6074: SCNSB  DAC  0                SAVE WB
                   6075: SCNSC  DAC  0                SAVE WC
                   6076: SCNSE  DAC  0                START OF CURRENT ELEMENT
                   6077: SCNOF  DAC  0                SAVE OFFSET
                   6078: .IF    .CNSR
                   6079: .ELSE
                   6080:        EJC
                   6081: *
                   6082: *      WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
                   6083: *
                   6084: SRTDF  DAC  0                DATATYPE FIELD NAME
                   6085: SRTFD  DAC  0                FOUND DFBLK ADDRESS
                   6086: SRTFF  DAC  0                FOUND FIELD NAME
                   6087: SRTFO  DAC  0                OFFSET TO FIELD NAME
                   6088: SRTNR  DAC  0                NUMBER OF ROWS
                   6089: SRTOF  DAC  0                OFFSET WITHIN ROW TO SORT KEY
                   6090: SRTRT  DAC  0                ROOT OFFSET
                   6091: SRTS1  DAC  0                SAVE OFFSET 1
                   6092: SRTS2  DAC  0                SAVE OFFSET 2
                   6093: SRTSC  DAC  0                SAVE WC
                   6094: SRTSF  DAC  0                SORT ARRAY FIRST ROW OFFSET
                   6095: SRTSN  DAC  0                SAVE N
                   6096: SRTSO  DAC  0                OFFSET TO A(0)
                   6097: SRTSR  DAC  0                0 , NON-ZERO FOR SORT, RSORT
                   6098: SRTST  DAC  0                STRIDE FROM ONE ROW TO NEXT
                   6099: SRTWC  DAC  0                DUMP WC
                   6100: .FI
                   6101: *
                   6102: *      GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION)
                   6103: *
                   6104: STAGE  DAC  0                INITIAL VALUE = INITIAL COMPILE
                   6105: *
                   6106: *      GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
                   6107: *
                   6108: STATB  DAC  0                START OF STATIC AREA
                   6109: STATE  DAC  0                END OF STATIC AREA
                   6110:        EJC
                   6111: *
                   6112: *      GLOBAL STACK POINTER
                   6113: *
                   6114: STBAS  DAC  0                POINTER PAST STACK BASE
                   6115: *
                   6116: *      WORK AREAS FOR STOPR ROUTINE
                   6117: *
                   6118: STPSI  DIC  +0               SAVE VALUE OF STCOUNT
                   6119: STPTI  DIC  +0               SAVE TIME ELAPSED
                   6120: *
                   6121: *      GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
                   6122: *
                   6123: STXOF  DAC  0                FAILURE OFFSET
                   6124: STXVR  DAC  NULLS            VRBLK POINTER OR NULL
                   6125: *
                   6126: *      WORK AREAS FOR TFIND PROCEDURE
                   6127: *
                   6128: TFNSI  DIC  +0               NUMBER OF HEADERS
                   6129: *
                   6130: *      GLOBAL VALUE FOR TIME KEEPING
                   6131: *
                   6132: TIMSX  DIC  +0               TIME AT START OF EXECUTION
                   6133: TIMUP  DAC  0                SET WHEN TIME UP OCCURS
                   6134: *
                   6135: *      WORK AREAS FOR XSCAN PROCEDURE
                   6136: *
                   6137: XSCRT  DAC  0                SAVE RETURN CODE
                   6138: XSCWB  DAC  0                SAVE REGISTER WB
                   6139: *
                   6140: *      GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
                   6141: *
                   6142: XSOFS  DAC  0                OFFSET TO CURRENT LOCATION IN R$XSC
                   6143: *
                   6144: *      LABEL TO MARK END OF WORK AREA
                   6145: *
                   6146: YYYYY  DAC  0
                   6147:        TTL  S P I T B O L -- INITIALIZATION
                   6148: *
                   6149: *      INITIALISATION
                   6150: *      THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
                   6151: *      AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
                   6152: *
                   6153: *      (XS)                  POINTS PAST STACK BASE
                   6154: *      (XR)                  POINTS TO FIRST WORD OF DATA AREA
                   6155: *      (XL)                  POINTS TO LAST WORD OF DATA AREA
                   6156: *
                   6157:        SEC                   START OF PROGRAM SECTION
                   6158:        JSR  SYSTM            INITIALISE TIMER
                   6159: .IF    .CNBT
                   6160:        STI  TIMSX            STORE TIME
                   6161:        MOV  XR,STATB         START ADDRESS OF STATIC
                   6162: .ELSE
                   6163: *
                   6164: *      INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
                   6165: *
                   6166:        MOV  XR,WB            PRESERVE XR
                   6167:        MOV  =YYYYY,WA        POINT TO END OF WORK AREA
                   6168:        SUB  =AAAAA,WA        GET LENGTH OF WORK AREA
                   6169:        BTW  WA               CONVERT TO WORDS
                   6170:        LCT  WA,WA            COUNT FOR LOOP
                   6171:        MOV  =AAAAA,XR        SET UP INDEX REGISTER
                   6172: *
                   6173: *      CLEAR WORK SPACE
                   6174: *
                   6175: INI01  ZER  (XR)+            CLEAR A WORD
                   6176:        BCT  WA,INI01         LOOP TILL DONE
                   6177:        MOV  =STNDO,WA        UNDEFINED OPERATORS POINTER
                   6178:        MOV  =R$YYY,WC        POINT TO TABLE END
                   6179:        SUB  =R$UBA,WC        LENGTH OF UNDEF. OPERATORS TABLE
                   6180:        BTW  WC               CONVERT TO WORDS
                   6181:        LCT  WC,WC            LOOP COUNTER
                   6182:        MOV  =R$UBA,XR        SET UP XR
                   6183: *
                   6184: *      SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
                   6185: *
                   6186: INI02  MOV  WA,(XR)+         STORE VALUE
                   6187:        BCT  WC,INI02         LOOP TILL ALL DONE
                   6188:        MOV  =NUM01,WA        GET A 1
                   6189:        MOV  WA,CMPSN         STATEMENT NO
                   6190:        MOV  WA,CSWFL         NOFAIL
                   6191:        MOV  WA,CSWLS         LIST
                   6192:        MOV  WA,KVINP         INPUT
                   6193:        MOV  WA,KVOUP         OUTPUT
                   6194:        MOV  WA,LSTPF         NOTHING FOR LISTR YET
                   6195:        MOV  =INILN,WA        INPUT IMAGE LENGTH
                   6196:        MOV  WA,CSWIN         -IN72
                   6197:        MOV  =B$KVT,DMPKB     DUMP
                   6198:        MOV  =TRBKV,DMPKT     DUMP
                   6199:        MOV  =P$LEN,EVLIN     EVAL
                   6200:        EJC
                   6201:        MOV  =NULLS,WA        GET NULLSTRING POINTER
                   6202:        MOV  WA,KVRTN         RETURN
                   6203:        MOV  WA,R$ETX         ERRTEXT
                   6204:        MOV  WA,R$TTL         TITLE FOR LISTING
                   6205:        MOV  WA,STXVR         SETEXIT
                   6206:        STI  TIMSX            STORE TIME IN CORRECT PLACE
                   6207:        LDI  STLIM            GET DEFAULT STLIMIT
                   6208:        STI  KVSTL            STATEMENT LIMIT
                   6209:        STI  KVSTC            STATEMENT COUNT
                   6210:        MOV  WB,STATB         STORE START ADRS OF STATIC
                   6211: .FI
                   6212:        MOV  *E$SRS,RSMEM     RESERVE MEMORY
                   6213:        MOV  XS,STBAS         STORE STACK BASE
                   6214:        SSS  INISS            SAVE S-R STACK PTR
                   6215: *
                   6216: *      NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
                   6217: *      FOR EASY TESTING IN ALLOC ROUTINE.
                   6218: *
                   6219:        LDI  INTVH            GET 100
                   6220:        DVI  ALFSP            FORM 100 / ALFSP
                   6221:        STI  ALFSF            STORE THE FACTOR
                   6222: .IF    .CNRA
                   6223: .ELSE
                   6224: *
                   6225: *      INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
                   6226: *
                   6227:        LCT  WB,=CFP$S        LOAD COUNTER FOR SIGNIFICANT DIGITS
                   6228:        LDR  REAV1            LOAD 1.0
                   6229: *
                   6230: *      LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
                   6231: *
                   6232: INI03  MLR  REAVT            * 10.0
                   6233:        BCT  WB,INI03         LOOP TILL DONE
                   6234:        STR  GTSSC            STORE 10**(MAX SIG DIGITS)
                   6235:        LDR  REAP5            LOAD 0.5
                   6236:        DVR  GTSSC            COMPUTE 0.5*10**(MAX SIG DIGITS)
                   6237:        STR  GTSRN            STORE AS ROUNDING BIAS
                   6238: .FI
                   6239:        ZER  WC               SET TO READ PARAMETERS
                   6240:        JSR  PRPAR            READ THEM
                   6241:        EJC
                   6242: *
                   6243: *      NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
                   6244: *      NECESSARY REQUEST MORE MEMORY.
                   6245: *
                   6246:        SUB  *E$SRS,XL        ALLOW FOR RESERVE MEMORY
                   6247:        MOV  PRLEN,WA         GET PRINT BUFFER LENGTH
                   6248:        ADD  =CFP$A,WA        ADD NO. OF CHARS IN ALPHABET
                   6249:        ADD  =NSTMX,WA        ADD CHARS FOR GTSTG BFR
                   6250:        CTB  WA,8             CONVERT TO BYTES, ALLOWING A MARGIN
                   6251:        MOV  STATB,XR         POINT TO STATIC BASE
                   6252:        ADD  WA,XR            INCREMENT FOR ABOVE BUFFERS
                   6253:        ADD  *E$HNB,XR        INCREMENT FOR HASH TABLE
                   6254:        ADD  *E$STS,XR        BUMP FOR INITIAL STATIC BLOCK
                   6255:        JSR  SYSMX            GET MXLEN
                   6256:        MOV  WA,KVMXL         PROVISIONALLY STORE AS MAXLNGTH
                   6257:        MOV  WA,MXLEN         AND AS MXLEN
                   6258:        BGT  XR,WA,INI06      SKIP IF STATIC HI EXCEEDS MXLEN
                   6259:        MOV  WA,XR            USE MXLEN INSTEAD
                   6260:        ICA  XR               MAKE BIGGER THAN MXLEN
                   6261: *
                   6262: *      HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
                   6263: *      OF DATA AREA INTO STATIC AND DYNAMIC
                   6264: *
                   6265: INI06  MOV  XR,DNAMB         DYNAMIC BASE ADRS
                   6266:        MOV  XR,DNAMP         DYNAMIC PTR
                   6267:        BNZ  WA,INI07         SKIP IF NON-ZERO MXLEN
                   6268:        DCA  XR               POINT A WORD IN FRONT
                   6269:        MOV  XR,KVMXL         USE AS MAXLNGTH
                   6270:        MOV  XR,MXLEN         AND AS MXLEN
                   6271:        EJC
                   6272: *
                   6273: *      LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
                   6274: *      SO THAT DNAME IS ABOVE DNAMB
                   6275: *
                   6276: INI07  MOV  XL,DNAME         STORE DYNAMIC END ADDRESS
                   6277:        BLT  DNAMB,XL,INI09   SKIP IF HIGH ENOUGH
                   6278:        JSR  SYSMM            REQUEST MORE MEMORY
                   6279:        WTB  XR               GET AS BAUS (SGD05)
                   6280:        ADD  XR,XL            BUMP BY AMOUNT OBTAINED
                   6281:        BNZ  XR,INI07         TRY AGAIN
                   6282:        MOV  =ENDMO,XR        POINT TO FAILURE MESSAGE
                   6283:        MOV  ENDML,WA         MESSAGE LENGTH
                   6284:        JSR  SYSPR            PRINT IT (PRTST NOT YET USABLE)
                   6285:        PPM                   SHOULD NOT FAIL
                   6286:        JSR  SYSEJ            PACK UP (STOPR NOT YET USABLE)
                   6287: *
                   6288: *      INITIALISE PRINT BUFFER WITH BLANK WORDS
                   6289: *
                   6290: INI09  MOV  PRLEN,WC         NO. OF CHARS IN PRINT BFR
                   6291:        MOV  STATB,XR         POINT TO STATIC AGAIN
                   6292:        MOV  XR,PRBUF         PRINT BFR IS PUT AT STATIC START
                   6293:        MOV  =B$SCL,(XR)+     STORE STRING TYPE CODE
                   6294:        MOV  WC,(XR)+         AND STRING LENGTH
                   6295:        CTW  WC,0             GET NUMBER OF WORDS IN BUFFER
                   6296:        MOV  WC,PRLNW         STORE FOR BUFFER CLEAR
                   6297:        LCT  WC,WC            WORDS TO CLEAR
                   6298: *
                   6299: *      LOOP TO CLEAR BUFFER
                   6300: *
                   6301: INI10  MOV  NULLW,(XR)+      STORE BLANK
                   6302:        BCT  WC,INI10         LOOP
                   6303: *
                   6304: *      INITIALIZE NUMBER OF HASH HEADERS
                   6305: *
                   6306:        MOV  =E$HNB,WA        GET NUMBER OF HASH HEADERS
                   6307:        MTI  WA               CONVERT TO INTEGER
                   6308:        STI  HSHNB            STORE FOR USE BY GTNVR PROCEDURE
                   6309:        LCT  WA,WA            COUNTER FOR CLEARING HASH TABLE
                   6310:        MOV  XR,HSHTB         POINTER TO HASH TABLE
                   6311: *
                   6312: *      LOOP TO CLEAR HASH TABLE
                   6313: *
                   6314: INI11  ZER  (XR)+            BLANK A WORD
                   6315:        BCT  WA,INI11         LOOP
                   6316:        MOV  XR,HSHTE         END OF HASH TABLE ADRS IS KEPT
                   6317: *
                   6318: *      ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
                   6319: *
                   6320:        MOV  =NSTMX,WA        GET MAX NUM CHARS IN OUTPUT NUMBER
                   6321:        CTB  WA,SCSI$         NO OF BYTES NEEDED
                   6322:        MOV  XR,GTSWK         STORE BFR ADRS
                   6323:        ADD  WA,XR            BUMP FOR WORK BFR
                   6324:        EJC
                   6325: *
                   6326: *      BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
                   6327: *
                   6328:        MOV  XR,KVALP         SAVE ALPHABET POINTER
                   6329:        MOV  =B$SCL,(XR)      STRING BLK TYPE
                   6330:        MOV  =CFP$A,WC        NO OF CHARS IN ALPHABET
                   6331:        MOV  WC,SCLEN(XR)     STORE AS STRING LENGTH
                   6332:        MOV  WC,WB            COPY CHAR COUNT
                   6333:        CTB  WB,SCSI$         NO. OF BYTES NEEDED
                   6334:        ADD  XR,WB            CURRENT END ADDRESS FOR STATIC
                   6335:        MOV  WB,STATE         STORE STATIC END ADRS
                   6336:        LCT  WC,WC            LOOP COUNTER
                   6337:        PSC  XR               POINT TO CHARS OF STRING
                   6338:        ZER  WB               SET INITIAL CHARACTER VALUE
                   6339: *
                   6340: *      LOOP TO ENTER CHARACTER CODES IN ORDER
                   6341: *
                   6342: INI12  SCH  WB,(XR)+         STORE NEXT CODE
                   6343:        ICV  WB               BUMP CODE VALUE
                   6344:        BCT  WC,INI12         LOOP TILL ALL STORED
                   6345:        CSC  XR               COMPLETE STORE CHARACTERS
                   6346: *
                   6347: *      INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT
                   6348: *
                   6349:        MOV  =V$INP,XL        POINT TO STRING /INPUT/
                   6350:        MOV  =TRTIN,WB        TRBLK TYPE FOR INPUT
                   6351:        JSR  INOUT            PERFORM INPUT ASSOCIATION
                   6352:        MOV  =V$OUP,XL        POINT TO STRING /OUTPUT/
                   6353:        MOV  =TRTOU,WB        TRBLK TYPE FOR OUTPUT
                   6354:        JSR  INOUT            PERFORM OUTPUT ASSOCIATION
                   6355:        MOV  INITR,WC         TERMINAL FLAG
                   6356:        BZE  WC,INI13         SKIP IF NO TERMINAL
                   6357:        JSR  PRPAR            ASSOCIATE TERMINAL
                   6358:        EJC
                   6359: *
                   6360: *      CHECK FOR EXPIRY DATE
                   6361: *
                   6362: INI13  JSR  SYSDC            CALL DATE CHECK
                   6363:        MOV  XS,FLPTR         IN CASE STACK OVERFLOWS IN COMPILER
                   6364: *
                   6365: *      NOW COMPILE SOURCE INPUT CODE
                   6366: *
                   6367:        JSR  CMPIL            CALL COMPILER
                   6368:        MOV  XR,R$COD         SET PTR TO FIRST CODE BLOCK
                   6369:        MOV  =NULLS,R$TTL     FORGET TITLE      (REG04)
                   6370:        MOV  =NULLS,R$STL     FORGET SUB-TITLE  (REG04)
                   6371:        ZER  R$CIM            FORGET COMPILER INPUT IMAGE
                   6372:        ZER  XL               CLEAR DUD VALUE
                   6373:        ZER  WB               DONT SHIFT DYNAMIC STORE UP
                   6374:        JSR  GBCOL            CLEAR GARBAGE LEFT FROM COMPILE
                   6375:        BNZ  CPSTS,INIX0      SKIP IF NO LISTING OF COMP STATS
                   6376:        JSR  PRTPG            EJECT PAGE
                   6377: *
                   6378: *      PRINT COMPILE STATISTICS
                   6379: *
                   6380:        MOV  DNAMP,WA         NEXT AVAILABLE LOC
                   6381:        SUB  STATB,WA         MINUS START
                   6382:        BTW  WA               CONVERT TO WORDS
                   6383:        MTI  WA               CONVERT TO INTEGER
                   6384:        MOV  =ENCM1,XR        POINT TO /MEMORY USED (WORDS)/
                   6385:        JSR  PRTMI            PRINT MESSAGE
                   6386:        MOV  DNAME,WA         END OF MEMORY
                   6387:        SUB  DNAMP,WA         MINUS NEXT AVAILABLE LOC
                   6388:        BTW  WA               CONVERT TO WORDS
                   6389:        MTI  WA               CONVERT TO INTEGER
                   6390:        MOV  =ENCM2,XR        POINT TO /MEMORY AVAILABLE (WORDS)/
                   6391:        JSR  PRTMI            PRINT LINE
                   6392:        MTI  CMERC            GET COUNT OF ERRORS AS INTEGER
                   6393:        MOV  =ENCM3,XR        POINT TO /COMPILE ERRORS/
                   6394:        JSR  PRTMI            PRINT IT
                   6395:        MTI  GBCNT            GARBAGE COLLECTION COUNT
                   6396:        SBI  INTV1            ADJUST FOR UNAVOIDABLE COLLECT
                   6397:        MOV  =STPM5,XR        POINT TO /STORAGE REGENERATIONS/
                   6398:        JSR  PRTMI            PRINT GBCOL COUNT
                   6399:        JSR  SYSTM            GET TIME
                   6400:        SBI  TIMSX            GET COMPILATION TIME
                   6401:        MOV  =ENCM4,XR        POINT TO COMPILATION TIME (MSEC)/
                   6402:        JSR  PRTMI            PRINT MESSAGE
                   6403:        ADD  =NUM05,LSTLC     BUMP LINE COUNT
                   6404: .IF    .CUEJ
                   6405:        BZE  HEADP,INIX0      NO EJECT IF NOTHING PRINTED (SDG11)
                   6406:        JSR  PRTPG            EJECT PRINTER
                   6407: .FI
                   6408:        EJC
                   6409: *
                   6410: *      PREPARE NOW TO START EXECUTION
                   6411: *
                   6412: *      SET DEFAULT INPUT RECORD LENGTH
                   6413: *
                   6414: INIX0  BGT  CSWIN,=INILN,INIX1 SKIP IF NOT DEFAULT -IN72 USED
                   6415:        MOV  =INILS,CSWIN     ELSE USE DEFAULT RECORD LENGTH
                   6416: *
                   6417: *      RESET TIMER
                   6418: *
                   6419: INIX1  JSR  SYSTM            GET TIME AGAIN
                   6420:        STI  TIMSX            STORE FOR END RUN PROCESSING
                   6421:        ADD  CSWEX,NOXEQ      ADD -NOEXECUTE FLAG
                   6422:        BNZ  NOXEQ,INIX2      JUMP IF EXECUTION SUPPRESSED
                   6423:        ZER  GBCNT            INITIALISE COLLECT COUNT
                   6424:        JSR  SYSBX            CALL BEFORE STARTING EXECUTION
                   6425: .IF    .CUEJ
                   6426: .ELSE
                   6427:        BZE  HEADP,INIY0      NO EJECT IF NOTHING PRINTED (SGD11)
                   6428:        JSR  PRTPG            EJECT PRINTER
                   6429: .FI
                   6430: *
                   6431: *      MERGE WHEN LISTING FILE SET FOR EXECUTION
                   6432: *
                   6433: INIY0  MNZ  HEADP            MARK HEADERS OUT REGARDLESS
                   6434:        ZER  -(XS)            SET FAILURE LOCATION ON STACK
                   6435:        MOV  XS,FLPTR         SAVE PTR TO FAILURE OFFSET WORD
                   6436:        MOV  R$COD,XR         LOAD PTR TO ENTRY CODE BLOCK
                   6437:        MOV  =STGXT,STAGE     SET STAGE FOR EXECUTE TIME
                   6438: .IF    .CNPF
                   6439: .ELSE
                   6440:        MOV  CMPSN,PFNTE      COPY STMTS COMPILED COUNT IN CASE
                   6441:        JSR  SYSTM            TIME YET AGAIN
                   6442:        STI  PFSTM
                   6443: .FI
                   6444:        BRI  (XR)             START XEQ WITH FIRST STATEMENT
                   6445: *
                   6446: *      HERE IF EXECUTION IS SUPPRESSED
                   6447: *
                   6448: INIX2  JSR  PRTNL            PRINT A BLANK LINE
                   6449:        MOV  =ENCM5,XR        POINT TO /EXECUTION SUPPRESSED/
                   6450:        JSR  PRTST            PRINT STRING
                   6451:        JSR  PRTNL            OUTPUT LINE
                   6452:        ZER  WA               SET ABEND VALUE TO ZERO
                   6453:        MOV  =NINI9,WB        SET SPECIAL CODE VALUE
                   6454:        JSR  SYSEJ            END OF JOB, EXIT TO SYSTEM
                   6455:        TTL  S P I T B O L -- SNOBOL4 OPERATOR ROUTINES
                   6456: *
                   6457: *      THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
                   6458: *      DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
                   6459: *
                   6460: *      ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
                   6461: *      FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
                   6462: *      CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
                   6463: *
                   6464: *      SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
                   6465: *      POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
                   6466: *      ACTUAL ENTRY POINT LABEL (O$XXX).
                   6467: *
                   6468: *      THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
                   6469: *      ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
                   6470: *
                   6471: *      THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
                   6472: *
                   6473: *      (CP)                  POINTER TO NEXT CODE WORD
                   6474: *      (XS)                  CURRENT STACK POINTER
                   6475:        EJC
                   6476: *
                   6477: *      BINARY PLUS (ADDITION)
                   6478: *
                   6479: O$ADD  ENT                   ENTRY POINT
                   6480:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   6481:        ERR  001,ADDITION LEFT OPERAND IS NOT NUMERIC
                   6482:        ERR  002,ADDITION RIGHT OPERAND IS NOT NUMERIC
                   6483: .IF    .CNRA
                   6484: .ELSE
                   6485:        PPM  OADD1            JUMP IF REAL OPERANDS
                   6486: .FI
                   6487: *
                   6488: *      HERE TO ADD TWO INTEGERS
                   6489: *
                   6490:        ADI  ICVAL(XL)        ADD RIGHT OPERAND TO LEFT
                   6491:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   6492:        ERB  003,ADDITION CAUSED INTEGER OVERFLOW
                   6493: .IF    .CNRA
                   6494: .ELSE
                   6495: *
                   6496: *      HERE TO ADD TWO REALS
                   6497: *
                   6498: OADD1  ADR  RCVAL(XL)        ADD RIGHT OPERAND TO LEFT
                   6499:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   6500:        ERB  261,ADDITION CAUSED REAL OVERFLOW
                   6501: .FI
                   6502:        EJC
                   6503: *
                   6504: *      UNARY PLUS (AFFIRMATION)
                   6505: *
                   6506: O$AFF  ENT                   ENTRY POINT
                   6507:        MOV  (XS)+,XR         LOAD OPERAND
                   6508:        JSR  GTNUM            CONVERT TO NUMERIC
                   6509:        ERR  004,AFFIRMATION OPERAND IS NOT NUMERIC
                   6510:        BRN  EXIXR            RETURN IF CONVERTED TO NUMERIC
                   6511:        EJC
                   6512: *
                   6513: *      BINARY BAR (ALTERNATION)
                   6514: *
                   6515: O$ALT  ENT                   ENTRY POINT
                   6516:        MOV  (XS)+,XR         LOAD RIGHT OPERAND
                   6517:        JSR  GTPAT            CONVERT TO PATTERN
                   6518:        ERR  005,ALTERNATION RIGHT OPERAND IS NOT PATTERN
                   6519: *
                   6520: *      MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
                   6521: *
                   6522: OALT1  MOV  =P$ALT,WB        SET PCODE FOR ALTERNATIVE NODE
                   6523:        JSR  PBILD            BUILD ALTERNATIVE NODE
                   6524:        MOV  XR,XL            SAVE ADDRESS OF ALTERNATIVE NODE
                   6525:        MOV  (XS)+,XR         LOAD LEFT OPERAND
                   6526:        JSR  GTPAT            CONVERT TO PATTERN
                   6527:        ERR  006,ALTERNATION LEFT OPERAND IS NOT PATTERN
                   6528:        BEQ  XR,=P$ALT,OALT2  JUMP IF LEFT ARG IS ALTERNATION
                   6529:        MOV  XR,PTHEN(XL)     SET LEFT OPERAND AS SUCCESSOR
                   6530:        MOV  XL,XR            MOVE RESULT TO PROPER REGISTER
                   6531:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   6532: *
                   6533: *      COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
                   6534: *
                   6535: *      THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
                   6536: *
                   6537: *      (A / B) / C = A / (B / C)
                   6538: *
                   6539: OALT2  MOV  PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE
                   6540:        MOV  PTHEN(XR),-(XS)  SET A AS NEW LEFT ARG
                   6541:        MOV  XL,XR            SET (B / C) AS NEW RIGHT ARG
                   6542:        BRN  OALT1            MERGE BACK TO BUILD A / (B / C)
                   6543:        EJC
                   6544: *
                   6545: *      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
                   6546: *
                   6547: O$AMN  ENT                   ENTRY POINT
                   6548:        LCW  XR               LOAD NUMBER OF SUBSCRIPTS
                   6549:        MOV  XR,WB            SET FLAG FOR BY NAME
                   6550:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   6551:        EJC
                   6552: *
                   6553: *      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
                   6554: *
                   6555: O$AMV  ENT                   ENTRY POINT
                   6556:        LCW  XR               LOAD NUMBER OF SUBSCRIPTS
                   6557:        ZER  WB               SET FLAG FOR BY VALUE
                   6558:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   6559:        EJC
                   6560: *
                   6561: *      ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
                   6562: *
                   6563: O$AON  ENT                   ENTRY POINT
                   6564:        MOV  (XS),XR          LOAD SUBSCRIPT VALUE
                   6565:        MOV  1(XS),XL         LOAD ARRAY VALUE
                   6566:        MOV  (XL),WA          LOAD FIRST WORD OF ARRAY OPERAND
                   6567:        BEQ  WA,=B$VCT,OAON2  JUMP IF VECTOR REFERENCE
                   6568:        BEQ  WA,=B$TBT,OAON3  JUMP IF TABLE REFERENCE
                   6569: *
                   6570: *      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
                   6571: *
                   6572: OAON1  MOV  =NUM01,XR        SET NUMBER OF SUBSCRIPTS TO ONE
                   6573:        MOV  XR,WB            SET FLAG FOR BY NAME
                   6574:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   6575: *
                   6576: *      HERE IF WE HAVE A VECTOR REFERENCE
                   6577: *
                   6578: OAON2  BNE  (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER
                   6579:        LDI  ICVAL(XR)        LOAD INTEGER SUBSCRIPT VALUE
                   6580:        MFI  WA,EXFAL         COPY AS ADDRESS INT, FAIL IF OVFLO
                   6581:        BZE  WA,EXFAL         FAIL IF ZERO
                   6582:        ADD  =VCVLB,WA        COMPUTE OFFSET IN WORDS
                   6583:        WTB  WA               CONVERT TO BYTES
                   6584:        MOV  WA,(XS)          COMPLETE NAME ON STACK
                   6585:        BLT  WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE
                   6586:        BRN  EXFAL            ELSE FAIL
                   6587: *
                   6588: *      HERE FOR TABLE REFERENCE
                   6589: *
                   6590: OAON3  MNZ  WB               SET FLAG FOR NAME REFERENCE
                   6591:        JSR  TFIND            LOCATE/CREATE TABLE ELEMENT
                   6592:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   6593:        MOV  XL,1(XS)         STORE NAME BASE ON STACK
                   6594:        MOV  WA,(XS)          STORE NAME OFFSET ON STACK
                   6595:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   6596:        EJC
                   6597: *
                   6598: *      ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
                   6599: *
                   6600: O$AOV  ENT                   ENTRY POINT
                   6601:        MOV  (XS)+,XR         LOAD SUBSCRIPT VALUE
                   6602:        MOV  (XS)+,XL         LOAD ARRAY VALUE
                   6603:        MOV  (XL),WA          LOAD FIRST WORD OF ARRAY OPERAND
                   6604:        BEQ  WA,=B$VCT,OAOV2  JUMP IF VECTOR REFERENCE
                   6605:        BEQ  WA,=B$TBT,OAOV3  JUMP IF TABLE REFERENCE
                   6606: *
                   6607: *      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
                   6608: *
                   6609: OAOV1  MOV  XL,-(XS)         RESTACK ARRAY VALUE
                   6610:        MOV  XR,-(XS)         RESTACK SUBSCRIPT
                   6611:        MOV  =NUM01,XR        SET NUMBER OF SUBSCRIPTS TO ONE
                   6612:        ZER  WB               SET FLAG FOR VALUE CALL
                   6613:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   6614: *
                   6615: *      HERE IF WE HAVE A VECTOR REFERENCE
                   6616: *
                   6617: OAOV2  BNE  (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER
                   6618:        LDI  ICVAL(XR)        LOAD INTEGER SUBSCRIPT VALUE
                   6619:        MFI  WA,EXFAL         MOVE AS ONE WORD INT, FAIL IF OVFLO
                   6620:        BZE  WA,EXFAL         FAIL IF ZERO
                   6621:        ADD  =VCVLB,WA        COMPUTE OFFSET IN WORDS
                   6622:        WTB  WA               CONVERT TO BYTES
                   6623:        BGE  WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE
                   6624:        JSR  ACESS            ACCESS VALUE
                   6625:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   6626:        BRN  EXIXR            ELSE RETURN VALUE TO CALLER
                   6627: *
                   6628: *      HERE FOR TABLE REFERENCE BY VALUE
                   6629: *
                   6630: OAOV3  ZER  WB               SET FLAG FOR VALUE REFERENCE
                   6631:        JSR  TFIND            CALL TABLE SEARCH ROUTINE
                   6632:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   6633:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   6634:        EJC
                   6635: *
                   6636: *      ASSIGNMENT
                   6637: *
                   6638: O$ASS  ENT                   ENTRY POINT
                   6639: *
                   6640: *      O$RPL (PATTERN REPLACEMENT) MERGES HERE
                   6641: *
                   6642: OASS0  MOV  (XS)+,WB         LOAD VALUE TO BE ASSIGNED
                   6643:        MOV  (XS)+,WA         LOAD NAME OFFSET
                   6644:        MOV  (XS),XL          LOAD NAME BASE
                   6645:        MOV  WB,(XS)          STORE ASSIGNED VALUE AS RESULT
                   6646:        JSR  ASIGN            PERFORM ASSIGNMENT
                   6647:        PPM  EXFAL            FAIL IF ASSIGNMENT FAILS
                   6648:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   6649:        EJC
                   6650: *
                   6651: *      COMPILATION ERROR
                   6652: *
                   6653: O$CER  ENT                   ENTRY POINT
                   6654:        ERB  007,COMPILATION ERROR ENCOUNTERED DURING EXECUTION
                   6655:        EJC
                   6656: *
                   6657: *      UNARY AT (CURSOR ASSIGNMENT)
                   6658: *
                   6659: O$CAS  ENT                   ENTRY POINT
                   6660:        MOV  (XS)+,WC         LOAD NAME OFFSET (PARM2)
                   6661:        MOV  (XS)+,XR         LOAD NAME BASE (PARM1)
                   6662:        MOV  =P$CAS,WB        SET PCODE FOR CURSOR ASSIGNMENT
                   6663:        JSR  PBILD            BUILD NODE
                   6664:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   6665:        EJC
                   6666: *
                   6667: *      CONCATENATION
                   6668: *
                   6669: O$CNC  ENT                   ENTRY POINT
                   6670:        MOV  (XS),XR          LOAD RIGHT ARGUMENT
                   6671:        BEQ  XR,=NULLS,OCNC3  JUMP IF RIGHT ARG IS NULL
                   6672:        MOV  1(XS),XL         LOAD LEFT ARGUMENT
                   6673:        BEQ  XL,=NULLS,OCNC4  JUMP IF LEFT ARGUMENT IS NULL
                   6674:        MOV  =B$SCL,WA        GET CONSTANT TO TEST FOR STRING
                   6675:        BNE  WA,(XL),OCNC2    JUMP IF LEFT ARG NOT A STRING
                   6676:        BNE  WA,(XR),OCNC2    JUMP IF RIGHT ARG NOT A STRING
                   6677: *
                   6678: *      MERGE HERE TO CONCATENATE TWO STRINGS
                   6679: *
                   6680: OCNC1  MOV  SCLEN(XL),WA     LOAD LEFT ARGUMENT LENGTH
                   6681:        ADD  SCLEN(XR),WA     COMPUTE RESULT LENGTH
                   6682:        JSR  ALOCS            ALLOCATE SCBLK FOR RESULT
                   6683:        MOV  XR,1(XS)         STORE RESULT PTR OVER LEFT ARGUMENT
                   6684:        PSC  XR               PREPARE TO STORE CHARS OF RESULT
                   6685:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARS IN LEFT ARG
                   6686:        PLC  XL               PREPARE TO LOAD LEFT ARG CHARS
                   6687:        MVC                   MOVE CHARACTERS OF LEFT ARGUMENT
                   6688:        MOV  (XS)+,XL         LOAD RIGHT ARG POINTER, POP STACK
                   6689:        MOV  SCLEN(XL),WA     LOAD NUMBER OF CHARS IN RIGHT ARG
                   6690:        PLC  XL               PREPARE TO LOAD RIGHT ARG CHARS
                   6691:        MVC                   MOVE CHARACTERS OF RIGHT ARGUMENT
                   6692:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   6693: *
                   6694: *      COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
                   6695: *
                   6696: OCNC2  JSR  GTSTG            CONVERT RIGHT ARG TO STRING
                   6697:        PPM  OCNC5            JUMP IF RIGHT ARG IS NOT STRING
                   6698:        MOV  XR,XL            SAVE RIGHT ARG PTR
                   6699:        JSR  GTSTG            CONVERT LEFT ARG TO STRING
                   6700:        PPM  OCNC6            JUMP IF LEFT ARG IS NOT A STRING
                   6701:        MOV  XR,-(XS)         STACK LEFT ARGUMENT
                   6702:        MOV  XL,-(XS)         STACK RIGHT ARGUMENT
                   6703:        MOV  XR,XL            MOVE LEFT ARG TO PROPER REG
                   6704:        MOV  (XS),XR          MOVE RIGHT ARG TO PROPER REG
                   6705:        BRN  OCNC1            MERGE BACK TO CONCATENATE STRINGS
                   6706:        EJC
                   6707: *
                   6708: *      CONCATENATION (CONTINUED)
                   6709: *
                   6710: *      COME HERE FOR NULL RIGHT ARGUMENT
                   6711: *
                   6712: OCNC3  ICA  XS               REMOVE RIGHT ARG FROM STACK
                   6713:        BRN  EXITS            RETURN WITH LEFT ARGUMENT ON STACK
                   6714: *
                   6715: *      HERE FOR NULL LEFT ARGUMENT
                   6716: *
                   6717: OCNC4  ICA  XS               UNSTACK ONE ARGUMENT
                   6718:        MOV  XR,(XS)          STORE RIGHT ARGUMENT
                   6719:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   6720: *
                   6721: *      HERE IF RIGHT ARGUMENT IS NOT A STRING
                   6722: *
                   6723: OCNC5  MOV  XR,XL            MOVE RIGHT ARGUMENT PTR
                   6724:        MOV  (XS)+,XR         LOAD LEFT ARG POINTER
                   6725: *
                   6726: *      MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
                   6727: *
                   6728: OCNC6  JSR  GTPAT            CONVERT LEFT ARG TO PATTERN
                   6729:        ERR  008,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN
                   6730:        MOV  XR,-(XS)         SAVE RESULT ON STACK
                   6731:        MOV  XL,XR            POINT TO RIGHT OPERAND
                   6732:        JSR  GTPAT            CONVERT TO PATTERN
                   6733:        ERR  009,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN
                   6734:        MOV  XR,XL            MOVE FOR PCONC
                   6735:        MOV  (XS)+,XR         RELOAD LEFT OPERAND PTR
                   6736:        JSR  PCONC            CONCATENATE PATTERNS
                   6737:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   6738:        EJC
                   6739: *
                   6740: *      COMPLEMENTATION
                   6741: *
                   6742: O$COM  ENT                   ENTRY POINT
                   6743:        MOV  (XS)+,XR         LOAD OPERAND
                   6744:        MOV  (XR),WA          LOAD TYPE WORD
                   6745: *
                   6746: *      MERGE BACK HERE AFTER CONVERSION
                   6747: *
                   6748: OCOM1  BEQ  WA,=B$ICL,OCOM2  JUMP IF INTEGER
                   6749: .IF    .CNRA
                   6750: .ELSE
                   6751:        BEQ  WA,=B$RCL,OCOM3  JUMP IF REAL
                   6752: .FI
                   6753:        JSR  GTNUM            ELSE CONVERT TO NUMERIC
                   6754:        ERR  010,COMPLEMENTATION OPERAND IS NOT NUMERIC
                   6755:        BRN  OCOM1            BACK TO CHECK CASES
                   6756: *
                   6757: *      HERE TO COMPLEMENT INTEGER
                   6758: *
                   6759: OCOM2  LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   6760:        NGI                   NEGATE
                   6761:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   6762:        ERB  011,COMPLEMENTATION CAUSED INTEGER OVERFLOW
                   6763: .IF    .CNRA
                   6764: .ELSE
                   6765: *
                   6766: *      HERE TO COMPLEMENT REAL
                   6767: *
                   6768: OCOM3  LDR  RCVAL(XR)        LOAD REAL VALUE
                   6769:        NGR                   NEGATE
                   6770:        BRN  EXREA            RETURN REAL RESULT
                   6771: .FI
                   6772:        EJC
                   6773: *
                   6774: *      BINARY SLASH (DIVISION)
                   6775: *
                   6776: O$DVD  ENT                   ENTRY POINT
                   6777:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   6778:        ERR  012,DIVISION LEFT OPERAND IS NOT NUMERIC
                   6779:        ERR  013,DIVISION RIGHT OPERAND IS NOT NUMERIC
                   6780: .IF    .CNRA
                   6781: .ELSE
                   6782:        PPM  ODVD2            JUMP IF REAL OPERANDS
                   6783: .FI
                   6784: *
                   6785: *      HERE TO DIVIDE TWO INTEGERS
                   6786: *
                   6787:        DVI  ICVAL(XL)        DIVIDE LEFT OPERAND BY RIGHT
                   6788:        INO  EXINT            RESULT OK IF NO OVERFLOW
                   6789:        ERB  014,DIVISION CAUSED INTEGER OVERFLOW
                   6790: .IF    .CNRA
                   6791: .ELSE
                   6792: *
                   6793: *      HERE TO DIVIDE TWO REALS
                   6794: *
                   6795: ODVD2  DVR  RCVAL(XL)        DIVIDE LEFT OPERAND BY RIGHT
                   6796:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   6797:        ERB  262,DIVISION CAUSED REAL OVERFLOW
                   6798: .FI
                   6799:        EJC
                   6800: *
                   6801: *      EXPONENTIATION
                   6802: *
                   6803: O$EXP  ENT                   ENTRY POINT
                   6804:        MOV  (XS)+,XR         LOAD EXPONENT
                   6805:        JSR  GTNUM            CONVERT TO NUMBER
                   6806:        ERR  015,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC
                   6807: .IF    .CNRA
                   6808: .ELSE
                   6809:        BNE  WA,=B$ICL,OEXP7  JUMP IF REAL
                   6810: .FI
                   6811:        MOV  XR,XL            MOVE EXPONENT
                   6812:        MOV  (XS)+,XR         LOAD BASE
                   6813:        JSR  GTNUM            CONVERT TO NUMERIC
                   6814:        ERR  016,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC
                   6815:        LDI  ICVAL(XL)        LOAD EXPONENT
                   6816:        ILT  OEXP8            ERROR IF NEGATIVE EXPONENT
                   6817: .IF    .CNRA
                   6818: .ELSE
                   6819:        BEQ  WA,=B$RCL,OEXP3  JUMP IF BASE IS REAL
                   6820: .FI
                   6821: *
                   6822: *      HERE TO EXPONENTIATE AN INTEGER
                   6823: *
                   6824:        MFI  WA,OEXP2         CONVERT EXPONENT TO 1 WORD INTEGER
                   6825:        LCT  WA,WA            SET LOOP COUNTER
                   6826:        LDI  INTV1            LOAD INITIAL VALUE OF 1
                   6827:        BNZ  WA,OEXP1         JUMP IF NON-ZERO EXPONENT
                   6828:        INE  EXINT            GIVE ZERO AS RESULT FOR NONZERO**0
                   6829:        BRN  OEXP4            ELSE ERROR OF 0**0
                   6830: *
                   6831: *      LOOP TO PERFORM EXPONENTIATION
                   6832: *
                   6833: OEXP1  MLI  ICVAL(XR)        MULTIPLY BY BASE
                   6834:        IOV  OEXP2            JUMP IF OVERFLOW
                   6835:        BCT  WA,OEXP1         LOOP BACK TILL COMPUTATION COMPLETE
                   6836:        BRN  EXINT            THEN RETURN INTEGER RESULT
                   6837: *
                   6838: *      HERE IF INTEGER OVERFLOW
                   6839: *
                   6840: OEXP2  ERB  017,EXPONENTIATION CAUSED INTEGER OVERFLOW
                   6841:        EJC
                   6842: *
                   6843: *      EXPONENTIATION (CONTINUED)
                   6844: .IF    .CNRA
                   6845: .ELSE
                   6846: *
                   6847: *      HERE TO EXPONENTIATE A REAL
                   6848: *
                   6849: OEXP3  MFI  WA,OEXP6         CONVERT EXPONENT TO ONE WORD
                   6850:        LCT  WA,WA            SET LOOP COUNTER
                   6851:        LDR  REAV1            LOAD 1.0 AS INITIAL VALUE
                   6852:        BNZ  WA,OEXP5         JUMP IF NON-ZERO EXPONENT
                   6853:        RNE  EXREA            RETURN 1.0 IF NONZERO**ZERO
                   6854: .FI
                   6855: *
                   6856: *      HERE FOR ERROR OF 0**0 OR 0.0**0
                   6857: *
                   6858: OEXP4  ERB  018,EXPONENTIATION RESULT IS UNDEFINED
                   6859: .IF    .CNRA
                   6860: .ELSE
                   6861: *
                   6862: *      LOOP TO PERFORM EXPONENTIATION
                   6863: *
                   6864: OEXP5  MLR  RCVAL(XR)        MULTIPLY BY BASE
                   6865:        ROV  OEXP6            JUMP IF OVERFLOW
                   6866:        BCT  WA,OEXP5         LOOP TILL COMPUTATION COMPLETE
                   6867:        BRN  EXREA            THEN RETURN REAL RESULT
                   6868: *
                   6869: *      HERE IF REAL OVERFLOW
                   6870: *
                   6871: OEXP6  ERB  266,EXPONENTIATION CAUSED REAL OVERFLOW
                   6872: *
                   6873: *      HERE IF REAL EXPONENT
                   6874: *
                   6875: OEXP7  ERB  267,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER
                   6876: .FI
                   6877: *
                   6878: *      HERE FOR NEGATIVE EXPONENT
                   6879: *
                   6880: OEXP8  ERB  019,EXPONENTIATION RIGHT OPERAND IS NEGATIVE
                   6881:        EJC
                   6882: *
                   6883: *      FAILURE IN EXPRESSION EVALUATION
                   6884: *
                   6885: *      THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
                   6886: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
                   6887: *      CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
                   6888: *
                   6889: O$FEX  ENT                   ENTRY POINT
                   6890:        BRN  EVLX6            JUMP TO FAILURE LOC IN EVALX
                   6891:        EJC
                   6892: *
                   6893: *      FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
                   6894: *
                   6895: O$FIF  ENT                   ENTRY POINT
                   6896:        ERB  020,GOTO EVALUATION FAILURE
                   6897:        EJC
                   6898: *
                   6899: *      FUNCTION CALL (MORE THAN ONE ARGUMENT)
                   6900: *
                   6901: O$FNC  ENT                   ENTRY POINT
                   6902:        LCW  WA               LOAD NUMBER OF ARGUMENTS
                   6903:        LCW  XR               LOAD FUNCTION VRBLK POINTER
                   6904:        MOV  VRFNC(XR),XL     LOAD FUNCTION POINTER
                   6905:        BNE  WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
                   6906:        BRI  (XL)             JUMP TO FUNCTION IF ARG COUNT OK
                   6907:        EJC
                   6908: *
                   6909: *      FUNCTION NAME ERROR
                   6910: *
                   6911: O$FNE  ENT                   ENTRY POINT
                   6912:        LCW  WA               GET NEXT CODE WORD
                   6913:        BNE  WA,=ORNM$,OFNE1  FAIL IF NOT EVALUATING EXPRESSION
                   6914:        BZE  2(XS),EVLX3      OK IF EXPR. WAS WANTED BY VALUE
                   6915: *
                   6916: *      HERE FOR ERROR
                   6917: *
                   6918: OFNE1  ERB  021,FUNCTION CALLED BY NAME RETURNED A VALUE
                   6919:        EJC
                   6920: *
                   6921: *      FUNCTION CALL (SINGLE ARGUMENT)
                   6922: *
                   6923: O$FNS  ENT                   ENTRY POINT
                   6924:        LCW  XR               LOAD FUNCTION VRBLK POINTER
                   6925:        MOV  =NUM01,WA        SET NUMBER OF ARGUMENTS TO ONE
                   6926:        MOV  VRFNC(XR),XL     LOAD FUNCTION POINTER
                   6927:        BNE  WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
                   6928:        BRI  (XL)             JUMP TO FUNCTION IF ARG COUNT OK
                   6929:        EJC
                   6930: *      CALL TO UNDEFINED FUNCTION
                   6931: *
                   6932: O$FUN  ENT                   ENTRY POINT
                   6933:        ERB  022,UNDEFINED FUNCTION CALLED
                   6934:        EJC
                   6935: *
                   6936: *      EXECUTE COMPLEX GOTO
                   6937: *
                   6938: O$GOC  ENT                   ENTRY POINT
                   6939:        MOV  1(XS),XR         LOAD NAME BASE POINTER
                   6940:        BHI  XR,STATE,OGOC1   JUMP IF NOT NATURAL VARIABLE
                   6941:        ADD  *VRTRA,XR        ELSE POINT TO VRTRA FIELD
                   6942:        BRI  (XR)             AND JUMP THROUGH IT
                   6943: *
                   6944: *      HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
                   6945: *
                   6946: OGOC1  ERB  023,GOTO OPERAND IS NOT A NATURAL VARIABLE
                   6947:        EJC
                   6948: *
                   6949: *      EXECUTE DIRECT GOTO
                   6950: *
                   6951: O$GOD  ENT                   ENTRY POINT
                   6952:        MOV  (XS),XR          LOAD OPERAND
                   6953:        MOV  (XR),WA          LOAD FIRST WORD
                   6954:        BEQ  WA,=B$CDS,BCDS0  JUMP IF CODE BLOCK TO CODE ROUTINE
                   6955:        BEQ  WA,=B$CDC,BCDC0  JUMP IF CODE BLOCK TO CODE ROUTINE
                   6956:        ERB  024,GOTO OPERAND IN DIRECT GOTO IS NOT CODE
                   6957:        EJC
                   6958: *
                   6959: *      SET GOTO FAILURE TRAP
                   6960: *
                   6961: *      THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
                   6962: *      DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
                   6963: *
                   6964: O$GOF  ENT                   ENTRY POINT
                   6965:        MOV  FLPTR,XR         POINT TO FAIL OFFSET ON STACK
                   6966:        ICA  (XR)             POINT FAILURE TO O$FIF WORD
                   6967:        ICP                   POINT TO NEXT CODE WORD
                   6968:        BRN  EXITS            EXIT TO CONTINUE
                   6969:        EJC
                   6970: *
                   6971: *      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
                   6972: *
                   6973: *      THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
                   6974: *      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
                   6975: *      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
                   6976: *
                   6977: O$IMA  ENT                   ENTRY POINT
                   6978:        MOV  =P$IMC,WB        SET PCODE FOR LAST NODE
                   6979:        MOV  (XS)+,WC         POP NAME OFFSET (PARM2)
                   6980:        MOV  (XS)+,XR         POP NAME BASE (PARM1)
                   6981:        JSR  PBILD            BUILD P$IMC NODE
                   6982:        MOV  XR,XL            SAVE PTR TO NODE
                   6983:        MOV  (XS),XR          LOAD LEFT ARGUMENT
                   6984:        JSR  GTPAT            CONVERT TO PATTERN
                   6985:        ERR  025,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN
                   6986:        MOV  XR,(XS)          SAVE PTR TO LEFT OPERAND PATTERN
                   6987:        MOV  =P$IMA,WB        SET PCODE FOR FIRST NODE
                   6988:        JSR  PBILD            BUILD P$IMA NODE
                   6989:        MOV  (XS)+,PTHEN(XR)  SET LEFT OPERAND AS P$IMA SUCCESSOR
                   6990:        JSR  PCONC            CONCATENATE TO FORM FINAL PATTERN
                   6991:        BRN  EXIXR            ALL DONE
                   6992:        EJC
                   6993: *
                   6994: *      INDIRECTION (BY NAME)
                   6995: *
                   6996: O$INN  ENT                   ENTRY POINT
                   6997:        MNZ  WB               SET FLAG FOR RESULT BY NAME
                   6998:        BRN  INDIR            JUMP TO COMMON ROUTINE
                   6999:        EJC
                   7000: *
                   7001: *      INTERROGATION
                   7002: *
                   7003: O$INT  ENT                   ENTRY POINT
                   7004:        MOV  =NULLS,(XS)      REPLACE OPERAND WITH NULL
                   7005:        BRN  EXITS            EXIT FOR NEXT CODE WORD
                   7006:        EJC
                   7007: *
                   7008: *      INDIRECTION (BY VALUE)
                   7009: *
                   7010: O$INV  ENT                   ENTRY POINT
                   7011:        ZER  WB               SET FLAG FOR BY VALUE
                   7012:        BRN  INDIR            JUMP TO COMMON ROUTINE
                   7013:        EJC
                   7014: *
                   7015: *      KEYWORD REFERENCE (BY NAME)
                   7016: *
                   7017: O$KWN  ENT                   ENTRY POINT
                   7018:        JSR  KWNAM            GET KEYWORD NAME
                   7019:        BRN  EXNAM            EXIT WITH RESULT NAME
                   7020:        EJC
                   7021: *
                   7022: *      KEYWORD REFERENCE (BY VALUE)
                   7023: *
                   7024: O$KWV  ENT                   ENTRY POINT
                   7025:        JSR  KWNAM            GET KEYWORD NAME
                   7026:        MOV  XR,DNAMP         DELETE KVBLK
                   7027:        JSR  ACESS            ACCESS VALUE
                   7028:        PPM  EXNUL            DUMMY (UNUSED) FAILURE RETURN
                   7029:        BRN  EXIXR            JUMP WITH VALUE IN XR
                   7030:        EJC
                   7031: *
                   7032: *      LOAD EXPRESSION BY NAME
                   7033: *
                   7034: O$LEX  ENT                   ENTRY POINT
                   7035:        MOV  *EVSI$,WA        SET SIZE OF EVBLK
                   7036:        JSR  ALLOC            ALLOCATE SPACE FOR EVBLK
                   7037:        MOV  =B$EVT,(XR)      SET TYPE WORD
                   7038:        MOV  =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER
                   7039:        LCW  WA               LOAD EXBLK POINTER
                   7040:        MOV  WA,EVEXP(XR)     SET EXBLK POINTER
                   7041:        MOV  XR,XL            MOVE NAME BASE TO PROPER REG
                   7042:        MOV  *EVVAR,WA        SET NAME OFFSET = ZERO
                   7043:        BRN  EXNAM            EXIT WITH NAME IN (XL,WA)
                   7044:        EJC
                   7045: *
                   7046: *      LOAD PATTERN VALUE
                   7047: *
                   7048: O$LPT  ENT                   ENTRY POINT
                   7049:        LCW  XR               LOAD PATTERN POINTER
                   7050:        BRN  EXIXR            STACK PTR AND OBEY NEXT CODE WORD
                   7051:        EJC
                   7052: *
                   7053: *      LOAD VARIABLE NAME
                   7054: *
                   7055: O$LVN  ENT                   ENTRY POINT
                   7056:        LCW  WA               LOAD VRBLK POINTER
                   7057:        MOV  WA,-(XS)         STACK VRBLK PTR (NAME BASE)
                   7058:        MOV  *VRVAL,-(XS)     STACK NAME OFFSET
                   7059:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   7060:        EJC
                   7061: *
                   7062: *      BINARY ASTERISK (MULTIPLICATION)
                   7063: *
                   7064: O$MLT  ENT                   ENTRY POINT
                   7065:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   7066:        ERR  026,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC
                   7067:        ERR  027,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC
                   7068: .IF    .CNRA
                   7069: .ELSE
                   7070:        PPM  OMLT1            JUMP IF REAL OPERANDS
                   7071: .FI
                   7072: *
                   7073: *      HERE TO MULTIPLY TWO INTEGERS
                   7074: *
                   7075:        MLI  ICVAL(XL)        MULTIPLY LEFT OPERAND BY RIGHT
                   7076:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   7077:        ERB  028,MULTIPLICATION CAUSED INTEGER OVERFLOW
                   7078: .IF    .CNRA
                   7079: .ELSE
                   7080: *
                   7081: *      HERE TO MULTIPLY TWO REALS
                   7082: *
                   7083: OMLT1  MLR  RCVAL(XL)        MULTIPLY LEFT OPERAND BY RIGHT
                   7084:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   7085:        ERB  263,MULTIPLICATION CAUSED REAL OVERFLOW
                   7086: .FI
                   7087:        EJC
                   7088: *
                   7089: *      NAME REFERENCE
                   7090: *
                   7091: O$NAM  ENT                   ENTRY POINT
                   7092:        MOV  *NMSI$,WA        SET LENGTH OF NMBLK
                   7093:        JSR  ALLOC            ALLOCATE NMBLK
                   7094:        MOV  =B$NML,(XR)      SET NAME BLOCK CODE
                   7095:        MOV  (XS)+,NMOFS(XR)  SET NAME OFFSET FROM OPERAND
                   7096:        MOV  (XS)+,NMBAS(XR)  SET NAME BASE FROM OPERAND
                   7097:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   7098:        EJC
                   7099: *
                   7100: *      NEGATION
                   7101: *
                   7102: *      INITIAL ENTRY
                   7103: *
                   7104: O$NTA  ENT                   ENTRY POINT
                   7105:        LCW  WA               LOAD NEW FAILURE OFFSET
                   7106:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   7107:        MOV  WA,-(XS)         STACK NEW FAILURE OFFSET
                   7108:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   7109:        BRN  EXITS            JUMP TO CONTINUE EXECUTION
                   7110: *
                   7111: *      ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
                   7112: *
                   7113: O$NTB  ENT                   ENTRY POINT
                   7114:        MOV  2(XS),FLPTR      RESTORE OLD FAILURE POINTER
                   7115:        BRN  EXFAL            AND FAIL
                   7116: *
                   7117: *      ENTRY FOR FAILURE DURING OPERAND EVALUATION
                   7118: *
                   7119: O$NTC  ENT                   ENTRY POINT
                   7120:        ICA  XS               POP FAILURE OFFSET
                   7121:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   7122:        BRN  EXNUL            EXIT GIVING NULL RESULT
                   7123:        EJC
                   7124: *
                   7125: *      USE OF UNDEFINED OPERATOR
                   7126: *
                   7127: O$OUN  ENT                   ENTRY POINT
                   7128:        ERB  029,UNDEFINED OPERATOR REFERENCED
                   7129:        EJC
                   7130: *
                   7131: *      BINARY DOT (PATTERN ASSIGNMENT)
                   7132: *
                   7133: *      THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
                   7134: *      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
                   7135: *      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
                   7136: *
                   7137: O$PAS  ENT                   ENTRY POINT
                   7138:        MOV  =P$PAC,WB        LOAD PCODE FOR P$PAC NODE
                   7139:        MOV  (XS)+,WC         LOAD NAME OFFSET (PARM2)
                   7140:        MOV  (XS)+,XR         LOAD NAME BASE (PARM1)
                   7141:        JSR  PBILD            BUILD P$PAC NODE
                   7142:        MOV  XR,XL            SAVE PTR TO NODE
                   7143:        MOV  (XS),XR          LOAD LEFT OPERAND
                   7144:        JSR  GTPAT            CONVERT TO PATTERN
                   7145:        ERR  030,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN
                   7146:        MOV  XR,(XS)          SAVE PTR TO LEFT OPERAND PATTERN
                   7147:        MOV  =P$PAA,WB        SET PCODE FOR P$PAA NODE
                   7148:        JSR  PBILD            BUILD P$PAA NODE
                   7149:        MOV  (XS)+,PTHEN(XR)  SET LEFT OPERAND AS P$PAA SUCCESSOR
                   7150:        JSR  PCONC            CONCATENATE TO FORM FINAL PATTERN
                   7151:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   7152:        EJC
                   7153: *
                   7154: *      PATTERN MATCH (BY NAME, FOR REPLACEMENT)
                   7155: *
                   7156: O$PMN  ENT                   ENTRY POINT
                   7157:        ZER  WB               SET TYPE CODE FOR MATCH BY NAME
                   7158:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
                   7159:        EJC
                   7160: *
                   7161: *      PATTERN MATCH (STATEMENT)
                   7162: *
                   7163: *      O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
                   7164: *      OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
                   7165: *      CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
                   7166: *
                   7167: O$PMS  ENT                   ENTRY POINT
                   7168:        MOV  =NUM02,WB        SET FLAG FOR STATEMENT TO MATCH
                   7169:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
                   7170:        EJC
                   7171: *
                   7172: *      PATTERN MATCH (BY VALUE)
                   7173: *
                   7174: O$PMV  ENT                   ENTRY POINT
                   7175:        MOV  =NUM01,WB        SET TYPE CODE FOR VALUE MATCH
                   7176:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
                   7177:        EJC
                   7178: *
                   7179: *      POP TOP ITEM ON STACK
                   7180: *
                   7181: O$POP  ENT                   ENTRY POINT
                   7182:        ICA  XS               POP TOP STACK ENTRY
                   7183:        BRN  EXITS            OBEY NEXT CODE WORD
                   7184:        EJC
                   7185: *
                   7186: *      TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
                   7187: *
                   7188: O$STP  ENT                   ENTRY POINT
                   7189:        BRN  LEND0            JUMP TO END CIRCUIT
                   7190:        EJC
                   7191: *
                   7192: *      RETURN NAME FROM EXPRESSION
                   7193: *      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
                   7194: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
                   7195: *      A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
                   7196: *
                   7197: O$RNM  ENT                   ENTRY POINT
                   7198:        BRN  EVLX4            RETURN TO EVALX PROCEDURE
                   7199:        EJC
                   7200: *
                   7201: *      PATTERN REPLACEMENT
                   7202: *
                   7203: *      WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
                   7204: *      ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
                   7205: *
                   7206: *                            SUBJECT NAME BASE
                   7207: *                            SUBJECT NAME OFFSET
                   7208: *                            INITIAL CURSOR VALUE
                   7209: *                            FINAL CURSOR VALUE
                   7210: *                            SUBJECT POINTER
                   7211: *      (XS) ---------------- REPLACEMENT VALUE
                   7212: *
                   7213: O$RPL  ENT                   ENTRY POINT
                   7214:        JSR  GTSTG            CONVERT REPLACEMENT VAL TO STRING
                   7215:        ERR  031,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING
                   7216: *
                   7217: *      GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
                   7218: *
                   7219:        MOV  (XS),XL          LOAD SUBJECT STRING POINTER
                   7220: .IF    .CNBF
                   7221: .ELSE
                   7222:        BEQ  (XL),=B$BCT,ORPL4 BRANCH IF BUFFER ASSIGNMENT
                   7223: .FI
                   7224:        ADD  SCLEN(XL),WA     ADD SUBJECT STRING LENGTH
                   7225:        ADD  2(XS),WA         ADD STARTING CURSOR
                   7226:        SUB  1(XS),WA         MINUS FINAL CURSOR = TOTAL LENGTH
                   7227:        BZE  WA,ORPL3         JUMP IF RESULT IS NULL
                   7228:        MOV  XR,-(XS)         RESTACK REPLACEMENT STRING
                   7229:        JSR  ALOCS            ALLOCATE SCBLK FOR RESULT
                   7230:        MOV  3(XS),WA         GET INITIAL CURSOR (PART 1 LEN)
                   7231:        MOV  XR,3(XS)         STACK RESULT POINTER
                   7232:        PSC  XR               POINT TO CHARACTERS OF RESULT
                   7233: *
                   7234: *      MOVE PART 1 (START OF SUBJECT) TO RESULT
                   7235: *
                   7236:        BZE  WA,ORPL1         JUMP IF FIRST PART IS NULL
                   7237:        MOV  1(XS),XL         ELSE POINT TO SUBJECT STRING
                   7238:        PLC  XL               POINT TO SUBJECT STRING CHARS
                   7239:        MVC                   MOVE FIRST PART TO RESULT
                   7240:        EJC
                   7241: *      PATTERN REPLACEMENT (CONTINUED)
                   7242: *
                   7243: *      NOW MOVE IN REPLACEMENT VALUE
                   7244: *
                   7245: ORPL1  MOV  (XS)+,XL         LOAD REPLACEMENT STRING, POP
                   7246:        MOV  SCLEN(XL),WA     LOAD LENGTH
                   7247:        BZE  WA,ORPL2         JUMP IF NULL REPLACEMENT
                   7248:        PLC  XL               ELSE POINT TO CHARS OF REPLACEMENT
                   7249:        MVC                   MOVE IN CHARS (PART 2)
                   7250: *
                   7251: *      NOW MOVE IN REMAINDER OF STRING (PART 3)
                   7252: *
                   7253: ORPL2  MOV  (XS)+,XL         LOAD SUBJECT STRING POINTER, POP
                   7254:        MOV  (XS)+,WC         LOAD FINAL CURSOR, POP
                   7255:        MOV  SCLEN(XL),WA     LOAD SUBJECT STRING LENGTH
                   7256:        SUB  WC,WA            MINUS FINAL CURSOR = PART 3 LENGTH
                   7257:        BZE  WA,OASS0         JUMP TO ASSIGN IF PART 3 IS NULL
                   7258:        PLC  XL,WC            ELSE POINT TO LAST PART OF STRING
                   7259:        MVC                   MOVE PART 3 TO RESULT
                   7260:        BRN  OASS0            JUMP TO PERFORM ASSIGNMENT
                   7261: *
                   7262: *      HERE IF RESULT IS NULL
                   7263: *
                   7264: ORPL3  ADD  *NUM02,XS        POP SUBJECT STR PTR, FINAL CURSOR
                   7265:        MOV  =NULLS,(XS)      SET NULL RESULT
                   7266:        BRN  OASS0            JUMP TO ASSIGN NULL VALUE
                   7267: .IF    .CNBF
                   7268: .ELSE
                   7269: *
                   7270: *      HERE FOR BUFFER SUBSTRING ASSIGNMENT
                   7271: *
                   7272: ORPL4  MOV  XR,XL            COPY SCBLK REPLACEMENT PTR
                   7273:        MOV  (XS)+,XR         UNSTACK BCBLK PTR
                   7274:        MOV  (XS)+,WB         GET FINAL CURSOR VALUE
                   7275:        MOV  (XS)+,WA         GET INITIAL CURSOR
                   7276:        SUB  WA,WB            GET LENGTH IN WB
                   7277:        ADD  *NUM02,XS        GET RID OF NAME BASE/OFFSET
                   7278:        JSR  INSBF            INSERT SUBSTRING
                   7279:        PPM                   CONVERT FAIL IMPOSSIBLE
                   7280:        PPM  EXFAL            FAIL IF INSERT FAILS
                   7281:        BRN  EXNUL            ELSE NULL RESULT
                   7282: .FI
                   7283:        EJC
                   7284: *
                   7285: *      RETURN VALUE FROM EXPRESSION
                   7286: *
                   7287: *      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
                   7288: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
                   7289: *      A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
                   7290: *
                   7291: O$RVL  ENT                   ENTRY POINT
                   7292:        BRN  EVLX3            RETURN TO EVALX PROCEDURE
                   7293:        EJC
                   7294: *
                   7295: *      SELECTION
                   7296: *
                   7297: *      INITIAL ENTRY
                   7298: *
                   7299: O$SLA  ENT                   ENTRY POINT
                   7300:        LCW  WA               LOAD NEW FAILURE OFFSET
                   7301:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   7302:        MOV  WA,-(XS)         STACK NEW FAILURE OFFSET
                   7303:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   7304:        BRN  EXITS            JUMP TO EXECUTE FIRST ALTERNATIVE
                   7305: *
                   7306: *      ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
                   7307: *
                   7308: O$SLB  ENT                   ENTRY POINT
                   7309:        MOV  (XS)+,XR         LOAD RESULT
                   7310:        ICA  XS               POP FAIL OFFSET
                   7311:        MOV  (XS),FLPTR       RESTORE OLD FAILURE POINTER
                   7312:        MOV  XR,(XS)          RESTACK RESULT
                   7313:        LCW  WA               LOAD NEW CODE OFFSET
                   7314:        ADD  R$COD,WA         POINT TO ABSOLUTE CODE LOCATION
                   7315:        LCP  WA               SET NEW CODE POINTER
                   7316:        BRN  EXITS            JUMP TO CONTINUE PAST SELECTION
                   7317: *
                   7318: *      ENTRY AT START OF SUBSEQUENT ALTERNATIVES
                   7319: *
                   7320: O$SLC  ENT                   ENTRY POINT
                   7321:        LCW  WA               LOAD NEW FAIL OFFSET
                   7322:        MOV  WA,(XS)          STORE NEW FAIL OFFSET
                   7323:        BRN  EXITS            JUMP TO EXECUTE NEXT ALTERNATIVE
                   7324: *
                   7325: *      ENTRY AT START OF LAST ALTERNATIVE
                   7326: *
                   7327: O$SLD  ENT                   ENTRY POINT
                   7328:        ICA  XS               POP FAILURE OFFSET
                   7329:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   7330:        BRN  EXITS            JUMP TO EXECUTE LAST ALTERNATIVE
                   7331:        EJC
                   7332: *
                   7333: *      BINARY MINUS (SUBTRACTION)
                   7334: *
                   7335: O$SUB  ENT                   ENTRY POINT
                   7336:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   7337:        ERR  032,SUBTRACTION LEFT OPERAND IS NOT NUMERIC
                   7338:        ERR  033,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC
                   7339: .IF    .CNRA
                   7340: .ELSE
                   7341:        PPM  OSUB1            JUMP IF REAL OPERANDS
                   7342: .FI
                   7343: *
                   7344: *      HERE TO SUBTRACT TWO INTEGERS
                   7345: *
                   7346:        SBI  ICVAL(XL)        SUBTRACT RIGHT OPERAND FROM LEFT
                   7347:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   7348:        ERB  034,SUBTRACTION CAUSED INTEGER OVERFLOW
                   7349: .IF    .CNRA
                   7350: .ELSE
                   7351: *
                   7352: *      HERE TO SUBTRACT TWO REALS
                   7353: *
                   7354: OSUB1  SBR  RCVAL(XL)        SUBTRACT RIGHT OPERAND FROM LEFT
                   7355:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   7356:        ERB  264,SUBTRACTION CAUSED REAL OVERFLOW
                   7357: .FI
                   7358:        EJC
                   7359: *
                   7360: *      DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
                   7361: *
                   7362: O$TXR  ENT                   ENTRY POINT
                   7363:        BRN  TRXQ1            JUMP INTO TRXEQ PROCEDURE
                   7364:        EJC
                   7365: *
                   7366: *      UNEXPECTED FAILURE
                   7367: *
                   7368: *      NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
                   7369: *      TRANSFER TO SYSTEM LABEL CONTINUE
                   7370: *      WILL RESULT IN LOOPING HERE.  DIFFICULT TO AVOID EXCEPT
                   7371: *      WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
                   7372: *      ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
                   7373: *
                   7374: O$UNF  ENT                   ENTRY POINT
                   7375:        ERB  035,UNEXPECTED FAILURE IN -NOFAIL MODE
                   7376:        TTL  S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
                   7377: *
                   7378: *      THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
                   7379: *      WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
                   7380: *
                   7381: *      CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
                   7382: *
                   7383: *      ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
                   7384: *      LETTER VARIABLE NAME IDENTIFIER.
                   7385: *
                   7386: *      ENTRIES ARE IN ALPHABETICAL ORDER
                   7387:        EJC
                   7388: *
                   7389: *      ABORT
                   7390: *
                   7391: L$ABO  ENT                   ENTRY POINT
                   7392: *
                   7393: *      MERGE HERE IF EXECUTION TERMINATES IN ERROR
                   7394: *
                   7395: LABO1  MOV  KVERT,WA         LOAD ERROR CODE
                   7396:        BZE  WA,LABO2         JUMP IF NO ERROR HAS OCCURED
                   7397: .IF    .CSAX
                   7398:        JSR  SYSAX            CALL AFTER EXECUTION PROC (REG04)
                   7399: .ELSE
                   7400: .FI
                   7401:        JSR  PRTPG            ELSE EJECT PRINTER
                   7402:        JSR  ERMSG            PRINT ERROR MESSAGE
                   7403:        ZER  XR               INDICATE NO MESSAGE TO PRINT
                   7404:        BRN  STOPR            JUMP TO ROUTINE TO STOP RUN
                   7405: *
                   7406: *      HERE IF NO ERROR HAD OCCURED
                   7407: *
                   7408: LABO2  ERB  036,GOTO ABORT WITH NO PRECEDING ERROR
                   7409:        EJC
                   7410: *
                   7411: *      CONTINUE
                   7412: *
                   7413: L$CNT  ENT                   ENTRY POINT
                   7414: *
                   7415: *      MERGE HERE AFTER EXECUTION ERROR
                   7416: *
                   7417: LCNT1  MOV  R$CNT,XR         LOAD CONTINUATION CODE BLOCK PTR
                   7418:        BZE  XR,LCNT2         JUMP IF NO PREVIOUS ERROR
                   7419:        ZER  R$CNT            CLEAR FLAG
                   7420:        MOV  XR,R$COD         ELSE STORE AS NEW CODE BLOCK PTR
                   7421:        ADD  STXOF,XR         ADD FAILURE OFFSET
                   7422:        LCP  XR               LOAD CODE POINTER
                   7423:        MOV  FLPTR,XS         RESET STACK POINTER
                   7424:        BRN  EXITS            JUMP TO TAKE INDICATED FAILURE
                   7425: *
                   7426: *      HERE IF NO PREVIOUS ERROR
                   7427: *
                   7428: LCNT2  ERB  037,GOTO CONTINUE WITH NO PRECEDING ERROR
                   7429:        EJC
                   7430: *
                   7431: *      END
                   7432: *
                   7433: L$END  ENT                   ENTRY POINT
                   7434: *
                   7435: *      MERGE HERE FROM END CODE CIRCUIT
                   7436: *
                   7437: LEND0  MOV  =ENDMS,XR        POINT TO MESSAGE /NORMAL TERM../
                   7438:        BRN  STOPR            JUMP TO ROUTINE TO STOP RUN
                   7439:        EJC
                   7440: *
                   7441: *      FRETURN
                   7442: *
                   7443: L$FRT  ENT                   ENTRY POINT
                   7444:        MOV  =SCFRT,WA        POINT TO STRING /FRETURN/
                   7445:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
                   7446:        EJC
                   7447: *
                   7448: *      NRETURN
                   7449: *
                   7450: L$NRT  ENT                   ENTRY POINT
                   7451:        MOV  =SCNRT,WA        POINT TO STRING /NRETURN/
                   7452:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
                   7453:        EJC
                   7454: *
                   7455: *      RETURN
                   7456: *
                   7457: L$RTN  ENT                   ENTRY POINT
                   7458:        MOV  =SCRTN,WA        POINT TO STRING /RETURN/
                   7459:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
                   7460:        EJC
                   7461: *
                   7462: *      UNDEFINED LABEL
                   7463: *
                   7464: L$UND  ENT                   ENTRY POINT
                   7465:        ERB  038,GOTO UNDEFINED LABEL
                   7466:        TTL  S P I T B O L -- BLOCK ACTION ROUTINES
                   7467: *
                   7468: *      THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
                   7469: *      VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
                   7470: *      POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
                   7471: *      POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
                   7472: *      PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
                   7473: *      LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
                   7474: *      (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
                   7475: *      THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
                   7476: *
                   7477: *      THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
                   7478: *      FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
                   7479: *      THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
                   7480: *
                   7481: *      IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
                   7482: *      TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
                   7483: *      IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
                   7484: *
                   7485: *      FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
                   7486: *      AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
                   7487: *
                   7488: *      THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
                   7489: *      WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
                   7490: *      THE INDIVIDUAL ROUTINES AS REQUIRED.
                   7491: *
                   7492: *      THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
                   7493: *      FOLLOWING EXCEPTIONS.
                   7494: *
                   7495: *      THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
                   7496: *      THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
                   7497: *      THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
                   7498: *
                   7499: *      THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
                   7500: *      SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
                   7501: *      TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
                   7502: *
                   7503: *      THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
                   7504: *      PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
                   7505: *      AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
                   7506: *
                   7507: *      THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
                   7508: *      ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
                   7509: *      MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
                   7510: *
                   7511: B$AAA  ENT  BL$$I            ENTRY POINT OF FIRST BLOCK ROUTINE
                   7512:        EJC
                   7513: *
                   7514: *      EXBLK
                   7515: *
                   7516: *      THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
                   7517: *      THE STACK AS A VALUE.
                   7518: *
                   7519: *      (XR)                  POINTER TO EXBLK
                   7520: *
                   7521: B$EXL  ENT  BL$EX            ENTRY POINT (EXBLK)
                   7522:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   7523:        EJC
                   7524: *
                   7525: *      SEBLK
                   7526: *
                   7527: *      THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
                   7528: *      CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
                   7529: *
                   7530: B$SEL  ENT  BL$SE            ENTRY POINT (SEBLK)
                   7531:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   7532: *
                   7533: *      DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
                   7534: *
                   7535: B$E$$  ENT  BL$$I            ENTRY POINT
                   7536:        EJC
                   7537: *
                   7538: *      TRBLK
                   7539: *
                   7540: *      THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
                   7541: *
                   7542: B$TRT  ENT  BL$TR            ENTRY POINT (TRBLK)
                   7543: *
                   7544: *      DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
                   7545: *
                   7546: B$T$$  ENT  BL$$I            END OF TRBLK,SEBLK,EXBLK ENTRIES
                   7547:        EJC
                   7548: *
                   7549: *      ARBLK
                   7550: *
                   7551: *      THE ROUTINE FOR ARBLK IS NEVER EXECUTED
                   7552: *
                   7553: B$ART  ENT  BL$AR            ENTRY POINT (ARBLK)
                   7554:        EJC
                   7555: .IF    .CNBF
                   7556: .ELSE
                   7557: *
                   7558: *      BCBLK
                   7559: *
                   7560: *      THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
                   7561: *
                   7562: *      (XR)                  POINTER TO BCBLK
                   7563: *
                   7564: B$BCT  ENT  BL$BC            ENTRY POINT (BCBLK)
                   7565:        EJC
                   7566: *
                   7567: *      BFBLK
                   7568: *
                   7569: *      THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
                   7570: *
                   7571: *      (XR)                  POINTER TO BFBLK
                   7572: *
                   7573: B$BFT  ENT  BL$BF            ENTRY POINT (BFBLK)
                   7574:        EJC
                   7575: .FI
                   7576: *
                   7577: *      CCBLK
                   7578: *
                   7579: *      THE ROUTINE FOR CCBLK IS NEVER ENTERED
                   7580: *
                   7581: B$CCT  ENT  BL$CC            ENTRY POINT (CCBLK)
                   7582:        EJC
                   7583: *
                   7584: *      CDBLK
                   7585: *
                   7586: *      THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
                   7587: *      THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
                   7588: *
                   7589: *      ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
                   7590: *
                   7591: *      (XR)                  POINTER TO CDBLK
                   7592: *
                   7593: B$CDC  ENT  BL$CD            ENTRY POINT (CDBLK)
                   7594: BCDC0  MOV  FLPTR,XS         POP GARBAGE OFF STACK
                   7595:        MOV  CDFAL(XR),(XS)   SET FAILURE OFFSET
                   7596:        BRN  STMGO            ENTER STMT
                   7597:        EJC
                   7598: *
                   7599: *      CDBLK (CONTINUED)
                   7600: *
                   7601: *      ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
                   7602: *
                   7603: *      (XR)                  POINTER TO CDBLK
                   7604: *
                   7605: B$CDS  ENT  BL$CD            ENTRY POINT (CDBLK)
                   7606: BCDS0  MOV  FLPTR,XS         POP GARBAGE OFF STACK
                   7607:        MOV  *CDFAL,(XS)      SET FAILURE OFFSET
                   7608:        BRN  STMGO            ENTER STMT
                   7609:        EJC
                   7610: *
                   7611: *      CMBLK
                   7612: *
                   7613: *      THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
                   7614: *
                   7615: B$CMT  ENT  BL$CM            ENTRY POINT (CMBLK)
                   7616:        EJC
                   7617: *
                   7618: *      CTBLK
                   7619: *
                   7620: *      THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
                   7621: *
                   7622: B$CTT  ENT  BL$CT            ENTRY POINT (CTBLK)
                   7623:        EJC
                   7624: *
                   7625: *      DFBLK
                   7626: *
                   7627: *      THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
                   7628: *      TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
                   7629: *
                   7630: *      (XL)                  POINTER TO DFBLK
                   7631: *
                   7632: B$DFC  ENT  BL$DF            ENTRY POINT
                   7633:        MOV  DFPDL(XL),WA     LOAD LENGTH OF PDBLK
                   7634:        JSR  ALLOC            ALLOCATE PDBLK
                   7635:        MOV  =B$PDT,(XR)      STORE TYPE WORD
                   7636:        MOV  XL,PDDFP(XR)     STORE DFBLK POINTER
                   7637:        MOV  XR,WC            SAVE POINTER TO PDBLK
                   7638:        ADD  WA,XR            POINT PAST PDBLK
                   7639:        LCT  WA,FARGS(XL)     SET TO COUNT FIELDS
                   7640: *
                   7641: *      LOOP TO ACQUIRE FIELD VALUES FROM STACK
                   7642: *
                   7643: BDFC1  MOV  (XS)+,-(XR)      MOVE A FIELD VALUE
                   7644:        BCT  WA,BDFC1         LOOP TILL ALL MOVED
                   7645:        MOV  WC,XR            RECALL POINTER TO PDBLK
                   7646:        BRN  EXSID            EXIT SETTING ID FIELD
                   7647:        EJC
                   7648: *
                   7649: *      EFBLK
                   7650: *
                   7651: *      THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
                   7652: *      ENTRY TO CALL AN EXTERNAL FUNCTION.
                   7653: *
                   7654: *      (XL)                  POINTER TO EFBLK
                   7655: *
                   7656: B$EFC  ENT  BL$EF            ENTRY POINT (EFBLK)
                   7657: .IF    .CNLD
                   7658: .ELSE
                   7659:        MOV  FARGS(XL),WC     LOAD NUMBER OF ARGUMENTS
                   7660:        WTB  WC               CONVERT TO OFFSET
                   7661:        MOV  XL,-(XS)         SAVE POINTER TO EFBLK
                   7662:        MOV  XS,XT            COPY POINTER TO ARGUMENTS
                   7663: *
                   7664: *      LOOP TO CONVERT ARGUMENTS
                   7665: *
                   7666: BEFC1  ICA  XT               POINT TO NEXT ENTRY
                   7667:        MOV  (XS),XR          LOAD POINTER TO EFBLK
                   7668:        DCA  WC               DECREMENT EFTAR OFFSET
                   7669:        ADD  WC,XR            POINT TO NEXT EFTAR ENTRY
                   7670:        MOV  EFTAR(XR),XR     LOAD EFTAR ENTRY
                   7671: .IF    .CNRA
                   7672:        BSW  XR,3             SWITCH ON TYPE
                   7673: .ELSE
                   7674:        BSW  XR,4             SWITCH ON TYPE
                   7675: .FI
                   7676:        IFF  0,BEFC7          NO CONVERSION NEEDED
                   7677:        IFF  1,BEFC2          STRING
                   7678:        IFF  2,BEFC3          INTEGER
                   7679: .IF    .CNRA
                   7680: .ELSE
                   7681:        IFF  3,BEFC4          REAL
                   7682: .FI
                   7683:        ESW                   END OF SWITCH ON TYPE
                   7684: *
                   7685: *      HERE TO CONVERT TO STRING
                   7686: *
                   7687: BEFC2  MOV  (XT),-(XS)       STACK ARG PTR
                   7688:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   7689:        ERR  039,EXTERNAL FUNCTION ARGUMENT IS NOT STRING
                   7690:        BRN  BEFC6            JUMP TO MERGE
                   7691:        EJC
                   7692: *
                   7693: *      EFBLK (CONTINUED)
                   7694: *
                   7695: *      HERE TO CONVERT AN INTEGER
                   7696: *
                   7697: BEFC3  MOV  (XT),XR          LOAD NEXT ARGUMENT
                   7698:        MOV  WC,BEFOF         SAVE OFFSET
                   7699:        JSR  GTINT            CONVERT TO INTEGER
                   7700:        ERR  040,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER
                   7701: .IF    .CNRA
                   7702: .ELSE
                   7703:        BRN  BEFC5            MERGE WITH REAL CASE
                   7704: *
                   7705: *      HERE TO CONVERT A REAL
                   7706: *
                   7707: BEFC4  MOV  (XT),XR          LOAD NEXT ARGUMENT
                   7708:        MOV  WC,BEFOF         SAVE OFFSET
                   7709:        JSR  GTREA            CONVERT TO REAL
                   7710:        ERR  265,EXTERNAL FUNCTION ARGUMENT IS NOT REAL
                   7711: .FI
                   7712: *
                   7713: *      INTEGER CASE MERGES HERE
                   7714: *
                   7715: BEFC5  MOV  BEFOF,WC         RESTORE OFFSET
                   7716: *
                   7717: *      STRING MERGES HERE
                   7718: *
                   7719: BEFC6  MOV  XR,(XT)          STORE CONVERTED RESULT
                   7720: *
                   7721: *      NO CONVERSION MERGES HERE
                   7722: *
                   7723: BEFC7  BNZ  WC,BEFC1         LOOP BACK IF MORE TO GO
                   7724: *
                   7725: *      HERE AFTER CONVERTING ALL THE ARGUMENTS
                   7726: *
                   7727:        MOV  (XS)+,XL         RESTORE EFBLK POINTER
                   7728:        MOV  FARGS(XL),WA     GET NUMBER OF ARGS
                   7729:        JSR  SYSEX            CALL ROUTINE TO CALL EXTERNAL FNC
                   7730:        PPM  EXFAL            FAIL IF FAILURE
                   7731:        EJC
                   7732: *
                   7733: *      EFBLK (CONTINUED)
                   7734: *
                   7735: *      RETURN HERE WITH RESULT IN XR
                   7736: *
                   7737: *      FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
                   7738: *
                   7739:        MOV  EFRSL(XL),WB     GET RESULT TYPE ID
                   7740:        BNZ  WB,BEFA8         BRANCH IF NOT UNCONVERTED
                   7741:        BNE  (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING
                   7742:        BZE  SCLEN(XR),EXNUL  RETURN NULL IF NULL
                   7743: *
                   7744: *      HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
                   7745: *
                   7746: BEFA8  BNE  WB,=NUM01,BEFC8  JUMP IF NOT A STRING
                   7747:        BZE  SCLEN(XR),EXNUL  RETURN NULL IF NULL
                   7748: *
                   7749: *      RETURN IF RESULT IS IN DYNAMIC STORAGE
                   7750: *
                   7751: BEFC8  BLT  XR,DNAMB,BEFC9   JUMP IF NOT IN DYNAMIC STORAGE
                   7752:        BLE  XR,DNAMP,EXIXR   RETURN RESULT IF ALREADY DYNAMIC
                   7753: *
                   7754: *      HERE WE COPY A RESULT INTO THE DYNAMIC REGION
                   7755: *
                   7756: BEFC9  MOV  (XR),WA          GET POSSIBLE TYPE WORD
                   7757:        BZE  WB,BEF11         JUMP IF UNCONVERTED RESULT
                   7758:        MOV  =B$SCL,WA        STRING
                   7759:        BEQ  WB,=NUM01,BEF10  YES JUMP
                   7760:        MOV  =B$ICL,WA        INTEGER
                   7761:        BEQ  WB,=NUM02,BEF10  YES JUMP
                   7762: .IF    .CNRA
                   7763: .ELSE
                   7764:        MOV  =B$RCL,WA        REAL
                   7765: .FI
                   7766: *
                   7767: *      STORE TYPE WORD IN RESULT
                   7768: *
                   7769: BEF10  MOV  WA,(XR)          STORED BEFORE COPYING TO DYNAMIC
                   7770: *
                   7771: *      MERGE FOR UNCONVERTED RESULT
                   7772: *
                   7773: BEF11  JSR  BLKLN            GET LENGTH OF BLOCK
                   7774:        MOV  XR,XL            COPY ADDRESS OF OLD BLOCK
                   7775:        JSR  ALLOC            ALLOCATE DYNAMIC BLOCK SAME SIZE
                   7776:        MOV  XR,-(XS)         SET POINTER TO NEW BLOCK AS RESULT
                   7777:        MVW                   COPY OLD BLOCK TO DYNAMIC BLOCK
                   7778:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   7779: .FI
                   7780:        EJC
                   7781: *
                   7782: *      EVBLK
                   7783: *
                   7784: *      THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
                   7785: *
                   7786: B$EVT  ENT  BL$EV            ENTRY POINT (EVBLK)
                   7787:        EJC
                   7788: *
                   7789: *      FFBLK
                   7790: *
                   7791: *      THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
                   7792: *      TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
                   7793: *
                   7794: *      (XL)                  POINTER TO FFBLK
                   7795: *
                   7796: B$FFC  ENT  BL$FF            ENTRY POINT (FFBLK)
                   7797:        MOV  XL,XR            COPY FFBLK POINTER
                   7798:        LCW  WC               LOAD NEXT CODE WORD
                   7799:        MOV  (XS),XL          LOAD PDBLK POINTER
                   7800:        BNE  (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL
                   7801:        MOV  PDDFP(XL),WA     LOAD DFBLK POINTER FROM PDBLK
                   7802: *
                   7803: *      LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
                   7804: *
                   7805: BFFC1  BEQ  WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK
                   7806:        MOV  FFNXT(XR),XR     ELSE LINK TO NEXT FFBLK ON CHAIN
                   7807:        BNZ  XR,BFFC1         LOOP BACK IF ANOTHER ENTRY TO CHECK
                   7808: *
                   7809: *      HERE FOR BAD ARGUMENT
                   7810: *
                   7811: BFFC2  ERB  041,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE
                   7812:        EJC
                   7813: *
                   7814: *      FFBLK (CONTINUED)
                   7815: *
                   7816: *      HERE AFTER LOCATING CORRECT FFBLK
                   7817: *
                   7818: BFFC3  MOV  FFOFS(XR),WA     LOAD FIELD OFFSET
                   7819:        BEQ  WC,=OFNE$,BFFC5  JUMP IF CALLED BY NAME
                   7820:        ADD  WA,XL            ELSE POINT TO VALUE FIELD
                   7821:        MOV  (XL),XR          LOAD VALUE
                   7822:        BNE  (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED
                   7823:        SUB  WA,XL            ELSE RESTORE NAME BASE,OFFSET
                   7824:        MOV  WC,(XS)          SAVE NEXT CODE WORD OVER PDBLK PTR
                   7825:        JSR  ACESS            ACCESS VALUE
                   7826:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   7827:        MOV  (XS),WC          RESTORE NEXT CODE WORD
                   7828: *
                   7829: *      HERE AFTER GETTING VALUE IN (XR)
                   7830: *
                   7831: BFFC4  MOV  XR,(XS)          STORE VALUE ON STACK (OVER PDBLK)
                   7832:        MOV  WC,XR            COPY NEXT CODE WORD
                   7833:        MOV  (XR),XL          LOAD ENTRY ADDRESS
                   7834:        BRI  XL               JUMP TO ROUTINE FOR NEXT CODE WORD
                   7835: *
                   7836: *      HERE IF CALLED BY NAME
                   7837: *
                   7838: BFFC5  MOV  WA,-(XS)         STORE NAME OFFSET (BASE IS SET)
                   7839:        BRN  EXITS            EXIT WITH NAME ON STACK
                   7840:        EJC
                   7841: *
                   7842: *      ICBLK
                   7843: *
                   7844: *      THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
                   7845: *      CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
                   7846: *
                   7847: *      (XR)                  POINTER TO ICBLK
                   7848: *
                   7849: B$ICL  ENT  BL$IC            ENTRY POINT (ICBLK)
                   7850:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   7851:        EJC
                   7852: *
                   7853: *      KVBLK
                   7854: *
                   7855: *      THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
                   7856: *
                   7857: B$KVT  ENT  BL$KV            ENTRY POINT (KVBLK)
                   7858:        EJC
                   7859: *
                   7860: *      NMBLK
                   7861: *
                   7862: *      THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
                   7863: *      CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
                   7864: *      WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
                   7865: *      BE PREEVALUATED AT COMPILE TIME.
                   7866: *
                   7867: *      (XR)                  POINTER TO NMBLK
                   7868: *
                   7869: B$NML  ENT  BL$NM            ENTRY POINT (NMBLK)
                   7870:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   7871:        EJC
                   7872: *
                   7873: *      PDBLK
                   7874: *
                   7875: *      THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
                   7876: *
                   7877: B$PDT  ENT  BL$PD            ENTRY POINT (PDBLK)
                   7878:        EJC
                   7879: *
                   7880: *      PFBLK
                   7881: *
                   7882: *      THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
                   7883: *      TO CALL A PROGRAM DEFINED FUNCTION.
                   7884: *
                   7885: *      (XL)                  POINTER TO PFBLK
                   7886: *
                   7887: *      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
                   7888: *      CONTROL TO THE PROGRAM DEFINED FUNCTION.
                   7889: *
                   7890: *                            SAVED VALUE OF FIRST ARGUMENT
                   7891: *                            .
                   7892: *                            SAVED VALUE OF LAST ARGUMENT
                   7893: *                            SAVED VALUE OF FIRST LOCAL
                   7894: *                            .
                   7895: *                            SAVED VALUE OF LAST LOCAL
                   7896: *                            SAVED VALUE OF FUNCTION NAME
                   7897: *                            SAVED CODE BLOCK PTR (R$COD)
                   7898: *                            SAVED CODE POINTER (-R$COD)
                   7899: *                            SAVED VALUE OF FLPRT
                   7900: *                            SAVED VALUE OF FLPTR
                   7901: *                            POINTER TO PFBLK
                   7902: *      FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
                   7903: *
                   7904: B$PFC  ENT  BL$PF            ENTRY POINT (PFBLK)
                   7905:        MOV  XL,BPFPF         SAVE PFBLK PTR (NEED NOT BE RELOC)
                   7906:        MOV  XL,XR            COPY FOR THE MOMENT
                   7907:        MOV  PFVBL(XR),XL     POINT TO VRBLK FOR FUNCTION
                   7908: *
                   7909: *      LOOP TO FIND OLD VALUE OF FUNCTION
                   7910: *
                   7911: BPF01  MOV  XL,WB            SAVE POINTER
                   7912:        MOV  VRVAL(XL),XL     LOAD VALUE
                   7913:        BEQ  (XL),=B$TRT,BPF01 LOOP IF TRBLK
                   7914: *
                   7915: *      SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
                   7916: *
                   7917:        MOV  XL,BPFSV         SAVE OLD VALUE
                   7918:        MOV  WB,XL            POINT BACK TO BLOCK WITH VALUE
                   7919:        MOV  =NULLS,VRVAL(XL) SET VALUE TO NULL
                   7920:        MOV  FARGS(XR),WA     LOAD NUMBER OF ARGUMENTS
                   7921:        ADD  *PFARG,XR        POINT TO PFARG ENTRIES
                   7922:        BZE  WA,BPF04         JUMP IF NO ARGUMENTS
                   7923:        MOV  XS,XT            PTR TO LAST ARG
                   7924:        WTB  WA               CONVERT NO. OF ARGS TO BYTES OFFSET
                   7925:        ADD  WA,XT            POINT BEFORE FIRST ARG
                   7926:        MOV  XT,BPFXT         REMEMBER ARG POINTER
                   7927:        EJC
                   7928: *
                   7929: *      PFBLK (CONTINUED)
                   7930: *
                   7931: *      LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
                   7932: *
                   7933: BPF02  MOV  (XR)+,XL         LOAD VRBLK PTR FOR NEXT ARGUMENT
                   7934: *
                   7935: *      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
                   7936: *
                   7937: BPF03  MOV  XL,WC            SAVE POINTER
                   7938:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE
                   7939:        BEQ  (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK
                   7940: *
                   7941: *      SAVE OLD VALUE AND GET NEW VALUE
                   7942: *
                   7943:        MOV  XL,WA            KEEP OLD VALUE
                   7944:        MOV  BPFXT,XT         POINT BEFORE NEXT STACKED ARG
                   7945:        MOV  -(XT),WB         LOAD ARGUMENT (NEW VALUE)
                   7946:        MOV  WA,(XT)          SAVE OLD VALUE
                   7947:        MOV  XT,BPFXT         KEEP ARG PTR FOR NEXT TIME
                   7948:        MOV  WC,XL            POINT BACK TO BLOCK WITH VALUE
                   7949:        MOV  WB,VRVAL(XL)     SET NEW VALUE
                   7950:        BNE  XS,BPFXT,BPF02   LOOP IF NOT ALL DONE
                   7951: *
                   7952: *      NOW PROCESS LOCALS
                   7953: *
                   7954: BPF04  MOV  BPFPF,XL         RESTORE PFBLK POINTER
                   7955:        MOV  PFNLO(XL),WA     LOAD NUMBER OF LOCALS
                   7956:        BZE  WA,BPF07         JUMP IF NO LOCALS
                   7957:        MOV  =NULLS,WB        GET NULL CONSTANT
                   7958:        LCT  WA,WA            SET LOCAL COUNTER
                   7959: *
                   7960: *      LOOP TO PROCESS LOCALS
                   7961: *
                   7962: BPF05  MOV  (XR)+,XL         LOAD VRBLK PTR FOR NEXT LOCAL
                   7963: *
                   7964: *      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
                   7965: *
                   7966: BPF06  MOV  XL,WC            SAVE POINTER
                   7967:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE
                   7968:        BEQ  (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK
                   7969: *
                   7970: *      SAVE OLD VALUE AND SET NULL AS NEW VALUE
                   7971: *
                   7972:        MOV  XL,-(XS)         STACK OLD VALUE
                   7973:        MOV  WC,XL            POINT BACK TO BLOCK WITH VALUE
                   7974:        MOV  WB,VRVAL(XL)     SET NULL AS NEW VALUE
                   7975:        BCT  WA,BPF05         LOOP TILL ALL LOCALS PROCESSED
                   7976:        EJC
                   7977: *
                   7978: *      PFBLK (CONTINUED)
                   7979: *
                   7980: *      HERE AFTER PROCESSING ARGUMENTS AND LOCALS
                   7981: *
                   7982: .IF    .CNPF
                   7983: BPF07  MOV  R$COD,WA         LOAD OLD CODE BLOCK POINTER
                   7984: .ELSE
                   7985: BPF07  ZER  XR               ZERO REG XR IN CASE
                   7986:        BZE  KVPFL,BPF7C      SKIP IF PROFILING IS OFF
                   7987:        BEQ  KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE
                   7988: *
                   7989: *      HERE IF &PROFILE = 1
                   7990: *
                   7991:        JSR  SYSTM            GET CURRENT TIME
                   7992:        STI  PFETM            SAVE FOR A SEC
                   7993:        SBI  PFSTM            FIND TIME USED BY CALLER
                   7994:        JSR  ICBLD            BUILD INTO AN ICBLK
                   7995:        LDI  PFETM            RELOAD CURRENT TIME
                   7996:        BRN  BPF7B            MERGE
                   7997: *
                   7998: *       HERE IF &PROFILE = 2
                   7999: *
                   8000: BPF7A  LDI  PFSTM            GET START TIME OF CALLING STMT
                   8001:        JSR  ICBLD            ASSEMBLE AN ICBLK ROUND IT
                   8002:        JSR  SYSTM            GET NOW TIME
                   8003: *
                   8004: *      BOTH TYPES OF PROFILE MERGE HERE
                   8005: *
                   8006: BPF7B  STI  PFSTM            SET START TIME OF 1ST FUNC STMT
                   8007:        MNZ  PFFNC            FLAG FUNCTION ENTRY
                   8008: *
                   8009: *      NO PROFILING MERGES HERE
                   8010: *
                   8011: BPF7C  MOV  XR,-(XS)         STACK ICBLK PTR (OR ZERO)
                   8012:        MOV  R$COD,WA         LOAD OLD CODE BLOCK POINTER
                   8013: .FI
                   8014:        SCP  WB               GET CODE POINTER
                   8015:        SUB  WA,WB            MAKE CODE POINTER INTO OFFSET
                   8016:        MOV  BPFPF,XL         RECALL PFBLK POINTER
                   8017:        MOV  BPFSV,-(XS)      STACK OLD VALUE OF FUNCTION NAME
                   8018:        MOV  WA,-(XS)         STACK CODE BLOCK POINTER
                   8019:        MOV  WB,-(XS)         STACK CODE OFFSET
                   8020:        MOV  FLPRT,-(XS)      STACK OLD FLPRT
                   8021:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   8022:        MOV  XL,-(XS)         STACK POINTER TO PFBLK
                   8023:        ZER  -(XS)            DUMMY ZERO ENTRY FOR FAIL RETURN
                   8024:        CHK                   CHECK FOR STACK OVERFLOW
                   8025:        MOV  XS,FLPTR         SET NEW FAIL RETURN VALUE
                   8026:        MOV  XS,FLPRT         SET NEW FLPRT
                   8027:        MOV  KVTRA,WA         LOAD TRACE VALUE
                   8028:        ADD  KVFTR,WA         ADD FTRACE VALUE
                   8029:        BNZ  WA,BPF09         JUMP IF TRACING POSSIBLE
                   8030:        ICV  KVFNC            ELSE BUMP FNCLEVEL
                   8031: *
                   8032: *      HERE TO ACTUALLY JUMP TO FUNCTION
                   8033: *
                   8034: BPF08  MOV  PFCOD(XL),XR     POINT TO CODE
                   8035:        BRI  (XR)             OFF TO EXECUTE FUNCTION
                   8036: *
                   8037: *      HERE IF TRACING IS POSSIBLE
                   8038: *
                   8039: BPF09  MOV  PFCTR(XL),XR     LOAD POSSIBLE CALL TRACE TRBLK
                   8040:        MOV  PFVBL(XL),XL     LOAD VRBLK POINTER FOR FUNCTION
                   8041:        MOV  *VRVAL,WA        SET NAME OFFSET FOR VARIABLE
                   8042:        BZE  KVTRA,BPF10      JUMP IF TRACE MODE IS OFF
                   8043:        BZE  XR,BPF10         OR IF THERE IS NO CALL TRACE
                   8044: *
                   8045: *      HERE IF CALL TRACED
                   8046: *
                   8047:        DCV  KVTRA            DECREMENT TRACE COUNT
                   8048:        BZE  TRFNC(XR),BPF11  JUMP IF PRINT TRACE
                   8049:        JSR  TRXEQ            EXECUTE FUNCTION TYPE TRACE
                   8050:        EJC
                   8051: *
                   8052: *      PFBLK (CONTINUED)
                   8053: *
                   8054: *      HERE TO TEST FOR FTRACE TRACE
                   8055: *
                   8056: BPF10  BZE  KVFTR,BPF16      JUMP IF FTRACE IS OFF
                   8057:        DCV  KVFTR            ELSE DECREMENT FTRACE
                   8058: *
                   8059: *      HERE FOR PRINT TRACE
                   8060: *
                   8061: BPF11  JSR  PRTSN            PRINT STATEMENT NUMBER
                   8062:        JSR  PRTNM            PRINT FUNCTION NAME
                   8063:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   8064:        JSR  PRTCH            PRINT LEFT PAREN
                   8065:        MOV  1(XS),XL         RECOVER PFBLK POINTER
                   8066:        BZE  FARGS(XL),BPF15  SKIP IF NO ARGUMENTS
                   8067:        ZER  WB               ELSE SET ARGUMENT COUNTER
                   8068:        BRN  BPF13            JUMP INTO LOOP
                   8069: *
                   8070: *      LOOP TO PRINT ARGUMENT VALUES
                   8071: *
                   8072: BPF12  MOV  =CH$CM,WA        LOAD COMMA
                   8073:        JSR  PRTCH            PRINT TO SEPARATE FROM LAST ARG
                   8074: *
                   8075: *      MERGE HERE FIRST TIME (NO COMMA REQUIRED)
                   8076: *
                   8077: BPF13  MOV  WB,(XS)          SAVE ARG CTR (OVER FAILOFFS IS OK)
                   8078:        WTB  WB               CONVERT TO BYTE OFFSET
                   8079:        ADD  WB,XL            POINT TO NEXT ARGUMENT POINTER
                   8080:        MOV  PFARG(XL),XR     LOAD NEXT ARGUMENT VRBLK PTR
                   8081:        SUB  WB,XL            RESTORE PFBLK POINTER
                   8082:        MOV  VRVAL(XR),XR     LOAD NEXT VALUE
                   8083:        JSR  PRTVL            PRINT ARGUMENT VALUE
                   8084:        EJC
                   8085: *
                   8086: *      HERE AFTER DEALING WITH ONE ARGUMENT
                   8087: *
                   8088:        MOV  (XS),WB          RESTORE ARGUMENT COUNTER
                   8089:        ICV  WB               INCREMENT ARGUMENT COUNTER
                   8090:        BLT  WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT
                   8091: *
                   8092: *      MERGE HERE IN NO ARGS CASE TO PRINT PAREN
                   8093: *
                   8094: BPF15  MOV  =CH$RP,WA        LOAD RIGHT PAREN
                   8095:        JSR  PRTCH            PRINT TO TERMINATE OUTPUT
                   8096:        JSR  PRTNL            TERMINATE PRINT LINE
                   8097: *
                   8098: *      MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
                   8099: *
                   8100: BPF16  ICV  KVFNC            INCREMENT FNCLEVEL
                   8101:        MOV  R$FNC,XL         LOAD PTR TO POSSIBLE TRBLK
                   8102:        JSR  KTREX            CALL KEYWORD TRACE ROUTINE
                   8103: *
                   8104: *      CALL FUNCTION AFTER TRACE TESTS COMPLETE
                   8105: *
                   8106:        MOV  1(XS),XL         RESTORE PFBLK POINTER
                   8107:        BRN  BPF08            JUMP BACK TO EXECUTE FUNCTION
                   8108: .IF    .CNRA
                   8109: .ELSE
                   8110:        EJC
                   8111: *
                   8112: *      RCBLK
                   8113: *
                   8114: *      THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
                   8115: *      CODE TO LOAD A REAL VALUE ONTO THE STACK.
                   8116: *
                   8117: *      (XR)                  POINTER TO RCBLK
                   8118: *
                   8119: B$RCL  ENT  BL$RC            ENTRY POINT (RCBLK)
                   8120:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   8121: .FI
                   8122:        EJC
                   8123: *
                   8124: *      SCBLK
                   8125: *
                   8126: *      THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
                   8127: *      CODE TO LOAD A STRING VALUE ONTO THE STACK.
                   8128: *
                   8129: *      (XR)                  POINTER TO SCBLK
                   8130: *
                   8131: B$SCL  ENT  BL$SC            ENTRY POINT (SCBLK)
                   8132:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   8133:        EJC
                   8134: *
                   8135: *      TBBLK
                   8136: *
                   8137: *      THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
                   8138: *
                   8139: B$TBT  ENT  BL$TB            ENTRY POINT (TBBLK)
                   8140:        EJC
                   8141: *
                   8142: *      TEBLK
                   8143: *
                   8144: *      THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
                   8145: *
                   8146: B$TET  ENT  BL$TE            ENTRY POINT (TEBLK)
                   8147:        EJC
                   8148: *
                   8149: *      VCBLK
                   8150: *
                   8151: *      THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
                   8152: *
                   8153: B$VCT  ENT  BL$VC            ENTRY POINT (VCBLK)
                   8154:        EJC
                   8155: *
                   8156: *      VRBLK
                   8157: *
                   8158: *      THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
                   8159: *      THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
                   8160: *
                   8161: B$VR$  ENT  BL$$I            MARK START OF VRBLK ENTRY POINTS
                   8162: *
                   8163: *      ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
                   8164: *      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
                   8165: *      THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
                   8166: *      ASSOCIATION IS CURRENTLY ACTIVE.
                   8167: *
                   8168: *      (XR)                  POINTER TO VRGET FIELD OF VRBLK
                   8169: *
                   8170: B$VRA  ENT  BL$$I            ENTRY POINT
                   8171:        MOV  XR,XL            COPY NAME BASE (VRGET = 0)
                   8172:        MOV  *VRVAL,WA        SET NAME OFFSET
                   8173:        JSR  ACESS            ACCESS VALUE
                   8174:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   8175:        BRN  EXIXR            ELSE EXIT WITH RESULT IN XR
                   8176:        EJC
                   8177: *
                   8178: *      VRBLK (CONTINUED)
                   8179: *
                   8180: *      ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
                   8181: *      THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
                   8182: *      OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
                   8183: *
                   8184: B$VRE  ENT                   ENTRY POINT
                   8185:        ERB  042,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE
                   8186:        EJC
                   8187: *
                   8188: *      VRBLK (CONTINUED)
                   8189: *
                   8190: *      ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
                   8191: *      FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
                   8192: *
                   8193: *      (XR)                  POINTER TO VRTRA FIELD OF VRBLK
                   8194: *
                   8195: B$VRG  ENT                   ENTRY POINT
                   8196:        MOV  VRLBO(XR),XR     LOAD CODE POINTER
                   8197:        MOV  (XR),XL          LOAD ENTRY ADDRESS
                   8198:        BRI  XL               JUMP TO ROUTINE FOR NEXT CODE WORD
                   8199:        EJC
                   8200: *
                   8201: *      VRBLK (CONTINUED)
                   8202: *
                   8203: *      ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
                   8204: *      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
                   8205: *
                   8206: *      (XR)                  POINTS TO VRGET FIELD OF VRBLK
                   8207: *
                   8208: B$VRL  ENT                   ENTRY POINT
                   8209:        MOV  VRVAL(XR),-(XS)  LOAD VALUE ONTO STACK (VRGET = 0)
                   8210:        BRN  EXITS            OBEY NEXT CODE WORD
                   8211:        EJC
                   8212: *
                   8213: *      VRBLK (CONTINUED)
                   8214: *
                   8215: *      ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
                   8216: *      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
                   8217: *
                   8218: *      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
                   8219: *
                   8220: B$VRS  ENT                   ENTRY POINT
                   8221:        MOV  (XS),VRVLO(XR)   STORE VALUE, LEAVE ON STACK
                   8222:        BRN  EXITS            OBEY NEXT CODE WORD
                   8223:        EJC
                   8224: *
                   8225: *      VRBLK (CONTINUED)
                   8226: *
                   8227: *      VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
                   8228: *      GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
                   8229: *      TRACE IS CURRENTLY ACTIVE.
                   8230: *
                   8231: B$VRT  ENT                   ENTRY POINT
                   8232:        SUB  *VRTRA,XR        POINT BACK TO START OF VRBLK
                   8233:        MOV  XR,XL            COPY VRBLK POINTER
                   8234:        MOV  *VRVAL,WA        SET NAME OFFSET
                   8235:        MOV  VRLBL(XL),XR     LOAD POINTER TO TRBLK
                   8236:        BZE  KVTRA,BVRT2      JUMP IF TRACE IS OFF
                   8237:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   8238:        BZE  TRFNC(XR),BVRT1  JUMP IF PRINT TRACE CASE
                   8239:        JSR  TRXEQ            ELSE EXECUTE FULL TRACE
                   8240:        BRN  BVRT2            MERGE TO JUMP TO LABEL
                   8241: *
                   8242: *      HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
                   8243: *
                   8244: BVRT1  JSR  PRTSN            PRINT STATEMENT NUMBER
                   8245:        MOV  XL,XR            COPY VRBLK POINTER
                   8246:        MOV  =CH$CL,WA        COLON
                   8247:        JSR  PRTCH            PRINT IT
                   8248:        MOV  =CH$PP,WA        LEFT PAREN
                   8249:        JSR  PRTCH            PRINT IT
                   8250:        JSR  PRTVN            PRINT LABEL NAME
                   8251:        MOV  =CH$RP,WA        RIGHT PAREN
                   8252:        JSR  PRTCH            PRINT IT
                   8253:        JSR  PRTNL            TERMINATE LINE
                   8254:        MOV  VRLBL(XL),XR     POINT BACK TO TRBLK
                   8255: *
                   8256: *      MERGE HERE TO JUMP TO LABEL
                   8257: *
                   8258: BVRT2  MOV  TRLBL(XR),XR     LOAD POINTER TO ACTUAL CODE
                   8259:        BRI  (XR)             EXECUTE STATEMENT AT LABEL
                   8260:        EJC
                   8261: *
                   8262: *      VRBLK (CONTINUED)
                   8263: *
                   8264: *      ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
                   8265: *      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
                   8266: *      THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
                   8267: *      ASSOCIATION IS CURRENTLY ACTIVE.
                   8268: *
                   8269: *      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
                   8270: *
                   8271: B$VRV  ENT                   ENTRY POINT
                   8272:        MOV  (XS),WB          LOAD VALUE (LEAVE COPY ON STACK)
                   8273:        SUB  *VRSTO,XR        POINT TO VRBLK
                   8274:        MOV  XR,XL            COPY VRBLK POINTER
                   8275:        MOV  *VRVAL,WA        SET OFFSET
                   8276:        JSR  ASIGN            CALL ASSIGNMENT ROUTINE
                   8277:        PPM  EXFAL            FAIL IF ASSIGNMENT FAILS
                   8278:        BRN  EXITS            ELSE RETURN WITH RESULT ON STACK
                   8279:        EJC
                   8280: *
                   8281: *      XNBLK
                   8282: *
                   8283: *      THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
                   8284: *
                   8285: B$XNT  ENT  BL$XN            ENTRY POINT (XNBLK)
                   8286:        EJC
                   8287: *
                   8288: *      XRBLK
                   8289: *
                   8290: *      THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
                   8291: *
                   8292: B$XRT  ENT  BL$XR            ENTRY POINT (XRBLK)
                   8293: *
                   8294: *      MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
                   8295: *
                   8296: B$YYY  ENT  BL$$I            LAST BLOCK ROUTINE ENTRY POINT
                   8297:        TTL  S P I T B O L -- PATTERN MATCHING ROUTINES
                   8298: *
                   8299: *      THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
                   8300: *      ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
                   8301: *      TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
                   8302: *
                   8303: *      NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
                   8304: *      ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
                   8305: *
                   8306: P$AAA  ENT  BL$$I            ENTRY TO MARK FIRST PATTERN
                   8307: *
                   8308: *
                   8309: *      THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
                   8310: *      (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
                   8311: *
                   8312: *      STACK CONTENTS.
                   8313: *
                   8314: *                            NAME BASE (O$PMN ONLY)
                   8315: *                            NAME OFFSET (O$PMN ONLY)
                   8316: *                            TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
                   8317: *      PMHBS --------------- INITIAL CURSOR (ZERO)
                   8318: *                            INITIAL NODE POINTER
                   8319: *      XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
                   8320: *
                   8321: *      REGISTER VALUES.
                   8322: *
                   8323: *           (XS)             SET AS SHOWN IN STACK DIAGRAM
                   8324: *           (XR)             POINTER TO INITIAL PATTERN NODE
                   8325: *           (WB)             INITIAL CURSOR (ZERO)
                   8326: *
                   8327: *      GLOBAL PATTERN VALUES
                   8328: *
                   8329: *           R$PMS            POINTER TO SUBJECT STRING SCBLK
                   8330: *           PMSSL            LENGTH OF SUBJECT STRING IN CHARS
                   8331: *           PMDFL            DOT FLAG, INITIALLY ZERO
                   8332: *           PMHBS            SET AS SHOWN IN STACK DIAGRAM
                   8333: *
                   8334: *      CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
                   8335: *      FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
                   8336:        EJC
                   8337: *
                   8338: *      DESCRIPTION OF ALGORITHM
                   8339: *
                   8340: *      A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
                   8341: *      OF NODES WITH THE FOLLOWING STRUCTURE.
                   8342: *
                   8343: *           +------------------------------------+
                   8344: *           I                PCODE               I
                   8345: *           +------------------------------------+
                   8346: *           I                PTHEN               I
                   8347: *           +------------------------------------+
                   8348: *           I                PARM1               I
                   8349: *           +------------------------------------+
                   8350: *           I                PARM2               I
                   8351: *           +------------------------------------+
                   8352: *
                   8353: *      PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
                   8354: *      THE MATCH OF THIS PARTICULAR NODE TYPE.
                   8355: *
                   8356: *      PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
                   8357: *      TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
                   8358: *      IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
                   8359: *      TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
                   8360: *
                   8361: *      PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
                   8362: *      PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
                   8363: *
                   8364: *      ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
                   8365: *      NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
                   8366: *      IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
                   8367: *
                   8368: *      THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
                   8369: *      THE STRUCTURE IS BUILT UP. THE PATTERN IS
                   8370: *
                   8371: *      (A / B / C) (D / E)   WHERE / IS ALTERNATION
                   8372: *
                   8373: *      IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
                   8374: *      ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
                   8375: *      REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
                   8376: *
                   8377: *      +---+     +---+     +---+     +---+
                   8378: *      I + I-----I A I-----I + I-----I D I-----
                   8379: *      +---+     +---+  I  +---+     +---+
                   8380: *        .              I    .
                   8381: *        .              I    .
                   8382: *      +---+     +---+  I  +---+
                   8383: *      I + I-----I B I--I  I E I-----
                   8384: *      +---+     +---+  I  +---+
                   8385: *        .              I
                   8386: *        .              I
                   8387: *      +---+            I
                   8388: *      I C I------------I
                   8389: *      +---+
                   8390:        EJC
                   8391: *
                   8392: *      DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
                   8393: *
                   8394: *      (XR)                  POINTS TO THE CURRENT NODE
                   8395: *      (XL)                  SCRATCH
                   8396: *      (XS)                  MAIN STACK POINTER
                   8397: *      (WB)                  CURSOR (NUMBER OF CHARS MATCHED)
                   8398: *      (WA,WC)               SCRATCH
                   8399: *
                   8400: *      TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
                   8401: *      A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
                   8402: *
                   8403: *      WORD 1                SAVED CURSOR VALUE
                   8404: *      WORD 2                NODE TO MATCH ON FAILURE
                   8405: *
                   8406: *      WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
                   8407: *      STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
                   8408: *      TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
                   8409: *      AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
                   8410: *      SPECIAL NODES DEPENDING ON THE SCAN MODE.
                   8411: *
                   8412: *      ANCHORED MODE         THE BOTTOM ENTRY POINTS TO THE
                   8413: *                            SPECIAL NODE NDABO WHICH CAUSES AN
                   8414: *                            ABORT. THE CURSOR VALUE STORED
                   8415: *                            WITH THIS ENTRY IS ALWAYS ZERO.
                   8416: *
                   8417: *      UNANCHORED MODE       THE BOTTOM ENTRY POINTS TO THE
                   8418: *                            SPECIAL NODE NDUNA WHICH MOVES THE
                   8419: *                            ANCHOR POINT AND RESTARTS THE MATCH
                   8420: *                            THE CURSOR SAVED WITH THIS ENTRY
                   8421: *                            IS THE NUMBER OF CHARACTERS WHICH
                   8422: *                            LIE BEFORE THE INITIAL ANCHOR POINT
                   8423: *                            (I.E. THE NUMBER OF ANCHOR MOVES).
                   8424: *                            THIS ENTRY IS THREE WORDS LONG AND
                   8425: *                            ALSO CONTAINS THE INITIAL PATTERN.
                   8426: *
                   8427: *      ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
                   8428: *      NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
                   8429: *      LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
                   8430: *      PATTERN MATCHING.
                   8431: *
                   8432: *      R$PMS                 POINTER TO SUBJECT STRING
                   8433: *      PMSSL                 LENGTH OF SUBJECT STRING
                   8434: *      PMDFL                 FLAG SET NON-ZERO FOR DOT PATTERNS
                   8435: *      PMHBS                 BASE PTR FOR CURRENT HISTORY STACK
                   8436: *
                   8437: *      THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
                   8438: *
                   8439: *      SUCCP                 SUCCESS IN MATCHING CURRENT NODE
                   8440: *      FAILP                 FAILURE IN MATCHING CURRENT NODE
                   8441:        EJC
                   8442: *
                   8443: *      COMPOUND PATTERNS
                   8444: *
                   8445: *      SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
                   8446: *      REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
                   8447: *      LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
                   8448: *
                   8449: *      AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
                   8450: *      THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
                   8451: *      TO THE ALTERNATIVE PATTERN.
                   8452: *
                   8453: *      ARB
                   8454: *      ---
                   8455: *
                   8456: *           +---+            THIS NODE (P$ARB) MATCHES NULL
                   8457: *           I B I-----       AND STACKS CURSOR, SUCCESSOR PTR,
                   8458: *           +---+            CURSOR (COPY) AND A PTR TO NDARC.
                   8459: *
                   8460: *
                   8461: *
                   8462: *
                   8463: *      BAL
                   8464: *      ---
                   8465: *
                   8466: *           +---+            THE P$BAL NODE SCANS A BALANCED
                   8467: *           I B I-----       STRING AND THEN STACKS A POINTER
                   8468: *           +---+            TO ITSELF ON THE HISTORY STACK.
                   8469:        EJC
                   8470: *
                   8471: *      COMPOUND PATTERN STRUCTURES (CONTINUED)
                   8472: *
                   8473: *
                   8474: *      ARBNO
                   8475: *      -----
                   8476: *
                   8477: *           +---+            THIS ALTERNATIVE NODE MATCHES NULL
                   8478: *      +----I + I-----       THE FIRST TIME AND STACKS A POINTER
                   8479: *      I    +---+            TO THE ARGUMENT PATTERN X.
                   8480: *      I      .
                   8481: *      I      .
                   8482: *      I    +---+            NODE (P$ABA) TO STACK CURSOR
                   8483: *      I    I A I            AND HISTORY STACK BASE PTR.
                   8484: *      I    +---+
                   8485: *      I      I
                   8486: *      I      I
                   8487: *      I    +---+            THIS IS THE ARGUMENT PATTERN. AS
                   8488: *      I    I X I            INDICATED, THE SUCCESSOR OF THE
                   8489: *      I    +---+            PATTERN IS THE P$ABC NODE
                   8490: *      I      I
                   8491: *      I      I
                   8492: *      I    +---+            THIS NODE (P$ABC) POPS PMHBS,
                   8493: *      +----I C I            STACKS OLD PMHBS AND PTR TO NDABD
                   8494: *           +---+            (UNLESS OPTIMISATION HAS OCCURRED)
                   8495: *
                   8496: *      STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
                   8497: *      RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
                   8498: *      THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
                   8499: *      NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
                   8500: *      TO MATCH THE ARGUMENT.  BEFORE THE ARGUMENT IS MATCHED
                   8501: *      P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB.  IF
                   8502: *      THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
                   8503: *      STACK ENTRY AND FAILS.
                   8504: *      IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
                   8505: *      VALUE (SAVED BY P$ABA) .  THEN IF THE ARGUMENT HAS LEFT
                   8506: *      ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
                   8507: *      AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
                   8508: *      IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA.  FINALLY
                   8509: *      A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
                   8510: *      STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
                   8511: *      IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
                   8512: *      HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
                   8513: *      TO MATCH THE ARG IF NECESSARY.  IF NOT , THE SUCCESSOR TO
                   8514: *      ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP.  P$ABD
                   8515: *      RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
                   8516: *      ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
                   8517:        EJC
                   8518: *
                   8519: *      COMPOUND PATTERN STRUCTURES (CONTINUED)
                   8520: *
                   8521: *      BREAKX
                   8522: *      ------
                   8523: *
                   8524: *           +---+            THIS NODE IS A BREAK NODE FOR
                   8525: *      +----I B I            THE ARGUMENT TO BREAKX, IDENTICAL
                   8526: *      I    +---+            TO AN ORDINARY BREAK NODE.
                   8527: *      I      I
                   8528: *      I      I
                   8529: *      I    +---+            THIS ALTERNATIVE NODE STACKS A
                   8530: *      I    I + I-----       POINTER TO THE BREAKX NODE TO
                   8531: *      I    +---+            ALLOW FOR SUBSEQUENT FAILURE
                   8532: *      I      .
                   8533: *      I      .
                   8534: *      I    +---+            THIS IS THE BREAKX NODE ITSELF. IT
                   8535: *      +----I X I            MATCHES ONE CHARACTER AND THEN
                   8536: *           +---+            PROCEEDS BACK TO THE BREAK NODE.
                   8537: *
                   8538: *
                   8539: *
                   8540: *
                   8541: *      FENCE
                   8542: *      -----
                   8543: *
                   8544: *           +---+            THE FENCE NODE MATCHES NULL AND
                   8545: *           I F I-----       STACKS A POINTER TO NODE NDABO TO
                   8546: *           +---+            ABORT ON A SUBSEQUENT REMATCH
                   8547: *
                   8548: *
                   8549: *
                   8550: *
                   8551: *      SUCCEED
                   8552: *      -------
                   8553: *
                   8554: *           +---+            THE NODE FOR SUCCEED MATCHES NULL
                   8555: *           I S I-----       AND STACKS A POINTER TO ITSELF
                   8556: *           +---+            TO REPEAT THE MATCH ON A FAILURE.
                   8557:        EJC
                   8558: *
                   8559: *      COMPOUND PATTERNS (CONTINUED)
                   8560: *
                   8561: *      BINARY DOT (PATTERN ASSIGNMENT)
                   8562: *      -------------------------------
                   8563: *
                   8564: *           +---+            THIS NODE (P$PAA) SAVES THE CURRENT
                   8565: *           I A I            CURSOR AND A POINTER TO THE
                   8566: *           +---+            SPECIAL NODE NDPAB ON THE STACK.
                   8567: *             I
                   8568: *             I
                   8569: *           +---+            THIS IS THE STRUCTURE FOR THE
                   8570: *           I X I            PATTERN LEFT ARGUMENT OF THE
                   8571: *           +---+            PATTERN ASSIGNMENT CALL.
                   8572: *             I
                   8573: *             I
                   8574: *           +---+            THIS NODE (P$PAC) SAVES THE CURSOR,
                   8575: *           I C I-----       A PTR TO ITSELF, THE CURSOR (COPY)
                   8576: *           +---+            AND A PTR TO NDPAD ON THE STACK.
                   8577: *
                   8578: *
                   8579: *      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
                   8580: *      IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
                   8581: *
                   8582: *      THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
                   8583: *      FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
                   8584: *      MAY HAVE OCCURED IN THE PATTERN MATCH
                   8585: *
                   8586: *      IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
                   8587: *      HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
                   8588: *      AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
                   8589: *
                   8590: *      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
                   8591: *      IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
                   8592: *      THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
                   8593: *      IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
                   8594:        EJC
                   8595: *
                   8596: *      COMPOUNT PATTERN STRUCTURES (CONTINUED)
                   8597: *
                   8598: *      FENCE (FUNCTION)
                   8599: *      ----------------
                   8600: *
                   8601: *           +---+            THIS NODE (P$FNA) SAVES THE
                   8602: *           I A I            CURRENT HISTORY STACK AND A
                   8603: *           +---+            POINTER TO NDFNB ON THE STACK.
                   8604: *             I
                   8605: *             I
                   8606: *           +---+            THIS IS THE PATTERN STRUCTURE
                   8607: *           I X I            GIVEN AS THE ARGUMENT TO THE
                   8608: *           +---+            FENCE FUNCTION.
                   8609: *             I
                   8610: *             I
                   8611: *           +---+            THIS NODE P$FNC RESTORES THE OUTER
                   8612: *           I C I            HISTORY STACK PTR SAVED IN P$FNA,
                   8613: *           +---+            AND STACKS THE INNER STACK BASE
                   8614: *                            PTR AND A POINTER TO NDFND ON THE
                   8615: *                            STACK.
                   8616: *
                   8617: *      NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
                   8618: *      ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
                   8619: *      STACK.
                   8620: *
                   8621: *      THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
                   8622: *      THE FENCE PATTERN LEAVES NO ALTERNATIVES.  IN THIS CASE,
                   8623: *      THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
                   8624: *
                   8625: *      NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
                   8626: *      GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
                   8627: *      STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA
                   8628:        EJC
                   8629: *
                   8630: *      COMPOUND PATTERNS (CONTINUED)
                   8631: *
                   8632: *      EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
                   8633: *      -----------------------------------------------
                   8634: *
                   8635: *      INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
                   8636: *      IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
                   8637: *      PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
                   8638: *      FOR PROPER RECURSIVE PROCESSING.
                   8639: *
                   8640: *      1)   A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
                   8641: *           STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
                   8642: *
                   8643: *      2)   A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
                   8644: *           NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
                   8645: *           IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
                   8646: *           THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
                   8647: *           FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
                   8648: *           POINTER AND FAILS.
                   8649: *
                   8650: *      3)   THE RESULTING HISTORY STACK POINTER IS SAVED IN
                   8651: *           PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
                   8652: *
                   8653: *      AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
                   8654: *      CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
                   8655: *
                   8656: *      1)   LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
                   8657: *           OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
                   8658: *           CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
                   8659: *           WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
                   8660: *           CASE AND CONTINUE EXECUTION OF THE PROGRAM.
                   8661: *
                   8662: *      2)   OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
                   8663: *           WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
                   8664: *           NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
                   8665: *           THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
                   8666: *           THIS (INNER) VALUE AND AND THEN FAILS.
                   8667: *
                   8668: *      3)   USING THE HISTORY STACK ENTRY MADE ON STARTING THE
                   8669: *           EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
                   8670: *           PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
                   8671: *           PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
                   8672: *
                   8673: *      AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
                   8674: *      MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
                   8675: *      INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
                   8676: *      EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
                   8677: *      ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
                   8678:        EJC
                   8679: *
                   8680: *      COMPOUND PATTERNS (CONTINUED)
                   8681: *
                   8682: *      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
                   8683: *      ------------------------------------
                   8684: *
                   8685: *           +---+            THIS NODE (P$IMA) STACKS THE CURSOR
                   8686: *           I A I            PMHBS AND A PTR TO NDIMB AND RESETS
                   8687: *           +---+            THE STACK PTR PMHBS.
                   8688: *             I
                   8689: *             I
                   8690: *           +---+            THIS IS THE LEFT STRUCTURE FOR THE
                   8691: *           I X I            PATTERN LEFT ARGUMENT OF THE
                   8692: *           +---+            IMMEDIATE ASSIGNMENT CALL.
                   8693: *             I
                   8694: *             I
                   8695: *           +---+            THIS NODE (P$IMC) PERFORMS THE
                   8696: *           I C I-----       ASSIGNMENT, POPS PMHBS AND STACKS
                   8697: *           +---+            THE OLD PMHBS AND A PTR TO NDIMD.
                   8698: *
                   8699: *
                   8700: *      THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
                   8701: *      TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
                   8702: *
                   8703: *      THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
                   8704: *      LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
                   8705: *
                   8706: *      THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
                   8707: *      TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
                   8708: *      THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
                   8709: *      PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
                   8710: *      POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
                   8711: *
                   8712: *      THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
                   8713: *      LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
                   8714: *
                   8715: *      AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
                   8716: *      ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
                   8717: *      THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
                   8718:        EJC
                   8719: *
                   8720: *      ARBNO
                   8721: *
                   8722: *      SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
                   8723: *      ALGORITHM FOR MATCHING THIS NODE TYPE.
                   8724: *
                   8725: *      NO PARAMETERS
                   8726: *
                   8727: P$ABA  ENT  BL$P0            P0BLK
                   8728:        MOV  WB,-(XS)         STACK CURSOR
                   8729:        MOV  XR,-(XS)         STACK DUMMY NODE PTR
                   8730:        MOV  PMHBS,-(XS)      STACK OLD STACK BASE PTR
                   8731:        MOV  =NDABB,-(XS)     STACK PTR TO NODE NDABB
                   8732:        MOV  XS,PMHBS         STORE NEW STACK BASE PTR
                   8733:        BRN  SUCCP            SUCCEED
                   8734:        EJC
                   8735: *
                   8736: *      ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
                   8737: *
                   8738: *      NO PARAMETERS (DUMMY PATTERN)
                   8739: *
                   8740: P$ABB  ENT                   ENTRY POINT
                   8741:        MOV  WB,PMHBS         RESTORE HISTORY STACK BASE PTR
                   8742:        BRN  FLPOP            FAIL AND POP DUMMY NODE PTR
                   8743:        EJC
                   8744: *
                   8745: *      ARBNO (CHECK IF ARG MATCHED NULL STRING)
                   8746: *
                   8747: *      NO PARAMETERS (DUMMY PATTERN)
                   8748: *
                   8749: P$ABC  ENT  BL$P0            P0BLK
                   8750:        MOV  PMHBS,XT         KEEP P$ABB STACK BASE
                   8751:        MOV  3(XT),WA         LOAD INITIAL CURSOR
                   8752:        MOV  1(XT),PMHBS      RESTORE OUTER STACK BASE PTR
                   8753:        BEQ  XT,XS,PABC1      JUMP IF NO HISTORY STACK ENTRIES
                   8754:        MOV  XT,-(XS)         ELSE SAVE INNER PMHBS ENTRY
                   8755:        MOV  =NDABD,-(XS)     STACK PTR TO SPECIAL NODE NDABD
                   8756:        BRN  PABC2            MERGE
                   8757: *
                   8758: *      OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
                   8759: *
                   8760: PABC1  ADD  *NUM04,XS        REMOVE NDABB ENTRY AND CURSOR
                   8761: *
                   8762: *      MERGE TO CHECK FOR MATCHING OF NULL STRING
                   8763: *
                   8764: PABC2  BNE  WA,WB,SUCCP      ALLOW FURTHER ATTEMPT IF NON-NULL
                   8765:        MOV  PTHEN(XR),XR     BYPASS ALTERNATIVE NODE SO AS TO ..
                   8766:        BRN  SUCCP            ... REFUSE FURTHER MATCH ATTEMPTS
                   8767:        EJC
                   8768: *
                   8769: *      ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
                   8770: *
                   8771: *      NO PARAMETERS (DUMMY PATTERN)
                   8772: *
                   8773: P$ABD  ENT                   ENTRY POINT
                   8774:        MOV  WB,PMHBS         RESTORE INNER STACK BASE PTR
                   8775:        BRN  FAILP            AND FAIL
                   8776:        EJC
                   8777: *
                   8778: *      ABORT
                   8779: *
                   8780: *      NO PARAMETERS
                   8781: *
                   8782: P$ABO  ENT  BL$P0            P0BLK
                   8783:        BRN  EXFAL            SIGNAL STATEMENT FAILURE
                   8784:        EJC
                   8785: *
                   8786: *      ALTERNATION
                   8787: *
                   8788: *      PARM1                 ALTERNATIVE NODE
                   8789: *
                   8790: P$ALT  ENT  BL$P1            P1BLK
                   8791:        MOV  WB,-(XS)         STACK CURSOR
                   8792:        MOV  PARM1(XR),-(XS)  STACK POINTER TO ALTERNATIVE
                   8793:        CHK                   CHECK FOR STACK OVERFLOW
                   8794:        BRN  SUCCP            IF ALL OK, THEN SUCCEED
                   8795:        EJC
                   8796: *
                   8797: *      ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
                   8798: *
                   8799: *      PARM1                 CHARACTER ARGUMENT
                   8800: *
                   8801: P$ANS  ENT  BL$P1            P1BLK
                   8802:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARS LEFT
                   8803:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   8804:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8805:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   8806:        BNE  WA,PARM1(XR),FAILP FAIL IF NO MATCH
                   8807:        ICV  WB               ELSE BUMP CURSOR
                   8808:        BRN  SUCCP            AND SUCCEED
                   8809:        EJC
                   8810: *
                   8811: *      ANY (MULTI-CHARACTER ARGUMENT CASE)
                   8812: *
                   8813: *      PARM1                 POINTER TO CTBLK
                   8814: *      PARM2                 BIT MASK TO SELECT BIT IN CTBLK
                   8815: *
                   8816: P$ANY  ENT  BL$P2            P2BLK
                   8817: *
                   8818: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   8819: *
                   8820: PANY1  BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARACTERS LEFT
                   8821:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   8822:        PLC  XL,WB            GET CHAR PTR TO CURRENT CHARACTER
                   8823:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   8824:        MOV  PARM1(XR),XL     POINT TO CTBLK
                   8825:        WTB  WA               CHANGE TO BYTE OFFSET
                   8826:        ADD  WA,XL            POINT TO ENTRY IN CTBLK
                   8827:        MOV  CTCHS(XL),WA     LOAD WORD FROM CTBLK
                   8828:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   8829:        ZRB  WA,FAILP         FAIL IF NO MATCH
                   8830:        ICV  WB               ELSE BUMP CURSOR
                   8831:        BRN  SUCCP            AND SUCCEED
                   8832:        EJC
                   8833: *
                   8834: *      ANY (EXPRESSION ARGUMENT)
                   8835: *
                   8836: *      PARM1                 EXPRESSION POINTER
                   8837: *
                   8838: P$AYD  ENT  BL$P1            P1BLK
                   8839:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   8840:        ERR  043,ANY EVALUATED ARGUMENT IS NOT STRING
                   8841:        PPM  FAILP            FAIL IF EVALUATION FAILURE
                   8842:        PPM  PANY1            MERGE MULTI-CHAR CASE IF OK
                   8843:        EJC
                   8844: *
                   8845: *      P$ARB                 INITIAL ARB MATCH
                   8846: *
                   8847: *      NO PARAMETERS
                   8848: *
                   8849: *      THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
                   8850: *      FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
                   8851: *
                   8852: P$ARB  ENT  BL$P0            P0BLK
                   8853:        MOV  PTHEN(XR),XR     LOAD SUCCESSOR POINTER
                   8854:        MOV  WB,-(XS)         STACK DUMMY CURSOR
                   8855:        MOV  XR,-(XS)         STACK SUCCESSOR POINTER
                   8856:        MOV  WB,-(XS)         STACK CURSOR
                   8857:        MOV  =NDARC,-(XS)     STACK PTR TO SPECIAL NODE NDARC
                   8858:        BRI  (XR)             EXECUTE NEXT NODE MATCHING NULL
                   8859:        EJC
                   8860: *
                   8861: *      P$ARC                 EXTEND ARB MATCH
                   8862: *
                   8863: *      NO PARAMETERS (DUMMY PATTERN)
                   8864: *
                   8865: P$ARC  ENT                   ENTRY POINT
                   8866:        BEQ  WB,PMSSL,FLPOP   FAIL AND POP STACK TO SUCCESSOR
                   8867:        ICV  WB               ELSE BUMP CURSOR
                   8868:        MOV  WB,-(XS)         STACK UPDATED CURSOR
                   8869:        MOV  XR,-(XS)         RESTACK POINTER TO NDARC NODE
                   8870:        MOV  2(XS),XR         LOAD SUCCESSOR POINTER
                   8871:        BRI  (XR)             OFF TO REEXECUTE SUCCESSOR NODE
                   8872:        EJC
                   8873: *
                   8874: *      BAL
                   8875: *
                   8876: *      NO PARAMETERS
                   8877: *
                   8878: *      THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
                   8879: *      FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
                   8880: *
                   8881: P$BAL  ENT  BL$P0            P0BLK
                   8882:        ZER  WC               ZERO PARENTHESES LEVEL COUNTER
                   8883:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   8884:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8885:        BRN  PBAL2            JUMP INTO SCAN LOOP
                   8886: *
                   8887: *      LOOP TO SCAN OUT CHARACTERS
                   8888: *
                   8889: PBAL1  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
                   8890:        ICV  WB               PUSH CURSOR FOR CHARACTER
                   8891:        BEQ  WA,=CH$PP,PBAL3  JUMP IF LEFT PAREN
                   8892:        BEQ  WA,=CH$RP,PBAL4  JUMP IF RIGHT PAREN
                   8893:        BZE  WC,PBAL5         ELSE SUCCEED IF AT OUTER LEVEL
                   8894: *
                   8895: *      HERE AFTER PROCESSING ONE CHARACTER
                   8896: *
                   8897: PBAL2  BNE  WB,PMSSL,PBAL1   LOOP BACK UNLESS END OF STRING
                   8898:        BRN  FAILP            IN WHICH CASE, FAIL
                   8899: *
                   8900: *      HERE ON LEFT PAREN
                   8901: *
                   8902: PBAL3  ICV  WC               BUMP PAREN LEVEL
                   8903:        BRN  PBAL2            LOOP BACK TO CHECK END OF STRING
                   8904: *
                   8905: *      HERE FOR RIGHT PAREN
                   8906: *
                   8907: PBAL4  BZE  WC,FAILP         FAIL IF NO MATCHING LEFT PAREN
                   8908:        DCV  WC               ELSE DECREMENT LEVEL COUNTER
                   8909:        BNZ  WC,PBAL2         LOOP BACK IF NOT AT OUTER LEVEL
                   8910: *
                   8911: *      HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
                   8912: *
                   8913: PBAL5  MOV  WB,-(XS)         STACK CURSOR
                   8914:        MOV  XR,-(XS)         STACK PTR TO BAL NODE FOR EXTEND
                   8915:        BRN  SUCCP            AND SUCCEED
                   8916:        EJC
                   8917: *
                   8918: *      BREAK (EXPRESSION ARGUMENT)
                   8919: *
                   8920: *      PARM1                 EXPRESSION POINTER
                   8921: *
                   8922: P$BKD  ENT  BL$P1            P1BLK
                   8923:        JSR  EVALS            EVALUATE STRING EXPRESSION
                   8924:        ERR  044,BREAK EVALUATED ARGUMENT IS NOT STRING
                   8925:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8926:        PPM  PBRK1            MERGE WITH MULTI-CHAR CASE IF OK
                   8927:        EJC
                   8928: *
                   8929: *      BREAK (ONE CHARACTER ARGUMENT)
                   8930: *
                   8931: *      PARM1                 CHARACTER ARGUMENT
                   8932: *
                   8933: P$BKS  ENT  BL$P1            P1BLK
                   8934:        MOV  PMSSL,WC         GET SUBJECT STRING LENGTH
                   8935:        SUB  WB,WC            GET NUMBER OF CHARACTERS LEFT
                   8936:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   8937:        LCT  WC,WC            SET COUNTER FOR CHARS LEFT
                   8938:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   8939:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8940: *
                   8941: *      LOOP TO SCAN TILL BREAK CHARACTER FOUND
                   8942: *
                   8943: PBKS1  LCH  WA,(XL)+         LOAD NEXT CHAR, BUMP POINTER
                   8944:        BEQ  WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND
                   8945:        ICV  WB               ELSE PUSH CURSOR
                   8946:        BCT  WC,PBKS1         LOOP BACK IF MORE TO GO
                   8947:        BRN  FAILP            FAIL IF END OF STRING, NO BREAK CHR
                   8948:        EJC
                   8949: *
                   8950: *      BREAK (MULTI-CHARACTER ARGUMENT)
                   8951: *
                   8952: *      PARM1                 POINTER TO CTBLK
                   8953: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
                   8954: *
                   8955: P$BRK  ENT  BL$P2            P2BLK
                   8956: *
                   8957: *      EXPRESSION ARGUMENT MERGES HERE
                   8958: *
                   8959: PBRK1  MOV  PMSSL,WC         LOAD SUBJECT STRING LENGTH
                   8960:        SUB  WB,WC            GET NUMBER OF CHARACTERS LEFT
                   8961:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   8962:        LCT  WC,WC            SET COUNTER FOR CHARACTERS LEFT
                   8963:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   8964:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8965:        MOV  XR,PSAVE         SAVE NODE POINTER
                   8966: *
                   8967: *      LOOP TO SEARCH FOR BREAK CHARACTER
                   8968: *
                   8969: PBRK2  LCH  WA,(XL)+         LOAD NEXT CHAR, BUMP POINTER
                   8970:        MOV  PARM1(XR),XR     LOAD POINTER TO CTBLK
                   8971:        WTB  WA               CONVERT TO BYTE OFFSET
                   8972:        ADD  WA,XR            POINT TO CTBLK ENTRY
                   8973:        MOV  CTCHS(XR),WA     LOAD CTBLK WORD
                   8974:        MOV  PSAVE,XR         RESTORE NODE POINTER
                   8975:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   8976:        NZB  WA,SUCCP         SUCCEED IF BREAK CHARACTER FOUND
                   8977:        ICV  WB               ELSE PUSH CURSOR
                   8978:        BCT  WC,PBRK2         LOOP BACK UNLESS END OF STRING
                   8979:        BRN  FAILP            FAIL IF END OF STRING, NO BREAK CHR
                   8980:        EJC
                   8981: *
                   8982: *      BREAKX (EXTENSION)
                   8983: *
                   8984: *      THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
                   8985: *      MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
                   8986: *      PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
                   8987: *
                   8988: *      NO PARAMETERS
                   8989: *
                   8990: P$BKX  ENT  BL$P0            P0BLK
                   8991:        ICV  WB               STEP CURSOR PAST PREVIOUS BREAK CHR
                   8992:        BRN  SUCCP            SUCCEED TO REMATCH BREAK
                   8993:        EJC
                   8994: *
                   8995: *      BREAKX (EXPRESSION ARGUMENT)
                   8996: *
                   8997: *      SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
                   8998: *      BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
                   8999: *      BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
                   9000: *      ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
                   9001: *
                   9002: *      PARM1                 EXPRESSION POINTER
                   9003: *
                   9004: P$BXD  ENT  BL$P1            P1BLK
                   9005:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   9006:        ERR  045,BREAKX EVALUATED ARGUMENT IS NOT STRING
                   9007:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9008:        PPM  PBRK1            MERGE WITH BREAK IF ALL OK
                   9009:        EJC
                   9010: *
                   9011: *      CURSOR ASSIGNMENT
                   9012: *
                   9013: *      PARM1                 NAME BASE
                   9014: *      PARM2                 NAME OFFSET
                   9015: *
                   9016: P$CAS  ENT  BL$P2            P2BLK
                   9017:        MOV  XR,-(XS)         SAVE NODE POINTER
                   9018:        MOV  WB,-(XS)         SAVE CURSOR
                   9019:        MOV  PARM1(XR),XL     LOAD NAME BASE
                   9020:        MTI  WB               LOAD CURSOR AS INTEGER
                   9021:        MOV  PARM2(XR),WB     LOAD NAME OFFSET
                   9022:        JSR  ICBLD            GET ICBLK FOR CURSOR VALUE
                   9023:        MOV  WB,WA            MOVE NAME OFFSET
                   9024:        MOV  XR,WB            MOVE VALUE TO ASSIGN
                   9025:        JSR  ASINP            PERFORM ASSIGNMENT
                   9026:        PPM  FLPOP            FAIL ON ASSIGNMENT FAILURE
                   9027:        MOV  (XS)+,WB         ELSE RESTORE CURSOR
                   9028:        MOV  (XS)+,XR         RESTORE NODE POINTER
                   9029:        BRN  SUCCP            AND SUCCEED MATCHING NULL
                   9030:        EJC
                   9031: *
                   9032: *      EXPRESSION NODE (P$EXA, INITIAL ENTRY)
                   9033: *
                   9034: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9035: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
                   9036: *
                   9037: *      PARM1                 EXPRESSION POINTER
                   9038: *
                   9039: P$EXA  ENT  BL$P1            P1BLK
                   9040:        JSR  EVALP            EVALUATE EXPRESSION
                   9041:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9042:        BLO  WA,=P$AAA,PEXA1  JUMP IF RESULT IS NOT A PATTERN
                   9043: *
                   9044: *      HERE IF RESULT OF EXPRESSION IS A PATTERN
                   9045: *
                   9046:        MOV  WB,-(XS)         STACK DUMMY CURSOR
                   9047:        MOV  XR,-(XS)         STACK PTR TO P$EXA NODE
                   9048:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE PTR
                   9049:        MOV  =NDEXB,-(XS)     STACK PTR TO SPECIAL NODE NDEXB
                   9050:        MOV  XS,PMHBS         STORE NEW STACK BASE POINTER
                   9051:        MOV  XL,XR            COPY NODE POINTER
                   9052:        BRI  (XR)             MATCH FIRST NODE IN EXPRESSION PAT
                   9053: *
                   9054: *      HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
                   9055: *
                   9056: PEXA1  BEQ  WA,=B$SCL,PEXA2  JUMP IF IT IS ALREADY A STRING
                   9057:        MOV  XL,-(XS)         ELSE STACK RESULT
                   9058:        MOV  XR,XL            SAVE NODE POINTER
                   9059:        JSR  GTSTG            CONVERT RESULT TO STRING
                   9060:        ERR  046,EXPRESSION DOES NOT EVALUATE TO PATTERN
                   9061:        MOV  XR,WC            COPY STRING POINTER
                   9062:        MOV  XL,XR            RESTORE NODE POINTER
                   9063:        MOV  WC,XL            COPY STRING POINTER AGAIN
                   9064: *
                   9065: *      MERGE HERE WITH STRING POINTER IN XL
                   9066: *
                   9067: PEXA2  BZE  SCLEN(XL),SUCCP  JUST SUCCEED IF NULL STRING
                   9068:        BRN  PSTR1            ELSE MERGE WITH STRING CIRCUIT
                   9069:        EJC
                   9070: *
                   9071: *      EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
                   9072: *
                   9073: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9074: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
                   9075: *
                   9076: *      NO PARAMETERS (DUMMY PATTERN)
                   9077: *
                   9078: P$EXB  ENT                   ENTRY POINT
                   9079:        MOV  WB,PMHBS         RESTORE OUTER LEVEL STACK POINTER
                   9080:        BRN  FLPOP            FAIL AND POP P$EXA NODE PTR
                   9081:        EJC
                   9082: *
                   9083: *      EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
                   9084: *
                   9085: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9086: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
                   9087: *
                   9088: *      NO PARAMETERS (DUMMY PATTERN)
                   9089: *
                   9090: P$EXC  ENT                   ENTRY POINT
                   9091:        MOV  WB,PMHBS         RESTORE INNER STACK BASE POINTER
                   9092:        BRN  FAILP            AND FAIL INTO EXPR PATTERN ALTERNVS
                   9093:        EJC
                   9094: *
                   9095: *      FAIL
                   9096: *
                   9097: *      NO PARAMETERS
                   9098: *
                   9099: P$FAL  ENT  BL$P0            P0BLK
                   9100:        BRN  FAILP            JUST SIGNAL FAILURE
                   9101:        EJC
                   9102: *
                   9103: *      FENCE
                   9104: *
                   9105: *      SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
                   9106: *      ALGORITHM FOR MATCHING THIS NODE TYPE.
                   9107: *
                   9108: *      NO PARAMETERS
                   9109: *
                   9110: P$FEN  ENT  BL$P0            P0BLK
                   9111:        MOV  WB,-(XS)         STACK DUMMY CURSOR
                   9112:        MOV  =NDABO,-(XS)     STACK PTR TO ABORT NODE
                   9113:        BRN  SUCCP            AND SUCCEED MATCHING NULL
                   9114:        EJC
                   9115: *
                   9116: *      FENCE (FUNCTION)
                   9117: *
                   9118: *      SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
                   9119: *      FOR DETAILS OF SCHEME
                   9120: *
                   9121: *      NO PARAMETERS
                   9122: *
                   9123: P$FNA  ENT  BL$P0            P0BLK
                   9124:        MOV  PMHBS,-(XS)      STACK CURRENT HISTORY STACK BASE
                   9125:        MOV  =NDFNB,-(XS)     STACK INDIR PTR TO P$FNB (FAILURE)
                   9126:        MOV  XS,PMHBS         BEGIN NEW HISTORY STACK
                   9127:        BRN  SUCCP            SUCCEED
                   9128:        EJC
                   9129: *
                   9130: *      FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
                   9131: *
                   9132: *      NO PARAMETERS (DUMMY PATTERN)
                   9133: *
                   9134: P$FNB  ENT  BL$P0            P0BLK
                   9135:        MOV  WB,PMHBS         RESTORE OUTER PMHBS STACK BASE
                   9136:        BRN  FAILP            ...AND FAIL
                   9137:        EJC
                   9138: *
                   9139: *      FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
                   9140: *
                   9141: *      NO PARAMETERS (DUMMY PATTERN)
                   9142: *
                   9143: P$FNC  ENT  BL$P0            P0BLK
                   9144:        MOV  PMHBS,XT         GET INNER STACK BASE PTR
                   9145:        MOV  NUM01(XT),PMHBS  RESTORE OUTER STACK BASE
                   9146:        BEQ  XT,XS,PFNC1      OPTIMIZE IF NO ALTERNATIVES
                   9147:        MOV  XT,-(XS)         ELSE STACK INNER STACK BASE
                   9148:        MOV  =NDFND,-(XS)     STACK PTR TO NDFND
                   9149:        BRN  SUCCP            SUCCEED
                   9150: *
                   9151: *      HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
                   9152: *
                   9153: PFNC1  ADD  *NUM02,XS        POP OFF P$FNB ENTRY
                   9154:        BRN  SUCCP            SUCCEED
                   9155:        EJC
                   9156: *
                   9157: *      FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
                   9158: *
                   9159: *      NO PARAMETERS (DUMMY PATTERN)
                   9160: *
                   9161: P$FND  ENT  BL$P0            P0BLK
                   9162:        MOV  WB,XS            POP STACK TO FENCE() HISTORY BASE
                   9163:        BRN  FLPOP            POP BASE ENTRY AND FAIL
                   9164:        EJC
                   9165: *
                   9166: *      IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
                   9167: *
                   9168: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   9169: *      STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
                   9170: *
                   9171: *      NO PARAMETERS
                   9172: *
                   9173: P$IMA  ENT  BL$P0            P0BLK
                   9174:        MOV  WB,-(XS)         STACK CURSOR
                   9175:        MOV  XR,-(XS)         STACK DUMMY NODE POINTER
                   9176:        MOV  PMHBS,-(XS)      STACK OLD STACK BASE POINTER
                   9177:        MOV  =NDIMB,-(XS)     STACK PTR TO SPECIAL NODE NDIMB
                   9178:        MOV  XS,PMHBS         STORE NEW STACK BASE POINTER
                   9179:        BRN  SUCCP            AND SUCCEED
                   9180:        EJC
                   9181: *
                   9182: *      IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
                   9183: *
                   9184: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   9185: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9186: *
                   9187: *      NO PARAMETERS (DUMMY PATTERN)
                   9188: *
                   9189: P$IMB  ENT                   ENTRY POINT
                   9190:        MOV  WB,PMHBS         RESTORE HISTORY STACK BASE PTR
                   9191:        BRN  FLPOP            FAIL AND POP DUMMY NODE PTR
                   9192:        EJC
                   9193: *
                   9194: *      IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
                   9195: *
                   9196: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   9197: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9198: *
                   9199: *      PARM1                 NAME BASE OF VARIABLE
                   9200: *      PARM2                 NAME OFFSET OF VARIABLE
                   9201: *
                   9202: P$IMC  ENT  BL$P2            P2BLK
                   9203:        MOV  PMHBS,XT         LOAD POINTER TO P$IMB ENTRY
                   9204:        MOV  WB,WA            COPY FINAL CURSOR
                   9205:        MOV  3(XT),WB         LOAD INITIAL CURSOR
                   9206:        MOV  1(XT),PMHBS      RESTORE OUTER STACK BASE POINTER
                   9207:        BEQ  XT,XS,PIMC1      JUMP IF NO HISTORY STACK ENTRIES
                   9208:        MOV  XT,-(XS)         ELSE SAVE INNER PMHBS POINTER
                   9209:        MOV  =NDIMD,-(XS)     AND A PTR TO SPECIAL NODE NDIMD
                   9210:        BRN  PIMC2            MERGE
                   9211: *
                   9212: *      HERE IF NO ENTRIES MADE ON HISTORY STACK
                   9213: *
                   9214: PIMC1  ADD  *NUM04,XS        REMOVE NDIMB ENTRY AND CURSOR
                   9215: *
                   9216: *      MERGE HERE TO PERFORM ASSIGNMENT
                   9217: *
                   9218: PIMC2  MOV  WA,-(XS)         SAVE CURRENT (FINAL) CURSOR
                   9219:        MOV  XR,-(XS)         SAVE CURRENT NODE POINTER
                   9220:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   9221:        SUB  WB,WA            COMPUTE SUBSTRING LENGTH
                   9222:        JSR  SBSTR            BUILD SUBSTRING
                   9223:        MOV  XR,WB            MOVE RESULT
                   9224:        MOV  (XS),XR          RELOAD NODE POINTER
                   9225:        MOV  PARM1(XR),XL     LOAD NAME BASE
                   9226:        MOV  PARM2(XR),WA     LOAD NAME OFFSET
                   9227:        JSR  ASINP            PERFORM ASSIGNMENT
                   9228:        PPM  FLPOP            FAIL IF ASSIGNMENT FAILS
                   9229:        MOV  (XS)+,XR         ELSE RESTORE NODE POINTER
                   9230:        MOV  (XS)+,WB         RESTORE CURSOR
                   9231:        BRN  SUCCP            AND SUCCEED
                   9232:        EJC
                   9233: *
                   9234: *      IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
                   9235: *
                   9236: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   9237: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9238: *
                   9239: *      NO PARAMETERS (DUMMY PATTERN)
                   9240: *
                   9241: P$IMD  ENT                   ENTRY POINT
                   9242:        MOV  WB,PMHBS         RESTORE INNER STACK BASE POINTER
                   9243:        BRN  FAILP            AND FAIL
                   9244:        EJC
                   9245: *
                   9246: *      LEN (INTEGER ARGUMENT)
                   9247: *
                   9248: *      PARM1                 INTEGER ARGUMENT
                   9249: *
                   9250: P$LEN  ENT  BL$P1            P1BLK
                   9251: *
                   9252: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9253: *
                   9254: PLEN1  ADD  PARM1(XR),WB     PUSH CURSOR INDICATED AMOUNT
                   9255:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
                   9256:        BRN  FAILP            ELSE FAIL
                   9257:        EJC
                   9258: *
                   9259: *      LEN (EXPRESSION ARGUMENT)
                   9260: *
                   9261: *      PARM1                 EXPRESSION POINTER
                   9262: *
                   9263: P$LND  ENT  BL$P1            P1BLK
                   9264:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   9265:        ERR  047,LEN EVALUATED ARGUMENT IS NOT INTEGER
                   9266:        ERR  048,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   9267:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9268:        PPM  PLEN1            MERGE WITH NORMAL CIRCUIT IF OK
                   9269:        EJC
                   9270: *
                   9271: *      NOTANY (EXPRESSION ARGUMENT)
                   9272: *
                   9273: *      PARM1                 EXPRESSION POINTER
                   9274: *
                   9275: P$NAD  ENT  BL$P1            P1BLK
                   9276:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   9277:        ERR  049,NOTANY EVALUATED ARGUMENT IS NOT STRING
                   9278:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9279:        PPM  PNAY1            MERGE WITH MULTI-CHAR CASE IF OK
                   9280:        EJC
                   9281: *
                   9282: *      NOTANY (ONE CHARACTER ARGUMENT)
                   9283: *
                   9284: *      PARM1                 CHARACTER ARGUMENT
                   9285: *
                   9286: P$NAS  ENT  BL$P1            ENTRY POINT
                   9287:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARS LEFT
                   9288:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   9289:        PLC  XL,WB            POINT TO CURRENT CHARACTER IN STRIN
                   9290:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   9291:        BEQ  WA,PARM1(XR),FAILP FAIL IF MATCH
                   9292:        ICV  WB               ELSE BUMP CURSOR
                   9293:        BRN  SUCCP            AND SUCCEED
                   9294:        EJC
                   9295: *
                   9296: *      NOTANY (MULTI-CHARACTER STRING ARGUMENT)
                   9297: *
                   9298: *      PARM1                 POINTER TO CTBLK
                   9299: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
                   9300: *
                   9301: P$NAY  ENT  BL$P2            P2BLK
                   9302: *
                   9303: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9304: *
                   9305: PNAY1  BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARACTERS LEFT
                   9306:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   9307:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   9308:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   9309:        WTB  WA               CONVERT TO BYTE OFFSET
                   9310:        MOV  PARM1(XR),XL     LOAD POINTER TO CTBLK
                   9311:        ADD  WA,XL            POINT TO ENTRY IN CTBLK
                   9312:        MOV  CTCHS(XL),WA     LOAD ENTRY FROM CTBLK
                   9313:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   9314:        NZB  WA,FAILP         FAIL IF CHARACTER IS MATCHED
                   9315:        ICV  WB               ELSE BUMP CURSOR
                   9316:        BRN  SUCCP            AND SUCCEED
                   9317:        EJC
                   9318: *
                   9319: *      END OF PATTERN MATCH
                   9320: *
                   9321: *      THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
                   9322: *      SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
                   9323: *      PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
                   9324: *
                   9325: *      NO PARAMETERS (DUMMY PATTERN)
                   9326: *
                   9327: P$NTH  ENT                   ENTRY POINT
                   9328:        MOV  PMHBS,XT         LOAD POINTER TO BASE OF STACK
                   9329:        MOV  1(XT),WA         LOAD SAVED PMHBS (OR PATTERN TYPE)
                   9330:        BLE  WA,=NUM02,PNTH2  JUMP IF OUTER LEVEL (PATTERN TYPE)
                   9331: *
                   9332: *      HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
                   9333: *
                   9334:        MOV  WA,PMHBS         RESTORE OUTER STACK BASE POINTER
                   9335:        MOV  2(XT),XR         RESTORE POINTER TO P$EXA NODE
                   9336:        BEQ  XT,XS,PNTH1      JUMP IF NO HISTORY STACK ENTRIES
                   9337:        MOV  XT,-(XS)         ELSE STACK INNER STACK BASE PTR
                   9338:        MOV  =NDEXC,-(XS)     STACK PTR TO SPECIAL NODE NDEXC
                   9339:        BRN  SUCCP            AND SUCCEED
                   9340: *
                   9341: *      HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
                   9342: *
                   9343: PNTH1  ADD  *NUM04,XS        REMOVE P$EXB ENTRY AND NODE PTR
                   9344:        BRN  SUCCP            AND SUCCEED
                   9345: *
                   9346: *      HERE IF END OF MATCH AT OUTER LEVEL
                   9347: *
                   9348: PNTH2  MOV  WB,PMSSL         SAVE FINAL CURSOR IN SAFE PLACE
                   9349:        BZE  PMDFL,PNTH6      JUMP IF NO PATTERN ASSIGNMENTS
                   9350:        EJC
                   9351: *
                   9352: *      END OF PATTERN MATCH (CONTINUED)
                   9353: *
                   9354: *      NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
                   9355: *      SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
                   9356: *
                   9357: PNTH3  DCA  XT               POINT PAST CURSOR ENTRY
                   9358:        MOV  -(XT),WA         LOAD NODE POINTER
                   9359:        BEQ  WA,=NDPAD,PNTH4  JUMP IF NDPAD ENTRY
                   9360:        BNE  WA,=NDPAB,PNTH5  JUMP IF NOT NDPAB ENTRY
                   9361: *
                   9362: *      HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
                   9363: *      NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
                   9364: *
                   9365:        MOV  1(XT),-(XS)      STACK INITIAL CURSOR
                   9366:        CHK                   CHECK FOR STACK OVERFLOW
                   9367:        BRN  PNTH3            LOOP BACK IF OK
                   9368: *
                   9369: *      HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
                   9370: *      MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
                   9371: *
                   9372: PNTH4  MOV  1(XT),WA         LOAD FINAL CURSOR
                   9373:        MOV  (XS),WB          LOAD INITIAL CURSOR FROM STACK
                   9374:        MOV  XT,(XS)          SAVE HISTORY STACK SCAN PTR
                   9375:        SUB  WB,WA            COMPUTE LENGTH OF STRING
                   9376: *
                   9377: *      BUILD SUBSTRING AND PERFORM ASSIGNMENT
                   9378: *
                   9379:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   9380:        JSR  SBSTR            CONSTRUCT SUBSTRING
                   9381:        MOV  XR,WB            COPY SUBSTRING POINTER
                   9382:        MOV  (XS),XT          RELOAD HISTORY STACK SCAN PTR
                   9383:        MOV  2(XT),XL         LOAD POINTER TO P$PAC NODE WITH NAM
                   9384:        MOV  PARM2(XL),WA     LOAD NAME OFFSET
                   9385:        MOV  PARM1(XL),XL     LOAD NAME BASE
                   9386:        JSR  ASINP            PERFORM ASSIGNMENT
                   9387:        PPM  EXFAL            MATCH FAILS IF NAME EVAL FAILS
                   9388:        MOV  (XS)+,XT         ELSE RESTORE HISTORY STACK PTR
                   9389:        EJC
                   9390: *
                   9391: *      END OF PATTERN MATCH (CONTINUED)
                   9392: *
                   9393: *      HERE CHECK FOR END OF ENTRIES
                   9394: *
                   9395: PNTH5  BNE  XT,XS,PNTH3      LOOP IF MORE ENTRIES TO SCAN
                   9396: *
                   9397: *      HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
                   9398: *
                   9399: PNTH6  MOV  PMHBS,XS         WIPE OUT HISTORY STACK
                   9400:        MOV  (XS)+,WB         LOAD INITIAL CURSOR
                   9401:        MOV  (XS)+,WC         LOAD MATCH TYPE CODE
                   9402:        MOV  PMSSL,WA         LOAD FINAL CURSOR VALUE
                   9403:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   9404:        ZER  R$PMS            CLEAR SUBJECT STRING PTR FOR GBCOL
                   9405:        BZE  WC,PNTH7         JUMP IF CALL BY NAME
                   9406:        BEQ  WC,=NUM02,EXITS  EXIT IF STATEMENT LEVEL CALL
                   9407: *
                   9408: *      HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
                   9409: *
                   9410:        SUB  WB,WA            COMPUTE LENGTH OF STRING
                   9411:        JSR  SBSTR            BUILD SUBSTRING
                   9412:        BRN  EXIXR            AND EXIT WITH SUBSTRING VALUE
                   9413: *
                   9414: *      HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
                   9415: *
                   9416: PNTH7  MOV  WB,-(XS)         STACK INITIAL CURSOR
                   9417:        MOV  WA,-(XS)         STACK FINAL CURSOR
                   9418: .IF    .CNBF
                   9419: .ELSE
                   9420:        BZE  R$PMB,PNTH8      SKIP IF SUBJECT NOT BUFFER
                   9421:        MOV  R$PMB,XL         ELSE GET PTR TO BCBLK INSTEAD
                   9422: .FI
                   9423: *
                   9424: *      HERE WITH XL POINTING TO SCBLK OR BCBLK
                   9425: *
                   9426: PNTH8  MOV  XL,-(XS)         STACK SUBJECT POINTER
                   9427:        BRN  EXITS            EXIT WITH SPECIAL ENTRY ON STACK
                   9428:        EJC
                   9429: *
                   9430: *      POS (INTEGER ARGUMENT)
                   9431: *
                   9432: *      PARM1                 INTEGER ARGUMENT
                   9433: *
                   9434: P$POS  ENT  BL$P1            P1BLK
                   9435: *
                   9436: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9437: *
                   9438: PPOS1  BEQ  WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
                   9439:        BRN  FAILP            ELSE FAIL
                   9440:        EJC
                   9441: *
                   9442: *      POS (EXPRESSION ARGUMENT)
                   9443: *
                   9444: *      PARM1                 EXPRESSION POINTER
                   9445: *
                   9446: P$PSD  ENT  BL$P1            P1BLK
                   9447:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   9448:        ERR  050,POS EVALUATED ARGUMENT IS NOT INTEGER
                   9449:        ERR  051,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   9450:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9451:        PPM  PPOS1            MERGE WITH NORMAL CASE IF OK
                   9452:        EJC
                   9453: *
                   9454: *      PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
                   9455: *
                   9456: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9457: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9458: *
                   9459: *      NO PARAMETERS
                   9460: *
                   9461: P$PAA  ENT  BL$P0            P0BLK
                   9462:        MOV  WB,-(XS)         STACK INITIAL CURSOR
                   9463:        MOV  =NDPAB,-(XS)     STACK PTR TO NDPAB SPECIAL NODE
                   9464:        BRN  SUCCP            AND SUCCEED MATCHING NULL
                   9465:        EJC
                   9466: *
                   9467: *      PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
                   9468: *
                   9469: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9470: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9471: *
                   9472: *      NO PARAMETERS (DUMMY PATTERN)
                   9473: *
                   9474: P$PAB  ENT                   ENTRY POINT
                   9475:        BRN  FAILP            JUST FAIL (ENTRY IS ALREADY POPPED)
                   9476:        EJC
                   9477: *
                   9478: *      PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
                   9479: *
                   9480: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9481: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9482: *
                   9483: *      PARM1                 NAME BASE OF VARIABLE
                   9484: *      PARM2                 NAME OFFSET OF VARIABLE
                   9485: *
                   9486: P$PAC  ENT  BL$P2            P2BLK
                   9487:        MOV  WB,-(XS)         STACK DUMMY CURSOR VALUE
                   9488:        MOV  XR,-(XS)         STACK POINTER TO P$PAC NODE
                   9489:        MOV  WB,-(XS)         STACK FINAL CURSOR
                   9490:        MOV  =NDPAD,-(XS)     STACK PTR TO SPECIAL NDPAD NODE
                   9491:        MNZ  PMDFL            SET DOT FLAG NON-ZERO
                   9492:        BRN  SUCCP            AND SUCCEED
                   9493:        EJC
                   9494: *
                   9495: *      PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
                   9496: *
                   9497: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   9498: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   9499: *
                   9500: *      NO PARAMETERS (DUMMY NODE)
                   9501: *
                   9502: P$PAD  ENT                   ENTRY POINT
                   9503:        BRN  FLPOP            FAIL AND REMOVE P$PAC NODE
                   9504:        EJC
                   9505: *
                   9506: *      REM
                   9507: *
                   9508: *      NO PARAMETERS
                   9509: *
                   9510: P$REM  ENT  BL$P0            P0BLK
                   9511:        MOV  PMSSL,WB         POINT CURSOR TO END OF STRING
                   9512:        BRN  SUCCP            AND SUCCEED
                   9513:        EJC
                   9514: *
                   9515: *      RPOS (EXPRESSION ARGUMENT)
                   9516: *
                   9517: *      PARM1                 EXPRESSION POINTER
                   9518: *
                   9519: P$RPD  ENT  BL$P1            P1BLK
                   9520:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   9521:        ERR  052,RPOS EVALUATED ARGUMENT IS NOT INTEGER
                   9522:        ERR  053,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   9523:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9524:        PPM  PRPS1            MERGE WITH NORMAL CASE IF OK
                   9525:        EJC
                   9526: *
                   9527: *      RPOS (INTEGER ARGUMENT)
                   9528: *
                   9529: *      PARM1                 INTEGER ARGUMENT
                   9530: *
                   9531: P$RPS  ENT  BL$P1            P1BLK
                   9532: *
                   9533: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9534: *
                   9535: PRPS1  MOV  PMSSL,WC         GET LENGTH OF STRING
                   9536:        SUB  WB,WC            GET NUMBER OF CHARACTERS REMAINING
                   9537:        BEQ  WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
                   9538:        BRN  FAILP            ELSE FAIL
                   9539:        EJC
                   9540: *
                   9541: *      RTAB (INTEGER ARGUMENT)
                   9542: *
                   9543: *      PARM1                 INTEGER ARGUMENT
                   9544: *
                   9545: P$RTB  ENT  BL$P1            P1BLK
                   9546: *
                   9547: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9548: *
                   9549: PRTB1  MOV  WB,WC            SAVE INITIAL CURSOR
                   9550:        MOV  PMSSL,WB         POINT TO END OF STRING
                   9551:        BLT  WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH
                   9552:        SUB  PARM1(XR),WB     ELSE SET NEW CURSOR
                   9553:        BGE  WB,WC,SUCCP      AND SUCCEED IF NOT TOO FAR ALREADY
                   9554:        BRN  FAILP            IN WHICH CASE, FAIL
                   9555:        EJC
                   9556: *
                   9557: *      RTAB (EXPRESSION ARGUMENT)
                   9558: *
                   9559: *      PARM1                 EXPRESSION POINTER
                   9560: *
                   9561: P$RTD  ENT  BL$P1            P1BLK
                   9562:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   9563:        ERR  054,RTAB EVALUATED ARGUMENT IS NOT INTEGER
                   9564:        ERR  055,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   9565:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9566:        PPM  PRTB1            MERGE WITH NORMAL CASE IF SUCCESS
                   9567:        EJC
                   9568: *
                   9569: *      SPAN (EXPRESSION ARGUMENT)
                   9570: *
                   9571: *      PARM1                 EXPRESSION POINTER
                   9572: *
                   9573: P$SPD  ENT  BL$P1            P1BLK
                   9574:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   9575:        ERR  056,SPAN EVALUATED ARGUMENT IS NOT STRING
                   9576:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9577:        PPM  PSPN1            MERGE WITH MULTI-CHAR CASE IF OK
                   9578:        EJC
                   9579: *
                   9580: *      SPAN (MULTI-CHARACTER ARGUMENT CASE)
                   9581: *
                   9582: *      PARM1                 POINTER TO CTBLK
                   9583: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
                   9584: *
                   9585: P$SPN  ENT  BL$P2            P2BLK
                   9586: *
                   9587: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9588: *
                   9589: PSPN1  MOV  PMSSL,WC         COPY SUBJECT STRING LENGTH
                   9590:        SUB  WB,WC            CALCULATE NUMBER OF CHARACTERS LEFT
                   9591:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   9592:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   9593:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   9594:        MOV  WB,PSAVC         SAVE INITIAL CURSOR
                   9595:        MOV  XR,PSAVE         SAVE NODE POINTER
                   9596:        LCT  WC,WC            SET COUNTER FOR CHARS LEFT
                   9597: *
                   9598: *      LOOP TO SCAN MATCHING CHARACTERS
                   9599: *
                   9600: PSPN2  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
                   9601:        WTB  WA               CONVERT TO BYTE OFFSET
                   9602:        MOV  PARM1(XR),XR     POINT TO CTBLK
                   9603:        ADD  WA,XR            POINT TO CTBLK ENTRY
                   9604:        MOV  CTCHS(XR),WA     LOAD CTBLK ENTRY
                   9605:        MOV  PSAVE,XR         RESTORE NODE POINTER
                   9606:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   9607:        ZRB  WA,PSPN3         JUMP IF NO MATCH
                   9608:        ICV  WB               ELSE PUSH CURSOR
                   9609:        BCT  WC,PSPN2         LOOP BACK UNLESS END OF STRING
                   9610: *
                   9611: *      HERE AFTER SCANNING MATCHING CHARACTERS
                   9612: *
                   9613: PSPN3  BNE  WB,PSAVC,SUCCP   SUCCEED IF CHARS MATCHED
                   9614:        BRN  FAILP            ELSE FAIL IF NULL STRING MATCHED
                   9615:        EJC
                   9616: *
                   9617: *      SPAN (ONE CHARACTER ARGUMENT)
                   9618: *
                   9619: *      PARM1                 CHARACTER ARGUMENT
                   9620: *
                   9621: P$SPS  ENT  BL$P1            P1BLK
                   9622:        MOV  PMSSL,WC         GET SUBJECT STRING LENGTH
                   9623:        SUB  WB,WC            CALCULATE NUMBER OF CHARACTERS LEFT
                   9624:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   9625:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   9626:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   9627:        MOV  WB,PSAVC         SAVE INITIAL CURSOR
                   9628:        LCT  WC,WC            SET COUNTER FOR CHARACTERS LEFT
                   9629: *
                   9630: *      LOOP TO SCAN MATCHING CHARACTERS
                   9631: *
                   9632: PSPS1  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
                   9633:        BNE  WA,PARM1(XR),PSPS2 JUMP IF NO MATCH
                   9634:        ICV  WB               ELSE PUSH CURSOR
                   9635:        BCT  WC,PSPS1         AND LOOP UNLESS END OF STRING
                   9636: *
                   9637: *      HERE AFTER SCANNING MATCHING CHARACTERS
                   9638: *
                   9639: PSPS2  BNE  WB,PSAVC,SUCCP   SUCCEED IF CHARS MATCHED
                   9640:        BRN  FAILP            FAIL IF NULL STRING MATCHED
                   9641:        EJC
                   9642: *
                   9643: *      MULTI-CHARACTER STRING
                   9644: *
                   9645: *      NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
                   9646: *      ONE CHARACTER ANY ARGUMENTS (P$AN1).
                   9647: *
                   9648: *      PARM1                 POINTER TO SCBLK FOR STRING ARG
                   9649: *
                   9650: P$STR  ENT  BL$P1            P1BLK
                   9651:        MOV  PARM1(XR),XL     GET POINTER TO STRING
                   9652: *
                   9653: *      MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE
                   9654: *
                   9655: PSTR1  MOV  XR,PSAVE         SAVE NODE POINTER
                   9656:        MOV  R$PMS,XR         LOAD SUBJECT STRING POINTER
                   9657:        PLC  XR,WB            POINT TO CURRENT CHARACTER
                   9658:        ADD  SCLEN(XL),WB     COMPUTE NEW CURSOR POSITION
                   9659:        BGT  WB,PMSSL,FAILP   FAIL IF PAST END OF STRING
                   9660:        MOV  WB,PSAVC         SAVE UPDATED CURSOR
                   9661:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARS TO COMPARE
                   9662:        PLC  XL               POINT TO CHARS OF TEST STRING
                   9663:        CMC  FAILP,FAILP      COMPARE, FAIL IF NOT EQUAL
                   9664:        MOV  PSAVE,XR         IF ALL MATCHED, RESTORE NODE PTR
                   9665:        MOV  PSAVC,WB         RESTORE UPDATED CURSOR
                   9666:        BRN  SUCCP            AND SUCCEED
                   9667:        EJC
                   9668: *
                   9669: *      SUCCEED
                   9670: *
                   9671: *      SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
                   9672: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
                   9673: *
                   9674: *      NO PARAMETERS
                   9675: *
                   9676: P$SUC  ENT  BL$P0            P0BLK
                   9677:        MOV  WB,-(XS)         STACK CURSOR
                   9678:        MOV  XR,-(XS)         STACK POINTER TO THIS NODE
                   9679:        BRN  SUCCP            SUCCEED MATCHING NULL
                   9680:        EJC
                   9681: *
                   9682: *      TAB (INTEGER ARGUMENT)
                   9683: *
                   9684: *      PARM1                 INTEGER ARGUMENT
                   9685: *
                   9686: P$TAB  ENT  BL$P1            P1BLK
                   9687: *
                   9688: *      EXPRESSION ARGUMENT CASE MERGES HERE
                   9689: *
                   9690: PTAB1  BGT  WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY
                   9691:        MOV  PARM1(XR),WB     ELSE SET NEW CURSOR POSITION
                   9692:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
                   9693:        BRN  FAILP            ELSE FAIL
                   9694:        EJC
                   9695: *
                   9696: *      TAB (EXPRESSION ARGUMENT)
                   9697: *
                   9698: *      PARM1                 EXPRESSION POINTER
                   9699: *
                   9700: P$TBD  ENT  BL$P1            P1BLK
                   9701:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   9702:        ERR  057,TAB EVALUATED ARGUMENT IS NOT INTEGER
                   9703:        ERR  058,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   9704:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   9705:        PPM  PTAB1            MERGE WITH NORMAL CASE IF OK
                   9706:        EJC
                   9707: *
                   9708: *      ANCHOR MOVEMENT
                   9709: *
                   9710: *      NO PARAMETERS (DUMMY NODE)
                   9711: *
                   9712: P$UNA  ENT                   ENTRY POINT
                   9713:        MOV  WB,XR            COPY INITIAL PATTERN NODE POINTER
                   9714:        MOV  (XS),WB          GET INITIAL CURSOR
                   9715:        BEQ  WB,PMSSL,EXFAL   MATCH FAILS IF AT END OF STRING
                   9716:        ICV  WB               ELSE INCREMENT CURSOR
                   9717:        MOV  WB,(XS)          STORE INCREMENTED CURSOR
                   9718:        MOV  XR,-(XS)         RESTACK INITIAL NODE PTR
                   9719:        MOV  =NDUNA,-(XS)     RESTACK UNANCHORED NODE
                   9720:        BRI  (XR)             REMATCH FIRST NODE
                   9721:        EJC
                   9722: *
                   9723: *      END OF PATTERN MATCH ROUTINES
                   9724: *
                   9725: *      THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
                   9726: *      MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
                   9727: *      REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
                   9728: *
                   9729: P$YYY  ENT  BL$$I            MARK LAST ENTRY IN PATTERN SECTION
                   9730:        TTL  S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
                   9731: *
                   9732: *      THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
                   9733: *      WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
                   9734: *
                   9735: *      THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
                   9736: *      INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
                   9737: *      IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
                   9738: *
                   9739: *      THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
                   9740: *      HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
                   9741: *
                   9742: *      IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
                   9743: *      AND IN THESE INSTANCES WE ALSO HAVE.
                   9744: *
                   9745: *      (WA)                  ACTUAL NUMBER OF ARGUMENTS IN CALL
                   9746: *
                   9747: *      CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
                   9748: *      ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
                   9749: *      WORD FROM THE GENERATED CODE.
                   9750: *
                   9751: *      THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
                   9752: *      THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
                   9753: *      THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
                   9754: *      ALPHABETICALLY BY THEIR ENTRY NAMES.
                   9755:        EJC
                   9756: *
                   9757: *      ANY
                   9758: *
                   9759: S$ANY  ENT                   ENTRY POINT
                   9760:        MOV  =P$ANS,WB        SET PCODE FOR SINGLE CHAR CASE
                   9761:        MOV  =P$ANY,XL        PCODE FOR MULTI-CHAR CASE
                   9762:        MOV  =P$AYD,WC        PCODE FOR EXPRESSION CASE
                   9763:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   9764:        ERR  059,ANY ARGUMENT IS NOT STRING OR EXPRESSION
                   9765:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   9766:        EJC
                   9767: .IF    .CNBF
                   9768: .ELSE
                   9769: *
                   9770: *      APPEND
                   9771: *
                   9772: S$APN  ENT                   ENTRY POINT
                   9773:        MOV  (XS)+,XL         GET APPEND ARGUMENT
                   9774:        MOV  (XS)+,XR         GET BCBLK
                   9775:        BEQ  (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK
                   9776:        ERB  275,APPEND FIRST ARGUMENT IS NOT BUFFER
                   9777: *
                   9778: *      HERE TO DO THE APPEND
                   9779: *
                   9780: SAPN1  JSR  APNDB            DO THE APPEND
                   9781:        ERR  276,APPEND SECOND ARGUMENT IS NOT STRING
                   9782:        PPM  EXFAL            NO ROOM - FAIL
                   9783:        BRN  EXNUL            EXIT WITH NULL RESULT
                   9784:        EJC
                   9785: .FI
                   9786: *
                   9787: *      APPLY
                   9788: *
                   9789: *      APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
                   9790: *      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
                   9791: *
                   9792: S$APP  ENT                   ENTRY POINT
                   9793:        BZE  WA,SAPP3         JUMP IF NO ARGUMENTS
                   9794:        DCV  WA               ELSE GET APPLIED FUNC ARG COUNT
                   9795:        MOV  WA,WB            COPY
                   9796:        WTB  WB               CONVERT TO BYTES
                   9797:        MOV  XS,XT            COPY STACK POINTER
                   9798:        ADD  WB,XT            POINT TO FUNCTION ARGUMENT ON STACK
                   9799:        MOV  (XT),XR          LOAD FUNCTION PTR (APPLY 1ST ARG)
                   9800:        BZE  WA,SAPP2         JUMP IF NO ARGS FOR APPLIED FUNC
                   9801:        LCT  WB,WA            ELSE SET COUNTER FOR LOOP
                   9802: *
                   9803: *      LOOP TO MOVE ARGUMENTS UP ON STACK
                   9804: *
                   9805: SAPP1  DCA  XT               POINT TO NEXT ARGUMENT
                   9806:        MOV  (XT),1(XT)       MOVE ARGUMENT UP
                   9807:        BCT  WB,SAPP1         LOOP TILL ALL MOVED
                   9808: *
                   9809: *      MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
                   9810: *
                   9811: SAPP2  ICA  XS               ADJUST STACK PTR FOR APPLY 1ST ARG
                   9812:        JSR  GTNVR            GET VARIABLE BLOCK ADDR FOR FUNC
                   9813:        PPM  SAPP3            JUMP IF NOT NATURAL VARIABLE
                   9814:        MOV  VRFNC(XR),XL     ELSE POINT TO FUNCTION BLOCK
                   9815:        BRN  CFUNC            GO CALL APPLIED FUNCTION
                   9816: *
                   9817: *      HERE FOR INVALID FIRST ARGUMENT
                   9818: *
                   9819: SAPP3  ERB  060,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME
                   9820:        EJC
                   9821: *
                   9822: *      ARBNO
                   9823: *
                   9824: *      ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
                   9825: *      START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
                   9826: *
                   9827: S$ABN  ENT                   ENTRY POINT
                   9828:        ZER  XR               SET PARM1 = 0 FOR THE MOMENT
                   9829:        MOV  =P$ALT,WB        SET PCODE FOR ALTERNATIVE NODE
                   9830:        JSR  PBILD            BUILD ALTERNATIVE NODE
                   9831:        MOV  XR,XL            SAVE PTR TO ALTERNATIVE PATTERN
                   9832:        MOV  =P$ABC,WB        PCODE FOR P$ABC
                   9833:        ZER  XR               P0BLK
                   9834:        JSR  PBILD            BUILD P$ABC NODE
                   9835:        MOV  XL,PTHEN(XR)     PUT ALTERNATIVE NODE AS SUCCESSOR
                   9836:        MOV  XL,WA            REMEMBER ALTERNATIVE NODE POINTER
                   9837:        MOV  XR,XL            COPY P$ABC NODE PTR
                   9838:        MOV  (XS),XR          LOAD ARBNO ARGUMENT
                   9839:        MOV  WA,(XS)          STACK ALTERNATIVE NODE POINTER
                   9840:        JSR  GTPAT            GET ARBNO ARGUMENT AS PATTERN
                   9841:        ERR  061,ARBNO ARGUMENT IS NOT PATTERN
                   9842:        JSR  PCONC            CONCAT ARG WITH P$ABC NODE
                   9843:        MOV  XR,XL            REMEMBER PTR TO CONCD PATTERNS
                   9844:        MOV  =P$ABA,WB        PCODE FOR P$ABA
                   9845:        ZER  XR               P0BLK
                   9846:        JSR  PBILD            BUILD P$ABA NODE
                   9847:        MOV  XL,PTHEN(XR)     CONCATENATE NODES
                   9848:        MOV  (XS),XL          RECALL PTR TO ALTERNATIVE NODE
                   9849:        MOV  XR,PARM1(XL)     POINT ALTERNATIVE BACK TO ARGUMENT
                   9850:        BRN  EXITS            JUMP FOR NEXT CODE WORD
                   9851:        EJC
                   9852: *
                   9853: *      ARG
                   9854: *
                   9855: S$ARG  ENT                   ENTRY POINT
                   9856:        JSR  GTSMI            GET SECOND ARG AS SMALL INTEGER
                   9857:        ERR  062,ARG SECOND ARGUMENT IS NOT INTEGER
                   9858:        PPM  EXFAL            FAIL IF OUT OF RANGE OR NEGATIVE
                   9859:        MOV  XR,WA            SAVE ARGUMENT NUMBER
                   9860:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   9861:        JSR  GTNVR            LOCATE VRBLK
                   9862:        PPM  SARG1            JUMP IF NOT NATURAL VARIABLE
                   9863:        MOV  VRFNC(XR),XR     ELSE LOAD FUNCTION BLOCK POINTER
                   9864:        BNE  (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED
                   9865:        BZE  WA,EXFAL         FAIL IF ARG NUMBER IS ZERO
                   9866:        BGT  WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE
                   9867:        WTB  WA               ELSE CONVERT TO BYTE OFFSET
                   9868:        ADD  WA,XR            POINT TO ARGUMENT SELECTED
                   9869:        MOV  PFAGB(XR),XR     LOAD ARGUMENT VRBLK POINTER
                   9870:        BRN  EXVNM            EXIT TO BUILD NMBLK
                   9871: *
                   9872: *      HERE IF 1ST ARGUMENT IS BAD
                   9873: *
                   9874: SARG1  ERB  063,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
                   9875:        EJC
                   9876: *
                   9877: *      ARRAY
                   9878: *
                   9879: S$ARR  ENT                   ENTRY POINT
                   9880:        MOV  (XS)+,XL         LOAD INITIAL ELEMENT VALUE
                   9881:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   9882:        JSR  GTINT            CONVERT FIRST ARG TO INTEGER
                   9883:        PPM  SAR02            JUMP IF NOT INTEGER
                   9884: *
                   9885: *      HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
                   9886: *
                   9887:        LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   9888:        ILE  SAR10            JUMP IF ZERO OR NEG (BAD DIMENSION)
                   9889:        MFI  WA,SAR11         ELSE CONVERT TO ONE WORD, TEST OVFL
                   9890:        LCT  WB,WA            COPY ELEMENTS FOR LOOP LATER ON
                   9891:        ADD  =VCSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   9892:        WTB  WA               CONVERT LENGTH TO BYTES
                   9893:        BGE  WA,MXLEN,SAR11   FAIL IF TOO LARGE
                   9894:        JSR  ALLOC            ALLOCATE SPACE FOR VCBLK
                   9895:        MOV  =B$VCT,(XR)      STORE TYPE WORD
                   9896:        MOV  WA,VCLEN(XR)     SET LENGTH
                   9897:        MOV  XL,WC            COPY DEFAULT VALUE
                   9898:        MOV  XR,XL            COPY VCBLK POINTER
                   9899:        ADD  *VCVLS,XL        POINT TO FIRST ELEMENT VALUE
                   9900: *
                   9901: *      LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
                   9902: *
                   9903: SAR01  MOV  WC,(XL)+         STORE ONE VALUE
                   9904:        BCT  WB,SAR01         LOOP TILL ALL STORED
                   9905:        BRN  EXSID            EXIT SETTING IDVAL
                   9906:        EJC
                   9907: *
                   9908: *      ARRAY (CONTINUED)
                   9909: *
                   9910: *      HERE IF FIRST ARGUMENT IS NOT AN INTEGER
                   9911: *
                   9912: SAR02  MOV  XR,-(XS)         REPLACE ARGUMENT ON STACK
                   9913:        JSR  XSCNI            INITIALIZE SCAN OF FIRST ARGUMENT
                   9914:        ERR  064,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING
                   9915:        PPM  EXNUL            DUMMY (UNUSED) NULL STRING EXIT
                   9916:        MOV  R$XSC,-(XS)      SAVE PROTOTYPE POINTER
                   9917:        MOV  XL,-(XS)         SAVE DEFAULT VALUE
                   9918:        ZER  ARCDM            ZERO COUNT OF DIMENSIONS
                   9919:        ZER  ARPTR            ZERO OFFSET TO INDICATE PASS ONE
                   9920:        LDI  INTV1            LOAD INTEGER ONE
                   9921:        STI  ARNEL            INITIALIZE ELEMENT COUNT
                   9922: *
                   9923: *      THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
                   9924: *      (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
                   9925: *      AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
                   9926: *      USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
                   9927: *
                   9928: SAR03  LDI  INTV1            LOAD ONE AS DEFAULT LOW BOUND
                   9929:        STI  ARSVL            SAVE AS LOW BOUND
                   9930:        MOV  =CH$CL,WC        SET DELIMITER ONE = COLON
                   9931:        MOV  =CH$CM,XL        SET DELIMITER TWO = COMMA
                   9932:        JSR  XSCAN            SCAN NEXT BOUND
                   9933:        BNE  WA,=NUM01,SAR04  JUMP IF NOT COLON
                   9934: *
                   9935: *      HERE WE HAVE A COLON ENDING A LOW BOUND
                   9936: *
                   9937:        JSR  GTINT            CONVERT LOW BOUND
                   9938:        ERR  065,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
                   9939:        LDI  ICVAL(XR)        LOAD VALUE OF LOW BOUND
                   9940:        STI  ARSVL            STORE LOW BOUND VALUE
                   9941:        MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
                   9942:        MOV  WC,XL            AND DELIMITER TWO = COMMA
                   9943:        JSR  XSCAN            SCAN HIGH BOUND
                   9944:        EJC
                   9945: *
                   9946: *      ARRAY (CONTINUED)
                   9947: *
                   9948: *      MERGE HERE TO PROCESS UPPER BOUND
                   9949: *
                   9950: SAR04  JSR  GTINT            CONVERT HIGH BOUND TO INTEGER
                   9951:        ERR  066,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
                   9952:        LDI  ICVAL(XR)        GET HIGH BOUND
                   9953:        SBI  ARSVL            SUBTRACT LOWER BOUND
                   9954:        IOV  SAR10            BAD DIMENSION IF OVERFLOW
                   9955:        ILT  SAR10            BAD DIMENSION IF NEGATIVE
                   9956:        ADI  INTV1            ADD 1 TO GET DIMENSION
                   9957:        IOV  SAR10            BAD DIMENSION IF OVERFLOW
                   9958:        MOV  ARPTR,XL         LOAD OFFSET (ALSO PASS INDICATOR)
                   9959:        BZE  XL,SAR05         JUMP IF FIRST PASS
                   9960: *
                   9961: *      HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
                   9962: *
                   9963:        ADD  (XS),XL          POINT TO CURRENT LOCATION IN ARBLK
                   9964:        STI  CFP$I(XL)        STORE DIMENSION
                   9965:        LDI  ARSVL            LOAD LOW BOUND
                   9966:        STI  (XL)             STORE LOW BOUND
                   9967:        ADD  *ARDMS,ARPTR     BUMP OFFSET TO NEXT BOUNDS
                   9968:        BRN  SAR06            JUMP TO CHECK FOR END OF BOUNDS
                   9969: *
                   9970: *      HERE IN PASS 1
                   9971: *
                   9972: SAR05  ICV  ARCDM            BUMP DIMENSION COUNT
                   9973:        MLI  ARNEL            MULTIPLY DIMENSION BY COUNT SO FAR
                   9974:        IOV  SAR11            TOO LARGE IF OVERFLOW
                   9975:        STI  ARNEL            ELSE STORE UPDATED ELEMENT COUNT
                   9976: *
                   9977: *      MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
                   9978: *
                   9979: SAR06  BNZ  WA,SAR03         LOOP BACK UNLESS END OF BOUNDS
                   9980:        BNZ  ARPTR,SAR09      JUMP IF END OF PASS 2
                   9981:        EJC
                   9982: *
                   9983: *      ARRAY (CONTINUED)
                   9984: *
                   9985: *      HERE AT END OF PASS ONE, BUILD ARBLK
                   9986: *
                   9987:        LDI  ARNEL            GET NUMBER OF ELEMENTS
                   9988:        MFI  WB,SAR11         GET AS ADDR INTEGER, TEST OVFLO
                   9989:        WTB  WB               ELSE CONVERT TO LENGTH IN BYTES
                   9990:        MOV  *ARSI$,WA        SET SIZE OF STANDARD FIELDS
                   9991:        LCT  WC,ARCDM         SET DIMENSION COUNT TO CONTROL LOOP
                   9992: *
                   9993: *      LOOP TO ALLOW SPACE FOR DIMENSIONS
                   9994: *
                   9995: SAR07  ADD  *ARDMS,WA        ALLOW SPACE FOR ONE SET OF BOUNDS
                   9996:        BCT  WC,SAR07         LOOP BACK TILL ALL ACCOUNTED FOR
                   9997:        MOV  WA,XL            SAVE SIZE (=AROFS)
                   9998: *
                   9999: *      NOW ALLOCATE SPACE FOR ARBLK
                   10000: *
                   10001:        ADD  WB,WA            ADD SPACE FOR ELEMENTS
                   10002:        ICA  WA               ALLOW FOR ARPRO PROTOTYPE FIELD
                   10003:        BGE  WA,MXLEN,SAR11   FAIL IF TOO LARGE
                   10004:        JSR  ALLOC            ELSE ALLOCATE ARBLK
                   10005:        MOV  (XS),WB          LOAD DEFAULT VALUE
                   10006:        MOV  XR,(XS)          SAVE ARBLK POINTER
                   10007:        MOV  WA,WC            SAVE LENGTH IN BYTES
                   10008:        BTW  WA               CONVERT LENGTH BACK TO WORDS
                   10009:        LCT  WA,WA            SET COUNTER TO CONTROL LOOP
                   10010: *
                   10011: *      LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
                   10012: *
                   10013: SAR08  MOV  WB,(XR)+         SET ONE WORD
                   10014:        BCT  WA,SAR08         LOOP TILL ALL SET
                   10015:        EJC
                   10016: *
                   10017: *      ARRAY (CONTINUED)
                   10018: *
                   10019: *      NOW SET INITIAL FIELDS OF ARBLK
                   10020: *
                   10021:        MOV  (XS)+,XR         RELOAD ARBLK POINTER
                   10022:        MOV  (XS),WB          LOAD PROTOTYPE
                   10023:        MOV  =B$ART,(XR)      SET TYPE WORD
                   10024:        MOV  WC,ARLEN(XR)     STORE LENGTH IN BYTES
                   10025:        ZER  IDVAL(XR)        ZERO ID TILL WE GET IT BUILT
                   10026:        MOV  XL,AROFS(XR)     SET PROTOTYPE FIELD PTR
                   10027:        MOV  ARCDM,ARNDM(XR)  SET NUMBER OF DIMENSIONS
                   10028:        MOV  XR,WC            SAVE ARBLK POINTER
                   10029:        ADD  XL,XR            POINT TO PROTOTYPE FIELD
                   10030:        MOV  WB,(XR)          STORE PROTOTYPE PTR IN ARBLK
                   10031:        MOV  *ARLBD,ARPTR     SET OFFSET FOR PASS 2 BOUNDS SCAN
                   10032:        MOV  WB,R$XSC         RESET STRING POINTER FOR XSCAN
                   10033:        MOV  WC,(XS)          STORE ARBLK POINTER ON STACK
                   10034:        ZER  XSOFS            RESET OFFSET PTR TO START OF STRING
                   10035:        BRN  SAR03            JUMP BACK TO RESCAN BOUNDS
                   10036: *
                   10037: *      HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
                   10038: *
                   10039: SAR09  MOV  (XS)+,XR         RELOAD POINTER TO ARBLK
                   10040:        BRN  EXSID            EXIT SETTING IDVAL
                   10041: *
                   10042: *      HERE FOR BAD DIMENSION
                   10043: *
                   10044: SAR10  ERB  067,ARRAY DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE
                   10045: *
                   10046: *      HERE IF ARRAY IS TOO LARGE
                   10047: *
                   10048: SAR11  ERB  068,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED
                   10049:        EJC
                   10050: .IF    .CNBF
                   10051: .ELSE
                   10052: *
                   10053: *      BUFFER
                   10054: *
                   10055: S$BUF  ENT                   ENTRY POINT
                   10056:        MOV  (XS)+,XL         GET INITIAL VALUE
                   10057:        MOV  (XS)+,XR         GET REQUESTED ALLOCATION
                   10058:        JSR  GTINT            CONVERT TO INTEGER
                   10059:        ERR  269,BUFFER FIRST ARGUMENT IS NOT INTEGER
                   10060:        LDI  ICVAL(XR)        GET VALUE
                   10061:        ILE  SBF01            BRANCH IF NEGATIVE OR ZERO
                   10062:        MFI  WA,SBF02         MOVE WITH OVERFLOW CHECK
                   10063:        JSR  ALOBF            ALLOCATE THE BUFFER
                   10064:        JSR  APNDB            COPY IT IN
                   10065:        ERR  270,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER
                   10066:        ERR  271,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION
                   10067:        BRN  EXSID            EXIT SETTING IDVAL
                   10068: *
                   10069: *      HERE FOR INVALID ALLOCATION SIZE
                   10070: *
                   10071: SBF01  ERB  272,BUFFER FIRST ARGUMENT IS NOT POSITIVE
                   10072: *
                   10073: *      HERE FOR ALLOCATION SIZE INTEGER OVERFLOW
                   10074: *
                   10075: SBF02  ERB  273,BUFFER SIZE IS TOO BIG
                   10076:        EJC
                   10077: .FI
                   10078: *
                   10079: *      BREAK
                   10080: *
                   10081: S$BRK  ENT                   ENTRY POINT
                   10082:        MOV  =P$BKS,WB        SET PCODE FOR SINGLE CHAR CASE
                   10083:        MOV  =P$BRK,XL        PCODE FOR MULTI-CHAR CASE
                   10084:        MOV  =P$BKD,WC        PCODE FOR EXPRESSION CASE
                   10085:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   10086:        ERR  069,BREAK ARGUMENT IS NOT STRING OR EXPRESSION
                   10087:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   10088:        EJC
                   10089: *
                   10090: *      BREAKX
                   10091: *
                   10092: *      BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
                   10093: *      OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
                   10094: *
                   10095: S$BKX  ENT                   ENTRY POINT
                   10096:        MOV  =P$BKS,WB        PCODE FOR SINGLE CHAR ARGUMENT
                   10097:        MOV  =P$BRK,XL        PCODE FOR MULTI-CHAR ARGUMENT
                   10098:        MOV  =P$BXD,WC        PCODE FOR EXPRESSION CASE
                   10099:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   10100:        ERR  070,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION
                   10101: *
                   10102: *      NOW HOOK BREAKX NODE ON AT FRONT END
                   10103: *
                   10104:        MOV  XR,-(XS)         SAVE PTR TO BREAK NODE
                   10105:        MOV  =P$BKX,WB        SET PCODE FOR BREAKX NODE
                   10106:        JSR  PBILD            BUILD IT
                   10107:        MOV  (XS),PTHEN(XR)   SET BREAK NODE AS SUCCESSOR
                   10108:        MOV  =P$ALT,WB        SET PCODE FOR ALTERNATION NODE
                   10109:        JSR  PBILD            BUILD (PARM1=ALT=BREAKX NODE)
                   10110:        MOV  XR,WA            SAVE PTR TO ALTERNATION NODE
                   10111:        MOV  (XS),XR          POINT TO BREAK NODE
                   10112:        MOV  WA,PTHEN(XR)     SET ALTERNATE NODE AS SUCCESSOR
                   10113:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   10114:        EJC
                   10115: *
                   10116: *      CHAR
                   10117: *
                   10118: S$CHR  ENT                   ENTRY POINT
                   10119:        JSR  GTSMI            CONVERT ARG TO INTEGER
                   10120:        ERR  281,CHAR ARGUMENT NOT INTEGER
                   10121:        PPM  SCHR1            TOO BIG ERROR EXIT
                   10122:        BGE  WC,=CFP$A,SCHR1  SEE IF OUT OF RANGE OF HOST SET
                   10123:        MOV  =NUM01,WA        IF NOT SET SCBLK ALLOCATION
                   10124:        MOV  WC,WB            SAVE CHAR CODE
                   10125:        JSR  ALOCS            ALLOCATE 1 BAU SCBLK
                   10126:        MOV  XR,XL            COPY SCBLK POINTER
                   10127:        PSC  XL               GET SET TO STUFF CHAR
                   10128:        SCH  WB,(XL)+         STUFF IT
                   10129:        ZER  XL               CLEAR SLOP IN XL
                   10130:        BRN  EXIXR            EXIT WITH SCBLK POINTER
                   10131: *
                   10132: *      HERE IF CHAR ARGUMENT IS OUT OF RANGE
                   10133: *
                   10134: SCHR1  ERB  282,CHAR ARGUMENT NOT IN RANGE
                   10135:        EJC
                   10136: *
                   10137: *      CLEAR
                   10138: *
                   10139: S$CLR  ENT                   ENTRY POINT
                   10140:        JSR  XSCNI            INITIALIZE TO SCAN ARGUMENT
                   10141:        ERR  071,CLEAR ARGUMENT IS NOT STRING
                   10142:        PPM  SCLR2            JUMP IF NULL
                   10143: *
                   10144: *      LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
                   10145: *      THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO.
                   10146: *
                   10147: SCLR1  MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
                   10148:        MOV  WC,XL            DELIMITER TWO = COMMA
                   10149:        JSR  XSCAN            SCAN NEXT VARIABLE NAME
                   10150:        JSR  GTNVR            LOCATE VRBLK
                   10151:        ERR  072,CLEAR ARGUMENT HAS NULL VARIABLE NAME
                   10152:        ZER  VRGET(XR)        ELSE FLAG BY ZEROING VRGET FIELD
                   10153:        BNZ  WA,SCLR1         LOOP BACK IF STOPPED BY COMMA
                   10154: *
                   10155: *      HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
                   10156: *
                   10157: SCLR2  MOV  HSHTB,WB         POINT TO START OF HASH TABLE
                   10158: *
                   10159: *      LOOP THROUGH SLOTS IN HASH TABLE
                   10160: *
                   10161: SCLR3  BEQ  WB,HSHTE,EXNUL   EXIT RETURNING NULL IF NONE LEFT
                   10162:        MOV  WB,XR            ELSE COPY SLOT POINTER
                   10163:        ICA  WB               BUMP SLOT POINTER
                   10164:        SUB  *VRNXT,XR        SET OFFSET TO MERGE INTO LOOP
                   10165: *
                   10166: *      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
                   10167: *
                   10168: SCLR4  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON CHAIN
                   10169:        BZE  XR,SCLR3         JUMP FOR NEXT BUCKET IF CHAIN END
                   10170:        BNZ  VRGET(XR),SCLR5  JUMP IF NOT FLAGGED
                   10171:        EJC
                   10172: *
                   10173: *      CLEAR (CONTINUED)
                   10174: *
                   10175: *      HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
                   10176: *
                   10177:        JSR  SETVR            FOR FLAGGED VAR, RESTORE VRGET
                   10178:        BRN  SCLR4            AND LOOP BACK FOR NEXT VRBLK
                   10179: *
                   10180: *      HERE TO SET VALUE OF A VARIABLE TO NULL
                   10181: *      PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT
                   10182: *
                   10183: SCLR5  BEQ  VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE (REG05)
                   10184:        MOV  XR,XL            COPY VRBLK POINTER (REG05)
                   10185: *
                   10186: *      LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
                   10187: *
                   10188: SCLR6  MOV  XL,WA            SAVE BLOCK POINTER
                   10189:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE FIELD
                   10190:        BEQ  (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED
                   10191: *
                   10192: *      NOW STORE THE NULL VALUE
                   10193: *
                   10194:        MOV  WA,XL            RESTORE BLOCK POINTER
                   10195:        MOV  =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE
                   10196:        BRN  SCLR4            LOOP BACK FOR NEXT VRBLK
                   10197:        EJC
                   10198: *
                   10199: *      CODE
                   10200: *
                   10201: S$COD  ENT                   ENTRY POINT
                   10202:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10203:        JSR  GTCOD            CONVERT TO CODE
                   10204:        PPM  EXFAL            FAIL IF CONVERSION IS IMPOSSIBLE
                   10205:        BRN  EXIXR            ELSE RETURN CODE AS RESULT
                   10206:        EJC
                   10207: *
                   10208: *      COLLECT
                   10209: *
                   10210: S$COL  ENT                   ENTRY POINT
                   10211:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10212:        JSR  GTINT            CONVERT TO INTEGER
                   10213:        ERR  073,COLLECT ARGUMENT IS NOT INTEGER
                   10214:        LDI  ICVAL(XR)        LOAD COLLECT ARGUMENT
                   10215:        STI  CLSVI            SAVE COLLECT ARGUMENT
                   10216:        ZER  WB               SET NO MOVE UP
                   10217:        JSR  GBCOL            PERFORM GARBAGE COLLECTION
                   10218:        MOV  DNAME,WA         POINT TO END OF MEMORY
                   10219:        SUB  DNAMP,WA         SUBTRACT NEXT LOCATION
                   10220:        BTW  WA               CONVERT BYTES TO WORDS
                   10221:        MTI  WA               CONVERT WORDS AVAILABLE AS INTEGER
                   10222:        SBI  CLSVI            SUBTRACT ARGUMENT
                   10223:        IOV  EXFAL            FAIL IF OVERFLOW
                   10224:        ILT  EXFAL            FAIL IF NOT ENOUGH
                   10225:        ADI  CLSVI            ELSE RECOMPUTE AVAILABLE
                   10226:        BRN  EXINT            AND EXIT WITH INTEGER RESULT
                   10227:        EJC
                   10228: *
                   10229: *      CONVERT
                   10230: *
                   10231: S$CNV  ENT                   ENTRY POINT
                   10232:        JSR  GTSTG            CONVERT SECOND ARGUMENT TO STRING
                   10233:        ERR  074,CONVERT SECOND ARGUMENT IS NOT STRING
                   10234: .IF    .CULC
                   10235:        JSR  FLSTG            FOLD LOWER CASE TO UPPER CASE
                   10236: .FI
                   10237:        MOV  (XS),XL          LOAD FIRST ARGUMENT
                   10238:        BNE  (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED
                   10239: *
                   10240: *      HERE FOR PROGRAM DEFINED DATATYPE
                   10241: *
                   10242:        MOV  PDDFP(XL),XL     POINT TO DFBLK
                   10243:        MOV  DFNAM(XL),XL     LOAD DATATYPE NAME
                   10244:        JSR  IDENT            COMPARE WITH SECOND ARG
                   10245:        PPM  EXITS            EXIT IF IDENT WITH ARG AS RESULT
                   10246:        BRN  EXFAL            ELSE FAIL
                   10247: *
                   10248: *      HERE IF NOT PROGRAM DEFINED DATATYPE
                   10249: *
                   10250: SCV01  MOV  XR,-(XS)         SAVE STRING ARGUMENT
                   10251:        MOV  =SVCTB,XL        POINT TO TABLE OF NAMES TO COMPARE
                   10252:        ZER  WB               INITIALIZE COUNTER
                   10253:        MOV  WA,WC            SAVE LENGTH OF ARGUMENT STRING
                   10254: *
                   10255: *      LOOP THROUGH TABLE ENTRIES
                   10256: *
                   10257: SCV02  MOV  (XL)+,XR         LOAD NEXT TABLE ENTRY, BUMP POINTER
                   10258:        BZE  XR,EXFAL         FAIL IF ZERO MARKING END OF LIST
                   10259:        BNE  WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH
                   10260:        MOV  XL,CNVTP         ELSE STORE TABLE POINTER
                   10261:        PLC  XR               POINT TO CHARS OF TABLE ENTRY
                   10262:        MOV  (XS),XL          LOAD POINTER TO STRING ARGUMENT
                   10263:        PLC  XL               POINT TO CHARS OF STRING ARG
                   10264:        MOV  WC,WA            SET NUMBER OF CHARS TO COMPARE
                   10265:        CMC  SCV04,SCV04      COMPARE, JUMP IF NO MATCH
                   10266:        EJC
                   10267: *
                   10268: *      CONVERT (CONTINUED)
                   10269: *
                   10270: *      HERE WE HAVE A MATCH
                   10271: *
                   10272: SCV03  MOV  WB,XL            COPY ENTRY NUMBER
                   10273:        ICA  XS               POP STRING ARG OFF STACK
                   10274:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   10275:        BSW  XL,CNVTT         JUMP TO APPROPRIATE ROUTINE
                   10276:        IFF  0,SCV06          STRING
                   10277:        IFF  1,SCV07          INTEGER
                   10278:        IFF  2,SCV09          NAME
                   10279:        IFF  3,SCV10          PATTERN
                   10280:        IFF  4,SCV11          ARRAY
                   10281:        IFF  5,SCV19          TABLE
                   10282:        IFF  6,SCV25          EXPRESSION
                   10283:        IFF  7,SCV26          CODE
                   10284:        IFF  8,SCV27          NUMERIC
                   10285: .IF    .CNRA
                   10286: .ELSE
                   10287:        IFF  CNVRT,SCV08      REAL
                   10288: .FI
                   10289: .IF    .CNBF
                   10290: .ELSE
                   10291:        IFF  CNVBT,SCV28      BUFFER
                   10292: .FI
                   10293:        ESW                   END OF SWITCH TABLE
                   10294: *
                   10295: *      HERE IF NO MATCH WITH TABLE ENTRY
                   10296: *
                   10297: SCV04  MOV  CNVTP,XL         RESTORE TABLE POINTER, MERGE
                   10298: *
                   10299: *      MERGE HERE IF LENGTHS DID NOT MATCH
                   10300: *
                   10301: SCV05  ICV  WB               BUMP ENTRY NUMBER
                   10302:        BRN  SCV02            LOOP BACK TO CHECK NEXT ENTRY
                   10303: *
                   10304: *      HERE TO CONVERT TO STRING
                   10305: *
                   10306: SCV06  MOV  XR,-(XS)         REPLACE STRING ARGUMENT ON STACK
                   10307:        JSR  GTSTG            CONVERT TO STRING
                   10308:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10309:        BRN  EXIXR            ELSE RETURN STRING
                   10310:        EJC
                   10311: *
                   10312: *      CONVERT (CONTINUED)
                   10313: *
                   10314: *      HERE TO CONVERT TO INTEGER
                   10315: *
                   10316: SCV07  JSR  GTINT            CONVERT TO INTEGER
                   10317:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10318:        BRN  EXIXR            ELSE RETURN INTEGER
                   10319: .IF    .CNRA
                   10320: .ELSE
                   10321: *
                   10322: *      HERE TO CONVERT TO REAL
                   10323: *
                   10324: SCV08  JSR  GTREA            CONVERT TO REAL
                   10325:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10326:        BRN  EXIXR            ELSE RETURN REAL
                   10327: .FI
                   10328: *
                   10329: *      HERE TO CONVERT TO NAME
                   10330: *
                   10331: SCV09  BEQ  (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME
                   10332:        JSR  GTNVR            ELSE TRY STRING TO NAME CONVERT
                   10333:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10334:        BRN  EXVNM            ELSE EXIT BUILDING NMBLK FOR VRBLK
                   10335: *
                   10336: *      HERE TO CONVERT TO PATTERN
                   10337: *
                   10338: SCV10  JSR  GTPAT            CONVERT TO PATTERN
                   10339:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10340:        BRN  EXIXR            ELSE RETURN PATTERN
                   10341: *
                   10342: *      CONVERT TO ARRAY
                   10343: *
                   10344: SCV11  JSR  GTARR            GET AN ARRAY
                   10345:        PPM  EXFAL            FAIL IF NOT CONVERTIBLE
                   10346:        BRN  EXSID            EXIT SETTING ID FIELD
                   10347: *
                   10348: *      CONVERT TO TABLE
                   10349: *
                   10350: SCV19  MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   10351:        MOV  XR,-(XS)         REPLACE ARBLK POINTER ON STACK
                   10352:        BEQ  WA,=B$TBT,EXITS  RETURN ARG IF ALREADY A TABLE
                   10353:        BNE  WA,=B$ART,EXFAL  ELSE FAIL IF NOT AN ARRAY
                   10354:        EJC
                   10355: *
                   10356: *      CONVERT (CONTINUED)
                   10357: *
                   10358: *      HERE TO CONVERT AN ARRAY TO TABLE
                   10359: *
                   10360:        BNE  ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY
                   10361:        LDI  ARDM2(XR)        LOAD DIM 2
                   10362:        SBI  INTV2            SUBTRACT 2 TO COMPARE
                   10363:        INE  EXFAL            FAIL IF DIM2 NOT 2
                   10364: *
                   10365: *      HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
                   10366: *
                   10367:        LDI  ARDIM(XR)        LOAD DIM 1 (NUMBER OF ELEMENTS)
                   10368:        MFI  WA               GET AS ONE WORD INTEGER
                   10369:        LCT  WB,WA            COPY TO CONTROL LOOP
                   10370:        ADD  =TBSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   10371:        WTB  WA               CONVERT LENGTH TO BYTES
                   10372:        JSR  ALLOC            ALLOCATE SPACE FOR TBBLK
                   10373:        MOV  XR,WC            COPY TBBLK POINTER
                   10374:        MOV  XR,-(XS)         SAVE TBBLK POINTER
                   10375:        MOV  =B$TBT,(XR)+     STORE TYPE WORD
                   10376:        ZER  (XR)+            STORE ZERO FOR IDVAL FOR NOW
                   10377:        MOV  WA,(XR)+         STORE LENGTH
                   10378:        MOV  =NULLS,(XR)+     NULL INITIAL LOOKUP VALUE
                   10379: *
                   10380: *      LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
                   10381: *
                   10382: SCV20  MOV  WC,(XR)+         SET BUCKET PTR TO POINT TO TBBLK
                   10383:        BCT  WB,SCV20         LOOP TILL ALL INITIALIZED
                   10384:        MOV  *ARVL2,WB        SET OFFSET TO FIRST ARBLK ELEMENT
                   10385: *
                   10386: *      LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
                   10387: *
                   10388: SCV21  MOV  1(XS),XL         POINT TO ARBLK
                   10389:        BEQ  WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED
                   10390:        ADD  WB,XL            ELSE POINT TO CURRENT LOCATION
                   10391:        ADD  *NUM02,WB        BUMP OFFSET
                   10392:        MOV  (XL),XR          LOAD SUBSCRIPT NAME
                   10393:        DCA  XL               ADJUST PTR TO MERGE (TRVAL=1+1)
                   10394:        EJC
                   10395: *
                   10396: *      CONVERT (CONTINUED)
                   10397: *
                   10398: *      LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
                   10399: *
                   10400: SCV22  MOV  TRVAL(XL),XL     POINT TO NEXT VALUE
                   10401:        BEQ  (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED
                   10402: *
                   10403: *      HERE WITH NAME IN XR, VALUE IN XL
                   10404: *
                   10405: SCV23  MOV  XL,-(XS)         STACK VALUE
                   10406:        MOV  1(XS),XL         LOAD TBBLK POINTER
                   10407:        JSR  TFIND            BUILD TEBLK (NOTE WB GT 0 BY NAME)
                   10408:        PPM  EXFAL            FAIL IF ACESS FAILS
                   10409:        MOV  (XS)+,TEVAL(XL)  STORE VALUE IN TEBLK
                   10410:        BRN  SCV21            LOOP BACK FOR NEXT ELEMENT
                   10411: *
                   10412: *      HERE AFTER MOVING ALL ELEMENTS TO TBBLK
                   10413: *
                   10414: SCV24  MOV  (XS)+,XR         LOAD TBBLK POINTER
                   10415:        ICA  XS               POP ARBLK POINTER
                   10416:        BRN  EXSID            EXIT SETTING IDVAL
                   10417: *
                   10418: *      CONVERT TO EXPRESSION
                   10419: *
                   10420: SCV25  JSR  GTEXP            CONVERT TO EXPRESSION
                   10421:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10422:        BRN  EXIXR            ELSE RETURN EXPRESSION
                   10423: *
                   10424: *      CONVERT TO CODE
                   10425: *
                   10426: SCV26  JSR  GTCOD            CONVERT TO CODE
                   10427:        PPM  EXFAL            FAIL IF CONVERSION IS NOT POSSIBLE
                   10428:        BRN  EXIXR            ELSE RETURN CODE
                   10429: *
                   10430: *      CONVERT TO NUMERIC
                   10431: *
                   10432: SCV27  JSR  GTNUM            CONVERT TO NUMERIC
                   10433:        PPM  EXFAL            FAIL IF UNCONVERTIBLE
                   10434:        BRN  EXIXR            RETURN NUMBER
                   10435:        EJC
                   10436: .IF    .CNBF
                   10437: .ELSE
                   10438: *
                   10439: *      CONVERT TO BUFFER
                   10440: *
                   10441: SCV28  MOV  XR,-(XS)         STACK STRING FOR PROCEDURE
                   10442:        JSR  GTSTG            CONVERT TO STRING
                   10443:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   10444:        MOV  XR,XL            SAVE STRING POINTER
                   10445:        JSR  ALOBF            ALLOCATE BUFFER OF SAME SIZE
                   10446:        JSR  APNDB            COPY IN THE STRING
                   10447:        PPM                   ALREADY STRING - CANT FAIL TO CNV
                   10448:        PPM                   MUST BE ENOUGH ROOM
                   10449:        BRN  EXSID            EXIT SETTING IDVAL FIELD
                   10450:        EJC
                   10451: .FI
                   10452: *
                   10453: *      COPY
                   10454: *
                   10455: S$COP  ENT                   ENTRY POINT
                   10456:        JSR  COPYB            COPY THE BLOCK
                   10457:        PPM  EXITS            RETURN IF NO IDVAL FIELD
                   10458:        BRN  EXSID            EXIT SETTING ID VALUE
                   10459:        EJC
                   10460: *
                   10461: *      DATA
                   10462: *
                   10463: S$DAT  ENT                   ENTRY POINT
                   10464:        JSR  XSCNI            PREPARE TO SCAN ARGUMENT
                   10465:        ERR  075,DATA ARGUMENT IS NOT STRING
                   10466:        ERR  076,DATA ARGUMENT IS NULL
                   10467: *
                   10468: *      SCAN OUT DATATYPE NAME
                   10469: *
                   10470:        MOV  =CH$PP,WC        DELIMITER ONE = LEFT PAREN
                   10471:        MOV  WC,XL            DELIMITER TWO = LEFT PAREN
                   10472:        JSR  XSCAN            SCAN DATATYPE NAME
                   10473:        BNZ  WA,SDAT1         SKIP IF LEFT PAREN FOUND
                   10474:        ERB  077,DATA ARGUMENT IS MISSING A LEFT PAREN
                   10475: *
                   10476: *      HERE AFTER SCANNING DATATYPE NAME
                   10477: *
                   10478: .IF    .CULC
                   10479: SDAT1  MOV  SCLEN(XR),WA     GET LENGTH
                   10480:        JSR  FLSTG            FOLD LOWER CASE TO UPPER CASE
                   10481:        MOV  XR,XL            SAVE NAME PTR
                   10482: .ELSE
                   10483: SDAT1  MOV  XR,XL            SAVE NAME PTR
                   10484: .FI
                   10485:        MOV  SCLEN(XR),WA     GET LENGTH
                   10486:        CTB  WA,SCSI$         COMPUTE SPACE NEEDED
                   10487:        JSR  ALOST            REQUEST STATIC STORE FOR NAME
                   10488:        MOV  XR,-(XS)         SAVE DATATYPE NAME
                   10489:        MVW                   COPY NAME TO STATIC
                   10490:        MOV  (XS),XR          GET NAME PTR
                   10491:        ZER  XL               SCRUB DUD REGISTER
                   10492:        JSR  GTNVR            LOCATE VRBLK FOR DATATYPE NAME
                   10493:        ERR  078,DATA ARGUMENT HAS NULL DATATYPE NAME
                   10494:        MOV  XR,DATDV         SAVE VRBLK POINTER FOR DATATYPE
                   10495:        MOV  XS,DATXS         STORE STARTING STACK VALUE
                   10496:        ZER  WB               ZERO COUNT OF FIELD NAMES
                   10497: *
                   10498: *      LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
                   10499: *
                   10500: SDAT2  MOV  =CH$RP,WC        DELIMITER ONE = RIGHT PAREN
                   10501:        MOV  =CH$CM,XL        DELIMITER TWO = COMMA
                   10502:        JSR  XSCAN            SCAN NEXT FIELD NAME
                   10503:        BNZ  WA,SDAT3         JUMP IF DELIMITER FOUND
                   10504:        ERB  079,DATA ARGUMENT IS MISSING A RIGHT PAREN
                   10505: *
                   10506: *      HERE AFTER SCANNING OUT ONE FIELD NAME
                   10507: *
                   10508: SDAT3  JSR  GTNVR            LOCATE VRBLK FOR FIELD NAME
                   10509:        ERR  080,DATA ARGUMENT HAS NULL FIELD NAME
                   10510:        MOV  XR,-(XS)         STACK VRBLK POINTER
                   10511:        ICV  WB               INCREMENT COUNTER
                   10512:        BEQ  WA,=NUM02,SDAT2  LOOP BACK IF STOPPED BY COMMA
                   10513:        EJC
                   10514: *
                   10515: *      DATA (CONTINUED)
                   10516: *
                   10517: *      NOW BUILD THE DFBLK
                   10518: *
                   10519:        MOV  =DFSI$,WA        SET SIZE OF DFBLK STANDARD FIELDS
                   10520:        ADD  WB,WA            ADD NUMBER OF FIELDS
                   10521:        WTB  WA               CONVERT LENGTH TO BYTES
                   10522:        MOV  WB,WC            PRESERVE NO. OF FIELDS
                   10523:        JSR  ALOST            ALLOCATE SPACE FOR DFBLK
                   10524:        MOV  WC,WB            GET NO OF FIELDS
                   10525:        MOV  DATXS,XT         POINT TO START OF STACK
                   10526:        MOV  (XT),WC          LOAD DATATYPE NAME
                   10527:        MOV  XR,(XT)          SAVE DFBLK POINTER ON STACK
                   10528:        MOV  =B$DFC,(XR)+     STORE TYPE WORD
                   10529:        MOV  WB,(XR)+         STORE NUMBER OF FIELDS (FARGS)
                   10530:        MOV  WA,(XR)+         STORE LENGTH (DFLEN)
                   10531:        SUB  *PDDFS,WA        COMPUTE PDBLK LENGTH (FOR DFPDL)
                   10532:        MOV  WA,(XR)+         STORE PDBLK LENGTH (DFPDL)
                   10533:        MOV  WC,(XR)+         STORE DATATYPE NAME (DFNAM)
                   10534:        LCT  WC,WB            COPY NUMBER OF FIELDS
                   10535: *
                   10536: *      LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
                   10537: *
                   10538: SDAT4  MOV  -(XT),(XR)+      MOVE ONE FIELD NAME VRBLK POINTER
                   10539:        BCT  WC,SDAT4         LOOP TILL ALL MOVED
                   10540: *
                   10541: *      NOW DEFINE THE DATATYPE FUNCTION
                   10542: *
                   10543:        MOV  WA,WC            COPY LENGTH OF PDBLK FOR LATER LOOP
                   10544:        MOV  DATDV,XR         POINT TO VRBLK
                   10545:        MOV  DATXS,XT         POINT BACK ON STACK
                   10546:        MOV  (XT),XL          LOAD DFBLK POINTER
                   10547:        JSR  DFFNC            DEFINE FUNCTION
                   10548:        EJC
                   10549: *
                   10550: *      DATA (CONTINUED)
                   10551: *
                   10552: *      LOOP TO BUILD FFBLKS
                   10553: *
                   10554: *
                   10555: *      NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
                   10556: *      SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
                   10557: *      SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
                   10558: *
                   10559: SDAT5  MOV  *FFSI$,WA        SET LENGTH OF FFBLK
                   10560:        JSR  ALLOC            ALLOCATE SPACE FOR FFBLK
                   10561:        MOV  =B$FFC,(XR)      SET TYPE WORD
                   10562:        MOV  =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE)
                   10563:        MOV  DATXS,XT         POINT BACK ON STACK
                   10564:        MOV  (XT),FFDFP(XR)   COPY DFBLK PTR TO FFBLK
                   10565:        DCA  WC               DECREMENT OLD DFPDL TO GET NEXT OFS
                   10566:        MOV  WC,FFOFS(XR)     SET OFFSET TO THIS FIELD
                   10567:        ZER  FFNXT(XR)        TENTATIVELY SET ZERO FORWARD PTR
                   10568:        MOV  XR,XL            COPY FFBLK POINTER FOR DFFNC
                   10569:        MOV  (XS),XR          LOAD VRBLK POINTER FOR FIELD
                   10570:        MOV  VRFNC(XR),XR     LOAD CURRENT FUNCTION POINTER
                   10571:        BNE  (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC
                   10572: *
                   10573: *      HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
                   10574: *      CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
                   10575: *
                   10576:        MOV  XR,FFNXT(XL)     LINK NEW FFBLK TO PREVIOUS CHAIN
                   10577: *
                   10578: *      MERGE HERE TO DEFINE FIELD FUNCTION
                   10579: *
                   10580: SDAT6  MOV  (XS)+,XR         LOAD VRBLK POINTER
                   10581:        JSR  DFFNC            DEFINE FIELD FUNCTION
                   10582:        BNE  XS,DATXS,SDAT5   LOOP BACK TILL ALL DONE
                   10583:        ICA  XS               POP DFBLK POINTER
                   10584:        BRN  EXNUL            RETURN WITH NULL RESULT
                   10585:        EJC
                   10586: *
                   10587: *      DATATYPE
                   10588: *
                   10589: S$DTP  ENT                   ENTRY POINT
                   10590:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10591:        JSR  DTYPE            GET DATATYPE
                   10592:        BRN  EXIXR            AND RETURN IT AS RESULT
                   10593:        EJC
                   10594: *
                   10595: *      DATE
                   10596: *
                   10597: S$DTE  ENT                   ENTRY POINT
                   10598:        JSR  SYSDT            CALL SYSTEM DATE ROUTINE
                   10599:        MOV  1(XL),WA         LOAD LENGTH FOR SBSTR
                   10600:        BZE  WA,EXNUL         RETURN NULL IF LENGTH IS ZERO
                   10601:        ZER  WB               SET ZERO OFFSET
                   10602:        JSR  SBSTR            USE SBSTR TO BUILD SCBLK
                   10603:        BRN  EXIXR            RETURN DATE STRING
                   10604:        EJC
                   10605: *
                   10606: *      DEFINE
                   10607: *
                   10608: S$DEF  ENT                   ENTRY POINT
                   10609:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   10610:        ZER  DEFLB            ZERO LABEL POINTER IN CASE NULL
                   10611:        BEQ  XR,=NULLS,SDF01  JUMP IF NULL SECOND ARGUMENT
                   10612:        JSR  GTNVR            ELSE FIND VRBLK FOR LABEL
                   10613:        PPM  SDF13            JUMP IF NOT A VARIABLE NAME
                   10614:        MOV  XR,DEFLB         ELSE SET SPECIFIED ENTRY
                   10615: *
                   10616: *      SCAN FUNCTION NAME
                   10617: *
                   10618: SDF01  JSR  XSCNI            PREPARE TO SCAN FIRST ARGUMENT
                   10619:        ERR  081,DEFINE FIRST ARGUMENT IS NOT STRING
                   10620:        ERR  082,DEFINE FIRST ARGUMENT IS NULL
                   10621:        MOV  =CH$PP,WC        DELIMITER ONE = LEFT PAREN
                   10622:        MOV  WC,XL            DELIMITER TWO = LEFT PAREN
                   10623:        JSR  XSCAN            SCAN OUT FUNCTION NAME
                   10624:        BNZ  WA,SDF02         JUMP IF LEFT PAREN FOUND
                   10625:        ERB  083,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN
                   10626: *
                   10627: *      HERE AFTER SCANNING OUT FUNCTION NAME
                   10628: *
                   10629: SDF02  JSR  GTNVR            GET VARIABLE NAME
                   10630:        ERR  084,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME
                   10631:        MOV  XR,DEFVR         SAVE VRBLK POINTER FOR FUNCTION NAM
                   10632:        ZER  WB               ZERO COUNT OF ARGUMENTS
                   10633:        MOV  XS,DEFXS         SAVE INITIAL STACK POINTER
                   10634:        BNZ  DEFLB,SDF03      JUMP IF SECOND ARGUMENT GIVEN
                   10635:        MOV  XR,DEFLB         ELSE DEFAULT IS FUNCTION NAME
                   10636: *
                   10637: *      LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
                   10638: *
                   10639: SDF03  MOV  =CH$RP,WC        DELIMITER ONE = RIGHT PAREN
                   10640:        MOV  =CH$CM,XL        DELIMITER TWO = COMMA
                   10641:        JSR  XSCAN            SCAN OUT NEXT ARGUMENT NAME
                   10642:        BNZ  WA,SDF04         SKIP IF DELIMITER FOUND
                   10643:        ERB  085,NULL ARG NAME OR MISSING ) IN DEFINE FIRST ARG.
                   10644:        EJC
                   10645: *
                   10646: *      DEFINE (CONTINUED)
                   10647: *
                   10648: *      HERE AFTER SCANNING AN ARGUMENT NAME
                   10649: *
                   10650: SDF04  BNE  XR,=NULLS,SDF05  SKIP IF NON-NULL
                   10651:        BZE  WB,SDF06         IGNORE NULL IF CASE OF NO ARGUMENTS
                   10652: *
                   10653: *      HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS
                   10654: *
                   10655: SDF05  JSR  GTNVR            GET VRBLK POINTER
                   10656:        PPM  SDF03            LOOP BACK TO IGNORE NULL NAME
                   10657:        MOV  XR,-(XS)         STACK ARGUMENT VRBLK POINTER
                   10658:        ICV  WB               INCREMENT COUNTER
                   10659:        BEQ  WA,=NUM02,SDF03  LOOP BACK IF STOPPED BY A COMMA
                   10660: *
                   10661: *      HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
                   10662: *
                   10663: SDF06  MOV  WB,DEFNA         SAVE NUMBER OF ARGUMENTS
                   10664:        ZER  WB               ZERO COUNT OF LOCALS
                   10665: *
                   10666: *      LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
                   10667: *
                   10668: SDF07  MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
                   10669:        MOV  WC,XL            SET DELIMITER TWO = COMMA
                   10670:        JSR  XSCAN            SCAN OUT NEXT LOCAL NAME
                   10671:        BNE  XR,=NULLS,SDF08  SKIP IF NON-NULL
                   10672:        BZE  WB,SDF09         IGNORE NULL IF CASE OF NO LOCALS
                   10673: *
                   10674: *      HERE AFTER SCANNING OUT A LOCAL NAME
                   10675: *
                   10676: SDF08  JSR  GTNVR            GET VRBLK POINTER
                   10677:        PPM  SDF07            LOOP BACK TO IGNORE NULL NAME
                   10678:        ICV  WB               IF OK, INCREMENT COUNT
                   10679:        MOV  XR,-(XS)         STACK VRBLK POINTER
                   10680:        BNZ  WA,SDF07         LOOP BACK IF STOPPED BY A COMMA
                   10681:        EJC
                   10682: *
                   10683: *      DEFINE (CONTINUED)
                   10684: *
                   10685: *      HERE AFTER SCANNING LOCALS, BUILD PFBLK
                   10686: *
                   10687: SDF09  MOV  WB,WA            COPY COUNT OF LOCALS
                   10688:        ADD  DEFNA,WA         ADD NUMBER OF ARGUMENTS
                   10689:        MOV  WA,WC            SET SUM ARGS+LOCALS AS LOOP COUNT
                   10690:        ADD  =PFSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   10691:        WTB  WA               CONVERT LENGTH TO BYTES
                   10692:        JSR  ALLOC            ALLOCATE SPACE FOR PFBLK
                   10693:        MOV  XR,XL            SAVE POINTER TO PFBLK
                   10694:        MOV  =B$PFC,(XR)+     STORE FIRST WORD
                   10695:        MOV  DEFNA,(XR)+      STORE NUMBER OF ARGUMENTS
                   10696:        MOV  WA,(XR)+         STORE LENGTH (PFLEN)
                   10697:        MOV  DEFVR,(XR)+      STORE VRBLK PTR FOR FUNCTION NAME
                   10698:        MOV  WB,(XR)+         STORE NUMBER OF LOCALS
                   10699:        ZER  (XR)+            DEAL WITH LABEL LATER
                   10700:        ZER  (XR)+            ZERO PFCTR
                   10701:        ZER  (XR)+            ZERO PFRTR
                   10702:        BZE  WC,SDF11         SKIP IF NO ARGS OR LOCALS
                   10703:        MOV  XL,WA            KEEP PFBLK POINTER
                   10704:        MOV  DEFXS,XT         POINT BEFORE ARGUMENTS
                   10705:        LCT  WC,WC            GET COUNT OF ARGS+LOCALS FOR LOOP
                   10706: *
                   10707: *      LOOP TO MOVE LOCALS AND ARGS TO PFBLK
                   10708: *
                   10709: SDF10  MOV  -(XT),(XR)+      STORE ONE ENTRY AND BUMP POINTERS
                   10710:        BCT  WC,SDF10         LOOP TILL ALL STORED
                   10711:        MOV  WA,XL            RECOVER PFBLK POINTER
                   10712:        EJC
                   10713: *
                   10714: *      DEFINE (CONTINUED)
                   10715: *
                   10716: *      NOW DEAL WITH LABEL
                   10717: *
                   10718: SDF11  MOV  DEFXS,XS         POP STACK
                   10719:        MOV  DEFLB,XR         POINT TO VRBLK FOR LABEL
                   10720:        MOV  VRLBL(XR),XR     LOAD LABEL POINTER
                   10721:        BNE  (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED
                   10722:        MOV  TRLBL(XR),XR     ELSE POINT TO REAL LABEL
                   10723: *
                   10724: *      HERE AFTER LOCATING REAL LABEL POINTER
                   10725: *
                   10726: SDF12  BEQ  XR,=STNDL,SDF13  JUMP IF LABEL IS NOT DEFINED
                   10727:        MOV  XR,PFCOD(XL)     ELSE STORE LABEL POINTER
                   10728:        MOV  DEFVR,XR         POINT BACK TO VRBLK FOR FUNCTION
                   10729:        JSR  DFFNC            DEFINE FUNCTION
                   10730:        BRN  EXNUL            AND EXIT RETURNING NULL
                   10731: *
                   10732: *      HERE FOR ERRONEOUS LABEL
                   10733: *
                   10734: SDF13  ERB  086,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL
                   10735:        EJC
                   10736: *
                   10737: *      DETACH
                   10738: *
                   10739: S$DET  ENT                   ENTRY POINT
                   10740:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10741:        JSR  GTVAR            LOCATE VARIABLE
                   10742:        ERR  087,DETACH ARGUMENT IS NOT APPROPRIATE NAME
                   10743:        JSR  DTACH            DETACH I/O ASSOCIATION FROM NAME
                   10744:        BRN  EXNUL            RETURN NULL RESULT
                   10745:        EJC
                   10746: *
                   10747: *      DIFFER
                   10748: *
                   10749: S$DIF  ENT                   ENTRY POINT
                   10750:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   10751:        MOV  (XS)+,XL         LOAD FIRST ARGUMENT
                   10752:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
                   10753:        PPM  EXFAL            FAIL IF IDENT
                   10754:        BRN  EXNUL            RETURN NULL IF DIFFER
                   10755:        EJC
                   10756: *
                   10757: *      DUMP
                   10758: *
                   10759: S$DMP  ENT                   ENTRY POINT
                   10760:        JSR  GTSMI            LOAD DUMP ARG AS SMALL INTEGER
                   10761:        ERR  088,DUMP ARGUMENT IS NOT INTEGER
                   10762:        ERR  089,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE
                   10763:        JSR  DUMPR            ELSE CALL DUMP ROUTINE
                   10764:        BRN  EXNUL            AND RETURN NULL AS RESULT
                   10765:        EJC
                   10766: *
                   10767: *      DUPL
                   10768: *
                   10769: S$DUP  ENT                   ENTRY POINT
                   10770:        JSR  GTSMI            GET SECOND ARGUMENT AS SMALL INTEGE
                   10771:        ERR  090,DUPL SECOND ARGUMENT IS NOT INTEGER
                   10772:        PPM  SDUP7            JUMP IF NEGATIVE OT TOO BIG
                   10773:        MOV  XR,WB            SAVE DUPLICATION FACTOR
                   10774:        JSR  GTSTG            GET FIRST ARG AS STRING
                   10775:        PPM  SDUP4            JUMP IF NOT A STRING
                   10776: *
                   10777: *      HERE FOR CASE OF DUPLICATION OF A STRING
                   10778: *
                   10779:        MTI  WA               ACQUIRE LENGTH AS INTEGER
                   10780:        STI  DUPSI            SAVE FOR THE MOMENT
                   10781:        MTI  WB               GET DUPLICATION FACTOR AS INTEGER
                   10782:        MLI  DUPSI            FORM PRODUCT
                   10783:        IOV  SDUP3            JUMP IF OVERFLOW
                   10784:        IEQ  EXNUL            RETURN NULL IF RESULT LENGTH = 0
                   10785:        MFI  WA,SDUP3         GET AS ADDR INTEGER, CHECK OVFLO
                   10786: *
                   10787: *      MERGE HERE WITH RESULT LENGTH IN WA
                   10788: *
                   10789: SDUP1  MOV  XR,XL            SAVE STRING POINTER
                   10790:        JSR  ALOCS            ALLOCATE SPACE FOR STRING
                   10791:        MOV  XR,-(XS)         SAVE AS RESULT POINTER
                   10792:        MOV  XL,WC            SAVE POINTER TO ARGUMENT STRING
                   10793:        PSC  XR               PREPARE TO STORE CHARS OF RESULT
                   10794:        LCT  WB,WB            SET COUNTER TO CONTROL LOOP
                   10795: *
                   10796: *      LOOP THROUGH DUPLICATIONS
                   10797: *
                   10798: SDUP2  MOV  WC,XL            POINT BACK TO ARGUMENT STRING
                   10799:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARACTERS
                   10800:        PLC  XL               POINT TO CHARS IN ARGUMENT STRING
                   10801:        MVC                   MOVE CHARACTERS TO RESULT STRING
                   10802:        BCT  WB,SDUP2         LOOP TILL ALL DUPLICATIONS DONE
                   10803:        BRN  EXITS            THEN EXIT FOR NEXT CODE WORD
                   10804:        EJC
                   10805: *
                   10806: *      DUPL (CONTINUED)
                   10807: *
                   10808: *      HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
                   10809: *
                   10810: SDUP3  MOV  DNAME,WA         SET IMPOSSIBLE LENGTH FOR ALOCS
                   10811:        BRN  SDUP1            MERGE BACK
                   10812: *
                   10813: *      HERE IF NOT A STRING
                   10814: *
                   10815: SDUP4  JSR  GTPAT            CONVERT ARGUMENT TO PATTERN
                   10816:        ERR  091,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN
                   10817: *
                   10818: *      HERE TO DUPLICATE A PATTERN ARGUMENT
                   10819: *
                   10820:        MOV  XR,-(XS)         STORE PATTERN ON STACK
                   10821:        MOV  =NDNTH,XR        START OFF WITH NULL PATTERN
                   10822:        BZE  WB,SDUP6         NULL PATTERN IS RESULT IF DUPFAC=0
                   10823:        MOV  WB,-(XS)         PRESERVE LOOP COUNT
                   10824: *
                   10825: *      LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
                   10826: *
                   10827: SDUP5  MOV  XR,XL            COPY CURRENT VALUE AS RIGHT ARGUMNT
                   10828:        MOV  1(XS),XR         GET A NEW COPY OF LEFT
                   10829:        JSR  PCONC            CONCATENATE
                   10830:        DCV  (XS)             COUNT DOWN
                   10831:        BNZ  (XS),SDUP5       LOOP
                   10832:        ICA  XS               POP LOOP COUNT
                   10833: *
                   10834: *      HERE TO EXIT AFTER CONSTRUCTING PATTERN
                   10835: *
                   10836: SDUP6  MOV  XR,(XS)          STORE RESULT ON STACK
                   10837:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   10838: *
                   10839: *      FAIL IF SECOND ARG IS OUT OF RANGE
                   10840: *
                   10841: SDUP7  ICA  XS               POP FIRST ARGUMENT
                   10842:        BRN  EXFAL            FAIL
                   10843:        EJC
                   10844: *
                   10845: *      EJECT
                   10846: *
                   10847: S$EJC  ENT                   ENTRY POINT
                   10848:        JSR  IOFCB            CALL FCBLK ROUTINE
                   10849:        ERR  092,EJECT ARGUMENT IS NOT A SUITABLE NAME
                   10850:        PPM  SEJC1            NULL ARGUMENT
                   10851:        JSR  SYSEF            CALL EJECT FILE FUNCTION
                   10852:        ERR  093,EJECT FILE DOES NOT EXIST
                   10853:        ERR  094,EJECT FILE DOES NOT PERMIT PAGE EJECT
                   10854:        ERR  095,EJECT CAUSED NON-RECOVERABLE OUTPUT ERROR
                   10855:        BRN  EXNUL            RETURN NULL AS RESULT
                   10856: *
                   10857: *      HERE TO EJECT STANDARD OUTPUT FILE
                   10858: *
                   10859: SEJC1  JSR  SYSEP            CALL ROUTINE TO EJECT PRINTER
                   10860:        BRN  EXNUL            EXIT WITH NULL RESULT
                   10861:        EJC
                   10862: *
                   10863: *      ENDFILE
                   10864: *
                   10865: S$ENF  ENT                   ENTRY POINT
                   10866:        JSR  IOFCB            CALL FCBLK ROUTINE
                   10867:        ERR  096,ENDFILE ARGUMENT IS NOT A SUITABLE NAME
                   10868:        ERR  097,ENDFILE ARGUMENT IS NULL
                   10869:        JSR  SYSEN            CALL ENDFILE ROUTINE
                   10870:        ERR  098,ENDFILE FILE DOES NOT EXIST
                   10871:        ERR  099,ENDFILE FILE DOES NOT PERMIT ENDFILE
                   10872:        ERR  100,ENDFILE CAUSED NON-RECOVERABLE OUTPUT ERROR
                   10873:        MOV  XL,WB            REMEMBER VRBLK PTR FROM IOFCB CALL
                   10874: *
                   10875: *      LOOP TO FIND TRTRF BLOCK
                   10876: *
                   10877: SENF1  MOV  XL,XR            COPY POINTER
                   10878:        MOV  TRVAL(XR),XR     CHAIN ALONG
                   10879:        BNE  (XR),=B$TRT,EXNUL SKIP OUT IF CHAIN END
                   10880:        BNE  TRTYP(XR),=TRTFC,SENF1 LOOP IF NOT FOUND
                   10881:        MOV  TRVAL(XR),TRVAL(XL) REMOVE TRTRF
                   10882:        MOV  TRTRF(XR),ENFCH  POINT TO HEAD OF IOCHN
                   10883:        MOV  TRFPT(XR),WC     POINT TO FCBLK
                   10884:        MOV  WB,XR            FILEARG1 VRBLK FROM IOFCB
                   10885:        JSR  SETVR            RESET IT
                   10886:        MOV  =R$FCB,XL        PTR TO HEAD OF FCBLK CHAIN
                   10887:        SUB  *NUM02,XL        ADJUST READY TO ENTER LOOP
                   10888: *
                   10889: *      FIND FCBLK
                   10890: *
                   10891: SENF2  MOV  XL,XR            COPY PTR
                   10892:        MOV  2(XL),XL         GET NEXT LINK
                   10893:        BZE  XL,SENF4         STOP IF CHAIN END
                   10894:        BEQ  3(XL),WC,SENF3   JUMP IF FCBLK FOUND
                   10895:        BRN  SENF2            LOOP
                   10896: *
                   10897: *      REMOVE FCBLK
                   10898: *
                   10899: SENF3  MOV  2(XL),2(XR)      DELETE FCBLK FROM CHAIN
                   10900: *
                   10901: *      LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN
                   10902: *
                   10903: SENF4  MOV  ENFCH,XL         GET CHAIN HEAD
                   10904:        BZE  XL,EXNUL         FINISHED IF CHAIN END
                   10905:        MOV  TRTRF(XL),ENFCH  CHAIN ALONG
                   10906:        MOV  IONMO(XL),WA     NAME OFFSET
                   10907:        MOV  IONMB(XL),XL     NAME BASE
                   10908:        JSR  DTACH            DETACH NAME
                   10909:        BRN  SENF4            LOOP TILL DONE
                   10910:        EJC
                   10911: *
                   10912: *      EQ
                   10913: *
                   10914: S$EQF  ENT                   ENTRY POINT
                   10915:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   10916:        ERR  101,EQ FIRST ARGUMENT IS NOT NUMERIC
                   10917:        ERR  102,EQ SECOND ARGUMENT IS NOT NUMERIC
                   10918:        PPM  EXFAL            FAIL IF LT
                   10919:        PPM  EXNUL            RETURN NULL IF EQ
                   10920:        PPM  EXFAL            FAIL IF GT
                   10921:        EJC
                   10922: *
                   10923: *      EVAL
                   10924: *
                   10925: S$EVL  ENT                   ENTRY POINT
                   10926:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10927:        JSR  GTEXP            CONVERT TO EXPRESSION
                   10928:        ERR  103,EVAL ARGUMENT IS NOT EXPRESSION
                   10929:        LCW  WC               LOAD NEXT CODE WORD
                   10930:        BNE  WC,=OFNE$,SEVL1  JUMP IF CALLED BY VALUE
                   10931:        SCP  XL               COPY CODE POINTER
                   10932:        MOV  (XL),WA          GET NEXT CODE WORD
                   10933:        BNE  WA,=ORNM$,SEVL2  BY NAME UNLESS EXPRESSION
                   10934:        BNZ  1(XS),SEVL2      JUMP IF BY NAME
                   10935: *
                   10936: *      HERE IF CALLED BY VALUE
                   10937: *
                   10938: SEVL1  ZER  WB               SET FLAG FOR BY VALUE
                   10939:        MOV  WC,-(XS)         SAVE CODE WORD
                   10940:        JSR  EVALX            EVALUATE EXPRESSION BY VALUE
                   10941:        PPM  EXFAL            FAIL IF EVALUATION FAILS
                   10942:        MOV  XR,XL            COPY RESULT
                   10943:        MOV  (XS),XR          RELOAD NEXT CODE WORD
                   10944:        MOV  XL,(XS)          STACK RESULT
                   10945:        BRI  (XR)             JUMP TO EXECUTE NEXT CODE WORD
                   10946: *
                   10947: *      HERE IF CALLED BY NAME
                   10948: *
                   10949: SEVL2  MOV  =NUM01,WB        SET FLAG FOR BY NAME
                   10950:        JSR  EVALX            EVALUATE EXPRESSION BY NAME
                   10951:        PPM  EXFAL            FAIL IF EVALUATION FAILS
                   10952:        BRN  EXNAM            EXIT WITH NAME
                   10953: .IF    .CNEX
                   10954: .ELSE
                   10955:        EJC
                   10956: *
                   10957: *      EXIT
                   10958: *
                   10959: S$EXT  ENT                   ENTRY POINT
                   10960:        ZER  WB               CLEAR AMOUNT OF STATIC SHIFT
                   10961:        JSR  GBCOL            COMPACT MEMORY BY COLLECTING
                   10962:        JSR  GTSTG            CONVERT ARG TO STRING
                   10963:        ERR  104,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING
                   10964:        MOV  XR,XL            COPY STRING PTR
                   10965:        JSR  GTINT            CHECK IT IS INTEGER
                   10966:        PPM  SEXT1            SKIP IF UNCONVERTIBLE
                   10967:        ZER  XL               NOTE IT IS INTEGER
                   10968:        LDI  ICVAL(XR)        GET INTEGER ARG
                   10969:        MOV  R$FCB,WB         GET FCBLK CHAIN HEADER
                   10970: *
                   10971: *      MERGE TO CALL OSINT EXIT ROUTINE
                   10972: *
                   10973: SEXT1  MOV  =HEADV,XR        POINT TO V.V STRING
                   10974:        JSR  SYSXI            CALL EXTERNAL ROUTINE
                   10975:        ERR  105,EXIT ACTION NOT AVAILABLE IN THIS IMPLEMENTATION
                   10976:        ERR  106,EXIT ACTION CAUSED IRRECOVERABLE ERROR
                   10977:        IEQ  EXNUL            RETURN IF ARGUMENT 0
                   10978:        ZER  GBCNT            RESUMING EXECUTION SO RESET
                   10979:        IGT  SEXT2            SKIP IF POSITIVE
                   10980:        NGI                   MAKE POSITIVE
                   10981: *
                   10982: *      CHECK FOR OPTION RESPECIFICATION
                   10983: *
                   10984: SEXT2  MFI  WC               GET VALUE IN WORK REG
                   10985:        BEQ  WC,=NUM03,SEXT3  SKIP IF WAS 3
                   10986:        MOV  WC,-(XS)         SAVE VALUE
                   10987:        ZER  WC               SET TO READ OPTIONS
                   10988:        JSR  PRPAR            READ SYSPP OPTIONS
                   10989:        MOV  (XS)+,WC         RESTORE VALUE
                   10990: *
                   10991: *      DEAL WITH HEADER OPTION (FIDDLED BY PRPAR)
                   10992: *
                   10993: SEXT3  MNZ  HEADP            ASSUME NO HEADERS
                   10994:        BNE  WC,=NUM01,SEXT4  SKIP IF NOT 1
                   10995:        ZER  HEADP            REQUEST HEADER PRINTING
                   10996: *
                   10997: *      ALMOST READY TO RESUME RUNNING
                   10998: *
                   10999: SEXT4  JSR  SYSTM            GET EXECUTION TIME START (SGD11)
                   11000:        STI  TIMSX            SAVE AS INITIAL TIME
                   11001:        LDI  KVSTC            RESET TO ENSURE ...
                   11002:        STI  KVSTL            ... CORRECT EXECUTION STATS
                   11003:        BRN  EXNUL            RESUME EXECUTION
                   11004: .FI
                   11005:        EJC
                   11006: *
                   11007: *      FIELD
                   11008: *
                   11009: S$FLD  ENT                   ENTRY POINT
                   11010:        JSR  GTSMI            GET SECOND ARGUMENT (FIELD NUMBER)
                   11011:        ERR  107,FIELD SECOND ARGUMENT IS NOT INTEGER
                   11012:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   11013:        MOV  XR,WB            ELSE SAVE INTEGER VALUE
                   11014:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   11015:        JSR  GTNVR            POINT TO VRBLK
                   11016:        PPM  SFLD1            JUMP (ERROR) IF NOT VARIABLE NAME
                   11017:        MOV  VRFNC(XR),XR     ELSE POINT TO FUNCTION BLOCK
                   11018:        BNE  (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION
                   11019: *
                   11020: *      HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
                   11021: *
                   11022:        BZE  WB,EXFAL         FAIL IF ARGUMENT NUMBER IS ZERO
                   11023:        BGT  WB,FARGS(XR),EXFAL FAIL IF TOO LARGE
                   11024:        WTB  WB               ELSE CONVERT TO BYTE OFFSET
                   11025:        ADD  WB,XR            POINT TO FIELD NAME
                   11026:        MOV  DFFLB(XR),XR     LOAD VRBLK POINTER
                   11027:        BRN  EXVNM            EXIT TO BUILD NMBLK
                   11028: *
                   11029: *      HERE FOR BAD FIRST ARGUMENT
                   11030: *
                   11031: SFLD1  ERB  108,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME
                   11032:        EJC
                   11033: *
                   11034: *      FENCE
                   11035: *
                   11036: S$FNC  ENT                   ENTRY POINT
                   11037:        MOV  =P$FNC,WB        SET PCODE FOR P$FNC
                   11038:        ZER  XR               P0BLK
                   11039:        JSR  PBILD            BUILD P$FNC NODE
                   11040:        MOV  XR,XL            SAVE POINTER TO IT
                   11041:        MOV  (XS)+,XR         GET ARGUMENT
                   11042:        JSR  GTPAT            CONVERT TO PATTERN
                   11043:        ERR  259,FENCE ARGUMENT IS NOT PATTERN
                   11044:        JSR  PCONC            CONCATENATE TO P$FNC NODE
                   11045:        MOV  XR,XL            SAVE PTR TO CONCATENATED PATTERN
                   11046:        MOV  =P$FNA,WB        SET FOR P$FNA PCODE
                   11047:        ZER  XR               P0BLK
                   11048:        JSR  PBILD            CONSTRUCT P$FNA NODE
                   11049:        MOV  XL,PTHEN(XR)     SET PATTERN AS PTHEN
                   11050:        MOV  XR,-(XS)         SET AS RESULT
                   11051:        BRN  EXITS            DO NEXT CODE WORD
                   11052:        EJC
                   11053: *
                   11054: *      GE
                   11055: *
                   11056: S$GEF  ENT                   ENTRY POINT
                   11057:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   11058:        ERR  109,GE FIRST ARGUMENT IS NOT NUMERIC
                   11059:        ERR  110,GE SECOND ARGUMENT IS NOT NUMERIC
                   11060:        PPM  EXFAL            FAIL IF LT
                   11061:        PPM  EXNUL            RETURN NULL IF EQ
                   11062:        PPM  EXNUL            RETURN NULL IF GT
                   11063:        EJC
                   11064: *
                   11065: *      GT
                   11066: *
                   11067: S$GTF  ENT                   ENTRY POINT
                   11068:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   11069:        ERR  111,GT FIRST ARGUMENT IS NOT NUMERIC
                   11070:        ERR  112,GT SECOND ARGUMENT IS NOT NUMERIC
                   11071:        PPM  EXFAL            FAIL IF LT
                   11072:        PPM  EXFAL            FAIL IF EQ
                   11073:        PPM  EXNUL            RETURN NULL IF GT
                   11074:        EJC
                   11075: *
                   11076: *      HOST
                   11077: *
                   11078: S$HST  ENT                   ENTRY POINT
                   11079:        MOV  (XS)+,XR         GET THIRD ARG
                   11080:        MOV  (XS)+,XL         GET SECOND ARG
                   11081:        MOV  (XS)+,WA         GET FIRST ARG
                   11082:        JSR  SYSHS            ENTER SYSHS ROUTINE
                   11083:        ERR  254,ERRONEOUS ARGUMENT FOR HOST
                   11084:        ERR  255,ERROR DURING EXECUTION OF HOST
                   11085:        PPM  SHST1            STORE HOST STRING
                   11086:        PPM  EXNUL            RETURN NULL RESULT
                   11087:        PPM  EXIXR            RETURN XR
                   11088:        PPM  EXFAL            FAIL RETURN
                   11089: *
                   11090: *      RETURN HOST STRING
                   11091: *
                   11092: SHST1  BZE  XL,EXNUL         NULL STRING IF SYSHS UNCOOPERATIVE
                   11093:        MOV  SCLEN(XL),WA     LENGTH
                   11094:        ZER  WB               ZERO OFFSET
                   11095:        JSR  SBSTR            BUILD COPY OF STRING
                   11096:        MOV  XR,-(XS)         STACK THE RESULT
                   11097:        BRN  EXITS            RETURN RESULT ON STACK
                   11098:        EJC
                   11099: *
                   11100: *      IDENT
                   11101: *
                   11102: S$IDN  ENT                   ENTRY POINT
                   11103:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   11104:        MOV  (XS)+,XL         LOAD FIRST ARGUMENT
                   11105:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
                   11106:        PPM  EXNUL            RETURN NULL IF IDENT
                   11107:        BRN  EXFAL            FAIL IF DIFFER
                   11108:        EJC
                   11109: *
                   11110: *      INPUT
                   11111: *
                   11112: S$INP  ENT                   ENTRY POINT
                   11113:        ZER  WB               INPUT FLAG
                   11114:        JSR  IOPUT            CALL INPUT/OUTPUT ASSOC. ROUTINE
                   11115:        ERR  113,INPUT THIRD ARGUMENT IS NOT A STRING
                   11116:        ERR  114,INAPPROPRIATE SECOND ARGUMENT FOR INPUT
                   11117:        ERR  115,INAPPROPRIATE FIRST ARGUMENT FOR INPUT
                   11118:        ERR  116,INAPPROPRIATE FILE SPECIFICATION FOR INPUT
                   11119:        PPM  EXFAL            FAIL IF FILE DOES NOT EXIST
                   11120:        ERR  117,INPUT FILE CANNOT BE READ
                   11121:        BRN  EXNUL            RETURN NULL STRING
                   11122:        EJC
                   11123: .IF    .CNBF
                   11124: .ELSE
                   11125: *
                   11126: *      INSERT
                   11127: *
                   11128: S$INS  ENT                   ENTRY POINT
                   11129:        MOV  (XS)+,XL         GET STRING ARG
                   11130:        JSR  GTSMI            GET REPLACE LENGTH
                   11131:        ERR  277,INSERT THIRD ARGUMENT NOT INTEGER
                   11132:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   11133:        MOV  WC,WB            COPY TO PROPER REG
                   11134:        JSR  GTSMI            GET REPLACE POSITION
                   11135:        ERR  278,INSERT SECOND ARGUMENT NOT INTEGER
                   11136:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   11137:        BZE  WC,EXFAL         FAIL IF ZERO
                   11138:        DCV  WC               DECREMENT TO GET OFFSET
                   11139:        MOV  WC,WA            PUT IN PROPER REGISTER
                   11140:        MOV  (XS)+,XR         GET BUFFER
                   11141:        BEQ  (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK
                   11142:        ERB  279,INSERT FIRST ARGUMENT NOT BUFFER
                   11143: *
                   11144: *      HERE WHEN EVERYTHING LOADED UP
                   11145: *
                   11146: SINS1  JSR  INSBF            CALL TO INSERT
                   11147:        ERR  280,INSERT FOURTH ARGUMENT NOT A STRING
                   11148:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   11149:        BRN  EXNUL            ELSE OK - EXIT WITH NULL
                   11150:        EJC
                   11151: .FI
                   11152: *
                   11153: *      INTEGER
                   11154: *
                   11155: S$INT  ENT                   ENTRY POINT
                   11156:        MOV  (XS)+,XR         LOAD ARGUMENT
                   11157:        JSR  GTNUM            CONVERT TO NUMERIC
                   11158:        PPM  EXFAL            FAIL IF NON-NUMERIC
                   11159:        BEQ  WA,=B$ICL,EXNUL  RETURN NULL IF INTEGER
                   11160:        BRN  EXFAL            FAIL IF REAL
                   11161:        EJC
                   11162: *
                   11163: *      ITEM
                   11164: *
                   11165: *      ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
                   11166: *      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
                   11167: *
                   11168: S$ITM  ENT                   ENTRY POINT
                   11169: *
                   11170: *      DEAL WITH CASE OF NO ARGS
                   11171: *
                   11172:        BNZ  WA,SITM1         JUMP IF AT LEAST ONE ARG
                   11173:        MOV  =NULLS,-(XS)     ELSE SUPPLY GARBAGE NULL ARG
                   11174:        MOV  =NUM01,WA        AND FIX ARGUMENT COUNT
                   11175: *
                   11176: *      CHECK FOR NAME/VALUE CASES
                   11177: *
                   11178: SITM1  SCP  XR               GET CURRENT CODE POINTER
                   11179:        MOV  (XR),XL          LOAD NEXT CODE WORD
                   11180:        DCV  WA               GET NUMBER OF SUBSCRIPTS
                   11181:        MOV  WA,XR            COPY FOR ARREF
                   11182:        BEQ  XL,=OFNE$,SITM2  JUMP IF CALLED BY NAME
                   11183: *
                   11184: *      HERE IF CALLED BY VALUE
                   11185: *
                   11186:        ZER  WB               SET CODE FOR CALL BY VALUE
                   11187:        BRN  ARREF            OFF TO ARRAY REFERENCE ROUTINE
                   11188: *
                   11189: *      HERE FOR CALL BY NAME
                   11190: *
                   11191: SITM2  MNZ  WB               SET CODE FOR CALL BY NAME
                   11192:        LCW  WA               LOAD AND IGNORE OFNE$ CALL
                   11193:        BRN  ARREF            OFF TO ARRAY REFERENCE ROUTINE
                   11194:        EJC
                   11195: *
                   11196: *      LE
                   11197: *
                   11198: S$LEF  ENT                   ENTRY POINT
                   11199:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   11200:        ERR  118,LE FIRST ARGUMENT IS NOT NUMERIC
                   11201:        ERR  119,LE SECOND ARGUMENT IS NOT NUMERIC
                   11202:        PPM  EXNUL            RETURN NULL IF LT
                   11203:        PPM  EXNUL            RETURN NULL IF EQ
                   11204:        PPM  EXFAL            FAIL IF GT
                   11205:        EJC
                   11206: *
                   11207: *      LEN
                   11208: *
                   11209: S$LEN  ENT                   ENTRY POINT
                   11210:        MOV  =P$LEN,WB        SET PCODE FOR INTEGER ARG CASE
                   11211:        MOV  =P$LND,WA        SET PCODE FOR EXPR ARG CASE
                   11212:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   11213:        ERR  120,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION
                   11214:        ERR  121,LEN ARGUMENT IS NEGATIVE OR TOO LARGE
                   11215:        BRN  EXIXR            RETURN PATTERN NODE
                   11216:        EJC
                   11217: *
                   11218: *      LEQ
                   11219: *
                   11220: S$LEQ  ENT                   ENTRY POINT
                   11221:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   11222:        ERR  122,LEQ FIRST ARGUMENT IS NOT STRING
                   11223:        ERR  123,LEQ SECOND ARGUMENT IS NOT STRING
                   11224:        PPM  EXFAL            FAIL IF LLT
                   11225:        PPM  EXNUL            RETURN NULL IF LEQ
                   11226:        PPM  EXFAL            FAIL IF LGT
                   11227:        EJC
                   11228: *
                   11229: *      LGE
                   11230: *
                   11231: S$LGE  ENT                   ENTRY POINT
                   11232:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   11233:        ERR  124,LGE FIRST ARGUMENT IS NOT STRING
                   11234:        ERR  125,LGE SECOND ARGUMENT IS NOT STRING
                   11235:        PPM  EXFAL            FAIL IF LLT
                   11236:        PPM  EXNUL            RETURN NULL IF LEQ
                   11237:        PPM  EXNUL            RETURN NULL IF LGT
                   11238:        EJC
                   11239: *
                   11240: *      LGT
                   11241: *
                   11242: S$LGT  ENT                   ENTRY POINT
                   11243:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   11244:        ERR  126,LGT FIRST ARGUMENT IS NOT STRING
                   11245:        ERR  127,LGT SECOND ARGUMENT IS NOT STRING
                   11246:        PPM  EXFAL            FAIL IF LLT
                   11247:        PPM  EXFAL            FAIL IF LEQ
                   11248:        PPM  EXNUL            RETURN NULL IF LGT
                   11249:        EJC
                   11250: *
                   11251: *      LLE
                   11252: *
                   11253: S$LLE  ENT                   ENTRY POINT
                   11254:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   11255:        ERR  128,LLE FIRST ARGUMENT IS NOT STRING
                   11256:        ERR  129,LLE SECOND ARGUMENT IS NOT STRING
                   11257:        PPM  EXNUL            RETURN NULL IF LLT
                   11258:        PPM  EXNUL            RETURN NULL IF LEQ
                   11259:        PPM  EXFAL            FAIL IF LGT
                   11260:        EJC
                   11261: *
                   11262: *      LLT
                   11263: *
                   11264: S$LLT  ENT                   ENTRY POINT
                   11265:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   11266:        ERR  130,LLT FIRST ARGUMENT IS NOT STRING
                   11267:        ERR  131,LLT SECOND ARGUMENT IS NOT STRING
                   11268:        PPM  EXNUL            RETURN NULL IF LLT
                   11269:        PPM  EXFAL            FAIL IF LEQ
                   11270:        PPM  EXFAL            FAIL IF LGT
                   11271:        EJC
                   11272: *
                   11273: *      LNE
                   11274: *
                   11275: S$LNE  ENT                   ENTRY POINT
                   11276:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   11277:        ERR  132,LNE FIRST ARGUMENT IS NOT STRING
                   11278:        ERR  133,LNE SECOND ARGUMENT IS NOT STRING
                   11279:        PPM  EXNUL            RETURN NULL IF LLT
                   11280:        PPM  EXFAL            FAIL IF LEQ
                   11281:        PPM  EXNUL            RETURN NULL IF LGT
                   11282:        EJC
                   11283: *
                   11284: *      LOCAL
                   11285: *
                   11286: S$LOC  ENT                   ENTRY POINT
                   11287:        JSR  GTSMI            GET SECOND ARGUMENT (LOCAL NUMBER)
                   11288:        ERR  134,LOCAL SECOND ARGUMENT IS NOT INTEGER
                   11289:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   11290:        MOV  XR,WB            SAVE LOCAL NUMBER
                   11291:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   11292:        JSR  GTNVR            POINT TO VRBLK
                   11293:        PPM  SLOC1            JUMP IF NOT VARIABLE NAME
                   11294:        MOV  VRFNC(XR),XR     ELSE LOAD FUNCTION POINTER
                   11295:        BNE  (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED
                   11296: *
                   11297: *      HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
                   11298: *
                   11299:        BZE  WB,EXFAL         FAIL IF SECOND ARG IS ZERO
                   11300:        BGT  WB,PFNLO(XR),EXFAL OR TOO LARGE
                   11301:        ADD  FARGS(XR),WB     ELSE ADJUST OFFSET TO INCLUDE ARGS
                   11302:        WTB  WB               CONVERT TO BYTES
                   11303:        ADD  WB,XR            POINT TO LOCAL POINTER
                   11304:        MOV  PFAGB(XR),XR     LOAD VRBLK POINTER
                   11305:        BRN  EXVNM            EXIT BUILDING NMBLK
                   11306: *
                   11307: *      HERE IF FIRST ARGUMENT IS NO GOOD
                   11308: *
                   11309: SLOC1  ERB  135,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME
                   11310: .IF    .CNLD
                   11311: .ELSE
                   11312:        EJC
                   11313: *
                   11314: *      LOAD
                   11315: *
                   11316: S$LOD  ENT                   ENTRY POINT
                   11317:        JSR  GTSTG            LOAD LIBRARY NAME
                   11318:        ERR  136,LOAD SECOND ARGUMENT IS NOT STRING
                   11319:        MOV  XR,XL            SAVE LIBRARY NAME
                   11320:        JSR  XSCNI            PREPARE TO SCAN FIRST ARGUMENT
                   11321:        ERR  137,LOAD FIRST ARGUMENT IS NOT STRING
                   11322:        ERR  138,LOAD FIRST ARGUMENT IS NULL
                   11323:        MOV  XL,-(XS)         STACK LIBRARY NAME
                   11324:        MOV  =CH$PP,WC        SET DELIMITER ONE = LEFT PAREN
                   11325:        MOV  WC,XL            SET DELIMITER TWO = LEFT PAREN
                   11326:        JSR  XSCAN            SCAN FUNCTION NAME
                   11327:        MOV  XR,-(XS)         SAVE PTR TO FUNCTION NAME
                   11328:        BNZ  WA,SLOD1         JUMP IF LEFT PAREN FOUND
                   11329:        ERB  139,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN
                   11330: *
                   11331: *      HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
                   11332: *
                   11333: SLOD1  JSR  GTNVR            LOCATE VRBLK
                   11334:        ERR  140,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME
                   11335:        MOV  XR,LODFN         SAVE VRBLK POINTER
                   11336:        ZER  LODNA            ZERO COUNT OF ARGUMENTS
                   11337: *
                   11338: *      LOOP TO SCAN ARGUMENT DATATYPE NAMES
                   11339: *
                   11340: SLOD2  MOV  =CH$RP,WC        DELIMITER ONE IS RIGHT PAREN
                   11341:        MOV  =CH$CM,XL        DELIMITER TWO IS COMMA
                   11342:        JSR  XSCAN            SCAN NEXT ARGUMENT NAME
                   11343:        ICV  LODNA            BUMP ARGUMENT COUNT
                   11344:        BNZ  WA,SLOD3         JUMP IF OK DELIMITER WAS FOUND
                   11345:        ERB  141,LOAD FIRST ARGUMENT IS MISSING A RIGHT PAREN
                   11346:        EJC
                   11347: *
                   11348: *      LOAD (CONTINUED)
                   11349: *
                   11350: *      COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
                   11351: *      CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
                   11352: *      RESULT DATATYPE (WITH WA SET TO ZERO).
                   11353: *
                   11354: SLOD3  MOV  XR,-(XS)         STACK DATATYPE NAME POINTER
                   11355:        MOV  =NUM01,WB        SET STRING CODE IN CASE
                   11356:        MOV  =SCSTR,XL        POINT TO /STRING/
                   11357:        JSR  IDENT            CHECK FOR MATCH
                   11358:        PPM  SLOD4            JUMP IF MATCH
                   11359:        MOV  (XS),XR          ELSE RELOAD NAME
                   11360:        ADD  WB,WB            SET CODE FOR INTEGER (2)
                   11361:        MOV  =SCINT,XL        POINT TO /INTEGER/
                   11362:        JSR  IDENT            CHECK FOR MATCH
                   11363:        PPM  SLOD4            JUMP IF MATCH
                   11364: .IF    .CNRA
                   11365: .ELSE
                   11366:        MOV  (XS),XR          ELSE RELOAD STRING POINTER
                   11367:        ICV  WB               SET CODE FOR REAL (3)
                   11368:        MOV  =SCREA,XL        POINT TO /REAL/
                   11369:        JSR  IDENT            CHECK FOR MATCH
                   11370:        PPM  SLOD4            JUMP IF MATCH
                   11371: .FI
                   11372:        ZER  WB               ELSE GET CODE FOR NO CONVERT
                   11373: *
                   11374: *      MERGE HERE WITH PROPER DATATYPE CODE IN WB
                   11375: *
                   11376: SLOD4  MOV  WB,(XS)          STORE CODE ON STACK
                   11377:        BEQ  WA,=NUM02,SLOD2  LOOP BACK IF ARG STOPPED BY COMMA
                   11378:        BZE  WA,SLOD5         JUMP IF THAT WAS THE RESULT TYPE
                   11379: *
                   11380: *      HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
                   11381: *
                   11382:        MOV  MXLEN,WC         SET DUMMY (IMPOSSIBLE) DELIMITER 1
                   11383:        MOV  WC,XL            AND DELIMITER TWO
                   11384:        JSR  XSCAN            SCAN RESULT NAME
                   11385:        ZER  WA               SET CODE FOR PROCESSING RESULT
                   11386:        BRN  SLOD3            JUMP BACK TO PROCESS RESULT NAME
                   11387:        EJC
                   11388: *
                   11389: *      LOAD (CONTINUED)
                   11390: *
                   11391: *      HERE AFTER PROCESSING ALL ARGS AND RESULT
                   11392: *
                   11393: SLOD5  MOV  LODNA,WA         GET NUMBER OF ARGUMENTS
                   11394:        MOV  WA,WC            COPY FOR LATER
                   11395:        WTB  WA               CONVERT LENGTH TO BYTES
                   11396:        ADD  *EFSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   11397:        JSR  ALLOC            ALLOCATE EFBLK
                   11398:        MOV  =B$EFC,(XR)      SET TYPE WORD
                   11399:        MOV  WC,FARGS(XR)     SET NUMBER OF ARGUMENTS
                   11400:        ZER  EFUSE(XR)        SET USE COUNT (DFFNC WILL SET TO 1)
                   11401:        ZER  EFCOD(XR)        ZERO CODE POINTER FOR NOW
                   11402:        MOV  (XS)+,EFRSL(XR)  STORE RESULT TYPE CODE
                   11403:        MOV  LODFN,EFVAR(XR)  STORE FUNCTION VRBLK POINTER
                   11404:        MOV  WA,EFLEN(XR)     STORE EFBLK LENGTH
                   11405:        MOV  XR,WB            SAVE EFBLK POINTER
                   11406:        ADD  WA,XR            POINT PAST END OF EFBLK
                   11407:        LCT  WC,WC            SET NUMBER OF ARGUMENTS FOR LOOP
                   11408: *
                   11409: *      LOOP TO SET ARGUMENT TYPE CODES FROM STACK
                   11410: *
                   11411: SLOD6  MOV  (XS)+,-(XR)      STORE ONE TYPE CODE FROM STACK
                   11412:        BCT  WC,SLOD6         LOOP TILL ALL STORED
                   11413: *
                   11414: *      NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
                   11415: *
                   11416:        MOV  (XS)+,XR         LOAD FUNCTION STRING NAME
                   11417:        MOV  (XS),XL          LOAD LIBRARY NAME
                   11418:        MOV  WB,(XS)          STORE EFBLK POINTER
                   11419:        JSR  SYSLD            CALL FUNCTION TO LOAD EXTERNAL FUNC
                   11420:        ERR  142,LOAD FUNCTION DOES NOT EXIST
                   11421:        ERR  143,LOAD FUNCTION CAUSED INPUT ERROR DURING LOAD
                   11422:        MOV  (XS)+,XL         RECALL EFBLK POINTER
                   11423:        MOV  XR,EFCOD(XL)     STORE CODE POINTER
                   11424:        MOV  LODFN,XR         POINT TO VRBLK FOR FUNCTION
                   11425:        JSR  DFFNC            PERFORM FUNCTION DEFINITION
                   11426:        BRN  EXNUL            RETURN NULL RESULT
                   11427: .FI
                   11428:        EJC
                   11429: *
                   11430: *      LPAD
                   11431: *
                   11432: S$LPD  ENT                   ENTRY POINT
                   11433:        JSR  GTSTG            GET PAD CHARACTER
                   11434:        ERR  144,LPAD THIRD ARGUMENT NOT A STRING
                   11435:        PLC  XR               POINT TO CHARACTER (NULL IS BLANK)
                   11436:        LCH  WB,(XR)          LOAD PAD CHARACTER
                   11437:        JSR  GTSMI            GET PAD LENGTH
                   11438:        ERR  145,LPAD SECOND ARGUMENT IS NOT INTEGER
                   11439:        PPM  SLPD3            SKIP IF NEGATIVE OR LARGE
                   11440: *
                   11441: *      MERGE TO CHECK FIRST ARG
                   11442: *
                   11443: SLPD1  JSR  GTSTG            GET FIRST ARGUMENT (STRING TO PAD)
                   11444:        ERR  146,LPAD FIRST ARGUMENT IS NOT STRING
                   11445:        BGE  WA,WC,EXIXR      RETURN 1ST ARG IF TOO LONG TO PAD
                   11446:        MOV  XR,XL            ELSE MOVE PTR TO STRING TO PAD
                   11447: *
                   11448: *      NOW WE ARE READY FOR THE PAD
                   11449: *
                   11450: *      (XL)                  POINTER TO STRING TO PAD
                   11451: *      (WB)                  PAD CHARACTER
                   11452: *      (WC)                  LENGTH TO PAD STRING TO
                   11453: *
                   11454:        MOV  WC,WA            COPY LENGTH
                   11455:        JSR  ALOCS            ALLOCATE SCBLK FOR NEW STRING
                   11456:        MOV  XR,-(XS)         SAVE AS RESULT
                   11457:        MOV  SCLEN(XL),WA     LOAD LENGTH OF ARGUMENT
                   11458:        SUB  WA,WC            CALCULATE NUMBER OF PAD CHARACTERS
                   11459:        PSC  XR               POINT TO CHARS IN RESULT STRING
                   11460:        LCT  WC,WC            SET COUNTER FOR PAD LOOP
                   11461: *
                   11462: *      LOOP TO PERFORM PAD
                   11463: *
                   11464: SLPD2  SCH  WB,(XR)+         STORE PAD CHARACTER, BUMP PTR
                   11465:        BCT  WC,SLPD2         LOOP TILL ALL PAD CHARS STORED
                   11466:        CSC  XR               COMPLETE STORE CHARACTERS
                   11467: *
                   11468: *      NOW COPY STRING
                   11469: *
                   11470:        BZE  WA,EXITS         EXIT IF NULL STRING
                   11471:        PLC  XL               ELSE POINT TO CHARS IN ARGUMENT
                   11472:        MVC                   MOVE CHARACTERS TO RESULT STRING
                   11473:        BRN  EXITS            JUMP FOR NEXT CODE WORD
                   11474: *
                   11475: *      HERE IF 2ND ARG IS NEGATIVE OR LARGE
                   11476: *
                   11477: SLPD3  ZER  WC               ZERO PAD COUNT
                   11478:        BRN  SLPD1            MERGE
                   11479:        EJC
                   11480: *
                   11481: *      LT
                   11482: *
                   11483: S$LTF  ENT                   ENTRY POINT
                   11484:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   11485:        ERR  147,LT FIRST ARGUMENT IS NOT NUMERIC
                   11486:        ERR  148,LT SECOND ARGUMENT IS NOT NUMERIC
                   11487:        PPM  EXNUL            RETURN NULL IF LT
                   11488:        PPM  EXFAL            FAIL IF EQ
                   11489:        PPM  EXFAL            FAIL IF GT
                   11490:        EJC
                   11491: *
                   11492: *      NE
                   11493: *
                   11494: S$NEF  ENT                   ENTRY POINT
                   11495:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   11496:        ERR  149,NE FIRST ARGUMENT IS NOT NUMERIC
                   11497:        ERR  150,NE SECOND ARGUMENT IS NOT NUMERIC
                   11498:        PPM  EXNUL            RETURN NULL IF LT
                   11499:        PPM  EXFAL            FAIL IF EQ
                   11500:        PPM  EXNUL            RETURN NULL IF GT
                   11501:        EJC
                   11502: *
                   11503: *      NOTANY
                   11504: *
                   11505: S$NAY  ENT                   ENTRY POINT
                   11506:        MOV  =P$NAS,WB        SET PCODE FOR SINGLE CHAR ARG
                   11507:        MOV  =P$NAY,XL        PCODE FOR MULTI-CHAR ARG
                   11508:        MOV  =P$NAD,WC        SET PCODE FOR EXPR ARG
                   11509:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   11510:        ERR  151,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION
                   11511:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   11512:        EJC
                   11513: *
                   11514: *      OPSYN
                   11515: *
                   11516: S$OPS  ENT                   ENTRY POINT
                   11517:        JSR  GTSMI            LOAD THIRD ARGUMENT
                   11518:        ERR  152,OPSYN THIRD ARGUMENT IS NOT INTEGER
                   11519:        ERR  153,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
                   11520:        MOV  WC,WB            IF OK, SAVE THIRD ARGUMNET
                   11521:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   11522:        JSR  GTNVR            LOCATE VARIABLE BLOCK
                   11523:        ERR  154,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME
                   11524:        MOV  VRFNC(XR),XL     IF OK, LOAD FUNCTION BLOCK POINTER
                   11525:        BNZ  WB,SOPS2         JUMP IF OPERATOR OPSYN CASE
                   11526: *
                   11527: *      HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
                   11528: *
                   11529:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   11530:        JSR  GTNVR            GET VRBLK POINTER
                   11531:        ERR  155,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME
                   11532: *
                   11533: *      MERGE HERE TO PERFORM FUNCTION DEFINITION
                   11534: *
                   11535: SOPS1  JSR  DFFNC            CALL FUNCTION DEFINER
                   11536:        BRN  EXNUL            EXIT WITH NULL RESULT
                   11537: *
                   11538: *      HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
                   11539: *
                   11540: SOPS2  JSR  GTSTG            GET OPERATOR NAME
                   11541:        PPM  SOPS5            JUMP IF NOT STRING
                   11542:        BNE  WA,=NUM01,SOPS5  ERROR IF NOT ONE CHAR LONG
                   11543:        PLC  XR               ELSE POINT TO CHARACTER
                   11544:        LCH  WC,(XR)          LOAD CHARACTER NAME
                   11545:        EJC
                   11546: *
                   11547: *      OPSYN (CONTINUED)
                   11548: *
                   11549: *      NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
                   11550: *      NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
                   11551: *      BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
                   11552: *
                   11553:        MOV  =R$UUB,WA        POINT TO UNOP POINTERS IN CASE
                   11554:        MOV  =OPNSU,XR        POINT TO NAMES OF UNARY OPERATORS
                   11555:        ADD  =OPBUN,WB        ADD NO. OF UNDEFINED BINARY OPS
                   11556:        BEQ  WB,=OPUUN,SOPS3  JUMP IF UNOP (THIRD ARG WAS 1)
                   11557:        MOV  =R$UBA,WA        ELSE POINT TO BINARY OPERATOR PTRS
                   11558:        MOV  =OPSNB,XR        POINT TO NAMES OF BINARY OPERATORS
                   11559:        MOV  =OPBUN,WB        SET NUMBER OF UNDEFINED BINOPS
                   11560: *
                   11561: *      MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
                   11562: *
                   11563: SOPS3  LCT  WB,WB            SET COUNTER TO CONTROL LOOP
                   11564: *
                   11565: *      LOOP TO SEARCH FOR NAME MATCH
                   11566: *
                   11567: SOPS4  BEQ  WC,(XR),SOPS6    JUMP IF NAMES MATCH
                   11568:        ICA  WA               ELSE PUSH POINTER TO FUNCTION PTR
                   11569:        ICA  XR               BUMP POINTER
                   11570:        BCT  WB,SOPS4         LOOP BACK TILL ALL CHECKED
                   11571: *
                   11572: *      HERE IF BAD OPERATOR NAME
                   11573: *
                   11574: SOPS5  ERB  156,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME
                   11575: *
                   11576: *      COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
                   11577: *
                   11578: SOPS6  MOV  WA,XR            COPY POINTER TO FUNCTION BLOCK PTR
                   11579:        SUB  *VRFNC,XR        MAKE IT LOOK LIKE DUMMY VRBLK
                   11580:        BRN  SOPS1            MERGE BACK TO DEFINE OPERATOR
                   11581:        EJC
                   11582: *
                   11583: *      OUTPUT
                   11584: *
                   11585: S$OUP  ENT                   ENTRY POINT
                   11586:        MOV  =NUM03,WB        OUTPUT FLAG
                   11587:        JSR  IOPUT            CALL INPUT/OUTPUT ASSOC. ROUTINE
                   11588:        ERR  157,OUTPUT THIRD ARGUMENT IS NOT A STRING
                   11589:        ERR  158,INAPPROPRIATE SECOND ARGUMENT FOR OUTPUT
                   11590:        ERR  159,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT
                   11591:        ERR  160,INAPPROPRIATE FILE SPECIFICATION FOR OUTPUT
                   11592:        PPM  EXFAL            FAIL IF FILE DOES NOT EXIST
                   11593:        ERR  161,OUTPUT FILE CANNOT BE WRITTEN TO
                   11594:        BRN  EXNUL            RETURN NULL STRING
                   11595:        EJC
                   11596: *
                   11597: *      POS
                   11598: *
                   11599: S$POS  ENT                   ENTRY POINT
                   11600:        MOV  =P$POS,WB        SET PCODE FOR INTEGER ARG CASE
                   11601:        MOV  =P$PSD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   11602:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   11603:        ERR  162,POS ARGUMENT IS NOT INTEGER OR EXPRESSION
                   11604:        ERR  163,POS ARGUMENT IS NEGATIVE OR TOO LARGE
                   11605:        BRN  EXIXR            RETURN PATTERN NODE
                   11606:        EJC
                   11607: *
                   11608: *      PROTOTYPE
                   11609: *
                   11610: S$PRO  ENT                   ENTRY POINT
                   11611:        MOV  (XS)+,XR         LOAD ARGUMENT
                   11612:        MOV  TBLEN(XR),WB     LENGTH IF TABLE, VECTOR (=VCLEN)
                   11613:        BTW  WB               CONVERT TO WORDS
                   11614:        MOV  (XR),WA          LOAD TYPE WORD OF ARGUMENT BLOCK
                   11615:        BEQ  WA,=B$ART,SPRO4  JUMP IF ARRAY
                   11616:        BEQ  WA,=B$TBT,SPRO1  JUMP IF TABLE
                   11617:        BEQ  WA,=B$VCT,SPRO3  JUMP IF VECTOR
                   11618:        BEQ  WA,=B$BCT,SPR05  JUMP IF BUFFER
                   11619:        ERB  164,PROTOTYPE ARGUMENT IS NOT VALID OBJECT
                   11620: *
                   11621: *      HERE FOR TABLE
                   11622: *
                   11623: SPRO1  SUB  =TBSI$,WB        SUBTRACT STANDARD FIELDS
                   11624: *
                   11625: *      MERGE FOR VECTOR
                   11626: *
                   11627: SPRO2  MTI  WB               CONVERT TO INTEGER
                   11628:        BRN  EXINT            EXIT WITH INTEGER RESULT
                   11629: *
                   11630: *      HERE FOR VECTOR
                   11631: *
                   11632: SPRO3  SUB  =VCSI$,WB        SUBTRACT STANDARD FIELDS
                   11633:        BRN  SPRO2            MERGE
                   11634: *
                   11635: *      HERE FOR ARRAY
                   11636: *
                   11637: SPRO4  ADD  AROFS(XR),XR     POINT TO PROTOTYPE FIELD
                   11638:        MOV  (XR),XR          LOAD PROTOTYPE
                   11639:        BRN  EXIXR            RETURN PROTOTYPE AS RESULT
                   11640: .IF    .CNBF
                   11641: .ELSE
                   11642: *
                   11643: *      HERE FOR BUFFER
                   11644: *
                   11645: SPR05  MOV  BCBUF(XR),XR     POINT TO BFBLK
                   11646:        MTI  BFALC(XR)        LOAD ALLOCATED LENGTH
                   11647:        BRN  EXINT            EXIT WITH INTEGER ALLOCATION
                   11648: .FI
                   11649:        EJC
                   11650: *
                   11651: *      REMDR
                   11652: *
                   11653: S$RMD  ENT                   ENTRY POINT
                   11654:        ZER  WB               SET POSITIVE FLAG
                   11655:        MOV  (XS),XR          LOAD SECOND ARGUMENT
                   11656:        JSR  GTINT            CONVERT TO INTEGER
                   11657:        ERR  165,REMDR SECOND ARGUMENT IS NOT INTEGER
                   11658:        JSR  ARITH            CONVERT ARGS
                   11659:        PPM  SRM01            FIRST ARG NOT INTEGER
                   11660:        PPM                   SECOND ARG CHECKED ABOVE
                   11661: .IF    .CNRA
                   11662: .ELSE
                   11663:        PPM  SRM01            FIRST ARG REAL
                   11664: .FI
                   11665:        LDI  ICVAL(XR)        LOAD LEFT ARGUMENT VALUE
                   11666:        RMI  ICVAL(XL)        GET REMAINDER
                   11667:        INO  EXINT            JUMP IF NO OVERFLOW
                   11668:        ERB  167,REMDR CAUSED INTEGER OVERFLOW
                   11669: *
                   11670: *      FAIL FIRST ARGUMENT
                   11671: *
                   11672: SRM01  ERB  166,REMDR FIRST ARGUMENT IS NOT INTEGER
                   11673:        EJC
                   11674: *
                   11675: *      REPLACE
                   11676: *
                   11677: *      THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
                   11678: *      CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
                   11679: *      THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
                   11680: *      THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
                   11681: *
                   11682: S$RPL  ENT                   ENTRY POINT
                   11683:        JSR  GTSTG            LOAD THIRD ARGUMENT AS STRING
                   11684:        ERR  168,REPLACE THIRD ARGUMENT IS NOT STRING
                   11685:        MOV  XR,XL            SAVE THIRD ARG PTR
                   11686:        JSR  GTSTG            GET SECOND ARGUMENT
                   11687:        ERR  169,REPLACE SECOND ARGUMENT IS NOT STRING
                   11688: *
                   11689: *      CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
                   11690: *
                   11691:        BNE  XR,R$RA2,SRPL1   JUMP IF 2ND ARGUMENT DIFFERENT
                   11692:        BEQ  XL,R$RA3,SRPL4   JUMP IF ARGS SAME AS LAST TIME
                   11693: *
                   11694: *      HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
                   11695: *
                   11696: SRPL1  MOV  SCLEN(XL),WB     LOAD 3RD ARGUMENT LENGTH
                   11697:        BNE  WA,WB,SRPL5      JUMP IF ARGUMENTS NOT SAME LENGTH
                   11698:        BZE  WB,SRPL5         JUMP IF NULL 2ND ARGUMENT
                   11699:        MOV  XL,R$RA3         SAVE THIRD ARG FOR NEXT TIME IN
                   11700:        MOV  XR,R$RA2         SAVE SECOND ARG FOR NEXT TIME IN
                   11701:        MOV  KVALP,XL         POINT TO ALPHABET STRING
                   11702:        MOV  SCLEN(XL),WA     LOAD ALPHABET SCBLK LENGTH
                   11703:        MOV  R$RPT,XR         POINT TO CURRENT TABLE (IF ANY)
                   11704:        BNZ  XR,SRPL2         JUMP IF WE ALREADY HAVE A TABLE
                   11705: *
                   11706: *      HERE WE ALLOCATE A NEW TABLE
                   11707: *
                   11708:        JSR  ALOCS            ALLOCATE NEW TABLE
                   11709:        MOV  WC,WA            KEEP SCBLK LENGTH
                   11710:        MOV  XR,R$RPT         SAVE TABLE POINTER FOR NEXT TIME
                   11711: *
                   11712: *      MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
                   11713: *
                   11714: SRPL2  CTB  WA,SCSI$         COMPUTE LENGTH OF SCBLK
                   11715:        MVW                   COPY TO GET INITIAL TABLE VALUES
                   11716:        EJC
                   11717: *
                   11718: *      REPLACE (CONTINUED)
                   11719: *
                   11720: *      NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
                   11721: *      WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
                   11722: *      HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
                   11723: *
                   11724:        MOV  R$RA2,XL         POINT TO SECOND ARGUMENT
                   11725:        LCT  WB,WB            NUMBER OF CHARS TO PLUG
                   11726:        ZER  WC               ZERO CHAR OFFSET
                   11727:        MOV  R$RA3,XR         POINT TO 3RD ARG
                   11728:        PLC  XR               GET CHAR PTR FOR 3RD ARG
                   11729: *
                   11730: *      LOOP TO PLUG CHARS
                   11731: *
                   11732: SRPL3  MOV  R$RA2,XL         POINT TO 2ND ARG
                   11733:        PLC  XL,WC            POINT TO NEXT CHAR
                   11734:        ICV  WC               INCREMENT OFFSET
                   11735:        LCH  WA,(XL)          GET NEXT CHAR
                   11736:        MOV  R$RPT,XL         POINT TO TRANSLATE TABLE
                   11737:        PSC  XL,WA            CONVERT CHAR TO OFFSET INTO TABLE
                   11738:        LCH  WA,(XR)+         GET TRANSLATED CHAR
                   11739:        SCH  WA,(XL)          STORE IN TABLE
                   11740:        CSC  XL               COMPLETE STORE CHARACTERS
                   11741:        BCT  WB,SRPL3         LOOP TILL DONE
                   11742:        EJC
                   11743: *
                   11744: *      REPLACE (CONTINUED)
                   11745: *
                   11746: *      HERE TO PERFORM TRANSLATE
                   11747: *
                   11748: SRPL4  JSR  GTSTG            GET FIRST ARGUMENT
                   11749:        ERR  170,REPLACE FIRST ARGUMENT IS NOT STRING
                   11750:        BZE  WA,EXNUL         RETURN NULL IF NULL ARGUMENT
                   11751:        MOV  XR,XL            COPY POINTER
                   11752:        MOV  WA,WC            SAVE LENGTH
                   11753:        CTB  WA,SCHAR         GET SCBLK LENGTH
                   11754:        JSR  ALLOC            ALLOCATE SPACE FOR COPY
                   11755:        MOV  XR,WB            SAVE ADDRESS OF COPY
                   11756:        MVW                   MOVE SCBLK CONTENTS TO COPY
                   11757:        MOV  R$RPT,XR         POINT TO REPLACE TABLE
                   11758:        PLC  XR               POINT TO CHARS OF TABLE
                   11759:        MOV  WB,XL            POINT TO STRING TO TRANSLATE
                   11760:        PLC  XL               POINT TO CHARS OF STRING
                   11761:        MOV  WC,WA            SET NUMBER OF CHARS TO TRANSLATE
                   11762:        TRC                   PERFORM TRANSLATION
                   11763:        MOV  WB,-(XS)         STACK NEW STRING AS RESULT
                   11764:        BRN  EXITS            RETURN WITH RESULT ON STACK
                   11765: *
                   11766: *      ERROR POINT
                   11767: *
                   11768: SRPL5  ERB  171,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
                   11769:        EJC
                   11770: *
                   11771: *      REWIND
                   11772: *
                   11773: S$REW  ENT                   ENTRY POINT
                   11774:        JSR  IOFCB            CALL FCBLK ROUTINE
                   11775:        ERR  172,REWIND ARGUMENT IS NOT A SUITABLE NAME
                   11776:        ERR  173,REWIND ARGUMENT IS NULL
                   11777:        JSR  SYSRW            CALL SYSTEM REWIND FUNCTION
                   11778:        ERR  174,REWIND FILE DOES NOT EXIST
                   11779:        ERR  175,REWIND FILE DOES NOT PERMIT REWIND
                   11780:        ERR  176,REWIND CAUSED NON-RECOVERABLE ERROR
                   11781:        BRN  EXNUL            EXIT WITH NULL RESULT IF NO ERROR
                   11782:        EJC
                   11783: *
                   11784: *      REVERSE
                   11785: *
                   11786: S$RVS  ENT                   ENTRY POINT
                   11787:        JSR  GTSTG            LOAD STRING ARGUMENT
                   11788:        ERR  177,REVERSE ARGUMENT IS NOT STRING
                   11789:        BZE  WA,EXIXR         RETURN ARGUMENT IF NULL
                   11790:        MOV  XR,XL            ELSE SAVE POINTER TO STRING ARG
                   11791:        JSR  ALOCS            ALLOCATE SPACE FOR NEW SCBLK
                   11792:        MOV  XR,-(XS)         STORE SCBLK PTR ON STACK AS RESULT
                   11793:        PSC  XR               PREPARE TO STORE IN NEW SCBLK
                   11794:        PLC  XL,WC            POINT PAST LAST CHAR IN ARGUMENT
                   11795:        LCT  WC,WC            SET LOOP COUNTER
                   11796: *
                   11797: *      LOOP TO MOVE CHARS IN REVERSE ORDER
                   11798: *
                   11799: SRVS1  LCH  WB,-(XL)         LOAD NEXT CHAR FROM ARGUMENT
                   11800:        SCH  WB,(XR)+         STORE IN RESULT
                   11801:        BCT  WC,SRVS1         LOOP TILL ALL MOVED
                   11802:        CSC  XR               COMPLETE STORE CHARACTERS
                   11803:        BRN  EXITS            AND THEN JUMP FOR NEXT CODE WORD
                   11804:        EJC
                   11805: *
                   11806: *      RPAD
                   11807: *
                   11808: S$RPD  ENT                   ENTRY POINT
                   11809:        JSR  GTSTG            GET PAD CHARACTER
                   11810:        ERR  178,RPAD THIRD ARGUMENT IS NOT STRING
                   11811:        PLC  XR               POINT TO CHARACTER (NULL IS BLANK)
                   11812:        LCH  WB,(XR)          LOAD PAD CHARACTER
                   11813:        JSR  GTSMI            GET PAD LENGTH
                   11814:        ERR  179,RPAD SECOND ARGUMENT IS NOT INTEGER
                   11815:        PPM  SRPD3            SKIP IF NEGATIVE OR LARGE
                   11816: *
                   11817: *      MERGE TO CHECK FIRST ARG.
                   11818: *
                   11819: SRPD1  JSR  GTSTG            GET FIRST ARGUMENT (STRING TO PAD)
                   11820:        ERR  180,RPAD FIRST ARGUMENT IS NOT STRING
                   11821:        BGE  WA,WC,EXIXR      RETURN 1ST ARG IF TOO LONG TO PAD
                   11822:        MOV  XR,XL            ELSE MOVE PTR TO STRING TO PAD
                   11823: *
                   11824: *      NOW WE ARE READY FOR THE PAD
                   11825: *
                   11826: *      (XL)                  POINTER TO STRING TO PAD
                   11827: *      (WB)                  PAD CHARACTER
                   11828: *      (WC)                  LENGTH TO PAD STRING TO
                   11829: *
                   11830:        MOV  WC,WA            COPY LENGTH
                   11831:        JSR  ALOCS            ALLOCATE SCBLK FOR NEW STRING
                   11832:        MOV  XR,-(XS)         SAVE AS RESULT
                   11833:        MOV  SCLEN(XL),WA     LOAD LENGTH OF ARGUMENT
                   11834:        SUB  WA,WC            CALCULATE NUMBER OF PAD CHARACTERS
                   11835:        PSC  XR               POINT TO CHARS IN RESULT STRING
                   11836:        LCT  WC,WC            SET COUNTER FOR PAD LOOP
                   11837: *
                   11838: *      COPY ARGUMENT STRING
                   11839: *
                   11840:        BZE  WA,SRPD2         JUMP IF ARGUMENT IS NULL
                   11841:        PLC  XL               ELSE POINT TO ARGUMENT CHARS
                   11842:        MVC                   MOVE CHARACTERS TO RESULT STRING
                   11843: *
                   11844: *      LOOP TO SUPPLY PAD CHARACTERS
                   11845: *
                   11846: SRPD2  SCH  WB,(XR)+         STORE PAD CHARACTER, BUMP PTR
                   11847:        BCT  WC,SRPD2         LOOP TILL ALL PAD CHARS STORED
                   11848:        CSC  XR               COMPLETE CHARACTER STORING
                   11849:        BRN  EXITS            AND EXIT FOR NEXT WORD
                   11850: *
                   11851: *      HERE IF 2ND ARG IS NEGATIVE OR LARGE
                   11852: *
                   11853: SRPD3  ZER  WC               ZERO PAD COUNT
                   11854:        BRN  SRPD1            MERGE
                   11855:        EJC
                   11856: *
                   11857: *      RTAB
                   11858: *
                   11859: S$RTB  ENT                   ENTRY POINT
                   11860:        MOV  =P$RTB,WB        SET PCODE FOR INTEGER ARG CASE
                   11861:        MOV  =P$RTD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   11862:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   11863:        ERR  181,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION
                   11864:        ERR  182,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE
                   11865:        BRN  EXIXR            RETURN PATTERN NODE
                   11866:        EJC
                   11867: .IF    .CUST
                   11868: *
                   11869: *      SET
                   11870: *
                   11871: S$SET  ENT                   ENTRY POINT
                   11872:        MOV  (XS)+,R$IO2      SAVE THIRD ARG
                   11873:        MOV  (XS)+,R$IO1      SAVE SECOND ARG
                   11874:        JSR  IOFCB            CALL FCBLK ROUTINE
                   11875:        ERR  291,SET FIRST ARGUMENT IS NOT A SUITABLE NAME
                   11876:        ERR  292,SET FIRST ARGUMENT IS NULL
                   11877:        MOV  R$IO1,WB         LOAD SECOND ARG
                   11878:        MOV  R$IO2,WC         LOAD THIRD ARG
                   11879:        JSR  SYSST            CALL SYSTEM SET ROUTINE
                   11880:        ERR  293,INAPPROPRIATE SECOND ARGUMENT TO SET
                   11881:        ERR  294,INAPPROPRIATE THIRD ARGUMENT TO SET
                   11882:        ERR  295,SET FILE DOES NOT EXIST
                   11883:        ERR  296,SET FILE DOES NOT PERMIT SETTING FILE POINTER
                   11884:        ERR  297,SET CAUSED NON-RECOVERABLE I/O ERROR
                   11885:        BRN  EXNUL            OTHERWISEW RETURN NULL
                   11886:        EJC
                   11887: .FI
                   11888: *
                   11889: *      TAB
                   11890: *
                   11891: S$TAB  ENT                   ENTRY POINT
                   11892:        MOV  =P$TAB,WB        SET PCODE FOR INTEGER ARG CASE
                   11893:        MOV  =P$TBD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   11894:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   11895:        ERR  183,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION
                   11896:        ERR  184,TAB ARGUMENT IS NEGATIVE OR TOO LARGE
                   11897:        BRN  EXIXR            RETURN PATTERN NODE
                   11898:        EJC
                   11899: *
                   11900: *      RPOS
                   11901: *
                   11902: S$RPS  ENT                   ENTRY POINT
                   11903:        MOV  =P$RPS,WB        SET PCODE FOR INTEGER ARG CASE
                   11904:        MOV  =P$RPD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   11905:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   11906:        ERR  185,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION
                   11907:        ERR  186,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE
                   11908:        BRN  EXIXR            RETURN PATTERN NODE
                   11909: .IF    .CNSR
                   11910: .ELSE
                   11911:        EJC
                   11912: *
                   11913: *      RSORT
                   11914: *
                   11915: S$RSR  ENT                   ENTRY POINT
                   11916:        MNZ  WA               MARK AS RSORT
                   11917:        JSR  SORTA            CALL SORT ROUTINE
                   11918:        BRN  EXSID            RETURN, SETTING IDVAL
                   11919: .FI
                   11920:        EJC
                   11921: *
                   11922: *      SETEXIT
                   11923: *
                   11924: S$STX  ENT                   ENTRY POINT
                   11925:        MOV  (XS)+,XR         LOAD ARGUMENT
                   11926:        MOV  STXVR,WA         LOAD OLD VRBLK POINTER
                   11927:        ZER  XL               LOAD ZERO IN CASE NULL ARG
                   11928:        BEQ  XR,=NULLS,SSTX1  JUMP IF NULL ARGUMENT (RESET CALL)
                   11929:        JSR  GTNVR            ELSE GET SPECIFIED VRBLK
                   11930:        PPM  SSTX2            JUMP IF NOT NATURAL VARIABLE
                   11931:        MOV  VRLBL(XR),XL     ELSE LOAD LABEL
                   11932:        BEQ  XL,=STNDL,SSTX2  JUMP IF LABEL IS NOT DEFINED
                   11933:        BNE  (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED
                   11934:        MOV  TRLBL(XL),XL     ELSE LOAD PTR TO REAL LABEL CODE
                   11935: *
                   11936: *      HERE TO SET/RESET SETEXIT TRAP
                   11937: *
                   11938: SSTX1  MOV  XR,STXVR         STORE NEW VRBLK POINTER (OR NULL)
                   11939:        MOV  XL,R$SXC         STORE NEW CODE PTR (OR ZERO)
                   11940:        BEQ  WA,=NULLS,EXNUL  RETURN NULL IF NULL RESULT
                   11941:        MOV  WA,XR            ELSE COPY VRBLK POINTER
                   11942:        BRN  EXVNM            AND RETURN BUILDING NMBLK
                   11943: *
                   11944: *      HERE IF BAD ARGUMENT
                   11945: *
                   11946: SSTX2  ERB  187,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL
                   11947: .IF    .CNSR
                   11948: .ELSE
                   11949:        EJC
                   11950: *
                   11951: *      SORT
                   11952: *
                   11953: S$SRT  ENT                   ENTRY POINT
                   11954:        ZER  WA               MARK AS SORT
                   11955:        JSR  SORTA            CALL SORT ROUTINE
                   11956:        BRN  EXSID            RETURN, SETTING IDVAL
                   11957: .FI
                   11958:        EJC
                   11959: *
                   11960: *      SPAN
                   11961: *
                   11962: S$SPN  ENT                   ENTRY POINT
                   11963:        MOV  =P$SPS,WB        SET PCODE FOR SINGLE CHAR ARG
                   11964:        MOV  =P$SPN,XL        SET PCODE FOR MULTI-CHAR ARG
                   11965:        MOV  =P$SPD,WC        SET PCODE FOR EXPRESSION ARG
                   11966:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   11967:        ERR  188,SPAN ARGUMENT IS NOT STRING OR EXPRESSION
                   11968:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   11969:        EJC
                   11970: *
                   11971: *      SIZE
                   11972: *
                   11973: S$SI$  ENT                   ENTRY POINT
                   11974: .IF    .CNBF
                   11975: .ELSE
                   11976:        MOV  (XS),XR          LOAD ARGUMENT
                   11977:        BNE  (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER
                   11978:        ICA  XS               ELSE POP ARGUMENT
                   11979:        MTI  BCLEN(XR)        LOAD DEFINED LENGTH
                   11980:        BRN  EXINT            EXIT WITH INTEGER
                   11981: .FI
                   11982: *
                   11983: *      HERE IF NOT BUFFER
                   11984: *
                   11985: SSI$1  JSR  GTSTG            LOAD STRING ARGUMENT
                   11986:        ERR  189,SIZE ARGUMENT IS NOT STRING
                   11987:        MTI  WA               LOAD LENGTH AS INTEGER
                   11988:        BRN  EXINT            EXIT WITH INTEGER RESULT
                   11989:        EJC
                   11990: *
                   11991: *      STOPTR
                   11992: *
                   11993: S$STT  ENT                   ENTRY POINT
                   11994:        ZER  XL               INDICATE STOPTR CASE
                   11995:        JSR  TRACE            CALL TRACE PROCEDURE
                   11996:        ERR  190,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME
                   11997:        ERR  191,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE
                   11998:        BRN  EXNUL            RETURN NULL
                   11999:        EJC
                   12000: *
                   12001: *      SUBSTR
                   12002: *
                   12003: S$SUB  ENT                   ENTRY POINT
                   12004:        JSR  GTSMI            LOAD THIRD ARGUMENT
                   12005:        ERR  192,SUBSTR THIRD ARGUMENT IS NOT INTEGER
                   12006:        PPM  EXFAL            JUMP IF NEGATIVE OR TOO LARGE
                   12007:        MOV  XR,SBSSV         SAVE THIRD ARGUMENT
                   12008:        JSR  GTSMI            LOAD SECOND ARGUMENT
                   12009:        ERR  193,SUBSTR SECOND ARGUMENT IS NOT INTEGER
                   12010:        PPM  EXFAL            JUMP IF OUT OF RANGE
                   12011:        MOV  XR,WB            SAVE SECOND ARGUMENT
                   12012:        BZE  WB,EXFAL         JUMP IF SECOND ARGUMENT ZERO
                   12013:        DCV  WB               ELSE DECREMENT FOR ONES ORIGIN
                   12014: .IF    .CNBF
                   12015: .ELSE
                   12016:        MOV  (XS),XL          GET FIRST ARG PTR
                   12017:        BNE  (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER
                   12018:        MOV  BCBUF(XL),XR     GET BFBLK PTR
                   12019:        MOV  BCLEN(XL),WA     GET LENGTH
                   12020:        BRN  SSUBB            MERGE
                   12021: *
                   12022: *      HERE IF NOT BUFFER TO GET STRING
                   12023: *
                   12024: .FI
                   12025: SSUBA  JSR  GTSTG            LOAD FIRST ARGUMENT
                   12026:        ERR  194,SUBSTR FIRST ARGUMENT IS NOT STRING
                   12027: *
                   12028: *      MERGE WITH BFBLK OR SCBLK PTR IN XR.  WA HAS LENGTH
                   12029: *
                   12030: SSUBB  MOV  SBSSV,WC         RELOAD THIRD ARGUMENT
                   12031:        BNZ  WC,SSUB1         SKIP IF THIRD ARG GIVEN
                   12032:        MOV  WA,WC            ELSE GET STRING LENGTH
                   12033:        BGT  WB,WC,EXFAL      FAIL IF IMPROPER
                   12034:        SUB  WB,WC            REDUCE BY OFFSET TO START
                   12035: *
                   12036: *      MERGE
                   12037: *
                   12038: SSUB1  MOV  WA,XL            SAVE STRING LENGTH
                   12039:        MOV  WC,WA            SET LENGTH OF SUBSTRING
                   12040:        ADD  WB,WC            ADD 2ND ARG TO 3RD ARG
                   12041:        BGT  WC,XL,EXFAL      JUMP IF IMPROPER SUBSTRING
                   12042:        MOV  XR,XL            COPY POINTER TO FIRST ARG
                   12043:        JSR  SBSTR            BUILD SUBSTRING
                   12044:        BRN  EXIXR            AND JUMP FOR NEXT CODE WORD
                   12045:        EJC
                   12046: *
                   12047: *      TABLE
                   12048: *
                   12049: S$TBL  ENT                   ENTRY POINT
                   12050:        MOV  (XS)+,XL         GET INITIAL LOOKUP VALUE
                   12051:        ICA  XS               POP SECOND ARGUMENT
                   12052:        JSR  GTSMI            LOAD ARGUMENT
                   12053:        ERR  195,TABLE ARGUMENT IS NOT INTEGER
                   12054:        ERR  196,TABLE ARGUMENT IS OUT OF RANGE
                   12055:        BNZ  WC,STBL1         JUMP IF NON-ZERO
                   12056:        MOV  =TBNBK,WC        ELSE SUPPLY DEFAULT VALUE
                   12057: *
                   12058: *      MERGE HERE WITH NUMBER OF HEADERS IN WA
                   12059: *
                   12060: STBL1  MOV  WC,WA            COPY NUMBER OF HEADERS
                   12061:        ADD  =TBSI$,WA        ADJUST FOR STANDARD FIELDS
                   12062:        WTB  WA               CONVERT LENGTH TO BYTES
                   12063:        JSR  ALLOC            ALLOCATE SPACE FOR TBBLK
                   12064:        MOV  XR,WB            COPY POINTER TO TBBLK
                   12065:        MOV  =B$TBT,(XR)+     STORE TYPE WORD
                   12066:        ZER  (XR)+            ZERO ID FOR THE MOMENT
                   12067:        MOV  WA,(XR)+         STORE LENGTH (TBLEN)
                   12068:        MOV  XL,(XR)+         STORE INITIAL LOOKUP VALUE
                   12069:        LCT  WC,WC            SET LOOP COUNTER (NUM HEADERS)
                   12070: *
                   12071: *      LOOP TO INITIALIZE ALL BUCKET POINTERS
                   12072: *
                   12073: STBL2  MOV  WB,(XR)+         STORE TBBLK PTR IN BUCKET HEADER
                   12074:        BCT  WC,STBL2         LOOP TILL ALL STORED
                   12075:        MOV  WB,XR            RECALL POINTER TO TBBLK
                   12076:        BRN  EXSID            EXIT SETTING IDVAL
                   12077:        EJC
                   12078: *
                   12079: *      TIME
                   12080: *
                   12081: S$TIM  ENT                   ENTRY POINT
                   12082:        JSR  SYSTM            GET TIMER VALUE
                   12083:        SBI  TIMSX            SUBTRACT STARTING TIME
                   12084:        BRN  EXINT            EXIT WITH INTEGER VALUE
                   12085:        EJC
                   12086: *
                   12087: *      TRACE
                   12088: *
                   12089: S$TRA  ENT                   ENTRY POINT
                   12090:        BEQ  3(XS),=NULLS,STR03  JUMP IF FIRST ARGUMENT IS NULL
                   12091:        MOV  (XS)+,XR         LOAD FOURTH ARGUMENT
                   12092:        ZER  XL               TENTATIVELY SET ZERO POINTER
                   12093:        BEQ  XR,=NULLS,STR02  JUMP IF 4TH ARGUMENT IS NULL
                   12094:        JSR  GTNVR            ELSE POINT TO VRBLK
                   12095:        PPM  STR01            JUMP IF NOT VARIABLE NAME
                   12096:        MOV  VRFNC(XR),XL     ELSE LOAD FUNCTION POINTER
                   12097:        BNE  XL,=STNDF,STR02  JUMP IF FUNCTION IS DEFINED
                   12098: *
                   12099: *      HERE FOR BAD FOURTH ARGUMENT
                   12100: *
                   12101: STR01  ERB  197,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL
                   12102: *
                   12103: *      HERE WITH FUNCTION POINTER IN XL
                   12104: *
                   12105: STR02  MOV  (XS)+,XR         LOAD THIRD ARGUMENT (TAG)
                   12106:        ZER  WB               SET ZERO AS TRTYP VALUE FOR NOW
                   12107:        JSR  TRBLD            BUILD TRBLK FOR TRACE CALL
                   12108:        MOV  XR,XL            MOVE TRBLK POINTER FOR TRACE
                   12109:        JSR  TRACE            CALL TRACE PROCEDURE
                   12110:        ERR  198,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME
                   12111:        ERR  199,TRACE SECOND ARGUMENT IS NOT TRACE TYPE
                   12112:        BRN  EXNUL            RETURN NULL
                   12113: *
                   12114: *      HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
                   12115: *
                   12116: STR03  JSR  SYSTT            CALL IT
                   12117:        ADD  *NUM04,XS        POP TRACE ARGUMENTS
                   12118:        BRN  EXNUL            RETURN
                   12119:        EJC
                   12120: *
                   12121: *      TRIM
                   12122: *
                   12123: S$TRM  ENT                   ENTRY POINT
                   12124:        JSR  GTSTG            LOAD ARGUMENT AS STRING
                   12125:        ERR  200,TRIM ARGUMENT IS NOT STRING
                   12126:        BZE  WA,EXNUL         RETURN NULL IF ARGUMENT IS NULL
                   12127:        MOV  XR,XL            COPY STRING POINTER
                   12128:        CTB  WA,SCHAR         GET BLOCK LENGTH
                   12129:        JSR  ALLOC            ALLOCATE COPY SAME SIZE
                   12130:        MOV  XR,WB            SAVE POINTER TO COPY
                   12131:        MVW                   COPY OLD STRING BLOCK TO NEW
                   12132:        MOV  WB,XR            RESTORE PTR TO NEW BLOCK
                   12133:        JSR  TRIMR            TRIM BLANKS (WB IS NON-ZERO)
                   12134:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   12135:        EJC
                   12136: *
                   12137: *      UNLOAD
                   12138: *
                   12139: S$UNL  ENT                   ENTRY POINT
                   12140:        MOV  (XS)+,XR         LOAD ARGUMENT
                   12141:        JSR  GTNVR            POINT TO VRBLK
                   12142:        ERR  201,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME
                   12143:        MOV  =STNDF,XL        GET PTR TO UNDEFINED FUNCTION
                   12144:        JSR  DFFNC            UNDEFINE NAMED FUNCTION
                   12145:        BRN  EXNUL            RETURN NULL AS RESULT
                   12146:        TTL  S P I T B O L -- UTILITY PROCEDURES
                   12147: *
                   12148: *      THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
                   12149: *      USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
                   12150: *
                   12151: *      EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
                   12152: *      CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
                   12153: *      BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
                   12154: *      PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
                   12155: *
                   12156: *      THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
                   12157: *
                   12158: *      1)   THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
                   12159: *           CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
                   12160: *
                   12161: *      2)   REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
                   12162: *           MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
                   12163: *           CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
                   12164: *           THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
                   12165: *           MAY IF IT CHOOSES PRESERVE XR BY STACKING.
                   12166: *
                   12167: *      3)   REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
                   12168: *           VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
                   12169: *           XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
                   12170: *
                   12171: *      4)   REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
                   12172: *           ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
                   12173: *           (COLLECTABLE) POINTERS.
                   12174: *
                   12175: *      5)   THE CODE POINTER REGISTER POINTS TO THE CURRENT
                   12176: *           CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
                   12177: *
                   12178: *      IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
                   12179: *      WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
                   12180: *      POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
                   12181: *
                   12182: *      IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
                   12183: *      PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
                   12184: *      THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
                   12185: *      ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
                   12186: *      IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
                   12187: *
                   12188: *      THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
                   12189: *      AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
                   12190:        EJC
                   12191: *
                   12192: *      ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
                   12193: *
                   12194: *      ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
                   12195: *      ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
                   12196: *      ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
                   12197: *
                   12198: *      (XL)                  VARIABLE NAME BASE
                   12199: *      (WA)                  VARIABLE NAME OFFSET
                   12200: *      JSR  ACESS            CALL TO ACCESS VALUE
                   12201: *      PPM  LOC              TRANSFER LOC IF ACCESS FAILURE
                   12202: *      (XR)                  VARIABLE VALUE
                   12203: *      (WA,WB,WC)            DESTROYED
                   12204: *      (XL,RA)               DESTROYED
                   12205: *
                   12206: *      FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
                   12207: *      OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
                   12208: *      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
                   12209: *
                   12210: ACESS  PRC  R,1              ENTRY POINT (RECURSIVE)
                   12211:        MOV  XL,XR            COPY NAME BASE
                   12212:        ADD  WA,XR            POINT TO VARIABLE LOCATION
                   12213:        MOV  (XR),XR          LOAD VARIABLE VALUE
                   12214: *
                   12215: *      LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
                   12216: *
                   12217: ACS02  BNE  (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED
                   12218: *
                   12219: *      HERE IF TRAPPED
                   12220: *
                   12221:        BEQ  XR,=TRBKV,ACS12  JUMP IF KEYWORD VARIABLE
                   12222:        BNE  XR,=TRBEV,ACS05  JUMP IF NOT EXPRESSION VARIABLE
                   12223: *
                   12224: *      HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
                   12225: *
                   12226:        MOV  EVEXP(XL),XR     LOAD EXPRESSION POINTER
                   12227:        ZER  WB               EVALUATE BY VALUE
                   12228:        JSR  EVALX            EVALUATE EXPRESSION
                   12229:        PPM  ACS04            JUMP IF EVALUATION FAILURE
                   12230:        BRN  ACS02            CHECK VALUE FOR MORE TRBLKS
                   12231:        EJC
                   12232: *
                   12233: *      ACESS (CONTINUED)
                   12234: *
                   12235: *      HERE ON READING END OF FILE
                   12236: *
                   12237: ACS03  ADD  *NUM03,XS        POP TRBLK PTR, NAME BASE AND OFFSET
                   12238:        MOV  XR,DNAMP         POP UNUSED SCBLK
                   12239: *
                   12240: *      MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
                   12241: *
                   12242: ACS04  EXI  1                TAKE ALTERNATE (FAILURE) RETURN
                   12243: *
                   12244: *      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
                   12245: *
                   12246: ACS05  MOV  TRTYP(XR),WB     LOAD TRAP TYPE CODE
                   12247:        BNZ  WB,ACS10         JUMP IF NOT INPUT ASSOCIATION
                   12248:        BZE  KVINP,ACS09      IGNORE INPUT ASSOC IF INPUT IS OFF
                   12249: *
                   12250: *      HERE FOR INPUT ASSOCIATION
                   12251: *
                   12252:        MOV  XL,-(XS)         STACK NAME BASE
                   12253:        MOV  WA,-(XS)         STACK NAME OFFSET
                   12254:        MOV  XR,-(XS)         STACK TRBLK POINTER
                   12255:        MOV  TRFPT(XR),XL     GET FILE CTRL BLK PTR OR ZERO
                   12256:        BNZ  XL,ACS06         JUMP IF NOT STANDARD INPUT FILE
                   12257:        BEQ  TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL
                   12258: *
                   12259: *      HERE TO READ FROM STANDARD INPUT FILE
                   12260: *
                   12261:        MOV  CSWIN,WA         LENGTH FOR READ BUFFER
                   12262:        JSR  ALOCS            BUILD STRING OF APPROPRIATE LENGTH
                   12263:        JSR  SYSRD            READ NEXT STANDARD INPUT IMAGE
                   12264:        PPM  ACS03            JUMP TO FAIL EXIT IF END OF FILE
                   12265:        BRN  ACS07            ELSE MERGE WITH OTHER FILE CASE
                   12266: *
                   12267: *      HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
                   12268: *
                   12269: ACS06  MOV  XL,WA            FCBLK PTR
                   12270:        JSR  SYSIL            GET INPUT RECORD MAX LENGTH (TO WA)
                   12271:        JSR  ALOCS            ALLOCATE STRING OF CORRECT SIZE
                   12272:        MOV  XL,WA            FCBLK PTR
                   12273:        JSR  SYSIN            CALL SYSTEM INPUT ROUTINE
                   12274:        PPM  ACS03            JUMP TO FAIL EXIT IF END OF FILE
                   12275:        PPM  ACS22            ERROR
                   12276:        PPM  ACS23            ERROR
                   12277:        EJC
                   12278: *
                   12279: *      ACESS (CONTINUED)
                   12280: *
                   12281: *      MERGE HERE AFTER OBTAINING INPUT RECORD
                   12282: *
                   12283: ACS07  MOV  KVTRM,WB         LOAD TRIM INDICATOR
                   12284:        JSR  TRIMR            TRIM RECORD AS REQUIRED
                   12285:        MOV  XR,WB            COPY RESULT POINTER
                   12286:        MOV  (XS),XR          RELOAD POINTER TO TRBLK
                   12287: *
                   12288: *      LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
                   12289: *
                   12290: ACS08  MOV  XR,XL            SAVE POINTER TO THIS TRBLK
                   12291:        MOV  TRNXT(XR),XR     LOAD FORWARD POINTER
                   12292:        BEQ  (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK
                   12293:        MOV  WB,TRNXT(XL)     ELSE STORE RESULT AT END OF CHAIN
                   12294:        MOV  (XS)+,XR         RESTORE INITIAL TRBLK POINTER
                   12295:        MOV  (XS)+,WA         RESTORE NAME OFFSET
                   12296:        MOV  (XS)+,XL         RESTORE NAME BASE POINTER
                   12297: *
                   12298: *      COME HERE TO MOVE TO NEXT TRBLK
                   12299: *
                   12300: ACS09  MOV  TRNXT(XR),XR     LOAD FORWARD PTR TO NEXT VALUE
                   12301:        BRN  ACS02            BACK TO CHECK IF TRAPPED
                   12302: *
                   12303: *      HERE TO CHECK FOR ACCESS TRACE TRBLK
                   12304: *
                   12305: ACS10  BNE  WB,=TRTAC,ACS09  LOOP BACK IF NOT ACCESS TRACE
                   12306:        BZE  KVTRA,ACS09      IGNORE ACCESS TRACE IF TRACE OFF
                   12307:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   12308:        BZE  TRFNC(XR),ACS11  JUMP IF PRINT TRACE
                   12309:        EJC
                   12310: *
                   12311: *      ACESS (CONTINUED)
                   12312: *
                   12313: *      HERE FOR FULL FUNCTION TRACE
                   12314: *
                   12315:        JSR  TRXEQ            CALL ROUTINE TO EXECUTE TRACE
                   12316:        BRN  ACS09            JUMP FOR NEXT TRBLK
                   12317: *
                   12318: *      HERE FOR CASE OF PRINT TRACE
                   12319: *
                   12320: ACS11  JSR  PRTSN            PRINT STATEMENT NUMBER
                   12321:        JSR  PRTNV            PRINT NAME = VALUE
                   12322:        BRN  ACS09            JUMP BACK FOR NEXT TRBLK
                   12323: *
                   12324: *      HERE FOR KEYWORD VARIABLE
                   12325: *
                   12326: ACS12  MOV  KVNUM(XL),XR     LOAD KEYWORD NUMBER
                   12327:        BGE  XR,=K$V$$,ACS14  JUMP IF NOT ONE WORD VALUE
                   12328:        MTI  KVABE(XR)        ELSE LOAD VALUE AS INTEGER
                   12329: *
                   12330: *      COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
                   12331: *
                   12332: ACS13  JSR  ICBLD            BUILD ICBLK
                   12333:        BRN  ACS18            JUMP TO EXIT
                   12334: *
                   12335: *      HERE IF NOT ONE WORD KEYWORD VALUE
                   12336: *
                   12337: ACS14  BGE  XR,=K$S$$,ACS15  JUMP IF SPECIAL CASE
                   12338:        SUB  =K$V$$,XR        ELSE GET OFFSET
                   12339:        ADD  =NDABO,XR        POINT TO PATTERN VALUE
                   12340:        BRN  ACS18            JUMP TO EXIT
                   12341: *
                   12342: *      HERE IF SPECIAL KEYWORD CASE
                   12343: *
                   12344: ACS15  MOV  KVRTN,XL         LOAD RTNTYPE IN CASE
                   12345:        LDI  KVSTL            LOAD STLIMIT IN CASE
                   12346:        SUB  =K$S$$,XR        GET CASE NUMBER
                   12347:        BSW  XR,5             SWITCH ON KEYWORD NUMBER
                   12348:        IFF  K$$AL,ACS16      JUMP IF ALPHABET
                   12349:        IFF  K$$RT,ACS17      RTNTYPE
                   12350:        IFF  K$$SC,ACS19      STCOUNT
                   12351:        IFF  K$$SL,ACS13      STLIMIT
                   12352:        IFF  K$$ET,ACS20      ERRTEXT
                   12353:        ESW                   END SWITCH ON KEYWORD NUMBER
                   12354:        EJC
                   12355: *
                   12356: *      ACESS (CONTINUED)
                   12357: *
                   12358: *      ALPHABET
                   12359: *
                   12360: ACS16  MOV  KVALP,XL         LOAD POINTER TO ALPHABET STRING
                   12361: *
                   12362: *      RTNTYPE MERGES HERE
                   12363: *
                   12364: ACS17  MOV  XL,XR            COPY STRING PTR TO PROPER REG
                   12365: *
                   12366: *      COMMON RETURN POINT
                   12367: *
                   12368: ACS18  EXI                   RETURN TO ACESS CALLER
                   12369: *
                   12370: *      HERE FOR STCOUNT (IA HAS STLIMIT)
                   12371: *
                   12372: ACS19  SBI  KVSTC            STCOUNT = LIMIT - LEFT
                   12373:        BRN  ACS13            MERGE BACK WITH INTEGER RESULT
                   12374: *
                   12375: *      ERRTEXT
                   12376: *
                   12377: ACS20  MOV  R$ETX,XR         GET ERRTEXT STRING
                   12378:        BRN  ACS18            MERGE WITH RESULT
                   12379: *
                   12380: *      HERE TO READ A RECORD FROM TERMINAL
                   12381: *
                   12382: ACS21  MOV  =RILEN,WA        BUFFER LENGTH
                   12383:        JSR  ALOCS            ALLOCATE BUFFER
                   12384:        JSR  SYSRI            READ RECORD
                   12385:        PPM  ACS03            ENDFILE
                   12386:        BRN  ACS07            MERGE WITH RECORD READ
                   12387: *
                   12388: *      ERROR RETURNS
                   12389: *
                   12390: ACS22  MOV  XR,DNAMP         POP UNUSED SCBLK
                   12391:        ERB  202,INPUT FROM FILE CAUSED NON-RECOVERABLE ERROR
                   12392: *
                   12393: ACS23  MOV  XR,DNAMP         POP UNUSED SCBLK
                   12394:        ERB  203,INPUT FILE RECORD HAS INCORRECT FORMAT
                   12395:        ENP                   END PROCEDURE ACESS
                   12396:        EJC
                   12397: *
                   12398: *      ACOMP -- COMPARE TWO ARITHMETIC VALUES
                   12399: *
                   12400: *      1(XS)                 FIRST ARGUMENT
                   12401: *      0(XS)                 SECOND ARGUMENT
                   12402: *      JSR  ACOMP            CALL TO COMPARE VALUES
                   12403: *      PPM  LOC              TRANSFER LOC IF ARG1 IS NON-NUMERIC
                   12404: *      PPM  LOC              TRANSFER LOC IF ARG2 IS NON-NUMERIC
                   12405: *      PPM  LOC              TRANSFER LOC FOR ARG1 LT ARG2
                   12406: *      PPM  LOC              TRANSFER LOC FOR ARG1 EQ ARG2
                   12407: *      PPM  LOC              TRANSFER LOC FOR ARG1 GT ARG2
                   12408: *      (NORMAL RETURN IS NEVER GIVEN)
                   12409: *      (WA,WB,WC,IA,RA)      DESTROYED
                   12410: *      (XL,XR)               DESTROYED
                   12411: *
                   12412: ACOMP  PRC  N,5              ENTRY POINT
                   12413:        JSR  ARITH            LOAD ARITHMETIC OPERANDS
                   12414:        PPM  ACMP7            JUMP IF FIRST ARG NON-NUMERIC
                   12415:        PPM  ACMP8            JUMP IF SECOND ARG NON-NUMERIC
                   12416: .IF    .CNRA
                   12417: .ELSE
                   12418:        PPM  ACMP4            JUMP IF REAL ARGUMENTS
                   12419: .FI
                   12420: *
                   12421: *      HERE FOR INTEGER ARGUMENTS
                   12422: *
                   12423:        SBI  ICVAL(XL)        SUBTRACT TO COMPARE
                   12424:        IOV  ACMP3            JUMP IF OVERFLOW
                   12425:        ILT  ACMP5            ELSE JUMP IF ARG1 LT ARG2
                   12426:        IEQ  ACMP2            JUMP IF ARG1 EQ ARG2
                   12427: *
                   12428: *      HERE IF ARG1 GT ARG2
                   12429: *
                   12430: ACMP1  EXI  5                TAKE GT EXIT
                   12431: *
                   12432: *      HERE IF ARG1 EQ ARG2
                   12433: *
                   12434: ACMP2  EXI  4                TAKE EQ EXIT
                   12435:        EJC
                   12436: *
                   12437: *      ACOMP (CONTINUED)
                   12438: *
                   12439: *      HERE FOR INTEGER OVERFLOW ON SUBTRACT
                   12440: *
                   12441: ACMP3  LDI  ICVAL(XL)        LOAD SECOND ARGUMENT
                   12442:        ILT  ACMP1            GT IF NEGATIVE
                   12443:        BRN  ACMP5            ELSE LT
                   12444: .IF    .CNRA
                   12445: .ELSE
                   12446: *
                   12447: *      HERE FOR REAL OPERANDS
                   12448: *
                   12449: ACMP4  SBR  RCVAL(XL)        SUBTRACT TO COMPARE
                   12450:        ROV  ACMP6            JUMP IF OVERFLOW
                   12451:        RGT  ACMP1            ELSE JUMP IF ARG1 GT
                   12452:        REQ  ACMP2            JUMP IF ARG1 EQ ARG2
                   12453: .FI
                   12454: *
                   12455: *      HERE IF ARG1 LT ARG2
                   12456: *
                   12457: ACMP5  EXI  3                TAKE LT EXIT
                   12458: .IF    .CNRA
                   12459: .ELSE
                   12460: *
                   12461: *      HERE IF OVERFLOW ON REAL SUBTRACTION
                   12462: *
                   12463: ACMP6  LDR  RCVAL(XL)        RELOAD ARG2
                   12464:        RLT  ACMP1            GT IF NEGATIVE
                   12465:        BRN  ACMP5            ELSE LT
                   12466: .FI
                   12467: *
                   12468: *      HERE IF ARG1 NON-NUMERIC
                   12469: *
                   12470: ACMP7  EXI  1                TAKE ERROR EXIT
                   12471: *
                   12472: *      HERE IF ARG2 NON-NUMERIC
                   12473: *
                   12474: ACMP8  EXI  2                TAKE ERROR EXIT
                   12475:        ENP                   END PROCEDURE ACOMP
                   12476:        EJC
                   12477: *
                   12478: *      ALLOC                 ALLOCATE BLOCK OF DYNAMIC STORAGE
                   12479: *
                   12480: *      (WA)                  LENGTH REQUIRED IN BYTES
                   12481: *      JSR  ALLOC            CALL TO ALLOCATE BLOCK
                   12482: *      (XR)                  POINTER TO ALLOCATED BLOCK
                   12483: *
                   12484: *      A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
                   12485: *      MOV  DNAME,XR .  SUB  WA,XR .  BLO XR,DNAMP,ALOC2 .
                   12486: *      MOV  DNAMP,XR .  ADD  WA,XR
                   12487: *
                   12488: ALLOC  PRC  E,0              ENTRY POINT
                   12489: *
                   12490: *      COMMON EXIT POINT
                   12491: *
                   12492: ALOC1  MOV  DNAMP,XR         POINT TO NEXT AVAILABLE LOC
                   12493:        AOV  WA,XR,ALOC2      POINT PAST ALLOCATED BLOCK
                   12494:        BGT  XR,DNAME,ALOC2   JUMP IF NOT ENOUGH ROOM
                   12495:        MOV  XR,DNAMP         STORE NEW POINTER
                   12496:        SUB  WA,XR            POINT BACK TO START OF ALLOCATED BK
                   12497:        EXI                   RETURN TO CALLER
                   12498: *
                   12499: *      HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
                   12500: *
                   12501: ALOC2  MOV  WB,ALLSV         SAVE WB
                   12502:        ZER  WB               SET NO UPWARD MOVE FOR GBCOL
                   12503:        JSR  GBCOL            GARBAGE COLLECT
                   12504: *
                   12505: *      SEE IF ROOM AFTER GBCOL OR SYSMM CALL
                   12506: *
                   12507: ALOC3  MOV  DNAMP,XR         POINT TO FIRST AVAILABLE LOC
                   12508:        AOV  WA,XR,ALC3A      POINT PAST NEW BLOCK
                   12509:        BLO  XR,DNAME,ALOC4   JUMP IF THERE IS ROOM NOW
                   12510: *
                   12511: *      FAILED AGAIN, SEE IF WE CAN GET MORE CORE
                   12512: *
                   12513: ALC3A  JSR  SYSMM            TRY TO GET MORE MEMORY
                   12514:        WTB  XR               CONVERT TO BAUS (SGD05)
                   12515:        ADD  XR,DNAME         BUMP PTR BY AMOUNT OBTAINED
                   12516:        BNZ  XR,ALOC3         JUMP IF GOT MORE CORE
                   12517:        ADD  RSMEM,DNAME      GET THE RESERVE MEMORY
                   12518:        ZER  RSMEM            ONLY PERMISSIBLE ONCE
                   12519:        ICV  ERRFT            FATAL ERROR
                   12520:        ERB  204,MEMORY OVERFLOW
                   12521:        EJC
                   12522: *
                   12523: *      HERE AFTER SUCCESSFUL GARBAGE COLLECTION
                   12524: *
                   12525: ALOC4  STI  ALLIA            SAVE IA
                   12526:        MOV  DNAME,WB         GET DYNAMIC END ADRS
                   12527:        SUB  DNAMP,WB         COMPUTE FREE STORE
                   12528:        BTW  WB               CONVERT BYTES TO WORDS
                   12529:        MTI  WB               PUT FREE STORE IN IA
                   12530:        MLI  ALFSF            MULTIPLY BY FREE STORE FACTOR
                   12531:        IOV  ALOC5            JUMP IF OVERFLOWED
                   12532:        MOV  DNAME,WB         DYNAMIC END ADRS
                   12533:        SUB  DNAMB,WB         COMPUTE TOTAL AMOUNT OF DYNAMIC
                   12534:        BTW  WB               CONVERT TO WORDS
                   12535:        MOV  WB,ALDYN         STORE IT
                   12536:        SBI  ALDYN            SUBTRACT FROM SCALED UP FREE STORE
                   12537:        IGT  ALOC5            JUMP IF SUFFICIENT FREE STORE
                   12538:        JSR  SYSMM            TRY TO GET MORE STORE
                   12539:        WTB  XR               CONVERT TO BAUS (SGD05)
                   12540:        ADD  XR,DNAME         ADJUST DYNAMIC END ADRS
                   12541: *
                   12542: *      MERGE TO RESTORE IA AND WB
                   12543: *
                   12544: ALOC5  LDI  ALLIA            RECOVER IA
                   12545:        MOV  ALLSV,WB         RESTORE WB
                   12546:        BRN  ALOC1            JUMP BACK TO EXIT
                   12547:        ENP                   END PROCEDURE ALLOC
                   12548:        EJC
                   12549: .IF    .CNBF
                   12550: .ELSE
                   12551: *
                   12552: *      ALOBF -- ALLOCATE BUFFER
                   12553: *
                   12554: *      THIS ROUTINES ALLOCATES A NEW BUFFER.  AS THE BFBLK
                   12555: *      AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
                   12556: *      AND XR POINTS TO THE BCBLK ON RETURN.  THE BFBLK
                   12557: *      AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
                   12558: *      IS ZERO ON RETURN.
                   12559: *
                   12560: *      (WA)                  BUFFER SIZE IN CHARACTERS
                   12561: *      JSR  ALOBF            CALL TO CREATE BUFFER
                   12562: *      (XR)                  BCBLK PTR
                   12563: *      (WA,WB)               DESTROYED
                   12564: *
                   12565: ALOBF  PRC  E,0              ENTRY POINT
                   12566:        MOV  WA,WB            HANG ONTO ALLOCATION SIZE
                   12567:        CTB  WA,BFSI$         GET TOTAL BLOCK SIZE
                   12568:        BGE  WA,MXLEN,ALB01   CHECK FOR MAXLEN EXCEEDED
                   12569:        ADD  *BCSI$,WA        ADD IN ALLOCATION FOR BCBLK
                   12570:        JSR  ALLOC            ALLOCATE FRAME
                   12571:        MOV  =B$BCT,(XR)      SET TYPE
                   12572:        ZER  IDVAL(XR)        NO ID YET
                   12573:        ZER  BCLEN(XR)        NO DEFINED LENGTH
                   12574:        MOV  XL,WA            SAVE XL
                   12575:        MOV  XR,XL            COPY BCBLK PTR
                   12576:        ADD  *BCSI$,XL        BIAS PAST PARTIALLY BUILT BCBLK
                   12577:        MOV  =B$BFT,(XL)      SET BFBLK TYPE WORD
                   12578:        MOV  WB,BFALC(XL)     SET ALLOCATED SIZE
                   12579:        MOV  XL,BCBUF(XR)     SET POINTER IN BCBLK
                   12580:        ZER  BFCHR(XL)        CLEAR FIRST WORD (NULL PAD)
                   12581:        MOV  WA,XL            RESTORE ENTRY XL
                   12582:        EXI                   RETURN TO CALLER
                   12583: *
                   12584: *      HERE FOR MXLEN EXCEEDED
                   12585: *
                   12586: ALB01  ERB  274,REQUESTED BUFFER ALLOCATION EXCEEDS MXLEN
                   12587:        ENP                   END PROCEDURE ALOBF
                   12588:        EJC
                   12589: .FI
                   12590: *
                   12591: *      ALOCS -- ALLOCATE STRING BLOCK
                   12592: *
                   12593: *      ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
                   12594: *      WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
                   12595: *      ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
                   12596: *      EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
                   12597: *
                   12598: *      (WA)                  LENGTH OF STRING TO BE ALLOCATED
                   12599: *      JSR  ALOCS            CALL TO ALLOCATE SCBLK
                   12600: *      (XR)                  POINTER TO RESULTING SCBLK
                   12601: *      (WA)                  DESTROYED
                   12602: *      (WC)                  CHARACTER COUNT (ENTRY VALUE OF WA)
                   12603: *
                   12604: *      THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
                   12605: *      FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
                   12606: *      TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
                   12607: *
                   12608: ALOCS  PRC  E,0              ENTRY POINT
                   12609:        BGT  WA,KVMXL,ALCS2   JUMP IF LENGTH EXCEEEDS MAXLENGTH
                   12610:        MOV  WA,WC            ELSE COPY LENGTH
                   12611:        CTB  WA,SCSI$         COMPUTE LENGTH OF SCBLK IN BYTES
                   12612:        MOV  DNAMP,XR         POINT TO NEXT AVAILABLE LOCATION
                   12613:        AOV  WA,XR,ALCS0      POINT PAST BLOCK
                   12614:        BLO  XR,DNAME,ALCS1   JUMP IF THERE IS ROOM
                   12615: *
                   12616: *      INSUFFICIENT MEMORY
                   12617: *
                   12618: ALCS0  ZER  XR               ELSE CLEAR GARBAGE XR VALUE
                   12619:        JSR  ALLOC            AND USE STANDARD ALLOCATOR
                   12620:        ADD  WA,XR            POINT PAST END OF BLOCK TO MERGE
                   12621: *
                   12622: *      MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
                   12623: *
                   12624: ALCS1  MOV  XR,DNAMP         SET UPDATED STORAGE POINTER
                   12625:        ZER  -(XR)            STORE ZERO CHARS IN LAST WORD
                   12626:        DCA  WA               DECREMENT LENGTH
                   12627:        SUB  WA,XR            POINT BACK TO START OF BLOCK
                   12628:        MOV  =B$SCL,(XR)      SET TYPE WORD
                   12629:        MOV  WC,SCLEN(XR)     STORE LENGTH IN CHARS
                   12630:        EXI                   RETURN TO ALOCS CALLER
                   12631: *
                   12632: *      COME HERE IF STRING IS TOO LONG
                   12633: *
                   12634: ALCS2  ERB  205,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
                   12635:        ENP                   END PROCEDURE ALOCS
                   12636:        EJC
                   12637: *
                   12638: *      ALOST -- ALLOCATE SPACE IN STATIC REGION
                   12639: *
                   12640: *      (WA)                  LENGTH REQUIRED IN BYTES
                   12641: *      JSR  ALOST            CALL TO ALLOCATE SPACE
                   12642: *      (XR)                  POINTER TO ALLOCATED BLOCK
                   12643: *      (WB)                  DESTROYED
                   12644: *
                   12645: *      NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
                   12646: *      OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
                   12647: *      IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
                   12648: *
                   12649: ALOST  PRC  E,0              ENTRY POINT
                   12650: *
                   12651: *      MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
                   12652: *
                   12653: ALST1  MOV  STATE,XR         POINT TO CURRENT END OF AREA
                   12654:        AOV  WA,XR,ALST2      POINT BEYOND PROPOSED BLOCK
                   12655:        BGE  XR,DNAMB,ALST2   JUMP IF OVERLAP WITH DYNAMIC AREA
                   12656:        MOV  XR,STATE         ELSE STORE NEW POINTER
                   12657:        SUB  WA,XR            POINT BACK TO START OF BLOCK
                   12658:        EXI                   RETURN TO ALOST CALLER
                   12659: *
                   12660: *      HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
                   12661: *
                   12662: ALST2  MOV  WA,ALSTA         SAVE WA
                   12663:        BGE  WA,*E$STS,ALST3  SKIP IF REQUESTED CHUNK IS LARGE
                   12664:        MOV  *E$STS,WA        ELSE SET TO GET LARGE ENOUGH CHUNK
                   12665: *
                   12666: *      HERE WITH AMOUNT TO MOVE UP IN WA
                   12667: *
                   12668: ALST3  JSR  ALLOC            ALLOCATE BLOCK TO ENSURE ROOM
                   12669:        MOV  XR,DNAMP         AND DELETE IT
                   12670:        MOV  WA,WB            COPY MOVE UP AMOUNT
                   12671:        JSR  GBCOL            CALL GBCOL TO MOVE DYNAMIC AREA UP
                   12672:        MOV  ALSTA,WA         RESTORE WA
                   12673:        BRN  ALST1            LOOP BACK TO TRY AGAIN
                   12674:        ENP                   END PROCEDURE ALOST
                   12675:        EJC
                   12676: .IF    .CNBF
                   12677: .ELSE
                   12678: *
                   12679: *      APNDB -- APPEND STRING TO BUFFER
                   12680: *
                   12681: *      THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO
                   12682: *      APPEND DATA TO AN EXISTING BFBLK.
                   12683: *
                   12684: *      (XR)                  EXISTING BCBLK TO BE APPENDED
                   12685: *      (XL)                  CONVERTABLE TO STRING
                   12686: *      JSR  APNDB            CALL TO APPEND TO BUFFER
                   12687: *      PPM  LOC              THREAD IF (XL) CANT BE CONVERTED
                   12688: *      PPM  LOC              IF NOT ENOUGH ROOM
                   12689: *      (WA,WB)               DESTROYED
                   12690: *
                   12691: *      IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED,
                   12692: *      THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN.
                   12693: *
                   12694: APNDB  PRC  E,2              ENTRY POINT
                   12695:        MOV  BCLEN(XR),WA     LOAD OFFSET TO INSERT
                   12696:        ZER  WB               REPLACE SECTION IS NULL
                   12697:        JSR  INSBF            CALL TO INSERT AT END
                   12698:        PPM  APN01            CONVERT ERROR
                   12699:        PPM  APN02            NO ROOM
                   12700:        EXI                   RETURN TO CALLER
                   12701: *
                   12702: *      HERE TO TAKE CONVERT FAILURE EXIT
                   12703: *
                   12704: APN01  EXI  1                RETURN TO CALLER ALTERNATE
                   12705: *
                   12706: *      HERE FOR NO FIT EXIT
                   12707: *
                   12708: APN02  EXI  2                ALTERNATE EXIT TO CALLER
                   12709:        ENP                   END PROCEDURE APNDB
                   12710:        EJC
                   12711: .FI
                   12712: *
                   12713: *      ARITH -- FETCH ARITHMETIC OPERANDS
                   12714: *
                   12715: *      ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
                   12716: *      TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
                   12717: *      INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
                   12718: *      THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
                   12719: *
                   12720: *      1(XS)                 FIRST ARGUMENT (LEFT OPERAND)
                   12721: *      0(XS)                 SECOND ARGUMENT (RIGHT OPERAND)
                   12722: *      JSR  ARITH            CALL TO FETCH NUMERIC ARGUMENTS
                   12723: *      PPM  LOC              TRANSFER LOC FOR OPND 1 NON-NUMERIC
                   12724: *      PPM  LOC              TRANSFER LOC FOR OPND 2 NON-NUMERIC
                   12725: .IF    .CNRA
                   12726: .ELSE
                   12727: *      PPM  LOC              TRANSFER LOC FOR REAL OPERANDS
                   12728: .FI
                   12729: *
                   12730: *      FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
                   12731: *
                   12732: *      (IA)                  LEFT OPERAND VALUE
                   12733: *      (XR)                  PTR TO ICBLK FOR LEFT OPERAND
                   12734: *      (XL)                  PTR TO ICBLK FOR RIGHT OPERAND
                   12735: *      (XS)                  POPPED TWICE
                   12736: *      (WA,WB,RA)            DESTROYED
                   12737: .IF    .CNRA
                   12738: .ELSE
                   12739: *
                   12740: *      FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
                   12741: *      SPECIFIED BY THE THIRD PARAMETER.
                   12742: *
                   12743: *      (RA)                  LEFT OPERAND VALUE
                   12744: *      (XR)                  PTR TO RCBLK FOR LEFT OPERAND
                   12745: *      (XL)                  PTR TO RCBLK FOR RIGHT OPERAND
                   12746: *      (WA,WB,WC)            DESTROYED
                   12747: *      (XS)                  POPPED TWICE
                   12748: .FI
                   12749:        EJC
                   12750: *
                   12751: *      ARITH (CONTINUED)
                   12752: *
                   12753: *      ENTRY POINT
                   12754: *
                   12755: .IF    .CNRA
                   12756: ARITH  PRC  N,2              ENTRY POINT
                   12757: .ELSE
                   12758: ARITH  PRC  N,3              ENTRY POINT
                   12759: .FI
                   12760:        MOV  (XS)+,XL         LOAD RIGHT OPERAND
                   12761:        MOV  (XS)+,XR         LOAD LEFT OPERAND
                   12762:        MOV  (XL),WA          GET RIGHT OPERAND TYPE WORD
                   12763:        BEQ  WA,=B$ICL,ARTH1  JUMP IF INTEGER
                   12764: .IF    .CNRA
                   12765: .ELSE
                   12766:        BEQ  WA,=B$RCL,ARTH4  JUMP IF REAL
                   12767: .FI
                   12768:        MOV  XR,-(XS)         ELSE REPLACE LEFT ARG ON STACK
                   12769:        MOV  XL,XR            COPY LEFT ARG POINTER
                   12770:        JSR  GTNUM            CONVERT TO NUMERIC
                   12771:        PPM  ARTH6            JUMP IF UNCONVERTIBLE
                   12772:        MOV  XR,XL            ELSE COPY CONVERTED RESULT
                   12773:        MOV  (XL),WA          GET RIGHT OPERAND TYPE WORD
                   12774:        MOV  (XS)+,XR         RELOAD LEFT ARGUMENT
                   12775: .IF    .CNRA
                   12776: .ELSE
                   12777:        BEQ  WA,=B$RCL,ARTH4  JUMP IF RIGHT ARG IS REAL
                   12778: .FI
                   12779: *
                   12780: *      HERE IF RIGHT ARG IS AN INTEGER
                   12781: *
                   12782: ARTH1  BNE  (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER
                   12783: *
                   12784: *      EXIT FOR INTEGER CASE
                   12785: *
                   12786: ARTH2  LDI  ICVAL(XR)        LOAD LEFT OPERAND VALUE
                   12787:        EXI                   RETURN TO ARITH CALLER
                   12788: *
                   12789: *      HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
                   12790: *
                   12791: ARTH3  JSR  GTNUM            CONVERT LEFT ARG TO NUMERIC
                   12792:        PPM  ARTH7            JUMP IF NOT CONVERTIBLE
                   12793:        BEQ  WA,=B$ICL,ARTH2  JUMP BACK IF INTEGER-INTEGER
                   12794: .IF    .CNRA
                   12795: .ELSE
                   12796: *
                   12797: *      HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
                   12798: *
                   12799:        MOV  XR,-(XS)         PUT LEFT ARG BACK ON STACK
                   12800:        LDI  ICVAL(XL)        LOAD RIGHT ARGUMENT VALUE
                   12801:        ITR                   CONVERT TO REAL
                   12802:        JSR  RCBLD            GET REAL BLOCK FOR RIGHT ARG, MERGE
                   12803:        MOV  XR,XL            COPY RIGHT ARG PTR
                   12804:        MOV  (XS)+,XR         LOAD LEFT ARGUMENT
                   12805:        BRN  ARTH5            MERGE FOR REAL-REAL CASE
                   12806:        EJC
                   12807: *
                   12808: *      ARITH (CONTINUED)
                   12809: *
                   12810: *      HERE IF RIGHT ARGUMENT IS REAL
                   12811: *
                   12812: ARTH4  BEQ  (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL
                   12813:        JSR  GTREA            ELSE CONVERT TO REAL
                   12814:        PPM  ARTH7            ERROR IF UNCONVERTIBLE
                   12815: *
                   12816: *      HERE FOR REAL-REAL
                   12817: *
                   12818: ARTH5  LDR  RCVAL(XR)        LOAD LEFT OPERAND VALUE
                   12819:        EXI  3                TAKE REAL-REAL EXIT
                   12820: .FI
                   12821: *
                   12822: *      HERE FOR ERROR CONVERTING RIGHT ARGUMENT
                   12823: *
                   12824: ARTH6  ICA  XS               POP UNWANTED LEFT ARG
                   12825:        EXI  2                TAKE APPROPRIATE ERROR EXIT
                   12826: *
                   12827: *      HERE FOR ERROR CONVERTING LEFT OPERAND
                   12828: *
                   12829: ARTH7  EXI  1                TAKE APPROPRIATE ERROR RETURN
                   12830:        ENP                   END PROCEDURE ARITH
                   12831:        EJC
                   12832: *
                   12833: *      ASIGN -- PERFORM ASSIGNMENT
                   12834: *
                   12835: *      ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
                   12836: *      WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
                   12837: *      VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
                   12838: *      ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
                   12839: *      PATTERN AND EXPRESSION VARIABLES.
                   12840: *
                   12841: *      (WB)                  VALUE TO BE ASSIGNED
                   12842: *      (XL)                  BASE POINTER FOR VARIABLE
                   12843: *      (WA)                  OFFSET FOR VARIABLE
                   12844: *      JSR  ASIGN            CALL TO ASSIGN VALUE TO VARIABLE
                   12845: *      PPM  LOC              TRANSFER LOC FOR FAILURE
                   12846: *      (XR,XL,WA,WB,WC)      DESTROYED
                   12847: *      (RA)                  DESTROYED
                   12848: *
                   12849: *      FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
                   12850: *      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
                   12851: *
                   12852: ASIGN  PRC  R,1              ENTRY POINT (RECURSIVE)
                   12853: *
                   12854: *      MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
                   12855: *
                   12856: ASG01  ADD  WA,XL            POINT TO VARIABLE VALUE
                   12857:        MOV  (XL),XR          LOAD VARIABLE VALUE
                   12858:        BEQ  (XR),=B$TRT,ASG02 JUMP IF TRAPPED
                   12859:        MOV  WB,(XL)          ELSE PERFORM ASSIGNMENT
                   12860:        ZER  XL               CLEAR GARBAGE VALUE IN XL
                   12861:        EXI                   AND RETURN TO ASIGN CALLER
                   12862: *
                   12863: *      HERE IF VALUE IS TRAPPED
                   12864: *
                   12865: ASG02  SUB  WA,XL            RESTORE NAME BASE
                   12866:        BEQ  XR,=TRBKV,ASG14  JUMP IF KEYWORD VARIABLE
                   12867:        BNE  XR,=TRBEV,ASG04  JUMP IF NOT EXPRESSION VARIABLE
                   12868: *
                   12869: *      HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
                   12870: *
                   12871:        MOV  EVEXP(XL),XR     POINT TO EXPRESSION
                   12872:        MOV  WB,-(XS)         STORE VALUE TO ASSIGN ON STACK
                   12873:        MOV  =NUM01,WB        SET FOR EVALUATION BY NAME
                   12874:        JSR  EVALX            EVALUATE EXPRESSION BY NAME
                   12875:        PPM  ASG03            JUMP IF EVALUATION FAILS
                   12876:        MOV  (XS)+,WB         ELSE RELOAD VALUE TO ASSIGN
                   12877:        BRN  ASG01            LOOP BACK TO PERFORM ASSIGNMENT
                   12878:        EJC
                   12879: *
                   12880: *      ASIGN (CONTINUED)
                   12881: *
                   12882: *      HERE FOR FAILURE DURING EXPRESSION EVALUATION
                   12883: *
                   12884: ASG03  ICA  XS               REMOVE STACKED VALUE ENTRY
                   12885:        EXI  1                TAKE FAILURE EXIT
                   12886: *
                   12887: *      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
                   12888: *
                   12889: ASG04  MOV  XR,-(XS)         SAVE PTR TO FIRST TRBLK
                   12890: *
                   12891: *      LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
                   12892: *
                   12893: ASG05  MOV  XR,WC            SAVE PTR TO THIS TRBLK
                   12894:        MOV  TRNXT(XR),XR     POINT TO NEXT TRBLK
                   12895:        BEQ  (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK
                   12896:        MOV  WC,XR            ELSE POINT BACK TO LAST TRBLK
                   12897:        MOV  WB,TRVAL(XR)     STORE VALUE AT END OF CHAIN
                   12898:        MOV  (XS)+,XR         RESTORE PTR TO FIRST TRBLK
                   12899: *
                   12900: *      LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
                   12901: *
                   12902: ASG06  MOV  TRTYP(XR),WB     LOAD TYPE CODE OF TRBLK
                   12903:        BEQ  WB,=TRTVL,ASG08  JUMP IF VALUE TRACE
                   12904:        BEQ  WB,=TRTOU,ASG10  JUMP IF OUTPUT ASSOCIATION
                   12905: *
                   12906: *      HERE TO MOVE TO NEXT TRBLK ON CHAIN
                   12907: *
                   12908: ASG07  MOV  TRNXT(XR),XR     POINT TO NEXT TRBLK ON CHAIN
                   12909:        BEQ  (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK
                   12910:        EXI                   ELSE END OF CHAIN, RETURN TO CALLER
                   12911: *
                   12912: *      HERE TO PROCESS VALUE TRACE
                   12913: *
                   12914: ASG08  BZE  KVTRA,ASG07      IGNORE VALUE TRACE IF TRACE OFF
                   12915:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   12916:        BZE  TRFNC(XR),ASG09  JUMP IF PRINT TRACE
                   12917:        JSR  TRXEQ            ELSE EXECUTE FUNCTION TRACE
                   12918:        BRN  ASG07            AND LOOP BACK
                   12919:        EJC
                   12920: *
                   12921: *      ASIGN (CONTINUED)
                   12922: *
                   12923: *      HERE FOR PRINT TRACE
                   12924: *
                   12925: ASG09  JSR  PRTSN            PRINT STATEMENT NUMBER
                   12926:        JSR  PRTNV            PRINT NAME = VALUE
                   12927:        BRN  ASG07            LOOP BACK FOR NEXT TRBLK
                   12928: *
                   12929: *      HERE FOR OUTPUT ASSOCIATION
                   12930: *
                   12931: ASG10  BZE  KVOUP,ASG07      IGNORE OUTPUT ASSOC IF OUTPUT OFF
                   12932:        MOV  XR,XL            ELSE COPY TRBLK POINTER
                   12933:        MOV  TRVAL(WC),-(XS)  STACK VALUE TO OUTPUT (SGD01)
                   12934:        JSR  GTSTG            CONVERT TO STRING
                   12935:        PPM  ASG12            GET DATATYPE NAME IF UNCONVERTIBLE
                   12936: *
                   12937: *      MERGE WITH STRING FOR OUTPUT
                   12938: *
                   12939: ASG11  MOV  TRFPT(XL),WA     FCBLK PTR
                   12940:        BZE  WA,ASG13         JUMP IF STANDARD OUTPUT FILE
                   12941: *
                   12942: *      HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
                   12943: *
                   12944:        JSR  SYSOU            CALL SYSTEM OUTPUT ROUTINE
                   12945:        ERR  206,OUTPUT CAUSED FILE OVERFLOW
                   12946:        ERR  207,OUTPUT CAUSED NON-RECOVERABLE ERROR
                   12947:        EXI                   ELSE ALL DONE, RETURN TO CALLER
                   12948: *
                   12949: *      IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
                   12950: *
                   12951: ASG12  JSR  DTYPE            CALL DATATYPE ROUTINE
                   12952:        BRN  ASG11            MERGE
                   12953: *
                   12954: *      HERE TO PRINT A STRING ON THE PRINTER
                   12955: *
                   12956: ASG13  JSR  PRTST            PRINT STRING VALUE
                   12957:        BEQ  TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT
                   12958:        JSR  PRTNL            END OF LINE
                   12959:        EXI                   RETURN TO CALLER
                   12960:        EJC
                   12961: *
                   12962: *      ASIGN (CONTINUED)
                   12963: *
                   12964: *      HERE FOR KEYWORD ASSIGNMENT
                   12965: *
                   12966: ASG14  MOV  KVNUM(XL),XL     LOAD KEYWORD NUMBER
                   12967:        BEQ  XL,=K$ETX,ASG19  JUMP IF ERRTEXT
                   12968:        MOV  WB,XR            COPY VALUE TO BE ASSIGNED
                   12969:        JSR  GTINT            CONVERT TO INTEGER
                   12970:        ERR  208,KEYWORD VALUE ASSIGNED IS NOT INTEGER
                   12971:        LDI  ICVAL(XR)        ELSE LOAD VALUE
                   12972:        BEQ  XL,=K$STL,ASG16  JUMP IF SPECIAL CASE OF STLIMIT
                   12973:        MFI  WA,ASG18         ELSE GET ADDR INTEGER, TEST OVFLOW
                   12974:        BGE  WA,MXLEN,ASG18   FAIL IF TOO LARGE
                   12975:        BEQ  XL,=K$ERT,ASG17  JUMP IF SPECIAL CASE OF ERRTYPE
                   12976: .IF    .CNPF
                   12977: .ELSE
                   12978:        BEQ  XL,=K$PFL,ASG21  JUMP IF SPECIAL CASE OF PROFILE
                   12979: .FI
                   12980:        BLT  XL,=K$P$$,ASG15  JUMP UNLESS PROTECTED
                   12981:        ERB  209,KEYWORD IN ASSIGNMENT IS PROTECTED
                   12982: *
                   12983: *      HERE TO DO ASSIGNMENT IF NOT PROTECTED
                   12984: *
                   12985: ASG15  MOV  WA,KVABE(XL)     STORE NEW VALUE
                   12986:        EXI                   RETURN TO ASIGN CALLER
                   12987: *
                   12988: *      HERE FOR SPECIAL CASE OF STLIMIT
                   12989: *
                   12990: *      SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
                   12991: *      IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
                   12992: *
                   12993: ASG16  SBI  KVSTL            SUBTRACT OLD LIMIT
                   12994:        ADI  KVSTC            ADD OLD COUNTER
                   12995:        STI  KVSTC            STORE NEW COUNTER VALUE
                   12996:        LDI  ICVAL(XR)        RELOAD NEW LIMIT VALUE
                   12997:        STI  KVSTL            STORE NEW LIMIT VALUE
                   12998:        EXI                   RETURN TO ASIGN CALLER
                   12999: *
                   13000: *      HERE FOR SPECIAL CASE OF ERRTYPE
                   13001: *
                   13002: ASG17  BLE  WA,=NINI9,ERROR  OK TO SIGNAL IF IN RANGE
                   13003: *
                   13004: *      HERE IF VALUE ASSIGNED IS OUT OF RANGE
                   13005: *
                   13006: ASG18  ERB  210,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
                   13007: *
                   13008: *      HERE FOR SPECIAL CASE OF ERRTEXT
                   13009: *
                   13010: ASG19  MOV  WB,-(XS)         STACK VALUE
                   13011:        JSR  GTSTG            CONVERT TO STRING
                   13012:        ERR  211,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
                   13013:        MOV  XR,R$ETX         MAKE ASSIGNMENT
                   13014:        EXI                   RETURN TO CALLER
                   13015: *
                   13016: *      PRINT STRING TO TERMINAL
                   13017: *
                   13018: ASG20  JSR  PRTTR            PRINT
                   13019:        EXI                   RETURN
                   13020: *
                   13021: .IF    .CNPF
                   13022: .ELSE
                   13023: *      HERE FOR KEYWORD PROFILE
                   13024: *
                   13025: ASG21  BGT  WA,=NUM02,ASG18  MOAN IF NOT 0,1, OR 2
                   13026:        BZE  WA,ASG15         JUST ASSIGN IF ZERO
                   13027:        BZE  PFDMP,ASG22      BRANCH IF FIRST ASSIGNMENT
                   13028:        BEQ  WA,PFDMP,ASG23   ALSO IF SAME VALUE AS BEFORE
                   13029:        ERB  268,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE
                   13030: *
                   13031: ASG22  MOV  WA,PFDMP          NOTE VALUE ON FIRST ASSIGNMENT
                   13032: ASG23  JSR  SYSTM            GET THE TIME
                   13033:        STI  PFSTM            FUDGE SOME KIND OF START TIME
                   13034:        BRN  ASG15            AND GO ASSIGN
                   13035: .FI
                   13036:        ENP                   END PROCEDURE ASIGN
                   13037:        EJC
                   13038: *
                   13039: *      ASINP -- ASSIGN DURING PATTERN MATCH
                   13040: *
                   13041: *      ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
                   13042: *      AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
                   13043: *      VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
                   13044: *
                   13045: *      (XL)                  BASE POINTER FOR VARIABLE
                   13046: *      (WA)                  OFFSET FOR VARIABLE
                   13047: *      (WB)                  VALUE TO BE ASSIGNED
                   13048: *      JSR  ASINP            CALL TO ASSIGN VALUE TO VARIABLE
                   13049: *      PPM  LOC              TRANSFER LOC IF FAILURE
                   13050: *      (XR,XL)               DESTROYED
                   13051: *      (WA,WB,WC,RA)         DESTROYED
                   13052: *
                   13053: ASINP  PRC  R,1              ENTRY POINT, RECURSIVE
                   13054:        ADD  WA,XL            POINT TO VARIABLE
                   13055:        MOV  (XL),XR          LOAD CURRENT CONTENTS
                   13056:        BEQ  (XR),=B$TRT,ASNP1 JUMP IF TRAPPED
                   13057:        MOV  WB,(XL)          ELSE PERFORM ASSIGNMENT
                   13058:        ZER  XL               CLEAR GARBAGE VALUE IN XL
                   13059:        EXI                   RETURN TO ASINP CALLER
                   13060: *
                   13061: *      HERE IF VARIABLE IS TRAPPED
                   13062: *
                   13063: ASNP1  SUB  WA,XL            RESTORE BASE POINTER
                   13064:        MOV  PMSSL,-(XS)      STACK SUBJECT STRING LENGTH
                   13065:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE PTR
                   13066:        MOV  R$PMS,-(XS)      STACK SUBJECT STRING POINTER
                   13067:        MOV  PMDFL,-(XS)      STACK DOT FLAG
                   13068:        JSR  ASIGN            CALL FULL-BLOWN ASSIGNMENT ROUTINE
                   13069:        PPM  ASNP2            JUMP IF FAILURE
                   13070:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   13071:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   13072:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   13073:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   13074:        EXI                   RETURN TO ASINP CALLER
                   13075: *
                   13076: *      HERE IF FAILURE IN ASIGN CALL
                   13077: *
                   13078: ASNP2  MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   13079:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   13080:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   13081:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   13082:        EXI  1                TAKE FAILURE EXIT
                   13083:        ENP                   END PROCEDURE ASINP
                   13084:        EJC
                   13085: *
                   13086: *      BLKLN -- DETERMINE LENGTH OF BLOCK
                   13087: *
                   13088: *      BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
                   13089: *
                   13090: *      (WA)                  FIRST WORD OF BLOCK
                   13091: *      (XR)                  POINTER TO BLOCK
                   13092: *      JSR  BLKLN            CALL TO GET BLOCK LENGTH
                   13093: *      (WA)                  LENGTH OF BLOCK IN BYTES
                   13094: *      (XL)                  DESTROYED
                   13095: *
                   13096: *      BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
                   13097: *      PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
                   13098: *
                   13099: *      THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
                   13100: *      BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
                   13101: *
                   13102: BLKLN  PRC  E,0              ENTRY POINT
                   13103:        MOV  WA,XL            COPY FIRST WORD
                   13104:        LEI  XL               GET ENTRY ID (BL$XX)
                   13105:        BSW  XL,BL$$$,BLN00   SWITCH ON BLOCK TYPE
                   13106:        IFF  BL$AR,BLN01      ARBLK
                   13107: .IF    .CNBF
                   13108: .ELSE
                   13109:        IFF  BL$BC,BLN04      BCBLK
                   13110:        IFF  BL$BF,BLN11      BFBLK
                   13111: .FI
                   13112:        IFF  BL$CD,BLN01      CDBLK
                   13113:        IFF  BL$DF,BLN01      DFBLK
                   13114:        IFF  BL$EF,BLN01      EFBLK
                   13115:        IFF  BL$EX,BLN01      EXBLK
                   13116:        IFF  BL$PF,BLN01      PFBLK
                   13117:        IFF  BL$TB,BLN01      TBBLK
                   13118:        IFF  BL$VC,BLN01      VCBLK
                   13119:        IFF  BL$EV,BLN03      EVBLK
                   13120:        IFF  BL$KV,BLN03      KVBLK
                   13121:        IFF  BL$P0,BLN02      P0BLK
                   13122:        IFF  BL$SE,BLN02      SEBLK
                   13123:        IFF  BL$NM,BLN03      NMBLK
                   13124:        IFF  BL$P1,BLN03      P1BLK
                   13125:        IFF  BL$P2,BLN04      P2BLK
                   13126:        IFF  BL$TE,BLN04      TEBLK
                   13127:        IFF  BL$FF,BLN05      FFBLK
                   13128:        IFF  BL$TR,BLN05      TRBLK
                   13129:        IFF  BL$CT,BLN06      CTBLK
                   13130:        IFF  BL$IC,BLN07      ICBLK
                   13131:        IFF  BL$PD,BLN08      PDBLK
                   13132: .IF    .CNRA
                   13133: .ELSE
                   13134:        IFF  BL$RC,BLN09      RCBLK
                   13135: .FI
                   13136:        IFF  BL$SC,BLN10      SCBLK
                   13137:        ESW                   END OF JUMP TABLE ON BLOCK TYPE
                   13138:        EJC
                   13139: *
                   13140: *      BLKLN (CONTINUED)
                   13141: *
                   13142: *      HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
                   13143: *
                   13144: BLN00  MOV  1(XR),WA         LOAD LENGTH
                   13145:        EXI                   RETURN TO BLKLN CALLER
                   13146: *
                   13147: *      HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
                   13148: *
                   13149: BLN01  MOV  2(XR),WA         LOAD LENGTH FROM THIRD WORD
                   13150:        EXI                   RETURN TO BLKLN CALLER
                   13151: *
                   13152: *      HERE FOR TWO WORD BLOCKS (P0,SE)
                   13153: *
                   13154: BLN02  MOV  *NUM02,WA        LOAD LENGTH (TWO WORDS)
                   13155:        EXI                   RETURN TO BLKLN CALLER
                   13156: *
                   13157: *      HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
                   13158: *
                   13159: BLN03  MOV  *NUM03,WA        LOAD LENGTH (THREE WORDS)
                   13160:        EXI                   RETURN TO BLKLN CALLER
                   13161: *
                   13162: *      HERE FOR FOUR WORD BLOCKS (P2,TE,BC)
                   13163: *
                   13164: BLN04  MOV  *NUM04,WA        LOAD LENGTH (FOUR WORDS)
                   13165:        EXI                   RETURN TO BLKLN CALLER
                   13166: *
                   13167: *      HERE FOR FIVE WORD BLOCKS (FF,TR)
                   13168: *
                   13169: BLN05  MOV  *NUM05,WA        LOAD LENGTH
                   13170:        EXI                   RETURN TO BLKLN CALLER
                   13171:        EJC
                   13172: *
                   13173: *      BLKLN (CONTINUED)
                   13174: *
                   13175: *      HERE FOR CTBLK
                   13176: *
                   13177: BLN06  MOV  *CTSI$,WA        SET SIZE OF CTBLK
                   13178:        EXI                   RETURN TO BLKLN CALLER
                   13179: *
                   13180: *      HERE FOR ICBLK
                   13181: *
                   13182: BLN07  MOV  *ICSI$,WA        SET SIZE OF ICBLK
                   13183:        EXI                   RETURN TO BLKLN CALLER
                   13184: *
                   13185: *      HERE FOR PDBLK
                   13186: *
                   13187: BLN08  MOV  PDDFP(XR),XL     POINT TO DFBLK
                   13188:        MOV  DFPDL(XL),WA     LOAD PDBLK LENGTH FROM DFBLK
                   13189:        EXI                   RETURN TO BLKLN CALLER
                   13190: .IF    .CNRA
                   13191: .ELSE
                   13192: *
                   13193: *      HERE FOR RCBLK
                   13194: *
                   13195: BLN09  MOV  *RCSI$,WA        SET SIZE OF RCBLK
                   13196:        EXI                   RETURN TO BLKLN CALLER
                   13197: .FI
                   13198: *
                   13199: *      HERE FOR SCBLK
                   13200: *
                   13201: BLN10  MOV  SCLEN(XR),WA     LOAD LENGTH IN CHARACTERS
                   13202:        CTB  WA,SCSI$         CALCULATE LENGTH IN BYTES
                   13203:        EXI                   RETURN TO BLKLN CALLER
                   13204: .IF    .CNBF
                   13205: .ELSE
                   13206: *
                   13207: *      HERE FOR BFBLK
                   13208: *
                   13209: BLN11  MOV  BFALC(XR),WA     GET ALLOCATION IN BYTES
                   13210:        CTB  WA,BFSI$         CALCULATE LENGTH IN BYTES
                   13211:        EXI                   RETURN TO BLKLN CALLER
                   13212: .FI
                   13213:        ENP                   END PROCEDURE BLKLN
                   13214:        EJC
                   13215: *
                   13216: *      COPYB -- COPY A BLOCK
                   13217: *
                   13218: *      (XS)                  BLOCK TO BE COPIED
                   13219: *      JSR  COPYB            CALL TO COPY BLOCK
                   13220: *      PPM  LOC              RETURN IF BLOCK HAS NO IDVAL FIELD
                   13221: *                            NORMAL RETURN IF IDVAL FIELD
                   13222: *      (XR)                  COPY OF BLOCK
                   13223: *      (XS)                  POPPED
                   13224: *      (XL,WA,WB,WC)         DESTROYED
                   13225: *
                   13226: COPYB  PRC  N,1              ENTRY POINT
                   13227:        MOV  (XS),XR          LOAD ARGUMENT
                   13228:        BEQ  XR,=NULLS,COP10  RETURN ARGUMENT IF IT IS NULL
                   13229:        MOV  (XR),WA          ELSE LOAD TYPE WORD
                   13230:        MOV  WA,WB            COPY TYPE WORD
                   13231:        JSR  BLKLN            GET LENGTH OF ARGUMENT BLOCK
                   13232:        MOV  XR,XL            COPY POINTER
                   13233:        JSR  ALLOC            ALLOCATE BLOCK OF SAME SIZE
                   13234:        MOV  XR,(XS)          STORE POINTER TO COPY
                   13235:        MVW                   COPY CONTENTS OF OLD BLOCK TO NEW
                   13236:        MOV  (XS),XR          RELOAD POINTER TO START OF COPY
                   13237:        BEQ  WB,=B$TBT,COP05  JUMP IF TABLE
                   13238:        BEQ  WB,=B$VCT,COP01  JUMP IF VECTOR
                   13239:        BEQ  WB,=B$PDT,COP01  JUMP IF PROGRAM DEFINED
                   13240: .IF    .CNBF
                   13241: .ELSE
                   13242:        BEQ  WB,=B$BCT,COP11  JUMP IF BUFFER
                   13243: .FI
                   13244:        BNE  WB,=B$ART,COP10  RETURN COPY IF NOT ARRAY
                   13245: *
                   13246: *      HERE FOR ARRAY (ARBLK)
                   13247: *
                   13248:        ADD  AROFS(XR),XR     POINT TO PROTOTYPE FIELD
                   13249:        BRN  COP02            JUMP TO MERGE
                   13250: *
                   13251: *      HERE FOR VECTOR, PROGRAM DEFINED
                   13252: *
                   13253: COP01  ADD  *PDFLD,XR        POINT TO PDFLD = VCVLS
                   13254: *
                   13255: *      MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
                   13256: *      BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
                   13257: *
                   13258: COP02  MOV  (XR),XL          LOAD NEXT POINTER
                   13259: *
                   13260: *      LOOP TO GET VALUE AT END OF TRBLK CHAIN
                   13261: *
                   13262: COP03  BNE  (XL),=B$TRT,COP04 JUMP IF NOT TRAPPED
                   13263:        MOV  TRVAL(XL),XL     ELSE POINT TO NEXT VALUE
                   13264:        BRN  COP03            AND LOOP BACK
                   13265:        EJC
                   13266: *
                   13267: *      COPYB (CONTINUED)
                   13268: *
                   13269: *      HERE WITH UNTRAPPED VALUE IN XL
                   13270: *
                   13271: COP04  MOV  XL,(XR)+         STORE REAL VALUE, BUMP POINTER
                   13272:        BNE  XR,DNAMP,COP02   LOOP BACK IF MORE TO GO
                   13273:        BRN  COP09            ELSE JUMP TO EXIT
                   13274: *
                   13275: *      HERE TO COPY A TABLE
                   13276: *
                   13277: COP05  ZER  IDVAL(XR)        ZERO ID TO STOP DUMP BLOWING UP
                   13278:        MOV  *TESI$,WA        SET SIZE OF TEBLK
                   13279:        MOV  *TBBUK,WC        SET INITIAL OFFSET
                   13280: *
                   13281: *      LOOP THROUGH BUCKETS IN TABLE
                   13282: *
                   13283: COP06  MOV  (XS),XR          LOAD TABLE POINTER
                   13284:        BEQ  WC,TBLEN(XR),COP09 JUMP TO EXIT IF ALL DONE
                   13285:        ADD  WC,XR            ELSE POINT TO NEXT BUCKET HEADER
                   13286:        ICA  WC               BUMP OFFSET
                   13287:        SUB  *TENXT,XR        SUBTRACT LINK OFFSET TO MERGE
                   13288: *
                   13289: *      LOOP THROUGH TEBLKS ON ONE CHAIN
                   13290: *
                   13291: COP07  MOV  TENXT(XR),XL     LOAD POINTER TO NEXT TEBLK
                   13292:        MOV  (XS),TENXT(XR)   SET END OF CHAIN POINTER IN CASE
                   13293:        BEQ  (XL),=B$TBT,COP06 BACK FOR NEXT BUCKET IF CHAIN END
                   13294:        MOV  XR,-(XS)         ELSE STACK PTR TO PREVIOUS BLOCK
                   13295:        MOV  *TESI$,WA        SET SIZE OF TEBLK
                   13296:        JSR  ALLOC            ALLOCATE NEW TEBLK
                   13297:        MOV  XR,WB            SAVE PTR TO NEW TEBLK
                   13298:        MVW                   COPY OLD TEBLK TO NEW TEBLK
                   13299:        MOV  WB,XR            RESTORE POINTER TO NEW TEBLK
                   13300:        MOV  (XS)+,XL         RESTORE POINTER TO PREVIOUS BLOCK
                   13301:        MOV  XR,TENXT(XL)     LINK NEW BLOCK TO PREVIOUS
                   13302:        MOV  XR,XL            COPY POINTER TO NEW BLOCK
                   13303: *
                   13304: *      LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
                   13305: *
                   13306: COP08  MOV  TEVAL(XL),XL     LOAD VALUE
                   13307:        BEQ  (XL),=B$TRT,COP08 LOOP BACK IF TRAPPED
                   13308:        MOV  XL,TEVAL(XR)     STORE UNTRAPPED VALUE IN TEBLK
                   13309:        BRN  COP07            BACK FOR NEXT TEBLK
                   13310: *
                   13311: *      COMMON EXIT POINT
                   13312: *
                   13313: COP09  MOV  (XS)+,XR         LOAD POINTER TO BLOCK
                   13314:        EXI                   RETURN
                   13315: *
                   13316: *      ALTERNATIVE RETURN
                   13317: *
                   13318: COP10  EXI  1                RETURN
                   13319:        EJC
                   13320: .IF    .CNBF
                   13321: .ELSE
                   13322: *
                   13323: *      HERE TO COPY BUFFER
                   13324: *
                   13325: COP11  MOV  BCBUF(XR),XL     GET BFBLK PTR
                   13326:        MOV  BFALC(XL),WA     GET ALLOCATION
                   13327:        CTB  WA,BFSI$         SET TOTAL SIZE
                   13328:        MOV  XR,XL            SAVE BCBLK PTR
                   13329:        JSR  ALLOC            ALLOCATE BFBLK
                   13330:        MOV  BCBUF(XL),WB     GET OLD BFBLK
                   13331:        MOV  XR,BCBUF(XL)     SET POINTER TO NEW BFBLK
                   13332:        MOV  WB,XL            POINT TO OLD BFBLK
                   13333:        MVW                   COPY BFBLK TOO
                   13334:        ZER  XL               CLEAR RUBBISH PTR
                   13335:        BRN  COP09            BRANCH TO EXIT
                   13336: .FI
                   13337:        ENP                   END PROCEDURE COPYB
                   13338: *
                   13339: *      CDGCG -- GENERATE CODE FOR COMPLEX GOTO
                   13340: *
                   13341: *      USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
                   13342: *
                   13343: *      (WB)                  MUST BE COLLECTABLE
                   13344: *      (XR)                  EXPRESSION POINTER
                   13345: *      JSR  CDGCG            CALL TO GENERATE COMPLEX GOTO
                   13346: *      (XL,XR,WA)            DESTROYED
                   13347: *
                   13348: CDGCG  PRC  E,0              ENTRY POINT
                   13349:        MOV  CMOPN(XR),XL     GET UNARY GOTO OPERATOR
                   13350:        MOV  CMROP(XR),XR     POINT TO GOTO OPERAND
                   13351:        BEQ  XL,=OPDVD,CDGC2  JUMP IF DIRECT GOTO
                   13352:        JSR  CDGNM            GENERATE OPND BY NAME IF NOT DIRECT
                   13353: *
                   13354: *      RETURN POINT
                   13355: *
                   13356: CDGC1  MOV  XL,WA            GOTO OPERATOR
                   13357:        JSR  CDWRD            GENERATE IT
                   13358:        EXI                   RETURN TO CALLER
                   13359: *
                   13360: *      DIRECT GOTO
                   13361: *
                   13362: CDGC2  JSR  CDGVL            GENERATE OPERAND BY VALUE
                   13363:        BRN  CDGC1            MERGE TO RETURN
                   13364:        ENP                   END PROCEDURE CDGCG
                   13365:        EJC
                   13366: *
                   13367: *      CDGEX -- BUILD EXPRESSION BLOCK
                   13368: *
                   13369: *      CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
                   13370: *      EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
                   13371: *
                   13372: *      (WC)                  SOME COLLECTABLE VALUE
                   13373: *      (WB)                  INTEGER IN RANGE 0 LE X LE MXLEN
                   13374: *      (XL)                  PTR TO EXPRESSION TREE
                   13375: *      JSR  CDGEX            CALL TO BUILD EXPRESSION
                   13376: *      (XR)                  PTR TO SEBLK OR EXBLK
                   13377: *      (XL,WA,WB)            DESTROYED
                   13378: *
                   13379: CDGEX  PRC  R,0              ENTRY POINT, RECURSIVE
                   13380:        BLO  (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE
                   13381: *
                   13382: *      HERE FOR NATURAL VARIABLE, BUILD SEBLK
                   13383: *
                   13384:        MOV  *SESI$,WA        SET SIZE OF SEBLK
                   13385:        JSR  ALLOC            ALLOCATE SPACE FOR SEBLK
                   13386:        MOV  =B$SEL,(XR)      SET TYPE WORD
                   13387:        MOV  XL,SEVAR(XR)     STORE VRBLK POINTER
                   13388:        EXI                   RETURN TO CDGEX CALLER
                   13389: *
                   13390: *      HERE IF NOT VARIABLE, BUILD EXBLK
                   13391: *
                   13392: CDGX1  MOV  XL,XR            COPY TREE POINTER
                   13393:        MOV  WC,-(XS)         SAVE WC
                   13394:        MOV  CWCOF,XL         SAVE CURRENT OFFSET
                   13395:        MOV  (XR),WA          GET TYPE WORD
                   13396:        BNE  WA,=B$CMT,CDGX2  CALL BY VALUE IF NOT CMBLK
                   13397:        BGE  CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE
                   13398:        EJC
                   13399: *
                   13400: *      CDGEX (CONTINUED)
                   13401: *
                   13402: *      HERE IF EXPRESSION CAN BE EVALUATED BY NAME
                   13403: *
                   13404:        JSR  CDGNM            GENERATE CODE BY NAME
                   13405:        MOV  =ORNM$,WA        LOAD RETURN BY NAME WORD
                   13406:        BRN  CDGX3            MERGE WITH VALUE CASE
                   13407: *
                   13408: *      HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
                   13409: *
                   13410: CDGX2  JSR  CDGVL            GENERATE CODE BY VALUE
                   13411:        MOV  =ORVL$,WA        LOAD RETURN BY VALUE WORD
                   13412: *
                   13413: *      MERGE HERE TO CONSTRUCT EXBLK
                   13414: *
                   13415: CDGX3  JSR  CDWRD            GENERATE RETURN WORD
                   13416:        JSR  EXBLD            BUILD EXBLK
                   13417:        MOV  (XS)+,WC         RESTORE WC
                   13418:        EXI                   RETURN TO CDGEX CALLER
                   13419:        ENP                   END PROCEDURE CDGEX
                   13420:        EJC
                   13421: *
                   13422: *      CDGNM -- GENERATE CODE BY NAME
                   13423: *
                   13424: *      CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
                   13425: *      GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
                   13426: *      DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
                   13427: *      TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
                   13428: *
                   13429: *      CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
                   13430: *      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
                   13431: *
                   13432: *      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
                   13433: *      (XR)                  PTR TO TREE GENERATED BY EXPAN
                   13434: *      (WC)                  CONSTANT FLAG (SEE BELOW)
                   13435: *      JSR  CDGNM            CALL TO GENERATE CODE BY NAME
                   13436: *      (XR,WA)               DESTROYED
                   13437: *      (WC)                  SET NON-ZERO IF NON-CONSTANT
                   13438: *
                   13439: *      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
                   13440: *      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
                   13441: *      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
                   13442: *
                   13443: *      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
                   13444: *
                   13445: CDGNM  PRC  R,0              ENTRY POINT, RECURSIVE
                   13446:        MOV  XL,-(XS)         SAVE ENTRY XL
                   13447:        MOV  WB,-(XS)         SAVE ENTRY WB
                   13448:        CHK                   CHECK FOR STACK OVERFLOW
                   13449:        MOV  (XR),WA          LOAD TYPE WORD
                   13450:        BEQ  WA,=B$CMT,CGN04  JUMP IF CMBLK
                   13451:        BHI  WA,=B$VR$,CGN02  JUMP IF SIMPLE VARIABLE
                   13452: *
                   13453: *      MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
                   13454: *
                   13455: CGN01  ERB  212,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED
                   13456: *
                   13457: *      HERE FOR NATURAL VARIABLE REFERENCE
                   13458: *
                   13459: CGN02  MOV  =OLVN$,WA        LOAD VARIABLE LOAD CALL
                   13460:        JSR  CDWRD            GENERATE IT
                   13461:        MOV  XR,WA            COPY VRBLK POINTER
                   13462:        JSR  CDWRD            GENERATE VRBLK POINTER
                   13463:        EJC
                   13464: *
                   13465: *      CDGNM (CONTINUED)
                   13466: *
                   13467: *      HERE TO EXIT WITH WC SET CORRECTLY
                   13468: *
                   13469: CGN03  MOV  (XS)+,WB         RESTORE ENTRY WB
                   13470:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   13471:        EXI                   RETURN TO CDGNM CALLER
                   13472: *
                   13473: *      HERE FOR CMBLK
                   13474: *
                   13475: CGN04  MOV  XR,XL            COPY CMBLK POINTER
                   13476:        MOV  CMTYP(XR),XR     LOAD CMBLK TYPE
                   13477:        BGE  XR,=C$$NM,CGN01  ERROR IF NOT NAME OPERAND
                   13478:        BSW  XR,C$$NM         ELSE SWITCH ON TYPE
                   13479:        IFF  C$ARR,CGN05      ARRAY REFERENCE
                   13480:        IFF  C$FNC,CGN08      FUNCTION CALL
                   13481:        IFF  C$DEF,CGN09      DEFERRED EXPRESSION
                   13482:        IFF  C$IND,CGN10      INDIRECT REFERENCE
                   13483:        IFF  C$KEY,CGN11      KEYWORD REFERENCE
                   13484:        IFF  C$UBO,CGN08      UNDEFINED BINARY OP
                   13485:        IFF  C$UUO,CGN08      UNDEFINED UNARY OP
                   13486:        ESW                   END SWITCH ON CMBLK TYPE
                   13487: *
                   13488: *      HERE TO GENERATE CODE FOR ARRAY REFERENCE
                   13489: *
                   13490: CGN05  MOV  *CMOPN,WB        POINT TO ARRAY OPERAND
                   13491: *
                   13492: *      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
                   13493: *
                   13494: CGN06  JSR  CMGEN            GENERATE CODE FOR NEXT OPERAND
                   13495:        MOV  CMLEN(XL),WC     LOAD LENGTH OF CMBLK
                   13496:        BLT  WB,WC,CGN06      LOOP TILL ALL GENERATED
                   13497: *
                   13498: *      GENERATE APPROPRIATE ARRAY CALL
                   13499: *
                   13500:        MOV  =OAON$,WA        LOAD ONE-SUBSCRIPT CASE CALL
                   13501:        BEQ  WC,*CMAR1,CGN07  JUMP TO EXIT IF ONE SUBSCRIPT CASE
                   13502:        MOV  =OAMN$,WA        ELSE LOAD MULTI-SUBSCRIPT CASE CALL
                   13503:        JSR  CDWRD            GENERATE CALL
                   13504:        MOV  WC,WA            COPY CMBLK LENGTH
                   13505:        BTW  WA               CONVERT TO WORDS
                   13506:        SUB  =CMVLS,WA        CALCULATE NUMBER OF SUBSCRIPTS
                   13507:        EJC
                   13508: *
                   13509: *      CDGNM (CONTINUED)
                   13510: *
                   13511: *      HERE TO EXIT GENERATING WORD (NON-CONSTANT)
                   13512: *
                   13513: CGN07  MNZ  WC               SET RESULT NON-CONSTANT
                   13514:        JSR  CDWRD            GENERATE WORD
                   13515:        BRN  CGN03            BACK TO EXIT
                   13516: *
                   13517: *      HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
                   13518: *
                   13519: CGN08  MOV  XL,XR            COPY CMBLK POINTER
                   13520:        JSR  CDGVL            GEN CODE BY VALUE FOR CALL
                   13521:        MOV  =OFNE$,WA        GET EXTRA CALL FOR BY NAME
                   13522:        BRN  CGN07            BACK TO GENERATE AND EXIT
                   13523: *
                   13524: *      HERE TO GENERATE CODE FOR DEFERED EXPRESSION
                   13525: *
                   13526: CGN09  MOV  CMROP(XL),XR     CHECK IF VARIABLE
                   13527:        BHI  (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR
                   13528:        MOV  XR,XL            COPY PTR TO EXPRESSION TREE
                   13529:        JSR  CDGEX            ELSE BUILD EXBLK
                   13530:        MOV  =OLEX$,WA        SET CALL TO LOAD EXPR BY NAME
                   13531:        JSR  CDWRD            GENERATE IT
                   13532:        MOV  XR,WA            COPY EXBLK POINTER
                   13533:        JSR  CDWRD            GENERATE EXBLK POINTER
                   13534:        BRN  CGN03            BACK TO EXIT
                   13535: *
                   13536: *      HERE TO GENERATE CODE FOR INDIRECT REFERENCE
                   13537: *
                   13538: CGN10  MOV  CMROP(XL),XR     GET OPERAND
                   13539:        JSR  CDGVL            GENERATE CODE BY VALUE FOR IT
                   13540:        MOV  =OINN$,WA        LOAD CALL FOR INDIRECT BY NAME
                   13541:        BRN  CGN12            MERGE
                   13542: *
                   13543: *      HERE TO GENERATE CODE FOR KEYWORD REFERENCE
                   13544: *
                   13545: CGN11  MOV  CMROP(XL),XR     GET OPERAND
                   13546:        JSR  CDGNM            GENERATE CODE BY NAME FOR IT
                   13547:        MOV  =OKWN$,WA        LOAD CALL FOR KEYWORD BY NAME
                   13548: *
                   13549: *      KEYWORD, INDIRECT MERGE HERE
                   13550: *
                   13551: CGN12  JSR  CDWRD            GENERATE CODE FOR OPERATOR
                   13552:        BRN  CGN03            EXIT
                   13553:        ENP                   END PROCEDURE CDGNM
                   13554:        EJC
                   13555: *
                   13556: *      CDGVL -- GENERATE CODE BY VALUE
                   13557: *
                   13558: *      CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
                   13559: *      GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
                   13560: *      DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
                   13561: *      TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
                   13562: *
                   13563: *      CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
                   13564: *      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
                   13565: *
                   13566: *      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
                   13567: *      (XR)                  PTR TO TREE GENERATED BY EXPAN
                   13568: *      (WC)                  CONSTANT FLAG (SEE BELOW)
                   13569: *      JSR  CDGVL            CALL TO GENERATE CODE BY VALUE
                   13570: *      (XR,WA)               DESTROYED
                   13571: *      (WC)                  SET NON-ZERO IF NON-CONSTANT
                   13572: *
                   13573: *      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
                   13574: *      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
                   13575: *      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
                   13576: *
                   13577: *      IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
                   13578: *      ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
                   13579: *
                   13580: *      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
                   13581: *
                   13582: CDGVL  PRC  R,0              ENTRY POINT, RECURSIVE
                   13583:        MOV  (XR),WA          LOAD TYPE WORD
                   13584:        BEQ  WA,=B$CMT,CGV01  JUMP IF CMBLK
                   13585:        BLT  WA,=B$VRA,CGV00  JUMP IF ICBLK, RCBLK, SCBLK
                   13586:        BNZ  VRLEN(XR),CGVL0  JUMP IF NOT SYSTEM VARIABLE
                   13587:        MOV  XR,-(XS)         STACK XR
                   13588:        MOV  VRSVP(XR),XR     POINT TO SVBLK
                   13589:        MOV  SVBIT(XR),WA     GET SVBLK PROPERTY BITS
                   13590:        MOV  (XS)+,XR         RECOVER XR
                   13591:        ANB  BTCKW,WA         CHECK IF CONSTANT KEYWORD
                   13592:        NZB  WA,CGV00         JUMP IF CONSTANT KEYWORD
                   13593: *
                   13594: *      HERE FOR VARIABLE VALUE REFERENCE
                   13595: *
                   13596: CGVL0  MNZ  WC               INDICATE NON-CONSTANT VALUE
                   13597: *
                   13598: *      MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
                   13599: *      AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
                   13600: *
                   13601: CGV00  MOV  XR,WA            COPY PTR TO VAR OR CONSTANT
                   13602:        JSR  CDWRD            GENERATE AS CODE WORD
                   13603:        EXI                   RETURN TO CALLER
                   13604:        EJC
                   13605: *
                   13606: *      CDGVL (CONTINUED)
                   13607: *
                   13608: *      HERE FOR TREE NODE (CMBLK)
                   13609: *
                   13610: CGV01  MOV  WB,-(XS)         SAVE ENTRY WB
                   13611:        MOV  XL,-(XS)         SAVE ENTRY XL
                   13612:        MOV  WC,-(XS)         SAVE ENTRY CONSTANT FLAG
                   13613:        MOV  CWCOF,-(XS)      SAVE INITIAL CODE OFFSET
                   13614:        CHK                   CHECK FOR STACK OVERFLOW
                   13615: *
                   13616: *      PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE
                   13617: *      VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO
                   13618: *      START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
                   13619: *      CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
                   13620: *      THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
                   13621: *
                   13622:        MOV  XR,XL            COPY CMBLK POINTER
                   13623:        MOV  CMTYP(XR),XR     LOAD CMBLK TYPE
                   13624:        MOV  CSWNO,WC         RESET CONSTANT FLAG
                   13625:        BLE  XR,=C$PR$,CGV02  JUMP IF NOT PREDICATE VALUE
                   13626:        MNZ  WC               ELSE FORCE NON-CONSTANT CASE
                   13627: *
                   13628: *      HERE WITH WC SET APPROPRIATELY
                   13629: *
                   13630: CGV02  BSW  XR,C$$NV         SWITCH TO APPROPRIATE GENERATOR
                   13631:        IFF  C$ARR,CGV03      ARRAY REFERENCE
                   13632:        IFF  C$FNC,CGV05      FUNCTION CALL
                   13633:        IFF  C$DEF,CGV14      DEFERRED EXPRESSION
                   13634:        IFF  C$SEL,CGV15      SELECTION
                   13635:        IFF  C$IND,CGV31      INDIRECT REFERENCE
                   13636:        IFF  C$KEY,CGV27      KEYWORD REFERENCE
                   13637:        IFF  C$UBO,CGV29      UNDEFINED BINOP
                   13638:        IFF  C$UUO,CGV30      UNDEFINED UNOP
                   13639:        IFF  C$BVL,CGV18      BINOPS WITH VAL OPDS
                   13640:        IFF  C$ALT,CGV18      ALTERNATION
                   13641:        IFF  C$UVL,CGV19      UNOPS WITH VALU OPND
                   13642:        IFF  C$ASS,CGV21      ASSIGNMENT
                   13643:        IFF  C$CNC,CGV24      CONCATENATION
                   13644:        IFF  C$CNP,CGV24      CONCATENATION (NOT PATTERN MATCH)
                   13645:        IFF  C$UNM,CGV27      UNOPS WITH NAME OPND
                   13646:        IFF  C$BVN,CGV26      BINARY $ AND .
                   13647:        IFF  C$INT,CGV31      INTERROGATION
                   13648:        IFF  C$NEG,CGV28      NEGATION
                   13649:        IFF  C$PMT,CGV18      PATTERN MATCH
                   13650:        ESW                   END SWITCH ON CMBLK TYPE
                   13651:        EJC
                   13652: *
                   13653: *      CDGVL (CONTINUED)
                   13654: *
                   13655: *      HERE TO GENERATE CODE FOR ARRAY REFERENCE
                   13656: *
                   13657: CGV03  MOV  *CMOPN,WB        SET OFFSET TO ARRAY OPERAND
                   13658: *
                   13659: *      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
                   13660: *
                   13661: CGV04  JSR  CMGEN            GEN VALUE CODE FOR NEXT OPERAND
                   13662:        MOV  CMLEN(XL),WC     LOAD CMBLK LENGTH
                   13663:        BLT  WB,WC,CGV04      LOOP BACK IF MORE TO GO
                   13664: *
                   13665: *      GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
                   13666: *
                   13667:        MOV  =OAOV$,WA        SET ONE SUBSCRIPT CALL IN CASE
                   13668:        BEQ  WC,*CMAR1,CGV32  JUMP TO EXIT IF 1-SUB CASE
                   13669:        MOV  =OAMV$,WA        ELSE SET CALL FOR MULTI-SUBSCRIPTS
                   13670:        JSR  CDWRD            GENERATE CALL
                   13671:        MOV  WC,WA            COPY LENGTH OF CMBLK
                   13672:        SUB  *CMVLS,WA        SUBTRACT STANDARD LENGTH
                   13673:        BTW  WA               GET NUMBER OF WORDS
                   13674:        BRN  CGV32            JUMP TO GENERATE SUBSCRIPT COUNT
                   13675: *
                   13676: *      HERE TO GENERATE CODE FOR FUNCTION CALL
                   13677: *
                   13678: CGV05  MOV  *CMVLS,WB        SET OFFSET TO FIRST ARGUMENT
                   13679: *
                   13680: *      LOOP TO GENERATE CODE FOR ARGUMENTS
                   13681: *
                   13682: CGV06  BEQ  WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED
                   13683:        JSR  CMGEN            ELSE GEN VALUE CODE FOR NEXT ARG
                   13684:        BRN  CGV06            BACK TO GENERATE NEXT ARGUMENT
                   13685: *
                   13686: *      HERE TO GENERATE ACTUAL FUNCTION CALL
                   13687: *
                   13688: CGV07  SUB  *CMVLS,WB        GET NUMBER OF ARG PTRS (BYTES)
                   13689:        BTW  WB               CONVERT BYTES TO WORDS
                   13690:        MOV  CMOPN(XL),XR     LOAD FUNCTION VRBLK POINTER
                   13691:        BNZ  VRLEN(XR),CGV12  JUMP IF NOT SYSTEM FUNCTION
                   13692:        MOV  VRSVP(XR),XL     LOAD SVBLK PTR IF SYSTEM VAR
                   13693:        MOV  SVBIT(XL),WA     LOAD BIT MASK
                   13694:        ANB  BTFFC,WA         TEST FOR FAST FUNCTION CALL ALLOWED
                   13695:        ZRB  WA,CGV12         JUMP IF NOT
                   13696:        EJC
                   13697: *
                   13698: *      CDGVL (CONTINUED)
                   13699: *
                   13700: *      HERE IF FAST FUNCTION CALL IS ALLOWED
                   13701: *
                   13702:        MOV  SVBIT(XL),WA     RELOAD BIT INDICATORS
                   13703:        ANB  BTPRE,WA         TEST FOR PREEVALUATION OK
                   13704:        NZB  WA,CGV08         JUMP IF PREEVALUATION PERMITTED
                   13705:        MNZ  WC               ELSE SET RESULT NON-CONSTANT
                   13706: *
                   13707: *      TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
                   13708: *
                   13709: CGV08  MOV  VRFNC(XR),XL     LOAD PTR TO SVFNC FIELD
                   13710:        MOV  FARGS(XL),WA     LOAD SVNAR FIELD VALUE
                   13711:        BEQ  WA,WB,CGV11      JUMP IF ARGUMENT COUNT IS CORRECT
                   13712:        BHI  WA,WB,CGV09      JUMP IF TOO FEW ARGUMENTS GIVEN
                   13713: *
                   13714: *      HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
                   13715: *
                   13716:        SUB  WA,WB            GET NUMBER OF EXTRA ARGS
                   13717:        LCT  WB,WB            SET AS COUNT TO CONTROL LOOP
                   13718:        MOV  =OPOP$,WA        SET POP CALL
                   13719:        BRN  CGV10            JUMP TO COMMON LOOP
                   13720: *
                   13721: *      HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
                   13722: *
                   13723: CGV09  SUB  WB,WA            GET NUMBER OF MISSING ARGUMENTS
                   13724:        LCT  WB,WA            LOAD AS COUNT TO CONTROL LOOP
                   13725:        MOV  =NULLS,WA        LOAD PTR TO NULL CONSTANT
                   13726: *
                   13727: *      LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
                   13728: *
                   13729: CGV10  JSR  CDWRD            GENERATE ONE CALL
                   13730:        BCT  WB,CGV10         LOOP TILL ALL GENERATED
                   13731: *
                   13732: *      HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
                   13733: *
                   13734: CGV11  MOV  XL,WA            COPY POINTER TO SVFNC FIELD
                   13735:        BRN  CGV36            JUMP TO GENERATE CALL
                   13736:        EJC
                   13737: *
                   13738: *      CDGVL (CONTINUED)
                   13739: *
                   13740: *      COME HERE IF FAST CALL IS NOT PERMITTED
                   13741: *
                   13742: CGV12  MOV  =OFNS$,WA        SET ONE ARG CALL IN CASE
                   13743:        BEQ  WB,=NUM01,CGV13  JUMP IF ONE ARG CASE
                   13744:        MOV  =OFNC$,WA        ELSE LOAD CALL FOR MORE THAN 1 ARG
                   13745:        JSR  CDWRD            GENERATE IT
                   13746:        MOV  WB,WA            COPY ARGUMENT COUNT
                   13747: *
                   13748: *      ONE ARG CASE MERGES HERE
                   13749: *
                   13750: CGV13  JSR  CDWRD            GENERATE =O$FNS OR ARG COUNT
                   13751:        MOV  XR,WA            COPY VRBLK POINTER
                   13752:        BRN  CGV32            JUMP TO GENERATE VRBLK PTR
                   13753: *
                   13754: *      HERE FOR DEFERRED EXPRESSION
                   13755: *
                   13756: CGV14  MOV  CMROP(XL),XL     POINT TO EXPRESSION TREE
                   13757:        JSR  CDGEX            BUILD EXBLK OR SEBLK
                   13758:        MOV  XR,WA            COPY BLOCK PTR
                   13759:        JSR  CDWRD            GENERATE PTR TO EXBLK OR SEBLK
                   13760:        BRN  CGV34            JUMP TO EXIT, CONSTANT TEST
                   13761: *
                   13762: *      HERE TO GENERATE CODE FOR SELECTION
                   13763: *
                   13764: CGV15  ZER  -(XS)            ZERO PTR TO CHAIN OF FORWARD JUMPS
                   13765:        ZER  -(XS)            ZERO PTR TO PREV O$SLC FORWARD PTR
                   13766:        MOV  *CMVLS,WB        POINT TO FIRST ALTERNATIVE
                   13767:        MOV  =OSLA$,WA        SET INITIAL CODE WORD
                   13768: *
                   13769: *      0(XS)                 IS THE OFFSET TO THE PREVIOUS WORD
                   13770: *                            WHICH REQUIRES FILLING IN WITH AN
                   13771: *                            OFFSET TO THE FOLLOWING O$SLC,O$SLD
                   13772: *
                   13773: *      1(XS)                 IS THE HEAD OF A CHAIN OF OFFSET
                   13774: *                            POINTERS INDICATING THOSE LOCATIONS
                   13775: *                            TO BE FILLED WITH OFFSETS PAST
                   13776: *                            THE END OF ALL THE ALTERNATIVES
                   13777: *
                   13778: CGV16  JSR  CDWRD            GENERATE O$SLC (O$SLA FIRST TIME)
                   13779:        MOV  CWCOF,(XS)       SET CURRENT LOC AS PTR TO FILL IN
                   13780:        JSR  CDWRD            GENERATE GARBAGE WORD THERE FOR NOW
                   13781:        JSR  CMGEN            GEN VALUE CODE FOR ALTERNATIVE
                   13782:        MOV  =OSLB$,WA        LOAD O$SLB POINTER
                   13783:        JSR  CDWRD            GENERATE O$SLB CALL
                   13784:        MOV  1(XS),WA         LOAD OLD CHAIN PTR
                   13785:        MOV  CWCOF,1(XS)      SET CURRENT LOC AS NEW CHAIN HEAD
                   13786:        JSR  CDWRD            GENERATE FORWARD CHAIN LINK
                   13787:        EJC
                   13788: *
                   13789: *      CDGVL (CONTINUED)
                   13790: *
                   13791: *      NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
                   13792: *
                   13793:        MOV  (XS),XR          LOAD OFFSET TO WORD TO PLUG
                   13794:        ADD  R$CCB,XR         POINT TO ACTUAL LOCATION TO PLUG
                   13795:        MOV  CWCOF,(XR)       PLUG PROPER OFFSET IN
                   13796:        MOV  =OSLC$,WA        LOAD O$SLC PTR FOR NEXT ALTERNATIVE
                   13797:        MOV  WB,XR            COPY OFFSET (DESTROY GARBAGE XR)
                   13798:        ICA  XR               BUMP EXTRA TIME FOR TEST
                   13799:        BLT  XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE
                   13800: *
                   13801: *      HERE TO GENERATE CODE FOR LAST ALTERNATIVE
                   13802: *
                   13803:        MOV  =OSLD$,WA        GET HEADER CALL
                   13804:        JSR  CDWRD            GENERATE O$SLD CALL
                   13805:        JSR  CMGEN            GENERATE CODE FOR LAST ALTERNATIVE
                   13806:        ICA  XS               POP OFFSET PTR
                   13807:        MOV  (XS)+,XR         LOAD CHAIN PTR
                   13808: *
                   13809: *      LOOP TO PLUG OFFSETS PAST STRUCTURE
                   13810: *
                   13811: CGV17  ADD  R$CCB,XR         MAKE NEXT PTR ABSOLUTE
                   13812:        MOV  (XR),WA          LOAD FORWARD PTR
                   13813:        MOV  CWCOF,(XR)       PLUG REQUIRED OFFSET
                   13814:        MOV  WA,XR            COPY FORWARD PTR
                   13815:        BNZ  WA,CGV17         LOOP BACK IF MORE TO GO
                   13816:        BRN  CGV33            ELSE JUMP TO EXIT (NOT CONSTANT)
                   13817: *
                   13818: *      HERE FOR BINARY OPS WITH VALUE OPERANDS
                   13819: *
                   13820: CGV18  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND POINTER
                   13821:        JSR  CDGVL            GEN VALUE CODE FOR LEFT OPERAND
                   13822: *
                   13823: *      HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
                   13824: *
                   13825: CGV19  MOV  CMROP(XL),XR     LOAD RIGHT (ONLY) OPERAND PTR
                   13826:        JSR  CDGVL            GEN CODE BY VALUE
                   13827:        EJC
                   13828: *
                   13829: *      CDGVL (CONTINUED)
                   13830: *
                   13831: *      MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
                   13832: *
                   13833: CGV20  MOV  CMOPN(XL),WA     LOAD OPERATOR CALL POINTER
                   13834:        BRN  CGV36            JUMP TO GENERATE IT WITH CONS TEST
                   13835: *
                   13836: *      HERE FOR ASSIGNMENT
                   13837: *
                   13838: CGV21  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND POINTER
                   13839:        BLO  (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE
                   13840: *
                   13841: *      HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
                   13842: *
                   13843:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
                   13844:        JSR  CDGVL            GENERATE CODE BY VALUE
                   13845:        MOV  CMLOP(XL),WA     RELOAD LEFT OPERAND VRBLK PTR
                   13846:        ADD  *VRSTO,WA        POINT TO VRSTO FIELD
                   13847:        BRN  CGV32            JUMP TO GENERATE STORE PTR
                   13848: *
                   13849: *      HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
                   13850: *
                   13851: CGV22  JSR  EXPAP            TEST FOR PATTERN MATCH ON LEFT SIDE
                   13852:        PPM  CGV23            JUMP IF NOT PATTERN MATCH
                   13853: *
                   13854: *      HERE FOR PATTERN REPLACEMENT
                   13855: *
                   13856:        MOV  CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE
                   13857:        MOV  CMLOP(XR),XR     LOAD SUBJECT PTR
                   13858:        JSR  CDGNM            GEN CODE BY NAME FOR SUBJECT
                   13859:        MOV  CMLOP(XL),XR     LOAD PATTERN PTR
                   13860:        JSR  CDGVL            GEN CODE BY VALUE FOR PATTERN
                   13861:        MOV  =OPMN$,WA        LOAD MATCH BY NAME CALL
                   13862:        JSR  CDWRD            GENERATE IT
                   13863:        MOV  CMROP(XL),XR     LOAD REPLACEMENT VALUE PTR
                   13864:        JSR  CDGVL            GEN CODE BY VALUE
                   13865:        MOV  =ORPL$,WA        LOAD REPLACE CALL
                   13866:        BRN  CGV32            JUMP TO GEN AND EXIT (NOT CONSTANT)
                   13867: *
                   13868: *      HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
                   13869: *
                   13870: CGV23  MNZ  WC               INHIBIT PRE-EVALUATION
                   13871:        JSR  CDGNM            GEN CODE BY NAME FOR LEFT SIDE
                   13872:        BRN  CGV31            MERGE WITH UNOP CIRCUIT
                   13873:        EJC
                   13874: *
                   13875: *      CDGVL (CONTINUED)
                   13876: *
                   13877: *      HERE FOR CONCATENATION
                   13878: *
                   13879: CGV24  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND PTR
                   13880:        BNE  (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK
                   13881:        MOV  CMTYP(XR),WB     LOAD CMBLK TYPE CODE
                   13882:        BEQ  WB,=C$INT,CGV25  SPECIAL CASE IF INTERROGATION
                   13883:        BEQ  WB,=C$NEG,CGV25  OR NEGATION
                   13884:        BNE  WB,=C$FNC,CGV18  ELSE ORDINARY BINOP IF NOT FUNCTION
                   13885:        MOV  CMOPN(XR),XR     ELSE LOAD FUNCTION VRBLK PTR
                   13886:        BNZ  VRLEN(XR),CGV18  ORDINARY BINOP IF NOT SYSTEM VAR
                   13887:        MOV  VRSVP(XR),XR     ELSE POINT TO SVBLK
                   13888:        MOV  SVBIT(XR),WA     LOAD BIT INDICATORS
                   13889:        ANB  BTPRD,WA         TEST FOR PREDICATE FUNCTION
                   13890:        ZRB  WA,CGV18         ORDINARY BINOP IF NOT
                   13891: *
                   13892: *      HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
                   13893: *
                   13894: CGV25  MOV  CMLOP(XL),XR     RELOAD LEFT ARG
                   13895:        JSR  CDGVL            GEN CODE BY VALUE
                   13896:        MOV  =OPOP$,WA        LOAD POP CALL
                   13897:        JSR  CDWRD            GENERATE IT
                   13898:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND
                   13899:        JSR  CDGVL            GEN CODE BY VALUE AS RESULT CODE
                   13900:        BRN  CGV33            EXIT (NOT CONSTANT)
                   13901: *
                   13902: *      HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
                   13903: *
                   13904: CGV26  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND
                   13905:        JSR  CDGVL            GEN CODE BY VALUE, MERGE
                   13906: *
                   13907: *      HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
                   13908: *
                   13909: CGV27  MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
                   13910:        JSR  CDGNM            GEN CODE BY NAME FOR RIGHT ARG
                   13911:        MOV  CMOPN(XL),XR     GET OPERATOR CODE WORD
                   13912:        BNE  (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE
                   13913:        EJC
                   13914: *
                   13915: *      CDGVL (CONTINUED)
                   13916: *
                   13917: *      HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
                   13918: *      THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
                   13919: *      THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
                   13920: *      NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
                   13921: *
                   13922:        BNZ  WC,CGV20         GEN CALL IF NON-CONSTANT (NOT VAR)
                   13923:        MNZ  WC               ELSE SET NON-CONSTANT IN CASE
                   13924:        MOV  CMROP(XL),XR     LOAD PTR TO OPERAND VRBLK
                   13925:        BNZ  VRLEN(XR),CGV20  GEN (NON-CONSTANT) IF NOT SYS VAR
                   13926:        MOV  VRSVP(XR),XR     ELSE LOAD PTR TO SVBLK
                   13927:        MOV  SVBIT(XR),WA     LOAD BIT MASK
                   13928:        ANB  BTCKW,WA         TEST FOR CONSTANT KEYWORD
                   13929:        ZRB  WA,CGV20         GO GEN IF NOT CONSTANT
                   13930:        ZER  WC               ELSE SET RESULT CONSTANT
                   13931:        BRN  CGV20            AND JUMP BACK TO GENERATE CALL
                   13932: *
                   13933: *      HERE TO GENERATE CODE FOR NEGATION
                   13934: *
                   13935: CGV28  MOV  =ONTA$,WA        GET INITIAL WORD
                   13936:        JSR  CDWRD            GENERATE IT
                   13937:        MOV  CWCOF,WB         SAVE NEXT OFFSET
                   13938:        JSR  CDWRD            GENERATE GUNK WORD FOR NOW
                   13939:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
                   13940:        JSR  CDGVL            GEN CODE BY VALUE
                   13941:        MOV  =ONTB$,WA        LOAD END OF EVALUATION CALL
                   13942:        JSR  CDWRD            GENERATE IT
                   13943:        MOV  WB,XR            COPY OFFSET TO WORD TO PLUG
                   13944:        ADD  R$CCB,XR         POINT TO ACTUAL WORD TO PLUG
                   13945:        MOV  CWCOF,(XR)       PLUG WORD WITH CURRENT OFFSET
                   13946:        MOV  =ONTC$,WA        LOAD FINAL CALL
                   13947:        BRN  CGV32            JUMP TO GENERATE IT (NOT CONSTANT)
                   13948: *
                   13949: *      HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
                   13950: *
                   13951: CGV29  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND PTR
                   13952:        JSR  CDGVL            GENERATE CODE BY VALUE
                   13953:        EJC
                   13954: *
                   13955: *      CDGVL (CONTINUED)
                   13956: *
                   13957: *      HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
                   13958: *
                   13959: CGV30  MOV  =C$UO$,WB        SET UNOP CODE + 1
                   13960:        SUB  CMTYP(XL),WB     SET NUMBER OF ARGS (1 OR 2)
                   13961: *
                   13962: *      MERGE HERE FOR UNDEFINED OPERATORS
                   13963: *
                   13964:        MOV  CMROP(XL),XR     LOAD RIGHT (ONLY) OPERAND POINTER
                   13965:        JSR  CDGVL            GEN VALUE CODE FOR RIGHT OPERAND
                   13966:        MOV  CMOPN(XL),XR     LOAD POINTER TO OPERATOR DV
                   13967:        MOV  DVOPN(XR),XR     LOAD POINTER OFFSET
                   13968:        WTB  XR               CONVERT WORD OFFSET TO BYTES
                   13969:        ADD  =R$UBA,XR        POINT TO PROPER FUNCTION PTR
                   13970:        SUB  *VRFNC,XR        SET STANDARD FUNCTION OFFSET
                   13971:        BRN  CGV12            MERGE WITH FUNCTION CALL CIRCUIT
                   13972: *
                   13973: *      HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
                   13974: *
                   13975: CGV31  MNZ  WC               SET NON CONSTANT
                   13976:        BRN  CGV19            MERGE
                   13977: *
                   13978: *      HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
                   13979: *
                   13980: CGV32  JSR  CDWRD            GENERATE WORD, MERGE
                   13981: *
                   13982: *      HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
                   13983: *
                   13984: CGV33  MNZ  WC               INDICATE RESULT IS NOT CONSTANT
                   13985: *
                   13986: *      COMMON EXIT POINT
                   13987: *
                   13988: CGV34  ICA  XS               POP INITIAL CODE OFFSET
                   13989:        MOV  (XS)+,WA         RESTORE OLD CONSTANT FLAG
                   13990:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   13991:        MOV  (XS)+,WB         RESTORE ENTRY WB
                   13992:        BNZ  WC,CGV35         JUMP IF NOT CONSTANT
                   13993:        MOV  WA,WC            ELSE RESTORE ENTRY CONSTANT FLAG
                   13994: *
                   13995: *      HERE TO RETURN AFTER DEALING WITH WC SETTING
                   13996: *
                   13997: CGV35  EXI                   RETURN TO CDGVL CALLER
                   13998: *
                   13999: *      EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
                   14000: *
                   14001: CGV36  JSR  CDWRD            GENERATE WORD
                   14002:        BNZ  WC,CGV34         JUMP TO EXIT IF NOT CONSTANT
                   14003:        EJC
                   14004: *
                   14005: *      CDGVL (CONTINUED)
                   14006: *
                   14007: *      HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
                   14008: *
                   14009:        MOV  =ORVL$,WA        LOAD CALL TO RETURN VALUE
                   14010:        JSR  CDWRD            GENERATE IT
                   14011:        MOV  (XS),XL          LOAD INITIAL CODE OFFSET
                   14012:        JSR  EXBLD            BUILD EXBLK FOR EXPRESSION
                   14013:        ZER  WB               SET TO EVALUATE BY VALUE
                   14014:        JSR  EVALX            EVALUATE EXPRESSION
                   14015:        PPM                   SHOULD NOT FAIL
                   14016:        MOV  (XR),WA          LOAD TYPE WORD OF RESULT
                   14017:        BLO  WA,=P$AAA,CGV37  JUMP IF NOT PATTERN
                   14018:        MOV  =OLPT$,WA        ELSE LOAD SPECIAL PATTERN LOAD CALL
                   14019:        JSR  CDWRD            GENERATE IT
                   14020: *
                   14021: *      MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
                   14022: *
                   14023: CGV37  MOV  XR,WA            COPY CONSTANT POINTER
                   14024:        JSR  CDWRD            GENERATE PTR
                   14025:        ZER  WC               SET RESULT CONSTANT
                   14026:        BRN  CGV34            JUMP BACK TO EXIT
                   14027:        ENP                   END PROCEDURE CDGVL
                   14028:        EJC
                   14029: *
                   14030: *      CDWRD -- GENERATE ONE WORD OF CODE
                   14031: *
                   14032: *      CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
                   14033: *      CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
                   14034: *      IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
                   14035: *      THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
                   14036: *      AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
                   14037: *      EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
                   14038: *
                   14039: *      (WA)                  WORD TO BE GENERATED
                   14040: *      JSR  CDWRD            CALL TO GENERATE WORD
                   14041: *
                   14042: CDWRD  PRC  E,0              ENTRY POINT
                   14043:        MOV  XR,-(XS)         SAVE ENTRY XR
                   14044:        MOV  WA,-(XS)         SAVE CODE WORD TO BE GENERATED
                   14045: *
                   14046: *      MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
                   14047: *
                   14048: CDWD1  MOV  R$CCB,XR         LOAD PTR TO CCBLK BEING BUILT
                   14049:        BNZ  XR,CDWD2         JUMP IF BLOCK ALLOCATED
                   14050: *
                   14051: *      HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
                   14052: *
                   14053:        MOV  *E$CBS,WA        LOAD INITIAL LENGTH
                   14054:        JSR  ALLOC            ALLOCATE CCBLK
                   14055:        MOV  =B$CCT,(XR)      STORE TYPE WORD
                   14056:        MOV  *CCCOD,CWCOF     SET INITIAL OFFSET
                   14057:        MOV  WA,CCLEN(XR)     STORE BLOCK LENGTH
                   14058:        MOV  XR,R$CCB         STORE PTR TO NEW BLOCK
                   14059: *
                   14060: *      HERE WE HAVE A BLOCK WE CAN USE
                   14061: *
                   14062: CDWD2  MOV  CWCOF,WA         LOAD CURRENT OFFSET
                   14063:        ADD  *NUM04,WA        ADJUST FOR TEST (FOUR WORDS)
                   14064:        BLO  WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK
                   14065: *
                   14066: *      HERE IF NO ROOM IN CURRENT BLOCK
                   14067: *
                   14068:        BGE  WA,MXLEN,CDWD5   JUMP IF ALREADY AT MAX SIZE
                   14069:        ADD  *E$CBS,WA        ELSE GET NEW SIZE
                   14070:        MOV  XL,-(XS)         SAVE ENTRY XL
                   14071:        MOV  XR,XL            COPY POINTER
                   14072:        BLT  WA,MXLEN,CDWD3   JUMP IF NOT TOO LARGE
                   14073:        MOV  MXLEN,WA         ELSE RESET TO MAX ALLOWED SIZE
                   14074:        EJC
                   14075: *
                   14076: *      CDWRD (CONTINUED)
                   14077: *
                   14078: *      HERE WITH NEW BLOCK SIZE IN WA
                   14079: *
                   14080: CDWD3  JSR  ALLOC            ALLOCATE NEW BLOCK
                   14081:        MOV  XR,R$CCB         STORE POINTER TO NEW BLOCK
                   14082:        MOV  =B$CCT,(XR)+     STORE TYPE WORD IN NEW BLOCK
                   14083:        MOV  WA,(XR)+         STORE BLOCK LENGTH
                   14084:        ADD  *CCUSE,XL        POINT TO CCUSE,CCCOD FIELDS IN OLD
                   14085:        MOV  (XL),WA          LOAD CCUSE VALUE
                   14086:        MVW                   COPY USEFUL WORDS FROM OLD BLOCK
                   14087:        MOV  (XS)+,XL         RESTORE XL
                   14088:        BRN  CDWD1            MERGE BACK TO TRY AGAIN
                   14089: *
                   14090: *      HERE WITH ROOM IN CURRENT BLOCK
                   14091: *
                   14092: CDWD4  MOV  CWCOF,WA         LOAD CURRENT OFFSET
                   14093:        ICA  WA               GET NEW OFFSET
                   14094:        MOV  WA,CWCOF         STORE NEW OFFSET
                   14095:        MOV  WA,CCUSE(XR)     STORE IN CCBLK FOR GBCOL
                   14096:        DCA  WA               RESTORE PTR TO THIS WORD
                   14097:        ADD  WA,XR            POINT TO CURRENT ENTRY
                   14098:        MOV  (XS)+,WA         RELOAD WORD TO GENERATE
                   14099:        MOV  WA,(XR)          STORE WORD IN BLOCK
                   14100:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   14101:        EXI                   RETURN TO CALLER
                   14102: *
                   14103: *      HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
                   14104: *
                   14105: CDWD5  ERB  213,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED.
                   14106:        ENP                   END PROCEDURE CDWRD
                   14107:        EJC
                   14108: *
                   14109: *      CMGEN -- GENERATE CODE FOR CMBLK PTR
                   14110: *
                   14111: *      CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
                   14112: *      CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
                   14113: *
                   14114: *      (XL)                  CMBLK POINTER
                   14115: *      (WB)                  OFFSET TO POINTER IN CMBLK
                   14116: *      JSR  CMGEN            CALL TO GENERATE CODE
                   14117: *      (XR,WA)               DESTROYED
                   14118: *      (WB)                  BUMPED BY ONE WORD
                   14119: *
                   14120: CMGEN  PRC  R,0              ENTRY POINT, RECURSIVE
                   14121:        MOV  XL,XR            COPY CMBLK POINTER
                   14122:        ADD  WB,XR            POINT TO CMBLK POINTER
                   14123:        MOV  (XR),XR          LOAD CMBLK POINTER
                   14124:        JSR  CDGVL            GENERATE CODE BY VALUE
                   14125:        ICA  WB               BUMP OFFSET
                   14126:        EXI                   RETURN TO CALLER
                   14127:        ENP                   END PROCEDURE CMGEN
                   14128:        EJC
                   14129: *
                   14130: *      CMPIL (COMPILE SOURCE CODE)
                   14131: *
                   14132: *      CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
                   14133: *      FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
                   14134: *      COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
                   14135: *      THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
                   14136: *      INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
                   14137: *      DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
                   14138: *      AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
                   14139: *      RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
                   14140: *
                   14141: *      CMPCE                 RESUME AFTER CONTROL CARD ERROR
                   14142: *      CMPLE                 RESUME AFTER LABEL ERROR
                   14143: *      CMPSE                 RESUME AFTER STATEMENT ERROR
                   14144: *
                   14145: *      JSR  CMPIL            CALL TO COMPILE CODE
                   14146: *      (XR)                  PTR TO CDBLK FOR ENTRY STATEMENT
                   14147: *      (XL,WA,WB,WC,RA)      DESTROYED
                   14148: *
                   14149: *      THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
                   14150: *
                   14151: *      CMPSN                 NUMBER OF NEXT STATEMENT
                   14152: *                            TO BE COMPILED.
                   14153: *
                   14154: *      CSWXX                 CONTROL CARD SWITCH VALUES ARE
                   14155: *                            CHANGED WHEN RELEVANT CONTROL
                   14156: *                            CARDS ARE MET.
                   14157: *
                   14158: *      CWCOF                 OFFSET TO NEXT WORD IN CODE BLOCK
                   14159: *                            BEING BUILT (SEE CDWRD).
                   14160: *
                   14161: *      LSTSN                 NUMBER OF STATEMENT MOST RECENTLY
                   14162: *                            COMPILED (INITIALLY SET TO ZERO).
                   14163: *
                   14164: *      R$CIM                 CURRENT (INITIAL) COMPILER IMAGE
                   14165: *                            (ZERO FOR INITIAL COMPILE CALL)
                   14166: *
                   14167: *      R$CNI                 USED TO POINT TO FOLLOWING IMAGE.
                   14168: *                            (SEE READR PROCEDURE).
                   14169: *
                   14170: *      SCNGO                 GOTO SWITCH FOR SCANE PROCEDURE
                   14171: *
                   14172: *      SCNIL                 LENGTH OF CURRENT IMAGE EXCLUDING
                   14173: *                            CHARACTERS REMOVED BY -INPUT.
                   14174: *
                   14175: *      SCNPT                 CURRENT SCAN OFFSET, SEE SCANE.
                   14176: *
                   14177: *      SCNRS                 RESCAN SWITCH FOR SCANE PROCEDURE.
                   14178: *
                   14179: *      SCNSE                 OFFSET (IN R$CIM) OF MOST RECENTLY
                   14180: *                            SCANNED ELEMENT. SET ZERO IF NOT
                   14181: *                            CURRENTLY SCANNING ITEMS
                   14182:        EJC
                   14183: *
                   14184: *      CMPIL (CONTINUED)
                   14185: *
                   14186: *      STAGE               STGIC  INITIAL COMPILE IN PROGRESS
                   14187: *                          STGXC  CODE/CONVERT COMPILE
                   14188: *                          STGEV  BUILDING EXBLK FOR EVAL
                   14189: *                          STGXT  EXECUTE TIME (OUTSIDE COMPILE)
                   14190: *                          STGCE  INITIAL COMPILE AFTER END LINE
                   14191: *                          STGXE  EXECUTE COMPILE AFTER END LINE
                   14192: *
                   14193: *      CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
                   14194: *      MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
                   14195: *      OFFSETS ARE IN THE DEFINITIONS SECTION).
                   14196: *
                   14197: *      CMSTM(XS)             POINTER TO EXPAN TREE FOR BODY OF
                   14198: *                            STATEMENT (SEE EXPAN PROCEDURE).
                   14199: *
                   14200: *      CMSGO(XS)             POINTER TO TREE REPRESENTATION OF
                   14201: *                            SUCCESS GOTO (SEE PROCEDURE SCNGO)9
                   14202: *                            ZERO IF NO SUCCESS GOTO IS GIVEN
                   14203: *
                   14204: *      CMFGO(XS)             LIKE CMSGO FOR FAILURE GOTO.
                   14205: *
                   14206: *      CMCGO(XS)             SET NON-ZERO ONLY IF THERE IS A
                   14207: *                            CONDITIONAL GOTO. USED FOR -FAIL,
                   14208: *                            -NOFAIL CODE GENERATION.
                   14209: *
                   14210: *      CMPCD(XS)             POINTER TO CDBLK FOR PREVIOUS
                   14211: *                            STATEMENT. ZERO FOR 1ST STATEMENT.
                   14212: *
                   14213: *      CMFFP(XS)             SET NON-ZERO IF CDFAL IN PREVIOUS
                   14214: *                            CDBLK NEEDS FILLING WITH FORWARD
                   14215: *                            POINTER, ELSE SET TO ZERO.
                   14216: *
                   14217: *      CMFFC(XS)             SAME AS CMFFP FOR CURRENT CDBLK
                   14218: *
                   14219: *      CMSOP(XS)             OFFSET TO WORD IN PREVIOUS CDBLK
                   14220: *                            TO BE FILLED IN WITH FORWARD PTR
                   14221: *                            TO NEXT CDBLK FOR SUCCESS GOTO.
                   14222: *                            ZERO IF NO FILL IN IS REQUIRED.
                   14223: *
                   14224: *      CMSOC(XS)             SAME AS CMSOP FOR CURRENT CDBLK.
                   14225: *
                   14226: *      CMLBL(XS)             POINTER TO VRBLK FOR LABEL OF
                   14227: *                            CURRENT STATEMENT. ZERO IF NO LABEL
                   14228: *
                   14229: *      CMTRA(XS)             POINTER TO CDBLK FOR ENTRY STMNT.
                   14230:        EJC
                   14231: *
                   14232: *      CMPIL (CONTINUED)
                   14233: *
                   14234: *      ENTRY POINT
                   14235: *
                   14236: CMPIL  PRC  E,0              ENTRY POINT
                   14237:        LCT  WB,=CMNEN        SET NUMBER OF STACK WORK LOCATIONS
                   14238: *
                   14239: *      LOOP TO INITIALIZE STACK WORKING LOCATIONS
                   14240: *
                   14241: CMP00  ZER  -(XS)            STORE A ZERO, MAKE ONE ENTRY
                   14242:        BCT  WB,CMP00         LOOP BACK UNTIL ALL SET
                   14243:        MOV  XS,CMPXS         SAVE STACK POINTER FOR ERROR SEC
                   14244:        SSS  CMPSS            SAVE S-R STACK POINTER IF ANY
                   14245: *
                   14246: *      LOOP THROUGH STATEMENTS
                   14247: *
                   14248: CMP01  MOV  SCNPT,WB         SET SCAN POINTER OFFSET
                   14249:        MOV  WB,SCNSE         SET START OF ELEMENT LOCATION
                   14250:        MOV  =OCER$,WA        POINT TO COMPILE ERROR CALL
                   14251:        JSR  CDWRD            GENERATE AS TEMPORARY CDFAL
                   14252:        BLT  WB,SCNIL,CMP04   JUMP IF CHARS LEFT ON THIS IMAGE
                   14253: *
                   14254: *      LOOP HERE AFTER COMMENT OR CONTROL CARD
                   14255: *      ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
                   14256: *
                   14257: CMPCE  ZER  XR               CLEAR POSSIBLE GARBAGE XR VALUE
                   14258:        BNE  STAGE,=STGIC,CMP02 SKIP UNLESS INITIAL COMPILE
                   14259:        JSR  READR            READ NEXT INPUT IMAGE
                   14260:        BZE  XR,CMP09         JUMP IF NO INPUT AVAILABLE
                   14261:        JSR  NEXTS            ACQUIRE NEXT SOURCE IMAGE
                   14262:        MOV  CMPSN,LSTSN      STORE STMT NO FOR USE BY LISTR
                   14263:        ZER  SCNPT            RESET SCAN POINTER
                   14264:        BRN  CMP04            GO PROCESS IMAGE
                   14265: *
                   14266: *      FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
                   14267: *      AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
                   14268: *
                   14269: CMP02  MOV  R$CIM,XR         GET CURRENT IMAGE
                   14270:        MOV  SCNPT,WB         GET CURRENT OFFSET
                   14271:        PLC  XR,WB            PREPARE TO GET CHARS
                   14272: *
                   14273: *      SKIP TO SEMI-COLON
                   14274: *
                   14275: CMP03  LCH  WC,(XR)+         GET CHAR
                   14276:        ICV  SCNPT            ADVANCE OFFSET
                   14277:        BEQ  WC,=CH$SM,CMP04  SKIP IF SEMI-COLON FOUND
                   14278:        BLT  SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS
                   14279:        ZER  XR               CLEAR GARBAGE XR VALUE
                   14280:        BRN  CMP09            END OF IMAGE
                   14281:        EJC
                   14282: *
                   14283: *      CMPIL (CONTINUED)
                   14284: *
                   14285: *      HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
                   14286: *      STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
                   14287: *      ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
                   14288: *
                   14289: CMP04  MOV  R$CIM,XR         POINT TO CURRENT IMAGE
                   14290:        MOV  SCNPT,WB         LOAD CURRENT OFFSET
                   14291:        MOV  WB,WA            COPY FOR LABEL SCAN
                   14292:        PLC  XR,WB            POINT TO FIRST CHARACTER
                   14293:        LCH  WC,(XR)+         LOAD FIRST CHARACTER
                   14294:        BEQ  WC,=CH$SM,CMP12  NO LABEL IF SEMICOLON
                   14295:        BEQ  WC,=CH$AS,CMPCE  LOOP BACK IF COMMENT CARD
                   14296:        BEQ  WC,=CH$MN,CMP32  JUMP IF CONTROL CARD
                   14297:        MOV  R$CIM,R$CMP      ABOUT TO DESTROY R$CIM
                   14298:        MOV  =CMLAB,XL        POINT TO LABEL WORK STRING
                   14299:        MOV  XL,R$CIM         SCANE IS TO SCAN WORK STRING
                   14300:        PSC  XL               POINT TO FIRST CHARACTER POSITION
                   14301:        SCH  WC,(XL)+         STORE CHAR JUST LOADED
                   14302:        MOV  =CH$SM,WC        GET A SEMICOLON
                   14303:        SCH  WC,(XL)          STORE AFTER FIRST CHAR
                   14304:        CSC  XL               FINISHED CHARACTER STORING
                   14305:        ZER  XL               CLEAR POINTER
                   14306:        ZER  SCNPT            START AT FIRST CHARACTER
                   14307:        MOV  SCNIL,-(XS)      PRESERVE IMAGE LENGTH
                   14308:        MOV  =NUM02,SCNIL     READ 2 CHARS AT MOST
                   14309:        JSR  SCANE            SCAN FIRST CHAR FOR TYPE
                   14310:        MOV  (XS)+,SCNIL      RESTORE IMAGE LENGTH
                   14311:        MOV  XL,WC            NOTE RETURN CODE
                   14312:        MOV  R$CMP,XL         GET OLD R$CIM
                   14313:        MOV  XL,R$CIM         PUT IT BACK
                   14314:        MOV  WB,SCNPT         REINSTATE OFFSET
                   14315:        BNZ  SCNBL,CMP12      BLANK SEEN - CANT BE LABEL
                   14316:        MOV  XL,XR            POINT TO CURRENT IMAGE
                   14317:        PLC  XR,WB            POINT TO FIRST CHAR AGAIN
                   14318:        BEQ  WC,=T$VAR,CMP06  OK IF LETTER
                   14319:        BEQ  WC,=T$CON,CMP06  OK IF DIGIT
                   14320: *
                   14321: *      DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
                   14322: *
                   14323: CMPLE  MOV  R$CMP,R$CIM      POINT TO BAD LINE
                   14324:        ERB  214,BAD LABEL OR MISPLACED CONTINUATION LINE
                   14325: *
                   14326: *      LOOP TO SCAN LABEL
                   14327: *
                   14328: CMP05  BEQ  WC,=CH$SM,CMP07  SKIP IF SEMICOLON
                   14329:        ICV  WA               BUMP OFFSET
                   14330:        BEQ  WA,SCNIL,CMP07   JUMP IF END OF IMAGE (LABEL END)
                   14331:        EJC
                   14332: *
                   14333: *      CMPIL (CONTINUED)
                   14334: *
                   14335: *      ENTER LOOP AT THIS POINT
                   14336: *
                   14337: CMP06  LCH  WC,(XR)+         ELSE LOAD NEXT CHARACTER
                   14338: .IF    .CAHT
                   14339:        BEQ  WC,=CH$HT,CMP07  JUMP IF HORIZONTAL TAB
                   14340: .FI
                   14341: .IF    .CAVT
                   14342:        BEQ  WC,=CH$VT,CMP07  JUMP IF VERTICAL TAB
                   14343: .FI
                   14344:        BNE  WC,=CH$BL,CMP05  LOOP BACK IF NON-BLANK
                   14345: *
                   14346: *      HERE AFTER SCANNING OUT LABEL
                   14347: *
                   14348: CMP07  MOV  WA,SCNPT         SAVE UPDATED SCAN OFFSET
                   14349:        SUB  WB,WA            GET LENGTH OF LABEL
                   14350:        BZE  WA,CMP12         SKIP IF LABEL LENGTH ZERO
                   14351:        ZER  XR               CLEAR GARBAGE XR VALUE
                   14352:        JSR  SBSTR            BUILD SCBLK FOR LABEL NAME
                   14353:        JSR  GTNVR            LOCATE/CONTRUCT VRBLK
                   14354:        PPM                   DUMMY (IMPOSSIBLE) ERROR RETURN
                   14355:        MOV  XR,CMLBL(XS)     STORE LABEL POINTER
                   14356:        BNZ  VRLEN(XR),CMP11  JUMP IF NOT SYSTEM LABEL
                   14357:        BNE  VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL
                   14358: *
                   14359: *      HERE FOR END LABEL SCANNED OUT
                   14360: *
                   14361:        ADD  =STGND,STAGE     ADJUST STAGE APPROPRIATELY
                   14362:        JSR  SCANE            SCAN OUT NEXT ELEMENT
                   14363:        BEQ  XL,=T$SMC,CMP10  JUMP IF END OF IMAGE
                   14364:        BNE  XL,=T$VAR,CMP08  ELSE ERROR IF NOT VARIABLE
                   14365: *
                   14366: *      HERE CHECK FOR VALID INITIAL TRANSFER
                   14367: *
                   14368:        BEQ  VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR)
                   14369:        MOV  VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER
                   14370:        JSR  SCANE            SCAN NEXT ELEMENT
                   14371:        BEQ  XL,=T$SMC,CMP10  JUMP IF OK (END OF IMAGE)
                   14372: *
                   14373: *      HERE FOR BAD TRANSFER LABEL
                   14374: *
                   14375: CMP08  ERB  215,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
                   14376: *
                   14377: *      HERE FOR END OF INPUT (NO END LABEL DETECTED)
                   14378: *
                   14379: CMP09  ADD  =STGND,STAGE     ADJUST STAGE APPROPRIATELY
                   14380:        BEQ  STAGE,=STGXE,CMP10 JUMP IF CODE CALL (OK)
                   14381:        ERB  216,SYNTAX ERROR. MISSING END LINE
                   14382: *
                   14383: *      HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
                   14384: *
                   14385: CMP10  MOV  =OSTP$,WA        SET STOP CALL POINTER
                   14386:        JSR  CDWRD            GENERATE AS STATEMENT CALL
                   14387:        BRN  CMPSE            JUMP TO GENERATE AS FAILURE
                   14388:        EJC
                   14389: *
                   14390: *      CMPIL (CONTINUED)
                   14391: *
                   14392: *      HERE AFTER PROCESSING LABEL OTHER THAN END
                   14393: *
                   14394: CMP11  BNE  STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK
                   14395:        BEQ  VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION
                   14396:        ZER  CMLBL(XS)        LEAVE FIRST LABEL DECLN UNDISTURBED
                   14397:        ERB  217,SYNTAX ERROR. DUPLICATE LABEL
                   14398: *
                   14399: *      HERE AFTER DEALING WITH LABEL
                   14400: *
                   14401: CMP12  ZER  WB               SET FLAG FOR STATEMENT BODY
                   14402:        JSR  EXPAN            GET TREE FOR STATEMENT BODY
                   14403:        MOV  XR,CMSTM(XS)     STORE FOR LATER USE
                   14404:        ZER  CMSGO(XS)        CLEAR SUCCESS GOTO POINTER
                   14405:        ZER  CMFGO(XS)        CLEAR FAILURE GOTO POINTER
                   14406:        ZER  CMCGO(XS)        CLEAR CONDITIONAL GOTO FLAG
                   14407:        JSR  SCANE            SCAN NEXT ELEMENT
                   14408:        BNE  XL,=T$COL,CMP18  JUMP IT NOT COLON (NO GOTO)
                   14409: *
                   14410: *      LOOP TO PROCESS GOTO FIELDS
                   14411: *
                   14412: CMP13  MNZ  SCNGO            SET GOTO FLAG
                   14413:        JSR  SCANE            SCAN NEXT ELEMENT
                   14414:        BEQ  XL,=T$SMC,CMP31  JUMP IF NO FIELDS LEFT
                   14415:        BEQ  XL,=T$SGO,CMP14  JUMP IF S FOR SUCCESS GOTO
                   14416:        BEQ  XL,=T$FGO,CMP16  JUMP IF F FOR FAILURE GOTO
                   14417: *
                   14418: *      HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
                   14419: *
                   14420:        MNZ  SCNRS            SET TO RESCAN ELEMENT NOT F,S
                   14421:        JSR  SCNGF            SCAN OUT GOTO FIELD
                   14422:        BNZ  CMFGO(XS),CMP17  ERROR IF FGOTO ALREADY
                   14423:        MOV  XR,CMFGO(XS)     ELSE SET AS FGOTO
                   14424:        BRN  CMP15            MERGE WITH SGOTO CIRCUIT
                   14425: *
                   14426: *      HERE FOR SUCCESS GOTO
                   14427: *
                   14428: CMP14  JSR  SCNGF            SCAN SUCCESS GOTO FIELD
                   14429:        MOV  =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG
                   14430: *
                   14431: *      UNCONTIONAL GOTO MERGES HERE
                   14432: *
                   14433: CMP15  BNZ  CMSGO(XS),CMP17  ERROR IF SGOTO ALREADY GIVEN
                   14434:        MOV  XR,CMSGO(XS)     ELSE SET SGOTO
                   14435:        BRN  CMP13            LOOP BACK FOR NEXT GOTO FIELD
                   14436: *
                   14437: *      HERE FOR FAILURE GOTO
                   14438: *
                   14439: CMP16  JSR  SCNGF            SCAN GOTO FIELD
                   14440:        MOV  =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG
                   14441:        BNZ  CMFGO(XS),CMP17  ERROR IF FGOTO ALREADY GIVEN
                   14442:        MOV  XR,CMFGO(XS)     ELSE STORE FGOTO POINTER
                   14443:        BRN  CMP13            LOOP BACK FOR NEXT FIELD
                   14444:        EJC
                   14445: *
                   14446: *      CMPIL (CONTINUED)
                   14447: *
                   14448: *      HERE FOR DUPLICATED GOTO FIELD
                   14449: *
                   14450: CMP17  ERB  218,SYNTAX ERROR. DUPLICATED GOTO FIELD
                   14451: *
                   14452: *      HERE TO GENERATE CODE
                   14453: *
                   14454: CMP18  ZER  SCNSE            STOP POSITIONAL ERROR FLAGS
                   14455:        MOV  CMSTM(XS),XR     LOAD TREE PTR FOR STATEMENT BODY
                   14456:        ZER  WB               COLLECTABLE VALUE FOR WB FOR CDGVL
                   14457:        ZER  WC               RESET CONSTANT FLAG FOR CDGVL
                   14458:        JSR  EXPAP            TEST FOR PATTERN MATCH
                   14459:        PPM  CMP19            JUMP IF NOT PATTERN MATCH
                   14460:        MOV  =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER
                   14461:        MOV  =C$PMT,CMTYP(XR)
                   14462: *
                   14463: *      HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
                   14464: *
                   14465: CMP19  JSR  CDGVL            GENERATE CODE FOR BODY OF STATEMENT
                   14466:        MOV  CMSGO(XS),XR     LOAD SGOTO POINTER
                   14467:        MOV  XR,WA            COPY IT
                   14468:        BZE  XR,CMP21         JUMP IF NO SUCCESS GOTO
                   14469:        ZER  CMSOC(XS)        CLEAR SUCCESS OFFSET FILLIN PTR
                   14470:        BHI  XR,STATE,CMP20   JUMP IF COMPLEX GOTO
                   14471: *
                   14472: *      HERE FOR SIMPLE SUCCESS GOTO (LABEL)
                   14473: *
                   14474:        ADD  *VRTRA,WA        POINT TO VRTRA FIELD AS REQUIRED
                   14475:        JSR  CDWRD            GENERATE SUCCESS GOTO
                   14476:        BRN  CMP22            JUMP TO DEAL WITH FGOTO
                   14477: *
                   14478: *      HERE FOR COMPLEX SUCCESS GOTO
                   14479: *
                   14480: CMP20  BEQ  XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO
                   14481:        ZER  WB               ELSE SET OK VALUE FOR CDGVL IN WB
                   14482:        JSR  CDGCG            GENERATE CODE FOR SUCCESS GOTO
                   14483:        BRN  CMP22            JUMP TO DEAL WITH FGOTO
                   14484: *
                   14485: *      HERE FOR NO SUCCESS GOTO
                   14486: *
                   14487: CMP21  MOV  CWCOF,CMSOC(XS)  SET SUCCESS FILL IN OFFSET
                   14488:        MOV  =OCER$,WA        POINT TO COMPILE ERROR CALL
                   14489:        JSR  CDWRD            GENERATE AS TEMPORARY VALUE
                   14490:        EJC
                   14491: *
                   14492: *      CMPIL (CONTINUED)
                   14493: *
                   14494: *      HERE TO DEAL WITH FAILURE GOTO
                   14495: *
                   14496: CMP22  MOV  CMFGO(XS),XR     LOAD FAILURE GOTO POINTER
                   14497:        MOV  XR,WA            COPY IT
                   14498:        ZER  CMFFC(XS)        SET NO FILL IN REQUIRED YET
                   14499:        BZE  XR,CMP23         JUMP IF NO FAILURE GOTO GIVEN
                   14500:        ADD  *VRTRA,WA        POINT TO VRTRA FIELD IN CASE
                   14501:        BLO  XR,STATE,CMPSE   JUMP TO GEN IF SIMPLE FGOTO
                   14502: *
                   14503: *      HERE FOR COMPLEX FAILURE GOTO
                   14504: *
                   14505:        MOV  CWCOF,WB         SAVE OFFSET TO O$GOF CALL
                   14506:        MOV  =OGOF$,WA        POINT TO FAILURE GOTO CALL
                   14507:        JSR  CDWRD            GENERATE
                   14508:        MOV  =OFIF$,WA        POINT TO FAIL IN FAIL WORD
                   14509:        JSR  CDWRD            GENERATE
                   14510:        JSR  CDGCG            GENERATE CODE FOR FAILURE GOTO
                   14511:        MOV  WB,WA            COPY OFFSET TO O$GOF FOR CDFAL
                   14512:        MOV  =B$CDC,WB        SET COMPLEX CASE CDTYP
                   14513:        BRN  CMP25            JUMP TO BUILD CDBLK
                   14514: *
                   14515: *      HERE IF NO FAILURE GOTO GIVEN
                   14516: *
                   14517: CMP23  MOV  =OUNF$,WA        LOAD UNEXPECTED FAILURE CALL IN CAS
                   14518:        MOV  CSWFL,WC         GET -NOFAIL FLAG
                   14519:        ORB  CMCGO(XS),WC     CHECK IF CONDITIONAL GOTO
                   14520:        ZRB  WC,CMPSE         JUMP IF -NOFAIL AND NO COND. GOTO
                   14521:        MNZ  CMFFC(XS)        ELSE SET FILL IN FLAG
                   14522:        MOV  =OCER$,WA        AND SET COMPILE ERROR FOR TEMPORARY
                   14523: *
                   14524: *      MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
                   14525: *      ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
                   14526: *
                   14527: CMPSE  MOV  =B$CDS,WB        SET CDTYP FOR SIMPLE CASE
                   14528:        EJC
                   14529: *
                   14530: *      CMPIL (CONTINUED)
                   14531: *
                   14532: *      MERGE HERE TO BUILD CDBLK
                   14533: *
                   14534: *      (WA)                  CDFAL VALUE TO BE GENERATED
                   14535: *      (WB)                  CDTYP VALUE TO BE GENERATED
                   14536: *
                   14537: *      AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
                   14538: *      CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
                   14539: *      OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
                   14540: *
                   14541: CMP25  MOV  R$CCB,XR         POINT TO CCBLK
                   14542:        MOV  CMLBL(XS),XL     GET POSSIBLE LABEL POINTER
                   14543:        BZE  XL,CMP26         SKIP IF NO LABEL
                   14544:        ZER  CMLBL(XS)        CLEAR FLAG FOR NEXT STATEMENT
                   14545:        MOV  XR,VRLBL(XL)     PUT CDBLK PTR IN VRBLK LABEL FIELD
                   14546: *
                   14547: *      MERGE AFTER DOING LABEL
                   14548: *
                   14549: CMP26  MOV  WB,(XR)          SET TYPE WORD FOR NEW CDBLK
                   14550:        MOV  WA,CDFAL(XR)     SET FAILURE WORD
                   14551:        MOV  XR,XL            COPY POINTER TO CCBLK
                   14552:        MOV  CCUSE(XR),WB     LOAD LENGTH GEN (= NEW CDLEN)
                   14553:        MOV  CCLEN(XR),WC     LOAD TOTAL CCBLK LENGTH
                   14554:        ADD  WB,XL            POINT PAST CDBLK
                   14555:        SUB  WB,WC            GET LENGTH LEFT FOR CHOP OFF
                   14556:        MOV  =B$CCT,(XL)      SET TYPE CODE FOR NEW CCBLK AT END
                   14557:        MOV  *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET
                   14558:        MOV  *CCCOD,CWCOF     REINITIALISE CWCOF
                   14559:        MOV  WC,CCLEN(XL)     SET NEW LENGTH
                   14560:        MOV  XL,R$CCB         SET NEW CCBLK POINTER
                   14561:        MOV  CMPSN,CDSTM(XR)  SET STATEMENT NUMBER
                   14562:        ICV  CMPSN            BUMP STATEMENT NUMBER
                   14563: *
                   14564: *      SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
                   14565: *
                   14566:        MOV  CMPCD(XS),XL     LOAD PTR TO PREVIOUS CDBLK
                   14567:        BZE  CMFFP(XS),CMP27  JUMP IF NO FAILURE FILL IN REQUIRED
                   14568:        MOV  XR,CDFAL(XL)     ELSE SET FAILURE PTR IN PREVIOUS
                   14569: *
                   14570: *      HERE TO DEAL WITH SUCCESS FORWARD POINTER
                   14571: *
                   14572: CMP27  MOV  CMSOP(XS),WA     LOAD SUCCESS OFFSET
                   14573:        BZE  WA,CMP28         JUMP IF NO FILL IN REQUIRED
                   14574:        ADD  WA,XL            ELSE POINT TO FILL IN LOCATION
                   14575:        MOV  XR,(XL)          STORE FORWARD POINTER
                   14576:        ZER  XL               CLEAR GARBAGE XL VALUE
                   14577:        EJC
                   14578: *
                   14579: *      CMPIL (CONTINUED)
                   14580: *
                   14581: *      NOW SET FILL IN POINTERS FOR THIS STATEMENT
                   14582: *
                   14583: CMP28  MOV  CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG
                   14584:        MOV  CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET
                   14585:        MOV  XR,CMPCD(XS)     SAVE PTR TO THIS CDBLK
                   14586:        BNZ  CMTRA(XS),CMP29  JUMP IF INITIAL ENTRY ALREADY SET
                   14587:        MOV  XR,CMTRA(XS)     ELSE SET PTR HERE AS DEFAULT
                   14588: *
                   14589: *      HERE AFTER COMPILING ONE STATEMENT
                   14590: *
                   14591: CMP29  BLT  STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE
                   14592:        BZE  CSWLS,CMP30      SKIP IF -NOLIST
                   14593:        JSR  LISTR            LIST LAST LINE
                   14594: *
                   14595: *      RETURN
                   14596: *
                   14597: CMP30  MOV  CMTRA(XS),XR     LOAD INITIAL ENTRY CDBLK POINTER
                   14598:        ADD  *CMNEN,XS        POP WORK LOCATIONS OFF STACK
                   14599:        EXI                   AND RETURN TO CMPIL CALLER
                   14600: *
                   14601: *      HERE AT END OF GOTO FIELD
                   14602: *
                   14603: CMP31  MOV  CMFGO(XS),WB     GET FAIL GOTO
                   14604:        ORB  CMSGO(XS),WB     OR IN SUCCESS GOTO
                   14605:        BNZ  WB,CMP18         OK IF NON-NULL FIELD
                   14606:        ERB  219,SYNTAX ERROR. EMPTY GOTO FIELD
                   14607: *
                   14608: *      CONTROL CARD FOUND
                   14609: *
                   14610: CMP32  ICV  WB               POINT PAST CH$MN
                   14611:        JSR  CNCRD            PROCESS CONTROL CARD
                   14612:        ZER  SCNSE            CLEAR START OF ELEMENT LOC.
                   14613:        BRN  CMPCE            LOOP FOR NEXT STATEMENT
                   14614:        ENP                   END PROCEDURE CMPIL
                   14615:        EJC
                   14616: *
                   14617: *      CNCRD -- CONTROL CARD PROCESSOR
                   14618: *
                   14619: *      CALLED TO DEAL WITH CONTROL CARDS
                   14620: *
                   14621: *      R$CIM                 POINTS TO CURRENT IMAGE
                   14622: *      (WB)                  OFFSET TO 1ST CHAR OF CONTROL CARD
                   14623: *      JSR  CNCRD            CALL TO PROCESS CONTROL CARDS
                   14624: *      (XL,XR,WA,WB,WC,IA)   DESTROYED
                   14625: *
                   14626: CNCRD  PRC  E,0              ENTRY POINT
                   14627:        MOV  WB,SCNPT         OFFSET FOR CONTROL CARD SCAN
                   14628:        MOV  =CCNOC,WA        NUMBER OF CHARS FOR COMPARISON
                   14629:        CTW  WA,0             CONVERT TO WORD COUNT
                   14630:        MOV  WA,CNSWC         SAVE WORD COUNT
                   14631: *
                   14632: *      LOOP HERE IF MORE THAN ONE CONTROL CARD
                   14633: *
                   14634: CNC01  BGE  SCNPT,SCNIL,CNC09 RETURN IF END OF IMAGE
                   14635:        MOV  R$CIM,XR         POINT TO IMAGE
                   14636:        PLC  XR,SCNPT         CHAR PTR FOR FIRST CHAR
                   14637:        LCH  WA,(XR)+         GET FIRST CHAR
                   14638: .IF    .CULC
                   14639:        FLC  WA               FOLD TO UPPER CASE
                   14640: .FI
                   14641:        BEQ  WA,=CH$LI,CNC07  SPECIAL CASE OF -INXXX
                   14642:        MNZ  SCNCC            SET FLAG FOR SCANE
                   14643:        JSR  SCANE            SCAN CARD NAME
                   14644:        ZER  SCNCC            CLEAR SCANE FLAG
                   14645:        BNZ  XL,CNC06         FAIL UNLESS CONTROL CARD NAME
                   14646:        MOV  =CCNOC,WA        NO. OF CHARS TO BE COMPARED
                   14647:        BLT  SCLEN(XR),WA,CNC06  FAIL IF TOO FEW CHARS
                   14648:        MOV  XR,XL            POINT TO CONTROL CARD NAME
                   14649:        ZER  WB               ZERO OFFSET FOR SUBSTRING
                   14650:        JSR  SBSTR            EXTRACT SUBSTRING FOR COMPARISON
                   14651: .IF    .CULC
                   14652:        MOV  SCLEN(XR),WA     RELOAD LENGTH
                   14653:        JSR  FLSTG            FOLD TO UPPER CASE
                   14654: .FI
                   14655:        MOV  XR,CNSCC         KEEP CONTROL CARD SUBSTRING PTR
                   14656:        MOV  =CCNMS,XR        POINT TO LIST OF STANDARD NAMES
                   14657:        ZER  WB               INITIALISE NAME OFFSET
                   14658:        LCT  WC,=CC$NC        NUMBER OF STANDARD NAMES
                   14659: *
                   14660: *      TRY TO MATCH NAME
                   14661: *
                   14662: CNC02  MOV  CNSCC,XL         POINT TO NAME
                   14663:        LCT  WA,CNSWC         COUNTER FOR INNER LOOP
                   14664:        BRN  CNC04            JUMP INTO LOOP
                   14665: *
                   14666: *      INNER LOOP TO MATCH CARD NAME CHARS
                   14667: *
                   14668: CNC03  ICA  XR               BUMP STANDARD NAMES PTR
                   14669:        ICA  XL               BUMP NAME POINTER
                   14670: *
                   14671: *      HERE TO INITIATE THE LOOP
                   14672: *
                   14673: CNC04  CNE  SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE
                   14674:        BCT  WA,CNC03         LOOP IF MORE WORDS TO COMPARE
                   14675:        EJC
                   14676: *
                   14677: *      CNCRD (CONTINUED)
                   14678: *
                   14679: *      MATCHED - BRANCH ON CARD OFFSET
                   14680: *
                   14681:        MOV  WB,XL            GET NAME OFFSET
                   14682:        BSW  XL,CC$NC         SWITCH
                   14683: .IF    .CULC
                   14684:        IFF  CC$CA,CNC37      -CASE
                   14685: .FI
                   14686:        IFF  CC$DO,CNC10      -DOUBLE
                   14687:        IFF  CC$DU,CNC11      -DUMP
                   14688:        IFF  CC$EJ,CNC12      -EJECT
                   14689:        IFF  CC$ER,CNC13      -ERRORS
                   14690:        IFF  CC$EX,CNC14      -EXECUTE
                   14691:        IFF  CC$FA,CNC15      -FAIL
                   14692:        IFF  CC$LI,CNC16      -LIST
                   14693:        IFF  CC$NR,CNC17      -NOERRORS
                   14694:        IFF  CC$NX,CNC18      -NOEXECUTE
                   14695:        IFF  CC$NF,CNC19      -NOFAIL
                   14696:        IFF  CC$NL,CNC20      -NOLIST
                   14697:        IFF  CC$NO,CNC21      -NOOPT
                   14698:        IFF  CC$NP,CNC22      -NOPRINT
                   14699:        IFF  CC$OP,CNC24      -OPTIMISE
                   14700:        IFF  CC$PR,CNC25      -PRINT
                   14701:        IFF  CC$SI,CNC27      -SINGLE
                   14702:        IFF  CC$SP,CNC28      -SPACE
                   14703:        IFF  CC$ST,CNC31      -STITLE
                   14704:        IFF  CC$TI,CNC32      -TITLE
                   14705:        IFF  CC$TR,CNC36      -TRACE
                   14706:        ESW                   END SWITCH
                   14707: *
                   14708: *      NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
                   14709: *
                   14710: CNC05  ICA  XR               BUMP STANDARD NAMES PTR
                   14711:        BCT  WA,CNC05         LOOP
                   14712:        ICV  WB               BUMP NAMES OFFSET
                   14713:        BCT  WC,CNC02         CONTINUE IF MORE NAMES
                   14714: *
                   14715: *      INVALID CONTROL CARD NAME
                   14716: *
                   14717: CNC06  ERB  247,INVALID CONTROL CARD
                   14718: *
                   14719: *      SPECIAL PROCESSING FOR -INXXX
                   14720: *
                   14721: CNC07  LCH  WA,(XR)          GET NEXT CHAR
                   14722: .IF    .CULC
                   14723:        FLC  WA               FOLD TO UPPER CASE
                   14724: .FI
                   14725:        BNE  WA,=CH$LN,CNC06  FAIL IF NOT LETTER N
                   14726:        ADD  =NUM02,SCNPT     BUMP OFFSET PAST -IN
                   14727:        JSR  SCANE            SCAN INTEGER AFTER -IN
                   14728:        MOV  XR,-(XS)         STACK SCANNED ITEM
                   14729:        JSR  GTSMI            CHECK IF INTEGER
                   14730:        PPM  CNC06            FAIL IF NOT INTEGER
                   14731:        PPM  CNC06            FAIL IF NEGATIVE OR LARGE
                   14732:        MOV  XR,CSWIN         KEEP INTEGER
                   14733:        EJC
                   14734: *
                   14735: *      CNCRD (CONTINUED)
                   14736: *
                   14737: *      CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
                   14738: *
                   14739: CNC08  MOV  SCNPT,WA         PRESERVE IN CASE XEQ TIME COMPILE
                   14740:        JSR  SCANE            LOOK FOR COMMA
                   14741:        BEQ  XL,=T$CMA,CNC01  LOOP IF COMMA FOUND
                   14742:        MOV  WA,SCNPT         RESTORE SCNPT IN CASE XEQ TIME
                   14743: *
                   14744: *      RETURN POINT
                   14745: *
                   14746: CNC09  EXI                   RETURN
                   14747: *
                   14748: *      -DOUBLE
                   14749: *
                   14750: CNC10  MNZ  CSWDB            SET SWITCH
                   14751:        BRN  CNC08            MERGE
                   14752: *
                   14753: *      -DUMP
                   14754: *      THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF
                   14755: *      PRODUCING A CORE DUMP AT COMPILATION TIME
                   14756: *
                   14757: CNC11  JSR  SYSDM            CALL DUMPER
                   14758:        BRN  CNC09            FINISHED
                   14759: *
                   14760: *      -EJECT
                   14761: *
                   14762: CNC12  BZE  CSWLS,CNC09      RETURN IF -NOLIST
                   14763:        JSR  PRTPS            EJECT
                   14764:        JSR  LISTT            LIST TITLE
                   14765:        BRN  CNC09            FINISHED
                   14766: *
                   14767: *      -ERRORS
                   14768: *
                   14769: CNC13  ZER  CSWER            CLEAR SWITCH
                   14770:        BRN  CNC08            MERGE
                   14771: *
                   14772: *      -EXECUTE
                   14773: *
                   14774: CNC14  ZER  CSWEX            CLEAR SWITCH
                   14775:        BRN  CNC08            MERGE
                   14776: *
                   14777: *      -FAIL
                   14778: *
                   14779: CNC15  MNZ  CSWFL            SET SWITCH
                   14780:        BRN  CNC08            MERGE
                   14781: *
                   14782: *      -LIST
                   14783: *
                   14784: CNC16  MNZ  CSWLS            SET SWITCH
                   14785:        BEQ  STAGE,=STGIC,CNC08 DONE IF COMPILE TIME
                   14786: *
                   14787: *      LIST CODE LINE IF EXECUTE TIME COMPILE
                   14788: *
                   14789:        ZER  LSTPF            PERMIT LISTING
                   14790:        JSR  LISTR            LIST LINE
                   14791:        BRN  CNC08            MERGE
                   14792:        EJC
                   14793: *
                   14794: *      CNCRD (CONTINUED)
                   14795: *
                   14796: *      -NOERRORS
                   14797: *
                   14798: CNC17  MNZ  CSWER            SET SWITCH
                   14799:        BRN  CNC08            MERGE
                   14800: *
                   14801: *      -NOEXECUTE
                   14802: *
                   14803: CNC18  MNZ  CSWEX            SET SWITCH
                   14804:        BRN  CNC08            MERGE
                   14805: *
                   14806: *      -NOFAIL
                   14807: *
                   14808: CNC19  ZER  CSWFL            CLEAR SWITCH
                   14809:        BRN  CNC08            MERGE
                   14810: *
                   14811: *      -NOLIST
                   14812: *
                   14813: CNC20  ZER  CSWLS            CLEAR SWITCH
                   14814:        BRN  CNC08            MERGE
                   14815: *
                   14816: *      -NOOPTIMISE
                   14817: *
                   14818: CNC21  MNZ  CSWNO            SET SWITCH
                   14819:        BRN  CNC08            MERGE
                   14820: *
                   14821: *      -NOPRINT
                   14822: *
                   14823: CNC22  ZER  CSWPR            CLEAR SWITCH
                   14824:        BRN  CNC08            MERGE
                   14825: *
                   14826: *      -OPTIMISE
                   14827: *
                   14828: CNC24  ZER  CSWNO            CLEAR SWITCH
                   14829:        BRN  CNC08            MERGE
                   14830: *
                   14831: *      -PRINT
                   14832: *
                   14833: CNC25  MNZ  CSWPR            SET SWITCH
                   14834:        BRN  CNC08            MERGE
                   14835:        EJC
                   14836: *
                   14837: *      CNCRD (CONTINUED)
                   14838: *
                   14839: *      -SINGLE
                   14840: *
                   14841: CNC27  ZER  CSWDB            CLEAR SWITCH
                   14842:        BRN  CNC08            MERGE
                   14843: *
                   14844: *      -SPACE
                   14845: *
                   14846: CNC28  BZE  CSWLS,CNC09      RETURN IF -NOLIST
                   14847:        JSR  SCANE            SCAN INTEGER AFTER -SPACE
                   14848:        MOV  =NUM01,WC        1 SPACE IN CASE
                   14849:        BEQ  XR,=T$SMC,CNC29  JUMP IF NO INTEGER
                   14850:        MOV  XR,-(XS)         STACK IT
                   14851:        JSR  GTSMI            CHECK INTEGER
                   14852:        PPM  CNC06            FAIL IF NOT INTEGER
                   14853:        PPM  CNC06            FAIL IF NEGATIVE OR LARGE
                   14854:        BNZ  WC,CNC29         JUMP IF NON ZERO
                   14855:        MOV  =NUM01,WC        ELSE 1 SPACE
                   14856: *
                   14857: *      MERGE WITH COUNT OF LINES TO SKIP
                   14858: *
                   14859: CNC29  ADD  WC,LSTLC         BUMP LINE COUNT
                   14860:        LCT  WC,WC            CONVERT TO LOOP COUNTER
                   14861:        BLT  LSTLC,LSTNP,CNC30 JUMP IF FITS ON PAGE
                   14862:        JSR  PRTPS            EJECT
                   14863:        JSR  LISTT            LIST TITLE
                   14864:        BRN  CNC09            MERGE
                   14865: *
                   14866: *      SKIP LINES
                   14867: *
                   14868: CNC30  JSR  PRTNL            PRINT A BLANK
                   14869:        BCT  WC,CNC30         LOOP
                   14870:        BRN  CNC09            MERGE
                   14871:        EJC
                   14872: *
                   14873: *      CNCRD (CONTINUED)
                   14874: *
                   14875: *      -STITL
                   14876: *
                   14877: CNC31  MOV  =R$STL,CNR$T     PTR TO R$STL
                   14878:        BRN  CNC33            MERGE
                   14879: *
                   14880: *      -TITLE
                   14881: *
                   14882: CNC32  MOV  =NULLS,R$STL     CLEAR SUBTITLE
                   14883:        MOV  =R$TTL,CNR$T     PTR TO R$TTL
                   14884: *
                   14885: *      COMMON PROCESSING FOR -TITLE, -STITL
                   14886: *
                   14887: CNC33  MOV  =NULLS,XR        NULL IN CASE NEEDED
                   14888:        MNZ  CNTTL            SET FLAG FOR NEXT LISTR CALL
                   14889:        MOV  =CCOFS,WB        OFFSET TO TITLE/SUBTITLE
                   14890:        MOV  SCNIL,WA         INPUT IMAGE LENGTH
                   14891:        BLO  WA,WB,CNC34      JUMP IF NO CHARS LEFT
                   14892:        SUB  WB,WA            NO OF CHARS TO EXTRACT
                   14893:        MOV  R$CIM,XL         POINT TO IMAGE
                   14894:        JSR  SBSTR            GET TITLE/SUBTITLE
                   14895: *
                   14896: *      STORE TITLE/SUBTITLE
                   14897: *
                   14898: CNC34  MOV  CNR$T,XL         POINT TO STORAGE LOCATION
                   14899:        MOV  XR,(XL)          STORE TITLE/SUBTITLE
                   14900:        BEQ  XL,=R$STL,CNC09  RETURN IF STITL
                   14901:        BNZ  PRECL,CNC09      RETURN IF EXTENDED LISTING
                   14902:        BZE  PRICH,CNC09      RETURN IF REGULAR PRINTER
                   14903:        MOV  SCLEN(XR),XL     GET LENGTH OF TITLE
                   14904:        MOV  XL,WA            COPY IT
                   14905:        BZE  XL,CNC35         JUMP IF NULL
                   14906:        ADD  =NUM10,XL        INCREMENT
                   14907:        BHI  XL,PRLEN,CNC09   USE DEFAULT LSTP0 VAL IF TOO LONG
                   14908:        ADD  =NUM04,WA        POINT JUST PAST TITLE
                   14909: *
                   14910: *      STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE
                   14911: *
                   14912: CNC35  MOV  WA,LSTPO         STORE OFFSET
                   14913:        BRN  CNC09            RETURN
                   14914: *
                   14915: *      -TRACE
                   14916: *      PROVIDED FOR SYSTEM DEBUGGING.  TOGGLES THE SYSTEM LABEL
                   14917: *      TRACE SWITCH AT COMPILE TIME
                   14918: *
                   14919: CNC36  JSR  SYSTT            TOGGLE SWITCH
                   14920:        BRN  CNC08            MERGE
                   14921: .IF    .CULC
                   14922: *
                   14923: *      -CASE
                   14924: *      SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT
                   14925: *      DURING COMPILATION.
                   14926: *
                   14927: CNC37  JSR  SCANE            SCAN INTEGER AFTER -CASE
                   14928:        ZER  WC               GET 0 IN CASE NONE THERE
                   14929:        BEQ  XL,=T$SMC,CNC38  SKIP IF NO INTEGER
                   14930:        MOV  XR,-(XS)         STACK IT
                   14931:        JSR  GTSMI            CHECK INTEGER
                   14932:        PPM  CNC06            FAIL IF NOT INTEGER
                   14933:        PPM  CNC06            FAIL IF NEGATIVE OR TOO LARGE
                   14934: CNC38  MOV  WC,KVCAS         STORE NEW CASE VALUE
                   14935:        BRN  CNC09            MERGE
                   14936: .FI
                   14937:        ENP                   END PROCEDURE CNCRD
                   14938:        EJC
                   14939: *
                   14940: *      DFFNC -- DEFINE FUNCTION
                   14941: *
                   14942: *      DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
                   14943: *      A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
                   14944: *
                   14945: *      (XR)                  POINTER TO VRBLK
                   14946: *      (XL)                  POINTER TO NEW FUNCTION BLOCK
                   14947: *      JSR  DFFNC            CALL TO DEFINE FUNCTION
                   14948: *      (WA,WB)               DESTROYED
                   14949: *
                   14950: DFFNC  PRC  E,0              ENTRY POINT
                   14951:        BNE  (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL
                   14952:        ICV  EFUSE(XL)        ELSE INCREMENT ITS USE COUNT
                   14953: *
                   14954: *      HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
                   14955: *
                   14956: DFFN1  MOV  XR,WA            SAVE VRBLK POINTER
                   14957: .IF    .CNLD
                   14958: .ELSE
                   14959:        MOV  VRFNC(XR),XR     LOAD OLD FUNCTION POINTER
                   14960:        BNE  (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL
                   14961:        MOV  EFUSE(XR),WB     ELSE GET USE COUNT
                   14962:        DCV  WB               DECREMENT
                   14963:        MOV  WB,EFUSE(XR)     STORE DECREMENTED VALUE
                   14964:        BNZ  WB,DFFN2         JUMP IF USE COUNT STILL NON-ZERO
                   14965:        JSR  SYSUL            ELSE CALL SYSTEM UNLOAD FUNCTION
                   14966: .FI
                   14967: *
                   14968: *      HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
                   14969: *
                   14970: DFFN2  MOV  WA,XR            RESTORE VRBLK POINTER
                   14971:        MOV  XL,WA            COPY FUNCTION BLOCK PTR
                   14972:        BLT  XR,=R$YYY,DFFN3  SKIP CHECKS IF OPSYN OP DEFINITION
                   14973:        BNZ  VRLEN(XR),DFFN3  JUMP IF NOT SYSTEM VARIABLE
                   14974: *
                   14975: *      FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
                   14976: *
                   14977:        MOV  VRSVP(XR),XL     POINT TO SVBLK
                   14978:        MOV  SVBIT(XL),WB     LOAD BIT INDICATORS
                   14979:        ANB  BTFNC,WB         IS IT A SYSTEM FUNCTION
                   14980:        ZRB  WB,DFFN3         REDEF OK IF NOT
                   14981:        ERB  248,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION
                   14982: *
                   14983: *      HERE IF REDEFINITION IS PERMITTED
                   14984: *
                   14985: DFFN3  MOV  WA,VRFNC(XR)     STORE NEW FUNCTION POINTER
                   14986:        MOV  WA,XL            RESTORE FUNCTION BLOCK POINTER
                   14987:        EXI                   RETURN TO DFFNC CALLER
                   14988:        ENP                   END PROCEDURE DFFNC
                   14989:        EJC
                   14990: *
                   14991: *      DTACH -- DETACH I/O ASSOCIATED NAMES
                   14992: *
                   14993: *      DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES
                   14994: *      ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY
                   14995: *      REMOVE VRBLK ACCESS AND STORE TRAPS.
                   14996: *      INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY.
                   14997: *
                   14998: *      (XL)                  I/O ASSOC. VBL NAME BASE PTR
                   14999: *      (WA)                  OFFSET TO NAME
                   15000: *      JSR  DTACH            CALL FOR DETACH OPERATION
                   15001: *      (XL,XR,WA,WB,WC)      DESTROYED
                   15002: *
                   15003: DTACH  PRC  E,0              ENTRY POINT
                   15004:        MOV  XL,DTCNB         STORE NAME BASE (GBCOL NOT CALLED)
                   15005:        ADD  WA,XL            POINT TO NAME LOCATION
                   15006:        MOV  XL,DTCNM         STORE IT
                   15007: *
                   15008: *      LOOP TO SEARCH FOR I/O TRBLK
                   15009: *
                   15010: DTCH1  MOV  XL,XR            COPY NAME POINTER
                   15011: *
                   15012: *      CONTINUE AFTER BLOCK DELETION
                   15013: *
                   15014: DTCH2  MOV  (XL),XL          POINT TO NEXT VALUE
                   15015:        BNE  (XL),=B$TRT,DTCH6 JUMP AT CHAIN END
                   15016:        MOV  TRTYP(XL),WA     GET TRAP BLOCK TYPE
                   15017:        BEQ  WA,=TRTIN,DTCH3  JUMP IF INPUT
                   15018:        BEQ  WA,=TRTOU,DTCH3  JUMP IF OUTPUT
                   15019:        ADD  *TRNXT,XL        POINT TO NEXT LINK
                   15020:        BRN  DTCH1            LOOP
                   15021: *
                   15022: *      DELETE AN OLD ASSOCIATION
                   15023: *
                   15024: DTCH3  MOV  TRVAL(XL),(XR)   DELETE TRBLK
                   15025:        MOV  XL,WA            DUMP XL ...
                   15026:        MOV  XR,WB            ... AND XR
                   15027:        MOV  TRTRF(XL),XL     POINT TO TRTRF TRAP BLOCK
                   15028:        BZE  XL,DTCH5         JUMP IF NO IOCHN
                   15029:        BNE  (XL),=B$TRT,DTCH5 JUMP IF INPUT, OUTPUT, TERMINAL
                   15030: *
                   15031: *      LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR
                   15032: *
                   15033: DTCH4  MOV  XL,XR            REMEMBER LINK PTR
                   15034:        MOV  TRTRF(XL),XL     POINT TO NEXT LINK
                   15035:        BZE  XL,DTCH5         JUMP IF END OF CHAIN
                   15036:        MOV  IONMB(XL),WC     GET NAME BASE
                   15037:        ADD  IONMO(XL),WC     ADD OFFSET
                   15038:        BNE  WC,DTCNM,DTCH4   LOOP IF NO MATCH
                   15039:        MOV  TRTRF(XL),TRTRF(XR) REMOVE NAME FROM CHAIN
                   15040:        EJC
                   15041: *
                   15042: *      DTACH (CONTINUED)
                   15043: *
                   15044: *      PREPARE TO RESUME I/O TRBLK SCAN
                   15045: *
                   15046: DTCH5  MOV  WA,XL            RECOVER XL ...
                   15047:        MOV  WB,XR            ... AND XR
                   15048:        ADD  *TRVAL,XL        POINT TO VALUE FIELD
                   15049:        BRN  DTCH2            CONTINUE
                   15050: *
                   15051: *      EXIT POINT
                   15052: *
                   15053: DTCH6  MOV  DTCNB,XR         POSSIBLE VRBLK PTR
                   15054:        JSR  SETVR            RESET VRBLK IF NECESSARY
                   15055:        EXI                   RETURN
                   15056:        ENP                   END PROCEDURE DTACH
                   15057:        EJC
                   15058: *
                   15059: *      DTYPE -- GET DATATYPE NAME
                   15060: *
                   15061: *      (XR)                  OBJECT WHOSE DATATYPE IS REQUIRED
                   15062: *      JSR  DTYPE            CALL TO GET DATATYPE
                   15063: *      (XR)                  RESULT DATATYPE
                   15064: *
                   15065: DTYPE  PRC  E,0              ENTRY POINT
                   15066:        BEQ  (XR),=B$PDT,DTYP1   JUMP IF PROG.DEFINED
                   15067:        MOV  (XR),XR          LOAD TYPE WORD
                   15068:        LEI  XR               GET ENTRY POINT ID (BLOCK CODE)
                   15069:        WTB  XR               CONVERT TO BYTE OFFSET
                   15070:        MOV  SCNMT(XR),XR     LOAD TABLE ENTRY
                   15071:        EXI                   EXIT TO DTYPE CALLER
                   15072: *
                   15073: *      HERE IF PROGRAM DEFINED
                   15074: *
                   15075: DTYP1  MOV  PDDFP(XR),XR     POINT TO DFBLK
                   15076:        MOV  DFNAM(XR),XR     GET DATATYPE NAME FROM DFBLK
                   15077:        EXI                   RETURN TO DTYPE CALLER
                   15078:        ENP                   END PROCEDURE DTYPE
                   15079:        EJC
                   15080: *
                   15081: *      DUMPR -- PRINT DUMP OF STORAGE
                   15082: *
                   15083: *      (XR)                  DUMP ARGUMENT (SEE BELOW)
                   15084: *      JSR  DUMPR            CALL TO PRINT DUMP
                   15085: *      (XR,XL)               DESTROYED
                   15086: *      (WA,WB,WC,RA)         DESTROYED
                   15087: *
                   15088: *      THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
                   15089: *
                   15090: *      DMARG = 0             NO DUMP PRINTED
                   15091: *      DMARG = 1             PARTIAL DUMP (NAT VARS, KEYWORDS)
                   15092: *      DMARG EQ 2            FULL DUMP (INCL ARRAYS ETC.)
                   15093: *      DMARG GE 3            CORE DUMP
                   15094: *
                   15095: *      SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
                   15096: *      COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
                   15097: *      AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
                   15098: *
                   15099: DUMPR  PRC  E,0              ENTRY POINT
                   15100:        BZE  XR,DMP28         SKIP DUMP IF ARGUMENT IS ZERO
                   15101:        BGT  XR,=NUM02,DMP29  JUMP IF CORE DUMP REQUIRED
                   15102:        ZER  XL               CLEAR XL
                   15103:        ZER  WB               ZERO MOVE OFFSET
                   15104:        MOV  XR,DMARG         SAVE DUMP ARGUMENT
                   15105:        JSR  GBCOL            COLLECT GARBAGE
                   15106:        JSR  PRTPG            EJECT PRINTER
                   15107:        MOV  =DMHDV,XR        POINT TO HEADING FOR VARIABLES
                   15108:        JSR  PRTST            PRINT IT
                   15109:        JSR  PRTNL            TERMINATE PRINT LINE
                   15110:        JSR  PRTNL            AND PRINT A BLANK LINE
                   15111: *
                   15112: *      FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
                   15113: *      ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
                   15114: *      THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
                   15115: *      NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
                   15116: *      INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME  OR
                   15117: *      PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
                   15118: *      FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
                   15119: *      EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
                   15120: *      ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
                   15121: *      OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
                   15122: *
                   15123:        ZER  DMVCH            SET NULL CHAIN TO START
                   15124:        MOV  HSHTB,WA         POINT TO HASH TABLE
                   15125: *
                   15126: *      LOOP THROUGH HEADERS IN HASH TABLE
                   15127: *
                   15128: DMP00  MOV  WA,XR            COPY HASH BUCKET POINTER
                   15129:        ICA  WA               BUMP POINTER
                   15130:        SUB  *VRNXT,XR        SET OFFSET TO MERGE
                   15131: *
                   15132: *      LOOP THROUGH VRBLKS ON ONE CHAIN
                   15133: *
                   15134: DMP01  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON CHAIN
                   15135:        BZE  XR,DMP09         JUMP IF END OF THIS HASH CHAIN
                   15136:        MOV  XR,XL            ELSE COPY VRBLK POINTER
                   15137:        EJC
                   15138: *
                   15139: *      DUMPR (CONTINUED)
                   15140: *
                   15141: *      LOOP TO FIND VALUE AND SKIP IF NULL
                   15142: *
                   15143: DMP02  MOV  VRVAL(XL),XL     LOAD VALUE
                   15144:        BEQ  XL,=NULLS,DMP01  LOOP FOR NEXT VRBLK IF NULL VALUE
                   15145:        BEQ  (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED
                   15146: *
                   15147: *      NON-NULL VALUE, PREPARE TO SEARCH CHAIN
                   15148: *
                   15149:        MOV  XR,WC            SAVE VRBLK POINTER
                   15150:        ADD  *VRSOF,XR        ADJUST PTR TO BE LIKE SCBLK PTR
                   15151:        BNZ  SCLEN(XR),DMP03  JUMP IF NON-SYSTEM VARIABLE
                   15152:        MOV  VRSVO(XR),XR     ELSE LOAD PTR TO NAME IN SVBLK
                   15153: *
                   15154: *      HERE WITH NAME POINTER FOR NEW BLOCK IN XR
                   15155: *
                   15156: DMP03  MOV  XR,WB            SAVE POINTER TO CHARS
                   15157:        MOV  WA,DMPSV         SAVE HASH BUCKET POINTER
                   15158:        MOV  =DMVCH,WA        POINT TO CHAIN HEAD
                   15159: *
                   15160: *      LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
                   15161: *
                   15162: DMP04  MOV  WA,DMPCH         SAVE CHAIN POINTER
                   15163:        MOV  WA,XL            COPY IT
                   15164:        MOV  (XL),XR          LOAD POINTER TO NEXT ENTRY
                   15165:        BZE  XR,DMP08         JUMP IF END OF CHAIN TO INSERT
                   15166:        ADD  *VRSOF,XR        ELSE GET NAME PTR FOR CHAINED VRBLK
                   15167:        BNZ  SCLEN(XR),DMP05  JUMP IF NOT SYSTEM VARIABLE
                   15168:        MOV  VRSVO(XR),XR     ELSE POINT TO NAME IN SVBLK
                   15169: *
                   15170: *      HERE PREPARE TO COMPARE THE NAMES
                   15171: *
                   15172: *      (WA)                  SCRATCH
                   15173: *      (WB)                  POINTER TO STRING OF ENTERING VRBLK
                   15174: *      (WC)                  POINTER TO ENTERING VRBLK
                   15175: *      (XR)                  POINTER TO STRING OF CURRENT BLOCK
                   15176: *      (XL)                  SCRATCH
                   15177: *
                   15178: DMP05  MOV  WB,XL            POINT TO ENTERING VRBLK STRING
                   15179:        MOV  SCLEN(XL),WA     LOAD ITS LENGTH
                   15180:        PLC  XL               POINT TO CHARS OF ENTERING STRING
                   15181:        BHI  WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH
                   15182:        PLC  XR               ELSE POINT TO CHARS OF OLD STRING
                   15183:        CMC  DMP08,DMP07      COMPARE, INSERT IF NEW IS LLT OLD
                   15184:        BRN  DMP08            OR IF LEQ (WE HAD SHORTER LENGTH)
                   15185: *
                   15186: *      HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
                   15187: *
                   15188: DMP06  MOV  SCLEN(XR),WA     LOAD SHORTER LENGTH
                   15189:        PLC  XR               POINT TO CHARS OF OLD STRING
                   15190:        CMC  DMP08,DMP07      COMPARE, INSERT IF NEW ONE LOW
                   15191:        EJC
                   15192: *
                   15193: *      DUMPR (CONTINUED)
                   15194: *
                   15195: *      HERE WE MOVE OUT ON THE CHAIN
                   15196: *
                   15197: DMP07  MOV  DMPCH,XL         COPY CHAIN POINTER
                   15198:        MOV  (XL),WA          MOVE TO NEXT ENTRY ON CHAIN
                   15199:        BRN  DMP04            LOOP BACK
                   15200: *
                   15201: *      HERE AFTER LOCATING THE PROPER INSERTION POINT
                   15202: *
                   15203: DMP08  MOV  DMPCH,XL         COPY CHAIN POINTER
                   15204:        MOV  DMPSV,WA         RESTORE HASH BUCKET POINTER
                   15205:        MOV  WC,XR            RESTORE VRBLK POINTER
                   15206:        MOV  (XL),VRGET(XR)   LINK VRBLK TO REST OF CHAIN
                   15207:        MOV  XR,(XL)          LINK VRBLK INTO CURRENT CHAIN LOC
                   15208:        BRN  DMP01            LOOP BACK FOR NEXT VRBLK
                   15209: *
                   15210: *      HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
                   15211: *
                   15212: DMP09  BNE  WA,HSHTE,DMP00   LOOP BACK IF MORE BUCKETS TO GO
                   15213: *
                   15214: *      LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
                   15215: *
                   15216: DMP10  MOV  DMVCH,XR         LOAD POINTER TO NEXT ENTRY ON CHAIN
                   15217:        BZE  XR,DMP11         JUMP IF END OF CHAIN
                   15218:        MOV  (XR),DMVCH       ELSE UPDATE CHAIN PTR TO NEXT ENTRY
                   15219:        JSR  SETVR            RESTORE VRGET FIELD
                   15220:        MOV  XR,XL            COPY VRBLK POINTER (NAME BASE)
                   15221:        MOV  *VRVAL,WA        SET OFFSET FOR VRBLK NAME
                   15222:        JSR  PRTNV            PRINT NAME = VALUE
                   15223:        BRN  DMP10            LOOP BACK TILL ALL PRINTED
                   15224: *
                   15225: *      PREPARE TO PRINT KEYWORDS
                   15226: *
                   15227: DMP11  JSR  PRTNL            PRINT BLANK LINE
                   15228:        JSR  PRTNL            AND ANOTHER
                   15229:        MOV  =DMHDK,XR        POINT TO KEYWORD HEADING
                   15230:        JSR  PRTST            PRINT HEADING
                   15231:        JSR  PRTNL            END LINE
                   15232:        JSR  PRTNL            PRINT ONE BLANK LINE
                   15233:        MOV  =VDMKW,XL        POINT TO LIST OF KEYWORD SVBLK PTRS
                   15234:        EJC
                   15235: *
                   15236: *      DUMPR (CONTINUED)
                   15237: *
                   15238: *      LOOP TO DUMP KEYWORD VALUES
                   15239: *
                   15240: DMP12  MOV  (XL)+,XR         LOAD NEXT SVBLK PTR FROM TABLE
                   15241:        BZE  XR,DMP13         JUMP IF END OF LIST
                   15242:        MOV  =CH$AM,WA        LOAD AMPERSAND
                   15243:        JSR  PRTCH            PRINT AMPERSAND
                   15244:        JSR  PRTST            PRINT KEYWORD NAME
                   15245:        MOV  SVLEN(XR),WA     LOAD NAME LENGTH FROM SVBLK
                   15246:        CTB  WA,SVCHS         GET LENGTH OF NAME
                   15247:        ADD  WA,XR            POINT TO SVKNM FIELD
                   15248:        MOV  (XR),DMPKN       STORE IN DUMMY KVBLK
                   15249:        MOV  =TMBEB,XR        POINT TO BLANK-EQUAL-BLANK
                   15250:        JSR  PRTST            PRINT IT
                   15251:        MOV  XL,DMPSV         SAVE TABLE POINTER
                   15252:        MOV  =DMPKB,XL        POINT TO DUMMY KVBLK
                   15253:        MOV  *KVVAR,WA        SET ZERO OFFSET
                   15254:        JSR  ACESS            GET KEYWORD VALUE
                   15255:        PPM                   FAILURE IS IMPOSSIBLE
                   15256:        JSR  PRTVL            PRINT KEYWORD VALUE
                   15257:        JSR  PRTNL            TERMINATE PRINT LINE
                   15258:        MOV  DMPSV,XL         RESTORE TABLE POINTER
                   15259:        BRN  DMP12            LOOP BACK TILL ALL PRINTED
                   15260: *
                   15261: *      HERE AFTER COMPLETING PARTIAL DUMP
                   15262: *
                   15263: DMP13  BEQ  DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE
                   15264:        MOV  DNAMB,XR         ELSE POINT TO FIRST DYNAMIC BLOCK
                   15265: *
                   15266: *      LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
                   15267: *
                   15268: DMP14  BEQ  XR,DNAMP,DMP27   JUMP IF END OF USED REGION
                   15269:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF BLOCK
                   15270:        BEQ  WA,=B$VCT,DMP16  JUMP IF VECTOR
                   15271:        BEQ  WA,=B$ART,DMP17  JUMP IF ARRAY
                   15272:        BEQ  WA,=B$PDT,DMP18  JUMP IF PROGRAM DEFINED
                   15273:        BEQ  WA,=B$TBT,DMP19  JUMP IF TABLE
                   15274: .IF    .CNBF
                   15275: .ELSE
                   15276:        BEQ  WA,=B$BCT,DMP30  JUMP IF BUFFER
                   15277: .FI
                   15278: *
                   15279: *      MERGE HERE TO MOVE TO NEXT BLOCK
                   15280: *
                   15281: DMP15  JSR  BLKLN            GET LENGTH OF BLOCK
                   15282:        ADD  WA,XR            POINT PAST THIS BLOCK
                   15283:        BRN  DMP14            LOOP BACK FOR NEXT BLOCK
                   15284:        EJC
                   15285: *
                   15286: *      DUMPR (CONTINUED)
                   15287: *
                   15288: *      HERE FOR VECTOR
                   15289: *
                   15290: DMP16  MOV  *VCVLS,WB        SET OFFSET TO FIRST VALUE
                   15291:        BRN  DMP19            JUMP TO MERGE
                   15292: *
                   15293: *      HERE FOR ARRAY
                   15294: *
                   15295: DMP17  MOV  AROFS(XR),WB     SET OFFSET TO ARPRO FIELD
                   15296:        ICA  WB               BUMP TO GET OFFSET TO VALUES
                   15297:        BRN  DMP19            JUMP TO MERGE
                   15298: *
                   15299: *      HERE FOR PROGRAM DEFINED
                   15300: *
                   15301: DMP18  MOV  *PDFLD,WB        POINT TO VALUES, MERGE
                   15302: *
                   15303: *      HERE FOR TABLE (OTHERS MERGE)
                   15304: *
                   15305: DMP19  BZE  IDVAL(XR),DMP15  IGNORE BLOCK IF ZERO ID VALUE
                   15306:        JSR  BLKLN            ELSE GET BLOCK LENGTH
                   15307:        MOV  XR,XL            COPY BLOCK POINTER
                   15308:        MOV  WA,DMPSV         SAVE LENGTH
                   15309:        MOV  WB,WA            COPY OFFSET TO FIRST VALUE
                   15310:        JSR  PRTNL            PRINT BLANK LINE
                   15311:        MOV  WA,DMPSA         PRESERVE OFFSET
                   15312:        JSR  PRTVL            PRINT BLOCK VALUE (FOR TITLE)
                   15313:        MOV  DMPSA,WA         RECOVER OFFSET
                   15314:        JSR  PRTNL            END PRINT LINE
                   15315:        BEQ  (XR),=B$TBT,DMP22 JUMP IF TABLE
                   15316:        DCA  WA               POINT BEFORE FIRST WORD
                   15317: *
                   15318: *      LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
                   15319: *
                   15320: DMP20  MOV  XL,XR            COPY BLOCK POINTER
                   15321:        ICA  WA               BUMP OFFSET
                   15322:        ADD  WA,XR            POINT TO NEXT VALUE
                   15323:        BEQ  WA,DMPSV,DMP14   EXIT IF END (XR PAST BLOCK)
                   15324:        SUB  *VRVAL,XR        SUBTRACT OFFSET TO MERGE INTO LOOP
                   15325: *
                   15326: *      LOOP TO FIND VALUE AND IGNORE NULLS
                   15327: *
                   15328: DMP21  MOV  VRVAL(XR),XR     LOAD NEXT VALUE
                   15329:        BEQ  XR,=NULLS,DMP20  LOOP BACK IF NULL VALUE
                   15330:        BEQ  (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED
                   15331:        JSR  PRTNV            ELSE PRINT NAME = VALUE
                   15332:        BRN  DMP20            LOOP BACK FOR NEXT FIELD
                   15333:        EJC
                   15334: *
                   15335: *      DUMPR (CONTINUED)
                   15336: *
                   15337: *      HERE TO DUMP A TABLE
                   15338: *
                   15339: DMP22  MOV  *TBBUK,WC        SET OFFSET TO FIRST BUCKET
                   15340:        MOV  *TEVAL,WA        SET NAME OFFSET FOR ALL TEBLKS
                   15341: *
                   15342: *      LOOP THROUGH TABLE BUCKETS
                   15343: *
                   15344: DMP23  MOV  XL,-(XS)         SAVE TBBLK POINTER
                   15345:        ADD  WC,XL            POINT TO NEXT BUCKET HEADER
                   15346:        ICA  WC               BUMP BUCKET OFFSET
                   15347:        SUB  *TENXT,XL        SUBTRACT OFFSET TO MERGE INTO LOOP
                   15348: *
                   15349: *      LOOP TO PROCESS TEBLKS ON ONE CHAIN
                   15350: *
                   15351: DMP24  MOV  TENXT(XL),XL     POINT TO NEXT TEBLK
                   15352:        BEQ  XL,(XS),DMP26    JUMP IF END OF CHAIN
                   15353:        MOV  XL,XR            ELSE COPY TEBLK POINTER
                   15354: *
                   15355: *      LOOP TO FIND VALUE AND IGNORE IF NULL
                   15356: *
                   15357: DMP25  MOV  TEVAL(XR),XR     LOAD NEXT VALUE
                   15358:        BEQ  XR,=NULLS,DMP24  IGNORE IF NULL VALUE
                   15359:        BEQ  (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED
                   15360:        MOV  WC,DMPSV         ELSE SAVE OFFSET POINTER
                   15361:        JSR  PRTNV            PRINT NAME = VALUE
                   15362:        MOV  DMPSV,WC         RELOAD OFFSET
                   15363:        BRN  DMP24            LOOP BACK FOR NEXT TEBLK
                   15364: *
                   15365: *      HERE TO MOVE TO NEXT HASH CHAIN
                   15366: *
                   15367: DMP26  MOV  (XS)+,XL         RESTORE TBBLK POINTER
                   15368:        BNE  WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO
                   15369:        MOV  XL,XR            ELSE COPY TABLE POINTER
                   15370:        ADD  WC,XR            POINT TO FOLLOWING BLOCK
                   15371:        BRN  DMP14            LOOP BACK TO PROCESS NEXT BLOCK
                   15372: *
                   15373: *      HERE AFTER COMPLETING DUMP
                   15374: *
                   15375: DMP27  JSR  PRTPG            EJECT PRINTER
                   15376: *
                   15377: *      MERGE HERE IF NO DUMP GIVEN (DMARG=0)
                   15378: *
                   15379: DMP28  EXI                   RETURN TO DUMP CALLER
                   15380: *
                   15381: *      CALL SYSTEM CORE DUMP ROUTINE
                   15382: *
                   15383: DMP29  JSR  SYSDM            CALL IT
                   15384:        BRN  DMP28            RETURN
                   15385: .IF    .CNBF
                   15386: .ELSE
                   15387:        EJC
                   15388: *
                   15389: *      DUMPR (CONTINUED)
                   15390: *
                   15391: *      HERE TO DUMP BUFFER BLOCK
                   15392: *
                   15393: DMP30  JSR  PRTNL            PRINT BLANK LINE
                   15394:        JSR  PRTVL            PRINT VALUE ID FOR TITLE
                   15395:        JSR  PRTNL            FORCE NEW LINE
                   15396:        MOV  =CH$DQ,WA        LOAD DOUBLE QUOTE
                   15397:        JSR  PRTCH            PRINT IT
                   15398:        MOV  BCLEN(XR),WC     LOAD DEFINED LENGTH
                   15399:        BZE  WC,DMP32         SKIP CHARACTERS IF NONE
                   15400:        LCT  WC,WC            LOAD COUNT FOR LOOP
                   15401:        MOV  XR,WB            SAVE BCBLK PTR
                   15402:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   15403:        PLC  XR               GET SET TO LOAD CHARACTERS
                   15404: *
                   15405: *      LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
                   15406: *
                   15407: DMP31  LCH  WA,(XR)+         GET NEXT CHARACTER
                   15408:        JSR  PRTCH            STUFF IT
                   15409:        BCT  WC,DMP31         BRANCH FOR NEXT ONE
                   15410:        MOV  WB,XR            RESTORE BCBLK POINTER
                   15411: *
                   15412: *      MERGE TO STUFF CLOSING QUOTE MARK
                   15413: *
                   15414: DMP32  MOV  =CH$DQ,WA        STUFF QUOTE
                   15415:        JSR  PRTCH            PRINT IT
                   15416:        JSR  PRTNL            PRINT NEW LINE
                   15417:        MOV  (XR),WA          GET FIRST WD FOR BLKLN
                   15418:        BRN  DMP15            MERGE TO GET NEXT BLOCK
                   15419: .FI
                   15420:        ENP                   END PROCEDURE DUMPR
                   15421:        EJC
                   15422: *
                   15423: *      ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
                   15424: *
                   15425: *      KVERT                 ERROR CODE
                   15426: *      JSR  ERMSG            CALL TO PRINT MESSAGE
                   15427: *      (XR,XL,WA,WB,WC,IA)   DESTROYED
                   15428: *
                   15429: ERMSG  PRC  E,0              ENTRY POINT
                   15430:        JSR  PRTIS            PRINT ERROR PTR OR BLANK LINE
                   15431:        MOV  KVERT,WA         LOAD ERROR CODE
                   15432:        MOV  =ERMMS,XR        POINT TO ERROR MESSAGE /ERROR/
                   15433:        JSR  PRTST            PRINT IT
                   15434:        JSR  ERTEX            GET ERROR MESSAGE TEXT
                   15435:        ADD  =THSND,WA        BUMP ERROR CODE FOR PRINT
                   15436:        MTI  WA               FAIL CODE IN INT ACC
                   15437:        JSR  PRTIN            PRINT CODE (NOW HAVE ERROR1XXX)
                   15438:        MOV  PRBUF,XL         POINT TO PRINT BUFFER
                   15439:        PSC  XL,=NUM05        POINT TO THE 1
                   15440:        MOV  =CH$BL,WA        LOAD A BLANK
                   15441:        SCH  WA,(XL)          STORE BLANK OVER 1 (ERROR XXX)
                   15442:        CSC  XL               COMPLETE STORE CHARACTERS
                   15443:        ZER  XL               CLEAR GARBAGE POINTER IN XL
                   15444:        MOV  XR,WA            KEEP ERROR TEXT
                   15445:        MOV  =ERMNS,XR        POINT TO / -- /
                   15446:        JSR  PRTST            PRINT IT
                   15447:        MOV  WA,XR            GET ERROR TEXT AGAIN
                   15448:        JSR  PRTST            PRINT ERROR MESSAGE TEXT
                   15449:        JSR  PRTIS            PRINT LINE
                   15450:        JSR  PRTIS            PRINT BLANK LINE
                   15451:        EXI                   RETURN TO ERMSG CALLER
                   15452:        ENP                   END PROCEDURE ERMSG
                   15453:        EJC
                   15454: *
                   15455: *      ERTEX -- GET ERROR MESSAGE TEXT
                   15456: *
                   15457: *      (WA)                  ERROR CODE
                   15458: *      JSR  ERTEX            CALL TO GET ERROR TEXT
                   15459: *      (XR)                  PTR TO ERROR TEXT IN DYNAMIC
                   15460: *      (R$ETX)               COPY OF PTR TO ERROR TEXT
                   15461: *      (XL,WC,IA)            DESTROYED
                   15462: *
                   15463: ERTEX  PRC  E,0              ENTRY POINT
                   15464:        MOV  WA,ERTWA         SAVE WA
                   15465:        MOV  WB,ERTWB         SAVE WB
                   15466:        JSR  SYSEM            GET FAILURE MESSAGE TEXT
                   15467:        MOV  XR,XL            COPY POINTER TO IT
                   15468:        MOV  SCLEN(XR),WA     GET LENGTH OF STRING
                   15469:        BZE  WA,ERT02         JUMP IF NULL
                   15470:        ZER  WB               OFFSET OF ZERO
                   15471:        JSR  SBSTR            COPY INTO DYNAMIC STORE
                   15472:        MOV  XR,R$ETX         STORE FOR RELOCATION
                   15473: *
                   15474: *      RETURN
                   15475: *
                   15476: ERT01  MOV  ERTWB,WB         RESTORE WB
                   15477:        MOV  ERTWA,WA         RESTORE WA
                   15478:        EXI                   RETURN TO CALLER
                   15479: *
                   15480: *      RETURN ERRTEXT CONTENTS INSTEAD OF NULL
                   15481: *
                   15482: ERT02  MOV  R$ETX,XR         GET ERRTEXT
                   15483:        BRN  ERT01            RETURN
                   15484:        ENP
                   15485:        EJC
                   15486: *
                   15487: *      EVALI -- EVALUATE INTEGER ARGUMENT
                   15488: *
                   15489: *      EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
                   15490: *      WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
                   15491: *
                   15492: *      (XR)                  NODE POINTER
                   15493: *      (WB)                  CURSOR
                   15494: *      JSR  EVALI            CALL TO EVALUATE INTEGER
                   15495: *      PPM  LOC              TRANSFER LOC FOR NON-INTEGER ARG
                   15496: *      PPM  LOC              TRANSFER LOC FOR OUT OF RANGE ARG
                   15497: *      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
                   15498: *      PPM  LOC              TRANSFER LOC FOR SUCCESSFUL EVAL
                   15499: *      (THE NORMAL RETURN IS NEVER TAKEN)
                   15500: *      (XR)                  PTR TO NODE WITH INTEGER ARGUMENT
                   15501: *      (WC,XL,RA)            DESTROYED
                   15502: *
                   15503: *      ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
                   15504: *      IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
                   15505: *      THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
                   15506: *
                   15507: EVALI  PRC  R,4              ENTRY POINT (RECURSIVE)
                   15508:        JSR  EVALP            EVALUATE EXPRESSION
                   15509:        PPM  EVLI1            JUMP ON FAILURE
                   15510:        MOV  XL,-(XS)         STACK RESULT FOR GTSMI
                   15511:        MOV  PTHEN(XR),XL     LOAD SUCCESSOR POINTER
                   15512:        JSR  GTSMI            CONVERT ARG TO SMALL INTEGER
                   15513:        PPM  EVLI2            JUMP IF NOT INTEGER
                   15514:        PPM  EVLI3            JUMP IF OUT OF RANGE
                   15515:        MOV  XR,EVLIV         STORE RESULT IN SPECIAL DUMMY NODE
                   15516:        MOV  XL,EVLIS         STORE SUCCESSOR POINTER
                   15517:        MOV  =EVLIN,XR        POINT TO DUMMY NODE WITH RESULT
                   15518:        EXI  4                TAKE SUCCESSFUL EXIT
                   15519: *
                   15520: *      HERE IF EVALUATION FAILS
                   15521: *
                   15522: EVLI1  EXI  3                TAKE FAILURE RETURN
                   15523: *
                   15524: *      HERE IF ARGUMENT IS NOT INTEGER
                   15525: *
                   15526: EVLI2  EXI  1                TAKE NON-INTEGER ERROR EXIT
                   15527: *
                   15528: *      HERE IF ARGUMENT IS OUT OF RANGE
                   15529: *
                   15530: EVLI3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
                   15531:        ENP                   END PROCEDURE EVALI
                   15532:        EJC
                   15533: *
                   15534: *      EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
                   15535: *
                   15536: *      EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
                   15537: *      A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
                   15538: *      VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
                   15539: *
                   15540: *      EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
                   15541: *      AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
                   15542: *
                   15543: *      (XR)                  NODE POINTER
                   15544: *      (WB)                  PATTERN MATCH CURSOR
                   15545: *      JSR  EVALP            CALL TO EVALUATE EXPRESSION
                   15546: *      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
                   15547: *      (XL)                  RESULT
                   15548: *      (WA)                  FIRST WORD OF RESULT BLOCK
                   15549: *      (XR,WB)               DESTROYED (FAILURE CASE ONLY)
                   15550: *      (WC,RA)               DESTROYED
                   15551: *
                   15552: *      THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
                   15553: *
                   15554: *      CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
                   15555: *
                   15556: EVALP  PRC  R,1              ENTRY POINT (RECURSIVE)
                   15557:        MOV  PARM1(XR),XL     LOAD EXPRESSION POINTER
                   15558:        BEQ  (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE
                   15559: *
                   15560: *      HERE FOR CASE OF SEBLK
                   15561: *
                   15562: *      WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
                   15563: *      NOT AN EXPRESSION AND IS NOT TRAPPED.
                   15564: *
                   15565:        MOV  SEVAR(XL),XL     LOAD VRBLK POINTER
                   15566:        MOV  VRVAL(XL),XL     LOAD VALUE OF VRBLK
                   15567:        MOV  (XL),WA          LOAD FIRST WORD OF VALUE
                   15568:        BHI  WA,=B$T$$,EVLP3  JUMP IF NOT SEBLK, TRBLK OR EXBLK
                   15569: *
                   15570: *      HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
                   15571: *
                   15572: EVLP1  MOV  XR,-(XS)         STACK NODE POINTER
                   15573:        MOV  WB,-(XS)         STACK CURSOR
                   15574:        MOV  R$PMS,-(XS)      STACK SUBJECT STRING POINTER
                   15575:        MOV  PMSSL,-(XS)      STACK SUBJECT STRING LENGTH
                   15576:        MOV  PMDFL,-(XS)      STACK DOT FLAG
                   15577:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE POINTER
                   15578:        MOV  PARM1(XR),XR     LOAD EXPRESSION POINTER
                   15579:        EJC
                   15580: *
                   15581: *      EVALP (CONTINUED)
                   15582: *
                   15583: *      LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
                   15584: *
                   15585: EVLP2  ZER  WB               SET FLAG FOR BY VALUE
                   15586:        JSR  EVALX            EVALUATE EXPRESSION
                   15587:        PPM  EVLP4            JUMP ON FAILURE
                   15588:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF VALUE
                   15589:        BLO  WA,=B$E$$,EVLP2  LOOP BACK TO REEVALUATE EXPRESSION
                   15590: *
                   15591: *      HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
                   15592: *
                   15593:        MOV  XR,XL            COPY RESULT POINTER
                   15594:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   15595:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   15596:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   15597:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   15598:        MOV  (XS)+,WB         RESTORE CURSOR
                   15599:        MOV  (XS)+,XR         RESTORE NODE POINTER
                   15600: *
                   15601: *      COMMON EXIT POINT
                   15602: *
                   15603: EVLP3  EXI                   RETURN TO EVALP CALLER
                   15604: *
                   15605: *      HERE FOR FAILURE DURING EVALUATION
                   15606: *
                   15607: EVLP4  MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   15608:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   15609:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   15610:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   15611:        ADD  *NUM02,XS        REMOVE NODE PTR, CURSOR
                   15612:        EXI  1                TAKE FAILURE EXIT
                   15613:        ENP                   END PROCEDURE EVALP
                   15614:        EJC
                   15615: *
                   15616: *      EVALS -- EVALUATE STRING ARGUMENT
                   15617: *
                   15618: *      EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
                   15619: *      THEY ARE PASSED AN EXPRESSION ARGUMENT.
                   15620: *
                   15621: *      (XR)                  NODE POINTER
                   15622: *      (WB)                  CURSOR
                   15623: *      JSR  EVALS            CALL TO EVALUATE STRING
                   15624: *      PPM  LOC              TRANSFER LOC FOR NON-STRING ARG
                   15625: *      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
                   15626: *      PPM  LOC              TRANSFER LOC FOR SUCCESSFUL EVAL
                   15627: *      (THE NORMAL RETURN IS NEVER TAKEN)
                   15628: *      (XR)                  PTR TO NODE WITH PARMS SET
                   15629: *      (XL,WC,RA)            DESTROYED
                   15630: *
                   15631: *      ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
                   15632: *      POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
                   15633: *      SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
                   15634: *      OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
                   15635: *
                   15636: EVALS  PRC  R,3              ENTRY POINT (RECURSIVE)
                   15637:        JSR  EVALP            EVALUATE EXPRESSION
                   15638:        PPM  EVLS1            JUMP IF EVALUATION FAILS
                   15639:        MOV  PTHEN(XR),-(XS)  SAVE SUCCESSOR POINTER
                   15640:        MOV  WB,-(XS)         SAVE CURSOR
                   15641:        MOV  XL,-(XS)         STACK RESULT PTR FOR PATST
                   15642:        ZER  WB               DUMMY PCODE FOR ONE CHAR STRING
                   15643:        ZER  WC               DUMMY PCODE FOR EXPRESSION ARG
                   15644:        MOV  =P$BRK,XL        APPROPRIATE PCODE FOR OUR USE
                   15645:        JSR  PATST            CALL ROUTINE TO BUILD NODE
                   15646:        PPM  EVLS2            JUMP IF NOT STRING
                   15647:        MOV  (XS)+,WB         RESTORE CURSOR
                   15648:        MOV  (XS)+,PTHEN(XR)  STORE SUCCESSOR POINTER
                   15649:        EXI  3                TAKE SUCCESS RETURN
                   15650: *
                   15651: *      HERE IF EVALUATION FAILS
                   15652: *
                   15653: EVLS1  EXI  2                TAKE FAILURE RETURN
                   15654: *
                   15655: *      HERE IF ARGUMENT IS NOT STRING
                   15656: *
                   15657: EVLS2  ADD  *NUM02,XS        POP SUCCESSOR AND CURSOR
                   15658:        EXI  1                TAKE NON-STRING ERROR EXIT
                   15659:        ENP                   END PROCEDURE EVALS
                   15660:        EJC
                   15661: *
                   15662: *      EVALX -- EVALUATE EXPRESSION
                   15663: *
                   15664: *      EVALX IS CALLED TO EVALUATE AN EXPRESSION
                   15665: *
                   15666: *      (XR)                  POINTER TO EXBLK OR SEBLK
                   15667: *      (WB)                  0 IF BY VALUE, 1 IF BY NAME
                   15668: *      JSR  EVALX            CALL TO EVALUATE EXPRESSION
                   15669: *      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
                   15670: *      (XR)                  RESULT IF CALLED BY VALUE
                   15671: *      (XL,WA)               RESULT NAME BASE,OFFSET IF BY NAME
                   15672: *      (XR)                  DESTROYED (NAME CASE ONLY)
                   15673: *      (XL,WA)               DESTROYED (VALUE CASE ONLY)
                   15674: *      (WB,WC,RA)            DESTROYED
                   15675: *
                   15676: EVALX  PRC  R,1              ENTRY POINT, RECURSIVE
                   15677:        BEQ  (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE
                   15678: *
                   15679: *      HERE FOR SEBLK
                   15680: *
                   15681:        MOV  SEVAR(XR),XL     LOAD VRBLK POINTER (NAME BASE)
                   15682:        MOV  *VRVAL,WA        SET NAME OFFSET
                   15683:        BNZ  WB,EVLX1         JUMP IF CALLED BY NAME
                   15684:        JSR  ACESS            CALL ROUTINE TO ACCESS VALUE
                   15685:        PPM  EVLX9            JUMP IF FAILURE ON ACCESS
                   15686: *
                   15687: *      MERGE HERE TO EXIT FOR SEBLK CASE
                   15688: *
                   15689: EVLX1  EXI                   RETURN TO EVALX CALLER
                   15690:        EJC
                   15691: *
                   15692: *      EVALX (CONTINUED)
                   15693: *
                   15694: *      HERE FOR FULL EXPRESSION (EXBLK) CASE
                   15695: *
                   15696: *      IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
                   15697: *      TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
                   15698: *      WITHOUT RETURNING TO THIS ROUTINE.
                   15699: *      THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
                   15700: *      GIVING CONTROL TO THE EXPRESSION CODE
                   15701: *
                   15702: *                            EVALX RETURN POINT
                   15703: *                            SAVED VALUE OF R$COD
                   15704: *                            CODE POINTER (-R$COD)
                   15705: *                            SAVED VALUE OF FLPTR
                   15706: *                            0 IF BY VALUE, 1 IF BY NAME
                   15707: *      FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
                   15708: *
                   15709: EVLX2  SCP  WC               GET CODE POINTER
                   15710:        MOV  R$COD,WA         LOAD CODE BLOCK POINTER
                   15711:        SUB  WA,WC            GET CODE POINTER AS OFFSET
                   15712:        MOV  WA,-(XS)         STACK OLD CODE BLOCK POINTER
                   15713:        MOV  WC,-(XS)         STACK RELATIVE CODE OFFSET
                   15714:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   15715:        MOV  WB,-(XS)         STACK NAME/VALUE INDICATOR
                   15716:        MOV  *EXFLC,-(XS)     STACK NEW FAIL OFFSET
                   15717:        MOV  FLPTR,GTCEF      KEEP IN CASE OF ERROR
                   15718:        MOV  R$COD,R$GTC      KEEP CODE BLOCK POINTER SIMILARLY
                   15719:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   15720:        MOV  XR,R$COD         SET NEW CODE BLOCK POINTER
                   15721:        MOV  KVSTN,EXSTM(XR)  REMEMBER STMNT NUMBER
                   15722:        ADD  *EXCOD,XR        POINT TO FIRST CODE WORD
                   15723:        LCP  XR               SET CODE POINTER
                   15724:        BNE  STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME
                   15725:        MOV  =STGEE,STAGE     EVALUATING EXPRESSION
                   15726:        BRN  EXITS            JUMP TO EXECUTE FIRST CODE WORD
                   15727:        EJC
                   15728: *
                   15729: *      EVALX (CONTINUED)
                   15730: *
                   15731: *      COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
                   15732: *
                   15733: EVLX3  MOV  (XS)+,XR         LOAD VALUE
                   15734:        BZE  1(XS),EVLX5      JUMP IF CALLED BY VALUE
                   15735:        ERB  249,EXPRESSION EVALUATED BY NAME RETURNED VALUE
                   15736: *
                   15737: *      HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
                   15738: *
                   15739: EVLX4  MOV  (XS)+,WA         LOAD NAME OFFSET
                   15740:        MOV  (XS)+,XL         LOAD NAME BASE
                   15741:        BNZ  1(XS),EVLX5      JUMP IF CALLED BY NAME
                   15742:        JSR  ACESS            ELSE ACCESS VALUE FIRST
                   15743:        PPM  EVLX6            JUMP IF FAILURE DURING ACCESS
                   15744: *
                   15745: *      HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
                   15746: *
                   15747: EVLX5  ZER  WB               NOTE SUCCESSFUL
                   15748:        BRN  EVLX7            MERGE
                   15749: *
                   15750: *      HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
                   15751: *
                   15752: EVLX6  MNZ  WB               NOTE UNSUCCESSFUL
                   15753: *
                   15754: *      RESTORE ENVIRONMENT
                   15755: *
                   15756: EVLX7  BNE  STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT
                   15757:        MOV  =STGXT,STAGE     EXECUTE TIME
                   15758: *
                   15759: *      MERGE WITH STAGE SET UP
                   15760: *
                   15761: EVLX8  ADD  *NUM02,XS        POP NAME/VALUE INDICATOR, *EXFAL
                   15762:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   15763:        MOV  (XS)+,WC         LOAD CODE OFFSET
                   15764:        ADD  (XS),WC          MAKE CODE POINTER ABSOLUTE
                   15765:        MOV  (XS)+,R$COD      RESTORE OLD CODE BLOCK POINTER
                   15766:        LCP  WC               RESTORE OLD CODE POINTER
                   15767:        BZE  WB,EVLX1         JUMP FOR SUCCESSFUL RETURN
                   15768: *
                   15769: *      MERGE HERE FOR FAILURE IN SEBLK CASE
                   15770: *
                   15771: EVLX9  EXI  1                TAKE FAILURE EXIT
                   15772:        ENP                   END OF PROCEDURE EVALX
                   15773:        EJC
                   15774: *
                   15775: *      EXBLD -- BUILD EXBLK
                   15776: *
                   15777: *      EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
                   15778: *      CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
                   15779: *
                   15780: *      (XL)                  OFFSET IN CCBLK TO START OF CODE
                   15781: *      (WB)                  INTEGER IN RANGE 0 LE N LE MXLEN
                   15782: *      JSR  EXBLD            CALL TO BUILD EXBLK
                   15783: *      (XR)                  PTR TO CONSTRUCTED EXBLK
                   15784: *      (WA,WB,XL)            DESTROYED
                   15785: *
                   15786: EXBLD  PRC  E,0              ENTRY POINT
                   15787:        MOV  XL,WA            COPY OFFSET TO START OF CODE
                   15788:        SUB  *EXCOD,WA        CALC REDUCTION IN OFFSET IN EXBLK
                   15789:        MOV  WA,-(XS)         STACK FOR LATER
                   15790:        MOV  CWCOF,WA         LOAD FINAL OFFSET
                   15791:        SUB  XL,WA            COMPUTE LENGTH OF CODE
                   15792:        ADD  *EXSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   15793:        JSR  ALLOC            ALLOCATE SPACE FOR EXBLK
                   15794:        MOV  XR,-(XS)         SAVE POINTER TO EXBLK
                   15795:        MOV  =B$EXL,EXTYP(XR) STORE TYPE WORD
                   15796:        ZER  EXSTM(XR)        ZEROISE STMNT NUMBER FIELD
                   15797:        MOV  WA,EXLEN(XR)     STORE LENGTH
                   15798:        MOV  =OFEX$,EXFLC(XR) STORE FAILURE WORD
                   15799:        ADD  *EXSI$,XR        SET XR FOR SYSMW
                   15800:        MOV  XL,CWCOF         RESET OFFSET TO START OF CODE
                   15801:        ADD  R$CCB,XL         POINT TO START OF CODE
                   15802:        SUB  *EXSI$,WA        LENGTH OF CODE TO MOVE
                   15803:        MOV  WA,-(XS)         STACK LENGTH OF CODE
                   15804:        MVW                   MOVE CODE TO EXBLK
                   15805:        MOV  (XS)+,WA         GET LENGTH OF CODE
                   15806:        BTW  WA               CONVERT BYTE COUNT TO WORD COUNT
                   15807:        LCT  WA,WA            PREPARE COUNTER FOR LOOP
                   15808:        MOV  (XS),XL          COPY EXBLK PTR, DONT UNSTACK
                   15809:        ADD  *EXCOD,XL        POINT TO CODE ITSELF
                   15810:        MOV  1(XS),WB         GET REDUCTION IN OFFSET
                   15811: *
                   15812: *      THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
                   15813: *      THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
                   15814: *      CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
                   15815: *      EXBLK.
                   15816: *
                   15817: EXBL1  MOV  (XL)+,XR         GET NEXT CODE WORD
                   15818:        BEQ  XR,=OSLA$,EXBL3  JUMP IF SELECTION FOUND
                   15819:        BEQ  XR,=ONTA$,EXBL3  JUMP IF NEGATION FOUND
                   15820:        BCT  WA,EXBL1         LOOP TO END OF CODE
                   15821: *
                   15822: *      NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
                   15823: *
                   15824: EXBL2  MOV  (XS)+,XR         POP EXBLK PTR INTO XR
                   15825:        MOV  (XS)+,XL         POP REDUCTION CONSTANT
                   15826:        EXI                   RETURN TO CALLER
                   15827:        EJC
                   15828: *
                   15829: *      EXBLD (CONTINUED)
                   15830: *
                   15831: *      SELECTION OR NEGATION FOUND
                   15832: *      REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
                   15833: *      FOLLOWING CODE WORDS -
                   15834: *           =ONTA$, =OSLA$, =OSLB$, =OSLC$
                   15835: *
                   15836: EXBL3  SUB  WB,(XL)+         ADJUST OFFSET
                   15837:        BCT  WA,EXBL4         DECREMENT COUNT
                   15838: *
                   15839: EXBL4  BCT  WA,EXBL5         DECREMENT COUNT
                   15840: *
                   15841: *      CONTINUE SEARCH FOR MORE OFFSETS
                   15842: *
                   15843: EXBL5  MOV  (XL)+,XR         GET NEXT CODE WORD
                   15844:        BEQ  XR,=OSLA$,EXBL3  JUMP IF OFFSET FOUND
                   15845:        BEQ  XR,=OSLB$,EXBL3  JUMP IF OFFSET FOUND
                   15846:        BEQ  XR,=OSLC$,EXBL3  JUMP IF OFFSET FOUND
                   15847:        BEQ  XR,=ONTA$,EXBL3  JUMP IF OFFSET FOUND
                   15848:        BCT  WA,EXBL5         LOOP
                   15849:        BRN  EXBL2            MERGE TO RETURN
                   15850:        ENP                   END PROCEDURE EXBLD
                   15851:        EJC
                   15852: *
                   15853: *      EXPAN -- ANALYZE EXPRESSION
                   15854: *
                   15855: *      THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
                   15856: *      AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
                   15857: *      SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
                   15858: *      SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
                   15859: *
                   15860: *      THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
                   15861: *      OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
                   15862: *      AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
                   15863: *      ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
                   15864: *      VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
                   15865: *
                   15866: *      0    SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
                   15867: *      1    SCANNING OUTER LEVEL OF NORMAL GOTO
                   15868: *      2    SCANNING OUTER LEVEL OF DIRECT GOTO
                   15869: *      3    SCANNING INSIDE ARRAY BRACKETS
                   15870: *      4    SCANNING INSIDE GROUPING PARENTHESES
                   15871: *      5    SCANNING INSIDE FUNCTION PARENTHESES
                   15872: *
                   15873: *      THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
                   15874: *      GROUPING AND RESTORED AT THE END OF THE GROUPING.
                   15875: *
                   15876: *      ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
                   15877: *      ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
                   15878: *      COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
                   15879: *
                   15880: *      THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
                   15881: *      A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
                   15882: *
                   15883: *      WA=0                  NOTHING SCANNED AT THIS LEVEL
                   15884: *      WA=1                  OPERAND EXPECTED
                   15885: *      WA=2                  OPERATOR EXPECTED
                   15886: *
                   15887: *      (WB)                  CALL TYPE (SEE BELOW)
                   15888: *      JSR  EXPAN            CALL TO ANALYZE EXPRESSION
                   15889: *      (XR)                  POINTER TO RESULTING TREE
                   15890: *      (XL,WA,WB,WC,RA)      DESTROYED
                   15891: *
                   15892: *      THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
                   15893: *
                   15894: *      0    SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
                   15895: *           TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
                   15896: *           TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
                   15897: *           SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
                   15898: *
                   15899: *      1    SCANNING A NORMAL GOTO. THE ONLY VALID
                   15900: *           TERMINATOR IS A RIGHT PAREN.
                   15901: *
                   15902: *      2    SCANNING A DIRECT GOTO. THE ONLY VALID
                   15903: *           TERMINATOR IS A RIGHT BRACKET.
                   15904:        EJC
                   15905: *
                   15906: *      EXPAN (CONTINUED)
                   15907: *
                   15908: *      ENTRY POINT
                   15909: *
                   15910: EXPAN  PRC  E,0              ENTRY POINT
                   15911:        ZER  -(XS)            SET TOP OF STACK INDICATOR
                   15912:        ZER  WA               SET INITIAL STATE TO ZERO
                   15913:        ZER  WC               ZERO COUNTER VALUE
                   15914: *
                   15915: *      LOOP HERE FOR SUCCESSIVE ENTRIES
                   15916: *
                   15917: EXP01  JSR  SCANE            SCAN NEXT ELEMENT
                   15918:        ADD  WA,XL            ADD STATE TO SYNTAX CODE
                   15919:        BSW  XL,T$NES         SWITCH ON ELEMENT TYPE/STATE
                   15920:        IFF  T$VA0,EXP03      VARIABLE, S=0
                   15921:        IFF  T$VA1,EXP03      VARIABLE, STATE ONE
                   15922:        IFF  T$VA2,EXP04      VARIABLE, S=2
                   15923:        IFF  T$CO0,EXP03      CONSTANT, S=0
                   15924:        IFF  T$CO1,EXP03      CONSTANT, S=1
                   15925:        IFF  T$CO2,EXP04      CONSTANT, S=2
                   15926:        IFF  T$LP0,EXP06      LEFT PAREN, S=0
                   15927:        IFF  T$LP1,EXP06      LEFT PAREN, S=1
                   15928:        IFF  T$LP2,EXP04      LEFT PAREN, S=2
                   15929:        IFF  T$FN0,EXP10      FUNCTION, S=0
                   15930:        IFF  T$FN1,EXP10      FUNCTION, S=1
                   15931:        IFF  T$FN2,EXP04      FUNCTION, S=2
                   15932:        IFF  T$RP0,EXP02      RIGHT PAREN, S=0
                   15933:        IFF  T$RP1,EXP05      RIGHT PAREN, S=1
                   15934:        IFF  T$RP2,EXP12      RIGHT PAREN, S=2
                   15935:        IFF  T$LB0,EXP08      LEFT BRKT, S=0
                   15936:        IFF  T$LB1,EXP08      LEFT BRKT, S=1
                   15937:        IFF  T$LB2,EXP09      LEFT BRKT, S=2
                   15938:        IFF  T$RB0,EXP02      RIGHT BRKT, S=0
                   15939:        IFF  T$RB1,EXP05      RIGHT BRKT, S=1
                   15940:        IFF  T$RB2,EXP18      RIGHT BRKT, S=2
                   15941:        IFF  T$UO0,EXP27      UNOP, S=0
                   15942:        IFF  T$UO1,EXP27      UNOP, S=1
                   15943:        IFF  T$UO2,EXP04      UNOP, S=2
                   15944:        IFF  T$BO0,EXP05      BINOP, S=0
                   15945:        IFF  T$BO1,EXP05      BINOP, S=1
                   15946:        IFF  T$BO2,EXP26      BINOP, S=2
                   15947:        IFF  T$CM0,EXP02      COMMA, S=0
                   15948:        IFF  T$CM1,EXP05      COMMA, S=1
                   15949:        IFF  T$CM2,EXP11      COMMA, S=2
                   15950:        IFF  T$CL0,EXP02      COLON, S=0
                   15951:        IFF  T$CL1,EXP05      COLON, S=1
                   15952:        IFF  T$CL2,EXP19      COLON, S=2
                   15953:        IFF  T$SM0,EXP02      SEMICOLON, S=0
                   15954:        IFF  T$SM1,EXP05      SEMICOLON, S=1
                   15955:        IFF  T$SM2,EXP19      SEMICOLON, S=2
                   15956:        ESW                   END SWITCH ON ELEMENT TYPE/STATE
                   15957:        EJC
                   15958: *
                   15959: *      EXPAN (CONTINUED)
                   15960: *
                   15961: *      HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
                   15962: *
                   15963: *      SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
                   15964: *      A NULL CONSTANT (CASE OF OMITTED NULL)
                   15965: *
                   15966: EXP02  MNZ  SCNRS            SET TO RESCAN ELEMENT
                   15967:        MOV  =NULLS,XR        POINT TO NULL, MERGE
                   15968: *
                   15969: *      HERE FOR VAR OR CON IN STATES 0,1
                   15970: *
                   15971: *      STACK THE VARIABLE/CONSTANT AND SET STATE=2
                   15972: *
                   15973: EXP03  MOV  XR,-(XS)         STACK POINTER TO OPERAND
                   15974:        MOV  =NUM02,WA        SET STATE 2
                   15975:        BRN  EXP01            JUMP FOR NEXT ELEMENT
                   15976: *
                   15977: *      HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
                   15978: *
                   15979: *      WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
                   15980: *      THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
                   15981: *
                   15982: EXP04  MNZ  SCNRS            SET TO RESCAN ELEMENT
                   15983:        MOV  =OPDVC,XR        POINT TO CONCAT OPERATOR DV
                   15984:        BZE  WB,EXP4A         OK IF AT TOP LEVEL
                   15985:        MOV  =OPDVP,XR        ELSE POINT TO UNMISTAKABLE CONCAT.
                   15986: *
                   15987: *      MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK
                   15988: *
                   15989: EXP4A  BNZ  SCNBL,EXP26      MERGE BOP IF BLANKS, ELSE ERROR
                   15990:        DCV  SCNSE            ADJUST START OF ELEMENT LOCATION
                   15991:        ERB  220,SYNTAX ERROR. MISSING OPERATOR
                   15992: *
                   15993: *      HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
                   15994: *
                   15995: *      THIS IS AN ERRONOUS CONTRUCTION
                   15996: *
                   15997: EXP05  DCV  SCNSE            ADJUST START OF ELEMENT LOCATION
                   15998:        ERB  221,SYNTAX ERROR. MISSING OPERAND
                   15999: *
                   16000: *      HERE FOR LPR (S=0,1)
                   16001: *
                   16002: EXP06  MOV  =NUM04,XL        SET NEW LEVEL INDICATOR
                   16003:        ZER  XR               SET ZERO VALUE FOR CMOPN
                   16004:        EJC
                   16005: *
                   16006: *      EXPAN (CONTINUED)
                   16007: *
                   16008: *      MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
                   16009: *
                   16010: EXP07  MOV  XR,-(XS)         STACK CMOPN VALUE
                   16011:        MOV  WC,-(XS)         STACK OLD COUNTER
                   16012:        MOV  WB,-(XS)         STACK OLD LEVEL INDICATOR
                   16013:        CHK                   CHECK FOR STACK OVERFLOW
                   16014:        ZER  WA               SET NEW STATE TO ZERO
                   16015:        MOV  XL,WB            SET NEW LEVEL INDICATOR
                   16016:        MOV  =NUM01,WC        INITIALIZE NEW COUNTER
                   16017:        BRN  EXP01            JUMP TO SCAN NEXT ELEMENT
                   16018: *
                   16019: *      HERE FOR LBR (S=0,1)
                   16020: *
                   16021: *      THIS IS AN ILLEGAL USE OF LEFT BRACKET
                   16022: *
                   16023: EXP08  ERB  222,SYNTAX ERROR. INVALID USE OF LEFT BRACKET
                   16024: *
                   16025: *      HERE FOR LBR (S=2)
                   16026: *
                   16027: *      SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
                   16028: *
                   16029: EXP09  MOV  (XS)+,XR         LOAD ARRAY PTR FOR CMOPN
                   16030:        MOV  =NUM03,XL        SET NEW LEVEL INDICATOR
                   16031:        BRN  EXP07            JUMP TO STACK OLD AND START NEW
                   16032: *
                   16033: *      HERE FOR FNC (S=0,1)
                   16034: *
                   16035: *      STACK OLD LEVEL AND START TO SCAN ARGUMENTS
                   16036: *
                   16037: EXP10  MOV  =NUM05,XL        SET NEW LEV INDIC (XR=VRBLK=CMOPN)
                   16038:        BRN  EXP07            JUMP TO STACK OLD AND START NEW
                   16039: *
                   16040: *      HERE FOR CMA (S=2)
                   16041: *
                   16042: *      INCREMENT ARGUMENT COUNT AND CONTINUE
                   16043: *
                   16044: EXP11  ICV  WC               INCREMENT COUNTER
                   16045:        JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
                   16046:        ZER  -(XS)            SET NEW LEVEL FOR PARAMETER
                   16047:        ZER  WA               SET NEW STATE
                   16048:        BGT  WB,=NUM02,EXP01  LOOP BACK UNLESS OUTER LEVEL
                   16049:        ERB  223,SYNTAX ERROR. INVALID USE OF COMMA
                   16050:        EJC
                   16051: *
                   16052: *      EXPAN (CONTINUED)
                   16053: *
                   16054: *      HERE FOR RPR (S=2)
                   16055: *
                   16056: *      AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
                   16057: *      OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
                   16058: *
                   16059: EXP12  BEQ  WB,=NUM01,EXP20  END OF NORMAL GOTO
                   16060:        BEQ  WB,=NUM05,EXP13  END OF FUNCTION ARGUMENTS
                   16061:        BEQ  WB,=NUM04,EXP14  END OF GROUPING / SELECTION
                   16062:        ERB  224,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS
                   16063: *
                   16064: *      HERE AT END OF FUNCTION ARGUMENTS
                   16065: *
                   16066: EXP13  MOV  =C$FNC,XL        SET CMTYP VALUE FOR FUNCTION
                   16067:        BRN  EXP15            JUMP TO BUILD CMBLK
                   16068: *
                   16069: *      HERE FOR END OF GROUPING
                   16070: *
                   16071: EXP14  BEQ  WC,=NUM01,EXP17  JUMP IF END OF GROUPING
                   16072:        MOV  =C$SEL,XL        ELSE SET CMTYP FOR SELECTION
                   16073: *
                   16074: *      MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
                   16075: *      TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
                   16076: *
                   16077: EXP15  JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
                   16078:        MOV  WC,WA            COPY COUNT
                   16079:        ADD  =CMVLS,WA        ADD FOR STANDARD FIELDS AT START
                   16080:        WTB  WA               CONVERT LENGTH TO BYTES
                   16081:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
                   16082:        MOV  =B$CMT,(XR)      STORE TYPE CODE FOR CMBLK
                   16083:        MOV  XL,CMTYP(XR)     STORE CMBLK NODE TYPE INDICATOR
                   16084:        MOV  WA,CMLEN(XR)     STORE LENGTH
                   16085:        ADD  WA,XR            POINT PAST END OF BLOCK
                   16086:        LCT  WC,WC            SET LOOP COUNTER
                   16087: *
                   16088: *      LOOP TO MOVE REMAINING WORDS TO CMBLK
                   16089: *
                   16090: EXP16  MOV  (XS)+,-(XR)      MOVE ONE OPERAND PTR FROM STACK
                   16091:        MOV  (XS)+,WB         POP TO OLD LEVEL INDICATOR
                   16092:        BCT  WC,EXP16         LOOP TILL ALL MOVED
                   16093:        EJC
                   16094: *
                   16095: *      EXPAN (CONTINUED)
                   16096: *
                   16097: *      COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
                   16098: *
                   16099:        SUB  *CMVLS,XR        POINT BACK TO START OF BLOCK
                   16100:        MOV  (XS)+,WC         RESTORE OLD COUNTER
                   16101:        MOV  (XS),CMOPN(XR)   STORE OPERAND PTR IN CMBLK
                   16102:        MOV  XR,(XS)          STACK CMBLK POINTER
                   16103:        MOV  =NUM02,WA        SET NEW STATE
                   16104:        BRN  EXP01            BACK FOR NEXT ELEMENT
                   16105: *
                   16106: *      HERE AT END OF A PARENTHESIZED EXPRESSION
                   16107: *
                   16108: EXP17  JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
                   16109:        MOV  (XS)+,XR         RESTORE XR
                   16110:        MOV  (XS)+,WB         RESTORE OUTER LEVEL
                   16111:        MOV  (XS)+,WC         RESTORE OUTER COUNT
                   16112:        MOV  XR,(XS)          STORE OPND OVER UNUSED CMOPN VAL
                   16113:        MOV  =NUM02,WA        SET NEW STATE
                   16114:        BRN  EXP01            BACK FOR NEXT ELE8ENT
                   16115: *
                   16116: *      HERE FOR RBR (S=2)
                   16117: *
                   16118: *      AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
                   16119: *      OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
                   16120: *
                   16121: EXP18  MOV  =C$ARR,XL        SET CMTYP FOR ARRAY REFERENCE
                   16122:        BEQ  WB,=NUM03,EXP15  JUMP TO BUILD CMBLK IF END ARRAYREF
                   16123:        BEQ  WB,=NUM02,EXP20  JUMP IF END OF DIRECT GOTO
                   16124:        ERB  225,SYNTAX ERROR. UNBALANCED RIGHT BRACKET
                   16125:        EJC
                   16126: *
                   16127: *      EXPAN (CONTINUED)
                   16128: *
                   16129: *      HERE FOR COL,SMC (S=2)
                   16130: *
                   16131: *      ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
                   16132: *
                   16133: EXP19  MNZ  SCNRS            RESCAN TERMINATOR
                   16134:        MOV  WB,XL            COPY LEVEL INDICATOR
                   16135:        BSW  XL,6             SWITCH ON LEVEL INDICATOR
                   16136:        IFF  0,EXP20          NORMAL OUTER LEVEL
                   16137:        IFF  1,EXP22          FAIL IF NORMAL GOTO
                   16138:        IFF  2,EXP23          FAIL IF DIRECT GOTO
                   16139:        IFF  3,EXP24          FAIL ARRAY BRACKETS
                   16140:        IFF  4,EXP21          FAIL IF IN GROUPING
                   16141:        IFF  5,EXP21          FAIL FUNCTION ARGS
                   16142:        ESW                   END SWITCH ON LEVEL
                   16143: *
                   16144: *      HERE AT NORMAL END OF EXPRESSION
                   16145: *
                   16146: EXP20  JSR  EXPDM            DUMP REMAINING OPERATORS
                   16147:        MOV  (XS)+,XR         LOAD TREE POINTER
                   16148:        ICA  XS               POP OFF BOTTOM OF STACK MARKER
                   16149:        EXI                   RETURN TO EXPAN CALLER
                   16150: *
                   16151: *      MISSING RIGHT PAREN
                   16152: *
                   16153: EXP21  ERB  226,SYNTAX ERROR. MISSING RIGHT PAREN
                   16154: *
                   16155: *      MISSING RIGHT PAREN IN GOTO FIELD
                   16156: *
                   16157: EXP22  ERB  227,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO
                   16158: *
                   16159: *      MISSING BRACKET IN GOTO
                   16160: *
                   16161: EXP23  ERB  228,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO
                   16162: *
                   16163: *      MISSING ARRAY BRACKET
                   16164: *
                   16165: EXP24  ERB  229,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET
                   16166:        EJC
                   16167: *
                   16168: *      EXPAN (CONTINUED)
                   16169: *
                   16170: *      LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
                   16171: *
                   16172: EXP25  MOV  XR,EXPSV
                   16173:        JSR  EXPOP            POP ONE OPERATOR
                   16174:        MOV  EXPSV,XR         RESTORE OP DV POINTER AND MERGE
                   16175: *
                   16176: *      HERE FOR BOP (S=2)
                   16177: *
                   16178: *      REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
                   16179: *      LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
                   16180: *      LOOP HERE TILL THIS CONDITION IS MET.
                   16181: *
                   16182: EXP26  MOV  1(XS),XL         LOAD OPERATOR DVPTR FROM STACK
                   16183:        BLE  XL,=NUM05,EXP27  JUMP IF BOTTOM OF STACK LEVEL
                   16184:        BLT  DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO
                   16185: *
                   16186: *      HERE FOR UOP (S=0,1)
                   16187: *
                   16188: *      BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
                   16189: *
                   16190: *      THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
                   16191: *      CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
                   16192: *
                   16193: EXP27  MOV  XR,-(XS)         STACK OPERATOR DVPTR ON STACK
                   16194:        CHK                   CHECK FOR STACK OVERFLOW
                   16195:        MOV  =NUM01,WA        SET NEW STATE
                   16196:        BNE  XR,=OPDVS,EXP01  BACK FOR NEXT ELEMENT UNLESS =
                   16197: *
                   16198: *      HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
                   16199: *      NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
                   16200: *      OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
                   16201: *      ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
                   16202: *
                   16203:        ZER  WA               SET STATE ZERO
                   16204:        BRN  EXP01            JUMP FOR NEXT ELEMENT
                   16205:        ENP                   END PROCEDURE EXPAN
                   16206:        EJC
                   16207: *
                   16208: *      EXPAP -- TEST FOR PATTERN MATCH TREE
                   16209: *
                   16210: *      EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
                   16211: *      IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
                   16212: *      MATCHES IN THE CONTEXT OF THIS CALL.
                   16213: *
                   16214: *      1)   AN EXPLICIT USE OF BINARY QUESTION MARK
                   16215: *      2)   A CONCATENATION
                   16216: *      3)   AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
                   16217: *
                   16218: *      (XR)                  PTR TO EXPAN TREE
                   16219: *      JSR  EXPAP            CALL TO TEST FOR PATTERN MATCH
                   16220: *      PPM  LOC              TRANSFER LOC IF NOT A PATTERN MATCH
                   16221: *      (WA)                  DESTROYED
                   16222: *      (XR)                  UNCHANGED (IF NOT MATCH)
                   16223: *      (XR)                  PTR TO BINARY OPERATOR BLK IF MATCH
                   16224: *
                   16225: EXPAP  PRC  E,1              ENTRY POINT
                   16226:        MOV  XL,-(XS)         SAVE XL
                   16227:        BNE  (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX
                   16228:        MOV  CMTYP(XR),WA     ELSE LOAD TYPE CODE
                   16229:        BEQ  WA,=C$CNC,EXPP1  CONCATENATION IS A MATCH
                   16230:        BEQ  WA,=C$PMT,EXPP1  BINARY QUESTION MARK IS A MATCH
                   16231:        BNE  WA,=C$ALT,EXPP2  ELSE NOT MATCH UNLESS ALTERNATION
                   16232: *
                   16233: *      HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
                   16234: *
                   16235:        MOV  CMLOP(XR),XL     LOAD LEFT OPERAND POINTER
                   16236:        BNE  (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX
                   16237:        BNE  CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC
                   16238:        MOV  CMROP(XL),CMLOP(XR) XR POINTS TO (B / C)
                   16239:        MOV  XR,CMROP(XL)     SET XL OPNDS TO A, (B / C)
                   16240:        MOV  XL,XR            POINT TO THIS ALTERED NODE
                   16241: *
                   16242: *      EXIT HERE FOR PATTERN MATCH
                   16243: *
                   16244: EXPP1  MOV  (XS)+,XL         RESTORE ENTRY XL
                   16245:        EXI                   GIVE PATTERN MATCH RETURN
                   16246: *
                   16247: *      EXIT HERE IF NOT PATTERN MATCH
                   16248: *
                   16249: EXPP2  MOV  (XS)+,XL         RESTORE ENTRY XL
                   16250:        EXI  1                GIVE NON-MATCH RETURN
                   16251:        ENP                   END PROCEDURE EXPAP
                   16252:        EJC
                   16253: *
                   16254: *      EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
                   16255: *
                   16256: *      EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
                   16257: *      LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
                   16258: *      VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
                   16259: *
                   16260: *      JSR  EXPDM            CALL TO DUMP OPERATORS
                   16261: *      (XS)                  POPPED AS REQUIRED
                   16262: *      (XR,WA)               DESTROYED
                   16263: *
                   16264: EXPDM  PRC  N,0              ENTRY POINT
                   16265:        MOV  XL,R$EXS         SAVE XL VALUE
                   16266: *
                   16267: *      LOOP TO DUMP OPERATORS
                   16268: *
                   16269: EXDM1  BLE  1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL
                   16270:        JSR  EXPOP            ELSE POP ONE OPERATOR
                   16271:        BRN  EXDM1            AND LOOP BACK
                   16272: *
                   16273: *      HERE AFTER POPPING ALL OPERATORS
                   16274: *
                   16275: EXDM2  MOV  R$EXS,XL         RESTORE XL
                   16276:        ZER  R$EXS            RELEASE SAVE LOCATION
                   16277:        EXI                   RETURN TO EXPDM CALLER
                   16278:        ENP                   END PROCEDURE EXPDM
                   16279:        EJC
                   16280: *
                   16281: *      EXPOP-- POP OPERATOR (FOR EXPAN)
                   16282: *
                   16283: *      EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
                   16284: *      OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
                   16285: *      CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
                   16286: *      POINTER TO THIS CMBLK IS STACKED.
                   16287: *
                   16288: *      EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
                   16289: *
                   16290: *      JSR  EXPOP            CALL TO POP OPERATOR
                   16291: *      (XS)                  POPPED APPROPRIATELY
                   16292: *      (XR,XL,WA)            DESTROYED
                   16293: *
                   16294: EXPOP  PRC  N,0              ENTRY POINT
                   16295:        MOV  1(XS),XR         LOAD OPERATOR DV POINTER
                   16296:        BEQ  DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY
                   16297: *
                   16298: *      HERE FOR BINARY OPERATOR
                   16299: *
                   16300:        MOV  *CMBS$,WA        SET SIZE OF BINARY OPERATOR CMBLK
                   16301:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
                   16302:        MOV  (XS)+,CMROP(XR)  POP AND STORE RIGHT OPERAND PTR
                   16303:        MOV  (XS)+,XL         POP AND LOAD OPERATOR DV PTR
                   16304:        MOV  (XS),CMLOP(XR)   STORE LEFT OPERAND POINTER
                   16305: *
                   16306: *      COMMON EXIT POINT
                   16307: *
                   16308: EXPO1  MOV  =B$CMT,(XR)      STORE TYPE CODE FOR CMBLK
                   16309:        MOV  DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE
                   16310:        MOV  XL,CMOPN(XR)     STORE DVPTR (=PTR TO DAC O$XXX)
                   16311:        MOV  WA,CMLEN(XR)     STORE CMBLK LENGTH
                   16312:        MOV  XR,(XS)          STORE RESULTING NODE PTR ON STACK
                   16313:        EXI                   RETURN TO EXPOP CALLER
                   16314: *
                   16315: *      HERE FOR UNARY OPERATOR
                   16316: *
                   16317: EXPO2  MOV  *CMUS$,WA        SET SIZE OF UNARY OPERATOR CMBLK
                   16318:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
                   16319:        MOV  (XS)+,CMROP(XR)  POP AND STORE OPERAND POINTER
                   16320:        MOV  (XS),XL          LOAD OPERATOR DV POINTER
                   16321:        BRN  EXPO1            MERGE BACK TO EXIT
                   16322:        ENP                   END PROCEDURE EXPOP
                   16323:        EJC
                   16324: .IF    .CULC
                   16325: *
                   16326: *      FLSTG -- FOLD STRING TO UPPER CASE
                   16327: *
                   16328: *      FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE
                   16329: *      CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS.
                   16330: *      FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO.
                   16331: *
                   16332: *      (XR)                  STRING ARGUMENT
                   16333: *      (WA)                  LENGTH OF STRING
                   16334: *      JSR  FLSTG            CALL TO FOLD STRING
                   16335: *      (XR)                  RESULT STRING (POSSIBLY ORIGINAL)
                   16336: *      (WC)                  DESTROYED
                   16337: *
                   16338: FLSTG  PRC  R,0              ENTRY POINT
                   16339:        BZE  KVCAS,FST99      SKIP IF &CASE IS 0
                   16340:        MOV  XL,-(XS)         SAVE XL ACROSS CALL
                   16341:        MOV  XR,-(XS)         SAVE ORIGINAL SCBLK PTR
                   16342:        JSR  ALOCS            ALLOCATE NEW STRING BLOCK
                   16343:        MOV  (XS),XL          POINT TO ORIGINAL SCBLK
                   16344:        MOV  XR,-(XS)         SAVE POINTER TO NEW SCBLK
                   16345:        PLC  XL               POINT TO ORIGINAL CHARS
                   16346:        PLC  XR               POINT TO NEW CHARS
                   16347:        ZER  -(XS)            INIT DID FOLD FLAG
                   16348:        LCT  WC,WC            LOAD LOOP COUNTER
                   16349: FST01  LCH  WA,(XL)+         LOAD CHARACTER
                   16350:        BGT  =CH$$A,WA,FST02  SKIP IF LESS THAN LC A
                   16351:        BGT  WA,=CH$$$,FST02  SKIP IF GREATER THAN LC Z
                   16352:        FLC  WA               FOLD CHARACTER TO UPPER CASE
                   16353:        MNZ  (XS)             SET DID FOLD CHARACTER FLAG
                   16354: FST02  SCH  WA,(XR)+         STORE (POSSIBLY FOLDED) CHARACTER
                   16355:        BCT  WC,FST01         LOOP THRU ENTIRE STRING
                   16356:        CSC  XR               COMPLETE STORE CHARACTERS
                   16357:        BNZ  (XS)+,FST10      SKIP IF FOLDING DONE
                   16358:        MOV  (XS)+,DNAMP      DO NOT NEED NEW SCBLK
                   16359:        MOV  (XS)+,XR         RETURN ORIGINAL SCBLK
                   16360:        BRN  FST20            MERGE BELOW
                   16361: FST10  MOV  (XS)+,XR         RETURN NEW SCBLK
                   16362:        ICA  XS               THROW AWAY ORIGINAL SCBLK POINTER
                   16363: FST20  MOV  SCLEN(XR),WA     RELOAD STRING LENGTH
                   16364:        MOV  (XS)+,XL         RESTORE XL
                   16365: FST99  EXI                   RETURN
                   16366:        ENP
                   16367:        EJC
                   16368: .FI
                   16369: *
                   16370: *      GBCOL -- PERFORM GARBAGE COLLECTION
                   16371: *
                   16372: *      GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
                   16373: *      ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
                   16374: *      BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
                   16375: *      DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
                   16376: *
                   16377: *      (WB)                  MOVE OFFSET (SEE BELOW)
                   16378: *      JSR  GBCOL            CALL TO COLLECT GARBAGE
                   16379: *      (XR)                  DESTROYED
                   16380: *
                   16381: *      THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
                   16382: *      GBCOL IS CALLED.
                   16383: *
                   16384: *      1)   ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
                   16385: *           ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
                   16386: *           THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
                   16387: *
                   16388: *           A)               MAIN STACK, WITH CURRENT TOP
                   16389: *                            ELEMENT BEING INDICATED BY XS
                   16390: *
                   16391: *           B)               IN RELOCATABLE FIELDS OF VRBLKS.
                   16392: *
                   16393: *           C)               IN REGISTER XL AT THE TIME OF CALL
                   16394: *
                   16395: *           E)               IN THE SPECIAL REGION OF WORKING
                   16396: *                            STORAGE WHERE NAMES BEGIN WITH R$.
                   16397: *
                   16398: *      2)   ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
                   16399: *           THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
                   16400: *           POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
                   16401: *
                   16402: *      3)   NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
                   16403: *           INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
                   16404: *           FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
                   16405: *           POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
                   16406: *           NOT BE CHANGED BY THE GARBAGE COLLECTOR.
                   16407: *           IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
                   16408: *           DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
                   16409: *           CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
                   16410: *
                   16411: *      GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
                   16412: *      RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
                   16413: *      THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
                   16414: *      ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP.
                   16415: *      THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
                   16416: *      FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
                   16417: *      LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
                   16418:        EJC
                   16419: *
                   16420: *      GBCOL (CONTINUED)
                   16421: *
                   16422: *      THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
                   16423: *      GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
                   16424: *      TAKES THREE PASSES AS FOLLOWS.
                   16425: *
                   16426: *      1)   ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
                   16427: *           DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
                   16428: *           IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
                   16429: *           THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
                   16430: *           A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
                   16431: *           ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
                   16432: *
                   16433: *           THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
                   16434: *           CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
                   16435: *           CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
                   16436: *           TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
                   16437: *           COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
                   16438: *           OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
                   16439: *           THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
                   16440: *           OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
                   16441: *           THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
                   16442: *           INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
                   16443: *           REFERENCES FOR THE RELOCATION PHASE.
                   16444: *
                   16445: *      2)   STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
                   16446: *           BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
                   16447: *           PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
                   16448: *           ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
                   16449: *           IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
                   16450: *           IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
                   16451: *           BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
                   16452: *           AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
                   16453: *           CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
                   16454: *           THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
                   16455: *           ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
                   16456: *           THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
                   16457: *           THE CHAIN IS RESTORED AT THIS POINT.
                   16458: *
                   16459: *           DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
                   16460: *           DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
                   16461: *           MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
                   16462: *           EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
                   16463: *           IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
                   16464: *           CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
                   16465: *           OF WORDS TO BE MOVED.
                   16466: *
                   16467: *      3)   IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
                   16468: *           BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
                   16469: *           THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
                   16470: *           THE COLLECTION IS THEN COMPLETE AND THE NEXT
                   16471: *           AVAILABLE LOCATION POINTER IS RESET.
                   16472:        EJC
                   16473: *
                   16474: *      GBCOL (CONTINUED)
                   16475: *
                   16476: GBCOL  PRC  E,0              ENTRY POINT
                   16477:        BNZ  DMVCH,GBC14      FAIL IF IN MID-DUMP
                   16478:        MNZ  GBCFL            NOTE GBCOL ENTERED
                   16479:        MOV  WA,GBSVA         SAVE ENTRY WA
                   16480:        MOV  WB,GBSVB         SAVE ENTRY WB
                   16481:        MOV  WC,GBSVC         SAVE ENTRY WC
                   16482:        MOV  XL,-(XS)         SAVE ENTRY XL
                   16483:        SCP  WA               GET CODE POINTER VALUE
                   16484:        SUB  R$COD,WA         MAKE RELATIVE
                   16485:        LCP  WA               AND RESTORE
                   16486: *
                   16487: *      PROCESS STACK ENTRIES
                   16488: *
                   16489:        MOV  XS,XR            POINT TO STACK FRONT
                   16490:        MOV  STBAS,XL         POINT PAST END OF STACK
                   16491:        BGE  XL,XR,GBC00      OK IF D-STACK
                   16492:        MOV  XL,XR            REVERSE IF ...
                   16493:        MOV  XS,XL            ... U-STACK
                   16494: *
                   16495: *      PROCESS THE STACK
                   16496: *
                   16497: GBC00  JSR  GBCPF            PROCESS POINTERS ON STACK
                   16498: *
                   16499: *      PROCESS SPECIAL WORK LOCATIONS
                   16500: *
                   16501:        MOV  =R$AAA,XR        POINT TO START OF RELOCATABLE LOCS
                   16502:        MOV  =R$YYY,XL        POINT PAST END OF RELOCATABLE LOCS
                   16503:        JSR  GBCPF            PROCESS WORK FIELDS
                   16504: *
                   16505: *      PREPARE TO PROCESS VARIABLE BLOCKS
                   16506: *
                   16507:        MOV  HSHTB,WA         POINT TO FIRST HASH SLOT POINTER
                   16508: *
                   16509: *      LOOP THROUGH HASH SLOTS
                   16510: *
                   16511: GBC01  MOV  WA,XL            POINT TO NEXT SLOT
                   16512:        ICA  WA               BUMP BUCKET POINTER
                   16513:        MOV  WA,GBCNM         SAVE BUCKET POINTER
                   16514:        EJC
                   16515: *
                   16516: *      GBCOL (CONTINUED)
                   16517: *
                   16518: *      LOOP THROUGH VARIABLES ON ONE HASH CHAIN
                   16519: *
                   16520: GBC02  MOV  (XL),XR          LOAD PTR TO NEXT VRBLK
                   16521:        BZE  XR,GBC03         JUMP IF END OF CHAIN
                   16522:        MOV  XR,XL            ELSE COPY VRBLK POINTER
                   16523:        ADD  *VRVAL,XR        POINT TO FIRST RELOC FLD
                   16524:        ADD  *VRNXT,XL        POINT PAST LAST (AND TO LINK PTR)
                   16525:        JSR  GBCPF            PROCESS RELOC FIELDS IN VRBLK
                   16526:        BRN  GBC02            LOOP BACK FOR NEXT BLOCK
                   16527: *
                   16528: *      HERE AT END OF ONE HASH CHAIN
                   16529: *
                   16530: GBC03  MOV  GBCNM,WA         RESTORE BUCKET POINTER
                   16531:        BNE  WA,HSHTE,GBC01   LOOP BACK IF MORE BUCKETS TO GO
                   16532:        EJC
                   16533: *
                   16534: *      GBCOL (CONTINUED)
                   16535: *
                   16536: *      NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
                   16537: *      AS FOLLOWS IN PASS TWO.
                   16538: *
                   16539: *      (XR)                  SCANS THROUGH ALL BLOCKS
                   16540: *      (WC)                  POINTER TO EVENTUAL LOCATION
                   16541: *
                   16542: *      THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
                   16543: *      THE FOLLOWING FORMAT.
                   16544: *
                   16545: *      WORD 1                POINTER TO NEXT MOVE BLOCK,
                   16546: *                            ZERO IF END OF CHAIN OF BLOCKS
                   16547: *
                   16548: *      WORD 2                LENGTH OF BLOCKS TO BE MOVED IN
                   16549: *                            BYTES. SET TO THE ADDRESS OF THE
                   16550: *                            FIRST BYTE WHILE ACTUALLY SCANNING
                   16551: *                            THE BLOCKS.
                   16552: *
                   16553: *      THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
                   16554: *      CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
                   16555: *      BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
                   16556: *      THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
                   16557: *      BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
                   16558: *      BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
                   16559: *
                   16560: GBC04  MOV  DNAMB,XR         POINT TO FIRST BLOCK
                   16561:        MOV  XR,WC            SET AS FIRST EVENTUAL LOCATION
                   16562:        ADD  GBSVB,WC         ADD OFFSET FOR EVENTUAL MOVE UP
                   16563:        ZER  GBCNM            CLEAR INITIAL FORWARD POINTER
                   16564:        MOV  =GBCNM,GBCLM     INITIALIZE PTR TO LAST MOVE BLOCK
                   16565:        MOV  XR,GBCNS         INITIALIZE FIRST ADDRESS
                   16566: *
                   16567: *      LOOP THROUGH A SERIES OF BLOCKS IN USE
                   16568: *
                   16569: GBC05  BEQ  XR,DNAMP,GBC07   JUMP IF END OF USED REGION
                   16570:        MOV  (XR),WA          ELSE GET FIRST WORD
                   16571:        BHI  WA,=P$YYY,GBC06  SKIP IF NOT ENTRY PTR (IN USE)
                   16572:        BHI  WA,=B$AAA,GBC07  JUMP IF ENTRY POINTER (UNUSED)
                   16573: *
                   16574: *      HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
                   16575: *
                   16576: GBC06  MOV  WA,XL            COPY POINTER
                   16577:        MOV  (XL),WA          LOAD FORWARD POINTER
                   16578:        MOV  WC,(XL)          RELOCATE REFERENCE
                   16579:        BHI  WA,=P$YYY,GBC06  LOOP BACK IF NOT END OF CHAIN
                   16580:        BLO  WA,=B$AAA,GBC06  LOOP BACK IF NOT END OF CHAIN
                   16581:        EJC
                   16582: *
                   16583: *      GBCOL (CONTINUED)
                   16584: *
                   16585: *      AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
                   16586: *
                   16587:        MOV  WA,(XR)          RESTORE FIRST WORD
                   16588:        JSR  BLKLN            GET LENGTH OF THIS BLOCK
                   16589:        ADD  WA,XR            BUMP ACTUAL POINTER
                   16590:        ADD  WA,WC            BUMP EVENTUAL POINTER
                   16591:        BRN  GBC05            LOOP BACK FOR NEXT BLOCK
                   16592: *
                   16593: *      HERE AT END OF A SERIES OF BLOCKS IN USE
                   16594: *
                   16595: GBC07  MOV  XR,WA            COPY POINTER PAST LAST BLOCK
                   16596:        MOV  GBCLM,XL         POINT TO PREVIOUS MOVE BLOCK
                   16597:        SUB  1(XL),WA         SUBTRACT STARTING ADDRESS
                   16598:        MOV  WA,1(XL)         STORE LENGTH OF BLOCK TO BE MOVED
                   16599: *
                   16600: *      LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
                   16601: *
                   16602: GBC08  BEQ  XR,DNAMP,GBC10   JUMP IF END OF USED REGION
                   16603:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF NEXT BLOCK
                   16604:        BHI  WA,=P$YYY,GBC09  JUMP IF IN USE
                   16605:        BLO  WA,=B$AAA,GBC09  JUMP IF IN USE
                   16606:        JSR  BLKLN            ELSE GET LENGTH OF NEXT BLOCK
                   16607:        ADD  WA,XR            PUSH POINTER
                   16608:        BRN  GBC08            AND LOOP BACK
                   16609: *
                   16610: *      HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
                   16611: *      BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
                   16612: *
                   16613: GBC09  SUB  *NUM02,XR        POINT 2 WORDS BEHIND FOR MOVE BLOCK
                   16614:        MOV  GBCLM,XL         POINT TO PREVIOUS MOVE BLOCK
                   16615:        MOV  XR,(XL)          SET FORWARD PTR IN PREVIOUS BLOCK
                   16616:        ZER  (XR)             ZERO FORWARD PTR OF NEW BLOCK
                   16617:        MOV  XR,GBCLM         REMEMBER ADDRESS OF THIS BLOCK
                   16618:        MOV  XR,XL            COPY PTR TO MOVE BLOCK
                   16619:        ADD  *NUM02,XR        POINT BACK TO BLOCK IN USE
                   16620:        MOV  XR,1(XL)         STORE STARTING ADDRESS
                   16621:        BRN  GBC06            JUMP TO PROCESS BLOCK IN USE
                   16622:        EJC
                   16623: *
                   16624: *      GBCOL (CONTINUED)
                   16625: *
                   16626: *      HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
                   16627: *
                   16628: *      (XL)                  POINTER TO OLD LOCATION
                   16629: *      (XR)                  POINTER TO NEW LOCATION
                   16630: *
                   16631: GBC10  MOV  DNAMB,XR         POINT TO START OF STORAGE
                   16632:        ADD  GBCNS,XR         BUMP PAST UNMOVED BLOCKS AT START
                   16633: *
                   16634: *      LOOP THROUGH MOVE DESCRIPTORS
                   16635: *
                   16636: GBC11  MOV  GBCNM,XL         POINT TO NEXT MOVE BLOCK
                   16637:        BZE  XL,GBC12         JUMP IF END OF CHAIN
                   16638:        MOV  (XL)+,GBCNM      MOVE POINTER DOWN CHAIN
                   16639:        MOV  (XL)+,WA         GET LENGTH TO MOVE
                   16640:        MVW                   PERFORM MOVE
                   16641:        BRN  GBC11            LOOP BACK
                   16642: *
                   16643: *      NOW TEST FOR MOVE UP
                   16644: *
                   16645: GBC12  MOV  XR,DNAMP         SET NEXT AVAILABLE LOC PTR
                   16646:        MOV  GBSVB,WB         RELOAD MOVE OFFSET
                   16647:        BZE  WB,GBC13         JUMP IF NO MOVE REQUIRED
                   16648:        MOV  XR,XL            ELSE COPY OLD TOP OF CORE
                   16649:        ADD  WB,XR            POINT TO NEW TOP OF CORE
                   16650:        MOV  XR,DNAMP         SAVE NEW TOP OF CORE POINTER
                   16651:        MOV  XL,WA            COPY OLD TOP
                   16652:        SUB  DNAMB,WA         MINUS OLD BOTTOM = LENGTH
                   16653:        ADD  WB,DNAMB         BUMP BOTTOM TO GET NEW VALUE
                   16654:        MWB                   PERFORM MOVE (BACKWARDS)
                   16655: *
                   16656: *      MERGE HERE TO EXIT
                   16657: *
                   16658: GBC13  MOV  GBSVA,WA         RESTORE WA
                   16659:        SCP  WC               GET CODE POINTER
                   16660:        ADD  R$COD,WC         MAKE ABSOLUTE AGAIN
                   16661:        LCP  WC               AND REPLACE ABSOLUTE VALUE
                   16662:        MOV  GBSVC,WC         RESTORE WC
                   16663:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   16664:        ICV  GBCNT            INCREMENT COUNT OF COLLECTIONS
                   16665:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   16666:        ZER  GBCFL            NOTE EXIT FROM GBCOL
                   16667:        EXI                   EXIT TO GBCOL CALLER
                   16668: *
                   16669: *      GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
                   16670: *
                   16671: GBC14  ICV  ERRFT            FATAL ERROR
                   16672:        ERB  250,INSUFFICIENT MEMORY TO COMPLETE DUMP
                   16673:        ENP                   END PROCEDURE GBCOL
                   16674:        EJC
                   16675: *
                   16676: *      GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
                   16677: *
                   16678: *      THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
                   16679: *      PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
                   16680: *
                   16681: *      (XR)                  PTR TO FIRST LOCATION TO PROCESS
                   16682: *      (XL)                  PTR PAST LAST LOCATION TO PROCESS
                   16683: *      JSR  GBCPF            CALL TO PROCESS FIELDS
                   16684: *      (XR,WA,WB,WC,IA)      DESTROYED
                   16685: *
                   16686: *      NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
                   16687: *      APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
                   16688: *
                   16689: GBCPF  PRC  E,0              ENTRY POINT
                   16690:        ZER  -(XS)            SET ZERO TO MARK BOTTOM OF STACK
                   16691:        MOV  XL,-(XS)         SAVE END POINTER
                   16692: *
                   16693: *      MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
                   16694: *
                   16695: *      1(XS)                 NEXT LVL FIELD PTR (0 AT OUTER LVL)
                   16696: *      0(XS)                 PTR PAST LAST FIELD TO PROCESS
                   16697: *      (XR)                  PTR TO FIRST FIELD TO PROCESS
                   16698: *
                   16699: *      LOOP TO PROCESS SUCCESSIVE FIELDS
                   16700: *
                   16701: GPF01  MOV  (XR),XL          LOAD FIELD CONTENTS
                   16702:        MOV  XR,WC            SAVE FIELD POINTER
                   16703:        BLT  XL,DNAMB,GPF02   JUMP IF NOT PTR INTO DYNAMIC AREA
                   16704:        BGE  XL,DNAMP,GPF02   JUMP IF NOT PTR INTO DYNAMIC AREA
                   16705: *
                   16706: *      HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
                   16707: *      LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
                   16708: *
                   16709:        MOV  (XL),WA          LOAD PTR TO CHAIN (OR ENTRY PTR)
                   16710:        MOV  XR,(XL)          SET THIS FIELD AS NEW HEAD OF CHAIN
                   16711:        MOV  WA,(XR)          SET FORWARD POINTER
                   16712: *
                   16713: *      NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
                   16714: *
                   16715:        BHI  WA,=P$YYY,GPF02  JUMP IF ALREADY PROCESSED
                   16716:        BHI  WA,=B$AAA,GPF03  JUMP IF NOT ALREADY PROCESSED
                   16717: *
                   16718: *      HERE TO MOVE TO NEXT FIELD
                   16719: *
                   16720: GPF02  MOV  WC,XR            RESTORE FIELD POINTER
                   16721:        ICA  XR               BUMP TO NEXT FIELD
                   16722:        BNE  XR,(XS),GPF01    LOOP BACK IF MORE TO GO
                   16723:        EJC
                   16724: *
                   16725: *      GBCPF (CONTINUED)
                   16726: *
                   16727: *      HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
                   16728: *
                   16729:        MOV  (XS)+,XL         RESTORE POINTER PAST END
                   16730:        MOV  (XS)+,WC         RESTORE BLOCK POINTER
                   16731:        BNZ  WC,GPF02         CONTINUE LOOP UNLESS OUTER LEVL
                   16732:        EXI                   RETURN TO CALLER IF OUTER LEVEL
                   16733: *
                   16734: *      HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
                   16735: *
                   16736: GPF03  MOV  XL,XR            COPY BLOCK POINTER
                   16737:        MOV  WA,XL            COPY FIRST WORD OF BLOCK
                   16738:        LEI  XL               LOAD ENTRY POINT ID (BL$XX)
                   16739: *
                   16740: *      BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
                   16741: *      FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
                   16742: *
                   16743:        BSW  XL,BL$$$         SWITCH ON BLOCK TYPE
                   16744:        IFF  BL$AR,GPF06      ARBLK
                   16745: .IF    .CNBF
                   16746: .ELSE
                   16747:        IFF  BL$BC,GPF18      BCBLK
                   16748:        IFF  BL$BF,GPF02      BFBLK
                   16749: .FI
                   16750:        IFF  BL$CC,GPF07      CCBLK
                   16751:        IFF  BL$CD,GPF08      CDBLK
                   16752:        IFF  BL$CM,GPF04      CMBLK
                   16753:        IFF  BL$DF,GPF02      DFBLK
                   16754:        IFF  BL$EV,GPF10      EVBLK
                   16755:        IFF  BL$EX,GPF17      EXBLK
                   16756:        IFF  BL$FF,GPF11      FFBLK
                   16757:        IFF  BL$NM,GPF10      NMBLK
                   16758:        IFF  BL$P0,GPF10      P0BLK
                   16759:        IFF  BL$P1,GPF12      P1BLK
                   16760:        IFF  BL$P2,GPF12      P2BLK
                   16761:        IFF  BL$PD,GPF13      PDBLK
                   16762:        IFF  BL$PF,GPF14      PFBLK
                   16763:        IFF  BL$TB,GPF08      TBBLK
                   16764:        IFF  BL$TE,GPF15      TEBLK
                   16765:        IFF  BL$TR,GPF16      TRBLK
                   16766:        IFF  BL$VC,GPF08      VCBLK
                   16767:        IFF  BL$XR,GPF09      XRBLK
                   16768:        IFF  BL$CT,GPF02      CTBLK
                   16769:        IFF  BL$EF,GPF02      EFBLK
                   16770:        IFF  BL$IC,GPF02      ICBLK
                   16771:        IFF  BL$KV,GPF02      KVBLK
                   16772: .IF    .CNRA
                   16773: .ELSE
                   16774:        IFF  BL$RC,GPF02      RCBLK
                   16775: .FI
                   16776:        IFF  BL$SC,GPF02      SCBLK
                   16777:        IFF  BL$SE,GPF02      SEBLK
                   16778:        IFF  BL$XN,GPF02      XNBLK
                   16779:        ESW                   END OF JUMP TABLE
                   16780:        EJC
                   16781: *
                   16782: *      GBCPF (CONTINUED)
                   16783: *
                   16784: *      CMBLK
                   16785: *
                   16786: GPF04  MOV  CMLEN(XR),WA     LOAD LENGTH
                   16787:        MOV  *CMTYP,WB        SET OFFSET
                   16788: *
                   16789: *      HERE TO PUSH DOWN TO NEW LEVEL
                   16790: *
                   16791: *      (WC)                  FIELD PTR AT PREVIOUS LEVEL
                   16792: *      (XR)                  PTR TO NEW BLOCK
                   16793: *      (WA)                  LENGTH (RELOC FLDS + FLDS AT START)
                   16794: *      (WB)                  OFFSET TO FIRST RELOC FIELD
                   16795: *
                   16796: GPF05  ADD  XR,WA            POINT PAST LAST RELOC FIELD
                   16797:        ADD  WB,XR            POINT TO FIRST RELOC FIELD
                   16798:        MOV  WC,-(XS)         STACK OLD FIELD POINTER
                   16799:        MOV  WA,-(XS)         STACK NEW LIMIT POINTER
                   16800:        CHK                   CHECK FOR STACK OVERFLOW
                   16801:        BRN  GPF01            IF OK, BACK TO PROCESS
                   16802: *
                   16803: *      ARBLK
                   16804: *
                   16805: GPF06  MOV  ARLEN(XR),WA     LOAD LENGTH
                   16806:        MOV  AROFS(XR),WB     SET OFFSET TO 1ST RELOC FLD (ARPRO)
                   16807:        BRN  GPF05            ALL SET
                   16808: *
                   16809: *      CCBLK
                   16810: *
                   16811: GPF07  MOV  CCUSE(XR),WA     SET LENGTH IN USE
                   16812:        MOV  *CCUSE,WB        1ST WORD (MAKE SURE AT LEAST ONE)
                   16813:        BRN  GPF05            ALL SET
                   16814:        EJC
                   16815: *
                   16816: *      GBCPF (CONTINUED)
                   16817: *
                   16818: *      CDBLK, TBBLK, VCBLK
                   16819: *
                   16820: GPF08  MOV  OFFS2(XR),WA     LOAD LENGTH
                   16821:        MOV  *OFFS3,WB        SET OFFSET
                   16822:        BRN  GPF05            JUMP BACK
                   16823: *
                   16824: *      XRBLK
                   16825: *
                   16826: GPF09  MOV  XRLEN(XR),WA     LOAD LENGTH
                   16827:        MOV  *XRPTR,WB        SET OFFSET
                   16828:        BRN  GPF05            JUMP BACK
                   16829: *
                   16830: *      EVBLK, NMBLK, P0BLK
                   16831: *
                   16832: GPF10  MOV  *OFFS2,WA        POINT PAST SECOND FIELD
                   16833:        MOV  *OFFS1,WB        OFFSET IS ONE (ONLY RELOC FLD IS 2)
                   16834:        BRN  GPF05            ALL SET
                   16835: *
                   16836: *      FFBLK
                   16837: *
                   16838: GPF11  MOV  *FFOFS,WA        SET LENGTH
                   16839:        MOV  *FFNXT,WB        SET OFFSET
                   16840:        BRN  GPF05            ALL SET
                   16841: *
                   16842: *      P1BLK, P2BLK
                   16843: *
                   16844: GPF12  MOV  *PARM2,WA        LENGTH (PARM2 IS NON-RELOCATABLE)
                   16845:        MOV  *PTHEN,WB        SET OFFSET
                   16846:        BRN  GPF05            ALL SET
                   16847:        EJC
                   16848: *
                   16849: *      GBCPF (CONTINUED)
                   16850: *
                   16851: *      PDBLK
                   16852: *
                   16853: GPF13  MOV  PDDFP(XR),XL     LOAD PTR TO DFBLK
                   16854:        MOV  DFPDL(XL),WA     GET PDBLK LENGTH
                   16855:        MOV  *PDFLD,WB        SET OFFSET
                   16856:        BRN  GPF05            ALL SET
                   16857: *
                   16858: *      PFBLK
                   16859: *
                   16860: GPF14  MOV  *PFARG,WA        LENGTH PAST LAST RELOC
                   16861:        MOV  *PFCOD,WB        OFFSET TO FIRST RELOC
                   16862:        BRN  GPF05            ALL SET
                   16863: *
                   16864: *      TEBLK
                   16865: *
                   16866: GPF15  MOV  *TESI$,WA        SET LENGTH
                   16867:        MOV  *TESUB,WB        AND OFFSET
                   16868:        BRN  GPF05            ALL SET
                   16869: *
                   16870: *      TRBLK
                   16871: *
                   16872: GPF16  MOV  *TRSI$,WA        SET LENGTH
                   16873:        MOV  *TRVAL,WB        AND OFFSET
                   16874:        BRN  GPF05            ALL SET
                   16875: *
                   16876: *      EXBLK
                   16877: *
                   16878: GPF17  MOV  EXLEN(XR),WA     LOAD LENGTH
                   16879:        MOV  *EXFLC,WB        SET OFFSET
                   16880:        BRN  GPF05            JUMP BACK
                   16881: .IF    .CNBF
                   16882: .ELSE
                   16883: *
                   16884: *      BCBLK
                   16885: *
                   16886: GPF18  MOV  *BCSI$,WA        SET LENGTH
                   16887:        MOV  *BCBUF,WB        AND OFFSET
                   16888:        BRN  GPF05            ALL SET
                   16889: .FI
                   16890:        ENP                   END PROCEDURE GBCPF
                   16891:        EJC
                   16892: *
                   16893: *      GTARR -- GET ARRAY
                   16894: *
                   16895: *      GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL
                   16896: *
                   16897: *      (XR)                  VALUE TO BE CONVERTED
                   16898: *      JSR  GTARR            CALL TO GET ARRAY
                   16899: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
                   16900: *      (XR)                  RESULTING ARRAY
                   16901: *      (XL,WA,WB,WC)         DESTROYED
                   16902: *
                   16903: GTARR  PRC  E,1              ENTRY POINT
                   16904:        MOV  (XR),WA          LOAD TYPE WORD
                   16905:        BEQ  WA,=B$ART,GTAR8  EXIT IF ALREADY AN ARRAY
                   16906:        BEQ  WA,=B$VCT,GTAR8  EXIT IF ALREADY AN ARRAY
                   16907:        BNE  WA,=B$TBT,GTA9A  ELSE FAIL IF NOT A TABLE (SGD02)
                   16908: *
                   16909: *      HERE WE CONVERT A TABLE TO AN ARRAY
                   16910: *
                   16911:        MOV  XR,-(XS)         REPLACE TBBLK POINTER ON STACK
                   16912:        ZER  XR               SIGNAL FIRST PASS
                   16913:        ZER  WB               ZERO NON-NULL ELEMENT COUNT
                   16914: *
                   16915: *      THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
                   16916: *      SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
                   16917: *      THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
                   16918: *      XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
                   16919: *      ENTERED INTO THE CURRENT ARBLK LOCATION.
                   16920: *
                   16921: GTAR1  MOV  (XS),XL          POINT TO TABLE
                   16922:        ADD  TBLEN(XL),XL     POINT PAST LAST BUCKET
                   16923:        SUB  *TBBUK,XL        SET FIRST BUCKET OFFSET
                   16924:        MOV  XL,WA            COPY ADJUSTED POINTER
                   16925: *
                   16926: *      LOOP THROUGH BUCKETS IN TABLE BLOCK
                   16927: *      NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
                   16928: *      1 LESS THAN TBBUK.
                   16929: *
                   16930: GTAR2  MOV  WA,XL            COPY BUCKET POINTER
                   16931:        DCA  WA               DECREMENT BUCKET POINTER
                   16932: *
                   16933: *      LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
                   16934: *
                   16935: GTAR3  MOV  TENXT(XL),XL     POINT TO NEXT TEBLK
                   16936:        BEQ  XL,(XS),GTAR6    JUMP IF CHAIN END (TBBLK PTR)
                   16937:        MOV  XL,CNVTP         ELSE SAVE TEBLK POINTER
                   16938: *
                   16939: *      LOOP TO FIND VALUE DOWN TRBLK CHAIN
                   16940: *
                   16941: GTAR4  MOV  TEVAL(XL),XL     LOAD VALUE
                   16942:        BEQ  (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND
                   16943:        MOV  XL,WC            COPY VALUE
                   16944:        MOV  CNVTP,XL         RESTORE TEBLK POINTER
                   16945:        EJC
                   16946: *
                   16947: *      GTARR (CONTINUED)
                   16948: *
                   16949: *      NOW CHECK FOR NULL AND TEST CASES
                   16950: *
                   16951:        BEQ  WC,=NULLS,GTAR3  LOOP BACK TO IGNORE NULL VALUE
                   16952:        BNZ  XR,GTAR5         JUMP IF SECOND PASS
                   16953:        ICV  WB               FOR THE FIRST PASS, BUMP COUNT
                   16954:        BRN  GTAR3            AND LOOP BACK FOR NEXT TEBLK
                   16955: *
                   16956: *      HERE IN SECOND PASS
                   16957: *
                   16958: GTAR5  MOV  TESUB(XL),(XR)+  STORE SUBSCRIPT NAME
                   16959:        MOV  WC,(XR)+         STORE VALUE IN ARBLK
                   16960:        BRN  GTAR3            LOOP BACK FOR NEXT TEBLK
                   16961: *
                   16962: *      HERE AFTER SCANNING TEBLKS ON ONE CHAIN
                   16963: *
                   16964: GTAR6  BNE  WA,(XS),GTAR2    LOOP BACK IF MORE BUCKETS TO GO
                   16965:        BNZ  XR,GTAR7         ELSE JUMP IF SECOND PASS
                   16966: *
                   16967: *      HERE AFTER COUNTING NON-NULL ELEMENTS
                   16968: *
                   16969:        BZE  WB,GTAR9         FAIL IF NO NON-NULL ELEMENTS
                   16970:        MOV  WB,WA            ELSE COPY COUNT
                   16971:        ADD  WB,WA            DOUBLE (TWO WORDS/ELEMENT)
                   16972:        ADD  =ARVL2,WA        ADD SPACE FOR STANDARD FIELDS
                   16973:        WTB  WA               CONVERT LENGTH TO BYTES
                   16974:        BGE  WA,MXLEN,GTAR9   FAIL IF TOO LONG FOR ARRAY
                   16975:        JSR  ALLOC            ELSE ALLOCATE SPACE FOR ARBLK
                   16976:        MOV  =B$ART,(XR)      STORE TYPE WORD
                   16977:        ZER  IDVAL(XR)        ZERO ID FOR THE MOMENT
                   16978:        MOV  WA,ARLEN(XR)     STORE LENGTH
                   16979:        MOV  =NUM02,ARNDM(XR) SET DIMENSIONS = 2
                   16980:        LDI  INTV1            GET INTEGER ONE
                   16981:        STI  ARLBD(XR)        STORE AS LBD 1
                   16982:        STI  ARLB2(XR)        STORE AS LBD 2
                   16983:        LDI  INTV2            LOAD INTEGER TWO
                   16984:        STI  ARDM2(XR)        STORE AS DIM 2
                   16985:        MTI  WB               GET ELEMENT COUNT AS INTEGER
                   16986:        STI  ARDIM(XR)        STORE AS DIM 1
                   16987:        ZER  ARPR2(XR)        ZERO PROTOTYPE FIELD FOR NOW
                   16988:        MOV  *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2)
                   16989:        MOV  XR,WB            SAVE ARBLK POINTER
                   16990:        ADD  *ARVL2,XR        POINT TO FIRST ELEMENT LOCATION
                   16991:        BRN  GTAR1            JUMP BACK TO FILL IN ELEMENTS
                   16992:        EJC
                   16993: *
                   16994: *      GTARR (CONTINUED)
                   16995: *
                   16996: *      HERE AFTER FILLING IN ELEMENT VALUES
                   16997: *
                   16998: GTAR7  MOV  WB,XR            RESTORE ARBLK POINTER
                   16999:        MOV  WB,(XS)          STORE AS RESULT
                   17000: *
                   17001: *      NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
                   17002: *      THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
                   17003: *      CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
                   17004: *
                   17005:        LDI  ARDIM(XR)        GET NUMBER OF ELEMENTS (NN)
                   17006:        MLI  INTVH            MULTIPLY BY 100
                   17007:        ADI  INTV2            ADD 2 (NN02)
                   17008:        JSR  ICBLD            BUILD INTEGER
                   17009:        MOV  XR,-(XS)         STORE PTR FOR GTSTG
                   17010:        JSR  GTSTG            CONVERT TO STRING
                   17011:        PPM                   CONVERT FAIL IS IMPOSSIBLE
                   17012:        MOV  XR,XL            COPY STRING POINTER
                   17013:        MOV  (XS)+,XR         RELOAD ARBLK POINTER
                   17014:        MOV  XL,ARPR2(XR)     STORE PROTOTYPE PTR (NN02)
                   17015:        SUB  =NUM02,WA        ADJUST LENGTH TO POINT TO ZERO
                   17016:        PSC  XL,WA            POINT TO ZERO
                   17017:        MOV  =CH$CM,WB        LOAD A COMMA
                   17018:        SCH  WB,(XL)          STORE A COMMA OVER THE ZERO
                   17019:        CSC  XL               COMPLETE STORE CHARACTERS
                   17020: *
                   17021: *      NORMAL RETURN
                   17022: *
                   17023: GTAR8  EXI                   RETURN TO CALLER
                   17024: *
                   17025: *      NON-CONVERSION RETURN
                   17026: *
                   17027: GTAR9  MOV  (XS)+,XR         RESTORE STACK FOR CONV ERR (SGD02)
                   17028: *
                   17029: *      MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK
                   17030: *
                   17031: GTA9A  EXI  1                RETURN
                   17032:        ENP                   PROCEDURE GTARR
                   17033:        EJC
                   17034: *
                   17035: *      GTCOD -- CONVERT TO CODE
                   17036: *
                   17037: *      (XR)                  OBJECT TO BE CONVERTED
                   17038: *      JSR  GTCOD            CALL TO CONVERT TO CODE
                   17039: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17040: *      (XR)                  POINTER TO RESULTING CDBLK
                   17041: *      (XL,WA,WB,WC,RA)      DESTROYED
                   17042: *
                   17043: *      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
                   17044: *      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
                   17045: *      WITHOUT RETURNING TO THIS ROUTINE.
                   17046: *
                   17047: GTCOD  PRC  E,1              ENTRY POINT
                   17048:        BEQ  (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE
                   17049:        BEQ  (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE
                   17050: *
                   17051: *      HERE WE MUST GENERATE A CDBLK BY COMPILATION
                   17052: *
                   17053:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   17054:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   17055:        PPM  GTCD2            JUMP IF NON-CONVERTIBLE
                   17056:        MOV  FLPTR,GTCEF      SAVE FAIL PTR IN CASE OF ERROR
                   17057:        MOV  R$COD,R$GTC      ALSO SAVE CODE PTR
                   17058:        MOV  XR,R$CIM         ELSE SET IMAGE POINTER
                   17059:        MOV  WA,SCNIL         SET IMAGE LENGTH
                   17060:        ZER  SCNPT            SET SCAN POINTER
                   17061:        MOV  =STGXC,STAGE     SET STAGE FOR EXECUTE COMPILE
                   17062:        MOV  CMPSN,LSTSN      IN CASE LISTR CALLED
                   17063:        JSR  CMPIL            COMPILE STRING
                   17064:        MOV  =STGXT,STAGE     RESET STAGE FOR EXECUTE TIME
                   17065:        ZER  R$CIM            CLEAR IMAGE
                   17066: *
                   17067: *      MERGE HERE IF NO CONVERT REQUIRED
                   17068: *
                   17069: GTCD1  EXI                   GIVE NORMAL GTCOD RETURN
                   17070: *
                   17071: *      HERE IF UNCONVERTIBLE
                   17072: *
                   17073: GTCD2  EXI  1                GIVE ERROR RETURN
                   17074:        ENP                   END PROCEDURE GTCOD
                   17075:        EJC
                   17076: *
                   17077: *      GTEXP -- CONVERT TO EXPRESSION
                   17078: *
                   17079: *      (XR)                  INPUT VALUE TO BE CONVERTED
                   17080: *      JSR  GTEXP            CALL TO CONVERT TO EXPRESSION
                   17081: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17082: *      (XR)                  POINTER TO RESULT EXBLK OR SEBLK
                   17083: *      (XL,WA,WB,WC,RA)      DESTROYED
                   17084: *
                   17085: *      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
                   17086: *      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
                   17087: *      WITHOUT RETURNING TO THIS ROUTINE.
                   17088: *
                   17089: GTEXP  PRC  E,1              ENTRY POINT
                   17090:        BLO  (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION
                   17091:        MOV  XR,-(XS)         STORE ARGUMENT FOR GTSTG
                   17092:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   17093:        PPM  GTEX2            JUMP IF UNCONVERTIBLE
                   17094: *
                   17095: *      CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR
                   17096: *      SEMICOLON.  THESE CHARACTERS CAN LEGITIMATELY END AN
                   17097: *      EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM
                   17098: *      AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A
                   17099: *      STRING THAT IS BEING CONVERTED TO EXPRESSION FORM.
                   17100: *
                   17101:        MOV  XR,XL            COPY INPUT STRING POINTER (REG06)
                   17102:        PLC  XL,WA            POINT ONE PAST THE STRING END (REG06)
                   17103:        LCH  XL,-(XL)         FETCH THE LAST CHARACTER (REG06)
                   17104:        BEQ  XL,=CH$CL,GTEX2  ERROR IF IT IS A SEMICOLON (REG06)
                   17105:        BEQ  XL,=CH$SM,GTEX2  OR IF IT IS A COLON (REG06)
                   17106: *
                   17107: *      HERE WE CONVERT A STRING BY COMPILATION
                   17108: *
                   17109:        MOV  XR,R$CIM         SET INPUT IMAGE POINTER
                   17110:        ZER  SCNPT            SET SCAN POINTER
                   17111:        MOV  WA,SCNIL         SET INPUT IMAGE LENGTH
                   17112:        ZER  WB               SET CODE FOR NORMAL SCAN
                   17113:        MOV  FLPTR,GTCEF      SAVE FAIL PTR IN CASE OF ERROR
                   17114:        MOV  R$COD,R$GTC      ALSO SAVE CODE PTR
                   17115:        MOV  =STGEV,STAGE     ADJUST STAGE FOR COMPILE
                   17116:        MOV  =T$UOK,SCNTP     INDICATE UNARY OPERATOR ACCEPTABLE
                   17117:        JSR  EXPAN            BUILD TREE FOR EXPRESSION
                   17118:        ZER  SCNRS            RESET RESCAN FLAG
                   17119:        BNE  SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE
                   17120:        ZER  WB               SET OK VALUE FOR CDGEX CALL
                   17121:        MOV  XR,XL            COPY TREE POINTER
                   17122:        JSR  CDGEX            BUILD EXPRESSION BLOCK
                   17123:        ZER  R$CIM            CLEAR POINTER
                   17124:        MOV  =STGXT,STAGE     RESTORE STAGE FOR EXECUTE TIME
                   17125: *
                   17126: *      MERGE HERE IF NO CONVERSION REQUIRED
                   17127: *
                   17128: GTEX1  EXI                   RETURN TO GTEXP CALLER
                   17129: *
                   17130: *      HERE IF UNCONVERTIBLE
                   17131: *
                   17132: GTEX2  EXI  1                TAKE ERROR EXIT
                   17133:        ENP                   END PROCEDURE GTEXP
                   17134:        EJC
                   17135: *
                   17136: *      GTINT -- GET INTEGER VALUE
                   17137: *
                   17138: *      GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
                   17139: *      PERFORMING ANY NECESSARY CONVERSIONS.
                   17140: *
                   17141: *      (XR)                  VALUE TO BE CONVERTED
                   17142: *      JSR  GTINT            CALL TO CONVERT TO INTEGER
                   17143: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
                   17144: *      (XR)                  RESULTING INTEGER
                   17145: *      (WC,RA)               DESTROYED
                   17146: *      (WA,WB)               DESTROYED (ONLY ON CONVERSION ERR)
                   17147: *      (XR)                  UNCHANGED (ON CONVERT ERROR)
                   17148: *
                   17149: GTINT  PRC  E,1              ENTRY POINT
                   17150:        BEQ  (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER
                   17151:        MOV  WA,GTINA         ELSE SAVE WA
                   17152:        MOV  WB,GTINB         SAVE WB
                   17153:        JSR  GTNUM            CONVERT TO NUMERIC
                   17154:        PPM  GTIN3            JUMP IF UNCONVERTIBLE
                   17155: .IF    .CNRA
                   17156: .ELSE
                   17157:        BEQ  WA,=B$ICL,GTIN1  JUMP IF INTEGER
                   17158: *
                   17159: *      HERE WE CONVERT A REAL TO INTEGER
                   17160: *
                   17161:        LDR  RCVAL(XR)        LOAD REAL VALUE
                   17162:        RTI  GTIN3            CONVERT TO INTEGER (ERR IF OVFLOW)
                   17163:        JSR  ICBLD            IF OK BUILD ICBLK
                   17164: .FI
                   17165: *
                   17166: *      HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
                   17167: *
                   17168: GTIN1  MOV  GTINA,WA         RESTORE WA
                   17169:        MOV  GTINB,WB         RESTORE WB
                   17170: *
                   17171: *      COMMON EXIT POINT
                   17172: *
                   17173: GTIN2  EXI                   RETURN TO GTINT CALLER
                   17174: *
                   17175: *      HERE ON CONVERSION ERROR
                   17176: *
                   17177: GTIN3  EXI  1                TAKE CONVERT ERROR EXIT
                   17178:        ENP                   END PROCEDURE GTINT
                   17179:        EJC
                   17180: *
                   17181: *      GTNUM -- GET NUMERIC VALUE
                   17182: *
                   17183: *      GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
                   17184: *      OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
                   17185: *
                   17186: *      (XR)                  OBJECT TO BE CONVERTED
                   17187: *      JSR  GTNUM            CALL TO CONVERT TO NUMERIC
                   17188: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17189: *      (XR)                  POINTER TO RESULT (INT OR REAL)
                   17190: *      (WA)                  FIRST WORD OF RESULT BLOCK
                   17191: *      (WB,WC,RA)            DESTROYED
                   17192: *      (XR)                  UNCHANGED (ON CONVERT ERROR)
                   17193: *
                   17194: GTNUM  PRC  E,1              ENTRY POINT
                   17195:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   17196:        BEQ  WA,=B$ICL,GTN34  JUMP IF INTEGER (NO CONVERSION)
                   17197: .IF    .CNRA
                   17198: .ELSE
                   17199:        BEQ  WA,=B$RCL,GTN34  JUMP IF REAL (NO CONVERSION)
                   17200: .FI
                   17201: *
                   17202: *      AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
                   17203: *      TO AN INTEGER OR REAL AS APPROPRIATE.
                   17204: *
                   17205:        MOV  XR,-(XS)         STACK ARGUMENT IN CASE CONVERT ERR
                   17206:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   17207:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   17208:        PPM  GTN36            JUMP IF UNCONVERTIBLE
                   17209: *
                   17210: *      INITIALIZE NUMERIC CONVERSION
                   17211: *
                   17212:        LDI  INTV0            INITIALIZE INTEGER RESULT TO ZERO
                   17213:        BZE  WA,GTN32         JUMP TO EXIT WITH ZERO IF NULL
                   17214:        LCT  WA,WA            SET BCT COUNTER FOR FOLLOWING LOOPS
                   17215:        ZER  GTNNF            TENTATIVELY INDICATE RESULT +
                   17216: .IF    .CNRA
                   17217: .ELSE
                   17218:        STI  GTNEX            INITIALISE EXPONENT TO ZERO
                   17219:        ZER  GTNSC            ZERO SCALE IN CASE REAL
                   17220:        ZER  GTNDF            RESET FLAG FOR DEC POINT FOUND
                   17221:        ZER  GTNRD            RESET FLAG FOR DIGITS FOUND
                   17222:        LDR  REAV0            ZERO REAL ACCUM IN CASE REAL
                   17223: .FI
                   17224:        PLC  XR               POINT TO ARGUMENT CHARACTERS
                   17225: *
                   17226: *      MERGE BACK HERE AFTER IGNORING LEADING BLANK
                   17227: *
                   17228: GTN01  LCH  WB,(XR)+         LOAD FIRST CHARACTER
                   17229:        BLT  WB,=CH$D0,GTN02  JUMP IF NOT DIGIT
                   17230:        BLE  WB,=CH$D9,GTN06  JUMP IF FIRST CHAR IS A DIGIT
                   17231:        EJC
                   17232: *
                   17233: *      GTNUM (CONTINUED)
                   17234: *
                   17235: *      HERE IF FIRST DIGIT IS NON-DIGIT
                   17236: *
                   17237: GTN02  BNE  WB,=CH$BL,GTN03  JUMP IF NON-BLANK
                   17238: GTNA2  BCT  WA,GTN01         ELSE DECR COUNT AND LOOP BACK
                   17239:        BRN  GTN07            JUMP TO RETURN ZERO IF ALL BLANKS
                   17240: *
                   17241: *      HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
                   17242: *
                   17243: GTN03  BEQ  WB,=CH$PL,GTN04  JUMP IF PLUS SIGN
                   17244: .IF    .CAHT
                   17245:        BEQ  WB,=CH$HT,GTNA2  HORIZONTAL TAB EQUIV TO BLANK
                   17246: .FI
                   17247: .IF    .CAVT
                   17248:        BEQ  WB,=CH$VT,GTNA2  VERTICAL TAB EQUIV TO BLANK
                   17249: .FI
                   17250: .IF    .CNRA
                   17251:        BNE  WB,=CH$MN,GTN36  ELSE FAIL
                   17252: .ELSE
                   17253:        BNE  WB,=CH$MN,GTN12  JUMP IF NOT MINUS (MAY BE REAL)
                   17254: .FI
                   17255:        MNZ  GTNNF            IF MINUS SIGN, SET NEGATIVE FLAG
                   17256: *
                   17257: *      MERGE HERE AFTER PROCESSING SIGN
                   17258: *
                   17259: GTN04  BCT  WA,GTN05         JUMP IF CHARS LEFT
                   17260:        BRN  GTN36            ELSE ERROR
                   17261: *
                   17262: *      LOOP TO FETCH CHARACTERS OF AN INTEGER
                   17263: *
                   17264: GTN05  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   17265:        BLT  WB,=CH$D0,GTN08  JUMP IF NOT A DIGIT
                   17266:        BGT  WB,=CH$D9,GTN08  JUMP IF NOT A DIGIT
                   17267: *
                   17268: *      MERGE HERE FOR FIRST DIGIT
                   17269: *
                   17270: GTN06  STI  GTNSI            SAVE CURRENT VALUE
                   17271: .IF    .CNRA
                   17272:        CVM  GTN36            CURRENT*10-(NEW DIG) JUMP IF OVFLOW
                   17273: .ELSE
                   17274:        CVM  GTN35            CURRENT*10-(NEW DIG) JUMP IF OVFLOW
                   17275:        MNZ  GTNRD            SET DIGIT READ FLAG
                   17276: .FI
                   17277:        BCT  WA,GTN05         ELSE LOOP BACK IF MORE CHARS
                   17278: *
                   17279: *      HERE TO EXIT WITH CONVERTED INTEGER VALUE
                   17280: *
                   17281: GTN07  BNZ  GTNNF,GTN32      JUMP IF NEGATIVE (ALL SET)
                   17282:        NGI                   ELSE NEGATE
                   17283:        INO  GTN32            JUMP IF NO OVERFLOW
                   17284:        BRN  GTN36            ELSE SIGNAL ERROR
                   17285:        EJC
                   17286: *
                   17287: *      GTNUM (CONTINUED)
                   17288: *
                   17289: *      HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
                   17290: *      CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
                   17291: *
                   17292: GTN08  BEQ  WB,=CH$BL,GTNA9  JUMP IF A BLANK
                   17293: .IF    .CAHT
                   17294:        BEQ  WB,=CH$HT,GTNA9  JUMP IF HORIZONTAL TAB
                   17295: .FI
                   17296: .IF    .CAVT
                   17297:        BEQ  WB,=CH$VT,GTNA9  JUMP IF VERTICAL TAB
                   17298: .FI
                   17299: .IF    .CNRA
                   17300:        BRN  GTN36            ERROR
                   17301: .ELSE
                   17302:        ITR                   ELSE CONVERT INTEGER TO REAL
                   17303:        NGR                   NEGATE TO GET POSITIVE VALUE
                   17304:        BRN  GTN12            JUMP TO TRY FOR REAL
                   17305: .FI
                   17306: *
                   17307: *      HERE WE SCAN OUT BLANKS TO END OF STRING
                   17308: *
                   17309: GTN09  LCH  WB,(XR)+         GET NEXT CHAR
                   17310: .IF    .CAHT
                   17311:        BEQ  WB,=CH$HT,GTNA9  JUMP IF HORIZONTAL TAB
                   17312: .FI
                   17313: .IF    .CAVT
                   17314:        BEQ  WB,=CH$VT,GTNA9  JUMP IF VERTICAL TAB
                   17315: .FI
                   17316:        BNE  WB,=CH$BL,GTN36  ERROR IF NON-BLANK
                   17317: GTNA9  BCT  WA,GTN09         LOOP BACK IF MORE CHARS TO CHECK
                   17318:        BRN  GTN07            RETURN INTEGER IF ALL BLANKS
                   17319: .IF    .CNRA
                   17320: .ELSE
                   17321: *
                   17322: *      LOOP TO COLLECT MANTISSA OF REAL
                   17323: *
                   17324: GTN10  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   17325:        BLT  WB,=CH$D0,GTN12  JUMP IF NON-NUMERIC
                   17326:        BGT  WB,=CH$D9,GTN12  JUMP IF NON-NUMERIC
                   17327: *
                   17328: *      MERGE HERE TO COLLECT FIRST REAL DIGIT
                   17329: *
                   17330: GTN11  SUB  =CH$D0,WB        CONVERT DIGIT TO NUMBER
                   17331:        MLR  REAVT            MULTIPLY REAL BY 10.0
                   17332:        ROV  GTN36            CONVERT ERROR IF OVERFLOW
                   17333:        STR  GTNSR            SAVE RESULT
                   17334:        MTI  WB               GET NEW DIGIT AS INTEGER
                   17335:        ITR                   CONVERT NEW DIGIT TO REAL
                   17336:        ADR  GTNSR            ADD TO GET NEW TOTAL
                   17337:        ADD  GTNDF,GTNSC      INCREMENT SCALE IF AFTER DEC POINT
                   17338:        MNZ  GTNRD            SET DIGIT FOUND FLAG
                   17339:        BCT  WA,GTN10         LOOP BACK IF MORE CHARS
                   17340:        BRN  GTN22            ELSE JUMP TO SCALE
                   17341:        EJC
                   17342: *
                   17343: *      GTNUM (CONTINUED)
                   17344: *
                   17345: *      HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
                   17346: *
                   17347: GTN12  BNE  WB,=CH$DT,GTN13  JUMP IF NOT DEC POINT
                   17348:        BNZ  GTNDF,GTN36      IF DEC POINT, ERROR IF ONE ALREADY
                   17349:        MOV  =NUM01,GTNDF     ELSE SET FLAG FOR DEC POINT
                   17350:        BCT  WA,GTN10         LOOP BACK IF MORE CHARS
                   17351:        BRN  GTN22            ELSE JUMP TO SCALE
                   17352: *
                   17353: *      HERE IF NOT DECIMAL POINT
                   17354: *
                   17355: GTN13  BEQ  WB,=CH$LE,GTN15  JUMP IF E FOR EXPONENT
                   17356:        BEQ  WB,=CH$LD,GTN15  JUMP IF D FOR EXPONENT
                   17357: .IF    .CULC
                   17358:        BEQ  WB,=CH$$E,GTN15  JUMP IF E FOR EXPONENT
                   17359:        BEQ  WB,=CH$$D,GTN15  JUMP IF D FOR EXPONENT
                   17360: .FI
                   17361: *
                   17362: *      HERE CHECK FOR TRAILING BLANKS
                   17363: *
                   17364: GTN14  BEQ  WB,=CH$BL,GTNB4  JUMP IF BLANK
                   17365: .IF    .CAHT
                   17366:        BEQ  WB,=CH$HT,GTNB4  JUMP IF HORIZONTAL TAB
                   17367: .FI
                   17368: .IF    .CAVT
                   17369:        BEQ  WB,=CH$VT,GTNB4  JUMP IF VERTICAL TAB
                   17370: .FI
                   17371:        BRN  GTN36            ERROR IF NON-BLANK
                   17372: *
                   17373: GTNB4  LCH  WB,(XR)+         GET NEXT CHARACTER
                   17374:        BCT  WA,GTN14         LOOP BACK TO CHECK IF MORE
                   17375:        BRN  GTN22            ELSE JUMP TO SCALE
                   17376: *
                   17377: *      HERE TO READ AND PROCESS AN EXPONENT
                   17378: *
                   17379: GTN15  ZER  GTNES            SET EXPONENT SIGN POSITIVE
                   17380:        LDI  INTV0            INITIALIZE EXPONENT TO ZERO
                   17381:        MNZ  GTNDF            RESET NO DEC POINT INDICATION
                   17382:        BCT  WA,GTN16         JUMP SKIPPING PAST E OR D
                   17383:        BRN  GTN36            ERROR IF NULL EXPONENT
                   17384: *
                   17385: *      CHECK FOR EXPONENT SIGN
                   17386: *
                   17387: GTN16  LCH  WB,(XR)+         LOAD FIRST EXPONENT CHARACTER
                   17388:        BEQ  WB,=CH$PL,GTN17  JUMP IF PLUS SIGN
                   17389:        BNE  WB,=CH$MN,GTN19  ELSE JUMP IF NOT MINUS SIGN
                   17390:        MNZ  GTNES            SET SIGN NEGATIVE IF MINUS SIGN
                   17391: *
                   17392: *      MERGE HERE AFTER PROCESSING EXPONENT SIGN
                   17393: *
                   17394: GTN17  BCT  WA,GTN18         JUMP IF CHARS LEFT
                   17395:        BRN  GTN36            ELSE ERROR
                   17396: *
                   17397: *      LOOP TO CONVERT EXPONENT DIGITS
                   17398: *
                   17399: GTN18  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   17400:        EJC
                   17401: *
                   17402: *      GTNUM (CONTINUED)
                   17403: *
                   17404: *      MERGE HERE FOR FIRST EXPONENT DIGIT
                   17405: *
                   17406: GTN19  BLT  WB,=CH$D0,GTN20  JUMP IF NOT DIGIT
                   17407:        BGT  WB,=CH$D9,GTN20  JUMP IF NOT DIGIT
                   17408:        CVM  GTN36            ELSE CURRENT*10, SUBTRACT NEW DIGIT
                   17409:        BCT  WA,GTN18         LOOP BACK IF MORE CHARS
                   17410:        BRN  GTN21            JUMP IF EXPONENT FIELD IS EXHAUSTED
                   17411: *
                   17412: *      HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
                   17413: *
                   17414: GTN20  BEQ  WB,=CH$BL,GTNC0  JUMP IF BLANK
                   17415: .IF    .CAHT
                   17416:        BEQ  WB,=CH$HT,GTNC0  JUMP IF HORIZONTAL TAB
                   17417: .FI
                   17418: .IF    .CAVT
                   17419:        BEQ  WC,=CH$VT,GTNC0  JUMP IF VERTICAL TAB
                   17420: .FI
                   17421:        BRN  GTN36            ERROR IF NON-BLANK
                   17422: *
                   17423: GTNC0  LCH  WB,(XR)+         GET NEXT CHARACTER
                   17424:        BCT  WA,GTN20         LOOP BACK TILL ALL BLANKS SCANNED
                   17425: *
                   17426: *      MERGE HERE AFTER COLLECTING EXPONENT
                   17427: *
                   17428: GTN21  STI  GTNEX            SAVE COLLECTED EXPONENT
                   17429:        BNZ  GTNES,GTN22      JUMP IF IT WAS NEGATIVE
                   17430:        NGI                   ELSE COMPLEMENT
                   17431:        IOV  GTN36            ERROR IF OVERFLOW
                   17432:        STI  GTNEX            AND STORE POSITIVE EXPONENT
                   17433: *
                   17434: *      MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
                   17435: *
                   17436: GTN22  BZE  GTNRD,GTN36      ERROR IF NOT DIGITS COLLECTED
                   17437:        BZE  GTNDF,GTN36      ERROR IF NO EXPONENT OR DEC POINT
                   17438:        MTI  GTNSC            ELSE LOAD SCALE AS INTEGER
                   17439:        SBI  GTNEX            SUBTRACT EXPONENT
                   17440:        IOV  GTN36            ERROR IF OVERFLOW
                   17441:        ILT  GTN26            JUMP IF WE MUST SCALE UP
                   17442: *
                   17443: *      HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
                   17444: *
                   17445:        MFI  WA,GTN36         LOAD SCALE FACTOR, ERR IF OVFLOW
                   17446: *
                   17447: *      LOOP TO SCALE DOWN IN STEPS OF 10**10
                   17448: *
                   17449: GTN23  BLE  WA,=NUM10,GTN24  JUMP IF 10 OR LESS TO GO
                   17450:        DVR  REATT            ELSE DIVIDE BY 10**10
                   17451:        SUB  =NUM10,WA        DECREMENT SCALE
                   17452:        BRN  GTN23            AND LOOP BACK
                   17453:        EJC
                   17454: *
                   17455: *      GTNUM (CONTINUED)
                   17456: *
                   17457: *      HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
                   17458: *
                   17459: GTN24  BZE  WA,GTN30         JUMP IF SCALED
                   17460:        LCT  WB,=CFP$R        ELSE GET INDEXING FACTOR
                   17461:        MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
                   17462:        WTB  WA               CONVERT REMAINING SCALE TO BYTE OFS
                   17463: *
                   17464: *      LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
                   17465: *
                   17466: GTN25  ADD  WA,XR            BUMP POINTER
                   17467:        BCT  WB,GTN25         ONCE FOR EACH VALUE WORD
                   17468:        DVR  (XR)             SCALE DOWN AS REQUIRED
                   17469:        BRN  GTN30            AND JUMP
                   17470: *
                   17471: *      COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
                   17472: *
                   17473: GTN26  NGI                   GET ABSOLUTE VALUE OF EXPONENT
                   17474:        IOV  GTN36            ERROR IF OVERFLOW
                   17475:        MFI  WA,GTN36         ACQUIRE SCALE, ERROR IF OVFLOW
                   17476: *
                   17477: *      LOOP TO SCALE UP IN STEPS OF 10**10
                   17478: *
                   17479: GTN27  BLE  WA,=NUM10,GTN28  JUMP IF 10 OR LESS TO GO
                   17480:        MLR  REATT            ELSE MULTIPLY BY 10**10
                   17481:        ROV  GTN36            ERROR IF OVERFLOW
                   17482:        SUB  =NUM10,WA        ELSE DECREMENT SCALE
                   17483:        BRN  GTN27            AND LOOP BACK
                   17484: *
                   17485: *      HERE TO SCALE UP REST OF WAY WITH TABLE
                   17486: *
                   17487: GTN28  BZE  WA,GTN30         JUMP IF SCALED
                   17488:        LCT  WB,=CFP$R        ELSE GET INDEXING FACTOR
                   17489:        MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
                   17490:        WTB  WA               CONVERT REMAINING SCALE TO BYTE OFS
                   17491: *
                   17492: *      LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
                   17493: *
                   17494: GTN29  ADD  WA,XR            BUMP POINTER
                   17495:        BCT  WB,GTN29         ONCE FOR EACH WORD IN VALUE
                   17496:        MLR  (XR)             SCALE UP
                   17497:        ROV  GTN36            ERROR IF OVERFLOW
                   17498:        EJC
                   17499: *
                   17500: *      GTNUM (CONTINUED)
                   17501: *
                   17502: *      HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
                   17503: *
                   17504: GTN30  BZE  GTNNF,GTN31      JUMP IF POSITIVE
                   17505:        NGR                   ELSE NEGATE
                   17506: *
                   17507: *      HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
                   17508: *
                   17509: GTN31  JSR  RCBLD            BUILD REAL BLOCK
                   17510:        BRN  GTN33            MERGE TO EXIT
                   17511: .FI
                   17512: *
                   17513: *      HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
                   17514: *
                   17515: GTN32  JSR  ICBLD            BUILD ICBLK
                   17516: *
                   17517: *      REAL MERGES HERE
                   17518: *
                   17519: GTN33  MOV  (XR),WA          LOAD FIRST WORD OF RESULT BLOCK
                   17520:        ICA  XS               POP ARGUMENT OFF STACK
                   17521: *
                   17522: *      COMMON EXIT POINT
                   17523: *
                   17524: GTN34  EXI                   RETURN TO GTNUM CALLER
                   17525: .IF    .CNRA
                   17526: .ELSE
                   17527: *
                   17528: *      COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
                   17529: *
                   17530: GTN35  LDI  GTNSI            RELOAD INTEGER SO FAR
                   17531:        ITR                   CONVERT TO REAL
                   17532:        NGR                   MAKE VALUE POSITIVE
                   17533:        BRN  GTN11            MERGE WITH REAL CIRCUIT
                   17534: .FI
                   17535: *
                   17536: *      HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
                   17537: *
                   17538: GTN36  MOV  (XS)+,XR         RELOAD ORIGINAL ARGUMENT
                   17539:        EXI  1                TAKE CONVERT-ERROR EXIT
                   17540:        ENP                   END PROCEDURE GTNUM
                   17541:        EJC
                   17542: *
                   17543: *      GTNVR -- CONVERT TO NATURAL VARIABLE
                   17544: *
                   17545: *      GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
                   17546: *      APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
                   17547: *
                   17548: *      (XR)                  ARGUMENT
                   17549: *      JSR  GTNVR            CALL TO CONVERT TO NATURAL VARIABLE
                   17550: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17551: *      (XR)                  POINTER TO VRBLK
                   17552: *      (WA,WB)               DESTROYED (CONVERSION ERROR ONLY)
                   17553: *      (WC)                  DESTROYED
                   17554: *
                   17555: GTNVR  PRC  E,1              ENTRY POINT
                   17556:        BNE  (XR),=B$NML,GNV02 JUMP IF NOT NAME
                   17557:        MOV  NMBAS(XR),XR     ELSE LOAD NAME BASE IF NAME
                   17558:        BLO  XR,STATE,GNV07   SKIP IF VRBLK (IN STATIC REGION)
                   17559: *
                   17560: *      COMMON ERROR EXIT
                   17561: *
                   17562: GNV01  EXI  1                TAKE CONVERT-ERROR EXIT
                   17563: *
                   17564: *      HERE IF NOT NAME
                   17565: *
                   17566: GNV02  MOV  WA,GNVSA         SAVE WA
                   17567:        MOV  WB,GNVSB         SAVE WB
                   17568:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   17569:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   17570:        PPM  GNV01            JUMP IF CONVERSION ERROR
                   17571:        BZE  WA,GNV01         NULL STRING IS AN ERROR
                   17572: .IF    .CULC
                   17573:        JSR  FLSTG            FOLD LOWER CASE TO UPPER CASE
                   17574: .FI
                   17575:        MOV  XL,-(XS)         SAVE XL
                   17576:        MOV  XR,-(XS)         STACK STRING PTR FOR LATER
                   17577:        MOV  XR,WB            COPY STRING POINTER
                   17578:        ADD  *SCHAR,WB        POINT TO CHARACTERS OF STRING
                   17579:        MOV  WB,GNVST         SAVE POINTER TO CHARACTERS
                   17580:        MOV  WA,WB            COPY LENGTH
                   17581:        CTW  WB,0             GET NUMBER OF WORDS IN NAME
                   17582:        MOV  WB,GNVNW         SAVE FOR LATER
                   17583:        JSR  HASHS            COMPUTE HASH INDEX FOR STRING
                   17584:        RMI  HSHNB            COMPUTE HASH OFFSET BY TAKING MOD
                   17585:        MFI  WC               GET AS OFFSET
                   17586:        WTB  WC               CONVERT OFFSET TO BYTES
                   17587:        ADD  HSHTB,WC         POINT TO PROPER HASH CHAIN
                   17588:        SUB  *VRNXT,WC        SUBTRACT OFFSET TO MERGE INTO LOOP
                   17589:        EJC
                   17590: *
                   17591: *      GTNVR (CONTINUED)
                   17592: *
                   17593: *      LOOP TO SEARCH HASH CHAIN
                   17594: *
                   17595: GNV03  MOV  WC,XL            COPY HASH CHAIN POINTER
                   17596:        MOV  VRNXT(XL),XL     POINT TO NEXT VRBLK ON CHAIN
                   17597:        BZE  XL,GNV08         JUMP IF END OF CHAIN
                   17598:        MOV  XL,WC            SAVE POINTER TO THIS VRBLK
                   17599:        BNZ  VRLEN(XL),GNV04  JUMP IF NOT SYSTEM VARIABLE
                   17600:        MOV  VRSVP(XL),XL     ELSE POINT TO SVBLK
                   17601:        SUB  *VRSOF,XL        ADJUST OFFSET FOR MERGE
                   17602: *
                   17603: *      MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
                   17604: *
                   17605: GNV04  BNE  WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE
                   17606:        ADD  *VRCHS,XL        ELSE POINT TO CHARS OF CHAIN ENTRY
                   17607:        LCT  WB,GNVNW         GET WORD COUNTER TO CONTROL LOOP
                   17608:        MOV  GNVST,XR         POINT TO CHARS OF NEW NAME
                   17609: *
                   17610: *      LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
                   17611: *
                   17612: GNV05  CNE  (XR),(XL),GNV03  JUMP IF NO MATCH FOR NEXT VRBLK
                   17613:        ICA  XR               BUMP NEW NAME POINTER
                   17614:        ICA  XL               BUMP VRBLK IN CHAIN NAME POINTER
                   17615:        BCT  WB,GNV05         ELSE LOOP TILL ALL COMPARED
                   17616:        MOV  WC,XR            WE HAVE FOUND A MATCH, GET VRBLK
                   17617: *
                   17618: *      EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
                   17619: *
                   17620: GNV06  MOV  GNVSA,WA         RESTORE WA
                   17621:        MOV  GNVSB,WB         RESTORE WB
                   17622:        ICA  XS               POP STRING POINTER
                   17623:        MOV  (XS)+,XL         RESTORE XL
                   17624: *
                   17625: *      COMMON EXIT POINT
                   17626: *
                   17627: GNV07  EXI                   RETURN TO GTNVR CALLER
                   17628: *
                   17629: *      NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
                   17630: *
                   17631: GNV08  ZER  XR               CLEAR GARBAGE XR POINTER
                   17632:        MOV  WC,GNVHE         SAVE PTR TO END OF HASH CHAIN
                   17633:        BGT  WA,=NUM09,GNV14  CANNOT BE SYSTEM VAR IF LENGTH GT 9
                   17634:        MOV  WA,XL            ELSE COPY LENGTH
                   17635:        WTB  XL               CONVERT TO BYTE OFFSET
                   17636:        MOV  VSRCH(XL),XL     POINT TO FIRST SVBLK OF THIS LENGTH
                   17637:        EJC
                   17638: *
                   17639: *      GTNVR (CONTINUED)
                   17640: *
                   17641: *      LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
                   17642: *
                   17643: GNV09  MOV  XL,GNVSP         SAVE TABLE POINTER
                   17644:        MOV  (XL)+,WC         LOAD SVBIT BIT STRING
                   17645:        MOV  (XL)+,WB         LOAD LENGTH FROM TABLE ENTRY
                   17646:        BNE  WA,WB,GNV14      JUMP IF END OF RIGHT LENGTH ENTIRES
                   17647:        LCT  WB,GNVNW         GET WORD COUNTER TO CONTROL LOOP
                   17648:        MOV  GNVST,XR         POINT TO CHARS OF NEW NAME
                   17649: *
                   17650: *      LOOP TO CHECK FOR MATCHING NAMES
                   17651: *
                   17652: GNV10  CNE  (XR),(XL),GNV11  JUMP IF NAME MISMATCH
                   17653:        ICA  XR               ELSE BUMP NEW NAME POINTER
                   17654:        ICA  XL               BUMP SVBLK POINTER
                   17655:        BCT  WB,GNV10         ELSE LOOP UNTIL ALL CHECKED
                   17656: *
                   17657: *      HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
                   17658: *
                   17659:        ZER  WC               SET VRLEN VALUE ZERO
                   17660:        MOV  *VRSI$,WA        SET STANDARD SIZE
                   17661:        BRN  GNV15            JUMP TO BUILD VRBLK
                   17662: *
                   17663: *      HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
                   17664: *
                   17665: GNV11  ICA  XL               BUMP PAST WORD OF CHARS
                   17666:        BCT  WB,GNV11         LOOP BACK IF MORE TO GO
                   17667:        RSH  WC,SVNBT         REMOVE UNINTERESTING BITS
                   17668: *
                   17669: *      LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
                   17670: *
                   17671: GNV12  MOV  BITS1,WB         LOAD BIT TO TEST
                   17672:        ANB  WC,WB            TEST FOR WORD PRESENT
                   17673:        ZRB  WB,GNV13         JUMP IF NOT PRESENT
                   17674:        ICA  XL               ELSE BUMP TABLE POINTER
                   17675: *
                   17676: *      HERE AFTER DEALING WITH ONE WORD (ONE BIT)
                   17677: *
                   17678: GNV13  RSH  WC,1             REMOVE BIT ALREADY PROCESSED
                   17679:        NZB  WC,GNV12         LOOP BACK IF MORE BITS TO TEST
                   17680:        BRN  GNV09            ELSE LOOP BACK FOR NEXT SVBLK
                   17681: *
                   17682: *      HERE IF NOT SYSTEM VARIABLE
                   17683: *
                   17684: GNV14  MOV  WA,WC            COPY VRLEN VALUE
                   17685:        MOV  =VRCHS,WA        LOAD STANDARD SIZE -CHARS
                   17686:        ADD  GNVNW,WA         ADJUST FOR CHARS OF NAME
                   17687:        WTB  WA               CONVERT LENGTH TO BYTES
                   17688:        EJC
                   17689: *
                   17690: *      GTNVR (CONTINUED)
                   17691: *
                   17692: *      MERGE HERE TO BUILD VRBLK
                   17693: *
                   17694: GNV15  JSR  ALOST            ALLOCATE SPACE FOR VRBLK (STATIC)
                   17695:        MOV  XR,WB            SAVE VRBLK POINTER
                   17696:        MOV  =STNVR,XL        POINT TO MODEL VARIABLE BLOCK
                   17697:        MOV  *VRLEN,WA        SET LENGTH OF STANDARD FIELDS
                   17698:        MVW                   SET INITIAL FIELDS OF NEW BLOCK
                   17699:        MOV  GNVHE,XL         LOAD POINTER TO END OF HASH CHAIN
                   17700:        MOV  WB,VRNXT(XL)     ADD NEW BLOCK TO END OF CHAIN
                   17701:        MOV  WC,(XR)+         SET VRLEN FIELD, BUMP PTR
                   17702:        MOV  GNVNW,WA         GET LENGTH IN WORDS
                   17703:        WTB  WA               CONVERT TO LENGTH IN BYTES
                   17704:        BZE  WC,GNV16         JUMP IF SYSTEM VARIABLE
                   17705: *
                   17706: *      HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
                   17707: *
                   17708:        MOV  (XS),XL          POINT BACK TO STRING NAME
                   17709:        ADD  *SCHAR,XL        POINT TO CHARS OF NAME
                   17710:        MVW                   MOVE CHARACTERS INTO PLACE
                   17711:        MOV  WB,XR            RESTORE VRBLK POINTER
                   17712:        BRN  GNV06            JUMP BACK TO EXIT
                   17713: *
                   17714: *      HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
                   17715: *      NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
                   17716: *
                   17717: GNV16  MOV  GNVSP,XL         LOAD POINTER TO SVBLK
                   17718:        MOV  XL,(XR)          SET SVBLK PTR IN VRBLK
                   17719:        MOV  WB,XR            RESTORE VRBLK POINTER
                   17720:        MOV  SVBIT(XL),WB     LOAD BIT INDICATORS
                   17721:        ADD  *SVCHS,XL        POINT TO CHARACTERS OF NAME
                   17722:        ADD  WA,XL            POINT PAST CHARACTERS
                   17723: *
                   17724: *      SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
                   17725: *
                   17726:        MOV  BTKNM,WC         LOAD TEST BIT
                   17727:        ANB  WB,WC            AND TO TEST
                   17728:        ZRB  WC,GNV17         JUMP IF NO KEYWORD NUMBER
                   17729:        ICA  XL               ELSE BUMP POINTER
                   17730:        EJC
                   17731: *
                   17732: *      GTNVR (CONTINUED)
                   17733: *
                   17734: *      HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
                   17735: *
                   17736: GNV17  MOV  BTFNC,WC         GET TEST BIT
                   17737:        ANB  WB,WC            AND TO TEST
                   17738:        ZRB  WC,GNV18         SKIP IF NO SYSTEM FUNCTION
                   17739:        MOV  XL,VRFNC(XR)     ELSE POINT VRFNC TO SVFNC FIELD
                   17740:        ADD  *NUM02,XL        AND BUMP PAST SVFNC, SVNAR FIELDS
                   17741: *
                   17742: *      NOW TEST FOR LABEL (SVLBL)
                   17743: *
                   17744: GNV18  MOV  BTLBL,WC         GET TEST BIT
                   17745:        ANB  WB,WC            AND TO TEST
                   17746:        ZRB  WC,GNV19         JUMP IF BIT IS OFF (NO SYSTEM LABL)
                   17747:        MOV  XL,VRLBL(XR)     ELSE POINT VRLBL TO SVLBL FIELD
                   17748:        ICA  XL               BUMP PAST SVLBL FIELD
                   17749: *
                   17750: *      NOW TEST FOR VALUE (SVVAL)
                   17751: *
                   17752: GNV19  MOV  BTVAL,WC         LOAD TEST BIT
                   17753:        ANB  WB,WC            AND TO TEST
                   17754:        ZRB  WC,GNV06         ALL DONE IF NO VALUE
                   17755:        MOV  (XL),VRVAL(XR)   ELSE SET INITIAL VALUE
                   17756:        MOV  =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS
                   17757:        BRN  GNV06            MERGE BACK TO EXIT TO CALLER
                   17758:        ENP                   END PROCEDURE GTNVR
                   17759:        EJC
                   17760: *
                   17761: *      GTPAT -- GET PATTERN
                   17762: *
                   17763: *      GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
                   17764: *      PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
                   17765: *
                   17766: *      (XR)                  INPUT ARGUMENT
                   17767: *      JSR  GTPAT            CALL TO CONVERT TO PATTERN
                   17768: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17769: *      (XR)                  RESULTING PATTERN
                   17770: *      (WA)                  DESTROYED
                   17771: *      (WB)                  DESTROYED (ONLY ON CONVERT ERROR)
                   17772: *      (XR)                  UNCHANGED (ONLY ON CONVERT ERROR)
                   17773: *
                   17774: GTPAT  PRC  E,1              ENTRY POINT
                   17775:        BHI  (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY
                   17776: *
                   17777: *      HERE IF NOT PATTERN, TRY FOR STRING
                   17778: *
                   17779:        MOV  WB,GTPSB         SAVE WB
                   17780:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   17781:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   17782:        PPM  GTPT2            JUMP IF IMPOSSIBLE
                   17783: *
                   17784: *      HERE WE HAVE A STRING
                   17785: *
                   17786:        BNZ  WA,GTPT1         JUMP IF NON-NULL
                   17787: *
                   17788: *      HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
                   17789: *
                   17790:        MOV  =NDNTH,XR        POINT TO NOTHEN NODE
                   17791:        BRN  GTPT4            JUMP TO EXIT
                   17792:        EJC
                   17793: *
                   17794: *      GTPAT (CONTINUED)
                   17795: *
                   17796: *      HERE FOR NON-NULL STRING
                   17797: *
                   17798: GTPT1  MOV  =P$STR,WB        LOAD PCODE FOR MULTI-CHAR STRING
                   17799:        BNE  WA,=NUM01,GTPT3  JUMP IF MULTI-CHAR STRING
                   17800: *
                   17801: *      HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
                   17802: *
                   17803:        PLC  XR               POINT TO CHARACTER
                   17804:        LCH  WA,(XR)          LOAD CHARACTER
                   17805:        MOV  WA,XR            SET AS PARM1
                   17806:        MOV  =P$ANS,WB        POINT TO PCODE FOR 1-CHAR ANY
                   17807:        BRN  GTPT3            JUMP TO BUILD NODE
                   17808: *
                   17809: *      HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
                   17810: *
                   17811: GTPT2  MOV  =P$EXA,WB        SET PCODE FOR EXPRESSION IN CASE
                   17812:        BLO  (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION
                   17813: *
                   17814: *      HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
                   17815: *
                   17816:        EXI  1                TAKE CONVERT ERROR EXIT
                   17817: *
                   17818: *      MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
                   17819: *
                   17820: GTPT3  JSR  PBILD            CALL ROUTINE TO BUILD PATTERN NODE
                   17821: *
                   17822: *      COMMON EXIT AFTER SUCCESSFUL CONVERSION
                   17823: *
                   17824: GTPT4  MOV  GTPSB,WB         RESTORE WB
                   17825: *
                   17826: *      MERGE HERE TO EXIT OF NO CONVERSION REQUIRED
                   17827: *
                   17828: GTPT5  EXI                   RETURN TO GTPAT CALLER
                   17829:        ENP                   END PROCEDURE GTPAT
                   17830: .IF    .CNRA
                   17831: .ELSE
                   17832:        EJC
                   17833: *
                   17834: *      GTREA -- GET REAL VALUE
                   17835: *
                   17836: *      GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
                   17837: *      PERFORMING ANY NECESSARY CONVERSIONS.
                   17838: *
                   17839: *      (XR)                  OBJECT TO BE CONVERTED
                   17840: *      JSR  GTREA            CALL TO CONVERT OBJECT TO REAL
                   17841: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17842: *      (XR)                  POINTER TO RESULTING REAL
                   17843: *      (WA,WB,WC,RA)         DESTROYED
                   17844: *      (XR)                  UNCHANGED (CONVERT ERROR ONLY)
                   17845: *
                   17846: GTREA  PRC  E,1              ENTRY POINT
                   17847:        MOV  (XR),WA          GET FIRST WORD OF BLOCK
                   17848:        BEQ  WA,=B$RCL,GTRE2  JUMP IF REAL
                   17849:        JSR  GTNUM            ELSE CONVERT ARGUMENT TO NUMERIC
                   17850:        PPM  GTRE3            JUMP IF UNCONVERTIBLE
                   17851:        BEQ  WA,=B$RCL,GTRE2  JUMP IF REAL WAS RETURNED
                   17852: *
                   17853: *      HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
                   17854: *
                   17855: GTRE1  LDI  ICVAL(XR)        LOAD INTEGER
                   17856:        ITR                   CONVERT TO REAL
                   17857:        JSR  RCBLD            BUILD RCBLK
                   17858: *
                   17859: *      EXIT WITH REAL
                   17860: *
                   17861: GTRE2  EXI                   RETURN TO GTREA CALLER
                   17862: *
                   17863: *      HERE ON CONVERSION ERROR
                   17864: *
                   17865: GTRE3  EXI  1                TAKE CONVERT ERROR EXIT
                   17866:        ENP                   END PROCEDURE GTREA
                   17867: .FI
                   17868:        EJC
                   17869: *
                   17870: *      GTSMI -- GET SMALL INTEGER
                   17871: *
                   17872: *      GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
                   17873: *      INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
                   17874: *      ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
                   17875: *      SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
                   17876: *      THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
                   17877: *
                   17878: *      -(XS)                 ARGUMENT TO CONVERT (ON STACK)
                   17879: *      JSR  GTSMI            CALL TO CONVERT TO SMALL INTEGER
                   17880: *      PPM  LOC              TRANSFER LOC FOR NOT INTEGER
                   17881: *      PPM  LOC              TRANSFER LOC FOR LT 0, GT DNAMB
                   17882: *      (XR,WC)               RESULTING SMALL INT (TWO COPIES)
                   17883: *      (XS)                  POPPED
                   17884: *      (RA)                  DESTROYED
                   17885: *      (WA,WB)               DESTROYED (ON CONVERT ERROR ONLY)
                   17886: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
                   17887: *
                   17888: GTSMI  PRC  N,2              ENTRY POINT
                   17889:        MOV  (XS)+,XR         LOAD ARGUMENT
                   17890:        BEQ  (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER
                   17891: *
                   17892: *      HERE IF NOT AN INTEGER
                   17893: *
                   17894:        JSR  GTINT            CONVERT ARGUMENT TO INTEGER
                   17895:        PPM  GTSM2            JUMP IF CONVERT IS IMPOSSIBLE
                   17896: *
                   17897: *      MERGE HERE WITH INTEGER
                   17898: *
                   17899: GTSM1  LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   17900:        MFI  WC,GTSM3         MOVE AS ONE WORD, JUMP IF OVFLOW
                   17901:        BGT  WC,MXLEN,GTSM3   OR IF TOO SMALL
                   17902:        MOV  WC,XR            COPY RESULT TO XR
                   17903:        EXI                   RETURN TO GTSMI CALLER
                   17904: *
                   17905: *      HERE IF UNCONVERTIBLE TO INTEGER
                   17906: *
                   17907: GTSM2  EXI  1                TAKE NON-INTEGER ERROR EXIT
                   17908: *
                   17909: *      HERE IF OUT OF RANGE
                   17910: *
                   17911: GTSM3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
                   17912:        ENP                   END PROCEDURE GTSMI
                   17913:        EJC
                   17914: *
                   17915: *      GTSTG -- GET STRING
                   17916: *
                   17917: *      GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
                   17918: *      ANY NECESSARY CONVERSIONS PERFORMED.
                   17919: *
                   17920: *      -(XS)                 INPUT ARGUMENT (ON STACK)
                   17921: *      JSR  GTSTG            CALL TO CONVERT TO STRING
                   17922: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   17923: *      (XR)                  POINTER TO RESULTING STRING
                   17924: *      (WA)                  LENGTH OF STRING IN CHARACTERS
                   17925: *      (XS)                  POPPED
                   17926: *      (RA)                  DESTROYED
                   17927: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
                   17928: *
                   17929: GTSTG  PRC  N,1              ENTRY POINT
                   17930:        MOV  (XS)+,XR         LOAD ARGUMENT, POP STACK
                   17931:        BEQ  (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING
                   17932: *
                   17933: *      HERE IF NOT A STRING ALREADY
                   17934: *
                   17935: GTS01  MOV  XR,-(XS)         RESTACK ARGUMENT IN CASE ERROR
                   17936:        MOV  XL,-(XS)         SAVE XL
                   17937:        MOV  WB,GTSVB         SAVE WB
                   17938:        MOV  WC,GTSVC         SAVE WC
                   17939:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   17940:        BEQ  WA,=B$ICL,GTS05  JUMP TO CONVERT INTEGER
                   17941: .IF    .CNRA
                   17942: .ELSE
                   17943:        BEQ  WA,=B$RCL,GTS10  JUMP TO CONVERT REAL
                   17944: .FI
                   17945:        BEQ  WA,=B$NML,GTS03  JUMP TO CONVERT NAME
                   17946: .IF    .CNBF
                   17947: .ELSE
                   17948:        BEQ  WA,=B$BCT,GTS32  JUMP TO CONVERT BUFFER
                   17949: .FI
                   17950: *
                   17951: *      HERE ON CONVERSION ERROR
                   17952: *
                   17953: GTS02  MOV  (XS)+,XL         RESTORE XL
                   17954:        MOV  (XS)+,XR         RELOAD INPUT ARGUMENT
                   17955:        EXI  1                TAKE CONVERT ERROR EXIT
                   17956:        EJC
                   17957: *
                   17958: *      GTSTG (CONTINUED)
                   17959: *
                   17960: *      HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
                   17961: *
                   17962: GTS03  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   17963:        BHI  XL,STATE,GTS02   ERROR IF NOT NATURAL VAR (STATIC)
                   17964:        ADD  *VRSOF,XL        ELSE POINT TO POSSIBLE STRING NAME
                   17965:        MOV  SCLEN(XL),WA     LOAD LENGTH
                   17966:        BNZ  WA,GTS04         JUMP IF NOT SYSTEM VARIABLE
                   17967:        MOV  VRSVO(XL),XL     ELSE POINT TO SVBLK
                   17968:        MOV  SVLEN(XL),WA     AND LOAD NAME LENGTH
                   17969: *
                   17970: *      MERGE HERE WITH STRING IN XR, LENGTH IN WA
                   17971: *
                   17972: GTS04  ZER  WB               SET OFFSET TO ZERO
                   17973:        JSR  SBSTR            USE SBSTR TO COPY STRING
                   17974:        BRN  GTS29            JUMP TO EXIT
                   17975: *
                   17976: *      COME HERE TO CONVERT AN INTEGER
                   17977: *
                   17978: GTS05  LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   17979: .IF    .CNCI
                   17980:        JSR  SYSCI            CONVERT INTEGER
                   17981:        MOV  SCLEN(XL),WA     GET LENGTH
                   17982:        ZER  WB               ZERO OFFSET FOR SBSTR
                   17983:        JSR  SBSTR            COPY IN RESULT FROM SYSCI
                   17984:        BRN  GTS29            EXIT
                   17985: .ELSE
                   17986:        MOV  =NUM01,GTSSF     SET SIGN FLAG NEGATIVE
                   17987:        ILT  GTS06            SKIP IF INTEGER IS NEGATIVE
                   17988:        NGI                   ELSE NEGATE INTEGER
                   17989:        ZER  GTSSF            AND RESET NEGATIVE FLAG
                   17990:        EJC
                   17991: *
                   17992: *      GTSTG (CONTINUED)
                   17993: *
                   17994: *      HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
                   17995: *      REQUIRED BY THE CVD INSTRUCTION.
                   17996: *
                   17997: GTS06  MOV  GTSWK,XR         POINT TO RESULT WORK AREA
                   17998:        MOV  =NSTMX,WB        INITIALIZE COUNTER TO MAX LENGTH
                   17999:        PSC  XR,WB            PREPARE TO STORE (RIGHT-LEFT)
                   18000: *
                   18001: *      LOOP TO CONVERT DIGITS INTO WORK AREA
                   18002: *
                   18003: GTS07  CVD                   CONVERT ONE DIGIT INTO WA
                   18004:        SCH  WA,-(XR)         STORE IN WORK AREA
                   18005:        DCV  WB               DECREMENT COUNTER
                   18006:        INE  GTS07            LOOP IF MORE DIGITS TO GO
                   18007:        CSC  XR               COMPLETE STORE CHARACTERS
                   18008: .FI
                   18009: *
                   18010: *      MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
                   18011: *      AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
                   18012: *
                   18013: GTS08  MOV  =NSTMX,WA        GET MAX NUMBER OF CHARACTERS
                   18014:        SUB  WB,WA            COMPUTE LENGTH OF RESULT
                   18015:        MOV  WA,XL            REMEMBER LENGTH FOR MOVE LATER ON
                   18016:        ADD  GTSSF,WA         ADD ONE FOR NEGATIVE SIGN IF NEEDED
                   18017:        JSR  ALOCS            ALLOCATE STRING FOR RESULT
                   18018:        MOV  XR,WC            SAVE RESULT POINTER FOR THE MOMENT
                   18019:        PSC  XR               POINT TO CHARS OF RESULT BLOCK
                   18020:        BZE  GTSSF,GTS09      SKIP IF POSITIVE
                   18021:        MOV  =CH$MN,WA        ELSE LOAD NEGATIVE SIGN
                   18022:        SCH  WA,(XR)+         AND STORE IT
                   18023:        CSC  XR               COMPLETE STORE CHARACTERS
                   18024: *
                   18025: *      HERE AFTER DEALING WITH SIGN
                   18026: *
                   18027: GTS09  MOV  XL,WA            RECALL LENGTH TO MOVE
                   18028:        MOV  GTSWK,XL         POINT TO RESULT WORK AREA
                   18029:        PLC  XL,WB            POINT TO FIRST RESULT CHARACTER
                   18030:        MVC                   MOVE CHARS TO RESULT STRING
                   18031:        MOV  WC,XR            RESTORE RESULT POINTER
                   18032: .IF    .CNRA
                   18033: .ELSE
                   18034:        BRN  GTS29            JUMP TO EXIT
                   18035:        EJC
                   18036: *
                   18037: *      GTSTG (CONTINUED)
                   18038: *
                   18039: *      HERE TO CONVERT A REAL
                   18040: *
                   18041: GTS10  LDR  RCVAL(XR)        LOAD REAL
                   18042:        ZER  GTSSF            RESET NEGATIVE FLAG
                   18043:        REQ  GTS31            SKIP IF ZERO
                   18044:        RGE  GTS11            JUMP IF REAL IS POSITIVE
                   18045:        MOV  =NUM01,GTSSF     ELSE SET NEGATIVE FLAG
                   18046:        NGR                   AND GET ABSOLUTE VALUE OF REAL
                   18047: *
                   18048: *      NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
                   18049: *
                   18050: GTS11  LDI  INTV0            INITIALIZE EXPONENT TO ZERO
                   18051: *
                   18052: *      LOOP TO SCALE UP IN STEPS OF 10**10
                   18053: *
                   18054: GTS12  STR  GTSRS            SAVE REAL VALUE
                   18055:        SBR  REAP1            SUBTRACT 0.1 TO COMPARE
                   18056:        RGE  GTS13            JUMP IF SCALE UP NOT REQUIRED
                   18057:        LDR  GTSRS            ELSE RELOAD VALUE
                   18058:        MLR  REATT            MULTIPLY BY 10**10
                   18059:        SBI  INTVT            DECREMENT EXPONENT BY 10
                   18060:        BRN  GTS12            LOOP BACK TO TEST AGAIN
                   18061: *
                   18062: *      TEST FOR SCALE DOWN REQUIRED
                   18063: *
                   18064: GTS13  LDR  GTSRS            RELOAD VALUE
                   18065:        SBR  REAV1            SUBTRACT 1.0
                   18066:        RLT  GTS17            JUMP IF NO SCALE DOWN REQUIRED
                   18067:        LDR  GTSRS            ELSE RELOAD VALUE
                   18068: *
                   18069: *      LOOP TO SCALE DOWN IN STEPS OF 10**10
                   18070: *
                   18071: GTS14  SBR  REATT            SUBTRACT 10**10 TO COMPARE
                   18072:        RLT  GTS15            JUMP IF LARGE STEP NOT REQUIRED
                   18073:        LDR  GTSRS            ELSE RESTORE VALUE
                   18074:        DVR  REATT            DIVIDE BY 10**10
                   18075:        STR  GTSRS            STORE NEW VALUE
                   18076:        ADI  INTVT            INCREMENT EXPONENT BY 10
                   18077:        BRN  GTS14            LOOP BACK
                   18078:        EJC
                   18079: *
                   18080: *      GTSTG (CONTINUED)
                   18081: *
                   18082: *      AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
                   18083: *      COMPLETE SCALING WITH POWERS OF TEN TABLE
                   18084: *
                   18085: GTS15  MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
                   18086: *
                   18087: *      LOOP TO LOCATE CORRECT ENTRY IN TABLE
                   18088: *
                   18089: GTS16  LDR  GTSRS            RELOAD VALUE
                   18090:        ADI  INTV1            INCREMENT EXPONENT
                   18091:        ADD  *CFP$R,XR        POINT TO NEXT ENTRY IN TABLE
                   18092:        SBR  (XR)             SUBTRACT IT TO COMPARE
                   18093:        RGE  GTS16            LOOP TILL WE FIND A LARGER ENTRY
                   18094:        LDR  GTSRS            THEN RELOAD THE VALUE
                   18095:        DVR  (XR)             AND COMPLETE SCALING
                   18096:        STR  GTSRS            STORE VALUE
                   18097: *
                   18098: *      WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
                   18099: *
                   18100: GTS17  LDR  GTSRS            GET VALUE AGAIN
                   18101:        ADR  GTSRN            ADD ROUNDING FACTOR
                   18102:        STR  GTSRS            STORE RESULT
                   18103: *
                   18104: *      THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
                   18105: *      1.0 AGAIN, SO CHECK ONE MORE TIME.
                   18106: *
                   18107:        SBR  REAV1            SUBTRACT 1.0 TO COMPARE
                   18108:        RLT  GTS18            SKIP IF OK
                   18109:        ADI  INTV1            ELSE INCREMENT EXPONENT
                   18110:        LDR  GTSRS            RELOAD VALUE
                   18111:        DVR  REAVT            DIVIDE BY 10.0 TO RESCALE
                   18112:        BRN  GTS19            JUMP TO MERGE
                   18113: *
                   18114: *      HERE IF ROUNDING DID NOT MUCK UP SCALING
                   18115: *
                   18116: GTS18  LDR  GTSRS            RELOAD ROUNDED VALUE
                   18117:        EJC
                   18118: *
                   18119: *      GTSTG (CONTINUED)
                   18120: *
                   18121: *      NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
                   18122: *
                   18123: *      (IA)                  SIGNED EXPONENT
                   18124: *      (RA)                  SCALED REAL (ABSOLUTE VALUE)
                   18125: *
                   18126: *      IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
                   18127: *      WE CONVERT THE NUMBER IN THE FORM.
                   18128: *
                   18129: *      (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
                   18130: *
                   18131: *      IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
                   18132: *      CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
                   18133: *
                   18134: *      (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
                   18135: *
                   18136: *      IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
                   18137: *      RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
                   18138: *      DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
                   18139: *      AND THE EXPONENT SIGN IS ALWAYS PRESENT.
                   18140: *
                   18141: GTS19  MOV  =CFP$S,XL        SET NUM DEC DIGITS = CFP$S
                   18142:        MOV  =CH$MN,GTSES     SET EXPONENT SIGN NEGATIVE
                   18143:        ILT  GTS21            ALL SET IF EXPONENT IS NEGATIVE
                   18144:        MFI  WA               ELSE FETCH EXPONENT
                   18145:        BLE  WA,=CFP$S,GTS20  SKIP IF WE CAN USE SPECIAL FORMAT
                   18146:        MTI  WA               ELSE RESTORE EXPONENT
                   18147:        NGI                   SET NEGATIVE FOR CVD
                   18148:        MOV  =CH$PL,GTSES     SET PLUS SIGN FOR EXPONENT SIGN
                   18149:        BRN  GTS21            JUMP TO GENERATE EXPONENT
                   18150: *
                   18151: *      HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
                   18152: *
                   18153: GTS20  SUB  WA,XL            COMPUTE DIGITS AFTER DECIMAL POINT
                   18154:        LDI  INTV0            RESET EXPONENT TO ZERO
                   18155:        EJC
                   18156: *
                   18157: *      GTSTG (CONTINUED)
                   18158: *
                   18159: *      MERGE HERE AS FOLLOWS
                   18160: *
                   18161: *      (IA)                  EXPONENT ABSOLUTE VALUE
                   18162: *      GTSES                 CHARACTER FOR EXPONENT SIGN
                   18163: *      (RA)                  POSITIVE FRACTION
                   18164: *      (XL)                  NUMBER OF DIGITS AFTER DEC POINT
                   18165: *
                   18166: GTS21  MOV  GTSWK,XR         POINT TO WORK AREA
                   18167:        MOV  =NSTMX,WB        SET CHARACTER CTR TO MAX LENGTH
                   18168:        PSC  XR,WB            PREPARE TO STORE (RIGHT TO LEFT)
                   18169:        IEQ  GTS23            SKIP EXPONENT IF IT IS ZERO
                   18170: *
                   18171: *      LOOP TO GENERATE DIGITS OF EXPONENT
                   18172: *
                   18173: GTS22  CVD                   CONVERT A DIGIT INTO WA
                   18174:        SCH  WA,-(XR)         STORE IN WORK AREA
                   18175:        DCV  WB               DECREMENT COUNTER
                   18176:        INE  GTS22            LOOP BACK IF MORE DIGITS TO GO
                   18177: *
                   18178: *      HERE GENERATE EXPONENT SIGN AND E
                   18179: *
                   18180:        MOV  GTSES,WA         LOAD EXPONENT SIGN
                   18181:        SCH  WA,-(XR)         STORE IN WORK AREA
                   18182:        MOV  =CH$LE,WA        GET CHARACTER LETTER E
                   18183:        SCH  WA,-(XR)         STORE IN WORK AREA
                   18184:        SUB  =NUM02,WB        DECREMENT COUNTER FOR SIGN AND E
                   18185: *
                   18186: *      HERE TO GENERATE THE FRACTION
                   18187: *
                   18188: GTS23  MLR  GTSSC            CONVERT REAL TO INTEGER (10**CFP$S)
                   18189:        RTI                   GET INTEGER (OVERFLOW IMPOSSIBLE)
                   18190:        NGI                   NEGATE AS REQUIRED BY CVD
                   18191: *
                   18192: *      LOOP TO SUPPRESS TRAILING ZEROS
                   18193: *
                   18194: GTS24  BZE  XL,GTS27         JUMP IF NO DIGITS LEFT TO DO
                   18195:        CVD                   ELSE CONVERT ONE DIGIT
                   18196:        BNE  WA,=CH$D0,GTS26  JUMP IF NOT A ZERO
                   18197:        DCV  XL               DECREMENT COUNTER
                   18198:        BRN  GTS24            LOOP BACK FOR NEXT DIGIT
                   18199:        EJC
                   18200: *
                   18201: *      GTSTG (CONTINUED)
                   18202: *
                   18203: *      LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
                   18204: *
                   18205: GTS25  CVD                   CONVERT A DIGIT INTO WA
                   18206: *
                   18207: *      MERGE HERE FIRST TIME
                   18208: *
                   18209: GTS26  SCH  WA,-(XR)         STORE DIGIT
                   18210:        DCV  WB               DECREMENT COUNTER
                   18211:        DCV  XL               DECREMENT COUNTER
                   18212:        BNZ  XL,GTS25         LOOP BACK IF MORE TO GO
                   18213: *
                   18214: *      HERE GENERATE THE DECIMAL POINT
                   18215: *
                   18216: GTS27  MOV  =CH$DT,WA        LOAD DECIMAL POINT
                   18217:        SCH  WA,-(XR)         STORE IN WORK AREA
                   18218:        DCV  WB               DECREMENT COUNTER
                   18219: *
                   18220: *      HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
                   18221: *
                   18222: GTS28  CVD                   CONVERT A DIGIT INTO WA
                   18223:        SCH  WA,-(XR)         STORE IN WORK AREA
                   18224:        DCV  WB               DECREMENT COUNTER
                   18225:        INE  GTS28            LOOP BACK IF MORE TO GO
                   18226:        CSC  XR               COMPLETE STORE CHARACTERS
                   18227:        BRN  GTS08            ELSE JUMP BACK TO EXIT
                   18228: .FI
                   18229: *
                   18230: *      EXIT POINT AFTER SUCCESSFUL CONVERSION
                   18231: *
                   18232: GTS29  MOV  (XS)+,XL         RESTORE XL
                   18233:        ICA  XS               POP ARGUMENT
                   18234:        MOV  GTSVB,WB         RESTORE WB
                   18235:        MOV  GTSVC,WC         RESTORE WC
                   18236: *
                   18237: *      MERGE HERE IF NO CONVERSION REQUIRED
                   18238: *
                   18239: GTS30  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   18240:        EXI                   RETURN TO CALLER
                   18241: .IF    .CNRA
                   18242: .ELSE
                   18243: *
                   18244: *      HERE TO RETURN STRING FOR REAL ZERO
                   18245: *
                   18246: GTS31  MOV  =SCRE0,XL        POINT TO STRING
                   18247:        MOV  =NUM02,WA        2 CHARS
                   18248:        ZER  WB               ZERO OFFSET
                   18249:        JSR  SBSTR            COPY STRING
                   18250:        BRN  GTS29            RETURN
                   18251: .FI
                   18252: .IF    .CNBF
                   18253: .ELSE
                   18254:        EJC
                   18255: *
                   18256: *      HERE TO CONVERT A BUFFER BLOCK
                   18257: *
                   18258: GTS32  MOV  XR,XL            COPY ARG PTR
                   18259:        MOV  BCLEN(XL),WA     GET SIZE TO ALLOCATE
                   18260:        BZE  WA,GTS33         IF NULL THEN RETURN NULL
                   18261:        JSR  ALOCS            ALLOCATE STRING FRAME
                   18262:        MOV  XR,WB            SAVE STRING PTR
                   18263:        MOV  SCLEN(XR),WA     GET LENGTH TO MOVE
                   18264:        CTB  WA,0             GET AS MULTIPLE OF WORD SIZE
                   18265:        MOV  BCBUF(XL),XL     POINT TO BFBLK
                   18266:        ADD  *SCSI$,XR        POINT TO START OF CHARACTER AREA
                   18267:        ADD  *BFSI$,XL        POINT TO START OF BUFFER CHARS
                   18268:        MVW                   COPY WORDS
                   18269:        MOV  WB,XR            RESTORE SCBLK PTR
                   18270:        BRN  GTS29            EXIT WITH SCBLK
                   18271: *
                   18272: *      HERE WHEN NULL BUFFER IS BEING CONVERTED
                   18273: *
                   18274: GTS33  MOV  =NULLS,XR        POINT TO NULL
                   18275:        BRN  GTS29            EXIT WITH NULL
                   18276: .FI
                   18277:        ENP                   END PROCEDURE GTSTG
                   18278:        EJC
                   18279: *
                   18280: *      GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
                   18281: *
                   18282: *      GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
                   18283: *      FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
                   18284: *
                   18285: *      (XR)                  ARGUMENT TO FUNCTION
                   18286: *      JSR  GTVAR            CALL TO LOCATE VARIABLE POINTER
                   18287: *      PPM  LOC              TRANSFER LOC IF NOT OK VARIABLE
                   18288: *      (XL,WA)               NAME BASE,OFFSET OF VARIABLE
                   18289: *      (XR,RA)               DESTROYED
                   18290: *      (WB,WC)               DESTROYED (CONVERT ERROR ONLY)
                   18291: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
                   18292: *
                   18293: GTVAR  PRC  E,1              ENTRY POINT
                   18294:        BNE  (XR),=B$NML,GTVR2 JUMP IF NOT A NAME
                   18295:        MOV  NMOFS(XR),WA     ELSE LOAD NAME OFFSET
                   18296:        MOV  NMBAS(XR),XL     LOAD NAME BASE
                   18297:        BEQ  (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE
                   18298:        BNE  (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE
                   18299: *
                   18300: *      HERE ON CONVERSION ERROR
                   18301: *
                   18302: GTVR1  EXI  1                TAKE CONVERT ERROR EXIT
                   18303: *
                   18304: *      HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
                   18305: *
                   18306: GTVR2  MOV  WC,GTVRC         SAVE WC
                   18307:        JSR  GTNVR            LOCATE VRBLK IF POSSIBLE
                   18308:        PPM  GTVR1            JUMP IF CONVERT ERROR
                   18309:        MOV  XR,XL            ELSE COPY VRBLK NAME BASE
                   18310:        MOV  *VRVAL,WA        AND SET OFFSET
                   18311:        MOV  GTVRC,WC         RESTORE WC
                   18312: *
                   18313: *      HERE FOR NAME OBTAINED
                   18314: *
                   18315: GTVR3  BHI  XL,STATE,GTVR4   ALL OK IF NOT NATURAL VARIABLE
                   18316:        BEQ  VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE
                   18317: *
                   18318: *      COMMON EXIT POINT
                   18319: *
                   18320: GTVR4  EXI                   RETURN TO CALLER
                   18321:        ENP                   END PROCEDURE GTVAR
                   18322:        EJC
                   18323: *
                   18324: *      HASHS -- COMPUTE HASH INDEX FOR STRING
                   18325: *
                   18326: *      HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER
                   18327: *      VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
                   18328: *      IN THE RANGE 0 TO CFP$M
                   18329: *
                   18330: *      (XR)                  STRING TO BE HASHED
                   18331: *      JSR  HASHS            CALL TO HASH STRING
                   18332: *      (IA)                  HASH VALUE
                   18333: *      (XR,WB,WC)            DESTROYED
                   18334: *
                   18335: *      THE HASH FUNCTION USED IS AS FOLLOWS.
                   18336: *
                   18337: *      START WITH THE LENGTH OF THE STRING (SGD07)
                   18338: *
                   18339: *      TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
                   18340: *      THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
                   18341: *
                   18342: *      COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
                   18343: *      THEM AS ONE WORD BIT STRING VALUES.
                   18344: *
                   18345: *      MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
                   18346: *
                   18347: HASHS  PRC  E,0              ENTRY POINT
                   18348:        MOV  SCLEN(XR),WC     LOAD STRING LENGTH IN CHARACTERS
                   18349:        MOV  WC,WB            INITIALIZE WITH LENGTH
                   18350:        BZE  WC,HSHS3         JUMP IF NULL STRING
                   18351:        CTW  WC,0             ELSE GET NUMBER OF WORDS OF CHARS
                   18352:        ADD  *SCHAR,XR        POINT TO CHARACTERS OF STRING
                   18353:        BLO  WC,=E$HNW,HSHS1  USE WHOLE STRING IF SHORT
                   18354:        MOV  =E$HNW,WC        ELSE SET TO INVOLVE FIRST E$HNW WDS
                   18355: *
                   18356: *      HERE WITH COUNT OF WORDS TO CHECK IN WC
                   18357: *
                   18358: HSHS1  LCT  WC,WC            SET COUNTER TO CONTROL LOOP
                   18359: *
                   18360: *      LOOP TO COMPUTE EXCLUSIVE OR
                   18361: *
                   18362: HSHS2  XOB  (XR)+,WB         EXCLUSIVE OR NEXT WORD OF CHARS
                   18363:        BCT  WC,HSHS2         LOOP TILL ALL PROCESSED
                   18364: *
                   18365: *      MERGE HERE WITH EXCLUSIVE OR IN WB
                   18366: *
                   18367: HSHS3  ZGB  WB               ZEROISE UNDEFINED BITS
                   18368:        ANB  BITSM,WB         ENSURE IN RANGE 0 TO CFP$M
                   18369:        MTI  WB               MOVE RESULT AS INTEGER
                   18370:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   18371:        EXI                   RETURN TO HASHS CALLER
                   18372:        ENP                   END PROCEDURE HASHS
                   18373:        EJC
                   18374: *
                   18375: *      ICBLD -- BUILD INTEGER BLOCK
                   18376: *
                   18377: *      (IA)                  INTEGER VALUE FOR ICBLK
                   18378: *      JSR  ICBLD            CALL TO BUILD INTEGER BLOCK
                   18379: *      (XR)                  POINTER TO RESULT ICBLK
                   18380: *      (WA)                  DESTROYED
                   18381: *
                   18382: ICBLD  PRC  E,0              ENTRY POINT
                   18383:        MFI  XR,ICBL1         COPY SMALL INTEGERS
                   18384:        BLE  XR,=NUM02,ICBL3  JUMP IF 0,1 OR 2
                   18385: *
                   18386: *      CONSTRUCT ICBLK
                   18387: *
                   18388: ICBL1  MOV  DNAMP,XR         LOAD POINTER TO NEXT AVAILABLE LOC
                   18389:        ADD  *ICSI$,XR        POINT PAST NEW ICBLK
                   18390:        BLO  XR,DNAME,ICBL2   JUMP IF THERE IS ROOM
                   18391:        MOV  *ICSI$,WA        ELSE LOAD LENGTH OF ICBLK
                   18392:        JSR  ALLOC            USE STANDARD ALLOCATOR TO GET BLOCK
                   18393:        ADD  WA,XR            POINT PAST BLOCK TO MERGE
                   18394: *
                   18395: *      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
                   18396: *
                   18397: ICBL2  MOV  XR,DNAMP         SET NEW POINTER
                   18398:        SUB  *ICSI$,XR        POINT BACK TO START OF BLOCK
                   18399:        MOV  =B$ICL,(XR)      STORE TYPE WORD
                   18400:        STI  ICVAL(XR)        STORE INTEGER VALUE IN ICBLK
                   18401:        EXI                   RETURN TO ICBLD CALLER
                   18402: *
                   18403: *      OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
                   18404: *
                   18405: ICBL3  WTB  XR               CONVERT INTEGER TO OFFSET
                   18406:        MOV  INTAB(XR),XR     POINT TO PRE-BUILT ICBLK
                   18407:        EXI                   RETURN
                   18408:        ENP                   END PROCEDURE ICBLD
                   18409:        EJC
                   18410: *
                   18411: *      IDENT -- COMPARE TWO VALUES
                   18412: *
                   18413: *      IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
                   18414: *      DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
                   18415: *
                   18416: *      (XR)                  FIRST ARGUMENT
                   18417: *      (XL)                  SECOND ARGUMENT
                   18418: *      JSR  IDENT            CALL TO COMPARE ARGUMENTS
                   18419: *      PPM  LOC              TRANSFER LOC IF IDENT
                   18420: *      (NORMAL RETURN IF DIFFER)
                   18421: *      (XR,XL,WC,RA)         DESTROYED
                   18422: *
                   18423: IDENT  PRC  E,1              ENTRY POINT
                   18424:        BEQ  XR,XL,IDEN7      JUMP IF SAME POINTER (IDENT)
                   18425:        MOV  (XR),WC          ELSE LOAD ARG 1 TYPE WORD
                   18426:        BNE  WC,(XL),IDEN1    DIFFER IF ARG 2 TYPE WORD DIFFER
                   18427:        BEQ  WC,=B$SCL,IDEN2  JUMP IF STRINGS
                   18428:        BEQ  WC,=B$ICL,IDEN4  JUMP IF INTEGERS
                   18429: .IF    .CNRA
                   18430: .ELSE
                   18431:        BEQ  WC,=B$RCL,IDEN5  JUMP IF REALS
                   18432: .FI
                   18433:        BEQ  WC,=B$NML,IDEN6  JUMP IF NAMES
                   18434: *
                   18435: *      FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
                   18436: *
                   18437: *      MERGE HERE FOR DIFFER
                   18438: *
                   18439: IDEN1  EXI                   TAKE DIFFER EXIT
                   18440: *
                   18441: *      HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
                   18442: *
                   18443: IDEN2  MOV  SCLEN(XR),WC     LOAD ARG 1 LENGTH
                   18444:        BNE  WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER
                   18445:        CTW  WC,0             GET NUMBER OF WORDS IN STRINGS
                   18446:        ADD  *SCHAR,XR        POINT TO CHARS OF ARG 1
                   18447:        ADD  *SCHAR,XL        POINT TO CHARS OF ARG 2
                   18448:        LCT  WC,WC            SET LOOP COUNTER
                   18449: *
                   18450: *      LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
                   18451: *      SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
                   18452: *
                   18453: IDEN3  CNE  (XR),(XL),IDEN8  DIFFER IF CHARS DO NOT MATCH
                   18454:        ICA  XR               ELSE BUMP ARG ONE POINTER
                   18455:        ICA  XL               BUMP ARG TWO POINTER
                   18456:        BCT  WC,IDEN3         LOOP BACK TILL ALL CHECKED
                   18457:        EJC
                   18458: *
                   18459: *      IDENT (CONTINUED)
                   18460: *
                   18461: *      HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
                   18462: *
                   18463:        ZER  XL               CLEAR GARBAGE VALUE IN XL
                   18464:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   18465:        EXI  1                TAKE IDENT EXIT
                   18466: *
                   18467: *      HERE FOR INTEGERS, IDENT IF SAME VALUES
                   18468: *
                   18469: IDEN4  LDI  ICVAL(XR)        LOAD ARG 1
                   18470:        SBI  ICVAL(XL)        SUBTRACT ARG 2 TO COMPARE
                   18471:        IOV  IDEN1            DIFFER IF OVERFLOW
                   18472:        INE  IDEN1            DIFFER IF RESULT IS NOT ZERO
                   18473:        EXI  1                TAKE IDENT EXIT
                   18474: .IF    .CNRA
                   18475: .ELSE
                   18476: *
                   18477: *      HERE FOR REALS, IDENT IF SAME VALUES
                   18478: *
                   18479: IDEN5  LDR  RCVAL(XR)        LOAD ARG 1
                   18480:        SBR  RCVAL(XL)        SUBTRACT ARG 2 TO COMPARE
                   18481:        ROV  IDEN1            DIFFER IF OVERFLOW
                   18482:        RNE  IDEN1            DIFFER IF RESULT IS NOT ZERO
                   18483:        EXI  1                TAKE IDENT EXIT
                   18484: .FI
                   18485: *
                   18486: *      HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
                   18487: *
                   18488: IDEN6  BNE  NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET
                   18489:        BNE  NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE
                   18490: *
                   18491: *      MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
                   18492: *
                   18493: IDEN7  EXI  1                TAKE IDENT EXIT
                   18494: *
                   18495: *      HERE FOR DIFFER STRINGS
                   18496: *
                   18497: IDEN8  ZER  XR               CLEAR GARBAGE PTR IN XR
                   18498:        ZER  XL               CLEAR GARBAGE PTR IN XL
                   18499:        EXI                   RETURN TO CALLER (DIFFER)
                   18500:        ENP                   END PROCEDURE IDENT
                   18501:        EJC
                   18502: *
                   18503: *      INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES
                   18504: *
                   18505: *      (XL)                  POINTER TO VBL NAME STRING
                   18506: *      (WB)                  TRBLK TYPE
                   18507: *      JSR  INOUT            CALL TO PERFORM INITIALISATION
                   18508: *      (XL)                  VRBLK PTR
                   18509: *      (XR)                  TRBLK PTR
                   18510: *      (WA,WC)               DESTROYED
                   18511: *
                   18512: *      NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
                   18513: *      POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
                   18514: *      CASE FOR ORDINARY VARIABLES.
                   18515: *
                   18516: INOUT  PRC  E,0              ENTRY POINT
                   18517:        MOV  WB,-(XS)         STACK TRBLK TYPE
                   18518:        MOV  SCLEN(XL),WA     GET NAME LENGTH
                   18519:        ZER  WB               POINT TO START OF NAME
                   18520:        JSR  SBSTR            BUILD A PROPER SCBLK
                   18521:        JSR  GTNVR            BUILD VRBLK
                   18522:        PPM                   NO ERROR RETURN
                   18523:        MOV  XR,WC            SAVE VRBLK POINTER
                   18524:        MOV  (XS)+,WB         GET TRTER FIELD
                   18525:        ZER  XL               ZERO TRFPT
                   18526:        JSR  TRBLD            BUILD TRBLK
                   18527:        MOV  WC,XL            RECALL VRBLK POINTER
                   18528:        MOV  VRSVP(XL),TRTER(XR) STORE SVBLK POINTER
                   18529:        MOV  XR,VRVAL(XL)     STORE TRBLK PTR IN VRBLK
                   18530:        MOV  =B$VRA,VRGET(XL) SET TRAPPED ACCESS
                   18531:        MOV  =B$VRV,VRSTO(XL) SET TRAPPED STORE
                   18532:        EXI                   RETURN TO CALLER
                   18533:        ENP                   END PROCEDURE INOUT
                   18534:        EJC
                   18535: .IF    .CNBF
                   18536: .ELSE
                   18537: *
                   18538: *      INSBF -- INSERT STRING IN BUFFER
                   18539: *
                   18540: *      THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
                   18541: *      CONTENTS OF A GIVEN STRING.  IF THE LENGTH OF THE
                   18542: *      SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF
                   18543: *      THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
                   18544: *      THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
                   18545: *      DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
                   18546: *
                   18547: *      (XR)                  POINTER TO BFBLK
                   18548: *      (XL)                  OBJECT WHICH IS STRING CONVERTABLE
                   18549: *      (WA)                  OFFSET OF START OF INSERT IN (XR)
                   18550: *      (WB)                  LENGTH OF SECTION IN (XR) REPLACED
                   18551: *      JSR  INSBF            CALL TO INSERT CHARACTERS IN BUFFER
                   18552: *      PPM  LOC              THREAD IF (XR) NOT CONVERTABLE
                   18553: *      PPM  LOC              THREAD IF INSERT NOT POSSIBLE
                   18554: *
                   18555: *      THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
                   18556: *      OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
                   18557: *      DEFINED END OF THE BUFFER AS GIVEN.
                   18558: *
                   18559: INSBF  PRC  E,2              ENTRY POINT
                   18560:        MOV  WA,INSSA         SAVE ENTRY WA
                   18561:        MOV  WB,INSSB         SAVE ENTRY WB
                   18562:        MOV  WC,INSSC         SAVE ENTRY WC
                   18563:        ADD  WB,WA            ADD TO GET OFFSET PAST REPLACE PART
                   18564:        MOV  WA,INSAB         SAVE WA+WB
                   18565:        MOV  BCLEN(XR),WC     GET CURRENT DEFINED LENGTH
                   18566:        BGT  INSSA,WC,INS07   FAIL IF START OFFSET TOO BIG
                   18567:        BGT  WA,WC,INS07      FAIL IF FINAL OFFSET TOO BIG
                   18568:        MOV  XL,-(XS)         SAVE ENTRY XL
                   18569:        MOV  XR,-(XS)         SAVE BCBLK PTR
                   18570:        MOV  XL,-(XS)         STACK AGAIN FOR GTSTG
                   18571:        JSR  GTSTG            CALL TO CONVERT TO STRING
                   18572:        PPM  INS05            TAKE STRING CONVERT ERR EXIT
                   18573:        MOV  XR,XL            SAVE STRING PTR
                   18574:        MOV  (XS),XR          RESTORE BCBLK PTR
                   18575:        ADD  WC,WA            ADD BUFFER LEN TO STRING LEN
                   18576:        SUB  INSSB,WA         BIAS OUT COMPONENT BEING REPLACED
                   18577:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   18578:        BGT  WA,BFALC(XR),INS06 FAIL IF RESULT EXCEEDS ALLOCATION
                   18579:        MOV  (XS),XR          RESTORE BCBLK PTR
                   18580:        MOV  WC,WA            GET BUFFER LENGTH
                   18581:        SUB  INSAB,WA         SUBTRACT TO GET SHIFT LENGTH
                   18582:        ADD  SCLEN(XL),WC     ADD LENGTH OF NEW
                   18583:        SUB  INSSB,WC         SUBTRACT OLD TO GET TOTAL NEW LEN
                   18584:        MOV  BCLEN(XR),WB     GET OLD BCLEN
                   18585:        MOV  WC,BCLEN(XR)     STUFF NEW LENGTH
                   18586:        BZE  WA,INS04         SKIP SHIFT IF NOTHING TO DO
                   18587:        BEQ  INSSB,SCLEN(XL),INS04 SKIP SHIFT IF LENGTHS MATCH
                   18588:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   18589:        MOV  XL,-(XS)         SAVE SCBLK PTR
                   18590:        BLO  INSSB,SCLEN(XL),INS01 BRN IF SHFT IS FOR MORE ROOM
                   18591:        EJC
                   18592: *
                   18593: *      INSBF (CONTINUED)
                   18594: *
                   18595: *      WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
                   18596: *      THE BUFFER.  (THE STRING LENGTH IS SMALLER THAN THE
                   18597: *      SEGMENT BEING REPLACED.)  REGISTERS ARE SET AS:
                   18598: *
                   18599: *      (WA)                  MOVE (SHIFT DOWN) LENGTH
                   18600: *      (WB)                  OLD BCLEN
                   18601: *      (WC)                  NEW BCLEN
                   18602: *      (XR)                  BFBLK PTR
                   18603: *      (XL),(XS)             SCBLK PTR
                   18604: *
                   18605:        MOV  INSSA,WB         GET OFFSET TO INSERT
                   18606:        ADD  SCLEN(XL),WB     ADD INSERT LENGTH TO GET DEST OFF
                   18607:        MOV  XR,XL            MAKE COPY
                   18608:        PLC  XL,INSAB         PREPARE SOURCE FOR MOVE
                   18609:        PSC  XR,WB            PREPARE DESTINATION REG FOR MOVE
                   18610:        MVC                   MOVE EM OUT
                   18611:        BRN  INS02            BRANCH TO PAD
                   18612: *
                   18613: *      WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
                   18614: *      THE BUFFER.  (THE STRING LENGTH IS LARGER THAN THE
                   18615: *      SEGMENT BEING REPLACED.)
                   18616: *
                   18617: INS01  MOV  XR,XL            COPY BFBLK PTR
                   18618:        PLC  XL,WB            SET SOURCE REG FOR MOVE BACKWARDS
                   18619:        PSC  XR,WC            SET DESTINATION PTR FOR MOVE
                   18620:        MCB                   MOVE BACKWARDS (POSSIBLE OVERLAP)
                   18621: *
                   18622: *      MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END
                   18623: *
                   18624: INS02  MOV  (XS)+,XL         RESTORE SCBLK PTR
                   18625:        MOV  WC,WA            COPY NEW BUFFER END
                   18626:        CTB  WA,0             ROUND OUT
                   18627:        SUB  WC,WA            SUBTRACT TO GET REMAINDER
                   18628:        BZE  WA,INS04         NO PAD IF ALREADY EVEN BOUNDARY
                   18629:        MOV  (XS),XR          GET BCBLK PTR
                   18630:        MOV  BCBUF(XR),XR     GET BFBLK PTR
                   18631:        PSC  XR,WC            PREPARE TO PAD
                   18632:        ZER  WB               CLEAR WB
                   18633:        LCT  WA,WA            LOAD LOOP COUNT
                   18634: *
                   18635: *      LOOP HERE TO STUFF PAD CHARACTERS
                   18636: *
                   18637: INS03  SCH  WB,(XR)+         STUFF ZERO PAD
                   18638:        BCT  WA,INS03         BRANCH FOR MORE
                   18639:        EJC
                   18640: *
                   18641: *      INSBF (CONTINUED)
                   18642: *
                   18643: *      MERGE HERE WHEN PADDING OK.  NOW COPY IN THE INSERT
                   18644: *      STRING TO THE HOLE.
                   18645: *
                   18646: INS04  MOV  (XS),XR          GET BCBLK PTR
                   18647:        MOV  BCBUF(XR),XR     GET BFBLK PTR
                   18648:        MOV  SCLEN(XL),WA     GET MOVE LENGTH
                   18649:        PLC  XL               PREPARE TO COPY FROM FIRST CHAR
                   18650:        PSC  XR,INSSA         PREPARE TO STORE IN HOLE
                   18651:        MVC                   COPY THE CHARACTERS
                   18652:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   18653:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   18654:        MOV  INSSA,WA         RESTORE ENTRY WA
                   18655:        MOV  INSSB,WB         RESTORE ENTRY WB
                   18656:        MOV  INSSC,WC         RESTORE ENTRY WC
                   18657:        EXI                   RETURN TO CALLER
                   18658: *
                   18659: *      HERE TO TAKE STRING CONVERT ERROR EXIT
                   18660: *
                   18661: INS05  MOV  (XS)+,XR         RESTORE ENTRY XR
                   18662:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   18663:        MOV  INSSA,WA         RESTORE ENTRY WA
                   18664:        MOV  INSSB,WB         RESTORE ENTRY WB
                   18665:        MOV  INSSC,WC         RESTORE ENTRY WC
                   18666:        EXI  1                ALTERNATE EXIT
                   18667: *
                   18668: *      HERE FOR INVALID OFFSET OR LENGTH
                   18669: *
                   18670: INS06  MOV  (XS)+,XR         RESTORE ENTRY XR
                   18671:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   18672: *
                   18673: *      MERGE FOR LENGTH FAILURE EXIT WITH STACK SET
                   18674: *
                   18675: INS07  MOV  INSSA,WA         RESTORE ENTRY WA
                   18676:        MOV  INSSB,WB         RESTORE ENTRY WB
                   18677:        MOV  INSSC,WC         RESTORE ENTRY WC
                   18678:        EXI  2                ALTERNATE EXIT
                   18679:        ENP                   END PROCEDURE INSBF
                   18680:        EJC
                   18681: .FI
                   18682: *
                   18683: *      IOFCB -- GET INPUT/OUTPUT FCBLK POINTER
                   18684: *
                   18685: *      USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK
                   18686: *      (IF ANY) CORRESPONDING TO THEIR ARGUMENT.
                   18687: *
                   18688: *      -(XS)                 ARGUMENT
                   18689: *      JSR  IOFCB            CALL TO FIND FCBLK
                   18690: *      PPM  LOC              ARG IS AN UNSUITABLE NAME
                   18691: *      PPM  LOC              ARG IS NULL STRING
                   18692: *      (XS)                  POPPED
                   18693: *      (XL)                  PTR TO FILEARG1 VRBLK
                   18694: *      (XR)                  ARGUMENT
                   18695: *      (WA)                  FCBLK PTR OR 0
                   18696: *      (WB)                  DESTROYED
                   18697: *
                   18698: IOFCB  PRC  N,2              ENTRY POINT
                   18699:        JSR  GTSTG            GET ARG AS STRING
                   18700:        PPM  IOFC2            FAIL
                   18701:        MOV  XR,XL            COPY STRING PTR
                   18702:        JSR  GTNVR            GET AS NATURAL VARIABLE
                   18703:        PPM  IOFC3            FAIL IF NULL
                   18704:        MOV  XL,WB            COPY STRING POINTER AGAIN
                   18705:        MOV  XR,XL            COPY VRBLK PTR FOR RETURN
                   18706:        ZER  WA               IN CASE NO TRBLK FOUND
                   18707: *
                   18708: *      LOOP TO FIND FILE ARG1 TRBLK
                   18709: *
                   18710: IOFC1  MOV  VRVAL(XR),XR     GET POSSIBLE TRBLK PTR
                   18711:        BNE  (XR),=B$TRT,IOFC2 FAIL IF END OF CHAIN
                   18712:        BNE  TRTYP(XR),=TRTFC,IOFC1 LOOP IF NOT FILE ARG TRBLK
                   18713:        MOV  TRFPT(XR),WA     GET FCBLK PTR
                   18714:        MOV  WB,XR            COPY ARG
                   18715:        EXI                   RETURN
                   18716: *
                   18717: *      FAIL RETURN
                   18718: *
                   18719: IOFC2  EXI  1                FAIL
                   18720: *
                   18721: *      NULL ARG
                   18722: *
                   18723: IOFC3  EXI  2                NULL ARG RETURN
                   18724:        ENP                   END PROCEDURE IOFCB
                   18725:        EJC
                   18726: *
                   18727: *      IOPPF -- PROCESS FILEARG2 FOR IOPUT
                   18728: *
                   18729: *      (R$XSC)               FILEARG2 PTR
                   18730: *      JSR  IOPPF            CALL TO PROCESS FILEARG2
                   18731: *      (XL)                  FILEARG1 PTR
                   18732: *      (XR)                  FILE ARG2 PTR
                   18733: *      -(XS)..-(XS)          FIELDS EXTRACTED FROM FILEARG2
                   18734: *      (WC)                  NO. OF FIELDS EXTRACTED
                   18735: *      (WB)                  INPUT/OUTPUT FLAG
                   18736: *      (WA)                  FCBLK PTR OR 0
                   18737: *
                   18738: IOPPF  PRC  N,0              ENTRY POINT
                   18739:        ZER  WB               TO COUNT FIELDS EXTRACTED
                   18740: *
                   18741: *      LOOP TO EXTRACT FIELDS
                   18742: *
                   18743: IOPP1  MOV  =IODEL,XL        GET DELIMITER
                   18744:        MOV  XL,WC            COPY IT
                   18745:        JSR  XSCAN            GET NEXT FIELD
                   18746:        MOV  XR,-(XS)         STACK IT
                   18747:        ICV  WB               INCREMENT COUNT
                   18748:        BNZ  WA,IOPP1         LOOP
                   18749:        MOV  WB,WC            COUNT OF FIELDS
                   18750:        MOV  IOPTT,WB         I/O MARKER
                   18751:        MOV  R$IOF,WA         FCBLK PTR OR 0
                   18752:        MOV  R$IO2,XR         FILE ARG2 PTR
                   18753:        MOV  R$IO1,XL         FILEARG1
                   18754:        EXI                   RETURN
                   18755:        ENP                   END PROCEDURE IOPPF
                   18756:        EJC
                   18757: *
                   18758: *      IOPUT -- ROUTINE USED BY INPUT AND OUTPUT
                   18759: *
                   18760: *      IOPUT SETS UP INPUT/OUTPUT  ASSOCIATIONS. IT BUILDS
                   18761: *      SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND
                   18762: *      CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE
                   18763: *      ARGUMENTS AND TO OPEN THE FILES.
                   18764: *
                   18765: *         +-----------+   +---------------+       +-----------+
                   18766: *      +-.I           I   I               I------.I   =B$XRT  I
                   18767: *      I  +-----------+   +---------------+       +-----------+
                   18768: *      I  /           /        (R$FCB)            I    *4     I
                   18769: *      I  /           /                           +-----------+
                   18770: *      I  +-----------+   +---------------+       I           I-
                   18771: *      I  I   NAME    +--.I    =B$TRT     I       +-----------+
                   18772: *      I  /           /   +---------------+       I           I
                   18773: *      I   (FIRST ARG)    I =TRTIN/=TRTOU I       +-----------+
                   18774: *      I                  +---------------+             I
                   18775: *      I                  I     VALUE     I             I
                   18776: *      I                  +---------------+             I
                   18777: *      I                  I(TRTRF) 0   OR I--+          I
                   18778: *      I                  +---------------+  I          I
                   18779: *      I                  I(TRFPT) 0   OR I----+        I
                   18780: *      I                  +---------------+  I I        I
                   18781: *      I                     (I/O TRBLK)     I I        I
                   18782: *      I  +-----------+                      I I        I
                   18783: *      I  I           I                      I I        I
                   18784: *      I  +-----------+                      I I        I
                   18785: *      I  I           I                      I I        I
                   18786: *      I  +-----------+   +---------------+  I I        I
                   18787: *      I  I           +--.I    =B$TRT     I.-+ I        I
                   18788: *      I  +-----------+   +---------------+    I        I
                   18789: *      I  /           /   I    =TRTFC     I    I        I
                   18790: *      I  /           /   +---------------+    I        I
                   18791: *      I    (FILEARG1     I     VALUE     I    I        I
                   18792: *      I         VRBLK)   +---------------+    I        I
                   18793: *      I                  I(TRTRF) 0   OR I--+ I        .
                   18794: *      I                  +---------------+  I .  +-----------+
                   18795: *      I                  I(TRFPT) 0   OR I------./   FCBLK   /
                   18796: *      I                  +---------------+  I    +-----------+
                   18797: *      I                       (TRTRF)       I
                   18798: *      I                                     I
                   18799: *      I                                     I
                   18800: *      I                  +---------------+  I
                   18801: *      I                  I    =B$XRT     I.-+
                   18802: *      I                  +---------------+
                   18803: *      I                  I      *5       I
                   18804: *      I                  +---------------+
                   18805: *      +------------------I               I
                   18806: *                         +---------------+       +-----------+
                   18807: *                         I(TRTRF) O   OR I------.I  =B$XRT   I
                   18808: *                         +---------------+       +-----------+
                   18809: *                         I  NAME OFFSET  I       I    ETC    I
                   18810: *                         +---------------+
                   18811: *                           (IOCHN - CHAIN OF NAME POINTERS)
                   18812:        EJC
                   18813: *
                   18814: *      IOPUT (CONTINUED)
                   18815: *
                   18816: *      NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT
                   18817: *      FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND
                   18818: *      ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF
                   18819: *      THE STRUCTURE BUILT.
                   18820: *
                   18821: *      -(XS)                 1ST ARG (VBL TO BE ASSOCIATED)
                   18822: *      -(XS)                 2ND ARG (FILE ARG1)
                   18823: *      -(XS)                 3RD ARG (FILE ARG2)
                   18824: *      (WB)                  0 FOR INPUT, 3 FOR OUTPUT ASSOC.
                   18825: *      JSR  IOPUT            CALL FOR INPUT/OUTPUT ASSOCIATION
                   18826: *      PPM  LOC              3RD ARG NOT A STRING
                   18827: *      PPM  LOC              2ND ARG NOT A SUITABLE NAME
                   18828: *      PPM  LOC              1ST ARG NOT A SUITABLE NAME
                   18829: *      PPM  LOC              INAPPROPRIATE FILE SPEC FOR I/O
                   18830: *      PPM  LOC              I/O FILE DOES NOT EXIST
                   18831: *      PPM  LOC              I/O FILE CANNOT BE READ/WRITTEN
                   18832: *      (XS)                  POPPED
                   18833: *      (XL,XR,WA,WB,WC)      DESTROYED
                   18834: *
                   18835: IOPUT  PRC  N,6              ENTRY POINT
                   18836:        ZER  R$IOT            IN CASE NO TRTRF BLOCK USED
                   18837:        ZER  R$IOF            IN CASE NO FCBLK ALOCATED
                   18838:        MOV  WB,IOPTT         STORE I/O TRACE TYPE
                   18839:        JSR  XSCNI            PREPARE TO SCAN FILEARG2
                   18840:        PPM  IOP13            FAIL
                   18841:        PPM  IOPA0            NULL FILE ARG2
                   18842: *
                   18843: IOPA0  MOV  XR,R$IO2         KEEP FILE ARG2
                   18844:        MOV  WA,XL            COPY LENGTH
                   18845:        JSR  GTSTG            CONVERT FILEARG1 TO STRING
                   18846:        PPM  IOP14            FAIL
                   18847:        MOV  XR,R$IO1         KEEP FILEARG1 PTR
                   18848:        JSR  GTNVR            CONVERT TO NATURAL VARIABLE
                   18849:        PPM  IOP00            JUMP IF NULL
                   18850:        BRN  IOP04            JUMP TO PROCESS NON-NULL ARGS
                   18851: *
                   18852: *      NULL FILEARG1
                   18853: *
                   18854: IOP00  BZE  XL,IOP01         SKIP IF BOTH ARGS NULL
                   18855:        JSR  IOPPF            PROCESS FILEARG2
                   18856:        JSR  SYSFC            CALL FOR FILEARG2 CHECK
                   18857:        PPM  IOP16            FAIL
                   18858:        BRN  IOP11            COMPLETE FILE ASSOCIATION
                   18859:        EJC
                   18860: *
                   18861: *      IOPUT (CONTINUED)
                   18862: *
                   18863: *      HERE WITH 0 OR FCBLK PTR IN (XL)
                   18864: *
                   18865: IOP01  MOV  IOPTT,WB         GET TRACE TYPE
                   18866:        MOV  R$IOT,XR         GET 0 OR TRTRF PTR
                   18867:        JSR  TRBLD            BUILD TRBLK
                   18868:        MOV  XR,WC            COPY TRBLK POINTER
                   18869:        MOV  (XS)+,XR         GET VARIABLE FROM STACK
                   18870:        JSR  GTVAR            POINT TO VARIABLE
                   18871:        PPM  IOP15            FAIL
                   18872:        MOV  XL,R$ION         SAVE NAME POINTER
                   18873:        MOV  XL,XR            COPY NAME POINTER
                   18874:        ADD  WA,XR            POINT TO VARIABLE
                   18875:        SUB  *VRVAL,XR        SUBTRACT OFFSET,MERGE INTO LOOP
                   18876: *
                   18877: *      LOOP TO END OF TRBLK CHAIN IF ANY
                   18878: *
                   18879: IOP02  MOV  XR,XL            COPY BLK PTR
                   18880:        MOV  VRVAL(XR),XR     LOAD PTR TO NEXT TRBLK
                   18881:        BNE  (XR),=B$TRT,IOP03    JUMP IF NOT TRAPPED
                   18882:        BNE  TRTYP(XR),IOPTT,IOP02 LOOP IF NOT SAME ASSOCN
                   18883:        MOV  TRNXT(XR),XR     GET VALUE AND DELETE OLD TRBLK
                   18884: *
                   18885: *      IOPUT (CONTINUED)
                   18886: *
                   18887: *      STORE NEW ASSOCIATION
                   18888: *
                   18889: IOP03  MOV  WC,VRVAL(XL)     LINK TO THIS TRBLK
                   18890:        MOV  WC,XL            COPY POINTER
                   18891:        MOV  XR,TRNXT(XL)     STORE VALUE IN TRBLK
                   18892:        MOV  R$ION,XR         RESTORE POSSIBLE VRBLK POINTER
                   18893:        MOV  WA,WB            KEEP OFFSET TO NAME
                   18894:        JSR  SETVR            IF VRBLK, SET VRGET,VRSTO
                   18895:        MOV  R$IOT,XR         GET 0 OR TRTRF PTR
                   18896:        BNZ  XR,IOP19         JUMP IF TRTRF BLOCK EXISTS
                   18897:        EXI                   RETURN TO CALLER
                   18898: *
                   18899: *      NON STANDARD FILE
                   18900: *      SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED.
                   18901: *
                   18902: IOP04  ZER  WA               IN CASE NO FCBLK FOUND
                   18903:        EJC
                   18904: *
                   18905: *      IOPUT (CONTINUED)
                   18906: *
                   18907: *      SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK
                   18908: *
                   18909: IOP05  MOV  XR,WB            REMEMBER BLK PTR
                   18910:        MOV  VRVAL(XR),XR     CHAIN ALONG
                   18911:        BNE  (XR),=B$TRT,IOP06 JUMP IF END OF TRBLK CHAIN
                   18912:        BNE  TRTYP(XR),=TRTFC,IOP05 LOOP IF MORE TO GO
                   18913:        MOV  XR,R$IOT         POINT TO FILE ARG1 TRBLK
                   18914:        MOV  TRFPT(XR),WA     GET FCBLK PTR FROM TRBLK
                   18915: *
                   18916: *      WA = 0 OR FCBLK PTR
                   18917: *      WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK
                   18918: *           FOR FILE ARG1 MUST BE CHAINED.
                   18919: *
                   18920: IOP06  MOV  WA,R$IOF         KEEP POSSIBLE FCBLK PTR
                   18921:        MOV  WB,R$IOP         KEEP PRECEDING BLK PTR
                   18922:        JSR  IOPPF            PROCESS FILEARG2
                   18923:        JSR  SYSFC            SEE IF FCBLK REQUIRED
                   18924:        PPM  IOP16            FAIL
                   18925:        BZE  WA,IOP12         SKIP IF NO NEW FCBLK WANTED
                   18926:        BLT  WC,=NUM02,IOP6A  JUMP IF FCBLK IN DYNAMIC
                   18927:        JSR  ALOST            GET IT IN STATIC
                   18928:        BRN  IOP6B            SKIP
                   18929: *
                   18930: *      OBTAIN FCBLK IN DYNAMIC
                   18931: *
                   18932: IOP6A  JSR  ALLOC            GET SPACE FOR FCBLK
                   18933: *
                   18934: *      MERGE
                   18935: *
                   18936: IOP6B  MOV  XR,XL            POINT TO FCBLK
                   18937:        MOV  WA,WB            COPY ITS LENGTH
                   18938:        BTW  WB               GET COUNT AS WORDS (SGD APR80)
                   18939:        LCT  WB,WB            LOOP COUNTER
                   18940: *
                   18941: *      CLEAR FCBLK
                   18942: *
                   18943: IOP07  ZER  (XR)+            CLEAR A WORD
                   18944:        BCT  WB,IOP07         LOOP
                   18945:        BEQ  WC,=NUM02,IOP09  SKIP IF IN STATIC - DONT SET FIELDS
                   18946:        MOV  =B$XNT,(XL)      STORE XNBLK CODE IN CASE
                   18947:        MOV  WA,1(XL)         STORE LENGTH
                   18948:        BNZ  WC,IOP09         JUMP IF XNBLK WANTED
                   18949:        MOV  =B$XRT,(XL)      XRBLK CODE REQUESTED
                   18950: *
                   18951:        EJC
                   18952: *      IOPUT (CONTINUED)
                   18953: *
                   18954: *      COMPLETE FCBLK INITIALISATION
                   18955: *
                   18956: IOP09  MOV  R$IOT,XR         GET POSSIBLE TRBLK PTR
                   18957:        MOV  XL,R$IOF         STORE FCBLK PTR
                   18958:        BNZ  XR,IOP10         JUMP IF TRBLK ALREADY FOUND
                   18959: *
                   18960: *      A NEW TRBLK IS NEEDED
                   18961: *
                   18962:        MOV  =TRTFC,WB        TRTYP FOR FCBLK TRAP BLK
                   18963:        JSR  TRBLD            MAKE THE BLOCK
                   18964:        MOV  XR,R$IOT         COPY TRTRF PTR
                   18965:        MOV  R$IOP,XL         POINT TO PRECEDING BLK
                   18966:        MOV  VRVAL(XL),VRVAL(XR) COPY VALUE FIELD TO TRBLK
                   18967:        MOV  XR,VRVAL(XL)     LINK NEW TRBLK INTO CHAIN
                   18968:        MOV  XL,XR            POINT TO PREDECESSOR BLK
                   18969:        JSR  SETVR            SET TRACE INTERCEPTS
                   18970:        MOV  VRVAL(XR),XR     RECOVER TRBLK PTR
                   18971: *
                   18972: *      XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0
                   18973: *
                   18974: IOP10  MOV  R$IOF,TRFPT(XR)  STORE FCBLK PTR
                   18975: *
                   18976: *      CALL SYSIO TO COMPLETE FILE ACCESSING
                   18977: *
                   18978: IOP11  MOV  R$IOF,WA         COPY FCBLK PTR OR 0
                   18979:        MOV  IOPTT,WB         GET INPUT/OUTPUT FLAG
                   18980:        MOV  R$IO2,XR         GET FILE ARG2
                   18981:        MOV  R$IO1,XL         GET FILE ARG1
                   18982:        JSR  SYSIO            ASSOCIATE TO THE FILE
                   18983:        PPM  IOP17            FAIL
                   18984:        PPM  IOP18            FAIL
                   18985:        BNZ  R$IOT,IOP01      NOT STD INPUT IF NON-NULL TRTRF BLK
                   18986:        BNZ  IOPTT,IOP01      JUMP IF OUTPUT
                   18987:        BZE  WC,IOP01         NO CHANGE TO STANDARD READ LENGTH
                   18988:        MOV  WC,CSWIN         STORE NEW READ LENGTH FOR STD FILE
                   18989:        BRN  IOP01            MERGE TO FINISH THE TASK
                   18990: *
                   18991: *      SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK
                   18992: *
                   18993: IOP12  BNZ  XL,IOP09         JUMP IF PRIVATE FCBLK
                   18994:        BRN  IOP11            FINISH THE ASSOCIATION
                   18995: *
                   18996: *      FAILURE RETURNS
                   18997: *
                   18998: IOP13  EXI  1                3RD ARG NOT A STRING
                   18999: IOP14  EXI  2                2ND ARG UNSUITABLE
                   19000: IOP15  EXI  3                1ST ARG UNSUITABLE
                   19001: IOP16  EXI  4                FILE SPEC WRONG
                   19002: IOP17  EXI  5                I/O FILE DOES NOT EXIST
                   19003: IOP18  EXI  6                I/O FILE CANNOT BE READ/WRITTEN
                   19004:        EJC
                   19005: *
                   19006: *      IOPUT (CONTINUED)
                   19007: *
                   19008: *      ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD
                   19009: *      PRESENT.
                   19010: *
                   19011: IOP19  MOV  R$ION,WC         WC = NAME BASE, WB = NAME OFFSET
                   19012: *
                   19013: *      SEARCH LOOP
                   19014: *
                   19015: IOP20  MOV  TRTRF(XR),XR     NEXT LINK OF CHAIN
                   19016:        BZE  XR,IOP21         NOT FOUND
                   19017:        BNE  WC,IONMB(XR),IOP20 NO MATCH
                   19018:        BEQ  WB,IONMO(XR),IOP22 EXIT IF MATCHED
                   19019:        BRN  IOP20            LOOP
                   19020: *
                   19021: *      NOT FOUND
                   19022: *
                   19023: IOP21  MOV  *NUM05,WA        SPACE NEEDED
                   19024:        JSR  ALLOC            GET IT
                   19025:        MOV  =B$XRT,(XR)      STORE XRBLK CODE
                   19026:        MOV  WA,1(XR)         STORE LENGTH
                   19027:        MOV  WC,IONMB(XR)     STORE NAME BASE
                   19028:        MOV  WB,IONMO(XR)     STORE NAME OFFSET
                   19029:        MOV  R$IOT,XL         POINT TO TRTRF BLK
                   19030:        MOV  TRTRF(XL),WA     GET PTR FIELD CONTENTS
                   19031:        MOV  XR,TRTRF(XL)     STORE PTR TO NEW BLOCK
                   19032:        MOV  WA,TRTRF(XR)     COMPLETE THE LINKING
                   19033: *
                   19034: *      INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI
                   19035: *
                   19036: IOP22  BZE  R$IOF,IOP25      SKIP IF NO FCBLK
                   19037:        MOV  R$FCB,XL         PTR TO HEAD OF EXISTING CHAIN
                   19038: *
                   19039: *      SEE IF FCBLK ALREADY ON CHAIN
                   19040: *
                   19041: IOP23  BZE  XL,IOP24         NOT ON IF END OF CHAIN
                   19042:        BEQ  3(XL),R$IOF,IOP25 DONT DUPLICATE IF FIND IT
                   19043:        MOV  2(XL),XL         GET NEXT LINK
                   19044:        BRN  IOP23            LOOP
                   19045: *
                   19046: *      NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK
                   19047: *
                   19048: IOP24  MOV  *NUM04,WA        SPACE NEEDED
                   19049:        JSR  ALLOC            GET IT
                   19050:        MOV  =B$XRT,(XR)      STORE BLOCK CODE
                   19051:        MOV  WA,1(XR)         STORE LENGTH
                   19052:        MOV  R$FCB,2(XR)      STORE PREVIOUS LINK IN THIS NODE
                   19053:        MOV  R$IOF,3(XR)      STORE FCBLK PTR
                   19054:        MOV  XR,R$FCB         INSERT NODE INTO FCBLK CHAIN
                   19055: *
                   19056: *      RETURN
                   19057: *
                   19058: IOP25  EXI                   RETURN TO CALLER
                   19059:        ENP                   END PROCEDURE IOPUT
                   19060:        EJC
                   19061: *
                   19062: *      KTREX -- EXECUTE KEYWORD TRACE
                   19063: *
                   19064: *      KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
                   19065: *      INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
                   19066: *
                   19067: *      (XL)                  PTR TO TRBLK (OR 0 IF UNTRACED)
                   19068: *      JSR  KTREX            CALL TO EXECUTE KEYWORD TRACE
                   19069: *      (XL,WA,WB,WC)         DESTROYED
                   19070: *      (RA)                  DESTROYED
                   19071: *
                   19072: KTREX  PRC  R,0              ENTRY POINT (RECURSIVE)
                   19073:        BZE  XL,KTRX3         IMMEDIATE EXIT IF KEYWORD UNTRACED
                   19074:        BZE  KVTRA,KTRX3      IMMEDIATE EXIT IF TRACE = 0
                   19075:        DCV  KVTRA            ELSE DECREMENT TRACE
                   19076:        MOV  XR,-(XS)         SAVE XR
                   19077:        MOV  XL,XR            COPY TRBLK POINTER
                   19078:        MOV  TRKVR(XR),XL     LOAD VRBLK POINTER (NMBAS)
                   19079:        MOV  *VRVAL,WA        SET NAME OFFSET
                   19080:        BZE  TRFNC(XR),KTRX1  JUMP IF PRINT TRACE
                   19081:        JSR  TRXEQ            ELSE EXECUTE FULL TRACE
                   19082:        BRN  KTRX2            AND JUMP TO EXIT
                   19083: *
                   19084: *      HERE FOR PRINT TRACE
                   19085: *
                   19086: KTRX1  MOV  XL,-(XS)         STACK VRBLK PTR FOR KWNAM
                   19087:        MOV  WA,-(XS)         STACK OFFSET FOR KWNAM
                   19088:        JSR  PRTSN            PRINT STATEMENT NUMBER
                   19089:        MOV  =CH$AM,WA        LOAD AMPERSAND
                   19090:        JSR  PRTCH            PRINT AMPERSAND
                   19091:        JSR  PRTNM            PRINT KEYWORD NAME
                   19092:        MOV  =TMBEB,XR        POINT TO BLANK-EQUAL-BLANK
                   19093:        JSR  PRTST            PRINT BLANK-EQUAL-BLANK
                   19094:        JSR  KWNAM            GET KEYWORD PSEUDO-VARIABLE NAME
                   19095:        MOV  XR,DNAMP         RESET PTR TO DELETE KVBLK
                   19096:        JSR  ACESS            GET KEYWORD VALUE
                   19097:        PPM                   FAILURE IS IMPOSSIBLE
                   19098:        JSR  PRTVL            PRINT KEYWORD VALUE
                   19099:        JSR  PRTNL            TERMINATE PRINT LINE
                   19100: *
                   19101: *      HERE TO EXIT AFTER COMPLETING TRACE
                   19102: *
                   19103: KTRX2  MOV  (XS)+,XR         RESTORE ENTRY XR
                   19104: *
                   19105: *      MERGE HERE TO EXIT IF NO TRACE REQUIRED
                   19106: *
                   19107: KTRX3  EXI                   RETURN TO KTREX CALLER
                   19108:        ENP                   END PROCEDURE KTREX
                   19109:        EJC
                   19110: *
                   19111: *      KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
                   19112: *
                   19113: *      1(XS)                 NAME BASE FOR VRBLK
                   19114: *      0(XS)                 OFFSET (SHOULD BE *VRVAL)
                   19115: *      JSR  KWNAM            CALL TO GET PSEUDO-VARIABLE NAME
                   19116: *      (XS)                  POPPED TWICE
                   19117: *      (XL,WA)               RESULTING PSEUDO-VARIABLE NAME
                   19118: *      (XR,WA,WB)            DESTROYED
                   19119: *
                   19120: KWNAM  PRC  N,0              ENTRY POINT
                   19121:        ICA  XS               IGNORE NAME OFFSET
                   19122:        MOV  (XS)+,XR         LOAD NAME BASE
                   19123:        BGE  XR,STATE,KWNM1   JUMP IF NOT NATURAL VARIABLE NAME
                   19124:        BNZ  VRLEN(XR),KWNM1  ERROR IF NOT SYSTEM VARIABLE
                   19125:        MOV  VRSVP(XR),XR     ELSE POINT TO SVBLK
                   19126:        MOV  SVBIT(XR),WA     LOAD BIT MASK
                   19127:        ANB  BTKNM,WA         AND WITH KEYWORD BIT
                   19128:        ZRB  WA,KWNM1         ERROR IF NO KEYWORD ASSOCIATION
                   19129:        MOV  SVLEN(XR),WA     ELSE LOAD NAME LENGTH IN CHARACTERS
                   19130:        CTB  WA,SVCHS         COMPUTE OFFSET TO FIELD WE WANT
                   19131:        ADD  WA,XR            POINT TO SVKNM FIELD
                   19132:        MOV  (XR),WB          LOAD SVKNM VALUE
                   19133:        MOV  *KVSI$,WA        SET SIZE OF KVBLK
                   19134:        JSR  ALLOC            ALLOCATE KVBLK
                   19135:        MOV  =B$KVT,(XR)      STORE TYPE WORD
                   19136:        MOV  WB,KVNUM(XR)     STORE KEYWORD NUMBER
                   19137:        MOV  =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER
                   19138:        MOV  XR,XL            COPY KVBLK POINTER
                   19139:        MOV  *KVVAR,WA        SET PROPER OFFSET
                   19140:        EXI                   RETURN TO KVNAM CALLER
                   19141: *
                   19142: *      HERE IF NOT KEYWORD NAME
                   19143: *
                   19144: KWNM1  ERB  251,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD
                   19145:        ENP                   END PROCEDURE KWNAM
                   19146:        EJC
                   19147: *
                   19148: *      LCOMP-- COMPARE TWO STRINGS LEXICALLY
                   19149: *
                   19150: *      1(XS)                 FIRST ARGUMENT
                   19151: *      0(XS)                 SECOND ARGUMENT
                   19152: *      JSR  LCOMP            CALL TO COMPARE ARUMENTS
                   19153: *      PPM  LOC              TRANSFER LOC FOR ARG1 NOT STRING
                   19154: *      PPM  LOC              TRANSFER LOC FOR ARG2 NOT STRING
                   19155: *      PPM  LOC              TRANSFER LOC IF ARG1 LLT ARG2
                   19156: *      PPM  LOC              TRANSFER LOC IF ARG1 LEQ ARG2
                   19157: *      PPM  LOC              TRANSFER LOC IF ARG1 LGT ARG2
                   19158: *      (THE NORMAL RETURN IS NEVER TAKEN)
                   19159: *      (XS)                  POPPED TWICE
                   19160: *      (XR,XL)               DESTROYED
                   19161: *      (WA,WB,WC,RA)         DESTROYED
                   19162: *
                   19163: LCOMP  PRC  N,5              ENTRY POINT
                   19164:        JSR  GTSTG            CONVERT SECOND ARG TO STRING
                   19165:        PPM  LCMP6            JUMP IF SECOND ARG NOT STRING
                   19166:        MOV  XR,XL            ELSE SAVE POINTER
                   19167:        MOV  WA,WB            AND LENGTH
                   19168:        JSR  GTSTG            CONVERT FIRST ARGUMENT TO STRING
                   19169:        PPM  LCMP5            JUMP IF NOT STRING
                   19170:        MOV  WA,WC            SAVE ARG 1 LENGTH
                   19171:        PLC  XR               POINT TO CHARS OF ARG 1
                   19172:        PLC  XL               POINT TO CHARS OF ARG 2
                   19173:        BLO  WA,WB,LCMP1      JUMP IF ARG 1 LENGTH IS SMALLER
                   19174:        MOV  WB,WA            ELSE SET ARG 2 LENGTH AS SMALLER
                   19175: *
                   19176: *      HERE WITH SMALLER LENGTH IN (WA)
                   19177: *
                   19178: LCMP1  CMC  LCMP4,LCMP3      COMPARE STRINGS, JUMP IF UNEQUAL
                   19179:        BNE  WB,WC,LCMP2      IF EQUAL, JUMP IF LENGTHS UNEQUAL
                   19180:        EXI  4                ELSE IDENTICAL STRINGS, LEQ EXIT
                   19181:        EJC
                   19182: *
                   19183: *      LCOMP (CONTINUED)
                   19184: *
                   19185: *      HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
                   19186: *
                   19187: LCMP2  BHI  WC,WB,LCMP4      JUMP IF ARG 1 LENGTH GT ARG 2 LENG
                   19188: *
                   19189: *      HERE IF FIRST ARG LLT SECOND ARG
                   19190: *
                   19191: LCMP3  EXI  3                TAKE LLT EXIT
                   19192: *
                   19193: *      HERE IF FIRST ARG LGT SECOND ARG
                   19194: *
                   19195: LCMP4  EXI  5                TAKE LGT EXIT
                   19196: *
                   19197: *      HERE IF FIRST ARG IS NOT A STRING
                   19198: *
                   19199: LCMP5  EXI  1                TAKE BAD FIRST ARG EXIT
                   19200: *
                   19201: *      HERE FOR SECOND ARG NOT A STRING
                   19202: *
                   19203: LCMP6  EXI  2                TAKE BAD SECOND ARG ERROR EXIT
                   19204:        ENP                   END PROCEDURE LCOMP
                   19205:        EJC
                   19206: *
                   19207: *      LISTR -- LIST SOURCE LINE
                   19208: *
                   19209: *      LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
                   19210: *      COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
                   19211: *
                   19212: *      JSR  LISTR            CALL TO LIST LINE
                   19213: *      (XR,XL,WA,WB,WC)      DESTROYED
                   19214: *
                   19215: *      GLOBAL LOCATIONS USED BY LISTR
                   19216: *
                   19217: *      ERLST                 IF LISTING ON ACCOUNT OF AN ERROR
                   19218: *
                   19219: *      LSTLC                 COUNT LINES ON CURRENT PAGE
                   19220: *
                   19221: *      LSTNP                 MAX NUMBER OF LINES/PAGE
                   19222: *
                   19223: *      LSTPF                 SET NON-ZERO IF THE CURRENT SOURCE
                   19224: *                            LINE HAS BEEN LISTED, ELSE ZERO.
                   19225: *
                   19226: *      LSTPG                 COMPILER LISTING PAGE NUMBER
                   19227: *
                   19228: *      LSTSN                 SET IF STMNT NUM TO BE LISTED
                   19229: *
                   19230: *      R$CIM                 POINTER TO CURRENT INPUT LINE.
                   19231: *
                   19232: *      R$TTL                 TITLE FOR SOURCE LISTING
                   19233: *
                   19234: *      R$STL                 PTR TO SUB-TITLE STRING
                   19235: *
                   19236: *      ENTRY POINT
                   19237: *
                   19238: LISTR  PRC  E,0              ENTRY POINT
                   19239:        BNZ  CNTTL,LIST5      JUMP IF -TITLE OR -STITL
                   19240:        BNZ  LSTPF,LIST4      IMMEDIATE EXIT IF ALREADY LISTED
                   19241:        BGE  LSTLC,LSTNP,LIST6 JUMP IF NO ROOM
                   19242: *
                   19243: *      HERE AFTER PRINTING TITLE (IF NEEDED)
                   19244: *
                   19245: LIST0  MOV  R$CIM,XR         LOAD POINTER TO CURRENT IMAGE
                   19246:        PLC  XR               POINT TO CHARACTERS
                   19247:        LCH  WA,(XR)          LOAD FIRST CHARACTER
                   19248:        MOV  LSTSN,XR         LOAD STATEMENT NUMBER
                   19249:        BZE  XR,LIST2         JUMP IF NO STATEMENT NUMBER
                   19250:        MTI  XR               ELSE GET STMNT NUMBER AS INTEGER
                   19251:        BNE  STAGE,=STGIC,LIST1 SKIP IF EXECUTE TIME
                   19252:        BEQ  WA,=CH$AS,LIST2  NO STMNT NUMBER LIST IF COMMENT
                   19253:        BEQ  WA,=CH$MN,LIST2  NO STMNT NO. IF CONTROL CARD
                   19254: *
                   19255: *      PRINT STATEMENT NUMBER
                   19256: *
                   19257: LIST1  JSR  PRTIN            ELSE PRINT STATEMENT NUMBER
                   19258:        ZER  LSTSN            AND CLEAR FOR NEXT TIME IN
                   19259:        EJC
                   19260: *
                   19261: *      LISTR (CONTINUED)
                   19262: *
                   19263: *      MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
                   19264: *
                   19265: LIST2  MOV  =STNPD,PROFS     POINT PAST STATEMENT NUMBER
                   19266:        MOV  R$CIM,XR         LOAD POINTER TO CURRENT IMAGE
                   19267:        JSR  PRTST            PRINT IT
                   19268:        ICV  LSTLC            BUMP LINE COUNTER
                   19269:        BNZ  ERLST,LIST3      JUMP IF ERROR COPY TO INT.CH.
                   19270:        JSR  PRTNL            TERMINATE LINE
                   19271:        BZE  CSWDB,LIST3      JUMP IF -SINGLE MODE
                   19272:        JSR  PRTNL            ELSE ADD A BLANK LINE
                   19273:        ICV  LSTLC            AND BUMP LINE COUNTER
                   19274: *
                   19275: *      HERE AFTER PRINTING SOURCE IMAGE
                   19276: *
                   19277: LIST3  MNZ  LSTPF            SET FLAG FOR LINE PRINTED
                   19278: *
                   19279: *      MERGE HERE TO EXIT
                   19280: *
                   19281: LIST4  EXI                   RETURN TO LISTR CALLER
                   19282: *
                   19283: *      PRINT TITLE AFTER -TITLE OR -STITL CARD
                   19284: *
                   19285: LIST5  ZER  CNTTL            CLEAR FLAG
                   19286: *
                   19287: *      EJECT TO NEW PAGE AND LIST TITLE
                   19288: *
                   19289: LIST6  JSR  PRTPS            EJECT
                   19290:        BZE  PRICH,LIST7      SKIP IF LISTING TO REGULAR PRINTER
                   19291:        BEQ  R$TTL,=NULLS,LIST0 TERMINAL LISTING OMITS NULL TITLE
                   19292: *
                   19293: *      LIST TITLE
                   19294: *
                   19295: LIST7  JSR  LISTT            LIST TITLE
                   19296:        BRN  LIST0            MERGE
                   19297:        ENP                   END PROCEDURE LISTR
                   19298:        EJC
                   19299: *
                   19300: *      LISTT -- LIST TITLE AND SUBTITLE
                   19301: *
                   19302: *      USED DURING COMPILATION TO PRINT PAGE HEADING
                   19303: *
                   19304: *      JSR  LISTT            CALL TO LIST TITLE
                   19305: *      (XR,WA)               DESTROYED
                   19306: *
                   19307: LISTT  PRC  E,0              ENTRY POINT
                   19308:        MOV  R$TTL,XR         POINT TO SOURCE LISTING TITLE
                   19309:        JSR  PRTST            PRINT TITLE
                   19310:        MOV  LSTPO,PROFS      SET OFFSET
                   19311:        MOV  =LSTMS,XR        SET PAGE MESSAGE
                   19312:        JSR  PRTST            PRINT PAGE MESSAGE
                   19313:        ICV  LSTPG            BUMP PAGE NUMBER
                   19314:        MTI  LSTPG            LOAD PAGE NUMBER AS INTEGER
                   19315:        JSR  PRTIN            PRINT PAGE NUMBER
                   19316:        JSR  PRTNL            TERMINATE TITLE LINE
                   19317:        ADD  =NUM02,LSTLC     COUNT TITLE LINE AND BLANK LINE
                   19318: *
                   19319: *      PRINT SUB-TITLE (IF ANY)
                   19320: *
                   19321:        MOV  R$STL,XR         LOAD POINTER TO SUB-TITLE
                   19322:        BZE  XR,LSTT1         JUMP IF NO SUB-TITLE
                   19323:        JSR  PRTST            ELSE PRINT SUB-TITLE
                   19324:        JSR  PRTNL            TERMINATE LINE
                   19325:        ICV  LSTLC            BUMP LINE COUNT
                   19326: *
                   19327: *      RETURN POINT
                   19328: *
                   19329: LSTT1  JSR  PRTNL            PRINT A BLANK LINE
                   19330:        EXI                   RETURN TO CALLER
                   19331:        ENP                   END PROCEDURE LISTT
                   19332:        EJC
                   19333: *
                   19334: *      NEXTS -- ACQUIRE NEXT SOURCE IMAGE
                   19335: *
                   19336: *      NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
                   19337: *      TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
                   19338: *      A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
                   19339: *      IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
                   19340: *
                   19341: *      JSR  NEXTS            CALL TO ACQUIRE NEXT INPUT LINE
                   19342: *      (XR,XL,WA,WB,WC)      DESTROYED
                   19343: *
                   19344: *      GLOBAL VALUES AFFECTED
                   19345: *
                   19346: *      R$CNI                 ON INPUT, NEXT IMAGE. ON
                   19347: *                            EXIT RESET TO ZERO
                   19348: *
                   19349: *      R$CIM                 ON EXIT, SET TO POINT TO IMAGE
                   19350: *
                   19351: *      SCNIL                 INPUT IMAGE LENGTH ON EXIT
                   19352: *
                   19353: *      SCNSE                 RESET TO ZERO ON EXIT
                   19354: *
                   19355: *      LSTPF                 SET ON EXIT IF LINE IS LISTED
                   19356: *
                   19357: NEXTS  PRC  E,0              ENTRY POINT
                   19358:        BZE  CSWLS,NXTS2      JUMP IF -NOLIST
                   19359:        MOV  R$CIM,XR         POINT TO IMAGE
                   19360:        BZE  XR,NXTS2         JUMP IF NO IMAGE
                   19361:        PLC  XR               GET CHAR PTR
                   19362:        LCH  WA,(XR)          GET FIRST CHAR
                   19363:        BNE  WA,=CH$MN,NXTS1  JUMP IF NOT CTRL CARD
                   19364:        BZE  CSWPR,NXTS2      JUMP IF -NOPRINT
                   19365: *
                   19366: *      HERE TO CALL LISTER
                   19367: *
                   19368: NXTS1  JSR  LISTR            LIST LINE
                   19369: *
                   19370: *      HERE AFTER POSSIBLE LISTING
                   19371: *
                   19372: NXTS2  MOV  R$CNI,XR         POINT TO NEXT IMAGE
                   19373:        MOV  XR,R$CIM         SET AS NEXT IMAGE
                   19374:        ZER  R$CNI            CLEAR NEXT IMAGE POINTER
                   19375:        MOV  SCLEN(XR),WA     GET INPUT IMAGE LENGTH
                   19376:        MOV  CSWIN,WB         GET MAX ALLOWABLE LENGTH
                   19377:        BLO  WA,WB,NXTS3      SKIP IF NOT TOO LONG
                   19378:        MOV  WB,WA            ELSE TRUNCATE
                   19379: *
                   19380: *      HERE WITH LENGTH IN (WA)
                   19381: *
                   19382: NXTS3  MOV  WA,SCNIL         USE AS RECORD LENGTH
                   19383:        ZER  SCNSE            RESET SCNSE
                   19384:        ZER  LSTPF            SET LINE NOT LISTED YET
                   19385:        EXI                   RETURN TO NEXTS CALLER
                   19386:        ENP                   END PROCEDURE NEXTS
                   19387:        EJC
                   19388: *
                   19389: *      PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
                   19390: *
                   19391: *      THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
                   19392: *      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
                   19393: *      FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
                   19394: *
                   19395: *      (WA)                  PCODE FOR EXPRESSION ARG CASE
                   19396: *      (WB)                  PCODE FOR INTEGER ARG CASE
                   19397: *      JSR  PATIN            CALL TO BUILD PATTERN NODE
                   19398: *      PPM  LOC              TRANSFER LOC FOR NOT INTEGER OR EXP
                   19399: *      PPM  LOC              TRANSFER LOC FOR INT OUT OF RANGE
                   19400: *      (XR)                  POINTER TO CONSTRUCTED NODE
                   19401: *      (XL,WA,WB,WC,IA)      DESTROYED
                   19402: *
                   19403: PATIN  PRC  N,2              ENTRY POINT
                   19404:        MOV  WA,XL            PRESERVE EXPRESSION ARG PCODE
                   19405:        JSR  GTSMI            TRY TO CONVERT ARG AS SMALL INTEGER
                   19406:        PPM  PTIN2            JUMP IF NOT INTEGER
                   19407:        PPM  PTIN3            JUMP IF OUT OF RANGE
                   19408: *
                   19409: *      COMMON SUCCESSFUL EXIT POINT
                   19410: *
                   19411: PTIN1  JSR  PBILD            BUILD PATTERN NODE
                   19412:        EXI                   RETURN TO CALLER
                   19413: *
                   19414: *      HERE IF ARGUMENT IS NOT AN INTEGER
                   19415: *
                   19416: PTIN2  MOV  XL,WB            COPY EXPR ARG CASE PCODE
                   19417:        BLO  (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG
                   19418:        EXI  1                ELSE TAKE ERROR EXIT FOR WRONG TYPE
                   19419: *
                   19420: *      HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
                   19421: *
                   19422: PTIN3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
                   19423:        ENP                   END PROCEDURE PATIN
                   19424:        EJC
                   19425: *
                   19426: *      PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
                   19427: *               BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
                   19428: *
                   19429: *      THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
                   19430: *      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
                   19431: *      FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
                   19432: *
                   19433: *      0(XS)                 STRING ARGUMENT
                   19434: *      (WB)                  PCODE FOR ONE CHAR ARGUMENT
                   19435: *      (XL)                  PCODE FOR MULTI-CHAR ARGUMENT
                   19436: *      (WC)                  PCODE FOR EXPRESSION ARGUMENT
                   19437: *      JSR  PATST            CALL TO BUILD NODE
                   19438: *      PPM  LOC              TRANSFER LOC IF NOT STRING OR EXPR
                   19439: *      (XS)                  POPPED PAST STRING ARGUMENT
                   19440: *      (XR)                  POINTER TO CONSTRUCTED NODE
                   19441: *      (XL)                  DESTROYED
                   19442: *      (WA,WB,WC,RA)         DESTROYED
                   19443: *
                   19444: *      NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
                   19445: *      PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
                   19446: *      FOR DETAILS OF THE FORM OF THIS CALL.
                   19447: *
                   19448: PATST  PRC  N,1              ENTRY POINT
                   19449:        JSR  GTSTG            CONVERT ARGUMENT AS STRING
                   19450:        PPM  PATS7            JUMP IF NOT STRING
                   19451:        BNE  WA,=NUM01,PATS2  JUMP IF NOT ONE CHAR STRING
                   19452: *
                   19453: *      HERE FOR ONE CHAR STRING CASE
                   19454: *
                   19455:        BZE  WB,PATS2         TREAT AS MULTI-CHAR IF EVALS CALL
                   19456:        PLC  XR               POINT TO CHARACTER
                   19457:        LCH  XR,(XR)          LOAD CHARACTER
                   19458: *
                   19459: *      COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
                   19460: *
                   19461: PATS1  JSR  PBILD            CALL ROUTINE TO BUILD NODE
                   19462:        EXI                   RETURN TO PATST CALLER
                   19463:        EJC
                   19464: *
                   19465: *      PATST (CONTINUED)
                   19466: *
                   19467: *      HERE FOR MULTI-CHARACTER STRING CASE
                   19468: *
                   19469: PATS2  MOV  XL,-(XS)         SAVE MULTI-CHAR PCODE
                   19470:        MOV  XR,-(XS)         SAVE STRING POINTER
                   19471:        MOV  CTMSK,WC         LOAD CURRENT MASK BIT
                   19472:        LSH  WC,1             SHIFT TO NEXT POSITION
                   19473:        NZB  WC,PATS4         SKIP IF POSITION LEFT IN THIS TBL
                   19474: *
                   19475: *      HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
                   19476: *
                   19477:        MOV  *CTSI$,WA        SET SIZE OF CTBLK
                   19478:        JSR  ALLOC            ALLOCATE CTBLK
                   19479:        MOV  XR,R$CTP         STORE PTR TO NEW CTBLK
                   19480:        MOV  =B$CTT,(XR)+     STORE TYPE CODE, BUMP PTR
                   19481:        LCT  WB,=CFP$A        SET NUMBER OF WORDS TO CLEAR
                   19482:        MOV  BITS0,WC         LOAD ALL ZERO BITS
                   19483: *
                   19484: *      LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
                   19485: *
                   19486: PATS3  MOV  WC,(XR)+         MOVE WORD OF ZERO BITS
                   19487:        BCT  WB,PATS3         LOOP TILL ALL CLEARED
                   19488:        MOV  BITS1,WC         SET INITIAL BIT POSITION
                   19489: *
                   19490: *      MERGE HERE WITH BIT POSITION AVAILABLE
                   19491: *
                   19492: PATS4  MOV  WC,CTMSK         SAVE PARM2 (NEW BIT POSITION)
                   19493:        MOV  (XS)+,XL         RESTORE POINTER TO ARGUMENT STRING
                   19494:        MOV  SCLEN(XL),WB     LOAD STRING LENGTH
                   19495:        BZE  WB,PATS6         JUMP IF NULL STRING CASE
                   19496:        LCT  WB,WB            ELSE SET LOOP COUNTER
                   19497:        PLC  XL               POINT TO CHARACTERS IN ARGUMENT
                   19498:        EJC
                   19499: *
                   19500: *      PATST (CONTINUED)
                   19501: *
                   19502: *      LOOP TO SET BITS IN COLUMN OF TABLE
                   19503: *
                   19504: PATS5  LCH  WA,(XL)+         LOAD NEXT CHARACTER
                   19505:        WTB  WA               CONVERT TO BYTE OFFSET
                   19506:        MOV  R$CTP,XR         POINT TO CTBLK
                   19507:        ADD  WA,XR            POINT TO CTBLK ENTRY
                   19508:        MOV  WC,WA            COPY BIT MASK
                   19509:        ORB  CTCHS(XR),WA     OR IN BITS ALREADY SET
                   19510:        MOV  WA,CTCHS(XR)     STORE RESULTING BIT STRING
                   19511:        BCT  WB,PATS5         LOOP TILL ALL BITS SET
                   19512: *
                   19513: *      COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
                   19514: *
                   19515: PATS6  MOV  R$CTP,XR         LOAD CTBLK PTR AS PARM1 FOR PBILD
                   19516:        ZER  XL               CLEAR GARBAGE PTR IN XL
                   19517:        MOV  (XS)+,WB         LOAD PCODE FOR MULTI-CHAR STR CASE
                   19518:        BRN  PATS1            BACK TO EXIT (WC=BITSTRING=PARM2)
                   19519: *
                   19520: *      HERE IF ARGUMENT IS NOT A STRING
                   19521: *
                   19522: *      NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
                   19523: *      SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
                   19524: *
                   19525: PATS7  MOV  WC,WB            SET PCODE FOR EXPRESSION ARGUMENT
                   19526:        BLO  (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG
                   19527:        EXI  1                ELSE TAKE WRONG TYPE ERROR EXIT
                   19528:        ENP                   END PROCEDURE PATST
                   19529:        EJC
                   19530: *
                   19531: *      PBILD -- BUILD PATTERN NODE
                   19532: *
                   19533: *      (XR)                  PARM1 (ONLY IF REQUIRED)
                   19534: *      (WB)                  PCODE FOR NODE
                   19535: *      (WC)                  PARM2 (ONLY IF REQUIRED)
                   19536: *      JSR  PBILD            CALL TO BUILD NODE
                   19537: *      (XR)                  POINTER TO CONSTRUCTED NODE
                   19538: *      (WA)                  DESTROYED
                   19539: *
                   19540: PBILD  PRC  E,0              ENTRY POINT
                   19541:        MOV  XR,-(XS)         STACK POSSIBLE PARM1
                   19542:        MOV  WB,XR            COPY PCODE
                   19543:        LEI  XR               LOAD ENTRY POINT ID (BL$PX)
                   19544:        BEQ  XR,=BL$P1,PBLD1  JUMP IF ONE PARAMETER
                   19545:        BEQ  XR,=BL$P0,PBLD3  JUMP IF NO PARAMETERS
                   19546: *
                   19547: *      HERE FOR TWO PARAMETER CASE
                   19548: *
                   19549:        MOV  *PCSI$,WA        SET SIZE OF P2BLK
                   19550:        JSR  ALLOC            ALLOCATE BLOCK
                   19551:        MOV  WC,PARM2(XR)     STORE SECOND PARAMETER
                   19552:        BRN  PBLD2            MERGE WITH ONE PARM CASE
                   19553: *
                   19554: *      HERE FOR ONE PARAMETER CASE
                   19555: *
                   19556: PBLD1  MOV  *PBSI$,WA        SET SIZE OF P1BLK
                   19557:        JSR  ALLOC            ALLOCATE NODE
                   19558: *
                   19559: *      MERGE HERE FROM TWO PARM CASE
                   19560: *
                   19561: PBLD2  MOV  (XS),PARM1(XR)   STORE FIRST PARAMETER
                   19562:        BRN  PBLD4            MERGE WITH NO PARAMETER CASE
                   19563: *
                   19564: *      HERE FOR CASE OF NO PARAMETERS
                   19565: *
                   19566: PBLD3  MOV  *PASI$,WA        SET SIZE OF P0BLK
                   19567:        JSR  ALLOC            ALLOCATE NODE
                   19568: *
                   19569: *      MERGE HERE FROM OTHER CASES
                   19570: *
                   19571: PBLD4  MOV  WB,(XR)          STORE PCODE
                   19572:        ICA  XS               POP FIRST PARAMETER
                   19573:        MOV  =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER
                   19574:        EXI                   RETURN TO PBILD CALLER
                   19575:        ENP                   END PROCEDURE PBILD
                   19576:        EJC
                   19577: *
                   19578: *      PCONC -- CONCATENATE TWO PATTERNS
                   19579: *
                   19580: *      (XL)                  PTR TO RIGHT PATTERN
                   19581: *      (XR)                  PTR TO LEFT PATTERN
                   19582: *      JSR  PCONC            CALL TO CONCATENATE PATTERNS
                   19583: *      (XR)                  PTR TO CONCATENATED PATTERN
                   19584: *      (XL,WA,WB,WC)         DESTROYED
                   19585: *
                   19586: *
                   19587: *      TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
                   19588: *      PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
                   19589: *      POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
                   19590: *      MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
                   19591: *      THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
                   19592: *      MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
                   19593: *
                   19594: *      ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
                   19595: *      THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
                   19596: *      NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
                   19597: *      THE FOLLOWING ALGORITHM IS EMPLOYED.
                   19598: *
                   19599: *      THE STACK IS USED TO STORE A LIST OF NODES WHICH
                   19600: *      HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
                   19601: *      THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
                   19602: *      IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
                   19603: *      OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
                   19604: *      ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
                   19605: *      USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
                   19606: *      A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
                   19607: *      ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
                   19608: *      ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
                   19609: *      THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
                   19610: *
                   19611: PCONC  PRC  E,0              ENTRY POINT
                   19612:        ZER  -(XS)            MAKE ROOM FOR ONE ENTRY AT BOTTOM
                   19613:        MOV  XS,WC            STORE POINTER TO START OF LIST
                   19614:        MOV  =NDNTH,-(XS)     STACK NOTHEN NODE AS OLD NODE
                   19615:        MOV  XL,-(XS)         STORE RIGHT ARG AS COPY OF NOTHEN
                   19616:        MOV  XS,XT            INITIALIZE POINTER TO STACK ENTRIES
                   19617:        JSR  PCOPY            COPY FIRST NODE OF LEFT ARG
                   19618:        MOV  WA,2(XT)         STORE AS RESULT UNDER LIST
                   19619:        EJC
                   19620: *
                   19621: *      PCONC (CONTINUED)
                   19622: *
                   19623: *      THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
                   19624: *      SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
                   19625: *
                   19626: PCNC1  BEQ  XT,XS,PCNC2      JUMP IF ALL ENTRIES PROCESSED
                   19627:        MOV  -(XT),XR         ELSE LOAD NEXT OLD ADDRESS
                   19628:        MOV  PTHEN(XR),XR     LOAD POINTER TO SUCCESSOR
                   19629:        JSR  PCOPY            COPY SUCCESSOR NODE
                   19630:        MOV  -(XT),XR         LOAD POINTER TO NEW NODE (COPY)
                   19631:        MOV  WA,PTHEN(XR)     STORE PTR TO NEW SUCCESSOR
                   19632: *
                   19633: *      NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
                   19634: *      PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
                   19635: *
                   19636:        BNE  (XR),=P$ALT,PCNC1 LOOP BACK IF NOT
                   19637:        MOV  PARM1(XR),XR     ELSE LOAD POINTER TO ALTERNATIVE
                   19638:        JSR  PCOPY            COPY IT
                   19639:        MOV  (XT),XR          RESTORE PTR TO NEW NODE
                   19640:        MOV  WA,PARM1(XR)     STORE PTR TO COPIED ALTERNATIVE
                   19641:        BRN  PCNC1            LOOP BACK FOR NEXT ENTRY
                   19642: *
                   19643: *      HERE AT END OF COPY PROCESS
                   19644: *
                   19645: PCNC2  MOV  WC,XS            RESTORE STACK POINTER
                   19646:        MOV  (XS)+,XR         LOAD POINTER TO COPY
                   19647:        EXI                   RETURN TO PCONC CALLER
                   19648:        ENP                   END PROCEDURE PCONC
                   19649:        EJC
                   19650: *
                   19651: *      PCOPY -- COPY A PATTERN NODE
                   19652: *
                   19653: *      PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
                   19654: *      PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
                   19655: *      HAS NOT BEEN COPIED ALREADY.
                   19656: *
                   19657: *      (XR)                  POINTER TO NODE TO BE COPIED
                   19658: *      (XT)                  PTR TO CURRENT LOC IN COPY LIST
                   19659: *      (WC)                  POINTER TO LIST OF COPIED NODES
                   19660: *      JSR  PCOPY            CALL TO COPY A NODE
                   19661: *      (WA)                  POINTER TO COPY
                   19662: *      (WB,XR)               DESTROYED
                   19663: *
                   19664: PCOPY  PRC  N,0              ENTRY POINT
                   19665:        MOV  XT,WB            SAVE XT
                   19666:        MOV  WC,XT            POINT TO START OF LIST
                   19667: *
                   19668: *      LOOP TO SEARCH LIST OF NODES COPIED ALREADY
                   19669: *
                   19670: PCOP1  DCA  XT               POINT TO NEXT ENTRY ON LIST
                   19671:        BEQ  XR,(XT),PCOP2    JUMP IF MATCH
                   19672:        DCA  XT               ELSE SKIP OVER COPIED ADDRESS
                   19673:        BNE  XT,XS,PCOP1      LOOP BACK IF MORE TO TEST
                   19674: *
                   19675: *      HERE IF NOT IN LIST, PERFORM COPY
                   19676: *
                   19677:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   19678:        JSR  BLKLN            GET LENGTH OF BLOCK
                   19679:        MOV  XR,XL            SAVE POINTER TO OLD NODE
                   19680:        JSR  ALLOC            ALLOCATE SPACE FOR COPY
                   19681:        MOV  XL,-(XS)         STORE OLD ADDRESS ON LIST
                   19682:        MOV  XR,-(XS)         STORE NEW ADDRESS ON LIST
                   19683:        CHK                   CHECK FOR STACK OVERFLOW
                   19684:        MVW                   MOVE WORDS FROM OLD BLOCK TO COPY
                   19685:        MOV  (XS),WA          LOAD POINTER TO COPY
                   19686:        BRN  PCOP3            JUMP TO EXIT
                   19687: *
                   19688: *      HERE IF WE FIND ENTRY IN LIST
                   19689: *
                   19690: PCOP2  MOV  -(XT),WA         LOAD ADDRESS OF COPY FROM LIST
                   19691: *
                   19692: *      COMMON EXIT POINT
                   19693: *
                   19694: PCOP3  MOV  WB,XT            RESTORE XT
                   19695:        EXI                   RETURN TO PCOPY CALLER
                   19696:        ENP                   END PROCEDURE PCOPY
                   19697:        EJC
                   19698: .IF    .CNPF
                   19699: .ELSE
                   19700: *
                   19701: *      PRFLR -- PRINT PROFILE
                   19702: *      PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
                   19703: *      TABLE IN A FAIRLY READABLE TABULAR FORMAT.
                   19704: *
                   19705: *      JSR  PRFLR            CALL TO PRINT PROFILE
                   19706: *      (WA,IA)               DESTROYED
                   19707: *
                   19708: PRFLR  PRC  E,0
                   19709:        BZE  PFDMP,PRFL4      NO PRINTING IF NO PROFILING DONE
                   19710:        MOV  XR,-(XS)         PRESERVE ENTRY XR
                   19711:        MOV  WB,PFSVW         AND ALSO WB
                   19712:        JSR  PRTPG            EJECT
                   19713:        MOV  =PFMS1,XR        LOAD MSG /PROGRAM PROFILE/
                   19714:        JSR  PRTST            AND PRINT IT
                   19715:        JSR  PRTNL            FOLLOWED BY NEWLINE
                   19716:        JSR  PRTNL            AND ANOTHER
                   19717:        MOV  =PFMS2,XR        POINT TO FIRST HDR
                   19718:        JSR  PRTST            PRINT IT
                   19719:        JSR  PRTNL            NEW LINE
                   19720:        MOV  =PFMS3,XR        SECOND HDR
                   19721:        JSR  PRTST            PRINT IT
                   19722:        JSR  PRTNL            NEW LINE
                   19723:        JSR  PRTNL            AND ANOTHER BLANK LINE
                   19724:        ZER  WB               INITIAL STMT COUNT
                   19725:        MOV  PFTBL,XR         POINT TO TABLE ORIGIN
                   19726:        ADD  *NUM02,XR        BIAS PAST XNBLK HEADER (SGD07)
                   19727: *
                   19728: *      LOOP HERE TO PRINT SUCCESSIVE ENTRIES
                   19729: *
                   19730: PRFL1  ICV  WB               BUMP STMT NR
                   19731:        LDI  (XR)             LOAD NR OF EXECUTIONS
                   19732:        IEQ  PRFL3            NO PRINTING IF ZERO
                   19733:        MOV  =PFPD1,PROFS     POINT WHERE TO PRINT
                   19734:        JSR  PRTIN            AND PRINT IT
                   19735:        ZER  PROFS            BACK TO START OF LINE
                   19736:        MTI  WB               LOAD STMT NR
                   19737:        JSR  PRTIN            PRINT IT THERE
                   19738:        MOV  =PFPD2,PROFS     AND PAD PAST COUNT
                   19739:        LDI  CFP$I(XR)        LOAD TOTAL EXEC TIME
                   19740:        JSR  PRTIN            PRINT THAT TOO
                   19741:        LDI  CFP$I(XR)        RELOAD TIME
                   19742:        MLI  INTTH            CONVERT TO MICROSEC
                   19743:        IOV  PRFL2            OMIT NEXT BIT IF OVERFLOW
                   19744:        DVI  (XR)             DIVIDE BY EXECUTIONS
                   19745:        MOV  =PFPD3,PROFS     PAD LAST PRINT
                   19746:        JSR  PRTIN            AND PRINT MCSEC/EXECN
                   19747: *
                   19748: *      MERGE AFTER PRINTING TIME
                   19749: *
                   19750: PRFL2  JSR  PRTNL            THATS ANOTHER LINE
                   19751: *
                   19752: *      HERE TO GO TO NEXT ENTRY
                   19753: *
                   19754: PRFL3  ADD  *PF$I2,XR        BUMP INDEX PTR (SGD07)
                   19755:        BLT  WB,PFNTE,PRFL1   LOOP IF MORE STMTS
                   19756:        MOV  (XS)+,XR         RESTORE CALLERS XR
                   19757:        MOV  PFSVW,WB         AND WB TOO
                   19758: *
                   19759: *      HERE TO EXIT
                   19760: *
                   19761: PRFL4  EXI                   RETURN
                   19762:        ENP                   END OF PRFLR
                   19763:        EJC
                   19764: *
                   19765: *      PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
                   19766: *
                   19767: *      ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
                   19768: *
                   19769: *      JSR  PRFLU            CALL TO UPDATE ENTRY
                   19770: *      (IA)                  DESTROYED
                   19771: *
                   19772: PRFLU  PRC  E,0
                   19773:        BNZ  PFFNC,PFLU4      SKIP IF JUST ENTERED FUNCTION
                   19774:        MOV  XR,-(XS)         PRESERVE ENTRY XR
                   19775:        MOV  WA,PFSVW         SAVE WA (SGD07)
                   19776:        BNZ  PFTBL,PFLU2      BRANCH IF TABLE ALLOCATED
                   19777: *
                   19778: *      HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
                   19779: *      CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
                   19780: *      INITIALIZE IT ALL TO ZERO.
                   19781: *      THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
                   19782: *      STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
                   19783: *      TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
                   19784: *      DOESNT REALLY MATTER...
                   19785: *
                   19786:        SUB  =NUM01,PFNTE     ADJUST FOR EXTRA COUNT (SGD07)
                   19787:        MTI  PFI2A            CONVRT ENTRY SIZE TO INT
                   19788:        STI  PFSTE            AND STORE SAFELY FOR LATER
                   19789:        MTI  PFNTE            LOAD TABLE LENGTH AS INTEGER
                   19790:        MLI  PFSTE            MULTIPLY BY ENTRY SIZE
                   19791:        MFI  WA               GET BACK ADDRESS-STYLE
                   19792:        ADD  =NUM02,WA        ADD ON 2 WORD OVERHEAD
                   19793:        WTB  WA               CONVERT THE WHOLE LOT TO BYTES
                   19794:        JSR  ALOST            GIMME THE SPACE
                   19795:        MOV  XR,PFTBL         SAVE BLOCK POINTER
                   19796:        MOV  =B$XNT,(XR)+     PUT BLOCK TYPE AND ...
                   19797:        MOV  WA,(XR)+         ... LENGTH INTO HEADER
                   19798:        MFI  WA               GET BACK NR OF WDS IN DATA AREA
                   19799:        LCT  WA,WA            LOAD THE COUNTER
                   19800: *
                   19801: *      LOOP HERE TO ZERO THE BLOCK DATA
                   19802: *
                   19803: PFLU1  ZER  (XR)+            BLANK A WORD
                   19804:        BCT  WA,PFLU1         AND ALLLLLLL THE REST
                   19805: *
                   19806: *      END OF ALLOCATION. MERGE BACK INTO ROUTINE
                   19807: *
                   19808: PFLU2  MTI  KVSTN            LOAD NR OF STMT JUST ENDED
                   19809:        SBI  INTV1            MAKE INTO INDEX OFFSET
                   19810:        MLI  PFSTE            MAKE OFFSET OF TABLE ENTRY
                   19811:        MFI  WA               CONVERT TO ADDRESS
                   19812:        WTB  WA               GET AS BAUS
                   19813:        ADD  *NUM02,WA        OFFSET INCLUDES TABLE HEADER
                   19814:        MOV  PFTBL,XR         GET TABLE START
                   19815:        BGE  WA,NUM01(XR),PFLU3  IF OUT OF TABLE, SKIP IT
                   19816:        ADD  WA,XR            ELSE POINT TO ENTRY
                   19817:        LDI  (XR)             GET NR OF EXECUTIONS SO FAR
                   19818:        ADI  INTV1            NUDGE UP ONE
                   19819:        STI  (XR)             AND PUT BACK
                   19820:        JSR  SYSTM            GET TIME NOW
                   19821:        STI  PFETM            STASH ENDING TIME
                   19822:        SBI  PFSTM            SUBTRACT START TIME
                   19823:        ADI  CFP$I(XR)        ADD CUMULATIVE TIME SO FAR
                   19824:        STI  CFP$I(XR)        AND PUT BACK NEW TOTAL
                   19825:        LDI  PFETM            LOAD END TIME OF THIS STMT ...
                   19826:        STI  PFSTM            ... WHICH IS START TIME OF NEXT
                   19827: *
                   19828: *      MERGE HERE TO EXIT
                   19829: *
                   19830: PFLU3  MOV  (XS)+,XR         RESTORE CALLERS XR
                   19831:        MOV  PFSVW,WA         RESTORE SAVED REG
                   19832:        EXI                   AND RETURN
                   19833: *
                   19834: *      HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
                   19835: *      FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
                   19836: *      HAS NOT YET FINISHED
                   19837: *
                   19838: PFLU4  ZER  PFFNC            RESET THE CONDITION FLAG
                   19839:        EXI                   AND IMMEDIATE RETURN
                   19840:        ENP                   END OF PROCEDURE PRFLU
                   19841:        EJC
                   19842: .FI
                   19843: *
                   19844: *      PRPAR - PROCESS PRINT PARAMETERS
                   19845: *
                   19846: *      (WC)                  IF NONZERO ASSOCIATE TERMINAL ONLY
                   19847: *      JSR  PRPAR            CALL TO PROCESS PRINT PARAMETERS
                   19848: *      (XL,XR,WA,WB,WC)      DESTROYED
                   19849: *
                   19850: *      SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL,
                   19851: *      TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO
                   19852: *      IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS.
                   19853: *
                   19854: PRPAR  PRC  E,0              ENTRY POINT
                   19855:        BNZ  WC,PRPA7         JUMP TO ASSOCIATE TERMINAL
                   19856:        JSR  SYSPP            GET PRINT PARAMETERS
                   19857:        BNZ  WB,PRPA1         JUMP IF LINES/PAGE SPECIFIED
                   19858:        MOV  =CFP$M,WB        ELSE USE A LARGE VALUE
                   19859:        RSH  WB,1             BUT NOT TOO LARGE
                   19860: *
                   19861: *      STORE LINE COUNT/PAGE
                   19862: *
                   19863: PRPA1  MOV  WB,LSTNP         STORE NUMBER OF LINES/PAGE
                   19864:        MOV  WB,LSTLC         PRETEND PAGE IS FULL INITIALLY
                   19865:        ZER  LSTPG            CLEAR PAGE NUMBER
                   19866:        MOV  PRLEN,WB         GET PRIOR LENGTH IF ANY
                   19867:        BZE  WB,PRPA2         SKIP IF NO LENGTH
                   19868:        BGT  WA,WB,PRPA3      SKIP STORING IF TOO BIG
                   19869: *
                   19870: *      STORE PRINT BUFFER LENGTH
                   19871: *
                   19872: PRPA2  MOV  WA,PRLEN         STORE VALUE
                   19873: *
                   19874: *      PROCESS BITS OPTIONS
                   19875: *
                   19876: PRPA3  MOV  BITS3,WB         BIT 3 MASK
                   19877:        ANB  WC,WB            GET -NOLIST BIT
                   19878:        ZRB  WB,PRPA4         SKIP IF CLEAR
                   19879:        ZER  CSWLS            SET -NOLIST
                   19880: *
                   19881: *      CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL
                   19882: *
                   19883: PRPA4  MOV  BITS1,WB         BIT 1 MASK
                   19884:        ANB  WC,WB            GET BIT
                   19885:        MOV  WB,ERICH         STORE INT. CHAN. ERROR FLAG
                   19886:        MOV  BITS2,WB         BIT 2 MASK
                   19887:        ANB  WC,WB            GET BIT
                   19888:        MOV  WB,PRICH         FLAG FOR STD PRINTER ON INT. CHAN.
                   19889:        MOV  BITS4,WB         BIT 4 MASK
                   19890:        ANB  WC,WB            GET BIT
                   19891:        MOV  WB,CPSTS         FLAG FOR COMPILE STATS SUPPRESSN.
                   19892:        MOV  BITS5,WB         BIT 5 MASK
                   19893:        ANB  WC,WB            GET BIT
                   19894:        MOV  WB,EXSTS         FLAG FOR EXEC STATS SUPPRESSION
                   19895:        EJC
                   19896: *
                   19897: *      PRPAR (CONTINUED)
                   19898: *
                   19899:        MOV  BITS6,WB         BIT 6 MASK
                   19900:        ANB  WC,WB            GET BIT
                   19901:        MOV  WB,PRECL         EXTENDED/COMPACT LISTING FLAG
                   19902:        SUB  =NUM08,WA        POINT 8 CHARS FROM LINE END
                   19903:        ZRB  WB,PRPA5         JUMP IF NOT EXTENDED
                   19904:        MOV  WA,LSTPO         STORE FOR LISTING PAGE HEADINGS
                   19905: *
                   19906: *       CONTINUE OPTION PROCESSING
                   19907: *
                   19908: PRPA5  MOV  BITS7,WB         BIT 7 MASK
                   19909:        ANB  WC,WB            GET BIT 7
                   19910:        MOV  WB,CSWEX         SET -NOEXECUTE IF NON-ZERO
                   19911:        MOV  BIT10,WB         BIT 10 MASK
                   19912:        ANB  WC,WB            GET BIT 10
                   19913:        MOV  WB,HEADP         PRETEND PRINTED TO OMIT HEADERS
                   19914:        MOV  BITS9,WB         BIT 9 MASK
                   19915:        ANB  WC,WB            GET BIT 9
                   19916:        MOV  WB,PRSTO         KEEP IT AS STD LISTING OPTION
                   19917:        ZRB  WB,PRPA6         SKIP IF CLEAR
                   19918:        MOV  PRLEN,WA         GET PRINT BUFFER LENGTH
                   19919:        SUB  =NUM08,WA        POINT 8 CHARS FROM LINE END
                   19920:        MOV  WA,LSTPO         STORE PAGE OFFSET
                   19921: *
                   19922: *      CHECK FOR TERMINAL
                   19923: *
                   19924: PRPA6  ANB  BITS8,WC         SEE IF TERMINAL TO BE ACTIVATED
                   19925:        BNZ  WC,PRPA7         JUMP IF TERMINAL REQUIRED
                   19926:        BZE  INITR,PRPA8      JUMP IF NO TERMINAL TO DETACH
                   19927:        MOV  =V$TER,XL        PTR TO /TERMINAL/
                   19928:        JSR  GTNVR            GET VRBLK POINTER
                   19929:        PPM                   CANT FAIL
                   19930:        MOV  =NULLS,VRVAL(XR) CLEAR VALUE OF TERMINAL
                   19931:        JSR  SETVR            REMOVE ASSOCIATION
                   19932:        BRN  PRPA8            RETURN
                   19933: *
                   19934: *      ASSOCIATE TERMINAL
                   19935: *
                   19936: PRPA7  MNZ  INITR            NOTE TERMINAL ASSOCIATED
                   19937:        BZE  DNAMB,PRPA8      CANT IF MEMORY NOT ORGANISED
                   19938:        MOV  =V$TER,XL        POINT TO TERMINAL STRING
                   19939:        MOV  =TRTOU,WB        OUTPUT TRACE TYPE
                   19940:        JSR  INOUT            ATTACH OUTPUT TRBLK TO VRBLK
                   19941:        MOV  XR,-(XS)         STACK TRBLK PTR
                   19942:        MOV  =V$TER,XL        POINT TO TERMINAL STRING
                   19943:        MOV  =TRTIN,WB        INPUT TRACE TYPE
                   19944:        JSR  INOUT            ATTACH INPUT TRACE BLK
                   19945:        MOV  (XS)+,VRVAL(XR)  ADD OUTPUT TRBLK TO CHAIN
                   19946: *
                   19947: *      RETURN POINT
                   19948: *
                   19949: PRPA8  EXI                   RETURN
                   19950:        ENP                   END PROCEDURE PRPAR
                   19951:        EJC
                   19952: *
                   19953: *      PRTCH -- PRINT A CHARACTER
                   19954: *
                   19955: *      PRTCH IS USED TO PRINT A SINGLE CHARACTER
                   19956: *
                   19957: *      (WA)                  CHARACTER TO BE PRINTED
                   19958: *      JSR  PRTCH            CALL TO PRINT CHARACTER
                   19959: *
                   19960: PRTCH  PRC  E,0              ENTRY POINT
                   19961:        MOV  XR,-(XS)         SAVE XR
                   19962:        BNE  PROFS,PRLEN,PRCH1 JUMP IF ROOM IN BUFFER
                   19963:        JSR  PRTNL            ELSE PRINT THIS LINE
                   19964: *
                   19965: *      HERE AFTER MAKING SURE WE HAVE ROOM
                   19966: *
                   19967: PRCH1  MOV  PRBUF,XR         POINT TO PRINT BUFFER
                   19968:        PSC  XR,PROFS         POINT TO NEXT CHARACTER LOCATION
                   19969:        SCH  WA,(XR)          STORE NEW CHARACTER
                   19970:        CSC  XR               COMPLETE STORE CHARACTERS
                   19971:        ICV  PROFS            BUMP POINTER
                   19972:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   19973:        EXI                   RETURN TO PRTCH CALLER
                   19974:        ENP                   END PROCEDURE PRTCH
                   19975:        EJC
                   19976: *
                   19977: *      PRTIC -- PRINT TO INTERACTIVE CHANNEL
                   19978: *
                   19979: *      PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD
                   19980: *      PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY
                   19981: *      CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING.
                   19982: *      IT DOES NOT CLEAR THE BUFFER.
                   19983: *
                   19984: *      JSR  PRTIC            CALL FOR PRINT
                   19985: *      (WA,WB)               DESTROYED
                   19986: *
                   19987: PRTIC  PRC  E,0              ENTRY POINT
                   19988:        MOV  XR,-(XS)         SAVE XR
                   19989:        MOV  PRBUF,XR         POINT TO BUFFER
                   19990:        MOV  PROFS,WA         NO OF CHARS
                   19991:        JSR  SYSPI            PRINT
                   19992:        PPM  PRTC2            FAIL RETURN
                   19993: *
                   19994: *      RETURN
                   19995: *
                   19996: PRTC1  MOV  (XS)+,XR         RESTORE XR
                   19997:        EXI                   RETURN
                   19998: *
                   19999: *      ERROR OCCURED
                   20000: *
                   20001: PRTC2  ZER  ERICH            PREVENT LOOPING
                   20002:        ERB  252,ERROR ON PRINTING TO INTERACTIVE CHANNEL
                   20003:        BRN  PRTC1            RETURN
                   20004:        ENP                   PROCEDURE PRTIC
                   20005:        EJC
                   20006: *
                   20007: *      PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER
                   20008: *
                   20009: *      PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE
                   20010: *      INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER.
                   20011: *      IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES
                   20012: *      NOT DUPLICATE LINES IF THE STANDARD PRINTER IS
                   20013: *      INTERACTIVE.  IT CLEARS DOWN THE PRINT BUFFER.
                   20014: *
                   20015: *      JSR  PRTIS            CALL FOR PRINTING
                   20016: *      (WA,WB)               DESTROYED
                   20017: *
                   20018: PRTIS  PRC  E,0              ENTRY POINT
                   20019:        BNZ  PRICH,PRTS1      JUMP IF STANDARD PRINTER IS INT.CH.
                   20020:        BZE  ERICH,PRTS1      SKIP IF NOT DOING INT. ERROR REPS.
                   20021:        JSR  PRTIC            PRINT TO INTERACTIVE CHANNEL
                   20022: *
                   20023: *      MERGE AND EXIT
                   20024: *
                   20025: PRTS1  JSR  PRTNL            PRINT TO STANDARD PRINTER
                   20026:        EXI                   RETURN
                   20027:        ENP                   END PROCEDURE PRTIS
                   20028:        EJC
                   20029: *
                   20030: *      PRTIN -- PRINT AN INTEGER
                   20031: *
                   20032: *      PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
                   20033: *      ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
                   20034: *      DURING THIS PROCESS ARE IMMEDIATELY DELETED.
                   20035: *
                   20036: *      (IA)                  INTEGER VALUE TO BE PRINTED
                   20037: *      JSR  PRTIN            CALL TO PRINT INTEGER
                   20038: *      (IA,RA)               DESTROYED
                   20039: *
                   20040: PRTIN  PRC  E,0              ENTRY POINT
                   20041:        MOV  XR,-(XS)         SAVE XR
                   20042:        JSR  ICBLD            BUILD INTEGER BLOCK
                   20043:        BLO  XR,DNAMB,PRTI1   JUMP IF ICBLK BELOW DYNAMIC
                   20044:        BHI  XR,DNAMP,PRTI1   JUMP IF ABOVE DYNAMIC
                   20045:        MOV  XR,DNAMP         IMMEDIATELY DELETE IT
                   20046: *
                   20047: *      DELETE ICBLK FROM DYNAMIC STORE
                   20048: *
                   20049: PRTI1  MOV  XR,-(XS)         STACK PTR FOR GTSTG
                   20050:        JSR  GTSTG            CONVERT TO STRING
                   20051:        PPM                   CONVERT ERROR IS IMPOSSIBLE
                   20052:        MOV  XR,DNAMP         RESET POINTER TO DELETE SCBLK
                   20053:        JSR  PRTST            PRINT INTEGER STRING
                   20054:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   20055:        EXI                   RETURN TO PRTIN CALLER
                   20056:        ENP                   END PROCEDURE PRTIN
                   20057:        EJC
                   20058: *
                   20059: *      PRTMI -- PRINT MESSAGE AND INTEGER
                   20060: *
                   20061: *      PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
                   20062: *      VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
                   20063: *      THE END OF COMPILATION).
                   20064: *
                   20065: *      JSR  PRTMI            CALL TO PRINT MESSAGE AND INTEGER
                   20066: *
                   20067: PRTMI  PRC  E,0              ENTRY POINT
                   20068:        JSR  PRTST            PRINT STRING MESSAGE
                   20069:        MOV  =PRTMF,PROFS     SET OFFSET TO COL 15
                   20070:        JSR  PRTIN            PRINT INTEGER
                   20071:        JSR  PRTNL            PRINT LINE
                   20072:        EXI                   RETURN TO PRTMI CALLER
                   20073:        ENP                   END PROCEDURE PRTMI
                   20074:        EJC
                   20075: *
                   20076: *      PRTMX  -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN.
                   20077: *
                   20078: *      JSR  PRTMX            CALL FOR PRINTING
                   20079: *      (WA,WB)               DESTROYED
                   20080: *
                   20081: PRTMX  PRC  E,0              ENTRY POINT
                   20082:        JSR  PRTST            PRINT STRING MESSAGE
                   20083:        MOV  =PRTMF,PROFS     SET PTR TO COLUMN 15
                   20084:        JSR  PRTIN            PRINT INTEGER
                   20085:        JSR  PRTIS            PRINT LINE
                   20086:        EXI                   RETURN
                   20087:        ENP                   END PROCEDURE PRTMX
                   20088:        EJC
                   20089: *
                   20090: *      PRTNL -- PRINT NEW LINE (END PRINT LINE)
                   20091: *
                   20092: *      PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
                   20093: *      THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
                   20094: *
                   20095: *      JSR  PRTNL            CALL TO PRINT LINE
                   20096: *
                   20097: PRTNL  PRC  R,0              ENTRY POINT
                   20098:        BNZ  HEADP,PRNL0      WERE HEADERS PRINTED
                   20099:        JSR  PRTPS            NO - PRINT THEM
                   20100: *
                   20101: *      CALL SYSPR
                   20102: *
                   20103: PRNL0  MOV  XR,-(XS)         SAVE ENTRY XR
                   20104:        MOV  WA,PRTSA         SAVE WA
                   20105:        MOV  WB,PRTSB         SAVE WB
                   20106:        MOV  PRBUF,XR         LOAD POINTER TO BUFFER
                   20107:        MOV  PROFS,WA         LOAD NUMBER OF CHARS IN BUFFER
                   20108:        JSR  SYSPR            CALL SYSTEM PRINT ROUTINE
                   20109:        PPM  PRNL2            JUMP IF FAILED
                   20110:        LCT  WA,PRLNW         LOAD LENGTH OF BUFFER IN WORDS
                   20111:        ADD  *SCHAR,XR        POINT TO CHARS OF BUFFER
                   20112:        MOV  NULLW,WB         GET WORD OF BLANKS
                   20113: *
                   20114: *      LOOP TO BLANK BUFFER
                   20115: *
                   20116: PRNL1  MOV  WB,(XR)+         STORE WORD OF BLANKS, BUMP PTR
                   20117:        BCT  WA,PRNL1         LOOP TILL ALL BLANKED
                   20118: *
                   20119: *      EXIT POINT
                   20120: *
                   20121:        MOV  PRTSB,WB         RESTORE WB
                   20122:        MOV  PRTSA,WA         RESTORE WA
                   20123:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   20124:        ZER  PROFS            RESET PRINT BUFFER POINTER
                   20125:        EXI                   RETURN TO PRTNL CALLER
                   20126: *
                   20127: *      FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE
                   20128: *
                   20129: PRNL2  BNZ  PRTEF,PRNL3      JUMP IF NOT FIRST TIME
                   20130:        MNZ  PRTEF            MARK FIRST OCCURRENCE
                   20131:        ERB  253,PRINT LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL
                   20132: *
                   20133: *      STOP AT ONCE
                   20134: *
                   20135: PRNL3  MOV  =NINI8,WB        ENDING CODE
                   20136:        MOV  KVSTN,WA         STATEMENT NUMBER
                   20137:        JSR  SYSEJ            STOP
                   20138:        ENP                   END PROCEDURE PRTNL
                   20139:        EJC
                   20140: *
                   20141: *      PRTNM -- PRINT VARIABLE NAME
                   20142: *
                   20143: *      PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
                   20144: *      NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
                   20145: *      NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
                   20146: *
                   20147: *      (XL)                  NAME BASE
                   20148: *      (WA)                  NAME OFFSET
                   20149: *      JSR  PRTNM            CALL TO PRINT NAME
                   20150: *      (WB,WC,RA)            DESTROYED
                   20151: *
                   20152: PRTNM  PRC  R,0              ENTRY POINT (RECURSIVE, SEE PRTVL)
                   20153:        MOV  WA,-(XS)         SAVE WA (OFFSET IS COLLECTABLE)
                   20154:        MOV  XR,-(XS)         SAVE ENTRY XR
                   20155:        MOV  XL,-(XS)         SAVE NAME BASE
                   20156:        BHI  XL,STATE,PRN02   JUMP IF NOT NATURAL VARIABLE
                   20157: *
                   20158: *      HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
                   20159: *      THAT THE NAME BASE POINTS INTO THE STATIC AREA.
                   20160: *
                   20161:        MOV  XL,XR            POINT TO VRBLK
                   20162:        JSR  PRTVN            PRINT NAME OF VARIABLE
                   20163: *
                   20164: *      COMMON EXIT POINT
                   20165: *
                   20166: PRN01  MOV  (XS)+,XL         RESTORE NAME BASE
                   20167:        MOV  (XS)+,XR         RESTORE ENTRY VALUE OF XR
                   20168:        MOV  (XS)+,WA         RESTORE WA
                   20169:        EXI                   RETURN TO PRTNM CALLER
                   20170: *
                   20171: *      HERE FOR CASE OF NON-NATURAL VARIABLE
                   20172: *
                   20173: PRN02  MOV  WA,WB            COPY NAME OFFSET
                   20174:        BNE  (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE
                   20175: *
                   20176: *      FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
                   20177: *
                   20178:        MOV  PDDFP(XL),XR     LOAD POINTER TO DFBLK
                   20179:        ADD  WA,XR            ADD NAME OFFSET
                   20180:        MOV  PDFOF(XR),XR     LOAD VRBLK POINTER FOR FIELD
                   20181:        JSR  PRTVN            PRINT FIELD NAME
                   20182:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   20183:        JSR  PRTCH            PRINT CHARACTER
                   20184:        EJC
                   20185: *
                   20186: *      PRTNM (CONTINUED)
                   20187: *
                   20188: *      NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
                   20189: *      CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
                   20190: *      VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
                   20191: *      VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
                   20192: *      OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
                   20193: *
                   20194: *      FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
                   20195: *      A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
                   20196: *
                   20197: PRN03  BNE  (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE)
                   20198:        MOV  TENXT(XL),XL     ELSE MOVE OUT ON CHAIN
                   20199:        BRN  PRN03            AND LOOP BACK
                   20200: *
                   20201: *      NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
                   20202: *      THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
                   20203: *      WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
                   20204: *      WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
                   20205: *      FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
                   20206: *
                   20207: PRN04  MOV  PRNMV,XR         POINT TO VRBLK WE FOUND LAST TIME
                   20208:        MOV  HSHTB,WA         POINT TO HASH TABLE IN CASE NOT
                   20209:        BRN  PRN07            JUMP INTO SEARCH FOR SPECIAL CHECK
                   20210: *
                   20211: *      LOOP THROUGH HASH SLOTS
                   20212: *
                   20213: PRN05  MOV  WA,XR            COPY SLOT POINTER
                   20214:        ICA  WA               BUMP SLOT POINTER
                   20215:        SUB  *VRNXT,XR        INTRODUCE STANDARD VRBLK OFFSET
                   20216: *
                   20217: *      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
                   20218: *
                   20219: PRN06  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON HASH CHAIN
                   20220: *
                   20221: *      MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
                   20222: *
                   20223: PRN07  MOV  XR,WC            COPY VRBLK POINTER
                   20224:        BZE  WC,PRN09         JUMP IF CHAIN END (OR PRNMV ZERO)
                   20225:        EJC
                   20226: *
                   20227: *      PRTNM (CONTINUED)
                   20228: *
                   20229: *      LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
                   20230: *
                   20231: PRN08  MOV  VRVAL(XR),XR     LOAD VALUE
                   20232:        BEQ  (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK
                   20233: *
                   20234: *      NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
                   20235: *
                   20236:        BEQ  XR,XL,PRN10      JUMP IF THIS MATCHES THE NAME BASE
                   20237:        MOV  WC,XR            ELSE POINT BACK TO THAT VRBLK
                   20238:        BRN  PRN06            AND LOOP BACK
                   20239: *
                   20240: *      HERE TO MOVE TO NEXT HASH SLOT
                   20241: *
                   20242: PRN09  BLT  WA,HSHTE,PRN05   LOOP BACK IF MORE TO GO
                   20243:        MOV  XL,XR            ELSE NOT FOUND, COPY VALUE POINTER
                   20244:        JSR  PRTVL            PRINT VALUE
                   20245:        BRN  PRN11            AND MERGE AHEAD
                   20246: *
                   20247: *      HERE WHEN WE FIND A MATCHING ENTRY
                   20248: *
                   20249: PRN10  MOV  WC,XR            COPY VRBLK POINTER
                   20250:        MOV  XR,PRNMV         SAVE FOR NEXT TIME IN
                   20251:        JSR  PRTVN            PRINT VARIABLE NAME
                   20252: *
                   20253: *      MERGE HERE IF NO ENTRY FOUND
                   20254: *
                   20255: PRN11  MOV  (XL),WC          LOAD FIRST WORD OF NAME BASE
                   20256:        BNE  WC,=B$PDT,PRN13  JUMP IF NOT PROGRAM DEFINED
                   20257: *
                   20258: *      FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
                   20259: *
                   20260:        MOV  =CH$RP,WA        LOAD RIGHT PAREN, MERGE
                   20261: *
                   20262: *      MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
                   20263: *
                   20264: PRN12  JSR  PRTCH            PRINT FINAL CHARACTER
                   20265:        MOV  WB,WA            RESTORE NAME OFFSET
                   20266:        BRN  PRN01            MERGE BACK TO EXIT
                   20267:        EJC
                   20268: *
                   20269: *      PRTNM (CONTINUED)
                   20270: *
                   20271: *      HERE FOR ARRAY OR TABLE
                   20272: *
                   20273: PRN13  MOV  =CH$BB,WA        LOAD LEFT BRACKET
                   20274:        JSR  PRTCH            AND PRINT IT
                   20275:        MOV  (XS),XL          RESTORE BLOCK POINTER
                   20276:        MOV  (XL),WC          LOAD TYPE WORD AGAIN
                   20277:        BNE  WC,=B$TET,PRN15  JUMP IF NOT TABLE
                   20278: *
                   20279: *      HERE FOR TABLE, PRINT SUBSCRIPT VALUE
                   20280: *
                   20281:        MOV  TESUB(XL),XR     LOAD SUBSCRIPT VALUE
                   20282:        MOV  WB,XL            SAVE NAME OFFSET
                   20283:        JSR  PRTVL            PRINT SUBSCRIPT VALUE
                   20284:        MOV  XL,WB            RESTORE NAME OFFSET
                   20285: *
                   20286: *      MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
                   20287: *
                   20288: PRN14  MOV  =CH$RB,WA        LOAD RIGHT BRACKET
                   20289:        BRN  PRN12            MERGE BACK TO PRINT IT
                   20290: *
                   20291: *      HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
                   20292: *
                   20293: PRN15  MOV  WB,WA            COPY NAME OFFSET
                   20294:        BTW  WA               CONVERT TO WORDS
                   20295:        BEQ  WC,=B$ART,PRN16  JUMP IF ARBLK
                   20296: *
                   20297: *      HERE FOR VECTOR
                   20298: *
                   20299:        SUB  =VCVLB,WA        ADJUST FOR STANDARD FIELDS
                   20300:        MTI  WA               MOVE TO INTEGER ACCUM
                   20301:        JSR  PRTIN            PRINT LINEAR SUBSCRIPT
                   20302:        BRN  PRN14            MERGE BACK FOR RIGHT BRACKET
                   20303:        EJC
                   20304: *
                   20305: *      PRTNM (CONTINUED)
                   20306: *
                   20307: *      HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
                   20308: *      OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
                   20309: *      THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
                   20310: *      STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
                   20311: *
                   20312: PRN16  MOV  AROFS(XL),WC     LOAD LENGTH OF BOUNDS INFO
                   20313:        ICA  WC               ADJUST FOR ARPRO FIELD
                   20314:        BTW  WC               CONVERT TO WORDS
                   20315:        SUB  WC,WA            GET LINEAR ZERO-ORIGIN SUBSCRIPT
                   20316:        MTI  WA               GET INTEGER VALUE
                   20317:        LCT  WA,ARNDM(XL)     SET NUM OF DIMENSIONS AS LOOP COUNT
                   20318:        ADD  AROFS(XL),XL     POINT PAST BOUNDS INFORMATION
                   20319:        SUB  *ARLBD,XL        SET OK OFFSET FOR PROPER PTR LATER
                   20320: *
                   20321: *      LOOP TO STACK SUBSCRIPT OFFSETS
                   20322: *
                   20323: PRN17  SUB  *ARDMS,XL        POINT TO NEXT SET OF BOUNDS
                   20324:        STI  PRNSI            SAVE CURRENT OFFSET
                   20325:        RMI  ARDIM(XL)        GET REMAINDER ON DIVIDING BY DIMENS
                   20326:        MFI  -(XS)            STORE ON STACK (ONE WORD)
                   20327:        LDI  PRNSI            RELOAD ARGUMENT
                   20328:        DVI  ARDIM(XL)        DIVIDE TO GET QUOTIENT
                   20329:        BCT  WA,PRN17         LOOP TILL ALL STACKED
                   20330:        ZER  XR               SET OFFSET TO FIRST SET OF BOUNDS
                   20331:        LCT  WB,ARNDM(XL)     LOAD COUNT OF DIMS TO CONTROL LOOP
                   20332:        BRN  PRN19            JUMP INTO PRINT LOOP
                   20333: *
                   20334: *      LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
                   20335: *      THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
                   20336: *
                   20337: PRN18  MOV  =CH$CM,WA        LOAD A COMMA
                   20338:        JSR  PRTCH            PRINT IT
                   20339: *
                   20340: *      MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
                   20341: *
                   20342: PRN19  MTI  (XS)+            LOAD SUBSCRIPT OFFSET AS INTEGER
                   20343:        ADD  XR,XL            POINT TO CURRENT LBD
                   20344:        ADI  ARLBD(XL)        ADD LBD TO GET SIGNED SUBSCRIPT
                   20345:        SUB  XR,XL            POINT BACK TO START OF ARBLK
                   20346:        JSR  PRTIN            PRINT SUBSCRIPT
                   20347:        ADD  *ARDMS,XR        BUMP OFFSET TO NEXT BOUNDS
                   20348:        BCT  WB,PRN18         LOOP BACK TILL ALL PRINTED
                   20349:        BRN  PRN14            MERGE BACK TO PRINT RIGHT BRACKET
                   20350:        ENP                   END PROCEDURE PRTNM
                   20351:        EJC
                   20352: *
                   20353: *      PRTNV -- PRINT NAME VALUE
                   20354: *
                   20355: *      PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
                   20356: *      A LINE OF THE FORM
                   20357: *
                   20358: *      NAME = VALUE
                   20359: *
                   20360: *      NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
                   20361: *
                   20362: *      (XL)                  NAME BASE
                   20363: *      (WA)                  NAME OFFSET
                   20364: *      JSR  PRTNV            CALL TO PRINT NAME = VALUE
                   20365: *      (WB,WC,RA)            DESTROYED
                   20366: *
                   20367: PRTNV  PRC  E,0              ENTRY POINT
                   20368:        JSR  PRTNM            PRINT ARGUMENT NAME
                   20369:        MOV  XR,-(XS)         SAVE ENTRY XR
                   20370:        MOV  WA,-(XS)         SAVE NAME OFFSET (COLLECTABLE)
                   20371:        MOV  =TMBEB,XR        POINT TO BLANK EQUAL BLANK
                   20372:        JSR  PRTST            PRINT IT
                   20373:        MOV  XL,XR            COPY NAME BASE
                   20374:        ADD  WA,XR            POINT TO VALUE
                   20375:        MOV  (XR),XR          LOAD VALUE POINTER
                   20376:        JSR  PRTVL            PRINT VALUE
                   20377:        JSR  PRTNL            TERMINATE LINE
                   20378:        MOV  (XS)+,WA         RESTORE NAME OFFSET
                   20379:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   20380:        EXI                   RETURN TO CALLER
                   20381:        ENP                   END PROCEDURE PRTNV
                   20382:        EJC
                   20383: *
                   20384: *      PRTPG  -- PRINT A PAGE THROW
                   20385: *
                   20386: *      PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
                   20387: *      LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN.
                   20388: *
                   20389: *      JSR  PRTPG            CALL FOR PAGE EJECT
                   20390: *
                   20391: PRTPG  PRC  E,0              ENTRY POINT
                   20392:        BEQ  STAGE,=STGXT,PRP01 JUMP IF EXECUTION TIME
                   20393:        BZE  LSTLC,PRP06      RETURN IF TOP OF PAGE ALREADY
                   20394:        ZER  LSTLC            CLEAR LINE COUNT
                   20395: *
                   20396: *      CHECK TYPE OF LISTING
                   20397: *
                   20398: PRP01  MOV  XR,-(XS)         PRESERVE XR
                   20399:        BNZ  PRSTD,PRP02      EJECT IF FLAG SET
                   20400:        BNZ  PRICH,PRP03      JUMP IF INTERACTIVE LISTING CHANNEL
                   20401:        BZE  PRECL,PRP03      JUMP IF COMPACT LISTING
                   20402: *
                   20403: *      PERFORM AN EJECT
                   20404: *
                   20405: PRP02  JSR  SYSEP            EJECT
                   20406:        BRN  PRP04            MERGE
                   20407: *
                   20408: *      COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT
                   20409: *      BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET.
                   20410: *
                   20411: *
                   20412: PRP03  MOV  HEADP,XR         REMEMBER HEADP
                   20413:        MNZ  HEADP            SET TO AVOID REPEATED PRTPG CALLS
                   20414:        JSR  PRTNL            PRINT BLANK LINE
                   20415:        JSR  PRTNL            PRINT BLANK LINE
                   20416:        JSR  PRTNL            PRINT BLANK LINE
                   20417:        MOV  =NUM03,LSTLC     COUNT BLANK LINES
                   20418:        MOV  XR,HEADP         RESTORE HEADER FLAG
                   20419:        EJC
                   20420: *
                   20421: *      PRPTG (CONTINUED)
                   20422: *
                   20423: *      PRINT THE HEADING
                   20424: *
                   20425: PRP04  BNZ  HEADP,PRP05      JUMP IF HEADER LISTED
                   20426:        MNZ  HEADP            MARK HEADERS PRINTED
                   20427:        MOV  XL,-(XS)         KEEP XL
                   20428:        MOV  =HEADR,XR        POINT TO LISTING HEADER
                   20429:        JSR  PRTST            PLACE IT
                   20430:        JSR  SYSID            GET SYSTEM IDENTIFICATION
                   20431:        JSR  PRTST            APPEND EXTRA CHARS
                   20432:        JSR  PRTNL            PRINT IT
                   20433:        MOV  XL,XR            EXTRA HEADER LINE
                   20434:        JSR  PRTST            PLACE IT
                   20435:        JSR  PRTNL            PRINT IT
                   20436:        JSR  PRTNL            PRINT A BLANK
                   20437:        JSR  PRTNL            AND ANOTHER
                   20438:        ADD  =NUM04,LSTLC     FOUR HEADER LINES PRINTED
                   20439:        MOV  (XS)+,XL         RESTORE XL
                   20440: *
                   20441: *      MERGE IF HEADER NOT PRINTED
                   20442: *
                   20443: PRP05  MOV  (XS)+,XR         RESTORE XR
                   20444: *
                   20445: *      RETURN
                   20446: *
                   20447: PRP06  EXI                   RETURN
                   20448:        ENP                   END PROCEDURE PRTPG
                   20449:        EJC
                   20450: *
                   20451: *      PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
                   20452: *
                   20453: *      IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
                   20454: *      AN EJECT BE DONE
                   20455: *
                   20456: *      JSR  PRTPS            CALL FOR EJECT
                   20457: *
                   20458: PRTPS  PRC  E,0              ENTRY POINT
                   20459:        MOV  PRSTO,PRSTD      COPY OPTION FLAG
                   20460:        JSR  PRTPG            PRINT PAGE
                   20461:        ZER  PRSTD            CLEAR FLAG
                   20462:        EXI                   RETURN
                   20463:        ENP                   END PROCEDURE PRTPS
                   20464:        EJC
                   20465: *
                   20466: *      PRTSN -- PRINT STATEMENT NUMBER
                   20467: *
                   20468: *      PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
                   20469: *      ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
                   20470: *      FORMAT OF THE OUTPUT GENERATED IS.
                   20471: *
                   20472: *      ***NNNNN**** III.....IIII
                   20473: *
                   20474: *      NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
                   20475: *      BY ASTERISKS (E.G. *******9****)
                   20476: *
                   20477: *      III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
                   20478: *      OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
                   20479: *
                   20480: *      JSR  PRTSN            CALL TO PRINT STATEMENT NUMBER
                   20481: *      (WC)                  DESTROYED
                   20482: *
                   20483: PRTSN  PRC  E,0              ENTRY POINT
                   20484:        MOV  XR,-(XS)         SAVE ENTRY XR
                   20485:        MOV  WA,PRSNA         SAVE ENTRY WA
                   20486:        MOV  =TMASB,XR        POINT TO ASTERISKS
                   20487:        JSR  PRTST            PRINT ASTERISKS
                   20488:        MOV  =NUM04,PROFS     POINT INTO MIDDLE OF ASTERISKS
                   20489:        MTI  KVSTN            LOAD STATEMENT NUMBER AS INTEGER
                   20490:        JSR  PRTIN            PRINT INTEGER STATEMENT NUMBER
                   20491:        MOV  =PRSNF,PROFS     POINT PAST ASTERISKS PLUS BLANK
                   20492:        MOV  KVFNC,XR         GET FNCLEVEL
                   20493:        MOV  =CH$LI,WA        SET LETTER I
                   20494: *
                   20495: *      LOOP TO GENERATE LETTER I FNCLEVEL TIMES
                   20496: *
                   20497: PRSN1  BZE  XR,PRSN2         JUMP IF ALL SET
                   20498:        JSR  PRTCH            ELSE PRINT AN I
                   20499:        DCV  XR               DECREMENT COUNTER
                   20500:        BRN  PRSN1            LOOP BACK
                   20501: *
                   20502: *      MERRE WITH ALL LETTER I CHARACTERS GENERATED
                   20503: *
                   20504: PRSN2  MOV  =CH$BL,WA        GET BLANK
                   20505:        JSR  PRTCH            PRINT BLANK
                   20506:        MOV  PRSNA,WA         RESTORE ENTRY WA
                   20507:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   20508:        EXI                   RETURN TO PRTSN CALLER
                   20509:        ENP                   END PROCEDURE PRTSN
                   20510:        EJC
                   20511: *
                   20512: *      PRTST -- PRINT STRING
                   20513: *
                   20514: *      PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER
                   20515: *
                   20516: *      SEE PRTNL FOR GLOBAL LOCATIONS USED
                   20517: *
                   20518: *      NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
                   20519: *      IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
                   20520: *
                   20521: *      (XR)                  STRING TO BE PRINTED
                   20522: *      JSR  PRTST            CALL TO PRINT STRING
                   20523: *      (PROFS)               UPDATED PAST CHARS PLACED
                   20524: *
                   20525: PRTST  PRC  R,0              ENTRY POINT
                   20526:        BNZ  HEADP,PRST0      WERE HEADERS PRINTED
                   20527:        JSR  PRTPS            NO - PRINT THEM
                   20528: *
                   20529: *      CALL SYSPR
                   20530: *
                   20531: PRST0  MOV  WA,PRSVA         SAVE WA
                   20532:        MOV  WB,PRSVB         SAVE WB
                   20533:        ZER  WB               SET CHARS PRINTED COUNT TO ZERO
                   20534: *
                   20535: *      LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
                   20536: *
                   20537: PRST1  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   20538:        SUB  WB,WA            SUBTRACT COUNT OF CHARS ALREADY OUT
                   20539:        BZE  WA,PRST4         JUMP TO EXIT IF NONE LEFT
                   20540:        MOV  XL,-(XS)         ELSE STACK ENTRY XL
                   20541:        MOV  XR,-(XS)         SAVE ARGUMENT
                   20542:        MOV  XR,XL            COPY FOR EVENTUAL MOVE
                   20543:        MOV  PRLEN,XR         LOAD PRINT BUFFER LENGTH
                   20544:        SUB  PROFS,XR         GET CHARS LEFT IN PRINT BUFFER
                   20545:        BNZ  XR,PRST2         SKIP IF ROOM LEFT ON THIS LINE
                   20546:        JSR  PRTNL            ELSE PRINT THIS LINE
                   20547:        MOV  PRLEN,XR         AND SET FULL WIDTH AVAILABLE
                   20548:        EJC
                   20549: *
                   20550: *      PRTST (CONTINUED)
                   20551: *
                   20552: *      HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
                   20553: *
                   20554: PRST2  BLO  WA,XR,PRST3      JUMP IF ROOM FOR REST OF STRING
                   20555:        MOV  XR,WA            ELSE SET TO FILL LINE
                   20556: *
                   20557: *      MERGE HERE WITH CHARACTER COUNT IN WA
                   20558: *
                   20559: PRST3  MOV  PRBUF,XR         POINT TO PRINT BUFFER
                   20560:        PLC  XL,WB            POINT TO LOCATION IN STRING
                   20561:        PSC  XR,PROFS         POINT TO LOCATION IN BUFFER
                   20562:        ADD  WA,WB            BUMP STRING CHARS COUNT
                   20563:        ADD  WA,PROFS         BUMP BUFFER POINTER
                   20564:        MOV  WB,PRSVC         PRESERVE CHAR COUNTER
                   20565:        MVC                   MOVE CHARACTERS TO BUFFER
                   20566:        MOV  PRSVC,WB         RECOVER CHAR COUNTER
                   20567:        MOV  (XS)+,XR         RESTORE ARGUMENT POINTER
                   20568:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   20569:        BRN  PRST1            LOOP BACK TO TEST FOR MORE
                   20570: *
                   20571: *      HERE TO EXIT AFTER PRINTING STRING
                   20572: *
                   20573: PRST4  MOV  PRSVB,WB         RESTORE ENTRY WB
                   20574:        MOV  PRSVA,WA         RESTORE ENTRY WA
                   20575:        EXI                   RETURN TO PRTST CALLER
                   20576:        ENP                   END PROCEDURE PRTST
                   20577:        EJC
                   20578: *
                   20579: *      PRTTR -- PRINT TO TERMINAL
                   20580: *
                   20581: *      CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO
                   20582: *      ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS.
                   20583: *
                   20584: *      JSR  PRTTR            CALL FOR PRINT
                   20585: *      (WA,WB)               DESTROYED
                   20586: *
                   20587: PRTTR  PRC  E,0              ENTRY POINT
                   20588:        MOV  XR,-(XS)         SAVE XR
                   20589:        JSR  PRTIC            PRINT BUFFER CONTENTS
                   20590:        MOV  PRBUF,XR         POINT TO PRINT BFR TO CLEAR IT
                   20591:        LCT  WA,PRLNW         GET BUFFER LENGTH
                   20592:        ADD  *SCHAR,XR        POINT PAST SCBLK HEADER
                   20593:        MOV  NULLW,WB         GET BLANKS
                   20594: *
                   20595: *      LOOP TO CLEAR BUFFER
                   20596: *
                   20597: PRTT1  MOV  WB,(XR)+         CLEAR A WORD
                   20598:        BCT  WA,PRTT1         LOOP
                   20599:        ZER  PROFS            RESET PROFS
                   20600:        MOV  (XS)+,XR         RESTORE XR
                   20601:        EXI                   RETURN
                   20602:        ENP                   END PROCEDURE PRTTR
                   20603:        EJC
                   20604: *
                   20605: *      PRTVL -- PRINT A VALUE
                   20606: *
                   20607: *      PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
                   20608: *      A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
                   20609: *
                   20610: *      (XR)                  VALUE TO BE PRINTED
                   20611: *      JSR  PRTVL            CALL TO PRINT VALUE
                   20612: *      (WA,WB,WC,RA)         DESTROYED
                   20613: *
                   20614: PRTVL  PRC  R,0              ENTRY POINT, RECURSIVE
                   20615:        MOV  XL,-(XS)         SAVE ENTRY XL
                   20616:        MOV  XR,-(XS)         SAVE ARGUMENT
                   20617:        CHK                   CHECK FOR STACK OVERFLOW
                   20618: *
                   20619: *      LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
                   20620: *
                   20621: PRV01  MOV  IDVAL(XR),PRVSI  COPY IDVAL (IF ANY)
                   20622:        MOV  (XR),XL          LOAD FIRST WORD OF BLOCK
                   20623:        LEI  XL               LOAD ENTRY POINT ID
                   20624:        BSW  XL,BL$$T,PRV02   SWITCH ON BLOCK TYPE
                   20625:        IFF  BL$TR,PRV04      TRBLK
                   20626:        IFF  BL$AR,PRV05      ARBLK
                   20627:        IFF  BL$IC,PRV08      ICBLK
                   20628:        IFF  BL$NM,PRV09      NMBLK
                   20629:        IFF  BL$PD,PRV10      PDBLK
                   20630: .IF    .CNRA
                   20631: .ELSE
                   20632:        IFF  BL$RC,PRV08      RCBLK
                   20633: .FI
                   20634:        IFF  BL$SC,PRV11      SCBLK
                   20635:        IFF  BL$SE,PRV12      SEBLK
                   20636:        IFF  BL$TB,PRV13      TBBLK
                   20637:        IFF  BL$VC,PRV13      VCBLK
                   20638: .IF    .CNBF
                   20639: .ELSE
                   20640:        IFF  BL$BC,PRV15      BCBLK
                   20641: .FI
                   20642:        ESW                   END OF SWITCH ON BLOCK TYPE
                   20643: *
                   20644: *      HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
                   20645: *
                   20646: PRV02  JSR  DTYPE            GET DATATYPE NAME
                   20647:        JSR  PRTST            PRINT DATATYPE NAME
                   20648: *
                   20649: *      COMMON EXIT POINT
                   20650: *
                   20651: PRV03  MOV  (XS)+,XR         RELOAD ARGUMENT
                   20652:        MOV  (XS)+,XL         RESTORE XL
                   20653:        EXI                   RETURN TO PRTVL CALLER
                   20654: *
                   20655: *      HERE FOR TRBLK
                   20656: *
                   20657: PRV04  MOV  TRVAL(XR),XR     LOAD REAL VALUE
                   20658:        BRN  PRV01            AND LOOP BACK
                   20659:        EJC
                   20660: *
                   20661: *      PRTVL (CONTINUED)
                   20662: *
                   20663: *      HERE FOR ARRAY (ARBLK)
                   20664: *
                   20665: *      PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
                   20666: *
                   20667: PRV05  MOV  XR,XL            PRESERVE ARGUMENT
                   20668:        MOV  =SCARR,XR        POINT TO DATATYPE NAME (ARRAY)
                   20669:        JSR  PRTST            PRINT IT
                   20670:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   20671:        JSR  PRTCH            PRINT LEFT PAREN
                   20672:        ADD  AROFS(XL),XL     POINT TO PROTOTYPE
                   20673:        MOV  (XL),XR          LOAD PROTOTYPE
                   20674:        JSR  PRTST            PRINT PROTOTYPE
                   20675: *
                   20676: *      VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
                   20677: *
                   20678: PRV06  MOV  =CH$RP,WA        LOAD RIGHT PAREN
                   20679:        JSR  PRTCH            PRINT RIGHT PAREN
                   20680: *
                   20681: *      PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
                   20682: *
                   20683: PRV07  MOV  =CH$BL,WA        LOAD BLANK
                   20684:        JSR  PRTCH            PRINT IT
                   20685:        MOV  =CH$NM,WA        LOAD NUMBER SIGN
                   20686:        JSR  PRTCH            PRINT IT
                   20687:        MTI  PRVSI            GET IDVAL
                   20688:        JSR  PRTIN            PRINT ID NUMBER
                   20689:        BRN  PRV03            BACK TO EXIT
                   20690: *
                   20691: *      HERE FOR INTEGER (ICBLK), REAL (RCBLK)
                   20692: *
                   20693: *      PRINT CHARACTER REPRESENTATION OF VALUE
                   20694: *
                   20695: PRV08  MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   20696:        JSR  GTSTG            CONVERT TO STRING
                   20697:        PPM                   ERROR RETURN IS IMPOSSIBLE
                   20698:        JSR  PRTST            PRINT THE STRING
                   20699:        MOV  XR,DNAMP         DELETE GARBAGE STRING FROM STORAGE
                   20700:        BRN  PRV03            BACK TO EXIT
                   20701:        EJC
                   20702: *
                   20703: *      PRTVL (CONTINUED)
                   20704: *
                   20705: *      NAME (NMBLK)
                   20706: *
                   20707: *      FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
                   20708: *      FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
                   20709: *
                   20710: PRV09  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   20711:        MOV  (XL),WA          LOAD FIRST WORD OF BLOCK
                   20712:        BEQ  WA,=B$KVT,PRV02  JUST PRINT NAME IF KEYWORD
                   20713:        BEQ  WA,=B$EVT,PRV02  JUST PRINT NAME IF EXPRESSION VAR
                   20714:        MOV  =CH$DT,WA        ELSE GET DOT
                   20715:        JSR  PRTCH            AND PRINT IT
                   20716:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
                   20717:        JSR  PRTNM            PRINT NAME
                   20718:        BRN  PRV03            BACK TO EXIT
                   20719: *
                   20720: *      PROGRAM DATATYPE (PDBLK)
                   20721: *
                   20722: *      PRINT DATATYPE NAME CH$BL CH$NM IDVAL
                   20723: *
                   20724: PRV10  JSR  DTYPE            GET DATATYPE NAME
                   20725:        JSR  PRTST            PRINT DATATYPE NAME
                   20726:        BRN  PRV07            MERGE BACK TO PRINT ID
                   20727: *
                   20728: *      HERE FOR STRING (SCBLK)
                   20729: *
                   20730: *      PRINT QUOTE STRING-CHARACTERS QUOTE
                   20731: *
                   20732: PRV11  MOV  =CH$SQ,WA        LOAD SINGLE QUOTE
                   20733:        JSR  PRTCH            PRINT QUOTE
                   20734:        JSR  PRTST            PRINT STRING VALUE
                   20735:        JSR  PRTCH            PRINT ANOTHER QUOTE
                   20736:        BRN  PRV03            BACK TO EXIT
                   20737:        EJC
                   20738: *
                   20739: *      PRTVL (CONTINUED)
                   20740: *
                   20741: *      HERE FOR SIMPLE EXPRESSION (SEBLK)
                   20742: *
                   20743: *      PRINT ASTERISK VARIABLE-NAME
                   20744: *
                   20745: PRV12  MOV  =CH$AS,WA        LOAD ASTERISK
                   20746:        JSR  PRTCH            PRINT ASTERISK
                   20747:        MOV  SEVAR(XR),XR     LOAD VARIABLE POINTER
                   20748:        JSR  PRTVN            PRINT VARIABLE NAME
                   20749:        BRN  PRV03            JUMP BACK TO EXIT
                   20750: *
                   20751: *      HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
                   20752: *
                   20753: *      PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
                   20754: *
                   20755: PRV13  MOV  XR,XL            PRESERVE ARGUMENT
                   20756:        JSR  DTYPE            GET DATATYPE NAME
                   20757:        JSR  PRTST            PRINT DATATYPE NAME
                   20758:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   20759:        JSR  PRTCH            PRINT LEFT PAREN
                   20760:        MOV  TBLEN(XL),WA     LOAD LENGTH OF BLOCK (=VCLEN)
                   20761:        BTW  WA               CONVERT TO WORD COUNT
                   20762:        SUB  =TBSI$,WA        ALLOW FOR STANDARD FIELDS
                   20763:        BEQ  (XL),=B$TBT,PRV14 JUMP IF TABLE
                   20764:        ADD  =VCTBD,WA        FOR VCBLK, ADJUST SIZE
                   20765: *
                   20766: *      PRINT PROTOTYPE
                   20767: *
                   20768: PRV14  MTI  WA               MOVE AS INTEGER
                   20769:        JSR  PRTIN            PRINT INTEGER PROTOTYPE
                   20770:        BRN  PRV06            MERGE BACK FOR REST
                   20771: .IF    .CNBF
                   20772: .ELSE
                   20773:        EJC
                   20774: *
                   20775: *      PRTVL (CONTINUED)
                   20776: *
                   20777: *      HERE FOR BUFFER (BCBLK)
                   20778: *
                   20779: PRV15  MOV  XR,XL            PRESERVE ARGUMENT
                   20780:        MOV  =SCBUF,XR        POINT TO DATATYPE NAME (BUFFER)
                   20781:        JSR  PRTST            PRINT IT
                   20782:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   20783:        JSR  PRTCH            PRINT LEFT PAREN
                   20784:        MOV  BCBUF(XL),XR     POINT TO BFBLK
                   20785:        MTI  BFALC(XR)        LOAD ALLOCATION SIZE
                   20786:        JSR  PRTIN            PRINT IT
                   20787:        MOV  =CH$CM,WA        LOAD COMMA
                   20788:        JSR  PRTCH            PRINT IT
                   20789:        MTI  BCLEN(XL)        LOAD DEFINED LENGTH
                   20790:        JSR  PRTIN            PRINT IT
                   20791:        BRN  PRV06            MERGE TO FINISH UP
                   20792: .FI
                   20793:        ENP                   END PROCEDURE PRTVL
                   20794:        EJC
                   20795: *
                   20796: *      PRTVN -- PRINT NATURAL VARIABLE NAME
                   20797: *
                   20798: *      PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
                   20799: *
                   20800: *      (XR)                  POINTER TO VRBLK
                   20801: *      JSR  PRTVN            CALL TO PRINT VARIABLE NAME
                   20802: *
                   20803: PRTVN  PRC  E,0              ENTRY POINT
                   20804:        MOV  XR,-(XS)         STACK VRBLK POINTER
                   20805:        ADD  *VRSOF,XR        POINT TO POSSIBLE STRING NAME
                   20806:        BNZ  SCLEN(XR),PRVN1  JUMP IF NOT SYSTEM VARIABLE
                   20807:        MOV  VRSVO(XR),XR     POINT TO SVBLK WITH NAME
                   20808: *
                   20809: *      MERGE HERE WITH DUMMY SCBLK POINTER IN XR
                   20810: *
                   20811: PRVN1  JSR  PRTST            PRINT STRING NAME OF VARIABLE
                   20812:        MOV  (XS)+,XR         RESTORE VRBLK POINTER
                   20813:        EXI                   RETURN TO PRTVN CALLER
                   20814:        ENP                   END PROCEDURE PRTVN
                   20815: .IF    .CNRA
                   20816: .ELSE
                   20817:        EJC
                   20818: *
                   20819: *      RCBLD -- BUILD A REAL BLOCK
                   20820: *
                   20821: *      (RA)                  REAL VALUE FOR RCBLK
                   20822: *      JSR  RCBLD            CALL TO BUILD REAL BLOCK
                   20823: *      (XR)                  POINTER TO RESULT RCBLK
                   20824: *      (WA)                  DESTROYED
                   20825: *
                   20826: RCBLD  PRC  E,0              ENTRY POINT
                   20827:        MOV  DNAMP,XR         LOAD POINTER TO NEXT AVAILABLE LOC
                   20828:        ADD  *RCSI$,XR        POINT PAST NEW RCBLK
                   20829:        BLO  XR,DNAME,RCBL1   JUMP IF THERE IS ROOM
                   20830:        MOV  *RCSI$,WA        ELSE LOAD RCBLK LENGTH
                   20831:        JSR  ALLOC            USE STANDARD ALLOCATOR TO GET BLOCK
                   20832:        ADD  WA,XR            POINT PAST BLOCK TO MERGE
                   20833: *
                   20834: *      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
                   20835: *
                   20836: RCBL1  MOV  XR,DNAMP         SET NEW POINTER
                   20837:        SUB  *RCSI$,XR        POINT BACK TO START OF BLOCK
                   20838:        MOV  =B$RCL,(XR)      STORE TYPE WORD
                   20839:        STR  RCVAL(XR)        STORE REAL VALUE IN RCBLK
                   20840:        EXI                   RETURN TO RCBLD CALLER
                   20841:        ENP                   END PROCEDURE RCBLD
                   20842: .FI
                   20843:        EJC
                   20844: *
                   20845: *      READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
                   20846: *
                   20847: *      READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
                   20848: *      CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
                   20849: *      LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
                   20850: *      SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
                   20851: *
                   20852: *      JSR  READR            CALL TO READ NEXT IMAGE
                   20853: *      (XR)                  PTR TO NEXT IMAGE (0 IF NONE)
                   20854: *      (R$CNI)               COPY OF POINTER
                   20855: *      (WA,WB,WC,XL)         DESTROYED
                   20856: *
                   20857: READR  PRC  E,0              ENTRY POINT
                   20858:        MOV  R$CNI,XR         GET PTR TO NEXT IMAGE
                   20859:        BNZ  XR,READ3         EXIT IF ALREADY READ
                   20860:        BNE  STAGE,=STGIC,READ3 EXIT IF NOT INITIAL COMPILE
                   20861:        MOV  CSWIN,WA         MAX READ LENGTH
                   20862:        JSR  ALOCS            ALLOCATE BUFFER
                   20863:        JSR  SYSRD            READ INPUT IMAGE
                   20864:        PPM  READ4            JUMP IF END OF FILE
                   20865:        MNZ  WB               SET TRIMR TO PERFORM TRIM
                   20866:        BLE  SCLEN(XR),CSWIN,READ1  USE SMALLER OF STRING LNTH ..
                   20867:        MOV  CSWIN,SCLEN(XR)  ... AND XXX OF -INXXX
                   20868: *
                   20869: *      PERFORM THE TRIM
                   20870: *
                   20871: READ1  JSR  TRIMR            TRIM TRAILING BLANKS
                   20872: *
                   20873: *      MERGE HERE AFTER READ
                   20874: *
                   20875: READ2  MOV  XR,R$CNI         STORE COPY OF POINTER
                   20876: *
                   20877: *      MERGE HERE IF NO READ ATTEMPTED
                   20878: *
                   20879: READ3  EXI                   RETURN TO READR CALLER
                   20880: *
                   20881: *      HERE ON END OF FILE
                   20882: *
                   20883: READ4  MOV  XR,DNAMP         POP UNUSED SCBLK
                   20884:        ZER  XR               ZERO PTR AS RESULT
                   20885:        BRN  READ2            MERGE
                   20886:        ENP                   END PROCEDURE READR
                   20887:        EJC
                   20888: *
                   20889: *      SBSTR -- BUILD A SUBSTRING
                   20890: *
                   20891: *      (XL)                  PTR TO SCBLK/BFBLK WITH CHARS
                   20892: *      (WA)                  NUMBER OF CHARS IN SUBSTRING
                   20893: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
                   20894: *      JSR  SBSTR            CALL TO BUILD SUBSTRING
                   20895: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
                   20896: *      (XL)                  ZERO
                   20897: *      (WA,WB,WC,XL,IA)      DESTROYED
                   20898: *
                   20899: *      NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
                   20900: *      (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
                   20901: *      VARIABLE AS A STANDARD STRING VALUE.
                   20902: *
                   20903: SBSTR  PRC  E,0              ENTRY POINT
                   20904:        BZE  WA,SBST2         JUMP IF NULL SUBSTRING
                   20905:        JSR  ALOCS            ELSE ALLOCATE SCBLK
                   20906:        MOV  WC,WA            MOVE NUMBER OF CHARACTERS
                   20907:        MOV  XR,WC            SAVE PTR TO NEW SCBLK
                   20908:        PLC  XL,WB            PREPARE TO LOAD CHARS FROM OLD BLK
                   20909:        PSC  XR               PREPARE TO STORE CHARS IN NEW BLK
                   20910:        MVC                   MOVE CHARACTERS TO NEW STRING
                   20911:        MOV  WC,XR            THEN RESTORE SCBLK POINTER
                   20912: *
                   20913: *      RETURN POINT
                   20914: *
                   20915: SBST1  ZER  XL               CLEAR GARBAGE POINTER IN XL
                   20916:        EXI                   RETURN TO SBSTR CALLER
                   20917: *
                   20918: *      HERE FOR NULL SUBSTRING
                   20919: *
                   20920: SBST2  MOV  =NULLS,XR        SET NULL STRING AS RESULT
                   20921:        BRN  SBST1            RETURN
                   20922:        ENP                   END PROCEDURE SBSTR
                   20923:        EJC
                   20924: *
                   20925: *      SCANE -- SCAN AN ELEMENT
                   20926: *
                   20927: *      SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
                   20928: *      TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
                   20929: *
                   20930: *      (SCNCC)               NON-ZERO IF CALLED FROM CNCRD
                   20931: *      JSR  SCANE            CALL TO SCAN ELEMENT
                   20932: *      (XR)                  RESULT POINTER (SEE BELOW)
                   20933: *      (XL)                  SYNTAX TYPE CODE (T$XXX)
                   20934: *
                   20935: *      THE FOLLOWING GLOBAL LOCATIONS ARE USED.
                   20936: *
                   20937: *      R$CIM                 POINTER TO STRING BLOCK (SCBLK)
                   20938: *                            FOR CURRENT INPUT IMAGE.
                   20939: *
                   20940: *      R$CNI                 POINTER TO NEXT INPUT IMAGE STRING
                   20941: *                            POINTER (ZERO IF NONE).
                   20942: *
                   20943: *      R$SCP                 SAVE POINTER (EXIT XR) FROM LAST
                   20944: *                            CALL IN CASE RESCAN IS SET.
                   20945: *
                   20946: *      SCNBL                 THIS LOCATION IS SET NON-ZERO ON
                   20947: *                            EXIT IF SCANE SCANNED PAST BLANKS
                   20948: *                            BEFORE LOCATING THE CURRENT ELEMENT
                   20949: *                            THE END OF A LINE COUNTS AS BLANKS.
                   20950: *
                   20951: *      SCNCC                 CNCRD SETS THIS NON-ZERO TO SCAN
                   20952: *                            CONTROL CARD NAMES AND CLEARS IT
                   20953: *                            ON RETURN
                   20954: *
                   20955: *      SCNIL                 LENGTH OF CURRENT INPUT IMAGE
                   20956: *
                   20957: *      SCNGO                 IF SET NON-ZERO ON ENTRY, F AND S
                   20958: *                            ARE RETURNED AS SEPARATE SYNTAX
                   20959: *                            TYPES (NOT LETTERS) (GOTO PRO-
                   20960: *                            CESSING). SCNGO IS RESET ON EXIT.
                   20961: *
                   20962: *      SCNPT                 OFFSET TO CURRENT LOC IN R$CIM
                   20963: *
                   20964: *      SCNRS                 IF SET NON-ZERO ON ENTRY, SCANE
                   20965: *                            RETURNS THE SAME RESULT AS ON THE
                   20966: *                            LAST CALL (RESCAN). SCNRS IS RESET
                   20967: *                            ON EXIT FROM ANY CALL TO SCANE.
                   20968: *
                   20969: *      SCNTP                 SAVE SYNTAX TYPE FROM LAST
                   20970: *                            CALL (IN CASE RESCAN IS SET).
                   20971:        EJC
                   20972: *
                   20973: *      SCANE (CONTINUED)
                   20974: *
                   20975: *
                   20976: *
                   20977: *      ELEMENT SCANNED       XL        XR
                   20978: *      ---------------       --        --
                   20979: *
                   20980: *      CONTROL CARD NAME     0         POINTER TO SCBLK FOR NAME
                   20981: *
                   20982: *      UNARY OPERATOR        T$UOP     PTR TO OPERATOR DVBLK
                   20983: *
                   20984: *      LEFT PAREN            T$LPR     T$LPR
                   20985: *
                   20986: *      LEFT BRACKET          T$LBR     T$LBR
                   20987: *
                   20988: *      COMMA                 T$CMA     T$CMA
                   20989: *
                   20990: *      FUNCTION CALL         T$FNC     PTR TO FUNCTION VRBLK
                   20991: *
                   20992: *      VARIABLE              T$VAR     PTR TO VRBLK
                   20993: *
                   20994: *      STRING CONSTANT       T$CON     PTR TO SCBLK
                   20995: *
                   20996: *      INTEGER CONSTANT      T$CON     PTR TO ICBLK
                   20997: *
                   20998: .IF    .CNRA
                   20999: .ELSE
                   21000: *      REAL CONSTANT         T$CON     PTR TO RCBLK
                   21001: *
                   21002: .FI
                   21003: *      BINARY OPERATOR       T$BOP     PTR TO OPERATOR DVBLK
                   21004: *
                   21005: *      RIGHT PAREN           T$RPR     T$RPR
                   21006: *
                   21007: *      RIGHT BRACKET         T$RBR     T$RBR
                   21008: *
                   21009: *      COLON                 T$COL     T$COL
                   21010: *
                   21011: *      SEMI-COLON            T$SMC     T$SMC
                   21012: *
                   21013: *      F (SCNGO NE 0)        T$FGO     T$FGO
                   21014: *
                   21015: *      S (SCNGO NE 0)        T$SGO     T$SGO
                   21016:        EJC
                   21017: *
                   21018: *      SCANE (CONTINUED)
                   21019: *
                   21020: *      ENTRY POINT
                   21021: *
                   21022: SCANE  PRC  E,0              ENTRY POINT
                   21023:        ZER  SCNBL            RESET BLANKS FLAG
                   21024:        MOV  WA,SCNSA         SAVE WA
                   21025:        MOV  WB,SCNSB         SAVE WB
                   21026:        MOV  WC,SCNSC         SAVE WC
                   21027:        BZE  SCNRS,SCN03      JUMP IF NO RESCAN
                   21028: *
                   21029: *      HERE FOR RESCAN REQUEST
                   21030: *
                   21031:        MOV  SCNTP,XL         SET PREVIOUS RETURNED SCAN TYPE
                   21032:        MOV  R$SCP,XR         SET PREVIOUS RETURNED POINTER
                   21033:        ZER  SCNRS            RESET RESCAN SWITCH
                   21034:        BRN  SCN13            JUMP TO EXIT
                   21035: *
                   21036: *      COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
                   21037: *
                   21038: SCN01  JSR  READR            READ NEXT IMAGE
                   21039:        MOV  *DVUBS,WB        SET WB FOR NOT READING NAME
                   21040:        BZE  XR,SCN30         TREAT AS SEMI-COLON IF NONE
                   21041:        PLC  XR               ELSE POINT TO FIRST CHARACTER
                   21042:        LCH  WC,(XR)          LOAD FIRST CHARACTER
                   21043:        BEQ  WC,=CH$DT,SCN02  JUMP IF DOT FOR CONTINUATION
                   21044:        BNE  WC,=CH$PL,SCN30  ELSE TREAT AS SEMICOLON UNLESS PLUS
                   21045: *
                   21046: *      HERE FOR CONTINUATION LINE
                   21047: *
                   21048: SCN02  JSR  NEXTS            ACQUIRE NEXT SOURCE IMAGE
                   21049:        MOV  =NUM01,SCNPT     SET SCAN POINTER PAST CONTINUATION
                   21050:        MNZ  SCNBL            SET BLANKS FLAG
                   21051:        EJC
                   21052: *
                   21053: *      SCANE (CONTINUED)
                   21054: *
                   21055: *      MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
                   21056: *
                   21057: SCN03  MOV  SCNPT,WA         LOAD CURRENT OFFSET
                   21058:        BEQ  WA,SCNIL,SCN01   CHECK CONTINUATION IF END
                   21059:        MOV  R$CIM,XL         POINT TO CURRENT LINE
                   21060:        PLC  XL,WA            POINT TO CURRENT CHARACTER
                   21061:        MOV  WA,SCNSE         SET START OF ELEMENT LOCATION
                   21062:        MOV  =OPDVS,WC        POINT TO OPERATOR DV LIST
                   21063:        MOV  *DVUBS,WB        SET CONSTANT FOR OPERATOR CIRCUIT
                   21064:        BRN  SCN06            START SCANNING
                   21065: *
                   21066: *      LOOP HERE TO IGNORE LEADING BLANKS AND TABS
                   21067: *
                   21068: SCN05  BZE  WB,SCN10         JUMP IF TRAILING
                   21069:        ICV  SCNSE            INCREMENT START OF ELEMENT
                   21070:        BEQ  WA,SCNIL,SCN01   JUMP IF END OF IMAGE
                   21071:        MNZ  SCNBL            NOTE BLANKS SEEN
                   21072: *
                   21073: *      THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
                   21074: *      THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
                   21075: *      THE REGISTERS ARE USED AS FOLLOWS.
                   21076: *
                   21077: *      (XR)                  SCRATCH
                   21078: *      (XL)                  PTR TO NEXT CHARACTER
                   21079: *      (WA)                  CURRENT SCAN OFFSET
                   21080: *      (WB)                  *DVUBS (0 IF SCANNING NAME,CONST)
                   21081: *      (WC)                  =OPDVS (0 IF SCANNING CONSTANT)
                   21082: *
                   21083: SCN06  LCH  XR,(XL)+         GET NEXT CHARACTER
                   21084:        ICV  WA               BUMP SCAN OFFSET
                   21085:        MOV  WA,SCNPT         STORE OFFSET PAST CHAR SCANNED
                   21086: .IF    .CUCF
                   21087:        BLO  =CFP$U,XR,SCN07  QUICK CHECK FOR OTHER CHAR
                   21088:        BSW  XR,CFP$U,SCN07   SWITCH ON SCANNED CHARACTER
                   21089: .ELSE
                   21090:        BSW  XR,CFP$A,SCN07   SWITCH ON SCANNED CHARACTER
                   21091: .FI
                   21092: *
                   21093: *      SWITCH TABLE FOR SWITCH ON CHARACTER
                   21094: *
                   21095:        IFF  CH$BL,SCN05      BLANK
                   21096: .IF    .CAHT
                   21097:        IFF  CH$HT,SCN05      HORIZONTAL TAB
                   21098: .FI
                   21099: .IF    .CAVT
                   21100:        IFF  CH$VT,SCN05      VERTICAL TAB
                   21101: .FI
                   21102:        IFF  CH$D0,SCN08      DIGIT 0
                   21103:        IFF  CH$D1,SCN08      DIGIT 1
                   21104:        IFF  CH$D2,SCN08      DIGIT 2
                   21105:        IFF  CH$D3,SCN08      DIGIT 3
                   21106:        IFF  CH$D4,SCN08      DIGIT 4
                   21107:        IFF  CH$D5,SCN08      DIGIT 5
                   21108:        IFF  CH$D6,SCN08      DIGIT 6
                   21109:        IFF  CH$D7,SCN08      DIGIT 7
                   21110:        IFF  CH$D8,SCN08      DIGIT 8
                   21111:        IFF  CH$D9,SCN08      DIGIT 9
                   21112:        EJC
                   21113: *
                   21114: *      SCANE (CONTINUED)
                   21115: *
                   21116:        IFF  CH$LA,SCN09      LETTER A
                   21117:        IFF  CH$LB,SCN09      LETTER B
                   21118:        IFF  CH$LC,SCN09      LETTER C
                   21119:        IFF  CH$LD,SCN09      LETTER D
                   21120:        IFF  CH$LE,SCN09      LETTER E
                   21121:        IFF  CH$LG,SCN09      LETTER G
                   21122:        IFF  CH$LH,SCN09      LETTER H
                   21123:        IFF  CH$LI,SCN09      LETTER I
                   21124:        IFF  CH$LJ,SCN09      LETTER J
                   21125:        IFF  CH$LK,SCN09      LETTER K
                   21126:        IFF  CH$LL,SCN09      LETTER L
                   21127:        IFF  CH$LM,SCN09      LETTER M
                   21128:        IFF  CH$LN,SCN09      LETTER N
                   21129:        IFF  CH$LO,SCN09      LETTER O
                   21130:        IFF  CH$LP,SCN09      LETTER P
                   21131:        IFF  CH$LQ,SCN09      LETTER Q
                   21132:        IFF  CH$LR,SCN09      LETTER R
                   21133:        IFF  CH$LT,SCN09      LETTER T
                   21134:        IFF  CH$LU,SCN09      LETTER U
                   21135:        IFF  CH$LV,SCN09      LETTER V
                   21136:        IFF  CH$LW,SCN09      LETTER W
                   21137:        IFF  CH$LX,SCN09      LETTER X
                   21138:        IFF  CH$LY,SCN09      LETTER Y
                   21139:        IFF  CH$L$,SCN09      LETTER Z
                   21140: .IF    .CASL
                   21141:        IFF  CH$$A,SCN09      SHIFTED A
                   21142:        IFF  CH$$B,SCN09      SHIFTED B
                   21143:        IFF  CH$$C,SCN09      SHIFTED C
                   21144:        IFF  CH$$D,SCN09      SHIFTED D
                   21145:        IFF  CH$$E,SCN09      SHIFTED E
                   21146:        IFF  CH$$F,SCN20      SHIFTED F
                   21147:        IFF  CH$$G,SCN09      SHIFTED G
                   21148:        IFF  CH$$H,SCN09      SHIFTED H
                   21149:        IFF  CH$$I,SCN09      SHIFTED I
                   21150:        IFF  CH$$J,SCN09      SHIFTED J
                   21151:        IFF  CH$$K,SCN09      SHIFTED K
                   21152:        IFF  CH$$L,SCN09      SHIFTED L
                   21153:        IFF  CH$$M,SCN09      SHIFTED M
                   21154:        IFF  CH$$N,SCN09      SHIFTED N
                   21155:        IFF  CH$$O,SCN09      SHIFTED O
                   21156:        IFF  CH$$P,SCN09      SHIFTED P
                   21157:        IFF  CH$$Q,SCN09      SHIFTED Q
                   21158:        IFF  CH$$R,SCN09      SHIFTED R
                   21159:        IFF  CH$$S,SCN21      SHIFTED S
                   21160:        IFF  CH$$T,SCN09      SHIFTED T
                   21161:        IFF  CH$$U,SCN09      SHIFTED U
                   21162:        IFF  CH$$V,SCN09      SHIFTED V
                   21163:        IFF  CH$$W,SCN09      SHIFTED W
                   21164:        IFF  CH$$X,SCN09      SHIFTED X
                   21165:        IFF  CH$$Y,SCN09      SHIFTED Y
                   21166:        IFF  CH$$$,SCN09      SHIFTED Z
                   21167: .FI
                   21168:        EJC
                   21169: *
                   21170: *      SCANE (CONTINUED)
                   21171: *
                   21172:        IFF  CH$SQ,SCN16      SINGLE QUOTE
                   21173:        IFF  CH$DQ,SCN17      DOUBLE QUOTE
                   21174:        IFF  CH$LF,SCN20      LETTER F
                   21175:        IFF  CH$LS,SCN21      LETTER S
                   21176:        IFF  CH$UN,SCN24      UNDERLINE
                   21177:        IFF  CH$PP,SCN25      LEFT PAREN
                   21178:        IFF  CH$RP,SCN26      RIGHT PAREN
                   21179:        IFF  CH$RB,SCN27      RIGHT BRACKET
                   21180:        IFF  CH$BB,SCN28      LEFT BRACKET
                   21181:        IFF  CH$CB,SCN27      RIGHT BRACKET
                   21182:        IFF  CH$OB,SCN28      LEFT BRACKET
                   21183:        IFF  CH$CL,SCN29      COLON
                   21184:        IFF  CH$SM,SCN30      SEMI-COLON
                   21185:        IFF  CH$CM,SCN31      COMMA
                   21186:        IFF  CH$DT,SCN32      DOT
                   21187:        IFF  CH$PL,SCN33      PLUS
                   21188:        IFF  CH$MN,SCN34      MINUS
                   21189:        IFF  CH$NT,SCN35      NOT
                   21190:        IFF  CH$DL,SCN36      DOLLAR
                   21191:        IFF  CH$EX,SCN37      EXCLAMATION MARK
                   21192:        IFF  CH$PC,SCN38      PERCENT
                   21193:        IFF  CH$SL,SCN40      SLASH
                   21194:        IFF  CH$NM,SCN41      NUMBER SIGN
                   21195:        IFF  CH$AT,SCN42      AT
                   21196:        IFF  CH$BR,SCN43      VERTICAL BAR
                   21197:        IFF  CH$AM,SCN44      AMPERSAND
                   21198:        IFF  CH$QU,SCN45      QUESTION MARK
                   21199:        IFF  CH$EQ,SCN46      EQUAL
                   21200:        IFF  CH$AS,SCN49      ASTERISK
                   21201:        ESW                   END SWITCH ON CHARACTER
                   21202: *
                   21203: *      HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
                   21204: *
                   21205: SCN07  BZE  WB,SCN10         JUMP IF SCANNING NAME OR CONSTANT
                   21206:        ERB  230,SYNTAX ERROR. ILLEGAL CHARACTER
                   21207:        EJC
                   21208: *
                   21209: *      SCANE (CONTINUED)
                   21210: *
                   21211: *      HERE FOR DIGITS 0-9
                   21212: *
                   21213: SCN08  BZE  WB,SCN09         KEEP SCANNING IF NAME/CONSTANT
                   21214:        ZER  WC               ELSE SET FLAG FOR SCANNING CONSTANT
                   21215: *
                   21216: *      HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
                   21217: *
                   21218: SCN09  BEQ  WA,SCNIL,SCN11   JUMP IF END OF IMAGE
                   21219:        ZER  WB               SET FLAG FOR SCANNING NAME/CONST
                   21220:        BRN  SCN06            MERGE BACK TO CONTINUE SCAN
                   21221: *
                   21222: *      COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
                   21223: *
                   21224: SCN10  DCV  WA               RESET OFFSET TO POINT TO DELIMITER
                   21225: *
                   21226: *      COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
                   21227: *
                   21228: SCN11  MOV  WA,SCNPT         STORE UPDATED SCAN OFFSET
                   21229:        MOV  SCNSE,WB         POINT TO START OF ELEMENT
                   21230:        SUB  WB,WA            GET NUMBER OF CHARACTERS
                   21231:        MOV  R$CIM,XL         POINT TO LINE IMAGE
                   21232:        BNZ  WC,SCN15         JUMP IF NAME
                   21233: *
                   21234: *      HERE AFTER SCANNING OUT NUMERIC CONSTANT
                   21235: *
                   21236:        JSR  SBSTR            GET STRING FOR CONSTANT
                   21237:        MOV  XR,DNAMP         DELETE FROM STORAGE (NOT NEEDED)
                   21238:        JSR  GTNUM            CONVERT TO NUMERIC
                   21239:        PPM  SCN14            JUMP IF CONVERSION FAILURE
                   21240: *
                   21241: *      MERGE HERE TO EXIT WITH CONSTANT
                   21242: *
                   21243: SCN12  MOV  =T$CON,XL        SET RESULT TYPE OF CONSTANT
                   21244:        EJC
                   21245: *
                   21246: *      SCANE (CONTINUED)
                   21247: *
                   21248: *      COMMON EXIT POINT (XR,XL) SET
                   21249: *
                   21250: SCN13  MOV  SCNSA,WA         RESTORE WA
                   21251:        MOV  SCNSB,WB         RESTORE WB
                   21252:        MOV  SCNSC,WC         RESTORE WC
                   21253:        MOV  XR,R$SCP         SAVE XR IN CASE RESCAN
                   21254:        MOV  XL,SCNTP         SAVE XL IN CASE RESCAN
                   21255:        ZER  SCNGO            RESET POSSIBLE GOTO FLAG
                   21256:        EXI                   RETURN TO SCANE CALLER
                   21257: *
                   21258: *      HERE IF CONVERSION ERROR ON NUMERIC ITEM
                   21259: *
                   21260: SCN14  ERB  231,SYNTAX ERROR. INVALID NUMERIC ITEM
                   21261: *
                   21262: *      HERE AFTER SCANNING OUT VARIABLE NAME
                   21263: *
                   21264: SCN15  JSR  SBSTR            BUILD STRING NAME OF VARIABLE
                   21265:        BNZ  SCNCC,SCN13      RETURN IF CNCRD CALL
                   21266:        JSR  GTNVR            LOCATE/BUILD VRBLK
                   21267:        PPM                   DUMMY (UNUSED) ERROR RETURN
                   21268:        MOV  =T$VAR,XL        SET TYPE AS VARIABLE
                   21269:        BRN  SCN13            BACK TO EXIT
                   21270: *
                   21271: *      HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
                   21272: *
                   21273: SCN16  BZE  WB,SCN10         TERMINATOR IF SCANNING NAME OR CNST
                   21274:        MOV  =CH$SQ,WB        SET TERMINATOR AS SINGLE QUOTE
                   21275:        BRN  SCN18            MERGE
                   21276: *
                   21277: *      HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
                   21278: *
                   21279: SCN17  BZE  WB,SCN10         TERMINATOR IF SCANNING NAME OR CNST
                   21280:        MOV  =CH$DQ,WB        SET DOUBLE QUOTE TERMINATOR, MERGE
                   21281: *
                   21282: *      LOOP TO SCAN OUT STRING CONSTANT
                   21283: *
                   21284: SCN18  BEQ  WA,SCNIL,SCN19   ERROR IF END OF IMAGE
                   21285:        LCH  WC,(XL)+         ELSE LOAD NEXT CHARACTER
                   21286:        ICV  WA               BUMP OFFSET
                   21287:        BNE  WC,WB,SCN18      LOOP BACK IF NOT TERMINATOR
                   21288:        EJC
                   21289: *
                   21290: *      SCANE (CONTINUED)
                   21291: *
                   21292: *      HERE AFTER SCANNING OUT STRING CONSTANT
                   21293: *
                   21294:        MOV  SCNPT,WB         POINT TO FIRST CHARACTER
                   21295:        MOV  WA,SCNPT         SAVE OFFSET PAST FINAL QUOTE
                   21296:        DCV  WA               POINT BACK PAST LAST CHARACTER
                   21297:        SUB  WB,WA            GET NUMBER OF CHARACTERS
                   21298:        MOV  R$CIM,XL         POINT TO INPUT IMAGE
                   21299:        JSR  SBSTR            BUILD SUBSTRING VALUE
                   21300:        BRN  SCN12            BACK TO EXIT WITH CONSTANT RESULT
                   21301: *
                   21302: *      HERE IF NO MATCHING QUOTE FOUND
                   21303: *
                   21304: SCN19  MOV  WA,SCNPT         SET UPDATED SCAN POINTER
                   21305:        ERB  232,SYNTAX ERROR. UNMATCHED STRING QUOTE
                   21306: *
                   21307: *      HERE FOR F (POSSIBLE FAILURE GOTO)
                   21308: *
                   21309: SCN20  MOV  =T$FGO,XR        SET RETURN CODE FOR FAIL GOTO
                   21310:        BRN  SCN22            JUMP TO MERGE
                   21311: *
                   21312: *      HERE FOR S (POSSIBLE SUCCESS GOTO)
                   21313: *
                   21314: SCN21  MOV  =T$SGO,XR        SET SUCCESS GOTO AS RETURN CODE
                   21315: *
                   21316: *      SPECIAL GOTO CASES MERGE HERE
                   21317: *
                   21318: SCN22  BZE  SCNGO,SCN09      TREAT AS NORMAL LETTER IF NOT GOTO
                   21319: *
                   21320: *      MERGE HERE FOR SPECIAL CHARACTER EXIT
                   21321: *
                   21322: SCN23  BZE  WB,SCN10         JUMP IF END OF NAME/CONSTANT
                   21323:        MOV  XR,XL            ELSE COPY CODE
                   21324:        BRN  SCN13            AND JUMP TO EXIT
                   21325: *
                   21326: *      HERE FOR UNDERLINE
                   21327: *
                   21328: SCN24  BZE  WB,SCN09         PART OF NAME IF SCANNING NAME
                   21329:        BRN  SCN07            ELSE ILLEGAL
                   21330:        EJC
                   21331: *
                   21332: *      SCANE (CONTINUED)
                   21333: *
                   21334: *      HERE FOR LEFT PAREN
                   21335: *
                   21336: SCN25  MOV  =T$LPR,XR        SET LEFT PAREN RETURN CODE
                   21337:        BNZ  WB,SCN23         RETURN LEFT PAREN UNLESS NAME
                   21338:        BZE  WC,SCN10         DELIMITER IF SCANNING CONSTANT
                   21339: *
                   21340: *      HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
                   21341: *
                   21342:        MOV  SCNSE,WB         POINT TO START OF NAME
                   21343:        MOV  WA,SCNPT         SET POINTER PAST LEFT PAREN
                   21344:        DCV  WA               POINT BACK PAST LAST CHAR OF NAME
                   21345:        SUB  WB,WA            GET NAME LENGTH
                   21346:        MOV  R$CIM,XL         POINT TO INPUT IMAGE
                   21347:        JSR  SBSTR            GET STRING NAME FOR FUNCTION
                   21348:        JSR  GTNVR            LOCATE/BUILD VRBLK
                   21349:        PPM                   DUMMY (UNUSED) ERROR RETURN
                   21350:        MOV  =T$FNC,XL        SET CODE FOR FUNCTION CALL
                   21351:        BRN  SCN13            BACK TO EXIT
                   21352: *
                   21353: *      PROCESSING FOR SPECIAL CHARACTERS
                   21354: *
                   21355: SCN26  MOV  =T$RPR,XR        RIGHT PAREN, SET CODE
                   21356:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   21357: *
                   21358: SCN27  MOV  =T$RBR,XR        RIGHT BRACKET, SET CODE
                   21359:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   21360: *
                   21361: SCN28  MOV  =T$LBR,XR        LEFT BRACKET, SET CODE
                   21362:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   21363: *
                   21364: SCN29  MOV  =T$COL,XR        COLON, SET CODE
                   21365:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   21366: *
                   21367: SCN30  MOV  =T$SMC,XR        SEMI-COLON, SET CODE
                   21368:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   21369: *
                   21370: SCN31  MOV  =T$CMA,XR        COMMA, SET CODE
                   21371:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   21372:        EJC
                   21373: *
                   21374: *      SCANE (CONTINUED)
                   21375: *
                   21376: *      HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
                   21377: *      OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
                   21378: *      TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
                   21379: *      LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
                   21380: *      POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
                   21381: *      THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
                   21382: *      AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-).
                   21383: *
                   21384: SCN32  BZE  WB,SCN09         DOT CAN BE PART OF NAME OR CONSTANT
                   21385:        ADD  WB,WC            ELSE BUMP POINTER
                   21386: *
                   21387: SCN33  BZE  WC,SCN09         PLUS CAN BE PART OF CONSTANT
                   21388:        BZE  WB,SCN48         PLUS CANNOT BE PART OF NAME
                   21389:        ADD  WB,WC            ELSE BUMP POINTER
                   21390: *
                   21391: SCN34  BZE  WC,SCN09         MINUS CAN BE PART OF CONSTANT
                   21392:        BZE  WB,SCN48         MINUS CANNOT BE PART OF NAME
                   21393:        ADD  WB,WC            ELSE BUMP POINTER
                   21394: *
                   21395: SCN35  ADD  WB,WC            NOT
                   21396: SCN36  ADD  WB,WC            DOLLAR
                   21397: SCN37  ADD  WB,WC            EXCLAMATION
                   21398: SCN38  ADD  WB,WC            PERCENT
                   21399: SCN39  ADD  WB,WC            ASTERISK
                   21400: SCN40  ADD  WB,WC            SLASH
                   21401: SCN41  ADD  WB,WC            NUMBER SIGN
                   21402: SCN42  ADD  WB,WC            AT SIGN
                   21403: SCN43  ADD  WB,WC            VERTICAL BAR
                   21404: SCN44  ADD  WB,WC            AMPERSAND
                   21405: SCN45  ADD  WB,WC            QUESTION MARK
                   21406: *
                   21407: *      ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
                   21408: *      (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
                   21409: *
                   21410: SCN46  BZE  WB,SCN10         OPERATOR TERMINATES NAME/CONSTANT
                   21411:        MOV  WC,XR            ELSE COPY DV POINTER
                   21412:        LCH  WC,(XL)          LOAD NEXT CHARACTER
                   21413:        MOV  =T$BOP,XL        SET BINARY OP IN CASE
                   21414:        BEQ  WA,SCNIL,SCN47   SHOULD BE BINARY IF IMAGE END
                   21415:        BEQ  WC,=CH$BL,SCN47  SHOULD BE BINARY IF FOLLOWED BY BLK
                   21416: .IF    .CAHT
                   21417:        BEQ  WC,=CH$HT,SCN47  JUMP IF HORIZONTAL TAB
                   21418: .FI
                   21419: .IF    .CAVT
                   21420:        BEQ  WC,=CH$VT,SCN47  JUMP IF VERTICAL TAB
                   21421: .FI
                   21422:        BEQ  WC,=CH$SM,SCN47  SEMICOLON CAN IMMEDIATELY FOLLOW =
                   21423: *
                   21424: *      HERE FOR UNARY OPERATOR
                   21425: *
                   21426:        ADD  *DVBS$,XR        POINT TO DV FOR UNARY OP
                   21427:        MOV  =T$UOP,XL        SET TYPE FOR UNARY OPERATOR
                   21428:        BLE  SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT
                   21429:        EJC
                   21430: *
                   21431: *      SCANE (CONTINUED)
                   21432: *
                   21433: *      MERGE HERE TO REQUIRE PRECEDING BLANKS
                   21434: *
                   21435: SCN47  BNZ  SCNBL,SCN13      ALL OK IF PRECEDING BLANKS, EXIT
                   21436: *
                   21437: *      FAIL OPERATOR IN THIS POSITION
                   21438: *
                   21439: SCN48  ERB  233,SYNTAX ERROR. INVALID USE OF OPERATOR
                   21440: *
                   21441: *      HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
                   21442: *
                   21443: SCN49  BZE  WB,SCN10         END OF NAME IF SCANNING NAME
                   21444:        BEQ  WA,SCNIL,SCN39   NOT ** IF * AT IMAGE END
                   21445:        MOV  WA,XR            ELSE SAVE OFFSET PAST FIRST *
                   21446:        MOV  WA,SCNOF         SAVE ANOTHER COPY
                   21447:        LCH  WA,(XL)+         LOAD NEXT CHARACTER
                   21448:        BNE  WA,=CH$AS,SCN50  NOT ** IF NEXT CHAR NOT *
                   21449:        ICV  XR               ELSE STEP OFFSET PAST SECOND *
                   21450:        BEQ  XR,SCNIL,SCN51   OK EXCLAM IF END OF IMAGE
                   21451:        LCH  WA,(XL)          ELSE LOAD NEXT CHARACTER
                   21452:        BEQ  WA,=CH$BL,SCN51  EXCLAMATION IF BLANK
                   21453: .IF    .CAHT
                   21454:        BEQ  WA,=CH$HT,SCN51  EXCLAMATION IF HORIZONTAL TAB
                   21455: .FI
                   21456: .IF    .CAVT
                   21457:        BEQ  WA,=CH$VT,SCN51  EXCLAMATION IF VERTICAL TAB
                   21458: .FI
                   21459: *
                   21460: *      UNARY *
                   21461: *
                   21462: SCN50  MOV  SCNOF,WA         RECOVER STORED OFFSET
                   21463:        MOV  R$CIM,XL         POINT TO LINE AGAIN
                   21464:        PLC  XL,WA            POINT TO CURRENT CHAR
                   21465:        BRN  SCN39            MERGE WITH UNARY *
                   21466: *
                   21467: *      HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
                   21468: *
                   21469: SCN51  MOV  XR,SCNPT         SAVE SCAN POINTER PAST 2ND *
                   21470:        MOV  XR,WA            COPY SCAN POINTER
                   21471:        BRN  SCN37            MERGE WITH EXCLAMATION
                   21472:        ENP                   END PROCEDURE SCANE
                   21473:        EJC
                   21474: *
                   21475: *      SCNGF -- SCAN GOTO FIELD
                   21476: *
                   21477: *      SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
                   21478: *      FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
                   21479: *      FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
                   21480: *      POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
                   21481: *      EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
                   21482: *      (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
                   21483: *      POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
                   21484: *      UNARY OPERATOR O$GOD.
                   21485: *
                   21486: *      JSR  SCNGF            CALL TO SCAN GOTO FIELD
                   21487: *      (XR)                  RESULT (SEE ABOVE)
                   21488: *      (XL,WA,WB,WC)         DESTROYED
                   21489: *
                   21490: SCNGF  PRC  E,0              ENTRY POINT
                   21491:        JSR  SCANE            SCAN INITIAL ELEMENT
                   21492:        BEQ  XL,=T$LPR,SCNG1  SKIP IF LEFT PAREN (NORMAL GOTO)
                   21493:        BEQ  XL,=T$LBR,SCNG2  SKIP IF LEFT BRACKET (DIRECT GOTO)
                   21494:        ERB  234,SYNTAX ERROR. GOTO FIELD INCORRECT
                   21495: *
                   21496: *      HERE FOR LEFT PAREN (NORMAL GOTO)
                   21497: *
                   21498: SCNG1  MOV  =NUM01,WB        SET EXPAN FLAG FOR NORMAL GOTO
                   21499:        JSR  EXPAN            ANALYZE GOTO FIELD
                   21500:        MOV  =OPDVN,WA        POINT TO OPDV FOR COMPLEX GOTO
                   21501:        BLE  XR,STATB,SCNG3   JUMP IF NOT IN STATIC (SGD15)
                   21502:        BLO  XR,STATE,SCNG4   JUMP TO EXIT IF SIMPLE LABEL NAME
                   21503:        BRN  SCNG3            COMPLEX GOTO - MERGE
                   21504: *
                   21505: *      HERE FOR LEFT BRACKET (DIRECT GOTO)
                   21506: *
                   21507: SCNG2  MOV  =NUM02,WB        SET EXPAN FLAG FOR DIRECT GOTO
                   21508:        JSR  EXPAN            SCAN GOTO FIELD
                   21509:        MOV  =OPDVD,WA        SET OPDV POINTER FOR DIRECT GOTO
                   21510:        EJC
                   21511: *
                   21512: *      SCNGF (CONTINUED)
                   21513: *
                   21514: *      MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
                   21515: *
                   21516: SCNG3  MOV  WA,-(XS)         STACK OPERATOR DV POINTER
                   21517:        MOV  XR,-(XS)         STACK POINTER TO EXPRESSION TREE
                   21518:        JSR  EXPOP            POP OPERATOR OFF
                   21519:        MOV  (XS)+,XR         RELOAD NEW EXPRESSION TREE POINTER
                   21520: *
                   21521: *      COMMON EXIT POINT
                   21522: *
                   21523: SCNG4  EXI                   RETURN TO CALLER
                   21524:        ENP                   END PROCEDURE SCNGF
                   21525:        EJC
                   21526: *
                   21527: *      SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
                   21528: *
                   21529: *      SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
                   21530: *      FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
                   21531: *      ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
                   21532: *
                   21533: *      (XR)                  POINTER TO VRBLK
                   21534: *      JSR  SETVR            CALL TO SET FIELDS
                   21535: *      (XL,WA)               DESTROYED
                   21536: *
                   21537: *      NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
                   21538: *      INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
                   21539: *
                   21540: SETVR  PRC  E,0              ENTRY POINT
                   21541:        BHI  XR,STATE,SETV1   EXIT IF NOT NATURAL VARIABLE
                   21542: *
                   21543: *      HERE IF WE HAVE A VRBLK
                   21544: *
                   21545:        MOV  XR,XL            COPY VRBLK POINTER
                   21546:        MOV  =B$VRL,VRGET(XR) STORE NORMAL GET VALUE
                   21547:        BEQ  VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE
                   21548:        MOV  =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE
                   21549:        MOV  VRVAL(XL),XL     POINT TO NEXT ENTRY ON CHAIN
                   21550:        BNE  (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN
                   21551:        MOV  =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS
                   21552:        MOV  =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS
                   21553: *
                   21554: *      MERGE HERE TO EXIT TO CALLER
                   21555: *
                   21556: SETV1  EXI                   RETURN TO SETVR CALLER
                   21557:        ENP                   END PROCEDURE SETVR
                   21558: .IF    .CNSR
                   21559: .ELSE
                   21560:        EJC
                   21561: *
                   21562: *      SORTA -- SORT ARRAY
                   21563: *
                   21564: *      ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
                   21565: *      SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
                   21566: *      DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
                   21567: *      WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
                   21568: *      ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
                   21569: *      REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
                   21570: *      FOR A VECTOR.
                   21571: *      THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE
                   21572: *      HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
                   21573: *      IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
                   21574: *      TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
                   21575: *      IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
                   21576: *      SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE
                   21577: *      OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
                   21578: *      ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
                   21579: *      COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
                   21580: *      OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
                   21581: *      COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
                   21582: *      OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
                   21583: *      THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
                   21584: *      REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
                   21585: *      PRECEDING FIRST ACTUAL ITEM.
                   21586: *      REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
                   21587: *      TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
                   21588: *      GREATER THAN TEST.
                   21589: *
                   21590: *      1(XS)                 FIRST ARG - ARRAY OR TABLE
                   21591: *      0(XS)                 2ND ARG - INDEX OR PDTYPE NAME
                   21592: *      (WA)                  0 , NON-ZERO FOR SORT , RSORT
                   21593: *      JSR  SORTA            CALL TO SORT ARRAY
                   21594: *      (XR)                  SORTED ARRAY
                   21595: *      (XL,WA,WB,WC)         DESTROYED
                   21596:        EJC
                   21597: *
                   21598: *      SORTA (CONTINUED)
                   21599: *
                   21600: SORTA  PRC  N,0              ENTRY POINT
                   21601:        MOV  WA,SRTSR         SORT/RSORT INDICATOR
                   21602:        MOV  *NUM01,SRTST     DEFAULT STRIDE OF 1
                   21603:        ZER  SRTOF            DEFAULT ZERO OFFSET TO SORT KEY
                   21604:        MOV  =NULLS,SRTDF     CLEAR DATATYPE FIELD NAME
                   21605:        MOV  (XS)+,R$SXR      UNSTACK ARGUMENT 2
                   21606:        MOV  (XS)+,XR         GET FIRST ARGUMENT
                   21607:        JSR  GTARR            CONVERT TO ARRAY
                   21608:        PPM  SRT16            FAIL
                   21609:        MOV  XR,-(XS)         STACK PTR TO RESULTING KEY ARRAY
                   21610:        MOV  XR,-(XS)         ANOTHER COPY FOR COPYB
                   21611:        JSR  COPYB            GET COPY ARRAY FOR SORTING INTO
                   21612:        PPM                   CANT FAIL
                   21613:        MOV  XR,-(XS)         STACK POINTER TO SORT ARRAY
                   21614:        MOV  R$SXR,XR         GET SECOND ARG
                   21615:        MOV  1(XS),XL         GET PTR TO KEY ARRAY
                   21616:        BNE  (XL),=B$VCT,SRT02 JUMP IF ARBLK
                   21617:        BEQ  XR,=NULLS,SRT01  JUMP IF NULL SECOND ARG
                   21618:        JSR  GTNVR            GET VRBLK PTR FOR IT
                   21619:        ERR  257,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR
                   21620:        MOV  XR,SRTDF         STORE DATATYPE FIELD NAME VRBLK
                   21621: *
                   21622: *      COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
                   21623: *
                   21624: SRT01  MOV  *VCLEN,WC        OFFSET TO A(0)
                   21625:        MOV  *VCVLS,WB        OFFSET TO FIRST ITEM
                   21626:        MOV  VCLEN(XL),WA     GET BLOCK LENGTH
                   21627:        SUB  *VCSI$,WA        GET NO. OF ENTRIES, N (IN BYTES)
                   21628:        BRN  SRT04            MERGE
                   21629: *
                   21630: *      HERE FOR ARRAY
                   21631: *
                   21632: SRT02  LDI  ARDIM(XL)        GET POSSIBLE DIMENSION
                   21633:        MFI  WA               CONVERT TO SHORT INTEGER
                   21634:        WTB  WA               FURTHER CONVERT TO BAUS
                   21635:        MOV  *ARVLS,WB        OFFSET TO FIRST VALUE IF ONE
                   21636:        MOV  *ARPRO,WC        OFFSET BEFORE VALUES IF ONE DIM.
                   21637:        BEQ  ARNDM(XL),=NUM01,SRT04 JUMP IN FACT IF ONE DIM.
                   21638:        BNE  ARNDM(XL),=NUM02,SRT16  FAIL UNLESS TWO DIMENS
                   21639:        LDI  ARLB2(XL)        GET LOWER BOUND 2 AS DEFAULT
                   21640:        BEQ  XR,=NULLS,SRT03  JUMP IF DEFAULT SECOND ARG
                   21641:        JSR  GTINT            CONVERT TO INTEGER
                   21642:        PPM  SRT17            FAIL
                   21643:        LDI  ICVAL(XR)        GET ACTUAL INTEGER VALUE
                   21644:        EJC
                   21645: *
                   21646: *      SORTA (CONTINUED)
                   21647: *
                   21648: *      HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
                   21649: *
                   21650: SRT03  SBI  ARLB2(XL)        SUBTRACT LOW BOUND
                   21651:        IOV  SRT17            FAIL IF OVERFLOW
                   21652:        ILT  SRT17            FAIL IF BELOW LOW BOUND
                   21653:        SBI  ARDM2(XL)        CHECK AGAINST DIMENSION
                   21654:        IGE  SRT17            FAIL IF TOO LARGE
                   21655:        ADI  ARDM2(XL)        RESTORE VALUE
                   21656:        MFI  WA               GET AS SMALL INTEGER
                   21657:        WTB  WA               OFFSET WITHIN ROW TO KEY
                   21658:        MOV  WA,SRTOF         KEEP OFFSET
                   21659:        LDI  ARDM2(XL)        SECOND DIMENSION IS ROW LENGTH
                   21660:        MFI  WA               CONVERT TO SHORT INTEGER
                   21661:        MOV  WA,XR            COPY ROW LENGTH
                   21662:        WTB  WA               CONVERT TO BYTES
                   21663:        MOV  WA,SRTST         STORE AS STRIDE
                   21664:        LDI  ARDIM(XL)        GET NUMBER OF ROWS
                   21665:        MFI  WA               AS A SHORT INTEGER
                   21666:        WTB  WA               CONVERT N TO BAUS
                   21667:        MOV  ARLEN(XL),WC     OFFSET PAST ARRAY END
                   21668:        SUB  WA,WC            ADJUST, GIVING SPACE FOR N OFFSETS
                   21669:        DCA  WC               POINT TO A(0)
                   21670:        MOV  AROFS(XL),WB     OFFSET TO WORD BEFORE FIRST ITEM
                   21671:        ICA  WB               OFFSET TO FIRST ITEM
                   21672: *
                   21673: *      SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
                   21674: *      TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
                   21675: *      TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
                   21676: *
                   21677: *      (XL) = 1(XS) = POINTER TO KEY ARRAY
                   21678: *      (XS) = POINTER TO SORT ARRAY
                   21679: *      WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES).
                   21680: *      WB = OFFSET TO FIRST ITEM OF ARRAYS.
                   21681: *      WC = OFFSET TO A(0)
                   21682: *
                   21683: SRT04  BLE  WA,*NUM01,SRT15  RETURN IF ONLY A SINGLE ITEM
                   21684:        MOV  WA,SRTSN         STORE NUMBER OF ITEMS (IN BAUS)
                   21685:        MOV  WC,SRTSO         STORE OFFSET TO A(0)
                   21686:        MOV  ARLEN(XL),WC     LENGTH OF ARRAY OR VEC (=VCLEN)
                   21687:        ADD  XL,WC            POINT PAST END OF ARRAY OR VECTOR
                   21688:        MOV  WB,SRTSF         STORE OFFSET TO FIRST ROW
                   21689:        ADD  WB,XL            POINT TO FIRST ITEM IN KEY ARRAY
                   21690: *
                   21691: *      LOOP THROUGH ARRAY
                   21692: *
                   21693: SRT05  MOV  (XL),XR          GET AN ENTRY
                   21694: *
                   21695: *      HUNT ALONG TRBLK CHAIN
                   21696: *
                   21697: SRT06  BNE  (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK
                   21698:        MOV  TRVAL(XR),XR     GET VALUE FIELD
                   21699:        BRN  SRT06            LOOP
                   21700:        EJC
                   21701: *
                   21702: *      SORTA (CONTINUED)
                   21703: *
                   21704: *      XR IS VALUE FROM END OF CHAIN
                   21705: *
                   21706: SRT07  MOV  XR,(XL)+         STORE AS ARRAY ENTRY
                   21707:        BLT  XL,WC,SRT05      LOOP IF NOT DONE
                   21708:        MOV  (XS),XL          GET ADRS OF SORT ARRAY
                   21709:        MOV  SRTSF,XR         INITIAL OFFSET TO FIRST KEY
                   21710:        MOV  SRTST,WB         GET STRIDE
                   21711:        ADD  SRTSO,XL         OFFSET TO A(0)
                   21712:        ICA  XL               POINT TO A(1)
                   21713:        MOV  SRTSN,WC         GET N
                   21714:        BTW  WC               CONVERT FROM BYTES
                   21715:        MOV  WC,SRTNR         STORE AS ROW COUNT
                   21716:        LCT  WC,WC            LOOP COUNTER
                   21717: *
                   21718: *      STORE KEY OFFSETS AT TOP OF SORT ARRAY
                   21719: *
                   21720: SRT08  MOV  XR,(XL)+         STORE AN OFFSET
                   21721:        ADD  WB,XR            BUMP OFFSET BY STRIDE
                   21722:        BCT  WC,SRT08         LOOP THROUGH ROWS
                   21723: *
                   21724: *      PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
                   21725: *
                   21726: *      (SRTSN)               NUMBER OF ITEMS TO SORT, N (BYTES)
                   21727: *      (SRTSO)               OFFSET TO A(0)
                   21728: *
                   21729: SRT09  MOV  SRTSN,WA         GET N
                   21730:        MOV  SRTNR,WC         GET NUMBER OF ROWS
                   21731:        RSH  WC,1             I = N / 2 (WC=I, INDEX INTO ARRAY)
                   21732:        WTB  WC               CONVERT BACK TO BYTES
                   21733: *
                   21734: *      LOOP TO FORM INITIAL HEAP
                   21735: *
                   21736: SRT10  JSR  SORTH            SORTH(I,N)
                   21737:        DCA  WC               I = I - 1
                   21738:        BNZ  WC,SRT10         LOOP IF I GT 0
                   21739:        MOV  WA,WC            I = N
                   21740: *
                   21741: *      SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
                   21742: *      ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI
                   21743: *      IT AS, ROOT OF TREE.
                   21744: *
                   21745: SRT11  DCA  WC               I = I - 1 (N - 1 INITIALLY)
                   21746:        BZE  WC,SRT12         JUMP IF DONE
                   21747:        MOV  (XS),XR          GET SORT ARRAY ADDRESS
                   21748:        ADD  SRTSO,XR         POINT TO A(0)
                   21749:        MOV  XR,XL            A(0) ADDRESS
                   21750:        ADD  WC,XL            A(I) ADDRESS
                   21751:        MOV  1(XL),WB         COPY A(I+1)
                   21752:        MOV  1(XR),1(XL)      MOVE A(1) TO A(I+1)
                   21753:        MOV  WB,1(XR)         COMPLETE EXCHANGE OF A(1), A(I+1)
                   21754:        MOV  WC,WA            N = I FOR SORTH
                   21755:        MOV  *NUM01,WC        I = 1 FOR SORTH
                   21756:        JSR  SORTH            SORTH(1,N)
                   21757:        MOV  WA,WC            RESTORE WC
                   21758:        BRN  SRT11            LOOP
                   21759:        EJC
                   21760: *
                   21761: *      SORTA (CONTINUED)
                   21762: *
                   21763: *      OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
                   21764: *      COPY ARRAY ELEMENTS OVER THEM.
                   21765: *
                   21766: SRT12  MOV  (XS),XL          BASE ADRS OF KEY ARRAY
                   21767:        MOV  XL,WC            COPY IT
                   21768:        ADD  SRTSO,WC         OFFSET OF A(0)
                   21769:        ADD  SRTSF,XL         ADRS OF FIRST ROW OF SORT ARRAY
                   21770:        MOV  SRTST,WB         GET STRIDE
                   21771:        BTW  WB               CONVERT TO WORDS
                   21772: *
                   21773: *      COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
                   21774: *      HELD AT END OF SORT ARRAY.
                   21775: *
                   21776: SRT13  ICA  WC               ADRS OF NEXT OF SORTED OFFSETS
                   21777:        MOV  WC,XR            COPY IT FOR ACCESS
                   21778:        MOV  (XR),XR          GET OFFSET
                   21779:        ADD  1(XS),XR         ADD KEY ARRAY BASE ADRS
                   21780:        LCT  WA,WB            GET COUNT OF WORDS IN ROW
                   21781: *
                   21782: *      COPY A COMPLETE ROW
                   21783: *
                   21784: SRT14  MOV  (XR)+,(XL)+      MOVE A WORD
                   21785:        BCT  WA,SRT14         LOOP
                   21786:        DCV  SRTNR            DECREMENT ROW COUNT
                   21787:        BNZ  SRTNR,SRT13      REPEAT TILL ALL ROWS DONE
                   21788: *
                   21789: *      RETURN POINT
                   21790: *
                   21791: SRT15  MOV  (XS)+,XR         POP RESULT ARRAY PTR
                   21792:        ICA  XS               POP KEY ARRAY PTR
                   21793:        ZER  R$SXL            CLEAR JUNK
                   21794:        ZER  R$SXR            CLEAR JUNK
                   21795:        EXI                   RETURN
                   21796: *
                   21797: *      ERROR POINT
                   21798: *
                   21799: SRT16  ERB  256,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE
                   21800: SRT17  ERB  258,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER
                   21801:        ENP                   END PROCUDURE SORTA
                   21802:        EJC
                   21803: *
                   21804: *      SORTC --  COMPARE SORT KEYS
                   21805: *
                   21806: *      COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
                   21807: *      EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
                   21808: *      NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
                   21809: *      SORT), THE QUOTED RETURNS ARE INVERTED.
                   21810: *      FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
                   21811: *      IDENTIFICATIONS ARE COMPARED.
                   21812: *
                   21813: *      (XL)                  BASE ADRS FOR KEYS
                   21814: *      (WA)                  OFFSET TO KEY 1 ITEM
                   21815: *      (WB)                  OFFSET TO KEY 2 ITEM
                   21816: *      (SRTSR)               ZERO/NON-ZERO FOR SORT/RSORT
                   21817: *      (SRTOF)               OFFSET WITHIN ROW TO COMPARANDS
                   21818: *      JSR  SORTC            CALL TO COMPARE KEYS
                   21819: *      PPM  LOC              KEY1 LESS THAN KEY2
                   21820: *                            NORMAL RETURN, KEY1 GT THAN KEY2
                   21821: *      (XL,XR,WA,WB)         DESTROYED
                   21822: *
                   21823: SORTC  PRC  E,1              ENTRY POINT
                   21824:        MOV  WA,SRTS1         SAVE OFFSET 1
                   21825:        MOV  WB,SRTS2         SAVE OFFSET 2
                   21826:        MOV  WC,SRTSC         SAVE WC
                   21827:        ADD  SRTOF,XL         ADD OFFSET TO COMPARAND FIELD
                   21828:        MOV  XL,XR            COPY BASE + OFFSET
                   21829:        ADD  WA,XL            ADD KEY1 OFFSET
                   21830:        ADD  WB,XR            ADD KEY2 OFFSET
                   21831:        MOV  (XL),XL          GET KEY1
                   21832:        MOV  (XR),XR          GET KEY2
                   21833:        BNE  SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED
                   21834:        EJC
                   21835: *
                   21836: *      SORTC (CONTINUED)
                   21837: *
                   21838: *      MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
                   21839: *
                   21840: SRC01  MOV  (XL),WC          GET TYPE CODE
                   21841:        BNE  WC,(XR),SRC02    SKIP IF NOT SAME DATATYPE
                   21842:        BEQ  WC,=B$SCL,SRC09  JUMP IF BOTH STRINGS
                   21843: *
                   21844: *      NOW TRY FOR NUMERIC
                   21845: *
                   21846: SRC02  MOV  XL,R$SXL         KEEP ARG1
                   21847:        MOV  XR,R$SXR         KEEP ARG2
                   21848:        MOV  XL,-(XS)         STACK
                   21849:        MOV  XR,-(XS)         ARGS
                   21850:        JSR  ACOMP            COMPARE OBJECTS
                   21851:        PPM  SRC10            NOT NUMERIC
                   21852:        PPM  SRC10            NOT NUMERIC
                   21853:        PPM  SRC03            KEY1 LESS
                   21854:        PPM  SRC08            KEYS EQUAL
                   21855:        PPM  SRC05            KEY1 GREATER
                   21856: *
                   21857: *      RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
                   21858: *
                   21859: SRC03  BNZ  SRTSR,SRC06      JUMP IF RSORT
                   21860: *
                   21861: SRC04  MOV  SRTSC,WC         RESTORE WC
                   21862:        EXI  1                RETURN
                   21863: *
                   21864: *      RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
                   21865: *
                   21866: SRC05  BNZ  SRTSR,SRC04      JUMP IF RSORT
                   21867: *
                   21868: SRC06  MOV  SRTSC,WC         RESTORE WC
                   21869:        EXI                   RETURN
                   21870: *
                   21871: *      KEYS ARE OF SAME DATATYPE
                   21872: *
                   21873: SRC07  BLT  XL,XR,SRC03      ITEM FIRST CREATED IS LESS
                   21874:        BGT  XL,XR,SRC05      ADDRESSES RISE IN ORDER OF CREATION
                   21875: *
                   21876: *      DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
                   21877: *
                   21878: SRC08  BLT  SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD
                   21879:        BRN  SRC06            OFFSET 1 GREATER
                   21880:        EJC
                   21881: *
                   21882: *      SORTC (CONTINUED)
                   21883: *
                   21884: *      STRINGS
                   21885: *
                   21886: SRC09  MOV  XL,-(XS)         STACK
                   21887:        MOV  XR,-(XS)         ARGS
                   21888:        JSR  LCOMP            COMPARE OBJECTS
                   21889:        PPM                   CANT
                   21890:        PPM                   FAIL
                   21891:        PPM  SRC03            KEY1 LESS
                   21892:        PPM  SRC08            KEYS EQUAL
                   21893:        PPM  SRC05            KEY1 GREATER
                   21894: *
                   21895: *      ARITHMETIC COMPARISON FAILED - RECOVER ARGS
                   21896: *
                   21897: SRC10  MOV  R$SXL,XL         GET ARG1
                   21898:        MOV  R$SXR,XR         GET ARG2
                   21899:        MOV  (XL),WC          GET TYPE OF KEY1
                   21900:        BEQ  WC,(XR),SRC07    JUMP IF KEYS OF SAME TYPE
                   21901:        MOV  WC,XL            GET BLOCK TYPE WORD
                   21902:        MOV  (XR),XR          GET BLOCK TYPE WORD
                   21903:        LEI  XL               ENTRY POINT ID FOR KEY1
                   21904:        LEI  XR               ENTRY POINT ID FOR KEY2
                   21905:        BGT  XL,XR,SRC05      JUMP IF KEY1 GT KEY2
                   21906:        BRN  SRC03            KEY1 LT KEY2
                   21907: *
                   21908: *      DATATYPE FIELD NAME USED
                   21909: *
                   21910: SRC11  JSR  SORTF            CALL ROUTINE TO FIND FIELD 1
                   21911:        MOV  XL,-(XS)         STACK ITEM POINTER
                   21912:        MOV  XR,XL            GET KEY2
                   21913:        JSR  SORTF            FIND FIELD 2
                   21914:        MOV  XL,XR            PLACE AS KEY2
                   21915:        MOV  (XS)+,XL         RECOVER KEY1
                   21916:        BRN  SRC01            MERGE
                   21917:        ENP                   PROCEDURE SORTC
                   21918:        EJC
                   21919: *
                   21920: *      SORTF -- FIND FIELD FOR SORTC
                   21921: *
                   21922: *      ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
                   21923: *      TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
                   21924: *      DEFINED OBJECT PASSED AS ARGUMENT.
                   21925: *      IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
                   21926: *      NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
                   21927: *      SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
                   21928: *      DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
                   21929: *
                   21930: *      (SRTDF)               VRBLK POINTER OF FIELD NAME
                   21931: *      (XL)                  POSSIBLE PDBLK POINTER
                   21932: *      JSR  SORTF            CALL TO SEARCH FOR FIELD NAME
                   21933: *      (XL)                  ITEM FOUND OR ORIGINAL PDBLK PTR
                   21934: *      (WC)                  DESTROYED
                   21935: *
                   21936: SORTF  PRC  E,0              ENTRY POINT
                   21937:        BNE  (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK
                   21938:        MOV  XR,-(XS)         KEEP XR
                   21939:        MOV  SRTFD,XR         GET POSSIBLE FORMER DFBLK PTR
                   21940:        BZE  XR,SRTF4         JUMP IF NOT
                   21941:        BNE  XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE
                   21942:        BNE  SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME
                   21943:        ADD  SRTFO,XL         ADD OFFSET TO REQUIRED FIELD
                   21944: *
                   21945: *      HERE WITH XL POINTING TO FOUND FIELD
                   21946: *
                   21947: SRTF1  MOV  (XL),XL          GET ITEM FROM FIELD
                   21948: *
                   21949: *      RETURN POINT
                   21950: *
                   21951: SRTF2  MOV  (XS)+,XR         RESTORE XR
                   21952: *
                   21953: SRTF3  EXI                   RETURN
                   21954:        EJC
                   21955: *
                   21956: *      SORTF (CONTINUED)
                   21957: *
                   21958: *      CONDUCT A SEARCH
                   21959: *
                   21960: SRTF4  MOV  XL,XR            COPY ORIGINAL POINTER
                   21961:        MOV  PDDFP(XR),XR     POINT TO DFBLK
                   21962:        MOV  XR,SRTFD         KEEP A COPY
                   21963:        MOV  FARGS(XR),WC     GET NUMBER OF FIELDS
                   21964:        WTB  WC               CONVERT TO BYTES
                   21965:        ADD  DFLEN(XR),XR     POINT PAST LAST FIELD
                   21966: *
                   21967: *      LOOP TO FIND NAME IN PDFBLK
                   21968: *
                   21969: SRTF5  DCA  WC               COUNT DOWN
                   21970:        DCA  XR               POINT IN FRONT
                   21971:        BEQ  (XR),SRTDF,SRTF6 SKIP OUT IF FOUND
                   21972:        BNZ  WC,SRTF5         LOOP
                   21973:        BRN  SRTF2            RETURN - NOT FOUND
                   21974: *
                   21975: *      FOUND
                   21976: *
                   21977: SRTF6  MOV  (XR),SRTFF       KEEP FIELD NAME PTR
                   21978:        ADD  *PDFLD,WC        ADD OFFSET TO FIRST FIELD
                   21979:        MOV  WC,SRTFO         STORE AS FIELD OFFSET
                   21980:        ADD  WC,XL            POINT TO FIELD
                   21981:        BRN  SRTF1            RETURN
                   21982:        ENP                   PROCEDURE SORTF
                   21983:        EJC
                   21984: *
                   21985: *      SORTH -- HEAP ROUTINE FOR SORTA
                   21986: *
                   21987: *      THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
                   21988: *      IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
                   21989: *      A KEY ARRAY.
                   21990: *
                   21991: *      (XS)                  POINTER TO SORT ARRAY BASE
                   21992: *      1(XS)                 POINTER TO KEY ARRAY BASE
                   21993: *      (WA)                  MAX ARRAY INDEX, N (IN BYTES)
                   21994: *      (WC)                  OFFSET J IN A TO ROOT (IN *1 TO *N)
                   21995: *      JSR  SORTH            CALL SORTH(J,N) TO MAKE HEAP
                   21996: *      (XL,XR,WB)            DESTROYED
                   21997: *
                   21998: SORTH  PRC  N,0              ENTRY POINT
                   21999:        MOV  WA,SRTSN         SAVE N
                   22000:        MOV  WC,SRTWC         KEEP WC
                   22001:        MOV  (XS),XL          SORT ARRAY BASE ADRS
                   22002:        ADD  SRTSO,XL         ADD OFFSET TO A(0)
                   22003:        ADD  WC,XL            POINT TO A(J)
                   22004:        MOV  (XL),SRTRT       GET OFFSET TO ROOT
                   22005:        ADD  WC,WC            DOUBLE J - CANT EXCEED N
                   22006: *
                   22007: *      LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
                   22008: *
                   22009: SRH01  BGT  WC,SRTSN,SRH03   DONE IF J GT N
                   22010:        BEQ  WC,SRTSN,SRH02   SKIP IF J EQUALS N
                   22011:        MOV  (XS),XR          SORT ARRAY BASE ADRS
                   22012:        MOV  1(XS),XL         KEY ARRAY BASE ADRS
                   22013:        ADD  SRTSO,XR         POINT TO A(0)
                   22014:        ADD  WC,XR            ADRS OF A(J)
                   22015:        MOV  1(XR),WA         GET A(J+1)
                   22016:        MOV  (XR),WB          GET A(J)
                   22017: *
                   22018: *      COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
                   22019: *
                   22020:        JSR  SORTC            COMPARE KEYS - LT(A(J+1),A(J))
                   22021:        PPM  SRH02            A(J+1) LT A(J)
                   22022:        ICA  WC               POINT TO GREATER SON, A(J+1)
                   22023:        EJC
                   22024: *
                   22025: *      SORTH (CONTINUED)
                   22026: *
                   22027: *      COMPARE ROOT WITH GREATER SON
                   22028: *
                   22029: SRH02  MOV  1(XS),XL         KEY ARRAY BASE ADRS
                   22030:        MOV  (XS),XR          GET SORT ARRAY ADDRESS
                   22031:        ADD  SRTSO,XR         ADRS OF A(0)
                   22032:        MOV  XR,WB            COPY THIS ADRS
                   22033:        ADD  WC,XR            ADRS OF GREATER SON, A(J)
                   22034:        MOV  (XR),WA          GET A(J)
                   22035:        MOV  WB,XR            POINT BACK TO A(0)
                   22036:        MOV  SRTRT,WB         GET ROOT
                   22037:        JSR  SORTC            COMPARE THEM - LT(A(J),ROOT)
                   22038:        PPM  SRH03            FATHER EXCEEDS SONS - DONE
                   22039:        MOV  (XS),XR          GET SORT ARRAY ADRS
                   22040:        ADD  SRTSO,XR         POINT TO A(0)
                   22041:        MOV  XR,XL            COPY IT
                   22042:        MOV  WC,WA            COPY J
                   22043:        BTW  WC               CONVERT TO WORDS
                   22044:        RSH  WC,1             GET J/2
                   22045:        WTB  WC               CONVERT BACK TO BYTES
                   22046:        ADD  WA,XL            POINT TO A(J)
                   22047:        ADD  WC,XR            ADRS OF A(J/2)
                   22048:        MOV  (XL),(XR)        A(J/2) = A(J)
                   22049:        MOV  WA,WC            RECOVER J
                   22050:        AOV  WC,WC,SRH03      J = J*2. DONE IF TOO BIG
                   22051:        BRN  SRH01            LOOP
                   22052: *
                   22053: *      FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
                   22054: *
                   22055: SRH03  BTW  WC               CONVERT TO WORDS
                   22056:        RSH  WC,1             J = J/2
                   22057:        WTB  WC               CONVERT BACK TO BYTES
                   22058:        MOV  (XS),XR          SORT ARRAY ADRS
                   22059:        ADD  SRTSO,XR         ADRS OF A(0)
                   22060:        ADD  WC,XR            ADRS OF A(J/2)
                   22061:        MOV  SRTRT,(XR)       A(J/2) = ROOT
                   22062:        MOV  SRTSN,WA         RESTORE WA
                   22063:        MOV  SRTWC,WC         RESTORE WC
                   22064:        EXI                   RETURN
                   22065:        ENP                   END PROCEDURE SORTH
                   22066:        EJC
                   22067: .FI
                   22068:        EJC
                   22069: *
                   22070: *      TFIND -- LOCATE TABLE ELEMENT
                   22071: *
                   22072: *      (XR)                  SUBSCRIPT VALUE FOR ELEMENT
                   22073: *      (XL)                  POINTER TO TABLE
                   22074: *      (WB)                  ZERO BY VALUE, NON-ZERO BY NAME
                   22075: *      JSR  TFIND            CALL TO LOCATE ELEMENT
                   22076: *      PPM  LOC              TRANSFER LOCATION IF ACCESS FAILS
                   22077: *      (XR)                  ELEMENT VALUE (IF BY VALUE)
                   22078: *      (XR)                  DESTROYED (IF BY NAME)
                   22079: *      (XL,WA)               TEBLK NAME (IF BY NAME)
                   22080: *      (XL,WA)               DESTROYED (IF BY VALUE)
                   22081: *      (WC,RA)               DESTROYED
                   22082: *
                   22083: *      NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
                   22084: *      SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
                   22085: *
                   22086: TFIND  PRC  E,1              ENTRY POINT
                   22087:        MOV  WB,-(XS)         SAVE NAME/VALUE INDICATOR
                   22088:        MOV  XR,-(XS)         SAVE SUBSCRIPT VALUE
                   22089:        MOV  XL,-(XS)         SAVE TABLE POINTER
                   22090:        MOV  TBLEN(XL),WA     LOAD LENGTH OF TBBLK
                   22091:        BTW  WA               CONVERT TO WORD COUNT
                   22092:        SUB  =TBBUK,WA        GET NUMBER OF BUCKETS
                   22093:        MTI  WA               CONVERT TO INTEGER VALUE
                   22094:        STI  TFNSI            SAVE FOR LATER
                   22095:        MOV  (XR),XL          LOAD FIRST WORD OF SUBSCRIPT
                   22096:        LEI  XL               LOAD BLOCK ENTRY ID (BL$XX)
                   22097:        BSW  XL,BL$$D,TFN00   SWITCH ON BLOCK TYPE
                   22098:        IFF  BL$IC,TFN02      JUMP IF INTEGER
                   22099: .IF    .CNRA
                   22100: .ELSE
                   22101:        IFF  BL$RC,TFN02      REAL
                   22102: .FI
                   22103:        IFF  BL$P0,TFN03      JUMP IF PATTERN
                   22104:        IFF  BL$P1,TFN03      JUMP IF PATTERN
                   22105:        IFF  BL$P2,TFN03      JUMP IF PATTERN
                   22106:        IFF  BL$NM,TFN04      JUMP IF NAME
                   22107:        IFF  BL$SC,TFN05      JUMP IF STRING
                   22108:        ESW                   END SWITCH ON BLOCK TYPE
                   22109: *
                   22110: *      HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
                   22111: *      BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
                   22112: *
                   22113: TFN00  MOV  1(XR),WA         LOAD SECOND WORD
                   22114: *
                   22115: *      MERGE HERE WITH ONE WORD HASH SOURCE IN WA
                   22116: *
                   22117: TFN01  MTI  WA               CONVERT TO INTEGER
                   22118:        BRN  TFN06            JUMP TO MERGE
                   22119:        EJC
                   22120: *
                   22121: *      TFIND (CONTINUED)
                   22122: *
                   22123: *      HERE FOR INTEGER OR REAL
                   22124: *
                   22125: TFN02  LDI  1(XR)            LOAD VALUE AS HASH SOURCE
                   22126:        IGE  TFN06            OK IF POSITIVE OR ZERO
                   22127:        NGI                   MAKE POSITIVE
                   22128:        IOV  TFN06            CLEAR POSSIBLE OVERFLOW
                   22129:        BRN  TFN06            MERGE
                   22130: *
                   22131: *      FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
                   22132: *
                   22133: TFN03  MOV  (XR),WA          LOAD FIRST WORD AS HASH SOURCE
                   22134:        BRN  TFN01            MERGE BACK
                   22135: *
                   22136: *      FOR NAME, USE OFFSET AS HASH SOURCE
                   22137: *
                   22138: TFN04  MOV  NMOFS(XR),WA     LOAD OFFSET AS HASH SOURCE
                   22139:        BRN  TFN01            MERGE BACK
                   22140: *
                   22141: *      HERE FOR STRING
                   22142: *
                   22143: TFN05  JSR  HASHS            CALL ROUTINE TO COMPUTE HASH
                   22144: *
                   22145: *      MERGE HERE WITH HASH SOURCE IN (IA)
                   22146: *
                   22147: TFN06  RMI  TFNSI            COMPUTE HASH INDEX BY REMAINDERING
                   22148:        MFI  WC               GET AS ONE WORD INTEGER
                   22149:        WTB  WC               CONVERT TO BYTE OFFSET
                   22150:        MOV  (XS),XL          GET TABLE PTR AGAIN
                   22151:        ADD  WC,XL            POINT TO PROPER BUCKET
                   22152:        MOV  TBBUK(XL),XR     LOAD FIRST TEBLK POINTER
                   22153:        BEQ  XR,(XS),TFN10    JUMP IF NO TEBLKS ON CHAIN
                   22154: *
                   22155: *      LOOP THROUGH TEBLKS ON HASH CHAIN
                   22156: *
                   22157: TFN07  MOV  XR,WB            SAVE TEBLK POINTER
                   22158:        MOV  TESUB(XR),XR     LOAD SUBSCRIPT VALUE
                   22159:        MOV  1(XS),XL         LOAD INPUT ARGUMENT SUBSCRIPT VAL
                   22160:        JSR  IDENT            COMPARE THEM
                   22161:        PPM  TFN08            JUMP IF EQUAL (IDENT)
                   22162: *
                   22163: *      HERE IF NO MATCH WITH THAT TEBLK
                   22164: *
                   22165:        MOV  WB,XL            RESTORE TEBLK POINTER
                   22166:        MOV  TENXT(XL),XR     POINT TO NEXT TEBLK ON CHAIN
                   22167:        BNE  XR,(XS),TFN07    JUMP IF THERE IS ONE
                   22168: *
                   22169: *      HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
                   22170: *
                   22171:        MOV  *TENXT,WC        SET OFFSET TO LINK FIELD (XL BASE)
                   22172:        BRN  TFN11            JUMP TO MERGE
                   22173:        EJC
                   22174: *
                   22175: *      TFIND (CONTINUED)
                   22176: *
                   22177: *      HERE WE HAVE FOUND A MATCHING ELEMENT
                   22178: *
                   22179: TFN08  MOV  WB,XL            RESTORE TEBLK POINTER
                   22180:        MOV  *TEVAL,WA        SET TEBLK NAME OFFSET
                   22181:        MOV  2(XS),WB         RESTORE NAME/VALUE INDICATOR
                   22182:        BNZ  WB,TFN09         JUMP IF CALLED BY NAME
                   22183:        JSR  ACESS            ELSE GET VALUE
                   22184:        PPM  TFN12            JUMP IF REFERENCE FAILS
                   22185:        ZER  WB               RESTORE NAME/VALUE INDICATOR
                   22186: *
                   22187: *      COMMON EXIT FOR ENTRY FOUND
                   22188: *
                   22189: TFN09  ADD  *NUM03,XS        POP STACK ENTRIES
                   22190:        EXI                   RETURN TO TFIND CALLER
                   22191: *
                   22192: *      HERE IF NO TEBLKS ON THE HASH CHAIN
                   22193: *
                   22194: TFN10  ADD  *TBBUK,WC        GET OFFSET TO BUCKET PTR
                   22195:        MOV  (XS),XL          SET TBBLK PTR AS BASE
                   22196: *
                   22197: *      MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
                   22198: *
                   22199: TFN11  MOV  (XS),XR          TBBLK POINTER
                   22200:        MOV  TBINV(XR),XR     LOAD DEFAULT VALUE IN CASE
                   22201:        MOV  2(XS),WB         LOAD NAME/VALUE INDICATOR
                   22202:        BZE  WB,TFN09         EXIT WITH DEFAULT IF VALUE CALL
                   22203: *
                   22204: *      HERE WE MUST BUILD A NEW TEBLK
                   22205: *
                   22206:        MOV  *TESI$,WA        SET SIZE OF TEBLK
                   22207:        JSR  ALLOC            ALLOCATE TEBLK
                   22208:        ADD  WC,XL            POINT TO HASH LINK
                   22209:        MOV  XR,(XL)          LINK NEW TEBLK AT END OF CHAIN
                   22210:        MOV  =B$TET,(XR)      STORE TYPE WORD
                   22211:        MOV  =NULLS,TEVAL(XR) SET NULL AS INITIAL VALUE
                   22212:        MOV  (XS)+,TENXT(XR)  SET TBBLK PTR TO MARK END OF CHAIN
                   22213:        MOV  (XS)+,TESUB(XR)  STORE SUBSCRIPT VALUE
                   22214:        ICA  XS               POP PAST NAME/VALUE INDICATOR
                   22215:        MOV  XR,XL            COPY TEBLK POINTER (NAME BASE)
                   22216:        MOV  *TEVAL,WA        SET OFFSET
                   22217:        EXI                   RETURN TO CALLER WITH NEW TEBLK
                   22218: *
                   22219: *      ACESS FAIL RETURN
                   22220: *
                   22221: TFN12  EXI  1                ALTERNATIVE RETURN
                   22222:        ENP                   END PROCEDURE TFIND
                   22223:        EJC
                   22224: *
                   22225: *      TRACE -- SET/RESET A TRACE ASSOCIATION
                   22226: *
                   22227: *      THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
                   22228: *      EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
                   22229: *
                   22230: *      (XL)                  TRBLK PTR (TRACE) OR ZERO (STOPTR)
                   22231: *      1(XS)                 FIRST ARGUMENT (NAME)
                   22232: *      0(XS)                 SECOND ARGUMENT (TRACE TYPE)
                   22233: *      JSR  TRACE            CALL TO SET/RESET TRACE
                   22234: *      PPM  LOC              TRANSFER LOC IF 1ST ARG IS BAD NAME
                   22235: *      PPM  LOC              TRANSFER LOC IF 2ND ARG IS BAD TYPE
                   22236: *      (XS)                  POPPED
                   22237: *      (XL,XR,WA,WB,WC,IA)   DESTROYED
                   22238: *
                   22239: TRACE  PRC  N,2              ENTRY POINT
                   22240:        JSR  GTSTG            GET TRACE TYPE STRING
                   22241:        PPM  TRC15            JUMP IF NOT STRING
                   22242:        PLC  XR               ELSE POINT TO STRING
                   22243:        LCH  WA,(XR)          LOAD FIRST CHARACTER
                   22244: .IF    .CULC
                   22245:        FLC  WA               FOLD TO UPPER CASE
                   22246: .FI
                   22247:        MOV  (XS),XR          LOAD NAME ARGUMENT
                   22248:        MOV  XL,(XS)          STACK TRBLK PTR OR ZERO
                   22249:        MOV  =TRTAC,WC        SET TRTYP FOR ACCESS TRACE
                   22250:        BEQ  WA,=CH$LA,TRC10  JUMP IF A (ACCESS)
                   22251:        MOV  =TRTVL,WC        SET TRTYP FOR VALUE TRACE
                   22252:        BEQ  WA,=CH$LV,TRC10  JUMP IF V (VALUE)
                   22253: .IF    .CULC
                   22254:        BZE  WA,TRC10         JUMP IF BLANK (VALUE)
                   22255: .ELSE
                   22256:        BEQ  WA,=CH$BL,TRC10  JUMP IF BLANK (VALUE)
                   22257: .FI
                   22258: *
                   22259: *      HERE FOR L,K,F,C,R
                   22260: *
                   22261:        BEQ  WA,=CH$LF,TRC01  JUMP IF F (FUNCTION)
                   22262:        BEQ  WA,=CH$LR,TRC01  JUMP IF R (RETURN)
                   22263:        BEQ  WA,=CH$LL,TRC03  JUMP IF L (LABEL)
                   22264:        BEQ  WA,=CH$LK,TRC06  JUMP IF K (KEYWORD)
                   22265:        BNE  WA,=CH$LC,TRC15  ELSE ERROR IF NOT C (CALL)
                   22266: *
                   22267: *      HERE FOR F,C,R
                   22268: *
                   22269: TRC01  JSR  GTNVR            POINT TO VRBLK FOR NAME
                   22270:        PPM  TRC16            JUMP IF BAD NAME
                   22271:        ICA  XS               POP STACK
                   22272:        MOV  VRFNC(XR),XR     POINT TO FUNCTION BLOCK
                   22273:        BNE  (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION
                   22274:        BEQ  WA,=CH$LR,TRC02  JUMP IF R (RETURN)
                   22275:        EJC
                   22276: *
                   22277: *      TRACE (CONTINUED)
                   22278: *
                   22279: *      HERE FOR F,C TO SET/RESET CALL TRACE
                   22280: *
                   22281:        MOV  XL,PFCTR(XR)     SET/RESET CALL TRACE
                   22282:        BEQ  WA,=CH$LC,EXNUL  EXIT WITH NULL IF C (CALL)
                   22283: *
                   22284: *      HERE FOR F,R TO SET/RESET RETURN TRACE
                   22285: *
                   22286: TRC02  MOV  XL,PFRTR(XR)     SET/RESET RETURN TRACE
                   22287:        EXI                   RETURN
                   22288: *
                   22289: *      HERE FOR L TO SET/RESET LABEL TRACE
                   22290: *
                   22291: TRC03  JSR  GTNVR            POINT TO VRBLK
                   22292:        PPM  TRC16            JUMP IF BAD NAME
                   22293:        MOV  VRLBL(XR),XL     LOAD LABEL POINTER
                   22294:        BNE  (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE
                   22295:        MOV  TRLBL(XL),XL     ELSE DELETE OLD TRACE ASSOCIATION
                   22296: *
                   22297: *      HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
                   22298: *
                   22299: TRC04  BEQ  XL,=STNDL,TRC16  ERROR IF UNDEFINED LABEL
                   22300:        MOV  (XS)+,WB         GET TRBLK PTR AGAIN
                   22301:        BZE  WB,TRC05         JUMP IF STOPTR CASE
                   22302:        MOV  WB,VRLBL(XR)     ELSE SET NEW TRBLK POINTER
                   22303:        MOV  =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS
                   22304:        MOV  WB,XR            COPY TRBLK POINTER
                   22305:        MOV  XL,TRLBL(XR)     STORE REAL LABEL IN TRBLK
                   22306:        EXI                   RETURN
                   22307: *
                   22308: *      HERE FOR STOPTR CASE FOR LABEL
                   22309: *
                   22310: TRC05  MOV  XL,VRLBL(XR)     STORE LABEL PTR BACK IN VRBLK
                   22311:        MOV  =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS
                   22312:        EXI                   RETURN
                   22313:        EJC
                   22314: *
                   22315: *      TRACE (CONTINUED)
                   22316: *
                   22317: *      HERE FOR K (KEYWORD)
                   22318: *
                   22319: TRC06  JSR  GTNVR            POINT TO VRBLK
                   22320:        PPM  TRC16            ERROR IF NOT NATURAL VAR
                   22321:        BNZ  VRLEN(XR),TRC16  ERROR IF NOT SYSTEM VAR
                   22322:        ICA  XS               POP STACK
                   22323:        BZE  XL,TRC07         JUMP IF STOPTR CASE
                   22324:        MOV  XR,TRKVR(XL)     STORE VRBLK PTR IN TRBLK FOR KTREX
                   22325: *
                   22326: *      MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO)
                   22327: *
                   22328: TRC07  MOV  VRSVP(XR),XR     POINT TO SVBLK
                   22329:        BEQ  XR,=V$ERT,TRC08  JUMP IF ERRTYPE
                   22330:        BEQ  XR,=V$STC,TRC09  JUMP IF STCOUNT
                   22331:        BNE  XR,=V$FNC,TRC17  ELSE ERROR IF NOT FNCLEVEL
                   22332: *
                   22333: *      FNCLEVEL
                   22334: *
                   22335:        MOV  XL,R$FNC         SET/RESET FNCLEVEL TRACE
                   22336:        EXI                   RETURN
                   22337: *
                   22338: *      ERRTYPE
                   22339: *
                   22340: TRC08  MOV  XL,R$ERT         SET/RESET ERRTYPE TRACE
                   22341:        EXI                   RETURN
                   22342: *
                   22343: *      STCOUNT
                   22344: *
                   22345: TRC09  MOV  XL,R$STC         SET/RESET STCOUNT TRACE
                   22346:        EXI                   RETURN
                   22347:        EJC
                   22348: *
                   22349: *      TRACE (CONTINUED)
                   22350: *
                   22351: *      A,V MERGE HERE WITH TRTYP VALUE IN WC
                   22352: *
                   22353: TRC10  JSR  GTVAR            LOCATE VARIABLE
                   22354:        PPM  TRC16            ERROR IF NOT APPROPRIATE NAME
                   22355:        MOV  (XS)+,WB         GET NEW TRBLK PTR AGAIN
                   22356:        ADD  XL,WA            POINT TO VARIABLE LOCATION
                   22357:        MOV  WA,XR            COPY VARIABLE POINTER
                   22358: *
                   22359: *      LOOP TO SEARCH TRBLK CHAIN
                   22360: *
                   22361: TRC11  MOV  (XR),XL          POINT TO NEXT ENTRY
                   22362:        BNE  (XL),=B$TRT,TRC13  JUMP IF NOT TRBLK
                   22363:        BLT  WC,TRTYP(XL),TRC13 JUMP IF TOO FAR OUT ON CHAIN
                   22364:        BEQ  WC,TRTYP(XL),TRC12 JUMP IF THIS MATCHES OUR TYPE
                   22365:        ADD  *TRNXT,XL        ELSE POINT TO LINK FIELD
                   22366:        MOV  XL,XR            COPY POINTER
                   22367:        BRN  TRC11            AND LOOP BACK
                   22368: *
                   22369: *      HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN
                   22370: *
                   22371: TRC12  MOV  TRNXT(XL),XL     GET PTR TO NEXT BLOCK OR VALUE
                   22372:        MOV  XL,(XR)          STORE TO DELETE THIS TRBLK
                   22373: *
                   22374: *      HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE
                   22375: *
                   22376: TRC13  BZE  WB,TRC14         JUMP IF STOPTR CASE
                   22377:        MOV  WB,(XR)          ELSE LINK NEW TRBLK IN
                   22378:        MOV  WB,XR            COPY TRBLK POINTER
                   22379:        MOV  XL,TRNXT(XR)     STORE FORWARD POINTER
                   22380:        MOV  WC,TRTYP(XR)     STORE APPROPRIATE TRAP TYPE CODE
                   22381: *
                   22382: *      HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY
                   22383: *
                   22384: TRC14  MOV  WA,XR            RECALL POSSIBLE VRBLK POINTER
                   22385:        SUB  *VRVAL,XR        POINT BACK TO VRBLK
                   22386:        JSR  SETVR            SET FIELDS IF VRBLK
                   22387:        EXI                   RETURN
                   22388: *
                   22389: *      HERE FOR BAD TRACE TYPE
                   22390: *
                   22391: TRC15  EXI  2                TAKE BAD TRACE TYPE ERROR EXIT
                   22392: *
                   22393: *      POP STACK BEFORE FAILING
                   22394: *
                   22395: TRC16  ICA  XS               POP STACK
                   22396: *
                   22397: *      HERE FOR BAD NAME ARGUMENT
                   22398: *
                   22399: TRC17  EXI  1                TAKE BAD NAME ERROR EXIT
                   22400:        ENP                   END PROCEDURE TRACE
                   22401:        EJC
                   22402: *
                   22403: *      TRBLD -- BUILD TRBLK
                   22404: *
                   22405: *      TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
                   22406: *      TO CONSTRUCT A TRBLK (TRAP BLOCK)
                   22407: *
                   22408: *      (XR)                  TRTAG OR TRTER
                   22409: *      (XL)                  TRFNC OR TRFPT
                   22410: *      (WB)                  TRTYP
                   22411: *      JSR  TRBLD            CALL TO BUILD TRBLK
                   22412: *      (XR)                  POINTER TO TRBLK
                   22413: *      (WA)                  DESTROYED
                   22414: *
                   22415: TRBLD  PRC  E,0              ENTRY POINT
                   22416:        MOV  XR,-(XS)         STACK TRTAG (OR TRFNM)
                   22417:        MOV  *TRSI$,WA        SET SIZE OF TRBLK
                   22418:        JSR  ALLOC            ALLOCATE TRBLK
                   22419:        MOV  =B$TRT,(XR)      STORE FIRST WORD
                   22420:        MOV  XL,TRFNC(XR)     STORE TRFNC (OR TRFPT)
                   22421:        MOV  (XS)+,TRTAG(XR)  STORE TRTAG (OR TRFNM)
                   22422:        MOV  WB,TRTYP(XR)     STORE TYPE
                   22423:        MOV  =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE
                   22424:        EXI                   RETURN TO CALLER
                   22425:        ENP                   END PROCEDURE TRBLD
                   22426:        EJC
                   22427: *
                   22428: *      TRIMR -- TRIM TRAILING BLANKS
                   22429: *
                   22430: *      TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
                   22431: *      LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
                   22432: *      TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
                   22433: *      THE END OF THE (POSSIBLY) SHORTENED BLOCK.
                   22434: *
                   22435: *      (WB)                  NON-ZERO TO TRIM TRAILING BLANKS
                   22436: *      (XR)                  POINTER TO STRING TO TRIM
                   22437: *      JSR  TRIMR            CALL TO TRIM STRING
                   22438: *      (XR)                  POINTER TO TRIMMED STRING
                   22439: *      (XL,WA,WB,WC)         DESTROYED
                   22440: *
                   22441: *      THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
                   22442: *      AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
                   22443: *
                   22444: TRIMR  PRC  E,0              ENTRY POINT
                   22445:        MOV  XR,XL            COPY STRING POINTER
                   22446:        MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   22447:        BZE  WA,TRIM2         JUMP IF NULL INPUT
                   22448:        PLC  XL,WA            ELSE POINT PAST LAST CHARACTER
                   22449:        BZE  WB,TRIM3         JUMP IF NO TRIM
                   22450:        MOV  =CH$BL,WC        LOAD BLANK CHARACTER
                   22451: *
                   22452: *      LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
                   22453: *
                   22454: TRIM0  LCH  WB,-(XL)         LOAD NEXT CHARACTER
                   22455: .IF    .CAHT
                   22456:        BEQ  WB,=CH$HT,TRIM1  JUMP IF HORIZONTAL TAB
                   22457: .FI
                   22458:        BNE  WB,WC,TRIM3      JUMP IF NON-BLANK FOUND
                   22459: TRIM1  DCV  WA               ELSE DECREMENT CHARACTER COUNT
                   22460:        BNZ  WA,TRIM0         LOOP BACK IF MORE TO CHECK
                   22461: *
                   22462: *      HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
                   22463: *
                   22464: TRIM2  MOV  XR,DNAMP         WIPE OUT INPUT STRING BLOCK
                   22465:        MOV  =NULLS,XR        LOAD NULL RESULT
                   22466:        BRN  TRIM5            MERGE TO EXIT
                   22467:        EJC
                   22468: *
                   22469: *      TRIMR (CONTINUED)
                   22470: *
                   22471: *      HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
                   22472: *
                   22473: TRIM3  MOV  WA,SCLEN(XR)     SET NEW LENGTH
                   22474:        MOV  XR,XL            COPY STRING POINTER
                   22475:        PSC  XL,WA            READY FOR STORING BLANKS
                   22476:        CTB  WA,SCHAR         GET LENGTH OF BLOCK IN BYTES
                   22477:        ADD  XR,WA            POINT PAST NEW BLOCK
                   22478:        MOV  WA,DNAMP         SET NEW TOP OF STORAGE POINTER
                   22479:        LCT  WA,=CFP$C        GET COUNT OF CHARS IN WORD
                   22480:        ZER  WC               SET BLANK CHAR
                   22481: *
                   22482: *      LOOP TO ZERO PAD LAST WORD OF CHARACTERS
                   22483: *
                   22484: TRIM4  SCH  WC,(XL)+         STORE ZERO CHARACTER
                   22485:        BCT  WA,TRIM4         LOOP BACK TILL ALL STORED
                   22486:        CSC  XL               COMPLETE STORE CHARACTERS
                   22487: *
                   22488: *      COMMON EXIT POINT
                   22489: *
                   22490: TRIM5  ZER  XL               CLEAR GARBAGE XL POINTER
                   22491:        EXI                   RETURN TO CALLER
                   22492:        ENP                   END PROCEDURE TRIMR
                   22493:        EJC
                   22494: *
                   22495: *      TRXEQ -- EXECUTE FUNCTION TYPE TRACE
                   22496: *
                   22497: *      TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
                   22498: *      HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
                   22499: *
                   22500: *      (XR)                  POINTER TO TRBLK
                   22501: *      (XL,WA)               NAME BASE,OFFSET FOR VARIABLE
                   22502: *      JSR  TRXEQ            CALL TO EXECUTE TRACE
                   22503: *      (WB,WC,RA)            DESTROYED
                   22504: *
                   22505: *      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
                   22506: *      CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
                   22507: *
                   22508: *                            TRXEQ RETURN POINT WORD(S)
                   22509: *                            SAVED VALUE OF TRACE KEYWORD
                   22510: *                            TRBLK POINTER
                   22511: *                            NAME BASE
                   22512: *                            NAME OFFSET
                   22513: *                            SAVED VALUE OF R$COD
                   22514: *                            SAVED CODE PTR (-R$COD)
                   22515: *                            SAVED VALUE OF FLPTR
                   22516: *      FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
                   22517: *                            NMBLK FOR VARIABLE NAME
                   22518: *      XS ------------------ TRACE TAG
                   22519: *
                   22520: *      R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
                   22521: *      CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
                   22522: *      OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
                   22523: *
                   22524: TRXEQ  PRC  R,0              ENTRY POINT (RECURSIVE)
                   22525:        MOV  R$COD,WC         LOAD CODE BLOCK POINTER
                   22526:        SCP  WB               GET CURRENT CODE POINTER
                   22527:        SUB  WC,WB            MAKE CODE POINTER INTO OFFSET
                   22528:        MOV  KVTRA,-(XS)      STACK TRACE KEYWORD VALUE
                   22529:        MOV  XR,-(XS)         STACK TRBLK POINTER
                   22530:        MOV  XL,-(XS)         STACK NAME BASE
                   22531:        MOV  WA,-(XS)         STACK NAME OFFSET
                   22532:        MOV  WC,-(XS)         STACK CODE BLOCK POINTER
                   22533:        MOV  WB,-(XS)         STACK CODE POINTER OFFSET
                   22534:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   22535:        ZER  -(XS)            SET DUMMY FAIL OFFSET
                   22536:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   22537:        ZER  KVTRA            RESET TRACE KEYWORD TO ZERO
                   22538:        MOV  =TRXDC,WC        LOAD NEW (DUMMY) CODE BLK POINTER
                   22539:        MOV  WC,R$COD         SET AS CODE BLOCK POINTER
                   22540:        LCP  WC               AND NEW CODE POINTER
                   22541:        EJC
                   22542: *
                   22543: *      TRXEQ (CONTINUED)
                   22544: *
                   22545: *      NOW PREPARE ARGUMENTS FOR FUNCTION
                   22546: *
                   22547:        MOV  WA,WB            SAVE NAME OFFSET
                   22548:        MOV  *NMSI$,WA        LOAD NMBLK SIZE
                   22549:        JSR  ALLOC            ALLOCATE SPACE FOR NMBLK
                   22550:        MOV  =B$NML,(XR)      SET TYPE WORD
                   22551:        MOV  XL,NMBAS(XR)     STORE NAME BASE
                   22552:        MOV  WB,NMOFS(XR)     STORE NAME OFFSET
                   22553:        MOV  6(XS),XL         RELOAD POINTER TO TRBLK
                   22554:        MOV  XR,-(XS)         STACK NMBLK POINTER (1ST ARGUMENT)
                   22555:        MOV  TRTAG(XL),-(XS)  STACK TRACE TAG (2ND ARGUMENT)
                   22556:        MOV  TRFNC(XL),XL     LOAD TRACE FUNCTION POINTER
                   22557:        MOV  =NUM02,WA        SET NUMBER OF ARGUMENTS TO TWO
                   22558:        BRN  CFUNC            JUMP TO CALL FUNCTION
                   22559: *
                   22560: *      SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
                   22561: *
                   22562: TRXQ1  MOV  FLPTR,XS         POINT BACK TO OUR STACK ENTRIES
                   22563:        ICA  XS               POP OFF GARBAGE FAIL OFFSET
                   22564:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   22565:        MOV  (XS)+,WB         RELOAD CODE OFFSET
                   22566:        MOV  (XS)+,WC         LOAD OLD CODE BASE POINTER
                   22567:        MOV  WC,XR            COPY CDBLK POINTER
                   22568:        MOV  CDSTM(XR),KVSTN  RESTORE STMNT NO
                   22569:        MOV  (XS)+,WA         RELOAD NAME OFFSET
                   22570:        MOV  (XS)+,XL         RELOAD NAME BASE
                   22571:        MOV  (XS)+,XR         RELOAD TRBLK POINTER
                   22572:        MOV  (XS)+,KVTRA      RESTORE TRACE KEYWORD VALUE
                   22573:        ADD  WC,WB            RECOMPUTE ABSOLUTE CODE POINTER
                   22574:        LCP  WB               RESTORE CODE POINTER
                   22575:        MOV  WC,R$COD         AND CODE BLOCK POINTER
                   22576:        EXI                   RETURN TO TRXEQ CALLER
                   22577:        ENP                   END PROCEDURE TRXEQ
                   22578:        EJC
                   22579: *
                   22580: *      XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
                   22581: *
                   22582: *      XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
                   22583: *      ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
                   22584: *      CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
                   22585: *      PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
                   22586: *
                   22587: *      R$XSC                 POINTER TO SCBLK FOR FUNCTION ARG
                   22588: *      XSOFS                 OFFSET (NUM CHARS SCANNED SO FAR)
                   22589: *
                   22590: *      (WC)                  DELIMITER ONE (CH$XX)
                   22591: *      (XL)                  DELIMITER TWO (CH$XX)
                   22592: *      JSR  XSCAN            CALL TO SCAN NEXT ITEM
                   22593: *      (XR)                  POINTER TO SCBLK FOR TOKEN SCANNED
                   22594: *      (WA)                  COMPLETION CODE (SEE BELOW)
                   22595: *      (WC,XL)               DESTROYED
                   22596: *
                   22597: *      THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
                   22598: *      UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS.
                   22599: *
                   22600: *      1)   DELIMITER ONE IS ENCOUNTERED  (WA SET TO 1)
                   22601: *
                   22602: *      2)   DELIMITER TWO ENCOUNTERED  (WA SET TO 2)
                   22603: *
                   22604: *      3)   END OF STRING ENCOUNTERED  (WA SET TO 0)
                   22605: *
                   22606: *      THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
                   22607: *      UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
                   22608: *      THE POINTER IS LEFT POINTING PAST THE DELIMITER.
                   22609: *
                   22610: *      IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
                   22611: *      AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
                   22612: *
                   22613: *      IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
                   22614: *      STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
                   22615: *      STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
                   22616: *      XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
                   22617:        EJC
                   22618: *
                   22619: *      XSCAN (CONTINUED)
                   22620: *
                   22621: XSCAN  PRC  E,0              ENTRY POINT
                   22622:        MOV  WB,XSCWB         PRESERVE WB
                   22623:        MOV  R$XSC,XR         POINT TO ARGUMENT STRING
                   22624:        MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   22625:        MOV  XSOFS,WB         LOAD CURRENT OFFSET
                   22626:        SUB  WB,WA            GET NUMBER OF REMAINING CHARACTERS
                   22627:        BZE  WA,XSCN2         JUMP IF NO CHARACTERS LEFT
                   22628:        PLC  XR,WB            POINT TO CURRENT CHARACTER
                   22629: *
                   22630: *      LOOP TO SEARCH FOR DELIMITER
                   22631: *
                   22632: XSCN1  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   22633:        BEQ  WB,WC,XSCN3      JUMP IF DELIMITER ONE FOUND
                   22634:        BEQ  WB,XL,XSCN4      JUMP IF DELIMITER TWO FOUND
                   22635:        DCV  WA               DECREMENT COUNT OF CHARS LEFT
                   22636:        BNZ  WA,XSCN1         LOOP BACK IF MORE CHARS TO GO
                   22637: *
                   22638: *      HERE FOR RUNOUT
                   22639: *
                   22640: XSCN2  MOV  R$XSC,XL         POINT TO STRING BLOCK
                   22641:        MOV  SCLEN(XL),WA     GET STRING LENGTH
                   22642:        MOV  XSOFS,WB         LOAD OFFSET
                   22643:        SUB  WB,WA            GET SUBSTRING LENGTH
                   22644:        ZER  R$XSC            CLEAR STRING PTR FOR COLLECTOR
                   22645:        ZER  XSCRT            SET ZERO (RUNOUT) RETURN CODE
                   22646:        BRN  XSCN6            JUMP TO EXIT
                   22647:        EJC
                   22648: *
                   22649: *      XSCAN (CONTINUED)
                   22650: *
                   22651: *      HERE IF DELIMITER ONE FOUND
                   22652: *
                   22653: XSCN3  MOV  =NUM01,XSCRT     SET RETURN CODE
                   22654:        BRN  XSCN5            JUMP TO MERGE
                   22655: *
                   22656: *      HERE IF DELIMITER TWO FOUND
                   22657: *
                   22658: XSCN4  MOV  =NUM02,XSCRT     SET RETURN CODE
                   22659: *
                   22660: *      MERGE HERE AFTER DETECTING A DELIMITER
                   22661: *
                   22662: XSCN5  MOV  R$XSC,XL         RELOAD POINTER TO STRING
                   22663:        MOV  SCLEN(XL),WC     GET ORIGINAL LENGTH OF STRING
                   22664:        SUB  WA,WC            MINUS CHARS LEFT = CHARS SCANNED
                   22665:        MOV  WC,WA            MOVE TO REG FOR SBSTR
                   22666:        MOV  XSOFS,WB         SET OFFSET
                   22667:        SUB  WB,WA            COMPUTE LENGTH FOR SBSTR
                   22668:        ICV  WC               ADJUST NEW CURSOR PAST DELIMITER
                   22669:        MOV  WC,XSOFS         STORE NEW OFFSET
                   22670: *
                   22671: *      COMMON EXIT POINT
                   22672: *
                   22673: XSCN6  ZER  XR               CLEAR GARBAGE CHARACTER PTR IN XR
                   22674:        JSR  SBSTR            BUILD SUB-STRING
                   22675:        MOV  XSCRT,WA         LOAD RETURN CODE
                   22676:        MOV  XSCWB,WB         RESTORE WB
                   22677:        EXI                   RETURN TO XSCAN CALLER
                   22678:        ENP                   END PROCEDURE XSCAN
                   22679:        EJC
                   22680: *
                   22681: *      XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
                   22682: *
                   22683: *      XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
                   22684: *      IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
                   22685: *      XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
                   22686: *
                   22687: *      -(XS)                 ARGUMENT TO BE SCANNED (ON STACK)
                   22688: *      JSR  XSCNI            CALL TO SCAN ARGUMENT
                   22689: *      PPM  LOC              TRANSFER LOC IF ARG IS NOT STRING
                   22690: *      PPM  LOC              TRANSFER LOC IF ARGUMENT IS NULL
                   22691: *      (XS)                  POPPED
                   22692: *      (XR,R$XSC)            ARGUMENT (SCBLK PTR)
                   22693: *      (WA)                  ARGUMENT LENGTH
                   22694: *      (IA,RA)               DESTROYED
                   22695: *
                   22696: XSCNI  PRC  N,2              ENTRY POINT
                   22697:        JSR  GTSTG            FETCH ARGUMENT AS STRING
                   22698:        PPM  XSCI1            JUMP IF NOT CONVERTIBLE
                   22699:        MOV  XR,R$XSC         ELSE STORE SCBLK PTR FOR XSCAN
                   22700:        ZER  XSOFS            SET OFFSET TO ZERO
                   22701:        BZE  WA,XSCI2         JUMP IF NULL STRING
                   22702:        EXI                   RETURN TO XSCNI CALLER
                   22703: *
                   22704: *      HERE IF ARGUMENT IS NOT A STRING
                   22705: *
                   22706: XSCI1  EXI  1                TAKE NOT-STRING ERROR EXIT
                   22707: *
                   22708: *      HERE FOR NULL STRING
                   22709: *
                   22710: XSCI2  EXI  2                TAKE NULL-STRING ERROR EXIT
                   22711:        ENP                   END PROCEDURE XSCNI
                   22712:        TTL  S P I T B O L -- UTILITY ROUTINES
                   22713: *
                   22714: *      THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
                   22715: *      VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
                   22716: *      FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
                   22717: *      THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
                   22718: *      TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
                   22719: *      INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
                   22720: *      PARAMETER VALUES.
                   22721: *
                   22722: *      THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
                   22723: *      DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
                   22724: *      MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
                   22725: *      CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
                   22726: *
                   22727: *      SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
                   22728: *      IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
                   22729: *      EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
                   22730: *      EXITING AFTER COMPLETING ITS TASK.
                   22731: *
                   22732: *      THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
                   22733: *      AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
                   22734:        EJC
                   22735: *      ARREF -- ARRAY REFERENCE
                   22736: *
                   22737: *      (XL)                  MAY BE NON-COLLECTABLE
                   22738: *      (XR)                  NUMBER OF SUBSCRIPTS
                   22739: *      (WB)                  SET ZERO/NONZERO FOR VALUE/NAME
                   22740: *                            THE VALUE IN WB MUST BE COLLECTABLE
                   22741: *      STACK                 SUBSCRIPTS AND ARRAY OPERAND
                   22742: *      BRN  ARREF            JUMP TO CALL FUNCTION
                   22743: *
                   22744: *      ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
                   22745: *      THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
                   22746: *      TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
                   22747: *      ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
                   22748: *      WORKING BELOW THE STACK POINTER.
                   22749: *
                   22750: ARREF  RTN
                   22751:        MOV  XR,WA            COPY NUMBER OF SUBSCRIPTS
                   22752:        MOV  XS,XT            POINT TO STACK FRONT
                   22753:        WTB  XR               CONVERT TO BYTE OFFSET
                   22754:        ADD  XR,XT            POINT TO ARRAY OPERAND ON STACK
                   22755:        ICA  XT               FINAL VALUE FOR STACK POPPING
                   22756:        MOV  XT,ARFXS         KEEP FOR LATER
                   22757:        MOV  -(XT),XR         LOAD ARRAY OPERAND POINTER
                   22758:        MOV  XR,R$ARF         KEEP ARRAY POINTER
                   22759:        MOV  XT,XR            SAVE POINTER TO SUBSCRIPTS
                   22760:        MOV  R$ARF,XL         POINT XL TO POSSIBLE VCBLK OR TBBLK
                   22761:        MOV  (XL),WC          LOAD FIRST WORD
                   22762:        BEQ  WC,=B$ART,ARF01  JUMP IF ARBLK
                   22763:        BEQ  WC,=B$VCT,ARF07  JUMP IF VCBLK
                   22764:        BEQ  WC,=B$TBT,ARF10  JUMP IF TBBLK
                   22765:        ERB  235,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY
                   22766: *
                   22767: *      HERE FOR ARRAY (ARBLK)
                   22768: *
                   22769: ARF01  BNE  WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS
                   22770:        LDI  INTV0            GET INITIAL SUBSCRIPT OF ZERO
                   22771:        MOV  XR,XT            POINT BEFORE SUBSCRIPTS
                   22772:        ZER  WA               INITIAL OFFSET TO BOUNDS
                   22773:        BRN  ARF03            JUMP INTO LOOP
                   22774: *
                   22775: *      LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
                   22776: *
                   22777: ARF02  MLI  ARDM2(XR)        MULTIPLY TOTAL BY NEXT DIMENSION
                   22778: *
                   22779: *      MERGE HERE FIRST TIME
                   22780: *
                   22781: ARF03  MOV  -(XT),XR         LOAD NEXT SUBSCRIPT
                   22782:        STI  ARFSI            SAVE CURRENT SUBSCRIPT
                   22783:        LDI  ICVAL(XR)        LOAD INTEGER VALUE IN CASE
                   22784:        BEQ  (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER
                   22785:        EJC
                   22786: *
                   22787: *      ARREF (CONTINUED)
                   22788: *
                   22789: *
                   22790:        JSR  GTINT            CONVERT TO INTEGER
                   22791:        PPM  ARF12            JUMP IF NOT INTEGER
                   22792:        LDI  ICVAL(XR)        IF OK, LOAD INTEGER VALUE
                   22793: *
                   22794: *      HERE WITH INTEGER SUBSCRIPT IN (IA)
                   22795: *
                   22796: ARF04  MOV  R$ARF,XR         POINT TO ARRAY
                   22797:        ADD  WA,XR            OFFSET TO NEXT BOUNDS
                   22798:        SBI  ARLBD(XR)        SUBTRACT LOW BOUND TO COMPARE
                   22799:        IOV  ARF13            OUT OF RANGE FAIL IF OVERFLOW
                   22800:        ILT  ARF13            OUT OF RANGE FAIL IF TOO SMALL
                   22801:        SBI  ARDIM(XR)        SUBTRACT DIMENSION
                   22802:        IGE  ARF13            OUT OF RANGE FAIL IF TOO LARGE
                   22803:        ADI  ARDIM(XR)        ELSE RESTORE SUBSCRIPT OFFSET
                   22804:        ADI  ARFSI            ADD TO CURRENT TOTAL
                   22805:        ADD  *ARDMS,WA        POINT TO NEXT BOUNDS
                   22806:        BNE  XT,XS,ARF02      LOOP BACK IF MORE TO GO
                   22807: *
                   22808: *      HERE WITH INTEGER SUBSCRIPT COMPUTED
                   22809: *
                   22810:        MFI  WA               GET AS ONE WORD INTEGER
                   22811:        WTB  WA               CONVERT TO OFFSET
                   22812:        MOV  R$ARF,XL         POINT TO ARBLK
                   22813:        ADD  AROFS(XL),WA     ADD OFFSET PAST BOUNDS
                   22814:        ICA  WA               ADJUST FOR ARPRO FIELD
                   22815:        BNZ  WB,ARF08         EXIT WITH NAME IF NAME CALL
                   22816: *
                   22817: *      MERGE HERE TO GET VALUE FOR VALUE CALL
                   22818: *
                   22819: ARF05  JSR  ACESS            GET VALUE
                   22820:        PPM  ARF13            FAIL IF ACESS FAILS
                   22821: *
                   22822: *      RETURN VALUE
                   22823: *
                   22824: ARF06  MOV  ARFXS,XS         POP STACK ENTRIES
                   22825:        ZER  R$ARF            FINISHED WITH ARRAY POINTER
                   22826:        BRN  EXIXR            EXIT WITH VALUE IN XR
                   22827:        EJC
                   22828: *
                   22829: *      ARREF (CONTINUED)
                   22830: *
                   22831: *      HERE FOR VECTOR
                   22832: *
                   22833: ARF07  BNE  WA,=NUM01,ARF09  ERROR IF MORE THAN 1 SUBSCRIPT
                   22834:        MOV  (XS),XR          ELSE LOAD SUBSCRIPT
                   22835:        JSR  GTINT            CONVERT TO INTEGER
                   22836:        PPM  ARF12            ERROR IF NOT INTEGER
                   22837:        LDI  ICVAL(XR)        ELSE LOAD INTEGER VALUE
                   22838:        SBI  INTV1            SUBTRACT FOR ONES OFFSET
                   22839:        MFI  WA,ARF13         GET SUBSCRIPT AS ONE WORD
                   22840:        ADD  =VCVLS,WA        ADD OFFSET FOR STANDARD FIELDS
                   22841:        WTB  WA               CONVERT OFFSET TO BYTES
                   22842:        BGE  WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT
                   22843:        BZE  WB,ARF05         BACK TO GET VALUE IF VALUE CALL
                   22844: *
                   22845: *      RETURN NAME
                   22846: *
                   22847: ARF08  MOV  ARFXS,XS         POP STACK ENTRIES
                   22848:        ZER  R$ARF            FINISHED WITH ARRAY POINTER
                   22849:        BRN  EXNAM            ELSE EXIT WITH NAME
                   22850: *
                   22851: *      HERE IF SUBSCRIPT COUNT IS WRONG
                   22852: *
                   22853: ARF09  ERB  236,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
                   22854: *
                   22855: *      TABLE
                   22856: *
                   22857: ARF10  BNE  WA,=NUM01,ARF11  ERROR IF MORE THAN 1 SUBSCRIPT
                   22858:        MOV  (XS),XR          ELSE LOAD SUBSCRIPT
                   22859:        JSR  TFIND            CALL TABLE SEARCH ROUTINE
                   22860:        PPM  ARF13            FAIL IF FAILED
                   22861:        BNZ  WB,ARF08         EXIT WITH NAME IF NAME CALL
                   22862:        BRN  ARF06            ELSE EXIT WITH VALUE
                   22863: *
                   22864: *      HERE FOR BAD TABLE REFERENCE
                   22865: *
                   22866: ARF11  ERB  237,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT
                   22867: *
                   22868: *      HERE FOR BAD SUBSCRIPT
                   22869: *
                   22870: ARF12  ERB  238,ARRAY SUBSCRIPT IS NOT INTEGER
                   22871: *
                   22872: *      HERE TO SIGNAL FAILURE
                   22873: *
                   22874: ARF13  ZER  R$ARF            FINISHED WITH ARRAY POINTER
                   22875:        BRN  EXFAL            FAIL
                   22876:        EJC
                   22877: *
                   22878: *      CFUNC -- CALL A FUNCTION
                   22879: *
                   22880: *      CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
                   22881: *      USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
                   22882: *      TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
                   22883: *      (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
                   22884: *      IF THE NUMBER OF ARGUMENTS IS INCORRECT.
                   22885: *
                   22886: *      (XL)                  POINTER TO FUNCTION BLOCK
                   22887: *      (WA)                  ACTUAL NUMBER OF ARGUMENTS
                   22888: *      (XS)                  POINTS TO STACKED ARGUMENTS
                   22889: *      BRN  CFUNC            JUMP TO CALL FUNCTION
                   22890: *
                   22891: *      CFUNC CONTINUES BY EXECUTING THE FUNCTION
                   22892: *
                   22893: CFUNC  RTN
                   22894:        BLT  WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS
                   22895:        BEQ  WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS
                   22896: *
                   22897: *      HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
                   22898: *
                   22899:        MOV  WA,WB            COPY ACTUAL NUMBER
                   22900:        SUB  FARGS(XL),WB     GET NUMBER OF EXTRA ARGS
                   22901:        WTB  WB               CONVERT TO BYTES
                   22902:        ADD  WB,XS            POP OFF UNWANTED ARGUMENTS
                   22903:        BRN  CFNC3            JUMP TO GO OFF TO FUNCTION
                   22904: *
                   22905: *      HERE IF TOO FEW ARGUMENTS
                   22906: *
                   22907: CFNC1  MOV  FARGS(XL),WB     LOAD REQUIRED NUMBER OF ARGUMENTS
                   22908:        BEQ  WB,=NINI9,CFNC3  JUMP IF CASE OF VAR NUM OF ARGS
                   22909:        SUB  WA,WB            CALCULATE NUMBER MISSING
                   22910:        LCT  WB,WB            SET COUNTER TO CONTROL LOOP
                   22911: *
                   22912: *      LOOP TO SUPPLY EXTRA NULL ARGUMENTS
                   22913: *
                   22914: CFNC2  MOV  =NULLS,-(XS)     STACK A NULL ARGUMENT
                   22915:        BCT  WB,CFNC2         LOOP TILL PROPER NUMBER STACKED
                   22916: *
                   22917: *      MERGE HERE TO JUMP TO FUNCTION
                   22918: *
                   22919: CFNC3  BRI  (XL)             JUMP THROUGH FCODE FIELD
                   22920:        EJC
                   22921: *
                   22922: *      EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
                   22923: *
                   22924: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   22925: *      BRN  EXFAL            JUMP TO FAIL
                   22926: *
                   22927: *      EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
                   22928: *
                   22929: EXFAL  RTN
                   22930:        MOV  FLPTR,XS         POP STACK
                   22931:        MOV  (XS),XR          LOAD FAILURE OFFSET
                   22932:        ADD  R$COD,XR         POINT TO FAILURE CODE LOCATION
                   22933:        LCP  XR               SET CODE POINTER
                   22934:        BRN  EXITS            DO NEXT CODE WORD
                   22935:        EJC
                   22936: *
                   22937: *      EXINT -- EXIT WITH INTEGER RESULT
                   22938: *
                   22939: *      (XL,XR)               MAY BE NONCOLLECTABLE
                   22940: *      (IA)                  INTEGER VALUE
                   22941: *      BRN  EXINT            JUMP TO EXIT WITH INTEGER
                   22942: *
                   22943: *      EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
                   22944: *      WHICH IT DOES BY FALLING THROUGH TO EXIXR
                   22945: *
                   22946: EXINT  RTN
                   22947:        JSR  ICBLD            BUILD ICBLK
                   22948:        EJC
                   22949: *      EXIXR -- EXIT WITH RESULT IN (XR)
                   22950: *
                   22951: *      (XR)                  RESULT
                   22952: *      (XL)                  MAY BE NON-COLLECTABLE
                   22953: *      BRN  EXIXR            JUMP TO EXIT WITH RESULT IN (XR)
                   22954: *
                   22955: *      EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
                   22956: *      WHICH IT DOES BY FALLING THROUGH TO EXITS.
                   22957: EXIXR  RTN
                   22958: *
                   22959:        MOV  XR,-(XS)         STACK RESULT
                   22960: *
                   22961: *
                   22962: *      EXITS -- EXIT WITH RESULT IF ANY STACKED
                   22963: *
                   22964: *      (XR,XL)               MAY BE NON-COLLECTABLE
                   22965: *
                   22966: *      BRN  EXITS            ENTER EXITS ROUTINE
                   22967: *
                   22968: EXITS  RTN
                   22969:        LCW  XR               LOAD NEXT CODE WORD
                   22970:        MOV  (XR),XL          LOAD ENTRY ADDRESS
                   22971:        BRI  XL               JUMP TO EXECUTE NEXT CODE WORD
                   22972:        EJC
                   22973: *
                   22974: *      EXNAM -- EXIT WITH NAME IN (XL,WA)
                   22975: *
                   22976: *      (XL)                  NAME BASE
                   22977: *      (WA)                  NAME OFFSET
                   22978: *      (XR)                  MAY BE NON-COLLECTABLE
                   22979: *      BRN  EXNAM            JUMP TO EXIT WITH NAME IN (XL,WA)
                   22980: *
                   22981: *      EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
                   22982: *
                   22983: EXNAM  RTN
                   22984:        MOV  XL,-(XS)         STACK NAME BASE
                   22985:        MOV  WA,-(XS)         STACK NAME OFFSET
                   22986:        BRN  EXITS            DO NEXT CODE WORD
                   22987:        EJC
                   22988: *
                   22989: *      EXNUL -- EXIT WITH NULL RESULT
                   22990: *
                   22991: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   22992: *      BRN  EXNUL            JUMP TO EXIT WITH NULL VALUE
                   22993: *
                   22994: *      EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
                   22995: *
                   22996: EXNUL  RTN
                   22997:        MOV  =NULLS,-(XS)     STACK NULL VALUE
                   22998:        BRN  EXITS            DO NEXT CODE WORD
                   22999:        EJC
                   23000: .IF    .CNRA
                   23001: .ELSE
                   23002: *
                   23003: *      EXREA -- EXIT WITH REAL RESULT
                   23004: *
                   23005: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   23006: *      (RA)                  REAL VALUE
                   23007: *      BRN  EXREA            JUMP TO EXIT WITH REAL VALUE
                   23008: *
                   23009: *      EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
                   23010: *
                   23011: EXREA  RTN
                   23012:        JSR  RCBLD            BUILD RCBLK
                   23013:        BRN  EXIXR            JUMP TO EXIT WITH RESULT IN XR
                   23014: .FI
                   23015:        EJC
                   23016: *
                   23017: *      EXSID -- EXIT SETTING ID FIELD
                   23018: *
                   23019: *      EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
                   23020: *      BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
                   23021: *
                   23022: *      (XR)                  PTR TO BLOCK WITH IDVAL FIELD
                   23023: *      (XL)                  MAY BE NON-COLLECTABLE
                   23024: *      BRN  EXSID            JUMP TO EXIT AFTER SETTING ID FIELD
                   23025: *
                   23026: *      EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
                   23027: *
                   23028: EXSID  RTN
                   23029:        MOV  CURID,WA         LOAD CURRENT ID VALUE
                   23030:        BNE  WA,=CFP$M,EXSI1  JUMP IF NO OVERFLOW
                   23031:        ZER  WA               ELSE RESET FOR WRAPAROUND
                   23032: *
                   23033: *      HERE WITH OLD IDVAL IN WA
                   23034: *
                   23035: EXSI1  ICV  WA               BUMP ID VALUE
                   23036:        MOV  WA,CURID         STORE FOR NEXT TIME
                   23037:        MOV  WA,IDVAL(XR)     STORE ID VALUE
                   23038:        BRN  EXIXR            EXIT WITH RESULT IN (XR)
                   23039:        EJC
                   23040: *
                   23041: *      EXVNM -- EXIT WITH NAME OF VARIABLE
                   23042: *
                   23043: *      EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
                   23044: *      REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
                   23045: *
                   23046: *      (XR)                  VRBLK POINTER
                   23047: *      (XL)                  MAY BE NON-COLLECTABLE
                   23048: *      BRN  EXVNM            EXIT WITH VRBLK POINTER IN XR
                   23049: *
                   23050: EXVNM  RTN
                   23051:        MOV  XR,XL            COPY NAME BASE POINTER
                   23052:        MOV  *NMSI$,WA        SET SIZE OF NMBLK
                   23053:        JSR  ALLOC            ALLOCATE NMBLK
                   23054:        MOV  =B$NML,(XR)      STORE TYPE WORD
                   23055:        MOV  XL,NMBAS(XR)     STORE NAME BASE
                   23056:        MOV  *VRVAL,NMOFS(XR) STORE NAME OFFSET
                   23057:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   23058:        EJC
                   23059: *
                   23060: *      FLPOP -- FAIL AND POP IN PATTERN MATCHING
                   23061: *
                   23062: *      FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
                   23063: *      DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
                   23064: *
                   23065: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   23066: *      BRN  FLPOP            JUMP TO FAIL AND POP STACK
                   23067: *
                   23068: FLPOP  RTN
                   23069:        ADD  *NUM02,XS        POP TWO ENTRIES OFF STACK
                   23070:        EJC
                   23071: *
                   23072: *      FAILP -- FAILURE IN MATCHING PATTERN NODE
                   23073: *
                   23074: *      FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
                   23075: *      SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
                   23076: *
                   23077: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   23078: *      BRN  FAILP            SIGNAL FAILURE TO MATCH
                   23079: *
                   23080: *      FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
                   23081: *
                   23082: FAILP  RTN
                   23083:        MOV  (XS)+,XR         LOAD ALTERNATIVE NODE POINTER
                   23084:        MOV  (XS)+,WB         RESTORE OLD CURSOR
                   23085:        MOV  (XR),XL          LOAD PCODE ENTRY POINTER
                   23086:        BRI  XL               JUMP TO EXECUTE CODE FOR NODE
                   23087:        EJC
                   23088: *
                   23089: *      INDIR -- COMPUTE INDIRECT REFERENCE
                   23090: *
                   23091: *      (WB)                  NONZERO/ZERO FOR BY NAME/VALUE
                   23092: *      BRN  INDIR            JUMP TO GET INDIRECT REF ON STACK
                   23093: *
                   23094: *      INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
                   23095: *
                   23096: INDIR  RTN
                   23097:        MOV  (XS)+,XR         LOAD ARGUMENT
                   23098:        BEQ  (XR),=B$NML,INDR2 JUMP IF A NAME
                   23099:        JSR  GTNVR            ELSE CONVERT TO VARIABLE
                   23100:        ERR  239,INDIRECTION OPERAND IS NOT NAME
                   23101:        BZE  WB,INDR1         SKIP IF BY VALUE
                   23102:        MOV  XR,-(XS)         ELSE STACK VRBLK PTR
                   23103:        MOV  *VRVAL,-(XS)     STACK NAME OFFSET
                   23104:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   23105: *
                   23106: *      HERE TO GET VALUE OF NATURAL VARIABLE
                   23107: *
                   23108: INDR1  BRI  (XR)             JUMP THROUGH VRGET FIELD OF VRBLK
                   23109: *
                   23110: *      HERE IF OPERAND IS A NAME
                   23111: *
                   23112: INDR2  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   23113:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
                   23114:        BNZ  WB,EXNAM         EXIT IF CALLED BY NAME
                   23115:        JSR  ACESS            ELSE GET VALUE FIRST
                   23116:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   23117:        BRN  EXIXR            ELSE RETURN WITH VALUE IN XR
                   23118:        EJC
                   23119: *
                   23120: *      MATCH -- INITIATE PATTERN MATCH
                   23121: *
                   23122: *      (WB)                  MATCH TYPE CODE
                   23123: *      BRN  MATCH            JUMP TO INITIATE PATTERN MATCH
                   23124: *
                   23125: *      MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
                   23126: *      PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
                   23127: *
                   23128: MATCH  RTN
                   23129:        MOV  (XS)+,XR         LOAD PATTERN OPERAND
                   23130:        JSR  GTPAT            CONVERT TO PATTERN
                   23131:        ERR  240,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN
                   23132:        MOV  XR,XL            IF OK, SAVE PATTERN POINTER
                   23133:        BNZ  WB,MTCH1         JUMP IF NOT MATCH BY NAME
                   23134:        MOV  (XS),WA          ELSE LOAD NAME OFFSET
                   23135:        MOV  XL,-(XS)         SAVE PATTERN POINTER
                   23136:        MOV  2(XS),XL         LOAD NAME BASE
                   23137:        JSR  ACESS            ACCESS SUBJECT VALUE
                   23138:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   23139:        MOV  (XS),XL          RESTORE PATTERN POINTER
                   23140:        MOV  XR,(XS)          STACK SUBJECT STRING VAL FOR MERGE
                   23141:        ZER  WB               RESTORE TYPE CODE
                   23142: *
                   23143: *      MERGE HERE WITH SUBJECT VALUE ON STACK
                   23144: *
                   23145: .IF    .CNBF
                   23146: MTCH1  JSR  GTSTG            CONVERT SUBJECT TO STRING
                   23147: .ELSE
                   23148: MTCH1  MOV  (XS),XR          LOAD SUBJECT VALUE
                   23149:        ZER  R$PMB            ASSUME NOT A BUFFER
                   23150:        BNE  (XR),=B$BCT,MTCHA BRANCH IF NOT
                   23151:        ICA  XS               ELSE POP VALUE
                   23152:        MOV  XR,R$PMB         SAVE POINTER
                   23153:        MOV  BCLEN(XR),WA     GET DEFINED LENGTH
                   23154:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   23155:        BRN  MTCHB
                   23156: *
                   23157: *      HERE IF NOT BUFFER TO CONVERT TO STRING
                   23158: *
                   23159: MTCHA  JSR  GTSTG            NOT BUFFER - CONVERT TO STRING
                   23160: .FI
                   23161:        ERR  241,PATTERN MATCH LEFT OPERAND IS NOT STRING
                   23162: *
                   23163: *      MERGE WITH BUFFER OR STRING
                   23164: *
                   23165: MTCHB  MOV  XR,R$PMS         IF OK, STORE SUBJECT STRING POINTER
                   23166:        MOV  WA,PMSSL         AND LENGTH
                   23167:        MOV  WB,-(XS)         STACK MATCH TYPE CODE
                   23168:        ZER  -(XS)            STACK INITIAL CURSOR (ZERO)
                   23169:        ZER  WB               SET INITIAL CURSOR
                   23170:        MOV  XS,PMHBS         SET HISTORY STACK BASE PTR
                   23171:        ZER  PMDFL            RESET PATTERN ASSIGNMENT FLAG
                   23172:        MOV  XL,XR            SET INITIAL NODE POINTER
                   23173:        BNZ  KVANC,MTCH2      JUMP IF ANCHORED
                   23174: *
                   23175: *      HERE FOR UNANCHORED
                   23176: *
                   23177:        MOV  XR,-(XS)         STACK INITIAL NODE POINTER
                   23178:        MOV  =NDUNA,-(XS)     STACK POINTER TO ANCHOR MOVE NODE
                   23179:        BRI  (XR)             START MATCH OF FIRST NODE
                   23180: *
                   23181: *      HERE IN ANCHORED MODE
                   23182: *
                   23183: MTCH2  ZER  -(XS)            DUMMY CURSOR VALUE
                   23184:        MOV  =NDABO,-(XS)     STACK POINTER TO ABORT NODE
                   23185:        BRI  (XR)             START MATCH OF FIRST NODE
                   23186:        EJC
                   23187: *
                   23188: *      RETRN -- RETURN FROM FUNCTION
                   23189: *
                   23190: *      (WA)                  STRING POINTER FOR RETURN TYPE
                   23191: *      BRN  RETRN            JUMP TO RETURN FROM (SNOBOL) FUNC
                   23192: *
                   23193: *      RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
                   23194: *      THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
                   23195: *      ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
                   23196: *      ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
                   23197: *      FUNCTION CALL AND RETURN.
                   23198: *
                   23199: RETRN  RTN
                   23200:        BNZ  KVFNC,RTN01      JUMP IF NOT LEVEL ZERO
                   23201:        ERB  242,FUNCTION RETURN FROM LEVEL ZERO
                   23202: *
                   23203: *      HERE IF NOT LEVEL ZERO RETURN
                   23204: *
                   23205: RTN01  MOV  FLPRT,XS         POP STACK
                   23206:        ICA  XS               REMOVE FAILURE OFFSET
                   23207:        MOV  (XS)+,XR         POP PFBLK POINTER
                   23208:        MOV  (XS)+,FLPTR      POP FAILURE POINTER
                   23209:        MOV  (XS)+,FLPRT      POP OLD FLPRT
                   23210:        MOV  (XS)+,WB         POP CODE POINTER OFFSET
                   23211:        MOV  (XS)+,WC         POP OLD CODE BLOCK POINTER
                   23212:        ADD  WC,WB            MAKE OLD CODE POINTER ABSOLUTE
                   23213:        LCP  WB               RESTORE OLD CODE POINTER
                   23214:        MOV  WC,R$COD         RESTORE OLD CODE BLOCK POINTER
                   23215:        DCV  KVFNC            DECREMENT FUNCTION LEVEL
                   23216:        MOV  KVTRA,WB         LOAD TRACE
                   23217:        ADD  KVFTR,WB         ADD FTRACE
                   23218:        BZE  WB,RTN06         JUMP IF NO TRACING POSSIBLE
                   23219: *
                   23220: *      HERE IF THERE MAY BE A TRACE
                   23221: *
                   23222:        MOV  WA,-(XS)         SAVE FUNCTION RETURN TYPE
                   23223:        MOV  XR,-(XS)         SAVE PFBLK POINTER
                   23224:        MOV  WA,KVRTN         SET RTNTYPE FOR TRACE FUNCTION
                   23225:        MOV  R$FNC,XL         LOAD FNCLEVEL TRBLK PTR (IF ANY)
                   23226:        JSR  KTREX            EXECUTE POSSIBLE FNCLEVEL TRACE
                   23227:        MOV  PFVBL(XR),XL     LOAD VRBLK PTR (SGD13)
                   23228:        BZE  KVTRA,RTN02      JUMP IF TRACE IS OFF
                   23229:        MOV  PFRTR(XR),XR     ELSE LOAD RETURN TRACE TRBLK PTR
                   23230:        BZE  XR,RTN02         JUMP IF NOT RETURN TRACED
                   23231:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   23232:        BZE  TRFNC(XR),RTN03  JUMP IF PRINT TRACE
                   23233:        MOV  *VRVAL,WA        ELSE SET NAME OFFSET
                   23234:        MOV  1(XS),KVRTN      MAKE SURE RTNTYPE IS SET RIGHT
                   23235:        JSR  TRXEQ            EXECUTE FULL TRACE
                   23236:        EJC
                   23237: *
                   23238: *      RETRN (CONTINUED)
                   23239: *
                   23240: *      HERE TO TEST FOR FTRACE
                   23241: *
                   23242: RTN02  BZE  KVFTR,RTN05      JUMP IF FTRACE IS OFF
                   23243:        DCV  KVFTR            ELSE DECREMENT FTRACE
                   23244: *
                   23245: *      HERE FOR PRINT TRACE OF FUNCTION RETURN
                   23246: *
                   23247: RTN03  JSR  PRTSN            PRINT STATEMENT NUMBER
                   23248:        MOV  1(XS),XR         LOAD RETURN TYPE
                   23249:        JSR  PRTST            PRINT IT
                   23250:        MOV  =CH$BL,WA        LOAD BLANK
                   23251:        JSR  PRTCH            PRINT IT
                   23252:        MOV  0(XS),XL         LOAD PFBLK PTR
                   23253:        MOV  PFVBL(XL),XL     LOAD FUNCTION VRBLK PTR
                   23254:        MOV  *VRVAL,WA        SET VRBLK NAME OFFSET
                   23255:        BNE  XR,=SCFRT,RTN04  JUMP IF NOT FRETURN CASE
                   23256: *
                   23257: *      FOR FRETURN, JUST PRINT FUNCTION NAME
                   23258: *
                   23259:        JSR  PRTNM            PRINT NAME
                   23260:        JSR  PRTNL            TERMINATE PRINT LINE
                   23261:        BRN  RTN05            MERGE
                   23262: *
                   23263: *      HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
                   23264: *
                   23265: RTN04  JSR  PRTNV            PRINT NAME = VALUE
                   23266: *
                   23267: *      HERE AFTER COMPLETING TRACE
                   23268: *
                   23269: RTN05  MOV  (XS)+,XR         POP PFBLK POINTER
                   23270:        MOV  (XS)+,WA         POP RETURN TYPE STRING
                   23271: *
                   23272: *      MERGE HERE IF NO TRACE REQUIRED
                   23273: *
                   23274: RTN06  MOV  WA,KVRTN         SET RTNTYPE KEYWORD
                   23275:        MOV  PFVBL(XR),XL     LOAD POINTER TO FN VRBLK
                   23276:        EJC
                   23277: *      RETRN (CONTINUED)
                   23278: *
                   23279: *      GET VALUE OF FUNCTION
                   23280: *
                   23281: RTN07  MOV  XL,RTNBP         SAVE BLOCK POINTER
                   23282:        MOV  VRVAL(XL),XL     LOAD VALUE
                   23283:        BEQ  (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED
                   23284:        MOV  XL,RTNFV         ELSE SAVE FUNCTION RESULT VALUE
                   23285:        MOV  (XS)+,RTNSV      SAVE ORIGINAL FUNCTION VALUE
                   23286: .IF    .CNPF
                   23287:        MOV  FARGS(XR),WB     GET NUMBER OF ARGUMENTS
                   23288: .ELSE
                   23289:        MOV  (XS)+,XL         POP SAVED POINTER
                   23290:        BZE  XL,RTN7C         NO ACTION IF NONE
                   23291:        BZE  KVPFL,RTN7C      JUMP IF NO PROFILING
                   23292:        JSR  PRFLU            ELSE PROFILE LAST FUNC STMT
                   23293:        BEQ  KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD
                   23294: *
                   23295: *      HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO
                   23296: *      APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
                   23297: *      THE CALL.
                   23298: *
                   23299:        LDI  PFSTM            LOAD CURRENT TIME
                   23300:        SBI  ICVAL(XL)        FRIG BY SUBTRACTING SAVED AMOUNT
                   23301:        BRN  RTN7B            AND MERGE
                   23302: *
                   23303: *      HERE IF &PROFILE = 2
                   23304: *
                   23305: RTN7A  LDI  ICVAL(XL)        LOAD SAVED TIME
                   23306: *
                   23307: *      BOTH PROFILE TYPES MERGE HERE
                   23308: *
                   23309: RTN7B  STI  PFSTM            STORE BACK CORRECT START TIME
                   23310: *
                   23311: *      MERGE HERE IF NO PROFILING
                   23312: *
                   23313: RTN7C  MOV  FARGS(XR),WB     GET NUMBER OF ARGS
                   23314: .FI
                   23315:        ADD  PFNLO(XR),WB     ADD NUMBER OF LOCALS
                   23316:        BZE  WB,RTN10         JUMP IF NO ARGS/LOCALS
                   23317:        LCT  WB,WB            ELSE SET LOOP COUNTER
                   23318:        ADD  PFLEN(XR),XR     AND POINT TO END OF PFBLK
                   23319: *
                   23320: *      LOOP TO RESTORE FUNCTIONS AND LOCALS
                   23321: *
                   23322: RTN08  MOV  -(XR),XL         LOAD NEXT VRBLK POINTER
                   23323: *
                   23324: *      LOOP TO FIND VALUE BLOCK
                   23325: *
                   23326: RTN09  MOV  XL,WA            SAVE BLOCK POINTER
                   23327:        MOV  VRVAL(XL),XL     LOAD POINTER TO NEXT VALUE
                   23328:        BEQ  (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED
                   23329:        MOV  WA,XL            ELSE RESTORE LAST BLOCK POINTER
                   23330:        MOV  (XS)+,VRVAL(XL)  RESTORE OLD VARIABLE VALUE
                   23331:        BCT  WB,RTN08         LOOP TILL ALL PROCESSED
                   23332: *
                   23333: *      NOW RESTORE FUNCTION VALUE AND EXIT
                   23334: *
                   23335: RTN10  MOV  RTNBP,XL         RESTORE PTR TO LAST FUNCTION BLOCK
                   23336:        MOV  RTNSV,VRVAL(XL)  RESTORE OLD FUNCTION VALUE
                   23337:        MOV  RTNFV,XR         RELOAD FUNCTION RESULT
                   23338:        MOV  R$COD,XL         POINT TO NEW CODE BLOCK
                   23339:        MOV  KVSTN,KVLST      SET LASTNO FROM STNO
                   23340:        MOV  CDSTM(XL),KVSTN  RESET PROPER STNO VALUE
                   23341:        MOV  KVRTN,WA         LOAD RETURN TYPE
                   23342:        BEQ  WA,=SCRTN,EXIXR  EXIT WITH RESULT IN XR IF RETURN
                   23343:        BEQ  WA,=SCFRT,EXFAL  FAIL IF FRETURN
                   23344:        EJC
                   23345: *
                   23346: *      RETRN (CONTINUED)
                   23347: *
                   23348: *      HERE FOR NRETURN
                   23349: *
                   23350:        BEQ  (XR),=B$NML,RTN11 JUMP IF IS A NAME
                   23351:        JSR  GTNVR            ELSE TRY CONVERT TO VARIABLE NAME
                   23352:        ERR  243,FUNCTION RESULT IN NRETURN IS NOT NAME
                   23353:        MOV  XR,XL            IF OK, COPY VRBLK (NAME BASE) PTR
                   23354:        MOV  *VRVAL,WA        SET NAME OFFSET
                   23355:        BRN  RTN12            AND MERGE
                   23356: *
                   23357: *      HERE IF RETURNED RESULT IS A NAME
                   23358: *
                   23359: RTN11  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   23360:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
                   23361: *
                   23362: *      MERGE HERE WITH RETURNED NAME IN (XL,WA)
                   23363: *
                   23364: RTN12  MOV  XL,XR            PRESERVE XL
                   23365:        LCW  WB               LOAD NEXT WORD
                   23366:        MOV  XR,XL            RESTORE XL
                   23367:        BEQ  WB,=OFNE$,EXNAM  EXIT IF CALLED BY NAME
                   23368:        MOV  WB,-(XS)         ELSE SAVE CODE WORD
                   23369:        JSR  ACESS            GET VALUE
                   23370:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   23371:        MOV  XR,XL            IF OK, COPY RESULT
                   23372:        MOV  (XS),XR          RELOAD NEXT CODE WORD
                   23373:        MOV  XL,(XS)          STORE RESULT ON STACK
                   23374:        MOV  (XR),XL          LOAD ROUTINE ADDRESS
                   23375:        BRI  XL               JUMP TO EXECUTE NEXT CODE WORD
                   23376:        EJC
                   23377: *
                   23378: *      STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
                   23379: *
                   23380: *      BRN  STCOV            JUMP TO SIGNAL STATEMENT COUNT OFLO
                   23381: *
                   23382: *      PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
                   23383: *      SETEXIT TRAP CAN REGAIN CONTROL.
                   23384: *      STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
                   23385: *
                   23386: STCOV  RTN
                   23387:        ICV  ERRFT            FATAL ERROR
                   23388:        LDI  INTVT            GET 10
                   23389:        ADI  KVSTL            ADD TO FORMER LIMIT
                   23390:        STI  KVSTL            STORE AS NEW STLIMIT
                   23391:        LDI  INTVT            GET 10
                   23392:        STI  KVSTC            SET AS NEW COUNT
                   23393:        ERB  244,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
                   23394:        EJC
                   23395: *
                   23396: *      STMGO -- START EXECUTION OF NEW STATEMENT
                   23397: *
                   23398: *      (XR)                  POINTER TO CDBLK FOR NEW STATEMENT
                   23399: *      BRN  STMGO            JUMP TO EXECUTE NEW STATEMENT
                   23400: *
                   23401: *      STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
                   23402: *
                   23403: STMGO  RTN
                   23404:        MOV  XR,R$COD         SET NEW CODE BLOCK POINTER
                   23405: .IF    .CNPF
                   23406:        MOV  KVSTN,KVLST      SET LASTNO
                   23407: .ELSE
                   23408:        BZE  KVPFL,STGO1      SKIP IF NO PROFILING
                   23409:        JSR  PRFLU            ELSE PROFILE THE STATEMENT
                   23410: STGO1  MOV  KVSTN,KVLST      SET LASTNO
                   23411: .FI
                   23412:        MOV  CDSTM(XR),KVSTN  SET STNO
                   23413:        ADD  *CDCOD,XR        POINT TO FIRST CODE WORD
                   23414:        LCP  XR               SET CODE POINTER
                   23415:        LDI  KVSTC            GET STMT COUNT
                   23416:        ILT  EXITS            OMIT COUNTING IF NEGATIVE
                   23417:        IEQ  STCOV            FAIL IF STLIMIT REACHED
                   23418:        SBI  INTV1            DECREMENT
                   23419:        STI  KVSTC            REPLACE IT
                   23420:        BZE  R$STC,EXITS      EXIT IF NO STCOUNT TRACE
                   23421: *
                   23422: *      HERE FOR STCOUNT TRACE
                   23423: *
                   23424:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   23425:        MOV  R$STC,XL         LOAD POINTER TO STCOUNT TRBLK
                   23426:        JSR  KTREX            EXECUTE KEYWORD TRACE
                   23427:        BRN  EXITS            AND THEN EXIT FOR NEXT CODE WORD
                   23428:        EJC
                   23429: *
                   23430: *      STOPR -- TERMINATE RUN
                   23431: *
                   23432: *      (XR)                  POINTS TO ENDING MESSAGE
                   23433: *      BRN STOPR             JUMP TO TERMINATE RUN
                   23434: *
                   23435: *      TERMINATE RUN AND PRINT STATISTICS.  ON ENTRY XR POINTS
                   23436: *      TO ENDING MESSAGE OR IS ZERO IF MESSAGE  PRINTED ALREADY.
                   23437: *
                   23438: STOPR  RTN
                   23439: .IF    .CSAX
                   23440:        BZE  XR,STPRA         SKIP IF SYSAX ALREADY CALLED (REG04)
                   23441:        JSR  SYSAX            CALL AFTER EXECUTION PROC
                   23442: STPRA  ADD  RSMEM,DNAME      USE THE RESERVE MEMORY
                   23443: .ELSE
                   23444:        ADD  RSMEM,DNAME      USE THE RESERVE MEMORY
                   23445: .FI
                   23446:        BNE  XR,=ENDMS,STPR0  SKIP IF NOT NORMAL END MESSAGE
                   23447:        BNZ  EXSTS,STPR3      SKIP IF EXEC STATS SUPPRESSED
                   23448:        ZER  ERICH            CLEAR ERRORS TO INT.CH. FLAG
                   23449: *
                   23450: *      LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED
                   23451: *
                   23452: STPR0  JSR  PRTPG            EJECT PRINTER
                   23453:        BZE  XR,STPR1         SKIP IF NO MESSAGE
                   23454:        JSR  PRTST            PRINT MESSAGE
                   23455: *
                   23456: *      MERGE HERE IF NO MESSAGE TO PRINT
                   23457: *
                   23458: STPR1  JSR  PRTIS            PRINT BLANK LINE
                   23459:        MTI  KVSTN            GET STATEMENT NUMBER
                   23460:        MOV  =STPM1,XR        POINT TO MESSAGE /IN STATEMENT XXX/
                   23461:        JSR  PRTMX            PRINT IT
                   23462:        JSR  SYSTM            GET CURRENT TIME
                   23463:        SBI  TIMSX            MINUS START TIME = ELAPSED EXEC TIM
                   23464:        STI  STPTI            SAVE FOR LATER
                   23465:        MOV  =STPM3,XR        POINT TO MSG /EXECUTION TIME MSEC /
                   23466:        JSR  PRTMX            PRINT IT
                   23467:        LDI  KVSTL            GET STATEMENT LIMIT
                   23468:        ILT  STPR2            SKIP IF NEGATIVE
                   23469:        SBI  KVSTC            MINUS COUNTER = COUNT
                   23470:        STI  STPSI            SAVE
                   23471:        MOV  =STPM2,XR        POINT TO MESSAGE /STMTS EXECUTED/
                   23472:        JSR  PRTMX            PRINT IT
                   23473:        LDI  STPTI            RELOAD ELAPSED TIME
                   23474:        MLI  INTTH            *1000 (MICROSECS)
                   23475:        IOV  STPR2            JUMP IF WE CANNOT COMPUTE
                   23476:        DVI  STPSI            DIVIDE BY STATEMENT COUNT
                   23477:        IOV  STPR2            JUMP IF OVERFLOW
                   23478:        MOV  =STPM4,XR        POINT TO MSG (MCSEC PER STATEMENT /
                   23479:        JSR  PRTMX            PRINT IT
                   23480:        EJC
                   23481: *
                   23482: *      STOPR (CONTINUED)
                   23483: *
                   23484: *      MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
                   23485: *
                   23486: STPR2  MTI  GBCNT            LOAD COUNT OF COLLECTIONS
                   23487:        MOV  =STPM5,XR        POINT TO MESSAGE /REGENERATIONS /
                   23488:        JSR  PRTMX            PRINT IT
                   23489:        JSR  PRTIS            ONE MORE BLANK FOR LUCK
                   23490: *
                   23491: *      CHECK IF DUMP REQUESTED
                   23492: *
                   23493: .IF    .CNPF
                   23494: STPR3  MOV  KVDMP,XR         LOAD DUMP KEYWORD
                   23495: .ELSE
                   23496: STPR3  JSR  PRFLR            PRINT PROFILE IF WANTED
                   23497: *
                   23498:        MOV  KVDMP,XR         LOAD DUMP KEYWORD
                   23499: .FI
                   23500:        JSR  DUMPR            EXECUTE DUMP IF REQUESTED
                   23501:        MOV  R$FCB,XL         GET FCBLK CHAIN HEAD
                   23502:        MOV  KVABE,WA         LOAD ABEND VALUE
                   23503:        MOV  KVCOD,WB         LOAD CODE VALUE
                   23504:        JSR  SYSEJ            EXIT TO SYSTEM
                   23505:        EJC
                   23506: *
                   23507: *      SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
                   23508: *
                   23509: *      SEE PATTERN MATCH ROUTINES FOR DETAILS
                   23510: *
                   23511: *      (XR)                  CURRENT NODE
                   23512: *      (WB)                  CURRENT CURSOR
                   23513: *      (XL)                  MAY BE NON-COLLECTABLE
                   23514: *      BRN  SUCCP            SIGNAL SUCCESSFUL PATTERN MATCH
                   23515: *
                   23516: *      SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
                   23517: *
                   23518: SUCCP  RTN
                   23519:        MOV  PTHEN(XR),XR     LOAD SUCCESSOR NODE
                   23520:        MOV  (XR),XL          LOAD NODE CODE ENTRY ADDRESS
                   23521:        BRI  XL               JUMP TO MATCH SUCCESSOR NODE
                   23522:        EJC
                   23523: *
                   23524: *      SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE
                   23525: *
                   23526: SYSAB  RTN
                   23527:        MOV  =ENDAB,XR        POINT TO MESSAGE
                   23528:        MOV  =NUM01,KVABE     SET ABEND FLAG
                   23529:        JSR  PRTNL            SKIP TO NEW LINE
                   23530:        BRN  STOPR            JUMP TO PACK UP
                   23531:        EJC
                   23532: *
                   23533: *      SYSTU -- PRINT /TIME UP/ AND TERMINATE
                   23534: *
                   23535: SYSTU  RTN
                   23536:        MOV  =ENDTU,XR        POINT TO MESSAGE
                   23537:        MOV  STRTU,WA         GET CHARS /TU/
                   23538:        MOV  WA,KVCOD         PUT IN KVCOD
                   23539:        MOV  TIMUP,WA         CHECK STATE OF TIMEUP SWITCH
                   23540:        MNZ  TIMUP            SET SWITCH
                   23541:        BNZ  WA,STOPR         STOP RUN IF ALREADY SET
                   23542:        ERB  245,TRANSLATION/EXECUTION TIME EXPIRED
                   23543:        TTL  S P I T B O L -- STACK OVERFLOW SECTION
                   23544: *
                   23545: *      CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
                   23546: *
                   23547:        SEC                   START OF STACK OVERFLOW SECTION
                   23548: *
                   23549:        ICV  ERRFT            FATAL ERROR
                   23550:        MOV  FLPTR,XS         POP STACK TO AVOID MORE FAILS
                   23551:        BNZ  GBCFL,STAK1      JUMP IF GARBAGE COLLECTING
                   23552:        ERB  246,STACK OVERFLOW
                   23553: *
                   23554: *      NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
                   23555: *
                   23556: STAK1  MOV  =ENDSO,XR        POINT TO MESSAGE
                   23557:        ZER  KVDMP            MEMORY IS UNDUMPABLE
                   23558:        BRN  STOPR            GIVE UP
                   23559:        TTL  S P I T B O L -- ERROR SECTION
                   23560: *
                   23561: *      THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
                   23562: *      RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
                   23563: *
                   23564: *      (WA)                  IS THE ERROR CODE
                   23565: *
                   23566: *      THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
                   23567: *      THE ERROR OCCURED AS FOLLOWS.
                   23568: *
                   23569: *      STAGE=STGIC           ERROR DURING INITIAL COMPILE
                   23570: *
                   23571: *      STAGE=STGXC           ERROR DURING COMPILE AT EXECUTE
                   23572: *                            TIME (CODE, CONVERT FUNCTION CALLS)
                   23573: *
                   23574: *      STAGE=STGEV           ERROR DURING COMPILATION OF
                   23575: *                            EXPRESSION AT EXECUTION TIME
                   23576: *                            (EVAL, CONVERT FUNCTION CALL).
                   23577: *
                   23578: *      STAGE=STGXT           ERROR AT EXECUTE TIME. COMPILER
                   23579: *                            NOT ACTIVE.
                   23580: *
                   23581: *      STAGE=STGCE           ERROR DURING INITIAL COMPILE AFTER
                   23582: *                            SCANNING OUT THE END LINE.
                   23583: *
                   23584: *      STAGE=STGXE           ERROR DURING COMPILE AT EXECUTE
                   23585: *                            TIME AFTER SCANNING END LINE.
                   23586: *
                   23587: *      STAGE=STGEE           ERROR DURING EXPRESSION EVALUATION
                   23588: *
                   23589:        SEC                   START OF ERROR SECTION
                   23590: *
                   23591: ERROR  BEQ  R$CIM,=CMLAB,CMPLE JUMP IF ERROR IN SCANNING LABEL
                   23592:        MOV  WA,KVERT         SAVE ERROR CODE
                   23593:        ZER  SCNRS            RESET RESCAN SWITCH FOR SCANE
                   23594:        ZER  SCNGO            RESET GOTO SWITCH FOR SCANE
                   23595:        MOV  STAGE,XR         LOAD CURRENT STAGE
                   23596:        BSW  XR,STGNO         JUMP TO APPROPRIATE ERROR CIRCUIT
                   23597:        IFF  STGIC,ERR01      INITIAL COMPILE
                   23598:        IFF  STGXC,ERR04      EXECUTE TIME COMPILE
                   23599:        IFF  STGEV,ERR04      EVAL COMPILING EXPR.
                   23600:        IFF  STGEE,ERR04      EVAL EVALUATING EXPR
                   23601:        IFF  STGXT,ERR05      EXECUTE TIME
                   23602:        IFF  STGCE,ERR01      COMPILE - AFTER END
                   23603:        IFF  STGXE,ERR04      XEQ COMPILE-PAST END
                   23604:        ESW                   END SWITCH ON ERROR TYPE
                   23605:        EJC
                   23606: *
                   23607: *      ERROR DURING INITIAL COMPILE
                   23608: *
                   23609: *      THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
                   23610: *      OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
                   23611: *      PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
                   23612: *      COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
                   23613: *
                   23614: *      AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
                   23615: *      MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
                   23616: *      THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
                   23617: *
                   23618: *      IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
                   23619: *      IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
                   23620: *
                   23621: ERR01  MOV  CMPXS,XS         RESET STACK POINTER
                   23622:        SSL  CMPSS            RESTORE S-R STACK PTR FOR CMPIL
                   23623:        BNZ  ERRSP,ERR03      JUMP IF ERROR SUPPRESS FLAG SET
                   23624:        MOV  ERICH,ERLST      SET FLAG FOR LISTR
                   23625:        JSR  LISTR            LIST LINE
                   23626:        JSR  PRTIS            TERMINATE LISTING
                   23627:        ZER  ERLST            CLEAR LISTR FLAG
                   23628:        MOV  SCNSE,WA         LOAD SCAN ELEMENT OFFSET
                   23629:        BZE  WA,ERR02         SKIP IF NOT SET
                   23630: .IF    .CAHT
                   23631:        LCT  WB,WA            LOOP COUNTER
                   23632:        ICV  WA               INCREASE FOR CH$EX
                   23633:        JSR  ALOCS            STRING BLOCK FOR ERROR FLAG
                   23634:        MOV  XR,WA            REMEMBER STRING PTR
                   23635:        PSC  XR               READY FOR CHARACTER STORING
                   23636:        MOV  R$CIM,XL         POINT TO BAD STATEMENT
                   23637:        PLC  XL               READY TO GET CHARS
                   23638: *
                   23639: *      LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
                   23640: *
                   23641: ERRA1  LCH  WC,(XL)+         GET NEXT CHAR
                   23642:        BEQ  WC,=CH$HT,ERRA2  SKIP IF TAB
                   23643:        MOV  =CH$BL,WC        GET A BLANK
                   23644:        EJC
                   23645: *
                   23646: *      MERGE TO STORE BLANK OR TAB IN ERROR LINE
                   23647: *
                   23648: ERRA2  SCH  WC,(XR)+         STORE CHAR
                   23649:        BCT  WB,ERRA1         LOOP
                   23650:        MOV  =CH$EX,XL        EXCLAMATION MARK
                   23651:        SCH  XL,(XR)          STORE AT END OF ERROR LINE
                   23652:        CSC  XR               END OF SCH LOOP
                   23653:        MOV  =STNPD,PROFS     ALLOW FOR STATEMENT NUMBER
                   23654:        MOV  WA,XR            POINT TO ERROR LINE
                   23655:        JSR  PRTST            PRINT ERROR LINE
                   23656: .ELSE
                   23657:        MTI  PRLEN            GET PRINT BUFFER LENGTH
                   23658:        MFI  GTNSI            STORE AS SIGNED INTEGER
                   23659:        ADD  =STNPD,WA        ADJUST FOR STATEMENT NUMBER
                   23660:        MTI  WA               COPY TO INTEGER ACCUMULATOR
                   23661:        RMI  GTNSI            REMAINDER MODULO PRINT BFR LENGTH
                   23662:        STI  PROFS            USE AS CHARACTER OFFSET
                   23663:        MOV  =CH$EX,WA        GET EXCLAMATION MARK
                   23664:        JSR  PRTCH            GENERATE UNDER BAD COLUMN
                   23665: .FI
                   23666: *
                   23667: *      HERE AFTER PLACING ERROR FLAG AS REQUIRED
                   23668: *
                   23669: ERR02  JSR  ERMSG            GENERATE FLAG AND ERROR MESSAGE
                   23670:        ADD  =NUM03,LSTLC     BUMP PAGE CTR FOR BLANK, ERROR, BLK
                   23671:        ZER  XR               IN CASE OF FATAL ERROR
                   23672:        BHI  ERRFT,=NUM03,STOPR PACK UP IF SEVERAL FATALS
                   23673: *
                   23674: *      COUNT ERROR, INHIBIT EXECUTION IF REQUIRED
                   23675: *
                   23676:        ICV  CMERC            BUMP ERROR COUNT
                   23677:        ADD  CSWER,NOXEQ      INHIBIT XEQ IF -NOERRORS
                   23678:        BNE  STAGE,=STGIC,CMP10  SPECIAL RETURN IF AFTER END LINE
                   23679:        EJC
                   23680: *
                   23681: *      LOOP TO SCAN TO END OF STATEMENT
                   23682: *
                   23683: ERR03  MOV  R$CIM,XR         POINT TO START OF IMAGE
                   23684:        PLC  XR               POINT TO FIRST CHAR
                   23685:        LCH  XR,(XR)          GET FIRST CHAR
                   23686:        BEQ  XR,=CH$MN,CMPCE  JUMP IF ERROR IN CONTROL CARD
                   23687:        ZER  SCNRS            CLEAR RESCAN FLAG
                   23688:        MNZ  ERRSP            SET ERROR SUPPRESS FLAG
                   23689:        JSR  SCANE            SCAN NEXT ELEMENT
                   23690:        BNE  XL,=T$SMC,ERR03  LOOP BACK IF NOT STATEMENT END
                   23691:        ZER  ERRSP            CLEAR ERROR SUPPRESS FLAG
                   23692: *
                   23693: *      GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
                   23694: *
                   23695:        MOV  *CDCOD,CWCOF     RESET OFFSET IN CCBLK
                   23696:        MOV  =OCER$,WA        LOAD COMPILE ERROR CALL
                   23697:        JSR  CDWRD            GENERATE IT
                   23698:        MOV  CWCOF,CMSOC(XS)  SET SUCCESS FILL IN OFFSET
                   23699:        MNZ  CMFFC(XS)        SET FAILURE FILL IN FLAG
                   23700:        JSR  CDWRD            GENERATE SUCC. FILL IN WORD
                   23701:        BRN  CMPSE            MERGE TO GENERATE ERROR AS CDFAL
                   23702: *
                   23703: *      ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO
                   23704: *
                   23705: *      EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
                   23706: *      GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
                   23707: *      BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
                   23708: *      HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
                   23709: *      THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
                   23710: *
                   23711: ERR04  ZER  R$CCB            FORGET GARBAGE CODE BLOCK
                   23712:        SSL  INISS            RESTORE MAIN PROG S-R STACK PTR
                   23713:        JSR  ERTEX            GET FAIL MESSAGE TEXT
                   23714:        DCA  XS               ENSURE STACK OK ON LOOP START
                   23715: *
                   23716: *      POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
                   23717: *      DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
                   23718: *
                   23719: ERRA4  ICA  XS               POP STACK
                   23720:        BEQ  XS,FLPRT,ERRC4   JUMP IF PROG DEFINED FN CALL FOUND
                   23721:        BNE  XS,GTCEF,ERRA4   LOOP IF NOT EVAL OR CODE CALL YET
                   23722:        MOV  =STGXT,STAGE     RE-SET STAGE FOR EXECUTE
                   23723:        MOV  R$GTC,R$COD      RECOVER CODE PTR
                   23724:        MOV  XS,FLPTR         RESTORE FAIL POINTER
                   23725:        ZER  R$CIM            FORGET POSSIBLE IMAGE
                   23726: *
                   23727: *      TEST ERRLIMIT
                   23728: *
                   23729: ERRB4  BNZ  KVERL,ERR07      JUMP IF ERRLIMIT NON-ZERO
                   23730:        BRN  EXFAL            FAIL
                   23731: *
                   23732: *      RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
                   23733: *
                   23734: ERRC4  MOV  FLPTR,XS         RESTORE STACK FROM FLPTR
                   23735:        BRN  ERRB4            MERGE
                   23736:        EJC
                   23737: *
                   23738: *      ERROR AT EXECUTE TIME.
                   23739: *
                   23740: *      THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
                   23741: *
                   23742: *      IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED,
                   23743: *      SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO.
                   23744: *
                   23745: *      OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
                   23746: *      GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
                   23747: *      TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
                   23748: *      SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
                   23749: *      IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED
                   23750: *      REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
                   23751: *      PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
                   23752: *      AND EXCEEDING STLIMIT.
                   23753: *
                   23754: ERR05  SSL  INISS            RESTORE MAIN PROG S-R STACK PTR
                   23755:        BNZ  DMVCH,ERR08      JUMP IF IN MID-DUMP
                   23756: *
                   23757: *      MERGE HERE FROM ERR08
                   23758: *
                   23759: ERR06  BZE  KVERL,LABO1      ABORT IF ERRLIMIT IS ZERO
                   23760:        JSR  ERTEX            GET FAIL MESSAGE TEXT
                   23761: *
                   23762: *      MERGE FROM ERR04
                   23763: *
                   23764: ERR07  BGE  ERRFT,=NUM03,LABO1 ABORT IF TOO MANY FATAL ERRORS
                   23765:        DCV  KVERL            DECREMENT ERRLIMIT
                   23766:        MOV  R$ERT,XL         LOAD ERRTYPE TRACE POINTER
                   23767:        JSR  KTREX            GENERATE ERRTYPE TRACE IF REQUIRED
                   23768:        MOV  R$COD,R$CNT      SET CDBLK PTR FOR CONTINUATION
                   23769:        MOV  FLPTR,XR         SET PTR TO FAILURE OFFSET
                   23770:        MOV  (XR),STXOF       SAVE FAILURE OFFSET FOR CONTINUE
                   23771:        MOV  R$SXC,XR         LOAD SETEXIT CDBLK POINTER
                   23772:        BZE  XR,LCNT1         CONTINUE IF NO SETEXIT TRAP
                   23773:        ZER  R$SXC            ELSE RESET TRAP
                   23774:        MOV  =NULLS,STXVR     RESET SETEXIT ARG TO NULL
                   23775:        MOV  (XR),XL          LOAD PTR TO CODE BLOCK ROUTINE
                   23776:        BRI  XL               EXECUTE FIRST TRAP STATEMENT
                   23777: *
                   23778: *      INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
                   23779: *      MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
                   23780: *
                   23781: ERR08  MOV  DMVCH,XR         CHAIN HEAD FOR AFFECTED VRBLKS
                   23782:        BZE  XR,ERR06         DONE IF ZERO
                   23783:        MOV  (XR),DMVCH       SET NEXT LINK AS CHAIN HEAD
                   23784:        JSR  SETVR            RESTORE VRGET FIELD
                   23785:        BRN  ERR08            LOOP THROUGH CHAIN
                   23786:        TTL  S P I T B O L -- HERE ENDETH THE CODE
                   23787: *
                   23788: *      END OF ASSEMBLY
                   23789: *
                   23790:        END                   END MACRO-SPITBOL ASSEMBLY
                   23791: 
                   23792: 
                   23793: 
                   23794: 
                   23795: 
                   23796: 
                   23797: 
                   23798: 
                   23799: 
                   23800: 
                   23801: 

unix.superglobalmegacorp.com

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