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

1.1       root        1: *      CHANGES [SGD]
                      2: *      -------------
                      3: *      1. COMMENTED OUT DEFAULT .DEF, .UNDEF AS THESE MACHINE-
                      4: *         DEPENDENT.  I SUGGEST AGAIN THAT THESE DO NOT BELONG
                      5: *         IN MINIMAL SOURCE, UNLESS SOMETHING OF THE FORM .*DEF
                      6: *         IS TO BE INCORPORTATED INTO MINIMAL LANGUAGE DEFN.
                      7: *
                      8: *      2. NOTED THAT DESCRIPTION OF BEV, BOD MISSING FROM
                      9: *         SBL42.CMT MINIMAL DESCRIPTION, AND DISCUSSION OF
                     10: *         "ODD"/"EVEN" AND REQUIREMENTS PERTAINING THERETO
                     11: *         SEEMS INSUFFICIENT.
                     12: *
                     13: *      3. PERMIT CODE KEYWORD TO CONTAIN ANY INTEGER VALUE.
                     14: *         THIS CONSISTS OF REMOVING THE ENFORCED RESTRICTION
                     15: *         IN ASIGN (SEE ASG24), SINCE CODE CONTAINS NO RELOC.
                     16: *         USE OF KEYWORD VALUE (AS IT SHOULDNT).  SBL DOC.
                     17: *         MUST BE UPDATED.  ADDRESS OF CODE VALUE NOW PASSED TO
                     18: *         OSINT (KVCOD), INSTEAD OF VALUE ITSELF.  HENCE OSINT
                     19: *         DOCUMENTATION MUST LIKEWISE BE REVISED.  CHANGES
                     20: *         MADE IN KEYWORD DEFINITION TABLES, PROCEDURES ACESS
                     21: *         AND ASIGN SINCE CODE NOW SPECIAL KEYWORD.
                     22: *
                     23: *         EROSI RETURNS NOW CONTAIN NEW CODE KEYWORD VALUE IN
                     24: *         IA. OSINT DOCUMENTATION MUST BE REVISED.
                     25: *
                     26: *         INTERESTINGLY, THIS SHOULD PERMIT THE SPITBOL PROGRAM
                     27: *         TO INTERROGATE THE CODE KEYWORD AT THE START OF
                     28: *         EXECUTION TO DETERMINE IF COMPILATION ERRORS
                     29: *         OCCURRED.
                     30: *
                     31: *      4. ADD -COPY "FILETAG" CONTROL CARD.  -COPY PERMITTED IN
                     32: *         CODE STRINGS.  NESTING IS PERMITTED TO ANY LEVEL,
                     33: *         THOUGH OSINT IS FREE TO RESTRICT THE MAXIMUM LEVEL.
                     34: *         NOTE REQUIREMENT FOR FILETAG SPECIFIED AS
                     35: *         STRING CONSTANT SINCE FILETAGS MAY CONTAIN SEMICOLONS.
                     36: *         I HAVE TRIED TO MAKE THIS ENHANCEMENT WITH MINIMUM
                     37: *         (MINIMAL?) AMOUNT OF NEW CODE, SO THE FEATURE IS
                     38: *         NOT CONDITIONALIZED.  THE SOLUTION
                     39: *         REQUIRED THE ADDITION OF A NEW BLOCK TYPE (COBLK) TO
                     40: *         BUILD THE INPUT CONTEXT SAVE STACK AS A CHAIN OF
                     41: *         COBLKS.  A RECUSIVE SOLUTION ON CMPIL/READR/NEXTS
                     42: *         WOULD HAVE REQUIRED EXTENSIVE MODIFICATIONS AND
                     43: *         SUBSTANTIAL NEW CODE.  NOTE THAT FORMS SUCH AS
                     44: *         CODE('-COPY "FILE.SBL"') ARE ACCEPTABLE, WHICH IS
                     45: *         VIEWED AS SIGNIFICANT ENHANCEMENT IN ADDITION TO
                     46: *         COMPILE-TIME INCLUDE.
                     47: *
                     48: *         TO SUPPORT THIS FEATURE, TWO NEW OSINT ROUTINES ARE
                     49: *         DEFINED, SYSSC (START COPY) AND SYSEC (END COPY) WITH
                     50: *         LOGICS DESCRIBED IN THE .CMT FILE.
                     51: *
                     52: *         BECAUSE OF ANNOYANCE FACTOR, SOURCE LISTING OF
                     53: *         CODE() INFO VIA -LIST, INCLUDING -COPY INPUT, IS
                     54: *         NO LONGER POSSIBLE.  IF THIS IS PERMITTED, THEN
                     55: *         ONE FINDS -COPY INPUT BEING PRINTED ON STD.
                     56: *         OUTPUT CHANNEL (DEPENDING ON STATE OF -LIST),
                     57: *         UNLESS EXPLICIT -NOLIST IS GIVEN.
                     58: *
                     59: *      5. THE DOCUMENTATION FOR SYSIO IS INCONSISTENT.  IT
                     60: *         SHOWS 0,1,2,3 BEING POSSIBLE INPUTS DEPENDING ON
                     61: *         INPUT/OUTPUT, STD/NONSTD.  HOWEVER, IT ALSO APPEARS
                     62: *         (AND IS STATED) THAT SYSIO IS NOT CALLED FOR STD
                     63: *         INPUT/OUTPUT.
                     64: *
                     65: *      6. SINCE -PRINT,-NOPRINT REMOVED IN V4, I HAVE
                     66: *         REINSTATED THE CIRCUIT IN NEXTS TO AVOID LISTING
                     67: *         CONTROL CARDS (-COPY FORCES LIST IN CNCRD THOUGH).
                     68: *
                     69: *      7. WA NOW CONTAINS THE INITIAL VALUE OF &CODE ON ENTRY
                     70: *         TO SPITBOL.
                     71: *
                     72: *      8. ADDED DDC (DEFINE DISPLAY CONSTANT).  IS IDENTICAL
                     73: *         TO DTC EXCEPT THAT ON SYSTEMS SUPPORTING LOWER CASE,
                     74: *         THE DISPLAY TEXT CAN BE TRANSLATED WITH A
                     75: *         CASE MIX.  FOR EXAMPLE, CAPITALIZE ONLY THE FIRST
                     76: *         LETTER, OR THE FIRST LETTER OF EVERY WORD, OR NO
                     77: *         UPPER CASE (FOR EUNICHS), ETC.
                     78: *
                     79: *      9. FIX MINOR OVERSIGHT IN FAILING TO CLEAR R$PMB AT
                     80: *         END OF PATTERN MATCH, THUS LEAVING PTR TO BCBLK
                     81: *         THAT CANNOT BE COLLECTED.
                     82: *
                     83: *     10. AFTER CONSULTATION WITH DAVE SHIELDS, IT WAS AGREED
                     84: *         TO REINSTATE ARG,FIELD,ITEM AND LOCAL FUNCTIONS.
                     85: *         COMMENTS WERE RECEIVED THAT REMOVING THEM BREAKS
                     86: *         EXISTING CODE IN DIFFICULT-TO-FIX WAYS, INCLUDING
                     87: *         A NUMBER OF THE UTILITY ROUTINES IN GIMPELS BOOK.
                     88: *         IN ANY EVENT, THESE ARE SNOBOL4 COMPATIBILITY
                     89: *         FUNCTIONS THAT TAKE LITTLE CODE SPACE.  AS A
                     90: *         RESULT OF THIS, AND -COPY, ERROR NUMBERS HAVE
                     91: *         BEEN PUSHED BACK OVER THE 255 THRESHOLD, WHICH
                     92: *         SEEMS UNAVOIDABLE UNLESS MAJOR SURGERY IS DONE.
                     93: *
                     94: *     11. VERSION ID CHANGED TO V4.3 DUE TO SUBSTANTIAL
                     95: *         CHANGES.
                     96: *
                     97: *     12. PERMIT DOLLAR SIGN IN VARIABLE NAMES.  MINOR
                     98: *         CHANGE TO OPERATOR TABLE AND SCANE.
                     99: *
                    100: *     13. PERMIT BUFFER TYPE FOR LOAD SPECIFICATION.  AS
                    101: *         A SIDE-EFFECT, THE CODE FOR BUFFER CONVERSION HAS
                    102: *         BEEN CENTRALIZED IN GTBUF.  ALSO FIXED PADDING
                    103: *         BUG IN INSBF RELATED TO ZERO PADDING.
                    104: *
                    105: *     14. DOCUMENT THAT SYSIL MUST NEVER REQUEST ZERO BYTES.
                    106: *         DOING SO CAUSES ACESS TO POTENTIALLY CREATE
                    107: *         INVALID MEMORY CAUSING LATER GARBAGE COLLECTOR
                    108: *         PROBLEMS OR MISADJUSTMENTS OF DNAMP, ETC.
                    109: *
                    110: *     15. VDIFFER FUNCTION ADDED.  VDIFFER(X,Y) RETURNS X
                    111: *         IF DIFFERENT FROM Y.  IN MOST CASES IT IS EXPECTED
                    112: *         THAT Y WOULD BE NULL.
                    113: *
                    114:        SEC                   FORMAL START OF PROCEDURES SECTION
                    115:        EJC
                    116: *
                    117: *      SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
                    118: *      ------------------------------------
                    119: *
                    120: *      IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
                    121: *      ASSEMBLY SYMBOLS ARE REFERRED TO.
                    122: *      A PARTICULAR SET OF DEFAULT SETTINGS IS GIVEN IN THIS
                    123: *      SOURCE BY USE OF .DEF AND .UNDEF PSEUDO OPS.
                    124: *      A DIFFERENT SELECTION MAY BE MADE BY VARYING THE
                    125: *      DEFINITIONS. AS AN ALTERNATIVE, THIS SECTION MAY BE
                    126: *      COMMENTED OUT AND THE MINIMAL TRANSLATOR PRELOADED WITH
                    127: *      THE SELECTED DEFINITIONS, THUS ALLOWING A MORE DYNAMIC
                    128: *      CHOICE TO BE MADE.
                    129: *      SOME OF THE CONDITIONAL FEATURES CHOOSE AMONGST A VARIETY
                    130: *      OF OPTIONS. OTHERS ARE DEFINED PRINCIPALLY TO ALLOW
                    131: *      OMISSION OF A FEATURE WHICH IS NOT WANTED IN ORDER TO
                    132: *      SAVE MEMORY OR BECAUSE IT CANNOT BE SUPPORTED.
                    133: *      NOTE THAT IF .CPLC OPTION IS CHOSEN, TRANSLATION OF DTC,
                    134: *      ERR, ERB ARGUMENTS SHOULD BE TO LOWER CASE.
                    135: *
                    136: *.DEF   .CAHT                 DEFINE TO INCLUDE HORIZONTAL TAB
                    137: *.DEF   .CASL                 DEFINE TO INCLUDE 26 SHIFTED LETTRS
                    138: *.DEF   .CAVT                 DEFINE TO INCLUDE VERTICAL TAB
                    139: *.UNDEF .CEPP                 DEFINE FOR ODD PARITY ENTRY POINTS
                    140: *.UNDEF .CNBF                 DEFINE TO OMIT BUFFER EXTENSION
                    141: *.UNDEF .CNBT                 DEFINE TO OMIT BATCH INITIALISATION
                    142: *.UNDEF .CNEX                 DEFINE TO OMIT EXIT() CODE
                    143: *.UNDEF .CNFN                 DEFINE TO OMIT FENCE() CODE
                    144: *.UNDEF .CNLD                 DEFINE TO OMIT LOAD() CODE
                    145: *.UNDEF .CNPF                 DEFINE TO OMIT PROFILE CODE
                    146: *.UNDEF .CNRA                 DEFINE TO OMIT ALL REAL ARITHMETIC
                    147: *.UNDEF .CNSR                 DEFINE TO OMIT SORT, RSORT CODE
                    148: *.DEF   .CPLC                 DEFINE IF HOST PREFERS LOWER CASE
                    149: *.UNDEF .CRPP                 DEFINE FOR ODD PARITY RETURN POINTS
                    150: *.UNDEF .CS16                 DEFINE TO INITIALIZE STLIM TO 32767
                    151: *.UNDEF .CSAX                 DEFINE IF SYSAX IS TO BE CALLED
                    152: *.UNDEF .CSCI                 DEFINE TO ENABLE SYSCI ROUTINE
                    153: *.UNDEF .CSCV                 DEFINE FOR CLU, CUL CASE CONVERSION
                    154: *.DEF   .CSIG                 DEFINE TO IGNORE CASE OF LETTERS
                    155: *.UNDEF .CSN6                 DEFINE TO PAD STMT NOS TO 6 CHARS
                    156: *.DEF   .CSN8                 DEFINE TO PAD STMT NOS TO 8 CHARS
                    157: *.UNDEF .CTMD                 DEFINE IF SYSTM UNIT IS DECISECOND
                    158: .IF    .CASL
                    159: .ELSE
                    160: .UNDEF .CSIG                 .CSIG USELESS WITHOUT LC LETTERS
                    161: .UNDEF .CPLC                 .CPLC ERRONEOUS WITHOUT LC LETTERS
                    162: .FI
                    163:        EJC
                    164: *
                    165: *      ACTUAL PROCESSABLE EXP PROCEDURE DEFINITIONS
                    166: *
                    167: .IF    .CSAX
                    168: SYSAX  EXP  E,0
                    169: .ELSE
                    170: .FI
                    171: SYSBX  EXP  E,0
                    172: .IF    .CSCI
                    173: SYSCI  EXP  E,0
                    174: .FI
                    175: SYSDT  EXP  E,0
                    176: SYSEC  EXP  E,2
                    177: SYSEF  EXP  E,2
                    178: SYSEJ  EXP  E,0
                    179: SYSEM  EXP  E,0
                    180: SYSEN  EXP  E,2
                    181: SYSEP  EXP  E,2
                    182: .IF    .CNLD
                    183: .ELSE
                    184: SYSEX  EXP  E,1
                    185: .FI
                    186: SYSHS  EXP  E,2
                    187: SYSID  EXP  E,0
                    188: SYSIL  EXP  E,0
                    189: SYSIN  EXP  E,2
                    190: SYSIO  EXP  E,2
                    191: .IF    .CNLD
                    192: .ELSE
                    193: SYSLD  EXP  E,2
                    194: .FI
                    195: SYSMM  EXP  E,0
                    196: SYSMX  EXP  E,0
                    197: SYSOU  EXP  E,2
                    198: SYSPI  EXP  E,2
                    199: SYSPP  EXP  E,0
                    200: SYSPR  EXP  E,2
                    201: SYSRD  EXP  E,2
                    202: SYSRI  EXP  E,2
                    203: SYSSC  EXP  E,2
                    204: .IF    .CUST
                    205: SYSST  EXP  E,2
                    206: .FI
                    207: SYSTM  EXP  E,0
                    208: SYSTT  EXP  E,0
                    209: .IF    .CNLD
                    210: .ELSE
                    211: SYSUL  EXP  E,0
                    212: .FI
                    213: .IF    .CNEX
                    214: .ELSE
                    215: SYSXI  EXP  E,2
                    216: .FI
                    217:        EJC
                    218: *      NAME GLOBAL LABELS, INTERNAL PROCEDURES AND ROUTINES.
                    219: *
                    220: CMPCE  GLB
                    221: CMPEL  GLB
                    222: CMPLE  GLB
                    223: CMPSE  GLB
                    224: EVLXF  GLB
                    225: EVLXN  GLB
                    226: EVLXV  GLB
                    227: LCNXE  GLB
                    228: TRXQR  GLB
                    229: ACESS  INP  R,1
                    230: ACOMP  INP  N,5
                    231: ALLOC  INP  E,0
                    232: .IF    .CNBF
                    233: .ELSE
                    234: ALOBF  INP  E,0
                    235: .FI
                    236: ALOCS  INP  E,0
                    237: ALOST  INP  E,0
                    238: .IF    .CNRA
                    239: ARITH  INP  N,2
                    240: .ELSE
                    241: ARITH  INP  N,3
                    242: .FI
                    243: ASIGN  INP  R,1
                    244: ASINP  INP  R,1
                    245: BLKLN  INP  E,0
                    246: CBLCK  INP  N,1
                    247: CDGCG  INP  E,0
                    248: CDGEX  INP  R,0
                    249: CDGNM  INP  R,0
                    250: CDGVL  INP  R,0
                    251: CDWRD  INP  E,0
                    252: CMGEN  INP  R,0
                    253: CMPIL  INP  E,0
                    254: CNCRD  INP  E,0
                    255: COPND  INP  E,0
                    256: DFFNC  INP  E,0
                    257: DTYPE  INP  E,0
                    258: DUMPR  INP  E,0
                    259: ERMSG  INP  E,0
                    260: ERTEX  INP  E,0
                    261: EVALI  INP  R,3
                    262: EVALP  INP  R,1
                    263: EVALS  INP  R,2
                    264: EVALX  INP  R,1
                    265: EXBLD  INP  E,0
                    266: EXPAN  INP  E,0
                    267: EXPAP  INP  E,1
                    268: EXPDM  INP  N,0
                    269: EXPOP  INP  N,0
                    270: GBCOL  INP  E,0
                    271: GBCPF  INP  E,0
                    272: GTARR  INP  E,1
                    273: .IF    .CNBF
                    274: .ELSE
                    275: GTBUF  INP  E,1
                    276: .FI
                    277:        EJC
                    278: GTCOD  INP  E,1
                    279: GTEXP  INP  E,1
                    280: GTINT  INP  E,1
                    281: GTNUM  INP  E,1
                    282: GTNVR  INP  E,1
                    283: GTPAT  INP  E,1
                    284: .IF    .CNRA
                    285: .ELSE
                    286: GTREA  INP  E,1
                    287: .FI
                    288: GTSMI  INP  N,2
                    289: GTSTG  INP  N,1
                    290: GTVAR  INP  E,1
                    291: HASHS  INP  E,0
                    292: ICBLD  INP  E,0
                    293: IDENT  INP  E,1
                    294: INOUT  INP  E,0
                    295: .IF    .CNBF
                    296: .ELSE
                    297: INSBF  INP  E,2
                    298: .FI
                    299: IOFTG  INP  N,1
                    300: IOPUT  INP  N,4
                    301: KTREX  INP  R,0
                    302: KWNAM  INP  N,0
                    303: LCOMP  INP  N,5
                    304: LISTR  INP  E,0
                    305: LISTT  INP  E,0
                    306: NEXTS  INP  E,0
                    307: PATIN  INP  N,2
                    308: PATST  INP  N,1
                    309: PBILD  INP  E,0
                    310: PCONC  INP  E,0
                    311: PCOPY  INP  N,0
                    312: .IF    .CNPF
                    313: .ELSE
                    314: PRFLR  INP  E,0
                    315: PRFLU  INP  E,0
                    316: .FI
                    317: PRPAR  INP  E,0
                    318: PRTCF  INP  E,0
                    319: PRTCH  INP  E,0
                    320: PRTFB  INP  E,0
                    321: PRTFH  INP  R,0
                    322: PRTIN  INP  E,0
                    323: PRTMI  INP  E,0
                    324: PRTNM  INP  R,0
                    325: PRTNV  INP  E,0
                    326: PRTPG  INP  E,0
                    327: PRTPS  INP  E,0
                    328: PRTSF  INP  E,0
                    329: PRTSN  INP  E,0
                    330: PRTST  INP  R,0
                    331:        EJC
                    332: PRTVF  INP  E,0
                    333: PRTVL  INP  R,0
                    334: PRTVN  INP  E,0
                    335: PTTFH  INP  E,0
                    336: PTTST  INP  E,0
                    337: .IF    .CNRA
                    338: .ELSE
                    339: RCBLD  INP  E,0
                    340: .FI
                    341: READR  INP  E,0
                    342: .IF    .CASL
                    343: SBSCC  INP  E,0
                    344: SBSTG  INP  E,0
                    345: .FI
                    346: SBSTR  INP  E,0
                    347: SCANE  INP  E,0
                    348: SCNGF  INP  E,0
                    349: SETVR  INP  E,0
                    350: .IF    .CNSR
                    351: .ELSE
                    352: SORTA  INP  N,1
                    353: SORTC  INP  E,1
                    354: SORTF  INP  E,0
                    355: SORTH  INP  N,0
                    356: .FI
                    357: TFIND  INP  E,1
                    358: TRACE  INP  N,3
                    359: TRBLD  INP  E,0
                    360: TRCHN  INP  E,1
                    361: TRIMR  INP  E,0
                    362: TRXEQ  INP  R,0
                    363: XSCAN  INP  E,0
                    364: XSCNI  INP  N,2
                    365: ARREF  INR
                    366: CFUNC  INR
                    367: EROSI  INR
                    368: ERROR  INR
                    369: EXFAL  INR
                    370: EXINT  INR
                    371: EXITS  INR
                    372: EXIXR  INR
                    373: EXNAM  INR
                    374: EXNUL  INR
                    375: .IF    .CNRA
                    376: .ELSE
                    377: EXREA  INR
                    378: .FI
                    379: EXSID  INR
                    380: EXVNM  INR
                    381: FAILP  INR
                    382: FLPOP  INR
                    383: INDIR  INR
                    384: INITL  INR
                    385: MATCH  INR
                    386: RETRN  INR
                    387: STAKV  INR
                    388: STCOV  INR
                    389: STMGO  INR
                    390: STOPR  INR
                    391: SUCCP  INR
                    392:        TTL  S P I T B O L -- DEFINITIONS AND DATA STRUCTURES
                    393: *      THIS SECTION CONTAINS ALL SYMBOL DEFINITIONS AND ALSO
                    394: *      PICTURES OF ALL DATA STRUCTURES USED IN THE SYSTEM.
                    395: *
                    396:        SEC                   START OF DEFINITIONS SECTION
                    397: *
                    398: *      DEFINITIONS OF MACHINE PARAMETERS
                    399: *
                    400: *      THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
                    401: *      FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
                    402: *      EQU  *
                    403: *      DEFINITIONS GIVEN AT THE START OF THIS SECTION.
                    404: *      NOTE THAT EVEN IF CONDITIONAL ASSEMBLY IS USED TO OMIT
                    405: *      SOME FEATURE (E.G. REAL ARITHMETIC) A FULL SET OF CFP$-
                    406: *      VALUES MUST BE SUPPLIED. USE DUMMY VALUES IF GENUINE
                    407: *      ONES ARE NOT NEEDED.
                    408: *
                    409: CFP$A  EQU  *                NUMBER OF CHARACTERS IN ALPHABET
                    410: *
                    411: CFP$B  EQU  *                BAUS/WORD ADDRESSING FACTOR
                    412: *
                    413: CFP$C  EQU  *                NUMBER OF CHARACTERS PER WORD
                    414: *
                    415: CFP$F  EQU  *                OFFSET IN BAUS TO CHARS IN
                    416: *                            SCBLK. SEE SCBLK FORMAT.
                    417: *
                    418: CFP$I  EQU  *                NUMBER OF WORDS IN INTEGER CONSTANT
                    419: *
                    420: CFP$M  EQU  *                MAX POSITIVE INTEGER IN ONE WORD
                    421: *
                    422: CFP$N  EQU  *                NUMBER OF BITS IN ONE WORD
                    423: *
                    424: CFP$R  EQU  *                NUMBER OF WORDS IN REAL CONSTANT
                    425: *
                    426: CFP$S  EQU  *                NUMBER OF SIG DIGS FOR REAL OUTPUT
                    427: *
                    428: *      THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
                    429: *      UPPER BOUND ON THE SIZE OF THE ALPHABET.  CFP$U IS USED
                    430: *      TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
                    431: *      TRANSLATION STORAGE REQUIREMENTS.
                    432: *
                    433: CFP$U  EQU  *                REALISTIC UPPER BOUND ON ALPHABET
                    434: *
                    435: CFP$X  EQU  *                MAX DIGITS IN REAL EXPONENT
                    436: *
                    437: MXDGS  EQU  CFP$S+CFP$X      MAX DIGITS IN REAL NUMBER
                    438: *
                    439: NSTMX  EQU  MXDGS+5          MAX SPACE FOR REAL (FOR +0.E+)
                    440:        EJC
                    441: *
                    442: *      ENVIRONMENT PARAMETERS
                    443: *
                    444: *      THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
                    445: *      THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
                    446: *      EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
                    447: *      THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
                    448: *      THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
                    449: *
                    450: *      E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
                    451: *      STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
                    452: *      SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
                    453: *      IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
                    454: *      AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
                    455: *      AN SCBLK CONTAINING SAY 30 CHARACTERS.
                    456: *
                    457: E$SRS  EQU  *                30 WORDS
                    458: *
                    459: *      E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
                    460: *      STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
                    461: *      PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
                    462: *      TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
                    463: *
                    464: E$STS  EQU  *                500 WORDS
                    465: *
                    466: *      E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
                    467: *      THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
                    468: *      IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
                    469: *      WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
                    470: *      IN THE CASE OF A TOO LARGE VALUE.
                    471: *
                    472: E$CBS  EQU  *                500 WORDS
                    473: *
                    474: *      E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
                    475: *      HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
                    476: *      SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
                    477: *      EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
                    478: *
                    479: E$HNB  EQU  *                127 BUCKET HEADERS
                    480: *
                    481: *      E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
                    482: *      NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
                    483: *      LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
                    484: *      LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
                    485: *
                    486: E$HNW  EQU  *                6 WORDS
                    487: *
                    488: *      E$FSP .  IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
                    489: *      COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
                    490: *      IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
                    491: *      THIS SPACE IS USED UP.  E$FSP IS A MEASURE OF THE
                    492: *      MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
                    493: *      BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
                    494: *      OBTAIN MORE MEMORY.
                    495: *
                    496: E$FSP  EQU  *                15 PERCENT
                    497:        EJC
                    498: *
                    499: *      DEFINITIONS OF CODES FOR LETTERS
                    500: *
                    501: CH$LA  EQU  *                LETTER A
                    502: CH$LB  EQU  *                LETTER B
                    503: CH$LC  EQU  *                LETTER C
                    504: CH$LD  EQU  *                LETTER D
                    505: CH$LE  EQU  *                LETTER E
                    506: CH$LF  EQU  *                LETTER F
                    507: CH$LG  EQU  *                LETTER G
                    508: CH$LH  EQU  *                LETTER H
                    509: CH$LI  EQU  *                LETTER I
                    510: CH$LJ  EQU  *                LETTER J
                    511: CH$LK  EQU  *                LETTER K
                    512: CH$LL  EQU  *                LETTER L
                    513: CH$LM  EQU  *                LETTER M
                    514: CH$LN  EQU  *                LETTER N
                    515: CH$LO  EQU  *                LETTER O
                    516: CH$LP  EQU  *                LETTER P
                    517: CH$LQ  EQU  *                LETTER Q
                    518: CH$LR  EQU  *                LETTER R
                    519: CH$LS  EQU  *                LETTER S
                    520: CH$LT  EQU  *                LETTER T
                    521: CH$LU  EQU  *                LETTER U
                    522: CH$LV  EQU  *                LETTER V
                    523: CH$LW  EQU  *                LETTER W
                    524: CH$LX  EQU  *                LETTER X
                    525: CH$LY  EQU  *                LETTER Y
                    526: CH$L$  EQU  *                LETTER Z
                    527: *
                    528: *      DEFINITIONS OF CODES FOR DIGITS
                    529: *
                    530: CH$D0  EQU  *                DIGIT 0
                    531: CH$D1  EQU  *                DIGIT 1
                    532: CH$D2  EQU  *                DIGIT 2
                    533: CH$D3  EQU  *                DIGIT 3
                    534: CH$D4  EQU  *                DIGIT 4
                    535: CH$D5  EQU  *                DIGIT 5
                    536: CH$D6  EQU  *                DIGIT 6
                    537: CH$D7  EQU  *                DIGIT 7
                    538: CH$D8  EQU  *                DIGIT 8
                    539: CH$D9  EQU  *                DIGIT 9
                    540:        EJC
                    541: *
                    542: *      DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
                    543: *
                    544: *      THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
                    545: *      ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
                    546: *      TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
                    547: *
                    548: CH$AM  EQU  *                KEYWORD OPERATOR (AMPERSAND)
                    549: CH$AS  EQU  *                MULTIPLICATION SYMBOL (ASTERISK)
                    550: CH$AT  EQU  *                CURSOR POSITION OPERATOR (AT)
                    551: CH$BB  EQU  *                LEFT ARRAY BRACKET (LESS THAN)
                    552: CH$BL  EQU  *                BLANK
                    553: CH$BR  EQU  *                ALTERNATION OPERATOR (VERTICAL BAR)
                    554: CH$CL  EQU  *                GOTO SYMBOL (COLON)
                    555: CH$CM  EQU  *                COMMA
                    556: CH$DL  EQU  *                INDIRECTION OPERATOR (DOLLAR)
                    557: CH$DT  EQU  *                NAME OPERATOR (DOT)
                    558: CH$DQ  EQU  *                DOUBLE QUOTE
                    559: CH$EQ  EQU  *                EQUAL SIGN
                    560: CH$EX  EQU  *                EXPONENTIATION OPERATOR (EXCLM)
                    561: CH$MN  EQU  *                MINUS SIGN
                    562: CH$NM  EQU  *                NUMBER SIGN
                    563: CH$NT  EQU  *                NEGATION OPERATOR (NOT)
                    564: CH$PC  EQU  *                PERCENT
                    565: CH$PL  EQU  *                PLUS SIGN
                    566: CH$PP  EQU  *                LEFT PARENTHESIS
                    567: CH$RB  EQU  *                RIGHT ARRAY BRACKET (GRTR THAN)
                    568: CH$RP  EQU  *                RIGHT PARENTHESIS
                    569: CH$QU  EQU  *                INTERROGATION OPERATOR (QUESTION)
                    570: CH$SL  EQU  *                SLASH
                    571: CH$SM  EQU  *                SEMICOLON
                    572: CH$SQ  EQU  *                SINGLE QUOTE
                    573: CH$UN  EQU  *                SPECIAL IDENTIFIER CHAR (UNDERLINE)
                    574: CH$OB  EQU  *                OPENING BRACKET
                    575: CH$CB  EQU  *                CLOSING BRACKET
                    576:        EJC
                    577: *
                    578: *      REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
                    579: *      THEY ARE ALL UNDER CONDITIONAL ASSEMBLY.
                    580: .IF    .CAHT
                    581: *
                    582: *      TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
                    583: *
                    584: CH$HT  EQU  *                HORIZONTAL TAB
                    585: .FI
                    586: .IF    .CAVT
                    587: CH$VT  EQU  *                VERTICAL TAB
                    588: .FI
                    589: .IF    .CASL
                    590: *
                    591: *      LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
                    592: *
                    593: CH$$A  EQU  *                SHIFTED A
                    594: CH$$B  EQU  *                SHIFTED B
                    595: CH$$C  EQU  *                SHIFTED C
                    596: CH$$D  EQU  *                SHIFTED D
                    597: CH$$E  EQU  *                SHIFTED E
                    598: CH$$F  EQU  *                SHIFTED F
                    599: CH$$G  EQU  *                SHIFTED G
                    600: CH$$H  EQU  *                SHIFTED H
                    601: CH$$I  EQU  *                SHIFTED I
                    602: CH$$J  EQU  *                SHIFTED J
                    603: CH$$K  EQU  *                SHIFTED K
                    604: CH$$L  EQU  *                SHIFTED L
                    605: CH$$M  EQU  *                SHIFTED M
                    606: CH$$N  EQU  *                SHIFTED N
                    607: CH$$O  EQU  *                SHIFTED O
                    608: CH$$P  EQU  *                SHIFTED P
                    609: CH$$Q  EQU  *                SHIFTED Q
                    610: CH$$R  EQU  *                SHIFTED R
                    611: CH$$S  EQU  *                SHIFTED S
                    612: CH$$T  EQU  *                SHIFTED T
                    613: CH$$U  EQU  *                SHIFTED U
                    614: CH$$V  EQU  *                SHIFTED V
                    615: CH$$W  EQU  *                SHIFTED W
                    616: CH$$X  EQU  *                SHIFTED X
                    617: CH$$Y  EQU  *                SHIFTED Y
                    618: CH$$$  EQU  *                SHIFTED Z
                    619: .IF    .CASL
                    620: DFA$A  EQU  CH$$A-CH$LA      DIFF BETWEEN LC AND UC LETTERS
                    621: .FI
                    622: .FI
                    623:        EJC
                    624: *
                    625: *      DATA BLOCK FORMATS AND DEFINITIONS
                    626: *
                    627: *      THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
                    628: *      ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
                    629: *
                    630: *      EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
                    631: *      UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
                    632: *      BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
                    633: *      INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
                    634: *      CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
                    635: *      IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
                    636: *      DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
                    637: *
                    638: *      IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
                    639: *      FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
                    640: *      TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
                    641: *      CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
                    642: *      WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
                    643: *      POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
                    644: *
                    645: *      IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
                    646: *      MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
                    647: *      IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
                    648: *      A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
                    649: *      TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
                    650: *      COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
                    651: *      IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
                    652: *      PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
                    653: *      FIELDS IN A BLOCK MUST BE CONTIGUOUS.
                    654:        EJC
                    655: *
                    656: *      THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
                    657: *
                    658: *      1)   BLOCK TITLE AND TWO CHARACTER IDENTIFIER
                    659: *
                    660: *      2)   DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
                    661: *           OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
                    662: *
                    663: *      3)   PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
                    664: *           MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
                    665: *           LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
                    666: *           WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
                    667: *           ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
                    668: *           (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
                    669: *           BY / (SLASH).
                    670: *
                    671: *      4)   DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
                    672: *           BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
                    673: *           OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
                    674: *           BLOCK IS VARIABLE LENGTH.
                    675: *           NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
                    676: *           CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
                    677: *           GIVEN HERE ENFORCE THIS.  MAKE CHANGES TO
                    678: *           THEM ONLY WITH DUE CARE.
                    679: *
                    680: *      DEFINITIONS OF COMMON OFFSETS
                    681: *
                    682: OFFS1  EQU  1
                    683: OFFS2  EQU  2
                    684: OFFS3  EQU  3
                    685: *
                    686: *      5)   DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
                    687: *           OF THE VARIOUS FIELDS.
                    688: *
                    689: *      THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
                    690:        EJC
                    691: *
                    692: *      DEFINITIONS OF BLOCK CODES
                    693: *
                    694: *      THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
                    695: *      EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
                    696: *      THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
                    697: *      ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
                    698: *      THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
                    699: *      USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
                    700: *
                    701: *      BLOCK CODES FOR ACCESSIBLE DATATYPES
                    702: *
                    703: BL$AR  EQU  0                ARBLK     ARRAY
                    704: .IF    .CNBF
                    705: BL$CD  EQU  BL$AR+1          CDBLK     CODE
                    706: .ELSE
                    707: BL$BC  EQU  BL$AR+1          BCBLK     BUFFER
                    708: BL$CD  EQU  BL$BC+1          CDBLK     CODE
                    709: .FI
                    710: BL$EX  EQU  BL$CD+1          EXBLK     EXPRESSION
                    711: BL$IC  EQU  BL$EX+1          ICBLK     INTEGER
                    712: BL$NM  EQU  BL$IC+1          NMBLK     NAME
                    713: BL$P0  EQU  BL$NM+1          P0BLK     PATTERN
                    714: BL$P1  EQU  BL$P0+1          P1BLK     PATTERN
                    715: BL$P2  EQU  BL$P1+1          P2BLK     PATTERN
                    716: .IF    .CNRA
                    717: BL$SC  EQU  BL$P2+1          SCBLK     STRING
                    718: .ELSE
                    719: BL$RC  EQU  BL$P2+1          RCBLK     REAL
                    720: BL$SC  EQU  BL$RC+1          SCBLK     STRING
                    721: .FI
                    722: BL$SE  EQU  BL$SC+1          SEBLK     EXPRESSION
                    723: BL$TB  EQU  BL$SE+1          TBBLK     TABLE
                    724: BL$VC  EQU  BL$TB+1          VCBLK     ARRAY
                    725: BL$XN  EQU  BL$VC+1          XNBLK     EXTERNAL
                    726: BL$XR  EQU  BL$XN+1          XRBLK     EXTERNAL
                    727: BL$PD  EQU  BL$XR+1          PDBLK     PROGRAM DEFINED DATATYPE
                    728: *
                    729: BL$$D  EQU  BL$PD+1          NUMBER OF BLOCK CODES FOR DATA
                    730: *
                    731: *      OTHER BLOCK CODES
                    732: *
                    733: BL$TR  EQU  BL$PD+1          TRBLK
                    734: .IF    .CNBF
                    735: BL$CC  EQU  BL$TR+1          CCBLK
                    736: .ELSE
                    737: BL$BF  EQU  BL$TR+1          BFBLK
                    738: BL$CC  EQU  BL$BF+1          CCBLK
                    739: .FI
                    740: BL$CM  EQU  BL$CC+1          CMBLK
                    741: BL$CO  EQU  BL$CM+1          COBLK
                    742: BL$CT  EQU  BL$CO+1          CTBLK
                    743: BL$DF  EQU  BL$CT+1          DFBLK
                    744: BL$EF  EQU  BL$DF+1          EFBLK
                    745: BL$EV  EQU  BL$EF+1          EVBLK
                    746: BL$FF  EQU  BL$EV+1          FFBLK
                    747: BL$KV  EQU  BL$FF+1          KVBLK
                    748: BL$PF  EQU  BL$KV+1          PFBLK
                    749: BL$TE  EQU  BL$PF+1          TEBLK
                    750: *
                    751: BL$$I  EQU  0                DEFAULT IDENTIFICATION CODE
                    752: BL$$T  EQU  BL$TR+1          CODE FOR DATA OR TRACE BLOCK
                    753: BL$$$  EQU  BL$TE+1          NUMBER OF BLOCK CODES
                    754:        EJC
                    755: *
                    756: *      FIELD REFERENCES
                    757: *
                    758: *      REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
                    759: *      (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
                    760: *      EXCEPTIONS.
                    761: *
                    762: *      1)   REFERENCES TO THE FIRST WORD ARE USUALLY NOT
                    763: *           SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
                    764: *
                    765: *      2)   THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
                    766: *           SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
                    767: *           BLOCK FORMAT IS MODIFIED.
                    768: *
                    769: *      3)   THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
                    770: *           CORRESPONDING TO THE DEFINITION OF CFP$F.
                    771: *
                    772: *      4)   THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
                    773: *           IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
                    774: *
                    775: *      5)   THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
                    776: *           AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
                    777: *           BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
                    778: *           TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
                    779: *           LISTED EXCEPTIONS.
                    780: *
                    781: *      6)   SEVERAL SPOTS IN THE CODE ASSUME THAT THE
                    782: *           DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
                    783: *           THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
                    784: *           OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
                    785: *
                    786: *      7)   REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
                    787: *           ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
                    788: *
                    789: *      APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
                    790: *      AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
                    791: *      OF FIELDS WILL NOT REQUIRE CHANGES.
                    792:        EJC
                    793: *
                    794: *      COMMON FIELDS FOR FUNCTION BLOCKS
                    795: *
                    796: *      BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
                    797: *      COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
                    798: *
                    799: *           +------------------------------------+
                    800: *           I                FCODE               I
                    801: *           +------------------------------------+
                    802: *           I                FARGS               I
                    803: *           +------------------------------------+
                    804: *           /                                    /
                    805: *           /       REST OF FUNCTION BLOCK       /
                    806: *           /                                    /
                    807: *           +------------------------------------+
                    808: *
                    809: FCODE  EQU  0                POINTER TO CODE FOR FUNCTION
                    810: FARGS  EQU  1                NUMBER OF ARGUMENTS
                    811: *
                    812: *      FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
                    813: *      PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
                    814: *
                    815: *      FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
                    816: *      NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
                    817: *      DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
                    818: *      FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
                    819: *      A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
                    820: *      VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
                    821: *
                    822: *      THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
                    823: *
                    824: *      FFBLK                 FIELD FUNCTION
                    825: *      DFBLK                 DATATYPE FUNCTION
                    826: *      PFBLK                 PROGRAM DEFINED FUNCTION
                    827: *      EFBLK                 EXTERNAL LOADED FUNCTION
                    828:        EJC
                    829: *
                    830: *      IDENTIFICATION FIELD
                    831: *
                    832: *
                    833: *      ID   FIELD
                    834: *
                    835: *      CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
                    836: *      OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
                    837: *      IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
                    838: *      ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
                    839: *
                    840: IDVAL  EQU  1                ID VALUE FIELD
                    841: *
                    842: *      THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
                    843: *
                    844: *      ARBLK                 ARRAY
                    845: *      PDBLK                 PROGRAM DEFINED DATATYPE
                    846: *      TBBLK                 TABLE
                    847: *      VCBLK                 VECTOR BLOCK (ARRAY)
                    848: *
                    849: *      NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
                    850: *      HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
                    851:        EJC
                    852: *
                    853: *      ARRAY BLOCK (ARBLK)
                    854: *
                    855: *      AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
                    856: *      WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
                    857: *      AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
                    858: *      (S$CNV) OR ARRAY (S$ARR).
                    859: *
                    860: *           +------------------------------------+
                    861: *           I                ARTYP               I
                    862: *           +------------------------------------+
                    863: *           I                IDVAL               I
                    864: *           +------------------------------------+
                    865: *           I                ARLEN               I
                    866: *           +------------------------------------+
                    867: *           I                AROFS               I
                    868: *           +------------------------------------+
                    869: *           I                ARNDM               I
                    870: *           +------------------------------------+
                    871: *           *                ARLBD               *
                    872: *           +------------------------------------+
                    873: *           *                ARDIM               *
                    874: *           +------------------------------------+
                    875: *           *                                    *
                    876: *           * ABOVE 2 FLDS REPEATED FOR EACH DIM *
                    877: *           *                                    *
                    878: *           +------------------------------------+
                    879: *           I                ARPRO               I
                    880: *           +------------------------------------+
                    881: *           /                                    /
                    882: *           /                ARVLS               /
                    883: *           /                                    /
                    884: *           +------------------------------------+
                    885:        EJC
                    886: *
                    887: *      ARRAY BLOCK (CONTINUED)
                    888: *
                    889: ARTYP  EQU  0                POINTER TO DUMMY ROUTINE B$ART
                    890: ARLEN  EQU  IDVAL+1          LENGTH OF ARBLK IN BAUS
                    891: AROFS  EQU  ARLEN+1          OFFSET IN ARBLK TO ARPRO FIELD
                    892: ARNDM  EQU  AROFS+1          NUMBER OF DIMENSIONS
                    893: ARLBD  EQU  ARNDM+1          LOW BOUND (FIRST SUBSCRIPT)
                    894: ARDIM  EQU  ARLBD+CFP$I      DIMENSION (FIRST SUBSCRIPT)
                    895: ARLB2  EQU  ARDIM+CFP$I      LOW BOUND (SECOND SUBSCRIPT)
                    896: ARDM2  EQU  ARLB2+CFP$I      DIMENSION (SECOND SUBSCRIPT)
                    897: ARPRO  EQU  ARDIM+CFP$I      ARRAY PROTOTYPE (ONE DIMENSION)
                    898: ARVLS  EQU  ARPRO+1          START OF VALUES (ONE DIMENSION)
                    899: ARPR2  EQU  ARDM2+CFP$I      ARRAY PROTOTYPE (TWO DIMENSIONS)
                    900: ARVL2  EQU  ARPR2+1          START OF VALUES (TWO DIMENSIONS)
                    901: ARSI$  EQU  ARLBD            NUMBER OF STANDARD FIELDS IN BLOCK
                    902: ARDMS  EQU  ARLB2-ARLBD      SIZE OF INFO FOR ONE SET OF BOUNDS
                    903: *
                    904: *      THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
                    905: *      VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
                    906: *
                    907: *      THE LENGTH OF AN ARBLK IN BAUS MAY NOT EXCEED MXLEN.
                    908: *      THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
                    909: *
                    910: *      THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
                    911: *      CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
                    912: .IF    .CNBF
                    913: .ELSE
                    914:        EJC
                    915: *      BUFFER CONTROL BLOCK (BCBLK)
                    916: *
                    917: *      A BCBLK IS BUILT FOR EVERY BFBLK.
                    918: *
                    919: *           +------------------------------------+
                    920: *           I                BCTYP               I
                    921: *           +------------------------------------+
                    922: *           I                IDVAL               I
                    923: *           +------------------------------------+
                    924: *           I                BCLEN               I
                    925: *           +------------------------------------+
                    926: *           I                BCBUF               I
                    927: *           +------------------------------------+
                    928: *
                    929: BCTYP  EQU  0                PTR TO DUMMY ROUTINE B$BCT
                    930: BCLEN  EQU  IDVAL+1          DEFINED BUFFER LENGTH
                    931: BCBUF  EQU  BCLEN+1          PTR TO BFBLK
                    932: BCSI$  EQU  BCBUF+1          SIZE OF BCBLK
                    933: *
                    934: *      A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
                    935: *      THE REASON FOR NOT STORING THIS DATA DIRECTLY
                    936: *      IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
                    937: *      MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
                    938: *      THUS FACILITATING TRANSPARENT STRING OPERATIONS
                    939: *      (FOR THE MOST PART).  SPECIFICALLY, CFP$F IS THE
                    940: *      SAME FOR A BFBLK AS FOR AN SCBLK.  BY CONVENTION,
                    941: *      WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
                    942: *      IS POINTED TO.
                    943: *
                    944: *      THE CORRESPONDING BFBLK IS POINTED TO BY THE
                    945: *      BCBUF POINTER IN THE BCBLK.
                    946: *
                    947: *      BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
                    948: *      ARRAY IN THE BFBLK.  CHARACTERS FOLLOWING THE OFFSET
                    949: *      OF BCLEN ARE UNDEFINED.
                    950: *
                    951:        EJC
                    952: *
                    953: *      STRING BUFFER BLOCK (BFBLK)
                    954: *
                    955: *      A BFBLK IS BUILT BY A CALL TO BUFFER(...)
                    956: *
                    957: *           +------------------------------------+
                    958: *           I                BFTYP               I
                    959: *           +------------------------------------+
                    960: *           I                BFALC               I
                    961: *           +------------------------------------+
                    962: *           /                                    /
                    963: *           /                BFCHR               /
                    964: *           /                                    /
                    965: *           +------------------------------------+
                    966: *
                    967: BFTYP  EQU  0                PTR TO DUMMY ROUTINE B$BFT
                    968: BFALC  EQU  BFTYP+1          ALLOCATED SIZE OF BUFFER
                    969: BFCHR  EQU  BFALC+1          CHARACTERS OF STRING
                    970: BFSI$  EQU  BFCHR            SIZE OF STANDARD FIELDS IN BFBLK
                    971: *
                    972: *      THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
                    973: *      THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
                    974: *      (CHARACTER) PADDED.  ANY TRAILING ALLOCATION PAST THE
                    975: *      WORD CONTAINING THE LAST CHARACTER CONTAINS
                    976: *      UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
                    977: *
                    978: *      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
                    979: *      IS GIVEN BY CFP$F, AS WITH AN SCBLK.  HOWEVER, THE
                    980: *      OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
                    981: *      IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
                    982: *      DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
                    983: *
                    984: *      THE VALUE OF BFALC MAY NOT EXCEED MXLEN.  THE VALUE OF
                    985: *      BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
                    986: *
                    987: .FI
                    988:        EJC
                    989: *
                    990: *      CODE CONSTRUCTION BLOCK (CCBLK)
                    991: *
                    992: *      AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
                    993: *      WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
                    994: *
                    995: *           +------------------------------------+
                    996: *           I                CCTYP               I
                    997: *           +------------------------------------+
                    998: *           I                CCLEN               I
                    999: *           +------------------------------------+
                   1000: *           I                CCUSE               I
                   1001: *           +------------------------------------+
                   1002: *           /                                    /
                   1003: *           /                CCCOD               /
                   1004: *           /                                    /
                   1005: *           +------------------------------------+
                   1006: *
                   1007: CCTYP  EQU  0                POINTER TO DUMMY ROUTINE B$CCT
                   1008: CCLEN  EQU  CCTYP+1          LENGTH OF CCBLK IN BAUS
                   1009: CCUSE  EQU  CCLEN+1          OFFSET PAST LAST USED WORD (BAUS)
                   1010: CCCOD  EQU  CCUSE+1          START OF GENERATED CODE IN BLOCK
                   1011: *
                   1012: *      THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
                   1013: *      THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
                   1014: *      ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
                   1015:        EJC
                   1016: *
                   1017: *      CODE BLOCK (CDBLK)
                   1018: *
                   1019: *      A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
                   1020: *      THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
                   1021: *
                   1022: *           +------------------------------------+
                   1023: *           I                CDJMP               I
                   1024: *           +------------------------------------+
                   1025: *           I                CDSTM               I
                   1026: *           +------------------------------------+
                   1027: *           I                CDLEN               I
                   1028: *           +------------------------------------+
                   1029: *           I                CDFAL               I
                   1030: *           +------------------------------------+
                   1031: *           /                                    /
                   1032: *           /                CDCOD               /
                   1033: *           /                                    /
                   1034: *           +------------------------------------+
                   1035: *
                   1036: CDJMP  EQU  0                PTR TO ROUTINE TO EXECUTE STATEMENT
                   1037: CDSTM  EQU  CDJMP+1          STATEMENT NUMBER
                   1038: CDLEN  EQU  OFFS2            LENGTH OF CDBLK IN BAUS
                   1039: CDFAL  EQU  OFFS3            FAILURE EXIT (SEE BELOW)
                   1040: CDCOD  EQU  CDFAL+1          EXECUTABLE PSEUDO-CODE
                   1041: CDSI$  EQU  CDCOD            NUMBER OF STANDARD FIELDS IN CDBLK
                   1042: *
                   1043: *      CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
                   1044: *
                   1045: *      CDJMP, CDFAL ARE SET AS FOLLOWS.
                   1046: *
                   1047: *      1)   IF THE FAILURE EXIT IS THE NEXT STATEMENT
                   1048: *
                   1049: *           CDJMP = B$CDS
                   1050: *           CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
                   1051: *
                   1052: *      2)   IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
                   1053: *
                   1054: *           CDJMP = B$CDS
                   1055: *           CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
                   1056: *
                   1057: *      3)   IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
                   1058: *
                   1059: *           CDJMP = B$CDS
                   1060: *           CDFAL = O$UNF
                   1061: *
                   1062: *      4)   IF THE FAILURE EXIT IS COMPLEX OR DIRECT
                   1063: *
                   1064: *           CDJMP = B$CDC
                   1065: *           CDFAL IS THE OFFSET TO THE O$GOF WORD
                   1066:        EJC
                   1067: *
                   1068: *      CODE BLOCK (CONTINUED)
                   1069: *
                   1070: *      CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
                   1071: *      THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
                   1072: *      ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
                   1073: *      THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
                   1074: *      BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
                   1075: *      CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
                   1076: *      SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
                   1077: *
                   1078: *      GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
                   1079: *
                   1080: *      EXPRESSION            POINTER TO EXBLK OR SEBLK
                   1081: *
                   1082: *      INTEGER CONSTANT      POINTER TO ICBLK
                   1083: *
                   1084: *      NULL CONSTANT         POINTER TO NULLS
                   1085: *
                   1086: *      PATTERN               (RESULTING FROM PREEVALUATION)
                   1087: *                            =O$LPT
                   1088: *                            POINTER TO P0BLK,P1BLK OR P2BLK
                   1089: *
                   1090: *      REAL CONSTANT         POINTER TO RCBLK
                   1091: *
                   1092: *      STRING CONSTANT       POINTER TO SCBLK
                   1093: *
                   1094: *      VARIABLE              POINTER TO VRGET FIELD OF VRBLK
                   1095: *
                   1096: *      ADDITION              VALUE CODE FOR LEFT OPERAND
                   1097: *                            VALUE CODE FOR RIGHT OPERAND
                   1098: *                            =O$ADD
                   1099: *
                   1100: *      AFFIRMATION           VALUE CODE FOR OPERAND
                   1101: *                            =O$AFF
                   1102: *
                   1103: *      ALTERNATION           VALUE CODE FOR LEFT OPERAND
                   1104: *                            VALUE CODE FOR RIGHT OPERAND
                   1105: *                            =O$ALT
                   1106: *
                   1107: *      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
                   1108: *                            VALUE CODE FOR ARRAY OPERAND
                   1109: *                            VALUE CODE FOR SUBSCRIPT OPERAND
                   1110: *                            =O$AOV
                   1111: *
                   1112: *                            (CASE OF MORE THAN ONE SUBSCRIPT)
                   1113: *                            VALUE CODE FOR ARRAY OPERAND
                   1114: *                            VALUE CODE FOR FIRST SUBSCRIPT
                   1115: *                            VALUE CODE FOR SECOND SUBSCRIPT
                   1116: *                            ...
                   1117: *                            VALUE CODE FOR LAST SUBSCRIPT
                   1118: *                            =O$AMV
                   1119: *                            NUMBER OF SUBSCRIPTS
                   1120:        EJC
                   1121: *
                   1122: *      CODE BLOCK (CONTINUED)
                   1123: *
                   1124: *      ASSIGNMENT            (TO NATURAL VARIABLE)
                   1125: *                            VALUE CODE FOR RIGHT OPERAND
                   1126: *                            POINTER TO VRSTO FIELD OF VRBLK
                   1127: *
                   1128: *                            (TO ANY OTHER VARIABLE)
                   1129: *                            NAME CODE FOR LEFT OPERAND
                   1130: *                            VALUE CODE FOR RIGHT OPERAND
                   1131: *                            =O$ASS
                   1132: *
                   1133: *      COMPILE ERROR         =O$CER
                   1134: *
                   1135: *
                   1136: *      COMPLEMENTATION       VALUE CODE FOR OPERAND
                   1137: *                            =O$COM
                   1138: *
                   1139: *      CONCATENATION         (CASE OF PRED FUNC LEFT OPERAND)
                   1140: *                            VALUE CODE FOR LEFT OPERAND
                   1141: *                            =O$POP
                   1142: *                            VALUE CODE FOR RIGHT OPERAND
                   1143: *
                   1144: *                            (ALL OTHER CASES)
                   1145: *                            VALUE CODE FOR LEFT OPERAND
                   1146: *                            VALUE CODE FOR RIGHT OPERAND
                   1147: *                            =O$CNC
                   1148: *
                   1149: *      CURSOR ASSIGNMENT     NAME CODE FOR OPERAND
                   1150: *                            =O$CAS
                   1151: *
                   1152: *      DIVISION              VALUE CODE FOR LEFT OPERAND
                   1153: *                            VALUE CODE FOR RIGHT OPERAND
                   1154: *                            =O$DVD
                   1155: *
                   1156: *      EXPONENTIATION        VALUE CODE FOR LEFT OPERAND
                   1157: *                            VALUE CODE FOR RIGHT OPERAND
                   1158: *                            =O$EXP
                   1159: *
                   1160: *      FUNCTION CALL         (CASE OF CALL TO SYSTEM FUNCTION)
                   1161: *                            VALUE CODE FOR FIRST ARGUMENT
                   1162: *                            VALUE CODE FOR SECOND ARGUMENT
                   1163: *                            ...
                   1164: *                            VALUE CODE FOR LAST ARGUMENT
                   1165: *                            POINTER TO SVFNC FIELD OF SVBLK
                   1166: *
                   1167:        EJC
                   1168: *
                   1169: *      CODE BLOCK (CONTINUED)
                   1170: *
                   1171: *      FUNCTION CALL         (CASE OF NON-SYSTEM FUNCTION 1 ARG)
                   1172: *                            VALUE CODE FOR ARGUMENT
                   1173: *                            =O$FNS
                   1174: *                            POINTER TO VRBLK FOR FUNCTION
                   1175: *
                   1176: *                            (NON-SYSTEM FUNCTION, GT 1 ARG)
                   1177: *                            VALUE CODE FOR FIRST ARGUMENT
                   1178: *                            VALUE CODE FOR SECOND ARGUMENT
                   1179: *                            ...
                   1180: *                            VALUE CODE FOR LAST ARGUMENT
                   1181: *                            =O$FNC
                   1182: *                            NUMBER OF ARGUMENTS
                   1183: *                            POINTER TO VRBLK FOR FUNCTION
                   1184: *
                   1185: *      IMMEDIATE ASSIGNMENT  VALUE CODE FOR LEFT OPERAND
                   1186: *                            NAME CODE FOR RIGHT OPERAND
                   1187: *                            =O$IMA
                   1188: *
                   1189: *      INDIRECTION           VALUE CODE FOR OPERAND
                   1190: *                            =O$INV
                   1191: *
                   1192: *      INTERROGATION         VALUE CODE FOR OPERAND
                   1193: *                            =O$INT
                   1194: *
                   1195: *      KEYWORD REFERENCE     NAME CODE FOR OPERAND
                   1196: *                            =O$KWV
                   1197: *
                   1198: *      MULTIPLICATION        VALUE CODE FOR LEFT OPERAND
                   1199: *                            VALUE CODE FOR RIGHT OPERAND
                   1200: *                            =O$MLT
                   1201: *
                   1202: *      NAME REFERENCE        (NATURAL VARIABLE CASE)
                   1203: *                            POINTER TO NMBLK FOR NAME
                   1204: *
                   1205: *                            (ALL OTHER CASES)
                   1206: *                            NAME CODE FOR OPERAND
                   1207: *                            =O$NAM
                   1208: *
                   1209: *      NEGATION              =O$NTA
                   1210: *                            CDBLK OFFSET OF O$NTC WORD
                   1211: *                            VALUE CODE FOR OPERAND
                   1212: *                            =O$NTB
                   1213: *                            =O$NTC
                   1214:        EJC
                   1215: *
                   1216: *      CODE BLOCK (CONTINUED)
                   1217: *
                   1218: *      PATTERN ASSIGNMENT    VALUE CODE FOR LEFT OPERAND
                   1219: *                            NAME CODE FOR RIGHT OPERAND
                   1220: *                            =O$PAS
                   1221: *
                   1222: *      PATTERN MATCH         VALUE CODE FOR LEFT OPERAND
                   1223: *                            VALUE CODE FOR RIGHT OPERAND
                   1224: *                            =O$PMV
                   1225: *
                   1226: *      PATTERN REPLACEMENT   NAME CODE FOR SUBJECT
                   1227: *                            VALUE CODE FOR PATTERN
                   1228: *                            =O$PMN
                   1229: *                            VALUE CODE FOR REPLACEMENT
                   1230: *                            =O$RPL
                   1231: *
                   1232: *      SELECTION             (FOR FIRST ALTERNATIVE)
                   1233: *                            =O$SLA
                   1234: *                            CDBLK OFFSET TO NEXT O$SLC WORD
                   1235: *                            VALUE CODE FOR FIRST ALTERNATIVE
                   1236: *                            =O$SLB
                   1237: *                            CDBLK OFFSET PAST ALTERNATIVES
                   1238: *
                   1239: *                            (FOR SUBSEQUENT ALTERNATIVES)
                   1240: *                            =O$SLC
                   1241: *                            CDBLK OFFSET TO NEXT O$SLC,O$SLD
                   1242: *                            VALUE CODE FOR ALTERNATIVE
                   1243: *                            =O$SLB
                   1244: *                            OFFSET IN CDBLK PAST ALTERNATIVES
                   1245: *
                   1246: *                            (FOR LAST ALTERNATIVE)
                   1247: *                            =O$SLD
                   1248: *                            VALUE CODE FOR LAST ALTERNATIVE
                   1249: *
                   1250: *      SUBTRACTION           VALUE CODE FOR LEFT OPERAND
                   1251: *                            VALUE CODE FOR RIGHT OPERAND
                   1252: *                            =O$SUB
                   1253:        EJC
                   1254: *
                   1255: *      CODE BLOCK (CONTINUED)
                   1256: *
                   1257: *      GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
                   1258: *
                   1259: *      VARIABLE              =O$LVN
                   1260: *                            POINTER TO VRBLK
                   1261: *
                   1262: *      EXPRESSION            (CASE OF *NATURAL VARIABLE)
                   1263: *                            =O$LVN
                   1264: *                            POINTER TO VRBLK
                   1265: *
                   1266: *                            (ALL OTHER CASES)
                   1267: *                            =O$LEX
                   1268: *                            POINTER TO EXBLK
                   1269: *
                   1270: *
                   1271: *      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
                   1272: *                            VALUE CODE FOR ARRAY OPERAND
                   1273: *                            VALUE CODE FOR SUBSCRIPT OPERAND
                   1274: *                            =O$AON
                   1275: *
                   1276: *                            (CASE OF MORE THAN ONE SUBSCRIPT)
                   1277: *                            VALUE CODE FOR ARRAY OPERAND
                   1278: *                            VALUE CODE FOR FIRST SUBSCRIPT
                   1279: *                            VALUE CODE FOR SECOND SUBSCRIPT
                   1280: *                            ...
                   1281: *                            VALUE CODE FOR LAST SUBSCRIPT
                   1282: *                            =O$AMN
                   1283: *                            NUMBER OF SUBSCRIPTS
                   1284: *
                   1285: *      COMPILE ERROR         =O$CER
                   1286: *
                   1287: *      FUNCTION CALL         (SAME CODE AS FOR VALUE CALL)
                   1288: *                            =O$FNE
                   1289: *
                   1290: *      INDIRECTION           VALUE CODE FOR OPERAND
                   1291: *                            =O$INN
                   1292: *
                   1293: *      KEYWORD REFERENCE     NAME CODE FOR OPERAND
                   1294: *                            =O$KWN
                   1295: *
                   1296: *      ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
                   1297: *
                   1298: *      NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
                   1299: *      GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
                   1300: *      WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
                   1301:        EJC
                   1302: *
                   1303: *      CODE BLOCK (CONTINUED)
                   1304: *
                   1305: *      NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
                   1306: *      FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
                   1307: *
                   1308: *      FIRST COMES THE CODE FOR THE STATEMENT BODY.
                   1309: *      THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
                   1310: *      BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
                   1311: *      NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
                   1312: *      STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
                   1313: *      VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
                   1314: *
                   1315: *                            VALUE CODE FOR LEFT OPERAND
                   1316: *                            VALUE CODE FOR RIGHT OPERAND
                   1317: *                            =O$PMS
                   1318: *
                   1319: *      NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
                   1320: *      SEVERAL CASES AS FOLLOWS.
                   1321: *
                   1322: *      1)   NO SUCCESS GOTO  PTR TO CDBLK FOR NEXT STATEMENT
                   1323: *
                   1324: *      2)   SIMPLE LABEL     PTR TO VRTRA FIELD OF VRBLK
                   1325: *
                   1326: *      3)   COMPLEX GOTO     (CODE BY NAME FOR GOTO OPERAND)
                   1327: *                            =O$GOC
                   1328: *
                   1329: *      4)   DIRECT GOTO      (CODE BY VALUE FOR GOTO OPERAND)
                   1330: *                            =O$GOD
                   1331: *
                   1332: *      FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
                   1333: *      IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
                   1334: *      HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
                   1335: *      CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
                   1336: *      OF THE FOLLOWING.
                   1337: *
                   1338: *      1)   COMPLEX FGOTO    =O$FIF
                   1339: *                            =O$GOF
                   1340: *                            NAME CODE FOR GOTO OPERAND
                   1341: *                            =O$GOC
                   1342: *
                   1343: *      2)   DIRECT FGOTO     =O$FIF
                   1344: *                            =O$GOF
                   1345: *                            VALUE CODE FOR GOTO OPERAND
                   1346: *                            =O$GOD
                   1347: *
                   1348: *      AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
                   1349: *      ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
                   1350: *      NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
                   1351: *      IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
                   1352:        EJC
                   1353: *
                   1354: *      COMPILER BLOCK (CMBLK)
                   1355: *
                   1356: *      A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
                   1357: *      ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
                   1358: *
                   1359: *           +------------------------------------+
                   1360: *           I                CMIDN               I
                   1361: *           +------------------------------------+
                   1362: *           I                CMLEN               I
                   1363: *           +------------------------------------+
                   1364: *           I                CMTYP               I
                   1365: *           +------------------------------------+
                   1366: *           I                CMOPN               I
                   1367: *           +------------------------------------+
                   1368: *           /           CMVLS OR CMROP           /
                   1369: *           /                                    /
                   1370: *           /                CMLOP               /
                   1371: *           /                                    /
                   1372: *           +------------------------------------+
                   1373: *
                   1374: CMIDN  EQU  0                POINTER TO DUMMY ROUTINE B$CMT
                   1375: CMLEN  EQU  CMIDN+1          LENGTH OF CMBLK IN BAUS
                   1376: CMTYP  EQU  CMLEN+1          TYPE (C$XXX, SEE LIST BELOW)
                   1377: CMOPN  EQU  CMTYP+1          OPERAND POINTER (SEE BELOW)
                   1378: CMVLS  EQU  CMOPN+1          OPERAND VALUE POINTERS (SEE BELOW)
                   1379: CMROP  EQU  CMVLS            RIGHT (ONLY) OPERATOR OPERAND
                   1380: CMLOP  EQU  CMVLS+1          LEFT OPERATOR OPERAND
                   1381: CMSI$  EQU  CMVLS            NUMBER OF STANDARD FIELDS IN CMBLK
                   1382: CMUS$  EQU  CMSI$+1          SIZE OF UNARY OPERATOR CMBLK
                   1383: CMBS$  EQU  CMSI$+2          SIZE OF BINARY OPERATOR CMBLK
                   1384: CMAR1  EQU  CMVLS+1          ARRAY SUBSCRIPT POINTERS
                   1385: *
                   1386: *      THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
                   1387: *
                   1388: *      ARRAY REFERENCE       CMOPN = PTR TO ARRAY OPERAND
                   1389: *                            CMVLS = PTRS TO SUBSCRIPT OPERANDS
                   1390: *
                   1391: *      FUNCTION CALL         CMOPN = PTR TO VRBLK FOR FUNCTION
                   1392: *                            CMVLS = PTRS TO ARGUMENT OPERANDS
                   1393: *
                   1394: *      SELECTION             CMOPN = ZERO
                   1395: *                            CMVLS = PTRS TO ALTERNATE OPERANDS
                   1396: *
                   1397: *      UNARY OPERATOR        CMOPN = PTR TO OPERATOR DVBLK
                   1398: *                            CMROP = PTR TO OPERAND
                   1399: *
                   1400: *      BINARY OPERATOR       CMOPN = PTR TO OPERATOR DVBLK
                   1401: *                            CMROP = PTR TO RIGHT OPERAND
                   1402: *                            CMLOP = PTR TO LEFT OPERAND
                   1403:        EJC
                   1404: *
                   1405: *      CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
                   1406: *      AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
                   1407: *
                   1408: C$ARR  EQU  0                ARRAY REFERENCE
                   1409: C$FNC  EQU  C$ARR+1          FUNCTION CALL
                   1410: C$DEF  EQU  C$FNC+1          DEFERRED EXPRESSION (UNARY *)
                   1411: C$IND  EQU  C$DEF+1          INDIRECTION (UNARY $)
                   1412: C$KEY  EQU  C$IND+1          KEYWORD REFERENCE (UNARY AMPERSAND)
                   1413: C$UBO  EQU  C$KEY+1          UNDEFINED BINARY OPERATOR
                   1414: C$UUO  EQU  C$UBO+1          UNDEFINED UNARY OPERATOR
                   1415: C$UO$  EQU  C$UUO+1          TEST VALUE (=C$UUO+1=C$UBO+2)
                   1416: C$$NM  EQU  C$UUO+1          NUMBER OF CODES FOR NAME OPERANDS
                   1417: *
                   1418: *      THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
                   1419: *      CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
                   1420: *
                   1421: C$BVL  EQU  C$UUO+1          BINARY OP WITH VALUE OPERANDS
                   1422: C$UVL  EQU  C$BVL+1          UNARY OPERATOR WITH VALUE OPERAND
                   1423: C$ALT  EQU  C$UVL+1          ALTERNATION (BINARY BAR)
                   1424: C$CNC  EQU  C$ALT+1          CONCATENATION
                   1425: C$CNP  EQU  C$CNC+1          CONCATENATION, NOT PATTERN MATCH
                   1426: C$UNM  EQU  C$CNP+1          UNARY OP WITH NAME OPERAND
                   1427: C$BVN  EQU  C$UNM+1          BINARY OP (OPERANDS BY VALUE, NAME)
                   1428: C$ASS  EQU  C$BVN+1          ASSIGNMENT
                   1429: C$INT  EQU  C$ASS+1          INTERROGATION
                   1430: C$NEG  EQU  C$INT+1          NEGATION (UNARY NOT)
                   1431: C$SEL  EQU  C$NEG+1          SELECTION
                   1432: C$PMT  EQU  C$SEL+1          PATTERN MATCH
                   1433: *
                   1434: C$PR$  EQU  C$BVN            LAST PREEVALUABLE CODE
                   1435: C$$NV  EQU  C$PMT+1          NUMBER OF DIFFERENT CMBLK TYPES
                   1436:        EJC
                   1437: *
                   1438: *      COPY FILE BLOCK (COBLK)
                   1439: *
                   1440: *      A CHAIN STACK OF COPY BLOCKS IS BUILT FOR EVERY NESTED
                   1441: *      -COPY CONTROL CARD.  THE CONTROL BLOCK IS USED TO PRESERVE
                   1442: *      THE INPUT CONTEXT OF THE FILE CONTAINING THE -COPY.
                   1443: *      AS -COPYS ARE ENDED, THESE BLOCKS ARE POPPED OFF THE CHAIN
                   1444: *      AND THE STATE RESTORED.  SEE ROUTINES CNCRD, COPND.
                   1445: *
                   1446: *           +------------------------------------+
                   1447: *           I                COTYP               I
                   1448: *           +------------------------------------+
                   1449: *           I                CONXT               I
                   1450: *           +------------------------------------+
                   1451: *           I                COIOT               I
                   1452: *           +------------------------------------+
                   1453: *           I                COTTI               I
                   1454: *           +------------------------------------+
                   1455: *           I                COCIM               I
                   1456: *           +------------------------------------+
                   1457: *           I                COSPT               I
                   1458: *           +------------------------------------+
                   1459: *           I                COSLS               I
                   1460: *           +------------------------------------+
                   1461: *           I                COSIN               I
                   1462: *           +------------------------------------+
                   1463: *           I                COSTL               I
                   1464: *           +------------------------------------+
                   1465: *
                   1466: COTYP  EQU  0                POINTER TO DUMMY ROUTINE B$COP
                   1467: CONXT  EQU  COTYP+1          POINT TO NEXT (OUTER -COPY) COBLK
                   1468: COIOT  EQU  CONXT+1          RECORD IOTAG FOR OSINT
                   1469: COTTI  EQU  COIOT+1          RECORD TTINS FLAG
                   1470: COCIM  EQU  COTTI+1          RECORD R$CIM COMPILER IMAGE
                   1471: COSPT  EQU  COCIM+1          RECORD SCNPT SCAN POINTER
                   1472: COSLS  EQU  COSPT+1          RECORD CSWLS LISTING FLAG
                   1473: COSIN  EQU  COSLS+1          RECORD CSWIN -INXXX VALUE
                   1474: COSTL  EQU  COSIN+1          RECORD R$STL -STITL STRING PTR
                   1475: COSI$  EQU  COSTL+1          SIZE OF COBLK
                   1476:        EJC
                   1477: *
                   1478: *      CHARACTER TABLE BLOCK (CTBLK)
                   1479: *
                   1480: *      A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
                   1481: *      TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
                   1482: *      PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
                   1483: *      CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
                   1484: *      ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
                   1485: *      IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
                   1486: *
                   1487: *           +------------------------------------+
                   1488: *           I                CTTYP               I
                   1489: *           +------------------------------------+
                   1490: *           *                                    *
                   1491: *           *                                    *
                   1492: *           *                CTCHS               *
                   1493: *           *                                    *
                   1494: *           *                                    *
                   1495: *           +------------------------------------+
                   1496: *
                   1497: CTTYP  EQU  0                POINTER TO DUMMY ROUTINE B$CTT
                   1498: CTCHS  EQU  CTTYP+1          START OF CHARACTER TABLE WORDS
                   1499: CTSI$  EQU  CTCHS+CFP$A      NUMBER OF WORDS IN CTBLK
                   1500: *
                   1501: *      CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
                   1502: *      BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
                   1503: *      INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
                   1504: *      A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
                   1505: *      A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
                   1506: *      IF THE CHARACTER IS NOT PRESENT.
                   1507:        EJC
                   1508: *
                   1509: *      DATATYPE FUNCTION BLOCK (DFBLK)
                   1510: *
                   1511: *      A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
                   1512: *      OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
                   1513: *      SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
                   1514: *
                   1515: *      NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
                   1516: *      LENGTH IS GOT FROM DFLEN FIELD.  IF DFBLK WAS IN DYNAMIC
                   1517: *      STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
                   1518: *      COLLECTION.  SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
                   1519: *      IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
                   1520: *      GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
                   1521: *      LIKELY TO BE PRESENT IN LARGE NUMBERS.
                   1522: *
                   1523: *           +------------------------------------+
                   1524: *           I                FCODE               I
                   1525: *           +------------------------------------+
                   1526: *           I                FARGS               I
                   1527: *           +------------------------------------+
                   1528: *           I                DFLEN               I
                   1529: *           +------------------------------------+
                   1530: *           I                DFPDL               I
                   1531: *           +------------------------------------+
                   1532: *           I                DFNAM               I
                   1533: *           +------------------------------------+
                   1534: *           /                                    /
                   1535: *           /                DFFLD               /
                   1536: *           /                                    /
                   1537: *           +------------------------------------+
                   1538: *
                   1539: DFLEN  EQU  FARGS+1          LENGTH OF DFBLK IN BAUS
                   1540: DFPDL  EQU  DFLEN+1          LENGTH OF CORRESPONDING PDBLK
                   1541: DFNAM  EQU  DFPDL+1          POINTER TO SCBLK FOR DATATYPE NAME
                   1542: DFFLD  EQU  DFNAM+1          START OF VRBLK PTRS FOR FIELD NAMES
                   1543: DFFLB  EQU  DFFLD-1          OFFSET BEHIND DFFLD FOR FIELD FUNC
                   1544: DFSI$  EQU  DFFLD            NUMBER OF STANDARD FIELDS IN DFBLK
                   1545: *
                   1546: *      THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
                   1547: *
                   1548: *      FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
                   1549:        EJC
                   1550: *
                   1551: *      DOPE VECTOR BLOCK (DVBLK)
                   1552: *
                   1553: *      A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
                   1554: *      THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
                   1555: *
                   1556: *           +------------------------------------+
                   1557: *           I                DVOPN               I
                   1558: *           +------------------------------------+
                   1559: *           I                DVTYP               I
                   1560: *           +------------------------------------+
                   1561: *           I                DVLPR               I
                   1562: *           +------------------------------------+
                   1563: *           I                DVRPR               I
                   1564: *           +------------------------------------+
                   1565: *
                   1566: DVOPN  EQU  0                ENTRY ADDRESS (PTR TO O$XXX)
                   1567: DVTYP  EQU  DVOPN+1          TYPE CODE (C$XXX, SEE CMBLK)
                   1568: DVLPR  EQU  DVTYP+1          LEFT PRECEDENCE (LLXXX, SEE BELOW)
                   1569: DVRPR  EQU  DVLPR+1          RIGHT PRECEDENCE (RRXXX, SEE BELOW)
                   1570: DVUS$  EQU  DVLPR+1          SIZE OF UNARY OPERATOR DV
                   1571: DVBS$  EQU  DVRPR+1          SIZE OF BINARY OPERATOR DV
                   1572: DVUBS  EQU  DVUS$+DVBS$      SIZE OF UNOP + BINOP (SEE SCANE)
                   1573: *
                   1574: *      THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
                   1575: *      FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
                   1576: *
                   1577: *      THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
                   1578: *      ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
                   1579: *
                   1580: *      FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
                   1581: *      FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
                   1582: *      BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
                   1583: *      FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
                   1584: *      REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
                   1585: *
                   1586: *      THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
                   1587: *      THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
                   1588: *      PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
                   1589: *
                   1590: *      THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
                   1591: *      THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
                   1592: *      THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
                   1593: *
                   1594: *      HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
                   1595: *      CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
                   1596: *      (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
                   1597: *      ASSOCIATIVE BINARY OPERATORS.
                   1598: *
                   1599: *      THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
                   1600: *      ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
                   1601: *      CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
                   1602:        EJC
                   1603: *
                   1604: *      TABLE OF OPERATOR PRECEDENCE VALUES
                   1605: *
                   1606: RRASS  EQU  10               RIGHT     EQUAL
                   1607: LLASS  EQU  00               LEFT      EQUAL
                   1608: RRPMT  EQU  20               RIGHT     QUESTION MARK
                   1609: LLPMT  EQU  30               LEFT      QUESTION MARK
                   1610: RRAMP  EQU  40               RIGHT     AMPERSAND
                   1611: LLAMP  EQU  50               LEFT      AMPERSAND
                   1612: RRALT  EQU  70               RIGHT     VERTICAL BAR
                   1613: LLALT  EQU  60               LEFT      VERTICAL BAR
                   1614: RRCNC  EQU  90               RIGHT     BLANK
                   1615: LLCNC  EQU  80               LEFT      BLANK
                   1616: RRATS  EQU  110              RIGHT     AT
                   1617: LLATS  EQU  100              LEFT      AT
                   1618: RRPLM  EQU  120              RIGHT     PLUS, MINUS
                   1619: LLPLM  EQU  130              LEFT      PLUS, MINUS
                   1620: RRNUM  EQU  140              RIGHT     NUMBER
                   1621: LLNUM  EQU  150              LEFT      NUMBER
                   1622: RRDVD  EQU  160              RIGHT     SLASH
                   1623: LLDVD  EQU  170              LEFT      SLASH
                   1624: RRMLT  EQU  180              RIGHT     ASTERISK
                   1625: LLMLT  EQU  190              LEFT      ASTERISK
                   1626: RRPCT  EQU  200              RIGHT     PERCENT
                   1627: LLPCT  EQU  210              LEFT      PERCENT
                   1628: RREXP  EQU  230              RIGHT     EXCLAMATION
                   1629: LLEXP  EQU  220              LEFT      EXCLAMATION
                   1630: RRDLD  EQU  240              RIGHT     DOLLAR, DOT
                   1631: LLDLD  EQU  250              LEFT      DOLLAR, DOT
                   1632: RRNOT  EQU  270              RIGHT     NOT
                   1633: LLNOT  EQU  260              LEFT      NOT
                   1634: LLUNO  EQU  999              LEFT      ALL UNARY OPERATORS
                   1635: *
                   1636: *      PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
                   1637: *      FOLLOWING EXCEPTIONS.
                   1638: *
                   1639: *      1)   BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
                   1640: *           IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
                   1641: *
                   1642: *      2)   ALTERNATION AND CONCATENATION ARE MADE RIGHT
                   1643: *           ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
                   1644: *           CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
                   1645: *           IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
                   1646: *
                   1647: *      3)   THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
                   1648: *           OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
                   1649: *           MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
                   1650: .IF    .CNLD
                   1651: .ELSE
                   1652:        EJC
                   1653: *
                   1654: *      EXTERNAL FUNCTION BLOCK (EFBLK)
                   1655: *
                   1656: *      AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
                   1657: *      OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
                   1658: *
                   1659: *           +------------------------------------+
                   1660: *           I                FCODE               I
                   1661: *           +------------------------------------+
                   1662: *           I                FARGS               I
                   1663: *           +------------------------------------+
                   1664: *           I                EFLEN               I
                   1665: *           +------------------------------------+
                   1666: *           I                EFUSE               I
                   1667: *           +------------------------------------+
                   1668: *           I                EFCOD               I
                   1669: *           +------------------------------------+
                   1670: *           I                EFVAR               I
                   1671: *           +------------------------------------+
                   1672: *           I                EFRSL               I
                   1673: *           +------------------------------------+
                   1674: *           /                                    /
                   1675: *           /                EFTAR               /
                   1676: *           /                                    /
                   1677: *           +------------------------------------+
                   1678: *
                   1679: EFLEN  EQU  FARGS+1          LENGTH OF EFBLK IN BAUS
                   1680: EFUSE  EQU  EFLEN+1          USE COUNT (FOR OPSYN)
                   1681: EFCOD  EQU  EFUSE+1          PTR TO CODE (FROM SYSLD)
                   1682: EFVAR  EQU  EFCOD+1          PTR TO ASSOCIATED VRBLK
                   1683: EFRSL  EQU  EFVAR+1          RESULT TYPE (SEE BELOW)
                   1684: EFTAR  EQU  EFRSL+1          ARGUMENT TYPES (SEE BELOW)
                   1685: EFSI$  EQU  EFTAR            NUMBER OF STANDARD FIELDS IN EFBLK
                   1686: *
                   1687: *      THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
                   1688: *
                   1689: *      EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
                   1690: *      IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
                   1691: *      WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
                   1692: *
                   1693: *      EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
                   1694: *
                   1695: *           0                TYPE IS UNCONVERTED
                   1696: *           1                TYPE IS STRING
                   1697: *           2                TYPE IS INTEGER
                   1698: *           3                TYPE IS REAL
                   1699: *           4                TYPE IS BUFFER
                   1700: .FI
                   1701:        EJC
                   1702: *
                   1703: *      EXPRESSION VARIABLE BLOCK (EVBLK)
                   1704: *
                   1705: *      IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
                   1706: *      ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
                   1707: *      EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
                   1708: *      ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
                   1709: *      OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
                   1710: *      AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
                   1711: *
                   1712: *           +------------------------------------+
                   1713: *           I                EVTYP               I
                   1714: *           +------------------------------------+
                   1715: *           I                EVEXP               I
                   1716: *           +------------------------------------+
                   1717: *           I                EVVAR               I
                   1718: *           +------------------------------------+
                   1719: *
                   1720: EVTYP  EQU  0                POINTER TO DUMMY ROUTINE B$EVT
                   1721: EVEXP  EQU  EVTYP+1          POINTER TO EXBLK FOR EXPRESSION
                   1722: EVVAR  EQU  EVEXP+1          POINTER TO TRBEV DUMMY TRBLK
                   1723: EVSI$  EQU  EVVAR+1          SIZE OF EVBLK
                   1724: *
                   1725: *      THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
                   1726: *      BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
                   1727: *      VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
                   1728: *
                   1729: *      NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
                   1730: *      EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
                   1731: *      VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
                   1732:        EJC
                   1733: *
                   1734: *      EXPRESSION BLOCK (EXBLK)
                   1735: *
                   1736: *      AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
                   1737: *      REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
                   1738: *      DURING EXECUTION OF A PROGRAM.
                   1739: *
                   1740: *           +------------------------------------+
                   1741: *           I                EXTYP               I
                   1742: *           +------------------------------------+
                   1743: *           I                EXSTM               I
                   1744: *           +------------------------------------+
                   1745: *           I                EXLEN               I
                   1746: *           +------------------------------------+
                   1747: *           I                EXFLC               I
                   1748: *           +------------------------------------+
                   1749: *           /                                    /
                   1750: *           /                EXCOD               /
                   1751: *           /                                    /
                   1752: *           +------------------------------------+
                   1753: *
                   1754: EXTYP  EQU  0                PTR TO ROUTINE B$EXL TO LOAD EXPR
                   1755: EXSTM  EQU  CDSTM            STORES STMNT NO. DURING EVALUATION
                   1756: EXLEN  EQU  EXSTM+1          LENGTH OF EXBLK IN BAUS
                   1757: EXFLC  EQU  EXLEN+1          FAILURE CODE (=O$FEX)
                   1758: EXCOD  EQU  EXFLC+1          PSEUDO-CODE FOR EXPRESSION
                   1759: EXSI$  EQU  EXCOD            NUMBER OF STANDARD FIELDS IN EXBLK
                   1760: *
                   1761: *      THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
                   1762: *      EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
                   1763: *      OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
                   1764: *
                   1765: *      IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
                   1766: *
                   1767: *                            (CODE FOR EXPR BY NAME)
                   1768: *                            =O$RNM
                   1769: *
                   1770: *      IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
                   1771: *
                   1772: *                            (CODE FOR EXPR BY VALUE)
                   1773: *                            =O$RVL
                   1774:        EJC
                   1775: *
                   1776: *      FIELD FUNCTION BLOCK (FFBLK)
                   1777: *
                   1778: *      A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
                   1779: *      OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
                   1780: *      A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
                   1781: *
                   1782: *           +------------------------------------+
                   1783: *           I                FCODE               I
                   1784: *           +------------------------------------+
                   1785: *           I                FARGS               I
                   1786: *           +------------------------------------+
                   1787: *           I                FFDFP               I
                   1788: *           +------------------------------------+
                   1789: *           I                FFNXT               I
                   1790: *           +------------------------------------+
                   1791: *           I                FFOFS               I
                   1792: *           +------------------------------------+
                   1793: *
                   1794: FFDFP  EQU  FARGS+1          POINTER TO ASSOCIATED DFBLK
                   1795: FFNXT  EQU  FFDFP+1          PTR TO NEXT FFBLK ON CHAIN OR ZERO
                   1796: FFOFS  EQU  FFNXT+1          OFFSET (BAUS) TO FIELD IN PDBLK
                   1797: FFSI$  EQU  FFOFS+1          SIZE OF FFBLK IN WORDS
                   1798: *
                   1799: *      THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
                   1800: *
                   1801: *      FARGS ALWAYS CONTAINS ONE.
                   1802: *
                   1803: *      FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
                   1804: *      DATATYPE IS BEING ACCESSED BY THIS CALL.
                   1805: *      FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
                   1806: *
                   1807: *      FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
                   1808: *      IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
                   1809: *
                   1810: *      FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
                   1811: *      IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
                   1812: *      NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
                   1813:        EJC
                   1814: *
                   1815: *      INTEGER CONSTANT BLOCK (ICBLK)
                   1816: *
                   1817: *      AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
                   1818: *      CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
                   1819: *      INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
                   1820: *      FIELD IN A STRING CONSTANT BLOCK)
                   1821: *
                   1822: *           +------------------------------------+
                   1823: *           I                ICGET               I
                   1824: *           +------------------------------------+
                   1825: *           *                ICVAL               *
                   1826: *           +------------------------------------+
                   1827: *
                   1828: ICGET  EQU  0                PTR TO ROUTINE B$ICL TO LOAD INT
                   1829: ICVAL  EQU  ICGET+1          INTEGER VALUE
                   1830: ICSI$  EQU  ICVAL+CFP$I      SIZE OF ICBLK
                   1831: *
                   1832: *      THE LENGTH OF THE ICVAL FIELD IS CFP$I.
                   1833:        EJC
                   1834: *
                   1835: *      KEYWORD VARIABLE BLOCK (KVBLK)
                   1836: *
                   1837: *      A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
                   1838: *      A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
                   1839: *
                   1840: *           +------------------------------------+
                   1841: *           I                KVTYP               I
                   1842: *           +------------------------------------+
                   1843: *           I                KVVAR               I
                   1844: *           +------------------------------------+
                   1845: *           I                KVNUM               I
                   1846: *           +------------------------------------+
                   1847: *
                   1848: KVTYP  EQU  0                POINTER TO DUMMY ROUTINE B$KVT
                   1849: KVVAR  EQU  KVTYP+1          POINTER TO DUMMY BLOCK TRBKV
                   1850: KVNUM  EQU  KVVAR+1          KEYWORD NUMBER
                   1851: KVSI$  EQU  KVNUM+1          SIZE OF KVBLK
                   1852: *
                   1853: *      THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
                   1854: *      BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
                   1855: *      VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
                   1856:        EJC
                   1857: *
                   1858: *      NAME BLOCK (NMBLK)
                   1859: *
                   1860: *      A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
                   1861: *      A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
                   1862: *
                   1863: *           +------------------------------------+
                   1864: *           I                NMTYP               I
                   1865: *           +------------------------------------+
                   1866: *           I                NMBAS               I
                   1867: *           +------------------------------------+
                   1868: *           I                NMOFS               I
                   1869: *           +------------------------------------+
                   1870: *
                   1871: NMTYP  EQU  0                PTR TO ROUTINE B$NML TO LOAD NAME
                   1872: NMBAS  EQU  NMTYP+1          BASE POINTER FOR VARIABLE
                   1873: NMOFS  EQU  NMBAS+1          OFFSET FOR VARIABLE
                   1874: NMSI$  EQU  NMOFS+1          SIZE OF NMBLK
                   1875: *
                   1876: *      THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
                   1877: *      IS FOUND NMOFS BAUS PAST THE ADDRESS IN NMBAS.
                   1878: *
                   1879: *      THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
                   1880: *      CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
                   1881: *      COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
                   1882: *
                   1883: *      A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
                   1884: *      REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
                   1885: *      CASES OF PSEUDO-VARIABLES.
                   1886:        EJC
                   1887: *
                   1888: *      PATTERN BLOCK, NO PARAMETERS (P0BLK)
                   1889: *
                   1890: *      A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
                   1891: *      NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
                   1892: *
                   1893: *           +------------------------------------+
                   1894: *           I                PCODE               I
                   1895: *           +------------------------------------+
                   1896: *           I                PTHEN               I
                   1897: *           +------------------------------------+
                   1898: *
                   1899: PCODE  EQU  0                PTR TO MATCH ROUTINE (P$XXX)
                   1900: PTHEN  EQU  PCODE+1          POINTER TO SUBSEQUENT NODE
                   1901: PASI$  EQU  PTHEN+1          SIZE OF P0BLK
                   1902: *
                   1903: *      PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
                   1904: *      NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
                   1905: *      BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
                   1906: *
                   1907: *      PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
                   1908:        EJC
                   1909: *
                   1910: *      PATTERN BLOCK (ONE PARAMETER)
                   1911: *
                   1912: *      A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
                   1913: *      REQUIRE ONE PARAMETER VALUE.
                   1914: *
                   1915: *           +------------------------------------+
                   1916: *           I                PCODE               I
                   1917: *           +------------------------------------+
                   1918: *           I                PTHEN               I
                   1919: *           +------------------------------------+
                   1920: *           I                PARM1               I
                   1921: *           +------------------------------------+
                   1922: *
                   1923: PARM1  EQU  PTHEN+1          FIRST PARAMETER VALUE
                   1924: PBSI$  EQU  PARM1+1          SIZE OF P1BLK IN WORDS
                   1925: *
                   1926: *      SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
                   1927: *
                   1928: *      PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
                   1929: *      NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
                   1930: *      ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
                   1931: *      FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
                   1932: *      MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
                   1933: *      IS PROCESSED BY THE GARBAGE COLLECTOR.
                   1934:        EJC
                   1935: *
                   1936: *      PATTERN BLOCK (TWO PARAMETERS)
                   1937: *
                   1938: *      A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
                   1939: *      REQUIRE TWO PARAMETER VALUES.
                   1940: *
                   1941: *           +------------------------------------+
                   1942: *           I                PCODE               I
                   1943: *           +------------------------------------+
                   1944: *           I                PTHEN               I
                   1945: *           +------------------------------------+
                   1946: *           I                PARM1               I
                   1947: *           +------------------------------------+
                   1948: *           I                PARM2               I
                   1949: *           +------------------------------------+
                   1950: *
                   1951: PARM2  EQU  PARM1+1          SECOND PARAMETER VALUE
                   1952: PCSI$  EQU  PARM2+1          SIZE OF P2BLK IN WORDS
                   1953: *
                   1954: *      SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
                   1955: *
                   1956: *      PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
                   1957: *      FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
                   1958: *
                   1959: *      PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
                   1960: *      PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
                   1961: *      NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
                   1962:        EJC
                   1963: *
                   1964: *      PROGRAM-DEFINED DATATYPE BLOCK
                   1965: *
                   1966: *      A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
                   1967: *      DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
                   1968: *
                   1969: *           +------------------------------------+
                   1970: *           I                PDTYP               I
                   1971: *           +------------------------------------+
                   1972: *           I                IDVAL               I
                   1973: *           +------------------------------------+
                   1974: *           I                PDDFP               I
                   1975: *           +------------------------------------+
                   1976: *           /                                    /
                   1977: *           /                PDFLD               /
                   1978: *           /                                    /
                   1979: *           +------------------------------------+
                   1980: *
                   1981: PDTYP  EQU  0                PTR TO DUMMY ROUTINE B$PDT
                   1982: PDDFP  EQU  IDVAL+1          PTR TO ASSOCIATED DFBLK
                   1983: PDFLD  EQU  PDDFP+1          START OF FIELD VALUE POINTERS
                   1984: PDFOF  EQU  DFFLD-PDFLD      DIFFERENCE IN OFFSET TO FIELD PTRS
                   1985: PDSI$  EQU  PDFLD            SIZE OF STANDARD FIELDS IN PDBLK
                   1986: PDDFS  EQU  DFSI$-PDSI$      DIFFERENCE IN DFBLK, PDBLK SIZES
                   1987: *
                   1988: *      THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
                   1989: *      AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
                   1990: *      CONTAINS THE LENGTH OF THE PDBLK IN BAUS (FIELD DFPDL).
                   1991: *      PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
                   1992: *
                   1993: *      PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
                   1994: *      THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
                   1995:        EJC
                   1996: *
                   1997: *      PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
                   1998: *
                   1999: *      A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
                   2000: *      AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
                   2001: *
                   2002: *           +------------------------------------+
                   2003: *           I                FCODE               I
                   2004: *           +------------------------------------+
                   2005: *           I                FARGS               I
                   2006: *           +------------------------------------+
                   2007: *           I                PFLEN               I
                   2008: *           +------------------------------------+
                   2009: *           I                PFVBL               I
                   2010: *           +------------------------------------+
                   2011: *           I                PFNLO               I
                   2012: *           +------------------------------------+
                   2013: *           I                PFCOD               I
                   2014: *           +------------------------------------+
                   2015: *           I                PFCTR               I
                   2016: *           +------------------------------------+
                   2017: *           I                PFRTR               I
                   2018: *           +------------------------------------+
                   2019: *           /                                    /
                   2020: *           /                PFARG               /
                   2021: *           /                                    /
                   2022: *           +------------------------------------+
                   2023: *
                   2024: PFLEN  EQU  FARGS+1          LENGTH OF PFBLK IN BAUS
                   2025: PFVBL  EQU  PFLEN+1          POINTER TO VRBLK FOR FUNCTION NAME
                   2026: PFNLO  EQU  PFVBL+1          NUMBER OF LOCALS
                   2027: PFCOD  EQU  PFNLO+1          PTR TO CDBLK FOR FIRST STATEMENT
                   2028: PFCTR  EQU  PFCOD+1          TRBLK PTR IF CALL TRACED ELSE 0
                   2029: PFRTR  EQU  PFCTR+1          TRBLK PTR IF RETURN TRACED ELSE 0
                   2030: PFARG  EQU  PFRTR+1          VRBLK PTRS FOR ARGUMENTS AND LOCALS
                   2031: PFAGB  EQU  PFARG-1          OFFSET BEHIND PFARG FOR ARG,LOCAL
                   2032: PFSI$  EQU  PFARG            NUMBER OF STANDARD FIELDS IN PFBLK
                   2033: *
                   2034: *      THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
                   2035: *
                   2036: *      PFARG IS STORED IN THE FOLLOWING ORDER.
                   2037: *
                   2038: *           ARGUMENTS (LEFT TO RIGHT)
                   2039: *           LOCALS (LEFT TO RIGHT)
                   2040: .IF    .CNRA
                   2041: .ELSE
                   2042:        EJC
                   2043: *
                   2044: *      REAL CONSTANT BLOCK (RCBLK)
                   2045: *
                   2046: *      AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
                   2047: *      CREATED BY A PROGRAM.
                   2048: *
                   2049: *           +------------------------------------+
                   2050: *           I                RCGET               I
                   2051: *           +------------------------------------+
                   2052: *           *                RCVAL               *
                   2053: *           +------------------------------------+
                   2054: *
                   2055: RCGET  EQU  0                PTR TO ROUTINE B$RCL TO LOAD REAL
                   2056: RCVAL  EQU  RCGET+1          REAL VALUE
                   2057: RCSI$  EQU  RCVAL+CFP$R      SIZE OF RCBLK
                   2058: *
                   2059: *      THE LENGTH OF THE RCVAL FIELD IS CFP$R.
                   2060: .FI
                   2061:        EJC
                   2062: *
                   2063: *      STRING CONSTANT BLOCK (SCBLK)
                   2064: *
                   2065: *      AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
                   2066: *      BY A PROGRAM.
                   2067: *
                   2068: *           +------------------------------------+
                   2069: *           I                SCGET               I
                   2070: *           +------------------------------------+
                   2071: *           I                SCLEN               I
                   2072: *           +------------------------------------+
                   2073: *           /                                    /
                   2074: *           /                SCHAR               /
                   2075: *           /                                    /
                   2076: *           +------------------------------------+
                   2077: *
                   2078: SCGET  EQU  0                PTR TO ROUTINE B$SCL TO LOAD STRING
                   2079: SCLEN  EQU  SCGET+1          LENGTH OF STRING IN CHARACTERS
                   2080: SCHAR  EQU  SCLEN+1          CHARACTERS OF STRING
                   2081: SCSI$  EQU  SCHAR            SIZE OF STANDARD FIELDS IN SCBLK
                   2082: *
                   2083: *      THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
                   2084: *      THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
                   2085: *      (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
                   2086: *
                   2087: *      THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
                   2088: *      THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
                   2089: *      CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
                   2090: *
                   2091: *      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
                   2092: *      IS GIVEN IN BAUS BY CFP$F AND THAT THIS VALUE IS
                   2093: *      AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
                   2094: *      NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
                   2095: *      IS GIVEN BY CFP$B*SCHAR.
                   2096:        EJC
                   2097: *
                   2098: *      SIMPLE EXPRESSION BLOCK (SEBLK)
                   2099: *
                   2100: *      AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
                   2101: *      *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
                   2102: *
                   2103: *           +------------------------------------+
                   2104: *           I                SETYP               I
                   2105: *           +------------------------------------+
                   2106: *           I                SEVAR               I
                   2107: *           +------------------------------------+
                   2108: *
                   2109: SETYP  EQU  0                PTR TO ROUTINE B$SEL TO LOAD EXPR
                   2110: SEVAR  EQU  SETYP+1          PTR TO VRBLK FOR VARIABLE
                   2111: SESI$  EQU  SEVAR+1          LENGTH OF SEBLK IN WORDS
                   2112:        EJC
                   2113: *
                   2114: *      STANDARD VARIABLE BLOCK (SVBLK)
                   2115: *
                   2116: *      AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
                   2117: *      VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
                   2118: *
                   2119: *      1)   IT IS THE NAME OF A SYSTEM FUNCTION
                   2120: *      2)   IT HAS AN INITIAL VALUE
                   2121: *      3)   IT HAS A KEYWORD ASSOCIATION
                   2122: *      4)   IT HAS A STANDARD I/O ASSOCIATION
                   2123: *      6)   IT HAS A STANDARD LABEL ASSOCIATION
                   2124: *
                   2125: *      IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
                   2126: *      THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
                   2127: *
                   2128: *           +------------------------------------+
                   2129: *           I                SVBIT               I
                   2130: *           +------------------------------------+
                   2131: *           I                SVLEN               I
                   2132: *           +------------------------------------+
                   2133: *           /                SVCHS               /
                   2134: *           +------------------------------------+
                   2135: *           I                SVKNM               I
                   2136: *           +------------------------------------+
                   2137: *           I                SVFNC               I
                   2138: *           +------------------------------------+
                   2139: *           I                SVNAR               I
                   2140: *           +------------------------------------+
                   2141: *           I                SVLBL               I
                   2142: *           +------------------------------------+
                   2143: *           I                SVVAL               I
                   2144: *           +------------------------------------+
                   2145:        EJC
                   2146: *
                   2147: *      STANDARD VARIABLE BLOCK (CONTINUED)
                   2148: *
                   2149: SVBIT  EQU  0                BIT STRING INDICATING ATTRIBUTES
                   2150: SVLEN  EQU  1                (=SCLEN) LENGTH OF NAME IN CHARS
                   2151: SVCHS  EQU  2                (=SCHAR) CHARACTERS OF NAME
                   2152: SVSI$  EQU  2                NUMBER OF STANDARD FIELDS IN SVBLK
                   2153: SVPRE  EQU  1                SET IF PREEVALUATION PERMITTED
                   2154: SVFFC  EQU  SVPRE+SVPRE      SET ON IF FAST CALL PERMITTED
                   2155: SVCKW  EQU  SVFFC+SVFFC      SET ON IF KEYWORD VALUE CONSTANT
                   2156: SVPRD  EQU  SVCKW+SVCKW      SET ON IF PREDICATE FUNCTION
                   2157: SVNBT  EQU  4                NUMBER OF BITS TO RIGHT OF SVKNM
                   2158: SVKNM  EQU  SVPRD+SVPRD      SET ON IF KEYWORD ASSOCIATION
                   2159: SVFNC  EQU  SVKNM+SVKNM      SET ON IF SYSTEM FUNCTION
                   2160: SVNAR  EQU  SVFNC+SVFNC      SET ON IF SYSTEM FUNCTION
                   2161: SVLBL  EQU  SVNAR+SVNAR      SET ON IF SYSTEM LABEL
                   2162: SVVAL  EQU  SVLBL+SVLBL      SET ON IF PREDEFINED VALUE
                   2163: *
                   2164: *      NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
                   2165: *      TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
                   2166: *
                   2167: *      THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
                   2168: *
                   2169: SVFNF  EQU  SVFNC+SVNAR      FUNCTION WITH NO FAST CALL
                   2170: SVFNN  EQU  SVFNF+SVFFC      FUNCTION WITH FAST CALL, NO PREEVAL
                   2171: SVFNP  EQU  SVFNN+SVPRE      FUNCTION ALLOWING PREEVALUATION
                   2172: SVFPR  EQU  SVFNN+SVPRD      PREDICATE FUNCTION
                   2173: SVFNK  EQU  SVFNN+SVKNM      NO PREEVAL FUNC + KEYWORD
                   2174: SVKWV  EQU  SVKNM+SVVAL      KEYWORD + VALUE
                   2175: SVKWC  EQU  SVCKW+SVKNM      KEYWORD WITH CONSTANT VALUE
                   2176: SVKVC  EQU  SVKWV+SVCKW      CONSTANT KEYWORD + VALUE
                   2177: SVKVL  EQU  SVKVC+SVLBL      CONSTANT KEYWORD + VALUE + LABEL
                   2178: .IF    .CNFN
                   2179: .ELSE
                   2180: SVFPK  EQU  SVFNP+SVKVC      PREEVAL FUNC + CONST KEYWD+VAL
                   2181: .FI
                   2182: *
                   2183: *      THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
                   2184: *      TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
                   2185: *      ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
                   2186: *      MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
                   2187: *      THE CALL MAY GENERATE AN ERROR CONDITION.
                   2188: *
                   2189: *      THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
                   2190: *      FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
                   2191: *      THE APPLY FUNCTION FALLS OUTSIDE THIS CATEGORY.
                   2192: *
                   2193: *      THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
                   2194: *      A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
                   2195: *
                   2196: *      THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
                   2197: *      ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
                   2198:        EJC
                   2199: *
                   2200: *      SVBLK (CONTINUED)
                   2201: *
                   2202: *      SVKNM                 KEYWORD NUMBER
                   2203: *
                   2204: *           SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
                   2205: *           IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
                   2206: *           KEYWORD NUMBER TABLE GIVEN LATER ON.
                   2207: *
                   2208: *      SVFNC                 SYSTEM FUNCTION POINTER
                   2209: *
                   2210: *           SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
                   2211: *           IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
                   2212: *           FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
                   2213: *           POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
                   2214: *           FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
                   2215: *           THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
                   2216: *           FCODE FIELD FOR THE FUNCTION CALL.
                   2217: *
                   2218: *      SVNAR                 NUMBER OF FUNCTION ARGUMENTS
                   2219: *
                   2220: *           SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
                   2221: *           IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
                   2222: *           TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
                   2223: *           VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
                   2224: *           CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
                   2225: *           THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
                   2226: *           SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
                   2227: *           CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
                   2228: *           USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
                   2229: *           NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
                   2230: *           WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
                   2231: *           PREDEFINED FUNCTION USING THIS IS APPLY.
                   2232: *
                   2233: *      SVLBL                 SYSTEM LABEL POINTER
                   2234: *
                   2235: *           SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
                   2236: *           IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
                   2237: *           THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
                   2238: *           THE SVLBL FIELD OF THE SVBLK.
                   2239: *
                   2240: *      SVVAL                 SYSTEM VALUE POINTER
                   2241: *
                   2242: *           SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
                   2243: *           IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
                   2244: *           IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
                   2245: *           THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
                   2246:        EJC
                   2247: *
                   2248: *      SVBLK (CONTINUED)
                   2249: *
                   2250: *      KEYWORD NUMBER TABLE
                   2251: *
                   2252: *      THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
                   2253: *      NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
                   2254: *      SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
                   2255: *      PROCEDURES ASIGN, ACESS AND KWNAM.
                   2256: *
                   2257: *      UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
                   2258: *
                   2259: K$ANC  EQU  0                ANCHOR
                   2260: K$DMP  EQU  K$ANC+CFP$B      DUMP
                   2261: K$ERL  EQU  K$DMP+CFP$B      ERRLIMIT
                   2262: K$ERT  EQU  K$ERL+CFP$B      ERRTYPE
                   2263: K$FTR  EQU  K$ERT+CFP$B      FTRACE
                   2264: K$INP  EQU  K$FTR+CFP$B      INPUT
                   2265: K$MXL  EQU  K$INP+CFP$B      MAXLENGTH
                   2266: K$OUP  EQU  K$MXL+CFP$B      OUTPUT
                   2267: .IF    .CNPF
                   2268: K$TRA  EQU  K$OUP+CFP$B      TRACE
                   2269: .ELSE
                   2270: K$PFL  EQU  K$OUP+CFP$B      PROFILE
                   2271: K$TRA  EQU  K$PFL+CFP$B      TRACE
                   2272: .FI
                   2273: K$TRM  EQU  K$TRA+CFP$B      TRIM
                   2274: *
                   2275: *      PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
                   2276: *
                   2277: K$FNC  EQU  K$TRM+CFP$B      FNCLEVEL
                   2278: K$LST  EQU  K$FNC+CFP$B      LASTNO
                   2279: K$STN  EQU  K$LST+CFP$B      STNO
                   2280: *
                   2281: *      KEYWORDS WITH CONSTANT PATTERN VALUES
                   2282: *
                   2283: K$ABO  EQU  K$STN+CFP$B      ABORT
                   2284: K$ARB  EQU  K$ABO+PASI$      ARB
                   2285: K$BAL  EQU  K$ARB+PASI$      BAL
                   2286: K$FAL  EQU  K$BAL+PASI$      FAIL
                   2287: K$FEN  EQU  K$FAL+PASI$      FENCE
                   2288: K$REM  EQU  K$FEN+PASI$      REM
                   2289: K$SUC  EQU  K$REM+PASI$      SUCCEED
                   2290:        EJC
                   2291: *
                   2292: *      KEYWORD NUMBER TABLE (CONTINUED)
                   2293: *
                   2294: *      SPECIAL KEYWORDS
                   2295: *
                   2296: K$ALP  EQU  K$SUC+1          ALPHABET
                   2297: K$RTN  EQU  K$ALP+1          RTNTYPE
                   2298: K$COD  EQU  K$RTN+1          CODE
                   2299: K$STC  EQU  K$COD+1          STCOUNT
                   2300: K$ETX  EQU  K$STC+1          ERRTEXT
                   2301: K$STL  EQU  K$ETX+1          STLIMIT
                   2302: *
                   2303: *      RELATIVE OFFSETS OF SPECIAL KEYWORDS
                   2304: *
                   2305: K$$AL  EQU  K$ALP-K$ALP      ALPHABET
                   2306: K$$RT  EQU  K$RTN-K$ALP      RTNTYPE
                   2307: K$$CD  EQU  K$COD-K$ALP      CODE
                   2308: K$$SC  EQU  K$STC-K$ALP      STCOUNT
                   2309: K$$ET  EQU  K$ETX-K$ALP      ERRTEXT
                   2310: K$$SL  EQU  K$STL-K$ALP      STLIMIT
                   2311: *
                   2312: *      SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
                   2313: *
                   2314: K$P$$  EQU  K$FNC            FIRST PROTECTED KEYWORD
                   2315: K$V$$  EQU  K$ABO            FIRST KEYWORD WITH CONSTANT VALUE
                   2316: K$S$$  EQU  K$ALP            FIRST KEYWORD WITH SPECIAL ACESS
                   2317:        EJC
                   2318: *
                   2319: *      FORMAT OF A TABLE BLOCK (TBBLK)
                   2320: *
                   2321: *      A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
                   2322: *      IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
                   2323: *
                   2324: *           +------------------------------------+
                   2325: *           I                TBTYP               I
                   2326: *           +------------------------------------+
                   2327: *           I                IDVAL               I
                   2328: *           +------------------------------------+
                   2329: *           I                TBLEN               I
                   2330: *           +------------------------------------+
                   2331: *           I                TBINV               I
                   2332: *           +------------------------------------+
                   2333: *           /                                    /
                   2334: *           /                TBBUK               /
                   2335: *           /                                    /
                   2336: *           +------------------------------------+
                   2337: *
                   2338: TBTYP  EQU  0                POINTER TO DUMMY ROUTINE B$TBT
                   2339: TBLEN  EQU  OFFS2            LENGTH OF TBBLK IN BAUS
                   2340: TBINV  EQU  OFFS3            DEFAULT INITIAL LOOKUP VALUE
                   2341: TBBUK  EQU  TBINV+1          START OF HASH BUCKET POINTERS
                   2342: TBSI$  EQU  TBBUK            SIZE OF STANDARD FIELDS IN TBBLK
                   2343: TBNBK  EQU  11               DEFAULT NO. OF BUCKETS
                   2344: *
                   2345: *      THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
                   2346: *      OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
                   2347: *      IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
                   2348: *
                   2349: *      TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
                   2350: *      CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
                   2351: *      END OF THE CHAIN.
                   2352:        EJC
                   2353: *
                   2354: *      TABLE ELEMENT BLOCK (TEBLK)
                   2355: *
                   2356: *      A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
                   2357: *      A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
                   2358: *
                   2359: *           +------------------------------------+
                   2360: *           I                TETYP               I
                   2361: *           +------------------------------------+
                   2362: *           I                TESUB               I
                   2363: *           +------------------------------------+
                   2364: *           I                TEVAL               I
                   2365: *           +------------------------------------+
                   2366: *           I                TENXT               I
                   2367: *           +------------------------------------+
                   2368: *
                   2369: TETYP  EQU  0                POINTER TO DUMMY ROUTINE B$TET
                   2370: TESUB  EQU  TETYP+1          SUBSCRIPT VALUE
                   2371: TEVAL  EQU  TESUB+1          (=VRVAL) TABLE ELEMENT VALUE
                   2372: TENXT  EQU  TEVAL+1          LINK TO NEXT TEBLK
                   2373: *      SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
                   2374: TESI$  EQU  TENXT+1          SIZE OF TEBLK IN WORDS
                   2375: *
                   2376: *      TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
                   2377: *      TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
                   2378: *      TENXT POINTS BACK TO THE START OF THE TBBLK.
                   2379: *
                   2380: *      TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
                   2381: *
                   2382: *      TESUB CONTAINS A DATA POINTER.
                   2383:        EJC
                   2384: *
                   2385: *      TRAP BLOCK (TRBLK)
                   2386: *
                   2387: *      A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
                   2388: *      OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
                   2389: *      INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
                   2390: *
                   2391: *           +------------------------------------+
                   2392: *           I                TRIDN               I
                   2393: *           +------------------------------------+
                   2394: *           I                TRTYP               I
                   2395: *           +------------------------------------+
                   2396: *           I  TRVAL OR TRLBL OR TRNXT OR TRKVR  I
                   2397: *           +------------------------------------+
                   2398: *           I            TRTAG OR TRTER          I
                   2399: *           +------------------------------------+
                   2400: *           I            TRFNC OR TRTRI          I
                   2401: *           +------------------------------------+
                   2402: *
                   2403: TRIDN  EQU  0                POINTER TO DUMMY ROUTINE B$TRT
                   2404: TRTYP  EQU  TRIDN+1          TRAP TYPE CODE
                   2405: TRVAL  EQU  TRTYP+1          VALUE OF TRAPPED VARIABLE (=VRVAL)
                   2406: TRNXT  EQU  TRVAL            PTR TO NEXT TRBLK ON TRBLK CHAIN
                   2407: TRLBL  EQU  TRVAL            PTR TO ACTUAL LABEL (TRACED LABEL)
                   2408: TRKVR  EQU  TRVAL            VRBLK POINTER FOR KEYWORD TRACE
                   2409: TRTAG  EQU  TRVAL+1          TRACE TAG OR IOTAG
                   2410: TRTER  EQU  TRTAG            PTR TO TERMINAL VRBLK OR NULL
                   2411: TRFNC  EQU  TRTAG+1          TRACE FUNCTION VRBLK (ZERO IF NONE)
                   2412: TRTRI  EQU  TRFNC            PTR TO TRACE BLOCK HOLDING IOTAG
                   2413: TRSI$  EQU  TRFNC+1          NUMBER OF WORDS IN TRBLK
                   2414: *
                   2415: TRTIN  EQU  0                TRACE TYPE FOR INPUT ASSOCIATION
                   2416: TRTAC  EQU  TRTIN+1          TRACE TYPE FOR ACCESS TRACE
                   2417: TRTVL  EQU  TRTAC+1          TRACE TYPE FOR VALUE TRACE
                   2418: TRTIO  EQU  TRTVL+1          TRACE TYPE FOR IOTAG TRACE BLOCK
                   2419: TRTOU  EQU  TRTIO+1          TRACE TYPE FOR OUTPUT ASSOCIATION
                   2420:        EJC
                   2421: *
                   2422: *      TRAP BLOCK (CONTINUED)
                   2423: *
                   2424: *      VARIABLE INPUT ASSOCIATION
                   2425: *
                   2426: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   2427: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   2428: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   2429: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   2430: *
                   2431: *           TRTYP IS SET TO TRTIN
                   2432: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   2433: *           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
                   2434: *           FOR INPUT, TERMINAL, ELSE IT IS NULL.
                   2435: *           TRTRI IS A PTR TO IOTAG TRBLK FROM SYSIO OR ZERO.
                   2436: *
                   2437: *      VARIABLE ACCESS TRACE ASSOCIATION
                   2438: *
                   2439: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   2440: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   2441: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   2442: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   2443: *
                   2444: *           TRTYP IS SET TO TRTAC
                   2445: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   2446: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   2447: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   2448: *
                   2449: *      VARIABLE VALUE TRACE ASSOCIATION
                   2450: *
                   2451: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   2452: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   2453: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   2454: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   2455: *
                   2456: *           TRTYP IS SET TO TRTVL
                   2457: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   2458: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   2459: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   2460:        EJC
                   2461: *      TRAP BLOCK (CONTINUED)
                   2462: *
                   2463: *      VARIABLE OUTPUT ASSOCIATION
                   2464: *
                   2465: *           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
                   2466: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
                   2467: *           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   2468: *           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
                   2469: *
                   2470: *           TRTYP IS SET TO TRTOU
                   2471: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
                   2472: *           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
                   2473: *           FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
                   2474: *           TRTRI IS A PTR TO IOTAG TRBLK FROM SYSIO OR ZERO.
                   2475: *
                   2476: *      FUNCTION CALL TRACE
                   2477: *
                   2478: *           THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
                   2479: *           TO POINT TO A TRBLK.
                   2480: *
                   2481: *           TRTYP IS SET TO TRTIN
                   2482: *           TRNXT IS ZERO
                   2483: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   2484: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   2485: *
                   2486: *      FUNCTION RETURN TRACE
                   2487: *
                   2488: *           THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
                   2489: *           TO POINT TO A TRBLK
                   2490: *
                   2491: *           TRTYP IS SET TO TRTIN
                   2492: *           TRNXT IS ZERO
                   2493: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   2494: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   2495: *
                   2496: *      LABEL TRACE
                   2497: *
                   2498: *           THE VRLBL OF THE VRBLK FOR THE LABEL IS
                   2499: *           CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
                   2500: *           SET TO B$VRT TO ACTIVATE THE CHECK.
                   2501: *
                   2502: *           TRTYP IS SET TO TRTIN
                   2503: *           TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
                   2504: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   2505: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   2506:        EJC
                   2507: *
                   2508: *      TRAP BLOCK (CONTINUED)
                   2509: *
                   2510: *      KEYWORD TRACE
                   2511: *
                   2512: *           KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
                   2513: *           LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
                   2514: *           POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
                   2515: *           ARE AS FOLLOWS.
                   2516: *
                   2517: *           R$ERT            ERRTYPE
                   2518: *           R$FNC            FNCLEVEL
                   2519: *           R$STC            STCOUNT
                   2520: *
                   2521: *           THE FORMAT OF THE TRBLK IS AS FOLLOWS.
                   2522: *
                   2523: *           TRTYP IS SET TO TRTIN
                   2524: *           TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
                   2525: *           TRTAG IS THE TRACE TAG (0 IF NONE)
                   2526: *           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
                   2527: *
                   2528: *      INPUT/OUTPUT FILETAG TRAP BLOCK (TRTIO)
                   2529: *
                   2530: *           THE VALUE FIELD OF THE FILETAG VBL POINTS TO A TRBLK
                   2531: *           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
                   2532: *           A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
                   2533: *           CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
                   2534: *           TO HOLD THE IOTAG RETURNED BY A SYSIO CALL
                   2535: *
                   2536: *           TRTYP IS SET TO TRTIO
                   2537: *           TRNXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
                   2538: *           TRTAG HOLDS THE IOTAG.
                   2539: *
                   2540: *      NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
                   2541: *      THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
                   2542: *
                   2543: *      INPUT ASSOCIATION (IF PRESENT)
                   2544: *      ACCESS TRACE (IF PRESENT)
                   2545: *      VALUE TRACE (IF PRESENT)
                   2546: *      FILETAG ASSOCIATION (IF PRESENT)
                   2547: *      OUTPUT ASSOCIATION (IF PRESENT)
                   2548: *
                   2549: *      THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
                   2550: *      FIELD OF THE LAST TRBLK ON THE CHAIN.
                   2551: *
                   2552: *      THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
                   2553: *      ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
                   2554:        EJC
                   2555: *
                   2556: *      VECTOR BLOCK (VCBLK)
                   2557: *
                   2558: *      A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
                   2559: *      ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
                   2560: *      ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
                   2561: *      SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
                   2562: *
                   2563: *           +------------------------------------+
                   2564: *           I                VCTYP               I
                   2565: *           +------------------------------------+
                   2566: *           I                IDVAL               I
                   2567: *           +------------------------------------+
                   2568: *           I                VCLEN               I
                   2569: *           +------------------------------------+
                   2570: *           I                VCVLS               I
                   2571: *           +------------------------------------+
                   2572: *
                   2573: VCTYP  EQU  0                POINTER TO DUMMY ROUTINE B$VCT
                   2574: VCLEN  EQU  OFFS2            LENGTH OF VCBLK IN BAUS
                   2575: VCVLS  EQU  OFFS3            START OF VECTOR VALUES
                   2576: VCSI$  EQU  VCVLS            SIZE OF STANDARD FIELDS IN VCBLK
                   2577: VCVLB  EQU  VCVLS-1          OFFSET ONE WORD BEHIND VCVLS
                   2578: VCTBD  EQU  TBSI$-VCSI$      DIFFERENCE IN SIZES - SEE PRTVL
                   2579: *
                   2580: *      VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
                   2581: *
                   2582: *      THE DIMENSION CAN BE DEDUCED FROM VCLEN.
                   2583:        EJC
                   2584: *
                   2585: *      VARIABLE BLOCK (VRBLK)
                   2586: *
                   2587: *      A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
                   2588: *      FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
                   2589: *
                   2590: *      NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
                   2591: *      REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
                   2592: *      THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
                   2593: *      ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
                   2594: *
                   2595: *      1)   POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
                   2596: *           VALUE OF THE VARIABLE ONTO THE MAIN STACK.
                   2597: *
                   2598: *      2)   POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
                   2599: *           TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
                   2600: *
                   2601: *      3)   POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
                   2602: *           THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
                   2603: *
                   2604: *           +------------------------------------+
                   2605: *           I                VRGET               I
                   2606: *           +------------------------------------+
                   2607: *           I                VRSTO               I
                   2608: *           +------------------------------------+
                   2609: *           I                VRVAL               I
                   2610: *           +------------------------------------+
                   2611: *           I                VRTRA               I
                   2612: *           +------------------------------------+
                   2613: *           I                VRLBL               I
                   2614: *           +------------------------------------+
                   2615: *           I                VRFNC               I
                   2616: *           +------------------------------------+
                   2617: *           I                VRNXT               I
                   2618: *           +------------------------------------+
                   2619: *           I                VRLEN               I
                   2620: *           +------------------------------------+
                   2621: *           /                                    /
                   2622: *           /            VRCHS = VRSVP           /
                   2623: *           /                                    /
                   2624: *           +------------------------------------+
                   2625:        EJC
                   2626: *
                   2627: *      VARIABLE BLOCK (CONTINUED)
                   2628: *
                   2629: VRGET  EQU  0                POINTER TO ROUTINE TO LOAD VALUE
                   2630: VRSTO  EQU  VRGET+1          POINTER TO ROUTINE TO STORE VALUE
                   2631: VRVAL  EQU  VRSTO+1          VARIABLE VALUE
                   2632: VRVLO  EQU  VRVAL-VRSTO      OFFSET TO VALUE FROM STORE FIELD
                   2633: VRTRA  EQU  VRVAL+1          POINTER TO ROUTINE TO JUMP TO LABEL
                   2634: VRLBL  EQU  VRTRA+1          POINTER TO CODE FOR LABEL
                   2635: VRLBO  EQU  VRLBL-VRTRA      OFFSET TO LABEL FROM TRANSFER FIELD
                   2636: VRFNC  EQU  VRLBL+1          POINTER TO FUNCTION BLOCK
                   2637: VRNXT  EQU  VRFNC+1          POINTER TO NEXT VRBLK ON HASH CHAIN
                   2638: VRLEN  EQU  VRNXT+1          LENGTH OF NAME (OR ZERO)
                   2639: VRCHS  EQU  VRLEN+1          CHARACTERS OF NAME (VRLEN GT 0)
                   2640: VRSVP  EQU  VRLEN+1          PTR TO SVBLK (VRLEN EQ 0)
                   2641: VRSI$  EQU  VRCHS+1          NUMBER OF STANDARD FIELDS IN VRBLK
                   2642: VRSOF  EQU  VRLEN-SCLEN      OFFSET TO DUMMY SCBLK FOR NAME
                   2643: VRSVO  EQU  VRSVP-VRSOF      PSEUDO-OFFSET TO VRSVP FIELD
                   2644: *
                   2645: *      VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
                   2646: *      VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
                   2647: *
                   2648: *      VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
                   2649: *      VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
                   2650: *      VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
                   2651: *
                   2652: *      VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
                   2653: *      VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
                   2654: *      POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
                   2655: *
                   2656: *      VRTRA = B$VRG IF THE LABEL IS NOT TRACED
                   2657: *      VRTRA = B$VRT IF THE LABEL IS TRACED
                   2658: *
                   2659: *      VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
                   2660: *      VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
                   2661: *      VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
                   2662: *      VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
                   2663: *
                   2664: *      VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
                   2665: *      VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
                   2666: *      VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
                   2667: *      VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
                   2668: *      VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
                   2669: *      VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
                   2670: *
                   2671: *      VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
                   2672: *      THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
                   2673: *
                   2674: *      VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
                   2675: *      VRLEN IS ZERO FOR A SYSTEM VARIABLE.
                   2676: *
                   2677: *      VRCHS IS THE NAME IF VRLEN IS NON-ZERO.
                   2678: *      VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
                   2679:        EJC
                   2680: *
                   2681: *      FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
                   2682: *
                   2683: *      AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
                   2684: *      DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
                   2685: *      RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
                   2686: *      PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
                   2687: *      THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
                   2688: *
                   2689: *           +------------------------------------+
                   2690: *           I                XNTYP               I
                   2691: *           +------------------------------------+
                   2692: *           I                XNLEN               I
                   2693: *           +------------------------------------+
                   2694: *           /                                    /
                   2695: *           /                XNDTA               /
                   2696: *           /                                    /
                   2697: *           +------------------------------------+
                   2698: *
                   2699: XNTYP  EQU  0                POINTER TO DUMMY ROUTINE B$XNT
                   2700: XNLEN  EQU  XNTYP+1          LENGTH OF XNBLK IN BAUS
                   2701: XNDTA  EQU  XNLEN+1          DATA WORDS
                   2702: XNSI$  EQU  XNDTA            SIZE OF STANDARD FIELDS IN XNBLK
                   2703: *
                   2704: *      NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
                   2705: *      AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
                   2706: *      IT IS BUILT IN THE DYNAMIC MEMORY AREA.
                   2707:        EJC
                   2708: *
                   2709: *      RELOCATABLE EXTERNAL BLOCK (XRBLK)
                   2710: *
                   2711: *      AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
                   2712: *      DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
                   2713: *      OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
                   2714: *      DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
                   2715: *      DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
                   2716: *
                   2717: *           +------------------------------------+
                   2718: *           I                XRTYP               I
                   2719: *           +------------------------------------+
                   2720: *           I                XRLEN               I
                   2721: *           +------------------------------------+
                   2722: *           /                                    /
                   2723: *           /                XRPTR               /
                   2724: *           /                                    /
                   2725: *           +------------------------------------+
                   2726: *
                   2727: XRTYP  EQU  0                POINTER TO DUMMY ROUTINE B$XRT
                   2728: XRLEN  EQU  XRTYP+1          LENGTH OF XRBLK IN BAUS
                   2729: XRPTR  EQU  XRLEN+1          START OF ADDRESS POINTERS
                   2730: XRSI$  EQU  XRPTR            SIZE OF STANDARD FIELDS IN XRBLK
                   2731:        EJC
                   2732: *
                   2733: *      S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS.  THE VALUES
                   2734: *      ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
                   2735: *      AND HENCE TO THE BRANCH TABLE IN S$CNV.
                   2736: *
                   2737: CNVST  EQU  8                MAX STANDARD TYPE CODE FOR CONVERT
                   2738: .IF    .CNRA
                   2739: CNVRT  EQU  CNVST            NO REALS - SAME AS STANDARD TYPES
                   2740: .ELSE
                   2741: CNVRT  EQU  CNVST+1          CONVERT CODE FOR REALS
                   2742: .FI
                   2743: .IF    .CNBF
                   2744: CNVBT  EQU  CNVRT            NO BUFFERS - SAME AS REAL CODE
                   2745: .ELSE
                   2746: CNVBT  EQU  CNVRT+1          CONVERT CODE FOR BUFFER
                   2747: .FI
                   2748: CNVTT  EQU  CNVBT+1          BSW CODE FOR CONVERT
                   2749: *
                   2750: *      INPUT IMAGE LENGTH
                   2751: *
                   2752: INILN  EQU  160              DEFAULT IMAGE LENGTH FOR COMPILER
                   2753: *
                   2754: *      IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
                   2755: *      OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
                   2756: *      LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
                   2757: *
                   2758: NUM01  EQU  1
                   2759: NUM02  EQU  2
                   2760: NUM03  EQU  3
                   2761: NUM04  EQU  4
                   2762: NUM05  EQU  5
                   2763: NUM06  EQU  6
                   2764: NUM07  EQU  7
                   2765: NUM08  EQU  8
                   2766: NUM09  EQU  9
                   2767: NUM10  EQU  10
                   2768: NINI9  EQU  999
                   2769: THSND  EQU  1000
                   2770: *
                   2771: *      NUMBERS OF UNDEFINED SPITBOL OPERATORS
                   2772: *
                   2773: OPBUN  EQU  5                NO. OF BINARY UNDEFINED OPS
                   2774: OPUUN  EQU  6                NO OF UNARY UNDEFINED OPS
                   2775: *
                   2776: *      OFFSETS USED IN PRTSN, PRTMI AND ACESS
                   2777: *
                   2778: PRSNF  EQU  13               OFFSET USED IN PRTSN
                   2779: PRTMF  EQU  15               OFFSET TO COL 15 (PRTMI)
                   2780: RILEN  EQU  160              BUFFER LENGTH FOR SYSRI
                   2781: *
                   2782: *      CODES FOR STAGES OF PROCESSING
                   2783: *
                   2784: STGIC  EQU  0                INITIAL COMPILE
                   2785: STGXC  EQU  STGIC+1          EXECUTION COMPILE (CODE)
                   2786: STGEV  EQU  STGXC+1          EXPRESSION EVAL DURING EXECUTION
                   2787: STGXT  EQU  STGEV+1          EXECUTION TIME
                   2788: STGCE  EQU  STGXT+1          INITIAL COMPILE AFTER END LINE
                   2789: STGXE  EQU  STGCE+1          EXEC. COMPILE AFTER END LINE
                   2790: STGND  EQU  STGCE-STGIC      DIFFERENCE IN STAGE AFTER END
                   2791: STGEE  EQU  STGXE+1          EVAL EVALUATING EXPRESSION
                   2792: STGNO  EQU  STGEE+1          NUMBER OF CODES
                   2793:        EJC
                   2794: *
                   2795: *
                   2796: *      STATEMENT NUMBER PAD COUNT FOR LISTR
                   2797: *
                   2798: .DEF   .CSN5
                   2799: .IF    .CSN6
                   2800: STNPD  EQU  6                STATEMENT NO. PAD COUNT
                   2801: .UNDEF .CSN5
                   2802: .FI
                   2803: .IF    .CSN8
                   2804: STNPD  EQU  8                STATEMENT NO. PAD COUNT
                   2805: .UNDEF .CSN5
                   2806: .FI
                   2807: .IF    .CSN5
                   2808: STNPD  EQU  5                STATEMENT NO. PAD COUNT
                   2809: .FI
                   2810: *
                   2811: *      SYNTAX TYPE CODES
                   2812: *
                   2813: *      THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
                   2814: *
                   2815: *      THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
                   2816: *
                   2817: T$UOP  EQU  0                UNARY OPERATOR
                   2818: T$LPR  EQU  T$UOP+3          LEFT PAREN
                   2819: T$LBR  EQU  T$LPR+3          LEFT BRACKET
                   2820: T$CMA  EQU  T$LBR+3          COMMA
                   2821: T$FNC  EQU  T$CMA+3          FUNCTION CALL
                   2822: T$VAR  EQU  T$FNC+3          VARIABLE
                   2823: T$CON  EQU  T$VAR+3          CONSTANT
                   2824: T$BOP  EQU  T$CON+3          BINARY OPERATOR
                   2825: T$RPR  EQU  T$BOP+3          RIGHT PAREN
                   2826: T$RBR  EQU  T$RPR+3          RIGHT BRACKET
                   2827: T$COL  EQU  T$RBR+3          COLON
                   2828: T$SMC  EQU  T$COL+3          SEMI-COLON
                   2829: *
                   2830: *      THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
                   2831: *
                   2832: T$FGO  EQU  T$SMC+1          FAILURE GOTO
                   2833: T$SGO  EQU  T$FGO+1          SUCCESS GOTO
                   2834: *
                   2835: *      THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
                   2836: *      WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
                   2837: *      OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
                   2838: *
                   2839: T$UOK  EQU  T$FNC            LAST CODE OK BEFORE UNARY OPERATOR
                   2840:        EJC
                   2841: *
                   2842: *      DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
                   2843: *
                   2844: T$UO0  EQU  T$UOP+0          UNARY OPERATOR, STATE ZERO
                   2845: T$UO1  EQU  T$UOP+1          UNARY OPERATOR, STATE ONE
                   2846: T$UO2  EQU  T$UOP+2          UNARY OPERATOR, STATE TWO
                   2847: T$LP0  EQU  T$LPR+0          LEFT PAREN, STATE ZERO
                   2848: T$LP1  EQU  T$LPR+1          LEFT PAREN, STATE ONE
                   2849: T$LP2  EQU  T$LPR+2          LEFT PAREN, STATE TWO
                   2850: T$LB0  EQU  T$LBR+0          LEFT BRACKET, STATE ZERO
                   2851: T$LB1  EQU  T$LBR+1          LEFT BRACKET, STATE ONE
                   2852: T$LB2  EQU  T$LBR+2          LEFT BRACKET, STATE TWO
                   2853: T$CM0  EQU  T$CMA+0          COMMA, STATE ZERO
                   2854: T$CM1  EQU  T$CMA+1          COMMA, STATE ONE
                   2855: T$CM2  EQU  T$CMA+2          COMMA, STATE TWO
                   2856: T$FN0  EQU  T$FNC+0          FUNCTION CALL, STATE ZERO
                   2857: T$FN1  EQU  T$FNC+1          FUNCTION CALL, STATE ONE
                   2858: T$FN2  EQU  T$FNC+2          FUNCTION CALL, STATE TWO
                   2859: T$VA0  EQU  T$VAR+0          VARIABLE, STATE ZERO
                   2860: T$VA1  EQU  T$VAR+1          VARIABLE, STATE ONE
                   2861: T$VA2  EQU  T$VAR+2          VARIABLE, STATE TWO
                   2862: T$CO0  EQU  T$CON+0          CONSTANT, STATE ZERO
                   2863: T$CO1  EQU  T$CON+1          CONSTANT, STATE ONE
                   2864: T$CO2  EQU  T$CON+2          CONSTANT, STATE TWO
                   2865: T$BO0  EQU  T$BOP+0          BINARY OPERATOR, STATE ZERO
                   2866: T$BO1  EQU  T$BOP+1          BINARY OPERATOR, STATE ONE
                   2867: T$BO2  EQU  T$BOP+2          BINARY OPERATOR, STATE TWO
                   2868: T$RP0  EQU  T$RPR+0          RIGHT PAREN, STATE ZERO
                   2869: T$RP1  EQU  T$RPR+1          RIGHT PAREN, STATE ONE
                   2870: T$RP2  EQU  T$RPR+2          RIGHT PAREN, STATE TWO
                   2871: T$RB0  EQU  T$RBR+0          RIGHT BRACKET, STATE ZERO
                   2872: T$RB1  EQU  T$RBR+1          RIGHT BRACKET, STATE ONE
                   2873: T$RB2  EQU  T$RBR+2          RIGHT BRACKET, STATE TWO
                   2874: T$CL0  EQU  T$COL+0          COLON, STATE ZERO
                   2875: T$CL1  EQU  T$COL+1          COLON, STATE ONE
                   2876: T$CL2  EQU  T$COL+2          COLON, STATE TWO
                   2877: T$SM0  EQU  T$SMC+0          SEMICOLON, STATE ZERO
                   2878: T$SM1  EQU  T$SMC+1          SEMICOLON, STATE ONE
                   2879: T$SM2  EQU  T$SMC+2          SEMICOLON, STATE TWO
                   2880: *
                   2881: T$NES  EQU  T$SM2+1          NUMBER OF ENTRIES IN BRANCH TABLE
                   2882:        EJC
                   2883: *
                   2884: *       DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
                   2885: *
                   2886: .IF    .CASL
                   2887: CC$CI  EQU  0                -CASEIG
                   2888: CC$CO  EQU  CC$CI+1          -COPY
                   2889: .ELSE
                   2890: CC$CO  EQU  0                -COPY
                   2891: .FI
                   2892: CC$EJ  EQU  CC$CO+1          -EJECT
                   2893: CC$FA  EQU  CC$EJ+1          -FAIL
                   2894: CC$LI  EQU  CC$FA+1          -LIST
                   2895: .IF    .CASL
                   2896: CC$NC  EQU  CC$LI+1          -NOCASEIG
                   2897: CC$NF  EQU  CC$NC+1          -NOFAIL
                   2898: .ELSE
                   2899: CC$NF  EQU  CC$LI+1          -NOFAIL
                   2900: .FI
                   2901: CC$NL  EQU  CC$NF+1          -NOLIST
                   2902: CC$ST  EQU  CC$NL+1          -STITL
                   2903: CC$TI  EQU  CC$ST+1          -TITLE
                   2904: CC$TR  EQU  CC$TI+1          -TRACE
                   2905: CC$CT  EQU  CC$TR+1          NUMBER OF CONTROL CARDS
                   2906: CCNOC  EQU  4                NO. OF CHARS INCLUDED IN MATCH
                   2907: CCOFS  EQU  7                OFFSET TO START OF TITLE/SUBTITLE
                   2908: *
                   2909: *      DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
                   2910: *
                   2911: *      SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
                   2912: *      OF USE OF THESE LOCATIONS ON THE STACK.
                   2913: *
                   2914: CMSTM  EQU  0                TREE FOR STATEMENT BODY
                   2915: CMSGO  EQU  CMSTM+1          TREE FOR SUCCESS GOTO
                   2916: CMFGO  EQU  CMSGO+1          TREE FOR FAIL GOTO
                   2917: CMCGO  EQU  CMFGO+1          CONDITIONAL GOTO FLAG
                   2918: CMPCD  EQU  CMCGO+1          PREVIOUS CDBLK POINTER
                   2919: CMFFP  EQU  CMPCD+1          FAILURE FILL IN FLAG FOR PREVIOUS
                   2920: CMFFC  EQU  CMFFP+1          FAILURE FILL IN FLAG FOR CURRENT
                   2921: CMSOP  EQU  CMFFC+1          SUCCESS FILL IN OFFSET FOR PREVIOUS
                   2922: CMSOC  EQU  CMSOP+1          SUCCESS FILL IN OFFSET FOR CURRENT
                   2923: CMLBL  EQU  CMSOC+1          PTR TO VRBLK FOR CURRENT LABEL
                   2924: CMTRA  EQU  CMLBL+1          PTR TO ENTRY CDBLK
                   2925: *
                   2926: CMNEN  EQU  CMTRA+1          COUNT OF STACK ENTRIES FOR CMPIL
                   2927: .IF    .CNPF
                   2928: .ELSE
                   2929: *
                   2930: *      A FEW CONSTANTS USED BY THE PROFILER
                   2931: PFPD1  EQU  8                PAD POSITIONS ...
                   2932: PFPD2  EQU  20               ... FOR PROFILE ...
                   2933: PFPD3  EQU  32               ... PRINTOUT
                   2934: PF$I2  EQU  CFP$I+CFP$I      SIZE OF TABLE ENTRY (2 INTS)
                   2935: .FI
                   2936:        TTL  S P I T B O L -- CONSTANT SECTION
                   2937: *
                   2938: *      THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
                   2939: *
                   2940: *      ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
                   2941: *      APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
                   2942: *      DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
                   2943: *      ORDER WHICH MUST NOT BE DISTURBED.
                   2944: *
                   2945: *      IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
                   2946: *      FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
                   2947: *      ALPHABETICAL ORDER IN SOME CASES.
                   2948: *
                   2949:        SEC                   START OF CONSTANT SECTION
                   2950: *
                   2951: *      FREE STORE PERCENTAGE (USED BY ALLOC)
                   2952: *
                   2953: ALFSP  DAC  E$FSP            FREE STORE PERCENTAGE
                   2954: *
                   2955: *      BIT CONSTANTS FOR GENERAL USE
                   2956: *
                   2957: BITS0  DBC  0                ALL ZERO BITS
                   2958: BITS1  DBC  1                ONE BIT IN LOW ORDER POSITION
                   2959: BITS2  DBC  2                BIT IN POSITION 2
                   2960: BITS3  DBC  4                BIT IN POSITION 3
                   2961: BITS4  DBC  8                BIT IN POSITION 4
                   2962: BITS5  DBC  16               BIT IN POSITION 5
                   2963: BITS6  DBC  32               BIT IN POSITION 6
                   2964: BITS7  DBC  64               BIT IN POSITION 7
                   2965: BITS8  DBC  128              BIT IN POSITION 8
                   2966: BITS9  DBC  256              BIT IN POSITION 9
                   2967: BIT10  DBC  512              BIT IN POSITION 10
                   2968: BITSM  DBC  CFP$M            MASK FOR MAX INTEGER
                   2969: *
                   2970: *      BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
                   2971: *
                   2972: BTFNC  DBC  SVFNC            BIT TO TEST FOR FUNCTION
                   2973: BTKNM  DBC  SVKNM            BIT TO TEST FOR KEYWORD NUMBER
                   2974: BTLBL  DBC  SVLBL            BIT TO TEST FOR LABEL
                   2975: BTFFC  DBC  SVFFC            BIT TO TEST FOR FAST CALL
                   2976: BTCKW  DBC  SVCKW            BIT TO TEST FOR CONSTANT KEYWORD
                   2977: BTPRD  DBC  SVPRD            BIT TO TEST FOR PREDICATE FUNCTION
                   2978: BTPRE  DBC  SVPRE            BIT TO TEST FOR PREEVALUATION
                   2979: BTVAL  DBC  SVVAL            BIT TO TEST FOR VALUE
                   2980:        EJC
                   2981: *
                   2982: *      LIST OF NAMES USED FOR CONTROL CARD PROCESSING
                   2983: *
                   2984: .IF    .CASL
                   2985: CCNMS  DTC  /CASE/
                   2986:        DTC  /COPY/
                   2987: .ELSE
                   2988: CCNMS  DTC  /COPY/
                   2989: .FI
                   2990:        DTC  /EJEC/
                   2991:        DTC  /FAIL/
                   2992:        DTC  /LIST/
                   2993: .IF    .CASL
                   2994:        DTC  /NOCA/
                   2995: .FI
                   2996:        DTC  /NOFA/
                   2997:        DTC  /NOLI/
                   2998:        DTC  /STIT/
                   2999:        DTC  /TITL/
                   3000:        DTC  /TRAC/
                   3001: *
                   3002: *      HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
                   3003: *
                   3004: DMHDK  DAC  B$SCL
                   3005:        DAC  22
                   3006:        DDC  /DUMP OF KEYWORD VALUES/
                   3007: *
                   3008: DMHDV  DAC  B$SCL
                   3009:        DAC  25
                   3010:        DDC  /DUMP OF NATURAL VARIABLES/
                   3011: *
                   3012: *      MESSAGE TEXT FOR COMPILATION STATISTICS
                   3013: *
                   3014: ENCM1  DAC  B$SCL
                   3015:        DAC  10
                   3016:        DDC  /STORE USED/
                   3017: *
                   3018: ENCM2  DAC  B$SCL
                   3019:        DAC  10
                   3020:        DDC  /STORE LEFT/
                   3021: *
                   3022: ENCM3  DAC  B$SCL
                   3023:        DAC  11
                   3024:        DDC  /COMP ERRORS/
                   3025: *
                   3026: ENCM4  DAC  B$SCL
                   3027:        DAC  14
                   3028: .IF    .CTMD
                   3029:        DDC  /COMP TIME-DSEC/
                   3030: .ELSE
                   3031:        DDC  /COMP TIME-MSEC/
                   3032: .FI
                   3033: *
                   3034: ENCM5  DAC  B$SCL
                   3035:        DAC  20
                   3036:        DDC  /EXECUTION SUPPRESSED/
                   3037:        EJC
                   3038: *
                   3039: *      FOR TERMINATION IN COMPILATION
                   3040: *
                   3041: ENDIC  DAC  B$SCL
                   3042:        DAC  14
                   3043:        DDC  /IN COMPILATION/
                   3044: *
                   3045: *      MEMORY OVERFLOW DURING INITIALISATION
                   3046: *
                   3047: ENDMO  DAC  B$SCL
                   3048: ENDML  DAC  15
                   3049:        DDC  /MEMORY OVERFLOW/
                   3050: *
                   3051: *      STRING CONSTANT FOR MESSAGE ISSUED BY L$END
                   3052: *
                   3053: ENDMS  DAC  B$SCL
                   3054:        DAC  10
                   3055:        DDC  /NORMAL END/
                   3056: *
                   3057: *      FAIL MESSAGE FOR STACK FAIL SECTION
                   3058: *
                   3059: ENDSO  DAC  B$SCL
                   3060:        DAC  36
                   3061:        DDC  /STACK OVERFLOW IN GARBAGE COLLECTION/
                   3062:        EJC
                   3063: *
                   3064: *      STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
                   3065: *
                   3066: ERMMS  DAC  B$SCL
                   3067:        DAC  5
                   3068:        DDC  /ERROR/
                   3069: *
                   3070: ERMNS  DAC  B$SCL
                   3071:        DAC  4
                   3072:        DTC  / -- /
                   3073: *
                   3074: *
                   3075: ERRTF  DAC  251              FATAL ERROR CODE - SEE LABEL ERRAF
                   3076: *
                   3077: *      STRING CONSTANT FOR PAGE NUMBERING
                   3078: *
                   3079: LSTMS  DAC  B$SCL
                   3080:        DAC  5
                   3081:        DDC  /PAGE /
                   3082: *
                   3083: *      LISTING HEADER MESSAGE
                   3084: *
                   3085: HEADR  DAC  B$SCL
                   3086:        DAC  25
                   3087:        DDC  /MACRO SPITBOL VERSION 4.3/
                   3088: *
                   3089: HEADV  DAC  B$SCL            FOR EXIT() VERSION NO. CHECK
                   3090:        DAC  3
                   3091:        DTC  /4.3/
                   3092: *
                   3093: *      INTEGER CONSTANTS FOR GENERAL USE
                   3094: *      ICBLD OPTIMISATION USES THE FIRST THREE.
                   3095: *
                   3096: INT$R  DAC  B$ICL
                   3097: INTV0  DIC  +0               0
                   3098: INTON  DAC  B$ICL
                   3099: INTV1  DIC  +1               1
                   3100: INTTW  DAC  B$ICL
                   3101: INTV2  DIC  +2               2
                   3102: INTVT  DIC  +10              10
                   3103: INTVH  DIC  +100             100
                   3104: INTTH  DIC  +1000            1000
                   3105: *
                   3106: *      TABLE USED IN ICBLD OPTIMISATION
                   3107: *
                   3108: INTAB  DAC  INT$R            POINTER TO 0
                   3109:        DAC  INTON            POINTER TO 1
                   3110:        DAC  INTTW            POINTER TO 2
                   3111:        EJC
                   3112: *
                   3113: *      SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
                   3114: *      CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
                   3115: *      (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
                   3116: *
                   3117: NDABB  DAC  P$ABB            ARBNO
                   3118: NDABD  DAC  P$ABD            ARBNO
                   3119: NDARC  DAC  P$ARC            ARB
                   3120: NDEXB  DAC  P$EXB            EXPRESSION
                   3121: NDEXC  DAC  P$EXC            EXPRESSION
                   3122: .IF    .CNFN
                   3123: .ELSE
                   3124: NDFNB  DAC  P$FNB            FENCE()
                   3125: NDFND  DAC  P$FND            FENCE()
                   3126: .FI
                   3127: NDIMB  DAC  P$IMB            IMMEDIATE ASSIGNMENT
                   3128: NDIMD  DAC  P$IMD            IMMEDIATE ASSIGNMENT
                   3129: NDNTH  DAC  P$NTH            PATTERN END (NULL PATTERN)
                   3130: NDPAB  DAC  P$PAB            PATTERN ASSIGNMENT
                   3131: NDPAD  DAC  P$PAD            PATTERN ASSIGNMENT
                   3132: NDUNA  DAC  P$UNA            ANCHOR POINT MOVEMENT
                   3133: *
                   3134: *      KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
                   3135: *      USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
                   3136: *      VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
                   3137: *      NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
                   3138: *      DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
                   3139: *
                   3140: NDABO  DAC  P$ABO            ABORT
                   3141:        DAC  NDNTH
                   3142: NDARB  DAC  P$ARB            ARB
                   3143:        DAC  NDNTH
                   3144: NDBAL  DAC  P$BAL            BAL
                   3145:        DAC  NDNTH
                   3146: NDFAL  DAC  P$FAL            FAIL
                   3147:        DAC  NDNTH
                   3148: NDFEN  DAC  P$FEN            FENCE
                   3149:        DAC  NDNTH
                   3150: NDREM  DAC  P$REM            REM
                   3151:        DAC  NDNTH
                   3152: NDSUC  DAC  P$SUC            SUCCEED
                   3153:        DAC  NDNTH
                   3154: *
                   3155: *      NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
                   3156: *      SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
                   3157: *      PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
                   3158: *      NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
                   3159: *      BUT FOR VERY EXCEPTIONAL MACHINES.
                   3160: *
                   3161: NULLS  DAC  B$SCL            NULL STRING VALUE
                   3162:        DAC  0                SCLEN = 0
                   3163: NULLW  DTC  /          /
                   3164:        EJC
                   3165: *
                   3166: *      OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
                   3167: *
                   3168: OPDVC  DAC  O$CNC            CONCATENATION
                   3169:        DAC  C$CNC
                   3170:        DAC  LLCNC
                   3171:        DAC  RRCNC
                   3172: *
                   3173: *      OPDVP IS USED WHEN SCANNING BELOW TOP LEVEL TO ENSURE
                   3174: *      THE CONCATENATION WILL NOT LATER BE MISTAKEN FOR
                   3175: *      PATTERN MATCHING
                   3176: *
                   3177: OPDVP  DAC  O$CNC            PROVEN CONCATENATION
                   3178:        DAC  C$CNP
                   3179:        DAC  LLCNC
                   3180:        DAC  RRCNC
                   3181: *
                   3182: *      NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
                   3183: *      THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
                   3184: *
                   3185: OPDVS  DAC  O$ASS            ASSIGNMENT
                   3186:        DAC  C$ASS
                   3187:        DAC  LLASS
                   3188:        DAC  RRASS
                   3189: *
                   3190:        DAC  6                UNARY EQUAL
                   3191:        DAC  C$UUO
                   3192:        DAC  LLUNO
                   3193: *
                   3194:        DAC  O$PMV            PATTERN MATCH
                   3195:        DAC  C$PMT
                   3196:        DAC  LLPMT
                   3197:        DAC  RRPMT
                   3198: *
                   3199:        DAC  O$INT            INTERROGATION
                   3200:        DAC  C$UVL
                   3201:        DAC  LLUNO
                   3202: *
                   3203:        DAC  1                BINARY AMPERSAND
                   3204:        DAC  C$UBO
                   3205:        DAC  LLAMP
                   3206:        DAC  RRAMP
                   3207: *
                   3208:        DAC  O$KWV            KEYWORD REFERENCE
                   3209:        DAC  C$KEY
                   3210:        DAC  LLUNO
                   3211: *
                   3212:        DAC  O$ALT            ALTERNATION
                   3213:        DAC  C$ALT
                   3214:        DAC  LLALT
                   3215:        DAC  RRALT
                   3216:        EJC
                   3217: *
                   3218: *      OPERATOR DOPE VECTORS (CONTINUED)
                   3219: *
                   3220:        DAC  5                UNARY VERTICAL BAR
                   3221:        DAC  C$UUO
                   3222:        DAC  LLUNO
                   3223: *
                   3224:        DAC  0                BINARY AT
                   3225:        DAC  C$UBO
                   3226:        DAC  LLATS
                   3227:        DAC  RRATS
                   3228: *
                   3229:        DAC  O$CAS            CURSOR ASSIGNMENT
                   3230:        DAC  C$UNM
                   3231:        DAC  LLUNO
                   3232: *
                   3233:        DAC  2                BINARY NUMBER SIGN
                   3234:        DAC  C$UBO
                   3235:        DAC  LLNUM
                   3236:        DAC  RRNUM
                   3237: *
                   3238:        DAC  7                UNARY NUMBER SIGN
                   3239:        DAC  C$UUO
                   3240:        DAC  LLUNO
                   3241: *
                   3242:        DAC  O$DVD            DIVISION
                   3243:        DAC  C$BVL
                   3244:        DAC  LLDVD
                   3245:        DAC  RRDVD
                   3246: *
                   3247:        DAC  9                UNARY SLASH
                   3248:        DAC  C$UUO
                   3249:        DAC  LLUNO
                   3250: *
                   3251:        DAC  O$MLT            MULTIPLICATION
                   3252:        DAC  C$BVL
                   3253:        DAC  LLMLT
                   3254:        DAC  RRMLT
                   3255:        EJC
                   3256: *
                   3257: *      OPERATOR DOPE VECTORS (CONTINUED)
                   3258: *
                   3259:        DAC  0                DEFERRED EXPRESSION
                   3260:        DAC  C$DEF
                   3261:        DAC  LLUNO
                   3262: *
                   3263:        DAC  3                BINARY PERCENT
                   3264:        DAC  C$UBO
                   3265:        DAC  LLPCT
                   3266:        DAC  RRPCT
                   3267: *
                   3268:        DAC  8                UNARY PERCENT
                   3269:        DAC  C$UUO
                   3270:        DAC  LLUNO
                   3271: *
                   3272:        DAC  O$EXP            EXPONENTIATION
                   3273:        DAC  C$BVL
                   3274:        DAC  LLEXP
                   3275:        DAC  RREXP
                   3276: *
                   3277:        DAC  10               UNARY EXCLAMATION
                   3278:        DAC  C$UUO
                   3279:        DAC  LLUNO
                   3280: *
                   3281:        DAC  4                BINARY NOT
                   3282:        DAC  C$UBO
                   3283:        DAC  LLNOT
                   3284:        DAC  RRNOT
                   3285: *
                   3286:        DAC  0                NEGATION
                   3287:        DAC  C$NEG
                   3288:        DAC  LLUNO
                   3289:        EJC
                   3290: *
                   3291: *      OPERATOR DOPE VECTORS (CONTINUED)
                   3292: *
                   3293:        DAC  O$SUB            SUBTRACTION
                   3294:        DAC  C$BVL
                   3295:        DAC  LLPLM
                   3296:        DAC  RRPLM
                   3297: *
                   3298:        DAC  O$COM            COMPLEMENTATION
                   3299:        DAC  C$UVL
                   3300:        DAC  LLUNO
                   3301: *
                   3302:        DAC  O$ADD            ADDITION
                   3303:        DAC  C$BVL
                   3304:        DAC  LLPLM
                   3305:        DAC  RRPLM
                   3306: *
                   3307:        DAC  O$AFF            AFFIRMATION
                   3308:        DAC  C$UVL
                   3309:        DAC  LLUNO
                   3310: *
                   3311:        DAC  O$IMA            IMMEDIATE ASSIGNMENT
                   3312:        DAC  C$BVN
                   3313:        DAC  LLDLD
                   3314:        DAC  RRDLD
                   3315: *
                   3316:        DAC  O$INV            INDIRECTION
                   3317:        DAC  C$IND
                   3318:        DAC  LLUNO
                   3319: *
                   3320:        DAC  O$PAS            PATTERN ASSIGNMENT
                   3321:        DAC  C$BVN
                   3322:        DAC  LLDLD
                   3323:        DAC  RRDLD
                   3324: *
                   3325:        DAC  O$NAM            NAME REFERENCE
                   3326:        DAC  C$UNM
                   3327:        DAC  LLUNO
                   3328: *
                   3329: *      SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
                   3330: *
                   3331: OPDVD  DAC  O$GOD            DIRECT GOTO
                   3332:        DAC  C$UVL
                   3333:        DAC  LLUNO
                   3334: *
                   3335: OPDVN  DAC  O$GOC            COMPLEX NORMAL GOTO
                   3336:        DAC  C$UNM
                   3337:        DAC  LLUNO
                   3338:        EJC
                   3339: *
                   3340: *      OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
                   3341: *
                   3342: OAMN$  DAC  O$AMN            ARRAY REF (MULTI-SUBS BY VALUE)
                   3343: OAMV$  DAC  O$AMV            ARRAY REF (MULTI-SUBS BY VALUE)
                   3344: OAON$  DAC  O$AON            ARRAY REF (ONE SUB BY NAME)
                   3345: OAOV$  DAC  O$AOV            ARRAY REF (ONE SUB BY VALUE)
                   3346: OCER$  DAC  O$CER            COMPILATION ERROR
                   3347: OFEX$  DAC  O$FEX            FAILURE IN EXPRESSION EVALUATION
                   3348: OFIF$  DAC  O$FIF            FAILURE DURING GOTO EVALUATION
                   3349: OFNC$  DAC  O$FNC            FUNCTION CALL (MORE THAN ONE ARG)
                   3350: OFNE$  DAC  O$FNE            FUNCTION NAME ERROR
                   3351: OFNS$  DAC  O$FNS            FUNCTION CALL (SINGLE ARGUMENT)
                   3352: OGOF$  DAC  O$GOF            SET GOTO FAILURE TRAP
                   3353: OINN$  DAC  O$INN            INDIRECTION BY NAME
                   3354: OKWN$  DAC  O$KWN            KEYWORD REFERENCE BY NAME
                   3355: OLEX$  DAC  O$LEX            LOAD EXPRESSION BY NAME
                   3356: OLPT$  DAC  O$LPT            LOAD PATTERN
                   3357: OLVN$  DAC  O$LVN            LOAD VARIABLE NAME
                   3358: ONTA$  DAC  O$NTA            NEGATION, FIRST ENTRY
                   3359: ONTB$  DAC  O$NTB            NEGATION, SECOND ENTRY
                   3360: ONTC$  DAC  O$NTC            NEGATION, THIRD ENTRY
                   3361: OPMN$  DAC  O$PMN            PATTERN MATCH BY NAME
                   3362: OPMS$  DAC  O$PMS            PATTERN MATCH (STATEMENT)
                   3363: OPOP$  DAC  O$POP            POP TOP STACK ITEM
                   3364: ORNM$  DAC  O$RNM            RETURN NAME FROM EXPRESSION
                   3365: ORPL$  DAC  O$RPL            PATTERN REPLACEMENT
                   3366: ORVL$  DAC  O$RVL            RETURN VALUE FROM EXPRESSION
                   3367: OSLA$  DAC  O$SLA            SELECTION, FIRST ENTRY
                   3368: OSLB$  DAC  O$SLB            SELECTION, SECOND ENTRY
                   3369: OSLC$  DAC  O$SLC            SELECTION, THIRD ENTRY
                   3370: OSLD$  DAC  O$SLD            SELECTION, FOURTH ENTRY
                   3371: OSTP$  DAC  O$STP            STOP EXECUTION
                   3372: OUNF$  DAC  O$UNF            UNEXPECTED FAILURE
                   3373:        EJC
                   3374: *
                   3375: *      TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
                   3376: *
                   3377: OPSNB  DAC  CH$AT            AT
                   3378:        DAC  CH$AM            AMPERSAND
                   3379:        DAC  CH$NM            NUMBER
                   3380:        DAC  CH$PC            PERCENT
                   3381:        DAC  CH$NT            NOT
                   3382: *
                   3383: *      TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
                   3384: *
                   3385: OPNSU  DAC  CH$BR            VERTICAL BAR
                   3386:        DAC  CH$EQ            EQUAL
                   3387:        DAC  CH$NM            NUMBER
                   3388:        DAC  CH$PC            PERCENT
                   3389:        DAC  CH$SL            SLASH
                   3390:        DAC  CH$EX            EXCLAMATION
                   3391: .IF    .CNPF
                   3392: .ELSE
                   3393: *
                   3394: *      ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
                   3395: *
                   3396: PFI2A  DAC  PF$I2
                   3397: *
                   3398: *      PROFILER MESSAGE STRINGS
                   3399: *
                   3400: PFMS1  DAC  B$SCL
                   3401:        DAC  15
                   3402:        DDC  /PROGRAM PROFILE/
                   3403: PFMS2  DAC  B$SCL
                   3404:        DAC  42
                   3405:        DDC  /STMT    NUMBER OF     -- EXECUTION TIME --/
                   3406: PFMS3  DAC  B$SCL
                   3407:        DAC  47
                   3408:        DDC  /NUMBER  EXECUTIONS  TOTAL(MSEC) PER EXCN(MCSEC)/
                   3409: .FI
                   3410: .IF    .CNRA
                   3411: .ELSE
                   3412: *
                   3413: *      REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
                   3414: *      STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
                   3415: *
                   3416: REAV0  DRC  +0.0             0.0
                   3417: REAP1  DRC  +0.1             0.1
                   3418: REAP5  DRC  +0.5             0.5
                   3419: REAV1  DRC  +1.0             10**0
                   3420: REAVT  DRC  +1.0E+1          10**1
                   3421:        DRC  +1.0E+2          10**2
                   3422:        DRC  +1.0E+3          10**3
                   3423:        DRC  +1.0E+4          10**4
                   3424:        DRC  +1.0E+5          10**5
                   3425:        DRC  +1.0E+6          10**6
                   3426:        DRC  +1.0E+7          10**7
                   3427:        DRC  +1.0E+8          10**8
                   3428:        DRC  +1.0E+9          10**9
                   3429: REATT  DRC  +1.0E+10         10**10
                   3430: .FI
                   3431:        EJC
                   3432: *
                   3433: *      STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
                   3434: *
                   3435: SCARR  DAC  B$SCL            ARRAY
                   3436:        DAC  5
                   3437:        DTC  /ARRAY/
                   3438: .IF    .CNBF
                   3439: .ELSE
                   3440: *
                   3441: SCBUF  DAC  B$SCL
                   3442:        DAC  6
                   3443:        DTC  /BUFFER/
                   3444: .FI
                   3445: *
                   3446: SCCOD  DAC  B$SCL            CODE
                   3447:        DAC  4
                   3448:        DTC  /CODE/
                   3449: *
                   3450: SCEXP  DAC  B$SCL            EXPRESSION
                   3451:        DAC  10
                   3452:        DTC  /EXPRESSION/
                   3453: *
                   3454: SCEXT  DAC  B$SCL            EXTERNAL
                   3455:        DAC  8
                   3456:        DTC  /EXTERNAL/
                   3457: *
                   3458: SCINT  DAC  B$SCL            INTEGER
                   3459:        DAC  7
                   3460:        DTC  /INTEGER/
                   3461: *
                   3462: SCNAM  DAC  B$SCL            NAME
                   3463:        DAC  4
                   3464:        DTC  /NAME/
                   3465: *
                   3466: SCNUM  DAC  B$SCL            NUMERIC
                   3467:        DAC  7
                   3468:        DTC  /NUMERIC/
                   3469: *
                   3470: SCPAT  DAC  B$SCL            PATTERN
                   3471:        DAC  7
                   3472:        DTC  /PATTERN/
                   3473: .IF    .CNRA
                   3474: .ELSE
                   3475: *
                   3476: SCREA  DAC  B$SCL            REAL
                   3477:        DAC  4
                   3478:        DTC  /REAL/
                   3479: .FI
                   3480: *
                   3481: SCSTR  DAC  B$SCL            STRING
                   3482:        DAC  6
                   3483:        DTC  /STRING/
                   3484: *
                   3485: SCTAB  DAC  B$SCL            TABLE
                   3486:        DAC  5
                   3487:        DTC  /TABLE/
                   3488:        EJC
                   3489: *
                   3490: *      STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
                   3491: *
                   3492: SCFRT  DAC  B$SCL            FRETURN
                   3493:        DAC  7
                   3494:        DTC  /FRETURN/
                   3495: *
                   3496: SCNRT  DAC  B$SCL            NRETURN
                   3497:        DAC  7
                   3498:        DTC  /NRETURN/
                   3499: *
                   3500: SCRTN  DAC  B$SCL            RETURN
                   3501:        DAC  6
                   3502:        DTC  /RETURN/
                   3503: *
                   3504: *      DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
                   3505: *      THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
                   3506: *
                   3507: SCNMT  DAC  SCARR            ARBLK     ARRAY
                   3508: .IF    .CNBF
                   3509: .ELSE
                   3510:        DAC  SCBUF            BFBLK     BUFFER
                   3511: .FI
                   3512:        DAC  SCCOD            CDBLK     CODE
                   3513:        DAC  SCEXP            EXBLK     EXPRESSION
                   3514:        DAC  SCINT            ICBLK     INTEGER
                   3515:        DAC  SCNAM            NMBLK     NAME
                   3516:        DAC  SCPAT            P0BLK     PATTERN
                   3517:        DAC  SCPAT            P1BLK     PATTERN
                   3518:        DAC  SCPAT            P2BLK     PATTERN
                   3519: .IF    .CNRA
                   3520: .ELSE
                   3521:        DAC  SCREA            RCBLK     REAL
                   3522: .FI
                   3523:        DAC  SCSTR            SCBLK     STRING
                   3524:        DAC  SCEXP            SEBLK     EXPRESSION
                   3525:        DAC  SCTAB            TBBLK     TABLE
                   3526:        DAC  SCARR            VCBLK     ARRAY
                   3527:        DAC  SCEXT            XNBLK     EXTERNAL
                   3528:        DAC  SCEXT            XRBLK     EXTERNAL
                   3529: *
                   3530: .IF    .CNRA
                   3531: .ELSE
                   3532: *      STRING CONSTANT FOR REAL ZERO
                   3533: *
                   3534: SCRE0  DAC  B$SCL
                   3535:        DAC  2
                   3536:        DTC  /0./
                   3537: .FI
                   3538:        EJC
                   3539: *
                   3540: *      USED TO RE-INITIALISE KVSTL
                   3541: *
                   3542: .IF    .CS16
                   3543: STLIM  DIC  +32767           DEFAULT STATEMENT LIMIT
                   3544: .ELSE
                   3545: STLIM  DIC  +50000           DEFAULT STATEMENT LIMIT
                   3546: .FI
                   3547: *
                   3548: *      DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
                   3549: *
                   3550: STNDF  DAC  O$FUN            PTR TO UNDEFINED FUNCTION ERR CALL
                   3551:        DAC  0                DUMMY FARGS COUNT FOR CALL CIRCUIT
                   3552: *
                   3553: *      DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
                   3554: *
                   3555: STNDL  DAC  L$UND            CODE PTR POINTS TO UNDEFINED LBL
                   3556: *
                   3557: *      DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
                   3558: *
                   3559: STNDO  DAC  O$OUN            PTR TO UNDEFINED OPERATOR ERR CALL
                   3560:        DAC  0                DUMMY FARGS COUNT FOR CALL CIRCUIT
                   3561: *
                   3562: *      STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
                   3563: *      THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
                   3564: *      ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
                   3565: *
                   3566: STNVR  DAC  B$VRL            VRGET
                   3567:        DAC  B$VRS            VRSTO
                   3568:        DAC  NULLS            VRVAL
                   3569:        DAC  B$VRG            VRTRA
                   3570:        DAC  STNDL            VRLBL
                   3571:        DAC  STNDF            VRFNC
                   3572:        DAC  0                VRNXT
                   3573:        EJC
                   3574: *
                   3575: *      MESSAGES USED IN END OF RUN PROCESSING (STOPR)
                   3576: *
                   3577: STPM1  DAC  B$SCL
                   3578:        DAC  12
                   3579:        DDC  /IN STATEMENT/
                   3580: *
                   3581: STPM2  DAC  B$SCL
                   3582:        DAC  14
                   3583:        DDC  /STMTS EXECUTED/
                   3584: *
                   3585: STPM3  DAC  B$SCL
                   3586:        DAC  13
                   3587: .IF    .CTMD
                   3588:        DDC  /RUN TIME-DSEC/
                   3589: .ELSE
                   3590:        DDC  /RUN TIME-MSEC/
                   3591: .FI
                   3592: *
                   3593: STPM4  DAC  B$SCL
                   3594:        DAC  12
                   3595:        DDC  $MCSEC / STMT$
                   3596: *
                   3597: STPM5  DAC  B$SCL
                   3598:        DAC  13
                   3599:        DDC  /REGENERATIONS/
                   3600: *
                   3601: *      TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
                   3602: *      THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
                   3603: *      IN S$CNV
                   3604: *
                   3605: SVCTB  DAC  SCSTR            STRING
                   3606:        DAC  SCINT            INTEGER
                   3607:        DAC  SCNAM            NAME
                   3608:        DAC  SCPAT            PATTERN
                   3609:        DAC  SCARR            ARRAY
                   3610:        DAC  SCTAB            TABLE
                   3611:        DAC  SCEXP            EXPRESSION
                   3612:        DAC  SCCOD            CODE
                   3613:        DAC  SCNUM            NUMERIC
                   3614: .IF    .CNRA
                   3615: .ELSE
                   3616:        DAC  SCREA            REAL
                   3617: .FI
                   3618: .IF    .CNBF
                   3619: .ELSE
                   3620:        DAC  SCBUF            BUFFER
                   3621: .FI
                   3622:        DAC  0                ZERO MARKS END OF LIST
                   3623:        EJC
                   3624: *
                   3625: *      MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
                   3626: *
                   3627: *
                   3628: TMASB  DAC  B$SCL
                   3629:        DAC  13
                   3630:        DTC  /************ /
                   3631: *
                   3632: TMBEB  DAC  B$SCL
                   3633:        DAC  3
                   3634:        DTC  / = /
                   3635: *
                   3636: *      DUMMY TRBLK FOR EXPRESSION VARIABLE
                   3637: *
                   3638: TRBEV  DAC  B$TRT            DUMMY TRBLK
                   3639: *
                   3640: *      DUMMY TRBLK FOR KEYWORD VARIABLE
                   3641: *
                   3642: TRBKV  DAC  B$TRT            DUMMY TRBLK
                   3643: *
                   3644: *      DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
                   3645: *
                   3646: TRXDR  DAC  O$TXR            BLOCK POINTS TO RETURN ROUTINE
                   3647: TRXDC  DAC  TRXDR            POINTER TO BLOCK
                   3648:        EJC
                   3649: *
                   3650: *      STANDARD VARIABLE BLOCKS
                   3651: *
                   3652: *      SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
                   3653: *      VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
                   3654: *      ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
                   3655: *
                   3656: V$EQF  DBC  SVFPR            EQ
                   3657:        DAC  2
                   3658:        DTC  /EQ/
                   3659:        DAC  S$EQF
                   3660:        DAC  2
                   3661: *
                   3662: V$GEF  DBC  SVFPR            GE
                   3663:        DAC  2
                   3664:        DTC  /GE/
                   3665:        DAC  S$GEF
                   3666:        DAC  2
                   3667: *
                   3668: V$GTF  DBC  SVFPR            GT
                   3669:        DAC  2
                   3670:        DTC  /GT/
                   3671:        DAC  S$GTF
                   3672:        DAC  2
                   3673: *
                   3674: V$LEF  DBC  SVFPR            LE
                   3675:        DAC  2
                   3676:        DTC  /LE/
                   3677:        DAC  S$LEF
                   3678:        DAC  2
                   3679: *
                   3680: V$LTF  DBC  SVFPR            LT
                   3681:        DAC  2
                   3682:        DTC  /LT/
                   3683:        DAC  S$LTF
                   3684:        DAC  2
                   3685: *
                   3686: V$NEF  DBC  SVFPR            NE
                   3687:        DAC  2
                   3688:        DTC  /NE/
                   3689:        DAC  S$NEF
                   3690:        DAC  2
                   3691: *
                   3692: V$ANY  DBC  SVFNP            ANY
                   3693:        DAC  3
                   3694:        DTC  /ANY/
                   3695:        DAC  S$ANY
                   3696:        DAC  1
                   3697: *
                   3698: V$ARB  DBC  SVKVC            ARB
                   3699:        DAC  3
                   3700:        DTC  /ARB/
                   3701:        DAC  K$ARB
                   3702:        DAC  NDARB
                   3703:        EJC
                   3704: *
                   3705: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3706: *
                   3707: V$ARG  DBC  SVFNN            ARG
                   3708:        DAC  3
                   3709:        DTC  /ARG/
                   3710:        DAC  S$ARG
                   3711:        DAC  2
                   3712: *
                   3713: V$BAL  DBC  SVKVC            BAL
                   3714:        DAC  3
                   3715:        DTC  /BAL/
                   3716:        DAC  K$BAL
                   3717:        DAC  NDBAL
                   3718: *
                   3719: V$CTI  DBC  SVFNP            CTI
                   3720:        DAC  3
                   3721:        DTC  /CTI/
                   3722:        DAC  S$CTI
                   3723:        DAC  1
                   3724: *
                   3725: V$END  DBC  SVLBL            END
                   3726:        DAC  3
                   3727:        DTC  /END/
                   3728:        DAC  L$END
                   3729: *
                   3730: V$ITC  DBC  SVFNN            ITC
                   3731:        DAC  3
                   3732:        DTC  /ITC/
                   3733:        DAC  S$ITC
                   3734:        DAC  1
                   3735: *
                   3736: V$LEN  DBC  SVFNP            LEN
                   3737:        DAC  3
                   3738:        DTC  /LEN/
                   3739:        DAC  S$LEN
                   3740:        DAC  1
                   3741: *
                   3742: V$LEQ  DBC  SVFPR            LEQ
                   3743:        DAC  3
                   3744:        DTC  /LEQ/
                   3745:        DAC  S$LEQ
                   3746:        DAC  2
                   3747: *
                   3748: V$LGE  DBC  SVFPR            LGE
                   3749:        DAC  3
                   3750:        DTC  /LGE/
                   3751:        DAC  S$LGE
                   3752:        DAC  2
                   3753: *
                   3754: V$LGT  DBC  SVFPR            LGT
                   3755:        DAC  3
                   3756:        DTC  /LGT/
                   3757:        DAC  S$LGT
                   3758:        DAC  2
                   3759: *
                   3760: V$LLE  DBC  SVFPR            LLE
                   3761:        DAC  3
                   3762:        DTC  /LLE/
                   3763:        DAC  S$LLE
                   3764:        DAC  2
                   3765:        EJC
                   3766: *
                   3767: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3768: *
                   3769: V$LLT  DBC  SVFPR            LLT
                   3770:        DAC  3
                   3771:        DTC  /LLT/
                   3772:        DAC  S$LLT
                   3773:        DAC  2
                   3774: *
                   3775: V$LNE  DBC  SVFPR            LNE
                   3776:        DAC  3
                   3777:        DTC  /LNE/
                   3778:        DAC  S$LNE
                   3779:        DAC  2
                   3780: *
                   3781: V$POS  DBC  SVFNP            POS
                   3782:        DAC  3
                   3783:        DTC  /POS/
                   3784:        DAC  S$POS
                   3785:        DAC  1
                   3786: *
                   3787: V$REM  DBC  SVKVC            REM
                   3788:        DAC  3
                   3789:        DTC  /REM/
                   3790:        DAC  K$REM
                   3791:        DAC  NDREM
                   3792: .IF    .CUST
                   3793: *
                   3794: V$SET  DBC  SVFNN            SET
                   3795:        DAC  3
                   3796:        DTC  /SET/
                   3797:        DAC  S$SET
                   3798:        DAC  3
                   3799: .FI
                   3800: *
                   3801: V$TAB  DBC  SVFNP            TAB
                   3802:        DAC  3
                   3803:        DTC  /TAB/
                   3804:        DAC  S$TAB
                   3805:        DAC  1
                   3806: *
                   3807: V$COD  DBC  SVFNK            CODE
                   3808:        DAC  4
                   3809:        DTC  /CODE/
                   3810:        DAC  K$COD
                   3811:        DAC  S$COD
                   3812:        DAC  1
                   3813: *
                   3814: V$COP  DBC  SVFNN            COPY
                   3815:        DAC  4
                   3816:        DTC  /COPY/
                   3817:        DAC  S$COP
                   3818:        DAC  1
                   3819:        EJC
                   3820: *
                   3821: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3822: *
                   3823: V$DAT  DBC  SVFNN            DATA
                   3824:        DAC  4
                   3825:        DTC  /DATA/
                   3826:        DAC  S$DAT
                   3827:        DAC  1
                   3828: *
                   3829: V$DTE  DBC  SVFNN            DATE
                   3830:        DAC  4
                   3831:        DTC  /DATE/
                   3832:        DAC  S$DTE
                   3833:        DAC  0
                   3834: *
                   3835: V$DMP  DBC  SVFNK            DUMP
                   3836:        DAC  4
                   3837:        DTC  /DUMP/
                   3838:        DAC  K$DMP
                   3839:        DAC  S$DMP
                   3840:        DAC  1
                   3841: *
                   3842: V$DUP  DBC  SVFNN            DUPL
                   3843:        DAC  4
                   3844:        DTC  /DUPL/
                   3845:        DAC  S$DUP
                   3846:        DAC  2
                   3847: *
                   3848: V$EVL  DBC  SVFNN            EVAL
                   3849:        DAC  4
                   3850:        DTC  /EVAL/
                   3851:        DAC  S$EVL
                   3852:        DAC  1
                   3853: .IF    .CNEX
                   3854: .ELSE
                   3855: *
                   3856: V$EXT  DBC  SVFNN            EXIT
                   3857:        DAC  4
                   3858:        DTC  /EXIT/
                   3859:        DAC  S$EXT
                   3860:        DAC  1
                   3861: .FI
                   3862: *
                   3863: V$FAL  DBC  SVKVC            FAIL
                   3864:        DAC  4
                   3865:        DTC  /FAIL/
                   3866:        DAC  K$FAL
                   3867:        DAC  NDFAL
                   3868: *
                   3869: V$HST  DBC  SVFNN            HOST
                   3870:        DAC  4
                   3871:        DTC  /HOST/
                   3872:        DAC  S$HST
                   3873:        DAC  3
                   3874:        EJC
                   3875: *
                   3876: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3877: *
                   3878: V$ITM  DBC  SVFNF            ITEM
                   3879:        DAC  4
                   3880:        DTC  /ITEM/
                   3881:        DAC  S$ITM
                   3882:        DAC  999
                   3883: .IF    .CNLD
                   3884: .ELSE
                   3885: *
                   3886: V$LOD  DBC  SVFNN            LOAD
                   3887:        DAC  4
                   3888:        DTC  /LOAD/
                   3889:        DAC  S$LOD
                   3890:        DAC  2
                   3891: .FI
                   3892: *
                   3893: V$LPD  DBC  SVFNP            LPAD
                   3894:        DAC  4
                   3895:        DTC  /LPAD/
                   3896:        DAC  S$LPD
                   3897:        DAC  3
                   3898: *
                   3899: V$RPD  DBC  SVFNP            RPAD
                   3900:        DAC  4
                   3901:        DTC  /RPAD/
                   3902:        DAC  S$RPD
                   3903:        DAC  3
                   3904:        EJC
                   3905: *
                   3906: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3907: *
                   3908: *
                   3909: V$RPS  DBC  SVFNP            RPOS
                   3910:        DAC  4
                   3911:        DTC  /RPOS/
                   3912:        DAC  S$RPS
                   3913:        DAC  1
                   3914: *
                   3915: V$RTB  DBC  SVFNP            RTAB
                   3916:        DAC  4
                   3917:        DTC  /RTAB/
                   3918:        DAC  S$RTB
                   3919:        DAC  1
                   3920: *
                   3921: V$SI$  DBC  SVFNP            SIZE
                   3922:        DAC  4
                   3923:        DTC  /SIZE/
                   3924:        DAC  S$SI$
                   3925:        DAC  1
                   3926: *
                   3927: .IF    .CNSR
                   3928: .ELSE
                   3929: *
                   3930: V$SRT  DBC  SVFNN            SORT
                   3931:        DAC  4
                   3932:        DTC  /SORT/
                   3933:        DAC  S$SRT
                   3934:        DAC  2
                   3935: .FI
                   3936: V$SPN  DBC  SVFNP            SPAN
                   3937:        DAC  4
                   3938:        DTC  /SPAN/
                   3939:        DAC  S$SPN
                   3940:        DAC  1
                   3941:        EJC
                   3942: *
                   3943: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3944: *
                   3945: V$STN  DBC  SVKNM            STNO
                   3946:        DAC  4
                   3947:        DTC  /STNO/
                   3948:        DAC  K$STN
                   3949: *
                   3950: V$TIM  DBC  SVFNN            TIME
                   3951:        DAC  4
                   3952:        DTC  /TIME/
                   3953:        DAC  S$TIM
                   3954:        DAC  0
                   3955: *
                   3956: V$TRM  DBC  SVFNK            TRIM
                   3957:        DAC  4
                   3958:        DTC  /TRIM/
                   3959:        DAC  K$TRM
                   3960:        DAC  S$TRM
                   3961:        DAC  1
                   3962: *
                   3963: V$ABO  DBC  SVKVL            ABORT
                   3964:        DAC  5
                   3965:        DTC  /ABORT/
                   3966:        DAC  K$ABO
                   3967:        DAC  L$ABO
                   3968:        DAC  NDABO
                   3969: *
                   3970: V$APP  DBC  SVFNF            APPLY
                   3971:        DAC  5
                   3972:        DTC  /APPLY/
                   3973:        DAC  S$APP
                   3974:        DAC  999
                   3975: *
                   3976: V$ABN  DBC  SVFNP            ARBNO
                   3977:        DAC  5
                   3978:        DTC  /ARBNO/
                   3979:        DAC  S$ABN
                   3980:        DAC  1
                   3981: *
                   3982: V$ARR  DBC  SVFNN            ARRAY
                   3983:        DAC  5
                   3984:        DTC  /ARRAY/
                   3985:        DAC  S$ARR
                   3986:        DAC  2
                   3987:        EJC
                   3988: *
                   3989: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   3990: *
                   3991: V$BRK  DBC  SVFNP            BREAK
                   3992:        DAC  5
                   3993:        DTC  /BREAK/
                   3994:        DAC  S$BRK
                   3995:        DAC  1
                   3996: *
                   3997: V$CLR  DBC  SVFNN            CLEAR
                   3998:        DAC  5
                   3999:        DTC  /CLEAR/
                   4000:        DAC  S$CLR
                   4001:        DAC  1
                   4002: *
                   4003: V$EJC  DBC  SVFNN            EJECT
                   4004:        DAC  5
                   4005:        DTC  /EJECT/
                   4006:        DAC  S$EJC
                   4007:        DAC  1
                   4008: *
                   4009: .IF    .CNFN
                   4010: V$FEN  DBC  SVKVC            FENCE
                   4011: .ELSE
                   4012: V$FEN  DBC  SVFPK            FENCE
                   4013: .FI
                   4014:        DAC  5
                   4015:        DTC  /FENCE/
                   4016:        DAC  K$FEN
                   4017: .IF    .CNFN
                   4018: .ELSE
                   4019:        DAC  S$FNC
                   4020:        DAC  1
                   4021: .FI
                   4022:        DAC  NDFEN
                   4023: *
                   4024: V$FLD  DBC  SVFNN            FIELD
                   4025:        DAC  5
                   4026:        DTC  /FIELD/
                   4027:        DAC  S$FLD
                   4028:        DAC  2
                   4029: *
                   4030: V$IDN  DBC  SVFPR            IDENT
                   4031:        DAC  5
                   4032:        DTC  /IDENT/
                   4033:        DAC  S$IDN
                   4034:        DAC  2
                   4035: *
                   4036: V$INP  DBC  SVFNK            INPUT
                   4037:        DAC  5
                   4038:        DTC  /INPUT/
                   4039:        DAC  K$INP
                   4040:        DAC  S$INP
                   4041:        DAC  3
                   4042: *
                   4043: V$LOC  DBC  SVFNN            LOCAL
                   4044:        DAC  5
                   4045:        DTC  /LOCAL/
                   4046:        DAC  S$LOC
                   4047:        DAC  2
                   4048:        EJC
                   4049: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4050: *
                   4051: V$OPS  DBC  SVFNN            OPSYN
                   4052:        DAC  5
                   4053:        DTC  /OPSYN/
                   4054:        DAC  S$OPS
                   4055:        DAC  3
                   4056: *
                   4057: V$RMD  DBC  SVFNP            REMDR
                   4058:        DAC  5
                   4059:        DTC  /REMDR/
                   4060:        DAC  S$RMD
                   4061:        DAC  2
                   4062: .IF    .CNSR
                   4063: .ELSE
                   4064: *
                   4065: V$RSR  DBC  SVFNN            RSORT
                   4066:        DAC  5
                   4067:        DTC  /RSORT/
                   4068:        DAC  S$RSR
                   4069:        DAC  2
                   4070: .FI
                   4071: *
                   4072: V$TBL  DBC  SVFNN            TABLE
                   4073:        DAC  5
                   4074:        DTC  /TABLE/
                   4075:        DAC  S$TBL
                   4076:        DAC  3
                   4077: *
                   4078: V$TRA  DBC  SVFNK            TRACE
                   4079:        DAC  5
                   4080:        DTC  /TRACE/
                   4081:        DAC  K$TRA
                   4082:        DAC  S$TRA
                   4083:        DAC  4
                   4084: *
                   4085: V$ANC  DBC  SVKNM            ANCHOR
                   4086:        DAC  6
                   4087:        DTC  /ANCHOR/
                   4088:        DAC  K$ANC
                   4089:        EJC
                   4090: *
                   4091: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4092: *
                   4093: .IF    .CNBF
                   4094: .ELSE
                   4095: V$APN  DBC  SVFNN            APPEND
                   4096:        DAC  6
                   4097:        DTC  /APPEND/
                   4098:        DAC  S$APN
                   4099:        DAC  2
                   4100: .FI
                   4101: *
                   4102: V$BKX  DBC  SVFNP            BREAKX
                   4103:        DAC  6
                   4104:        DTC  /BREAKX/
                   4105:        DAC  S$BKX
                   4106:        DAC  1
                   4107: .IF    .CNBF
                   4108: .ELSE
                   4109: V$BUF  DBC  SVFNN            BUFFER
                   4110:        DAC  6
                   4111:        DTC  /BUFFER/
                   4112:        DAC  S$BUF
                   4113:        DAC  2
                   4114: .FI
                   4115: *
                   4116: V$DEF  DBC  SVFNN            DEFINE
                   4117:        DAC  6
                   4118:        DTC  /DEFINE/
                   4119:        DAC  S$DFN
                   4120:        DAC  2
                   4121: *
                   4122: V$DET  DBC  SVFNN            DETACH
                   4123:        DAC  6
                   4124:        DTC  /DETACH/
                   4125:        DAC  S$DET
                   4126:        DAC  1
                   4127: *
                   4128: V$DIF  DBC  SVFPR            DIFFER
                   4129:        DAC  6
                   4130:        DTC  /DIFFER/
                   4131:        DAC  S$DIF
                   4132:        DAC  2
                   4133: *
                   4134: V$FTR  DBC  SVKNM            FTRACE
                   4135:        DAC  6
                   4136:        DTC  /FTRACE/
                   4137:        DAC  K$FTR
                   4138:        EJC
                   4139: .IF    .CNBF
                   4140: .ELSE
                   4141: *
                   4142: V$INS  DBC  SVFNN            INSERT
                   4143:        DAC  6
                   4144:        DTC  /INSERT/
                   4145:        DAC  S$INS
                   4146:        DAC  4
                   4147: .FI
                   4148: *
                   4149: V$LST  DBC  SVKNM            LASTNO
                   4150:        DAC  6
                   4151:        DTC  /LASTNO/
                   4152:        DAC  K$LST
                   4153: *
                   4154: V$NAY  DBC  SVFNP            NOTANY
                   4155:        DAC  6
                   4156:        DTC  /NOTANY/
                   4157:        DAC  S$NAY
                   4158:        DAC  1
                   4159: *
                   4160: V$OUP  DBC  SVFNK            OUTPUT
                   4161:        DAC  6
                   4162:        DTC  /OUTPUT/
                   4163:        DAC  K$OUP
                   4164:        DAC  S$OUP
                   4165:        DAC  3
                   4166: *
                   4167: V$RET  DBC  SVLBL            RETURN
                   4168:        DAC  6
                   4169:        DTC  /RETURN/
                   4170:        DAC  L$RTN
                   4171: *
                   4172: V$STT  DBC  SVFNN            STOPTR
                   4173:        DAC  6
                   4174:        DTC  /STOPTR/
                   4175:        DAC  S$STT
                   4176:        DAC  2
                   4177:        EJC
                   4178: *
                   4179: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4180: *
                   4181: V$SUB  DBC  SVFNN            SUBSTR
                   4182:        DAC  6
                   4183:        DTC  /SUBSTR/
                   4184:        DAC  S$SUB
                   4185:        DAC  3
                   4186: *
                   4187: V$UNL  DBC  SVFNN            UNLOAD
                   4188:        DAC  6
                   4189:        DTC  /UNLOAD/
                   4190:        DAC  S$UNL
                   4191:        DAC  1
                   4192: *
                   4193: V$COL  DBC  SVFNN            COLLECT
                   4194:        DAC  7
                   4195:        DTC  /COLLECT/
                   4196:        DAC  S$COL
                   4197:        DAC  1
                   4198: *
                   4199: V$CNV  DBC  SVFNN            CONVERT
                   4200:        DAC  7
                   4201:        DTC  /CONVERT/
                   4202:        DAC  S$CVT
                   4203:        DAC  2
                   4204: *
                   4205: V$ENF  DBC  SVFNN            ENDFILE
                   4206:        DAC  7
                   4207:        DTC  /ENDFILE/
                   4208:        DAC  S$ENF
                   4209:        DAC  2
                   4210: *
                   4211: V$ETX  DBC  SVKNM            ERRTEXT
                   4212:        DAC  7
                   4213:        DTC  /ERRTEXT/
                   4214:        DAC  K$ETX
                   4215: *
                   4216: V$ERT  DBC  SVKNM            ERRTYPE
                   4217:        DAC  7
                   4218:        DTC  /ERRTYPE/
                   4219:        DAC  K$ERT
                   4220: *
                   4221: V$FRT  DBC  SVLBL            FRETURN
                   4222:        DAC  7
                   4223:        DTC  /FRETURN/
                   4224:        DAC  L$FRT
                   4225: *
                   4226: V$INT  DBC  SVFPR            INTEGER
                   4227:        DAC  7
                   4228:        DTC  /INTEGER/
                   4229:        DAC  S$INT
                   4230:        DAC  1
                   4231: *
                   4232: V$NRT  DBC  SVLBL            NRETURN
                   4233:        DAC  7
                   4234:        DTC  /NRETURN/
                   4235:        DAC  L$NRT
                   4236:        EJC
                   4237: *
                   4238: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4239: .IF    .CNPF
                   4240: .ELSE
                   4241: *
                   4242: V$PFL  DBC  SVKNM            PROFILE
                   4243:        DAC  7
                   4244:        DTC  /PROFILE/
                   4245:        DAC  K$PFL
                   4246: .FI
                   4247: *
                   4248: *
                   4249: V$RPL  DBC  SVFNP            REPLACE
                   4250:        DAC  7
                   4251:        DTC  /REPLACE/
                   4252:        DAC  S$RPL
                   4253:        DAC  3
                   4254: *
                   4255: V$RVS  DBC  SVFNP            REVERSE
                   4256:        DAC  7
                   4257:        DTC  /REVERSE/
                   4258:        DAC  S$RVS
                   4259:        DAC  1
                   4260: *
                   4261: V$RTN  DBC  SVKNM            RTNTYPE
                   4262:        DAC  7
                   4263:        DTC  /RTNTYPE/
                   4264:        DAC  K$RTN
                   4265: *
                   4266: V$STX  DBC  SVFNN            SETEXIT
                   4267:        DAC  7
                   4268:        DTC  /SETEXIT/
                   4269:        DAC  S$STX
                   4270:        DAC  1
                   4271: *
                   4272: V$STC  DBC  SVKNM            STCOUNT
                   4273:        DAC  7
                   4274:        DTC  /STCOUNT/
                   4275:        DAC  K$STC
                   4276: *
                   4277: V$STL  DBC  SVKNM            STLIMIT
                   4278:        DAC  7
                   4279:        DTC  /STLIMIT/
                   4280:        DAC  K$STL
                   4281: *
                   4282: V$SUC  DBC  SVKVC            SUCCEED
                   4283:        DAC  7
                   4284:        DTC  /SUCCEED/
                   4285:        DAC  K$SUC
                   4286:        DAC  NDSUC
                   4287: *
                   4288: V$VDF  DBC  SVFPR            VDIFFER
                   4289:        DAC  7
                   4290:        DTC  /VDIFFER/
                   4291:        DAC  S$VDF
                   4292:        DAC  2
                   4293: *
                   4294: V$ALP  DBC  SVKWC            ALPHABET
                   4295:        DAC  8
                   4296:        DTC  /ALPHABET/
                   4297:        DAC  K$ALP
                   4298:        EJC
                   4299: *
                   4300: *      STANDARD VARIABLE BLOCKS (CONTINUED)
                   4301: *
                   4302: V$CNT  DBC  SVLBL            CONTINUE
                   4303:        DAC  8
                   4304:        DTC  /CONTINUE/
                   4305:        DAC  L$CNT
                   4306: *
                   4307: V$DTP  DBC  SVFNP            DATATYPE
                   4308:        DAC  8
                   4309:        DTC  /DATATYPE/
                   4310:        DAC  S$DTP
                   4311:        DAC  1
                   4312: *
                   4313: V$ERL  DBC  SVKNM            ERRLIMIT
                   4314:        DAC  8
                   4315:        DTC  /ERRLIMIT/
                   4316:        DAC  K$ERL
                   4317: *
                   4318: V$FNC  DBC  SVKNM            FNCLEVEL
                   4319:        DAC  8
                   4320:        DTC  /FNCLEVEL/
                   4321:        DAC  K$FNC
                   4322: *
                   4323: V$MXL  DBC  SVKNM            MAXLNGTH
                   4324:        DAC  8
                   4325:        DTC  /MAXLNGTH/
                   4326:        DAC  K$MXL
                   4327: *
                   4328: V$TER  DBC  0                TERMINAL
                   4329:        DAC  8
                   4330:        DTC  /TERMINAL/
                   4331:        DAC  0
                   4332: *
                   4333: V$PRO  DBC  SVFNN            PROTOTYPE
                   4334:        DAC  9
                   4335:        DTC  /PROTOTYPE/
                   4336:        DAC  S$PRO
                   4337:        DAC  1
                   4338: *
                   4339:        DBC  0                DUMMY ENTRY TO END LIST
                   4340:        DAC  10               LENGTH GT 9 (PROTOTYPE)
                   4341:        EJC
                   4342: *
                   4343: *      LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
                   4344: *      LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
                   4345: *
                   4346: VDMKW  DAC  V$ANC            ANCHOR
                   4347:        DAC  V$COD            CODE
                   4348:        DAC  V$DMP            DUMP
                   4349:        DAC  V$ERL            ERRLIMIT
                   4350:        DAC  V$ETX            ERRTEXT
                   4351:        DAC  V$ERT            ERRTYPE
                   4352:        DAC  V$FNC            FNCLEVEL
                   4353:        DAC  V$FTR            FTRACE
                   4354:        DAC  V$INP            INPUT
                   4355:        DAC  V$LST            LASTNO
                   4356:        DAC  V$MXL            MAXLENGTH
                   4357:        DAC  V$OUP            OUTPUT
                   4358: .IF    .CNPF
                   4359: .ELSE
                   4360:        DAC  V$PFL            PROFILE
                   4361: .FI
                   4362:        DAC  V$RTN            RTNTYPE
                   4363:        DAC  V$STC            STCOUNT
                   4364:        DAC  V$STL            STLIMIT
                   4365:        DAC  V$STN            STNO
                   4366:        DAC  V$TRA            TRACE
                   4367:        DAC  V$TRM            TRIM
                   4368:        DAC  0                END OF LIST
                   4369: *
                   4370: *      TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
                   4371: *
                   4372: VSRCH  DAC  0                DUMMY ENTRY TO GET PROPER INDEXING
                   4373:        DAC  V$EQF            START OF 1 CHAR VARIABLES (NONE)
                   4374:        DAC  V$EQF            START OF 2 CHAR VARIABLES
                   4375:        DAC  V$ANY            START OF 3 CHAR VARIABLES
                   4376:        DAC  V$COD            START OF 4 CHAR VARIABLES
                   4377:        DAC  V$ABO            START OF 5 CHAR VARIABLES
                   4378:        DAC  V$ANC            START OF 6 CHAR VARIABLES
                   4379:        DAC  V$COL            START OF 7 CHAR VARIABLES
                   4380:        DAC  V$ALP            START OF 8 CHAR VARIABLES
                   4381:        DAC  V$PRO            START OF 9 CHAR VARIABLES
                   4382:        TTL  S P I T B O L -- WORKING STORAGE SECTION
                   4383: *
                   4384: *      THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
                   4385: *      CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
                   4386: *      ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
                   4387: *
                   4388: *      ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
                   4389: *      DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
                   4390: *      ALLOCATED DATA AREAS.
                   4391: *
                   4392: *      THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
                   4393: *      AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
                   4394: *      EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
                   4395: *      ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
                   4396: *      LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
                   4397: *      CALL TO ANOTHER.
                   4398: *
                   4399: *      A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
                   4400: *      TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
                   4401: *      SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
                   4402: *      CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
                   4403: *      INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
                   4404: *
                   4405: *      THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
                   4406: *      (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
                   4407: *      ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
                   4408: *      ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
                   4409: *
                   4410: *      UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
                   4411: *      DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
                   4412: *
                   4413:        SEC                   START OF WORKING STORAGE SECTION
                   4414:        EJC
                   4415: *
                   4416: *      THIS AREA IS NOT CLEARED BY INITIAL CODE
                   4417: *
                   4418: CMLAB  DAC  B$SCL            STRING USED TO CHECK LABEL LEGALITY
                   4419:        DAC  2
                   4420:        DTC  /  /
                   4421: *
                   4422: *      LABEL TO MARK START OF WORK AREA WHICH IS CLEARED
                   4423: *
                   4424: AAAAA  DAC  0
                   4425: *
                   4426: *      WORK AREAS FOR ALLOC PROCEDURE
                   4427: *
                   4428: ALDYN  DAC  0                AMOUNT OF DYNAMIC STORE
                   4429: ALFSF  DIC  +0               FACTOR IN FREE STORE PCNTAGE CHECK
                   4430: ALLIA  DIC  +0               DUMP IA
                   4431: ALLSV  DAC  0                SAVE WB IN ALLOC
                   4432: *
                   4433: *      WORK AREAS FOR ALOST PROCEDURE
                   4434: *
                   4435: ALSTA  DAC  0                SAVE WA IN ALOST
                   4436: *
                   4437: *      SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
                   4438: *
                   4439: ARCDM  DAC  0                COUNT DIMENSIONS
                   4440: ARNEL  DIC  +0               COUNT ELEMENTS
                   4441: ARPTR  DAC  0                OFFSET PTR INTO ARBLK
                   4442: ARSVL  DIC  +0               SAVE INTEGER LOW BOUND
                   4443:        EJC
                   4444: *      WORK AREAS FOR ARREF ROUTINE
                   4445: *
                   4446: ARFSI  DIC  +0               SAVE CURRENT EVOLVING SUBSCRIPT
                   4447: ARFXS  DAC  0                SAVE BASE STACK POINTER
                   4448: *
                   4449: *      WORK AREAS FOR B$EFC BLOCK ROUTINE
                   4450: *
                   4451: BEFOF  DAC  0                SAVE OFFSET PTR INTO EFBLK
                   4452: *
                   4453: *      WORK AREAS FOR B$PFC BLOCK ROUTINE
                   4454: *
                   4455: BPFPF  DAC  0                SAVE PFBLK POINTER
                   4456: BPFSV  DAC  0                SAVE OLD FUNCTION VALUE
                   4457: BPFXT  DAC  0                POINTER TO STACKED ARGUMENTS
                   4458: *
                   4459: *      SAVE AREAS FOR COLLECT FUNCTION (S$COL)
                   4460: *
                   4461: CLSVI  DIC  +0               SAVE INTEGER ARGUMENT
                   4462: *
                   4463: *      GLOBAL VALUES FOR CMPIL PROCEDURE
                   4464: *
                   4465: CMERC  DAC  0                COUNT OF INITIAL COMPILE ERRORS
                   4466: CMPXS  DAC  0                SAVE STACK PTR IN CASE OF ERRORS
                   4467: CMPSN  DAC  1                NUMBER OF NEXT STATEMENT TO COMPILE
                   4468: CMPSS  DAC  0                SAVE SUBROUTINE STACK PTR
                   4469: *
                   4470: *      WORK AREA FOR CNCRD
                   4471: *
                   4472: CNSCC  DAC  0                POINTER TO CONTROL CARD STRING
                   4473: CNSWC  DAC  0                WORD COUNT
                   4474: CNR$T  DAC  0                POINTER TO R$TTL OR R$STL
                   4475: CNTTL  DAC  0                FLAG FOR -TITLE, -STITL
                   4476: *
                   4477: *      WORK AREAS FOR CONVERT FUNCTION (S$CNV)
                   4478: *
                   4479: CNVTP  DAC  0                SAVE PTR INTO SCVTB
                   4480: *
                   4481: *      FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
                   4482: *
                   4483: CPSTS  DAC  0                SUPPRESS COMP. STATS IF NON ZERO
                   4484: *
                   4485: *      GLOBAL VALUES FOR CONTROL CARD SWITCHES
                   4486: *
                   4487: .IF    .CASL
                   4488: CSWCI  DAC  0                0/1 FOR -NOCASEIG/CASEIG
                   4489: .FI
                   4490: CSWFL  DAC  1                0/1 FOR -NOFAIL/-FAIL
                   4491: CSWIN  DAC  INILN            XXX FOR -INXXX
                   4492: CSWLS  DAC  1                0/1 FOR -NOLIST/-LIST
                   4493:        EJC
                   4494: *
                   4495: *      GLOBAL LOCATION USED BY PATST PROCEDURE
                   4496: *
                   4497: CTMSK  DBC  0                LAST BIT POSITION USED IN R$CTP
                   4498: CURID  DAC  0                CURRENT ID VALUE
                   4499: *
                   4500: *      GLOBAL VALUE FOR CDWRD PROCEDURE
                   4501: *
                   4502: CWCOF  DAC  0                NEXT WORD OFFSET IN CURRENT CCBLK
                   4503: *
                   4504: *      WORK AREAS FOR DATA FUNCTION (S$DAT)
                   4505: *
                   4506: DATDV  DAC  0                SAVE VRBLK PTR FOR DATATYPE NAME
                   4507: DATXS  DAC  0                SAVE INITIAL STACK POINTER
                   4508: *
                   4509: *      WORK AREAS FOR DEFINE FUNCTION (S$DEF)
                   4510: *
                   4511: DEFLB  DAC  0                SAVE VRBLK PTR FOR LABEL
                   4512: DEFNA  DAC  0                COUNT FUNCTION ARGUMENTS
                   4513: DEFVR  DAC  0                SAVE VRBLK PTR FOR FUNCTION NAME
                   4514: DEFXS  DAC  0                SAVE INITIAL STACK POINTER
                   4515: *
                   4516: *      WORK AREAS FOR DUMPR PROCEDURE
                   4517: *
                   4518: DMARG  DAC  0                DUMP ARGUMENT
                   4519: DMPKB  DAC  B$KVT            DUMMY KVBLK FOR USE IN DUMPR
                   4520: DMPKT  DAC  TRBKV            KVVAR TRBLK POINTER
                   4521: DMPKN  DAC  0                KEYWORD NUMBER (MUST FOLLOW DMPKB)
                   4522: DMPSA  DAC  0                PRESERVE WA OVER PRTVL CALL
                   4523: DMPSV  DAC  0                GENERAL SCRATCH SAVE
                   4524: DMVCH  DAC  0                CHAIN POINTER FOR VARIABLE BLOCKS
                   4525: DMPCH  DAC  0                SAVE SORTED VRBLK CHAIN POINTER
                   4526: *
                   4527: *      GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
                   4528: *
                   4529: DNAMB  DAC  0                START OF DYNAMIC AREA
                   4530: DNAMP  DAC  0                NEXT AVAILABLE LOC IN DYNAMIC AREA
                   4531: DNAME  DAC  0                END OF AVAILABLE DYNAMIC AREA
                   4532: *
                   4533: *      WORK AREAS FOR DUPL FUNCTION (S$DUP)
                   4534: *
                   4535: DUPSI  DIC  +0               STORE INTEGER STRING LENGTH
                   4536: *
                   4537: *      WORK AREA FOR ENDFILE (S$ENF)
                   4538: *
                   4539: ENFCH  DAC  0                FOR IOCHN CHAIN HEAD
                   4540: *
                   4541: *      WORK AREA FOR ERROR PROCESSING.
                   4542: *
                   4543: EROSN  DAC  0                FLAG FOR SPECIAL EROSI RETURN
                   4544: ERRFT  DAC  0                FATAL ERROR FLAG
                   4545: ERRSP  DAC  0                ERROR SUPPRESSION FLAG
                   4546:        EJC
                   4547: *
                   4548: *      DUMP AREA FOR ERTEX
                   4549: *
                   4550: ERTWA  DAC  0                SAVE WA
                   4551: ERTWB  DAC  0                SAVE WB
                   4552: *
                   4553: *      GLOBAL VALUES FOR EVALI
                   4554: *
                   4555: EVLIN  DAC  P$LEN            DUMMY PATTERN BLOCK PCODE
                   4556: EVLIS  DAC  0                POINTER TO SUBSEQUENT NODE
                   4557: EVLIV  DAC  0                VALUE OF PARAMETER
                   4558: *
                   4559: *      WORK AREA FOR EXPAN
                   4560: *
                   4561: EXPSV  DAC  0                SAVE OP DOPE VECTOR POINTER
                   4562: *
                   4563: *      FLAG FOR SUPPRESSION OF EXECUTION STATS
                   4564: *
                   4565: EXSTS  DAC  0                SUPPRESS EXEC STATS IF SET
                   4566: *
                   4567: *      GLOBAL VALUES FOR EXFAL AND RETURN
                   4568: *
                   4569: FLPRT  DAC  0                LOCATION OF FAIL OFFSET FOR RETURN
                   4570: FLPTR  DAC  0                LOCATION OF FAILURE OFFSET ON STACK
                   4571: *
                   4572: *      WORK AREAS FOR GBCOL PROCEDURE
                   4573: *
                   4574: GBCFL  DAC  0                GARBAGE COLLECTOR ACTIVE FLAG
                   4575: GBCLM  DAC  0                POINTER TO LAST MOVE BLOCK (PASS 3)
                   4576: GBCNM  DAC  0                DUMMY FIRST MOVE BLOCK
                   4577: GBCNS  DAC  0                REST OF DUMMY BLOCK (FOLLOWS GBCNM)
                   4578: GBSVA  DAC  0                SAVE WA
                   4579: GBSVB  DAC  0                SAVE WB
                   4580: GBSVC  DAC  0                SAVE WC
                   4581: *
                   4582: *      GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
                   4583: *
                   4584: GBCNT  DAC  0                COUNT OF GARBAGE COLLECTIONS
                   4585: *
                   4586: *      WORK AREAS FOR GTNVR PROCEDURE
                   4587: *
                   4588: GNVHE  DAC  0                PTR TO END OF HASH CHAIN
                   4589: GNVNW  DAC  0                NUMBER OF WORDS IN STRING NAME
                   4590: GNVSA  DAC  0                SAVE WA
                   4591: GNVSB  DAC  0                SAVE WB
                   4592: GNVSP  DAC  0                POINTER INTO VSRCH TABLE
                   4593: GNVST  DAC  0                POINTER TO CHARS OF STRING
                   4594: *
                   4595: *      GLOBAL VALUE FOR GTCOD AND GTEXP
                   4596: *
                   4597: GTCEF  DAC  0                SAVE FAIL PTR IN CASE OF ERROR
                   4598: *
                   4599: *      WORK AREAS FOR GTINT
                   4600: *
                   4601: GTINA  DAC  0                SAVE WA
                   4602: GTINB  DAC  0                SAVE WB
                   4603:        EJC
                   4604: *
                   4605: *      WORK AREAS FOR GTNUM PROCEDURE
                   4606: *
                   4607: GTNNF  DAC  0                ZERO/NONZERO FOR RESULT +/-
                   4608: GTNSI  DIC  +0               GENERAL INTEGER SAVE
                   4609: .IF    .CNRA
                   4610: .ELSE
                   4611: GTNDF  DAC  0                0/1 FOR DEC POINT SO FAR NO/YES
                   4612: GTNES  DAC  0                ZERO/NONZERO EXPONENT +/-
                   4613: GTNEX  DIC  +0               REAL EXPONENT
                   4614: GTNSC  DAC  0                SCALE (PLACES AFTER POINT)
                   4615: GTNSR  DRC  +0.0             GENERAL REAL SAVE
                   4616: GTNSV  DIC  +0               SAVE IA
                   4617: GTNRD  DAC  0                FLAG FOR OK REAL NUMBER
                   4618: .FI
                   4619: *
                   4620: *      WORK AREAS FOR GTPAT PROCEDURE
                   4621: *
                   4622: GTPSB  DAC  0                SAVE WB
                   4623: *
                   4624: *      WORK AREAS FOR GTSTG PROCEDURE
                   4625: *
                   4626: GTSSF  DAC  0                0/1 FOR RESULT +/-
                   4627: GTSVC  DAC  0                SAVE WC
                   4628: GTSVB  DAC  0                SAVE WB
                   4629: GTSWK  DAC  0                PTR TO WORK AREA FOR GTSTG
                   4630: .IF    .CNRA
                   4631: .ELSE
                   4632: GTSES  DAC  0                CHAR + OR - FOR EXPONENT +/-
                   4633: GTSRS  DRC  +0.0             GENERAL REAL SAVE
                   4634: *
                   4635: *      GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
                   4636: *
                   4637: GTSRN  DRC  +0.0             ROUNDING FACTOR 0.5*10**-CFP$S
                   4638: GTSSC  DRC  +0.0             SCALING VALUE 10**CFP$S
                   4639: .FI
                   4640:        EJC
                   4641: *
                   4642: *      WORK AREAS FOR GTVAR PROCEDURE
                   4643: *
                   4644: GTVRC  DAC  0                SAVE WC
                   4645: *
                   4646: *      FLAGS FOR HEADER PRINTING
                   4647: *
                   4648: HEADN  DAC  0                NON-ZERO IF HDRS NOT TO BE PRINTED
                   4649: HEADP  DAC  0                HEADER PRINTED FLAG
                   4650: *
                   4651: *      GLOBAL VALUES FOR VARIABLE HASH TABLE
                   4652: *
                   4653: HSHNB  DIC  +0               NUMBER OF HASH BUCKETS
                   4654: HSHTB  DAC  0                POINTER TO START OF VRBLK HASH TABL
                   4655: HSHTE  DAC  0                POINTER PAST END OF VRBLK HASH TABL
                   4656: *
                   4657: *      WORK AREA FOR INIT
                   4658: *
                   4659: INICD  DIC  +0               CODE KWD VAL (NEEDED FOR BATCH)
                   4660: INISS  DAC  0                SAVE SUBROUTINE STACK PTR
                   4661: INITR  DAC  0                SAVE TERMINAL FLAG
                   4662: .IF    .CNBF
                   4663: .ELSE
                   4664: *
                   4665: *      SAVE AREA FOR INSBF
                   4666: *
                   4667: INSAB  DAC  0                ENTRY WA PLUS ENTRY WB
                   4668: INSBB  DAC  0                BFBLK POINTER
                   4669: INSBC  DAC  0                BCBLK POINTER
                   4670: INSSA  DAC  0                SAVE ENTRY WA
                   4671: INSSB  DAC  0                SAVE ENTRY WB
                   4672: .FI
                   4673: *
                   4674: *      WORK AREAS FOR IOPUT
                   4675: *
                   4676: IOPNF  DAC  0                NAME OFFSET
                   4677: IOPVR  DAC  0                FILETAG VRBLK
                   4678: IOPWA  DAC  0                KEEP WA
                   4679: IOPWB  DAC  0                KEEP WB
                   4680: IOPWC  DAC  0                KEEP WC
                   4681:        EJC
                   4682: *
                   4683: *      GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
                   4684: *      WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
                   4685: *      FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
                   4686: *
                   4687: KVANC  DAC  0                ANCHOR
                   4688: KVDMP  DAC  0                DUMP
                   4689: KVERL  DAC  0                ERRLIMIT
                   4690: KVERT  DAC  0                ERRTYPE
                   4691: KVFTR  DAC  0                FTRACE
                   4692: KVINP  DAC  1                INPUT
                   4693: KVMXL  DAC  5000             MAXLENGTH
                   4694: KVOUP  DAC  1                OUTPUT
                   4695: .IF    .CNPF
                   4696: .ELSE
                   4697: KVPFL  DAC  0                PROFILE
                   4698: .FI
                   4699: KVTRA  DAC  0                TRACE
                   4700: KVTRM  DAC  0                TRIM
                   4701: KVFNC  DAC  0                FNCLEVEL
                   4702: KVLST  DAC  0                LASTNO
                   4703: KVSTN  DAC  0                STNO
                   4704: *
                   4705: *      GLOBAL VALUES FOR OTHER KEYWORDS
                   4706: *
                   4707: KVALP  DAC  0                ALPHABET
                   4708: KVRTN  DAC  NULLS            RTNTYPE (SCBLK POINTER)
                   4709: KVCOD  DIC  0                CODE
                   4710: .IF    .CS16
                   4711: KVSTL  DIC  +32767           STLIMIT
                   4712: KVSTC  DIC  +32767           STCOUNT (COUNTS DOWN FROM STLIMIT)
                   4713: .ELSE
                   4714: KVSTL  DIC  +50000           STLIMIT
                   4715: KVSTC  DIC  +50000           STCOUNT (COUNTS DOWN FROM STLIMIT)
                   4716: .FI
                   4717: .IF    .CNLD
                   4718: .ELSE
                   4719: *
                   4720: *      WORK AREAS FOR LOAD FUNCTION
                   4721: *
                   4722: LODFN  DAC  0                POINTER TO VRBLK FOR FUNC NAME
                   4723: LODNA  DAC  0                COUNT NUMBER OF ARGUMENTS
                   4724: .FI
                   4725:        EJC
                   4726: *
                   4727: *      GLOBAL VALUES FOR LISTR PROCEDURE
                   4728: *
                   4729: LSTLC  DAC  0                COUNT LINES ON SOURCE LIST PAGE
                   4730: LSTNP  DAC  0                MAX NUMBER OF LINES ON PAGE
                   4731: LSTPF  DAC  1                SET NONZERO IF CURRENT IMAGE LISTED
                   4732: LSTPG  DAC  0                CURRENT SOURCE LIST PAGE NUMBER
                   4733: LSTPO  DAC  0                OFFSET TO   PAGE NNN   MESSAGE
                   4734: LSTSN  DAC  0                REMEMBER LAST STMNUM LISTED
                   4735: *
                   4736: *      MAXIMUM SIZE OF SPITBOL OBJECTS
                   4737: *
                   4738: MXLEN  DAC  0                INITIALISED BY SYSMX CALL
                   4739: *
                   4740: *      EXECUTION CONTROL VARIABLE
                   4741: *
                   4742: NOXEQ  DAC  0                SET NON-ZERO TO INHIBIT EXECUTION
                   4743: .IF    .CNPF
                   4744: .ELSE
                   4745: *
                   4746: *      PROFILER GLOBAL VALUES AND WORK LOCATIONS
                   4747: *
                   4748: PFDMP  DAC  0                SET NON-0 IF PROFILE SET NON-0
                   4749: PFFNC  DAC  0                SET NON-0 IF FUNCT JUST ENTERED
                   4750: PFSTM  DIC  +0               TO STORE STARTING TIME OF STMT
                   4751: PFETM  DIC  +0               TO STORE ENDING TIME OF STMT
                   4752: PFSVW  DAC  0                TO SAVE A W-REG
                   4753: PFTBL  DAC  0                GETS ADRS OF (IMAG) TABLE BASE
                   4754: PFNTE  DAC  0                NR OF TABLE ENTRIES
                   4755: PFSTE  DIC  +0               TABLE ENTRY SIZE IN BAUS
                   4756: .FI
                   4757:        EJC
                   4758: *
                   4759: *      GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
                   4760: *
                   4761: PMDFL  DAC  0                PATTERN ASSIGNMENT FLAG
                   4762: PMHBS  DAC  0                HISTORY STACK BASE POINTER
                   4763: PMSSL  DAC  0                LENGTH OF SUBJECT STRING IN CHARS
                   4764: *
                   4765: *      GLOBAL VALUE FOR PRTNM PROCEDURE
                   4766: *
                   4767: PRNMV  DAC  0                VRBLK PTR FROM LAST NAME SEARCH
                   4768: *
                   4769: *      WORK AREAS FOR PRTNM PROCEDURE
                   4770: *
                   4771: PRNSI  DIC  +0               SCRATCH INTEGER LOC
                   4772: *
                   4773: *      WORK AREAS FOR PRTSN PROCEDURE
                   4774: *
                   4775: PRSNA  DAC  0                SAVE WA
                   4776: *
                   4777: *      GLOBAL VALUES FOR PRINT PROCEDURES
                   4778: *
                   4779: PRAVL  DAC  0                SET IF PRINT FILE AVAILABLE
                   4780: PRBLK  DAC  0                ADDRESS OF BUFFER BLANKING STRING
                   4781: PRBUF  DAC  0                PTR TO PRINT BFR IN STATIC
                   4782: PRCHS  DAC  0                ADDRESS OF CHARS IN PRINT BUFFER
                   4783: PRCMV  DAC  0                NO. OF BAUS TO MOVE IN BFR CLEARING
                   4784: PRECL  DAC  0                EXTENDED/COMPACT LISTING FLAG
                   4785: PRLEN  DAC  0                LENGTH OF PRINT BUFFER IN CHARS
                   4786: PROFS  DAC  0                OFFSET TO NEXT LOCATION IN PRBUF
                   4787: PRPUT  DAC  0                SET IF CHARS TO BE PUT IN BFR
                   4788: PRSTD  DAC  0                TESTED BY PRTPG
                   4789: PRSTO  DAC  0                STANDARD LISTING OPTION FLAG
                   4790: PRTEF  DAC  0                ENDFILE FLAG
                   4791: *
                   4792: *      WORK AREAS FOR PRTST, PTTST PROCEDURES
                   4793: *
                   4794: PRSVA  DAC  0                SAVE WA
                   4795: PRSVB  DAC  0                SAVE WB
                   4796: PRTVA  DAC  0                SAVE WA
                   4797: PRTVB  DAC  0                SAVE WB
                   4798: *
                   4799: *      WORK AREA FOR PRTVL
                   4800: *
                   4801: PRVSI  DAC  0                SAVE IDVAL
                   4802: *
                   4803: *      WORK AREAS FOR PATTERN MATCH ROUTINES
                   4804: *
                   4805: PSAVE  DAC  0                TEMPORARY SAVE FOR CURRENT NODE PTR
                   4806: PSAVC  DAC  0                SAVE CURSOR IN P$SPN, P$STR
                   4807:        EJC
                   4808: *
                   4809: *      FLAG TO TELL ERROR THAT WE ARE READING SOURCE LINE
                   4810: *
                   4811: RDRER  DAC  0                READ-SOURCE-LINE IN PROGRESS FLAG
                   4812: *
                   4813: *      AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
                   4814: *
                   4815: RSMEM  DAC  0                RESERVE MEMORY
                   4816: *
                   4817: *      WORK AREAS FOR RETRN ROUTINE
                   4818: *
                   4819: RTNBP  DAC  0                TO SAVE A BLOCK POINTER
                   4820: RTNFV  DAC  0                NEW FUNCTION VALUE (RESULT)
                   4821: RTNSV  DAC  0                OLD FUNCTION VALUE (SAVED VALUE)
                   4822: *
                   4823: *      RELOCATABLE GLOBAL VALUES
                   4824: *
                   4825: *      ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
                   4826: *      THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
                   4827: *      GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
                   4828: *
                   4829: R$AAA  DAC  0                START OF RELOCATABLE VALUES
                   4830: R$ARF  DAC  0                ARRAY BLOCK POINTER FOR ARREF
                   4831: R$CCB  DAC  0                PTR TO CCBLK BEING BUILT (CDWRD)
                   4832: R$CIM  DAC  0                PTR TO CURRENT COMPILER INPUT STR
                   4833: R$CMP  DAC  0                COPY OF R$CIM USED IN CMPIL
                   4834: R$CNI  DAC  0                PTR TO NEXT COMPILER INPUT STRING
                   4835: R$CNT  DAC  0                CDBLK POINTER FOR SETEXIT CONTINUE
                   4836: R$COD  DAC  0                POINTER TO CURRENT CDBLK OR EXBLK
                   4837: R$COP  DAC  0                PTR TO -COPY CHAIN STACK
                   4838: R$CTP  DAC  0                PTR TO CURRENT CTBLK FOR PATST
                   4839: R$ERT  DAC  0                TRBLK POINTER FOR ERRTYPE TRACE
                   4840: R$ETX  DAC  NULLS            POINTER TO ERRTEXT STRING
                   4841: R$EXS  DAC  0                = SAVE XL IN EXPDM
                   4842: R$FNC  DAC  0                TRBLK POINTER FOR FNCLEVEL TRACE
                   4843: R$GTC  DAC  0                KEEP CODE PTR FOR GTCOD,GTEXP
                   4844: R$IO1  DAC  0                FIRST ARGUMENT
                   4845: R$IOL  DAC  0                SECOND ARGUMENT (FILETAG) SCBLK PTR
                   4846: R$IOR  DAC  0                FILEPROPS SCBLK PTR
                   4847: R$IOT  DAC  0                TRTIO TRACE BLK PTR
                   4848: .IF    .CNBF
                   4849: .ELSE
                   4850: R$PMB  DAC  0                BUFFER PTR IN PATTERN MATCH
                   4851: .FI
                   4852: R$PMS  DAC  0                SUBJECT STRING PTR IN PATTERN MATCH
                   4853: R$RA2  DAC  0                REPLACE SECOND ARGUMENT LAST TIME
                   4854: R$RA3  DAC  0                REPLACE THIRD ARGUMENT LAST TIME
                   4855: R$RPT  DAC  0                PTR TO CTBLK REPLACE TABLE LAST USD
                   4856: R$SCP  DAC  0                SAVE POINTER FROM LAST SCANE CALL
                   4857: R$SXL  DAC  0                PRESERVE XL IN SORTC
                   4858: R$SXR  DAC  0                PRESERVE XR IN SORTA/SORTC
                   4859: R$STC  DAC  0                TRBLK POINTER FOR STCOUNT TRACE
                   4860: R$STL  DAC  0                SOURCE LISTING SUB-TITLE
                   4861: R$SXC  DAC  0                CODE (CDBLK) PTR FOR SETEXIT TRAP
                   4862: R$TTL  DAC  NULLS            SOURCE LISTING TITLE
                   4863: R$XSC  DAC  0                STRING POINTER FOR XSCAN
                   4864:        EJC
                   4865: *
                   4866: *      THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
                   4867: *      TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
                   4868: *
                   4869: R$UBA  DAC  STNDO            BINARY AT
                   4870: R$UBM  DAC  STNDO            BINARY AMPERSAND
                   4871: R$UBN  DAC  STNDO            BINARY NUMBER SIGN
                   4872: R$UBP  DAC  STNDO            BINARY PERCENT
                   4873: R$UBT  DAC  STNDO            BINARY NOT
                   4874: R$UUB  DAC  STNDO            UNARY VERTICAL BAR
                   4875: R$UUE  DAC  STNDO            UNARY EQUAL
                   4876: R$UUN  DAC  STNDO            UNARY NUMBER SIGN
                   4877: R$UUP  DAC  STNDO            UNARY PERCENT
                   4878: R$UUS  DAC  STNDO            UNARY SLASH
                   4879: R$UUX  DAC  STNDO            UNARY EXCLAMATION
                   4880: R$YYY  DAC  0                LAST RELOCATABLE LOCATION
                   4881: *
                   4882: *      WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
                   4883: *
                   4884: SBSSV  DAC  0                SAVE THIRD ARGUMENT
                   4885: *
                   4886: *      GLOBAL LOCATIONS USED IN SCAN PROCEDURE
                   4887: *
                   4888: SCNBL  DAC  0                SET NON-ZERO IF SCANNED PAST BLANKS
                   4889: SCNCC  DAC  0                NON-ZERO TO SCAN CONTROL CARD NAME
                   4890: SCNGO  DAC  0                SET NON-ZERO TO SCAN GOTO FIELD
                   4891: SCNIL  DAC  0                LENGTH OF CURRENT INPUT IMAGE
                   4892: SCNPT  DAC  0                POINTER TO NEXT LOCATION IN R$CIM
                   4893: SCNRS  DAC  0                SET NON-ZERO TO SIGNAL RESCAN
                   4894: SCNTP  DAC  0                SAVE SYNTAX TYPE FROM LAST CALL
                   4895: *
                   4896: *      WORK AREAS FOR SCAN PROCEDURE
                   4897: *
                   4898: SCNSA  DAC  0                SAVE WA
                   4899: SCNSB  DAC  0                SAVE WB
                   4900: SCNSC  DAC  0                SAVE WC
                   4901: SCNSE  DAC  0                START OF CURRENT ELEMENT
                   4902: SCNOF  DAC  0                SAVE OFFSET
                   4903: *
                   4904: *      WORK AREA FOR DETACH PROCEDURE
                   4905: *
                   4906: SDETF  DAC  0                TRACE BLOCK FLAG
                   4907: *
                   4908: *      WORK AREA FOR ENDFILE PROCEDURE
                   4909: *
                   4910: SENFR  DAC  0                SAVE XR
                   4911: .IF    .CNSR
                   4912: .ELSE
                   4913:        EJC
                   4914: *
                   4915: *      WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
                   4916: *
                   4917: SRTDF  DAC  0                DATATYPE FIELD NAME
                   4918: SRTFD  DAC  0                FOUND DFBLK ADDRESS
                   4919: SRTFF  DAC  0                FOUND FIELD NAME
                   4920: SRTFO  DAC  0                OFFSET TO FIELD NAME
                   4921: SRTNR  DAC  0                NUMBER OF ROWS
                   4922: SRTOF  DAC  0                OFFSET WITHIN ROW TO SORT KEY
                   4923: SRTRT  DAC  0                ROOT OFFSET
                   4924: SRTS1  DAC  0                SAVE OFFSET 1
                   4925: SRTS2  DAC  0                SAVE OFFSET 2
                   4926: SRTSC  DAC  0                SAVE WC
                   4927: SRTSF  DAC  0                SORT ARRAY FIRST ROW OFFSET
                   4928: SRTSN  DAC  0                SAVE N
                   4929: SRTSO  DAC  0                OFFSET TO A(0)
                   4930: SRTSR  DAC  0                0 , NON-ZERO FOR SORT, RSORT
                   4931: SRTST  DAC  0                STRIDE FROM ONE ROW TO NEXT
                   4932: SRTWC  DAC  0                DUMP WC
                   4933: .FI
                   4934: *
                   4935: *      VALUES FOR INDICATING COMPILATION/EXECUTION STAGE
                   4936: *
                   4937: STAGE  DAC  0                INITIAL VALUE = INITIAL COMPILE
                   4938: STAGX  DAC  0                NON-ZERO IF EXECUTING
                   4939: *
                   4940: *      GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
                   4941: *
                   4942: STATB  DAC  0                START OF STATIC AREA
                   4943: STATE  DAC  0                END OF STATIC AREA
                   4944:        EJC
                   4945: *
                   4946: *      GLOBAL STACK POINTER
                   4947: *
                   4948: STBAS  DAC  0                POINTER PAST STACK BASE
                   4949: *
                   4950: *      WORK AREAS FOR STOPR ROUTINE
                   4951: *
                   4952: STPSI  DIC  +0               SAVE VALUE OF STCOUNT
                   4953: STPTI  DIC  +0               SAVE TIME ELAPSED
                   4954: STPXR  DAC  0                SAVE XR
                   4955: *
                   4956: *      GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
                   4957: *
                   4958: STXOF  DAC  0                FAILURE OFFSET
                   4959: STXVR  DAC  NULLS            VRBLK POINTER OR NULL
                   4960: *
                   4961: *      WORK AREAS FOR TFIND PROCEDURE
                   4962: *
                   4963: TFNSI  DIC  +0               NUMBER OF HEADERS
                   4964: *
                   4965: *      GLOBAL VALUE FOR TIME KEEPING
                   4966: *
                   4967: TIMSX  DIC  +0               TIME AT START OF EXECUTION
                   4968: *
                   4969: *      TERMINAL BUFFER ADDRESSES, FLAGS ETC
                   4970: *
                   4971: TTBLK  DAC  0                BLANKING STRING ADRS
                   4972: TTBUF  DAC  0                BUFFER ADRS
                   4973: TTCHS  DAC  0                START OF BUFFER CHARACTERS
                   4974: TTCMV  DAC  0                COUNT OF BLANKING CHARS TO MOVE
                   4975: TTERL  DAC  0                ERROR FLAG
                   4976: TTINS  DAC  0                NON-ZERO IF STD INPUT FROM TERML
                   4977: TTLEN  DAC  0                LENGTH OF TERMINAL BUFFER
                   4978: TTLST  DAC  0                COPY STD O/P TO TERML IF SET
                   4979: TTOFS  DAC  0                OFFSET TO POSITION IN TERML BFR
                   4980: TTOUS  DAC  0                SET IF STD OUTPUT TO TERMINAL
                   4981: *
                   4982: *      WORK AREAS FOR XSCAN PROCEDURE
                   4983: *
                   4984: XSCBL  DAC  0                COUNT OF TRAILING BLANKS
                   4985: XSCNB  DAC  0                NON-ZERO IF NON-BLANKS SEEN
                   4986: XSCRT  DAC  0                SAVE RETURN CODE
                   4987: XSCWB  DAC  0                SAVE REGISTER WB
                   4988: *
                   4989: *      GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
                   4990: *
                   4991: XSOFS  DAC  0                OFFSET TO CURRENT LOCATION IN R$XSC
                   4992: *
                   4993: *      LABEL TO MARK END OF WORK AREA
                   4994: *
                   4995: YYYYY  DAC  0
                   4996:        TTL  S P I T B O L -- INITIALIZATION
                   4997: *
                   4998: *      INITIALISATION
                   4999: *      THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
                   5000: *      AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
                   5001: *
                   5002: *      (XS)                  POINTS PAST STACK BASE
                   5003: *      (XR)                  POINTS TO FIRST WORD OF DATA AREA
                   5004: *      (XL)                  POINTS TO LAST WORD OF DATA AREA
                   5005: *      (WA)                  INITIAL &CODE VALUE
                   5006: *
                   5007:        SEC                   START OF PROGRAM SECTION
                   5008: *
                   5009: INITL  RTN                   INITIALISATION CODE
                   5010:        MOV  WA,INICD         SAVE INITIAL CODE KYWD VALUE
                   5011: .IF    .CNBT
                   5012:        MOV  XR,STATB         START ADDRESS OF STATIC
                   5013: .ELSE
                   5014: *
                   5015: *      INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
                   5016: *
                   5017:        MOV  XR,WB            PRESERVE XR
                   5018:        MOV  =YYYYY,WA        POINT TO END OF WORK AREA
                   5019:        SUB  =AAAAA,WA        GET LENGTH OF WORK AREA
                   5020:        BTW  WA               CONVERT TO WORDS
                   5021:        LCT  WA,WA            COUNT FOR LOOP
                   5022:        MOV  =AAAAA,XR        SET UP INDEX REGISTER
                   5023: *
                   5024: *      CLEAR WORK SPACE
                   5025: *
                   5026: INI01  ZER  (XR)+            CLEAR A WORD
                   5027:        BCT  WA,INI01         LOOP TILL DONE
                   5028:        MOV  =STNDO,WA        UNDEFINED OPERATORS POINTER
                   5029:        MOV  =R$YYY,WC        POINT TO TABLE END
                   5030:        SUB  =R$UBA,WC        LENGTH OF UNDEF. OPERATORS TABLE
                   5031:        BTW  WC               CONVERT TO WORDS
                   5032:        LCT  WC,WC            LOOP COUNTER
                   5033:        MOV  =R$UBA,XR        SET UP XR
                   5034: *
                   5035: *      SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
                   5036: *
                   5037: INI02  MOV  WA,(XR)+         STORE VALUE
                   5038:        BCT  WC,INI02         LOOP TILL ALL DONE
                   5039:        MOV  =NUM01,WA        GET A 1
                   5040:        MOV  WA,CMPSN         STATEMENT NO
                   5041:        MOV  WA,CSWFL         NOFAIL
                   5042:        MOV  WA,CSWLS         LIST
                   5043:        MOV  WA,KVINP         INPUT
                   5044:        MOV  WA,KVOUP         OUTPUT
                   5045:        MOV  WA,LSTPF         NOTHING FOR LISTR YET
                   5046:        MOV  =INILN,WA        INPUT IMAGE LENGTH
                   5047:        MOV  WA,CSWIN         STORE FOR LATER USE
                   5048:        MOV  =B$KVT,DMPKB     DUMP
                   5049:        MOV  =TRBKV,DMPKT     DUMP
                   5050:        MOV  =P$LEN,EVLIN     EVAL
                   5051:        EJC
                   5052:        MOV  =NULLS,WA        GET NULLSTRING POINTER
                   5053:        MOV  WA,KVRTN         RETURN
                   5054:        MOV  WA,R$ETX         ERRTEXT
                   5055:        MOV  WA,R$TTL         TITLE FOR LISTING
                   5056:        MOV  WA,STXVR         SETEXIT
                   5057:        LDI  STLIM            GET DEFAULT STLIMIT
                   5058:        STI  KVSTL            STATEMENT LIMIT
                   5059:        STI  KVSTC            STATEMENT COUNT
                   5060:        MOV  WB,STATB         STORE START ADRS OF STATIC
                   5061: .FI
                   5062: .IF    .CSIG
                   5063:        MNZ  CSWCI            -CASEIG
                   5064: .FI
                   5065:        JSR  SYSTM            INITIALISE TIMER
                   5066:        STI  TIMSX            STORE TIME
                   5067:        LDI  INICD            LOAD INITIAL CODE KWD VALUE
                   5068:        STI  KVCOD            STORE
                   5069:        MOV  *E$SRS,RSMEM     RESERVE MEMORY
                   5070:        MOV  XS,STBAS         STORE STACK BASE
                   5071:        SSS  INISS            SAVE S-R STACK PTR
                   5072: *
                   5073: *      NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
                   5074: *      FOR EASY TESTING IN ALLOC ROUTINE.
                   5075: *
                   5076:        LDI  INTVH            GET 100
                   5077:        DVI  ALFSP            FORM 100 / ALFSP
                   5078:        STI  ALFSF            STORE THE FACTOR
                   5079: .IF    .CNRA
                   5080: .ELSE
                   5081: *
                   5082: *      INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
                   5083: *
                   5084:        LCT  WB,=CFP$S        LOAD COUNTER FOR SIGNIFICANT DIGITS
                   5085:        LDR  REAV1            LOAD 1.0
                   5086: *
                   5087: *      LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
                   5088: *
                   5089: INI03  MLR  REAVT            * 10.0
                   5090:        BCT  WB,INI03         LOOP TILL DONE
                   5091:        STR  GTSSC            STORE 10**(MAX SIG DIGITS)
                   5092:        LDR  REAP5            LOAD 0.5
                   5093:        DVR  GTSSC            COMPUTE 0.5*10**(MAX SIG DIGITS)
                   5094:        STR  GTSRN            STORE AS ROUNDING BIAS
                   5095: .FI
                   5096:        ZER  WC               SET TO READ PARAMETERS
                   5097:        JSR  PRPAR            READ THEM
                   5098:        EJC
                   5099: *
                   5100: *      NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
                   5101: *      NECESSARY REQUEST MORE MEMORY.
                   5102: *
                   5103:        SUB  *E$SRS,XL        ALLOW FOR RESERVE MEMORY
                   5104:        MOV  PRLEN,WA         GET PRINT BUFFER LENGTH
                   5105:        ADD  TTLEN,WA         ADD TERMINAL BUFFER LENGTH
                   5106:        ADD  WA,WA            ALLOW FOR EQUALLY BIG BLANK STRINGS
                   5107:        ADD  =CFP$A,WA        ADD NO. OF CHARS IN ALPHABET
                   5108:        ADD  =NSTMX,WA        ADD CHARS FOR GTSTG BFR
                   5109:        CTB  WA,8             CONVERT TO BAUS, ALLOWING A MARGIN
                   5110:        MOV  STATB,XR         POINT TO STATIC BASE
                   5111:        ADD  WA,XR            INCREMENT FOR ABOVE BUFFERS
                   5112:        ADD  *E$HNB,XR        INCREMENT FOR HASH TABLE
                   5113:        ADD  *E$STS,XR        BUMP FOR INITIAL STATIC BLOCK
                   5114:        JSR  SYSMX            GET MXLEN
                   5115:        MOV  WA,KVMXL         PROVISIONALLY STORE AS MAXLNGTH
                   5116:        MOV  WA,MXLEN         AND AS MXLEN
                   5117:        BGT  XR,WA,INI05      SKIP IF STATIC HI EXCEEDS MXLEN
                   5118:        MOV  WA,XR            USE MXLEN INSTEAD
                   5119:        ICA  XR               MAKE BIGGER THAN MXLEN
                   5120: *
                   5121: *      HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
                   5122: *      OF DATA AREA INTO STATIC AND DYNAMIC
                   5123: *
                   5124: INI05  MOV  XR,DNAMB         DYNAMIC BASE ADRS
                   5125:        MOV  XR,DNAMP         DYNAMIC PTR
                   5126:        BNZ  WA,INI06         SKIP IF NON-ZERO MXLEN
                   5127:        DCA  XR               POINT A WORD IN FRONT
                   5128:        MOV  XR,KVMXL         USE AS MAXLNGTH
                   5129:        MOV  XR,MXLEN         AND AS MXLEN
                   5130: *
                   5131: *      LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
                   5132: *      SO THAT DNAME IS ABOVE DNAMB
                   5133: *
                   5134: INI06  MOV  XL,DNAME         STORE DYNAMIC END ADDRESS
                   5135:        BLT  DNAMB,XL,INI08   SKIP IF HIGH ENOUGH
                   5136:        JSR  SYSMM            REQUEST MORE MEMORY
                   5137:        WTB  XR               CONVERT TO BAUS
                   5138:        ADD  XR,XL            BUMP BY AMOUNT OBTAINED
                   5139:        BNZ  XR,INI06         TRY AGAIN
                   5140:        MOV  =ENDMO,XR        POINT TO FAILURE MESSAGE
                   5141:        MOV  ENDML,WC         MESSAGE LENGTH
                   5142:        JSR  SYSPR            PRINT IT (PRTST NOT YET USABLE)
                   5143:        PPM  INI07
                   5144:        PPM  INI07
                   5145: *
                   5146: *      EMERGENCY SHUTDOWN
                   5147: *
                   5148: INI07  MOV  =KVCOD,WA        CODE KEYWORD
                   5149:        JSR  SYSEJ            PACK UP (STOPR NOT YET USABLE)
                   5150:        EJC
                   5151: *
                   5152: *      INITIALISE PRINT BUFFER WITH BLANK WORDS
                   5153: *
                   5154: INI08  MOV  PRLEN,WA         NO. OF CHARS IN PRINT BFR
                   5155:        MOV  STATB,XR         POINT TO STATIC AGAIN
                   5156:        MOV  XR,PRBUF         PRINT BFR IS PUT AT STATIC START
                   5157:        MOV  =B$SCL,(XR)+     STORE STRING TYPE CODE
                   5158:        MOV  WA,(XR)+         AND STRING LENGTH
                   5159:        MOV  XR,PRCHS         KEEP ADRS OF BUFFER PROPER
                   5160:        MOV  XR,XL            COPY IT
                   5161:        CTB  WA,0             WORDS NEEDED EXPRESSED IN BAUS
                   5162:        MOV  WA,PRCMV         KEEP FOR CLEARING BUFFER
                   5163:        MOV  XR,PRBLK         CONSTRUCT ADRS OF BLANKING STRING
                   5164:        ADD  WA,PRBLK         ADD OFFSET TO BLANKING STRING
                   5165:        ADD  WA,WA            CLEAR BOTH BFR AND BLANKING STRING
                   5166:        MOV  NULLW,(XR)+      CLEAR FIRST WORD
                   5167:        BZE  WA,INI09         SKIP IF NO PRINT BUFFER
                   5168:        DCA  WA               ADJUST FOR FIRST WORD
                   5169:        MVW                   PERFORM BLANKING
                   5170: *
                   5171: *      SET UP TERMINAL BUFFER
                   5172: *
                   5173: INI09  MOV  TTLEN,WA         LENGTH OF TERMINAL BUFFER
                   5174:        MOV  XR,TTBUF         ADRS OF TERMINAL STRING BUFFER
                   5175:        MOV  =B$SCL,(XR)+     STRING TYPE CODE
                   5176:        MOV  WA,(XR)+         STRING LENGTH
                   5177:        MOV  XR,TTCHS         KEEP ADRS OF BUFFER PROPER
                   5178:        MOV  XR,XL            COPY IT
                   5179:        CTB  WA,0             WORDS NEEDED EXPRESSED IN BAUS
                   5180:        MOV  WA,TTCMV         KEEP FOR CLEARING BUFFER
                   5181:        MOV  XR,TTBLK         CONSTRUCT ADRS OF BLANKING STRING
                   5182:        ADD  WA,TTBLK         ADD OFFSET TO BLANKING STRING
                   5183:        ADD  WA,WA            CLEAR BOTH BFR AND BLANKING STRING
                   5184:        MOV  NULLW,(XR)+      CLEAR FIRST WORD
                   5185:        BZE  WA,INI10         SKIP IF NO PRINT BUFFER
                   5186:        DCA  WA               ADJUST FOR FIRST WORD
                   5187:        MVW                   PERFORM BLANKING
                   5188: *
                   5189: *      INITIALIZE NUMBER OF HASH HEADERS
                   5190: *
                   5191: INI10  MOV  =E$HNB,WA        GET NUMBER OF HASH HEADERS
                   5192:        MTI  WA               CONVERT TO INTEGER
                   5193:        STI  HSHNB            STORE FOR USE BY GTNVR PROCEDURE
                   5194:        LCT  WA,WA            COUNTER FOR CLEARING HASH TABLE
                   5195:        MOV  XR,HSHTB         POINTER TO HASH TABLE
                   5196: *
                   5197: *      LOOP TO CLEAR HASH TABLE
                   5198: *
                   5199: INI11  ZER  (XR)+            BLANK A WORD
                   5200:        BCT  WA,INI11         LOOP
                   5201:        MOV  XR,HSHTE         END OF HASH TABLE ADRS IS KEPT
                   5202: *
                   5203: *      ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
                   5204: *
                   5205:        MOV  =NSTMX,WA        GET MAX NUM CHARS IN OUTPUT NUMBER
                   5206:        CTB  WA,SCSI$         NO OF BAUS NEEDED
                   5207:        MOV  XR,GTSWK         STORE BFR ADRS
                   5208:        ADD  WA,XR            BUMP FOR WORK BFR
                   5209:        EJC
                   5210: *
                   5211: *      BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
                   5212: *
                   5213:        MOV  XR,KVALP         SAVE ALPHABET POINTER
                   5214:        MOV  =B$SCL,(XR)      STRING BLK TYPE
                   5215:        MOV  =CFP$A,WC        NO OF CHARS IN ALPHABET
                   5216:        MOV  WC,SCLEN(XR)     STORE AS STRING LENGTH
                   5217:        MOV  WC,WB            COPY CHAR COUNT
                   5218:        CTB  WB,SCSI$         NO. OF BAUS NEEDED
                   5219:        ADD  XR,WB            CURRENT END ADDRESS FOR STATIC
                   5220:        MOV  WB,STATE         STORE STATIC END ADRS
                   5221:        LCT  WC,WC            LOOP COUNTER
                   5222:        PSC  XR               POINT TO CHARS OF STRING
                   5223:        ZER  WB               SET INITIAL CHARACTER VALUE
                   5224: *
                   5225: *      LOOP TO ENTER CHARACTER CODES IN ORDER
                   5226: *
                   5227: INI12  SCH  WB,(XR)+         STORE NEXT CODE
                   5228:        ICV  WB               BUMP CODE VALUE
                   5229:        BCT  WC,INI12         LOOP TILL ALL STORED
                   5230:        CSC  XR               COMPLETE STORE CHARACTERS
                   5231: *
                   5232: *      INITIALIZE VARIABLE BLOCKS FOR INPUT OUTPUT TERMINAL
                   5233: *
                   5234:        MOV  =V$INP,XL        POINT TO STRING /INPUT/
                   5235:        MOV  =TRTIN,WB        TRBLK TYPE FOR INPUT
                   5236:        JSR  INOUT            PERFORM INPUT ASSOCIATION
                   5237:        MOV  =V$OUP,XL        POINT TO STRING /OUTPUT/
                   5238:        MOV  =TRTOU,WB        TRBLK TYPE FOR OUTPUT
                   5239:        JSR  INOUT            PERFORM OUTPUT ASSOCIATION
                   5240:        BZE  TTLEN,INI13      SKIP IF NO TERMINAL I/O
                   5241:        MOV  =V$TER,XL        POINT TO STRING /TERMINAL/
                   5242:        MOV  =TRTOU,WB        TRTYP FOR OUTPUT
                   5243:        JSR  INOUT            PERFORM ASSOCIATION
                   5244:        MOV  =V$TER,XL
                   5245:        MOV  =TRTIN,WB        TRTYP FOR INPUT
                   5246:        JSR  INOUT            PERFORM ASSOCIATION
                   5247:        EJC
                   5248: *
                   5249: *
                   5250: *      PREPARE FOR COMPILATION
                   5251: *
                   5252: INI13  MOV  XS,FLPTR         IN CASE STACK OVERFLOWS IN COMPILER
                   5253: *
                   5254: *      NOW COMPILE SOURCE INPUT CODE
                   5255: *
                   5256:        JSR  CMPIL            CALL COMPILER
                   5257:        MOV  XR,R$COD         SET PTR TO FIRST CODE BLOCK
                   5258:        MOV  =NULLS,R$TTL     FORGET TITLE
                   5259:        MOV  =NULLS,R$STL     FORGET SUB-TITLE
                   5260:        ZER  R$CIM            FORGET COMPILER INPUT IMAGE
                   5261:        ZER  XL               CLEAR DUD VALUE
                   5262:        ZER  WB               DONT SHIFT DYNAMIC STORE UP
                   5263:        JSR  GBCOL            CLEAR GARBAGE LEFT FROM COMPILE
                   5264:        BNZ  CPSTS,INIX1      SKIP IF NO LISTING OF COMP STATS
                   5265:        JSR  PRTPG            EJECT PAGE
                   5266: *
                   5267: *      PRINT COMPILE STATISTICS
                   5268: *
                   5269:        MOV  DNAMP,WA         NEXT AVAILABLE LOC
                   5270:        SUB  STATB,WA         MINUS START
                   5271:        BTW  WA               CONVERT TO WORDS
                   5272:        MTI  WA               CONVERT TO INTEGER
                   5273:        MOV  =ENCM1,XR        POINT TO /MEMORY USED (WORDS)/
                   5274:        JSR  PRTMI            PRINT MESSAGE
                   5275:        MOV  DNAME,WA         END OF MEMORY
                   5276:        SUB  DNAMP,WA         MINUS NEXT AVAILABLE LOC
                   5277:        BTW  WA               CONVERT TO WORDS
                   5278:        MTI  WA               CONVERT TO INTEGER
                   5279:        MOV  =ENCM2,XR        POINT TO /MEMORY AVAILABLE (WORDS)/
                   5280:        JSR  PRTMI            PRINT LINE
                   5281:        MTI  CMERC            GET COUNT OF ERRORS AS INTEGER
                   5282:        MOV  =ENCM3,XR        POINT TO /COMPILE ERRORS/
                   5283:        JSR  PRTMI            PRINT IT
                   5284:        MTI  GBCNT            GARBAGE COLLECTION COUNT
                   5285:        SBI  INTV1            ADJUST FOR UNAVOIDABLE COLLECT
                   5286:        MOV  =STPM5,XR        POINT TO /STORAGE REGENERATIONS/
                   5287:        JSR  PRTMI            PRINT GBCOL COUNT
                   5288:        JSR  SYSTM            GET TIME
                   5289:        SBI  TIMSX            GET COMPILATION TIME
                   5290:        MOV  =ENCM4,XR        POINT TO COMPILATION TIME (MSEC)/
                   5291:        JSR  PRTMI            PRINT MESSAGE
                   5292:        ADD  =NUM05,LSTLC     BUMP LINE COUNT
                   5293:        EJC
                   5294: *
                   5295: *      PREPARE NOW TO START EXECUTION
                   5296: *
                   5297: *
                   5298: *      CHECK FOR NOEXECUTE
                   5299: *
                   5300: INIX1  BNZ  NOXEQ,INIX3      JUMP IF EXECUTION SUPPRESSED
                   5301:        ZER  GBCNT            INITIALISE COLLECT COUNT
                   5302:        BZE  HEADP,INIX2      SKIP IF NO PRTPG CALLS IN COMPILN
                   5303:        JSR  PRTPG            EJECT STANDARD PRINTER FILE
                   5304: *
                   5305: *      INFORM OSINT OF STAGE
                   5306: *
                   5307: INIX2  JSR  SYSBX            CALL BEFORE STARTING EXECUTION
                   5308:        ZER  -(XS)            SET FAILURE LOCATION ON STACK
                   5309:        MOV  XS,FLPTR         SAVE PTR TO FAILURE OFFSET WORD
                   5310:        MOV  R$COD,XR         LOAD PTR TO ENTRY CODE BLOCK
                   5311:        MOV  =STGXT,STAGE     SET STAGE FOR EXECUTE TIME
                   5312:        JSR  SYSTM            GET TIME
                   5313:        STI  TIMSX            STORE FOR END RUN PROCESSING
                   5314: .IF    .CNPF
                   5315: .ELSE
                   5316:        STI  PFSTM            STORE TIME FOR PROFILER
                   5317:        MOV  CMPSN,PFNTE      COPY STATEMENTS COMPILED COUNT
                   5318: .FI
                   5319:        BRI  (XR)             START XEQ WITH FIRST STATEMENT
                   5320: *
                   5321: *      HERE IF EXECUTION IS SUPPRESSED
                   5322: *
                   5323: INIX3  JSR  PRTFH            PRINT A BLANK LINE
                   5324:        MOV  =ENCM5,XR        POINT TO /EXECUTION SUPPRESSED/
                   5325:        MOV  TTERL,TTLST      TO FORCE MSG TO TERMINAL
                   5326:        JSR  PRTSF            PRINT NOEXECUTE MESSAGE
                   5327:        MOV  =KVCOD,WA        ENDING CODE
                   5328:        JSR  SYSEJ            END OF JOB, EXIT TO SYSTEM
                   5329:        TTL  S P I T B O L -- SNOBOL4 OPERATOR ROUTINES
                   5330: *
                   5331: *      THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
                   5332: *      DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
                   5333: *
                   5334: *      ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
                   5335: *      FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
                   5336: *      CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
                   5337: *
                   5338: *      SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
                   5339: *      POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
                   5340: *      ACTUAL ENTRY POINT LABEL (O$XXX).
                   5341: *
                   5342: *      THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
                   5343: *      ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
                   5344: *
                   5345: *      THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
                   5346: *
                   5347: *      (CP)                  POINTER TO NEXT CODE WORD
                   5348: *      (XS)                  CURRENT STACK POINTER
                   5349:        EJC
                   5350: *
                   5351: *      BINARY PLUS (ADDITION)
                   5352: *
                   5353: O$ADD  ENT                   ENTRY POINT
                   5354:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   5355:        ERR  001,ADDITION LEFT OPERAND IS NOT NUMERIC
                   5356:        ERR  002,ADDITION RIGHT OPERAND IS NOT NUMERIC
                   5357: .IF    .CNRA
                   5358: .ELSE
                   5359:        PPM  OADD1            JUMP IF REAL OPERANDS
                   5360: .FI
                   5361: *
                   5362: *      HERE TO ADD TWO INTEGERS
                   5363: *
                   5364:        ADI  ICVAL(XL)        ADD RIGHT OPERAND TO LEFT
                   5365:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   5366:        ERB  003,ADDITION CAUSED INTEGER OVERFLOW
                   5367: .IF    .CNRA
                   5368: .ELSE
                   5369: *
                   5370: *      HERE TO ADD TWO REALS
                   5371: *
                   5372: OADD1  ADR  RCVAL(XL)        ADD RIGHT OPERAND TO LEFT
                   5373:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   5374:        ERB  004,ADDITION CAUSED REAL OVERFLOW
                   5375: .FI
                   5376:        EJC
                   5377: *
                   5378: *      UNARY PLUS (AFFIRMATION)
                   5379: *
                   5380: O$AFF  ENT                   ENTRY POINT
                   5381:        MOV  (XS)+,XR         LOAD OPERAND
                   5382:        JSR  GTNUM            CONVERT TO NUMERIC
                   5383:        ERR  005,AFFIRMATION OPERAND IS NOT NUMERIC
                   5384:        BRN  EXIXR            RETURN IF CONVERTED TO NUMERIC
                   5385:        EJC
                   5386: *
                   5387: *      BINARY BAR (ALTERNATION)
                   5388: *
                   5389: O$ALT  ENT                   ENTRY POINT
                   5390:        MOV  (XS)+,XR         LOAD RIGHT OPERAND
                   5391:        JSR  GTPAT            CONVERT TO PATTERN
                   5392:        ERR  006,ALTERNATION RIGHT OPERAND IS NOT PATTERN
                   5393: *
                   5394: *      MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
                   5395: *
                   5396: OALT1  MOV  =P$ALT,WB        SET PCODE FOR ALTERNATIVE NODE
                   5397:        JSR  PBILD            BUILD ALTERNATIVE NODE
                   5398:        MOV  XR,XL            SAVE ADDRESS OF ALTERNATIVE NODE
                   5399:        MOV  (XS)+,XR         LOAD LEFT OPERAND
                   5400:        JSR  GTPAT            CONVERT TO PATTERN
                   5401:        ERR  007,ALTERNATION LEFT OPERAND IS NOT PATTERN
                   5402:        BEQ  XR,=P$ALT,OALT2  JUMP IF LEFT ARG IS ALTERNATION
                   5403:        MOV  XR,PTHEN(XL)     SET LEFT OPERAND AS SUCCESSOR
                   5404:        MOV  XL,XR            MOVE RESULT TO PROPER REGISTER
                   5405:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   5406: *
                   5407: *      COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
                   5408: *
                   5409: *      THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
                   5410: *
                   5411: *      (A / B) / C = A / (B / C)
                   5412: *
                   5413: OALT2  MOV  PARM1(XR),PTHEN(XL) BUILD THE (B / C) NODE
                   5414:        MOV  PTHEN(XR),-(XS)  SET A AS NEW LEFT ARG
                   5415:        MOV  XL,XR            SET (B / C) AS NEW RIGHT ARG
                   5416:        BRN  OALT1            MERGE BACK TO BUILD A / (B / C)
                   5417:        EJC
                   5418: *
                   5419: *      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
                   5420: *
                   5421: O$AMN  ENT                   ENTRY POINT
                   5422:        LCW  XR               LOAD NUMBER OF SUBSCRIPTS
                   5423:        MOV  XR,WB            SET FLAG FOR BY NAME
                   5424:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   5425: *
                   5426: *      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
                   5427: *
                   5428: O$AMV  ENT                   ENTRY POINT
                   5429:        LCW  XR               LOAD NUMBER OF SUBSCRIPTS
                   5430:        ZER  WB               SET FLAG FOR BY VALUE
                   5431:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   5432: *
                   5433: *      ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
                   5434: *
                   5435: O$AON  ENT                   ENTRY POINT
                   5436:        MOV  (XS),XR          LOAD SUBSCRIPT VALUE
                   5437:        MOV  1(XS),XL         LOAD ARRAY VALUE
                   5438:        MOV  (XL),WA          LOAD FIRST WORD OF ARRAY OPERAND
                   5439:        BEQ  WA,=B$VCT,OAON2  JUMP IF VECTOR REFERENCE
                   5440:        BEQ  WA,=B$TBT,OAON3  JUMP IF TABLE REFERENCE
                   5441: *
                   5442: *      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
                   5443: *
                   5444: OAON1  MOV  =NUM01,XR        SET NUMBER OF SUBSCRIPTS TO ONE
                   5445:        MOV  XR,WB            SET FLAG FOR BY NAME
                   5446:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   5447: *
                   5448: *      HERE IF WE HAVE A VECTOR REFERENCE
                   5449: *
                   5450: OAON2  BNE  (XR),=B$ICL,OAON1 USE LONG ROUTINE IF NOT INTEGER
                   5451:        LDI  ICVAL(XR)        LOAD INTEGER SUBSCRIPT VALUE
                   5452:        MFI  WA,EXFAL         COPY AS ADDRESS INT, FAIL IF OVFLO
                   5453:        BZE  WA,EXFAL         FAIL IF ZERO
                   5454:        ADD  =VCVLB,WA        COMPUTE OFFSET IN WORDS
                   5455:        WTB  WA               CONVERT TO BAUS
                   5456:        MOV  WA,(XS)          COMPLETE NAME ON STACK
                   5457:        BLT  WA,VCLEN(XL),EXITS EXIT IF SUBSCRIPT NOT TOO LARGE
                   5458:        BRN  EXFAL            ELSE FAIL
                   5459: *
                   5460: *      HERE FOR TABLE REFERENCE
                   5461: *
                   5462: OAON3  MNZ  WB               SET FLAG FOR NAME REFERENCE
                   5463:        JSR  TFIND            LOCATE/CREATE TABLE ELEMENT
                   5464:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   5465:        MOV  XL,1(XS)         STORE NAME BASE ON STACK
                   5466:        MOV  WA,(XS)          STORE NAME OFFSET ON STACK
                   5467:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   5468:        EJC
                   5469: *
                   5470: *      ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
                   5471: *
                   5472: O$AOV  ENT                   ENTRY POINT
                   5473:        MOV  (XS)+,XR         LOAD SUBSCRIPT VALUE
                   5474:        MOV  (XS)+,XL         LOAD ARRAY VALUE
                   5475:        MOV  (XL),WA          LOAD FIRST WORD OF ARRAY OPERAND
                   5476:        BEQ  WA,=B$VCT,OAOV2  JUMP IF VECTOR REFERENCE
                   5477:        BEQ  WA,=B$TBT,OAOV3  JUMP IF TABLE REFERENCE
                   5478: *
                   5479: *      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
                   5480: *
                   5481: OAOV1  MOV  XL,-(XS)         RESTACK ARRAY VALUE
                   5482:        MOV  XR,-(XS)         RESTACK SUBSCRIPT
                   5483:        MOV  =NUM01,XR        SET NUMBER OF SUBSCRIPTS TO ONE
                   5484:        ZER  WB               SET FLAG FOR VALUE CALL
                   5485:        BRN  ARREF            JUMP TO ARRAY REFERENCE ROUTINE
                   5486: *
                   5487: *      HERE IF WE HAVE A VECTOR REFERENCE
                   5488: *
                   5489: OAOV2  BNE  (XR),=B$ICL,OAOV1 USE LONG ROUTINE IF NOT INTEGER
                   5490:        LDI  ICVAL(XR)        LOAD INTEGER SUBSCRIPT VALUE
                   5491:        MFI  WA,EXFAL         MOVE AS ONE WORD INT, FAIL IF OVFLO
                   5492:        BZE  WA,EXFAL         FAIL IF ZERO
                   5493:        ADD  =VCVLB,WA        COMPUTE OFFSET IN WORDS
                   5494:        WTB  WA               CONVERT TO BAUS
                   5495:        BGE  WA,VCLEN(XL),EXFAL FAIL IF SUBSCRIPT TOO LARGE
                   5496:        JSR  ACESS            ACCESS VALUE
                   5497:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   5498:        BRN  EXIXR            ELSE RETURN VALUE TO CALLER
                   5499: *
                   5500: *      HERE FOR TABLE REFERENCE BY VALUE
                   5501: *
                   5502: OAOV3  ZER  WB               SET FLAG FOR VALUE REFERENCE
                   5503:        JSR  TFIND            CALL TABLE SEARCH ROUTINE
                   5504:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   5505:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   5506:        EJC
                   5507: *
                   5508: *      ASSIGNMENT (O$RPL MERGES)
                   5509: *
                   5510: O$ASS  ENT                   ENTRY POINT
                   5511:        MOV  (XS)+,WB         LOAD VALUE TO BE ASSIGNED
                   5512:        MOV  (XS)+,WA         LOAD NAME OFFSET
                   5513:        MOV  (XS),XL          LOAD NAME BASE
                   5514:        MOV  WB,(XS)          STORE ASSIGNED VALUE AS RESULT
                   5515:        JSR  ASIGN            PERFORM ASSIGNMENT
                   5516:        PPM  EXFAL            FAIL IF ASSIGNMENT FAILS
                   5517:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   5518: *
                   5519: *      COMPILATION ERROR
                   5520: *
                   5521: O$CER  ENT                   ENTRY POINT
                   5522:        ERB  008,COMPILATION ERROR ENCOUNTERED DURING EXECUTION
                   5523: *
                   5524: *      UNARY AT (CURSOR ASSIGNMENT)
                   5525: *
                   5526: O$CAS  ENT                   ENTRY POINT
                   5527:        MOV  (XS)+,WC         LOAD NAME OFFSET (PARM2)
                   5528:        MOV  (XS)+,XR         LOAD NAME BASE (PARM1)
                   5529:        MOV  =P$CAS,WB        SET PCODE FOR CURSOR ASSIGNMENT
                   5530:        JSR  PBILD            BUILD NODE
                   5531:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   5532:        EJC
                   5533: *
                   5534: *      CONCATENATION
                   5535: *
                   5536: O$CNC  ENT                   ENTRY POINT
                   5537:        MOV  (XS),XR          LOAD RIGHT ARGUMENT
                   5538:        BEQ  XR,=NULLS,OCNC3  JUMP IF RIGHT ARG IS NULL
                   5539:        MOV  1(XS),XL         LOAD LEFT ARGUMENT
                   5540:        BEQ  XL,=NULLS,OCNC4  JUMP IF LEFT ARGUMENT IS NULL
                   5541:        MOV  =B$SCL,WA        GET CONSTANT TO TEST FOR STRING
                   5542:        BNE  WA,(XL),OCNC2    JUMP IF LEFT ARG NOT A STRING
                   5543:        BNE  WA,(XR),OCNC2    JUMP IF RIGHT ARG NOT A STRING
                   5544: *
                   5545: *      MERGE HERE TO CONCATENATE TWO STRINGS
                   5546: *
                   5547: OCNC1  MOV  SCLEN(XL),WA     LOAD LEFT ARGUMENT LENGTH
                   5548:        ADD  SCLEN(XR),WA     COMPUTE RESULT LENGTH
                   5549:        JSR  ALOCS            ALLOCATE SCBLK FOR RESULT
                   5550:        MOV  XR,1(XS)         STORE RESULT PTR OVER LEFT ARGUMENT
                   5551:        PSC  XR               PREPARE TO STORE CHARS OF RESULT
                   5552:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARS IN LEFT ARG
                   5553:        PLC  XL               PREPARE TO LOAD LEFT ARG CHARS
                   5554:        MVC                   MOVE CHARACTERS OF LEFT ARGUMENT
                   5555:        MOV  (XS)+,XL         LOAD RIGHT ARG POINTER, POP STACK
                   5556:        MOV  SCLEN(XL),WA     LOAD NUMBER OF CHARS IN RIGHT ARG
                   5557:        PLC  XL               PREPARE TO LOAD RIGHT ARG CHARS
                   5558:        MVC                   MOVE CHARACTERS OF RIGHT ARGUMENT
                   5559:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   5560: *
                   5561: *      COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
                   5562: *
                   5563: OCNC2  JSR  GTSTG            CONVERT RIGHT ARG TO STRING
                   5564:        PPM  OCNC5            JUMP IF RIGHT ARG IS NOT STRING
                   5565:        MOV  XR,XL            SAVE RIGHT ARG PTR
                   5566:        JSR  GTSTG            CONVERT LEFT ARG TO STRING
                   5567:        PPM  OCNC6            JUMP IF LEFT ARG IS NOT A STRING
                   5568:        MOV  XR,-(XS)         STACK LEFT ARGUMENT
                   5569:        MOV  XL,-(XS)         STACK RIGHT ARGUMENT
                   5570:        MOV  XR,XL            MOVE LEFT ARG TO PROPER REG
                   5571:        MOV  (XS),XR          MOVE RIGHT ARG TO PROPER REG
                   5572:        BRN  OCNC1            MERGE BACK TO CONCATENATE STRINGS
                   5573:        EJC
                   5574: *
                   5575: *      CONCATENATION (CONTINUED)
                   5576: *
                   5577: *      COME HERE FOR NULL RIGHT ARGUMENT
                   5578: *
                   5579: OCNC3  ICA  XS               REMOVE RIGHT ARG FROM STACK
                   5580:        BRN  EXITS            RETURN WITH LEFT ARGUMENT ON STACK
                   5581: *
                   5582: *      HERE FOR NULL LEFT ARGUMENT
                   5583: *
                   5584: OCNC4  ICA  XS               UNSTACK ONE ARGUMENT
                   5585:        MOV  XR,(XS)          STORE RIGHT ARGUMENT
                   5586:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   5587: *
                   5588: *      HERE IF RIGHT ARGUMENT IS NOT A STRING
                   5589: *
                   5590: OCNC5  MOV  XR,XL            MOVE RIGHT ARGUMENT PTR
                   5591:        MOV  (XS)+,XR         LOAD LEFT ARG POINTER
                   5592: *
                   5593: *      MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
                   5594: *
                   5595: OCNC6  JSR  GTPAT            CONVERT LEFT ARG TO PATTERN
                   5596:        ERR  009,CONCATENATION LEFT OPND IS NOT STRING OR PATTERN
                   5597:        MOV  XR,-(XS)         SAVE RESULT ON STACK
                   5598:        MOV  XL,XR            POINT TO RIGHT OPERAND
                   5599:        JSR  GTPAT            CONVERT TO PATTERN
                   5600:        ERR  010,CONCATENATION RIGHT OPD IS NOT STRING OR PATTERN
                   5601:        MOV  XR,XL            MOVE FOR PCONC
                   5602:        MOV  (XS)+,XR         RELOAD LEFT OPERAND PTR
                   5603:        JSR  PCONC            CONCATENATE PATTERNS
                   5604:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   5605:        EJC
                   5606: *
                   5607: *      COMPLEMENTATION
                   5608: *
                   5609: O$COM  ENT                   ENTRY POINT
                   5610:        MOV  (XS)+,XR         LOAD OPERAND
                   5611:        MOV  (XR),WA          LOAD TYPE WORD
                   5612: *
                   5613: *      MERGE BACK HERE AFTER CONVERSION
                   5614: *
                   5615: OCOM1  BEQ  WA,=B$ICL,OCOM2  JUMP IF INTEGER
                   5616: .IF    .CNRA
                   5617: .ELSE
                   5618:        BEQ  WA,=B$RCL,OCOM3  JUMP IF REAL
                   5619: .FI
                   5620:        JSR  GTNUM            ELSE CONVERT TO NUMERIC
                   5621:        ERR  011,COMPLEMENTATION OPERAND IS NOT NUMERIC
                   5622:        BRN  OCOM1            BACK TO CHECK CASES
                   5623: *
                   5624: *      HERE TO COMPLEMENT INTEGER
                   5625: *
                   5626: OCOM2  LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   5627:        NGI                   NEGATE
                   5628:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   5629:        ERB  012,COMPLEMENTATION CAUSED INTEGER OVERFLOW
                   5630: .IF    .CNRA
                   5631: .ELSE
                   5632: *
                   5633: *      HERE TO COMPLEMENT REAL
                   5634: *
                   5635: OCOM3  LDR  RCVAL(XR)        LOAD REAL VALUE
                   5636:        NGR                   NEGATE
                   5637:        BRN  EXREA            RETURN REAL RESULT
                   5638: .FI
                   5639:        EJC
                   5640: *
                   5641: *      BINARY SLASH (DIVISION)
                   5642: *
                   5643: O$DVD  ENT                   ENTRY POINT
                   5644:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   5645:        ERR  013,DIVISION LEFT OPERAND IS NOT NUMERIC
                   5646:        ERR  014,DIVISION RIGHT OPERAND IS NOT NUMERIC
                   5647: .IF    .CNRA
                   5648: .ELSE
                   5649:        PPM  ODVD2            JUMP IF REAL OPERANDS
                   5650: .FI
                   5651: *
                   5652: *      HERE TO DIVIDE TWO INTEGERS
                   5653: *
                   5654:        DVI  ICVAL(XL)        DIVIDE LEFT OPERAND BY RIGHT
                   5655:        INO  EXINT            RESULT OK IF NO OVERFLOW
                   5656:        ERB  015,DIVISION CAUSED INTEGER OVERFLOW
                   5657: .IF    .CNRA
                   5658: .ELSE
                   5659: *
                   5660: *      HERE TO DIVIDE TWO REALS
                   5661: *
                   5662: ODVD2  DVR  RCVAL(XL)        DIVIDE LEFT OPERAND BY RIGHT
                   5663:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   5664:        ERB  016,DIVISION CAUSED REAL OVERFLOW
                   5665: .FI
                   5666:        EJC
                   5667: *
                   5668: *      EXPONENTIATION
                   5669: *
                   5670: O$EXP  ENT                   ENTRY POINT
                   5671:        MOV  (XS)+,XR         LOAD EXPONENT
                   5672:        JSR  GTNUM            CONVERT TO NUMBER
                   5673:        ERR  017,EXPONENTIATION RIGHT OPERAND IS NOT NUMERIC
                   5674: .IF    .CNRA
                   5675: .ELSE
                   5676:        BNE  WA,=B$ICL,OEXP7  JUMP IF REAL
                   5677: .FI
                   5678:        MOV  XR,XL            MOVE EXPONENT
                   5679:        MOV  (XS)+,XR         LOAD BASE
                   5680:        JSR  GTNUM            CONVERT TO NUMERIC
                   5681:        ERR  018,EXPONENTIATION LEFT OPERAND IS NOT NUMERIC
                   5682:        LDI  ICVAL(XL)        LOAD EXPONENT
                   5683:        ILT  OEXP8            ERROR IF NEGATIVE EXPONENT
                   5684: .IF    .CNRA
                   5685: .ELSE
                   5686:        BEQ  WA,=B$RCL,OEXP3  JUMP IF BASE IS REAL
                   5687: .FI
                   5688: *
                   5689: *      HERE TO EXPONENTIATE AN INTEGER
                   5690: *
                   5691:        MFI  WA,OEXP2         CONVERT EXPONENT TO 1 WORD INTEGER
                   5692:        LCT  WA,WA            SET LOOP COUNTER
                   5693:        LDI  INTV1            LOAD INITIAL VALUE OF 1
                   5694:        BNZ  WA,OEXP1         JUMP IF NON-ZERO EXPONENT
                   5695:        INE  EXINT            GIVE ZERO AS RESULT FOR NONZERO**0
                   5696:        BRN  OEXP4            ELSE ERROR OF 0**0
                   5697: *
                   5698: *      LOOP TO PERFORM EXPONENTIATION
                   5699: *
                   5700: OEXP1  MLI  ICVAL(XR)        MULTIPLY BY BASE
                   5701:        IOV  OEXP2            JUMP IF OVERFLOW
                   5702:        BCT  WA,OEXP1         LOOP BACK TILL COMPUTATION COMPLETE
                   5703:        BRN  EXINT            THEN RETURN INTEGER RESULT
                   5704: *
                   5705: *      HERE IF INTEGER OVERFLOW
                   5706: *
                   5707: OEXP2  ERB  019,EXPONENTIATION CAUSED INTEGER OVERFLOW
                   5708:        EJC
                   5709: *
                   5710: *      EXPONENTIATION (CONTINUED)
                   5711: .IF    .CNRA
                   5712: .ELSE
                   5713: *
                   5714: *      HERE TO EXPONENTIATE A REAL
                   5715: *
                   5716: OEXP3  MFI  WA,OEXP6         CONVERT EXPONENT TO ONE WORD
                   5717:        LCT  WA,WA            SET LOOP COUNTER
                   5718:        LDR  REAV1            LOAD 1.0 AS INITIAL VALUE
                   5719:        BNZ  WA,OEXP5         JUMP IF NON-ZERO EXPONENT
                   5720:        RNE  EXREA            RETURN 1.0 IF NONZERO**ZERO
                   5721: .FI
                   5722: *
                   5723: *      HERE FOR ERROR OF 0**0 OR 0.0**0
                   5724: *
                   5725: OEXP4  ERB  020,EXPONENTIATION RESULT IS UNDEFINED
                   5726: .IF    .CNRA
                   5727: .ELSE
                   5728: *
                   5729: *      LOOP TO PERFORM EXPONENTIATION
                   5730: *
                   5731: OEXP5  MLR  RCVAL(XR)        MULTIPLY BY BASE
                   5732:        ROV  OEXP6            JUMP IF OVERFLOW
                   5733:        BCT  WA,OEXP5         LOOP TILL COMPUTATION COMPLETE
                   5734:        BRN  EXREA            THEN RETURN REAL RESULT
                   5735: *
                   5736: *      HERE IF REAL OVERFLOW
                   5737: *
                   5738: OEXP6  ERB  021,EXPONENTIATION CAUSED REAL OVERFLOW
                   5739: *
                   5740: *      HERE IF REAL EXPONENT
                   5741: *
                   5742: OEXP7  ERB  022,EXPONENTIATION RIGHT OPERAND IS REAL NOT INTEGER
                   5743: .FI
                   5744: *
                   5745: *      HERE FOR NEGATIVE EXPONENT
                   5746: *
                   5747: OEXP8  ERB  023,EXPONENTIATION RIGHT OPERAND IS NEGATIVE
                   5748:        EJC
                   5749: *
                   5750: *      FAILURE IN EXPRESSION EVALUATION
                   5751: *
                   5752: *      THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
                   5753: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
                   5754: *      CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
                   5755: *
                   5756: O$FEX  ENT                   ENTRY POINT
                   5757:        JMG  EVLXF            JUMP TO FAILURE LOC IN EVALX
                   5758: *
                   5759: *      FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
                   5760: *
                   5761: O$FIF  ENT                   ENTRY POINT
                   5762:        ERB  024,GOTO EVALUATION FAILURE
                   5763: *
                   5764: *      FUNCTION CALL (MORE THAN ONE ARGUMENT)
                   5765: *
                   5766: O$FNC  ENT                   ENTRY POINT
                   5767:        LCW  WA               LOAD NUMBER OF ARGUMENTS
                   5768:        LCW  XR               LOAD FUNCTION VRBLK POINTER
                   5769:        MOV  VRFNC(XR),XL     LOAD FUNCTION POINTER
                   5770:        BNE  WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
                   5771:        BRI  (XL)             JUMP TO FUNCTION IF ARG COUNT OK
                   5772: *
                   5773: *      FUNCTION NAME ERROR
                   5774: *
                   5775: O$FNE  ENT                   ENTRY POINT
                   5776:        LCW  WA               GET NEXT CODE WORD
                   5777:        BNE  WA,=ORNM$,OFNE1  FAIL IF NOT EVALUATING EXPRESSION
                   5778:        BNZ  2(XS),OFNE1      FAIL UNLESS EXPRN WANTED BY VALUE
                   5779:        JMG  EVLXV            JOIN EXPRESSION BY VALUE CODE
                   5780: *
                   5781: *      HERE FOR ERROR
                   5782: *
                   5783: OFNE1  ERB  025,FUNCTION CALLED BY NAME RETURNED A VALUE
                   5784: *
                   5785: *      FUNCTION CALL (SINGLE ARGUMENT)
                   5786: *
                   5787: O$FNS  ENT                   ENTRY POINT
                   5788:        LCW  XR               LOAD FUNCTION VRBLK POINTER
                   5789:        MOV  =NUM01,WA        SET NUMBER OF ARGUMENTS TO ONE
                   5790:        MOV  VRFNC(XR),XL     LOAD FUNCTION POINTER
                   5791:        BNE  WA,FARGS(XL),CFUNC USE CENTRAL ROUTINE IF WRONG NUM
                   5792:        BRI  (XL)             JUMP TO FUNCTION IF ARG COUNT OK
                   5793:        EJC
                   5794: *      CALL TO UNDEFINED FUNCTION
                   5795: *
                   5796: O$FUN  ENT                   ENTRY POINT
                   5797:        ERB  026,UNDEFINED FUNCTION CALLED
                   5798: *
                   5799: *      EXECUTE COMPLEX GOTO
                   5800: *
                   5801: O$GOC  ENT                   ENTRY POINT
                   5802:        MOV  1(XS),XR         LOAD NAME BASE POINTER
                   5803:        BHI  XR,STATE,OGOC1   JUMP IF NOT NATURAL VARIABLE
                   5804:        ADD  *VRTRA,XR        ELSE POINT TO VRTRA FIELD
                   5805:        BRI  (XR)             AND JUMP THROUGH IT
                   5806: *
                   5807: *      HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
                   5808: *
                   5809: OGOC1  ERB  027,GOTO OPERAND IS NOT A NATURAL VARIABLE
                   5810: *
                   5811: *      EXECUTE DIRECT GOTO
                   5812: *
                   5813: O$GOD  ENT                   ENTRY POINT
                   5814:        MOV  (XS),XR          LOAD OPERAND
                   5815:        MOV  (XR),WA          LOAD FIRST WORD
                   5816:        BEQ  WA,=B$CDC,OGOD1  JUMP IF CODE BLOCK
                   5817:        BEQ  WA,=B$CDS,OGOD2  JUMP IF CODE BLOCK
                   5818:        ERB  028,GOTO OPERAND IN DIRECT GOTO IS NOT CODE
                   5819: *
                   5820: *      CASE OF COMPLEX FAILURE CODE
                   5821: *
                   5822: OGOD1  MOV  FLPTR,XS         POP GARBAGE OFF STACK
                   5823:        MOV  CDFAL(XR),(XS)   SET NEW FAILURE OFFSET
                   5824:        BRN  STMGO            JUMP TO EXECUTE CODE
                   5825: *
                   5826: *      CASE OF SIMPLE FAILURE CODE
                   5827: *
                   5828: OGOD2  MOV  FLPTR,XS         POP GARBAGE OFF STACK
                   5829:        MOV  *CDFAL,(XS)      SET NEW FAILURE OFFSET
                   5830:        BRN  STMGO            JUMP TO EXECUTE CODE
                   5831: *
                   5832: *      SET GOTO FAILURE TRAP
                   5833: *
                   5834: *      THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
                   5835: *      DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
                   5836: *
                   5837: O$GOF  ENT                   ENTRY POINT
                   5838:        MOV  FLPTR,XR         POINT TO FAIL OFFSET ON STACK
                   5839:        ICA  (XR)             POINT FAILURE TO O$FIF WORD
                   5840:        ICP                   POINT TO NEXT CODE WORD
                   5841:        BRN  EXITS            EXIT TO CONTINUE
                   5842:        EJC
                   5843: *
                   5844: *      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
                   5845: *
                   5846: *      THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
                   5847: *      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
                   5848: *      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
                   5849: *
                   5850: O$IMA  ENT                   ENTRY POINT
                   5851:        MOV  =P$IMC,WB        SET PCODE FOR LAST NODE
                   5852:        MOV  (XS)+,WC         POP NAME OFFSET (PARM2)
                   5853:        MOV  (XS)+,XR         POP NAME BASE (PARM1)
                   5854:        JSR  PBILD            BUILD P$IMC NODE
                   5855:        MOV  XR,XL            SAVE PTR TO NODE
                   5856:        MOV  (XS),XR          LOAD LEFT ARGUMENT
                   5857:        JSR  GTPAT            CONVERT TO PATTERN
                   5858:        ERR  029,IMMEDIATE ASSIGNMENT LEFT OPERAND IS NOT PATTERN
                   5859:        MOV  XR,(XS)          SAVE PTR TO LEFT OPERAND PATTERN
                   5860:        MOV  =P$IMA,WB        SET PCODE FOR FIRST NODE
                   5861:        JSR  PBILD            BUILD P$IMA NODE
                   5862:        MOV  (XS)+,PTHEN(XR)  SET LEFT OPERAND AS P$IMA SUCCESSOR
                   5863:        JSR  PCONC            CONCATENATE TO FORM FINAL PATTERN
                   5864:        BRN  EXIXR            ALL DONE
                   5865: *
                   5866: *      INDIRECTION (BY NAME)
                   5867: *
                   5868: O$INN  ENT                   ENTRY POINT
                   5869:        MNZ  WB               SET FLAG FOR RESULT BY NAME
                   5870:        BRN  INDIR            JUMP TO COMMON ROUTINE
                   5871: *
                   5872: *      INTERROGATION
                   5873: *
                   5874: O$INT  ENT                   ENTRY POINT
                   5875:        MOV  =NULLS,(XS)      REPLACE OPERAND WITH NULL
                   5876:        BRN  EXITS            EXIT FOR NEXT CODE WORD
                   5877: *
                   5878: *      INDIRECTION (BY VALUE)
                   5879: *
                   5880: O$INV  ENT                   ENTRY POINT
                   5881:        ZER  WB               SET FLAG FOR BY VALUE
                   5882:        BRN  INDIR            JUMP TO COMMON ROUTINE
                   5883:        EJC
                   5884: *
                   5885: *      KEYWORD REFERENCE (BY NAME)
                   5886: *
                   5887: O$KWN  ENT                   ENTRY POINT
                   5888:        JSR  KWNAM            GET KEYWORD NAME
                   5889:        BRN  EXNAM            EXIT WITH RESULT NAME
                   5890: *
                   5891: *      KEYWORD REFERENCE (BY VALUE)
                   5892: *
                   5893: O$KWV  ENT                   ENTRY POINT
                   5894:        JSR  KWNAM            GET KEYWORD NAME
                   5895:        MOV  XR,DNAMP         DELETE KVBLK
                   5896:        JSR  ACESS            ACCESS VALUE
                   5897:        PPM  EXNUL            DUMMY (UNUSED) FAILURE RETURN
                   5898:        BRN  EXIXR            JUMP WITH VALUE IN XR
                   5899: *
                   5900: *      LOAD EXPRESSION BY NAME
                   5901: *
                   5902: O$LEX  ENT                   ENTRY POINT
                   5903:        MOV  *EVSI$,WA        SET SIZE OF EVBLK
                   5904:        JSR  ALLOC            ALLOCATE SPACE FOR EVBLK
                   5905:        MOV  =B$EVT,(XR)      SET TYPE WORD
                   5906:        MOV  =TRBEV,EVVAR(XR) SET DUMMY TRBLK POINTER
                   5907:        LCW  WA               LOAD EXBLK POINTER
                   5908:        MOV  WA,EVEXP(XR)     SET EXBLK POINTER
                   5909:        MOV  XR,XL            MOVE NAME BASE TO PROPER REG
                   5910:        MOV  *EVVAR,WA        SET NAME OFFSET = ZERO
                   5911:        BRN  EXNAM            EXIT WITH NAME IN (XL,WA)
                   5912: *
                   5913: *      LOAD PATTERN VALUE
                   5914: *
                   5915: O$LPT  ENT                   ENTRY POINT
                   5916:        LCW  XR               LOAD PATTERN POINTER
                   5917:        BRN  EXIXR            STACK PTR AND OBEY NEXT CODE WORD
                   5918:        EJC
                   5919: *
                   5920: *      LOAD VARIABLE NAME
                   5921: *
                   5922: O$LVN  ENT                   ENTRY POINT
                   5923:        LCW  WA               LOAD VRBLK POINTER
                   5924:        MOV  WA,-(XS)         STACK VRBLK PTR (NAME BASE)
                   5925:        MOV  *VRVAL,-(XS)     STACK NAME OFFSET
                   5926:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   5927: *
                   5928: *      BINARY ASTERISK (MULTIPLICATION)
                   5929: *
                   5930: O$MLT  ENT                   ENTRY POINT
                   5931:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   5932:        ERR  030,MULTIPLICATION LEFT OPERAND IS NOT NUMERIC
                   5933:        ERR  031,MULTIPLICATION RIGHT OPERAND IS NOT NUMERIC
                   5934: .IF    .CNRA
                   5935: .ELSE
                   5936:        PPM  OMLT1            JUMP IF REAL OPERANDS
                   5937: .FI
                   5938: *
                   5939: *      HERE TO MULTIPLY TWO INTEGERS
                   5940: *
                   5941:        MLI  ICVAL(XL)        MULTIPLY LEFT OPERAND BY RIGHT
                   5942:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   5943:        ERB  032,MULTIPLICATION CAUSED INTEGER OVERFLOW
                   5944: .IF    .CNRA
                   5945: .ELSE
                   5946: *
                   5947: *      HERE TO MULTIPLY TWO REALS
                   5948: *
                   5949: OMLT1  MLR  RCVAL(XL)        MULTIPLY LEFT OPERAND BY RIGHT
                   5950:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   5951:        ERB  033,MULTIPLICATION CAUSED REAL OVERFLOW
                   5952: .FI
                   5953: *
                   5954: *      NAME REFERENCE
                   5955: *
                   5956: O$NAM  ENT                   ENTRY POINT
                   5957:        MOV  *NMSI$,WA        SET LENGTH OF NMBLK
                   5958:        JSR  ALLOC            ALLOCATE NMBLK
                   5959:        MOV  =B$NML,(XR)      SET NAME BLOCK CODE
                   5960:        MOV  (XS)+,NMOFS(XR)  SET NAME OFFSET FROM OPERAND
                   5961:        MOV  (XS)+,NMBAS(XR)  SET NAME BASE FROM OPERAND
                   5962:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   5963:        EJC
                   5964: *
                   5965: *      NEGATION
                   5966: *
                   5967: *      INITIAL ENTRY
                   5968: *
                   5969: O$NTA  ENT                   ENTRY POINT
                   5970:        LCW  WA               LOAD NEW FAILURE OFFSET
                   5971:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   5972:        MOV  WA,-(XS)         STACK NEW FAILURE OFFSET
                   5973:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   5974:        BRN  EXITS            JUMP TO CONTINUE EXECUTION
                   5975: *
                   5976: *      ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
                   5977: *
                   5978: O$NTB  ENT                   ENTRY POINT
                   5979:        MOV  2(XS),FLPTR      RESTORE OLD FAILURE POINTER
                   5980:        BRN  EXFAL            AND FAIL
                   5981: *
                   5982: *      ENTRY FOR FAILURE DURING OPERAND EVALUATION
                   5983: *
                   5984: O$NTC  ENT                   ENTRY POINT
                   5985:        ICA  XS               POP FAILURE OFFSET
                   5986:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   5987:        BRN  EXNUL            EXIT GIVING NULL RESULT
                   5988: *
                   5989: *      USE OF UNDEFINED OPERATOR
                   5990: *
                   5991: O$OUN  ENT                   ENTRY POINT
                   5992:        ERB  034,UNDEFINED OPERATOR REFERENCED
                   5993: *
                   5994: *      BINARY DOT (PATTERN ASSIGNMENT)
                   5995: *
                   5996: *      THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
                   5997: *      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
                   5998: *      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
                   5999: *
                   6000: O$PAS  ENT                   ENTRY POINT
                   6001:        MOV  =P$PAC,WB        LOAD PCODE FOR P$PAC NODE
                   6002:        MOV  (XS)+,WC         LOAD NAME OFFSET (PARM2)
                   6003:        MOV  (XS)+,XR         LOAD NAME BASE (PARM1)
                   6004:        JSR  PBILD            BUILD P$PAC NODE
                   6005:        MOV  XR,XL            SAVE PTR TO NODE
                   6006:        MOV  (XS),XR          LOAD LEFT OPERAND
                   6007:        JSR  GTPAT            CONVERT TO PATTERN
                   6008:        ERR  035,PATTERN ASSIGNMENT LEFT OPERAND IS NOT PATTERN
                   6009:        MOV  XR,(XS)          SAVE PTR TO LEFT OPERAND PATTERN
                   6010:        MOV  =P$PAA,WB        SET PCODE FOR P$PAA NODE
                   6011:        JSR  PBILD            BUILD P$PAA NODE
                   6012:        MOV  (XS)+,PTHEN(XR)  SET LEFT OPERAND AS P$PAA SUCCESSOR
                   6013:        JSR  PCONC            CONCATENATE TO FORM FINAL PATTERN
                   6014:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   6015:        EJC
                   6016: *
                   6017: *      PATTERN MATCH (BY NAME, FOR REPLACEMENT)
                   6018: *
                   6019: O$PMN  ENT                   ENTRY POINT
                   6020:        ZER  WB               SET TYPE CODE FOR MATCH BY NAME
                   6021:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
                   6022: *
                   6023: *      PATTERN MATCH (STATEMENT)
                   6024: *
                   6025: *      O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
                   6026: *      OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
                   6027: *      CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
                   6028: *
                   6029: O$PMS  ENT                   ENTRY POINT
                   6030:        MOV  =NUM02,WB        SET FLAG FOR STATEMENT TO MATCH
                   6031:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
                   6032: *
                   6033: *      PATTERN MATCH (BY VALUE)
                   6034: *
                   6035: O$PMV  ENT                   ENTRY POINT
                   6036:        MOV  =NUM01,WB        SET TYPE CODE FOR VALUE MATCH
                   6037:        BRN  MATCH            JUMP TO ROUTINE TO START MATCH
                   6038: *
                   6039: *      POP TOP ITEM ON STACK
                   6040: *
                   6041: O$POP  ENT                   ENTRY POINT
                   6042:        ICA  XS               POP TOP STACK ENTRY
                   6043:        BRN  EXITS            OBEY NEXT CODE WORD
                   6044: *
                   6045: *      TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
                   6046: *
                   6047: O$STP  ENT                   ENTRY POINT
                   6048:        MOV  =ENDMS,XR        ENDING MESSAGE
                   6049:        ZER  WA               NO ERROR CODE
                   6050:        BRN  STOPR            STOP THE RUN
                   6051: *
                   6052: *      RETURN NAME FROM EXPRESSION
                   6053: *      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
                   6054: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
                   6055: *      A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
                   6056: *
                   6057: O$RNM  ENT                   ENTRY POINT
                   6058:        JMG  EVLXN            RETURN TO EVALX PROCEDURE
                   6059:        EJC
                   6060: *
                   6061: *      PATTERN REPLACEMENT
                   6062: *
                   6063: *      WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
                   6064: *      ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
                   6065: *
                   6066: *                            SUBJECT NAME BASE
                   6067: *                            SUBJECT NAME OFFSET
                   6068: *                            INITIAL CURSOR VALUE
                   6069: *                            FINAL CURSOR VALUE
                   6070: *                            SUBJECT STRING POINTER
                   6071: *      (XS) ---------------- REPLACEMENT VALUE
                   6072: *
                   6073: O$RPL  ENT                   ENTRY POINT
                   6074:        JSR  GTSTG            CONVERT REPLACEMENT VAL TO STRING
                   6075:        ERR  036,PATTERN REPLACEMENT RIGHT OPERAND IS NOT STRING
                   6076: *
                   6077: *      GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
                   6078: *
                   6079:        MOV  (XS),XL          LOAD SUBJECT STRING POINTER
                   6080: .IF    .CNBF
                   6081: .ELSE
                   6082:        BEQ  (XL),=B$BCT,ORPL5 BRANCH IF BUFFER ASSIGNMENT
                   6083: .FI
                   6084:        ADD  SCLEN(XL),WA     ADD SUBJECT STRING LENGTH
                   6085:        ADD  2(XS),WA         ADD STARTING CURSOR
                   6086:        SUB  1(XS),WA         MINUS FINAL CURSOR = TOTAL LENGTH
                   6087:        BZE  WA,ORPL3         JUMP IF RESULT IS NULL
                   6088:        MOV  XR,-(XS)         RESTACK REPLACEMENT STRING
                   6089:        JSR  ALOCS            ALLOCATE SCBLK FOR RESULT
                   6090:        MOV  3(XS),WA         GET INITIAL CURSOR (PART 1 LEN)
                   6091:        MOV  XR,3(XS)         STACK RESULT POINTER
                   6092:        PSC  XR               POINT TO CHARACTERS OF RESULT
                   6093: *
                   6094: *      MOVE PART 1 (START OF SUBJECT) TO RESULT
                   6095: *
                   6096:        BZE  WA,ORPL1         JUMP IF FIRST PART IS NULL
                   6097:        MOV  1(XS),XL         ELSE POINT TO SUBJECT STRING
                   6098:        PLC  XL               POINT TO SUBJECT STRING CHARS
                   6099:        MVC                   MOVE FIRST PART TO RESULT
                   6100:        EJC
                   6101: *      PATTERN REPLACEMENT (CONTINUED)
                   6102: *
                   6103: *      NOW MOVE IN REPLACEMENT VALUE
                   6104: *
                   6105: ORPL1  MOV  (XS)+,XL         LOAD REPLACEMENT STRING, POP
                   6106:        MOV  SCLEN(XL),WA     LOAD LENGTH
                   6107:        BZE  WA,ORPL2         JUMP IF NULL REPLACEMENT
                   6108:        PLC  XL               ELSE POINT TO CHARS OF REPLACEMENT
                   6109:        MVC                   MOVE IN CHARS (PART 2)
                   6110: *
                   6111: *      NOW MOVE IN REMAINDER OF STRING (PART 3)
                   6112: *
                   6113: ORPL2  MOV  (XS)+,XL         LOAD SUBJECT STRING POINTER, POP
                   6114:        MOV  (XS)+,WC         LOAD FINAL CURSOR, POP
                   6115:        MOV  SCLEN(XL),WA     LOAD SUBJECT STRING LENGTH
                   6116:        SUB  WC,WA            MINUS FINAL CURSOR = PART 3 LENGTH
                   6117:        BZE  WA,ORPL4         JUMP TO ASSIGN IF PART 3 IS NULL
                   6118:        PLC  XL,WC            ELSE POINT TO LAST PART OF STRING
                   6119:        MVC                   MOVE PART 3 TO RESULT
                   6120:        BRN  ORPL4            JUMP TO PERFORM ASSIGNMENT
                   6121: *
                   6122: *      HERE IF RESULT IS NULL
                   6123: *
                   6124: ORPL3  ADD  *NUM02,XS        POP SUBJECT STR PTR, FINAL CURSOR
                   6125:        MOV  =NULLS,(XS)      SET NULL RESULT
                   6126: *
                   6127: *      MERGE WITH ASSIGNMENT ROUTINE
                   6128: *
                   6129: ORPL4  MOV  =O$ASS,XL        CONTINUATION ROUTINE
                   6130:        BRI  XL               ENTER ROUTINE
                   6131: .IF    .CNBF
                   6132: .ELSE
                   6133: *
                   6134: *      HERE FOR BUFFER SUBSTRING ASSIGNMENT
                   6135: *
                   6136: ORPL5  MOV  XR,XL            COPY SCBLK REPLACEMENT PTR
                   6137:        MOV  (XS)+,XR         UNSTACK BCBLK PTR
                   6138:        MOV  (XS)+,WB         GET FINAL CURSOR VALUE
                   6139:        MOV  (XS)+,WA         GET INITIAL CURSOR
                   6140:        SUB  WA,WB            GET LENGTH IN WB
                   6141:        ADD  *NUM02,XS        GET RID OF NAME BASE/OFFSET
                   6142:        JSR  INSBF            INSERT SUBSTRING
                   6143:        PPM                   CONVERT FAIL IMPOSSIBLE
                   6144:        PPM  EXFAL            FAIL IF INSERT FAILS
                   6145:        BRN  EXNUL            ELSE NULL RESULT
                   6146: .FI
                   6147:        EJC
                   6148: *
                   6149: *      RETURN VALUE FROM EXPRESSION
                   6150: *
                   6151: *      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
                   6152: *      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
                   6153: *      A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
                   6154: *
                   6155: O$RVL  ENT                   ENTRY POINT
                   6156:        BRN  EVLXV            RETURN TO EVALX PROCEDURE
                   6157:        EJC
                   6158: *
                   6159: *      SELECTION
                   6160: *
                   6161: *      INITIAL ENTRY
                   6162: *
                   6163: O$SLA  ENT                   ENTRY POINT
                   6164:        LCW  WA               LOAD NEW FAILURE OFFSET
                   6165:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   6166:        MOV  WA,-(XS)         STACK NEW FAILURE OFFSET
                   6167:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   6168:        BRN  EXITS            JUMP TO EXECUTE FIRST ALTERNATIVE
                   6169: *
                   6170: *      ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
                   6171: *
                   6172: O$SLB  ENT                   ENTRY POINT
                   6173:        MOV  (XS)+,XR         LOAD RESULT
                   6174:        ICA  XS               POP FAIL OFFSET
                   6175:        MOV  (XS),FLPTR       RESTORE OLD FAILURE POINTER
                   6176:        MOV  XR,(XS)          RESTACK RESULT
                   6177:        LCW  WA               LOAD NEW CODE OFFSET
                   6178:        ADD  R$COD,WA         POINT TO ABSOLUTE CODE LOCATION
                   6179:        LCP  WA               SET NEW CODE POINTER
                   6180:        BRN  EXITS            JUMP TO CONTINUE PAST SELECTION
                   6181: *
                   6182: *      ENTRY AT START OF SUBSEQUENT ALTERNATIVES
                   6183: *
                   6184: O$SLC  ENT                   ENTRY POINT
                   6185:        LCW  WA               LOAD NEW FAIL OFFSET
                   6186:        MOV  WA,(XS)          STORE NEW FAIL OFFSET
                   6187:        BRN  EXITS            JUMP TO EXECUTE NEXT ALTERNATIVE
                   6188: *
                   6189: *      ENTRY AT START OF LAST ALTERNATIVE
                   6190: *
                   6191: O$SLD  ENT                   ENTRY POINT
                   6192:        ICA  XS               POP FAILURE OFFSET
                   6193:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   6194:        BRN  EXITS            JUMP TO EXECUTE LAST ALTERNATIVE
                   6195:        EJC
                   6196: *
                   6197: *      BINARY MINUS (SUBTRACTION)
                   6198: *
                   6199: O$SUB  ENT                   ENTRY POINT
                   6200:        JSR  ARITH            FETCH ARITHMETIC OPERANDS
                   6201:        ERR  037,SUBTRACTION LEFT OPERAND IS NOT NUMERIC
                   6202:        ERR  038,SUBTRACTION RIGHT OPERAND IS NOT NUMERIC
                   6203: .IF    .CNRA
                   6204: .ELSE
                   6205:        PPM  OSUB1            JUMP IF REAL OPERANDS
                   6206: .FI
                   6207: *
                   6208: *      HERE TO SUBTRACT TWO INTEGERS
                   6209: *
                   6210:        SBI  ICVAL(XL)        SUBTRACT RIGHT OPERAND FROM LEFT
                   6211:        INO  EXINT            RETURN INTEGER IF NO OVERFLOW
                   6212:        ERB  039,SUBTRACTION CAUSED INTEGER OVERFLOW
                   6213: .IF    .CNRA
                   6214: .ELSE
                   6215: *
                   6216: *      HERE TO SUBTRACT TWO REALS
                   6217: *
                   6218: OSUB1  SBR  RCVAL(XL)        SUBTRACT RIGHT OPERAND FROM LEFT
                   6219:        RNO  EXREA            RETURN REAL IF NO OVERFLOW
                   6220:        ERB  040,SUBTRACTION CAUSED REAL OVERFLOW
                   6221: .FI
                   6222: *
                   6223: *      DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
                   6224: *
                   6225: O$TXR  ENT                   ENTRY POINT
                   6226:        JMG  TRXQR            JUMP INTO TRXEQ PROCEDURE
                   6227: *
                   6228: *      UNEXPECTED FAILURE
                   6229: *
                   6230: *      NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
                   6231: *      TRANSFER TO SYSTEM LABEL CONTINUE
                   6232: *      WILL RESULT IN LOOPING HERE.  DIFFICULT TO AVOID EXCEPT
                   6233: *      WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
                   6234: *      ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
                   6235: *
                   6236: O$UNF  ENT                   ENTRY POINT
                   6237:        ERB  041,UNEXPECTED FAILURE IN -NOFAIL MODE
                   6238:        TTL  S P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
                   6239: *
                   6240: *      THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
                   6241: *      WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
                   6242: *
                   6243: *      CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
                   6244: *
                   6245: *      ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
                   6246: *      LETTER VARIABLE NAME IDENTIFIER.
                   6247: *
                   6248: *      ENTRIES ARE IN ALPHABETICAL ORDER
                   6249: *
                   6250: *      ABORT
                   6251: *
                   6252: L$ABO  ENT                   ENTRY POINT
                   6253:        MOV  KVERT,WA         LOAD ERROR CODE
                   6254:        ZER  XR               INDICATE NO ENDING MESSAGE
                   6255:        BNZ  WA,STOPR         STOP RUN
                   6256: *
                   6257: *
                   6258: *      FAIL IF NO ERROR HAD OCCURED
                   6259: *
                   6260:        ERB  042,GOTO ABORT WITH NO PRECEDING ERROR
                   6261: *
                   6262: *      CONTINUE
                   6263: *
                   6264: L$CNT  ENT                   ENTRY POINT
                   6265: *
                   6266: *      MERGE HERE AFTER EXECUTION ERROR
                   6267: *
                   6268: LCNXE  MOV  R$CNT,XR         LOAD CONTINUATION CODE BLOCK PTR
                   6269:        BZE  XR,LCNT1         JUMP IF NO PREVIOUS ERROR
                   6270:        ZER  R$CNT            CLEAR FLAG
                   6271:        MOV  XR,R$COD         ELSE STORE AS NEW CODE BLOCK PTR
                   6272:        ADD  STXOF,XR         ADD FAILURE OFFSET
                   6273:        LCP  XR               LOAD CODE POINTER
                   6274:        MOV  FLPTR,XS         RESET STACK POINTER
                   6275:        BRN  EXITS            JUMP TO TAKE INDICATED FAILURE
                   6276: *
                   6277: *      HERE IF NO PREVIOUS ERROR
                   6278: *
                   6279: LCNT1  ERB  043,GOTO CONTINUE WITH NO PRECEDING ERROR
                   6280:        EJC
                   6281: *
                   6282: *      END
                   6283: *
                   6284: L$END  ENT                   ENTRY POINT
                   6285:        MOV  =ENDMS,XR        POINT TO MESSAGE /NORMAL TERM../
                   6286:        ZER  WA               NO ERROR CODE
                   6287:        BRN  STOPR            JUMP TO ROUTINE TO STOP RUN
                   6288: *
                   6289: *      FRETURN
                   6290: *
                   6291: L$FRT  ENT                   ENTRY POINT
                   6292:        MOV  =SCFRT,WA        POINT TO STRING /FRETURN/
                   6293:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
                   6294: *
                   6295: *      NRETURN
                   6296: *
                   6297: L$NRT  ENT                   ENTRY POINT
                   6298:        MOV  =SCNRT,WA        POINT TO STRING /NRETURN/
                   6299:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
                   6300: *
                   6301: *      RETURN
                   6302: *
                   6303: L$RTN  ENT                   ENTRY POINT
                   6304:        MOV  =SCRTN,WA        POINT TO STRING /RETURN/
                   6305:        BRN  RETRN            JUMP TO COMMON RETURN ROUTINE
                   6306: *
                   6307: *      UNDEFINED LABEL
                   6308: *
                   6309: L$UND  ENT                   ENTRY POINT
                   6310:        ERB  044,GOTO UNDEFINED LABEL
                   6311:        TTL  S P I T B O L -- BLOCK ACTION ROUTINES
                   6312: *
                   6313: *      THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
                   6314: *      VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
                   6315: *      POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
                   6316: *      POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
                   6317: *      PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
                   6318: *      LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
                   6319: *      (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
                   6320: *      THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
                   6321: *
                   6322: *      THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
                   6323: *      FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
                   6324: *      THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
                   6325: *
                   6326: *      IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
                   6327: *      TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
                   6328: *      IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
                   6329: *
                   6330: *      FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
                   6331: *      AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
                   6332: *
                   6333: *      THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
                   6334: *      WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
                   6335: *      THE INDIVIDUAL ROUTINES AS REQUIRED.
                   6336: *
                   6337: *      THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
                   6338: *      FOLLOWING EXCEPTIONS.
                   6339: *
                   6340: *      THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
                   6341: *      THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
                   6342: *      THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
                   6343: *
                   6344: *      THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
                   6345: *      SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
                   6346: *      TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
                   6347: *
                   6348: *      THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
                   6349: *      PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
                   6350: *      AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
                   6351: *
                   6352: *      THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
                   6353: *      ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
                   6354: *      MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
                   6355: *
                   6356: B$AAA  ENT  BL$$I            ENTRY POINT OF FIRST BLOCK ROUTINE
                   6357:        EJC
                   6358: *
                   6359: *      EXBLK
                   6360: *
                   6361: *      THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
                   6362: *      THE STACK AS A VALUE.
                   6363: *
                   6364: *      (XR)                  POINTER TO EXBLK
                   6365: *
                   6366: B$EXL  ENT  BL$EX            ENTRY POINT (EXBLK)
                   6367:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   6368: *
                   6369: *      SEBLK
                   6370: *
                   6371: *      THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
                   6372: *      CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
                   6373: *
                   6374: B$SEL  ENT  BL$SE            ENTRY POINT (SEBLK)
                   6375:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   6376: *
                   6377: *      DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
                   6378: *
                   6379: B$E$$  ENT  BL$$I            ENTRY POINT
                   6380: *
                   6381: *      TRBLK
                   6382: *
                   6383: *      THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
                   6384: *
                   6385: B$TRT  ENT  BL$TR            ENTRY POINT (TRBLK)
                   6386: *
                   6387: *      DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
                   6388: *
                   6389: B$T$$  ENT  BL$$I            END OF TRBLK,SEBLK,EXBLK ENTRIES
                   6390: *
                   6391: *      ARBLK
                   6392: *
                   6393: *      THE ROUTINE FOR ARBLK IS NEVER EXECUTED
                   6394: *
                   6395: B$ART  ENT  BL$AR            ENTRY POINT (ARBLK)
                   6396:        EJC
                   6397: .IF    .CNBF
                   6398: .ELSE
                   6399: *
                   6400: *      BCBLK
                   6401: *
                   6402: *      THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
                   6403: *
                   6404: *      (XR)                  POINTER TO BCBLK
                   6405: *
                   6406: B$BCT  ENT  BL$BC            ENTRY POINT (BCBLK)
                   6407: *
                   6408: *      BFBLK
                   6409: *
                   6410: *      THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
                   6411: *
                   6412: *      (XR)                  POINTER TO BFBLK
                   6413: *
                   6414: B$BFT  ENT  BL$BF            ENTRY POINT (BFBLK)
                   6415:        EJC
                   6416: .FI
                   6417: *
                   6418: *      CCBLK
                   6419: *
                   6420: *      THE ROUTINE FOR CCBLK IS NEVER ENTERED
                   6421: *
                   6422: B$CCT  ENT  BL$CC            ENTRY POINT (CCBLK)
                   6423: *
                   6424: *      CDBLK
                   6425: *
                   6426: *      THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
                   6427: *      THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
                   6428: *
                   6429: *      ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
                   6430: *
                   6431: *      (XR)                  POINTER TO CDBLK
                   6432: *
                   6433: B$CDC  ENT  BL$CD            ENTRY POINT (CDBLK)
                   6434:        MOV  FLPTR,XS         POP GARBAGE OFF STACK
                   6435:        MOV  CDFAL(XR),(XS)   SET FAILURE OFFSET
                   6436:        BRN  STMGO            ENTER STMT
                   6437: *
                   6438: *      ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
                   6439: *
                   6440: *      (XR)                  POINTER TO CDBLK
                   6441: *
                   6442: B$CDS  ENT  BL$CD            ENTRY POINT (CDBLK)
                   6443:        MOV  FLPTR,XS         POP GARBAGE OFF STACK
                   6444:        MOV  *CDFAL,(XS)      SET FAILURE OFFSET
                   6445:        BRN  STMGO            ENTER STMT
                   6446: *
                   6447: *      CMBLK
                   6448: *
                   6449: *      THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
                   6450: *
                   6451: B$CMT  ENT  BL$CM            ENTRY POINT (CMBLK)
                   6452: *
                   6453: *      COBLK
                   6454: *
                   6455: *      THE ROUTINE FOR A COBLK IS NEVER EXECUTED
                   6456: *
                   6457: B$COP  ENT  BL$CO            ENTRY POINT (COBLK)
                   6458: *
                   6459: *      CTBLK
                   6460: *
                   6461: *      THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
                   6462: *
                   6463: B$CTT  ENT  BL$CT            ENTRY POINT (CTBLK)
                   6464:        EJC
                   6465: *
                   6466: *      DFBLK
                   6467: *
                   6468: *      THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
                   6469: *      TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
                   6470: *
                   6471: *      (XL)                  POINTER TO DFBLK
                   6472: *
                   6473: B$DFC  ENT  BL$DF            ENTRY POINT
                   6474:        MOV  DFPDL(XL),WA     LOAD LENGTH OF PDBLK
                   6475:        JSR  ALLOC            ALLOCATE PDBLK
                   6476:        MOV  =B$PDT,(XR)      STORE TYPE WORD
                   6477:        MOV  XL,PDDFP(XR)     STORE DFBLK POINTER
                   6478:        MOV  XR,WC            SAVE POINTER TO PDBLK
                   6479:        ADD  WA,XR            POINT PAST PDBLK
                   6480:        LCT  WA,FARGS(XL)     SET TO COUNT FIELDS
                   6481: *
                   6482: *      LOOP TO ACQUIRE FIELD VALUES FROM STACK
                   6483: *
                   6484: BDFC1  MOV  (XS)+,-(XR)      MOVE A FIELD VALUE
                   6485:        BCT  WA,BDFC1         LOOP TILL ALL MOVED
                   6486:        MOV  WC,XR            RECALL POINTER TO PDBLK
                   6487:        BRN  EXSID            EXIT SETTING ID FIELD
                   6488: .IF    .CNLD
                   6489: .ELSE
                   6490:        EJC
                   6491: *
                   6492: *      EFBLK
                   6493: *
                   6494: *      THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
                   6495: *      ENTRY TO CALL AN EXTERNAL FUNCTION.
                   6496: *
                   6497: *      (XL)                  POINTER TO EFBLK
                   6498: *
                   6499: B$EFC  ENT  BL$EF            ENTRY POINT (EFBLK)
                   6500:        MOV  FARGS(XL),WC     LOAD NUMBER OF ARGUMENTS
                   6501:        WTB  WC               CONVERT TO OFFSET
                   6502:        MOV  XL,-(XS)         SAVE POINTER TO EFBLK
                   6503:        MOV  XS,XT            COPY POINTER TO ARGUMENTS
                   6504: *
                   6505: *      LOOP TO CONVERT ARGUMENTS
                   6506: *
                   6507: BEFC1  ICA  XT               POINT TO NEXT ENTRY
                   6508:        MOV  (XS),XR          LOAD POINTER TO EFBLK
                   6509:        DCA  WC               DECREMENT EFTAR OFFSET
                   6510:        ADD  WC,XR            POINT TO NEXT EFTAR ENTRY
                   6511:        MOV  EFTAR(XR),XR     LOAD EFTAR ENTRY
                   6512:        BSW  XR,5,BEFC7       SWITCH ON EFTAR TYPE
                   6513:        IFF  1,BEFC2          STRING
                   6514:        IFF  2,BEFC3          INTEGER
                   6515: .IF    .CNRA
                   6516: .ELSE
                   6517:        IFF  3,BEFC4          REAL
                   6518: .FI
                   6519: .IF    .CNBF
                   6520: .ELSE
                   6521:        IFF  4,BEFCA          BUFFER
                   6522: .FI
                   6523:        ESW                   END OF SWITCH ON TYPE
                   6524: *
                   6525: *      HERE TO CONVERT TO STRING
                   6526: *
                   6527: BEFC2  MOV  (XT),-(XS)       STACK ARG PTR
                   6528:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   6529:        ERR  045,EXTERNAL FUNCTION ARGUMENT IS NOT STRING
                   6530:        BRN  BEFC6            JUMP TO MERGE
                   6531:        EJC
                   6532: *
                   6533: *      EFBLK (CONTINUED)
                   6534: *
                   6535: *      HERE TO CONVERT AN INTEGER
                   6536: *
                   6537: BEFC3  MOV  (XT),XR          LOAD NEXT ARGUMENT
                   6538:        MOV  WC,BEFOF         SAVE OFFSET
                   6539:        JSR  GTINT            CONVERT TO INTEGER
                   6540:        ERR  046,EXTERNAL FUNCTION ARGUMENT IS NOT INTEGER
                   6541: .IF    .CNRA
                   6542: .ELSE
                   6543:        BRN  BEFC5            MERGE WITH REAL CASE
                   6544: *
                   6545: *      HERE TO CONVERT A REAL
                   6546: *
                   6547: BEFC4  MOV  (XT),XR          LOAD NEXT ARGUMENT
                   6548:        MOV  WC,BEFOF         SAVE OFFSET
                   6549:        JSR  GTREA            CONVERT TO REAL
                   6550:        ERR  047,EXTERNAL FUNCTION ARGUMENT IS NOT REAL
                   6551: *
                   6552: *      INTEGER CASE MERGES HERE
                   6553: *
                   6554: .FI
                   6555: .IF    .CNBF
                   6556: .ELSE
                   6557:        BRN  BEFC5            MERGE
                   6558: *
                   6559: *      HERE TO CONVERT BUFFER
                   6560: *
                   6561: BEFCA  MOV  (XT),XR          LOAD ARGUMENT
                   6562:        MOV  WC,BEFOF         SAVE OFFSET
                   6563:        MOV  XL,-(XS)         SAVE EFBLK PTR
                   6564:        JSR  GTBUF            GET A BUFFER
                   6565:        ERR  259,EXTERNAL FUNCTION ARGUMENT IS NOT BUFFER
                   6566:        MOV  (XS)+,XL         RESTORE EFBLK PTR
                   6567: *
                   6568: *      INTEGER AND REAL CASE MERGES HERE
                   6569: *
                   6570: .FI
                   6571: BEFC5  MOV  BEFOF,WC         RESTORE OFFSET
                   6572: *
                   6573: *      STRING MERGES HERE
                   6574: *
                   6575: BEFC6  MOV  XR,(XT)          STORE CONVERTED RESULT
                   6576: *
                   6577: *      NO CONVERSION MERGES HERE
                   6578: *
                   6579: BEFC7  BNZ  WC,BEFC1         LOOP BACK IF MORE TO GO
                   6580: *
                   6581: *      HERE AFTER CONVERTING ALL THE ARGUMENTS
                   6582: *
                   6583:        MOV  (XS)+,XL         RESTORE EFBLK POINTER
                   6584:        MOV  FARGS(XL),WA     GET NUMBER OF ARGS
                   6585:        JSR  SYSEX            CALL ROUTINE TO CALL EXTERNAL FNC
                   6586:        PPM  EXFAL            FAIL IF FAILURE
                   6587:        EJC
                   6588: *
                   6589: *      EFBLK (CONTINUED)
                   6590: *
                   6591: *      RETURN HERE WITH RESULT IN XR
                   6592: *
                   6593: *      FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
                   6594: *
                   6595:        MOV  EFRSL(XL),WB     GET RESULT TYPE
                   6596:        BNZ  WB,BEFA8         BRANCH IF NOT UNCONVERTED
                   6597:        BNE  (XR),=B$SCL,BEFC8 JUMP IF NOT A STRING
                   6598:        BZE  SCLEN(XR),EXNUL  RETURN NULL IF NULL
                   6599: *
                   6600: *      HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
                   6601: *
                   6602: BEFA8  BNE  WB,=NUM01,BEFC8  JUMP IF NOT A STRING
                   6603:        BZE  SCLEN(XR),EXNUL  RETURN NULL IF NULL
                   6604: *
                   6605: *      RETURN IF RESULT IS IN DYNAMIC STORAGE
                   6606: *
                   6607: BEFC8  BLT  XR,DNAMB,BEFC9   JUMP IF NOT IN DYNAMIC STORAGE
                   6608:        BLE  XR,DNAMP,EXIXR   RETURN RESULT IF ALREADY DYNAMIC
                   6609: *
                   6610: *      HERE WE COPY A RESULT INTO THE DYNAMIC REGION
                   6611: *
                   6612: BEFC9  MOV  (XR),WA          GET POSSIBLE TYPE WORD
                   6613:        BZE  WB,BEF11         JUMP IF UNCONVERTED RESULT
                   6614:        MOV  =B$SCL,WA        STRING
                   6615:        BEQ  WB,=NUM01,BEF10  YES JUMP
                   6616:        MOV  =B$ICL,WA        INTEGER
                   6617:        BEQ  WB,=NUM02,BEF10  YES JUMP
                   6618: .IF    .CNRA
                   6619: .ELSE
                   6620:        MOV  =B$RCL,WA        REAL
                   6621:        BEQ  WB,=NUM03,BEF10  YES JUMP
                   6622: .FI
                   6623: .IF    .CNBF
                   6624: .ELSE
                   6625:        MOV  =B$BCT,WA        BUFFER
                   6626:        BEQ  WB,=NUM04,BEF10  YES JUMP
                   6627: .FI
                   6628: *
                   6629: *      STORE TYPE WORD IN RESULT
                   6630: *
                   6631: BEF10  MOV  WA,(XR)          STORED BEFORE COPYING TO DYNAMIC
                   6632: *
                   6633: *      MERGE FOR UNCONVERTED RESULT
                   6634: *
                   6635: BEF11  JSR  BLKLN            GET LENGTH OF BLOCK
                   6636:        MOV  XR,XL            COPY ADDRESS OF OLD BLOCK
                   6637:        JSR  ALLOC            ALLOCATE DYNAMIC BLOCK SAME SIZE
                   6638:        MOV  XR,-(XS)         SET POINTER TO NEW BLOCK AS RESULT
                   6639:        MVW                   COPY OLD BLOCK TO DYNAMIC BLOCK
                   6640:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   6641: .FI
                   6642: *
                   6643: *      EVBLK
                   6644: *
                   6645: *      THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
                   6646: *
                   6647: B$EVT  ENT  BL$EV            ENTRY POINT (EVBLK)
                   6648:        EJC
                   6649: *
                   6650: *      FFBLK
                   6651: *
                   6652: *      THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
                   6653: *      TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
                   6654: *
                   6655: *      (XL)                  POINTER TO FFBLK
                   6656: *
                   6657: B$FFC  ENT  BL$FF            ENTRY POINT (FFBLK)
                   6658:        MOV  XL,XR            COPY FFBLK POINTER
                   6659:        LCW  WC               LOAD NEXT CODE WORD
                   6660:        MOV  (XS),XL          LOAD PDBLK POINTER
                   6661:        BNE  (XL),=B$PDT,BFFC2 JUMP IF NOT PDBLK AT ALL
                   6662:        MOV  PDDFP(XL),WA     LOAD DFBLK POINTER FROM PDBLK
                   6663: *
                   6664: *      LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
                   6665: *
                   6666: BFFC1  BEQ  WA,FFDFP(XR),BFFC3 JUMP IF THIS IS THE CORRECT FFBLK
                   6667:        MOV  FFNXT(XR),XR     ELSE LINK TO NEXT FFBLK ON CHAIN
                   6668:        BNZ  XR,BFFC1         LOOP BACK IF ANOTHER ENTRY TO CHECK
                   6669: *
                   6670: *      HERE FOR BAD ARGUMENT
                   6671: *
                   6672: BFFC2  ERB  048,FIELD FUNCTION ARGUMENT IS WRONG DATATYPE
                   6673: *
                   6674: *      HERE AFTER LOCATING CORRECT FFBLK
                   6675: *
                   6676: BFFC3  MOV  FFOFS(XR),WA     LOAD FIELD OFFSET
                   6677:        BEQ  WC,=OFNE$,BFFC5  JUMP IF CALLED BY NAME
                   6678:        ADD  WA,XL            ELSE POINT TO VALUE FIELD
                   6679:        MOV  (XL),XR          LOAD VALUE
                   6680:        BNE  (XR),=B$TRT,BFFC4 JUMP IF NOT TRAPPED
                   6681:        SUB  WA,XL            ELSE RESTORE NAME BASE,OFFSET
                   6682:        MOV  WC,(XS)          SAVE NEXT CODE WORD OVER PDBLK PTR
                   6683:        JSR  ACESS            ACCESS VALUE
                   6684:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   6685:        MOV  (XS),WC          RESTORE NEXT CODE WORD
                   6686: *
                   6687: *      HERE AFTER GETTING VALUE IN (XR)
                   6688: *
                   6689: BFFC4  MOV  XR,(XS)          STORE VALUE ON STACK (OVER PDBLK)
                   6690:        MOV  WC,XR            COPY NEXT CODE WORD
                   6691:        MOV  (XR),XL          LOAD ENTRY ADDRESS
                   6692:        BRI  XL               JUMP TO ROUTINE FOR NEXT CODE WORD
                   6693: *
                   6694: *      HERE IF CALLED BY NAME
                   6695: *
                   6696: BFFC5  MOV  WA,-(XS)         STORE NAME OFFSET (BASE IS SET)
                   6697:        BRN  EXITS            EXIT WITH NAME ON STACK
                   6698:        EJC
                   6699: *
                   6700: *      ICBLK
                   6701: *
                   6702: *      THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
                   6703: *      CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
                   6704: *
                   6705: *      (XR)                  POINTER TO ICBLK
                   6706: *
                   6707: B$ICL  ENT  BL$IC            ENTRY POINT (ICBLK)
                   6708:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   6709: *
                   6710: *      KVBLK
                   6711: *
                   6712: *      THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
                   6713: *
                   6714: B$KVT  ENT  BL$KV            ENTRY POINT (KVBLK)
                   6715: *
                   6716: *      NMBLK
                   6717: *
                   6718: *      THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
                   6719: *      CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
                   6720: *      WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
                   6721: *      BE PREEVALUATED AT COMPILE TIME.
                   6722: *
                   6723: *      (XR)                  POINTER TO NMBLK
                   6724: *
                   6725: B$NML  ENT  BL$NM            ENTRY POINT (NMBLK)
                   6726:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   6727: *
                   6728: *      PDBLK
                   6729: *
                   6730: *      THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
                   6731: *
                   6732: B$PDT  ENT  BL$PD            ENTRY POINT (PDBLK)
                   6733:        EJC
                   6734: *
                   6735: *      PFBLK
                   6736: *
                   6737: *      THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
                   6738: *      TO CALL A PROGRAM DEFINED FUNCTION.
                   6739: *
                   6740: *      (XL)                  POINTER TO PFBLK
                   6741: *
                   6742: *      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
                   6743: *      CONTROL TO THE PROGRAM DEFINED FUNCTION.
                   6744: *
                   6745: *                            SAVED VALUE OF FIRST ARGUMENT
                   6746: *                            .
                   6747: *                            SAVED VALUE OF LAST ARGUMENT
                   6748: *                            SAVED VALUE OF FIRST LOCAL
                   6749: *                            .
                   6750: *                            SAVED VALUE OF LAST LOCAL
                   6751: *                            SAVED VALUE OF FUNCTION NAME
                   6752: *                            SAVED CODE BLOCK PTR (R$COD)
                   6753: *                            SAVED CODE POINTER (-R$COD)
                   6754: *                            SAVED VALUE OF FLPRT
                   6755: *                            SAVED VALUE OF FLPTR
                   6756: *                            POINTER TO PFBLK
                   6757: *      FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
                   6758: *
                   6759: B$PFC  ENT  BL$PF            ENTRY POINT (PFBLK)
                   6760:        MOV  XL,BPFPF         SAVE PFBLK PTR (NEED NOT BE RELOC)
                   6761:        MOV  XL,XR            COPY FOR THE MOMENT
                   6762:        MOV  PFVBL(XR),XL     POINT TO VRBLK FOR FUNCTION
                   6763: *
                   6764: *      LOOP TO FIND OLD VALUE OF FUNCTION
                   6765: *
                   6766: BPF01  MOV  XL,WB            SAVE POINTER
                   6767:        MOV  VRVAL(XL),XL     LOAD VALUE
                   6768:        BEQ  (XL),=B$TRT,BPF01 LOOP IF TRBLK
                   6769: *
                   6770: *      SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
                   6771: *
                   6772:        MOV  XL,BPFSV         SAVE OLD VALUE
                   6773:        MOV  WB,XL            POINT BACK TO BLOCK WITH VALUE
                   6774:        MOV  =NULLS,VRVAL(XL) SET VALUE TO NULL
                   6775:        MOV  FARGS(XR),WA     LOAD NUMBER OF ARGUMENTS
                   6776:        ADD  *PFARG,XR        POINT TO PFARG ENTRIES
                   6777:        BZE  WA,BPF04         JUMP IF NO ARGUMENTS
                   6778:        MOV  XS,XT            PTR TO LAST ARG
                   6779:        WTB  WA               CONVERT NO. OF ARGS TO BAUS OFFSET
                   6780:        ADD  WA,XT            POINT BEFORE FIRST ARG
                   6781:        MOV  XT,BPFXT         REMEMBER ARG POINTER
                   6782:        EJC
                   6783: *
                   6784: *      PFBLK (CONTINUED)
                   6785: *
                   6786: *      LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
                   6787: *
                   6788: BPF02  MOV  (XR)+,XL         LOAD VRBLK PTR FOR NEXT ARGUMENT
                   6789: *
                   6790: *      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
                   6791: *
                   6792: BPF03  MOV  XL,WC            SAVE POINTER
                   6793:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE
                   6794:        BEQ  (XL),=B$TRT,BPF03 LOOP BACK IF TRBLK
                   6795: *
                   6796: *      SAVE OLD VALUE AND GET NEW VALUE
                   6797: *
                   6798:        MOV  XL,WA            KEEP OLD VALUE
                   6799:        MOV  BPFXT,XT         POINT BEFORE NEXT STACKED ARG
                   6800:        MOV  -(XT),WB         LOAD ARGUMENT (NEW VALUE)
                   6801:        MOV  WA,(XT)          SAVE OLD VALUE
                   6802:        MOV  XT,BPFXT         KEEP ARG PTR FOR NEXT TIME
                   6803:        MOV  WC,XL            POINT BACK TO BLOCK WITH VALUE
                   6804:        MOV  WB,VRVAL(XL)     SET NEW VALUE
                   6805:        BNE  XS,BPFXT,BPF02   LOOP IF NOT ALL DONE
                   6806: *
                   6807: *      NOW PROCESS LOCALS
                   6808: *
                   6809: BPF04  MOV  BPFPF,XL         RESTORE PFBLK POINTER
                   6810:        MOV  PFNLO(XL),WA     LOAD NUMBER OF LOCALS
                   6811:        BZE  WA,BPF07         JUMP IF NO LOCALS
                   6812:        MOV  =NULLS,WB        GET NULL CONSTANT
                   6813:        LCT  WA,WA            SET LOCAL COUNTER
                   6814: *
                   6815: *      LOOP TO PROCESS LOCALS
                   6816: *
                   6817: BPF05  MOV  (XR)+,XL         LOAD VRBLK PTR FOR NEXT LOCAL
                   6818: *
                   6819: *      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
                   6820: *
                   6821: BPF06  MOV  XL,WC            SAVE POINTER
                   6822:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE
                   6823:        BEQ  (XL),=B$TRT,BPF06 LOOP BACK IF TRBLK
                   6824: *
                   6825: *      SAVE OLD VALUE AND SET NULL AS NEW VALUE
                   6826: *
                   6827:        MOV  XL,-(XS)         STACK OLD VALUE
                   6828:        MOV  WC,XL            POINT BACK TO BLOCK WITH VALUE
                   6829:        MOV  WB,VRVAL(XL)     SET NULL AS NEW VALUE
                   6830:        BCT  WA,BPF05         LOOP TILL ALL LOCALS PROCESSED
                   6831:        EJC
                   6832: *
                   6833: *      PFBLK (CONTINUED)
                   6834: *
                   6835: *      HERE AFTER PROCESSING ARGUMENTS AND LOCALS
                   6836: *
                   6837: .IF    .CNPF
                   6838: BPF07  MOV  R$COD,WA         LOAD OLD CODE BLOCK POINTER
                   6839: .ELSE
                   6840: BPF07  ZER  XR               ZERO REG XR IN CASE
                   6841:        BZE  KVPFL,BPF7C      SKIP IF PROFILING IS OFF
                   6842:        BEQ  KVPFL,=NUM02,BPF7A BRANCH ON TYPE OF PROFILE
                   6843: *
                   6844: *      HERE IF PROFILE = 1
                   6845: *
                   6846:        JSR  SYSTM            GET CURRENT TIME
                   6847:        STI  PFETM            SAVE FOR A SEC
                   6848:        SBI  PFSTM            FIND TIME USED BY CALLER
                   6849:        JSR  ICBLD            BUILD INTO AN ICBLK
                   6850:        LDI  PFETM            RELOAD CURRENT TIME
                   6851:        BRN  BPF7B            MERGE
                   6852: *
                   6853: *      HERE IF PROFILE = 2
                   6854: *
                   6855: BPF7A  LDI  PFSTM            GET START TIME OF CALLING STMT
                   6856:        JSR  ICBLD            ASSEMBLE AN ICBLK ROUND IT
                   6857:        JSR  SYSTM            GET NOW TIME
                   6858: *
                   6859: *      BOTH TYPES OF PROFILE MERGE HERE
                   6860: *
                   6861: BPF7B  STI  PFSTM            SET START TIME OF 1ST FUNC STMT
                   6862:        MNZ  PFFNC            FLAG FUNCTION ENTRY
                   6863:        EJC
                   6864: *
                   6865: *      PFBLK (CONTINUED)
                   6866: *
                   6867: *      NO PROFILING MERGES HERE
                   6868: *
                   6869: BPF7C  MOV  XR,-(XS)         STACK ICBLK PTR (OR ZERO)
                   6870:        MOV  R$COD,WA         LOAD OLD CODE BLOCK POINTER
                   6871: .FI
                   6872:        SCP  WB               GET CODE POINTER
                   6873:        SUB  WA,WB            MAKE CODE POINTER INTO OFFSET
                   6874:        MOV  BPFPF,XL         RECALL PFBLK POINTER
                   6875:        MOV  BPFSV,-(XS)      STACK OLD VALUE OF FUNCTION NAME
                   6876:        MOV  WA,-(XS)         STACK CODE BLOCK POINTER
                   6877:        MOV  WB,-(XS)         STACK CODE OFFSET
                   6878:        MOV  FLPRT,-(XS)      STACK OLD FLPRT
                   6879:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   6880:        MOV  XL,-(XS)         STACK POINTER TO PFBLK
                   6881:        ZER  -(XS)            DUMMY ZERO ENTRY FOR FAIL RETURN
                   6882:        CHK                   CHECK FOR STACK OVERFLOW
                   6883:        MOV  XS,FLPTR         SET NEW FAIL RETURN VALUE
                   6884:        MOV  XS,FLPRT         SET NEW FLPRT
                   6885:        MOV  KVTRA,WA         LOAD TRACE VALUE
                   6886:        ADD  KVFTR,WA         ADD FTRACE VALUE
                   6887:        BNZ  WA,BPF09         JUMP IF TRACING POSSIBLE
                   6888:        ICV  KVFNC            ELSE BUMP FNCLEVEL
                   6889: *
                   6890: *      HERE TO ACTUALLY JUMP TO FUNCTION
                   6891: *
                   6892: BPF08  MOV  PFCOD(XL),XR     POINT TO CODE
                   6893:        BRI  (XR)             OFF TO EXECUTE FUNCTION
                   6894: *
                   6895: *      HERE IF TRACING IS POSSIBLE
                   6896: *
                   6897: BPF09  MOV  PFCTR(XL),XR     LOAD POSSIBLE CALL TRACE TRBLK
                   6898:        MOV  PFVBL(XL),XL     LOAD VRBLK POINTER FOR FUNCTION
                   6899:        MOV  *VRVAL,WA        SET NAME OFFSET FOR VARIABLE
                   6900:        BZE  KVTRA,BPF10      JUMP IF TRACE MODE IS OFF
                   6901:        BZE  XR,BPF10         OR IF THERE IS NO CALL TRACE
                   6902: *
                   6903: *      HERE IF CALL TRACED
                   6904: *
                   6905:        DCV  KVTRA            DECREMENT TRACE COUNT
                   6906:        BZE  TRFNC(XR),BPF11  JUMP IF PRINT TRACE
                   6907:        JSR  TRXEQ            EXECUTE FUNCTION TYPE TRACE
                   6908:        EJC
                   6909: *
                   6910: *      PFBLK (CONTINUED)
                   6911: *
                   6912: *      HERE TO TEST FOR FTRACE TRACE
                   6913: *
                   6914: BPF10  BZE  KVFTR,BPF16      JUMP IF FTRACE IS OFF
                   6915:        DCV  KVFTR            ELSE DECREMENT FTRACE
                   6916: *
                   6917: *      HERE FOR PRINT TRACE
                   6918: *
                   6919: BPF11  JSR  PRTSN            PRINT STATEMENT NUMBER
                   6920:        JSR  PRTNM            PRINT FUNCTION NAME
                   6921:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   6922:        JSR  PRTCH            PRINT LEFT PAREN
                   6923:        MOV  1(XS),XL         RECOVER PFBLK POINTER
                   6924:        BZE  FARGS(XL),BPF15  SKIP IF NO ARGUMENTS
                   6925:        ZER  WB               ELSE SET ARGUMENT COUNTER
                   6926:        BRN  BPF13            JUMP INTO LOOP
                   6927: *
                   6928: *      LOOP TO PRINT ARGUMENT VALUES
                   6929: *
                   6930: BPF12  MOV  =CH$CM,WA        LOAD COMMA
                   6931:        JSR  PRTCH            PRINT TO SEPARATE FROM LAST ARG
                   6932: *
                   6933: *      MERGE HERE FIRST TIME (NO COMMA REQUIRED)
                   6934: *
                   6935: BPF13  MOV  WB,(XS)          SAVE ARG CTR (OVER FAILOFFS IS OK)
                   6936:        WTB  WB               CONVERT TO BAU OFFSET
                   6937:        ADD  WB,XL            POINT TO NEXT ARGUMENT POINTER
                   6938:        MOV  PFARG(XL),XR     LOAD NEXT ARGUMENT VRBLK PTR
                   6939:        SUB  WB,XL            RESTORE PFBLK POINTER
                   6940:        MOV  VRVAL(XR),XR     LOAD NEXT VALUE
                   6941:        JSR  PRTVL            PRINT ARGUMENT VALUE
                   6942:        EJC
                   6943: *
                   6944: *      HERE AFTER DEALING WITH ONE ARGUMENT
                   6945: *
                   6946:        MOV  (XS),WB          RESTORE ARGUMENT COUNTER
                   6947:        ICV  WB               INCREMENT ARGUMENT COUNTER
                   6948:        BLT  WB,FARGS(XL),BPF12 LOOP IF MORE TO PRINT
                   6949: *
                   6950: *      MERGE HERE IN NO ARGS CASE TO PRINT PAREN
                   6951: *
                   6952: BPF15  MOV  =CH$RP,WA        LOAD RIGHT PAREN
                   6953:        JSR  PRTCF            PRINT TO TERMINATE OUTPUT
                   6954: *
                   6955: *      MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
                   6956: *
                   6957: BPF16  ICV  KVFNC            INCREMENT FNCLEVEL
                   6958:        MOV  R$FNC,XL         LOAD PTR TO POSSIBLE TRBLK
                   6959:        JSR  KTREX            CALL KEYWORD TRACE ROUTINE
                   6960: *
                   6961: *      CALL FUNCTION AFTER TRACE TESTS COMPLETE
                   6962: *
                   6963:        MOV  1(XS),XL         RESTORE PFBLK POINTER
                   6964:        BRN  BPF08            JUMP BACK TO EXECUTE FUNCTION
                   6965: .IF    .CNRA
                   6966: .ELSE
                   6967:        EJC
                   6968: *
                   6969: *      RCBLK
                   6970: *
                   6971: *      THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
                   6972: *      CODE TO LOAD A REAL VALUE ONTO THE STACK.
                   6973: *
                   6974: *      (XR)                  POINTER TO RCBLK
                   6975: *
                   6976: B$RCL  ENT  BL$RC            ENTRY POINT (RCBLK)
                   6977:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   6978: .FI
                   6979: *
                   6980: *      SCBLK
                   6981: *
                   6982: *      THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
                   6983: *      CODE TO LOAD A STRING VALUE ONTO THE STACK.
                   6984: *
                   6985: *      (XR)                  POINTER TO SCBLK
                   6986: *
                   6987: B$SCL  ENT  BL$SC            ENTRY POINT (SCBLK)
                   6988:        BRN  EXIXR            STACK XR AND OBEY NEXT CODE WORD
                   6989: *
                   6990: *      TBBLK
                   6991: *
                   6992: *      THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
                   6993: *
                   6994: B$TBT  ENT  BL$TB            ENTRY POINT (TBBLK)
                   6995: *
                   6996: *      TEBLK
                   6997: *
                   6998: *      THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
                   6999: *
                   7000: B$TET  ENT  BL$TE            ENTRY POINT (TEBLK)
                   7001: *
                   7002: *      VCBLK
                   7003: *
                   7004: *      THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
                   7005: *
                   7006: B$VCT  ENT  BL$VC            ENTRY POINT (VCBLK)
                   7007:        EJC
                   7008: *
                   7009: *      VRBLK
                   7010: *
                   7011: *      THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
                   7012: *      THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
                   7013: *
                   7014: B$VR$  ENT  BL$$I            MARK START OF VRBLK ENTRY POINTS
                   7015: *
                   7016: *      ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
                   7017: *      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
                   7018: *      THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
                   7019: *      ASSOCIATION IS CURRENTLY ACTIVE.
                   7020: *
                   7021: *      (XR)                  POINTER TO VRGET FIELD OF VRBLK
                   7022: *
                   7023: B$VRA  ENT  BL$$I            ENTRY POINT
                   7024:        MOV  XR,XL            COPY NAME BASE (VRGET = 0)
                   7025:        MOV  *VRVAL,WA        SET NAME OFFSET
                   7026:        JSR  ACESS            ACCESS VALUE
                   7027:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   7028:        BRN  EXIXR            ELSE EXIT WITH RESULT IN XR
                   7029: *
                   7030: *      ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
                   7031: *      THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
                   7032: *      OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
                   7033: *
                   7034: B$VRE  ENT                   ENTRY POINT
                   7035:        ERB  049,ATTEMPT TO CHANGE VALUE OF PROTECTED VARIABLE
                   7036: *
                   7037: *      ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
                   7038: *      FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
                   7039: *
                   7040: *      (XR)                  POINTER TO VRTRA FIELD OF VRBLK
                   7041: *
                   7042: B$VRG  ENT                   ENTRY POINT
                   7043:        MOV  VRLBO(XR),XR     LOAD CODE POINTER
                   7044:        MOV  (XR),XL          LOAD ENTRY ADDRESS
                   7045:        BRI  XL               JUMP TO ROUTINE FOR NEXT CODE WORD
                   7046: *
                   7047: *      ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
                   7048: *      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
                   7049: *
                   7050: *      (XR)                  POINTS TO VRGET FIELD OF VRBLK
                   7051: *
                   7052: B$VRL  ENT                   ENTRY POINT
                   7053:        MOV  VRVAL(XR),-(XS)  LOAD VALUE ONTO STACK (VRGET = 0)
                   7054:        BRN  EXITS            OBEY NEXT CODE WORD
                   7055:        EJC
                   7056: *
                   7057: *      VRBLK (CONTINUED)
                   7058: *
                   7059: *      ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
                   7060: *      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
                   7061: *
                   7062: *      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
                   7063: *
                   7064: B$VRS  ENT                   ENTRY POINT
                   7065:        MOV  (XS),VRVLO(XR)   STORE VALUE, LEAVE ON STACK
                   7066:        BRN  EXITS            OBEY NEXT CODE WORD
                   7067: *
                   7068: *      VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
                   7069: *      GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
                   7070: *      TRACE IS CURRENTLY ACTIVE.
                   7071: *
                   7072: B$VRT  ENT                   ENTRY POINT
                   7073:        SUB  *VRTRA,XR        POINT BACK TO START OF VRBLK
                   7074:        MOV  XR,XL            COPY VRBLK POINTER
                   7075:        MOV  *VRVAL,WA        SET NAME OFFSET
                   7076:        MOV  VRLBL(XL),XR     LOAD POINTER TO TRBLK
                   7077:        BZE  KVTRA,BVRT2      JUMP IF TRACE IS OFF
                   7078:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   7079:        BZE  TRFNC(XR),BVRT1  JUMP IF PRINT TRACE CASE
                   7080:        JSR  TRXEQ            ELSE EXECUTE FULL TRACE
                   7081:        BRN  BVRT2            MERGE TO JUMP TO LABEL
                   7082: *
                   7083: *      HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
                   7084: *
                   7085: BVRT1  JSR  PRTSN            PRINT STATEMENT NUMBER
                   7086:        MOV  XL,XR            COPY VRBLK POINTER
                   7087:        MOV  =CH$CL,WA        COLON
                   7088:        JSR  PRTCH            PRINT IT
                   7089:        MOV  =CH$PP,WA        LEFT PAREN
                   7090:        JSR  PRTCH            PRINT IT
                   7091:        JSR  PRTVN            PRINT LABEL NAME
                   7092:        MOV  =CH$RP,WA        RIGHT PAREN
                   7093:        JSR  PRTCF            PRINT IT
                   7094:        MOV  VRLBL(XL),XR     POINT BACK TO TRBLK
                   7095: *
                   7096: *      MERGE HERE TO JUMP TO LABEL
                   7097: *
                   7098: BVRT2  MOV  TRLBL(XR),XR     LOAD POINTER TO ACTUAL CODE
                   7099:        BRI  (XR)             EXECUTE STATEMENT AT LABEL
                   7100:        EJC
                   7101: *
                   7102: *      VRBLK (CONTINUED)
                   7103: *
                   7104: *      ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
                   7105: *      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
                   7106: *      THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
                   7107: *      ASSOCIATION IS CURRENTLY ACTIVE.
                   7108: *
                   7109: *      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
                   7110: *
                   7111: B$VRV  ENT                   ENTRY POINT
                   7112:        MOV  (XS),WB          LOAD VALUE (LEAVE COPY ON STACK)
                   7113:        SUB  *VRSTO,XR        POINT TO VRBLK
                   7114:        MOV  XR,XL            COPY VRBLK POINTER
                   7115:        MOV  *VRVAL,WA        SET OFFSET
                   7116:        JSR  ASIGN            CALL ASSIGNMENT ROUTINE
                   7117:        PPM  EXFAL            FAIL IF ASSIGNMENT FAILS
                   7118:        BRN  EXITS            ELSE RETURN WITH RESULT ON STACK
                   7119:        EJC
                   7120: *
                   7121: *      XNBLK
                   7122: *
                   7123: *      THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
                   7124: *
                   7125: B$XNT  ENT  BL$XN            ENTRY POINT (XNBLK)
                   7126: *
                   7127: *      XRBLK
                   7128: *
                   7129: *      THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
                   7130: *
                   7131: B$XRT  ENT  BL$XR            ENTRY POINT (XRBLK)
                   7132: *
                   7133: *      MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
                   7134: *
                   7135: B$YYY  ENT  BL$$I            LAST BLOCK ROUTINE ENTRY POINT
                   7136:        TTL  S P I T B O L -- PATTERN MATCHING ROUTINES
                   7137: *
                   7138: *      THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
                   7139: *      ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
                   7140: *      TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
                   7141: *
                   7142: *      NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
                   7143: *      ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
                   7144: *
                   7145: P$AAA  ENT  BL$$I            ENTRY TO MARK FIRST PATTERN
                   7146: *
                   7147: *
                   7148: *      THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
                   7149: *      (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
                   7150: *
                   7151: *      STACK CONTENTS.
                   7152: *
                   7153: *                            NAME BASE (O$PMN ONLY)
                   7154: *                            NAME OFFSET (O$PMN ONLY)
                   7155: *                            TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
                   7156: *      PMHBS --------------- INITIAL CURSOR (ZERO)
                   7157: *                            INITIAL NODE POINTER
                   7158: *      XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
                   7159: *
                   7160: *      REGISTER VALUES.
                   7161: *
                   7162: *           (XS)             SET AS SHOWN IN STACK DIAGRAM
                   7163: *           (XR)             POINTER TO INITIAL PATTERN NODE
                   7164: *           (WB)             INITIAL CURSOR (ZERO)
                   7165: *
                   7166: *      GLOBAL PATTERN VALUES
                   7167: *
                   7168: *           R$PMS            POINTER TO SUBJECT STRING SCBLK
                   7169: *           PMSSL            LENGTH OF SUBJECT STRING IN CHARS
                   7170: *           PMDFL            DOT FLAG, INITIALLY ZERO
                   7171: *           PMHBS            SET AS SHOWN IN STACK DIAGRAM
                   7172: *
                   7173: *      CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
                   7174: *      FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
                   7175:        EJC
                   7176: *
                   7177: *      DESCRIPTION OF ALGORITHM
                   7178: *
                   7179: *      A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
                   7180: *      OF NODES WITH THE FOLLOWING STRUCTURE.
                   7181: *
                   7182: *           +------------------------------------+
                   7183: *           I                PCODE               I
                   7184: *           +------------------------------------+
                   7185: *           I                PTHEN               I
                   7186: *           +------------------------------------+
                   7187: *           I                PARM1               I
                   7188: *           +------------------------------------+
                   7189: *           I                PARM2               I
                   7190: *           +------------------------------------+
                   7191: *
                   7192: *      PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
                   7193: *      THE MATCH OF THIS PARTICULAR NODE TYPE.
                   7194: *
                   7195: *      PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
                   7196: *      TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
                   7197: *      IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
                   7198: *      TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
                   7199: *
                   7200: *      PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
                   7201: *      PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
                   7202: *
                   7203: *      ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
                   7204: *      NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
                   7205: *      IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
                   7206: *
                   7207: *      THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
                   7208: *      THE STRUCTURE IS BUILT UP. THE PATTERN IS
                   7209: *
                   7210: *      (A / B / C) (D / E)   WHERE / IS ALTERNATION
                   7211: *
                   7212: *      IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
                   7213: *      ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
                   7214: *      REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
                   7215: *
                   7216: *      +---+     +---+     +---+     +---+
                   7217: *      I + I-----I A I-----I + I-----I D I-----
                   7218: *      +---+     +---+  I  +---+     +---+
                   7219: *        .              I    .
                   7220: *        .              I    .
                   7221: *      +---+     +---+  I  +---+
                   7222: *      I + I-----I B I--I  I E I-----
                   7223: *      +---+     +---+  I  +---+
                   7224: *        .              I
                   7225: *        .              I
                   7226: *      +---+            I
                   7227: *      I C I------------I
                   7228: *      +---+
                   7229:        EJC
                   7230: *
                   7231: *      DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
                   7232: *
                   7233: *      (XR)                  POINTS TO THE CURRENT NODE
                   7234: *      (XL)                  SCRATCH
                   7235: *      (XS)                  MAIN STACK POINTER
                   7236: *      (WB)                  CURSOR (NUMBER OF CHARS MATCHED)
                   7237: *      (WA,WC)               SCRATCH
                   7238: *
                   7239: *      TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
                   7240: *      A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
                   7241: *
                   7242: *      WORD 1                SAVED CURSOR VALUE
                   7243: *      WORD 2                NODE TO MATCH ON FAILURE
                   7244: *
                   7245: *      WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
                   7246: *      STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
                   7247: *      TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
                   7248: *      AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
                   7249: *      SPECIAL NODES DEPENDING ON THE SCAN MODE.
                   7250: *
                   7251: *      ANCHORED MODE         THE BOTTOM ENTRY POINTS TO THE
                   7252: *                            SPECIAL NODE NDABO WHICH CAUSES AN
                   7253: *                            ABORT. THE CURSOR VALUE STORED
                   7254: *                            WITH THIS ENTRY IS ALWAYS ZERO.
                   7255: *
                   7256: *      UNANCHORED MODE       THE BOTTOM ENTRY POINTS TO THE
                   7257: *                            SPECIAL NODE NDUNA WHICH MOVES THE
                   7258: *                            ANCHOR POINT AND RESTARTS THE MATCH
                   7259: *                            THE CURSOR SAVED WITH THIS ENTRY
                   7260: *                            IS THE NUMBER OF CHARACTERS WHICH
                   7261: *                            LIE BEFORE THE INITIAL ANCHOR POINT
                   7262: *                            (I.E. THE NUMBER OF ANCHOR MOVES).
                   7263: *                            THIS ENTRY IS THREE WORDS LONG AND
                   7264: *                            ALSO CONTAINS THE INITIAL PATTERN.
                   7265: *
                   7266: *      ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
                   7267: *      NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
                   7268: *      LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
                   7269: *      PATTERN MATCHING.
                   7270: *
                   7271: *      R$PMS                 POINTER TO SUBJECT STRING
                   7272: *      PMSSL                 LENGTH OF SUBJECT STRING
                   7273: *      PMDFL                 FLAG SET NON-ZERO FOR DOT PATTERNS
                   7274: *      PMHBS                 BASE PTR FOR CURRENT HISTORY STACK
                   7275: *
                   7276: *      THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
                   7277: *
                   7278: *      SUCCP                 SUCCESS IN MATCHING CURRENT NODE
                   7279: *      FAILP                 FAILURE IN MATCHING CURRENT NODE
                   7280:        EJC
                   7281: *
                   7282: *      COMPOUND PATTERNS
                   7283: *
                   7284: *      SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
                   7285: *      REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
                   7286: *      LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
                   7287: *
                   7288: *      AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
                   7289: *      THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
                   7290: *      TO THE ALTERNATIVE PATTERN.
                   7291: *
                   7292: *      ARB
                   7293: *      ---
                   7294: *
                   7295: *           +---+            THIS NODE (P$ARB) MATCHES NULL
                   7296: *           I B I-----       AND STACKS CURSOR, SUCCESSOR PTR,
                   7297: *           +---+            CURSOR (COPY) AND A PTR TO NDARC.
                   7298: *
                   7299: *
                   7300: *
                   7301: *
                   7302: *      BAL
                   7303: *      ---
                   7304: *
                   7305: *           +---+            THE P$BAL NODE SCANS A BALANCED
                   7306: *           I B I-----       STRING AND THEN STACKS A POINTER
                   7307: *           +---+            TO ITSELF ON THE HISTORY STACK.
                   7308:        EJC
                   7309: *
                   7310: *      COMPOUND PATTERN STRUCTURES (CONTINUED)
                   7311: *
                   7312: *
                   7313: *      ARBNO
                   7314: *      -----
                   7315: *
                   7316: *           +---+            THIS ALTERNATIVE NODE MATCHES NULL
                   7317: *      +----I + I-----       THE FIRST TIME AND STACKS A POINTER
                   7318: *      I    +---+            TO THE ARGUMENT PATTERN X.
                   7319: *      I      .
                   7320: *      I      .
                   7321: *      I    +---+            NODE (P$ABA) TO STACK CURSOR
                   7322: *      I    I A I            AND HISTORY STACK BASE PTR.
                   7323: *      I    +---+
                   7324: *      I      I
                   7325: *      I      I
                   7326: *      I    +---+            THIS IS THE ARGUMENT PATTERN. AS
                   7327: *      I    I X I            INDICATED, THE SUCCESSOR OF THE
                   7328: *      I    +---+            PATTERN IS THE P$ABC NODE
                   7329: *      I      I
                   7330: *      I      I
                   7331: *      I    +---+            THIS NODE (P$ABC) POPS PMHBS,
                   7332: *      +----I C I            STACKS OLD PMHBS AND PTR TO NDABD
                   7333: *           +---+            (UNLESS OPTIMISATION HAS OCCURRED)
                   7334: *
                   7335: *      STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
                   7336: *      RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
                   7337: *      THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
                   7338: *      NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
                   7339: *      TO MATCH THE ARGUMENT.  BEFORE THE ARGUMENT IS MATCHED
                   7340: *      P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB.  IF
                   7341: *      THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
                   7342: *      STACK ENTRY AND FAILS.
                   7343: *      IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
                   7344: *      VALUE (SAVED BY P$ABA) .  THEN IF THE ARGUMENT HAS LEFT
                   7345: *      ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
                   7346: *      AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
                   7347: *      IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA.  FINALLY
                   7348: *      A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
                   7349: *      STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
                   7350: *      IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
                   7351: *      HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
                   7352: *      TO MATCH THE ARG IF NECESSARY.  IF NOT , THE SUCCESSOR TO
                   7353: *      ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP.  P$ABD
                   7354: *      RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
                   7355: *      ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
                   7356:        EJC
                   7357: *
                   7358: *      COMPOUND PATTERN STRUCTURES (CONTINUED)
                   7359: *
                   7360: *      BREAKX
                   7361: *      ------
                   7362: *
                   7363: *           +---+            THIS NODE IS A BREAK NODE FOR
                   7364: *      +----I B I            THE ARGUMENT TO BREAKX, IDENTICAL
                   7365: *      I    +---+            TO AN ORDINARY BREAK NODE.
                   7366: *      I      I
                   7367: *      I      I
                   7368: *      I    +---+            THIS ALTERNATIVE NODE STACKS A
                   7369: *      I    I + I-----       POINTER TO THE BREAKX NODE TO
                   7370: *      I    +---+            ALLOW FOR SUBSEQUENT FAILURE
                   7371: *      I      .
                   7372: *      I      .
                   7373: *      I    +---+            THIS IS THE BREAKX NODE ITSELF. IT
                   7374: *      +----I X I            MATCHES ONE CHARACTER AND THEN
                   7375: *           +---+            PROCEEDS BACK TO THE BREAK NODE.
                   7376: *
                   7377: *
                   7378: *
                   7379: *
                   7380: *      FENCE
                   7381: *      -----
                   7382: *
                   7383: *           +---+            THE FENCE NODE MATCHES NULL AND
                   7384: *           I F I-----       STACKS A POINTER TO NODE NDABO TO
                   7385: *           +---+            ABORT ON A SUBSEQUENT REMATCH
                   7386: *
                   7387: *
                   7388: *
                   7389: *
                   7390: *      SUCCEED
                   7391: *      -------
                   7392: *
                   7393: *           +---+            THE NODE FOR SUCCEED MATCHES NULL
                   7394: *           I S I-----       AND STACKS A POINTER TO ITSELF
                   7395: *           +---+            TO REPEAT THE MATCH ON A FAILURE.
                   7396:        EJC
                   7397: *
                   7398: *      COMPOUND PATTERNS (CONTINUED)
                   7399: *
                   7400: *      BINARY DOT (PATTERN ASSIGNMENT)
                   7401: *      -------------------------------
                   7402: *
                   7403: *           +---+            THIS NODE (P$PAA) SAVES THE CURRENT
                   7404: *           I A I            CURSOR AND A POINTER TO THE
                   7405: *           +---+            SPECIAL NODE NDPAB ON THE STACK.
                   7406: *             I
                   7407: *             I
                   7408: *           +---+            THIS IS THE STRUCTURE FOR THE
                   7409: *           I X I            PATTERN LEFT ARGUMENT OF THE
                   7410: *           +---+            PATTERN ASSIGNMENT CALL.
                   7411: *             I
                   7412: *             I
                   7413: *           +---+            THIS NODE (P$PAC) SAVES THE CURSOR,
                   7414: *           I C I-----       A PTR TO ITSELF, THE CURSOR (COPY)
                   7415: *           +---+            AND A PTR TO NDPAD ON THE STACK.
                   7416: *
                   7417: *
                   7418: *      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
                   7419: *      IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
                   7420: *
                   7421: *      THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
                   7422: *      FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
                   7423: *      MAY HAVE OCCURED IN THE PATTERN MATCH
                   7424: *
                   7425: *      IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
                   7426: *      HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
                   7427: *      AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
                   7428: *
                   7429: *      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
                   7430: *      IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
                   7431: *      THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
                   7432: *      IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
                   7433: .IF    .CNFN
                   7434: .ELSE
                   7435:        EJC
                   7436: *
                   7437: *      FENCE (FUNCTION)
                   7438: *      ----------------
                   7439: *
                   7440: *           +---+            THIS NODE (P$FNA) SAVES THE
                   7441: *           I A I            CURRENT HISTORY STACK AND A
                   7442: *           +---+            POINTER TO NDFNB ON THE STACK.
                   7443: *             I
                   7444: *             I
                   7445: *           +---+            THIS IS THE PATTERN STRUCTURE
                   7446: *           I X I            GIVEN AS THE ARGUMENT TO THE
                   7447: *           +---+            FENCE FUNCTION.
                   7448: *             I
                   7449: *             I
                   7450: *           +---+            THIS NODE P$FNC RESTORES THE OUTER
                   7451: *           I C I            HISTORY STACK PTR SAVED IN P$FNA,
                   7452: *           +---+            AND STACKS THE INNER STACK BASE
                   7453: *                            PTR AND A POINTER TO NDFND ON THE
                   7454: *                            STACK.
                   7455: *
                   7456: *      NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
                   7457: *      ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
                   7458: *      STACK.
                   7459: *
                   7460: *      THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
                   7461: *      THE FENCE PATTERN LEAVES NO ALTERNATIVES.  IN THIS CASE,
                   7462: *      THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
                   7463: *
                   7464: *      NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
                   7465: *      GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
                   7466: *      STACK BACK PAST THE INNER STACK BASE CREATED BY P$FNA
                   7467: .FI
                   7468:        EJC
                   7469: *
                   7470: *      COMPOUND PATTERNS (CONTINUED)
                   7471: *
                   7472: *      EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
                   7473: *      -----------------------------------------------
                   7474: *
                   7475: *      INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
                   7476: *      IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
                   7477: *      PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
                   7478: *      FOR PROPER RECURSIVE PROCESSING.
                   7479: *
                   7480: *      1)   A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
                   7481: *           STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
                   7482: *
                   7483: *      2)   A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
                   7484: *           NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
                   7485: *           IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
                   7486: *           THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
                   7487: *           FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
                   7488: *           POINTER AND FAILS.
                   7489: *
                   7490: *      3)   THE RESULTING HISTORY STACK POINTER IS SAVED IN
                   7491: *           PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
                   7492: *
                   7493: *      AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
                   7494: *      CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
                   7495: *
                   7496: *      1)   LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
                   7497: *           OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
                   7498: *           CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
                   7499: *           WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
                   7500: *           CASE AND CONTINUE EXECUTION OF THE PROGRAM.
                   7501: *
                   7502: *      2)   OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
                   7503: *           WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
                   7504: *           NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
                   7505: *           THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
                   7506: *           THIS (INNER) VALUE AND AND THEN FAILS.
                   7507: *
                   7508: *      3)   USING THE HISTORY STACK ENTRY MADE ON STARTING THE
                   7509: *           EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
                   7510: *           PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
                   7511: *           PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
                   7512: *
                   7513: *      AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
                   7514: *      MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
                   7515: *      INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
                   7516: *      EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
                   7517: *      ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
                   7518:        EJC
                   7519: *
                   7520: *      COMPOUND PATTERNS (CONTINUED)
                   7521: *
                   7522: *      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
                   7523: *      ------------------------------------
                   7524: *
                   7525: *           +---+            THIS NODE (P$IMA) STACKS THE CURSOR
                   7526: *           I A I            PMHBS AND A PTR TO NDIMB AND RESETS
                   7527: *           +---+            THE STACK PTR PMHBS.
                   7528: *             I
                   7529: *             I
                   7530: *           +---+            THIS IS THE LEFT STRUCTURE FOR THE
                   7531: *           I X I            PATTERN LEFT ARGUMENT OF THE
                   7532: *           +---+            IMMEDIATE ASSIGNMENT CALL.
                   7533: *             I
                   7534: *             I
                   7535: *           +---+            THIS NODE (P$IMC) PERFORMS THE
                   7536: *           I C I-----       ASSIGNMENT, POPS PMHBS AND STACKS
                   7537: *           +---+            THE OLD PMHBS AND A PTR TO NDIMD.
                   7538: *
                   7539: *
                   7540: *      THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
                   7541: *      TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
                   7542: *
                   7543: *      THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
                   7544: *      LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
                   7545: *
                   7546: *      THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
                   7547: *      TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
                   7548: *      THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
                   7549: *      PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
                   7550: *      POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
                   7551: *
                   7552: *      THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
                   7553: *      LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
                   7554: *
                   7555: *      AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
                   7556: *      ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
                   7557: *      THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
                   7558:        EJC
                   7559: *
                   7560: *      ARBNO
                   7561: *
                   7562: *      SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
                   7563: *      ALGORITHM FOR MATCHING THIS NODE TYPE.
                   7564: *
                   7565: *      NO PARAMETERS
                   7566: *
                   7567: P$ABA  ENT  BL$P0            P0BLK
                   7568:        MOV  WB,-(XS)         STACK CURSOR
                   7569:        MOV  XR,-(XS)         STACK DUMMY NODE PTR
                   7570:        MOV  PMHBS,-(XS)      STACK OLD STACK BASE PTR
                   7571:        MOV  =NDABB,-(XS)     STACK PTR TO NODE NDABB
                   7572:        MOV  XS,PMHBS         STORE NEW STACK BASE PTR
                   7573:        BRN  SUCCP            SUCCEED
                   7574: *
                   7575: *      ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
                   7576: *
                   7577: *      NO PARAMETERS (DUMMY PATTERN)
                   7578: *
                   7579: P$ABB  ENT                   ENTRY POINT
                   7580:        MOV  WB,PMHBS         RESTORE HISTORY STACK BASE PTR
                   7581:        BRN  FLPOP            FAIL AND POP DUMMY NODE PTR
                   7582: *
                   7583: *      ARBNO (CHECK IF ARG MATCHED NULL STRING)
                   7584: *
                   7585: *      NO PARAMETERS (DUMMY PATTERN)
                   7586: *
                   7587: P$ABC  ENT  BL$P0            P0BLK
                   7588:        MOV  PMHBS,XT         KEEP P$ABB STACK BASE
                   7589:        MOV  3(XT),WA         LOAD INITIAL CURSOR
                   7590:        MOV  1(XT),PMHBS      RESTORE OUTER STACK BASE PTR
                   7591:        BEQ  XT,XS,PABC1      JUMP IF NO HISTORY STACK ENTRIES
                   7592:        MOV  XT,-(XS)         ELSE SAVE INNER PMHBS ENTRY
                   7593:        MOV  =NDABD,-(XS)     STACK PTR TO SPECIAL NODE NDABD
                   7594:        BRN  PABC2            MERGE
                   7595: *
                   7596: *      OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
                   7597: *
                   7598: PABC1  ADD  *NUM04,XS        REMOVE NDABB ENTRY AND CURSOR
                   7599: *
                   7600: *      MERGE TO CHECK FOR MATCHING OF NULL STRING
                   7601: *
                   7602: PABC2  BNE  WA,WB,SUCCP      ALLOW FURTHER ATTEMPT IF NON-NULL
                   7603:        MOV  PTHEN(XR),XR     BYPASS ALTERNATIVE NODE SO AS TO ..
                   7604:        BRN  SUCCP            ... REFUSE FURTHER MATCH ATTEMPTS
                   7605: *
                   7606: *      ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
                   7607: *
                   7608: *      NO PARAMETERS (DUMMY PATTERN)
                   7609: *
                   7610: P$ABD  ENT                   ENTRY POINT
                   7611:        MOV  WB,PMHBS         RESTORE INNER STACK BASE PTR
                   7612:        BRN  FAILP            AND FAIL
                   7613:        EJC
                   7614: *
                   7615: *      ABORT
                   7616: *
                   7617: *      NO PARAMETERS
                   7618: *
                   7619: P$ABO  ENT  BL$P0            P0BLK
                   7620:        BRN  EXFAL            SIGNAL STATEMENT FAILURE
                   7621: *
                   7622: *      ALTERNATION
                   7623: *
                   7624: *      PARM1                 ALTERNATIVE NODE
                   7625: *
                   7626: P$ALT  ENT  BL$P1            P1BLK
                   7627:        MOV  WB,-(XS)         STACK CURSOR
                   7628:        MOV  PARM1(XR),-(XS)  STACK POINTER TO ALTERNATIVE
                   7629:        CHK                   CHECK FOR STACK OVERFLOW
                   7630:        BRN  SUCCP            IF ALL OK, THEN SUCCEED
                   7631:        EJC
                   7632: *
                   7633: *      ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
                   7634: *
                   7635: *      PARM1                 CHARACTER ARGUMENT
                   7636: *
                   7637: P$ANS  ENT  BL$P1            P1BLK
                   7638:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARS LEFT
                   7639:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   7640:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   7641:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   7642:        BNE  WA,PARM1(XR),FAILP FAIL IF NO MATCH
                   7643:        ICV  WB               ELSE BUMP CURSOR
                   7644:        BRN  SUCCP            AND SUCCEED
                   7645: *
                   7646: *      ANY (MULTI-CHARACTER ARGUMENT CASE)
                   7647: *      EXPRESSION ARGUMENT CASE MERGES
                   7648: *
                   7649: *      PARM1                 POINTER TO CTBLK
                   7650: *      PARM2                 BIT MASK TO SELECT BIT IN CTBLK
                   7651: *
                   7652: P$ANY  ENT  BL$P2            P2BLK
                   7653:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARACTERS LEFT
                   7654:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   7655:        PLC  XL,WB            GET CHAR PTR TO CURRENT CHARACTER
                   7656:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   7657:        MOV  PARM1(XR),XL     POINT TO CTBLK
                   7658:        WTB  WA               CHANGE TO BAU OFFSET
                   7659:        ADD  WA,XL            POINT TO ENTRY IN CTBLK
                   7660:        MOV  CTCHS(XL),WA     LOAD WORD FROM CTBLK
                   7661:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   7662:        ZRB  WA,FAILP         FAIL IF NO MATCH
                   7663:        ICV  WB               ELSE BUMP CURSOR
                   7664:        BRN  SUCCP            AND SUCCEED
                   7665: *
                   7666: *      ANY (EXPRESSION ARGUMENT)
                   7667: *
                   7668: *      PARM1                 EXPRESSION POINTER
                   7669: *
                   7670: P$AYD  ENT  BL$P1            P1BLK
                   7671:        MOV  =P$ANY,WA        PCODE FOR NEW NODE
                   7672:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   7673:        ERR  050,ANY EVALUATED ARGUMENT IS NOT STRING
                   7674:        PPM  FAILP            FAIL IF EVALUATION FAILURE
                   7675:        BRI  XL               MERGE MULTI-CHAR CASE IF OK
                   7676:        EJC
                   7677: *
                   7678: *      P$ARB                 INITIAL ARB MATCH
                   7679: *
                   7680: *      NO PARAMETERS
                   7681: *
                   7682: *      THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
                   7683: *      FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
                   7684: *
                   7685: P$ARB  ENT  BL$P0            P0BLK
                   7686:        MOV  PTHEN(XR),XR     LOAD SUCCESSOR POINTER
                   7687:        MOV  WB,-(XS)         STACK DUMMY CURSOR
                   7688:        MOV  XR,-(XS)         STACK SUCCESSOR POINTER
                   7689:        MOV  WB,-(XS)         STACK CURSOR
                   7690:        MOV  =NDARC,-(XS)     STACK PTR TO SPECIAL NODE NDARC
                   7691:        BRI  (XR)             EXECUTE NEXT NODE MATCHING NULL
                   7692: *
                   7693: *      P$ARC                 EXTEND ARB MATCH
                   7694: *
                   7695: *      NO PARAMETERS (DUMMY PATTERN)
                   7696: *
                   7697: P$ARC  ENT                   ENTRY POINT
                   7698:        BEQ  WB,PMSSL,FLPOP   FAIL AND POP STACK TO SUCCESSOR
                   7699:        ICV  WB               ELSE BUMP CURSOR
                   7700:        MOV  WB,-(XS)         STACK UPDATED CURSOR
                   7701:        MOV  XR,-(XS)         RESTACK POINTER TO NDARC NODE
                   7702:        MOV  2(XS),XR         LOAD SUCCESSOR POINTER
                   7703:        BRI  (XR)             OFF TO REEXECUTE SUCCESSOR NODE
                   7704:        EJC
                   7705: *
                   7706: *      BAL
                   7707: *
                   7708: *      NO PARAMETERS
                   7709: *
                   7710: *      THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
                   7711: *      FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
                   7712: *
                   7713: P$BAL  ENT  BL$P0            P0BLK
                   7714:        ZER  WC               ZERO PARENTHESES LEVEL COUNTER
                   7715:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   7716:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   7717:        BRN  PBAL2            JUMP INTO SCAN LOOP
                   7718: *
                   7719: *      LOOP TO SCAN OUT CHARACTERS
                   7720: *
                   7721: PBAL1  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
                   7722:        ICV  WB               PUSH CURSOR FOR CHARACTER
                   7723:        BEQ  WA,=CH$PP,PBAL3  JUMP IF LEFT PAREN
                   7724:        BEQ  WA,=CH$RP,PBAL4  JUMP IF RIGHT PAREN
                   7725:        BZE  WC,PBAL5         ELSE SUCCEED IF AT OUTER LEVEL
                   7726: *
                   7727: *      HERE AFTER PROCESSING ONE CHARACTER
                   7728: *
                   7729: PBAL2  BNE  WB,PMSSL,PBAL1   LOOP BACK UNLESS END OF STRING
                   7730:        BRN  FAILP            IN WHICH CASE, FAIL
                   7731: *
                   7732: *      HERE ON LEFT PAREN
                   7733: *
                   7734: PBAL3  ICV  WC               BUMP PAREN LEVEL
                   7735:        BRN  PBAL2            LOOP BACK TO CHECK END OF STRING
                   7736: *
                   7737: *      HERE FOR RIGHT PAREN
                   7738: *
                   7739: PBAL4  BZE  WC,FAILP         FAIL IF NO MATCHING LEFT PAREN
                   7740:        DCV  WC               ELSE DECREMENT LEVEL COUNTER
                   7741:        BNZ  WC,PBAL2         LOOP BACK IF NOT AT OUTER LEVEL
                   7742: *
                   7743: *      HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
                   7744: *
                   7745: PBAL5  MOV  WB,-(XS)         STACK CURSOR
                   7746:        MOV  XR,-(XS)         STACK PTR TO BAL NODE FOR EXTEND
                   7747:        BRN  SUCCP            AND SUCCEED
                   7748:        EJC
                   7749: *
                   7750: *      BREAK (EXPRESSION ARGUMENT)
                   7751: *
                   7752: *      PARM1                 EXPRESSION POINTER
                   7753: *
                   7754: P$BKD  ENT  BL$P1            P1BLK
                   7755:        MOV  =P$BRK,WA        PCODE FOR NEW NODE
                   7756:        JSR  EVALS            EVALUATE STRING EXPRESSION
                   7757:        ERR  051,BREAK EVALUATED ARGUMENT IS NOT STRING
                   7758:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   7759:        BRI  XL               MERGE WITH MULTI-CHAR CASE IF OK
                   7760: *
                   7761: *      BREAK (ONE CHARACTER ARGUMENT)
                   7762: *
                   7763: *      PARM1                 CHARACTER ARGUMENT
                   7764: *
                   7765: P$BKS  ENT  BL$P1            P1BLK
                   7766:        MOV  PMSSL,WC         GET SUBJECT STRING LENGTH
                   7767:        SUB  WB,WC            GET NUMBER OF CHARACTERS LEFT
                   7768:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   7769:        LCT  WC,WC            SET COUNTER FOR CHARS LEFT
                   7770:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   7771:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   7772: *
                   7773: *      LOOP TO SCAN TILL BREAK CHARACTER FOUND
                   7774: *
                   7775: PBKS1  LCH  WA,(XL)+         LOAD NEXT CHAR, BUMP POINTER
                   7776:        BEQ  WA,PARM1(XR),SUCCP SUCCEED IF BREAK CHARACTER FOUND
                   7777:        ICV  WB               ELSE PUSH CURSOR
                   7778:        BCT  WC,PBKS1         LOOP BACK IF MORE TO GO
                   7779:        BRN  FAILP            FAIL IF END OF STRING, NO BREAK CHR
                   7780:        EJC
                   7781: *
                   7782: *      BREAK (MULTI-CHARACTER ARGUMENT)
                   7783: *      EXPRESSION ARGUMENT CASE MERGES
                   7784: *
                   7785: *      PARM1                 POINTER TO CTBLK
                   7786: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
                   7787: *
                   7788: P$BRK  ENT  BL$P2            P2BLK
                   7789:        MOV  PMSSL,WC         LOAD SUBJECT STRING LENGTH
                   7790:        SUB  WB,WC            GET NUMBER OF CHARACTERS LEFT
                   7791:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   7792:        LCT  WC,WC            SET COUNTER FOR CHARACTERS LEFT
                   7793:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   7794:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   7795:        MOV  XR,PSAVE         SAVE NODE POINTER
                   7796: *
                   7797: *      LOOP TO SEARCH FOR BREAK CHARACTER
                   7798: *
                   7799: PBRK2  LCH  WA,(XL)+         LOAD NEXT CHAR, BUMP POINTER
                   7800:        MOV  PARM1(XR),XR     LOAD POINTER TO CTBLK
                   7801:        WTB  WA               CONVERT TO BAU OFFSET
                   7802:        ADD  WA,XR            POINT TO CTBLK ENTRY
                   7803:        MOV  CTCHS(XR),WA     LOAD CTBLK WORD
                   7804:        MOV  PSAVE,XR         RESTORE NODE POINTER
                   7805:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   7806:        NZB  WA,SUCCP         SUCCEED IF BREAK CHARACTER FOUND
                   7807:        ICV  WB               ELSE PUSH CURSOR
                   7808:        BCT  WC,PBRK2         LOOP BACK UNLESS END OF STRING
                   7809:        BRN  FAILP            FAIL IF END OF STRING, NO BREAK CHR
                   7810:        EJC
                   7811: *
                   7812: *      BREAKX (EXTENSION)
                   7813: *
                   7814: *      THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
                   7815: *      MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
                   7816: *      PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
                   7817: *
                   7818: *      NO PARAMETERS
                   7819: *
                   7820: P$BKX  ENT  BL$P0            P0BLK
                   7821:        ICV  WB               STEP CURSOR PAST PREVIOUS BREAK CHR
                   7822:        BRN  SUCCP            SUCCEED TO REMATCH BREAK
                   7823: *
                   7824: *      BREAKX (EXPRESSION ARGUMENT)
                   7825: *
                   7826: *      SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
                   7827: *      BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
                   7828: *      BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
                   7829: *      ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
                   7830: *
                   7831: *      PARM1                 EXPRESSION POINTER
                   7832: *
                   7833: P$BXD  ENT  BL$P1            P1BLK
                   7834:        MOV  =P$BRK,WA        PCODE FOR NEW NODE
                   7835:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   7836:        ERR  052,BREAKX EVALUATED ARGUMENT IS NOT STRING
                   7837:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   7838:        BRI  XL               MERGE WITH BREAK IF ALL OK
                   7839: *
                   7840: *      CURSOR ASSIGNMENT
                   7841: *
                   7842: *      PARM1                 NAME BASE
                   7843: *      PARM2                 NAME OFFSET
                   7844: *
                   7845: P$CAS  ENT  BL$P2            P2BLK
                   7846:        MOV  XR,-(XS)         SAVE NODE POINTER
                   7847:        MOV  WB,-(XS)         SAVE CURSOR
                   7848:        MOV  PARM1(XR),XL     LOAD NAME BASE
                   7849:        MTI  WB               LOAD CURSOR AS INTEGER
                   7850:        MOV  PARM2(XR),WB     LOAD NAME OFFSET
                   7851:        JSR  ICBLD            GET ICBLK FOR CURSOR VALUE
                   7852:        MOV  WB,WA            MOVE NAME OFFSET
                   7853:        MOV  XR,WB            MOVE VALUE TO ASSIGN
                   7854:        JSR  ASINP            PERFORM ASSIGNMENT
                   7855:        PPM  FLPOP            FAIL ON ASSIGNMENT FAILURE
                   7856:        MOV  (XS)+,WB         ELSE RESTORE CURSOR
                   7857:        MOV  (XS)+,XR         RESTORE NODE POINTER
                   7858:        BRN  SUCCP            AND SUCCEED MATCHING NULL
                   7859:        EJC
                   7860: *
                   7861: *      EXPRESSION NODE (P$EXA, INITIAL ENTRY)
                   7862: *
                   7863: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   7864: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
                   7865: *
                   7866: *      PARM1                 EXPRESSION POINTER
                   7867: *
                   7868: P$EXA  ENT  BL$P1            P1BLK
                   7869:        JSR  EVALP            EVALUATE EXPRESSION
                   7870:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   7871:        BLO  WA,=P$AAA,PEXA1  JUMP IF RESULT IS NOT A PATTERN
                   7872: *
                   7873: *      HERE IF RESULT OF EXPRESSION IS A PATTERN
                   7874: *
                   7875:        MOV  WB,-(XS)         STACK DUMMY CURSOR
                   7876:        MOV  XR,-(XS)         STACK PTR TO P$EXA NODE
                   7877:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE PTR
                   7878:        MOV  =NDEXB,-(XS)     STACK PTR TO SPECIAL NODE NDEXB
                   7879:        MOV  XS,PMHBS         STORE NEW STACK BASE POINTER
                   7880:        MOV  XL,XR            COPY NODE POINTER
                   7881:        BRI  (XR)             MATCH FIRST NODE IN EXPRESSION PAT
                   7882: *
                   7883: *      HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
                   7884: *
                   7885: PEXA1  BEQ  WA,=B$SCL,PEXA2  JUMP IF IT IS ALREADY A STRING
                   7886:        MOV  XL,-(XS)         ELSE STACK RESULT
                   7887:        MOV  XR,XL            SAVE NODE POINTER
                   7888:        JSR  GTSTG            CONVERT RESULT TO STRING
                   7889:        ERR  053,EXPRESSION DOES NOT EVALUATE TO PATTERN
                   7890:        MOV  XR,WC            COPY STRING POINTER
                   7891:        MOV  XL,XR            RESTORE NODE POINTER
                   7892:        MOV  WC,XL            COPY STRING POINTER AGAIN
                   7893: *
                   7894: *      MERGE HERE WITH STRING POINTER IN XL
                   7895: *
                   7896: PEXA2  BZE  SCLEN(XL),SUCCP  JUST SUCCEED IF NULL STRING
                   7897:        MOV  XR,PSAVE         SAVE NODE PTR
                   7898:        MOV  R$PMS,XR         LOAD SUBJECT STRING PTR
                   7899:        PLC  XR,WB            POINT TO CURRENT CHAR
                   7900:        ADD  SCLEN(XL),WB     COMPUTE NEW CURSOR POSITION
                   7901:        BGT  WB,PMSSL,FAILP   FAIL IF PAST END OF STRING
                   7902:        MOV  WB,PSAVC         SAVE UPDATED CURSOR
                   7903:        MOV  SCLEN(XL),WA     NUMBER OF CHARS TO COMPARE
                   7904:        PLC  XL               POINT TO TEST STRING CHARS
                   7905:        CMC  FAILP,FAILP      COMPARE, FAIL IF UNEQUAL
                   7906:        MOV  PSAVE,XR         IF ALL MATCHED, RESTORE NODE PTR
                   7907:        MOV  PSAVC,WB         RESTORE UPDATED CURSOR
                   7908:        BRN  SUCCP            AND SUCCEED
                   7909:        EJC
                   7910: *
                   7911: *      EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
                   7912: *
                   7913: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   7914: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
                   7915: *
                   7916: *      NO PARAMETERS (DUMMY PATTERN)
                   7917: *
                   7918: P$EXB  ENT                   ENTRY POINT
                   7919:        MOV  WB,PMHBS         RESTORE OUTER LEVEL STACK POINTER
                   7920:        BRN  FLPOP            FAIL AND POP P$EXA NODE PTR
                   7921:        EJC
                   7922: *
                   7923: *      EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
                   7924: *
                   7925: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   7926: *      ALGORITHMS FOR HANDLING EXPRESSION NODES.
                   7927: *
                   7928: *      NO PARAMETERS (DUMMY PATTERN)
                   7929: *
                   7930: P$EXC  ENT                   ENTRY POINT
                   7931:        MOV  WB,PMHBS         RESTORE INNER STACK BASE POINTER
                   7932:        BRN  FAILP            AND FAIL INTO EXPR PATTERN ALTERNVS
                   7933: *
                   7934: *      FAIL
                   7935: *
                   7936: *      NO PARAMETERS
                   7937: *
                   7938: P$FAL  ENT  BL$P0            P0BLK
                   7939:        BRN  FAILP            JUST SIGNAL FAILURE
                   7940:        EJC
                   7941: *      FENCE
                   7942: *
                   7943: *      SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
                   7944: *      ALGORITHM FOR MATCHING THIS NODE TYPE.
                   7945: *
                   7946: *      NO PARAMETERS
                   7947: *
                   7948: P$FEN  ENT  BL$P0            P0BLK
                   7949:        MOV  WB,-(XS)         STACK DUMMY CURSOR
                   7950:        MOV  =NDABO,-(XS)     STACK PTR TO ABORT NODE
                   7951:        BRN  SUCCP            AND SUCCEED MATCHING NULL
                   7952: .IF    .CNFN
                   7953: .ELSE
                   7954: *
                   7955: *      FENCE (FUNCTION)
                   7956: *
                   7957: *      SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
                   7958: *      FOR DETAILS OF SCHEME
                   7959: *
                   7960: *      NO PARAMETERS
                   7961: *
                   7962: P$FNA  ENT  BL$P0            P0BLK
                   7963:        MOV  PMHBS,-(XS)      STACK CURRENT HISTORY STACK BASE
                   7964:        MOV  =NDFNB,-(XS)     STACK INDIR PTR TO P$FNB (FAILURE)
                   7965:        MOV  XS,PMHBS         BEGIN NEW HISTORY STACK
                   7966:        BRN  SUCCP            SUCCEED
                   7967: *
                   7968: *      FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
                   7969: *
                   7970: *      NO PARAMETERS (DUMMY PATTERN)
                   7971: *
                   7972: P$FNB  ENT  BL$P0            P0BLK
                   7973:        MOV  WB,PMHBS         RESTORE OUTER PMHBS STACK BASE
                   7974:        BRN  FAILP            ...AND FAIL
                   7975: *
                   7976: *      FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
                   7977: *
                   7978: *      NO PARAMETERS (DUMMY PATTERN)
                   7979: *
                   7980: P$FNC  ENT  BL$P0            P0BLK
                   7981:        MOV  PMHBS,XT         GET INNER STACK BASE PTR
                   7982:        MOV  NUM01(XT),PMHBS  RESTORE OUTER STACK BASE
                   7983:        BEQ  XT,XS,PFNC1      OPTIMIZE IF NO ALTERNATIVES
                   7984:        MOV  XT,-(XS)         ELSE STACK INNER STACK BASE
                   7985:        MOV  =NDFND,-(XS)     STACK PTR TO NDFND
                   7986:        BRN  SUCCP            SUCCEED
                   7987: *
                   7988: *      HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
                   7989: *
                   7990: PFNC1  ADD  *NUM02,XS        POP OFF P$FNB ENTRY
                   7991:        BRN  SUCCP            SUCCEED
                   7992: *
                   7993: *      FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
                   7994: *
                   7995: *      NO PARAMETERS (DUMMY PATTERN)
                   7996: *
                   7997: P$FND  ENT  BL$P0            P0BLK
                   7998:        MOV  WB,XS            POP STACK TO FENCE() HISTORY BASE
                   7999:        BRN  FLPOP            POP BASE ENTRY AND FAIL
                   8000: .FI
                   8001:        EJC
                   8002: *
                   8003: *      IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
                   8004: *
                   8005: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   8006: *      STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
                   8007: *
                   8008: *      NO PARAMETERS
                   8009: *
                   8010: P$IMA  ENT  BL$P0            P0BLK
                   8011:        MOV  WB,-(XS)         STACK CURSOR
                   8012:        MOV  XR,-(XS)         STACK DUMMY NODE POINTER
                   8013:        MOV  PMHBS,-(XS)      STACK OLD STACK BASE POINTER
                   8014:        MOV  =NDIMB,-(XS)     STACK PTR TO SPECIAL NODE NDIMB
                   8015:        MOV  XS,PMHBS         STORE NEW STACK BASE POINTER
                   8016:        BRN  SUCCP            AND SUCCEED
                   8017: *
                   8018: *      IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
                   8019: *
                   8020: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   8021: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8022: *
                   8023: *      NO PARAMETERS (DUMMY PATTERN)
                   8024: *
                   8025: P$IMB  ENT                   ENTRY POINT
                   8026:        MOV  WB,PMHBS         RESTORE HISTORY STACK BASE PTR
                   8027:        BRN  FLPOP            FAIL AND POP DUMMY NODE PTR
                   8028:        EJC
                   8029: *
                   8030: *      IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
                   8031: *
                   8032: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   8033: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8034: *
                   8035: *      PARM1                 NAME BASE OF VARIABLE
                   8036: *      PARM2                 NAME OFFSET OF VARIABLE
                   8037: *
                   8038: P$IMC  ENT  BL$P2            P2BLK
                   8039:        MOV  PMHBS,XT         LOAD POINTER TO P$IMB ENTRY
                   8040:        MOV  WB,WA            COPY FINAL CURSOR
                   8041:        MOV  3(XT),WB         LOAD INITIAL CURSOR
                   8042:        MOV  1(XT),PMHBS      RESTORE OUTER STACK BASE POINTER
                   8043:        BEQ  XT,XS,PIMC1      JUMP IF NO HISTORY STACK ENTRIES
                   8044:        MOV  XT,-(XS)         ELSE SAVE INNER PMHBS POINTER
                   8045:        MOV  =NDIMD,-(XS)     AND A PTR TO SPECIAL NODE NDIMD
                   8046:        BRN  PIMC2            MERGE
                   8047: *
                   8048: *      HERE IF NO ENTRIES MADE ON HISTORY STACK
                   8049: *
                   8050: PIMC1  ADD  *NUM04,XS        REMOVE NDIMB ENTRY AND CURSOR
                   8051: *
                   8052: *      MERGE HERE TO PERFORM ASSIGNMENT
                   8053: *
                   8054: PIMC2  MOV  WA,-(XS)         SAVE CURRENT (FINAL) CURSOR
                   8055:        MOV  XR,-(XS)         SAVE CURRENT NODE POINTER
                   8056:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   8057:        SUB  WB,WA            COMPUTE SUBSTRING LENGTH
                   8058:        JSR  SBSTR            BUILD SUBSTRING
                   8059:        MOV  XR,WB            MOVE RESULT
                   8060:        MOV  (XS),XR          RELOAD NODE POINTER
                   8061:        MOV  PARM1(XR),XL     LOAD NAME BASE
                   8062:        MOV  PARM2(XR),WA     LOAD NAME OFFSET
                   8063:        JSR  ASINP            PERFORM ASSIGNMENT
                   8064:        PPM  FLPOP            FAIL IF ASSIGNMENT FAILS
                   8065:        MOV  (XS)+,XR         ELSE RESTORE NODE POINTER
                   8066:        MOV  (XS)+,WB         RESTORE CURSOR
                   8067:        BRN  SUCCP            AND SUCCEED
                   8068: *
                   8069: *      IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
                   8070: *
                   8071: *      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
                   8072: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8073: *
                   8074: *      NO PARAMETERS (DUMMY PATTERN)
                   8075: *
                   8076: P$IMD  ENT                   ENTRY POINT
                   8077:        MOV  WB,PMHBS         RESTORE INNER STACK BASE POINTER
                   8078:        BRN  FAILP            AND FAIL
                   8079:        EJC
                   8080: *
                   8081: *      LEN (INTEGER ARGUMENT)
                   8082: *
                   8083: *      PARM1                 INTEGER ARGUMENT
                   8084: *
                   8085: P$LEN  ENT  BL$P1            P1BLK
                   8086:        ADD  PARM1(XR),WB     PUSH CURSOR INDICATED AMOUNT
                   8087:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
                   8088:        BRN  FAILP            ELSE FAIL
                   8089: *
                   8090: *      LEN (EXPRESSION ARGUMENT)
                   8091: *
                   8092: *      PARM1                 EXPRESSION POINTER
                   8093: *
                   8094: P$LND  ENT  BL$P1            P1BLK
                   8095:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   8096:        ERR  054,LEN EVALUATED ARGUMENT IS NOT INTEGER
                   8097:        ERR  055,LEN EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   8098:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8099:        ADD  PARM1(XR),WB     PUSH CURSOR INDICATED AMOUNT
                   8100:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
                   8101:        BRN  FAILP            ELSE FAIL
                   8102:        EJC
                   8103: *
                   8104: *      NOTANY (EXPRESSION ARGUMENT)
                   8105: *
                   8106: *      PARM1                 EXPRESSION POINTER
                   8107: *
                   8108: P$NAD  ENT  BL$P1            P1BLK
                   8109:        MOV  =P$NAY,WA        PCODE FOR NEW NODE
                   8110:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   8111:        ERR  056,NOTANY EVALUATED ARGUMENT IS NOT STRING
                   8112:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8113:        BRI  XL               MERGE WITH MULTI-CHAR CASE IF OK
                   8114:        EJC
                   8115: *
                   8116: *      NOTANY (ONE CHARACTER ARGUMENT)
                   8117: *
                   8118: *      PARM1                 CHARACTER ARGUMENT
                   8119: *
                   8120: P$NAS  ENT  BL$P1            ENTRY POINT
                   8121:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARS LEFT
                   8122:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   8123:        PLC  XL,WB            POINT TO CURRENT CHARACTER IN STRIN
                   8124:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   8125:        BEQ  WA,PARM1(XR),FAILP FAIL IF MATCH
                   8126:        ICV  WB               ELSE BUMP CURSOR
                   8127:        BRN  SUCCP            AND SUCCEED
                   8128:        EJC
                   8129: *
                   8130: *      NOTANY (MULTI-CHARACTER STRING ARGUMENT)
                   8131: *      EXPRESSION ARGUMENT CASE MERGES
                   8132: *
                   8133: *      PARM1                 POINTER TO CTBLK
                   8134: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
                   8135: *
                   8136: P$NAY  ENT  BL$P2            P2BLK
                   8137:        BEQ  WB,PMSSL,FAILP   FAIL IF NO CHARACTERS LEFT
                   8138:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   8139:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8140:        LCH  WA,(XL)          LOAD CURRENT CHARACTER
                   8141:        WTB  WA               CONVERT TO BAU OFFSET
                   8142:        MOV  PARM1(XR),XL     LOAD POINTER TO CTBLK
                   8143:        ADD  WA,XL            POINT TO ENTRY IN CTBLK
                   8144:        MOV  CTCHS(XL),WA     LOAD ENTRY FROM CTBLK
                   8145:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   8146:        NZB  WA,FAILP         FAIL IF CHARACTER IS MATCHED
                   8147:        ICV  WB               ELSE BUMP CURSOR
                   8148:        BRN  SUCCP            AND SUCCEED
                   8149:        EJC
                   8150: *
                   8151: *      END OF PATTERN MATCH
                   8152: *
                   8153: *      THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
                   8154: *      SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
                   8155: *      PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
                   8156: *
                   8157: *      NO PARAMETERS (DUMMY PATTERN)
                   8158: *
                   8159: P$NTH  ENT                   ENTRY POINT
                   8160:        MOV  PMHBS,XT         LOAD POINTER TO BASE OF STACK
                   8161:        MOV  1(XT),WA         LOAD SAVED PMHBS (OR PATTERN TYPE)
                   8162:        BLE  WA,=NUM02,PNTH2  JUMP IF OUTER LEVEL (PATTERN TYPE)
                   8163: *
                   8164: *      HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
                   8165: *
                   8166:        MOV  WA,PMHBS         RESTORE OUTER STACK BASE POINTER
                   8167:        MOV  2(XT),XR         RESTORE POINTER TO P$EXA NODE
                   8168:        BEQ  XT,XS,PNTH1      JUMP IF NO HISTORY STACK ENTRIES
                   8169:        MOV  XT,-(XS)         ELSE STACK INNER STACK BASE PTR
                   8170:        MOV  =NDEXC,-(XS)     STACK PTR TO SPECIAL NODE NDEXC
                   8171:        BRN  SUCCP            AND SUCCEED
                   8172: *
                   8173: *      HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
                   8174: *
                   8175: PNTH1  ADD  *NUM04,XS        REMOVE P$EXB ENTRY AND NODE PTR
                   8176:        BRN  SUCCP            AND SUCCEED
                   8177: *
                   8178: *      HERE IF END OF MATCH AT OUTER LEVEL
                   8179: *
                   8180: PNTH2  MOV  WB,PMSSL         SAVE FINAL CURSOR IN SAFE PLACE
                   8181:        BZE  PMDFL,PNTH6      JUMP IF NO PATTERN ASSIGNMENTS
                   8182:        EJC
                   8183: *
                   8184: *      END OF PATTERN MATCH (CONTINUED)
                   8185: *
                   8186: *      NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
                   8187: *      SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
                   8188: *
                   8189: PNTH3  DCA  XT               POINT PAST CURSOR ENTRY
                   8190:        MOV  -(XT),WA         LOAD NODE POINTER
                   8191:        BEQ  WA,=NDPAD,PNTH4  JUMP IF NDPAD ENTRY
                   8192:        BNE  WA,=NDPAB,PNTH5  JUMP IF NOT NDPAB ENTRY
                   8193: *
                   8194: *      HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
                   8195: *      NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
                   8196: *
                   8197:        MOV  1(XT),-(XS)      STACK INITIAL CURSOR
                   8198:        CHK                   CHECK FOR STACK OVERFLOW
                   8199:        BRN  PNTH3            LOOP BACK IF OK
                   8200: *
                   8201: *      HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
                   8202: *      MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
                   8203: *
                   8204: PNTH4  MOV  1(XT),WA         LOAD FINAL CURSOR
                   8205:        MOV  (XS),WB          LOAD INITIAL CURSOR FROM STACK
                   8206:        MOV  XT,(XS)          SAVE HISTORY STACK SCAN PTR
                   8207:        SUB  WB,WA            COMPUTE LENGTH OF STRING
                   8208: *
                   8209: *      BUILD SUBSTRING AND PERFORM ASSIGNMENT
                   8210: *
                   8211:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   8212:        JSR  SBSTR            CONSTRUCT SUBSTRING
                   8213:        MOV  XR,WB            COPY SUBSTRING POINTER
                   8214:        MOV  (XS),XT          RELOAD HISTORY STACK SCAN PTR
                   8215:        MOV  2(XT),XL         LOAD POINTER TO P$PAC NODE WITH NAM
                   8216:        MOV  PARM2(XL),WA     LOAD NAME OFFSET
                   8217:        MOV  PARM1(XL),XL     LOAD NAME BASE
                   8218:        JSR  ASINP            PERFORM ASSIGNMENT
                   8219:        PPM  EXFAL            MATCH FAILS IF NAME EVAL FAILS
                   8220:        MOV  (XS)+,XT         ELSE RESTORE HISTORY STACK PTR
                   8221:        EJC
                   8222: *
                   8223: *      END OF PATTERN MATCH (CONTINUED)
                   8224: *
                   8225: *      HERE CHECK FOR END OF ENTRIES
                   8226: *
                   8227: PNTH5  BNE  XT,XS,PNTH3      LOOP IF MORE ENTRIES TO SCAN
                   8228: *
                   8229: *      HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
                   8230: *
                   8231: PNTH6  MOV  PMHBS,XS         WIPE OUT HISTORY STACK
                   8232:        MOV  (XS)+,WB         LOAD INITIAL CURSOR
                   8233:        MOV  (XS)+,WC         LOAD MATCH TYPE CODE
                   8234:        MOV  PMSSL,WA         LOAD FINAL CURSOR VALUE
                   8235:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   8236:        ZER  R$PMS            CLEAR SUBJECT STRING PTR FOR GBCOL
                   8237:        BZE  WC,PNTH7         JUMP IF CALL BY NAME
                   8238:        ZER  R$PMB            CLEAR POSSIBLE BCBLK PTR FOR GBCOL
                   8239:        BEQ  WC,=NUM02,EXITS  EXIT IF STATEMENT LEVEL CALL
                   8240: *
                   8241: *      HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
                   8242: *
                   8243:        SUB  WB,WA            COMPUTE LENGTH OF STRING
                   8244:        JSR  SBSTR            BUILD SUBSTRING
                   8245:        BRN  EXIXR            AND EXIT WITH SUBSTRING VALUE
                   8246: *
                   8247: *      HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
                   8248: *
                   8249: PNTH7  MOV  WB,-(XS)         STACK INITIAL CURSOR
                   8250:        MOV  WA,-(XS)         STACK FINAL CURSOR
                   8251: .IF    .CNBF
                   8252:        MOV  XL,-(XS)         STACK SUBJECT STRING POINTER
                   8253: .ELSE
                   8254:        BZE  R$PMB,PNTH8      SKIP IF SUBJECT NOT BUFFER
                   8255:        MOV  R$PMB,XL         ELSE GET PTR TO BCBLK INSTEAD
                   8256:        ZER  R$PMB            CLEAR BCBLK PTR FOR GBCOL
                   8257: *
                   8258: *      HERE WITH XL POINTING TO SCBLK OR BCBLK
                   8259: *
                   8260: PNTH8  MOV  XL,-(XS)         STACK SUBJECT POINTER
                   8261: .FI
                   8262:        BRN  EXITS            EXIT WITH SPECIAL ENTRY ON STACK
                   8263:        EJC
                   8264: *
                   8265: *      POS (INTEGER ARGUMENT)
                   8266: *
                   8267: *      PARM1                 INTEGER ARGUMENT
                   8268: *
                   8269: P$POS  ENT  BL$P1            P1BLK
                   8270:        BEQ  WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
                   8271:        BRN  FAILP            ELSE FAIL
                   8272: *
                   8273: *      POS (EXPRESSION ARGUMENT)
                   8274: *
                   8275: *      PARM1                 EXPRESSION POINTER
                   8276: *
                   8277: P$PSD  ENT  BL$P1            P1BLK
                   8278:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   8279:        ERR  057,POS EVALUATED ARGUMENT IS NOT INTEGER
                   8280:        ERR  058,POS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   8281:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8282:        BEQ  WB,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
                   8283:        BRN  FAILP            ELSE FAIL
                   8284:        EJC
                   8285: *
                   8286: *      PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
                   8287: *
                   8288: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   8289: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8290: *
                   8291: *      NO PARAMETERS
                   8292: *
                   8293: P$PAA  ENT  BL$P0            P0BLK
                   8294:        MOV  WB,-(XS)         STACK INITIAL CURSOR
                   8295:        MOV  =NDPAB,-(XS)     STACK PTR TO NDPAB SPECIAL NODE
                   8296:        BRN  SUCCP            AND SUCCEED MATCHING NULL
                   8297: *
                   8298: *      PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
                   8299: *
                   8300: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   8301: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8302: *
                   8303: *      NO PARAMETERS (DUMMY PATTERN)
                   8304: *
                   8305: P$PAB  ENT                   ENTRY POINT
                   8306:        BRN  FAILP            JUST FAIL (ENTRY IS ALREADY POPPED)
                   8307: *
                   8308: *      PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
                   8309: *
                   8310: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   8311: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8312: *
                   8313: *      PARM1                 NAME BASE OF VARIABLE
                   8314: *      PARM2                 NAME OFFSET OF VARIABLE
                   8315: *
                   8316: P$PAC  ENT  BL$P2            P2BLK
                   8317:        MOV  WB,-(XS)         STACK DUMMY CURSOR VALUE
                   8318:        MOV  XR,-(XS)         STACK POINTER TO P$PAC NODE
                   8319:        MOV  WB,-(XS)         STACK FINAL CURSOR
                   8320:        MOV  =NDPAD,-(XS)     STACK PTR TO SPECIAL NDPAD NODE
                   8321:        MNZ  PMDFL            SET DOT FLAG NON-ZERO
                   8322:        BRN  SUCCP            AND SUCCEED
                   8323: *
                   8324: *      PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
                   8325: *
                   8326: *      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
                   8327: *      ALGORITHMS FOR MATCHING THIS NODE TYPE.
                   8328: *
                   8329: *      NO PARAMETERS (DUMMY NODE)
                   8330: *
                   8331: P$PAD  ENT                   ENTRY POINT
                   8332:        BRN  FLPOP            FAIL AND REMOVE P$PAC NODE
                   8333:        EJC
                   8334: *
                   8335: *      REM
                   8336: *
                   8337: *      NO PARAMETERS
                   8338: *
                   8339: P$REM  ENT  BL$P0            P0BLK
                   8340:        MOV  PMSSL,WB         POINT CURSOR TO END OF STRING
                   8341:        BRN  SUCCP            AND SUCCEED
                   8342: *
                   8343: *      RPOS (EXPRESSION ARGUMENT)
                   8344: *
                   8345: *      PARM1                 EXPRESSION POINTER
                   8346: *
                   8347: P$RPD  ENT  BL$P1            P1BLK
                   8348:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   8349:        ERR  059,RPOS EVALUATED ARGUMENT IS NOT INTEGER
                   8350:        ERR  060,RPOS EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   8351:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8352:        MOV  =P$RPS,XL        CONTINUATION ROUTINE
                   8353:        BRI  XL               ENTER ROUTINE
                   8354: *
                   8355: *      RPOS (INTEGER ARGUMENT)
                   8356: *      EXPRESSION ARGUMENT CASE MERGES
                   8357: *
                   8358: *      PARM1                 INTEGER ARGUMENT
                   8359: *
                   8360: P$RPS  ENT  BL$P1            P1BLK
                   8361:        MOV  PMSSL,WC         GET LENGTH OF STRING
                   8362:        SUB  WB,WC            GET NUMBER OF CHARACTERS REMAINING
                   8363:        BEQ  WC,PARM1(XR),SUCCP SUCCEED IF AT RIGHT LOCATION
                   8364:        BRN  FAILP            ELSE FAIL
                   8365:        EJC
                   8366: *
                   8367: *      RTAB (INTEGER ARGUMENT)
                   8368: *      EXPRESSION ARGUMENT CASE MERGES
                   8369: *
                   8370: *      PARM1                 INTEGER ARGUMENT
                   8371: *
                   8372: P$RTB  ENT  BL$P1            P1BLK
                   8373:        MOV  WB,WC            SAVE INITIAL CURSOR
                   8374:        MOV  PMSSL,WB         POINT TO END OF STRING
                   8375:        BLT  WB,PARM1(XR),FAILP FAIL IF STRING NOT LONG ENOUGH
                   8376:        SUB  PARM1(XR),WB     ELSE SET NEW CURSOR
                   8377:        BGE  WB,WC,SUCCP      AND SUCCEED IF NOT TOO FAR ALREADY
                   8378:        BRN  FAILP            IN WHICH CASE, FAIL
                   8379: *
                   8380: *      RTAB (EXPRESSION ARGUMENT)
                   8381: *
                   8382: *      PARM1                 EXPRESSION POINTER
                   8383: *
                   8384: P$RTD  ENT  BL$P1            P1BLK
                   8385:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   8386:        ERR  061,RTAB EVALUATED ARGUMENT IS NOT INTEGER
                   8387:        ERR  062,RTAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   8388:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8389:        MOV  =P$RTB,XL        CONTINUATION ROUTINE
                   8390:        BRI  XL               ENTER ROUTINE
                   8391:        EJC
                   8392: *
                   8393: *      SPAN (EXPRESSION ARGUMENT)
                   8394: *
                   8395: *      PARM1                 EXPRESSION POINTER
                   8396: *
                   8397: P$SPD  ENT  BL$P1            P1BLK
                   8398:        MOV  =P$SPN,WA        PCODE FOR NEW NODE
                   8399:        JSR  EVALS            EVALUATE STRING ARGUMENT
                   8400:        ERR  063,SPAN EVALUATED ARGUMENT IS NOT STRING
                   8401:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8402:        BRI  XL               MERGE WITH MULTI-CHAR CASE IF OK
                   8403: *
                   8404: *      SPAN (MULTI-CHARACTER ARGUMENT CASE)
                   8405: *      EXPRESSION ARGUMENT CASE MERGES
                   8406: *
                   8407: *      PARM1                 POINTER TO CTBLK
                   8408: *      PARM2                 BIT MASK TO SELECT BIT COLUMN
                   8409: *
                   8410: P$SPN  ENT  BL$P2            P2BLK
                   8411:        MOV  PMSSL,WC         COPY SUBJECT STRING LENGTH
                   8412:        SUB  WB,WC            CALCULATE NUMBER OF CHARACTERS LEFT
                   8413:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   8414:        MOV  R$PMS,XL         POINT TO SUBJECT STRING
                   8415:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8416:        MOV  WB,PSAVC         SAVE INITIAL CURSOR
                   8417:        MOV  XR,PSAVE         SAVE NODE POINTER
                   8418:        LCT  WC,WC            SET COUNTER FOR CHARS LEFT
                   8419: *
                   8420: *      LOOP TO SCAN MATCHING CHARACTERS
                   8421: *
                   8422: PSPN2  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
                   8423:        WTB  WA               CONVERT TO BAU OFFSET
                   8424:        MOV  PARM1(XR),XR     POINT TO CTBLK
                   8425:        ADD  WA,XR            POINT TO CTBLK ENTRY
                   8426:        MOV  CTCHS(XR),WA     LOAD CTBLK ENTRY
                   8427:        MOV  PSAVE,XR         RESTORE NODE POINTER
                   8428:        ANB  PARM2(XR),WA     AND WITH SELECTED BIT
                   8429:        ZRB  WA,PSPN3         JUMP IF NO MATCH
                   8430:        ICV  WB               ELSE PUSH CURSOR
                   8431:        BCT  WC,PSPN2         LOOP BACK UNLESS END OF STRING
                   8432: *
                   8433: *      HERE AFTER SCANNING MATCHING CHARACTERS
                   8434: *
                   8435: PSPN3  BNE  WB,PSAVC,SUCCP   SUCCEED IF CHARS MATCHED
                   8436:        BRN  FAILP            ELSE FAIL IF NULL STRING MATCHED
                   8437:        EJC
                   8438: *
                   8439: *      SPAN (ONE CHARACTER ARGUMENT)
                   8440: *
                   8441: *      PARM1                 CHARACTER ARGUMENT
                   8442: *
                   8443: P$SPS  ENT  BL$P1            P1BLK
                   8444:        MOV  PMSSL,WC         GET SUBJECT STRING LENGTH
                   8445:        SUB  WB,WC            CALCULATE NUMBER OF CHARACTERS LEFT
                   8446:        BZE  WC,FAILP         FAIL IF NO CHARACTERS LEFT
                   8447:        MOV  R$PMS,XL         ELSE POINT TO SUBJECT STRING
                   8448:        PLC  XL,WB            POINT TO CURRENT CHARACTER
                   8449:        MOV  WB,PSAVC         SAVE INITIAL CURSOR
                   8450:        LCT  WC,WC            SET COUNTER FOR CHARACTERS LEFT
                   8451: *
                   8452: *      LOOP TO SCAN MATCHING CHARACTERS
                   8453: *
                   8454: PSPS1  LCH  WA,(XL)+         LOAD NEXT CHARACTER, BUMP POINTER
                   8455:        BNE  WA,PARM1(XR),PSPS2 JUMP IF NO MATCH
                   8456:        ICV  WB               ELSE PUSH CURSOR
                   8457:        BCT  WC,PSPS1         AND LOOP UNLESS END OF STRING
                   8458: *
                   8459: *      HERE AFTER SCANNING MATCHING CHARACTERS
                   8460: *
                   8461: PSPS2  BNE  WB,PSAVC,SUCCP   SUCCEED IF CHARS MATCHED
                   8462:        BRN  FAILP            FAIL IF NULL STRING MATCHED
                   8463: *
                   8464: *      MULTI-CHARACTER STRING (MERGE FROM P$EXA)
                   8465: *
                   8466: *      NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
                   8467: *      ONE CHARACTER ANY ARGUMENTS (P$AN1).
                   8468: *
                   8469: *      PARM1                 POINTER TO SCBLK FOR STRING ARG
                   8470: *
                   8471: P$STR  ENT  BL$P1            P1BLK
                   8472:        MOV  PARM1(XR),XL     GET POINTER TO STRING
                   8473:        MOV  XR,PSAVE         SAVE NODE POINTER
                   8474:        MOV  R$PMS,XR         LOAD SUBJECT STRING POINTER
                   8475:        PLC  XR,WB            POINT TO CURRENT CHARACTER
                   8476:        ADD  SCLEN(XL),WB     COMPUTE NEW CURSOR POSITION
                   8477:        BGT  WB,PMSSL,FAILP   FAIL IF PAST END OF STRING
                   8478:        MOV  WB,PSAVC         SAVE UPDATED CURSOR
                   8479:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARS TO COMPARE
                   8480:        PLC  XL               POINT TO CHARS OF TEST STRING
                   8481:        CMC  FAILP,FAILP      COMPARE, FAIL IF NOT EQUAL
                   8482:        MOV  PSAVE,XR         IF ALL MATCHED, RESTORE NODE PTR
                   8483:        MOV  PSAVC,WB         RESTORE UPDATED CURSOR
                   8484:        BRN  SUCCP            AND SUCCEED
                   8485:        EJC
                   8486: *
                   8487: *      SUCCEED
                   8488: *
                   8489: *      SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
                   8490: *      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
                   8491: *
                   8492: *      NO PARAMETERS
                   8493: *
                   8494: P$SUC  ENT  BL$P0            P0BLK
                   8495:        MOV  WB,-(XS)         STACK CURSOR
                   8496:        MOV  XR,-(XS)         STACK POINTER TO THIS NODE
                   8497:        BRN  SUCCP            SUCCEED MATCHING NULL
                   8498:        EJC
                   8499: *
                   8500: *      TAB (INTEGER ARGUMENT)
                   8501: *      EXPRESSION CASE MERGES
                   8502: *
                   8503: *      PARM1                 INTEGER ARGUMENT
                   8504: *
                   8505: P$TAB  ENT  BL$P1            P1BLK
                   8506:        BGT  WB,PARM1(XR),FAILP FAIL IF TOO FAR ALREADY
                   8507:        MOV  PARM1(XR),WB     ELSE SET NEW CURSOR POSITION
                   8508:        BLE  WB,PMSSL,SUCCP   SUCCEED IF NOT OFF END
                   8509:        BRN  FAILP            ELSE FAIL
                   8510: *
                   8511: *      TAB (EXPRESSION ARGUMENT)
                   8512: *
                   8513: *      PARM1                 EXPRESSION POINTER
                   8514: *
                   8515: P$TBD  ENT  BL$P1            P1BLK
                   8516:        JSR  EVALI            EVALUATE INTEGER ARGUMENT
                   8517:        ERR  064,TAB EVALUATED ARGUMENT IS NOT INTEGER
                   8518:        ERR  065,TAB EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
                   8519:        PPM  FAILP            FAIL IF EVALUATION FAILS
                   8520:        MOV  =P$TAB,XL        CONTINUATION ROUTINE
                   8521:        BRI  XL               ENTER ROUTINE
                   8522: *
                   8523: *      ANCHOR MOVEMENT
                   8524: *
                   8525: *      NO PARAMETERS (DUMMY NODE)
                   8526: *
                   8527: P$UNA  ENT                   ENTRY POINT
                   8528:        MOV  WB,XR            COPY INITIAL PATTERN NODE POINTER
                   8529:        MOV  (XS),WB          GET INITIAL CURSOR
                   8530:        BEQ  WB,PMSSL,EXFAL   MATCH FAILS IF AT END OF STRING
                   8531:        ICV  WB               ELSE INCREMENT CURSOR
                   8532:        MOV  WB,(XS)          STORE INCREMENTED CURSOR
                   8533:        MOV  XR,-(XS)         RESTACK INITIAL NODE PTR
                   8534:        MOV  =NDUNA,-(XS)     RESTACK UNANCHORED NODE
                   8535:        BRI  (XR)             REMATCH FIRST NODE
                   8536: *
                   8537: *      END OF PATTERN MATCH ROUTINES
                   8538: *
                   8539: *      THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
                   8540: *      MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
                   8541: *      REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
                   8542: *
                   8543: P$YYY  ENT  BL$$I            MARK LAST ENTRY IN PATTERN SECTION
                   8544:        TTL  S P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
                   8545: *
                   8546: *      THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
                   8547: *      WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
                   8548: *
                   8549: *      THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
                   8550: *      INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
                   8551: *      IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
                   8552: *
                   8553: *      THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
                   8554: *      HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
                   8555: *
                   8556: *      IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
                   8557: *      AND IN THESE INSTANCES WE ALSO HAVE.
                   8558: *
                   8559: *      (WA)                  ACTUAL NUMBER OF ARGUMENTS IN CALL
                   8560: *
                   8561: *      CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
                   8562: *      ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
                   8563: *      WORD FROM THE GENERATED CODE.
                   8564: *
                   8565: *      THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
                   8566: *      THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
                   8567: *      THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
                   8568: *      ALPHABETICALLY BY THEIR ENTRY NAMES.
                   8569:        EJC
                   8570: *
                   8571: *      ANY
                   8572: *
                   8573: S$ANY  ENT                   ENTRY POINT
                   8574:        MOV  =P$ANS,WB        SET PCODE FOR SINGLE CHAR CASE
                   8575:        MOV  =P$ANY,XL        PCODE FOR MULTI-CHAR CASE
                   8576:        MOV  =P$AYD,WC        PCODE FOR EXPRESSION CASE
                   8577:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   8578:        ERR  066,ANY ARGUMENT IS NOT STRING OR EXPRESSION
                   8579:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   8580: .IF    .CNBF
                   8581: .ELSE
                   8582:        EJC
                   8583: *
                   8584: *      APPEND
                   8585: *
                   8586: S$APN  ENT                   ENTRY POINT
                   8587:        MOV  (XS)+,XL         GET APPEND ARGUMENT
                   8588:        MOV  (XS)+,XR         GET BCBLK
                   8589:        BEQ  (XR),=B$BCT,SAPN1 OK IF FIRST ARG IS BCBLK
                   8590:        ERB  067,APPEND FIRST ARGUMENT IS NOT BUFFER
                   8591: *
                   8592: *      HERE TO DO THE APPEND
                   8593: *
                   8594: SAPN1  MOV  BCLEN(XR),WA     OFFSET TO BUFFER END
                   8595:        ZER  WB               NO CHARS TO BE REPLACED
                   8596:        JSR  INSBF            DO THE APPEND
                   8597:        ERR  068,APPEND SECOND ARGUMENT IS NOT STRING
                   8598:        PPM  EXFAL            NO ROOM - FAIL
                   8599:        BRN  EXNUL            EXIT WITH NULL RESULT
                   8600: .FI
                   8601:        EJC
                   8602: *
                   8603: *      APPLY
                   8604: *
                   8605: *      APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
                   8606: *      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
                   8607: *
                   8608: S$APP  ENT                   ENTRY POINT
                   8609:        BZE  WA,SAPP3         JUMP IF NO ARGUMENTS
                   8610:        DCV  WA               ELSE GET APPLIED FUNC ARG COUNT
                   8611:        MOV  WA,WB            COPY
                   8612:        WTB  WB               CONVERT TO BAUS
                   8613:        MOV  XS,XT            COPY STACK POINTER
                   8614:        ADD  WB,XT            POINT TO FUNCTION ARGUMENT ON STACK
                   8615:        MOV  (XT),XR          LOAD FUNCTION PTR (APPLY 1ST ARG)
                   8616:        BZE  WA,SAPP2         JUMP IF NO ARGS FOR APPLIED FUNC
                   8617:        LCT  WB,WA            ELSE SET COUNTER FOR LOOP
                   8618: *
                   8619: *      LOOP TO MOVE ARGUMENTS UP ON STACK
                   8620: *
                   8621: SAPP1  DCA  XT               POINT TO NEXT ARGUMENT
                   8622:        MOV  (XT),1(XT)       MOVE ARGUMENT UP
                   8623:        BCT  WB,SAPP1         LOOP TILL ALL MOVED
                   8624: *
                   8625: *      MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
                   8626: *
                   8627: SAPP2  ICA  XS               ADJUST STACK PTR FOR APPLY 1ST ARG
                   8628:        JSR  GTNVR            GET VARIABLE BLOCK ADDR FOR FUNC
                   8629:        PPM  SAPP3            JUMP IF NOT NATURAL VARIABLE
                   8630:        MOV  VRFNC(XR),XL     ELSE POINT TO FUNCTION BLOCK
                   8631:        BRN  CFUNC            GO CALL APPLIED FUNCTION
                   8632: *
                   8633: *      HERE FOR INVALID FIRST ARGUMENT
                   8634: *
                   8635: SAPP3  ERB  069,APPLY FIRST ARG IS NOT NATURAL VARIABLE NAME
                   8636:        EJC
                   8637: *
                   8638: *      ARBNO
                   8639: *
                   8640: *      ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
                   8641: *      START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
                   8642: *
                   8643: S$ABN  ENT                   ENTRY POINT
                   8644:        ZER  XR               SET PARM1 = 0 FOR THE MOMENT
                   8645:        MOV  =P$ALT,WB        SET PCODE FOR ALTERNATIVE NODE
                   8646:        JSR  PBILD            BUILD ALTERNATIVE NODE
                   8647:        MOV  XR,XL            SAVE PTR TO ALTERNATIVE PATTERN
                   8648:        MOV  =P$ABC,WB        PCODE FOR P$ABC
                   8649:        ZER  XR               P0BLK
                   8650:        JSR  PBILD            BUILD P$ABC NODE
                   8651:        MOV  XL,PTHEN(XR)     PUT ALTERNATIVE NODE AS SUCCESSOR
                   8652:        MOV  XL,WA            REMEMBER ALTERNATIVE NODE POINTER
                   8653:        MOV  XR,XL            COPY P$ABC NODE PTR
                   8654:        MOV  (XS),XR          LOAD ARBNO ARGUMENT
                   8655:        MOV  WA,(XS)          STACK ALTERNATIVE NODE POINTER
                   8656:        JSR  GTPAT            GET ARBNO ARGUMENT AS PATTERN
                   8657:        ERR  070,ARBNO ARGUMENT IS NOT PATTERN
                   8658:        JSR  PCONC            CONCAT ARG WITH P$ABC NODE
                   8659:        MOV  XR,XL            REMEMBER PTR TO CONCD PATTERNS
                   8660:        MOV  =P$ABA,WB        PCODE FOR P$ABA
                   8661:        ZER  XR               P0BLK
                   8662:        JSR  PBILD            BUILD P$ABA NODE
                   8663:        MOV  XL,PTHEN(XR)     CONCATENATE NODES
                   8664:        MOV  (XS),XL          RECALL PTR TO ALTERNATIVE NODE
                   8665:        MOV  XR,PARM1(XL)     POINT ALTERNATIVE BACK TO ARGUMENT
                   8666:        BRN  EXITS            JUMP FOR NEXT CODE WORD
                   8667:        EJC
                   8668: *
                   8669: *      ARG
                   8670: *
                   8671: S$ARG  ENT                   ENTRY POINT
                   8672:        JSR  GTSMI            GET SECOND ARG AS SMALL INTEGER
                   8673:        ERR  253,ARG SECOND ARGUMENT IS NOT INTEGER
                   8674:        PPM  EXFAL            FAIL IF OUT OF RANGE OR NEGATIVE
                   8675:        MOV  XR,WA            SAVE ARGUMENT NUMBER
                   8676:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   8677:        JSR  GTNVR            LOCATE VRBLK
                   8678:        PPM  SARG1            JUMP IF NOT NATURAL VARIABLE
                   8679:        MOV  VRFNC(XR),XR     ELSE LOAD FUNCTION BLOCK POINTER
                   8680:        BNE  (XR),=B$PFC,SARG1 JUMP IF NOT PROGRAM DEFINED
                   8681:        BZE  WA,EXFAL         FAIL IF ARG NUMBER IS ZERO
                   8682:        BGT  WA,FARGS(XR),EXFAL FAIL IF ARG NUMBER IS TOO LARGE
                   8683:        WTB  WA               ELSE CONVERT TO BYTE OFFSET
                   8684:        ADD  WA,XR            POINT TO ARGUMENT SELECTED
                   8685:        MOV  PFAGB(XR),XR     LOAD ARGUMENT VRBLK POINTER
                   8686:        BRN  EXVNM            EXIT TO BUILD NMBLK
                   8687: *
                   8688: *      HERE IF 1ST ARGUMENT IS BAD
                   8689: *
                   8690: SARG1  ERB  252,ARG FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
                   8691:        EJC
                   8692: *
                   8693: *      ARRAY
                   8694: *
                   8695: S$ARR  ENT                   ENTRY POINT
                   8696:        MOV  (XS)+,XL         LOAD INITIAL ELEMENT VALUE
                   8697:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   8698:        JSR  GTINT            CONVERT FIRST ARG TO INTEGER
                   8699:        PPM  SAR02            JUMP IF NOT INTEGER
                   8700: *
                   8701: *      HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
                   8702: *
                   8703:        LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   8704:        ILE  SAR10            JUMP IF ZERO OR NEG (BAD DIMENSION)
                   8705:        MFI  WA,SAR11         ELSE CONVERT TO ONE WORD, TEST OVFL
                   8706:        LCT  WB,WA            COPY ELEMENTS FOR LOOP LATER ON
                   8707:        ADD  =VCSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   8708:        WTB  WA               CONVERT LENGTH TO BAUS
                   8709:        BGE  WA,MXLEN,SAR11   FAIL IF TOO LARGE
                   8710:        JSR  ALLOC            ALLOCATE SPACE FOR VCBLK
                   8711:        MOV  =B$VCT,(XR)      STORE TYPE WORD
                   8712:        MOV  WA,VCLEN(XR)     SET LENGTH
                   8713:        MOV  XL,WC            COPY DEFAULT VALUE
                   8714:        MOV  XR,XL            COPY VCBLK POINTER
                   8715:        ADD  *VCVLS,XL        POINT TO FIRST ELEMENT VALUE
                   8716: *
                   8717: *      LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
                   8718: *
                   8719: SAR01  MOV  WC,(XL)+         STORE ONE VALUE
                   8720:        BCT  WB,SAR01         LOOP TILL ALL STORED
                   8721:        BRN  EXSID            EXIT SETTING IDVAL
                   8722:        EJC
                   8723: *
                   8724: *      ARRAY (CONTINUED)
                   8725: *
                   8726: *      HERE IF FIRST ARGUMENT IS NOT AN INTEGER
                   8727: *
                   8728: SAR02  MOV  XR,-(XS)         REPLACE ARGUMENT ON STACK
                   8729:        JSR  XSCNI            INITIALIZE SCAN OF FIRST ARGUMENT
                   8730:        ERR  071,ARRAY FIRST ARGUMENT IS NOT INTEGER OR STRING
                   8731:        PPM  EXNUL            DUMMY (UNUSED) NULL STRING EXIT
                   8732:        MOV  R$XSC,-(XS)      SAVE PROTOTYPE POINTER
                   8733:        MOV  XL,-(XS)         SAVE DEFAULT VALUE
                   8734:        ZER  ARCDM            ZERO COUNT OF DIMENSIONS
                   8735:        ZER  ARPTR            ZERO OFFSET TO INDICATE PASS ONE
                   8736:        LDI  INTV1            LOAD INTEGER ONE
                   8737:        STI  ARNEL            INITIALIZE ELEMENT COUNT
                   8738: *
                   8739: *      THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
                   8740: *      (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
                   8741: *      AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
                   8742: *      USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
                   8743: *
                   8744: SAR03  LDI  INTV1            LOAD ONE AS DEFAULT LOW BOUND
                   8745:        STI  ARSVL            SAVE AS LOW BOUND
                   8746:        MOV  =CH$CL,WC        SET DELIMITER ONE = COLON
                   8747:        MOV  =CH$CM,XL        SET DELIMITER TWO = COMMA
                   8748:        JSR  XSCAN            SCAN NEXT BOUND
                   8749:        BNE  WA,=NUM01,SAR04  JUMP IF NOT COLON
                   8750: *
                   8751: *      HERE WE HAVE A COLON ENDING A LOW BOUND
                   8752: *
                   8753:        JSR  GTINT            CONVERT LOW BOUND
                   8754:        ERR  072,ARRAY FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
                   8755:        LDI  ICVAL(XR)        LOAD VALUE OF LOW BOUND
                   8756:        STI  ARSVL            STORE LOW BOUND VALUE
                   8757:        MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
                   8758:        MOV  WC,XL            AND DELIMITER TWO = COMMA
                   8759:        JSR  XSCAN            SCAN HIGH BOUND
                   8760:        EJC
                   8761: *
                   8762: *      ARRAY (CONTINUED)
                   8763: *
                   8764: *      MERGE HERE TO PROCESS UPPER BOUND
                   8765: *
                   8766: SAR04  BNZ  WA,SAR4A         SKIP IF DELIMITER 1 OR 2
                   8767:        BNZ  XSCNB,SAR10      JUMP IF ILLEGALLY PLACED BLANK
                   8768: *
                   8769: *      CHECK FOR INTEGER BOUND
                   8770: *
                   8771: SAR4A  JSR  GTINT            CONVERT HIGH BOUND TO INTEGER
                   8772:        ERR  073,ARRAY FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
                   8773:        LDI  ICVAL(XR)        GET HIGH BOUND
                   8774:        SBI  ARSVL            SUBTRACT LOWER BOUND
                   8775:        IOV  SAR10            BAD DIMENSION IF OVERFLOW
                   8776:        ILT  SAR10            BAD DIMENSION IF NEGATIVE
                   8777:        ADI  INTV1            ADD 1 TO GET DIMENSION
                   8778:        IOV  SAR10            BAD DIMENSION IF OVERFLOW
                   8779:        MOV  ARPTR,XL         LOAD OFFSET (ALSO PASS INDICATOR)
                   8780:        BZE  XL,SAR05         JUMP IF FIRST PASS
                   8781: *
                   8782: *      HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
                   8783: *
                   8784:        ADD  (XS),XL          POINT TO CURRENT LOCATION IN ARBLK
                   8785:        STI  CFP$I(XL)        STORE DIMENSION
                   8786:        LDI  ARSVL            LOAD LOW BOUND
                   8787:        STI  (XL)             STORE LOW BOUND
                   8788:        ADD  *ARDMS,ARPTR     BUMP OFFSET TO NEXT BOUNDS
                   8789:        BRN  SAR06            JUMP TO CHECK FOR END OF BOUNDS
                   8790: *
                   8791: *      HERE IN PASS 1
                   8792: *
                   8793: SAR05  ICV  ARCDM            BUMP DIMENSION COUNT
                   8794:        MLI  ARNEL            MULTIPLY DIMENSION BY COUNT SO FAR
                   8795:        IOV  SAR11            TOO LARGE IF OVERFLOW
                   8796:        STI  ARNEL            ELSE STORE UPDATED ELEMENT COUNT
                   8797: *
                   8798: *      MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
                   8799: *
                   8800: SAR06  BNZ  WA,SAR03         LOOP BACK UNLESS END OF BOUNDS
                   8801:        BNZ  ARPTR,SAR09      JUMP IF END OF PASS 2
                   8802:        EJC
                   8803: *
                   8804: *      ARRAY (CONTINUED)
                   8805: *
                   8806: *      HERE AT END OF PASS ONE, BUILD ARBLK
                   8807: *
                   8808:        LDI  ARNEL            GET NUMBER OF ELEMENTS
                   8809:        MFI  WB,SAR11         GET AS ADDR INTEGER, TEST OVFLO
                   8810:        WTB  WB               ELSE CONVERT TO LENGTH IN BAUS
                   8811:        MOV  *ARSI$,WA        SET SIZE OF STANDARD FIELDS
                   8812:        LCT  WC,ARCDM         SET DIMENSION COUNT TO CONTROL LOOP
                   8813: *
                   8814: *      LOOP TO ALLOW SPACE FOR DIMENSIONS
                   8815: *
                   8816: SAR07  ADD  *ARDMS,WA        ALLOW SPACE FOR ONE SET OF BOUNDS
                   8817:        BCT  WC,SAR07         LOOP BACK TILL ALL ACCOUNTED FOR
                   8818:        MOV  WA,XL            SAVE SIZE (=AROFS)
                   8819: *
                   8820: *      NOW ALLOCATE SPACE FOR ARBLK
                   8821: *
                   8822:        ADD  WB,WA            ADD SPACE FOR ELEMENTS
                   8823:        ICA  WA               ALLOW FOR ARPRO PROTOTYPE FIELD
                   8824:        BGE  WA,MXLEN,SAR11   FAIL IF TOO LARGE
                   8825:        JSR  ALLOC            ELSE ALLOCATE ARBLK
                   8826:        MOV  (XS),WB          LOAD DEFAULT VALUE
                   8827:        MOV  XR,(XS)          SAVE ARBLK POINTER
                   8828:        MOV  WA,WC            SAVE LENGTH IN BAUS
                   8829:        BTW  WA               CONVERT LENGTH BACK TO WORDS
                   8830:        LCT  WA,WA            SET COUNTER TO CONTROL LOOP
                   8831: *
                   8832: *      LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
                   8833: *
                   8834: SAR08  MOV  WB,(XR)+         SET ONE WORD
                   8835:        BCT  WA,SAR08         LOOP TILL ALL SET
                   8836:        EJC
                   8837: *
                   8838: *      ARRAY (CONTINUED)
                   8839: *
                   8840: *      NOW SET INITIAL FIELDS OF ARBLK
                   8841: *
                   8842:        MOV  (XS)+,XR         RELOAD ARBLK POINTER
                   8843:        MOV  (XS),WB          LOAD PROTOTYPE
                   8844:        MOV  =B$ART,(XR)      SET TYPE WORD
                   8845:        MOV  WC,ARLEN(XR)     STORE LENGTH IN BAUS
                   8846:        ZER  IDVAL(XR)        ZERO ID TILL WE GET IT BUILT
                   8847:        MOV  XL,AROFS(XR)     SET PROTOTYPE FIELD PTR
                   8848:        MOV  ARCDM,ARNDM(XR)  SET NUMBER OF DIMENSIONS
                   8849:        MOV  XR,WC            SAVE ARBLK POINTER
                   8850:        ADD  XL,XR            POINT TO PROTOTYPE FIELD
                   8851:        MOV  WB,(XR)          STORE PROTOTYPE PTR IN ARBLK
                   8852:        MOV  *ARLBD,ARPTR     SET OFFSET FOR PASS 2 BOUNDS SCAN
                   8853:        MOV  WB,R$XSC         RESET STRING POINTER FOR XSCAN
                   8854:        MOV  WC,(XS)          STORE ARBLK POINTER ON STACK
                   8855:        ZER  XSOFS            RESET OFFSET PTR TO START OF STRING
                   8856:        BRN  SAR03            JUMP BACK TO RESCAN BOUNDS
                   8857: *
                   8858: *      HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
                   8859: *
                   8860: SAR09  MOV  (XS)+,XR         RELOAD POINTER TO ARBLK
                   8861:        BRN  EXSID            EXIT SETTING IDVAL
                   8862: *
                   8863: *      HERE FOR BAD DIMENSION
                   8864: *
                   8865: SAR10  ERB  074,BAD DIMENSION, ZERO, NEGATIVE OR OUT OF RANGE
                   8866: *
                   8867: *      HERE IF ARRAY IS TOO LARGE
                   8868: *
                   8869: SAR11  ERB  075,ARRAY SIZE EXCEEDS MAXIMUM PERMITTED
                   8870:        EJC
                   8871: *
                   8872: *      BREAK
                   8873: *
                   8874: S$BRK  ENT                   ENTRY POINT
                   8875:        MOV  =P$BKS,WB        SET PCODE FOR SINGLE CHAR CASE
                   8876:        MOV  =P$BRK,XL        PCODE FOR MULTI-CHAR CASE
                   8877:        MOV  =P$BKD,WC        PCODE FOR EXPRESSION CASE
                   8878:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   8879:        ERR  076,BREAK ARGUMENT IS NOT STRING OR EXPRESSION
                   8880:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   8881:        EJC
                   8882: *
                   8883: *      BREAKX
                   8884: *
                   8885: *      BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
                   8886: *      OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
                   8887: *
                   8888: S$BKX  ENT                   ENTRY POINT
                   8889:        MOV  =P$BKS,WB        PCODE FOR SINGLE CHAR ARGUMENT
                   8890:        MOV  =P$BRK,XL        PCODE FOR MULTI-CHAR ARGUMENT
                   8891:        MOV  =P$BXD,WC        PCODE FOR EXPRESSION CASE
                   8892:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   8893:        ERR  077,BREAKX ARGUMENT IS NOT STRING OR EXPRESSION
                   8894: *
                   8895: *      NOW HOOK BREAKX NODE ON AT FRONT END
                   8896: *
                   8897:        MOV  XR,-(XS)         SAVE PTR TO BREAK NODE
                   8898:        MOV  =P$BKX,WB        SET PCODE FOR BREAKX NODE
                   8899:        JSR  PBILD            BUILD IT
                   8900:        MOV  (XS),PTHEN(XR)   SET BREAK NODE AS SUCCESSOR
                   8901:        MOV  =P$ALT,WB        SET PCODE FOR ALTERNATION NODE
                   8902:        JSR  PBILD            BUILD (PARM1=ALT=BREAKX NODE)
                   8903:        MOV  XR,WA            SAVE PTR TO ALTERNATION NODE
                   8904:        MOV  (XS),XR          POINT TO BREAK NODE
                   8905:        MOV  WA,PTHEN(XR)     SET ALTERNATE NODE AS SUCCESSOR
                   8906:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   8907: .IF    .CNBF
                   8908: .ELSE
                   8909:        EJC
                   8910: *
                   8911: *      BUFFER
                   8912: *
                   8913: S$BUF  ENT                   ENTRY POINT
                   8914:        MOV  (XS)+,XL         GET INITIAL STRING
                   8915:        JSR  GTSMI            CONVERT MEMORY REQUEST TO INTEGER
                   8916:        ERR  078,BUFFER FIRST ARGUMENT IS NOT INTEGER
                   8917:        PPM  SBF01            FAIL IF OUT OF RANGE
                   8918:        MOV  WC,WA            MOVE LENGTH TO CORRECT REGISTER
                   8919:        JSR  ALOBF            ALLOCATE THE BUFFER
                   8920:        JSR  INSBF            COPY INITIAL ARG IN
                   8921:        ERR  079,BUFFER SECOND ARGUMENT IS NOT STRING OR BUFFER
                   8922:        ERR  080,BUFFER INITIAL VALUE TOO BIG FOR ALLOCATION
                   8923:        BRN  EXSID            EXIT SETTING IDVAL
                   8924: *
                   8925: *      HERE FOR INVALID ALLOCATION SIZE
                   8926: *
                   8927: SBF01  ERB  081,BUFFER FIRST ARGUMENT IS OUT OF RANGE
                   8928: .FI
                   8929:        EJC
                   8930: *
                   8931: *      CLEAR
                   8932: *
                   8933: S$CLR  ENT                   ENTRY POINT
                   8934:        JSR  XSCNI            INITIALIZE TO SCAN ARGUMENT
                   8935:        ERR  082,CLEAR ARGUMENT IS NOT STRING
                   8936:        PPM  SCLR2            JUMP IF NULL
                   8937: *
                   8938: *      LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
                   8939: *      THE LIST ARE FLAGGED BY SETTING VRGET OF VRBLK TO ZERO.
                   8940: *
                   8941: SCLR1  MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
                   8942:        MOV  WC,XL            DELIMITER TWO = COMMA
                   8943:        JSR  XSCAN            SCAN NEXT VARIABLE NAME
                   8944:        JSR  GTNVR            LOCATE VRBLK
                   8945:        PPM  SCLR7            ERRONEOUS NAME
                   8946:        ZER  VRGET(XR)        ELSE FLAG BY ZEROING VRGET FIELD
                   8947:        BNZ  WA,SCLR1         LOOP BACK IF STOPPED BY COMMA
                   8948:        BNZ  XSCNB,SCLR7      BADLY PLACED BLANK
                   8949: *
                   8950: *      HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
                   8951: *
                   8952: SCLR2  MOV  HSHTB,WB         POINT TO START OF HASH TABLE
                   8953: *
                   8954: *      LOOP THROUGH SLOTS IN HASH TABLE
                   8955: *
                   8956: SCLR3  BEQ  WB,HSHTE,EXNUL   EXIT RETURNING NULL IF NONE LEFT
                   8957:        MOV  WB,XR            ELSE COPY SLOT POINTER
                   8958:        ICA  WB               BUMP SLOT POINTER
                   8959:        SUB  *VRNXT,XR        SET OFFSET TO MERGE INTO LOOP
                   8960: *
                   8961: *      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
                   8962: *
                   8963: SCLR4  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON CHAIN
                   8964:        BZE  XR,SCLR3         JUMP FOR NEXT BUCKET IF CHAIN END
                   8965:        BNZ  VRGET(XR),SCLR5  JUMP IF NOT FLAGGED
                   8966:        EJC
                   8967: *
                   8968: *      CLEAR (CONTINUED)
                   8969: *
                   8970: *      HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
                   8971: *
                   8972:        JSR  SETVR            FOR FLAGGED VAR, RESTORE VRGET
                   8973:        BRN  SCLR4            AND LOOP BACK FOR NEXT VRBLK
                   8974: *
                   8975: *      HERE TO SET VALUE OF A VARIABLE TO NULL
                   8976: *      PROTECTED VARIABLES (ARB ETC) ARE EXEMPT
                   8977: *
                   8978: SCLR5  BEQ  VRSTO(XR),=B$VRE,SCLR4 CHECK FOR PROTECTED VARIABLE
                   8979:        MOV  XR,XL            COPY VRBLK POINTER
                   8980: *
                   8981: *      LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
                   8982: *
                   8983: SCLR6  MOV  XL,WA            SAVE BLOCK POINTER
                   8984:        MOV  VRVAL(XL),XL     LOAD NEXT VALUE FIELD
                   8985:        BEQ  (XL),=B$TRT,SCLR6 LOOP BACK IF TRAPPED
                   8986: *
                   8987: *      NOW STORE THE NULL VALUE
                   8988: *
                   8989:        MOV  WA,XL            RESTORE BLOCK POINTER
                   8990:        MOV  =NULLS,VRVAL(XL) STORE NULL CONSTANT VALUE
                   8991:        BRN  SCLR4            LOOP BACK FOR NEXT VRBLK
                   8992: *
                   8993: *      ERROR POINT
                   8994: *
                   8995: SCLR7  ERB  083,NULL VARIABLE NAME OR ILLEGAL BLANK IN CLEAR ARG
                   8996:        EJC
                   8997: *
                   8998: *      CODE
                   8999: *
                   9000: S$COD  ENT                   ENTRY POINT
                   9001:        MOV  (XS)+,XR         LOAD ARGUMENT
                   9002:        JSR  GTCOD            CONVERT TO CODE
                   9003:        PPM  EXFAL            FAIL IF CONVERSION IS IMPOSSIBLE
                   9004:        BRN  EXIXR            ELSE RETURN CODE AS RESULT
                   9005:        EJC
                   9006: *
                   9007: *      COLLECT
                   9008: *
                   9009: S$COL  ENT                   ENTRY POINT
                   9010:        MOV  (XS)+,XR         LOAD ARGUMENT
                   9011:        JSR  GTINT            CONVERT TO INTEGER
                   9012:        ERR  084,COLLECT ARGUMENT IS NOT INTEGER
                   9013:        LDI  ICVAL(XR)        LOAD COLLECT ARGUMENT
                   9014:        STI  CLSVI            SAVE COLLECT ARGUMENT
                   9015:        ZER  WB               SET NO MOVE UP
                   9016:        JSR  GBCOL            PERFORM GARBAGE COLLECTION
                   9017:        MOV  DNAME,WA         POINT TO END OF MEMORY
                   9018:        SUB  DNAMP,WA         SUBTRACT NEXT LOCATION
                   9019:        BTW  WA               CONVERT BAUS TO WORDS
                   9020:        MTI  WA               CONVERT WORDS AVAILABLE AS INTEGER
                   9021:        SBI  CLSVI            SUBTRACT ARGUMENT
                   9022:        IOV  EXFAL            FAIL IF OVERFLOW
                   9023:        ILT  EXFAL            FAIL IF NOT ENOUGH
                   9024:        ADI  CLSVI            ELSE RECOMPUTE AVAILABLE
                   9025:        BRN  EXINT            AND EXIT WITH INTEGER RESULT
                   9026:        EJC
                   9027: *
                   9028: *      CONVERT
                   9029: *
                   9030: S$CVT  ENT                   ENTRY POINT
                   9031:        JSR  GTSTG            CONVERT SECOND ARGUMENT TO STRING
                   9032:        ERR  085,CONVERT SECOND ARGUMENT IS NOT STRING
                   9033: .IF    .CASL
                   9034:        MOV  XR,XL            COPY STRING PTR TO XL
                   9035:        ZER  WB               ZERO OFFSET
                   9036:        JSR  SBSTG            CONVERT CASE OF ARG IF NECESSARY
                   9037: .FI
                   9038:        MOV  (XS),XL          LOAD FIRST ARGUMENT
                   9039:        BNE  (XL),=B$PDT,SCV01 JUMP IF NOT PROGRAM DEFINED
                   9040: *
                   9041: *      HERE FOR PROGRAM DEFINED DATATYPE
                   9042: *
                   9043:        MOV  PDDFP(XL),XL     POINT TO DFBLK
                   9044:        MOV  DFNAM(XL),XL     LOAD DATATYPE NAME
                   9045:        JSR  IDENT            COMPARE WITH SECOND ARG
                   9046:        PPM  EXITS            EXIT IF IDENT WITH ARG AS RESULT
                   9047:        BRN  EXFAL            ELSE FAIL
                   9048: *
                   9049: *      HERE IF NOT PROGRAM DEFINED DATATYPE
                   9050: *
                   9051: SCV01  MOV  XR,-(XS)         SAVE STRING ARGUMENT
                   9052:        MOV  =SVCTB,XL        POINT TO TABLE OF NAMES TO COMPARE
                   9053:        ZER  WB               INITIALIZE COUNTER
                   9054:        MOV  SCLEN(XR),WC     SAVE LENGTH OF ARGUMENT STRING
                   9055: *
                   9056: *      LOOP THROUGH TABLE ENTRIES
                   9057: *
                   9058: SCV02  MOV  (XL)+,XR         LOAD NEXT TABLE ENTRY, BUMP POINTER
                   9059:        BZE  XR,EXFAL         FAIL IF ZERO MARKING END OF LIST
                   9060:        BNE  WC,SCLEN(XR),SCV05 JUMP IF WRONG LENGTH
                   9061:        MOV  XL,CNVTP         ELSE STORE TABLE POINTER
                   9062:        PLC  XR               POINT TO CHARS OF TABLE ENTRY
                   9063:        MOV  (XS),XL          LOAD POINTER TO STRING ARGUMENT
                   9064:        PLC  XL               POINT TO CHARS OF STRING ARG
                   9065:        MOV  WC,WA            SET NUMBER OF CHARS TO COMPARE
                   9066:        CMC  SCV04,SCV04      COMPARE, JUMP IF NO MATCH
                   9067:        EJC
                   9068: *
                   9069: *      CONVERT (CONTINUED)
                   9070: *
                   9071: *      HERE WE HAVE A MATCH
                   9072: *
                   9073: SCV03  MOV  WB,XL            COPY ENTRY NUMBER
                   9074:        ICA  XS               POP STRING ARG OFF STACK
                   9075:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   9076:        BSW  XL,CNVTT         JUMP TO APPROPRIATE ROUTINE
                   9077:        IFF  0,SCV06          STRING
                   9078:        IFF  1,SCV07          INTEGER
                   9079:        IFF  2,SCV09          NAME
                   9080:        IFF  3,SCV10          PATTERN
                   9081:        IFF  4,SCV11          ARRAY
                   9082:        IFF  5,SCV19          TABLE
                   9083:        IFF  6,SCV25          EXPRESSION
                   9084:        IFF  7,SCV26          CODE
                   9085:        IFF  8,SCV27          NUMERIC
                   9086: .IF    .CNRA
                   9087: .ELSE
                   9088:        IFF  9,SCV08          REAL
                   9089: .FI
                   9090: .IF    .CNBF
                   9091: .ELSE
                   9092:        IFF  CNVBT,SCV28      BUFFER
                   9093: .FI
                   9094:        ESW                   END OF SWITCH TABLE
                   9095: *
                   9096: *      HERE IF NO MATCH WITH TABLE ENTRY
                   9097: *
                   9098: SCV04  MOV  CNVTP,XL         RESTORE TABLE POINTER, MERGE
                   9099: *
                   9100: *      MERGE HERE IF LENGTHS DID NOT MATCH
                   9101: *
                   9102: SCV05  ICV  WB               BUMP ENTRY NUMBER
                   9103:        BRN  SCV02            LOOP BACK TO CHECK NEXT ENTRY
                   9104: *
                   9105: *      HERE TO CONVERT TO STRING
                   9106: *
                   9107: SCV06  MOV  XR,-(XS)         REPLACE STRING ARGUMENT ON STACK
                   9108:        JSR  GTSTG            CONVERT TO STRING
                   9109:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9110:        BRN  EXIXR            ELSE RETURN STRING
                   9111:        EJC
                   9112: *
                   9113: *      CONVERT (CONTINUED)
                   9114: *
                   9115: *      HERE TO CONVERT TO INTEGER
                   9116: *
                   9117: SCV07  JSR  GTINT            CONVERT TO INTEGER
                   9118:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9119:        BRN  EXIXR            ELSE RETURN INTEGER
                   9120: .IF    .CNRA
                   9121: .ELSE
                   9122: *
                   9123: *      HERE TO CONVERT TO REAL
                   9124: *
                   9125: SCV08  JSR  GTREA            CONVERT TO REAL
                   9126:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9127:        BRN  EXIXR            ELSE RETURN REAL
                   9128: .FI
                   9129: *
                   9130: *      HERE TO CONVERT TO NAME
                   9131: *
                   9132: SCV09  BEQ  (XR),=B$NML,EXIXR RETURN IF ALREADY A NAME
                   9133:        JSR  GTNVR            ELSE TRY STRING TO NAME CONVERT
                   9134:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9135:        BRN  EXVNM            ELSE EXIT BUILDING NMBLK FOR VRBLK
                   9136: *
                   9137: *      HERE TO CONVERT TO PATTERN
                   9138: *
                   9139: SCV10  JSR  GTPAT            CONVERT TO PATTERN
                   9140:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9141:        BRN  EXIXR            ELSE RETURN PATTERN
                   9142: *
                   9143: *      CONVERT TO ARRAY
                   9144: *
                   9145: SCV11  JSR  GTARR            GET AN ARRAY
                   9146:        PPM  EXFAL            FAIL IF NOT CONVERTIBLE
                   9147:        BRN  EXSID            EXIT SETTING ID FIELD
                   9148: *
                   9149: *      CONVERT TO TABLE
                   9150: *
                   9151: SCV19  MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   9152:        MOV  XR,-(XS)         REPLACE ARBLK POINTER ON STACK
                   9153:        BEQ  WA,=B$TBT,EXITS  RETURN ARG IF ALREADY A TABLE
                   9154:        BNE  WA,=B$ART,EXFAL  ELSE FAIL IF NOT AN ARRAY
                   9155:        EJC
                   9156: *
                   9157: *      CONVERT (CONTINUED)
                   9158: *
                   9159: *      HERE TO CONVERT AN ARRAY TO TABLE
                   9160: *
                   9161:        BNE  ARNDM(XR),=NUM02,EXFAL FAIL IF NOT 2-DIM ARRAY
                   9162:        LDI  ARDM2(XR)        LOAD DIM 2
                   9163:        SBI  INTV2            SUBTRACT 2 TO COMPARE
                   9164:        INE  EXFAL            FAIL IF DIM2 NOT 2
                   9165: *
                   9166: *      HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
                   9167: *
                   9168:        LDI  ARDIM(XR)        LOAD DIM 1 (NUMBER OF ELEMENTS)
                   9169:        MFI  WA               GET AS ONE WORD INTEGER
                   9170:        LCT  WB,WA            COPY TO CONTROL LOOP
                   9171:        ADD  =TBSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   9172:        WTB  WA               CONVERT LENGTH TO BAUS
                   9173:        JSR  ALLOC            ALLOCATE SPACE FOR TBBLK
                   9174:        MOV  XR,WC            COPY TBBLK POINTER
                   9175:        MOV  XR,-(XS)         SAVE TBBLK POINTER
                   9176:        MOV  =B$TBT,(XR)+     STORE TYPE WORD
                   9177:        ZER  (XR)+            STORE ZERO FOR IDVAL FOR NOW
                   9178:        MOV  WA,(XR)+         STORE LENGTH
                   9179:        MOV  =NULLS,(XR)+     NULL INITIAL LOOKUP VALUE
                   9180: *
                   9181: *      LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
                   9182: *
                   9183: SCV20  MOV  WC,(XR)+         SET BUCKET PTR TO POINT TO TBBLK
                   9184:        BCT  WB,SCV20         LOOP TILL ALL INITIALIZED
                   9185:        MOV  *ARVL2,WB        SET OFFSET TO FIRST ARBLK ELEMENT
                   9186: *
                   9187: *      LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
                   9188: *
                   9189: SCV21  MOV  1(XS),XL         POINT TO ARBLK
                   9190:        BEQ  WB,ARLEN(XL),SCV24 JUMP IF ALL MOVED
                   9191:        ADD  WB,XL            ELSE POINT TO CURRENT LOCATION
                   9192:        ADD  *NUM02,WB        BUMP OFFSET
                   9193:        MOV  (XL),XR          LOAD SUBSCRIPT NAME
                   9194:        DCA  XL               ADJUST PTR TO MERGE (TRVAL=1+1)
                   9195:        EJC
                   9196: *
                   9197: *      CONVERT (CONTINUED)
                   9198: *
                   9199: *      LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
                   9200: *
                   9201: SCV22  MOV  TRVAL(XL),XL     POINT TO NEXT VALUE
                   9202:        BEQ  (XL),=B$TRT,SCV22 LOOP BACK IF TRAPPED
                   9203: *
                   9204: *      HERE WITH NAME IN XR, VALUE IN XL
                   9205: *
                   9206: SCV23  MOV  XL,-(XS)         STACK VALUE
                   9207:        MOV  1(XS),XL         LOAD TBBLK POINTER
                   9208:        JSR  TFIND            BUILD TEBLK (NOTE WB GT 0 BY NAME)
                   9209:        PPM  EXFAL            FAIL IF ACESS FAILS
                   9210:        MOV  (XS)+,TEVAL(XL)  STORE VALUE IN TEBLK
                   9211:        BRN  SCV21            LOOP BACK FOR NEXT ELEMENT
                   9212: *
                   9213: *      HERE AFTER MOVING ALL ELEMENTS TO TBBLK
                   9214: *
                   9215: SCV24  MOV  (XS)+,XR         LOAD TBBLK POINTER
                   9216:        ICA  XS               POP ARBLK POINTER
                   9217:        BRN  EXSID            EXIT SETTING IDVAL
                   9218: *
                   9219: *      CONVERT TO EXPRESSION
                   9220: *
                   9221: SCV25  JSR  GTEXP            CONVERT TO EXPRESSION
                   9222:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9223:        BRN  EXIXR            ELSE RETURN EXPRESSION
                   9224: *
                   9225: *      CONVERT TO CODE
                   9226: *
                   9227: SCV26  JSR  GTCOD            CONVERT TO CODE
                   9228:        PPM  EXFAL            FAIL IF CONVERSION IS NOT POSSIBLE
                   9229:        BRN  EXIXR            ELSE RETURN CODE
                   9230: *
                   9231: *      CONVERT TO NUMERIC
                   9232: *
                   9233: SCV27  JSR  GTNUM            CONVERT TO NUMERIC
                   9234:        PPM  EXFAL            FAIL IF UNCONVERTIBLE
                   9235:        BRN  EXIXR            RETURN NUMBER
                   9236:        EJC
                   9237: .IF    .CNBF
                   9238: .ELSE
                   9239: *
                   9240: *      CONVERT TO BUFFER
                   9241: *
                   9242: SCV28  JSR  GTBUF            CONVERT TO BUFFER
                   9243:        PPM  EXFAL            FAIL IF CONVERSION NOT POSSIBLE
                   9244:        BRN  EXSID            EXIT SETTING IDVAL FIELD
                   9245: .FI
                   9246:        EJC
                   9247: *
                   9248: *      COPY
                   9249: *
                   9250: S$COP  ENT                   ENTRY POINT
                   9251:        JSR  CBLCK            COPY THE BLOCK
                   9252:        PPM  EXITS            RETURN IF NO IDVAL FIELD
                   9253:        BRN  EXSID            EXIT SETTING ID VALUE
                   9254: *
                   9255: *      CTI
                   9256: *
                   9257: S$CTI  ENT
                   9258:        LDI  INTV0            ZERO IN CASE NULL STRING
                   9259:        JSR  GTSTG            GET ARG AS A STRING
                   9260:        ERR  086,CTI ARGUMENT IS NOT A STRING
                   9261:        BZE  WA,SCT01         SKIP IF NULL
                   9262:        PLC  XR               PREPARE TO READ THE CHARACTER
                   9263:        LCH  WB,(XR)          GET THE CHARACTER
                   9264:        MTI  WB               CONVERT TO INTEGER
                   9265:        ZER  XR               CLEAR GARBAGE
                   9266: *
                   9267: *      MAKE ICBLK AND RETURN
                   9268: *
                   9269: SCT01  JSR  ICBLD            BUILD ICBLK
                   9270:        BRN  EXIXR            RETURN INTEGER RESULT
                   9271:        EJC
                   9272: *
                   9273: *      DATA
                   9274: *
                   9275: S$DAT  ENT                   ENTRY POINT
                   9276:        JSR  XSCNI            PREPARE TO SCAN ARGUMENT
                   9277:        ERR  087,DATA ARGUMENT IS NOT STRING
                   9278:        ERR  088,DATA ARGUMENT IS NULL
                   9279: *
                   9280: *      SCAN OUT DATATYPE NAME
                   9281: *
                   9282:        MOV  =CH$PP,WC        DELIMITER ONE = LEFT PAREN
                   9283:        MOV  WC,XL            DELIMITER TWO = LEFT PAREN
                   9284:        JSR  XSCAN            SCAN DATATYPE NAME
                   9285:        BNZ  WA,SDAT1         SKIP IF LEFT PAREN FOUND
                   9286:        ERB  089,DATA ARGUMENT IS MISSING A LEFT PAREN
                   9287: *
                   9288: *      HERE AFTER SCANNING DATATYPE NAME
                   9289: *
                   9290: SDAT1  MOV  XR,XL            SAVE NAME PTR
                   9291:        MOV  SCLEN(XR),WA     GET LENGTH
                   9292:        CTB  WA,SCSI$         COMPUTE SPACE NEEDED
                   9293:        JSR  ALOST            REQUEST STATIC STORE FOR NAME
                   9294:        MOV  XR,-(XS)         SAVE DATATYPE NAME
                   9295:        MVW                   COPY NAME TO STATIC
                   9296:        MOV  (XS),XR          GET NAME PTR
                   9297:        ZER  XL               SCRUB DUD REGISTER
                   9298:        JSR  GTNVR            LOCATE VRBLK FOR DATATYPE NAME
                   9299:        ERR  090,DATA ARGUMENT HAS NULL DATATYPE NAME
                   9300:        MOV  XR,DATDV         SAVE VRBLK POINTER FOR DATATYPE
                   9301:        MOV  XS,DATXS         STORE STARTING STACK VALUE
                   9302:        ZER  WB               ZERO COUNT OF FIELD NAMES
                   9303: *
                   9304: *      LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
                   9305: *
                   9306: SDAT2  MOV  =CH$RP,WC        DELIMITER ONE = RIGHT PAREN
                   9307:        MOV  =CH$CM,XL        DELIMITER TWO = COMMA
                   9308:        JSR  XSCAN            SCAN NEXT FIELD NAME
                   9309:        BNZ  WA,SDAT3         JUMP IF DELIMITER FOUND
                   9310:        ERB  091,BAD BLANK OR MISSING RIGHT PAREN IN DATA ARG
                   9311: *
                   9312: *      HERE AFTER SCANNING OUT ONE FIELD NAME
                   9313: *
                   9314: SDAT3  JSR  GTNVR            LOCATE VRBLK FOR FIELD NAME
                   9315:        ERR  092,DATA ARGUMENT HAS NULL FIELD NAME
                   9316:        MOV  XR,-(XS)         STACK VRBLK POINTER
                   9317:        ICV  WB               INCREMENT COUNTER
                   9318:        BEQ  WA,=NUM02,SDAT2  LOOP BACK IF STOPPED BY COMMA
                   9319:        EJC
                   9320: *
                   9321: *      DATA (CONTINUED)
                   9322: *
                   9323: *      NOW BUILD THE DFBLK
                   9324: *
                   9325:        MOV  =DFSI$,WA        SET SIZE OF DFBLK STANDARD FIELDS
                   9326:        ADD  WB,WA            ADD NUMBER OF FIELDS
                   9327:        WTB  WA               CONVERT LENGTH TO BAUS
                   9328:        MOV  WB,WC            PRESERVE NO. OF FIELDS
                   9329:        JSR  ALOST            ALLOCATE SPACE FOR DFBLK
                   9330:        MOV  WC,WB            GET NO OF FIELDS
                   9331:        MOV  DATXS,XT         POINT TO START OF STACK
                   9332:        MOV  (XT),WC          LOAD DATATYPE NAME
                   9333:        MOV  XR,(XT)          SAVE DFBLK POINTER ON STACK
                   9334:        MOV  =B$DFC,(XR)+     STORE TYPE WORD
                   9335:        MOV  WB,(XR)+         STORE NUMBER OF FIELDS (FARGS)
                   9336:        MOV  WA,(XR)+         STORE LENGTH (DFLEN)
                   9337:        SUB  *PDDFS,WA        COMPUTE PDBLK LENGTH (FOR DFPDL)
                   9338:        MOV  WA,(XR)+         STORE PDBLK LENGTH (DFPDL)
                   9339:        MOV  WC,(XR)+         STORE DATATYPE NAME (DFNAM)
                   9340:        LCT  WC,WB            COPY NUMBER OF FIELDS
                   9341: *
                   9342: *      LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
                   9343: *
                   9344: SDAT4  MOV  -(XT),(XR)+      MOVE ONE FIELD NAME VRBLK POINTER
                   9345:        BCT  WC,SDAT4         LOOP TILL ALL MOVED
                   9346: *
                   9347: *      NOW DEFINE THE DATATYPE FUNCTION
                   9348: *
                   9349:        MOV  WA,WC            COPY LENGTH OF PDBLK FOR LATER LOOP
                   9350:        MOV  DATDV,XR         POINT TO VRBLK
                   9351:        MOV  DATXS,XT         POINT BACK ON STACK
                   9352:        MOV  (XT),XL          LOAD DFBLK POINTER
                   9353:        JSR  DFFNC            DEFINE FUNCTION
                   9354:        EJC
                   9355: *
                   9356: *      DATA (CONTINUED)
                   9357: *
                   9358: *      LOOP TO BUILD FFBLKS
                   9359: *
                   9360: *
                   9361: *      NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
                   9362: *      SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
                   9363: *      SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
                   9364: *
                   9365: SDAT5  MOV  *FFSI$,WA        SET LENGTH OF FFBLK
                   9366:        JSR  ALLOC            ALLOCATE SPACE FOR FFBLK
                   9367:        MOV  =B$FFC,(XR)      SET TYPE WORD
                   9368:        MOV  =NUM01,FARGS(XR) STORE FARGS (ALWAYS ONE)
                   9369:        MOV  DATXS,XT         POINT BACK ON STACK
                   9370:        MOV  (XT),FFDFP(XR)   COPY DFBLK PTR TO FFBLK
                   9371:        DCA  WC               DECREMENT OLD DFPDL TO GET NEXT OFS
                   9372:        MOV  WC,FFOFS(XR)     SET OFFSET TO THIS FIELD
                   9373:        ZER  FFNXT(XR)        TENTATIVELY SET ZERO FORWARD PTR
                   9374:        MOV  XR,XL            COPY FFBLK POINTER FOR DFFNC
                   9375:        MOV  (XS),XR          LOAD VRBLK POINTER FOR FIELD
                   9376:        MOV  VRFNC(XR),XR     LOAD CURRENT FUNCTION POINTER
                   9377:        BNE  (XR),=B$FFC,SDAT6 SKIP IF NOT CURRENTLY A FIELD FUNC
                   9378: *
                   9379: *      HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
                   9380: *      CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
                   9381: *
                   9382:        MOV  XR,FFNXT(XL)     LINK NEW FFBLK TO PREVIOUS CHAIN
                   9383: *
                   9384: *      MERGE HERE TO DEFINE FIELD FUNCTION
                   9385: *
                   9386: SDAT6  MOV  (XS)+,XR         LOAD VRBLK POINTER
                   9387:        JSR  DFFNC            DEFINE FIELD FUNCTION
                   9388:        BNE  XS,DATXS,SDAT5   LOOP BACK TILL ALL DONE
                   9389:        ICA  XS               POP DFBLK POINTER
                   9390:        BRN  EXNUL            RETURN WITH NULL RESULT
                   9391:        EJC
                   9392: *
                   9393: *      DATATYPE
                   9394: *
                   9395: S$DTP  ENT                   ENTRY POINT
                   9396:        MOV  (XS)+,XR         LOAD ARGUMENT
                   9397:        JSR  DTYPE            GET DATATYPE
                   9398:        BRN  EXIXR            AND RETURN IT AS RESULT
                   9399:        EJC
                   9400: *
                   9401: *      DATE
                   9402: *
                   9403: S$DTE  ENT                   ENTRY POINT
                   9404:        JSR  SYSDT            CALL SYSTEM DATE ROUTINE
                   9405:        MOV  1(XL),WA         LOAD LENGTH FOR SBSTR
                   9406:        BZE  WA,EXNUL         RETURN NULL IF LENGTH IS ZERO
                   9407:        ZER  WB               SET ZERO OFFSET
                   9408:        JSR  SBSTR            USE SBSTR TO BUILD SCBLK
                   9409:        BRN  EXIXR            RETURN DATE STRING
                   9410:        EJC
                   9411: *
                   9412: *      DEFINE
                   9413: *
                   9414: S$DFN  ENT                   ENTRY POINT
                   9415:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   9416:        ZER  DEFLB            ZERO LABEL POINTER IN CASE NULL
                   9417:        BEQ  XR,=NULLS,SDF01  JUMP IF NULL SECOND ARGUMENT
                   9418:        JSR  GTNVR            ELSE FIND VRBLK FOR LABEL
                   9419:        PPM  SDF13            JUMP IF NOT A VARIABLE NAME
                   9420:        MOV  XR,DEFLB         ELSE SET SPECIFIED ENTRY
                   9421: *
                   9422: *      SCAN FUNCTION NAME
                   9423: *
                   9424: SDF01  JSR  XSCNI            PREPARE TO SCAN FIRST ARGUMENT
                   9425:        ERR  093,DEFINE FIRST ARGUMENT IS NOT STRING
                   9426:        ERR  094,DEFINE FIRST ARGUMENT IS NULL
                   9427:        MOV  =CH$PP,WC        DELIMITER ONE = LEFT PAREN
                   9428:        MOV  WC,XL            DELIMITER TWO = LEFT PAREN
                   9429:        JSR  XSCAN            SCAN OUT FUNCTION NAME
                   9430:        BNZ  WA,SDF02         JUMP IF LEFT PAREN FOUND
                   9431:        ERB  095,DEFINE FIRST ARGUMENT IS MISSING A LEFT PAREN
                   9432: *
                   9433: *      HERE AFTER SCANNING OUT FUNCTION NAME
                   9434: *
                   9435: SDF02  JSR  GTNVR            GET VARIABLE NAME
                   9436:        ERR  096,DEFINE FIRST ARGUMENT HAS NULL FUNCTION NAME
                   9437:        MOV  XR,DEFVR         SAVE VRBLK POINTER FOR FUNCTION NAM
                   9438:        ZER  WB               ZERO COUNT OF ARGUMENTS
                   9439:        MOV  XS,DEFXS         SAVE INITIAL STACK POINTER
                   9440:        BNZ  DEFLB,SDF03      JUMP IF SECOND ARGUMENT GIVEN
                   9441:        MOV  XR,DEFLB         ELSE DEFAULT IS FUNCTION NAME
                   9442: *
                   9443: *      LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
                   9444: *
                   9445: SDF03  MOV  =CH$RP,WC        DELIMITER ONE = RIGHT PAREN
                   9446:        MOV  =CH$CM,XL        DELIMITER TWO = COMMA
                   9447:        JSR  XSCAN            SCAN OUT NEXT ARGUMENT NAME
                   9448:        BZE  WA,SDF14         FAIL IF RUNOUT
                   9449:        JSR  GTNVR            GET VRBLK POINTER
                   9450:        PPM  SDF04            IGNORE NULL NAME
                   9451:        MOV  XR,-(XS)         STACK ARGUMENT VRBLK POINTER
                   9452:        ICV  WB               INCREMENT COUNTER
                   9453:        BEQ  WA,=NUM02,SDF03  LOOP BACK IF STOPPED BY A COMMA
                   9454:        BRN  SDF05            JUMP FOR RIGHT PAREN
                   9455:        EJC
                   9456: *
                   9457: *      DEFINE (CONTINUED)
                   9458: *
                   9459: *      NULL ARG FOUND. CONTINUE IF STOPPED BY COMMA
                   9460: *
                   9461: SDF04  BEQ  WA,=NUM02,SDF03  LOOP IF COMMA
                   9462: *
                   9463: *      HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
                   9464: *
                   9465: SDF05  MOV  WB,DEFNA         SAVE NUMBER OF ARGUMENTS
                   9466:        ZER  WB               ZERO COUNT OF LOCALS
                   9467: *
                   9468: *      LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
                   9469: *
                   9470: SDF06  MOV  =CH$CM,WC        SET DELIMITER ONE = COMMA
                   9471:        MOV  WC,XL            SET DELIMITER TWO = COMMA
                   9472:        JSR  XSCAN            SCAN OUT NEXT LOCAL NAME
                   9473:        BNZ  WA,SDF07         SKIP IF COMMA FOUND
                   9474:        BNZ  XSCNB,SDF14      FAIL IF BAD BLANK, OK IF LAST LOC
                   9475: *
                   9476: *      HERE AFTER SCANNING OUT A LOCAL NAME
                   9477: *
                   9478: SDF07  JSR  GTNVR            GET VRBLK POINTER
                   9479:        PPM  SDF08            IGNORE NULL NAME
                   9480:        ICV  WB               IF OK, INCREMENT COUNT
                   9481:        MOV  XR,-(XS)         STACK VRBLK POINTER
                   9482:        BNZ  WA,SDF06         LOOP BACK IF STOPPED BY A COMMA
                   9483:        BRN  SDF09            JUMP FOR END OF STRING
                   9484: *
                   9485: *      NULL LOCAL
                   9486: *
                   9487: SDF08  BNZ  WA,SDF06         LOOP IF COMMA AFTER NULL LOCAL
                   9488:        EJC
                   9489: *
                   9490: *      DEFINE (CONTINUED)
                   9491: *
                   9492: *      HERE AFTER SCANNING LOCALS, BUILD PFBLK
                   9493: *
                   9494: SDF09  MOV  WB,WA            COPY COUNT OF LOCALS
                   9495:        ADD  DEFNA,WA         ADD NUMBER OF ARGUMENTS
                   9496:        MOV  WA,WC            SET SUM ARGS+LOCALS AS LOOP COUNT
                   9497:        ADD  =PFSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   9498:        WTB  WA               CONVERT LENGTH TO BAUS
                   9499:        JSR  ALLOC            ALLOCATE SPACE FOR PFBLK
                   9500:        MOV  XR,XL            SAVE POINTER TO PFBLK
                   9501:        MOV  =B$PFC,(XR)+     STORE FIRST WORD
                   9502:        MOV  DEFNA,(XR)+      STORE NUMBER OF ARGUMENTS
                   9503:        MOV  WA,(XR)+         STORE LENGTH (PFLEN)
                   9504:        MOV  DEFVR,(XR)+      STORE VRBLK PTR FOR FUNCTION NAME
                   9505:        MOV  WB,(XR)+         STORE NUMBER OF LOCALS
                   9506:        ZER  (XR)+            DEAL WITH LABEL LATER
                   9507:        ZER  (XR)+            ZERO PFCTR
                   9508:        ZER  (XR)+            ZERO PFRTR
                   9509:        BZE  WC,SDF11         SKIP IF NO ARGS OR LOCALS
                   9510:        MOV  XL,WA            KEEP PFBLK POINTER
                   9511:        MOV  DEFXS,XT         POINT BEFORE ARGUMENTS
                   9512:        LCT  WC,WC            GET COUNT OF ARGS+LOCALS FOR LOOP
                   9513: *
                   9514: *      LOOP TO MOVE LOCALS AND ARGS TO PFBLK
                   9515: *
                   9516: SDF10  MOV  -(XT),(XR)+      STORE ONE ENTRY AND BUMP POINTERS
                   9517:        BCT  WC,SDF10         LOOP TILL ALL STORED
                   9518:        MOV  WA,XL            RECOVER PFBLK POINTER
                   9519:        EJC
                   9520: *
                   9521: *      DEFINE (CONTINUED)
                   9522: *
                   9523: *      NOW DEAL WITH LABEL
                   9524: *
                   9525: SDF11  MOV  DEFXS,XS         POP STACK
                   9526:        MOV  DEFLB,XR         POINT TO VRBLK FOR LABEL
                   9527:        MOV  VRLBL(XR),XR     LOAD LABEL POINTER
                   9528:        BNE  (XR),=B$TRT,SDF12 SKIP IF NOT TRAPPED
                   9529:        MOV  TRLBL(XR),XR     ELSE POINT TO REAL LABEL
                   9530: *
                   9531: *      HERE AFTER LOCATING REAL LABEL POINTER
                   9532: *
                   9533: SDF12  BEQ  XR,=STNDL,SDF13  JUMP IF LABEL IS NOT DEFINED
                   9534:        MOV  XR,PFCOD(XL)     ELSE STORE LABEL POINTER
                   9535:        MOV  DEFVR,XR         POINT BACK TO VRBLK FOR FUNCTION
                   9536:        JSR  DFFNC            DEFINE FUNCTION
                   9537:        BRN  EXNUL            AND EXIT RETURNING NULL
                   9538: *
                   9539: *      HERE FOR ERRONEOUS LABEL
                   9540: *
                   9541: SDF13  ERB  097,DEFINE FUNCTION ENTRY POINT IS NOT DEFINED LABEL
                   9542: *
                   9543: *      ERRONEOUS ARG OR LOCAL
                   9544: *
                   9545: SDF14  ERB  098,BAD BLANK OR MISSING RIGHT PAREN IN DEFINE ARG
                   9546:        EJC
                   9547: *
                   9548: *      DETACH
                   9549: *
                   9550: S$DET  ENT                   ENTRY POINT
                   9551:        MOV  (XS)+,XR         LOAD ARGUMENT
                   9552:        JSR  GTVAR            LOCATE VARIABLE
                   9553:        ERR  099,DETACH ARGUMENT IS NOT APPROPRIATE NAME
                   9554:        MOV  WA,-(XS)         KEEP OFFSET
                   9555:        ZER  SDETF            CLEAR FAIL FLAG
                   9556:        MOV  =TRTIN,WB        TRACE TYPE
                   9557:        ZER  XR               REMOVE TRBLK
                   9558:        JSR  TRCHN            REMOVE ANY INPUT ASSOCIATION
                   9559:        PPM  SDET1            SKIP IF NO INPUT TRBLK
                   9560:        MNZ  SDETF            NOTE TRBLK REMOVED
                   9561: *
                   9562: *      REPEAT FOR OUTPUT TRBLK
                   9563: *
                   9564: SDET1  MOV  (XS)+,WA         RECOVER OFFSET
                   9565:        MOV  =TRTOU,WB        TRTYP
                   9566:        JSR  TRCHN            REMOVE ANY OUTPUT ASSOCIATION
                   9567:        PPM  SDET2            SKIP IF NO TRBLK
                   9568:        BRN  EXNUL            SUCCEED
                   9569: *
                   9570: *      CHECK AT LEAST ONE TRBLK REMOVED
                   9571: *
                   9572: SDET2  BNZ  SDETF,EXNUL      SUCCEED IF SO
                   9573:        BRN  EXFAL            ELSE FAIL
                   9574:        EJC
                   9575: *
                   9576: *      DIFFER
                   9577: *
                   9578: S$DIF  ENT                   ENTRY POINT
                   9579:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   9580:        MOV  (XS)+,XL         LOAD FIRST ARGUMENT
                   9581:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
                   9582:        PPM  EXFAL            FAIL IF IDENT
                   9583:        BRN  EXNUL            RETURN NULL IF DIFFER
                   9584:        EJC
                   9585: *
                   9586: *      DUMP
                   9587: *
                   9588: S$DMP  ENT                   ENTRY POINT
                   9589:        JSR  GTSMI            LOAD DUMP ARG AS SMALL INTEGER
                   9590:        ERR  100,DUMP ARGUMENT IS NOT INTEGER
                   9591:        ERR  101,DUMP ARGUMENT IS NEGATIVE OR TOO LARGE
                   9592:        JSR  DUMPR            ELSE CALL DUMP ROUTINE
                   9593:        BRN  EXNUL            AND RETURN NULL AS RESULT
                   9594:        EJC
                   9595: *
                   9596: *      DUPL
                   9597: *
                   9598: S$DUP  ENT                   ENTRY POINT
                   9599:        JSR  GTSMI            GET SECOND ARGUMENT AS SMALL INTEGE
                   9600:        ERR  102,DUPL SECOND ARGUMENT IS NOT INTEGER
                   9601:        PPM  SDUP7            JUMP IF NEGATIVE OT TOO BIG
                   9602:        MOV  XR,WB            SAVE DUPLICATION FACTOR
                   9603:        JSR  GTSTG            GET FIRST ARG AS STRING
                   9604:        PPM  SDUP4            JUMP IF NOT A STRING
                   9605: *
                   9606: *      HERE FOR CASE OF DUPLICATION OF A STRING
                   9607: *
                   9608:        MTI  WA               ACQUIRE LENGTH AS INTEGER
                   9609:        STI  DUPSI            SAVE FOR THE MOMENT
                   9610:        MTI  WB               GET DUPLICATION FACTOR AS INTEGER
                   9611:        MLI  DUPSI            FORM PRODUCT
                   9612:        IOV  SDUP3            JUMP IF OVERFLOW
                   9613:        IEQ  EXNUL            RETURN NULL IF RESULT LENGTH = 0
                   9614:        MFI  WA,SDUP3         GET AS ADDR INTEGER, CHECK OVFLO
                   9615: *
                   9616: *      MERGE HERE WITH RESULT LENGTH IN WA
                   9617: *
                   9618: SDUP1  MOV  XR,XL            SAVE STRING POINTER
                   9619:        JSR  ALOCS            ALLOCATE SPACE FOR STRING
                   9620:        MOV  XR,-(XS)         SAVE AS RESULT POINTER
                   9621:        MOV  XL,WC            SAVE POINTER TO ARGUMENT STRING
                   9622:        PSC  XR               PREPARE TO STORE CHARS OF RESULT
                   9623:        LCT  WB,WB            SET COUNTER TO CONTROL LOOP
                   9624: *
                   9625: *      LOOP THROUGH DUPLICATIONS
                   9626: *
                   9627: SDUP2  MOV  WC,XL            POINT BACK TO ARGUMENT STRING
                   9628:        MOV  SCLEN(XL),WA     GET NUMBER OF CHARACTERS
                   9629:        PLC  XL               POINT TO CHARS IN ARGUMENT STRING
                   9630:        MVC                   MOVE CHARACTERS TO RESULT STRING
                   9631:        BCT  WB,SDUP2         LOOP TILL ALL DUPLICATIONS DONE
                   9632:        BRN  EXITS            THEN EXIT FOR NEXT CODE WORD
                   9633:        EJC
                   9634: *
                   9635: *      DUPL (CONTINUED)
                   9636: *
                   9637: *      HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
                   9638: *
                   9639: SDUP3  MOV  DNAME,WA         SET IMPOSSIBLE LENGTH FOR ALOCS
                   9640:        BRN  SDUP1            MERGE BACK
                   9641: *
                   9642: *      HERE IF NOT A STRING
                   9643: *
                   9644: SDUP4  JSR  GTPAT            CONVERT ARGUMENT TO PATTERN
                   9645:        ERR  103,DUPL FIRST ARGUMENT IS NOT STRING OR PATTERN
                   9646: *
                   9647: *      HERE TO DUPLICATE A PATTERN ARGUMENT
                   9648: *
                   9649:        MOV  XR,-(XS)         STORE PATTERN ON STACK
                   9650:        MOV  =NDNTH,XR        START OFF WITH NULL PATTERN
                   9651:        BZE  WB,SDUP6         NULL PATTERN IS RESULT IF DUPFAC=0
                   9652:        MOV  WB,-(XS)         PRESERVE LOOP COUNT
                   9653: *
                   9654: *      LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
                   9655: *
                   9656: SDUP5  MOV  XR,XL            COPY CURRENT VALUE AS RIGHT ARGUMNT
                   9657:        MOV  1(XS),XR         GET A NEW COPY OF LEFT
                   9658:        JSR  PCONC            CONCATENATE
                   9659:        DCV  (XS)             COUNT DOWN
                   9660:        BNZ  (XS),SDUP5       LOOP
                   9661:        ICA  XS               POP LOOP COUNT
                   9662: *
                   9663: *      HERE TO EXIT AFTER CONSTRUCTING PATTERN
                   9664: *
                   9665: SDUP6  MOV  XR,(XS)          STORE RESULT ON STACK
                   9666:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   9667: *
                   9668: *      FAIL IF SECOND ARG IS OUT OF RANGE
                   9669: *
                   9670: SDUP7  ICA  XS               POP FIRST ARGUMENT
                   9671:        BRN  EXFAL            FAIL
                   9672:        EJC
                   9673: *
                   9674: *      EJECT
                   9675: *
                   9676: S$EJC  ENT                   ENTRY POINT
                   9677:        MOV  (XS)+,WB         GET ARGUMENT
                   9678:        MOV  WB,-(XS)         RESTACK IT
                   9679:        JSR  GTSTG            CONVERT TO STRING
                   9680:        PPM  SEJC2            FAIL IF CANT
                   9681:        BZE  WA,SEJC1         SKIP IF NULL STRING
                   9682:        MOV  WB,-(XS)         RESTACK ORIGINAL ARG
                   9683:        JSR  IOFTG            CALL FILETAG ROUTINE
                   9684:        PPM  SEJC2            FAIL
                   9685:        BZE  WA,EXFAL         FAIL IF NOT ASSOCIATED
                   9686:        JSR  SYSEF            CALL EJECT FILE FUNCTION
                   9687:        PPM  EXFAL            FAIL RETURN
                   9688:        PPM  EROSI            ERROR RETURN
                   9689:        BRN  EXNUL            RETURN NULL AS RESULT
                   9690: *
                   9691: *      HERE TO EJECT STANDARD OUTPUT FILE
                   9692: *
                   9693: SEJC1  JSR  SYSEP            CALL ROUTINE TO EJECT PRINTER
                   9694:        PPM  EXFAL            FAIL RETURN
                   9695:        PPM  EROSI            ERROR RETURN
                   9696:        BRN  EXNUL            EXIT WITH NULL RESULT
                   9697: *
                   9698: *      ERROR POINT
                   9699: *
                   9700: SEJC2  ERB  104,EJECT ARGUMENT IS NOT A SUITABLE FILETAG
                   9701:        EJC
                   9702: *
                   9703: *      ENDFILE
                   9704: *
                   9705: S$ENF  ENT                   ENTRY POINT
                   9706:        JSR  GTSTG            CONVERT SECOND ARG TO STRING
                   9707:        ERR  105,ENDFILE SECOND ARGUMENT IS NOT A STRING
                   9708:        BNZ  WA,SENF1         SKIP IF NON NULL SECOND ARG
                   9709:        ZER  XR               0 IF NULL
                   9710: *
                   9711: *      NOW PROCESS FILETAG
                   9712: *
                   9713: SENF1  MOV  XR,SENFR         KEEP SECOND ARG
                   9714:        JSR  IOFTG            CALL FILETAG PROC (WB = VRBLK PTR)
                   9715:        ERR  106,ENDFILE FIRST ARGUMENT IS NOT A SUITABLE FILETAG
                   9716:        BZE  WA,EXFAL         FAIL IF NO IOTAG
                   9717:        MOV  SENFR,XR         RECOVER SECOND ARG
                   9718:        JSR  SYSEN            CALL ENDFILE ROUTINE
                   9719:        PPM  EXFAL            FAIL RETURN
                   9720:        PPM  EROSI            ERROR RETURN
                   9721:        BNZ  WA,EXNUL         RETURN NULL IF NO FILE CLOSURE
                   9722:        MOV  WB,XL            POINT TO FILETAG VRBLK
                   9723:        MOV  *VRVAL,WA        OFFSET TO VALUE FIELD
                   9724:        ZER  XR               FOR TRBLK REMOVAL
                   9725:        MOV  =TRTIO,WB        TRTYP
                   9726:        JSR  TRCHN            REMOVE TRBLK
                   9727:        PPM  EXFAL            (CANT FAIL HERE)
                   9728:        BRN  EXNUL            RETURN NULL
                   9729:        EJC
                   9730: *
                   9731: *      EQ
                   9732: *
                   9733: S$EQF  ENT                   ENTRY POINT
                   9734:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   9735:        ERR  107,EQ FIRST ARGUMENT IS NOT NUMERIC
                   9736:        ERR  108,EQ SECOND ARGUMENT IS NOT NUMERIC
                   9737:        PPM  EXFAL            FAIL IF LT
                   9738:        PPM  EXNUL            RETURN NULL IF EQ
                   9739:        PPM  EXFAL            FAIL IF GT
                   9740:        EJC
                   9741: *
                   9742: *      EVAL
                   9743: *
                   9744: S$EVL  ENT                   ENTRY POINT
                   9745:        MOV  (XS)+,XR         LOAD ARGUMENT
                   9746:        JSR  GTEXP            CONVERT TO EXPRESSION
                   9747:        ERR  109,EVAL ARGUMENT IS NOT EXPRESSION
                   9748:        LCW  WC               LOAD NEXT CODE WORD
                   9749:        BNE  WC,=OFNE$,SEVL1  JUMP IF CALLED BY VALUE
                   9750:        SCP  XL               COPY CODE POINTER
                   9751:        MOV  (XL),WA          GET NEXT CODE WORD
                   9752:        BNE  WA,=ORNM$,SEVL2  BY NAME UNLESS EXPRESSION
                   9753:        BNZ  1(XS),SEVL2      JUMP IF BY NAME
                   9754: *
                   9755: *      HERE IF CALLED BY VALUE
                   9756: *
                   9757: SEVL1  ZER  WB               SET FLAG FOR BY VALUE
                   9758:        MOV  WC,-(XS)         SAVE CODE WORD
                   9759:        JSR  EVALX            EVALUATE EXPRESSION BY VALUE
                   9760:        PPM  EXFAL            FAIL IF EVALUATION FAILS
                   9761:        MOV  XR,XL            COPY RESULT
                   9762:        MOV  (XS),XR          RELOAD NEXT CODE WORD
                   9763:        MOV  XL,(XS)          STACK RESULT
                   9764:        BRI  (XR)             JUMP TO EXECUTE NEXT CODE WORD
                   9765: *
                   9766: *      HERE IF CALLED BY NAME
                   9767: *
                   9768: SEVL2  MOV  =NUM01,WB        SET FLAG FOR BY NAME
                   9769:        JSR  EVALX            EVALUATE EXPRESSION BY NAME
                   9770:        PPM  EXFAL            FAIL IF EVALUATION FAILS
                   9771:        BRN  EXNAM            EXIT WITH NAME
                   9772: .IF    .CNEX
                   9773: .ELSE
                   9774:        EJC
                   9775: *
                   9776: *      EXIT
                   9777: *
                   9778: S$EXT  ENT                   ENTRY POINT
                   9779:        ZER  WB               CLEAR AMOUNT OF STATIC SHIFT
                   9780:        JSR  GBCOL            COMPACT MEMORY BY COLLECTING
                   9781:        JSR  GTSTG            CONVERT ARG TO STRING
                   9782:        ERR  110,EXIT ARGUMENT IS NOT SUITABLE INTEGER OR STRING
                   9783:        MOV  XR,XL            COPY STRING PTR
                   9784:        JSR  GTINT            CHECK IT IS INTEGER
                   9785:        PPM  SEXT1            SKIP IF UNCONVERTIBLE
                   9786:        ZER  XL               NOTE IT IS INTEGER
                   9787:        LDI  ICVAL(XR)        GET INTEGER ARG
                   9788: *
                   9789: *      MERGE TO CALL OSINT EXIT ROUTINE
                   9790: *
                   9791: SEXT1  MOV  =HEADV,XR        POINT TO V.V STRING
                   9792:        MOV  =KVCOD,WA        VALUE OF CODE KEYWORD
                   9793:        JSR  SYSXI            CALL EXTERNAL ROUTINE
                   9794:        PPM  EXFAL            FAIL RETURN
                   9795:        PPM  EROSI            ERROR RETURN
                   9796:        IEQ  EXNUL            RETURN IF ARGUMENT 0
                   9797:        ZER  GBCNT            RESUMING EXECUTION SO.
                   9798:        IGT  SEXT2            SKIP IF POSITIVE
                   9799:        NGI                   MAKE POSITIVE
                   9800: *
                   9801: *      CHECK FOR OPTION RESPECIFICATION
                   9802: *
                   9803: SEXT2  MFI  WC               GET VALUE IN WORK REGISTER
                   9804:        BEQ  WC,=NUM03,SEXT3  SKIP IF WAS 3
                   9805:        MOV  WC,-(XS)         SAVE VALUE
                   9806:        ZER  WC               SET TO READ OPTIONS
                   9807:        JSR  PRPAR            READ SYSPP OPTIONS
                   9808:        MOV  (XS)+,WA         RESTORE VALUE
                   9809: *
                   9810: *      DEAL WITH HEADER OPTIONS (FIDDLED BY PRPAR)
                   9811: *
                   9812: SEXT3  MNZ  HEADP            ASSUME NO HEADERS
                   9813:        BNE  WC,=NUM01,SEXT4  SKIP IF NOT 1
                   9814:        ZER  HEADP            REQUEST HEADER PRINTING
                   9815: *
                   9816: *      ALMOST READY TO RESUME RUNNING
                   9817: *
                   9818: SEXT4  JSR  SYSTM            GET RECOMMENCEMENT TIME
                   9819:        STI  TIMSX            SAVE AS INITIAL TIME
                   9820:        LDI  KVSTC            RESET TO ENSURE ...
                   9821:        STI  KVSTL            ... CORRECT EXECUTION STATS
                   9822:        BRN  EXNUL            RESUME EXECUTION
                   9823: .FI
                   9824: .IF    .CNFN
                   9825: .ELSE
                   9826:        EJC
                   9827: *
                   9828: *      FENCE
                   9829: *
                   9830: S$FNC  ENT                   ENTRY POINT
                   9831:        MOV  =P$FNC,WB        SET PCODE FOR P$FNC
                   9832:        ZER  XR               P0BLK
                   9833:        JSR  PBILD            BUILD P$FNC NODE
                   9834:        MOV  XR,XL            SAVE POINTER TO IT
                   9835:        MOV  (XS)+,XR         GET ARGUMENT
                   9836:        JSR  GTPAT            CONVERT TO PATTERN
                   9837:        ERR  180,FENCE ARGUMENT IS NOT PATTERN
                   9838:        JSR  PCONC            CONCATENATE TO P$FNC NODE
                   9839:        MOV  XR,XL            SAVE PTR TO CONCATENATED PATTERN
                   9840:        MOV  =P$FNA,WB        SET FOR P$FNA PCODE
                   9841:        ZER  XR               P0BLK
                   9842:        JSR  PBILD            CONSTRUCT P$FNA NODE
                   9843:        MOV  XL,PTHEN(XR)     SET PATTERN AS PTHEN
                   9844:        MOV  XR,-(XS)         SET AS RESULT
                   9845:        BRN  EXITS            DO NEXT CODE WORD
                   9846:        EJC
                   9847: .FI
                   9848: *
                   9849: *      FIELD
                   9850: *
                   9851: S$FLD  ENT                   ENTRY POINT
                   9852:        JSR  GTSMI            GET SECOND ARGUMENT (FIELD NUMBER)
                   9853:        ERR  255,FIELD SECOND ARGUMENT IS NOT INTEGER
                   9854:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   9855:        MOV  XR,WB            ELSE SAVE INTEGER VALUE
                   9856:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   9857:        JSR  GTNVR            POINT TO VRBLK
                   9858:        PPM  SFLD1            JUMP (ERROR) IF NOT VARIABLE NAME
                   9859:        MOV  VRFNC(XR),XR     ELSE POINT TO FUNCTION BLOCK
                   9860:        BNE  (XR),=B$DFC,SFLD1 ERROR IF NOT DATATYPE FUNCTION
                   9861: *
                   9862: *      HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
                   9863: *
                   9864:        BZE  WB,EXFAL         FAIL IF ARGUMENT NUMBER IS ZERO
                   9865:        BGT  WB,FARGS(XR),EXFAL FAIL IF TOO LARGE
                   9866:        WTB  WB               ELSE CONVERT TO BYTE OFFSET
                   9867:        ADD  WB,XR            POINT TO FIELD NAME
                   9868:        MOV  DFFLB(XR),XR     LOAD VRBLK POINTER
                   9869:        BRN  EXVNM            EXIT TO BUILD NMBLK
                   9870: *
                   9871: *      HERE FOR BAD FIRST ARGUMENT
                   9872: *
                   9873: SFLD1  ERB  254,FIELD FIRST ARGUMENT IS NOT DATATYPE NAME
                   9874:        EJC
                   9875: *
                   9876: *      GE
                   9877: *
                   9878: S$GEF  ENT                   ENTRY POINT
                   9879:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   9880:        ERR  111,GE FIRST ARGUMENT IS NOT NUMERIC
                   9881:        ERR  112,GE SECOND ARGUMENT IS NOT NUMERIC
                   9882:        PPM  EXFAL            FAIL IF LT
                   9883:        PPM  EXNUL            RETURN NULL IF EQ
                   9884:        PPM  EXNUL            RETURN NULL IF GT
                   9885: *
                   9886: *      GT
                   9887: *
                   9888: S$GTF  ENT                   ENTRY POINT
                   9889:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   9890:        ERR  113,GT FIRST ARGUMENT IS NOT NUMERIC
                   9891:        ERR  114,GT SECOND ARGUMENT IS NOT NUMERIC
                   9892:        PPM  EXFAL            FAIL IF LT
                   9893:        PPM  EXFAL            FAIL IF EQ
                   9894:        PPM  EXNUL            RETURN NULL IF GT
                   9895:        EJC
                   9896: *
                   9897: *      HOST
                   9898: *
                   9899: S$HST  ENT                   ENTRY POINT
                   9900:        JSR  GTSTG            CONVERT ARG TO STRING
                   9901:        ERR  115,ERRONEOUS THIRD ARGUMENT FOR HOST
                   9902:        MOV  WA,WB            KEEP LENGTH
                   9903:        MOV  XR,WC            KEEP THIRD ARG
                   9904:        JSR  GTSTG            CONVERT ARG TO STRING
                   9905:        ERR  116,ERRONEOUS SECOND ARGUMENT FOR HOST
                   9906:        ORB  WA,WB            NON ZERO UNLESS TWO ARGS NULL
                   9907:        MOV  XR,XL            KEEP SECOND ARG
                   9908:        JSR  GTSTG            CONVERT ARG TO STRING
                   9909:        ERR  117,ERRONEOUS FIRST ARGUMENT FOR HOST
                   9910:        ORB  WA,WB            NON ZERO UNLESS ALL ARGS NULL
                   9911:        MOV  XR,WA            KEEP FIRST ARG
                   9912:        MOV  WC,XR            GET THIRD ARG
                   9913:        JSR  SYSHS            CALL SYSHS ROUTINE
                   9914:        PPM  EXFAL            FAIL RETURN
                   9915:        PPM  EROSI            ERROR RETURN
                   9916:        MOV  SCLEN(XL),WA     LENGTH OF RETURNED STRING
                   9917:        ZER  WB               ZERO OFFSET
                   9918:        JSR  SBSTR            BUILD COPY OF STRING
                   9919:        MOV  XR,-(XS)         STACK THE RESULT
                   9920:        BRN  EXITS            RETURN RESULT ON STACK
                   9921:        EJC
                   9922: *
                   9923: *      IDENT
                   9924: *
                   9925: S$IDN  ENT                   ENTRY POINT
                   9926:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   9927:        MOV  (XS)+,XL         LOAD FIRST ARGUMENT
                   9928:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
                   9929:        PPM  EXNUL            RETURN NULL IF IDENT
                   9930:        BRN  EXFAL            FAIL IF DIFFER
                   9931:        EJC
                   9932: *
                   9933: *      INPUT
                   9934: *
                   9935: S$INP  ENT                   ENTRY POINT
                   9936:        ZER  WB               INPUT FLAG
                   9937:        JSR  IOPUT            CALL INPUT/OUTPUT ASSOC. ROUTINE
                   9938:        ERR  118,INPUT THIRD ARGUMENT (FILEPROPS) IS NOT A STRING
                   9939:        ERR  119,INAPPROPRIATE SECOND ARGUMENT (FILETAG) FOR INPUT
                   9940:        ERR  120,INAPPROPRIATE FIRST ARGUMENT FOR INPUT
                   9941:        PPM  EXFAL            FAIL RETURN
                   9942:        BRN  EXNUL            RETURN NULL STRING
                   9943: .IF    .CNBF
                   9944: .ELSE
                   9945:        EJC
                   9946: *
                   9947: *      INSERT
                   9948: *
                   9949: S$INS  ENT                   ENTRY POINT
                   9950:        MOV  (XS)+,XL         GET STRING ARG
                   9951:        JSR  GTSMI            GET REPLACE LENGTH
                   9952:        ERR  121,INSERT THIRD ARGUMENT NOT INTEGER
                   9953:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   9954:        MOV  WC,WB            COPY TO PROPER REG
                   9955:        JSR  GTSMI            GET REPLACE POSITION
                   9956:        ERR  122,INSERT SECOND ARGUMENT NOT INTEGER
                   9957:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   9958:        BZE  WC,EXFAL         FAIL IF ZERO
                   9959:        DCV  WC               DECREMENT TO GET OFFSET
                   9960:        MOV  WC,WA            PUT IN PROPER REGISTER
                   9961:        MOV  (XS)+,XR         GET BUFFER
                   9962:        BEQ  (XR),=B$BCT,SINS1 PRESS ON IF TYPE OK
                   9963:        ERB  123,INSERT FIRST ARGUMENT NOT BUFFER
                   9964: *
                   9965: *      HERE WHEN EVERYTHING LOADED UP
                   9966: *
                   9967: SINS1  JSR  INSBF            CALL TO INSERT
                   9968:        ERR  124,INSERT FOURTH ARGUMENT NOT A STRING
                   9969:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   9970:        BRN  EXNUL            ELSE OK - EXIT WITH NULL
                   9971: .FI
                   9972:        EJC
                   9973: *
                   9974: *      INTEGER
                   9975: *
                   9976: S$INT  ENT                   ENTRY POINT
                   9977:        MOV  (XS)+,XR         LOAD ARGUMENT
                   9978:        JSR  GTNUM            CONVERT TO NUMERIC
                   9979:        PPM  EXFAL            FAIL IF NON-NUMERIC
                   9980:        BEQ  WA,=B$ICL,EXNUL  RETURN NULL IF INTEGER
                   9981:        BRN  EXFAL            FAIL IF REAL
                   9982:        EJC
                   9983: *
                   9984: *      ITC
                   9985: *
                   9986: S$ITC  ENT
                   9987:        JSR  GTSMI            OBTAIN ARG AS AN INTEGER
                   9988:        ERR  125,ITC ARGUMENT IS NOT A SMALL INTEGER
                   9989:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   9990:        BGE  WC,=CFP$A,EXFAL  FURTHER RANGE CHECK
                   9991:        MOV  WC,WB            PRESERVE WC
                   9992:        MOV  =NUM01,WA        FOR SCBLK REQUEST
                   9993:        JSR  ALOCS            BUILD STRING BLOCK
                   9994:        MOV  XR,XL            COPY STRING PTR
                   9995:        PSC  XL               READY TO STORE CHAR
                   9996:        SCH  WB,(XL)          STORE IT
                   9997:        ZER  XL               CLEAR GARBAGE
                   9998:        BRN  EXIXR            RETURN STRING RESULT
                   9999:        EJC
                   10000: *
                   10001: *      ITEM
                   10002: *
                   10003: *      ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
                   10004: *      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
                   10005: *
                   10006: S$ITM  ENT                   ENTRY POINT
                   10007: *
                   10008: *      DEAL WITH CASE OF NO ARGS
                   10009: *
                   10010:        BNZ  WA,SITM1         JUMP IF AT LEAST ONE ARG
                   10011:        MOV  =NULLS,-(XS)     ELSE SUPPLY GARBAGE NULL ARG
                   10012:        MOV  =NUM01,WA        AND FIX ARGUMENT COUNT
                   10013: *
                   10014: *      CHECK FOR NAME/VALUE CASES
                   10015: *
                   10016: SITM1  SCP  XR               GET CURRENT CODE POINTER
                   10017:        MOV  (XR),XL          LOAD NEXT CODE WORD
                   10018:        DCV  WA               GET NUMBER OF SUBSCRIPTS
                   10019:        MOV  WA,XR            COPY FOR ARREF
                   10020:        BEQ  XL,=OFNE$,SITM2  JUMP IF CALLED BY NAME
                   10021: *
                   10022: *      HERE IF CALLED BY VALUE
                   10023: *
                   10024:        ZER  WB               SET CODE FOR CALL BY VALUE
                   10025:        BRN  ARREF            OFF TO ARRAY REFERENCE ROUTINE
                   10026: *
                   10027: *      HERE FOR CALL BY NAME
                   10028: *
                   10029: SITM2  MNZ  WB               SET CODE FOR CALL BY NAME
                   10030:        LCW  WA               LOAD AND IGNORE OFNE$ CALL
                   10031:        BRN  ARREF            OFF TO ARRAY REFERENCE ROUTINE
                   10032:        EJC
                   10033: *
                   10034: *      LE
                   10035: *
                   10036: S$LEF  ENT                   ENTRY POINT
                   10037:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   10038:        ERR  126,LE FIRST ARGUMENT IS NOT NUMERIC
                   10039:        ERR  127,LE SECOND ARGUMENT IS NOT NUMERIC
                   10040:        PPM  EXNUL            RETURN NULL IF LT
                   10041:        PPM  EXNUL            RETURN NULL IF EQ
                   10042:        PPM  EXFAL            FAIL IF GT
                   10043:        EJC
                   10044: *
                   10045: *      LEN
                   10046: *
                   10047: S$LEN  ENT                   ENTRY POINT
                   10048:        MOV  =P$LEN,WB        SET PCODE FOR INTEGER ARG CASE
                   10049:        MOV  =P$LND,WA        SET PCODE FOR EXPR ARG CASE
                   10050:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   10051:        ERR  128,LEN ARGUMENT IS NOT INTEGER OR EXPRESSION
                   10052:        ERR  129,LEN ARGUMENT IS NEGATIVE OR TOO LARGE
                   10053:        BRN  EXIXR            RETURN PATTERN NODE
                   10054:        EJC
                   10055: *
                   10056: *      LEQ
                   10057: *
                   10058: S$LEQ  ENT                   ENTRY POINT
                   10059:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   10060:        ERR  130,LEQ FIRST ARGUMENT IS NOT STRING
                   10061:        ERR  131,LEQ SECOND ARGUMENT IS NOT STRING
                   10062:        PPM  EXFAL            FAIL IF LLT
                   10063:        PPM  EXNUL            RETURN NULL IF LEQ
                   10064:        PPM  EXFAL            FAIL IF LGT
                   10065:        EJC
                   10066: *
                   10067: *      LGE
                   10068: *
                   10069: S$LGE  ENT                   ENTRY POINT
                   10070:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   10071:        ERR  132,LGE FIRST ARGUMENT IS NOT STRING
                   10072:        ERR  133,LGE SECOND ARGUMENT IS NOT STRING
                   10073:        PPM  EXFAL            FAIL IF LLT
                   10074:        PPM  EXNUL            RETURN NULL IF LEQ
                   10075:        PPM  EXNUL            RETURN NULL IF LGT
                   10076:        EJC
                   10077: *
                   10078: *      LGT
                   10079: *
                   10080: S$LGT  ENT                   ENTRY POINT
                   10081:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   10082:        ERR  134,LGT FIRST ARGUMENT IS NOT STRING
                   10083:        ERR  135,LGT SECOND ARGUMENT IS NOT STRING
                   10084:        PPM  EXFAL            FAIL IF LLT
                   10085:        PPM  EXFAL            FAIL IF LEQ
                   10086:        PPM  EXNUL            RETURN NULL IF LGT
                   10087:        EJC
                   10088: *
                   10089: *      LLE
                   10090: *
                   10091: S$LLE  ENT                   ENTRY POINT
                   10092:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   10093:        ERR  136,LLE FIRST ARGUMENT IS NOT STRING
                   10094:        ERR  137,LLE SECOND ARGUMENT IS NOT STRING
                   10095:        PPM  EXNUL            RETURN NULL IF LLT
                   10096:        PPM  EXNUL            RETURN NULL IF LEQ
                   10097:        PPM  EXFAL            FAIL IF LGT
                   10098:        EJC
                   10099: *
                   10100: *      LLT
                   10101: *
                   10102: S$LLT  ENT                   ENTRY POINT
                   10103:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   10104:        ERR  138,LLT FIRST ARGUMENT IS NOT STRING
                   10105:        ERR  139,LLT SECOND ARGUMENT IS NOT STRING
                   10106:        PPM  EXNUL            RETURN NULL IF LLT
                   10107:        PPM  EXFAL            FAIL IF LEQ
                   10108:        PPM  EXFAL            FAIL IF LGT
                   10109:        EJC
                   10110: *
                   10111: *      LNE
                   10112: *
                   10113: S$LNE  ENT                   ENTRY POINT
                   10114:        JSR  LCOMP            CALL STRING COMPARISON ROUTINE
                   10115:        ERR  140,LNE FIRST ARGUMENT IS NOT STRING
                   10116:        ERR  141,LNE SECOND ARGUMENT IS NOT STRING
                   10117:        PPM  EXNUL            RETURN NULL IF LLT
                   10118:        PPM  EXFAL            FAIL IF LEQ
                   10119:        PPM  EXNUL            RETURN NULL IF LGT
                   10120: .IF    .CNLD
                   10121: .ELSE
                   10122:        EJC
                   10123: *
                   10124: *      LOAD
                   10125: *
                   10126: S$LOD  ENT                   ENTRY POINT
                   10127:        JSR  GTSTG            LOAD LIBRARY NAME
                   10128:        ERR  142,LOAD SECOND ARGUMENT IS NOT STRING
                   10129:        MOV  XR,XL            SAVE LIBRARY NAME
                   10130:        JSR  XSCNI            PREPARE TO SCAN FIRST ARGUMENT
                   10131:        ERR  143,LOAD FIRST ARGUMENT IS NOT STRING
                   10132:        ERR  144,LOAD FIRST ARGUMENT IS NULL
                   10133:        MOV  XL,-(XS)         STACK LIBRARY NAME
                   10134:        MOV  =CH$PP,WC        SET DELIMITER ONE = LEFT PAREN
                   10135:        MOV  WC,XL            SET DELIMITER TWO = LEFT PAREN
                   10136:        JSR  XSCAN            SCAN FUNCTION NAME
                   10137:        MOV  XR,-(XS)         SAVE PTR TO FUNCTION NAME
                   10138:        BNZ  WA,SLOD1         JUMP IF LEFT PAREN FOUND
                   10139:        ERB  145,LOAD FIRST ARGUMENT IS MISSING A LEFT PAREN
                   10140: *
                   10141: *      HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
                   10142: *
                   10143: SLOD1  JSR  GTNVR            LOCATE VRBLK
                   10144:        ERR  146,LOAD FIRST ARGUMENT HAS NULL FUNCTION NAME
                   10145:        MOV  XR,LODFN         SAVE VRBLK POINTER
                   10146:        ZER  LODNA            ZERO COUNT OF ARGUMENTS
                   10147: *
                   10148: *      LOOP TO SCAN ARGUMENT DATATYPE NAMES
                   10149: *
                   10150: SLOD2  MOV  =CH$RP,WC        DELIMITER ONE IS RIGHT PAREN
                   10151:        MOV  =CH$CM,XL        DELIMITER TWO IS COMMA
                   10152:        JSR  XSCAN            SCAN NEXT ARGUMENT NAME
                   10153:        ICV  LODNA            BUMP ARGUMENT COUNT
                   10154:        BNZ  WA,SLOD3         JUMP IF OK DELIMITER WAS FOUND
                   10155:        ERB  147,BAD BLANK OR MISSING RIGHT PAREN IN LOAD ARG
                   10156:        EJC
                   10157: *
                   10158: *      LOAD (CONTINUED)
                   10159: *
                   10160: *      COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
                   10161: *      CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
                   10162: *      RESULT DATATYPE (WITH WA SET TO ZERO).
                   10163: *
                   10164: SLOD3  MOV  XR,-(XS)         STACK DATATYPE NAME POINTER
                   10165:        MOV  =NUM01,WB        SET STRING CODE IN CASE (1)
                   10166:        MOV  =SCSTR,XL        POINT TO /STRING/
                   10167:        JSR  IDENT            CHECK FOR MATCH
                   10168:        PPM  SLOD4            JUMP IF MATCH
                   10169:        MOV  (XS),XR          ELSE RELOAD NAME
                   10170:        ADD  WB,WB            SET CODE FOR INTEGER (2)
                   10171:        MOV  =SCINT,XL        POINT TO /INTEGER/
                   10172:        JSR  IDENT            CHECK FOR MATCH
                   10173:        PPM  SLOD4            JUMP IF MATCH
                   10174:        ICV  WB               ELSE SET CODE FOR REAL (3)
                   10175: .IF    .CNRA
                   10176: .ELSE
                   10177:        MOV  (XS),XR          RELOAD STRING POINTER
                   10178:        MOV  =SCREA,XL        POINT TO /REAL/
                   10179:        JSR  IDENT            CHECK FOR MATCH
                   10180:        PPM  SLOD4            JUMP IF MATCH
                   10181: .FI
                   10182:        ICV  WB               SET CODE FOR BUFFER (4)
                   10183: .IF    .CNBF
                   10184: .ELSE
                   10185:        MOV  (XS),XR          RELOAD STRING POINTER
                   10186:        MOV  =SCBUF,XL        POINT TO /BUFFER/
                   10187:        JSR  IDENT            CHECK FOR MATCH
                   10188:        PPM  SLOD4            JUMP IF MATCH
                   10189: .FI
                   10190:        ZER  WB               ELSE GET CODE FOR NO CONVERT
                   10191: *
                   10192: *      MERGE HERE WITH PROPER DATATYPE CODE IN WB
                   10193: *
                   10194: SLOD4  MOV  WB,(XS)          STORE CODE ON STACK
                   10195:        BEQ  WA,=NUM02,SLOD2  LOOP BACK IF ARG STOPPED BY COMMA
                   10196:        BZE  WA,SLOD5         JUMP IF THAT WAS THE RESULT TYPE
                   10197: *
                   10198: *      HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
                   10199: *
                   10200:        MOV  MXLEN,WC         SET DUMMY (IMPOSSIBLE) DELIMITER 1
                   10201:        MOV  WC,XL            AND DELIMITER TWO
                   10202:        JSR  XSCAN            SCAN RESULT NAME
                   10203:        ZER  WA               SET CODE FOR PROCESSING RESULT
                   10204:        BRN  SLOD3            JUMP BACK TO PROCESS RESULT NAME
                   10205:        EJC
                   10206: *
                   10207: *      LOAD (CONTINUED)
                   10208: *
                   10209: *      HERE AFTER PROCESSING ALL ARGS AND RESULT
                   10210: *
                   10211: SLOD5  MOV  LODNA,WA         GET NUMBER OF ARGUMENTS
                   10212:        MOV  WA,WC            COPY FOR LATER
                   10213:        WTB  WA               CONVERT LENGTH TO BAUS
                   10214:        ADD  *EFSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   10215:        JSR  ALLOC            ALLOCATE EFBLK
                   10216:        MOV  =B$EFC,(XR)      SET TYPE WORD
                   10217:        MOV  WC,FARGS(XR)     SET NUMBER OF ARGUMENTS
                   10218:        ZER  EFUSE(XR)        SET USE COUNT (DFFNC WILL SET TO 1)
                   10219:        ZER  EFCOD(XR)        ZERO CODE POINTER FOR NOW
                   10220:        MOV  (XS)+,EFRSL(XR)  STORE RESULT TYPE CODE
                   10221:        MOV  LODFN,EFVAR(XR)  STORE FUNCTION VRBLK POINTER
                   10222:        MOV  WA,EFLEN(XR)     STORE EFBLK LENGTH
                   10223:        MOV  XR,WB            SAVE EFBLK POINTER
                   10224:        ADD  WA,XR            POINT PAST END OF EFBLK
                   10225:        LCT  WC,WC            SET NUMBER OF ARGUMENTS FOR LOOP
                   10226: *
                   10227: *      LOOP TO SET ARGUMENT TYPE CODES FROM STACK
                   10228: *
                   10229: SLOD6  MOV  (XS)+,-(XR)      STORE ONE TYPE CODE FROM STACK
                   10230:        BCT  WC,SLOD6         LOOP TILL ALL STORED
                   10231: *
                   10232: *      NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
                   10233: *
                   10234:        MOV  (XS)+,XR         LOAD FUNCTION STRING NAME
                   10235:        MOV  (XS),XL          LOAD LIBRARY NAME
                   10236:        MOV  WB,(XS)          STORE EFBLK POINTER
                   10237:        JSR  SYSLD            CALL FUNCTION TO LOAD EXTERNAL FUNC
                   10238:        PPM  EXFAL            FAIL RETURN
                   10239:        PPM  EROSI            ERROR RETURN
                   10240:        MOV  (XS)+,XL         RECALL EFBLK POINTER
                   10241:        MOV  XR,EFCOD(XL)     STORE CODE POINTER
                   10242:        MOV  LODFN,XR         POINT TO VRBLK FOR FUNCTION
                   10243:        JSR  DFFNC            PERFORM FUNCTION DEFINITION
                   10244:        BRN  EXNUL            RETURN NULL RESULT
                   10245: .FI
                   10246:        EJC
                   10247: *
                   10248: *      LOCAL
                   10249: *
                   10250: S$LOC  ENT                   ENTRY POINT
                   10251:        JSR  GTSMI            GET SECOND ARGUMENT (LOCAL NUMBER)
                   10252:        ERR  256,LOCAL SECOND ARGUMENT IS NOT INTEGER
                   10253:        PPM  EXFAL            FAIL IF OUT OF RANGE
                   10254:        MOV  XR,WB            SAVE LOCAL NUMBER
                   10255:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   10256:        JSR  GTNVR            POINT TO VRBLK
                   10257:        PPM  SLOC1            JUMP IF NOT VARIABLE NAME
                   10258:        MOV  VRFNC(XR),XR     ELSE LOAD FUNCTION POINTER
                   10259:        BNE  (XR),=B$PFC,SLOC1 JUMP IF NOT PROGRAM DEFINED
                   10260: *
                   10261: *      HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
                   10262: *
                   10263:        BZE  WB,EXFAL         FAIL IF SECOND ARG IS ZERO
                   10264:        BGT  WB,PFNLO(XR),EXFAL OR TOO LARGE
                   10265:        ADD  FARGS(XR),WB     ELSE ADJUST OFFSET TO INCLUDE ARGS
                   10266:        WTB  WB               CONVERT TO BYTES
                   10267:        ADD  WB,XR            POINT TO LOCAL POINTER
                   10268:        MOV  PFAGB(XR),XR     LOAD VRBLK POINTER
                   10269:        BRN  EXVNM            EXIT BUILDING NMBLK
                   10270: *
                   10271: *      HERE IF FIRST ARGUMENT IS NO GOOD
                   10272: *
                   10273: SLOC1  ERB  257,LOCAL FIRST ARG IS NOT A PROGRAM FUNCTION NAME
                   10274:        EJC
                   10275: *
                   10276: *      LPAD
                   10277: *
                   10278: S$LPD  ENT                   ENTRY POINT
                   10279:        JSR  GTSTG            GET PAD CHARACTER
                   10280:        ERR  148,LPAD THIRD ARGUMENT NOT A STRING
                   10281:        PLC  XR               POINT TO CHARACTER (NULL IS BLANK)
                   10282:        LCH  WB,(XR)          LOAD PAD CHARACTER
                   10283:        JSR  GTSMI            GET PAD LENGTH
                   10284:        ERR  149,LPAD SECOND ARGUMENT IS NOT INTEGER
                   10285:        PPM  SLPD3            SKIP IF NEGATIVE OR LARGE
                   10286: *
                   10287: *      MERGE TO CHECK FIRST ARG
                   10288: *
                   10289: SLPD1  JSR  GTSTG            GET FIRST ARGUMENT (STRING TO PAD)
                   10290:        ERR  150,LPAD FIRST ARGUMENT IS NOT STRING
                   10291:        BGE  WA,WC,EXIXR      RETURN 1ST ARG IF TOO LONG TO PAD
                   10292:        MOV  XR,XL            ELSE MOVE PTR TO STRING TO PAD
                   10293: *
                   10294: *      NOW WE ARE READY FOR THE PAD
                   10295: *
                   10296: *      (XL)                  POINTER TO STRING TO PAD
                   10297: *      (WB)                  PAD CHARACTER
                   10298: *      (WC)                  LENGTH TO PAD STRING TO
                   10299: *
                   10300:        MOV  WC,WA            COPY LENGTH
                   10301:        JSR  ALOCS            ALLOCATE SCBLK FOR NEW STRING
                   10302:        MOV  XR,-(XS)         SAVE AS RESULT
                   10303:        MOV  SCLEN(XL),WA     LOAD LENGTH OF ARGUMENT
                   10304:        SUB  WA,WC            CALCULATE NUMBER OF PAD CHARACTERS
                   10305:        PSC  XR               POINT TO CHARS IN RESULT STRING
                   10306:        LCT  WC,WC            SET COUNTER FOR PAD LOOP
                   10307: *
                   10308: *      LOOP TO PERFORM PAD
                   10309: *
                   10310: SLPD2  SCH  WB,(XR)+         STORE PAD CHARACTER, BUMP PTR
                   10311:        BCT  WC,SLPD2         LOOP TILL ALL PAD CHARS STORED
                   10312:        CSC  XR               COMPLETE STORE CHARACTERS
                   10313: *
                   10314: *      NOW COPY STRING
                   10315: *
                   10316:        BZE  WA,EXITS         EXIT IF NULL STRING
                   10317:        PLC  XL               ELSE POINT TO CHARS IN ARGUMENT
                   10318:        MVC                   MOVE CHARACTERS TO RESULT STRING
                   10319:        BRN  EXITS            JUMP FOR NEXT CODE WORD
                   10320: *
                   10321: *      HERE IF 2ND ARG IS NEGATIVE OR LARGE
                   10322: *
                   10323: SLPD3  ZER  WC               ZERO PAD COUNT
                   10324:        BRN  SLPD1            MERGE
                   10325:        EJC
                   10326: *
                   10327: *      LT
                   10328: *
                   10329: S$LTF  ENT                   ENTRY POINT
                   10330:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   10331:        ERR  151,LT FIRST ARGUMENT IS NOT NUMERIC
                   10332:        ERR  152,LT SECOND ARGUMENT IS NOT NUMERIC
                   10333:        PPM  EXNUL            RETURN NULL IF LT
                   10334:        PPM  EXFAL            FAIL IF EQ
                   10335:        PPM  EXFAL            FAIL IF GT
                   10336:        EJC
                   10337: *
                   10338: *      NE
                   10339: *
                   10340: S$NEF  ENT                   ENTRY POINT
                   10341:        JSR  ACOMP            CALL ARITHMETIC COMPARISON ROUTINE
                   10342:        ERR  153,NE FIRST ARGUMENT IS NOT NUMERIC
                   10343:        ERR  154,NE SECOND ARGUMENT IS NOT NUMERIC
                   10344:        PPM  EXNUL            RETURN NULL IF LT
                   10345:        PPM  EXFAL            FAIL IF EQ
                   10346:        PPM  EXNUL            RETURN NULL IF GT
                   10347:        EJC
                   10348: *
                   10349: *      NOTANY
                   10350: *
                   10351: S$NAY  ENT                   ENTRY POINT
                   10352:        MOV  =P$NAS,WB        SET PCODE FOR SINGLE CHAR ARG
                   10353:        MOV  =P$NAY,XL        PCODE FOR MULTI-CHAR ARG
                   10354:        MOV  =P$NAD,WC        SET PCODE FOR EXPR ARG
                   10355:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   10356:        ERR  155,NOTANY ARGUMENT IS NOT STRING OR EXPRESSION
                   10357:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   10358:        EJC
                   10359: *
                   10360: *      OPSYN
                   10361: *
                   10362: S$OPS  ENT                   ENTRY POINT
                   10363:        JSR  GTSMI            LOAD THIRD ARGUMENT
                   10364:        ERR  156,OPSYN THIRD ARGUMENT IS NOT INTEGER
                   10365:        ERR  157,OPSYN THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
                   10366:        MOV  WC,WB            IF OK, SAVE THIRD ARGUMNET
                   10367:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   10368:        JSR  GTNVR            LOCATE VARIABLE BLOCK
                   10369:        ERR  158,OPSYN SECOND ARG IS NOT NATURAL VARIABLE NAME
                   10370:        MOV  VRFNC(XR),XL     IF OK, LOAD FUNCTION BLOCK POINTER
                   10371:        BNZ  WB,SOPS2         JUMP IF OPERATOR OPSYN CASE
                   10372: *
                   10373: *      HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
                   10374: *
                   10375:        MOV  (XS)+,XR         LOAD FIRST ARGUMENT
                   10376:        JSR  GTNVR            GET VRBLK POINTER
                   10377:        ERR  159,OPSYN FIRST ARG IS NOT NATURAL VARIABLE NAME
                   10378: *
                   10379: *      MERGE HERE TO PERFORM FUNCTION DEFINITION
                   10380: *
                   10381: SOPS1  JSR  DFFNC            CALL FUNCTION DEFINER
                   10382:        BRN  EXNUL            EXIT WITH NULL RESULT
                   10383: *
                   10384: *      HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
                   10385: *
                   10386: SOPS2  JSR  GTSTG            GET OPERATOR NAME
                   10387:        PPM  SOPS5            JUMP IF NOT STRING
                   10388:        BNE  WA,=NUM01,SOPS5  ERROR IF NOT ONE CHAR LONG
                   10389:        PLC  XR               ELSE POINT TO CHARACTER
                   10390:        LCH  WC,(XR)          LOAD CHARACTER NAME
                   10391:        EJC
                   10392: *
                   10393: *      OPSYN (CONTINUED)
                   10394: *
                   10395: *      NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
                   10396: *      NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
                   10397: *      BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
                   10398: *
                   10399:        MOV  =R$UUB,WA        POINT TO UNOP POINTERS IN CASE
                   10400:        MOV  =OPNSU,XR        POINT TO NAMES OF UNARY OPERATORS
                   10401:        ADD  =OPBUN,WB        ADD NO. OF UNDEFINED BINARY OPS
                   10402:        BEQ  WB,=OPUUN,SOPS3  JUMP IF UNOP (THIRD ARG WAS 1)
                   10403:        MOV  =R$UBA,WA        ELSE POINT TO BINARY OPERATOR PTRS
                   10404:        MOV  =OPSNB,XR        POINT TO NAMES OF BINARY OPERATORS
                   10405:        MOV  =OPBUN,WB        SET NUMBER OF UNDEFINED BINOPS
                   10406: *
                   10407: *      MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
                   10408: *
                   10409: SOPS3  LCT  WB,WB            SET COUNTER TO CONTROL LOOP
                   10410: *
                   10411: *      LOOP TO SEARCH FOR NAME MATCH
                   10412: *
                   10413: SOPS4  BEQ  WC,(XR),SOPS6    JUMP IF NAMES MATCH
                   10414:        ICA  WA               ELSE PUSH POINTER TO FUNCTION PTR
                   10415:        ICA  XR               BUMP POINTER
                   10416:        BCT  WB,SOPS4         LOOP BACK TILL ALL CHECKED
                   10417: *
                   10418: *      HERE IF BAD OPERATOR NAME
                   10419: *
                   10420: SOPS5  ERB  160,OPSYN FIRST ARG IS NOT CORRECT OPERATOR NAME
                   10421: *
                   10422: *      COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
                   10423: *
                   10424: SOPS6  MOV  WA,XR            COPY POINTER TO FUNCTION BLOCK PTR
                   10425:        SUB  *VRFNC,XR        MAKE IT LOOK LIKE DUMMY VRBLK
                   10426:        BRN  SOPS1            MERGE BACK TO DEFINE OPERATOR
                   10427:        EJC
                   10428: *
                   10429: *      OUTPUT
                   10430: *
                   10431: S$OUP  ENT                   ENTRY POINT
                   10432:        MOV  =NUM02,WB        OUTPUT FLAG
                   10433:        JSR  IOPUT            CALL INPUT/OUTPUT ASSOC. ROUTINE
                   10434:        ERR  161,OUTPUT THIRD ARGUMENT (FILEPROPS) IS NOT A STRING
                   10435:        ERR  162,INAPPROPRIATE SECOND ARGUMENT (FILETAG) FOR OUTPUT
                   10436:        ERR  163,INAPPROPRIATE FIRST ARGUMENT FOR OUTPUT
                   10437:        PPM  EXFAL            FAIL RETURN
                   10438:        BRN  EXNUL            RETURN NULL STRING
                   10439:        EJC
                   10440: *
                   10441: *      POS
                   10442: *
                   10443: S$POS  ENT                   ENTRY POINT
                   10444:        MOV  =P$POS,WB        SET PCODE FOR INTEGER ARG CASE
                   10445:        MOV  =P$PSD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   10446:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   10447:        ERR  164,POS ARGUMENT IS NOT INTEGER OR EXPRESSION
                   10448:        ERR  165,POS ARGUMENT IS NEGATIVE OR TOO LARGE
                   10449:        BRN  EXIXR            RETURN PATTERN NODE
                   10450:        EJC
                   10451: *
                   10452: *      PROTOTYPE
                   10453: *
                   10454: S$PRO  ENT                   ENTRY POINT
                   10455:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10456:        MOV  TBLEN(XR),WB     LENGTH IF TABLE, VECTOR (=VCLEN)
                   10457:        BTW  WB               CONVERT TO WORDS
                   10458:        MOV  (XR),WA          LOAD TYPE WORD OF ARGUMENT BLOCK
                   10459:        BEQ  WA,=B$ART,SPRO4  JUMP IF ARRAY
                   10460:        BEQ  WA,=B$TBT,SPRO1  JUMP IF TABLE
                   10461:        BEQ  WA,=B$VCT,SPRO3  JUMP IF VECTOR
                   10462: .IF    .CNBF
                   10463: .ELSE
                   10464:        BEQ  WA,=B$BCT,SPR05  JUMP IF BUFFER
                   10465: .FI
                   10466:        ERB  166,PROTOTYPE ARGUMENT IS NOT TABLE OR ARRAY
                   10467: *
                   10468: *      HERE FOR TABLE
                   10469: *
                   10470: SPRO1  SUB  =TBSI$,WB        SUBTRACT STANDARD FIELDS
                   10471: *
                   10472: *      MERGE FOR VECTOR
                   10473: *
                   10474: SPRO2  MTI  WB               CONVERT TO INTEGER
                   10475:        BRN  EXINT            EXIT WITH INTEGER RESULT
                   10476: *
                   10477: *      HERE FOR VECTOR
                   10478: *
                   10479: SPRO3  SUB  =VCSI$,WB        SUBTRACT STANDARD FIELDS
                   10480:        BRN  SPRO2            MERGE
                   10481: *
                   10482: *      HERE FOR ARRAY
                   10483: *
                   10484: SPRO4  ADD  AROFS(XR),XR     POINT TO PROTOTYPE FIELD
                   10485:        MOV  (XR),XR          LOAD PROTOTYPE
                   10486:        BRN  EXIXR            RETURN PROTOTYPE AS RESULT
                   10487: .IF    .CNBF
                   10488: .ELSE
                   10489: *
                   10490: *      HERE FOR BUFFER
                   10491: *
                   10492: SPR05  MOV  BCBUF(XR),XR     POINT TO BFBLK
                   10493:        MTI  BFALC(XR)        LOAD ALLOCATED LENGTH
                   10494:        BRN  EXINT            EXIT WITH INTEGER ALLOCATION
                   10495: .FI
                   10496:        EJC
                   10497: *
                   10498: *      REMDR
                   10499: *
                   10500: S$RMD  ENT                   ENTRY POINT
                   10501:        ZER  WB               SET POSITIVE FLAG
                   10502:        MOV  (XS),XR          LOAD SECOND ARGUMENT
                   10503:        JSR  GTINT            CONVERT TO INTEGER
                   10504:        ERR  167,REMDR SECOND ARGUMENT IS NOT INTEGER
                   10505:        JSR  ARITH            CONVERT ARGS
                   10506:        PPM  SRM01            FIRST ARG NOT INTEGER
                   10507:        PPM                   SECOND ARG CHECKED ABOVE
                   10508: .IF    .CNRA
                   10509: .ELSE
                   10510:        PPM  SRM01            FIRST ARG REAL
                   10511: .FI
                   10512:        LDI  ICVAL(XR)        LOAD LEFT ARGUMENT VALUE
                   10513:        RMI  ICVAL(XL)        GET REMAINDER
                   10514:        INO  EXINT            JUMP IF NO OVERFLOW
                   10515:        ERB  168,REMDR CAUSED INTEGER OVERFLOW
                   10516: *
                   10517: *      FAIL FIRST ARGUMENT
                   10518: *
                   10519: SRM01  ERB  169,REMDR FIRST ARGUMENT IS NOT INTEGER
                   10520:        EJC
                   10521: *
                   10522: *      REPLACE
                   10523: *
                   10524: *      THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
                   10525: *      CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
                   10526: *      THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
                   10527: *      THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
                   10528: *
                   10529: S$RPL  ENT                   ENTRY POINT
                   10530:        JSR  GTSTG            LOAD THIRD ARGUMENT AS STRING
                   10531:        ERR  170,REPLACE THIRD ARGUMENT IS NOT STRING
                   10532:        MOV  XR,XL            SAVE THIRD ARG PTR
                   10533:        JSR  GTSTG            GET SECOND ARGUMENT
                   10534:        ERR  171,REPLACE SECOND ARGUMENT IS NOT STRING
                   10535: *
                   10536: *      CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
                   10537: *
                   10538:        BNE  XR,R$RA2,SRPL1   JUMP IF 2ND ARGUMENT DIFFERENT
                   10539:        BEQ  XL,R$RA3,SRPL4   JUMP IF ARGS SAME AS LAST TIME
                   10540: *
                   10541: *      HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
                   10542: *
                   10543: SRPL1  MOV  SCLEN(XL),WB     LOAD 3RD ARGUMENT LENGTH
                   10544:        BNE  WA,WB,SRPL5      JUMP IF ARGUMENTS NOT SAME LENGTH
                   10545:        BZE  WB,SRPL5         JUMP IF NULL 2ND ARGUMENT
                   10546:        MOV  XL,R$RA3         SAVE THIRD ARG FOR NEXT TIME IN
                   10547:        MOV  XR,R$RA2         SAVE SECOND ARG FOR NEXT TIME IN
                   10548:        MOV  KVALP,XL         POINT TO ALPHABET STRING
                   10549:        MOV  SCLEN(XL),WA     LOAD ALPHABET SCBLK LENGTH
                   10550:        MOV  R$RPT,XR         POINT TO CURRENT TABLE (IF ANY)
                   10551:        BNZ  XR,SRPL2         JUMP IF WE ALREADY HAVE A TABLE
                   10552: *
                   10553: *      HERE WE ALLOCATE A NEW TABLE
                   10554: *
                   10555:        JSR  ALOCS            ALLOCATE NEW TABLE
                   10556:        MOV  WC,WA            KEEP SCBLK LENGTH
                   10557:        MOV  XR,R$RPT         SAVE TABLE POINTER FOR NEXT TIME
                   10558: *
                   10559: *      MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
                   10560: *
                   10561: SRPL2  CTB  WA,SCSI$         COMPUTE LENGTH OF SCBLK
                   10562:        MVW                   COPY TO GET INITIAL TABLE VALUES
                   10563:        EJC
                   10564: *
                   10565: *      REPLACE (CONTINUED)
                   10566: *
                   10567: *      NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
                   10568: *      WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
                   10569: *      HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
                   10570: *
                   10571:        MOV  R$RA2,XL         POINT TO SECOND ARGUMENT
                   10572:        LCT  WB,WB            NUMBER OF CHARS TO PLUG
                   10573:        ZER  WC               ZERO CHAR OFFSET
                   10574:        MOV  R$RA3,XR         POINT TO 3RD ARG
                   10575:        PLC  XR               GET CHAR PTR FOR 3RD ARG
                   10576: *
                   10577: *      LOOP TO PLUG CHARS
                   10578: *
                   10579: SRPL3  MOV  R$RA2,XL         POINT TO 2ND ARG
                   10580:        PLC  XL,WC            POINT TO NEXT CHAR
                   10581:        ICV  WC               INCREMENT OFFSET
                   10582:        LCH  WA,(XL)          GET NEXT CHAR
                   10583:        MOV  R$RPT,XL         POINT TO TRANSLATE TABLE
                   10584:        PSC  XL,WA            CONVERT CHAR TO OFFSET INTO TABLE
                   10585:        LCH  WA,(XR)+         GET TRANSLATED CHAR
                   10586:        SCH  WA,(XL)          STORE IN TABLE
                   10587:        CSC  XL               COMPLETE STORE CHARACTERS
                   10588:        BCT  WB,SRPL3         LOOP TILL DONE
                   10589:        EJC
                   10590: *
                   10591: *      REPLACE (CONTINUED)
                   10592: *
                   10593: *      HERE TO PERFORM TRANSLATE
                   10594: *
                   10595: SRPL4  JSR  GTSTG            GET FIRST ARGUMENT
                   10596:        ERR  172,REPLACE FIRST ARGUMENT IS NOT STRING
                   10597:        BZE  WA,EXNUL         RETURN NULL IF NULL ARGUMENT
                   10598:        MOV  XR,XL            COPY POINTER
                   10599:        MOV  WA,WC            SAVE LENGTH
                   10600:        CTB  WA,SCHAR         GET SCBLK LENGTH
                   10601:        JSR  ALLOC            ALLOCATE SPACE FOR COPY
                   10602:        MOV  XR,WB            SAVE ADDRESS OF COPY
                   10603:        MVW                   MOVE SCBLK CONTENTS TO COPY
                   10604:        MOV  R$RPT,XR         POINT TO REPLACE TABLE
                   10605:        PLC  XR               POINT TO CHARS OF TABLE
                   10606:        MOV  WB,XL            POINT TO STRING TO TRANSLATE
                   10607:        PLC  XL               POINT TO CHARS OF STRING
                   10608:        MOV  WC,WA            SET NUMBER OF CHARS TO TRANSLATE
                   10609:        TRC                   PERFORM TRANSLATION
                   10610:        MOV  WB,-(XS)         STACK NEW STRING AS RESULT
                   10611:        BRN  EXITS            RETURN WITH RESULT ON STACK
                   10612: *
                   10613: *      ERROR POINT
                   10614: *
                   10615: SRPL5  ERB  173,NULL OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
                   10616:        EJC
                   10617: *
                   10618: *      REVERSE
                   10619: *
                   10620: S$RVS  ENT                   ENTRY POINT
                   10621:        JSR  GTSTG            LOAD STRING ARGUMENT
                   10622:        ERR  174,REVERSE ARGUMENT IS NOT STRING
                   10623:        BZE  WA,EXIXR         RETURN ARGUMENT IF NULL
                   10624:        MOV  XR,XL            ELSE SAVE POINTER TO STRING ARG
                   10625:        JSR  ALOCS            ALLOCATE SPACE FOR NEW SCBLK
                   10626:        MOV  XR,-(XS)         STORE SCBLK PTR ON STACK AS RESULT
                   10627:        PSC  XR               PREPARE TO STORE IN NEW SCBLK
                   10628:        PLC  XL,WC            POINT PAST LAST CHAR IN ARGUMENT
                   10629:        LCT  WC,WC            SET LOOP COUNTER
                   10630: *
                   10631: *      LOOP TO MOVE CHARS IN REVERSE ORDER
                   10632: *
                   10633: SRVS1  LCH  WB,-(XL)         LOAD NEXT CHAR FROM ARGUMENT
                   10634:        SCH  WB,(XR)+         STORE IN RESULT
                   10635:        BCT  WC,SRVS1         LOOP TILL ALL MOVED
                   10636:        CSC  XR               COMPLETE STORE CHARACTERS
                   10637:        BRN  EXITS            AND THEN JUMP FOR NEXT CODE WORD
                   10638:        EJC
                   10639: *
                   10640: *      RPAD
                   10641: *
                   10642: S$RPD  ENT                   ENTRY POINT
                   10643:        JSR  GTSTG            GET PAD CHARACTER
                   10644:        ERR  175,RPAD THIRD ARGUMENT IS NOT STRING
                   10645:        PLC  XR               POINT TO CHARACTER (NULL IS BLANK)
                   10646:        LCH  WB,(XR)          LOAD PAD CHARACTER
                   10647:        JSR  GTSMI            GET PAD LENGTH
                   10648:        ERR  176,RPAD SECOND ARGUMENT IS NOT INTEGER
                   10649:        PPM  SRPD3            SKIP IF NEGATIVE OR LARGE
                   10650: *
                   10651: *      MERGE TO CHECK FIRST ARG.
                   10652: *
                   10653: SRPD1  JSR  GTSTG            GET FIRST ARGUMENT (STRING TO PAD)
                   10654:        ERR  177,RPAD FIRST ARGUMENT IS NOT STRING
                   10655:        BGE  WA,WC,EXIXR      RETURN 1ST ARG IF TOO LONG TO PAD
                   10656:        MOV  XR,XL            ELSE MOVE PTR TO STRING TO PAD
                   10657: *
                   10658: *      NOW WE ARE READY FOR THE PAD
                   10659: *
                   10660: *      (XL)                  POINTER TO STRING TO PAD
                   10661: *      (WB)                  PAD CHARACTER
                   10662: *      (WC)                  LENGTH TO PAD STRING TO
                   10663: *
                   10664:        MOV  WC,WA            COPY LENGTH
                   10665:        JSR  ALOCS            ALLOCATE SCBLK FOR NEW STRING
                   10666:        MOV  XR,-(XS)         SAVE AS RESULT
                   10667:        MOV  SCLEN(XL),WA     LOAD LENGTH OF ARGUMENT
                   10668:        SUB  WA,WC            CALCULATE NUMBER OF PAD CHARACTERS
                   10669:        PSC  XR               POINT TO CHARS IN RESULT STRING
                   10670:        LCT  WC,WC            SET COUNTER FOR PAD LOOP
                   10671: *
                   10672: *      COPY ARGUMENT STRING
                   10673: *
                   10674:        BZE  WA,SRPD2         JUMP IF ARGUMENT IS NULL
                   10675:        PLC  XL               ELSE POINT TO ARGUMENT CHARS
                   10676:        MVC                   MOVE CHARACTERS TO RESULT STRING
                   10677: *
                   10678: *      LOOP TO SUPPLY PAD CHARACTERS
                   10679: *
                   10680: SRPD2  SCH  WB,(XR)+         STORE PAD CHARACTER, BUMP PTR
                   10681:        BCT  WC,SRPD2         LOOP TILL ALL PAD CHARS STORED
                   10682:        CSC  XR               COMPLETE CHARACTER STORING
                   10683:        BRN  EXITS            AND EXIT FOR NEXT WORD
                   10684: *
                   10685: *      HERE IF 2ND ARG IS NEGATIVE OR LARGE
                   10686: *
                   10687: SRPD3  ZER  WC               ZERO PAD COUNT
                   10688:        BRN  SRPD1            MERGE
                   10689:        EJC
                   10690: *
                   10691: *      RTAB
                   10692: *
                   10693: S$RTB  ENT                   ENTRY POINT
                   10694:        MOV  =P$RTB,WB        SET PCODE FOR INTEGER ARG CASE
                   10695:        MOV  =P$RTD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   10696:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   10697:        ERR  178,RTAB ARGUMENT IS NOT INTEGER OR EXPRESSION
                   10698:        ERR  179,RTAB ARGUMENT IS NEGATIVE OR TOO LARGE
                   10699:        BRN  EXIXR            RETURN PATTERN NODE
                   10700:        EJC
                   10701: .IF    .CUST
                   10702: *
                   10703: *      SET
                   10704: *
                   10705: S$SET  ENT                   ENTRY POINT
                   10706:        MOV  (XS)+,R$IOL      SAVE THIRD ARG
                   10707:        MOV  (XS)+,R$IO1      SAVE SECOND ARG
                   10708:        JSR  IOFTG            CALL IOTAG ROUTINE
                   10709:        ERR  180,SET FIRST ARGUMENT IS NOT A SUITABLE NAME
                   10710:        BZE  WA,EXFAL         FAIL IF NO IOTAG
                   10711:        MOV  R$IO1,WB         LOAD SECOND ARG
                   10712:        MOV  R$IOL,WC         LOAD THIRD ARG
                   10713:        JSR  SYSST            CALL SYSTEM SET ROUTINE
                   10714:        PPM  EXFAL            FAILURE RETURN
                   10715:        PPM  EROSI            ERROR RETURN
                   10716:        BRN  EXNUL            OTHERWISE RETURN NULL
                   10717:        EJC
                   10718: .FI
                   10719: *
                   10720: *      RPOS
                   10721: *
                   10722: S$RPS  ENT                   ENTRY POINT
                   10723:        MOV  =P$RPS,WB        SET PCODE FOR INTEGER ARG CASE
                   10724:        MOV  =P$RPD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   10725:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   10726:        ERR  181,RPOS ARGUMENT IS NOT INTEGER OR EXPRESSION
                   10727:        ERR  182,RPOS ARGUMENT IS NEGATIVE OR TOO LARGE
                   10728:        BRN  EXIXR            RETURN PATTERN NODE
                   10729: .IF    .CNSR
                   10730: .ELSE
                   10731:        EJC
                   10732: *
                   10733: *      RSORT
                   10734: *
                   10735: S$RSR  ENT                   ENTRY POINT
                   10736:        MNZ  WA               MARK AS RSORT
                   10737:        JSR  SORTA            CALL SORT ROUTINE
                   10738:        PPM  EXFAL            FAIL EMPTY TABLE
                   10739:        BRN  EXSID            RETURN, SETTING IDVAL
                   10740: .FI
                   10741:        EJC
                   10742: *
                   10743: *      SETEXIT
                   10744: *
                   10745: S$STX  ENT                   ENTRY POINT
                   10746:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10747:        MOV  STXVR,WA         LOAD OLD VRBLK POINTER
                   10748:        ZER  XL               LOAD ZERO IN CASE NULL ARG
                   10749:        BEQ  XR,=NULLS,SSTX1  JUMP IF NULL ARGUMENT (RESET CALL)
                   10750:        JSR  GTNVR            ELSE GET SPECIFIED VRBLK
                   10751:        PPM  SSTX2            JUMP IF NOT NATURAL VARIABLE
                   10752:        MOV  VRLBL(XR),XL     ELSE LOAD LABEL
                   10753:        BEQ  XL,=STNDL,SSTX2  JUMP IF LABEL IS NOT DEFINED
                   10754:        BNE  (XL),=B$TRT,SSTX1 JUMP IF NOT TRAPPED
                   10755:        MOV  TRLBL(XL),XL     ELSE LOAD PTR TO REAL LABEL CODE
                   10756: *
                   10757: *      HERE TO SET/RESET SETEXIT TRAP
                   10758: *
                   10759: SSTX1  MOV  XR,STXVR         STORE NEW VRBLK POINTER (OR NULL)
                   10760:        MOV  XL,R$SXC         STORE NEW CODE PTR (OR ZERO)
                   10761:        BEQ  WA,=NULLS,EXNUL  RETURN NULL IF NULL RESULT
                   10762:        MOV  WA,XR            ELSE COPY VRBLK POINTER
                   10763:        BRN  EXVNM            AND RETURN BUILDING NMBLK
                   10764: *
                   10765: *      HERE IF BAD ARGUMENT
                   10766: *
                   10767: SSTX2  ERB  183,SETEXIT ARGUMENT IS NOT LABEL NAME OR NULL
                   10768: .IF    .CNSR
                   10769: .ELSE
                   10770:        EJC
                   10771: *
                   10772: *      SORT
                   10773: *
                   10774: S$SRT  ENT                   ENTRY POINT
                   10775:        ZER  WA               MARK AS SORT
                   10776:        JSR  SORTA            CALL SORT ROUTINE
                   10777:        PPM  EXFAL            FAIL EMPTY TABLE
                   10778:        BRN  EXSID            RETURN, SETTING IDVAL
                   10779: .FI
                   10780:        EJC
                   10781: *
                   10782: *      SPAN
                   10783: *
                   10784: S$SPN  ENT                   ENTRY POINT
                   10785:        MOV  =P$SPS,WB        SET PCODE FOR SINGLE CHAR ARG
                   10786:        MOV  =P$SPN,XL        SET PCODE FOR MULTI-CHAR ARG
                   10787:        MOV  =P$SPD,WC        SET PCODE FOR EXPRESSION ARG
                   10788:        JSR  PATST            CALL COMMON ROUTINE TO BUILD NODE
                   10789:        ERR  184,SPAN ARGUMENT IS NOT STRING OR EXPRESSION
                   10790:        BRN  EXIXR            JUMP FOR NEXT CODE WORD
                   10791:        EJC
                   10792: *
                   10793: *      SIZE
                   10794: *
                   10795: S$SI$  ENT                   ENTRY POINT
                   10796: .IF    .CNBF
                   10797:        JSR  GTSTG            LOAD STRING ARGUMENT
                   10798: .ELSE
                   10799:        MOV  (XS),XR          LOAD ARGUMENT
                   10800:        BNE  (XR),=B$BCT,SSI$1 BRANCH IF NOT BUFFER
                   10801:        ICA  XS               ELSE POP ARGUMENT
                   10802:        MTI  BCLEN(XR)        LOAD DEFINED LENGTH
                   10803:        BRN  EXINT            EXIT WITH INTEGER
                   10804: *
                   10805: *      HERE IF NOT BUFFER
                   10806: *
                   10807: SSI$1  JSR  GTSTG            LOAD STRING ARGUMENT
                   10808: .FI
                   10809:        ERR  185,SIZE ARGUMENT IS NOT STRING
                   10810:        MTI  WA               LOAD LENGTH AS INTEGER
                   10811:        BRN  EXINT            EXIT WITH INTEGER RESULT
                   10812:        EJC
                   10813: *
                   10814: *      STOPTR
                   10815: *
                   10816: S$STT  ENT                   ENTRY POINT
                   10817:        ZER  XL               INDICATE STOPTR CASE
                   10818:        JSR  TRACE            CALL TRACE PROCEDURE
                   10819:        ERR  186,STOPTR FIRST ARGUMENT IS NOT APPROPRIATE NAME
                   10820:        ERR  187,STOPTR SECOND ARGUMENT IS NOT TRACE TYPE
                   10821:        PPM  EXFAL            FAIL RETURN
                   10822:        BRN  EXNUL            RETURN NULL
                   10823:        EJC
                   10824: *
                   10825: *      SUBSTR
                   10826: *
                   10827: S$SUB  ENT                   ENTRY POINT
                   10828:        JSR  GTSMI            LOAD THIRD ARGUMENT
                   10829:        ERR  188,SUBSTR THIRD ARGUMENT IS NOT INTEGER
                   10830:        PPM  EXFAL            JUMP IF NEGATIVE OR TOO LARGE
                   10831:        MOV  XR,SBSSV         SAVE THIRD ARGUMENT
                   10832:        JSR  GTSMI            LOAD SECOND ARGUMENT
                   10833:        ERR  189,SUBSTR SECOND ARGUMENT IS NOT INTEGER
                   10834:        PPM  EXFAL            JUMP IF OUT OF RANGE
                   10835:        MOV  XR,WB            SAVE SECOND ARGUMENT
                   10836:        BZE  WB,EXFAL         JUMP IF SECOND ARGUMENT ZERO
                   10837:        DCV  WB               ELSE DECREMENT FOR ONES ORIGIN
                   10838: .IF    .CNBF
                   10839:        JSR  GTSTG            LOAD FIRST ARGUMENT
                   10840: .ELSE
                   10841:        MOV  (XS),XL          GET FIRST ARG PTR
                   10842:        BNE  (XL),=B$BCT,SSUBA BRANCH IF NOT BUFFER
                   10843:        MOV  BCBUF(XL),XR     GET BFBLK PTR
                   10844:        MOV  BCLEN(XL),WA     GET LENGTH
                   10845:        BRN  SSUBB            MERGE
                   10846: *
                   10847: *      HERE IF NOT BUFFER TO GET STRING
                   10848: *
                   10849: SSUBA  JSR  GTSTG            LOAD FIRST ARGUMENT
                   10850: .FI
                   10851:        ERR  190,SUBSTR FIRST ARGUMENT IS NOT STRING
                   10852:        MOV  XR,XL            COPY POINTER TO FIRST ARG
                   10853: .IF    .CNBF
                   10854:        MOV  SBSSV,WC         RELOAD THIRD ARGUMENT
                   10855: .ELSE
                   10856: *
                   10857: *      MERGE WITH BFBLK OR SCBLK IN XR, LENGTH IN WA
                   10858: *
                   10859: SSUBB  MOV  SBSSV,WC         RELOAD THIRD ARGUMENT
                   10860: .FI
                   10861:        BNZ  WC,SSUB1         SKIP IF THIRD ARG GIVEN
                   10862:        MOV  SCLEN(XL),WC     ELSE GET STRING LENGTH
                   10863:        BGT  WB,WC,EXFAL      FAIL IF IMPROPER
                   10864:        SUB  WB,WC            REDUCE BY OFFSET TO START
                   10865: *
                   10866: *      MERGE
                   10867: *
                   10868: SSUB1  MOV  WC,WA            SET LENGTH OF SUBSTRING
                   10869:        ADD  WB,WC            ADD 2ND ARG TO 3RD ARG
                   10870:        BGT  WC,SCLEN(XL),EXFAL JUMP IF IMPROPER SUBSTRING
                   10871:        JSR  SBSTR            BUILD SUBSTRING
                   10872:        BRN  EXIXR            AND JUMP FOR NEXT CODE WORD
                   10873:        EJC
                   10874: *
                   10875: *      TAB
                   10876: *
                   10877: S$TAB  ENT                   ENTRY POINT
                   10878:        MOV  =P$TAB,WB        SET PCODE FOR INTEGER ARG CASE
                   10879:        MOV  =P$TBD,WA        SET PCODE FOR EXPRESSION ARG CASE
                   10880:        JSR  PATIN            CALL COMMON ROUTINE TO BUILD NODE
                   10881:        ERR  191,TAB ARGUMENT IS NOT INTEGER OR EXPRESSION
                   10882:        ERR  192,TAB ARGUMENT IS NEGATIVE OR TOO LARGE
                   10883:        BRN  EXIXR            RETURN PATTERN NODE
                   10884:        EJC
                   10885: *
                   10886: *      TABLE
                   10887: *
                   10888: S$TBL  ENT                   ENTRY POINT
                   10889:        MOV  (XS)+,XL         GET INITIAL LOOKUP VALUE
                   10890:        ICA  XS               POP SECOND ARGUMENT
                   10891:        JSR  GTSMI            LOAD ARGUMENT
                   10892:        ERR  193,TABLE ARGUMENT IS NOT INTEGER
                   10893:        ERR  194,TABLE ARGUMENT IS OUT OF RANGE
                   10894:        BNZ  WC,STBL1         JUMP IF NON-ZERO
                   10895:        MOV  =TBNBK,WC        ELSE SUPPLY DEFAULT VALUE
                   10896: *
                   10897: *      MERGE HERE WITH NUMBER OF HEADERS IN WA
                   10898: *
                   10899: STBL1  MOV  WC,WA            COPY NUMBER OF HEADERS
                   10900:        ADD  =TBSI$,WA        ADJUST FOR STANDARD FIELDS
                   10901:        WTB  WA               CONVERT LENGTH TO BAUS
                   10902:        JSR  ALLOC            ALLOCATE SPACE FOR TBBLK
                   10903:        MOV  XR,WB            COPY POINTER TO TBBLK
                   10904:        MOV  =B$TBT,(XR)+     STORE TYPE WORD
                   10905:        ZER  (XR)+            ZERO ID FOR THE MOMENT
                   10906:        MOV  WA,(XR)+         STORE LENGTH (TBLEN)
                   10907:        MOV  XL,(XR)+         STORE INITIAL LOOKUP VALUE
                   10908:        LCT  WC,WC            SET LOOP COUNTER (NUM HEADERS)
                   10909: *
                   10910: *      LOOP TO INITIALIZE ALL BUCKET POINTERS
                   10911: *
                   10912: STBL2  MOV  WB,(XR)+         STORE TBBLK PTR IN BUCKET HEADER
                   10913:        BCT  WC,STBL2         LOOP TILL ALL STORED
                   10914:        MOV  WB,XR            RECALL POINTER TO TBBLK
                   10915:        BRN  EXSID            EXIT SETTING IDVAL
                   10916:        EJC
                   10917: *
                   10918: *      TIME
                   10919: *
                   10920: S$TIM  ENT                   ENTRY POINT
                   10921:        JSR  SYSTM            GET TIMER VALUE
                   10922:        SBI  TIMSX            SUBTRACT STARTING TIME
                   10923:        BRN  EXINT            EXIT WITH INTEGER VALUE
                   10924:        EJC
                   10925: *
                   10926: *      TRACE
                   10927: *
                   10928: S$TRA  ENT                   ENTRY POINT
                   10929:        BEQ  3(XS),=NULLS,STR03  JUMP IF FIRST ARGUMENT IS NULL
                   10930:        MOV  (XS)+,XR         LOAD FOURTH ARGUMENT
                   10931:        ZER  XL               TENTATIVELY SET ZERO POINTER
                   10932:        BEQ  XR,=NULLS,STR02  JUMP IF 4TH ARGUMENT IS NULL
                   10933:        JSR  GTNVR            ELSE POINT TO VRBLK
                   10934:        PPM  STR01            JUMP IF NOT VARIABLE NAME
                   10935:        MOV  VRFNC(XR),XL     ELSE LOAD FUNCTION POINTER
                   10936:        BNE  XL,=STNDF,STR02  JUMP IF FUNCTION IS DEFINED
                   10937: *
                   10938: *      HERE FOR BAD FOURTH ARGUMENT
                   10939: *
                   10940: STR01  ERB  195,TRACE FOURTH ARG IS NOT FUNCTION NAME OR NULL
                   10941: *
                   10942: *      HERE WITH FUNCTION POINTER IN XL
                   10943: *
                   10944: STR02  MOV  (XS)+,XR         LOAD THIRD ARGUMENT (TAG)
                   10945:        ZER  WB               SET ZERO AS TRTYP VALUE FOR NOW
                   10946:        JSR  TRBLD            BUILD TRBLK FOR TRACE CALL
                   10947:        MOV  XR,XL            MOVE TRBLK POINTER FOR TRACE
                   10948:        JSR  TRACE            CALL TRACE PROCEDURE
                   10949:        ERR  196,TRACE FIRST ARGUMENT IS NOT APPROPRIATE NAME
                   10950:        ERR  197,TRACE SECOND ARGUMENT IS NOT TRACE TYPE
                   10951:        PPM                   UNUSED RETURN
                   10952:        BRN  EXNUL            RETURN NULL
                   10953: *
                   10954: *      HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
                   10955: *
                   10956: STR03  JSR  SYSTT            CALL IT
                   10957:        ADD  *NUM04,XS        POP TRACE ARGUMENTS
                   10958:        BRN  EXNUL            RETURN
                   10959:        EJC
                   10960: *
                   10961: *      TRIM
                   10962: *
                   10963: S$TRM  ENT                   ENTRY POINT
                   10964:        JSR  GTSTG            LOAD ARGUMENT AS STRING
                   10965:        ERR  198,TRIM ARGUMENT IS NOT STRING
                   10966:        BZE  WA,EXNUL         RETURN NULL IF ARGUMENT IS NULL
                   10967:        MOV  XR,XL            COPY STRING POINTER
                   10968:        CTB  WA,SCHAR         GET BLOCK LENGTH
                   10969:        JSR  ALLOC            ALLOCATE COPY SAME SIZE
                   10970:        MOV  XR,WB            SAVE POINTER TO COPY
                   10971:        MVW                   COPY OLD STRING BLOCK TO NEW
                   10972:        MOV  WB,XR            RESTORE PTR TO NEW BLOCK
                   10973:        JSR  TRIMR            TRIM BLANKS (WB IS NON-ZERO)
                   10974:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   10975:        EJC
                   10976: *
                   10977: *      UNLOAD
                   10978: *
                   10979: S$UNL  ENT                   ENTRY POINT
                   10980:        MOV  (XS)+,XR         LOAD ARGUMENT
                   10981:        JSR  GTNVR            POINT TO VRBLK
                   10982:        ERR  199,UNLOAD ARGUMENT IS NOT NATURAL VARIABLE NAME
                   10983:        MOV  =STNDF,XL        GET PTR TO UNDEFINED FUNCTION
                   10984:        JSR  DFFNC            UNDEFINE NAMED FUNCTION
                   10985:        BRN  EXNUL            RETURN NULL AS RESULT
                   10986:        EJC
                   10987: *
                   10988: *      VDIFFER
                   10989: *
                   10990: S$VDF  ENT                   ENTRY POINT
                   10991:        MOV  (XS)+,XR         LOAD SECOND ARGUMENT
                   10992:        MOV  (XS),XL          LOAD FIRST ARGUMENT
                   10993:        JSR  IDENT            CALL IDENT COMPARISON ROUTINE
                   10994:        PPM  EXFAL            FAIL IF IDENT
                   10995:        BRN  EXITS            RETURN FIRST ARG IF DIFFER
                   10996:        TTL  S P I T B O L -- UTILITY PROCEDURES
                   10997: *
                   10998: *      THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
                   10999: *      USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
                   11000: *
                   11001: *      EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
                   11002: *      CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
                   11003: *      BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
                   11004: *      PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
                   11005: *
                   11006: *      THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
                   11007: *
                   11008: *      1)   THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
                   11009: *           CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
                   11010: *
                   11011: *      2)   REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
                   11012: *           MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
                   11013: *           CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
                   11014: *           THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
                   11015: *           MAY IF IT CHOOSES PRESERVE XR BY STACKING.
                   11016: *
                   11017: *      3)   REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
                   11018: *           VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
                   11019: *           XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
                   11020: *
                   11021: *      4)   REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
                   11022: *           ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
                   11023: *           (COLLECTABLE) POINTERS.
                   11024: *
                   11025: *      5)   THE CODE POINTER REGISTER POINTS TO THE CURRENT
                   11026: *           CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
                   11027: *
                   11028: *      IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
                   11029: *      WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
                   11030: *      POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
                   11031: *
                   11032: *      IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
                   11033: *      PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
                   11034: *      THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
                   11035: *      ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
                   11036: *      IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
                   11037: *
                   11038: *      THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
                   11039: *      AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
                   11040:        EJC
                   11041: *
                   11042: *      ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
                   11043: *
                   11044: *      ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
                   11045: *      ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
                   11046: *      ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
                   11047: *
                   11048: *      (XL)                  VARIABLE NAME BASE
                   11049: *      (WA)                  VARIABLE NAME OFFSET
                   11050: *      JSR  ACESS            CALL TO ACCESS VALUE
                   11051: *      PPM  LOC              TRANSFER LOC IF ACCESS FAILURE
                   11052: *      (XR)                  VARIABLE VALUE
                   11053: *      (WA,WB,WC)            DESTROYED
                   11054: *      (XL,RA)               DESTROYED
                   11055: *
                   11056: *      FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
                   11057: *      OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
                   11058: *      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
                   11059: *
                   11060: ACESS  PRC  R,1              ENTRY POINT (RECURSIVE)
                   11061:        MOV  XL,XR            COPY NAME BASE
                   11062:        ADD  WA,XR            POINT TO VARIABLE LOCATION
                   11063:        MOV  (XR),XR          LOAD VARIABLE VALUE
                   11064: *
                   11065: *      LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
                   11066: *
                   11067: ACS02  BNE  (XR),=B$TRT,ACS18 JUMP IF NOT TRAPPED
                   11068: *
                   11069: *      HERE IF TRAPPED
                   11070: *
                   11071:        BEQ  XR,=TRBKV,ACS12  JUMP IF KEYWORD VARIABLE
                   11072:        BNE  XR,=TRBEV,ACS05  JUMP IF NOT EXPRESSION VARIABLE
                   11073: *
                   11074: *      HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
                   11075: *
                   11076:        MOV  EVEXP(XL),XR     LOAD EXPRESSION POINTER
                   11077:        ZER  WB               EVALUATE BY VALUE
                   11078:        JSR  EVALX            EVALUATE EXPRESSION
                   11079:        PPM  ACS04            JUMP IF EVALUATION FAILURE
                   11080:        BRN  ACS02            CHECK VALUE FOR MORE TRBLKS
                   11081:        EJC
                   11082: *
                   11083: *      ACESS (CONTINUED)
                   11084: *
                   11085: *      HERE ON READING END OF FILE
                   11086: *
                   11087: ACS03  ADD  *NUM03,XS        POP TRBLK PTR, NAME BASE AND OFFSET
                   11088:        MOV  XR,DNAMP         POP UNUSED SCBLK
                   11089: *
                   11090: *      MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
                   11091: *
                   11092: ACS04  EXI  1                TAKE ALTERNATE (FAILURE) RETURN
                   11093: *
                   11094: *      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
                   11095: *
                   11096: ACS05  MOV  TRTYP(XR),WB     LOAD TRAP TYPE CODE
                   11097:        BNZ  WB,ACS10         JUMP IF NOT INPUT ASSOCIATION
                   11098:        BZE  KVINP,ACS09      IGNORE INPUT ASSOC IF INPUT IS OFF
                   11099: *
                   11100: *      HERE FOR INPUT ASSOCIATION
                   11101: *
                   11102:        MOV  XL,-(XS)         STACK NAME BASE
                   11103:        MOV  WA,-(XS)         STACK NAME OFFSET
                   11104:        MOV  XR,-(XS)         STACK TRBLK POINTER
                   11105:        MOV  TRTRI(XR),XL     GET TRTIO BLOCK PTR OR 0
                   11106:        BNZ  XL,ACS06         JUMP IF NOT STANDARD INPUT FILE
                   11107:        BEQ  TRTER(XR),=V$TER,ACS21 JUMP IF TERMINAL
                   11108: *
                   11109: *      HERE TO READ FROM STANDARD INPUT FILE
                   11110: *
                   11111:        MOV  CSWIN,WA         LENGTH FOR READ BUFFER
                   11112:        JSR  ALOCS            BUILD STRING OF APPROPRIATE LENGTH
                   11113:        BZE  TTINS,ACSA5      SKIP IF NOT TERML STD INPUT
                   11114:        JSR  SYSRI            READ FROM TERMINAL
                   11115:        PPM  ACS03            END FILE
                   11116:        PPM  EROSI            ERROR
                   11117:        BRN  ACS07            MERGE
                   11118: *
                   11119: *      GENUINE STD INPUT FILE
                   11120: *
                   11121: ACSA5  JSR  SYSRD            READ NEXT STANDARD INPUT IMAGE
                   11122:        PPM  ACS03            JUMP TO FAIL EXIT IF END OF FILE
                   11123:        PPM  EROSI            ERROR RETURN
                   11124:        BRN  ACS07            ELSE MERGE WITH OTHER FILE CASE
                   11125: *
                   11126: *      HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
                   11127: *
                   11128: ACS06  MOV  TRTAG(XL),WA     OBTAIN IOTAG
                   11129:        BZE  WA,ACS03         FAIL IF ENDFILE DONE
                   11130:        JSR  SYSIL            GET INPUT RECORD MAX LENGTH (TO WA)
                   11131:        JSR  ALOCS            ALLOCATE STRING OF CORRECT SIZE
                   11132:        MOV  TRTAG(XL),WA     GET IOTAG
                   11133:        JSR  SYSIN            CALL SYSTEM INPUT ROUTINE
                   11134:        PPM  ACS03            JUMP TO FAIL EXIT IF END OF FILE
                   11135:        PPM  ACS22            ERROR RETURN
                   11136:        EJC
                   11137: *
                   11138: *      ACESS (CONTINUED)
                   11139: *
                   11140: *      MERGE HERE AFTER OBTAINING INPUT RECORD
                   11141: *
                   11142: ACS07  MOV  KVTRM,WB         LOAD TRIM INDICATOR
                   11143:        JSR  TRIMR            TRIM RECORD AS REQUIRED
                   11144:        MOV  XR,WB            COPY RESULT POINTER
                   11145:        MOV  (XS),XR          RELOAD POINTER TO TRBLK
                   11146: *
                   11147: *      LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
                   11148: *
                   11149: ACS08  MOV  XR,XL            SAVE POINTER TO THIS TRBLK
                   11150:        MOV  TRNXT(XR),XR     LOAD FORWARD POINTER
                   11151:        BEQ  (XR),=B$TRT,ACS08 LOOP IF THIS IS ANOTHER TRBLK
                   11152:        MOV  WB,TRNXT(XL)     ELSE STORE RESULT AT END OF CHAIN
                   11153:        MOV  (XS)+,XR         RESTORE INITIAL TRBLK POINTER
                   11154:        MOV  (XS)+,WA         RESTORE NAME OFFSET
                   11155:        MOV  (XS)+,XL         RESTORE NAME BASE POINTER
                   11156: *
                   11157: *      COME HERE TO MOVE TO NEXT TRBLK
                   11158: *
                   11159: ACS09  MOV  TRNXT(XR),XR     LOAD FORWARD PTR TO NEXT VALUE
                   11160:        BRN  ACS02            BACK TO CHECK IF TRAPPED
                   11161: *
                   11162: *      HERE TO CHECK FOR ACCESS TRACE TRBLK
                   11163: *
                   11164: ACS10  BNE  WB,=TRTAC,ACS09  LOOP BACK IF NOT ACCESS TRACE
                   11165:        BZE  KVTRA,ACS09      IGNORE ACCESS TRACE IF TRACE OFF
                   11166:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   11167:        BZE  TRFNC(XR),ACS11  JUMP IF PRINT TRACE
                   11168:        EJC
                   11169: *
                   11170: *      ACESS (CONTINUED)
                   11171: *
                   11172: *      HERE FOR FULL FUNCTION TRACE
                   11173: *
                   11174:        JSR  TRXEQ            CALL ROUTINE TO EXECUTE TRACE
                   11175:        BRN  ACS09            JUMP FOR NEXT TRBLK
                   11176: *
                   11177: *      HERE FOR CASE OF PRINT TRACE
                   11178: *
                   11179: ACS11  JSR  PRTSN            PRINT STATEMENT NUMBER
                   11180:        JSR  PRTNV            PRINT NAME = VALUE
                   11181:        BRN  ACS09            JUMP BACK FOR NEXT TRBLK
                   11182: *
                   11183: *      HERE FOR KEYWORD VARIABLE
                   11184: *
                   11185: ACS12  MOV  KVNUM(XL),XR     LOAD KEYWORD NUMBER
                   11186:        BGE  XR,=K$V$$,ACS14  JUMP IF NOT ONE WORD VALUE
                   11187:        MTI  KVANC(XR)        ELSE LOAD VALUE AS INTEGER
                   11188: *
                   11189: *      COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
                   11190: *
                   11191: ACS13  JSR  ICBLD            BUILD ICBLK
                   11192:        BRN  ACS18            JUMP TO EXIT
                   11193: *
                   11194: *      HERE IF NOT ONE WORD KEYWORD VALUE
                   11195: *
                   11196: ACS14  BGE  XR,=K$S$$,ACS15  JUMP IF SPECIAL CASE
                   11197:        SUB  =K$V$$,XR        ELSE GET OFFSET
                   11198:        WTB  XR               CONVERT TO OFFSET IN BAUS
                   11199:        ADD  =NDABO,XR        POINT TO PATTERN VALUE
                   11200:        BRN  ACS18            JUMP TO EXIT
                   11201: *
                   11202: *      HERE IF SPECIAL KEYWORD CASE
                   11203: *
                   11204: ACS15  MOV  KVRTN,XL         LOAD RTNTYPE IN CASE
                   11205:        LDI  KVSTL            LOAD STLIMIT IN CASE
                   11206:        SUB  =K$S$$,XR        GET CASE NUMBER
                   11207:        BSW  XR,6             SWITCH ON KEYWORD NUMBER
                   11208:        IFF  K$$AL,ACS16      JUMP IF ALPHABET
                   11209:        IFF  K$$RT,ACS17      RTNTYPE
                   11210:        IFF  K$$CD,ACS23      CODE
                   11211:        IFF  K$$SC,ACS19      STCOUNT
                   11212:        IFF  K$$SL,ACS13      STLIMIT
                   11213:        IFF  K$$ET,ACS20      ERRTEXT
                   11214:        ESW                   END SWITCH ON KEYWORD NUMBER
                   11215:        EJC
                   11216: *
                   11217: *      ACESS (CONTINUED)
                   11218: *
                   11219: *      ALPHABET
                   11220: *
                   11221: ACS16  MOV  KVALP,XL         LOAD POINTER TO ALPHABET STRING
                   11222: *
                   11223: *      RTNTYPE MERGES HERE
                   11224: *
                   11225: ACS17  MOV  XL,XR            COPY STRING PTR TO PROPER REG
                   11226: *
                   11227: *      COMMON RETURN POINT
                   11228: *
                   11229: ACS18  EXI                   RETURN TO ACESS CALLER
                   11230: *
                   11231: *      HERE FOR STCOUNT (IA HAS STLIMIT)
                   11232: *
                   11233: ACS19  SBI  KVSTC            STCOUNT = LIMIT - LEFT
                   11234:        BRN  ACS13            MERGE BACK WITH INTEGER RESULT
                   11235: *
                   11236: *      ERRTEXT
                   11237: *
                   11238: ACS20  MOV  R$ETX,XR         GET ERRTEXT STRING
                   11239:        BRN  ACS18            MERGE WITH RESULT
                   11240: *
                   11241: *      HERE TO READ A RECORD FROM TERMINAL
                   11242: *
                   11243: ACS21  MOV  =RILEN,WA        BUFFER LENGTH
                   11244:        JSR  ALOCS            ALLOCATE BUFFER
                   11245:        JSR  SYSRI            READ RECORD
                   11246:        PPM  ACS03            ENDFILE
                   11247:        PPM  EROSI            ERROR RETURN
                   11248:        BRN  ACS07            MERGE WITH RECORD READ
                   11249: *
                   11250: *      ERROR RETURN
                   11251: *
                   11252: ACS22  MOV  XR,DNAMP         POP UNUSED SCBLK
                   11253:        BRN  EROSI            GENERATE ERROR MESSAGE
                   11254: *
                   11255: *      ACCESS CODE KEYWORD
                   11256: *
                   11257: ACS23  LDI  KVCOD            GET CODE VALUE
                   11258:        BRN  ACS13            EXIT
                   11259:        ENP                   END PROCEDURE ACESS
                   11260:        EJC
                   11261: *
                   11262: *      ACOMP -- COMPARE TWO ARITHMETIC VALUES
                   11263: *
                   11264: *      1(XS)                 FIRST ARGUMENT
                   11265: *      0(XS)                 SECOND ARGUMENT
                   11266: *      JSR  ACOMP            CALL TO COMPARE VALUES
                   11267: *      PPM  LOC              TRANSFER LOC IF ARG1 IS NON-NUMERIC
                   11268: *      PPM  LOC              TRANSFER LOC IF ARG2 IS NON-NUMERIC
                   11269: *      PPM  LOC              TRANSFER LOC FOR ARG1 LT ARG2
                   11270: *      PPM  LOC              TRANSFER LOC FOR ARG1 EQ ARG2
                   11271: *      PPM  LOC              TRANSFER LOC FOR ARG1 GT ARG2
                   11272: *      (NORMAL RETURN IS NEVER GIVEN)
                   11273: *      (WA,WB,WC,IA,RA)      DESTROYED
                   11274: *      (XL,XR)               DESTROYED
                   11275: *
                   11276: ACOMP  PRC  N,5              ENTRY POINT
                   11277:        JSR  ARITH            LOAD ARITHMETIC OPERANDS
                   11278:        PPM  ACMP7            JUMP IF FIRST ARG NON-NUMERIC
                   11279:        PPM  ACMP8            JUMP IF SECOND ARG NON-NUMERIC
                   11280: .IF    .CNRA
                   11281: .ELSE
                   11282:        PPM  ACMP4            JUMP IF REAL ARGUMENTS
                   11283: .FI
                   11284: *
                   11285: *      HERE FOR INTEGER ARGUMENTS
                   11286: *
                   11287:        SBI  ICVAL(XL)        SUBTRACT TO COMPARE
                   11288:        IOV  ACMP3            JUMP IF OVERFLOW
                   11289:        ILT  ACMP5            ELSE JUMP IF ARG1 LT ARG2
                   11290:        IEQ  ACMP2            JUMP IF ARG1 EQ ARG2
                   11291: *
                   11292: *      HERE IF ARG1 GT ARG2
                   11293: *
                   11294: ACMP1  EXI  5                TAKE GT EXIT
                   11295: *
                   11296: *      HERE IF ARG1 EQ ARG2
                   11297: *
                   11298: ACMP2  EXI  4                TAKE EQ EXIT
                   11299:        EJC
                   11300: *
                   11301: *      ACOMP (CONTINUED)
                   11302: *
                   11303: *      HERE FOR INTEGER OVERFLOW ON SUBTRACT
                   11304: *
                   11305: ACMP3  LDI  ICVAL(XL)        LOAD SECOND ARGUMENT
                   11306:        ILT  ACMP1            GT IF NEGATIVE
                   11307:        BRN  ACMP5            ELSE LT
                   11308: .IF    .CNRA
                   11309: .ELSE
                   11310: *
                   11311: *      HERE FOR REAL OPERANDS
                   11312: *
                   11313: ACMP4  SBR  RCVAL(XL)        SUBTRACT TO COMPARE
                   11314:        ROV  ACMP6            JUMP IF OVERFLOW
                   11315:        RGT  ACMP1            ELSE JUMP IF ARG1 GT
                   11316:        REQ  ACMP2            JUMP IF ARG1 EQ ARG2
                   11317: .FI
                   11318: *
                   11319: *      HERE IF ARG1 LT ARG2
                   11320: *
                   11321: ACMP5  EXI  3                TAKE LT EXIT
                   11322: .IF    .CNRA
                   11323: .ELSE
                   11324: *
                   11325: *      HERE IF OVERFLOW ON REAL SUBTRACTION
                   11326: *
                   11327: ACMP6  LDR  RCVAL(XL)        RELOAD ARG2
                   11328:        RLT  ACMP1            GT IF NEGATIVE
                   11329:        BRN  ACMP5            ELSE LT
                   11330: .FI
                   11331: *
                   11332: *      HERE IF ARG1 NON-NUMERIC
                   11333: *
                   11334: ACMP7  EXI  1                TAKE ERROR EXIT
                   11335: *
                   11336: *      HERE IF ARG2 NON-NUMERIC
                   11337: *
                   11338: ACMP8  EXI  2                TAKE ERROR EXIT
                   11339:        ENP                   END PROCEDURE ACOMP
                   11340:        EJC
                   11341: *
                   11342: *      ALLOC                 ALLOCATE BLOCK OF DYNAMIC STORAGE
                   11343: *
                   11344: *      (WA)                  LENGTH REQUIRED IN BAUS
                   11345: *      JSR  ALLOC            CALL TO ALLOCATE BLOCK
                   11346: *      (XR)                  POINTER TO ALLOCATED BLOCK
                   11347: *
                   11348: *      A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
                   11349: *      MOV  DNAME,XR .  SUB  WA,XR .  BLO XR,DNAMP,ALOC2 .
                   11350: *      MOV  DNAMP,XR .  ADD  WA,XR
                   11351: *
                   11352: ALLOC  PRC  E,0              ENTRY POINT
                   11353: *
                   11354: *      COMMON EXIT POINT
                   11355: *
                   11356: ALOC1  MOV  DNAMP,XR         POINT TO NEXT AVAILABLE LOC
                   11357:        AOV  WA,XR,ALOC2      POINT PAST ALLOCATED BLOCK
                   11358:        BGT  XR,DNAME,ALOC2   JUMP IF NOT ENOUGH ROOM
                   11359:        MOV  XR,DNAMP         STORE NEW POINTER
                   11360:        SUB  WA,XR            POINT BACK TO START OF ALLOCATED BK
                   11361:        EXI                   RETURN TO CALLER
                   11362: *
                   11363: *      HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
                   11364: *
                   11365: ALOC2  MOV  WB,ALLSV         SAVE WB
                   11366:        ZER  WB               SET NO UPWARD MOVE FOR GBCOL
                   11367:        JSR  GBCOL            GARBAGE COLLECT
                   11368: *
                   11369: *      SEE IF ROOM AFTER GBCOL OR SYSMM CALL
                   11370: *
                   11371: ALOC3  MOV  DNAMP,XR         POINT TO FIRST AVAILABLE LOC
                   11372:        AOV  WA,XR,ALC3A      POINT PAST NEW BLOCK
                   11373:        BLO  XR,DNAME,ALOC4   JUMP IF THERE IS ROOM NOW
                   11374: *
                   11375: *      FAILED AGAIN, SEE IF WE CAN GET MORE CORE
                   11376: *
                   11377: ALC3A  JSR  SYSMM            TRY TO GET MORE MEMORY
                   11378:        WTB  XR               CONVERT TO BAUS
                   11379:        ADD  XR,DNAME         BUMP PTR BY AMOUNT OBTAINED
                   11380:        BNZ  XR,ALOC3         JUMP IF GOT MORE CORE
                   11381:        ADD  RSMEM,DNAME      GET THE RESERVE MEMORY
                   11382:        ZER  RSMEM            ONLY PERMISSIBLE ONCE
                   11383:        ICV  ERRFT            FATAL ERROR
                   11384:        ERB  200,MEMORY OVERFLOW
                   11385:        EJC
                   11386: *
                   11387: *      HERE AFTER SUCCESSFUL GARBAGE COLLECTION
                   11388: *
                   11389: ALOC4  STI  ALLIA            SAVE IA
                   11390:        MOV  DNAME,WB         GET DYNAMIC END ADRS
                   11391:        SUB  DNAMP,WB         COMPUTE FREE STORE
                   11392:        BTW  WB               CONVERT BAUS TO WORDS
                   11393:        MTI  WB               PUT FREE STORE IN IA
                   11394:        MLI  ALFSF            MULTIPLY BY FREE STORE FACTOR
                   11395:        IOV  ALOC5            JUMP IF OVERFLOWED
                   11396:        MOV  DNAME,WB         DYNAMIC END ADRS
                   11397:        SUB  DNAMB,WB         COMPUTE TOTAL AMOUNT OF DYNAMIC
                   11398:        BTW  WB               CONVERT TO WORDS
                   11399:        MOV  WB,ALDYN         STORE IT
                   11400:        SBI  ALDYN            SUBTRACT FROM SCALED UP FREE STORE
                   11401:        IGT  ALOC5            JUMP IF SUFFICIENT FREE STORE
                   11402:        JSR  SYSMM            TRY TO GET MORE STORE
                   11403:        WTB  XR               CONVERT TO BAUS
                   11404:        ADD  XR,DNAME         ADJUST DYNAMIC END ADRS
                   11405: *
                   11406: *      MERGE TO RESTORE IA AND WB
                   11407: *
                   11408: ALOC5  LDI  ALLIA            RECOVER IA
                   11409:        MOV  ALLSV,WB         RESTORE WB
                   11410:        BRN  ALOC1            JUMP BACK TO EXIT
                   11411:        ENP                   END PROCEDURE ALLOC
                   11412:        EJC
                   11413: .IF    .CNBF
                   11414: .ELSE
                   11415: *
                   11416: *      ALOBF -- ALLOCATE BUFFER
                   11417: *
                   11418: *      THIS ROUTINES ALLOCATES A NEW BUFFER.  AS THE BFBLK
                   11419: *      AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
                   11420: *      AND XR POINTS TO THE BCBLK ON RETURN.  THE BFBLK
                   11421: *      AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
                   11422: *      IS ZERO ON RETURN.
                   11423: *
                   11424: *      (WA)                  BUFFER SIZE IN CHARACTERS
                   11425: *      JSR  ALOBF            CALL TO CREATE BUFFER
                   11426: *      (WA)                  0 (INITIAL OFFSET TO BFBLK CHARS)
                   11427: *      (WB)                  0 (INITIAL BCLEN)
                   11428: *      (XR)                  BCBLK PTR
                   11429: *
                   11430: ALOBF  PRC  E,0              ENTRY POINT
                   11431:        MOV  WA,WB            HANG ONTO ALLOCATION SIZE
                   11432:        CTB  WA,BFSI$         GET TOTAL BLOCK SIZE
                   11433:        BGE  WA,MXLEN,ALB01   CHECK FOR MAXLEN EXCEEDED
                   11434:        ADD  *BCSI$,WA        ADD IN ALLOCATION FOR BCBLK
                   11435:        JSR  ALLOC            ALLOCATE FRAME
                   11436:        MOV  =B$BCT,(XR)      SET TYPE
                   11437:        ZER  IDVAL(XR)        NO ID YET
                   11438:        ZER  BCLEN(XR)        NO DEFINED LENGTH
                   11439:        MOV  XL,WA            SAVE XL
                   11440:        MOV  XR,XL            COPY BCBLK PTR
                   11441:        ADD  *BCSI$,XL        BIAS PAST PARTIALLY BUILT BCBLK
                   11442:        MOV  =B$BFT,(XL)      SET BFBLK TYPE WORD
                   11443:        MOV  WB,BFALC(XL)     SET ALLOCATED SIZE
                   11444:        MOV  XL,BCBUF(XR)     SET POINTER IN BCBLK
                   11445:        ZER  WB               CLEAR FOR RETURN
                   11446:        MOV  WB,BFCHR(XL)     CLEAR FIRST WORD (NULL PAD)
                   11447:        MOV  WA,XL            RESTORE ENTRY XL
                   11448:        ZER  WA               CLEAR FOR RETURN
                   11449:        EXI                   RETURN TO CALLER
                   11450: *
                   11451: *      HERE FOR MXLEN EXCEEDED
                   11452: *
                   11453: ALB01  ERB  201,REQUESTED BUFFER ALLOCATION EXCEEDS MAXLNGTH
                   11454:        ENP                   END PROCEDURE ALOBF
                   11455:        EJC
                   11456: .FI
                   11457: *
                   11458: *      ALOCS -- ALLOCATE STRING BLOCK
                   11459: *
                   11460: *      ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
                   11461: *      WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
                   11462: *      ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
                   11463: *      EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
                   11464: *
                   11465: *      (WA)                  LENGTH OF STRING TO BE ALLOCATED
                   11466: *      JSR  ALOCS            CALL TO ALLOCATE SCBLK
                   11467: *      (XR)                  POINTER TO RESULTING SCBLK
                   11468: *      (WA)                  DESTROYED
                   11469: *      (WC)                  CHARACTER COUNT (ENTRY VALUE OF WA)
                   11470: *
                   11471: *      THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
                   11472: *      FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
                   11473: *      TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
                   11474: *
                   11475: ALOCS  PRC  E,0              ENTRY POINT
                   11476:        BGT  WA,KVMXL,ALCS2   JUMP IF LENGTH EXCEEEDS MAXLENGTH
                   11477:        MOV  WA,WC            ELSE COPY LENGTH
                   11478:        CTB  WA,SCSI$         COMPUTE LENGTH OF SCBLK IN BAUS
                   11479:        MOV  DNAMP,XR         POINT TO NEXT AVAILABLE LOCATION
                   11480:        AOV  WA,XR,ALCS0      POINT PAST BLOCK
                   11481:        BLO  XR,DNAME,ALCS1   JUMP IF THERE IS ROOM
                   11482: *
                   11483: *      INSUFFICIENT MEMORY
                   11484: *
                   11485: ALCS0  ZER  XR               ELSE CLEAR GARBAGE XR VALUE
                   11486:        JSR  ALLOC            AND USE STANDARD ALLOCATOR
                   11487:        ADD  WA,XR            POINT PAST END OF BLOCK TO MERGE
                   11488: *
                   11489: *      MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
                   11490: *
                   11491: ALCS1  MOV  XR,DNAMP         SET UPDATED STORAGE POINTER
                   11492:        ZER  -(XR)            STORE ZERO CHARS IN LAST WORD
                   11493:        DCA  WA               DECREMENT LENGTH
                   11494:        SUB  WA,XR            POINT BACK TO START OF BLOCK
                   11495:        MOV  =B$SCL,(XR)      SET TYPE WORD
                   11496:        MOV  WC,SCLEN(XR)     STORE LENGTH IN CHARS
                   11497:        EXI                   RETURN TO ALOCS CALLER
                   11498: *
                   11499: *      COME HERE IF STRING IS TOO LONG
                   11500: *
                   11501: ALCS2  ERB  202,STRING LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
                   11502:        ENP                   END PROCEDURE ALOCS
                   11503:        EJC
                   11504: *
                   11505: *      ALOST -- ALLOCATE SPACE IN STATIC REGION
                   11506: *
                   11507: *      (WA)                  LENGTH REQUIRED IN BAUS
                   11508: *      JSR  ALOST            CALL TO ALLOCATE SPACE
                   11509: *      (XR)                  POINTER TO ALLOCATED BLOCK
                   11510: *      (WB)                  DESTROYED
                   11511: *
                   11512: *      NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
                   11513: *      OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
                   11514: *      IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
                   11515: *
                   11516: ALOST  PRC  E,0              ENTRY POINT
                   11517: *
                   11518: *      MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
                   11519: *
                   11520: ALST1  MOV  STATE,XR         POINT TO CURRENT END OF AREA
                   11521:        AOV  WA,XR,ALST2      POINT BEYOND PROPOSED BLOCK
                   11522:        BGE  XR,DNAMB,ALST2   JUMP IF OVERLAP WITH DYNAMIC AREA
                   11523:        MOV  XR,STATE         ELSE STORE NEW POINTER
                   11524:        SUB  WA,XR            POINT BACK TO START OF BLOCK
                   11525:        EXI                   RETURN TO ALOST CALLER
                   11526: *
                   11527: *      HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
                   11528: *
                   11529: ALST2  MOV  WA,ALSTA         SAVE WA
                   11530:        BGE  WA,*E$STS,ALST3  SKIP IF REQUESTED CHUNK IS LARGE
                   11531:        MOV  *E$STS,WA        ELSE SET TO GET LARGE ENOUGH CHUNK
                   11532: *
                   11533: *      HERE WITH AMOUNT TO MOVE UP IN WA
                   11534: *
                   11535: ALST3  JSR  ALLOC            ALLOCATE BLOCK TO ENSURE ROOM
                   11536:        MOV  XR,DNAMP         AND DELETE IT
                   11537:        MOV  WA,WB            COPY MOVE UP AMOUNT
                   11538:        JSR  GBCOL            CALL GBCOL TO MOVE DYNAMIC AREA UP
                   11539:        MOV  ALSTA,WA         RESTORE WA
                   11540:        BRN  ALST1            LOOP BACK TO TRY AGAIN
                   11541:        ENP                   END PROCEDURE ALOST
                   11542:        EJC
                   11543: *
                   11544: *      ARITH -- FETCH ARITHMETIC OPERANDS
                   11545: *
                   11546: *      ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
                   11547: *      TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
                   11548: *      INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
                   11549: *      THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
                   11550: *
                   11551: *      1(XS)                 FIRST ARGUMENT (LEFT OPERAND)
                   11552: *      0(XS)                 SECOND ARGUMENT (RIGHT OPERAND)
                   11553: *      JSR  ARITH            CALL TO FETCH NUMERIC ARGUMENTS
                   11554: *      PPM  LOC              TRANSFER LOC FOR OPND 1 NON-NUMERIC
                   11555: *      PPM  LOC              TRANSFER LOC FOR OPND 2 NON-NUMERIC
                   11556: .IF    .CNRA
                   11557: .ELSE
                   11558: *      PPM  LOC              TRANSFER LOC FOR REAL OPERANDS
                   11559: .FI
                   11560: *
                   11561: *      FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
                   11562: *
                   11563: *      (IA)                  LEFT OPERAND VALUE
                   11564: *      (XR)                  PTR TO ICBLK FOR LEFT OPERAND
                   11565: *      (XL)                  PTR TO ICBLK FOR RIGHT OPERAND
                   11566: *      (XS)                  POPPED TWICE
                   11567: *      (WA,WB,RA)            DESTROYED
                   11568: .IF    .CNRA
                   11569: .ELSE
                   11570: *
                   11571: *      FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
                   11572: *      SPECIFIED BY THE THIRD PARAMETER.
                   11573: *
                   11574: *      (RA)                  LEFT OPERAND VALUE
                   11575: *      (XR)                  PTR TO RCBLK FOR LEFT OPERAND
                   11576: *      (XL)                  PTR TO RCBLK FOR RIGHT OPERAND
                   11577: *      (WA,WB,WC)            DESTROYED
                   11578: *      (XS)                  POPPED TWICE
                   11579: .FI
                   11580:        EJC
                   11581: *
                   11582: *      ARITH (CONTINUED)
                   11583: *
                   11584: *      ENTRY POINT
                   11585: *
                   11586: .IF    .CNRA
                   11587: ARITH  PRC  N,2              ENTRY POINT
                   11588: .ELSE
                   11589: ARITH  PRC  N,3              ENTRY POINT
                   11590: .FI
                   11591:        MOV  (XS)+,XL         LOAD RIGHT OPERAND
                   11592:        MOV  (XS)+,XR         LOAD LEFT OPERAND
                   11593:        MOV  (XL),WA          GET RIGHT OPERAND TYPE WORD
                   11594:        BEQ  WA,=B$ICL,ARTH1  JUMP IF INTEGER
                   11595: .IF    .CNRA
                   11596: .ELSE
                   11597:        BEQ  WA,=B$RCL,ARTH4  JUMP IF REAL
                   11598: .FI
                   11599:        MOV  XR,-(XS)         ELSE REPLACE LEFT ARG ON STACK
                   11600:        MOV  XL,XR            COPY LEFT ARG POINTER
                   11601:        JSR  GTNUM            CONVERT TO NUMERIC
                   11602:        PPM  ARTH6            JUMP IF UNCONVERTIBLE
                   11603:        MOV  XR,XL            ELSE COPY CONVERTED RESULT
                   11604:        MOV  (XL),WA          GET RIGHT OPERAND TYPE WORD
                   11605:        MOV  (XS)+,XR         RELOAD LEFT ARGUMENT
                   11606: .IF    .CNRA
                   11607: .ELSE
                   11608:        BEQ  WA,=B$RCL,ARTH4  JUMP IF RIGHT ARG IS REAL
                   11609: .FI
                   11610: *
                   11611: *      HERE IF RIGHT ARG IS AN INTEGER
                   11612: *
                   11613: ARTH1  BNE  (XR),=B$ICL,ARTH3 JUMP IF LEFT ARG NOT INTEGER
                   11614: *
                   11615: *      EXIT FOR INTEGER CASE
                   11616: *
                   11617: ARTH2  LDI  ICVAL(XR)        LOAD LEFT OPERAND VALUE
                   11618:        EXI                   RETURN TO ARITH CALLER
                   11619: *
                   11620: *      HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
                   11621: *
                   11622: ARTH3  JSR  GTNUM            CONVERT LEFT ARG TO NUMERIC
                   11623:        PPM  ARTH7            JUMP IF NOT CONVERTIBLE
                   11624:        BEQ  WA,=B$ICL,ARTH2  JUMP BACK IF INTEGER-INTEGER
                   11625: .IF    .CNRA
                   11626: .ELSE
                   11627: *
                   11628: *      HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
                   11629: *
                   11630:        MOV  XR,-(XS)         PUT LEFT ARG BACK ON STACK
                   11631:        LDI  ICVAL(XL)        LOAD RIGHT ARGUMENT VALUE
                   11632:        ITR                   CONVERT TO REAL
                   11633:        JSR  RCBLD            GET REAL BLOCK FOR RIGHT ARG, MERGE
                   11634:        MOV  XR,XL            COPY RIGHT ARG PTR
                   11635:        MOV  (XS)+,XR         LOAD LEFT ARGUMENT
                   11636:        BRN  ARTH5            MERGE FOR REAL-REAL CASE
                   11637:        EJC
                   11638: *
                   11639: *      ARITH (CONTINUED)
                   11640: *
                   11641: *      HERE IF RIGHT ARGUMENT IS REAL
                   11642: *
                   11643: ARTH4  BEQ  (XR),=B$RCL,ARTH5 JUMP IF LEFT ARG REAL
                   11644:        JSR  GTREA            ELSE CONVERT TO REAL
                   11645:        PPM  ARTH7            ERROR IF UNCONVERTIBLE
                   11646: *
                   11647: *      HERE FOR REAL-REAL
                   11648: *
                   11649: ARTH5  LDR  RCVAL(XR)        LOAD LEFT OPERAND VALUE
                   11650:        EXI  3                TAKE REAL-REAL EXIT
                   11651: .FI
                   11652: *
                   11653: *      HERE FOR ERROR CONVERTING RIGHT ARGUMENT
                   11654: *
                   11655: ARTH6  ICA  XS               POP UNWANTED LEFT ARG
                   11656:        EXI  2                TAKE APPROPRIATE ERROR EXIT
                   11657: *
                   11658: *      HERE FOR ERROR CONVERTING LEFT OPERAND
                   11659: *
                   11660: ARTH7  EXI  1                TAKE APPROPRIATE ERROR RETURN
                   11661:        ENP                   END PROCEDURE ARITH
                   11662:        EJC
                   11663: *
                   11664: *      ASIGN -- PERFORM ASSIGNMENT
                   11665: *
                   11666: *      ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
                   11667: *      WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
                   11668: *      VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
                   11669: *      ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
                   11670: *      PATTERN AND EXPRESSION VARIABLES.
                   11671: *
                   11672: *      (WB)                  VALUE TO BE ASSIGNED
                   11673: *      (XL)                  BASE POINTER FOR VARIABLE
                   11674: *      (WA)                  OFFSET FOR VARIABLE
                   11675: *      JSR  ASIGN            CALL TO ASSIGN VALUE TO VARIABLE
                   11676: *      PPM  LOC              TRANSFER LOC FOR FAILURE
                   11677: *      (XR,XL,WA,WB,WC)      DESTROYED
                   11678: *      (RA)                  DESTROYED
                   11679: *
                   11680: *      FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
                   11681: *      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
                   11682: *
                   11683: ASIGN  PRC  R,1              ENTRY POINT (RECURSIVE)
                   11684: *
                   11685: *      MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
                   11686: *
                   11687: ASG01  ADD  WA,XL            POINT TO VARIABLE VALUE
                   11688:        MOV  (XL),XR          LOAD VARIABLE VALUE
                   11689:        BEQ  (XR),=B$TRT,ASG02 JUMP IF TRAPPED
                   11690:        MOV  WB,(XL)          ELSE PERFORM ASSIGNMENT
                   11691:        ZER  XL               CLEAR GARBAGE VALUE IN XL
                   11692:        EXI                   AND RETURN TO ASIGN CALLER
                   11693: *
                   11694: *      HERE IF VALUE IS TRAPPED
                   11695: *
                   11696: ASG02  SUB  WA,XL            RESTORE NAME BASE
                   11697:        BEQ  XR,=TRBKV,ASG14  JUMP IF KEYWORD VARIABLE
                   11698:        BNE  XR,=TRBEV,ASG04  JUMP IF NOT EXPRESSION VARIABLE
                   11699: *
                   11700: *      HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
                   11701: *
                   11702:        MOV  EVEXP(XL),XR     POINT TO EXPRESSION
                   11703:        MOV  WB,-(XS)         STORE VALUE TO ASSIGN ON STACK
                   11704:        MOV  =NUM01,WB        SET FOR EVALUATION BY NAME
                   11705:        JSR  EVALX            EVALUATE EXPRESSION BY NAME
                   11706:        PPM  ASG03            JUMP IF EVALUATION FAILS
                   11707:        MOV  (XS)+,WB         ELSE RELOAD VALUE TO ASSIGN
                   11708:        BRN  ASG01            LOOP BACK TO PERFORM ASSIGNMENT
                   11709:        EJC
                   11710: *
                   11711: *      ASIGN (CONTINUED)
                   11712: *
                   11713: *      HERE FOR FAILURE RETURNS
                   11714: *
                   11715: ASG03  ICA  XS               REMOVE STACKED VALUE ENTRY
                   11716: *
                   11717: ASG3A  EXI  1                TAKE FAILURE EXIT
                   11718: *
                   11719: *      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
                   11720: *
                   11721: ASG04  MOV  XR,-(XS)         SAVE PTR TO FIRST TRBLK
                   11722: *
                   11723: *      LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
                   11724: *
                   11725: ASG05  MOV  XR,WC            SAVE PTR TO THIS TRBLK
                   11726:        MOV  TRNXT(XR),XR     POINT TO NEXT TRBLK
                   11727:        BEQ  (XR),=B$TRT,ASG05 LOOP BACK IF ANOTHER TRBLK
                   11728:        MOV  WC,XR            ELSE POINT BACK TO LAST TRBLK
                   11729:        MOV  WB,TRVAL(XR)     STORE VALUE AT END OF CHAIN
                   11730:        MOV  (XS)+,XR         RESTORE PTR TO FIRST TRBLK
                   11731: *
                   11732: *      LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
                   11733: *
                   11734: ASG06  MOV  TRTYP(XR),WB     LOAD TYPE CODE OF TRBLK
                   11735:        BEQ  WB,=TRTVL,ASG08  JUMP IF VALUE TRACE
                   11736:        BEQ  WB,=TRTOU,ASG10  JUMP IF OUTPUT ASSOCIATION
                   11737: *
                   11738: *      HERE TO MOVE TO NEXT TRBLK ON CHAIN
                   11739: *
                   11740: ASG07  MOV  TRNXT(XR),XR     POINT TO NEXT TRBLK ON CHAIN
                   11741:        BEQ  (XR),=B$TRT,ASG06 LOOP BACK IF ANOTHER TRBLK
                   11742:        EXI                   ELSE END OF CHAIN, RETURN TO CALLER
                   11743: *
                   11744: *      HERE TO PROCESS VALUE TRACE
                   11745: *
                   11746: ASG08  BZE  KVTRA,ASG07      IGNORE VALUE TRACE IF TRACE OFF
                   11747:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   11748:        BZE  TRFNC(XR),ASG09  JUMP IF PRINT TRACE
                   11749:        JSR  TRXEQ            ELSE EXECUTE FUNCTION TRACE
                   11750:        BRN  ASG07            AND LOOP BACK
                   11751:        EJC
                   11752: *
                   11753: *      ASIGN (CONTINUED)
                   11754: *
                   11755: *      HERE FOR PRINT TRACE
                   11756: *
                   11757: ASG09  JSR  PRTSN            PRINT STATEMENT NUMBER
                   11758:        JSR  PRTNV            PRINT NAME = VALUE
                   11759:        BRN  ASG07            LOOP BACK FOR NEXT TRBLK
                   11760: *
                   11761: *      HERE FOR OUTPUT ASSOCIATION
                   11762: *
                   11763: ASG10  BZE  KVOUP,ASG07      IGNORE OUTPUT ASSOC IF OUTPUT OFF
                   11764:        MOV  XR,XL            ELSE COPY TRBLK POINTER
                   11765:        MOV  TRVAL(XR),-(XS)  STACK VALUE TO OUTPUT
                   11766:        JSR  GTSTG            CONVERT TO STRING
                   11767:        PPM  ASG12            GET DATATYPE NAME IF UNCONVERTIBLE
                   11768: *
                   11769: *      MERGE WITH STRING FOR OUTPUT
                   11770: *
                   11771: ASG11  MOV  TRTRI(XL),WA     TRTIO BLK PTR
                   11772:        BZE  WA,ASG13         JUMP IF STANDARD OUTPUT FILE
                   11773: *
                   11774: *      HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
                   11775: *
                   11776:        MOV  WA,XL            COPY TRTIO BLOCK PTR TO XL
                   11777:        MOV  TRTAG(XL),WA     GET IOTAG
                   11778:        BZE  WA,ASG3A         FAIL IF ENDFILE DONE
                   11779:        MOV  SCLEN(XR),WC     STRING LENGTH
                   11780:        JSR  SYSOU            CALL SYSTEM OUTPUT ROUTINE
                   11781:        PPM  ASG3A            FAIL RETURN
                   11782:        PPM  EROSI            ERROR RETURN
                   11783:        EXI                   ELSE ALL DONE, RETURN TO CALLER
                   11784: *
                   11785: *      IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
                   11786: *
                   11787: ASG12  JSR  DTYPE            CALL DATATYPE ROUTINE
                   11788:        BRN  ASG11            MERGE
                   11789: *
                   11790: *      HERE TO PRINT A STRING
                   11791: *
                   11792: ASG13  BEQ  TRTER(XL),=V$TER,ASG20 JUMP IF TERMINAL OUTPUT
                   11793:        JSR  PRTSF            PRINT STRING AND FLUSH BUFFER
                   11794:        EXI                   RETURN TO CALLER
                   11795:        EJC
                   11796: *
                   11797: *      ASIGN (CONTINUED)
                   11798: *
                   11799: *      HERE FOR KEYWORD ASSIGNMENT
                   11800: *
                   11801: ASG14  MOV  KVNUM(XL),XL     LOAD KEYWORD NUMBER
                   11802:        BEQ  XL,=K$ETX,ASG19  JUMP IF ERRTEXT
                   11803:        MOV  WB,XR            COPY VALUE TO BE ASSIGNED
                   11804:        JSR  GTINT            CONVERT TO INTEGER
                   11805:        ERR  203,KEYWORD VALUE ASSIGNED IS NOT INTEGER
                   11806:        LDI  ICVAL(XR)        ELSE LOAD VALUE
                   11807:        BEQ  XL,=K$STL,ASG16  JUMP IF SPECIAL CASE OF STLIMIT
                   11808:        BEQ  XL,=K$COD,ASG24  JUMP IF SPECIAL CASE OF CODE
                   11809:        MFI  WA,ASG18         ELSE GET ADDR INTEGER, TEST OVFLOW
                   11810:        BGE  WA,MXLEN,ASG18   FAIL IF TOO LARGE
                   11811:        BEQ  XL,=K$ERT,ASG17  JUMP IF SPECIAL CASE OF ERRTYPE
                   11812: .IF    .CNPF
                   11813: .ELSE
                   11814:        BEQ  XL,=K$PFL,ASG21  JUMP IF SPECIAL CASE OF PROFILE
                   11815: .FI
                   11816:        BLT  XL,=K$P$$,ASG15  JUMP UNLESS PROTECTED
                   11817:        ERB  204,KEYWORD IN ASSIGNMENT IS PROTECTED
                   11818: *
                   11819: *      HERE TO DO ASSIGNMENT IF NOT PROTECTED
                   11820: *
                   11821: ASG15  MOV  WA,KVANC(XL)     STORE NEW VALUE
                   11822:        EXI                   RETURN TO ASIGN CALLER
                   11823: *
                   11824: *      HERE FOR SPECIAL CASE OF STLIMIT
                   11825: *
                   11826: *      SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
                   11827: *      IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
                   11828: *
                   11829: ASG16  SBI  KVSTL            SUBTRACT OLD LIMIT
                   11830:        ADI  KVSTC            ADD OLD COUNTER
                   11831:        STI  KVSTC            STORE NEW COUNTER VALUE
                   11832:        LDI  ICVAL(XR)        RELOAD NEW LIMIT VALUE
                   11833:        STI  KVSTL            STORE NEW LIMIT VALUE
                   11834:        EXI                   RETURN TO ASIGN CALLER
                   11835:        EJC
                   11836: *
                   11837: *      ASIGN (CONTINUED)
                   11838: *
                   11839: *      HERE FOR SPECIAL CASE OF ERRTYPE
                   11840: *
                   11841: ASG17  BLE  WA,=NINI9,ERROR  OK TO SIGNAL IF IN RANGE
                   11842: *
                   11843: *      HERE IF VALUE ASSIGNED IS OUT OF RANGE
                   11844: *
                   11845: ASG18  ERB  205,KEYWORD VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
                   11846: *
                   11847: *      HERE FOR SPECIAL CASE OF ERRTEXT
                   11848: *
                   11849: ASG19  MOV  WB,-(XS)         STACK VALUE
                   11850:        JSR  GTSTG            CONVERT TO STRING
                   11851:        ERR  206,VALUE ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
                   11852:        MOV  XR,R$ETX         MAKE ASSIGNMENT
                   11853:        EXI                   RETURN TO CALLER
                   11854: *
                   11855: *      PRINT STRING TO TERMINAL
                   11856: *
                   11857: ASG20  JSR  PTTST            PRINT STRING TO TERMINAL
                   11858:        JSR  PTTFH            FLUSH TERMINAL BUFFER
                   11859:        EXI                   RETURN
                   11860: .IF    .CNPF
                   11861: .ELSE
                   11862: *      HERE FOR KEYWORD PROFILE
                   11863: *
                   11864: ASG21  BGT  WA,=NUM02,ASG18  MOAN IF NOT 0,1, OR 2
                   11865:        BZE  WA,ASG15         JUST ASSIGN IF ZERO
                   11866:        BZE  PFDMP,ASG22      BRANCH IF FIRST ASSIGNMENT
                   11867:        BEQ  WA,PFDMP,ASG23   ALSO IF SAME VALUE AS BEFORE
                   11868:        ERB  207,INCONSISTENT VALUE ASSIGNED TO KEYWORD PROFILE
                   11869: *
                   11870: ASG22  MOV  WA,PFDMP         NOTE VALUE ON FIRST ASSIGNMENT
                   11871: ASG23  JSR  SYSTM            GET THE TIME
                   11872:        STI  PFSTM            FUDGE SOME KIND OF START TIME
                   11873:        BRN  ASG15            AND GO ASSIGN
                   11874: .FI
                   11875: *
                   11876: *      HERE FOR KEYWORD ASSIGNMENT TO CODE
                   11877: *
                   11878: ASG24  STI  KVCOD            STORE VALUE
                   11879:        EXI                   RETURN TO CALLER
                   11880:        ENP                   END PROCEDURE ASIGN
                   11881:        EJC
                   11882: *
                   11883: *      ASINP -- ASSIGN DURING PATTERN MATCH
                   11884: *
                   11885: *      ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
                   11886: *      AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
                   11887: *      VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
                   11888: *
                   11889: *      (XL)                  BASE POINTER FOR VARIABLE
                   11890: *      (WA)                  OFFSET FOR VARIABLE
                   11891: *      (WB)                  VALUE TO BE ASSIGNED
                   11892: *      JSR  ASINP            CALL TO ASSIGN VALUE TO VARIABLE
                   11893: *      PPM  LOC              TRANSFER LOC IF FAILURE
                   11894: *      (XR,XL)               DESTROYED
                   11895: *      (WA,WB,WC,RA)         DESTROYED
                   11896: *
                   11897: ASINP  PRC  R,1              ENTRY POINT, RECURSIVE
                   11898:        ADD  WA,XL            POINT TO VARIABLE
                   11899:        MOV  (XL),XR          LOAD CURRENT CONTENTS
                   11900:        BEQ  (XR),=B$TRT,ASNP1 JUMP IF TRAPPED
                   11901:        MOV  WB,(XL)          ELSE PERFORM ASSIGNMENT
                   11902:        ZER  XL               CLEAR GARBAGE VALUE IN XL
                   11903:        EXI                   RETURN TO ASINP CALLER
                   11904: *
                   11905: *      HERE IF VARIABLE IS TRAPPED
                   11906: *
                   11907: ASNP1  SUB  WA,XL            RESTORE BASE POINTER
                   11908:        MOV  PMSSL,-(XS)      STACK SUBJECT STRING LENGTH
                   11909:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE PTR
                   11910:        MOV  R$PMS,-(XS)      STACK SUBJECT STRING POINTER
                   11911:        MOV  PMDFL,-(XS)      STACK DOT FLAG
                   11912:        JSR  ASIGN            CALL FULL-BLOWN ASSIGNMENT ROUTINE
                   11913:        PPM  ASNP2            JUMP IF FAILURE
                   11914:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   11915:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   11916:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   11917:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   11918:        EXI                   RETURN TO ASINP CALLER
                   11919: *
                   11920: *      HERE IF FAILURE IN ASIGN CALL
                   11921: *
                   11922: ASNP2  MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   11923:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   11924:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   11925:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   11926:        EXI  1                TAKE FAILURE EXIT
                   11927:        ENP                   END PROCEDURE ASINP
                   11928:        EJC
                   11929: *
                   11930: *      BLKLN -- DETERMINE LENGTH OF BLOCK
                   11931: *
                   11932: *      BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
                   11933: *
                   11934: *      (WA)                  FIRST WORD OF BLOCK
                   11935: *      (XR)                  POINTER TO BLOCK
                   11936: *      JSR  BLKLN            CALL TO GET BLOCK LENGTH
                   11937: *      (WA)                  LENGTH OF BLOCK IN BAUS
                   11938: *      (XL)                  DESTROYED
                   11939: *
                   11940: *      BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
                   11941: *      PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
                   11942: *
                   11943: *      THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
                   11944: *      BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
                   11945: *
                   11946: BLKLN  PRC  E,0              ENTRY POINT
                   11947:        MOV  WA,XL            COPY FIRST WORD
                   11948:        LEI  XL               GET ENTRY ID (BL$XX)
                   11949:        BSW  XL,BL$$$,BLN00   SWITCH ON BLOCK TYPE
                   11950:        IFF  BL$AR,BLN01      ARBLK
                   11951:        IFF  BL$CD,BLN01      CDBLK
                   11952:        IFF  BL$CO,BLN12      COBLK
                   11953:        IFF  BL$DF,BLN01      DFBLK
                   11954:        IFF  BL$EF,BLN01      EFBLK
                   11955:        IFF  BL$EX,BLN01      EXBLK
                   11956:        IFF  BL$PF,BLN01      PFBLK
                   11957:        IFF  BL$TB,BLN01      TBBLK
                   11958:        IFF  BL$VC,BLN01      VCBLK
                   11959:        IFF  BL$EV,BLN03      EVBLK
                   11960:        IFF  BL$KV,BLN03      KVBLK
                   11961:        IFF  BL$P0,BLN02      P0BLK
                   11962:        IFF  BL$SE,BLN02      SEBLK
                   11963:        IFF  BL$NM,BLN03      NMBLK
                   11964:        IFF  BL$P1,BLN03      P1BLK
                   11965:        IFF  BL$P2,BLN04      P2BLK
                   11966:        IFF  BL$TE,BLN04      TEBLK
                   11967:        IFF  BL$FF,BLN05      FFBLK
                   11968:        IFF  BL$TR,BLN05      TRBLK
                   11969:        IFF  BL$CT,BLN06      CTBLK
                   11970:        IFF  BL$IC,BLN07      ICBLK
                   11971:        IFF  BL$PD,BLN08      PDBLK
                   11972: .IF    .CNBF
                   11973: .ELSE
                   11974:        IFF  BL$BC,BLN04      BCBLK
                   11975:        IFF  BL$BF,BLN11      BFBLK
                   11976: .FI
                   11977: .IF    .CNRA
                   11978: .ELSE
                   11979:        IFF  BL$RC,BLN09      RCBLK
                   11980: .FI
                   11981:        IFF  BL$SC,BLN10      SCBLK
                   11982:        ESW                   END OF JUMP TABLE ON BLOCK TYPE
                   11983:        EJC
                   11984: *
                   11985: *      BLKLN (CONTINUED)
                   11986: *
                   11987: *      HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
                   11988: *
                   11989: BLN00  MOV  1(XR),WA         LOAD LENGTH
                   11990:        EXI                   RETURN TO BLKLN CALLER
                   11991: *
                   11992: *      HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
                   11993: *
                   11994: BLN01  MOV  2(XR),WA         LOAD LENGTH FROM THIRD WORD
                   11995:        EXI                   RETURN TO BLKLN CALLER
                   11996: *
                   11997: *      HERE FOR TWO WORD BLOCKS (P0,SE)
                   11998: *
                   11999: BLN02  MOV  *NUM02,WA        LOAD LENGTH (TWO WORDS)
                   12000:        EXI                   RETURN TO BLKLN CALLER
                   12001: *
                   12002: *      HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
                   12003: *
                   12004: BLN03  MOV  *NUM03,WA        LOAD LENGTH (THREE WORDS)
                   12005:        EXI                   RETURN TO BLKLN CALLER
                   12006: *
                   12007: *      HERE FOR FOUR WORD BLOCKS (P2,TE)
                   12008: *
                   12009: BLN04  MOV  *NUM04,WA        LOAD LENGTH (FOUR WORDS)
                   12010:        EXI                   RETURN TO BLKLN CALLER
                   12011: *
                   12012: *      HERE FOR FIVE WORD BLOCKS (FF,TR)
                   12013: *
                   12014: BLN05  MOV  *NUM05,WA        LOAD LENGTH
                   12015:        EXI                   RETURN TO BLKLN CALLER
                   12016:        EJC
                   12017: *
                   12018: *      BLKLN (CONTINUED)
                   12019: *
                   12020: *      HERE FOR CTBLK
                   12021: *
                   12022: BLN06  MOV  *CTSI$,WA        SET SIZE OF CTBLK
                   12023:        EXI                   RETURN TO BLKLN CALLER
                   12024: *
                   12025: *      HERE FOR ICBLK
                   12026: *
                   12027: BLN07  MOV  *ICSI$,WA        SET SIZE OF ICBLK
                   12028:        EXI                   RETURN TO BLKLN CALLER
                   12029: *
                   12030: *      HERE FOR PDBLK
                   12031: *
                   12032: BLN08  MOV  PDDFP(XR),XL     POINT TO DFBLK
                   12033:        MOV  DFPDL(XL),WA     LOAD PDBLK LENGTH FROM DFBLK
                   12034:        EXI                   RETURN TO BLKLN CALLER
                   12035: .IF    .CNRA
                   12036: .ELSE
                   12037: *
                   12038: *      HERE FOR RCBLK
                   12039: *
                   12040: BLN09  MOV  *RCSI$,WA        SET SIZE OF RCBLK
                   12041:        EXI                   RETURN TO BLKLN CALLER
                   12042: .FI
                   12043: *
                   12044: *      HERE FOR SCBLK
                   12045: *
                   12046: BLN10  MOV  SCLEN(XR),WA     LOAD LENGTH IN CHARACTERS
                   12047:        CTB  WA,SCSI$         CALCULATE LENGTH IN BAUS
                   12048:        EXI                   RETURN TO BLKLN CALLER
                   12049: .IF    .CNBF
                   12050: .ELSE
                   12051: *
                   12052: *      HERE FOR BFBLK
                   12053: *
                   12054: BLN11  MOV  BFALC(XR),WA     GET ALLOCATION IN BAUS
                   12055:        CTB  WA,BFSI$         CALCULATE LENGTH IN BAUS
                   12056:        EXI                   RETURN TO BLKLN CALLER
                   12057: .FI
                   12058: *
                   12059: *      HERE FOR COBLK
                   12060: *
                   12061: BLN12  MOV  *COSI$,WA        GET SIZE IN BAUS
                   12062:        EXI                   RETURN TO BLKLN CALLER
                   12063:        ENP                   END PROCEDURE BLKLN
                   12064:        EJC
                   12065: *
                   12066: *      CBLCK -- COPY A BLOCK
                   12067: *
                   12068: *      (XS)                  BLOCK TO BE COPIED
                   12069: *      JSR  CBLCK            CALL TO COPY BLOCK
                   12070: *      PPM  LOC              RETURN IF BLOCK HAS NO IDVAL FIELD
                   12071: *                            NORMAL RETURN IF IDVAL FIELD
                   12072: *      (XR)                  COPY OF BLOCK
                   12073: *      (XS)                  POPPED
                   12074: *      (XL,WA,WB,WC)         DESTROYED
                   12075: *
                   12076: CBLCK  PRC  N,1              ENTRY POINT
                   12077:        MOV  (XS),XR          LOAD ARGUMENT
                   12078:        BEQ  XR,=NULLS,CBL10  RETURN ARGUMENT IF IT IS NULL
                   12079:        MOV  (XR),WA          ELSE LOAD TYPE WORD
                   12080:        MOV  WA,WB            COPY TYPE WORD
                   12081:        JSR  BLKLN            GET LENGTH OF ARGUMENT BLOCK
                   12082:        MOV  XR,XL            COPY POINTER
                   12083:        JSR  ALLOC            ALLOCATE BLOCK OF SAME SIZE
                   12084:        MOV  XR,(XS)          STORE POINTER TO COPY
                   12085:        MVW                   COPY CONTENTS OF OLD BLOCK TO NEW
                   12086:        MOV  (XS),XR          RELOAD POINTER TO START OF COPY
                   12087:        BEQ  WB,=B$TBT,CBL05  JUMP IF TABLE
                   12088:        BEQ  WB,=B$VCT,CBL01  JUMP IF VECTOR
                   12089:        BEQ  WB,=B$PDT,CBL01  JUMP IF PROGRAM DEFINED
                   12090: .IF    .CNBF
                   12091: .ELSE
                   12092:        BEQ  WB,=B$BCT,CBL11  JUMP IF BUFFER
                   12093: .FI
                   12094:        BNE  WB,=B$ART,CBL10  RETURN COPY IF NOT ARRAY
                   12095: *
                   12096: *      HERE FOR ARRAY (ARBLK)
                   12097: *
                   12098:        ADD  AROFS(XR),XR     POINT TO PROTOTYPE FIELD
                   12099:        BRN  CBL02            JUMP TO MERGE
                   12100: *
                   12101: *      HERE FOR VECTOR, PROGRAM DEFINED
                   12102: *
                   12103: CBL01  ADD  *PDFLD,XR        POINT TO PDFLD = VCVLS
                   12104: *
                   12105: *      MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
                   12106: *      BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
                   12107: *
                   12108: CBL02  MOV  (XR),XL          LOAD NEXT POINTER
                   12109: *
                   12110: *      LOOP TO GET VALUE AT END OF TRBLK CHAIN
                   12111: *
                   12112: CBL03  BNE  (XL),=B$TRT,CBL04 JUMP IF NOT TRAPPED
                   12113:        MOV  TRVAL(XL),XL     ELSE POINT TO NEXT VALUE
                   12114:        BRN  CBL03            AND LOOP BACK
                   12115:        EJC
                   12116: *
                   12117: *      CBLCK (CONTINUED)
                   12118: *
                   12119: *      HERE WITH UNTRAPPED VALUE IN XL
                   12120: *
                   12121: CBL04  MOV  XL,(XR)+         STORE REAL VALUE, BUMP POINTER
                   12122:        BNE  XR,DNAMP,CBL02   LOOP BACK IF MORE TO GO
                   12123:        BRN  CBL09            ELSE JUMP TO EXIT
                   12124: *
                   12125: *      HERE TO COPY A TABLE
                   12126: *
                   12127: CBL05  ZER  IDVAL(XR)        ZERO ID TO STOP DUMP BLOWING UP
                   12128:        MOV  *TESI$,WA        SET SIZE OF TEBLK
                   12129:        MOV  *TBBUK,WC        SET INITIAL OFFSET
                   12130: *
                   12131: *      LOOP THROUGH BUCKETS IN TABLE
                   12132: *
                   12133: CBL06  MOV  (XS),XR          LOAD TABLE POINTER
                   12134:        BEQ  WC,TBLEN(XR),CBL09 JUMP TO EXIT IF ALL DONE
                   12135:        ADD  WC,XR            ELSE POINT TO NEXT BUCKET HEADER
                   12136:        ICA  WC               BUMP OFFSET
                   12137:        SUB  *TENXT,XR        SUBTRACT LINK OFFSET TO MERGE
                   12138: *
                   12139: *      LOOP THROUGH TEBLKS ON ONE CHAIN
                   12140: *
                   12141: CBL07  MOV  TENXT(XR),XL     LOAD POINTER TO NEXT TEBLK
                   12142:        MOV  (XS),TENXT(XR)   SET END OF CHAIN POINTER IN CASE
                   12143:        BEQ  (XL),=B$TBT,CBL06 BACK FOR NEXT BUCKET IF CHAIN END
                   12144:        MOV  XR,-(XS)         ELSE STACK PTR TO PREVIOUS BLOCK
                   12145:        MOV  *TESI$,WA        SET SIZE OF TEBLK
                   12146:        JSR  ALLOC            ALLOCATE NEW TEBLK
                   12147:        MOV  XR,WB            SAVE PTR TO NEW TEBLK
                   12148:        MVW                   COPY OLD TEBLK TO NEW TEBLK
                   12149:        MOV  WB,XR            RESTORE POINTER TO NEW TEBLK
                   12150:        MOV  (XS)+,XL         RESTORE POINTER TO PREVIOUS BLOCK
                   12151:        MOV  XR,TENXT(XL)     LINK NEW BLOCK TO PREVIOUS
                   12152:        MOV  XR,XL            COPY POINTER TO NEW BLOCK
                   12153: *
                   12154: *      LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
                   12155: *
                   12156: CBL08  MOV  TEVAL(XL),XL     LOAD VALUE
                   12157:        BEQ  (XL),=B$TRT,CBL08 LOOP BACK IF TRAPPED
                   12158:        MOV  XL,TEVAL(XR)     STORE UNTRAPPED VALUE IN TEBLK
                   12159:        BRN  CBL07            BACK FOR NEXT TEBLK
                   12160: *
                   12161: *      COMMON EXIT POINT
                   12162: *
                   12163: CBL09  MOV  (XS)+,XR         LOAD POINTER TO BLOCK
                   12164:        EXI                   RETURN
                   12165: *
                   12166: *      ALTERNATIVE RETURN
                   12167: *
                   12168: CBL10  EXI  1                RETURN
                   12169: .IF    .CNBF
                   12170: .ELSE
                   12171:        EJC
                   12172: *
                   12173: *      HERE TO COPY BUFFER
                   12174: *
                   12175: CBL11  MOV  BCBUF(XR),XL     GET BFBLK PTR
                   12176:        MOV  BFALC(XL),WA     GET ALLOCATION
                   12177:        CTB  WA,BFSI$         SET TOTAL SIZE
                   12178:        MOV  XR,XL            SAVE BCBLK PTR
                   12179:        JSR  ALLOC            ALLOCATE BFBLK
                   12180:        MOV  BCBUF(XL),WB     GET OLD BFBLK
                   12181:        MOV  XR,BCBUF(XL)     SET POINTER TO NEW BFBLK
                   12182:        MOV  WB,XL            POINT TO OLD BFBLK
                   12183:        MVW                   COPY BFBLK TOO
                   12184:        ZER  XL               CLEAR RUBBISH PTR
                   12185:        BRN  CBL09            BRANCH TO EXIT
                   12186: .FI
                   12187:        ENP                   END PROCEDURE CBLCK
                   12188:        EJC
                   12189: *
                   12190: *      CDGCG -- GENERATE CODE FOR COMPLEX GOTO
                   12191: *
                   12192: *      USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
                   12193: *
                   12194: *      (WB)                  MUST BE COLLECTABLE
                   12195: *      (XR)                  EXPRESSION POINTER
                   12196: *      JSR  CDGCG            CALL TO GENERATE COMPLEX GOTO
                   12197: *      (XL,XR,WA)            DESTROYED
                   12198: *
                   12199: CDGCG  PRC  E,0              ENTRY POINT
                   12200:        MOV  CMOPN(XR),XL     GET UNARY GOTO OPERATOR
                   12201:        MOV  CMROP(XR),XR     POINT TO GOTO OPERAND
                   12202:        BEQ  XL,=OPDVD,CDGC2  JUMP IF DIRECT GOTO
                   12203:        JSR  CDGNM            GENERATE OPND BY NAME IF NOT DIRECT
                   12204: *
                   12205: *      RETURN POINT
                   12206: *
                   12207: CDGC1  MOV  XL,WA            GOTO OPERATOR
                   12208:        JSR  CDWRD            GENERATE IT
                   12209:        EXI                   RETURN TO CALLER
                   12210: *
                   12211: *      DIRECT GOTO
                   12212: *
                   12213: CDGC2  JSR  CDGVL            GENERATE OPERAND BY VALUE
                   12214:        BRN  CDGC1            MERGE TO RETURN
                   12215:        ENP                   END PROCEDURE CDGCG
                   12216:        EJC
                   12217: *
                   12218: *      CDGEX -- BUILD EXPRESSION BLOCK
                   12219: *
                   12220: *      CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
                   12221: *      EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
                   12222: *
                   12223: *      (WC)                  SOME COLLECTABLE VALUE
                   12224: *      (WB)                  INTEGER IN RANGE 0 LE X LE MXLEN
                   12225: *      (XL)                  PTR TO EXPRESSION TREE
                   12226: *      JSR  CDGEX            CALL TO BUILD EXPRESSION
                   12227: *      (XR)                  PTR TO SEBLK OR EXBLK
                   12228: *      (XL,WA,WB)            DESTROYED
                   12229: *
                   12230: CDGEX  PRC  R,0              ENTRY POINT, RECURSIVE
                   12231:        BLO  (XL),=B$VR$,CDGX1 JUMP IF NOT VARIABLE
                   12232: *
                   12233: *      HERE FOR NATURAL VARIABLE, BUILD SEBLK
                   12234: *
                   12235:        MOV  *SESI$,WA        SET SIZE OF SEBLK
                   12236:        JSR  ALLOC            ALLOCATE SPACE FOR SEBLK
                   12237:        MOV  =B$SEL,(XR)      SET TYPE WORD
                   12238:        MOV  XL,SEVAR(XR)     STORE VRBLK POINTER
                   12239:        EXI                   RETURN TO CDGEX CALLER
                   12240: *
                   12241: *      HERE IF NOT VARIABLE, BUILD EXBLK
                   12242: *
                   12243: CDGX1  MOV  XL,XR            COPY TREE POINTER
                   12244:        MOV  WC,-(XS)         SAVE WC
                   12245:        MOV  CWCOF,XL         SAVE CURRENT OFFSET
                   12246:        MOV  (XR),WA          GET TYPE WORD
                   12247:        BNE  WA,=B$CMT,CDGX2  CALL BY VALUE IF NOT CMBLK
                   12248:        BGE  CMTYP(XR),=C$$NM,CDGX2 JUMP IF CMBLK ONLY BY VALUE
                   12249:        EJC
                   12250: *
                   12251: *      CDGEX (CONTINUED)
                   12252: *
                   12253: *      HERE IF EXPRESSION CAN BE EVALUATED BY NAME
                   12254: *
                   12255:        JSR  CDGNM            GENERATE CODE BY NAME
                   12256:        MOV  =ORNM$,WA        LOAD RETURN BY NAME WORD
                   12257:        BRN  CDGX3            MERGE WITH VALUE CASE
                   12258: *
                   12259: *      HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
                   12260: *
                   12261: CDGX2  JSR  CDGVL            GENERATE CODE BY VALUE
                   12262:        MOV  =ORVL$,WA        LOAD RETURN BY VALUE WORD
                   12263: *
                   12264: *      MERGE HERE TO CONSTRUCT EXBLK
                   12265: *
                   12266: CDGX3  JSR  CDWRD            GENERATE RETURN WORD
                   12267:        JSR  EXBLD            BUILD EXBLK
                   12268:        MOV  (XS)+,WC         RESTORE WC
                   12269:        EXI                   RETURN TO CDGEX CALLER
                   12270:        ENP                   END PROCEDURE CDGEX
                   12271:        EJC
                   12272: *
                   12273: *      CDGNM -- GENERATE CODE BY NAME
                   12274: *
                   12275: *      CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
                   12276: *      GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
                   12277: *      DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
                   12278: *      TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
                   12279: *
                   12280: *      CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
                   12281: *      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
                   12282: *
                   12283: *      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
                   12284: *      (XR)                  PTR TO TREE GENERATED BY EXPAN
                   12285: *      (WC)                  CONSTANT FLAG (SEE BELOW)
                   12286: *      JSR  CDGNM            CALL TO GENERATE CODE BY NAME
                   12287: *      (XR,WA)               DESTROYED
                   12288: *      (WC)                  SET NON-ZERO IF NON-CONSTANT
                   12289: *
                   12290: *      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
                   12291: *      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
                   12292: *      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
                   12293: *
                   12294: *      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
                   12295: *
                   12296: CDGNM  PRC  R,0              ENTRY POINT, RECURSIVE
                   12297:        MOV  XL,-(XS)         SAVE ENTRY XL
                   12298:        MOV  WB,-(XS)         SAVE ENTRY WB
                   12299:        CHK                   CHECK FOR STACK OVERFLOW
                   12300:        MOV  (XR),WA          LOAD TYPE WORD
                   12301:        BEQ  WA,=B$CMT,CGN04  JUMP IF CMBLK
                   12302:        BHI  WA,=B$VR$,CGN02  JUMP IF SIMPLE VARIABLE
                   12303: *
                   12304: *      MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
                   12305: *
                   12306: CGN01  ERB  208,SYNTAX ERROR. VALUE USED WHERE NAME IS REQUIRED
                   12307: *
                   12308: *      HERE FOR NATURAL VARIABLE REFERENCE
                   12309: *
                   12310: CGN02  MOV  =OLVN$,WA        LOAD VARIABLE LOAD CALL
                   12311:        JSR  CDWRD            GENERATE IT
                   12312:        MOV  XR,WA            COPY VRBLK POINTER
                   12313:        JSR  CDWRD            GENERATE VRBLK POINTER
                   12314:        EJC
                   12315: *
                   12316: *      CDGNM (CONTINUED)
                   12317: *
                   12318: *      HERE TO EXIT WITH WC SET CORRECTLY
                   12319: *
                   12320: CGN03  MOV  (XS)+,WB         RESTORE ENTRY WB
                   12321:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   12322:        EXI                   RETURN TO CDGNM CALLER
                   12323: *
                   12324: *      HERE FOR CMBLK
                   12325: *
                   12326: CGN04  MOV  XR,XL            COPY CMBLK POINTER
                   12327:        MOV  CMTYP(XR),XR     LOAD CMBLK TYPE
                   12328:        BGE  XR,=C$$NM,CGN01  ERROR IF NOT NAME OPERAND
                   12329:        BSW  XR,C$$NM         ELSE SWITCH ON TYPE
                   12330:        IFF  C$ARR,CGN05      ARRAY REFERENCE
                   12331:        IFF  C$FNC,CGN08      FUNCTION CALL
                   12332:        IFF  C$DEF,CGN09      DEFERRED EXPRESSION
                   12333:        IFF  C$IND,CGN10      INDIRECT REFERENCE
                   12334:        IFF  C$KEY,CGN11      KEYWORD REFERENCE
                   12335:        IFF  C$UBO,CGN08      UNDEFINED BINARY OP
                   12336:        IFF  C$UUO,CGN08      UNDEFINED UNARY OP
                   12337:        ESW                   END SWITCH ON CMBLK TYPE
                   12338: *
                   12339: *      HERE TO GENERATE CODE FOR ARRAY REFERENCE
                   12340: *
                   12341: CGN05  MOV  *CMOPN,WB        POINT TO ARRAY OPERAND
                   12342: *
                   12343: *      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
                   12344: *
                   12345: CGN06  JSR  CMGEN            GENERATE CODE FOR NEXT OPERAND
                   12346:        MOV  CMLEN(XL),WC     LOAD LENGTH OF CMBLK
                   12347:        BLT  WB,WC,CGN06      LOOP TILL ALL GENERATED
                   12348: *
                   12349: *      GENERATE APPROPRIATE ARRAY CALL
                   12350: *
                   12351:        MOV  =OAON$,WA        LOAD ONE-SUBSCRIPT CASE CALL
                   12352:        BEQ  WC,*CMAR1,CGN07  JUMP TO EXIT IF ONE SUBSCRIPT CASE
                   12353:        MOV  =OAMN$,WA        ELSE LOAD MULTI-SUBSCRIPT CASE CALL
                   12354:        JSR  CDWRD            GENERATE CALL
                   12355:        MOV  WC,WA            COPY CMBLK LENGTH
                   12356:        BTW  WA               CONVERT TO WORDS
                   12357:        SUB  =CMVLS,WA        CALCULATE NUMBER OF SUBSCRIPTS
                   12358:        EJC
                   12359: *
                   12360: *      CDGNM (CONTINUED)
                   12361: *
                   12362: *      HERE TO EXIT GENERATING WORD (NON-CONSTANT)
                   12363: *
                   12364: CGN07  MNZ  WC               SET RESULT NON-CONSTANT
                   12365:        JSR  CDWRD            GENERATE WORD
                   12366:        BRN  CGN03            BACK TO EXIT
                   12367: *
                   12368: *      HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
                   12369: *
                   12370: CGN08  MOV  XL,XR            COPY CMBLK POINTER
                   12371:        JSR  CDGVL            GEN CODE BY VALUE FOR CALL
                   12372:        MOV  =OFNE$,WA        GET EXTRA CALL FOR BY NAME
                   12373:        BRN  CGN07            BACK TO GENERATE AND EXIT
                   12374: *
                   12375: *      HERE TO GENERATE CODE FOR DEFERED EXPRESSION
                   12376: *
                   12377: CGN09  MOV  CMROP(XL),XR     CHECK IF VARIABLE
                   12378:        BHI  (XR),=B$VR$,CGN02 TREAT *VARIABLE AS SIMPLE VAR
                   12379:        MOV  XR,XL            COPY PTR TO EXPRESSION TREE
                   12380:        JSR  CDGEX            ELSE BUILD EXBLK
                   12381:        MOV  =OLEX$,WA        SET CALL TO LOAD EXPR BY NAME
                   12382:        JSR  CDWRD            GENERATE IT
                   12383:        MOV  XR,WA            COPY EXBLK POINTER
                   12384:        JSR  CDWRD            GENERATE EXBLK POINTER
                   12385:        BRN  CGN03            BACK TO EXIT
                   12386: *
                   12387: *      HERE TO GENERATE CODE FOR INDIRECT REFERENCE
                   12388: *
                   12389: CGN10  MOV  CMROP(XL),XR     GET OPERAND
                   12390:        JSR  CDGVL            GENERATE CODE BY VALUE FOR IT
                   12391:        MOV  =OINN$,WA        LOAD CALL FOR INDIRECT BY NAME
                   12392:        BRN  CGN12            MERGE
                   12393: *
                   12394: *      HERE TO GENERATE CODE FOR KEYWORD REFERENCE
                   12395: *
                   12396: CGN11  MOV  CMROP(XL),XR     GET OPERAND
                   12397:        JSR  CDGNM            GENERATE CODE BY NAME FOR IT
                   12398:        MOV  =OKWN$,WA        LOAD CALL FOR KEYWORD BY NAME
                   12399: *
                   12400: *      KEYWORD, INDIRECT MERGE HERE
                   12401: *
                   12402: CGN12  JSR  CDWRD            GENERATE CODE FOR OPERATOR
                   12403:        BRN  CGN03            EXIT
                   12404:        ENP                   END PROCEDURE CDGNM
                   12405:        EJC
                   12406: *
                   12407: *      CDGVL -- GENERATE CODE BY VALUE
                   12408: *
                   12409: *      CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
                   12410: *      GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
                   12411: *      DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
                   12412: *      TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
                   12413: *
                   12414: *      CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
                   12415: *      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
                   12416: *
                   12417: *      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
                   12418: *      (XR)                  PTR TO TREE GENERATED BY EXPAN
                   12419: *      (WC)                  CONSTANT FLAG (SEE BELOW)
                   12420: *      JSR  CDGVL            CALL TO GENERATE CODE BY VALUE
                   12421: *      (XR,WA)               DESTROYED
                   12422: *      (WC)                  SET NON-ZERO IF NON-CONSTANT
                   12423: *
                   12424: *      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
                   12425: *      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
                   12426: *      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
                   12427: *
                   12428: *      IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
                   12429: *      ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
                   12430: *
                   12431: *      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
                   12432: *
                   12433: CDGVL  PRC  R,0              ENTRY POINT, RECURSIVE
                   12434:        MOV  (XR),WA          LOAD TYPE WORD
                   12435:        BEQ  WA,=B$CMT,CGV01  JUMP IF CMBLK
                   12436:        BLT  WA,=B$VRA,CGV00  JUMP IF ICBLK, RCBLK, SCBLK
                   12437: *
                   12438: *      HERE FOR VARIABLE VALUE REFERENCE
                   12439: *
                   12440: CGVL0  MNZ  WC               INDICATE NON-CONSTANT VALUE
                   12441: *
                   12442: *      MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
                   12443: *      AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
                   12444: *
                   12445: CGV00  MOV  XR,WA            COPY PTR TO VAR OR CONSTANT
                   12446:        JSR  CDWRD            GENERATE AS CODE WORD
                   12447:        EXI                   RETURN TO CALLER
                   12448:        EJC
                   12449: *
                   12450: *      CDGVL (CONTINUED)
                   12451: *
                   12452: *      HERE FOR TREE NODE (CMBLK)
                   12453: *
                   12454: CGV01  MOV  WB,-(XS)         SAVE ENTRY WB
                   12455:        MOV  XL,-(XS)         SAVE ENTRY XL
                   12456:        MOV  WC,-(XS)         SAVE ENTRY CONSTANT FLAG
                   12457:        MOV  CWCOF,-(XS)      SAVE INITIAL CODE OFFSET
                   12458:        CHK                   CHECK FOR STACK OVERFLOW
                   12459: *
                   12460: *      PREPARE TO GENERATE CODE FOR CMBLK. WC IS CLEARED TO
                   12461: *      START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
                   12462: *      CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
                   12463: *      THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
                   12464: *
                   12465:        MOV  XR,XL            COPY CMBLK POINTER
                   12466:        MOV  CMTYP(XR),XR     LOAD CMBLK TYPE
                   12467:        ZER  WC               CLEAR OPTIMISE FLAG
                   12468:        BLE  XR,=C$PR$,CGV02  JUMP IF NOT PREDICATE VALUE
                   12469:        MNZ  WC               ELSE FORCE NON-CONSTANT CASE
                   12470: *
                   12471: *      HERE WITH WC SET APPROPRIATELY
                   12472: *
                   12473: CGV02  BSW  XR,C$$NV         SWITCH TO APPROPRIATE GENERATOR
                   12474:        IFF  C$ARR,CGV03      ARRAY REFERENCE
                   12475:        IFF  C$FNC,CGV05      FUNCTION CALL
                   12476:        IFF  C$DEF,CGV14      DEFERRED EXPRESSION
                   12477:        IFF  C$SEL,CGV15      SELECTION
                   12478:        IFF  C$IND,CGV31      INDIRECT REFERENCE
                   12479:        IFF  C$KEY,CGV27      KEYWORD REFERENCE
                   12480:        IFF  C$UBO,CGV29      UNDEFINED BINOP
                   12481:        IFF  C$UUO,CGV30      UNDEFINED UNOP
                   12482:        IFF  C$BVL,CGV18      BINOPS WITH VAL OPDS
                   12483:        IFF  C$ALT,CGV18      ALTERNATION
                   12484:        IFF  C$UVL,CGV19      UNOPS WITH VALU OPND
                   12485:        IFF  C$ASS,CGV21      ASSIGNMENT
                   12486:        IFF  C$CNC,CGV24      CONCATENATION
                   12487:        IFF  C$UNM,CGV27      UNOPS WITH NAME OPND
                   12488:        IFF  C$CNP,CGV24      CONCAT. NOT PATTERN
                   12489:        IFF  C$BVN,CGV26      BINARY $ AND .
                   12490:        IFF  C$INT,CGV31      INTERROGATION
                   12491:        IFF  C$NEG,CGV28      NEGATION
                   12492:        IFF  C$PMT,CGV18      PATTERN MATCH
                   12493:        ESW                   END SWITCH ON CMBLK TYPE
                   12494:        EJC
                   12495: *
                   12496: *      CDGVL (CONTINUED)
                   12497: *
                   12498: *      HERE TO GENERATE CODE FOR ARRAY REFERENCE
                   12499: *
                   12500: CGV03  MOV  *CMOPN,WB        SET OFFSET TO ARRAY OPERAND
                   12501: *
                   12502: *      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
                   12503: *
                   12504: CGV04  JSR  CMGEN            GEN VALUE CODE FOR NEXT OPERAND
                   12505:        MOV  CMLEN(XL),WC     LOAD CMBLK LENGTH
                   12506:        BLT  WB,WC,CGV04      LOOP BACK IF MORE TO GO
                   12507: *
                   12508: *      GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
                   12509: *
                   12510:        MOV  =OAOV$,WA        SET ONE SUBSCRIPT CALL IN CASE
                   12511:        BEQ  WC,*CMAR1,CGV32  JUMP TO EXIT IF 1-SUB CASE
                   12512:        MOV  =OAMV$,WA        ELSE SET CALL FOR MULTI-SUBSCRIPTS
                   12513:        JSR  CDWRD            GENERATE CALL
                   12514:        MOV  WC,WA            COPY LENGTH OF CMBLK
                   12515:        SUB  *CMVLS,WA        SUBTRACT STANDARD LENGTH
                   12516:        BTW  WA               GET NUMBER OF WORDS
                   12517:        BRN  CGV32            JUMP TO GENERATE SUBSCRIPT COUNT
                   12518: *
                   12519: *      HERE TO GENERATE CODE FOR FUNCTION CALL
                   12520: *
                   12521: CGV05  MOV  *CMVLS,WB        SET OFFSET TO FIRST ARGUMENT
                   12522: *
                   12523: *      LOOP TO GENERATE CODE FOR ARGUMENTS
                   12524: *
                   12525: CGV06  BEQ  WB,CMLEN(XL),CGV07 JUMP IF ALL GENERATED
                   12526:        JSR  CMGEN            ELSE GEN VALUE CODE FOR NEXT ARG
                   12527:        BRN  CGV06            BACK TO GENERATE NEXT ARGUMENT
                   12528: *
                   12529: *      HERE TO GENERATE ACTUAL FUNCTION CALL
                   12530: *
                   12531: CGV07  SUB  *CMVLS,WB        GET NUMBER OF ARG PTRS (BAUS)
                   12532:        BTW  WB               CONVERT BAUS TO WORDS
                   12533:        MOV  CMOPN(XL),XR     LOAD FUNCTION VRBLK POINTER
                   12534:        BNZ  VRLEN(XR),CGV12  JUMP IF NOT SYSTEM FUNCTION
                   12535:        MOV  VRSVP(XR),XL     LOAD SVBLK PTR IF SYSTEM VAR
                   12536:        MOV  SVBIT(XL),WA     LOAD BIT MASK
                   12537:        ANB  BTFFC,WA         TEST FOR FAST FUNCTION CALL ALLOWED
                   12538:        ZRB  WA,CGV12         JUMP IF NOT
                   12539:        EJC
                   12540: *
                   12541: *      CDGVL (CONTINUED)
                   12542: *
                   12543: *      HERE IF FAST FUNCTION CALL IS ALLOWED
                   12544: *
                   12545:        MOV  SVBIT(XL),WA     RELOAD BIT INDICATORS
                   12546:        ANB  BTPRE,WA         TEST FOR PREEVALUATION OK
                   12547:        NZB  WA,CGV08         JUMP IF PREEVALUATION PERMITTED
                   12548:        MNZ  WC               ELSE SET RESULT NON-CONSTANT
                   12549: *
                   12550: *      TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
                   12551: *
                   12552: CGV08  MOV  VRFNC(XR),XL     LOAD PTR TO SVFNC FIELD
                   12553:        MOV  FARGS(XL),WA     LOAD SVNAR FIELD VALUE
                   12554:        BEQ  WA,WB,CGV11      JUMP IF ARGUMENT COUNT IS CORRECT
                   12555:        BHI  WA,WB,CGV09      JUMP IF TOO FEW ARGUMENTS GIVEN
                   12556: *
                   12557: *      HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
                   12558: *
                   12559:        SUB  WA,WB            GET NUMBER OF EXTRA ARGS
                   12560:        LCT  WB,WB            SET AS COUNT TO CONTROL LOOP
                   12561:        MOV  =OPOP$,WA        SET POP CALL
                   12562:        BRN  CGV10            JUMP TO COMMON LOOP
                   12563: *
                   12564: *      HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
                   12565: *
                   12566: CGV09  SUB  WB,WA            GET NUMBER OF MISSING ARGUMENTS
                   12567:        LCT  WB,WA            LOAD AS COUNT TO CONTROL LOOP
                   12568:        MOV  =NULLS,WA        LOAD PTR TO NULL CONSTANT
                   12569: *
                   12570: *      LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
                   12571: *
                   12572: CGV10  JSR  CDWRD            GENERATE ONE CALL
                   12573:        BCT  WB,CGV10         LOOP TILL ALL GENERATED
                   12574: *
                   12575: *      HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
                   12576: *
                   12577: CGV11  MOV  XL,WA            COPY POINTER TO SVFNC FIELD
                   12578:        BRN  CGV36            JUMP TO GENERATE CALL
                   12579:        EJC
                   12580: *
                   12581: *      CDGVL (CONTINUED)
                   12582: *
                   12583: *      COME HERE IF FAST CALL IS NOT PERMITTED
                   12584: *
                   12585: CGV12  MOV  =OFNS$,WA        SET ONE ARG CALL IN CASE
                   12586:        BEQ  WB,=NUM01,CGV13  JUMP IF ONE ARG CASE
                   12587:        MOV  =OFNC$,WA        ELSE LOAD CALL FOR MORE THAN 1 ARG
                   12588:        JSR  CDWRD            GENERATE IT
                   12589:        MOV  WB,WA            COPY ARGUMENT COUNT
                   12590: *
                   12591: *      ONE ARG CASE MERGES HERE
                   12592: *
                   12593: CGV13  JSR  CDWRD            GENERATE =O$FNS OR ARG COUNT
                   12594:        MOV  XR,WA            COPY VRBLK POINTER
                   12595:        BRN  CGV32            JUMP TO GENERATE VRBLK PTR
                   12596: *
                   12597: *      HERE FOR DEFERRED EXPRESSION
                   12598: *
                   12599: CGV14  MOV  CMROP(XL),XL     POINT TO EXPRESSION TREE
                   12600:        JSR  CDGEX            BUILD EXBLK OR SEBLK
                   12601:        MOV  XR,WA            COPY BLOCK PTR
                   12602:        JSR  CDWRD            GENERATE PTR TO EXBLK OR SEBLK
                   12603:        BRN  CGV34            JUMP TO EXIT, CONSTANT TEST
                   12604: *
                   12605: *      HERE TO GENERATE CODE FOR SELECTION
                   12606: *
                   12607: CGV15  ZER  -(XS)            ZERO PTR TO CHAIN OF FORWARD JUMPS
                   12608:        ZER  -(XS)            ZERO PTR TO PREV O$SLC FORWARD PTR
                   12609:        MOV  *CMVLS,WB        POINT TO FIRST ALTERNATIVE
                   12610:        MOV  =OSLA$,WA        SET INITIAL CODE WORD
                   12611: *
                   12612: *      0(XS)                 IS THE OFFSET TO THE PREVIOUS WORD
                   12613: *                            WHICH REQUIRES FILLING IN WITH AN
                   12614: *                            OFFSET TO THE FOLLOWING O$SLC,O$SLD
                   12615: *
                   12616: *      1(XS)                 IS THE HEAD OF A CHAIN OF OFFSET
                   12617: *                            POINTERS INDICATING THOSE LOCATIONS
                   12618: *                            TO BE FILLED WITH OFFSETS PAST
                   12619: *                            THE END OF ALL THE ALTERNATIVES
                   12620: *
                   12621: CGV16  JSR  CDWRD            GENERATE O$SLC (O$SLA FIRST TIME)
                   12622:        MOV  CWCOF,(XS)       SET CURRENT LOC AS PTR TO FILL IN
                   12623:        JSR  CDWRD            GENERATE GARBAGE WORD THERE FOR NOW
                   12624:        JSR  CMGEN            GEN VALUE CODE FOR ALTERNATIVE
                   12625:        MOV  =OSLB$,WA        LOAD O$SLB POINTER
                   12626:        JSR  CDWRD            GENERATE O$SLB CALL
                   12627:        MOV  1(XS),WA         LOAD OLD CHAIN PTR
                   12628:        MOV  CWCOF,1(XS)      SET CURRENT LOC AS NEW CHAIN HEAD
                   12629:        JSR  CDWRD            GENERATE FORWARD CHAIN LINK
                   12630:        EJC
                   12631: *
                   12632: *      CDGVL (CONTINUED)
                   12633: *
                   12634: *      NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
                   12635: *
                   12636:        MOV  (XS),XR          LOAD OFFSET TO WORD TO PLUG
                   12637:        ADD  R$CCB,XR         POINT TO ACTUAL LOCATION TO PLUG
                   12638:        MOV  CWCOF,(XR)       PLUG PROPER OFFSET IN
                   12639:        MOV  =OSLC$,WA        LOAD O$SLC PTR FOR NEXT ALTERNATIVE
                   12640:        MOV  WB,XR            COPY OFFSET (DESTROY GARBAGE XR)
                   12641:        ICA  XR               BUMP EXTRA TIME FOR TEST
                   12642:        BLT  XR,CMLEN(XL),CGV16 LOOP BACK IF NOT LAST ALTERNATIVE
                   12643: *
                   12644: *      HERE TO GENERATE CODE FOR LAST ALTERNATIVE
                   12645: *
                   12646:        MOV  =OSLD$,WA        GET HEADER CALL
                   12647:        JSR  CDWRD            GENERATE O$SLD CALL
                   12648:        JSR  CMGEN            GENERATE CODE FOR LAST ALTERNATIVE
                   12649:        ICA  XS               POP OFFSET PTR
                   12650:        MOV  (XS)+,XR         LOAD CHAIN PTR
                   12651: *
                   12652: *      LOOP TO PLUG OFFSETS PAST STRUCTURE
                   12653: *
                   12654: CGV17  ADD  R$CCB,XR         MAKE NEXT PTR ABSOLUTE
                   12655:        MOV  (XR),WA          LOAD FORWARD PTR
                   12656:        MOV  CWCOF,(XR)       PLUG REQUIRED OFFSET
                   12657:        MOV  WA,XR            COPY FORWARD PTR
                   12658:        BNZ  WA,CGV17         LOOP BACK IF MORE TO GO
                   12659:        BRN  CGV33            ELSE JUMP TO EXIT (NOT CONSTANT)
                   12660: *
                   12661: *      HERE FOR BINARY OPS WITH VALUE OPERANDS
                   12662: *
                   12663: CGV18  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND POINTER
                   12664:        JSR  CDGVL            GEN VALUE CODE FOR LEFT OPERAND
                   12665: *
                   12666: *      HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
                   12667: *
                   12668: CGV19  MOV  CMROP(XL),XR     LOAD RIGHT (ONLY) OPERAND PTR
                   12669:        JSR  CDGVL            GEN CODE BY VALUE
                   12670:        EJC
                   12671: *
                   12672: *      CDGVL (CONTINUED)
                   12673: *
                   12674: *      MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
                   12675: *
                   12676: CGV20  MOV  CMOPN(XL),WA     LOAD OPERATOR CALL POINTER
                   12677:        BRN  CGV36            JUMP TO GENERATE IT WITH CONS TEST
                   12678: *
                   12679: *      HERE FOR ASSIGNMENT
                   12680: *
                   12681: CGV21  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND POINTER
                   12682:        BLO  (XR),=B$VR$,CGV22 JUMP IF NOT VARIABLE
                   12683: *
                   12684: *      HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
                   12685: *
                   12686:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
                   12687:        JSR  CDGVL            GENERATE CODE BY VALUE
                   12688:        MOV  CMLOP(XL),WA     RELOAD LEFT OPERAND VRBLK PTR
                   12689:        ADD  *VRSTO,WA        POINT TO VRSTO FIELD
                   12690:        BRN  CGV32            JUMP TO GENERATE STORE PTR
                   12691: *
                   12692: *      HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
                   12693: *
                   12694: CGV22  JSR  EXPAP            TEST FOR PATTERN MATCH ON LEFT SIDE
                   12695:        PPM  CGV23            JUMP IF NOT PATTERN MATCH
                   12696: *
                   12697: *      HERE FOR PATTERN REPLACEMENT
                   12698: *
                   12699:        MOV  CMROP(XR),CMLOP(XL) SAVE PATTERN PTR IN SAFE PLACE
                   12700:        MOV  CMLOP(XR),XR     LOAD SUBJECT PTR
                   12701:        JSR  CDGNM            GEN CODE BY NAME FOR SUBJECT
                   12702:        MOV  CMLOP(XL),XR     LOAD PATTERN PTR
                   12703:        JSR  CDGVL            GEN CODE BY VALUE FOR PATTERN
                   12704:        MOV  =OPMN$,WA        LOAD MATCH BY NAME CALL
                   12705:        JSR  CDWRD            GENERATE IT
                   12706:        MOV  CMROP(XL),XR     LOAD REPLACEMENT VALUE PTR
                   12707:        JSR  CDGVL            GEN CODE BY VALUE
                   12708:        MOV  =ORPL$,WA        LOAD REPLACE CALL
                   12709:        BRN  CGV32            JUMP TO GEN AND EXIT (NOT CONSTANT)
                   12710: *
                   12711: *      HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
                   12712: *
                   12713: CGV23  MNZ  WC               INHIBIT PRE-EVALUATION
                   12714:        JSR  CDGNM            GEN CODE BY NAME FOR LEFT SIDE
                   12715:        BRN  CGV31            MERGE WITH UNOP CIRCUIT
                   12716:        EJC
                   12717: *
                   12718: *      CDGVL (CONTINUED)
                   12719: *
                   12720: *      HERE FOR CONCATENATION
                   12721: *
                   12722: CGV24  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND PTR
                   12723:        BNE  (XR),=B$CMT,CGV18 ORDINARY BINOP IF NOT CMBLK
                   12724:        MOV  CMTYP(XR),WB     LOAD CMBLK TYPE CODE
                   12725:        BEQ  WB,=C$INT,CGV25  SPECIAL CASE IF INTERROGATION
                   12726:        BEQ  WB,=C$NEG,CGV25  OR NEGATION
                   12727:        BNE  WB,=C$FNC,CGV18  ELSE ORDINARY BINOP IF NOT FUNCTION
                   12728:        MOV  CMOPN(XR),XR     ELSE LOAD FUNCTION VRBLK PTR
                   12729:        BNZ  VRLEN(XR),CGV18  ORDINARY BINOP IF NOT SYSTEM VAR
                   12730:        MOV  VRSVP(XR),XR     ELSE POINT TO SVBLK
                   12731:        MOV  SVBIT(XR),WA     LOAD BIT INDICATORS
                   12732:        ANB  BTPRD,WA         TEST FOR PREDICATE FUNCTION
                   12733:        ZRB  WA,CGV18         ORDINARY BINOP IF NOT
                   12734: *
                   12735: *      HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
                   12736: *
                   12737: CGV25  MOV  CMLOP(XL),XR     RELOAD LEFT ARG
                   12738:        JSR  CDGVL            GEN CODE BY VALUE
                   12739:        MOV  =OPOP$,WA        LOAD POP CALL
                   12740:        JSR  CDWRD            GENERATE IT
                   12741:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND
                   12742:        JSR  CDGVL            GEN CODE BY VALUE AS RESULT CODE
                   12743:        BRN  CGV33            EXIT (NOT CONSTANT)
                   12744: *
                   12745: *      HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
                   12746: *
                   12747: CGV26  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND
                   12748:        JSR  CDGVL            GEN CODE BY VALUE, MERGE
                   12749: *
                   12750: *      HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
                   12751: *
                   12752: CGV27  MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
                   12753:        JSR  CDGNM            GEN CODE BY NAME FOR RIGHT ARG
                   12754:        MOV  CMOPN(XL),XR     GET OPERATOR CODE WORD
                   12755:        BNE  (XR),=O$KWV,CGV20 GEN CALL UNLESS KEYWORD VALUE
                   12756:        EJC
                   12757: *
                   12758: *      CDGVL (CONTINUED)
                   12759: *
                   12760: *      HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
                   12761: *      THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
                   12762: *      THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
                   12763: *      NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
                   12764: *
                   12765:        BNZ  WC,CGV20         GEN CALL IF NON-CONSTANT (NOT VAR)
                   12766:        MNZ  WC               ELSE SET NON-CONSTANT IN CASE
                   12767:        MOV  CMROP(XL),XR     LOAD PTR TO OPERAND VRBLK
                   12768:        BNZ  VRLEN(XR),CGV20  GEN (NON-CONSTANT) IF NOT SYS VAR
                   12769:        MOV  VRSVP(XR),XR     ELSE LOAD PTR TO SVBLK
                   12770:        MOV  SVBIT(XR),WA     LOAD BIT MASK
                   12771:        ANB  BTCKW,WA         TEST FOR CONSTANT KEYWORD
                   12772:        ZRB  WA,CGV20         GO GEN IF NOT CONSTANT
                   12773:        ZER  WC               ELSE SET RESULT CONSTANT
                   12774:        BRN  CGV20            AND JUMP BACK TO GENERATE CALL
                   12775: *
                   12776: *      HERE TO GENERATE CODE FOR NEGATION
                   12777: *
                   12778: CGV28  MOV  =ONTA$,WA        GET INITIAL WORD
                   12779:        JSR  CDWRD            GENERATE IT
                   12780:        MOV  CWCOF,WB         SAVE NEXT OFFSET
                   12781:        JSR  CDWRD            GENERATE GUNK WORD FOR NOW
                   12782:        MOV  CMROP(XL),XR     LOAD RIGHT OPERAND PTR
                   12783:        JSR  CDGVL            GEN CODE BY VALUE
                   12784:        MOV  =ONTB$,WA        LOAD END OF EVALUATION CALL
                   12785:        JSR  CDWRD            GENERATE IT
                   12786:        MOV  WB,XR            COPY OFFSET TO WORD TO PLUG
                   12787:        ADD  R$CCB,XR         POINT TO ACTUAL WORD TO PLUG
                   12788:        MOV  CWCOF,(XR)       PLUG WORD WITH CURRENT OFFSET
                   12789:        MOV  =ONTC$,WA        LOAD FINAL CALL
                   12790:        BRN  CGV32            JUMP TO GENERATE IT (NOT CONSTANT)
                   12791: *
                   12792: *      HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
                   12793: *
                   12794: CGV29  MOV  CMLOP(XL),XR     LOAD LEFT OPERAND PTR
                   12795:        JSR  CDGVL            GENERATE CODE BY VALUE
                   12796:        EJC
                   12797: *
                   12798: *      CDGVL (CONTINUED)
                   12799: *
                   12800: *      HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
                   12801: *
                   12802: CGV30  MOV  =C$UO$,WB        SET UNOP CODE + 1
                   12803:        SUB  CMTYP(XL),WB     SET NUMBER OF ARGS (1 OR 2)
                   12804: *
                   12805: *      MERGE HERE FOR UNDEFINED OPERATORS
                   12806: *
                   12807:        MOV  CMROP(XL),XR     LOAD RIGHT (ONLY) OPERAND POINTER
                   12808:        JSR  CDGVL            GEN VALUE CODE FOR RIGHT OPERAND
                   12809:        MOV  CMOPN(XL),XR     LOAD POINTER TO OPERATOR DV
                   12810:        MOV  DVOPN(XR),XR     LOAD POINTER OFFSET
                   12811:        WTB  XR               CONVERT WORD OFFSET TO BAUS
                   12812:        ADD  =R$UBA,XR        POINT TO PROPER FUNCTION PTR
                   12813:        SUB  *VRFNC,XR        SET STANDARD FUNCTION OFFSET
                   12814:        BRN  CGV12            MERGE WITH FUNCTION CALL CIRCUIT
                   12815: *
                   12816: *      HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
                   12817: *
                   12818: CGV31  MNZ  WC               SET NON CONSTANT
                   12819:        BRN  CGV19            MERGE
                   12820: *
                   12821: *      HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
                   12822: *
                   12823: CGV32  JSR  CDWRD            GENERATE WORD, MERGE
                   12824: *
                   12825: *      HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
                   12826: *
                   12827: CGV33  MNZ  WC               INDICATE RESULT IS NOT CONSTANT
                   12828: *
                   12829: *      COMMON EXIT POINT
                   12830: *
                   12831: CGV34  ICA  XS               POP INITIAL CODE OFFSET
                   12832:        MOV  (XS)+,WA         RESTORE OLD CONSTANT FLAG
                   12833:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   12834:        MOV  (XS)+,WB         RESTORE ENTRY WB
                   12835:        BNZ  WC,CGV35         JUMP IF NOT CONSTANT
                   12836:        MOV  WA,WC            ELSE RESTORE ENTRY CONSTANT FLAG
                   12837: *
                   12838: *      HERE TO RETURN AFTER DEALING WITH WC SETTING
                   12839: *
                   12840: CGV35  EXI                   RETURN TO CDGVL CALLER
                   12841: *
                   12842: *      EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
                   12843: *
                   12844: CGV36  JSR  CDWRD            GENERATE WORD
                   12845:        BNZ  WC,CGV34         JUMP TO EXIT IF NOT CONSTANT
                   12846:        EJC
                   12847: *
                   12848: *      CDGVL (CONTINUED)
                   12849: *
                   12850: *      HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
                   12851: *
                   12852:        MOV  =ORVL$,WA        LOAD CALL TO RETURN VALUE
                   12853:        JSR  CDWRD            GENERATE IT
                   12854:        MOV  (XS),XL          LOAD INITIAL CODE OFFSET
                   12855:        JSR  EXBLD            BUILD EXBLK FOR EXPRESSION
                   12856:        ZER  WB               SET TO EVALUATE BY VALUE
                   12857:        JSR  EVALX            EVALUATE EXPRESSION
                   12858:        PPM                   SHOULD NOT FAIL
                   12859:        MOV  (XR),WA          LOAD TYPE WORD OF RESULT
                   12860:        BLO  WA,=P$AAA,CGV37  JUMP IF NOT PATTERN
                   12861:        MOV  =OLPT$,WA        ELSE LOAD SPECIAL PATTERN LOAD CALL
                   12862:        JSR  CDWRD            GENERATE IT
                   12863: *
                   12864: *      MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
                   12865: *
                   12866: CGV37  MOV  XR,WA            COPY CONSTANT POINTER
                   12867:        JSR  CDWRD            GENERATE PTR
                   12868:        ZER  WC               SET RESULT CONSTANT
                   12869:        BRN  CGV34            JUMP BACK TO EXIT
                   12870:        ENP                   END PROCEDURE CDGVL
                   12871:        EJC
                   12872: *
                   12873: *      CDWRD -- GENERATE ONE WORD OF CODE
                   12874: *
                   12875: *      CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
                   12876: *      CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
                   12877: *      IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
                   12878: *      THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
                   12879: *      AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
                   12880: *      EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
                   12881: *
                   12882: *      (WA)                  WORD TO BE GENERATED
                   12883: *      JSR  CDWRD            CALL TO GENERATE WORD
                   12884: *
                   12885: CDWRD  PRC  E,0              ENTRY POINT
                   12886:        MOV  XR,-(XS)         SAVE ENTRY XR
                   12887:        MOV  WA,-(XS)         SAVE CODE WORD TO BE GENERATED
                   12888: *
                   12889: *      MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
                   12890: *
                   12891: CDWD1  MOV  R$CCB,XR         LOAD PTR TO CCBLK BEING BUILT
                   12892:        BNZ  XR,CDWD2         JUMP IF BLOCK ALLOCATED
                   12893: *
                   12894: *      HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
                   12895: *
                   12896:        MOV  *E$CBS,WA        LOAD INITIAL LENGTH
                   12897:        JSR  ALLOC            ALLOCATE CCBLK
                   12898:        MOV  =B$CCT,(XR)      STORE TYPE WORD
                   12899:        MOV  *CCCOD,CWCOF     SET INITIAL OFFSET
                   12900:        MOV  WA,CCLEN(XR)     STORE BLOCK LENGTH
                   12901:        MOV  XR,R$CCB         STORE PTR TO NEW BLOCK
                   12902: *
                   12903: *      HERE WE HAVE A BLOCK WE CAN USE
                   12904: *
                   12905: CDWD2  MOV  CWCOF,WA         LOAD CURRENT OFFSET
                   12906:        ADD  *NUM04,WA        ADJUST FOR TEST (FOUR WORDS)
                   12907:        BLO  WA,CCLEN(XR),CDWD4 JUMP IF ROOM IN THIS BLOCK
                   12908: *
                   12909: *      HERE IF NO ROOM IN CURRENT BLOCK
                   12910: *
                   12911:        BGE  WA,MXLEN,CDWD5   JUMP IF ALREADY AT MAX SIZE
                   12912:        ADD  *E$CBS,WA        ELSE GET NEW SIZE
                   12913:        MOV  XL,-(XS)         SAVE ENTRY XL
                   12914:        MOV  XR,XL            COPY POINTER
                   12915:        BLT  WA,MXLEN,CDWD3   JUMP IF NOT TOO LARGE
                   12916:        MOV  MXLEN,WA         ELSE RESET TO MAX ALLOWED SIZE
                   12917:        EJC
                   12918: *
                   12919: *      CDWRD (CONTINUED)
                   12920: *
                   12921: *      HERE WITH NEW BLOCK SIZE IN WA
                   12922: *
                   12923: CDWD3  JSR  ALLOC            ALLOCATE NEW BLOCK
                   12924:        MOV  XR,R$CCB         STORE POINTER TO NEW BLOCK
                   12925:        MOV  =B$CCT,(XR)+     STORE TYPE WORD IN NEW BLOCK
                   12926:        MOV  WA,(XR)+         STORE BLOCK LENGTH
                   12927:        ADD  *CCUSE,XL        POINT TO CCUSE,CCCOD FIELDS IN OLD
                   12928:        MOV  (XL),WA          LOAD CCUSE VALUE
                   12929:        MVW                   COPY USEFUL WORDS FROM OLD BLOCK
                   12930:        MOV  (XS)+,XL         RESTORE XL
                   12931:        BRN  CDWD1            MERGE BACK TO TRY AGAIN
                   12932: *
                   12933: *      HERE WITH ROOM IN CURRENT BLOCK
                   12934: *
                   12935: CDWD4  MOV  CWCOF,WA         LOAD CURRENT OFFSET
                   12936:        ICA  WA               GET NEW OFFSET
                   12937:        MOV  WA,CWCOF         STORE NEW OFFSET
                   12938:        MOV  WA,CCUSE(XR)     STORE IN CCBLK FOR GBCOL
                   12939:        DCA  WA               RESTORE PTR TO THIS WORD
                   12940:        ADD  WA,XR            POINT TO CURRENT ENTRY
                   12941:        MOV  (XS)+,WA         RELOAD WORD TO GENERATE
                   12942:        MOV  WA,(XR)          STORE WORD IN BLOCK
                   12943:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   12944:        EXI                   RETURN TO CALLER
                   12945: *
                   12946: *      HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
                   12947: *
                   12948: CDWD5  ERB  209,SYNTAX ERROR. STATEMENT IS TOO COMPLICATED.
                   12949:        ENP                   END PROCEDURE CDWRD
                   12950:        EJC
                   12951: *
                   12952: *      CMGEN -- GENERATE CODE FOR CMBLK PTR
                   12953: *
                   12954: *      CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
                   12955: *      CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
                   12956: *
                   12957: *      (XL)                  CMBLK POINTER
                   12958: *      (WB)                  OFFSET TO POINTER IN CMBLK
                   12959: *      JSR  CMGEN            CALL TO GENERATE CODE
                   12960: *      (XR,WA)               DESTROYED
                   12961: *      (WB)                  BUMPED BY ONE WORD
                   12962: *
                   12963: CMGEN  PRC  R,0              ENTRY POINT, RECURSIVE
                   12964:        MOV  XL,XR            COPY CMBLK POINTER
                   12965:        ADD  WB,XR            POINT TO CMBLK POINTER
                   12966:        MOV  (XR),XR          LOAD CMBLK POINTER
                   12967:        JSR  CDGVL            GENERATE CODE BY VALUE
                   12968:        ICA  WB               BUMP OFFSET
                   12969:        EXI                   RETURN TO CALLER
                   12970:        ENP                   END PROCEDURE CMGEN
                   12971:        EJC
                   12972: *
                   12973: *      CMPIL (COMPILE SOURCE CODE)
                   12974: *
                   12975: *      CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
                   12976: *      FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
                   12977: *      COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
                   12978: *      THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
                   12979: *      INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
                   12980: *      DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
                   12981: *      AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
                   12982: *      RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
                   12983: *
                   12984: *      CMPCE                 RESUME AFTER CONTROL CARD ERROR
                   12985: *      CMPLE                 RESUME AFTER LABEL ERROR
                   12986: *      CMPSE                 RESUME AFTER STATEMENT ERROR
                   12987: *
                   12988: *      JSR  CMPIL            CALL TO COMPILE CODE
                   12989: *      (XR)                  PTR TO CDBLK FOR ENTRY STATEMENT
                   12990: *      (XL,WA,WB,WC,RA)      DESTROYED
                   12991: *
                   12992: *      THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
                   12993: *
                   12994: *      CMPSN                 NUMBER OF NEXT STATEMENT
                   12995: *                            TO BE COMPILED.
                   12996: *
                   12997: *      CSWXX                 CONTROL CARD SWITCH VALUES ARE
                   12998: *                            CHANGED WHEN RELEVANT CONTROL
                   12999: *                            CARDS ARE MET.
                   13000: *
                   13001: *      CWCOF                 OFFSET TO NEXT WORD IN CODE BLOCK
                   13002: *                            BEING BUILT (SEE CDWRD).
                   13003: *
                   13004: *      LSTSN                 NUMBER OF STATEMENT MOST RECENTLY
                   13005: *                            COMPILED (INITIALLY SET TO ZERO).
                   13006: *
                   13007: *      R$CIM                 CURRENT (INITIAL) COMPILER IMAGE
                   13008: *                            (ZERO FOR INITIAL COMPILE CALL)
                   13009: *
                   13010: *      R$CNI                 USED TO POINT TO FOLLOWING IMAGE.
                   13011: *                            (SEE READR PROCEDURE).
                   13012: *
                   13013: *      SCNGO                 GOTO SWITCH FOR SCANE PROCEDURE
                   13014: *
                   13015: *      SCNIL                 LENGTH OF CURRENT IMAGE EXCLUDING
                   13016: *                            CHARACTERS REMOVED BY -INPUT.
                   13017: *
                   13018: *      SCNPT                 CURRENT SCAN OFFSET, SEE SCANE.
                   13019: *
                   13020: *      SCNRS                 RESCAN SWITCH FOR SCANE PROCEDURE.
                   13021: *
                   13022: *      SCNSE                 OFFSET (IN R$CIM) OF MOST RECENTLY
                   13023: *                            SCANNED ELEMENT. SET ZERO IF NOT
                   13024: *                            CURRENTLY SCANNING ITEMS
                   13025:        EJC
                   13026: *
                   13027: *      CMPIL (CONTINUED)
                   13028: *
                   13029: *      STAGE               STGIC  INITIAL COMPILE IN PROGRESS
                   13030: *                          STGXC  CODE/CONVERT COMPILE
                   13031: *                          STGEV  BUILDING EXBLK FOR EVAL
                   13032: *                          STGXT  EXECUTE TIME (OUTSIDE COMPILE)
                   13033: *                          STGCE  INITIAL COMPILE AFTER END LINE
                   13034: *                          STGXE  EXECUTE COMPILE AFTER END LINE
                   13035: *
                   13036: *      CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
                   13037: *      MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
                   13038: *      OFFSETS ARE IN THE DEFINITIONS SECTION).
                   13039: *
                   13040: *      CMSTM(XS)             POINTER TO EXPAN TREE FOR BODY OF
                   13041: *                            STATEMENT (SEE EXPAN PROCEDURE).
                   13042: *
                   13043: *      CMSGO(XS)             POINTER TO TREE REPRESENTATION OF
                   13044: *                            SUCCESS GOTO (SEE PROCEDURE SCNGO)9
                   13045: *                            ZERO IF NO SUCCESS GOTO IS GIVEN
                   13046: *
                   13047: *      CMFGO(XS)             LIKE CMSGO FOR FAILURE GOTO.
                   13048: *
                   13049: *      CMCGO(XS)             SET NON-ZERO ONLY IF THERE IS A
                   13050: *                            CONDITIONAL GOTO. USED FOR -FAIL,
                   13051: *                            -NOFAIL CODE GENERATION.
                   13052: *
                   13053: *      CMPCD(XS)             POINTER TO CDBLK FOR PREVIOUS
                   13054: *                            STATEMENT. ZERO FOR 1ST STATEMENT.
                   13055: *
                   13056: *      CMFFP(XS)             SET NON-ZERO IF CDFAL IN PREVIOUS
                   13057: *                            CDBLK NEEDS FILLING WITH FORWARD
                   13058: *                            POINTER, ELSE SET TO ZERO.
                   13059: *
                   13060: *      CMFFC(XS)             SAME AS CMFFP FOR CURRENT CDBLK
                   13061: *
                   13062: *      CMSOP(XS)             OFFSET TO WORD IN PREVIOUS CDBLK
                   13063: *                            TO BE FILLED IN WITH FORWARD PTR
                   13064: *                            TO NEXT CDBLK FOR SUCCESS GOTO.
                   13065: *                            ZERO IF NO FILL IN IS REQUIRED.
                   13066: *
                   13067: *      CMSOC(XS)             SAME AS CMSOP FOR CURRENT CDBLK.
                   13068: *
                   13069: *      CMLBL(XS)             POINTER TO VRBLK FOR LABEL OF
                   13070: *                            CURRENT STATEMENT. ZERO IF NO LABEL
                   13071: *
                   13072: *      CMTRA(XS)             POINTER TO CDBLK FOR ENTRY STMNT.
                   13073:        EJC
                   13074: *
                   13075: *      CMPIL (CONTINUED)
                   13076: *
                   13077: *      ENTRY POINT
                   13078: *
                   13079: CMPIL  PRC  E,0              ENTRY POINT
                   13080:        LCT  WB,=CMNEN        SET NUMBER OF STACK WORK LOCATIONS
                   13081: *
                   13082: *      LOOP TO INITIALIZE STACK WORKING LOCATIONS
                   13083: *
                   13084: CMP00  ZER  -(XS)            STORE A ZERO, MAKE ONE ENTRY
                   13085:        BCT  WB,CMP00         LOOP BACK UNTIL ALL SET
                   13086:        MOV  XS,CMPXS         SAVE STACK POINTER FOR ERROR SEC
                   13087:        SSS  CMPSS            SAVE S-R STACK POINTER IF ANY
                   13088: *
                   13089: *      LOOP THROUGH STATEMENTS
                   13090: *
                   13091: CMP01  MOV  SCNPT,WB         SET SCAN POINTER OFFSET
                   13092:        MOV  WB,SCNSE         SET START OF ELEMENT LOCATION
                   13093:        MOV  =OCER$,WA        POINT TO COMPILE ERROR CALL
                   13094:        JSR  CDWRD            GENERATE AS TEMPORARY CDFAL
                   13095:        BLT  WB,SCNIL,CMP04   JUMP IF CHARS LEFT ON THIS IMAGE
                   13096: *
                   13097: *      LOOP HERE AFTER COMMENT OR CONTROL CARD
                   13098: *      ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
                   13099: *
                   13100: CMPCE  ZER  XR               CLEAR POSSIBLE GARBAGE XR VALUE
                   13101:        BEQ  STAGE,=STGIC,CMPC1 READ IF INITIAL COMPILE
                   13102:        BZE  R$COP,CMP02      ELSE SKIP IF NO -COPY IN FORCE
                   13103: *
                   13104: *      HERE TO ATTEMPT READ (STGIC OR -COPY)
                   13105: *
                   13106: CMPC1  JSR  READR            READ NEXT INPUT IMAGE
                   13107:        BZE  XR,CMPC2         JUMP IF NO INPUT AVAILABLE
                   13108:        JSR  NEXTS            ACQUIRE NEXT SOURCE IMAGE
                   13109:        MOV  CMPSN,LSTSN      STORE STMT NO FOR USE BY LISTR
                   13110:        ZER  SCNPT            RESET SCAN POINTER
                   13111:        BRN  CMP04            GO PROCESS IMAGE
                   13112: *
                   13113: *      HERE IF READR HAD NOTHING TO RETURN.  IF NOT DURING
                   13114: *      INITIAL COMPILE, THEN MUST BE AT OUTER LEVEL OF -COPY
                   13115: *      IN CODE().  R$CIM HAS BEEN RESTORED TO CODE STRING
                   13116: *      BY COPND SO WE CONTINUE FROM THE -COPY STMT.
                   13117: *
                   13118: CMPC2  BEQ  STAGE,=STGIC,CMP09 JUMP IF INITIAL COMPILE
                   13119: *
                   13120: *      FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
                   13121: *      AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
                   13122: *
                   13123: CMP02  MOV  R$CIM,XR         GET CURRENT IMAGE
                   13124:        MOV  SCNPT,WB         GET CURRENT OFFSET
                   13125:        PLC  XR,WB            PREPARE TO GET CHARS
                   13126: *
                   13127: *      SKIP TO SEMI-COLON
                   13128: *
                   13129: CMP03  LCH  WC,(XR)+         GET CHAR
                   13130:        ICV  SCNPT            ADVANCE OFFSET
                   13131:        BEQ  WC,=CH$SM,CMP04  SKIP IF SEMI-COLON FOUND
                   13132:        BLT  SCNPT,SCNIL,CMP03 LOOP IF MORE CHARS
                   13133:        ZER  XR               CLEAR GARBAGE XR VALUE
                   13134:        BRN  CMP09            END OF IMAGE
                   13135:        EJC
                   13136: *
                   13137: *      CMPIL (CONTINUED)
                   13138: *
                   13139: *      HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
                   13140: *      STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
                   13141: *      ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
                   13142: *
                   13143: CMP04  MOV  R$CIM,XR         POINT TO CURRENT IMAGE
                   13144:        MOV  SCNPT,WB         LOAD CURRENT OFFSET
                   13145:        MOV  WB,WA            COPY FOR LABEL SCAN
                   13146:        PLC  XR,WB            POINT TO FIRST CHARACTER
                   13147:        LCH  WC,(XR)+         LOAD FIRST CHARACTER
                   13148:        BEQ  WC,=CH$SM,CMP12  NO LABEL IF SEMICOLON
                   13149:        BEQ  WC,=CH$AS,CMPCE  LOOP BACK IF COMMENT CARD
                   13150:        BEQ  WC,=CH$MN,CMP33  JUMP IF CONTROL CARD
                   13151:        MOV  R$CIM,R$CMP      ABOUT TO DESTROY R$CIM
                   13152:        MOV  =CMLAB,XL        POINT TO LABEL WORK STRING
                   13153:        MOV  XL,R$CIM         SCANE IS TO SCAN WORK STRING
                   13154:        PSC  XL               POINT TO FIRST CHARACTER POSITION
                   13155:        SCH  WC,(XL)+         STORE CHAR JUST LOADED
                   13156:        MOV  =CH$SM,WC        GET A SEMICOLON
                   13157:        SCH  WC,(XL)          STORE AFTER FIRST CHAR
                   13158:        CSC  XL               FINISHED CHARACTER STORING
                   13159:        ZER  XL               CLEAR POINTER
                   13160:        ZER  SCNPT            START AT FIRST CHARACTER
                   13161:        MOV  SCNIL,-(XS)      PRESERVE IMAGE LENGTH
                   13162:        MOV  =NUM02,SCNIL     READ 2 CHARS AT MOST
                   13163:        JSR  SCANE            SCAN FIRST CHAR FOR TYPE
                   13164:        MOV  (XS)+,SCNIL      RESTORE IMAGE LENGTH
                   13165:        MOV  XL,WC            NOTE RETURN CODE
                   13166:        MOV  R$CMP,XL         GET OLD R$CIM
                   13167:        MOV  XL,R$CIM         PUT IT BACK
                   13168:        MOV  WB,SCNPT         REINSTATE OFFSET
                   13169:        BNZ  SCNBL,CMP12      BLANK SEEN - CANT BE LABEL
                   13170:        MOV  XL,XR            POINT TO CURRENT IMAGE
                   13171:        PLC  XR,WB            POINT TO FIRST CHAR AGAIN
                   13172:        BEQ  WC,=T$VAR,CMP06  OK IF LETTER
                   13173:        BEQ  WC,=T$CON,CMP06  OK IF DIGIT
                   13174: *
                   13175: *      DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
                   13176: *
                   13177: CMPLE  MOV  R$CMP,R$CIM      POINT TO BAD LINE
                   13178:        ERB  210,BAD LABEL OR MISPLACED CONTINUATION LINE
                   13179: *
                   13180: *      LOOP TO SCAN LABEL
                   13181: *
                   13182: CMP05  BEQ  WC,=CH$SM,CMP07  SKIP IF SEMICOLON
                   13183:        ICV  WA               BUMP OFFSET
                   13184:        BEQ  WA,SCNIL,CMP07   JUMP IF END OF IMAGE (LABEL END)
                   13185:        EJC
                   13186: *
                   13187: *      CMPIL (CONTINUED)
                   13188: *
                   13189: *      ENTER LOOP AT THIS POINT
                   13190: *
                   13191: CMP06  LCH  WC,(XR)+         ELSE LOAD NEXT CHARACTER
                   13192: .IF    .CAHT
                   13193:        BEQ  WC,=CH$HT,CMP07  JUMP IF HORIZONTAL TAB
                   13194: .FI
                   13195: .IF    .CAVT
                   13196:        BEQ  WC,=CH$VT,CMP07  JUMP IF VERTICAL TAB
                   13197: .FI
                   13198:        BNE  WC,=CH$BL,CMP05  LOOP BACK IF NON-BLANK
                   13199: *
                   13200: *      HERE AFTER SCANNING OUT LABEL
                   13201: *
                   13202: CMP07  MOV  WA,SCNPT         SAVE UPDATED SCAN OFFSET
                   13203:        SUB  WB,WA            GET LENGTH OF LABEL
                   13204:        BZE  WA,CMP12         SKIP IF LABEL LENGTH ZERO
                   13205:        ZER  XR               CLEAR GARBAGE XR VALUE
                   13206:        JSR  SBSTR            BUILD SCBLK FOR LABEL NAME
                   13207:        JSR  GTNVR            LOCATE/CONTRUCT VRBLK
                   13208:        PPM                   DUMMY (IMPOSSIBLE) ERROR RETURN
                   13209:        MOV  XR,CMLBL(XS)     STORE LABEL POINTER
                   13210:        BNZ  VRLEN(XR),CMP11  JUMP IF NOT SYSTEM LABEL
                   13211:        BNE  VRSVP(XR),=V$END,CMP11 JUMP IF NOT END LABEL
                   13212: *
                   13213: *      HERE FOR END LABEL SCANNED OUT
                   13214: *
                   13215:        ADD  =STGND,STAGE     ADJUST STAGE APPROPRIATELY
                   13216:        JSR  SCANE            SCAN OUT NEXT ELEMENT
                   13217:        BEQ  XL,=T$SMC,CMPEE  JUMP IF END OF IMAGE
                   13218:        BNE  XL,=T$VAR,CMP08  ELSE ERROR IF NOT VARIABLE
                   13219: *
                   13220: *      HERE CHECK FOR VALID INITIAL TRANSFER
                   13221: *
                   13222:        BEQ  VRLBL(XR),=STNDL,CMP08 JUMP IF NOT DEFINED (ERROR)
                   13223:        MOV  VRLBL(XR),CMTRA(XS) ELSE SET INITIAL ENTRY POINTER
                   13224:        JSR  SCANE            SCAN NEXT ELEMENT
                   13225:        BEQ  XL,=T$SMC,CMPEE  JUMP IF OK (END OF IMAGE)
                   13226: *
                   13227: *      HERE FOR BAD TRANSFER LABEL
                   13228: *
                   13229: CMP08  ERB  211,SYNTAX ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
                   13230: *
                   13231: *      HERE FOR END OF INPUT (NO END LABEL DETECTED)
                   13232: *
                   13233: CMP09  ADD  =STGND,STAGE     ADJUST STAGE APPROPRIATELY
                   13234:        BEQ  STAGE,=STGXE,CMPEE JUMP IF CODE CALL (OK)
                   13235:        ERB  212,SYNTAX ERROR. MISSING END LINE
                   13236: *
                   13237: *      HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
                   13238: *
                   13239: CMPEE  MOV  =OSTP$,WA        SET STOP CALL POINTER
                   13240:        JSR  CDWRD            GENERATE AS STATEMENT CALL
                   13241:        BRN  CMPSE            JUMP TO GENERATE AS FAILURE
                   13242:        EJC
                   13243: *
                   13244: *      CMPIL (CONTINUED)
                   13245: *
                   13246: *      HERE AFTER PROCESSING LABEL OTHER THAN END
                   13247: *
                   13248: CMP11  BNE  STAGE,=STGIC,CMP12 JUMP IF CODE CALL - REDEF. OK
                   13249:        BEQ  VRLBL(XR),=STNDL,CMP12 ELSE CHECK FOR REDEFINITION
                   13250:        ZER  CMLBL(XS)        LEAVE FIRST LABEL DECLN UNDISTURBED
                   13251:        ERB  213,SYNTAX ERROR. DUPLICATE LABEL
                   13252: *
                   13253: *      HERE AFTER DEALING WITH LABEL
                   13254: *
                   13255: CMP12  ZER  WB               SET FLAG FOR STATEMENT BODY
                   13256:        JSR  EXPAN            GET TREE FOR STATEMENT BODY
                   13257:        MOV  XR,CMSTM(XS)     STORE FOR LATER USE
                   13258:        ZER  CMSGO(XS)        CLEAR SUCCESS GOTO POINTER
                   13259:        ZER  CMFGO(XS)        CLEAR FAILURE GOTO POINTER
                   13260:        ZER  CMCGO(XS)        CLEAR CONDITIONAL GOTO FLAG
                   13261:        JSR  SCANE            SCAN NEXT ELEMENT
                   13262:        BNE  XL,=T$COL,CMP18  JUMP IT NOT COLON (NO GOTO)
                   13263: *
                   13264: *      LOOP TO PROCESS GOTO FIELDS
                   13265: *
                   13266: CMP13  MNZ  SCNGO            SET GOTO FLAG
                   13267:        JSR  SCANE            SCAN NEXT ELEMENT
                   13268:        BEQ  XL,=T$SMC,CMP32  JUMP IF NO FIELDS LEFT
                   13269:        BEQ  XL,=T$SGO,CMP14  JUMP IF S FOR SUCCESS GOTO
                   13270:        BEQ  XL,=T$FGO,CMP16  JUMP IF F FOR FAILURE GOTO
                   13271: *
                   13272: *      HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
                   13273: *
                   13274:        MNZ  SCNRS            SET TO RESCAN ELEMENT NOT F,S
                   13275:        JSR  SCNGF            SCAN OUT GOTO FIELD
                   13276:        BNZ  CMFGO(XS),CMP17  ERROR IF FGOTO ALREADY
                   13277:        MOV  XR,CMFGO(XS)     ELSE SET AS FGOTO
                   13278:        BRN  CMP15            MERGE WITH SGOTO CIRCUIT
                   13279: *
                   13280: *      HERE FOR SUCCESS GOTO
                   13281: *
                   13282: CMP14  JSR  SCNGF            SCAN SUCCESS GOTO FIELD
                   13283:        MOV  =NUM01,CMCGO(XS) SET CONDITIONAL GOTO FLAG
                   13284: *
                   13285: *      UNCONTIONAL GOTO MERGES HERE
                   13286: *
                   13287: CMP15  BNZ  CMSGO(XS),CMP17  ERROR IF SGOTO ALREADY GIVEN
                   13288:        MOV  XR,CMSGO(XS)     ELSE SET SGOTO
                   13289:        BRN  CMP13            LOOP BACK FOR NEXT GOTO FIELD
                   13290: *
                   13291: *      HERE FOR FAILURE GOTO
                   13292: *
                   13293: CMP16  JSR  SCNGF            SCAN GOTO FIELD
                   13294:        MOV  =NUM01,CMCGO(XS) SET CONDITONAL GOTO FLAG
                   13295:        BNZ  CMFGO(XS),CMP17  ERROR IF FGOTO ALREADY GIVEN
                   13296:        MOV  XR,CMFGO(XS)     ELSE STORE FGOTO POINTER
                   13297:        BRN  CMP13            LOOP BACK FOR NEXT FIELD
                   13298:        EJC
                   13299: *
                   13300: *      CMPIL (CONTINUED)
                   13301: *
                   13302: *      HERE FOR DUPLICATED GOTO FIELD
                   13303: *
                   13304: CMP17  ERB  214,SYNTAX ERROR. DUPLICATED GOTO FIELD
                   13305: *
                   13306: *      HERE TO GENERATE CODE
                   13307: *
                   13308: CMP18  ZER  SCNSE            STOP POSITIONAL ERROR FLAGS
                   13309:        MOV  CMSTM(XS),XR     LOAD TREE PTR FOR STATEMENT BODY
                   13310:        ZER  WB               COLLECTABLE VALUE FOR WB FOR CDGVL
                   13311:        ZER  WC               RESET CONSTANT FLAG FOR CDGVL
                   13312:        JSR  EXPAP            TEST FOR PATTERN MATCH
                   13313:        PPM  CMP19            JUMP IF NOT PATTERN MATCH
                   13314:        MOV  =OPMS$,CMOPN(XR) ELSE SET PATTERN MATCH POINTER
                   13315:        MOV  =C$PMT,CMTYP(XR)
                   13316: *
                   13317: *      HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
                   13318: *
                   13319: CMP19  JSR  CDGVL            GENERATE CODE FOR BODY OF STATEMENT
                   13320:        MOV  CMSGO(XS),XR     LOAD SGOTO POINTER
                   13321:        MOV  XR,WA            COPY IT
                   13322:        BZE  XR,CMP21         JUMP IF NO SUCCESS GOTO
                   13323:        ZER  CMSOC(XS)        CLEAR SUCCESS OFFSET FILLIN PTR
                   13324:        BHI  XR,STATE,CMP20   JUMP IF COMPLEX GOTO
                   13325: *
                   13326: *      HERE FOR SIMPLE SUCCESS GOTO (LABEL)
                   13327: *
                   13328:        ADD  *VRTRA,WA        POINT TO VRTRA FIELD AS REQUIRED
                   13329:        JSR  CDWRD            GENERATE SUCCESS GOTO
                   13330:        BRN  CMP22            JUMP TO DEAL WITH FGOTO
                   13331: *
                   13332: *      HERE FOR COMPLEX SUCCESS GOTO
                   13333: *
                   13334: CMP20  BEQ  XR,CMFGO(XS),CMP22 NO CODE IF SAME AS FGOTO
                   13335:        ZER  WB               ELSE SET OK VALUE FOR CDGVL IN WB
                   13336:        JSR  CDGCG            GENERATE CODE FOR SUCCESS GOTO
                   13337:        BRN  CMP22            JUMP TO DEAL WITH FGOTO
                   13338: *
                   13339: *      HERE FOR NO SUCCESS GOTO
                   13340: *
                   13341: CMP21  MOV  CWCOF,CMSOC(XS)  SET SUCCESS FILL IN OFFSET
                   13342:        MOV  =OCER$,WA        POINT TO COMPILE ERROR CALL
                   13343:        JSR  CDWRD            GENERATE AS TEMPORARY VALUE
                   13344:        EJC
                   13345: *
                   13346: *      CMPIL (CONTINUED)
                   13347: *
                   13348: *      HERE TO DEAL WITH FAILURE GOTO
                   13349: *
                   13350: CMP22  MOV  CMFGO(XS),XR     LOAD FAILURE GOTO POINTER
                   13351:        MOV  XR,WA            COPY IT
                   13352:        ZER  CMFFC(XS)        SET NO FILL IN REQUIRED YET
                   13353:        BZE  XR,CMP23         JUMP IF NO FAILURE GOTO GIVEN
                   13354:        ADD  *VRTRA,WA        POINT TO VRTRA FIELD IN CASE
                   13355:        BLO  XR,STATE,CMPSE   JUMP TO GEN IF SIMPLE FGOTO
                   13356: *
                   13357: *      HERE FOR COMPLEX FAILURE GOTO
                   13358: *
                   13359:        MOV  CWCOF,WB         SAVE OFFSET TO O$GOF CALL
                   13360:        MOV  =OGOF$,WA        POINT TO FAILURE GOTO CALL
                   13361:        JSR  CDWRD            GENERATE
                   13362:        MOV  =OFIF$,WA        POINT TO FAIL IN FAIL WORD
                   13363:        JSR  CDWRD            GENERATE
                   13364:        JSR  CDGCG            GENERATE CODE FOR FAILURE GOTO
                   13365:        MOV  WB,WA            COPY OFFSET TO O$GOF FOR CDFAL
                   13366:        MOV  =B$CDC,WB        SET COMPLEX CASE CDTYP
                   13367:        BRN  CMP25            JUMP TO BUILD CDBLK
                   13368: *
                   13369: *      HERE IF NO FAILURE GOTO GIVEN
                   13370: *
                   13371: CMP23  MOV  =OUNF$,WA        LOAD UNEXPECTED FAILURE CALL IN CAS
                   13372:        MOV  CSWFL,WC         GET -NOFAIL FLAG
                   13373:        ORB  CMCGO(XS),WC     CHECK IF CONDITIONAL GOTO
                   13374:        ZRB  WC,CMPSE         JUMP IF -NOFAIL AND NO COND. GOTO
                   13375:        MNZ  CMFFC(XS)        ELSE SET FILL IN FLAG
                   13376:        MOV  =OCER$,WA        AND SET COMPILE ERROR FOR TEMPORARY
                   13377: *
                   13378: *      MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
                   13379: *      ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
                   13380: *
                   13381: CMPSE  MOV  =B$CDS,WB        SET CDTYP FOR SIMPLE CASE
                   13382:        EJC
                   13383: *
                   13384: *      CMPIL (CONTINUED)
                   13385: *
                   13386: *      MERGE HERE TO BUILD CDBLK
                   13387: *
                   13388: *      (WA)                  CDFAL VALUE TO BE GENERATED
                   13389: *      (WB)                  CDTYP VALUE TO BE GENERATED
                   13390: *
                   13391: *      AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
                   13392: *      CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
                   13393: *      OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
                   13394: *
                   13395: CMP25  MOV  R$CCB,XR         POINT TO CCBLK
                   13396:        MOV  CMLBL(XS),XL     GET POSSIBLE LABEL POINTER
                   13397:        BZE  XL,CMP26         SKIP IF NO LABEL
                   13398:        ZER  CMLBL(XS)        CLEAR FLAG FOR NEXT STATEMENT
                   13399:        MOV  XR,VRLBL(XL)     PUT CDBLK PTR IN VRBLK LABEL FIELD
                   13400: *
                   13401: *      MERGE AFTER DOING LABEL
                   13402: *
                   13403: CMP26  MOV  WB,(XR)          SET TYPE WORD FOR NEW CDBLK
                   13404:        MOV  WA,CDFAL(XR)     SET FAILURE WORD
                   13405:        MOV  XR,XL            COPY POINTER TO CCBLK
                   13406:        MOV  CCUSE(XR),WB     LOAD LENGTH GEN (= NEW CDLEN)
                   13407:        MOV  CCLEN(XR),WC     LOAD TOTAL CCBLK LENGTH
                   13408:        ADD  WB,XL            POINT PAST CDBLK
                   13409:        SUB  WB,WC            GET LENGTH LEFT FOR CHOP OFF
                   13410:        MOV  =B$CCT,(XL)      SET TYPE CODE FOR NEW CCBLK AT END
                   13411:        MOV  *CCCOD,CCUSE(XL) SET INITIAL CODE OFFSET
                   13412:        MOV  *CCCOD,CWCOF     REINITIALISE CWCOF
                   13413:        MOV  WC,CCLEN(XL)     SET NEW LENGTH
                   13414:        MOV  XL,R$CCB         SET NEW CCBLK POINTER
                   13415:        MOV  CMPSN,CDSTM(XR)  SET STATEMENT NUMBER
                   13416:        ICV  CMPSN            BUMP STATEMENT NUMBER
                   13417: *
                   13418: *      SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
                   13419: *
                   13420:        MOV  CMPCD(XS),XL     LOAD PTR TO PREVIOUS CDBLK
                   13421:        BZE  CMFFP(XS),CMP27  JUMP IF NO FAILURE FILL IN REQUIRED
                   13422:        MOV  XR,CDFAL(XL)     ELSE SET FAILURE PTR IN PREVIOUS
                   13423: *
                   13424: *      HERE TO DEAL WITH SUCCESS FORWARD POINTER
                   13425: *
                   13426: CMP27  MOV  CMSOP(XS),WA     LOAD SUCCESS OFFSET
                   13427:        BZE  WA,CMP28         JUMP IF NO FILL IN REQUIRED
                   13428:        ADD  WA,XL            ELSE POINT TO FILL IN LOCATION
                   13429:        MOV  XR,(XL)          STORE FORWARD POINTER
                   13430:        ZER  XL               CLEAR GARBAGE XL VALUE
                   13431:        EJC
                   13432: *
                   13433: *      CMPIL (CONTINUED)
                   13434: *
                   13435: *      NOW SET FILL IN POINTERS FOR THIS STATEMENT
                   13436: *
                   13437: CMP28  MOV  CMFFC(XS),CMFFP(XS) COPY FAILURE FILL IN FLAG
                   13438:        MOV  CMSOC(XS),CMSOP(XS) COPY SUCCESS FILL IN OFFSET
                   13439:        MOV  XR,CMPCD(XS)     SAVE PTR TO THIS CDBLK
                   13440:        BNZ  CMTRA(XS),CMP29  JUMP IF INITIAL ENTRY ALREADY SET
                   13441:        MOV  XR,CMTRA(XS)     ELSE SET PTR HERE AS DEFAULT
                   13442: *
                   13443: *      HERE AFTER COMPILING ONE STATEMENT
                   13444: *
                   13445: CMP29  BLT  STAGE,=STGCE,CMP01 JUMP IF NOT END LINE JUST DONE
                   13446:        BZE  CSWLS,CMP30      SKIP IF -NOLIST
                   13447:        JSR  LISTR            LIST LAST LINE
                   13448: *
                   13449: *      RETURN
                   13450: *
                   13451: CMP30  MOV  CMTRA(XS),XR     LOAD INITIAL ENTRY CDBLK POINTER
                   13452:        ADD  *CMNEN,XS        POP WORK LOCATIONS OFF STACK
                   13453: *
                   13454: *      LOOP TO UNNEST ANY OUTSTANDING -COPY LEVELS
                   13455: *
                   13456: CMP31  JSR  COPND            CALL TO UNNEST -COPY
                   13457:        BNZ  R$COP,CMP31      LOOP IF NOT ALL -COPYS CLOSED
                   13458:        EXI                   RETURN TO CMPIL CALLER
                   13459: *
                   13460: *      HERE AT END OF GOTO FIELD
                   13461: *
                   13462: CMP32  MOV  CMFGO(XS),WB     GET FAIL GOTO
                   13463:        ORB  CMSGO(XS),WB     OR IN SUCCESS GOTO
                   13464:        BNZ  WB,CMP18         OK IF NON-NULL FIELD
                   13465:        ERB  215,SYNTAX ERROR. EMPTY GOTO FIELD
                   13466: *
                   13467: *      CONTROL CARD FOUND
                   13468: *
                   13469: CMP33  ICV  WB               POINT PAST CH$MN
                   13470:        JSR  CNCRD            PROCESS CONTROL CARD
                   13471:        ZER  SCNSE            CLEAR START OF ELEMENT LOC.
                   13472:        BRN  CMPCE            LOOP FOR NEXT STATEMENT
                   13473:        ENP                   END PROCEDURE CMPIL
                   13474:        EJC
                   13475: *
                   13476: *      CNCRD -- CONTROL CARD PROCESSOR
                   13477: *
                   13478: *      CALLED TO DEAL WITH CONTROL CARDS
                   13479: *
                   13480: *      R$CIM                 POINTS TO CURRENT IMAGE
                   13481: *      (WB)                  OFFSET TO 1ST CHAR OF CONTROL CARD
                   13482: *      JSR  CNCRD            CALL TO PROCESS CONTROL CARDS
                   13483: *      (XL,XR,WA,WB,WC,IA)   DESTROYED
                   13484: *
                   13485: CNCRD  PRC  E,0              ENTRY POINT
                   13486:        MOV  WB,SCNPT         OFFSET FOR CONTROL CARD SCAN
                   13487:        MOV  =CCNOC,WA        NUMBER OF CHARS FOR COMPARISON
                   13488:        CTW  WA,0             CONVERT TO WORD COUNT
                   13489:        MOV  WA,CNSWC         SAVE WORD COUNT
                   13490: *
                   13491: *      LOOP HERE IF MORE THAN ONE CONTROL CARD
                   13492: *
                   13493: CNC01  BGE  SCNPT,SCNIL,CNC10 RETURN IF END OF IMAGE
                   13494:        MOV  R$CIM,XR         POINT TO IMAGE
                   13495:        PLC  XR,SCNPT         CHAR PTR FOR FIRST CHAR
                   13496:        LCH  WA,(XR)+         GET FIRST CHAR
                   13497:        BEQ  WA,=CH$LI,CNC07  SPECIAL CASE OF -INXXX
                   13498: .IF    .CASL
                   13499:        BEQ  WA,=CH$$I,CNC07  DITTO (LC)
                   13500: .FI
                   13501:        MNZ  SCNCC            SET FLAG FOR SCANE
                   13502:        JSR  SCANE            SCAN CARD NAME
                   13503:        ZER  SCNCC            CLEAR SCANE FLAG
                   13504:        BNZ  XL,CNC06         FAIL UNLESS CONTROL CARD NAME
                   13505:        MOV  =CCNOC,WA        NO. OF CHARS TO BE COMPARED
                   13506:        BLT  SCLEN(XR),WA,CNC06  FAIL IF TOO FEW CHARS
                   13507:        MOV  XR,XL            POINT TO CONTROL CARD NAME
                   13508:        ZER  WB               ZERO OFFSET FOR SUBSTRING
                   13509: .IF    .CASL
                   13510:        JSR  SBSCC            CONVERT CASE BEFORE COMPARISON
                   13511: .ELSE
                   13512:        JSR  SBSTR            EXTRACT SUBSTRING FOR COMPARISON
                   13513: .FI
                   13514:        MOV  XR,CNSCC         KEEP CONTROL CARD SUBSTRING PTR
                   13515:        MOV  =CCNMS,XR        POINT TO LIST OF STANDARD NAMES
                   13516:        ZER  WB               INITIALISE NAME OFFSET
                   13517:        LCT  WC,=CC$CT        NUMBER OF STANDARD NAMES
                   13518: *
                   13519: *      TRY TO MATCH NAME
                   13520: *
                   13521: CNC02  MOV  CNSCC,XL         POINT TO NAME
                   13522:        LCT  WA,CNSWC         COUNTER FOR INNER LOOP
                   13523:        BRN  CNC04            JUMP INTO LOOP
                   13524: *
                   13525: *      INNER LOOP TO MATCH CARD NAME CHARS
                   13526: *
                   13527: CNC03  ICA  XR               BUMP STANDARD NAMES PTR
                   13528:        ICA  XL               BUMP NAME POINTER
                   13529: *
                   13530: *      HERE TO INITIATE THE LOOP
                   13531: *
                   13532: CNC04  CNE  SCHAR(XL),(XR),CNC05 COMP. UP TO CFP$C CHARS AT ONCE
                   13533:        BCT  WA,CNC03         LOOP IF MORE WORDS TO COMPARE
                   13534:        EJC
                   13535: *
                   13536: *      CNCRD (CONTINUED)
                   13537: *
                   13538: *      MATCHED - BRANCH ON CARD OFFSET
                   13539: *
                   13540:        MOV  WB,XL            GET NAME OFFSET
                   13541:        BSW  XL,CC$CT         SWITCH
                   13542: .IF    .CASL
                   13543:        IFF  CC$CI,CNC11      -CASEIG
                   13544: .FI
                   13545:        IFF  CC$CO,CNC23      -COPY
                   13546:        IFF  CC$EJ,CNC12      -EJECT
                   13547:        IFF  CC$FA,CNC13      -FAIL
                   13548:        IFF  CC$LI,CNC14      -LIST
                   13549: .IF    .CASL
                   13550:        IFF  CC$NC,CNC15      -NOCASEIG
                   13551: .FI
                   13552:        IFF  CC$NF,CNC16      -NOFAIL
                   13553:        IFF  CC$NL,CNC17      -NOLIST
                   13554:        IFF  CC$ST,CNC18      -STITLE
                   13555:        IFF  CC$TI,CNC19      -TITLE
                   13556:        IFF  CC$TR,CNC22      -TRACE
                   13557:        ESW                   END SWITCH
                   13558: *
                   13559: *      NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
                   13560: *
                   13561: CNC05  ICA  XR               BUMP STANDARD NAMES PTR
                   13562:        BCT  WA,CNC05         LOOP
                   13563:        ICV  WB               BUMP NAMES OFFSET
                   13564:        BCT  WC,CNC02         CONTINUE IF MORE NAMES
                   13565: *
                   13566: *      INVALID CONTROL CARD NAME
                   13567: *
                   13568: CNC06  ERB  216,INVALID CONTROL CARD
                   13569: *
                   13570: *      SPECIAL PROCESSING FOR -INXXX
                   13571: *
                   13572: CNC07  LCH  WA,(XR)          GET NEXT CHAR
                   13573: .IF    .CASL
                   13574:        BEQ  WA,=CH$$N,CNC08  SKIP IF LC N
                   13575: .FI
                   13576:        BNE  WA,=CH$LN,CNC06  FAIL IF NOT LETTER N
                   13577: .IF    .CASL
                   13578: CNC08  ADD  =NUM02,SCNPT     BUMP OFFSET PAST -IN
                   13579: .ELSE
                   13580:        ADD  =NUM02,SCNPT     BUMP OFFSET PAST -IN
                   13581: .FI
                   13582:        JSR  SCANE            SCAN INTEGER AFTER -IN
                   13583:        MOV  XR,-(XS)         STACK SCANNED ITEM
                   13584:        JSR  GTSMI            CHECK IF INTEGER
                   13585:        PPM  CNC06            FAIL IF NOT INTEGER
                   13586:        PPM  CNC06            FAIL IF NEGATIVE OR LARGE
                   13587:        MOV  XR,CSWIN         KEEP INTEGER
                   13588:        EJC
                   13589: *
                   13590: *      CNCRD (CONTINUED)
                   13591: *
                   13592: *      CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
                   13593: *
                   13594: CNC09  MOV  SCNPT,WA         PRESERVE IN CASE XEQ TIME COMPILE
                   13595:        JSR  SCANE            LOOK FOR COMMA
                   13596:        BEQ  XL,=T$CMA,CNC01  LOOP IF COMMA FOUND
                   13597:        MOV  WA,SCNPT         RESTORE SCNPT IN CASE XEQ TIME
                   13598: *
                   13599: *      RETURN POINT
                   13600: *
                   13601: CNC10  EXI                   RETURN
                   13602: .IF    .CASL
                   13603: *
                   13604: *      -CASEIG
                   13605: *
                   13606: CNC11  MNZ  CSWCI            SET SWITCH
                   13607:        BRN  CNC09            MERGE
                   13608: .FI
                   13609: *
                   13610: *      -EJECT
                   13611: *
                   13612: CNC12  BZE  CSWLS,CNC10      RETURN IF -NOLIST
                   13613:        JSR  PRTPS            EJECT
                   13614:        JSR  LISTT            LIST TITLE
                   13615:        BRN  CNC10            FINISHED
                   13616: *
                   13617: *      -FAIL
                   13618: *
                   13619: CNC13  MNZ  CSWFL            SET SWITCH
                   13620:        BRN  CNC09            MERGE
                   13621: *
                   13622: *      -LIST
                   13623: *
                   13624: CNC14  MNZ  CSWLS            SET SWITCH
                   13625:        BRN  CNC09            MERGE
                   13626: .IF    .CASL
                   13627: *
                   13628: *      -NOCASEIG
                   13629: *
                   13630: CNC15  ZER  CSWCI            CLEAR SWITCH
                   13631:        BRN  CNC09            MERGE
                   13632: .FI
                   13633: *
                   13634: *      -NOFAIL
                   13635: *
                   13636: CNC16  ZER  CSWFL            CLEAR SWITCH
                   13637:        BRN  CNC09            MERGE
                   13638:        EJC
                   13639: *
                   13640: *      CNCRD (CONTINUED)
                   13641: *
                   13642: *      -NOLIST
                   13643: *
                   13644: CNC17  ZER  CSWLS            CLEAR SWITCH
                   13645:        BRN  CNC09            MERGE
                   13646: *
                   13647: *      -STITL
                   13648: *
                   13649: CNC18  MOV  =R$STL,CNR$T     PTR TO R$STL
                   13650:        BRN  CNC20            MERGE
                   13651: *
                   13652: *      -TITLE
                   13653: *
                   13654: CNC19  MOV  =NULLS,R$STL     CLEAR SUBTITLE
                   13655:        MOV  =R$TTL,CNR$T     PTR TO R$TTL
                   13656: *
                   13657: *      COMMON PROCESSING FOR -TITLE, -STITL
                   13658: *
                   13659: CNC20  MOV  =NULLS,XR        NULL IN CASE NEEDED
                   13660:        MNZ  CNTTL            SET FLAG FOR NEXT LISTR CALL
                   13661:        MOV  =CCOFS,WB        OFFSET TO TITLE/SUBTITLE
                   13662:        MOV  SCNIL,WA         INPUT IMAGE LENGTH
                   13663:        BLO  WA,WB,CNC21      JUMP IF NO CHARS LEFT
                   13664:        SUB  WB,WA            NO OF CHARS TO EXTRACT
                   13665:        MOV  R$CIM,XL         POINT TO IMAGE
                   13666:        JSR  SBSTR            GET TITLE/SUBTITLE
                   13667: *
                   13668: *      STORE TITLE/SUBTITLE
                   13669: *
                   13670: CNC21  MOV  CNR$T,XL         POINT TO STORAGE LOCATION
                   13671:        MOV  XR,(XL)          STORE TITLE/SUBTITLE
                   13672:        BRN  CNC10            RETURN
                   13673: *
                   13674: *      -TRACE
                   13675: *
                   13676: *      PROVIDED FOR SYSTEM DEBUGGING.  TOGGLES THE SYSTEM LABEL
                   13677: *      TRACE SWITCH AT COMPILE TIME
                   13678: *
                   13679: CNC22  JSR  SYSTT            TOGGLE SWITCH
                   13680:        BRN  CNC09            MERGE
                   13681: *
                   13682: *      -COPY
                   13683: *
                   13684: *      GET FILETAG AND NOTIFY OSINT THAT WE ARE NESTING
                   13685: *
                   13686: CNC23  JSR  SCANE            GET FILETAG
                   13687:        BNE  =T$CON,XL,CNC06  ERR IF NOT CONSTANT
                   13688:        BNE  =B$SCL,(XR),CNC06 ERR IF NOT SCBLK
                   13689:        JSR  SYSSC            CALL TO START COPY
                   13690:        ERR  258,COPY FILE DOES NOT EXIST
                   13691:        PPM  EROSI            ERROR RETURN (ALWAYS)
                   13692:        MOV  WA,WB            SAVE IOTAG FROM OSINT
                   13693:        MOV  *COSI$,WA        GET SIZE OF COPY BLOCK
                   13694:        JSR  ALLOC            ALLOCATE
                   13695:        MOV  =B$COP,COTYP(XR) SET TYPE
                   13696:        MOV  R$COP,CONXT(XR)  PLACE AT FRONT OF STACK CHN
                   13697:        MOV  XR,R$COP         SPLICE IT IN
                   13698:        MOV  WB,COIOT(XR)     SAVE OSINT IOTAG
                   13699:        MOV  TTINS,COTTI(XR)  SAVE TTINS
                   13700:        ZER  TTINS            INPUT NOT FROM TERMINAL NOW
                   13701:        MOV  R$CIM,COCIM(XR)  SAVE R$CIM IN CASE EXEC TIME
                   13702:        MOV  SCNPT,COSPT(XR)  SAVE SCNPT IN CASE EXEC TIME
                   13703:        MOV  CSWLS,COSLS(XR)  SAVE LIST FLAG
                   13704:        MOV  CSWIN,COSIN(XR)  SAVE -INXXX VALUE
                   13705:        MOV  R$STL,COSTL(XR)  SAVE SUBTITLE
                   13706:        BZE  CSWLS,CNC10      NO LIST -COPY IF -NOLIST
                   13707:        JSR  LISTR            LIST -COPY CARD
                   13708:        BRN  CNC10            EXIT
                   13709:        ENP                   END PROCEDURE CNCRD
                   13710:        EJC
                   13711: *
                   13712: *      COPND -- END -COPY NESTING
                   13713: *
                   13714: *      COPND IS CALLED FROM CMPIL AND READR IN ORDER TO
                   13715: *      UNNEST ONE LEVEL OF -COPY AND RESTORE THE PREVIOUS
                   13716: *      INPUT COMPILE STRING.  THE COPY BLOCK IS REMOVED
                   13717: *      FROM THE CHAIN AND THE STATE RESTORED FROM IT.
                   13718: *
                   13719: *      JSR  COPND            CALL TO END -COPY AT CUR. LEVEL
                   13720: *      (XL,WA,WB,WC)         DESTROYED
                   13721: *
                   13722: COPND  PRC  E,0              ENTRY POINT
                   13723:        MOV  R$COP,XL         GET POINTER TO CURRENT COBLK
                   13724:        BZE  XL,COP02         EXIT IF NONE
                   13725:        MOV  CONXT(XL),R$COP  TAKE OFF CHAIN
                   13726:        MOV  COIOT(XL),WA     GET IOTAG FOR OSINT
                   13727:        JSR  SYSEC            CALL TO END COPY
                   13728:        PPM                   DO NOT USE
                   13729:        PPM  EROSI            ERROR EXIT
                   13730:        BZE  CSWLS,COP01      SKIP LISTING IF -NOLIST
                   13731:        JSR  LISTR            LIST CURRENT IMAGE
                   13732: *
                   13733: *      MERGE AFTER POSSIBLE LISTING OF CURRENT IMAGE
                   13734: *
                   13735: COP01  MOV  COTTI(XL),TTINS  RESTORE TERMINAL INPUT FLAG
                   13736:        MOV  COSLS(XL),CSWLS  RESTORE LISTING STATE
                   13737:        MOV  COSPT(XL),SCNPT  GET OLD SCAN POINTER
                   13738:        MOV  COSIN(XL),CSWIN  OLD INPUT IMAGE LENGTH
                   13739:        MOV  COSTL(XL),R$STL  RESTORE SUBTITLE STRING
                   13740:        MNZ  LSTPF            THIS IMAGE LISTED IN CNCRD
                   13741:        MOV  COCIM(XL),XL     GET OLD COMPILER IMAGE SCBLK
                   13742:        MOV  XL,R$CIM         RESTORE IT
                   13743:        MOV  SCLEN(XL),SCNIL  SET INPUT IMAGE LENGTH TOO
                   13744: *
                   13745: *      MERGE TO EXIT
                   13746: *
                   13747: COP02  EXI                   RETURN TO CALLER
                   13748:        ENP                   END PROCEDURE COPND
                   13749:        EJC
                   13750: *
                   13751: *      DFFNC -- DEFINE FUNCTION
                   13752: *
                   13753: *      DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
                   13754: *      A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
                   13755: *
                   13756: *      (XR)                  POINTER TO VRBLK
                   13757: *      (XL)                  POINTER TO NEW FUNCTION BLOCK
                   13758: *      JSR  DFFNC            CALL TO DEFINE FUNCTION
                   13759: *      (WA,WB)               DESTROYED
                   13760: *
                   13761: DFFNC  PRC  E,0              ENTRY POINT
                   13762: .IF    .CNLD
                   13763: .ELSE
                   13764:        BNE  (XL),=B$EFC,DFFN1 SKIP IF NEW FUNCTION NOT EXTERNAL
                   13765:        ICV  EFUSE(XL)        ELSE INCREMENT ITS USE COUNT
                   13766: *
                   13767: *      HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
                   13768: *
                   13769: DFFN1  MOV  XR,WA            SAVE VRBLK POINTER
                   13770:        MOV  VRFNC(XR),XR     LOAD OLD FUNCTION POINTER
                   13771:        BNE  (XR),=B$EFC,DFFN2 JUMP IF OLD FUNCTION NOT EXTERNAL
                   13772:        MOV  EFUSE(XR),WB     ELSE GET USE COUNT
                   13773:        DCV  WB               DECREMENT
                   13774:        MOV  WB,EFUSE(XR)     STORE DECREMENTED VALUE
                   13775:        BNZ  WB,DFFN2         JUMP IF USE COUNT STILL NON-ZERO
                   13776:        JSR  SYSUL            ELSE CALL SYSTEM UNLOAD FUNCTION
                   13777: *
                   13778: *      HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
                   13779: *
                   13780: DFFN2  MOV  WA,XR            RESTORE VRBLK POINTER
                   13781: .FI
                   13782:        MOV  XL,WA            COPY FUNCTION BLOCK PTR
                   13783:        BLT  XR,=R$YYY,DFFN3  SKIP CHECKS IF OPSYN OP DEFINITION
                   13784:        BNZ  VRLEN(XR),DFFN3  JUMP IF NOT SYSTEM VARIABLE
                   13785: *
                   13786: *      FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
                   13787: *
                   13788:        MOV  VRSVP(XR),XL     POINT TO SVBLK
                   13789:        MOV  SVBIT(XL),WB     LOAD BIT INDICATORS
                   13790:        ANB  BTFNC,WB         IS IT A SYSTEM FUNCTION
                   13791:        ZRB  WB,DFFN3         REDEF OK IF NOT
                   13792:        ERB  217,ATTEMPTED REDEFINITION OF SYSTEM FUNCTION
                   13793: *
                   13794: *      HERE IF REDEFINITION IS PERMITTED
                   13795: *
                   13796: DFFN3  MOV  WA,VRFNC(XR)     STORE NEW FUNCTION POINTER
                   13797:        MOV  WA,XL            RESTORE FUNCTION BLOCK POINTER
                   13798:        EXI                   RETURN TO DFFNC CALLER
                   13799:        ENP                   END PROCEDURE DFFNC
                   13800:        EJC
                   13801: *
                   13802: *      DTYPE -- GET DATATYPE NAME
                   13803: *
                   13804: *      (XR)                  OBJECT WHOSE DATATYPE IS REQUIRED
                   13805: *      JSR  DTYPE            CALL TO GET DATATYPE
                   13806: *      (XR)                  RESULT DATATYPE
                   13807: *
                   13808: DTYPE  PRC  E,0              ENTRY POINT
                   13809:        BEQ  (XR),=B$PDT,DTYP1   JUMP IF PROG.DEFINED
                   13810:        MOV  (XR),XR          LOAD TYPE WORD
                   13811:        LEI  XR               GET ENTRY POINT ID (BLOCK CODE)
                   13812:        WTB  XR               CONVERT TO BAU OFFSET
                   13813:        MOV  SCNMT(XR),XR     LOAD TABLE ENTRY
                   13814:        EXI                   EXIT TO DTYPE CALLER
                   13815: *
                   13816: *      HERE IF PROGRAM DEFINED
                   13817: *
                   13818: DTYP1  MOV  PDDFP(XR),XR     POINT TO DFBLK
                   13819:        MOV  DFNAM(XR),XR     GET DATATYPE NAME FROM DFBLK
                   13820:        EXI                   RETURN TO DTYPE CALLER
                   13821:        ENP                   END PROCEDURE DTYPE
                   13822:        EJC
                   13823: *
                   13824: *      DUMPR -- PRINT DUMP OF STORAGE
                   13825: *
                   13826: *      (XR)                  DUMP ARGUMENT (SEE BELOW)
                   13827: *      JSR  DUMPR            CALL TO PRINT DUMP
                   13828: *      (XR,XL)               DESTROYED
                   13829: *      (WA,WB,WC,RA)         DESTROYED
                   13830: *
                   13831: *      THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
                   13832: *
                   13833: *      DMARG = 0             NO DUMP PRINTED
                   13834: *      DMARG = 1             PARTIAL DUMP (NAT VARS, KEYWORDS)
                   13835: *      DMARG GE 2            FULL DUMP (INCL ARRAYS ETC.)
                   13836: *
                   13837: *      SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
                   13838: *      COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
                   13839: *      AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
                   13840: *
                   13841: DUMPR  PRC  E,0              ENTRY POINT
                   13842:        BZE  XR,DMP28         SKIP DUMP IF ARGUMENT IS ZERO
                   13843:        ZER  XL               CLEAR XL
                   13844:        ZER  WB               ZERO MOVE OFFSET
                   13845:        MOV  XR,DMARG         SAVE DUMP ARGUMENT
                   13846:        JSR  GBCOL            COLLECT GARBAGE
                   13847:        JSR  PRTPG            EJECT PRINTER
                   13848:        MOV  =DMHDV,XR        POINT TO HEADING FOR VARIABLES
                   13849:        JSR  PRTFB            PRINT IT
                   13850: *
                   13851: *      FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
                   13852: *      ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
                   13853: *      THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
                   13854: *      NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
                   13855: *      INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME  OR
                   13856: *      PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
                   13857: *      FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
                   13858: *      EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
                   13859: *      ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
                   13860: *      OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
                   13861: *
                   13862:        ZER  DMVCH            SET NULL CHAIN TO START
                   13863:        MOV  HSHTB,WA         POINT TO HASH TABLE
                   13864: *
                   13865: *      LOOP THROUGH HEADERS IN HASH TABLE
                   13866: *
                   13867: DMP00  MOV  WA,XR            COPY HASH BUCKET POINTER
                   13868:        ICA  WA               BUMP POINTER
                   13869:        SUB  *VRNXT,XR        SET OFFSET TO MERGE
                   13870: *
                   13871: *      LOOP THROUGH VRBLKS ON ONE CHAIN
                   13872: *
                   13873: DMP01  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON CHAIN
                   13874:        BZE  XR,DMP09         JUMP IF END OF THIS HASH CHAIN
                   13875:        MOV  XR,XL            ELSE COPY VRBLK POINTER
                   13876:        EJC
                   13877: *
                   13878: *      DUMPR (CONTINUED)
                   13879: *
                   13880: *      LOOP TO FIND VALUE AND SKIP IF NULL
                   13881: *
                   13882: DMP02  MOV  VRVAL(XL),XL     LOAD VALUE
                   13883:        BEQ  XL,=NULLS,DMP01  LOOP FOR NEXT VRBLK IF NULL VALUE
                   13884:        BEQ  (XL),=B$TRT,DMP02 LOOP BACK IF VALUE IS TRAPPED
                   13885: *
                   13886: *      NON-NULL VALUE, PREPARE TO SEARCH CHAIN
                   13887: *
                   13888:        MOV  XR,WC            SAVE VRBLK POINTER
                   13889:        ADD  *VRSOF,XR        ADJUST PTR TO BE LIKE SCBLK PTR
                   13890:        BNZ  SCLEN(XR),DMP03  JUMP IF NON-SYSTEM VARIABLE
                   13891:        MOV  VRSVO(XR),XR     ELSE LOAD PTR TO NAME IN SVBLK
                   13892: *
                   13893: *      HERE WITH NAME POINTER FOR NEW BLOCK IN XR
                   13894: *
                   13895: DMP03  MOV  XR,WB            SAVE POINTER TO CHARS
                   13896:        MOV  WA,DMPSV         SAVE HASH BUCKET POINTER
                   13897:        MOV  =DMVCH,WA        POINT TO CHAIN HEAD
                   13898: *
                   13899: *      LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
                   13900: *
                   13901: DMP04  MOV  WA,DMPCH         SAVE CHAIN POINTER
                   13902:        MOV  WA,XL            COPY IT
                   13903:        MOV  (XL),XR          LOAD POINTER TO NEXT ENTRY
                   13904:        BZE  XR,DMP08         JUMP IF END OF CHAIN TO INSERT
                   13905:        ADD  *VRSOF,XR        ELSE GET NAME PTR FOR CHAINED VRBLK
                   13906:        BNZ  SCLEN(XR),DMP05  JUMP IF NOT SYSTEM VARIABLE
                   13907:        MOV  VRSVO(XR),XR     ELSE POINT TO NAME IN SVBLK
                   13908: *
                   13909: *      HERE PREPARE TO COMPARE THE NAMES
                   13910: *
                   13911: *      (WA)                  SCRATCH
                   13912: *      (WB)                  POINTER TO STRING OF ENTERING VRBLK
                   13913: *      (WC)                  POINTER TO ENTERING VRBLK
                   13914: *      (XR)                  POINTER TO STRING OF CURRENT BLOCK
                   13915: *      (XL)                  SCRATCH
                   13916: *
                   13917: DMP05  MOV  WB,XL            POINT TO ENTERING VRBLK STRING
                   13918:        MOV  SCLEN(XL),WA     LOAD ITS LENGTH
                   13919:        PLC  XL               POINT TO CHARS OF ENTERING STRING
                   13920:        BHI  WA,SCLEN(XR),DMP06 JUMP IF ENTERING LENGTH HIGH
                   13921:        PLC  XR               ELSE POINT TO CHARS OF OLD STRING
                   13922:        CMC  DMP08,DMP07      COMPARE, INSERT IF NEW IS LLT OLD
                   13923:        BRN  DMP08            OR IF LEQ (WE HAD SHORTER LENGTH)
                   13924: *
                   13925: *      HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
                   13926: *
                   13927: DMP06  MOV  SCLEN(XR),WA     LOAD SHORTER LENGTH
                   13928:        PLC  XR               POINT TO CHARS OF OLD STRING
                   13929:        CMC  DMP08,DMP07      COMPARE, INSERT IF NEW ONE LOW
                   13930:        EJC
                   13931: *
                   13932: *      DUMPR (CONTINUED)
                   13933: *
                   13934: *      HERE WE MOVE OUT ON THE CHAIN
                   13935: *
                   13936: DMP07  MOV  DMPCH,XL         COPY CHAIN POINTER
                   13937:        MOV  (XL),WA          MOVE TO NEXT ENTRY ON CHAIN
                   13938:        BRN  DMP04            LOOP BACK
                   13939: *
                   13940: *      HERE AFTER LOCATING THE PROPER INSERTION POINT
                   13941: *
                   13942: DMP08  MOV  DMPCH,XL         COPY CHAIN POINTER
                   13943:        MOV  DMPSV,WA         RESTORE HASH BUCKET POINTER
                   13944:        MOV  WC,XR            RESTORE VRBLK POINTER
                   13945:        MOV  (XL),VRGET(XR)   LINK VRBLK TO REST OF CHAIN
                   13946:        MOV  XR,(XL)          LINK VRBLK INTO CURRENT CHAIN LOC
                   13947:        BRN  DMP01            LOOP BACK FOR NEXT VRBLK
                   13948: *
                   13949: *      HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
                   13950: *
                   13951: DMP09  BNE  WA,HSHTE,DMP00   LOOP BACK IF MORE BUCKETS TO GO
                   13952: *
                   13953: *      LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
                   13954: *
                   13955: DMP10  MOV  DMVCH,XR         LOAD POINTER TO NEXT ENTRY ON CHAIN
                   13956:        BZE  XR,DMP11         JUMP IF END OF CHAIN
                   13957:        MOV  (XR),DMVCH       ELSE UPDATE CHAIN PTR TO NEXT ENTRY
                   13958:        JSR  SETVR            RESTORE VRGET FIELD
                   13959:        MOV  XR,XL            COPY VRBLK POINTER (NAME BASE)
                   13960:        MOV  *VRVAL,WA        SET OFFSET FOR VRBLK NAME
                   13961:        JSR  PRTNV            PRINT NAME = VALUE
                   13962:        BRN  DMP10            LOOP BACK TILL ALL PRINTED
                   13963: *
                   13964: *      PREPARE TO PRINT KEYWORDS
                   13965: *
                   13966: DMP11  JSR  PRTFH            PRINT BLANK LINE
                   13967:        JSR  PRTFH            AND ANOTHER
                   13968:        MOV  =DMHDK,XR        POINT TO KEYWORD HEADING
                   13969:        JSR  PRTFB            PRINT HEADING
                   13970:        MOV  =VDMKW,XL        POINT TO LIST OF KEYWORD SVBLK PTRS
                   13971:        EJC
                   13972: *
                   13973: *      DUMPR (CONTINUED)
                   13974: *
                   13975: *      LOOP TO DUMP KEYWORD VALUES
                   13976: *
                   13977: DMP12  MOV  (XL)+,XR         LOAD NEXT SVBLK PTR FROM TABLE
                   13978:        BZE  XR,DMP13         JUMP IF END OF LIST
                   13979:        MOV  =CH$AM,WA        LOAD AMPERSAND
                   13980:        JSR  PRTCH            PRINT AMPERSAND
                   13981:        JSR  PRTST            PRINT KEYWORD NAME
                   13982:        MOV  SVLEN(XR),WA     LOAD NAME LENGTH FROM SVBLK
                   13983:        CTB  WA,SVCHS         GET LENGTH OF NAME
                   13984:        ADD  WA,XR            POINT TO SVKNM FIELD
                   13985:        MOV  (XR),DMPKN       STORE IN DUMMY KVBLK
                   13986:        MOV  =TMBEB,XR        POINT TO BLANK-EQUAL-BLANK
                   13987:        JSR  PRTST            PRINT IT
                   13988:        MOV  XL,DMPSV         SAVE TABLE POINTER
                   13989:        MOV  =DMPKB,XL        POINT TO DUMMY KVBLK
                   13990:        MOV  *KVVAR,WA        SET ZERO OFFSET
                   13991:        JSR  ACESS            GET KEYWORD VALUE
                   13992:        PPM                   FAILURE IS IMPOSSIBLE
                   13993:        JSR  PRTVF            PRINT KEYWORD VALUE
                   13994:        MOV  DMPSV,XL         RESTORE TABLE POINTER
                   13995:        BRN  DMP12            LOOP BACK TILL ALL PRINTED
                   13996: *
                   13997: *      HERE AFTER COMPLETING PARTIAL DUMP
                   13998: *
                   13999: DMP13  BEQ  DMARG,=NUM01,DMP27 EXIT IF PARTIAL DUMP COMPLETE
                   14000:        MOV  DNAMB,XR         ELSE POINT TO FIRST DYNAMIC BLOCK
                   14001: *
                   14002: *      LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
                   14003: *
                   14004: DMP14  BEQ  XR,DNAMP,DMP27   JUMP IF END OF USED REGION
                   14005:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF BLOCK
                   14006:        BEQ  WA,=B$VCT,DMP16  JUMP IF VECTOR
                   14007:        BEQ  WA,=B$ART,DMP17  JUMP IF ARRAY
                   14008:        BEQ  WA,=B$PDT,DMP18  JUMP IF PROGRAM DEFINED
                   14009:        BEQ  WA,=B$TBT,DMP19  JUMP IF TABLE
                   14010: .IF    .CNBF
                   14011: .ELSE
                   14012:        BEQ  WA,=B$BCT,DMP29  JUMP IF BUFFER
                   14013: .FI
                   14014: *
                   14015: *      MERGE HERE TO MOVE TO NEXT BLOCK
                   14016: *
                   14017: DMP15  JSR  BLKLN            GET LENGTH OF BLOCK
                   14018:        ADD  WA,XR            POINT PAST THIS BLOCK
                   14019:        BRN  DMP14            LOOP BACK FOR NEXT BLOCK
                   14020:        EJC
                   14021: *
                   14022: *      DUMPR (CONTINUED)
                   14023: *
                   14024: *      HERE FOR VECTOR
                   14025: *
                   14026: DMP16  MOV  *VCVLS,WB        SET OFFSET TO FIRST VALUE
                   14027:        BRN  DMP19            JUMP TO MERGE
                   14028: *
                   14029: *      HERE FOR ARRAY
                   14030: *
                   14031: DMP17  MOV  AROFS(XR),WB     SET OFFSET TO ARPRO FIELD
                   14032:        ICA  WB               BUMP TO GET OFFSET TO VALUES
                   14033:        BRN  DMP19            JUMP TO MERGE
                   14034: *
                   14035: *      HERE FOR PROGRAM DEFINED
                   14036: *
                   14037: DMP18  MOV  *PDFLD,WB        POINT TO VALUES, MERGE
                   14038: *
                   14039: *      HERE FOR TABLE (OTHERS MERGE)
                   14040: *
                   14041: DMP19  BZE  IDVAL(XR),DMP15  IGNORE BLOCK IF ZERO ID VALUE
                   14042:        JSR  BLKLN            ELSE GET BLOCK LENGTH
                   14043:        MOV  XR,XL            COPY BLOCK POINTER
                   14044:        MOV  WA,DMPSV         SAVE LENGTH
                   14045:        MOV  WB,WA            COPY OFFSET TO FIRST VALUE
                   14046:        JSR  PRTFH            PRINT BLANK LINE
                   14047:        MOV  WA,DMPSA         PRESERVE OFFSET
                   14048:        JSR  PRTVF            PRINT BLOCK VALUE (FOR TITLE)
                   14049:        MOV  DMPSA,WA         RECOVER OFFSET
                   14050:        BEQ  (XR),=B$TBT,DMP22 JUMP IF TABLE
                   14051:        DCA  WA               POINT BEFORE FIRST WORD
                   14052: *
                   14053: *      LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
                   14054: *
                   14055: DMP20  MOV  XL,XR            COPY BLOCK POINTER
                   14056:        ICA  WA               BUMP OFFSET
                   14057:        ADD  WA,XR            POINT TO NEXT VALUE
                   14058:        BEQ  WA,DMPSV,DMP14   EXIT IF END (XR PAST BLOCK)
                   14059:        SUB  *VRVAL,XR        SUBTRACT OFFSET TO MERGE INTO LOOP
                   14060: *
                   14061: *      LOOP TO FIND VALUE AND IGNORE NULLS
                   14062: *
                   14063: DMP21  MOV  VRVAL(XR),XR     LOAD NEXT VALUE
                   14064:        BEQ  XR,=NULLS,DMP20  LOOP BACK IF NULL VALUE
                   14065:        BEQ  (XR),=B$TRT,DMP21 LOOP BACK IF TRAPPED
                   14066:        JSR  PRTNV            ELSE PRINT NAME = VALUE
                   14067:        BRN  DMP20            LOOP BACK FOR NEXT FIELD
                   14068:        EJC
                   14069: *
                   14070: *      DUMPR (CONTINUED)
                   14071: *
                   14072: *      HERE TO DUMP A TABLE
                   14073: *
                   14074: DMP22  MOV  *TBBUK,WC        SET OFFSET TO FIRST BUCKET
                   14075:        MOV  *TEVAL,WA        SET NAME OFFSET FOR ALL TEBLKS
                   14076: *
                   14077: *      LOOP THROUGH TABLE BUCKETS
                   14078: *
                   14079: DMP23  MOV  XL,-(XS)         SAVE TBBLK POINTER
                   14080:        ADD  WC,XL            POINT TO NEXT BUCKET HEADER
                   14081:        ICA  WC               BUMP BUCKET OFFSET
                   14082:        SUB  *TENXT,XL        SUBTRACT OFFSET TO MERGE INTO LOOP
                   14083: *
                   14084: *      LOOP TO PROCESS TEBLKS ON ONE CHAIN
                   14085: *
                   14086: DMP24  MOV  TENXT(XL),XL     POINT TO NEXT TEBLK
                   14087:        BEQ  XL,(XS),DMP26    JUMP IF END OF CHAIN
                   14088:        MOV  XL,XR            ELSE COPY TEBLK POINTER
                   14089: *
                   14090: *      LOOP TO FIND VALUE AND IGNORE IF NULL
                   14091: *
                   14092: DMP25  MOV  TEVAL(XR),XR     LOAD NEXT VALUE
                   14093:        BEQ  XR,=NULLS,DMP24  IGNORE IF NULL VALUE
                   14094:        BEQ  (XR),=B$TRT,DMP25 LOOP BACK IF TRAPPED
                   14095:        MOV  WC,DMPSV         ELSE SAVE OFFSET POINTER
                   14096:        JSR  PRTNV            PRINT NAME = VALUE
                   14097:        MOV  DMPSV,WC         RELOAD OFFSET
                   14098:        BRN  DMP24            LOOP BACK FOR NEXT TEBLK
                   14099: *
                   14100: *      HERE TO MOVE TO NEXT HASH CHAIN
                   14101: *
                   14102: DMP26  MOV  (XS)+,XL         RESTORE TBBLK POINTER
                   14103:        BNE  WC,TBLEN(XL),DMP23 LOOP BACK IF MORE BUCKETS TO GO
                   14104:        MOV  XL,XR            ELSE COPY TABLE POINTER
                   14105:        ADD  WC,XR            POINT TO FOLLOWING BLOCK
                   14106:        BRN  DMP14            LOOP BACK TO PROCESS NEXT BLOCK
                   14107: *
                   14108: *      HERE AFTER COMPLETING DUMP
                   14109: *
                   14110: DMP27  JSR  PRTPG            EJECT PRINTER
                   14111: *
                   14112: *      MERGE HERE IF NO DUMP GIVEN (DMARG=0)
                   14113: *
                   14114: DMP28  EXI                   RETURN TO DUMP CALLER
                   14115: .IF    .CNBF
                   14116: .ELSE
                   14117:        EJC
                   14118: *
                   14119: *      DUMPR (CONTINUED)
                   14120: *
                   14121: *      HERE TO DUMP BUFFER BLOCK
                   14122: *
                   14123: DMP29  JSR  PRTFH            PRINT BLANK LINE
                   14124:        JSR  PRTVF            PRINT VALUE ID FOR TITLE
                   14125:        MOV  =CH$DQ,WA        LOAD DOUBLE QUOTE
                   14126:        JSR  PRTCH            PRINT IT
                   14127:        MOV  BCLEN(XR),WC     LOAD DEFINED LENGTH
                   14128:        BZE  WC,DMP32         SKIP CHARACTERS IF NONE
                   14129:        LCT  WC,WC            LOAD COUNT FOR LOOP
                   14130:        MOV  XR,WB            SAVE BCBLK PTR
                   14131:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   14132:        PLC  XR               GET SET TO LOAD CHARACTERS
                   14133: *
                   14134: *      LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
                   14135: *
                   14136: DMP31  LCH  WA,(XR)+         GET NEXT CHARACTER
                   14137:        JSR  PRTCH            STUFF IT
                   14138:        BCT  WC,DMP31         BRANCH FOR NEXT ONE
                   14139:        MOV  WB,XR            RESTORE BCBLK POINTER
                   14140: *
                   14141: *      MERGE TO STUFF CLOSING QUOTE MARK
                   14142: *
                   14143: DMP32  MOV  =CH$DQ,WA        STUFF QUOTE
                   14144:        JSR  PRTCF            PRINT IT
                   14145:        MOV  (XR),WA          GET FIRST WD FOR BLKLN
                   14146:        BRN  DMP15            MERGE TO GET NEXT BLOCK
                   14147: .FI
                   14148:        ENP                   END PROCEDURE DUMPR
                   14149:        EJC
                   14150: *
                   14151: *      ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
                   14152: *
                   14153: *      KVERT                 ERROR CODE
                   14154: *      JSR  ERMSG            CALL TO PRINT MESSAGE
                   14155: *      (XR,XL,WA,WB,WC,IA)   DESTROYED
                   14156: *
                   14157: ERMSG  PRC  E,0              ENTRY POINT
                   14158:        JSR  PRTFH            PRINT ERROR PTR OR BLANK LINE
                   14159:        MOV  KVERT,WA         LOAD ERROR CODE
                   14160:        MOV  =ERMMS,XR        POINT TO ERROR MESSAGE /ERROR/
                   14161:        JSR  PRTST            PRINT IT
                   14162:        JSR  ERTEX            GET ERROR MESSAGE TEXT
                   14163:        ADD  =THSND,WA        BUMP ERROR CODE FOR PRINT
                   14164:        MTI  WA               FAIL CODE IN INT ACC
                   14165:        JSR  PRTIN            PRINT CODE (NOW HAVE ERROR1XXX)
                   14166:        MOV  PRBUF,XL         POINT TO PRINT BUFFER
                   14167:        PSC  XL,=NUM05        POINT TO THE 1
                   14168:        MOV  =CH$BL,WA        LOAD A BLANK
                   14169:        SCH  WA,(XL)          STORE BLANK OVER 1 (ERROR XXX)
                   14170:        CSC  XL               COMPLETE STORE CHARACTERS
                   14171:        ZER  XL               CLEAR GARBAGE POINTER IN XL
                   14172:        MOV  XR,WA            KEEP ERROR TEXT
                   14173:        MOV  =ERMNS,XR        POINT TO / -- /
                   14174:        JSR  PRTST            PRINT IT
                   14175:        MOV  WA,XR            GET ERROR TEXT AGAIN
                   14176:        JSR  PRTFB            PRINT ERROR MESSAGE TEXT
                   14177:        EXI                   RETURN TO ERMSG CALLER
                   14178:        ENP                   END PROCEDURE ERMSG
                   14179:        EJC
                   14180: *
                   14181: *      ERTEX -- GET ERROR MESSAGE TEXT
                   14182: *
                   14183: *      (WA)                  ERROR CODE
                   14184: *      JSR  ERTEX            CALL TO GET ERROR TEXT
                   14185: *      (XR)                  PTR TO ERROR TEXT IN DYNAMIC
                   14186: *      (R$ETX)               COPY OF PTR TO ERROR TEXT
                   14187: *      (XL,WC,IA)            DESTROYED
                   14188: *
                   14189: ERTEX  PRC  E,0              ENTRY POINT
                   14190:        MOV  WA,ERTWA         SAVE WA
                   14191:        MOV  WB,ERTWB         SAVE WB
                   14192:        BNZ  EROSN,ERT03      SKIP IF SPECIAL EROSI RETURN
                   14193:        JSR  SYSEM            GET FAILURE MESSAGE TEXT
                   14194:        MOV  XR,XL            COPY POINTER TO IT
                   14195:        MOV  SCLEN(XR),WA     GET LENGTH OF STRING
                   14196:        BZE  WA,ERT02         JUMP IF NULL
                   14197:        ZER  WB               OFFSET OF ZERO
                   14198:        JSR  SBSTR            COPY INTO DYNAMIC STORE
                   14199:        MOV  XR,R$ETX         STORE FOR RELOCATION
                   14200: *
                   14201: *      RETURN
                   14202: *
                   14203: ERT01  MOV  ERTWB,WB         RESTORE WB
                   14204:        MOV  ERTWA,WA         RESTORE WA
                   14205:        EXI                   RETURN TO CALLER
                   14206: *
                   14207: *      RETURN ERRTEXT CONTENTS INSTEAD OF NULL
                   14208: *
                   14209: ERT02  MOV  R$ETX,XR         GET ERRTEXT
                   14210:        BRN  ERT01            RETURN
                   14211: *
                   14212: *      SPECIAL CASE SET UP BY EROSI RETURN TO AVOID SYSEM CALL
                   14213: *
                   14214: ERT03  ZER  EROSN            CLEAR FLAG
                   14215:        MOV  R$ETX,XR         GET ERROR MESSAGE TEXT
                   14216:        BRN  ERT01            RETURN WITHOUT MAKING SYSEM CALL
                   14217:        ENP
                   14218:        EJC
                   14219: *
                   14220: *      EVALI -- EVALUATE INTEGER ARGUMENT
                   14221: *
                   14222: *      EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
                   14223: *      WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
                   14224: *
                   14225: *      (XR)                  NODE POINTER
                   14226: *      (WB)                  CURSOR
                   14227: *      JSR  EVALI            CALL TO EVALUATE INTEGER
                   14228: *      PPM  LOC              TRANSFER LOC FOR NON-INTEGER ARG
                   14229: *      PPM  LOC              TRANSFER LOC FOR OUT OF RANGE ARG
                   14230: *      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
                   14231: *      (XR)                  PTR TO NODE WITH INTEGER ARGUMENT
                   14232: *      (WC,XL,RA)            DESTROYED
                   14233: *
                   14234: *      ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
                   14235: *      IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
                   14236: *      THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
                   14237: *
                   14238: EVALI  PRC  R,3              ENTRY POINT (RECURSIVE)
                   14239:        JSR  EVALP            EVALUATE EXPRESSION
                   14240:        PPM  EVLI1            JUMP ON FAILURE
                   14241:        MOV  XL,-(XS)         STACK RESULT FOR GTSMI
                   14242:        MOV  PTHEN(XR),XL     LOAD SUCCESSOR POINTER
                   14243:        JSR  GTSMI            CONVERT ARG TO SMALL INTEGER
                   14244:        PPM  EVLI2            JUMP IF NOT INTEGER
                   14245:        PPM  EVLI3            JUMP IF OUT OF RANGE
                   14246:        MOV  XR,EVLIV         STORE RESULT IN SPECIAL DUMMY NODE
                   14247:        MOV  XL,EVLIS         STORE SUCCESSOR POINTER
                   14248:        MOV  =EVLIN,XR        POINT TO DUMMY NODE WITH RESULT
                   14249:        EXI                   SUCCESSFUL RETURN
                   14250: *
                   14251: *      HERE IF EVALUATION FAILS
                   14252: *
                   14253: EVLI1  EXI  3                TAKE FAILURE RETURN
                   14254: *
                   14255: *      HERE IF ARGUMENT IS NOT INTEGER
                   14256: *
                   14257: EVLI2  EXI  1                TAKE NON-INTEGER ERROR EXIT
                   14258: *
                   14259: *      HERE IF ARGUMENT IS OUT OF RANGE
                   14260: *
                   14261: EVLI3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
                   14262:        ENP                   END PROCEDURE EVALI
                   14263:        EJC
                   14264: *
                   14265: *      EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
                   14266: *
                   14267: *      EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
                   14268: *      A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
                   14269: *      VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
                   14270: *
                   14271: *      EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
                   14272: *      AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
                   14273: *
                   14274: *      (XR)                  NODE POINTER
                   14275: *      (WB)                  PATTERN MATCH CURSOR
                   14276: *      JSR  EVALP            CALL TO EVALUATE EXPRESSION
                   14277: *      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
                   14278: *      (XL)                  RESULT
                   14279: *      (WA)                  FIRST WORD OF RESULT BLOCK
                   14280: *      (XR,WB)               DESTROYED (FAILURE CASE ONLY)
                   14281: *      (WC,RA)               DESTROYED
                   14282: *
                   14283: *      THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
                   14284: *
                   14285: *      CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
                   14286: *
                   14287: EVALP  PRC  R,1              ENTRY POINT (RECURSIVE)
                   14288:        MOV  PARM1(XR),XL     LOAD EXPRESSION POINTER
                   14289:        BEQ  (XL),=B$EXL,EVLP1 JUMP IF EXBLK CASE
                   14290: *
                   14291: *      HERE FOR CASE OF SEBLK
                   14292: *
                   14293: *      WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
                   14294: *      NOT AN EXPRESSION AND IS NOT TRAPPED.
                   14295: *
                   14296:        MOV  SEVAR(XL),XL     LOAD VRBLK POINTER
                   14297:        MOV  VRVAL(XL),XL     LOAD VALUE OF VRBLK
                   14298:        MOV  (XL),WA          LOAD FIRST WORD OF VALUE
                   14299:        BHI  WA,=B$T$$,EVLP3  JUMP IF NOT SEBLK, TRBLK OR EXBLK
                   14300: *
                   14301: *      HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
                   14302: *
                   14303: EVLP1  MOV  XR,-(XS)         STACK NODE POINTER
                   14304:        MOV  WB,-(XS)         STACK CURSOR
                   14305:        MOV  R$PMS,-(XS)      STACK SUBJECT STRING POINTER
                   14306:        MOV  PMSSL,-(XS)      STACK SUBJECT STRING LENGTH
                   14307:        MOV  PMDFL,-(XS)      STACK DOT FLAG
                   14308:        MOV  PMHBS,-(XS)      STACK HISTORY STACK BASE POINTER
                   14309:        MOV  PARM1(XR),XR     LOAD EXPRESSION POINTER
                   14310:        EJC
                   14311: *
                   14312: *      EVALP (CONTINUED)
                   14313: *
                   14314: *      LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
                   14315: *
                   14316: EVLP2  ZER  WB               SET FLAG FOR BY VALUE
                   14317:        JSR  EVALX            EVALUATE EXPRESSION
                   14318:        PPM  EVLP4            JUMP ON FAILURE
                   14319:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF VALUE
                   14320:        BLO  WA,=B$E$$,EVLP2  LOOP BACK TO REEVALUATE EXPRESSION
                   14321: *
                   14322: *      HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
                   14323: *
                   14324:        MOV  XR,XL            COPY RESULT POINTER
                   14325:        MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   14326:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   14327:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   14328:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   14329:        MOV  (XS)+,WB         RESTORE CURSOR
                   14330:        MOV  (XS)+,XR         RESTORE NODE POINTER
                   14331: *
                   14332: *      COMMON EXIT POINT
                   14333: *
                   14334: EVLP3  EXI                   RETURN TO EVALP CALLER
                   14335: *
                   14336: *      HERE FOR FAILURE DURING EVALUATION
                   14337: *
                   14338: EVLP4  MOV  (XS)+,PMHBS      RESTORE HISTORY STACK BASE POINTER
                   14339:        MOV  (XS)+,PMDFL      RESTORE DOT FLAG
                   14340:        MOV  (XS)+,PMSSL      RESTORE SUBJECT STRING LENGTH
                   14341:        MOV  (XS)+,R$PMS      RESTORE SUBJECT STRING POINTER
                   14342:        ADD  *NUM02,XS        REMOVE NODE PTR, CURSOR
                   14343:        EXI  1                TAKE FAILURE EXIT
                   14344:        ENP                   END PROCEDURE EVALP
                   14345:        EJC
                   14346: *
                   14347: *      EVALS -- EVALUATE STRING ARGUMENT
                   14348: *
                   14349: *      EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
                   14350: *      THEY ARE PASSED AN EXPRESSION ARGUMENT.
                   14351: *
                   14352: *      (XR)                  NODE POINTER
                   14353: *      (WA)                  APPROPRIATE MULTI CHARACTER PCODE
                   14354: *      (WB)                  CURSOR
                   14355: *      JSR  EVALS            CALL TO EVALUATE STRING
                   14356: *      PPM  LOC              TRANSFER LOC FOR NON-STRING ARG
                   14357: *      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
                   14358: *      (XL)                  PCODE OF NEW NODE (ENTRY WA)
                   14359: *      (XR)                  PTR TO NODE WITH PARMS SET
                   14360: *      (WA,WC,RA)            DESTROYED
                   14361: *
                   14362: *      ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
                   14363: *      POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
                   14364: *      SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
                   14365: *      OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
                   14366: *      THIS IS DONE BY THE USUAL INDIRECT BRANCH THROUGH THE
                   14367: *      PCODE PASSED IN WA.
                   14368: *
                   14369: EVALS  PRC  R,2              ENTRY POINT (RECURSIVE)
                   14370:        MOV  WA,-(XS)         KEEP PCODE
                   14371:        JSR  EVALP            EVALUATE EXPRESSION
                   14372:        PPM  EVLS1            JUMP IF EVALUATION FAILS
                   14373:        MOV  (XS)+,WA         RECOVER PCODE
                   14374:        MOV  PTHEN(XR),-(XS)  SAVE SUCCESSOR POINTER
                   14375:        MOV  WB,-(XS)         SAVE CURSOR
                   14376:        MOV  XL,-(XS)         STACK RESULT PTR FOR PATST
                   14377:        ZER  WB               DUMMY PCODE FOR ONE CHAR STRING
                   14378:        ZER  WC               DUMMY PCODE FOR EXPRESSION ARG
                   14379:        MOV  WA,XL            APPROPRIATE PCODE FOR OUR USE
                   14380:        JSR  PATST            CALL ROUTINE TO BUILD NODE
                   14381:        PPM  EVLS2            JUMP IF NOT STRING
                   14382:        MOV  (XS)+,WB         RESTORE CURSOR
                   14383:        MOV  (XS)+,PTHEN(XR)  STORE SUCCESSOR POINTER
                   14384:        MOV  (XR),XL          GET PCODE
                   14385:        EXI                   TAKE SUCCESS RETURN
                   14386: *
                   14387: *      HERE IF EVALUATION FAILS
                   14388: *
                   14389: EVLS1  MOV  (XS)+,WA         POP STACK
                   14390:        EXI  2                TAKE FAILURE RETURN
                   14391: *
                   14392: *      HERE IF ARGUMENT IS NOT STRING
                   14393: *
                   14394: EVLS2  ADD  *NUM02,XS        POP SUCCESSOR AND CURSOR
                   14395:        EXI  1                TAKE NON-STRING ERROR EXIT
                   14396:        ENP                   END PROCEDURE EVALS
                   14397:        EJC
                   14398: *
                   14399: *      EVALX -- EVALUATE EXPRESSION
                   14400: *
                   14401: *      EVALX IS CALLED TO EVALUATE AN EXPRESSION
                   14402: *
                   14403: *      (XR)                  POINTER TO EXBLK OR SEBLK
                   14404: *      (WB)                  0 IF BY VALUE, 1 IF BY NAME
                   14405: *      JSR  EVALX            CALL TO EVALUATE EXPRESSION
                   14406: *      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
                   14407: *      (XR)                  RESULT IF CALLED BY VALUE
                   14408: *      (XL,WA)               RESULT NAME BASE,OFFSET IF BY NAME
                   14409: *      (XR)                  DESTROYED (NAME CASE ONLY)
                   14410: *      (XL,WA)               DESTROYED (VALUE CASE ONLY)
                   14411: *      (WB,WC,RA)            DESTROYED
                   14412: *
                   14413: EVALX  PRC  R,1              ENTRY POINT, RECURSIVE
                   14414:        BEQ  (XR),=B$EXL,EVLX2 JUMP IF EXBLK CASE
                   14415: *
                   14416: *      HERE FOR SEBLK
                   14417: *
                   14418:        MOV  SEVAR(XR),XL     LOAD VRBLK POINTER (NAME BASE)
                   14419:        MOV  *VRVAL,WA        SET NAME OFFSET
                   14420:        BNZ  WB,EVLX1         JUMP IF CALLED BY NAME
                   14421:        JSR  ACESS            CALL ROUTINE TO ACCESS VALUE
                   14422:        PPM  EVLX9            JUMP IF FAILURE ON ACCESS
                   14423: *
                   14424: *      MERGE HERE TO EXIT FOR SEBLK CASE
                   14425: *
                   14426: EVLX1  EXI                   RETURN TO EVALX CALLER
                   14427:        EJC
                   14428: *
                   14429: *      EVALX (CONTINUED)
                   14430: *
                   14431: *      HERE FOR FULL EXPRESSION (EXBLK) CASE
                   14432: *
                   14433: *      IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
                   14434: *      TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
                   14435: *      WITHOUT RETURNING TO THIS ROUTINE.
                   14436: *      THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
                   14437: *      GIVING CONTROL TO THE EXPRESSION CODE
                   14438: *
                   14439: *                            EVALX RETURN POINT
                   14440: *                            SAVED VALUE OF R$COD
                   14441: *                            CODE POINTER (-R$COD)
                   14442: *                            SAVED VALUE OF FLPTR
                   14443: *                            0 IF BY VALUE, 1 IF BY NAME
                   14444: *      FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
                   14445: *
                   14446: EVLX2  SCP  WC               GET CODE POINTER
                   14447:        MOV  R$COD,WA         LOAD CODE BLOCK POINTER
                   14448:        SUB  WA,WC            GET CODE POINTER AS OFFSET
                   14449:        MOV  WA,-(XS)         STACK OLD CODE BLOCK POINTER
                   14450:        MOV  WC,-(XS)         STACK RELATIVE CODE OFFSET
                   14451:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   14452:        MOV  WB,-(XS)         STACK NAME/VALUE INDICATOR
                   14453:        MOV  *EXFLC,-(XS)     STACK NEW FAIL OFFSET
                   14454:        MOV  FLPTR,GTCEF      KEEP IN CASE OF ERROR
                   14455:        MOV  R$COD,R$GTC      KEEP CODE BLOCK POINTER SIMILARLY
                   14456:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   14457:        MOV  XR,R$COD         SET NEW CODE BLOCK POINTER
                   14458:        MOV  KVSTN,EXSTM(XR)  REMEMBER STMNT NUMBER
                   14459:        ADD  *EXCOD,XR        POINT TO FIRST CODE WORD
                   14460:        LCP  XR               SET CODE POINTER
                   14461:        BNE  STAGE,=STGXT,EXITS JUMP IF NOT EXECUTION TIME
                   14462:        MOV  =STGEE,STAGE     EVALUATING EXPRESSION
                   14463:        BRN  EXITS            JUMP TO EXECUTE FIRST CODE WORD
                   14464:        EJC
                   14465: *
                   14466: *      EVALX (CONTINUED)
                   14467: *
                   14468: *      COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
                   14469: *
                   14470: EVLXV  MOV  (XS)+,XR         LOAD VALUE
                   14471:        BZE  1(XS),EVLX5      JUMP IF CALLED BY VALUE
                   14472:        ERB  218,EXPRESSION EVALUATED BY NAME RETURNED VALUE
                   14473: *
                   14474: *      HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
                   14475: *
                   14476: EVLXN  MOV  (XS)+,WA         LOAD NAME OFFSET
                   14477:        MOV  (XS)+,XL         LOAD NAME BASE
                   14478:        BNZ  1(XS),EVLX5      JUMP IF CALLED BY NAME
                   14479:        JSR  ACESS            ELSE ACCESS VALUE FIRST
                   14480:        PPM  EVLXF            JUMP IF FAILURE DURING ACCESS
                   14481: *
                   14482: *      HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
                   14483: *
                   14484: EVLX5  ZER  WB               NOTE SUCCESSFUL
                   14485:        BRN  EVLX7            MERGE
                   14486: *
                   14487: *      HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
                   14488: *
                   14489: EVLXF  MNZ  WB               NOTE UNSUCCESSFUL
                   14490: *
                   14491: *      RESTORE ENVIRONMENT
                   14492: *
                   14493: EVLX7  BNE  STAGE,=STGEE,EVLX8 SKIP IF WAS NOT PREVIOUSLY XT
                   14494:        MOV  =STGXT,STAGE     EXECUTE TIME
                   14495: *
                   14496: *      MERGE WITH STAGE SET UP
                   14497: *
                   14498: EVLX8  ADD  *NUM02,XS        POP NAME/VALUE INDICATOR, *EXFAL
                   14499:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   14500:        MOV  (XS)+,WC         LOAD CODE OFFSET
                   14501:        ADD  (XS),WC          MAKE CODE POINTER ABSOLUTE
                   14502:        MOV  (XS)+,R$COD      RESTORE OLD CODE BLOCK POINTER
                   14503:        LCP  WC               RESTORE OLD CODE POINTER
                   14504:        BZE  WB,EVLX1         JUMP FOR SUCCESSFUL RETURN
                   14505: *
                   14506: *      MERGE HERE FOR FAILURE IN SEBLK CASE
                   14507: *
                   14508: EVLX9  EXI  1                TAKE FAILURE EXIT
                   14509:        ENP                   END OF PROCEDURE EVALX
                   14510:        EJC
                   14511: *
                   14512: *      EXBLD -- BUILD EXBLK
                   14513: *
                   14514: *      EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
                   14515: *      CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
                   14516: *
                   14517: *      (XL)                  OFFSET IN CCBLK TO START OF CODE
                   14518: *      (WB)                  INTEGER IN RANGE 0 LE N LE MXLEN
                   14519: *      JSR  EXBLD            CALL TO BUILD EXBLK
                   14520: *      (XR)                  PTR TO CONSTRUCTED EXBLK
                   14521: *      (WA,WB,XL)            DESTROYED
                   14522: *
                   14523: EXBLD  PRC  E,0              ENTRY POINT
                   14524:        MOV  XL,WA            COPY OFFSET TO START OF CODE
                   14525:        SUB  *EXCOD,WA        CALC REDUCTION IN OFFSET IN EXBLK
                   14526:        MOV  WA,-(XS)         STACK FOR LATER
                   14527:        MOV  CWCOF,WA         LOAD FINAL OFFSET
                   14528:        SUB  XL,WA            COMPUTE LENGTH OF CODE
                   14529:        ADD  *EXSI$,WA        ADD SPACE FOR STANDARD FIELDS
                   14530:        JSR  ALLOC            ALLOCATE SPACE FOR EXBLK
                   14531:        MOV  XR,-(XS)         SAVE POINTER TO EXBLK
                   14532:        MOV  =B$EXL,EXTYP(XR) STORE TYPE WORD
                   14533:        ZER  EXSTM(XR)        ZEROISE STMNT NUMBER FIELD
                   14534:        MOV  WA,EXLEN(XR)     STORE LENGTH
                   14535:        MOV  =OFEX$,EXFLC(XR) STORE FAILURE WORD
                   14536:        ADD  *EXSI$,XR        SET XR FOR SYSMW
                   14537:        MOV  XL,CWCOF         RESET OFFSET TO START OF CODE
                   14538:        ADD  R$CCB,XL         POINT TO START OF CODE
                   14539:        SUB  *EXSI$,WA        LENGTH OF CODE TO MOVE
                   14540:        MOV  WA,-(XS)         STACK LENGTH OF CODE
                   14541:        MVW                   MOVE CODE TO EXBLK
                   14542:        MOV  (XS)+,WA         GET LENGTH OF CODE
                   14543:        BTW  WA               CONVERT BAU COUNT TO WORD COUNT
                   14544:        LCT  WA,WA            PREPARE COUNTER FOR LOOP
                   14545:        MOV  (XS),XL          COPY EXBLK PTR, DONT UNSTACK
                   14546:        ADD  *EXCOD,XL        POINT TO CODE ITSELF
                   14547:        MOV  1(XS),WB         GET REDUCTION IN OFFSET
                   14548: *
                   14549: *      THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
                   14550: *      THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
                   14551: *      CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
                   14552: *      EXBLK.
                   14553: *
                   14554: EXBL1  MOV  (XL)+,XR         GET NEXT CODE WORD
                   14555:        BEQ  XR,=OSLA$,EXBL3  JUMP IF SELECTION FOUND
                   14556:        BEQ  XR,=ONTA$,EXBL3  JUMP IF NEGATION FOUND
                   14557:        BCT  WA,EXBL1         LOOP TO END OF CODE
                   14558: *
                   14559: *      NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
                   14560: *
                   14561: EXBL2  MOV  (XS)+,XR         POP EXBLK PTR INTO XR
                   14562:        MOV  (XS)+,XL         POP REDUCTION CONSTANT
                   14563:        EXI                   RETURN TO CALLER
                   14564:        EJC
                   14565: *
                   14566: *      EXBLD (CONTINUED)
                   14567: *
                   14568: *      SELECTION OR NEGATION FOUND
                   14569: *      REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
                   14570: *      FOLLOWING CODE WORDS -
                   14571: *           =ONTA$, =OSLA$, =OSLB$, =OSLC$
                   14572: *
                   14573: EXBL3  SUB  WB,(XL)+         ADJUST OFFSET
                   14574:        BCT  WA,EXBL4         DECREMENT COUNT
                   14575: *
                   14576: EXBL4  BCT  WA,EXBL5         DECREMENT COUNT
                   14577: *
                   14578: *      CONTINUE SEARCH FOR MORE OFFSETS
                   14579: *
                   14580: EXBL5  MOV  (XL)+,XR         GET NEXT CODE WORD
                   14581:        BEQ  XR,=OSLA$,EXBL3  JUMP IF OFFSET FOUND
                   14582:        BEQ  XR,=OSLB$,EXBL3  JUMP IF OFFSET FOUND
                   14583:        BEQ  XR,=OSLC$,EXBL3  JUMP IF OFFSET FOUND
                   14584:        BEQ  XR,=ONTA$,EXBL3  JUMP IF OFFSET FOUND
                   14585:        BCT  WA,EXBL5         LOOP
                   14586:        BRN  EXBL2            MERGE TO RETURN
                   14587:        ENP                   END PROCEDURE EXBLD
                   14588:        EJC
                   14589: *
                   14590: *      EXPAN -- ANALYZE EXPRESSION
                   14591: *
                   14592: *      THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
                   14593: *      AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
                   14594: *      SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
                   14595: *      SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
                   14596: *
                   14597: *      THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
                   14598: *      OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
                   14599: *      AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
                   14600: *      ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
                   14601: *      VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
                   14602: *
                   14603: *      0    SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
                   14604: *      1    SCANNING OUTER LEVEL OF NORMAL GOTO
                   14605: *      2    SCANNING OUTER LEVEL OF DIRECT GOTO
                   14606: *      3    SCANNING INSIDE ARRAY BRACKETS
                   14607: *      4    SCANNING INSIDE GROUPING PARENTHESES
                   14608: *      5    SCANNING INSIDE FUNCTION PARENTHESES
                   14609: *
                   14610: *      THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
                   14611: *      GROUPING AND RESTORED AT THE END OF THE GROUPING.
                   14612: *
                   14613: *      ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
                   14614: *      ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
                   14615: *      COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
                   14616: *
                   14617: *      THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
                   14618: *      A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
                   14619: *
                   14620: *      WA=0                  NOTHING SCANNED AT THIS LEVEL
                   14621: *      WA=1                  OPERAND EXPECTED
                   14622: *      WA=2                  OPERATOR EXPECTED
                   14623: *
                   14624: *      (WB)                  CALL TYPE (SEE BELOW)
                   14625: *      JSR  EXPAN            CALL TO ANALYZE EXPRESSION
                   14626: *      (XR)                  POINTER TO RESULTING TREE
                   14627: *      (XL,WA,WB,WC,RA)      DESTROYED
                   14628: *
                   14629: *      THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
                   14630: *
                   14631: *      0    SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
                   14632: *           TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
                   14633: *           TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
                   14634: *           SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
                   14635: *
                   14636: *      1    SCANNING A NORMAL GOTO. THE ONLY VALID
                   14637: *           TERMINATOR IS A RIGHT PAREN.
                   14638: *
                   14639: *      2    SCANNING A DIRECT GOTO. THE ONLY VALID
                   14640: *           TERMINATOR IS A RIGHT BRACKET.
                   14641:        EJC
                   14642: *
                   14643: *      EXPAN (CONTINUED)
                   14644: *
                   14645: *      ENTRY POINT
                   14646: *
                   14647: EXPAN  PRC  E,0              ENTRY POINT
                   14648:        ZER  -(XS)            SET TOP OF STACK INDICATOR
                   14649:        ZER  WA               SET INITIAL STATE TO ZERO
                   14650:        ZER  WC               ZERO COUNTER VALUE
                   14651: *
                   14652: *      LOOP HERE FOR SUCCESSIVE ENTRIES
                   14653: *
                   14654: EXP01  JSR  SCANE            SCAN NEXT ELEMENT
                   14655:        ADD  WA,XL            ADD STATE TO SYNTAX CODE
                   14656:        BSW  XL,T$NES         SWITCH ON ELEMENT TYPE/STATE
                   14657:        IFF  T$VA0,EXP03      VARIABLE, S=0
                   14658:        IFF  T$VA1,EXP03      VARIABLE, STATE ONE
                   14659:        IFF  T$VA2,EXP04      VARIABLE, S=2
                   14660:        IFF  T$CO0,EXP03      CONSTANT, S=0
                   14661:        IFF  T$CO1,EXP03      CONSTANT, S=1
                   14662:        IFF  T$CO2,EXP04      CONSTANT, S=2
                   14663:        IFF  T$LP0,EXP06      LEFT PAREN, S=0
                   14664:        IFF  T$LP1,EXP06      LEFT PAREN, S=1
                   14665:        IFF  T$LP2,EXP04      LEFT PAREN, S=2
                   14666:        IFF  T$FN0,EXP10      FUNCTION, S=0
                   14667:        IFF  T$FN1,EXP10      FUNCTION, S=1
                   14668:        IFF  T$FN2,EXP04      FUNCTION, S=2
                   14669:        IFF  T$RP0,EXP02      RIGHT PAREN, S=0
                   14670:        IFF  T$RP1,EXP05      RIGHT PAREN, S=1
                   14671:        IFF  T$RP2,EXP12      RIGHT PAREN, S=2
                   14672:        IFF  T$LB0,EXP08      LEFT BRKT, S=0
                   14673:        IFF  T$LB1,EXP08      LEFT BRKT, S=1
                   14674:        IFF  T$LB2,EXP09      LEFT BRKT, S=2
                   14675:        IFF  T$RB0,EXP02      RIGHT BRKT, S=0
                   14676:        IFF  T$RB1,EXP05      RIGHT BRKT, S=1
                   14677:        IFF  T$RB2,EXP18      RIGHT BRKT, S=2
                   14678:        IFF  T$UO0,EXP27      UNOP, S=0
                   14679:        IFF  T$UO1,EXP27      UNOP, S=1
                   14680:        IFF  T$UO2,EXP04      UNOP, S=2
                   14681:        IFF  T$BO0,EXP05      BINOP, S=0
                   14682:        IFF  T$BO1,EXP05      BINOP, S=1
                   14683:        IFF  T$BO2,EXP26      BINOP, S=2
                   14684:        IFF  T$CM0,EXP02      COMMA, S=0
                   14685:        IFF  T$CM1,EXP05      COMMA, S=1
                   14686:        IFF  T$CM2,EXP11      COMMA, S=2
                   14687:        IFF  T$CL0,EXP02      COLON, S=0
                   14688:        IFF  T$CL1,EXP05      COLON, S=1
                   14689:        IFF  T$CL2,EXP19      COLON, S=2
                   14690:        IFF  T$SM0,EXP02      SEMICOLON, S=0
                   14691:        IFF  T$SM1,EXP05      SEMICOLON, S=1
                   14692:        IFF  T$SM2,EXP19      SEMICOLON, S=2
                   14693:        ESW                   END SWITCH ON ELEMENT TYPE/STATE
                   14694:        EJC
                   14695: *
                   14696: *      EXPAN (CONTINUED)
                   14697: *
                   14698: *      HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
                   14699: *
                   14700: *      SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
                   14701: *      A NULL CONSTANT (CASE OF OMITTED NULL)
                   14702: *
                   14703: EXP02  MNZ  SCNRS            SET TO RESCAN ELEMENT
                   14704:        MOV  =NULLS,XR        POINT TO NULL, MERGE
                   14705: *
                   14706: *      HERE FOR VAR OR CON IN STATES 0,1
                   14707: *
                   14708: *      STACK THE VARIABLE/CONSTANT AND SET STATE=2
                   14709: *
                   14710: EXP03  MOV  XR,-(XS)         STACK POINTER TO OPERAND
                   14711:        MOV  =NUM02,WA        SET STATE 2
                   14712:        BRN  EXP01            JUMP FOR NEXT ELEMENT
                   14713: *
                   14714: *      HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
                   14715: *
                   14716: *      WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
                   14717: *      THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
                   14718: *
                   14719: EXP04  MNZ  SCNRS            SET TO RESCAN ELEMENT
                   14720:        MOV  =OPDVC,XR        POINT TO CONCAT OPERATOR DV
                   14721:        BZE  WB,EXP4A         OK IF AT TOP LEVEL
                   14722:        MOV  =OPDVP,XR        ELSE POINT TO UNMISTAKEABLE CONCAT
                   14723: *
                   14724: *      MERGE WITH CORRECT CONCATENATION DVBLK IN XR
                   14725: *
                   14726: EXP4A  BNZ  SCNBL,EXP26      MERGE BOP IF BLANKS, ELSE ERROR
                   14727:        DCV  SCNSE            ADJUST START OF ELEMENT LOCATION
                   14728:        ERB  219,SYNTAX ERROR. MISSING OPERATOR
                   14729: *
                   14730: *      HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
                   14731: *
                   14732: *      THIS IS AN ERRONOUS CONTRUCTION
                   14733: *
                   14734: EXP05  DCV  SCNSE            ADJUST START OF ELEMENT LOCATION
                   14735:        ERB  220,SYNTAX ERROR. MISSING OPERAND
                   14736: *
                   14737: *      HERE FOR LPR (S=0,1)
                   14738: *
                   14739: EXP06  MOV  =NUM04,XL        SET NEW LEVEL INDICATOR
                   14740:        ZER  XR               SET ZERO VALUE FOR CMOPN
                   14741:        EJC
                   14742: *
                   14743: *      EXPAN (CONTINUED)
                   14744: *
                   14745: *      MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
                   14746: *
                   14747: EXP07  MOV  XR,-(XS)         STACK CMOPN VALUE
                   14748:        MOV  WC,-(XS)         STACK OLD COUNTER
                   14749:        MOV  WB,-(XS)         STACK OLD LEVEL INDICATOR
                   14750:        CHK                   CHECK FOR STACK OVERFLOW
                   14751:        ZER  WA               SET NEW STATE TO ZERO
                   14752:        MOV  XL,WB            SET NEW LEVEL INDICATOR
                   14753:        MOV  =NUM01,WC        INITIALIZE NEW COUNTER
                   14754:        BRN  EXP01            JUMP TO SCAN NEXT ELEMENT
                   14755: *
                   14756: *      HERE FOR LBR (S=0,1)
                   14757: *
                   14758: *      THIS IS AN ILLEGAL USE OF LEFT BRACKET
                   14759: *
                   14760: EXP08  ERB  221,SYNTAX ERROR. INVALID USE OF LEFT BRACKET
                   14761: *
                   14762: *      HERE FOR LBR (S=2)
                   14763: *
                   14764: *      SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
                   14765: *
                   14766: EXP09  MOV  (XS)+,XR         LOAD ARRAY PTR FOR CMOPN
                   14767:        MOV  =NUM03,XL        SET NEW LEVEL INDICATOR
                   14768:        BRN  EXP07            JUMP TO STACK OLD AND START NEW
                   14769: *
                   14770: *      HERE FOR FNC (S=0,1)
                   14771: *
                   14772: *      STACK OLD LEVEL AND START TO SCAN ARGUMENTS
                   14773: *
                   14774: EXP10  MOV  =NUM05,XL        SET NEW LEV INDIC (XR=VRBLK=CMOPN)
                   14775:        BRN  EXP07            JUMP TO STACK OLD AND START NEW
                   14776: *
                   14777: *      HERE FOR CMA (S=2)
                   14778: *
                   14779: *      INCREMENT ARGUMENT COUNT AND CONTINUE
                   14780: *
                   14781: EXP11  ICV  WC               INCREMENT COUNTER
                   14782:        JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
                   14783:        ZER  -(XS)            SET NEW LEVEL FOR PARAMETER
                   14784:        ZER  WA               SET NEW STATE
                   14785:        BGT  WB,=NUM02,EXP01  LOOP BACK UNLESS OUTER LEVEL
                   14786:        ERB  222,SYNTAX ERROR. INVALID USE OF COMMA
                   14787:        EJC
                   14788: *
                   14789: *      EXPAN (CONTINUED)
                   14790: *
                   14791: *      HERE FOR RPR (S=2)
                   14792: *
                   14793: *      AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
                   14794: *      OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
                   14795: *
                   14796: EXP12  BEQ  WB,=NUM01,EXP20  END OF NORMAL GOTO
                   14797:        BEQ  WB,=NUM05,EXP13  END OF FUNCTION ARGUMENTS
                   14798:        BEQ  WB,=NUM04,EXP14  END OF GROUPING / SELECTION
                   14799:        ERB  223,SYNTAX ERROR. UNBALANCED RIGHT PARENTHESIS
                   14800: *
                   14801: *      HERE AT END OF FUNCTION ARGUMENTS
                   14802: *
                   14803: EXP13  MOV  =C$FNC,XL        SET CMTYP VALUE FOR FUNCTION
                   14804:        BRN  EXP15            JUMP TO BUILD CMBLK
                   14805: *
                   14806: *      HERE FOR END OF GROUPING
                   14807: *
                   14808: EXP14  BEQ  WC,=NUM01,EXP17  JUMP IF END OF GROUPING
                   14809:        MOV  =C$SEL,XL        ELSE SET CMTYP FOR SELECTION
                   14810: *
                   14811: *      MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
                   14812: *      TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
                   14813: *
                   14814: EXP15  JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
                   14815:        MOV  WC,WA            COPY COUNT
                   14816:        ADD  =CMVLS,WA        ADD FOR STANDARD FIELDS AT START
                   14817:        WTB  WA               CONVERT LENGTH TO BAUS
                   14818:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
                   14819:        MOV  =B$CMT,(XR)      STORE TYPE CODE FOR CMBLK
                   14820:        MOV  XL,CMTYP(XR)     STORE CMBLK NODE TYPE INDICATOR
                   14821:        MOV  WA,CMLEN(XR)     STORE LENGTH
                   14822:        ADD  WA,XR            POINT PAST END OF BLOCK
                   14823:        LCT  WC,WC            SET LOOP COUNTER
                   14824: *
                   14825: *      LOOP TO MOVE REMAINING WORDS TO CMBLK
                   14826: *
                   14827: EXP16  MOV  (XS)+,-(XR)      MOVE ONE OPERAND PTR FROM STACK
                   14828:        MOV  (XS)+,WB         POP TO OLD LEVEL INDICATOR
                   14829:        BCT  WC,EXP16         LOOP TILL ALL MOVED
                   14830:        EJC
                   14831: *
                   14832: *      EXPAN (CONTINUED)
                   14833: *
                   14834: *      COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
                   14835: *
                   14836:        SUB  *CMVLS,XR        POINT BACK TO START OF BLOCK
                   14837:        MOV  (XS)+,WC         RESTORE OLD COUNTER
                   14838:        MOV  (XS),CMOPN(XR)   STORE OPERAND PTR IN CMBLK
                   14839:        MOV  XR,(XS)          STACK CMBLK POINTER
                   14840:        MOV  =NUM02,WA        SET NEW STATE
                   14841:        BRN  EXP01            BACK FOR NEXT ELEMENT
                   14842: *
                   14843: *      HERE AT END OF A PARENTHESIZED EXPRESSION
                   14844: *
                   14845: EXP17  JSR  EXPDM            DUMP OPERATORS AT THIS LEVEL
                   14846:        MOV  (XS)+,XR         RESTORE XR
                   14847:        MOV  (XS)+,WB         RESTORE OUTER LEVEL
                   14848:        MOV  (XS)+,WC         RESTORE OUTER COUNT
                   14849:        MOV  XR,(XS)          STORE OPND OVER UNUSED CMOPN VAL
                   14850:        MOV  =NUM02,WA        SET NEW STATE
                   14851:        BRN  EXP01            BACK FOR NEXT ELE8ENT
                   14852: *
                   14853: *      HERE FOR RBR (S=2)
                   14854: *
                   14855: *      AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
                   14856: *      OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
                   14857: *
                   14858: EXP18  MOV  =C$ARR,XL        SET CMTYP FOR ARRAY REFERENCE
                   14859:        BEQ  WB,=NUM03,EXP15  JUMP TO BUILD CMBLK IF END ARRAYREF
                   14860:        BEQ  WB,=NUM02,EXP20  JUMP IF END OF DIRECT GOTO
                   14861:        ERB  224,SYNTAX ERROR. UNBALANCED RIGHT BRACKET
                   14862:        EJC
                   14863: *
                   14864: *      EXPAN (CONTINUED)
                   14865: *
                   14866: *      HERE FOR COL,SMC (S=2)
                   14867: *
                   14868: *      ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
                   14869: *
                   14870: EXP19  MNZ  SCNRS            RESCAN TERMINATOR
                   14871:        MOV  WB,XL            COPY LEVEL INDICATOR
                   14872:        BSW  XL,6             SWITCH ON LEVEL INDICATOR
                   14873:        IFF  0,EXP20          NORMAL OUTER LEVEL
                   14874:        IFF  1,EXP22          FAIL IF NORMAL GOTO
                   14875:        IFF  2,EXP23          FAIL IF DIRECT GOTO
                   14876:        IFF  3,EXP24          FAIL ARRAY BRACKETS
                   14877:        IFF  4,EXP21          FAIL IF IN GROUPING
                   14878:        IFF  5,EXP21          FAIL FUNCTION ARGS
                   14879:        ESW                   END SWITCH ON LEVEL
                   14880: *
                   14881: *      HERE AT NORMAL END OF EXPRESSION
                   14882: *
                   14883: EXP20  JSR  EXPDM            DUMP REMAINING OPERATORS
                   14884:        MOV  (XS)+,XR         LOAD TREE POINTER
                   14885:        ICA  XS               POP OFF BOTTOM OF STACK MARKER
                   14886:        EXI                   RETURN TO EXPAN CALLER
                   14887: *
                   14888: *      MISSING RIGHT PAREN
                   14889: *
                   14890: EXP21  ERB  225,SYNTAX ERROR. MISSING RIGHT PAREN
                   14891: *
                   14892: *      MISSING RIGHT PAREN IN GOTO FIELD
                   14893: *
                   14894: EXP22  ERB  226,SYNTAX ERROR. RIGHT PAREN MISSING FROM GOTO
                   14895: *
                   14896: *      MISSING BRACKET IN GOTO
                   14897: *
                   14898: EXP23  ERB  227,SYNTAX ERROR. RIGHT BRACKET MISSING FROM GOTO
                   14899: *
                   14900: *      MISSING ARRAY BRACKET
                   14901: *
                   14902: EXP24  ERB  228,SYNTAX ERROR. MISSING RIGHT ARRAY BRACKET
                   14903:        EJC
                   14904: *
                   14905: *      EXPAN (CONTINUED)
                   14906: *
                   14907: *      LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
                   14908: *
                   14909: EXP25  MOV  XR,EXPSV
                   14910:        JSR  EXPOP            POP ONE OPERATOR
                   14911:        MOV  EXPSV,XR         RESTORE OP DV POINTER AND MERGE
                   14912: *
                   14913: *      HERE FOR BOP (S=2)
                   14914: *
                   14915: *      REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
                   14916: *      LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
                   14917: *      LOOP HERE TILL THIS CONDITION IS MET.
                   14918: *
                   14919: EXP26  MOV  1(XS),XL         LOAD OPERATOR DVPTR FROM STACK
                   14920:        BLE  XL,=NUM05,EXP27  JUMP IF BOTTOM OF STACK LEVEL
                   14921:        BLT  DVRPR(XR),DVLPR(XL),EXP25 ELSE POP IF NEW PREC IS LO
                   14922: *
                   14923: *      HERE FOR UOP (S=0,1)
                   14924: *
                   14925: *      BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
                   14926: *
                   14927: *      THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
                   14928: *      CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
                   14929: *
                   14930: EXP27  MOV  XR,-(XS)         STACK OPERATOR DVPTR ON STACK
                   14931:        CHK                   CHECK FOR STACK OVERFLOW
                   14932:        MOV  =NUM01,WA        SET NEW STATE
                   14933:        BNE  XR,=OPDVS,EXP01  BACK FOR NEXT ELEMENT UNLESS =
                   14934: *
                   14935: *      HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
                   14936: *      NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
                   14937: *      OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
                   14938: *      ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
                   14939: *
                   14940:        ZER  WA               SET STATE ZERO
                   14941:        BRN  EXP01            JUMP FOR NEXT ELEMENT
                   14942:        ENP                   END PROCEDURE EXPAN
                   14943:        EJC
                   14944: *
                   14945: *      EXPAP -- TEST FOR PATTERN MATCH TREE
                   14946: *
                   14947: *      EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
                   14948: *      IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
                   14949: *      MATCHES IN THE CONTEXT OF THIS CALL.
                   14950: *
                   14951: *      1)   AN EXPLICIT USE OF BINARY QUESTION MARK
                   14952: *      2)   A CONCATENATION
                   14953: *      3)   AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
                   14954: *
                   14955: *      (XR)                  PTR TO EXPAN TREE
                   14956: *      JSR  EXPAP            CALL TO TEST FOR PATTERN MATCH
                   14957: *      PPM  LOC              TRANSFER LOC IF NOT A PATTERN MATCH
                   14958: *      (WA)                  DESTROYED
                   14959: *      (XR)                  UNCHANGED (IF NOT MATCH)
                   14960: *      (XR)                  PTR TO BINARY OPERATOR BLK IF MATCH
                   14961: *
                   14962: EXPAP  PRC  E,1              ENTRY POINT
                   14963:        MOV  XL,-(XS)         SAVE XL
                   14964:        BNE  (XR),=B$CMT,EXPP2 NO MATCH IF NOT COMPLEX
                   14965:        MOV  CMTYP(XR),WA     ELSE LOAD TYPE CODE
                   14966:        BEQ  WA,=C$CNC,EXPP1  CONCATENATION IS A MATCH
                   14967:        BEQ  WA,=C$PMT,EXPP1  BINARY QUESTION MARK IS A MATCH
                   14968:        BNE  WA,=C$ALT,EXPP2  ELSE NOT MATCH UNLESS ALTERNATION
                   14969: *
                   14970: *      HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
                   14971: *
                   14972:        MOV  CMLOP(XR),XL     LOAD LEFT OPERAND POINTER
                   14973:        BNE  (XL),=B$CMT,EXPP2 NOT MATCH IF LEFT OPND NOT COMPLEX
                   14974:        BNE  CMTYP(XL),=C$CNC,EXPP2 NOT MATCH IF LEFT OP NOT CONC
                   14975:        MOV  CMROP(XL),CMLOP(XR) XR POINTS TO (B / C)
                   14976:        MOV  XR,CMROP(XL)     SET XL OPNDS TO A, (B / C)
                   14977:        MOV  XL,XR            POINT TO THIS ALTERED NODE
                   14978: *
                   14979: *      EXIT HERE FOR PATTERN MATCH
                   14980: *
                   14981: EXPP1  MOV  (XS)+,XL         RESTORE ENTRY XL
                   14982:        EXI                   GIVE PATTERN MATCH RETURN
                   14983: *
                   14984: *      EXIT HERE IF NOT PATTERN MATCH
                   14985: *
                   14986: EXPP2  MOV  (XS)+,XL         RESTORE ENTRY XL
                   14987:        EXI  1                GIVE NON-MATCH RETURN
                   14988:        ENP                   END PROCEDURE EXPAP
                   14989:        EJC
                   14990: *
                   14991: *      EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
                   14992: *
                   14993: *      EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
                   14994: *      LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
                   14995: *      VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
                   14996: *
                   14997: *      JSR  EXPDM            CALL TO DUMP OPERATORS
                   14998: *      (XS)                  POPPED AS REQUIRED
                   14999: *      (XR,WA)               DESTROYED
                   15000: *
                   15001: EXPDM  PRC  N,0              ENTRY POINT
                   15002:        MOV  XL,R$EXS         SAVE XL VALUE
                   15003: *
                   15004: *      LOOP TO DUMP OPERATORS
                   15005: *
                   15006: EXDM1  BLE  1(XS),=NUM05,EXDM2 JUMP IF STACK BOTTOM (SAVED LEVEL)
                   15007:        JSR  EXPOP            ELSE POP ONE OPERATOR
                   15008:        BRN  EXDM1            AND LOOP BACK
                   15009: *
                   15010: *      HERE AFTER POPPING ALL OPERATORS
                   15011: *
                   15012: EXDM2  MOV  R$EXS,XL         RESTORE XL
                   15013:        ZER  R$EXS            RELEASE SAVE LOCATION
                   15014:        EXI                   RETURN TO EXPDM CALLER
                   15015:        ENP                   END PROCEDURE EXPDM
                   15016:        EJC
                   15017: *
                   15018: *      EXPOP-- POP OPERATOR (FOR EXPAN)
                   15019: *
                   15020: *      EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
                   15021: *      OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
                   15022: *      CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
                   15023: *      POINTER TO THIS CMBLK IS STACKED.
                   15024: *
                   15025: *      EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
                   15026: *
                   15027: *      JSR  EXPOP            CALL TO POP OPERATOR
                   15028: *      (XS)                  POPPED APPROPRIATELY
                   15029: *      (XR,XL,WA)            DESTROYED
                   15030: *
                   15031: EXPOP  PRC  N,0              ENTRY POINT
                   15032:        MOV  1(XS),XR         LOAD OPERATOR DV POINTER
                   15033:        BEQ  DVLPR(XR),=LLUNO,EXPO2 JUMP IF UNARY
                   15034: *
                   15035: *      HERE FOR BINARY OPERATOR
                   15036: *
                   15037:        MOV  *CMBS$,WA        SET SIZE OF BINARY OPERATOR CMBLK
                   15038:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
                   15039:        MOV  (XS)+,CMROP(XR)  POP AND STORE RIGHT OPERAND PTR
                   15040:        MOV  (XS)+,XL         POP AND LOAD OPERATOR DV PTR
                   15041:        MOV  (XS),CMLOP(XR)   STORE LEFT OPERAND POINTER
                   15042: *
                   15043: *      COMMON EXIT POINT
                   15044: *
                   15045: EXPO1  MOV  =B$CMT,(XR)      STORE TYPE CODE FOR CMBLK
                   15046:        MOV  DVTYP(XL),CMTYP(XR) STORE CMBLK NODE TYPE CODE
                   15047:        MOV  XL,CMOPN(XR)     STORE DVPTR (=PTR TO DAC O$XXX)
                   15048:        MOV  WA,CMLEN(XR)     STORE CMBLK LENGTH
                   15049:        MOV  XR,(XS)          STORE RESULTING NODE PTR ON STACK
                   15050:        EXI                   RETURN TO EXPOP CALLER
                   15051: *
                   15052: *      HERE FOR UNARY OPERATOR
                   15053: *
                   15054: EXPO2  MOV  *CMUS$,WA        SET SIZE OF UNARY OPERATOR CMBLK
                   15055:        JSR  ALLOC            ALLOCATE SPACE FOR CMBLK
                   15056:        MOV  (XS)+,CMROP(XR)  POP AND STORE OPERAND POINTER
                   15057:        MOV  (XS),XL          LOAD OPERATOR DV POINTER
                   15058:        BRN  EXPO1            MERGE BACK TO EXIT
                   15059:        ENP                   END PROCEDURE EXPOP
                   15060:        EJC
                   15061: *
                   15062: *      GBCOL -- PERFORM GARBAGE COLLECTION
                   15063: *
                   15064: *      GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
                   15065: *      ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
                   15066: *      BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
                   15067: *      DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
                   15068: *
                   15069: *      (WB)                  MOVE OFFSET (SEE BELOW)
                   15070: *      JSR  GBCOL            CALL TO COLLECT GARBAGE
                   15071: *      (XR)                  DESTROYED
                   15072: *
                   15073: *      THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
                   15074: *      GBCOL IS CALLED.
                   15075: *
                   15076: *      1)   ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
                   15077: *           ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
                   15078: *           THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
                   15079: *
                   15080: *           A)               MAIN STACK, WITH CURRENT TOP
                   15081: *                            ELEMENT BEING INDICATED BY XS
                   15082: *
                   15083: *           B)               IN RELOCATABLE FIELDS OF VRBLKS.
                   15084: *
                   15085: *           C)               IN REGISTER XL AT THE TIME OF CALL
                   15086: *
                   15087: *           E)               IN THE SPECIAL REGION OF WORKING
                   15088: *                            STORAGE WHERE NAMES BEGIN WITH R$.
                   15089: *
                   15090: *      2)   ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
                   15091: *           THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
                   15092: *           POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
                   15093: *
                   15094: *      3)   NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
                   15095: *           INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
                   15096: *           FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
                   15097: *           POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
                   15098: *           NOT BE CHANGED BY THE GARBAGE COLLECTOR.
                   15099: *           IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
                   15100: *           DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
                   15101: *           CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
                   15102: *
                   15103: *      GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
                   15104: *      RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
                   15105: *      THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
                   15106: *      ENTRY VALUE OF WB IS THE NUMBER OF BAUS TO MOVE UP.
                   15107: *      THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
                   15108: *      FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
                   15109: *      LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
                   15110:        EJC
                   15111: *
                   15112: *      GBCOL (CONTINUED)
                   15113: *
                   15114: *      THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
                   15115: *      GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
                   15116: *      TAKES THREE PASSES AS FOLLOWS.
                   15117: *
                   15118: *      1)   ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
                   15119: *           DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
                   15120: *           IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
                   15121: *           THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
                   15122: *           A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
                   15123: *           ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
                   15124: *
                   15125: *           THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
                   15126: *           CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
                   15127: *           CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
                   15128: *           TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
                   15129: *           COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
                   15130: *           OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
                   15131: *           THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
                   15132: *           OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
                   15133: *           THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
                   15134: *           INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
                   15135: *           REFERENCES FOR THE RELOCATION PHASE.
                   15136: *
                   15137: *      2)   STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
                   15138: *           BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
                   15139: *           PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
                   15140: *           ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
                   15141: *           IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
                   15142: *           IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
                   15143: *           BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
                   15144: *           AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
                   15145: *           CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
                   15146: *           THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
                   15147: *           ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
                   15148: *           THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
                   15149: *           THE CHAIN IS RESTORED AT THIS POINT.
                   15150: *
                   15151: *           DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
                   15152: *           DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
                   15153: *           MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
                   15154: *           EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
                   15155: *           IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
                   15156: *           CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
                   15157: *           OF WORDS TO BE MOVED.
                   15158: *
                   15159: *      3)   IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
                   15160: *           BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
                   15161: *           THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
                   15162: *           THE COLLECTION IS THEN COMPLETE AND THE NEXT
                   15163: *           AVAILABLE LOCATION POINTER IS RESET.
                   15164:        EJC
                   15165: *
                   15166: *      GBCOL (CONTINUED)
                   15167: *
                   15168: GBCOL  PRC  E,0              ENTRY POINT
                   15169:        BNZ  DMVCH,GBC14      FAIL IF IN MID-DUMP
                   15170:        MNZ  GBCFL            NOTE GBCOL ENTERED
                   15171:        MOV  WA,GBSVA         SAVE ENTRY WA
                   15172:        MOV  WB,GBSVB         SAVE ENTRY WB
                   15173:        MOV  WC,GBSVC         SAVE ENTRY WC
                   15174:        MOV  XL,-(XS)         SAVE ENTRY XL
                   15175:        SCP  WA               GET CODE POINTER VALUE
                   15176:        SUB  R$COD,WA         MAKE RELATIVE
                   15177:        LCP  WA               AND RESTORE
                   15178: *
                   15179: *      PROCESS STACK ENTRIES
                   15180: *
                   15181:        MOV  XS,XR            POINT TO STACK FRONT
                   15182:        MOV  STBAS,XL         POINT PAST END OF STACK
                   15183:        BGE  XL,XR,GBC00      OK IF D-STACK
                   15184:        MOV  XL,XR            REVERSE IF ...
                   15185:        MOV  XS,XL            ... U-STACK
                   15186: *
                   15187: *      PROCESS THE STACK
                   15188: *
                   15189: GBC00  JSR  GBCPF            PROCESS POINTERS ON STACK
                   15190: *
                   15191: *      PROCESS SPECIAL WORK LOCATIONS
                   15192: *
                   15193:        MOV  =R$AAA,XR        POINT TO START OF RELOCATABLE LOCS
                   15194:        MOV  =R$YYY,XL        POINT PAST END OF RELOCATABLE LOCS
                   15195:        JSR  GBCPF            PROCESS WORK FIELDS
                   15196: *
                   15197: *      PREPARE TO PROCESS VARIABLE BLOCKS
                   15198: *
                   15199:        MOV  HSHTB,WA         POINT TO FIRST HASH SLOT POINTER
                   15200: *
                   15201: *      LOOP THROUGH HASH SLOTS
                   15202: *
                   15203: GBC01  MOV  WA,XL            POINT TO NEXT SLOT
                   15204:        ICA  WA               BUMP BUCKET POINTER
                   15205:        MOV  WA,GBCNM         SAVE BUCKET POINTER
                   15206:        EJC
                   15207: *
                   15208: *      GBCOL (CONTINUED)
                   15209: *
                   15210: *      LOOP THROUGH VARIABLES ON ONE HASH CHAIN
                   15211: *
                   15212: GBC02  MOV  (XL),XR          LOAD PTR TO NEXT VRBLK
                   15213:        BZE  XR,GBC03         JUMP IF END OF CHAIN
                   15214:        MOV  XR,XL            ELSE COPY VRBLK POINTER
                   15215:        ADD  *VRVAL,XR        POINT TO FIRST RELOC FLD
                   15216:        ADD  *VRNXT,XL        POINT PAST LAST (AND TO LINK PTR)
                   15217:        JSR  GBCPF            PROCESS RELOC FIELDS IN VRBLK
                   15218:        BRN  GBC02            LOOP BACK FOR NEXT BLOCK
                   15219: *
                   15220: *      HERE AT END OF ONE HASH CHAIN
                   15221: *
                   15222: GBC03  MOV  GBCNM,WA         RESTORE BUCKET POINTER
                   15223:        BNE  WA,HSHTE,GBC01   LOOP BACK IF MORE BUCKETS TO GO
                   15224:        EJC
                   15225: *
                   15226: *      GBCOL (CONTINUED)
                   15227: *
                   15228: *      NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
                   15229: *      AS FOLLOWS IN PASS TWO.
                   15230: *
                   15231: *      (XR)                  SCANS THROUGH ALL BLOCKS
                   15232: *      (WC)                  POINTER TO EVENTUAL LOCATION
                   15233: *
                   15234: *      THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
                   15235: *      THE FOLLOWING FORMAT.
                   15236: *
                   15237: *      WORD 1                POINTER TO NEXT MOVE BLOCK,
                   15238: *                            ZERO IF END OF CHAIN OF BLOCKS
                   15239: *
                   15240: *      WORD 2                LENGTH OF BLOCKS TO BE MOVED IN
                   15241: *                            BAUS. SET TO THE ADDRESS OF THE
                   15242: *                            FIRST BAU WHILE ACTUALLY SCANNING
                   15243: *                            THE BLOCKS.
                   15244: *
                   15245: *      THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
                   15246: *      CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
                   15247: *      BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
                   15248: *      THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
                   15249: *      BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
                   15250: *      BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
                   15251: *
                   15252: GBC04  MOV  DNAMB,XR         POINT TO FIRST BLOCK
                   15253:        MOV  XR,WC            SET AS FIRST EVENTUAL LOCATION
                   15254:        ADD  GBSVB,WC         ADD OFFSET FOR EVENTUAL MOVE UP
                   15255:        ZER  GBCNM            CLEAR INITIAL FORWARD POINTER
                   15256:        MOV  =GBCNM,GBCLM     INITIALIZE PTR TO LAST MOVE BLOCK
                   15257:        MOV  XR,GBCNS         INITIALIZE FIRST ADDRESS
                   15258: *
                   15259: *      LOOP THROUGH A SERIES OF BLOCKS IN USE
                   15260: *
                   15261: GBC05  BEQ  XR,DNAMP,GBC07   JUMP IF END OF USED REGION
                   15262:        MOV  (XR),WA          ELSE GET FIRST WORD
                   15263: .IF    .CEPP
                   15264:        BOD  WA,GBC07         JUMP IF ENTRY POINTER (UNUSED)
                   15265: .ELSE
                   15266:        BHI  WA,=P$YYY,GBC06  SKIP IF NOT ENTRY PTR (IN USE)
                   15267:        BHI  WA,=B$AAA,GBC07  JUMP IF ENTRY POINTER (UNUSED)
                   15268: .FI
                   15269: *
                   15270: *      HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
                   15271: *
                   15272: GBC06  MOV  WA,XL            COPY POINTER
                   15273:        MOV  (XL),WA          LOAD FORWARD POINTER
                   15274:        MOV  WC,(XL)          RELOCATE REFERENCE
                   15275: .IF    .CEPP
                   15276:        BEV  WA,GBC06         LOOP BACK IF NOT END OF CHAIN
                   15277: .ELSE
                   15278:        BHI  WA,=P$YYY,GBC06  LOOP BACK IF NOT END OF CHAIN
                   15279:        BLO  WA,=B$AAA,GBC06  LOOP BACK IF NOT END OF CHAIN
                   15280: .FI
                   15281:        EJC
                   15282: *
                   15283: *      GBCOL (CONTINUED)
                   15284: *
                   15285: *      AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
                   15286: *
                   15287:        MOV  WA,(XR)          RESTORE FIRST WORD
                   15288:        JSR  BLKLN            GET LENGTH OF THIS BLOCK
                   15289:        ADD  WA,XR            BUMP ACTUAL POINTER
                   15290:        ADD  WA,WC            BUMP EVENTUAL POINTER
                   15291:        BRN  GBC05            LOOP BACK FOR NEXT BLOCK
                   15292: *
                   15293: *      HERE AT END OF A SERIES OF BLOCKS IN USE
                   15294: *
                   15295: GBC07  MOV  XR,WA            COPY POINTER PAST LAST BLOCK
                   15296:        MOV  GBCLM,XL         POINT TO PREVIOUS MOVE BLOCK
                   15297:        SUB  1(XL),WA         SUBTRACT STARTING ADDRESS
                   15298:        MOV  WA,1(XL)         STORE LENGTH OF BLOCK TO BE MOVED
                   15299: *
                   15300: *      LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
                   15301: *
                   15302: GBC08  BEQ  XR,DNAMP,GBC10   JUMP IF END OF USED REGION
                   15303:        MOV  (XR),WA          ELSE LOAD FIRST WORD OF NEXT BLOCK
                   15304: .IF    .CEPP
                   15305:        BEV  WA,GBC09         JUMP IF IN USE
                   15306: .ELSE
                   15307:        BHI  WA,=P$YYY,GBC09  JUMP IF IN USE
                   15308:        BLO  WA,=B$AAA,GBC09  JUMP IF IN USE
                   15309: .FI
                   15310:        JSR  BLKLN            ELSE GET LENGTH OF NEXT BLOCK
                   15311:        ADD  WA,XR            PUSH POINTER
                   15312:        BRN  GBC08            AND LOOP BACK
                   15313: *
                   15314: *      HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
                   15315: *      BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
                   15316: *
                   15317: GBC09  SUB  *NUM02,XR        POINT 2 WORDS BEHIND FOR MOVE BLOCK
                   15318:        MOV  GBCLM,XL         POINT TO PREVIOUS MOVE BLOCK
                   15319:        MOV  XR,(XL)          SET FORWARD PTR IN PREVIOUS BLOCK
                   15320:        ZER  (XR)             ZERO FORWARD PTR OF NEW BLOCK
                   15321:        MOV  XR,GBCLM         REMEMBER ADDRESS OF THIS BLOCK
                   15322:        MOV  XR,XL            COPY PTR TO MOVE BLOCK
                   15323:        ADD  *NUM02,XR        POINT BACK TO BLOCK IN USE
                   15324:        MOV  XR,1(XL)         STORE STARTING ADDRESS
                   15325:        BRN  GBC06            JUMP TO PROCESS BLOCK IN USE
                   15326:        EJC
                   15327: *
                   15328: *      GBCOL (CONTINUED)
                   15329: *
                   15330: *      HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
                   15331: *
                   15332: *      (XL)                  POINTER TO OLD LOCATION
                   15333: *      (XR)                  POINTER TO NEW LOCATION
                   15334: *
                   15335: GBC10  MOV  DNAMB,XR         POINT TO START OF STORAGE
                   15336:        ADD  GBCNS,XR         BUMP PAST UNMOVED BLOCKS AT START
                   15337: *
                   15338: *      LOOP THROUGH MOVE DESCRIPTORS
                   15339: *
                   15340: GBC11  MOV  GBCNM,XL         POINT TO NEXT MOVE BLOCK
                   15341:        BZE  XL,GBC12         JUMP IF END OF CHAIN
                   15342:        MOV  (XL)+,GBCNM      MOVE POINTER DOWN CHAIN
                   15343:        MOV  (XL)+,WA         GET LENGTH TO MOVE
                   15344:        MVW                   PERFORM MOVE
                   15345:        BRN  GBC11            LOOP BACK
                   15346: *
                   15347: *      NOW TEST FOR MOVE UP
                   15348: *
                   15349: GBC12  MOV  XR,DNAMP         SET NEXT AVAILABLE LOC PTR
                   15350:        MOV  GBSVB,WB         RELOAD MOVE OFFSET
                   15351:        BZE  WB,GBC13         JUMP IF NO MOVE REQUIRED
                   15352:        MOV  XR,XL            ELSE COPY OLD TOP OF CORE
                   15353:        ADD  WB,XR            POINT TO NEW TOP OF CORE
                   15354:        MOV  XR,DNAMP         SAVE NEW TOP OF CORE POINTER
                   15355:        MOV  XL,WA            COPY OLD TOP
                   15356:        SUB  DNAMB,WA         MINUS OLD BOTTOM = LENGTH
                   15357:        ADD  WB,DNAMB         BUMP BOTTOM TO GET NEW VALUE
                   15358:        MWB                   PERFORM MOVE (BACKWARDS)
                   15359: *
                   15360: *      MERGE HERE TO EXIT
                   15361: *
                   15362: GBC13  MOV  GBSVA,WA         RESTORE WA
                   15363:        SCP  WC               GET CODE POINTER
                   15364:        ADD  R$COD,WC         MAKE ABSOLUTE AGAIN
                   15365:        LCP  WC               AND REPLACE ABSOLUTE VALUE
                   15366:        MOV  GBSVC,WC         RESTORE WC
                   15367:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   15368:        ICV  GBCNT            INCREMENT COUNT OF COLLECTIONS
                   15369:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   15370:        ZER  GBCFL            NOTE EXIT FROM GBCOL
                   15371:        EXI                   EXIT TO GBCOL CALLER
                   15372: *
                   15373: *      GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
                   15374: *
                   15375: GBC14  ICV  ERRFT            FATAL ERROR
                   15376:        ERB  229,INSUFFICIENT MEMORY TO COMPLETE DUMP
                   15377:        ENP                   END PROCEDURE GBCOL
                   15378:        EJC
                   15379: *
                   15380: *      GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
                   15381: *
                   15382: *      THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
                   15383: *      PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
                   15384: *
                   15385: *      (XR)                  PTR TO FIRST LOCATION TO PROCESS
                   15386: *      (XL)                  PTR PAST LAST LOCATION TO PROCESS
                   15387: *      JSR  GBCPF            CALL TO PROCESS FIELDS
                   15388: *      (XR,WA,WB,WC,IA)      DESTROYED
                   15389: *
                   15390: *      NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
                   15391: *      APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
                   15392: *
                   15393: GBCPF  PRC  E,0              ENTRY POINT
                   15394:        ZER  -(XS)            SET ZERO TO MARK BOTTOM OF STACK
                   15395:        MOV  XL,-(XS)         SAVE END POINTER
                   15396: *
                   15397: *      MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
                   15398: *
                   15399: *      1(XS)                 NEXT LVL FIELD PTR (0 AT OUTER LVL)
                   15400: *      0(XS)                 PTR PAST LAST FIELD TO PROCESS
                   15401: *      (XR)                  PTR TO FIRST FIELD TO PROCESS
                   15402: *
                   15403: *      LOOP TO PROCESS SUCCESSIVE FIELDS
                   15404: *
                   15405: GPF01  MOV  (XR),XL          LOAD FIELD CONTENTS
                   15406:        MOV  XR,WC            SAVE FIELD POINTER
                   15407: .IF    .CRPP
                   15408:        BOD  XL,GPF02         JUMP IF NOT PTR INTO DYNAMIC AREA
                   15409: .ELSE
                   15410: .FI
                   15411:        BLT  XL,DNAMB,GPF02   JUMP IF NOT PTR INTO DYNAMIC AREA
                   15412:        BGE  XL,DNAMP,GPF02   JUMP IF NOT PTR INTO DYNAMIC AREA
                   15413: *
                   15414: *      HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
                   15415: *      LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
                   15416: *
                   15417:        MOV  (XL),WA          LOAD PTR TO CHAIN (OR ENTRY PTR)
                   15418:        MOV  XR,(XL)          SET THIS FIELD AS NEW HEAD OF CHAIN
                   15419:        MOV  WA,(XR)          SET FORWARD POINTER
                   15420: *
                   15421: *      NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
                   15422: *
                   15423: .IF    .CEPP
                   15424:        BOD  WA,GPF03         JUMP IF NOT ALREADY PROCESSED
                   15425: .ELSE
                   15426:        BHI  WA,=P$YYY,GPF02  JUMP IF ALREADY PROCESSED
                   15427:        BHI  WA,=B$AAA,GPF03  JUMP IF NOT ALREADY PROCESSED
                   15428: .FI
                   15429: *
                   15430: *      HERE TO MOVE TO NEXT FIELD
                   15431: *
                   15432: GPF02  MOV  WC,XR            RESTORE FIELD POINTER
                   15433:        ICA  XR               BUMP TO NEXT FIELD
                   15434:        BNE  XR,(XS),GPF01    LOOP BACK IF MORE TO GO
                   15435:        EJC
                   15436: *
                   15437: *      GBCPF (CONTINUED)
                   15438: *
                   15439: *      HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
                   15440: *
                   15441:        MOV  (XS)+,XL         RESTORE POINTER PAST END
                   15442:        MOV  (XS)+,WC         RESTORE BLOCK POINTER
                   15443:        BNZ  WC,GPF02         CONTINUE LOOP UNLESS OUTER LEVL
                   15444:        EXI                   RETURN TO CALLER IF OUTER LEVEL
                   15445: *
                   15446: *      HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
                   15447: *
                   15448: GPF03  MOV  XL,XR            COPY BLOCK POINTER
                   15449:        MOV  WA,XL            COPY FIRST WORD OF BLOCK
                   15450:        LEI  XL               LOAD ENTRY POINT ID (BL$XX)
                   15451: *
                   15452: *      BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
                   15453: *      FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
                   15454: *
                   15455:        BSW  XL,BL$$$         SWITCH ON BLOCK TYPE
                   15456:        IFF  BL$AR,GPF06      ARBLK
                   15457: .IF    .CNBF
                   15458: .ELSE
                   15459:        IFF  BL$BC,GPF18      BCBLK
                   15460:        IFF  BL$BF,GPF02      BFBLK
                   15461: .FI
                   15462:        IFF  BL$CC,GPF07      CCBLK
                   15463:        IFF  BL$CD,GPF08      CDBLK
                   15464:        IFF  BL$CM,GPF04      CMBLK
                   15465:        IFF  BL$CO,GPF19      COBLK
                   15466:        IFF  BL$DF,GPF02      DFBLK
                   15467:        IFF  BL$EV,GPF10      EVBLK
                   15468:        IFF  BL$EX,GPF17      EXBLK
                   15469:        IFF  BL$FF,GPF11      FFBLK
                   15470:        IFF  BL$NM,GPF10      NMBLK
                   15471:        IFF  BL$P0,GPF10      P0BLK
                   15472:        IFF  BL$P1,GPF12      P1BLK
                   15473:        IFF  BL$P2,GPF12      P2BLK
                   15474:        IFF  BL$PD,GPF13      PDBLK
                   15475:        IFF  BL$PF,GPF14      PFBLK
                   15476:        IFF  BL$TB,GPF08      TBBLK
                   15477:        IFF  BL$TE,GPF15      TEBLK
                   15478:        IFF  BL$TR,GPF16      TRBLK
                   15479:        IFF  BL$VC,GPF08      VCBLK
                   15480:        IFF  BL$XR,GPF09      XRBLK
                   15481:        IFF  BL$CT,GPF02      CTBLK
                   15482:        IFF  BL$EF,GPF02      EFBLK
                   15483:        IFF  BL$IC,GPF02      ICBLK
                   15484:        IFF  BL$KV,GPF02      KVBLK
                   15485: .IF    .CNRA
                   15486: .ELSE
                   15487:        IFF  BL$RC,GPF02      RCBLK
                   15488: .FI
                   15489:        IFF  BL$SC,GPF02      SCBLK
                   15490:        IFF  BL$SE,GPF02      SEBLK
                   15491:        IFF  BL$XN,GPF02      XNBLK
                   15492:        ESW                   END OF JUMP TABLE
                   15493:        EJC
                   15494: *
                   15495: *      GBCPF (CONTINUED)
                   15496: *
                   15497: *      CMBLK
                   15498: *
                   15499: GPF04  MOV  CMLEN(XR),WA     LOAD LENGTH
                   15500:        MOV  *CMTYP,WB        SET OFFSET
                   15501: *
                   15502: *      HERE TO PUSH DOWN TO NEW LEVEL
                   15503: *
                   15504: *      (WC)                  FIELD PTR AT PREVIOUS LEVEL
                   15505: *      (XR)                  PTR TO NEW BLOCK
                   15506: *      (WA)                  LENGTH (RELOC FLDS + FLDS AT START)
                   15507: *      (WB)                  OFFSET TO FIRST RELOC FIELD
                   15508: *
                   15509: GPF05  ADD  XR,WA            POINT PAST LAST RELOC FIELD
                   15510:        ADD  WB,XR            POINT TO FIRST RELOC FIELD
                   15511:        MOV  WC,-(XS)         STACK OLD FIELD POINTER
                   15512:        MOV  WA,-(XS)         STACK NEW LIMIT POINTER
                   15513:        CHK                   CHECK FOR STACK OVERFLOW
                   15514:        BRN  GPF01            IF OK, BACK TO PROCESS
                   15515: *
                   15516: *      ARBLK
                   15517: *
                   15518: GPF06  MOV  ARLEN(XR),WA     LOAD LENGTH
                   15519:        MOV  AROFS(XR),WB     SET OFFSET TO 1ST RELOC FLD (ARPRO)
                   15520:        BRN  GPF05            ALL SET
                   15521: *
                   15522: *      CCBLK
                   15523: *
                   15524: GPF07  MOV  CCUSE(XR),WA     SET LENGTH IN USE
                   15525:        MOV  *CCUSE,WB        1ST WORD (MAKE SURE AT LEAST ONE)
                   15526:        BRN  GPF05            ALL SET
                   15527:        EJC
                   15528: *
                   15529: *      GBCPF (CONTINUED)
                   15530: *
                   15531: *      CDBLK, TBBLK, VCBLK
                   15532: *
                   15533: GPF08  MOV  OFFS2(XR),WA     LOAD LENGTH
                   15534:        MOV  *OFFS3,WB        SET OFFSET
                   15535:        BRN  GPF05            JUMP BACK
                   15536: *
                   15537: *      XRBLK
                   15538: *
                   15539: GPF09  MOV  XRLEN(XR),WA     LOAD LENGTH
                   15540:        MOV  *XRPTR,WB        SET OFFSET
                   15541:        BRN  GPF05            JUMP BACK
                   15542: *
                   15543: *      EVBLK, NMBLK, P0BLK
                   15544: *
                   15545: GPF10  MOV  *OFFS2,WA        POINT PAST SECOND FIELD
                   15546:        MOV  *OFFS1,WB        OFFSET IS ONE (ONLY RELOC FLD IS 2)
                   15547:        BRN  GPF05            ALL SET
                   15548: *
                   15549: *      FFBLK
                   15550: *
                   15551: GPF11  MOV  *FFOFS,WA        SET LENGTH
                   15552:        MOV  *FFNXT,WB        SET OFFSET
                   15553:        BRN  GPF05            ALL SET
                   15554: *
                   15555: *      P1BLK, P2BLK
                   15556: *
                   15557: GPF12  MOV  *PARM2,WA        LENGTH (PARM2 IS NON-RELOCATABLE)
                   15558:        MOV  *PTHEN,WB        SET OFFSET
                   15559:        BRN  GPF05            ALL SET
                   15560:        EJC
                   15561: *
                   15562: *      GBCPF (CONTINUED)
                   15563: *
                   15564: *      PDBLK
                   15565: *
                   15566: GPF13  MOV  PDDFP(XR),XL     LOAD PTR TO DFBLK
                   15567:        MOV  DFPDL(XL),WA     GET PDBLK LENGTH
                   15568:        MOV  *PDFLD,WB        SET OFFSET
                   15569:        BRN  GPF05            ALL SET
                   15570: *
                   15571: *      PFBLK
                   15572: *
                   15573: GPF14  MOV  *PFARG,WA        LENGTH PAST LAST RELOC
                   15574:        MOV  *PFCOD,WB        OFFSET TO FIRST RELOC
                   15575:        BRN  GPF05            ALL SET
                   15576: *
                   15577: *      TEBLK
                   15578: *
                   15579: GPF15  MOV  *TESI$,WA        SET LENGTH
                   15580:        MOV  *TESUB,WB        AND OFFSET
                   15581:        BRN  GPF05            ALL SET
                   15582: *
                   15583: *      TRBLK
                   15584: *
                   15585: GPF16  MOV  *TRSI$,WA        SET LENGTH
                   15586:        MOV  *TRVAL,WB        AND OFFSET
                   15587:        BRN  GPF05            ALL SET
                   15588: *
                   15589: *      EXBLK
                   15590: *
                   15591: GPF17  MOV  EXLEN(XR),WA     LOAD LENGTH
                   15592:        MOV  *EXFLC,WB        SET OFFSET
                   15593:        BRN  GPF05            JUMP BACK
                   15594: .IF    .CNBF
                   15595: .ELSE
                   15596: *
                   15597: *      BCBLK
                   15598: *
                   15599: GPF18  MOV  *BCSI$,WA        SET LENGTH
                   15600:        MOV  *BCBUF,WB        AND OFFSET
                   15601:        BRN  GPF05            ALL SET
                   15602: .FI
                   15603: *
                   15604: *      COBLK
                   15605: *
                   15606: GPF19  MOV  *COSI$,WA        SET LENGTH
                   15607:        MOV  *CONXT,WB        AND OFFSET
                   15608:        BRN  GPF05            ALL SET
                   15609:        ENP                   END PROCEDURE GBCPF
                   15610: .IF    .CNBF
                   15611: .ELSE
                   15612:        EJC
                   15613: *
                   15614: *      GTBUF -- GET BUFFER
                   15615: *
                   15616: *      GTBUF IS PASSED AN OBJECT AND RETURNS A BUFFER IF
                   15617: *      POSSIBLE.  UNLESS THE OBJECT IS ALREADY A BUFFER,
                   15618: *      THIS INVOLVES A CONVERSION TO STRING AND THEN
                   15619: *      STRING TO BUFFER.
                   15620: *
                   15621: *      (XR)                  OBJECT TO BE CONVERTED
                   15622: *      JSR  GTBUF            CALL TO GET BUFFER
                   15623: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
                   15624: *      (XR)                  RESULTING BUFFER
                   15625: *      (XL,WA,WB,WC)         DESTROYED
                   15626: *
                   15627: GTBUF  PRC  E,1              ENTRY POINT
                   15628:        BEQ  (XR),=B$BCT,GTB01 EXIT IF ALREADY BUFFER
                   15629:        MOV  XR,-(XS)         STACK TO CONVERT TO STRING
                   15630:        JSR  GTSTG            CONVERT TO STRING
                   15631:        PPM  GTB02            CONVERSION ERROR
                   15632:        MOV  XR,XL            SAVE STRING POINTER
                   15633:        JSR  ALOBF            ALLOCATE BUFFER OF SAME SIZE
                   15634:        JSR  INSBF            COPY IN THE STRING
                   15635:        PPM                   ALREADY STRING - CANT FAIL TO CNV
                   15636:        PPM                   MUST BE ENOUGH ROOM
                   15637: *
                   15638: *      MERGE TO EXIT WITH BUFFER CONTROL BLK IN (XR)
                   15639: *
                   15640: GTB01  EXI                   RETURN TO CALLER
                   15641: *
                   15642: *      HERE ON CONVERSION FAILURE
                   15643: *
                   15644: GTB02  EXI  1                TAKE FAILURE EXIT
                   15645:        ENP
                   15646: .FI
                   15647:        EJC
                   15648: *
                   15649: *      GTARR -- GET ARRAY
                   15650: *
                   15651: *      GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBLE
                   15652: *
                   15653: *      (XR)                  VALUE TO BE CONVERTED
                   15654: *      JSR  GTARR            CALL TO GET ARRAY
                   15655: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
                   15656: *      (XR)                  RESULTING ARRAY
                   15657: *      (XL,WA,WB,WC)         DESTROYED
                   15658: *
                   15659: GTARR  PRC  E,1              ENTRY POINT
                   15660:        MOV  (XR),WA          LOAD TYPE WORD
                   15661:        BEQ  WA,=B$ART,GTAR8  EXIT IF ALREADY AN ARRAY
                   15662:        BEQ  WA,=B$VCT,GTAR8  EXIT IF ALREADY AN ARRAY
                   15663:        MOV  XR,-(XS)         PLACE POSSIBLE TBBLK PTR ON STACK
                   15664:        BNE  WA,=B$TBT,GTAR9  ELSE FAIL IF NOT A TABLE
                   15665: *
                   15666: *      HERE WE CONVERT A TABLE TO AN ARRAY
                   15667: *
                   15668:        ZER  XR               SIGNAL FIRST PASS
                   15669:        ZER  WB               ZERO NON-NULL ELEMENT COUNT
                   15670: *
                   15671: *      THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
                   15672: *      SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
                   15673: *      THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
                   15674: *      XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
                   15675: *      ENTERED INTO THE CURRENT ARBLK LOCATION.
                   15676: *
                   15677: GTAR1  MOV  (XS),XL          POINT TO TABLE
                   15678:        ADD  TBLEN(XL),XL     POINT PAST LAST BUCKET
                   15679:        SUB  *TBBUK,XL        SET FIRST BUCKET OFFSET
                   15680:        MOV  XL,WA            COPY ADJUSTED POINTER
                   15681: *
                   15682: *      LOOP THROUGH BUCKETS IN TABLE BLOCK
                   15683: *      NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
                   15684: *      1 LESS THAN TBBUK.
                   15685: *
                   15686: GTAR2  MOV  WA,XL            COPY BUCKET POINTER
                   15687:        DCA  WA               DECREMENT BUCKET POINTER
                   15688: *
                   15689: *      LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
                   15690: *
                   15691: GTAR3  MOV  TENXT(XL),XL     POINT TO NEXT TEBLK
                   15692:        BEQ  XL,(XS),GTAR6    JUMP IF CHAIN END (TBBLK PTR)
                   15693:        MOV  XL,CNVTP         ELSE SAVE TEBLK POINTER
                   15694: *
                   15695: *      LOOP TO FIND VALUE DOWN TRBLK CHAIN
                   15696: *
                   15697: GTAR4  MOV  TEVAL(XL),XL     LOAD VALUE
                   15698:        BEQ  (XL),=B$TRT,GTAR4 LOOP TILL VALUE FOUND
                   15699:        MOV  XL,WC            COPY VALUE
                   15700:        MOV  CNVTP,XL         RESTORE TEBLK POINTER
                   15701:        EJC
                   15702: *
                   15703: *      GTARR (CONTINUED)
                   15704: *
                   15705: *      NOW CHECK FOR NULL AND TEST CASES
                   15706: *
                   15707:        BEQ  WC,=NULLS,GTAR3  LOOP BACK TO IGNORE NULL VALUE
                   15708:        BNZ  XR,GTAR5         JUMP IF SECOND PASS
                   15709:        ICV  WB               FOR THE FIRST PASS, BUMP COUNT
                   15710:        BRN  GTAR3            AND LOOP BACK FOR NEXT TEBLK
                   15711: *
                   15712: *      HERE IN SECOND PASS
                   15713: *
                   15714: GTAR5  MOV  TESUB(XL),(XR)+  STORE SUBSCRIPT NAME
                   15715:        MOV  WC,(XR)+         STORE VALUE IN ARBLK
                   15716:        BRN  GTAR3            LOOP BACK FOR NEXT TEBLK
                   15717: *
                   15718: *      HERE AFTER SCANNING TEBLKS ON ONE CHAIN
                   15719: *
                   15720: GTAR6  BNE  WA,(XS),GTAR2    LOOP BACK IF MORE BUCKETS TO GO
                   15721:        BNZ  XR,GTAR7         ELSE JUMP IF SECOND PASS
                   15722: *
                   15723: *      HERE AFTER COUNTING NON-NULL ELEMENTS
                   15724: *
                   15725:        BZE  WB,GTAR9         FAIL IF NO NON-NULL ELEMENTS
                   15726:        MOV  WB,WA            ELSE COPY COUNT
                   15727:        ADD  WB,WA            DOUBLE (TWO WORDS/ELEMENT)
                   15728:        ADD  =ARVL2,WA        ADD SPACE FOR STANDARD FIELDS
                   15729:        WTB  WA               CONVERT LENGTH TO BAUS
                   15730:        BGE  WA,MXLEN,GTAR9   FAIL IF TOO LONG FOR ARRAY
                   15731:        JSR  ALLOC            ELSE ALLOCATE SPACE FOR ARBLK
                   15732:        MOV  =B$ART,(XR)      STORE TYPE WORD
                   15733:        ZER  IDVAL(XR)        ZERO ID FOR THE MOMENT
                   15734:        MOV  WA,ARLEN(XR)     STORE LENGTH
                   15735:        MOV  =NUM02,ARNDM(XR) SET DIMENSIONS = 2
                   15736:        LDI  INTV1            GET INTEGER ONE
                   15737:        STI  ARLBD(XR)        STORE AS LBD 1
                   15738:        STI  ARLB2(XR)        STORE AS LBD 2
                   15739:        LDI  INTV2            LOAD INTEGER TWO
                   15740:        STI  ARDM2(XR)        STORE AS DIM 2
                   15741:        MTI  WB               GET ELEMENT COUNT AS INTEGER
                   15742:        STI  ARDIM(XR)        STORE AS DIM 1
                   15743:        ZER  ARPR2(XR)        ZERO PROTOTYPE FIELD FOR NOW
                   15744:        MOV  *ARPR2,AROFS(XR) SET OFFSET FIELD (SIGNAL PASS 2)
                   15745:        MOV  XR,WB            SAVE ARBLK POINTER
                   15746:        ADD  *ARVL2,XR        POINT TO FIRST ELEMENT LOCATION
                   15747:        BRN  GTAR1            JUMP BACK TO FILL IN ELEMENTS
                   15748:        EJC
                   15749: *
                   15750: *      GTARR (CONTINUED)
                   15751: *
                   15752: *      HERE AFTER FILLING IN ELEMENT VALUES
                   15753: *
                   15754: GTAR7  MOV  WB,XR            RESTORE ARBLK POINTER
                   15755:        MOV  WB,(XS)          STORE AS RESULT
                   15756: *
                   15757: *      NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
                   15758: *      THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
                   15759: *      CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
                   15760: *
                   15761:        LDI  ARDIM(XR)        GET NUMBER OF ELEMENTS (NN)
                   15762:        MLI  INTVH            MULTIPLY BY 100
                   15763:        ADI  INTV2            ADD 2 (NN02)
                   15764:        JSR  ICBLD            BUILD INTEGER
                   15765:        MOV  XR,-(XS)         STORE PTR FOR GTSTG
                   15766:        JSR  GTSTG            CONVERT TO STRING
                   15767:        PPM                   CONVERT FAIL IS IMPOSSIBLE
                   15768:        MOV  XR,XL            COPY STRING POINTER
                   15769:        MOV  (XS)+,XR         RELOAD ARBLK POINTER
                   15770:        MOV  XL,ARPR2(XR)     STORE PROTOTYPE PTR (NN02)
                   15771:        SUB  =NUM02,WA        ADJUST LENGTH TO POINT TO ZERO
                   15772:        PSC  XL,WA            POINT TO ZERO
                   15773:        MOV  =CH$CM,WB        LOAD A COMMA
                   15774:        SCH  WB,(XL)          STORE A COMMA OVER THE ZERO
                   15775:        CSC  XL               COMPLETE STORE CHARACTERS
                   15776: *
                   15777: *      NORMAL RETURN
                   15778: *
                   15779: GTAR8  EXI                   RETURN TO CALLER
                   15780: *
                   15781: *      NON-CONVERSION RETURN
                   15782: *
                   15783: GTAR9  MOV  (XS)+,XR         CLEAR UP STACK
                   15784:        EXI  1                RETURN
                   15785:        ENP                   PROCEDURE GTARR
                   15786:        EJC
                   15787: *
                   15788: *      GTCOD -- CONVERT TO CODE
                   15789: *
                   15790: *      (XR)                  OBJECT TO BE CONVERTED
                   15791: *      JSR  GTCOD            CALL TO CONVERT TO CODE
                   15792: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   15793: *      (XR)                  POINTER TO RESULTING CDBLK
                   15794: *      (XL,WA,WB,WC,RA)      DESTROYED
                   15795: *
                   15796: *      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
                   15797: *      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
                   15798: *      WITHOUT RETURNING TO THIS ROUTINE.
                   15799: *
                   15800: GTCOD  PRC  E,1              ENTRY POINT
                   15801:        BEQ  (XR),=B$CDS,GTCD1 JUMP IF ALREADY CODE
                   15802:        BEQ  (XR),=B$CDC,GTCD1 JUMP IF ALREADY CODE
                   15803: *
                   15804: *      HERE WE MUST GENERATE A CDBLK BY COMPILATION
                   15805: *
                   15806:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   15807:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   15808:        PPM  GTCD2            JUMP IF NON-CONVERTIBLE
                   15809:        MOV  FLPTR,GTCEF      SAVE FAIL PTR IN CASE OF ERROR
                   15810:        MOV  R$COD,R$GTC      ALSO SAVE CODE PTR
                   15811:        MOV  XR,R$CIM         ELSE SET IMAGE POINTER
                   15812:        MOV  WA,SCNIL         SET IMAGE LENGTH
                   15813:        ZER  SCNPT            SET SCAN POINTER
                   15814:        MOV  =STGXC,STAGE     SET STAGE FOR EXECUTE COMPILE
                   15815:        MOV  CMPSN,LSTSN      IN CASE LISTR CALLED
                   15816:        JSR  CMPIL            COMPILE STRING
                   15817:        MOV  =STGXT,STAGE     RESET STAGE FOR EXECUTE TIME
                   15818:        ZER  R$CIM            CLEAR IMAGE
                   15819: *
                   15820: *      MERGE HERE IF NO CONVERT REQUIRED
                   15821: *
                   15822: GTCD1  EXI                   GIVE NORMAL GTCOD RETURN
                   15823: *
                   15824: *      HERE IF UNCONVERTIBLE
                   15825: *
                   15826: GTCD2  EXI  1                GIVE ERROR RETURN
                   15827:        ENP                   END PROCEDURE GTCOD
                   15828:        EJC
                   15829: *
                   15830: *      GTEXP -- CONVERT TO EXPRESSION
                   15831: *
                   15832: *      (XR)                  INPUT VALUE TO BE CONVERTED
                   15833: *      JSR  GTEXP            CALL TO CONVERT TO EXPRESSION
                   15834: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   15835: *      (XR)                  POINTER TO RESULT EXBLK OR SEBLK
                   15836: *      (XL,WA,WB,WC,RA)      DESTROYED
                   15837: *
                   15838: *      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
                   15839: *      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
                   15840: *      WITHOUT RETURNING TO THIS ROUTINE.
                   15841: *
                   15842: GTEXP  PRC  E,1              ENTRY POINT
                   15843:        BLO  (XR),=B$E$$,GTEX1 JUMP IF ALREADY AN EXPRESSION
                   15844:        MOV  XR,-(XS)         STORE ARGUMENT FOR GTSTG
                   15845:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   15846:        PPM  GTEX2            JUMP IF UNCONVERTIBLE
                   15847: *
                   15848: *      CHECK THE LAST CHAR OF STRING FOR COLON OR
                   15849: *      SEMICOLON. THEY CAN LEGITIMATELY END AN EXPRESSION
                   15850: *      IN OPEN CODE, SO EXPAN WILL NOT FAIL THEM BUT THEY ARE
                   15851: *      INVALID AS TERMINATORS FOR A STRING WHICH IS TO BE
                   15852: *      CONVERTED TO EXPRESSION FORM.
                   15853: *
                   15854:        MOV  XR,XL            COPY ARGUMENT STRING
                   15855:        PLC  XL,WA            POINT PAST STRING END
                   15856:        LCH  XL,-(XL)         GET LAST CHAR
                   15857:        BEQ  XL,=CH$CL,GTEX2  FAIL IF COLON
                   15858:        BEQ  XL,=CH$SM,GTEX2  FAIL IF SEMICOLON
                   15859: *
                   15860: *      HERE WE CONVERT A STRING BY COMPILATION
                   15861: *
                   15862:        MOV  XR,R$CIM         SET INPUT IMAGE POINTER
                   15863:        ZER  SCNPT            SET SCAN POINTER
                   15864:        MOV  WA,SCNIL         SET INPUT IMAGE LENGTH
                   15865:        ZER  WB               SET CODE FOR NORMAL SCAN
                   15866:        MOV  FLPTR,GTCEF      SAVE FAIL PTR IN CASE OF ERROR
                   15867:        MOV  R$COD,R$GTC      ALSO SAVE CODE PTR
                   15868:        MOV  =STGEV,STAGE     ADJUST STAGE FOR COMPILE
                   15869:        MOV  =T$UOK,SCNTP     INDICATE UNARY OPERATOR ACCEPTABLE
                   15870:        JSR  EXPAN            BUILD TREE FOR EXPRESSION
                   15871:        ZER  SCNRS            RESET RESCAN FLAG
                   15872:        BNE  SCNPT,SCNIL,GTEX2 ERROR IF NOT END OF IMAGE
                   15873:        ZER  WB               SET OK VALUE FOR CDGEX CALL
                   15874:        MOV  XR,XL            COPY TREE POINTER
                   15875:        JSR  CDGEX            BUILD EXPRESSION BLOCK
                   15876:        ZER  R$CIM            CLEAR POINTER
                   15877:        MOV  =STGXT,STAGE     RESTORE STAGE FOR EXECUTE TIME
                   15878: *
                   15879: *      MERGE HERE IF NO CONVERSION REQUIRED
                   15880: *
                   15881: GTEX1  EXI                   RETURN TO GTEXP CALLER
                   15882: *
                   15883: *      HERE IF UNCONVERTIBLE
                   15884: *
                   15885: GTEX2  EXI  1                TAKE ERROR EXIT
                   15886:        ENP                   END PROCEDURE GTEXP
                   15887:        EJC
                   15888: *
                   15889: *      GTINT -- GET INTEGER VALUE
                   15890: *
                   15891: *      GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
                   15892: *      PERFORMING ANY NECESSARY CONVERSIONS.
                   15893: *
                   15894: *      (XR)                  VALUE TO BE CONVERTED
                   15895: *      JSR  GTINT            CALL TO CONVERT TO INTEGER
                   15896: *      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
                   15897: *      (XR)                  RESULTING INTEGER
                   15898: *      (WC,RA)               DESTROYED
                   15899: *      (WA,WB)               DESTROYED (ONLY ON CONVERSION ERR)
                   15900: *      (XR)                  UNCHANGED (ON CONVERT ERROR)
                   15901: *
                   15902: GTINT  PRC  E,1              ENTRY POINT
                   15903:        BEQ  (XR),=B$ICL,GTIN2 JUMP IF ALREADY AN INTEGER
                   15904:        MOV  WA,GTINA         ELSE SAVE WA
                   15905:        MOV  WB,GTINB         SAVE WB
                   15906:        JSR  GTNUM            CONVERT TO NUMERIC
                   15907:        PPM  GTIN3            JUMP IF UNCONVERTIBLE
                   15908: .IF    .CNRA
                   15909: .ELSE
                   15910:        BEQ  WA,=B$ICL,GTIN1  JUMP IF INTEGER
                   15911: *
                   15912: *      HERE WE CONVERT A REAL TO INTEGER
                   15913: *
                   15914:        LDR  RCVAL(XR)        LOAD REAL VALUE
                   15915:        RTI  GTIN3            CONVERT TO INTEGER (ERR IF OVFLOW)
                   15916:        JSR  ICBLD            IF OK BUILD ICBLK
                   15917: .FI
                   15918: *
                   15919: *      HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
                   15920: *
                   15921: GTIN1  MOV  GTINA,WA         RESTORE WA
                   15922:        MOV  GTINB,WB         RESTORE WB
                   15923: *
                   15924: *      COMMON EXIT POINT
                   15925: *
                   15926: GTIN2  EXI                   RETURN TO GTINT CALLER
                   15927: *
                   15928: *      HERE ON CONVERSION ERROR
                   15929: *
                   15930: GTIN3  EXI  1                TAKE CONVERT ERROR EXIT
                   15931:        ENP                   END PROCEDURE GTINT
                   15932:        EJC
                   15933: *
                   15934: *      GTNUM -- GET NUMERIC VALUE
                   15935: *
                   15936: *      GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
                   15937: *      OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
                   15938: *
                   15939: *      (XR)                  OBJECT TO BE CONVERTED
                   15940: *      JSR  GTNUM            CALL TO CONVERT TO NUMERIC
                   15941: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   15942: *      (XR)                  POINTER TO RESULT (INT OR REAL)
                   15943: *      (WA)                  FIRST WORD OF RESULT BLOCK
                   15944: *      (WB,WC,RA)            DESTROYED
                   15945: *      (XR)                  UNCHANGED (ON CONVERT ERROR)
                   15946: *
                   15947: GTNUM  PRC  E,1              ENTRY POINT
                   15948:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   15949:        BEQ  WA,=B$ICL,GTN3A  JUMP IF INTEGER (NO CONVERSION)
                   15950: .IF    .CNRA
                   15951: .ELSE
                   15952:        BEQ  WA,=B$RCL,GTN3A  JUMP IF REAL (NO CONVERSION)
                   15953: .FI
                   15954: *
                   15955: *      AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
                   15956: *      TO AN INTEGER OR REAL AS APPROPRIATE.
                   15957: *
                   15958:        STI  GTNSV            SAVE IA
                   15959:        MOV  XR,-(XS)         STACK ARGUMENT IN CASE CONVERT ERR
                   15960:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   15961:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   15962:        PPM  GTN36            JUMP IF UNCONVERTIBLE
                   15963: *
                   15964: *      INITIALIZE NUMERIC CONVERSION
                   15965: *
                   15966:        LDI  INTV0            INITIALIZE INTEGER RESULT TO ZERO
                   15967:        BZE  WA,GTN32         JUMP TO EXIT WITH ZERO IF NULL
                   15968:        LCT  WA,WA            SET BCT COUNTER FOR FOLLOWING LOOPS
                   15969:        ZER  GTNNF            TENTATIVELY INDICATE RESULT +
                   15970: .IF    .CNRA
                   15971: .ELSE
                   15972:        STI  GTNEX            INITIALISE EXPONENT TO ZERO
                   15973:        ZER  GTNSC            ZERO SCALE IN CASE REAL
                   15974:        ZER  GTNDF            RESET FLAG FOR DEC POINT FOUND
                   15975:        ZER  GTNRD            RESET FLAG FOR DIGITS FOUND
                   15976:        LDR  REAV0            ZERO REAL ACCUM IN CASE REAL
                   15977: .FI
                   15978:        PLC  XR               POINT TO ARGUMENT CHARACTERS
                   15979: *
                   15980: *      MERGE BACK HERE AFTER IGNORING LEADING BLANK
                   15981: *
                   15982: GTN01  LCH  WB,(XR)+         LOAD FIRST CHARACTER
                   15983:        BLT  WB,=CH$D0,GTN02  JUMP IF NOT DIGIT
                   15984:        BLE  WB,=CH$D9,GTN06  JUMP IF FIRST CHAR IS A DIGIT
                   15985:        EJC
                   15986: *
                   15987: *      GTNUM (CONTINUED)
                   15988: *
                   15989: *      HERE IF FIRST DIGIT IS NON-DIGIT
                   15990: *
                   15991: GTN02  BNE  WB,=CH$BL,GTN03  JUMP IF NON-BLANK
                   15992: GTNA2  BCT  WA,GTN01         ELSE DECR COUNT AND LOOP BACK
                   15993:        BRN  GTN07            JUMP TO RETURN ZERO IF ALL BLANKS
                   15994: *
                   15995: *      HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
                   15996: *
                   15997: GTN03  BEQ  WB,=CH$PL,GTN04  JUMP IF PLUS SIGN
                   15998: .IF    .CAHT
                   15999:        BEQ  WB,=CH$HT,GTNA2  HORIZONTAL TAB EQUIV TO BLANK
                   16000: .FI
                   16001: .IF    .CAVT
                   16002:        BEQ  WB,=CH$VT,GTNA2  VERTICAL TAB EQUIV TO BLANK
                   16003: .FI
                   16004: .IF    .CNRA
                   16005:        BNE  WB,=CH$MN,GTN36  ELSE FAIL
                   16006: .ELSE
                   16007:        BNE  WB,=CH$MN,GTN12  JUMP IF NOT MINUS (MAY BE REAL)
                   16008: .FI
                   16009:        MNZ  GTNNF            IF MINUS SIGN, SET NEGATIVE FLAG
                   16010: *
                   16011: *      MERGE HERE AFTER PROCESSING SIGN
                   16012: *
                   16013: GTN04  BCT  WA,GTN05         JUMP IF CHARS LEFT
                   16014:        BRN  GTN36            ELSE ERROR
                   16015: *
                   16016: *      LOOP TO FETCH CHARACTERS OF AN INTEGER
                   16017: *
                   16018: GTN05  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   16019:        BLT  WB,=CH$D0,GTN08  JUMP IF NOT A DIGIT
                   16020:        BGT  WB,=CH$D9,GTN08  JUMP IF NOT A DIGIT
                   16021: *
                   16022: *      MERGE HERE FOR FIRST DIGIT
                   16023: *
                   16024: GTN06  STI  GTNSI            SAVE CURRENT VALUE
                   16025: .IF    .CNRA
                   16026:        CVM  GTN36            CURRENT*10-(NEW DIG) JUMP IF OVFLOW
                   16027: .ELSE
                   16028:        CVM  GTN35            CURRENT*10-(NEW DIG) JUMP IF OVFLOW
                   16029:        MNZ  GTNRD            SET DIGIT READ FLAG
                   16030: .FI
                   16031:        BCT  WA,GTN05         ELSE LOOP BACK IF MORE CHARS
                   16032: *
                   16033: *      HERE TO EXIT WITH CONVERTED INTEGER VALUE
                   16034: *
                   16035: GTN07  BNZ  GTNNF,GTN32      JUMP IF NEGATIVE (ALL SET)
                   16036:        NGI                   ELSE NEGATE
                   16037:        INO  GTN32            JUMP IF NO OVERFLOW
                   16038:        BRN  GTN36            ELSE SIGNAL ERROR
                   16039:        EJC
                   16040: *
                   16041: *      GTNUM (CONTINUED)
                   16042: *
                   16043: *      HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
                   16044: *      CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
                   16045: *
                   16046: GTN08  BEQ  WB,=CH$BL,GTNA9  JUMP IF A BLANK
                   16047: .IF    .CAHT
                   16048:        BEQ  WB,=CH$HT,GTNA9  JUMP IF HORIZONTAL TAB
                   16049: .FI
                   16050: .IF    .CAVT
                   16051:        BEQ  WB,=CH$VT,GTNA9  JUMP IF VERTICAL TAB
                   16052: .FI
                   16053: .IF    .CNRA
                   16054:        BRN  GTN36            ERROR
                   16055: .ELSE
                   16056:        ITR                   ELSE CONVERT INTEGER TO REAL
                   16057:        NGR                   NEGATE TO GET POSITIVE VALUE
                   16058:        BRN  GTN12            JUMP TO TRY FOR REAL
                   16059: .FI
                   16060: *
                   16061: *      HERE WE SCAN OUT BLANKS TO END OF STRING
                   16062: *
                   16063: GTN09  LCH  WB,(XR)+         GET NEXT CHAR
                   16064: .IF    .CAHT
                   16065:        BEQ  WB,=CH$HT,GTNA9  JUMP IF HORIZONTAL TAB
                   16066: .FI
                   16067: .IF    .CAVT
                   16068:        BEQ  WB,=CH$VT,GTNA9  JUMP IF VERTICAL TAB
                   16069: .FI
                   16070:        BNE  WB,=CH$BL,GTN36  ERROR IF NON-BLANK
                   16071: GTNA9  BCT  WA,GTN09         LOOP BACK IF MORE CHARS TO CHECK
                   16072:        BRN  GTN07            RETURN INTEGER IF ALL BLANKS
                   16073: .IF    .CNRA
                   16074: .ELSE
                   16075: *
                   16076: *      LOOP TO COLLECT MANTISSA OF REAL
                   16077: *
                   16078: GTN10  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   16079:        BLT  WB,=CH$D0,GTN12  JUMP IF NON-NUMERIC
                   16080:        BGT  WB,=CH$D9,GTN12  JUMP IF NON-NUMERIC
                   16081: *
                   16082: *      MERGE HERE TO COLLECT FIRST REAL DIGIT
                   16083: *
                   16084: GTN11  SUB  =CH$D0,WB        CONVERT DIGIT TO NUMBER
                   16085:        MLR  REAVT            MULTIPLY REAL BY 10.0
                   16086:        ROV  GTN36            CONVERT ERROR IF OVERFLOW
                   16087:        STR  GTNSR            SAVE RESULT
                   16088:        MTI  WB               GET NEW DIGIT AS INTEGER
                   16089:        ITR                   CONVERT NEW DIGIT TO REAL
                   16090:        ADR  GTNSR            ADD TO GET NEW TOTAL
                   16091:        ADD  GTNDF,GTNSC      INCREMENT SCALE IF AFTER DEC POINT
                   16092:        MNZ  GTNRD            SET DIGIT FOUND FLAG
                   16093:        BCT  WA,GTN10         LOOP BACK IF MORE CHARS
                   16094:        BRN  GTN22            ELSE JUMP TO SCALE
                   16095:        EJC
                   16096: *
                   16097: *      GTNUM (CONTINUED)
                   16098: *
                   16099: *      HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
                   16100: *
                   16101: GTN12  BNE  WB,=CH$DT,GTN13  JUMP IF NOT DEC POINT
                   16102:        BNZ  GTNDF,GTN36      IF DEC POINT, ERROR IF ONE ALREADY
                   16103:        MOV  =NUM01,GTNDF     ELSE SET FLAG FOR DEC POINT
                   16104:        BCT  WA,GTN10         LOOP BACK IF MORE CHARS
                   16105:        BRN  GTN22            ELSE JUMP TO SCALE
                   16106: *
                   16107: *      HERE IF NOT DECIMAL POINT
                   16108: *
                   16109: GTN13  BEQ  WB,=CH$LE,GTN15  JUMP IF E FOR EXPONENT
                   16110:        BEQ  WB,=CH$LD,GTN15  JUMP IF D FOR EXPONENT
                   16111: .IF    .CASL
                   16112:        BEQ  WB,=CH$$E,GTN15  JUMP FOR EXPT
                   16113:        BEQ  WB,=CH$$D,GTN15  JUMP FOR EXPT
                   16114: .FI
                   16115: *
                   16116: *      HERE CHECK FOR TRAILING BLANKS
                   16117: *
                   16118: GTN14  BEQ  WB,=CH$BL,GTNB4  JUMP IF BLANK
                   16119: .IF    .CAHT
                   16120:        BEQ  WB,=CH$HT,GTNB4  JUMP IF HORIZONTAL TAB
                   16121: .FI
                   16122: .IF    .CAVT
                   16123:        BEQ  WB,=CH$VT,GTNB4  JUMP IF VERTICAL TAB
                   16124: .FI
                   16125:        BRN  GTN36            ERROR IF NON-BLANK
                   16126: *
                   16127: GTNB4  LCH  WB,(XR)+         GET NEXT CHARACTER
                   16128:        BCT  WA,GTN14         LOOP BACK TO CHECK IF MORE
                   16129:        BRN  GTN22            ELSE JUMP TO SCALE
                   16130: *
                   16131: *      HERE TO READ AND PROCESS AN EXPONENT
                   16132: *
                   16133: GTN15  ZER  GTNES            SET EXPONENT SIGN POSITIVE
                   16134:        LDI  INTV0            INITIALIZE EXPONENT TO ZERO
                   16135:        MNZ  GTNDF            RESET NO DEC POINT INDICATION
                   16136:        BCT  WA,GTN16         JUMP SKIPPING PAST E OR D
                   16137:        BRN  GTN36            ERROR IF NULL EXPONENT
                   16138: *
                   16139: *      CHECK FOR EXPONENT SIGN
                   16140: *
                   16141: GTN16  LCH  WB,(XR)+         LOAD FIRST EXPONENT CHARACTER
                   16142:        BEQ  WB,=CH$PL,GTN17  JUMP IF PLUS SIGN
                   16143:        BNE  WB,=CH$MN,GTN19  ELSE JUMP IF NOT MINUS SIGN
                   16144:        MNZ  GTNES            SET SIGN NEGATIVE IF MINUS SIGN
                   16145: *
                   16146: *      MERGE HERE AFTER PROCESSING EXPONENT SIGN
                   16147: *
                   16148: GTN17  BCT  WA,GTN18         JUMP IF CHARS LEFT
                   16149:        BRN  GTN36            ELSE ERROR
                   16150: *
                   16151: *      LOOP TO CONVERT EXPONENT DIGITS
                   16152: *
                   16153: GTN18  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   16154:        EJC
                   16155: *
                   16156: *      GTNUM (CONTINUED)
                   16157: *
                   16158: *      MERGE HERE FOR FIRST EXPONENT DIGIT
                   16159: *
                   16160: GTN19  BLT  WB,=CH$D0,GTN20  JUMP IF NOT DIGIT
                   16161:        BGT  WB,=CH$D9,GTN20  JUMP IF NOT DIGIT
                   16162:        CVM  GTN36            ELSE CURRENT*10, SUBTRACT NEW DIGIT
                   16163:        BCT  WA,GTN18         LOOP BACK IF MORE CHARS
                   16164:        BRN  GTN21            JUMP IF EXPONENT FIELD IS EXHAUSTED
                   16165: *
                   16166: *      HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
                   16167: *
                   16168: GTN20  BEQ  WB,=CH$BL,GTNC0  JUMP IF BLANK
                   16169: .IF    .CAHT
                   16170:        BEQ  WB,=CH$HT,GTNC0  JUMP IF HORIZONTAL TAB
                   16171: .FI
                   16172: .IF    .CAVT
                   16173:        BEQ  WC,=CH$VT,GTNC0  JUMP IF VERTICAL TAB
                   16174: .FI
                   16175:        BRN  GTN36            ERROR IF NON-BLANK
                   16176: *
                   16177: GTNC0  LCH  WB,(XR)+         GET NEXT CHARACTER
                   16178:        BCT  WA,GTN20         LOOP BACK TILL ALL BLANKS SCANNED
                   16179: *
                   16180: *      MERGE HERE AFTER COLLECTING EXPONENT
                   16181: *
                   16182: GTN21  STI  GTNEX            SAVE COLLECTED EXPONENT
                   16183:        BNZ  GTNES,GTN22      JUMP IF IT WAS NEGATIVE
                   16184:        NGI                   ELSE COMPLEMENT
                   16185:        IOV  GTN36            ERROR IF OVERFLOW
                   16186:        STI  GTNEX            AND STORE POSITIVE EXPONENT
                   16187: *
                   16188: *      MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
                   16189: *
                   16190: GTN22  BZE  GTNRD,GTN36      ERROR IF NOT DIGITS COLLECTED
                   16191:        BZE  GTNDF,GTN36      ERROR IF NO EXPONENT OR DEC POINT
                   16192:        MTI  GTNSC            ELSE LOAD SCALE AS INTEGER
                   16193:        SBI  GTNEX            SUBTRACT EXPONENT
                   16194:        IOV  GTN36            ERROR IF OVERFLOW
                   16195:        ILT  GTN26            JUMP IF WE MUST SCALE UP
                   16196: *
                   16197: *      HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
                   16198: *
                   16199:        MFI  WA,GTN36         LOAD SCALE FACTOR, ERR IF OVFLOW
                   16200: *
                   16201: *      LOOP TO SCALE DOWN IN STEPS OF 10**10
                   16202: *
                   16203: GTN23  BLE  WA,=NUM10,GTN24  JUMP IF 10 OR LESS TO GO
                   16204:        DVR  REATT            ELSE DIVIDE BY 10**10
                   16205:        SUB  =NUM10,WA        DECREMENT SCALE
                   16206:        BRN  GTN23            AND LOOP BACK
                   16207:        EJC
                   16208: *
                   16209: *      GTNUM (CONTINUED)
                   16210: *
                   16211: *      HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
                   16212: *
                   16213: GTN24  BZE  WA,GTN30         JUMP IF SCALED
                   16214:        LCT  WB,=CFP$R        ELSE GET INDEXING FACTOR
                   16215:        MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
                   16216:        WTB  WA               CONVERT REMAINING SCALE TO BAU OFS
                   16217: *
                   16218: *      LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
                   16219: *
                   16220: GTN25  ADD  WA,XR            BUMP POINTER
                   16221:        BCT  WB,GTN25         ONCE FOR EACH VALUE WORD
                   16222:        DVR  (XR)             SCALE DOWN AS REQUIRED
                   16223:        BRN  GTN30            AND JUMP
                   16224: *
                   16225: *      COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
                   16226: *
                   16227: GTN26  NGI                   GET ABSOLUTE VALUE OF EXPONENT
                   16228:        IOV  GTN36            ERROR IF OVERFLOW
                   16229:        MFI  WA,GTN36         ACQUIRE SCALE, ERROR IF OVFLOW
                   16230: *
                   16231: *      LOOP TO SCALE UP IN STEPS OF 10**10
                   16232: *
                   16233: GTN27  BLE  WA,=NUM10,GTN28  JUMP IF 10 OR LESS TO GO
                   16234:        MLR  REATT            ELSE MULTIPLY BY 10**10
                   16235:        ROV  GTN36            ERROR IF OVERFLOW
                   16236:        SUB  =NUM10,WA        ELSE DECREMENT SCALE
                   16237:        BRN  GTN27            AND LOOP BACK
                   16238: *
                   16239: *      HERE TO SCALE UP REST OF WAY WITH TABLE
                   16240: *
                   16241: GTN28  BZE  WA,GTN30         JUMP IF SCALED
                   16242:        LCT  WB,=CFP$R        ELSE GET INDEXING FACTOR
                   16243:        MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
                   16244:        WTB  WA               CONVERT REMAINING SCALE TO BAU OFS
                   16245: *
                   16246: *      LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
                   16247: *
                   16248: GTN29  ADD  WA,XR            BUMP POINTER
                   16249:        BCT  WB,GTN29         ONCE FOR EACH WORD IN VALUE
                   16250:        MLR  (XR)             SCALE UP
                   16251:        ROV  GTN36            ERROR IF OVERFLOW
                   16252:        EJC
                   16253: *
                   16254: *      GTNUM (CONTINUED)
                   16255: *
                   16256: *      HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
                   16257: *
                   16258: GTN30  BZE  GTNNF,GTN31      JUMP IF POSITIVE
                   16259:        NGR                   ELSE NEGATE
                   16260: *
                   16261: *      HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
                   16262: *
                   16263: GTN31  JSR  RCBLD            BUILD REAL BLOCK
                   16264:        BRN  GTN33            MERGE TO EXIT
                   16265: .FI
                   16266: *
                   16267: *      HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
                   16268: *
                   16269: GTN32  JSR  ICBLD            BUILD ICBLK
                   16270: *
                   16271: *      REAL MERGES HERE
                   16272: *
                   16273: GTN33  MOV  (XR),WA          LOAD FIRST WORD OF RESULT BLOCK
                   16274:        ICA  XS               POP ARGUMENT OFF STACK
                   16275: *
                   16276: *      COMMON EXIT POINT
                   16277: *
                   16278: GTN34  LDI  GTNSV            RECOVER IA
                   16279: GTN3A  EXI                   RETURN TO GTNUM CALLER
                   16280: .IF    .CNRA
                   16281: .ELSE
                   16282: *
                   16283: *      COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
                   16284: *
                   16285: GTN35  LDI  GTNSI            RELOAD INTEGER SO FAR
                   16286:        ITR                   CONVERT TO REAL
                   16287:        NGR                   MAKE VALUE POSITIVE
                   16288:        BRN  GTN11            MERGE WITH REAL CIRCUIT
                   16289: .FI
                   16290: *
                   16291: *      HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
                   16292: *
                   16293: GTN36  MOV  (XS)+,XR         RELOAD ORIGINAL ARGUMENT
                   16294:        LDI  GTNSV            RECOVER IA
                   16295:        EXI  1                TAKE CONVERT-ERROR EXIT
                   16296:        ENP                   END PROCEDURE GTNUM
                   16297:        EJC
                   16298: *
                   16299: *      GTNVR -- CONVERT TO NATURAL VARIABLE
                   16300: *
                   16301: *      GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
                   16302: *      APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
                   16303: *
                   16304: *      (XR)                  ARGUMENT
                   16305: *      JSR  GTNVR            CALL TO CONVERT TO NATURAL VARIABLE
                   16306: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   16307: *      (XR)                  POINTER TO VRBLK
                   16308: *      (WC)                  DESTROYED
                   16309: *
                   16310: GTNVR  PRC  E,1              ENTRY POINT
                   16311:        BNE  (XR),=B$NML,GNV02 JUMP IF NOT NAME
                   16312:        MOV  NMBAS(XR),XR     ELSE LOAD NAME BASE IF NAME
                   16313:        BLO  XR,STATE,GNV07   SKIP IF VRBLK (IN STATIC REGION)
                   16314:        BRN  GNV01            FAIL
                   16315: *
                   16316: *      RESTORE REGS AND FAIL
                   16317: *
                   16318: GNV00  MOV  GNVSA,WA         RESTORE REGS
                   16319:        MOV  GNVSB,WB
                   16320: *
                   16321: *      COMMON ERROR EXIT
                   16322: *
                   16323: GNV01  EXI  1                TAKE CONVERT-ERROR EXIT
                   16324: *
                   16325: *      HERE IF NOT NAME
                   16326: *
                   16327: GNV02  MOV  WA,GNVSA         SAVE WA
                   16328:        MOV  WB,GNVSB         SAVE WB
                   16329:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   16330:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   16331:        PPM  GNV00            JUMP IF CONVERSION ERROR
                   16332:        BZE  WA,GNV00         NULL STRING IS AN ERROR
                   16333:        MOV  XL,-(XS)         SAVE XL
                   16334: .IF    .CASL
                   16335:        MOV  XR,XL            COPY STRING POINTER
                   16336:        ZER  WB               ZERO OFFSET
                   16337:        JSR  SBSTG            CONVERT TO PREFERRED CASE
                   16338:        MOV  SCLEN(XR),WA     RECOVER STRING LENGTH
                   16339: .FI
                   16340:        MOV  XR,-(XS)         STACK STRING PTR FOR LATER
                   16341:        MOV  XR,WB            COPY STRING POINTER
                   16342:        ADD  *SCHAR,WB        POINT TO CHARACTERS OF STRING
                   16343:        MOV  WB,GNVST         SAVE POINTER TO CHARACTERS
                   16344:        MOV  WA,WB            COPY LENGTH
                   16345:        CTW  WB,0             GET NUMBER OF WORDS IN NAME
                   16346:        MOV  WB,GNVNW         SAVE FOR LATER
                   16347:        JSR  HASHS            COMPUTE HASH INDEX FOR STRING
                   16348:        RMI  HSHNB            COMPUTE HASH OFFSET BY TAKING MOD
                   16349:        MFI  WC               GET AS OFFSET
                   16350:        WTB  WC               CONVERT OFFSET TO BAUS
                   16351:        ADD  HSHTB,WC         POINT TO PROPER HASH CHAIN
                   16352:        SUB  *VRNXT,WC        SUBTRACT OFFSET TO MERGE INTO LOOP
                   16353:        EJC
                   16354: *
                   16355: *      GTNVR (CONTINUED)
                   16356: *
                   16357: *      LOOP TO SEARCH HASH CHAIN
                   16358: *
                   16359: GNV03  MOV  WC,XL            COPY HASH CHAIN POINTER
                   16360:        MOV  VRNXT(XL),XL     POINT TO NEXT VRBLK ON CHAIN
                   16361:        BZE  XL,GNV08         JUMP IF END OF CHAIN
                   16362:        MOV  XL,WC            SAVE POINTER TO THIS VRBLK
                   16363:        BNZ  VRLEN(XL),GNV04  JUMP IF NOT SYSTEM VARIABLE
                   16364:        MOV  VRSVP(XL),XL     ELSE POINT TO SVBLK
                   16365:        SUB  *VRSOF,XL        ADJUST OFFSET FOR MERGE
                   16366: *
                   16367: *      MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
                   16368: *
                   16369: GNV04  BNE  WA,VRLEN(XL),GNV03 BACK FOR NEXT VRBLK IF LENGTHS NE
                   16370:        ADD  *VRCHS,XL        ELSE POINT TO CHARS OF CHAIN ENTRY
                   16371:        LCT  WB,GNVNW         GET WORD COUNTER TO CONTROL LOOP
                   16372:        MOV  GNVST,XR         POINT TO CHARS OF NEW NAME
                   16373: *
                   16374: *      LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
                   16375: *
                   16376: GNV05  CNE  (XR),(XL),GNV03  JUMP IF NO MATCH FOR NEXT VRBLK
                   16377:        ICA  XR               BUMP NEW NAME POINTER
                   16378:        ICA  XL               BUMP VRBLK IN CHAIN NAME POINTER
                   16379:        BCT  WB,GNV05         ELSE LOOP TILL ALL COMPARED
                   16380:        MOV  WC,XR            WE HAVE FOUND A MATCH, GET VRBLK
                   16381: *
                   16382: *      EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
                   16383: *
                   16384: GNV06  MOV  GNVSA,WA         RESTORE WA
                   16385:        MOV  GNVSB,WB         RESTORE WB
                   16386:        ICA  XS               POP STRING POINTER
                   16387:        MOV  (XS)+,XL         RESTORE XL
                   16388: *
                   16389: *      COMMON EXIT POINT
                   16390: *
                   16391: GNV07  EXI                   RETURN TO GTNVR CALLER
                   16392: *
                   16393: *      NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
                   16394: *
                   16395: GNV08  ZER  XR               CLEAR GARBAGE XR POINTER
                   16396:        MOV  WC,GNVHE         SAVE PTR TO END OF HASH CHAIN
                   16397:        BGT  WA,=NUM09,GNV14  CANNOT BE SYSTEM VAR IF LENGTH GT 9
                   16398:        MOV  WA,XL            ELSE COPY LENGTH
                   16399:        WTB  XL               CONVERT TO BAU OFFSET
                   16400:        MOV  VSRCH(XL),XL     POINT TO FIRST SVBLK OF THIS LENGTH
                   16401:        EJC
                   16402: *
                   16403: *      GTNVR (CONTINUED)
                   16404: *
                   16405: *      LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
                   16406: *
                   16407: GNV09  MOV  XL,GNVSP         SAVE TABLE POINTER
                   16408:        MOV  (XL)+,WC         LOAD SVBIT BIT STRING
                   16409:        MOV  (XL)+,WB         LOAD LENGTH FROM TABLE ENTRY
                   16410:        BNE  WA,WB,GNV14      JUMP IF END OF RIGHT LENGTH ENTIRES
                   16411:        LCT  WB,GNVNW         GET WORD COUNTER TO CONTROL LOOP
                   16412:        MOV  GNVST,XR         POINT TO CHARS OF NEW NAME
                   16413: *
                   16414: *      LOOP TO CHECK FOR MATCHING NAMES
                   16415: *
                   16416: GNV10  CNE  (XR),(XL),GNV11  JUMP IF NAME MISMATCH
                   16417:        ICA  XR               ELSE BUMP NEW NAME POINTER
                   16418:        ICA  XL               BUMP SVBLK POINTER
                   16419:        BCT  WB,GNV10         ELSE LOOP UNTIL ALL CHECKED
                   16420: *
                   16421: *      HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
                   16422: *
                   16423:        ZER  WC               SET VRLEN VALUE ZERO
                   16424:        MOV  *VRSI$,WA        SET STANDARD SIZE
                   16425:        BRN  GNV15            JUMP TO BUILD VRBLK
                   16426: *
                   16427: *      HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
                   16428: *
                   16429: GNV11  ICA  XL               BUMP PAST WORD OF CHARS
                   16430:        BCT  WB,GNV11         LOOP BACK IF MORE TO GO
                   16431:        RSH  WC,SVNBT         REMOVE UNINTERESTING BITS
                   16432: *
                   16433: *      LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
                   16434: *
                   16435: GNV12  MOV  BITS1,WB         LOAD BIT TO TEST
                   16436:        ANB  WC,WB            TEST FOR WORD PRESENT
                   16437:        ZRB  WB,GNV13         JUMP IF NOT PRESENT
                   16438:        ICA  XL               ELSE BUMP TABLE POINTER
                   16439: *
                   16440: *      HERE AFTER DEALING WITH ONE WORD (ONE BIT)
                   16441: *
                   16442: GNV13  RSH  WC,1             REMOVE BIT ALREADY PROCESSED
                   16443:        NZB  WC,GNV12         LOOP BACK IF MORE BITS TO TEST
                   16444:        BRN  GNV09            ELSE LOOP BACK FOR NEXT SVBLK
                   16445: *
                   16446: *      HERE IF NOT SYSTEM VARIABLE
                   16447: *
                   16448: GNV14  MOV  WA,WC            COPY VRLEN VALUE
                   16449:        MOV  =VRCHS,WA        LOAD STANDARD SIZE -CHARS
                   16450:        ADD  GNVNW,WA         ADJUST FOR CHARS OF NAME
                   16451:        WTB  WA               CONVERT LENGTH TO BAUS
                   16452:        EJC
                   16453: *
                   16454: *      GTNVR (CONTINUED)
                   16455: *
                   16456: *      MERGE HERE TO BUILD VRBLK
                   16457: *
                   16458: GNV15  JSR  ALOST            ALLOCATE SPACE FOR VRBLK (STATIC)
                   16459:        MOV  XR,WB            SAVE VRBLK POINTER
                   16460:        MOV  =STNVR,XL        POINT TO MODEL VARIABLE BLOCK
                   16461:        MOV  *VRLEN,WA        SET LENGTH OF STANDARD FIELDS
                   16462:        MVW                   SET INITIAL FIELDS OF NEW BLOCK
                   16463:        MOV  GNVHE,XL         LOAD POINTER TO END OF HASH CHAIN
                   16464:        MOV  WB,VRNXT(XL)     ADD NEW BLOCK TO END OF CHAIN
                   16465:        MOV  WC,(XR)+         SET VRLEN FIELD, BUMP PTR
                   16466:        MOV  GNVNW,WA         GET LENGTH IN WORDS
                   16467:        WTB  WA               CONVERT TO LENGTH IN BAUS
                   16468:        BZE  WC,GNV16         JUMP IF SYSTEM VARIABLE
                   16469: *
                   16470: *      HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
                   16471: *
                   16472:        MOV  (XS),XL          POINT BACK TO STRING NAME
                   16473:        ADD  *SCHAR,XL        POINT TO CHARS OF NAME
                   16474:        MVW                   MOVE CHARACTERS INTO PLACE
                   16475:        MOV  WB,XR            RESTORE VRBLK POINTER
                   16476:        BRN  GNV06            JUMP BACK TO EXIT
                   16477: *
                   16478: *      HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
                   16479: *      NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
                   16480: *
                   16481: GNV16  MOV  GNVSP,XL         LOAD POINTER TO SVBLK
                   16482:        MOV  XL,(XR)          SET SVBLK PTR IN VRBLK
                   16483:        MOV  WB,XR            RESTORE VRBLK POINTER
                   16484:        MOV  SVBIT(XL),WB     LOAD BIT INDICATORS
                   16485:        ADD  *SVCHS,XL        POINT TO CHARACTERS OF NAME
                   16486:        ADD  WA,XL            POINT PAST CHARACTERS
                   16487: *
                   16488: *      SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
                   16489: *
                   16490:        MOV  BTKNM,WC         LOAD TEST BIT
                   16491:        ANB  WB,WC            AND TO TEST
                   16492:        ZRB  WC,GNV17         JUMP IF NO KEYWORD NUMBER
                   16493:        ICA  XL               ELSE BUMP POINTER
                   16494:        EJC
                   16495: *
                   16496: *      GTNVR (CONTINUED)
                   16497: *
                   16498: *      HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
                   16499: *
                   16500: GNV17  MOV  BTFNC,WC         GET TEST BIT
                   16501:        ANB  WB,WC            AND TO TEST
                   16502:        ZRB  WC,GNV18         SKIP IF NO SYSTEM FUNCTION
                   16503:        MOV  XL,VRFNC(XR)     ELSE POINT VRFNC TO SVFNC FIELD
                   16504:        ADD  *NUM02,XL        AND BUMP PAST SVFNC, SVNAR FIELDS
                   16505: *
                   16506: *      NOW TEST FOR LABEL (SVLBL)
                   16507: *
                   16508: GNV18  MOV  BTLBL,WC         GET TEST BIT
                   16509:        ANB  WB,WC            AND TO TEST
                   16510:        ZRB  WC,GNV19         JUMP IF BIT IS OFF (NO SYSTEM LABL)
                   16511:        MOV  XL,VRLBL(XR)     ELSE POINT VRLBL TO SVLBL FIELD
                   16512:        ICA  XL               BUMP PAST SVLBL FIELD
                   16513: *
                   16514: *      NOW TEST FOR VALUE (SVVAL)
                   16515: *
                   16516: GNV19  MOV  BTVAL,WC         LOAD TEST BIT
                   16517:        ANB  WB,WC            AND TO TEST
                   16518:        ZRB  WC,GNV06         ALL DONE IF NO VALUE
                   16519:        MOV  (XL),VRVAL(XR)   ELSE SET INITIAL VALUE
                   16520:        MOV  =B$VRE,VRSTO(XR) SET ERROR STORE ACCESS
                   16521:        BRN  GNV06            MERGE BACK TO EXIT TO CALLER
                   16522:        ENP                   END PROCEDURE GTNVR
                   16523:        EJC
                   16524: *
                   16525: *      GTPAT -- GET PATTERN
                   16526: *
                   16527: *      GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
                   16528: *      PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
                   16529: *
                   16530: *      (XR)                  INPUT ARGUMENT
                   16531: *      JSR  GTPAT            CALL TO CONVERT TO PATTERN
                   16532: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   16533: *      (XR)                  RESULTING PATTERN
                   16534: *      (WA)                  DESTROYED
                   16535: *      (WB)                  DESTROYED (ONLY ON CONVERT ERROR)
                   16536: *      (XR)                  UNCHANGED (ONLY ON CONVERT ERROR)
                   16537: *
                   16538: GTPAT  PRC  E,1              ENTRY POINT
                   16539:        BHI  (XR),=P$AAA,GTPT5 JUMP IF PATTERN ALREADY
                   16540: *
                   16541: *      HERE IF NOT PATTERN, TRY FOR STRING
                   16542: *
                   16543:        MOV  WB,GTPSB         SAVE WB
                   16544:        MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   16545:        JSR  GTSTG            CONVERT ARGUMENT TO STRING
                   16546:        PPM  GTPT2            JUMP IF IMPOSSIBLE
                   16547: *
                   16548: *      HERE WE HAVE A STRING
                   16549: *
                   16550:        BNZ  WA,GTPT1         JUMP IF NON-NULL
                   16551: *
                   16552: *      HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
                   16553: *
                   16554:        MOV  =NDNTH,XR        POINT TO NOTHEN NODE
                   16555:        BRN  GTPT4            JUMP TO EXIT
                   16556:        EJC
                   16557: *
                   16558: *      GTPAT (CONTINUED)
                   16559: *
                   16560: *      HERE FOR NON-NULL STRING
                   16561: *
                   16562: GTPT1  MOV  =P$STR,WB        LOAD PCODE FOR MULTI-CHAR STRING
                   16563:        BNE  WA,=NUM01,GTPT3  JUMP IF MULTI-CHAR STRING
                   16564: *
                   16565: *      HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
                   16566: *
                   16567:        PLC  XR               POINT TO CHARACTER
                   16568:        LCH  WA,(XR)          LOAD CHARACTER
                   16569:        MOV  WA,XR            SET AS PARM1
                   16570:        MOV  =P$ANS,WB        POINT TO PCODE FOR 1-CHAR ANY
                   16571:        BRN  GTPT3            JUMP TO BUILD NODE
                   16572: *
                   16573: *      HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
                   16574: *
                   16575: GTPT2  MOV  =P$EXA,WB        SET PCODE FOR EXPRESSION IN CASE
                   16576:        BLO  (XR),=B$E$$,GTPT3 JUMP TO BUILD NODE IF EXPRESSION
                   16577: *
                   16578: *      HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
                   16579: *
                   16580:        EXI  1                TAKE CONVERT ERROR EXIT
                   16581: *
                   16582: *      MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
                   16583: *
                   16584: GTPT3  JSR  PBILD            CALL ROUTINE TO BUILD PATTERN NODE
                   16585: *
                   16586: *      COMMON EXIT AFTER SUCCESSFUL CONVERSION
                   16587: *
                   16588: GTPT4  MOV  GTPSB,WB         RESTORE WB
                   16589: *
                   16590: *      MERGE HERE TO EXIT IF NO CONVERSION REQUIRED
                   16591: *
                   16592: GTPT5  EXI                   RETURN TO GTPAT CALLER
                   16593:        ENP                   END PROCEDURE GTPAT
                   16594: .IF    .CNRA
                   16595: .ELSE
                   16596:        EJC
                   16597: *
                   16598: *      GTREA -- GET REAL VALUE
                   16599: *
                   16600: *      GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
                   16601: *      PERFORMING ANY NECESSARY CONVERSIONS.
                   16602: *
                   16603: *      (XR)                  OBJECT TO BE CONVERTED
                   16604: *      JSR  GTREA            CALL TO CONVERT OBJECT TO REAL
                   16605: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   16606: *      (XR)                  POINTER TO RESULTING REAL
                   16607: *      (WA,WB,WC,RA)         DESTROYED
                   16608: *      (XR)                  UNCHANGED (CONVERT ERROR ONLY)
                   16609: *
                   16610: GTREA  PRC  E,1              ENTRY POINT
                   16611:        MOV  (XR),WA          GET FIRST WORD OF BLOCK
                   16612:        BEQ  WA,=B$RCL,GTRE2  JUMP IF REAL
                   16613:        JSR  GTNUM            ELSE CONVERT ARGUMENT TO NUMERIC
                   16614:        PPM  GTRE3            JUMP IF UNCONVERTIBLE
                   16615:        BEQ  WA,=B$RCL,GTRE2  JUMP IF REAL WAS RETURNED
                   16616: *
                   16617: *      HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
                   16618: *
                   16619: GTRE1  LDI  ICVAL(XR)        LOAD INTEGER
                   16620:        ITR                   CONVERT TO REAL
                   16621:        JSR  RCBLD            BUILD RCBLK
                   16622: *
                   16623: *      EXIT WITH REAL
                   16624: *
                   16625: GTRE2  EXI                   RETURN TO GTREA CALLER
                   16626: *
                   16627: *      HERE ON CONVERSION ERROR
                   16628: *
                   16629: GTRE3  EXI  1                TAKE CONVERT ERROR EXIT
                   16630:        ENP                   END PROCEDURE GTREA
                   16631: .FI
                   16632:        EJC
                   16633: *
                   16634: *      GTSMI -- GET SMALL INTEGER
                   16635: *
                   16636: *      GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
                   16637: *      INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
                   16638: *      ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
                   16639: *      SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
                   16640: *      THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
                   16641: *
                   16642: *      -(XS)                 ARGUMENT TO CONVERT (ON STACK)
                   16643: *      JSR  GTSMI            CALL TO CONVERT TO SMALL INTEGER
                   16644: *      PPM  LOC              TRANSFER LOC FOR NOT INTEGER
                   16645: *      PPM  LOC              TRANSFER LOC FOR LT 0, GT DNAMB
                   16646: *      (XR,WC)               RESULTING SMALL INT (TWO COPIES)
                   16647: *      (XS)                  POPPED
                   16648: *      (RA)                  DESTROYED
                   16649: *      (WA,WB)               DESTROYED (ON CONVERT ERROR ONLY)
                   16650: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
                   16651: *
                   16652: GTSMI  PRC  N,2              ENTRY POINT
                   16653:        MOV  (XS)+,XR         LOAD ARGUMENT
                   16654:        BEQ  (XR),=B$ICL,GTSM1 SKIP IF ALREADY AN INTEGER
                   16655: *
                   16656: *      HERE IF NOT AN INTEGER
                   16657: *
                   16658:        JSR  GTINT            CONVERT ARGUMENT TO INTEGER
                   16659:        PPM  GTSM2            JUMP IF CONVERT IS IMPOSSIBLE
                   16660: *
                   16661: *      MERGE HERE WITH INTEGER
                   16662: *
                   16663: GTSM1  LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   16664:        MFI  WC,GTSM3         MOVE AS ONE WORD, JUMP IF OVFLOW
                   16665:        BGT  WC,MXLEN,GTSM3   OR IF TOO LARGE
                   16666:        MOV  WC,XR            COPY RESULT TO XR
                   16667:        EXI                   RETURN TO GTSMI CALLER
                   16668: *
                   16669: *      HERE IF UNCONVERTIBLE TO INTEGER
                   16670: *
                   16671: GTSM2  EXI  1                TAKE NON-INTEGER ERROR EXIT
                   16672: *
                   16673: *      HERE IF OUT OF RANGE
                   16674: *
                   16675: GTSM3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
                   16676:        ENP                   END PROCEDURE GTSMI
                   16677:        EJC
                   16678: *
                   16679: *      GTSTG -- GET STRING
                   16680: *
                   16681: *      GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
                   16682: *      ANY NECESSARY CONVERSIONS PERFORMED.
                   16683: *
                   16684: *      -(XS)                 INPUT ARGUMENT (ON STACK)
                   16685: *      JSR  GTSTG            CALL TO CONVERT TO STRING
                   16686: *      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
                   16687: *      (XR)                  POINTER TO RESULTING STRING
                   16688: *      (WA)                  LENGTH OF STRING IN CHARACTERS
                   16689: *      (XS)                  POPPED
                   16690: *      (RA)                  DESTROYED
                   16691: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
                   16692: *
                   16693: GTSTG  PRC  N,1              ENTRY POINT
                   16694:        MOV  (XS)+,XR         LOAD ARGUMENT, POP STACK
                   16695:        BEQ  (XR),=B$SCL,GTS30 JUMP IF ALREADY A STRING
                   16696: *
                   16697: *      HERE IF NOT A STRING ALREADY
                   16698: *
                   16699: GTS01  MOV  XR,-(XS)         RESTACK ARGUMENT IN CASE ERROR
                   16700:        MOV  XL,-(XS)         SAVE XL
                   16701:        MOV  WB,GTSVB         SAVE WB
                   16702:        MOV  WC,GTSVC         SAVE WC
                   16703:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   16704:        BEQ  WA,=B$ICL,GTS05  JUMP TO CONVERT INTEGER
                   16705: .IF    .CNRA
                   16706: .ELSE
                   16707:        BEQ  WA,=B$RCL,GTS10  JUMP TO CONVERT REAL
                   16708: .FI
                   16709:        BEQ  WA,=B$NML,GTS03  JUMP TO CONVERT NAME
                   16710: .IF    .CNBF
                   16711: .ELSE
                   16712:        BEQ  WA,=B$BCT,GTS32  JUMP TO CONVERT BUFFER
                   16713: .FI
                   16714: *
                   16715: *      HERE ON CONVERSION ERROR
                   16716: *
                   16717: GTS02  MOV  (XS)+,XL         RESTORE XL
                   16718:        MOV  (XS)+,XR         RELOAD INPUT ARGUMENT
                   16719:        EXI  1                TAKE CONVERT ERROR EXIT
                   16720:        EJC
                   16721: *
                   16722: *      GTSTG (CONTINUED)
                   16723: *
                   16724: *      HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
                   16725: *
                   16726: GTS03  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   16727:        BHI  XL,STATE,GTS02   ERROR IF NOT NATURAL VAR (STATIC)
                   16728:        ADD  *VRSOF,XL        ELSE POINT TO POSSIBLE STRING NAME
                   16729:        MOV  SCLEN(XL),WA     LOAD LENGTH
                   16730:        BNZ  WA,GTS04         JUMP IF NOT SYSTEM VARIABLE
                   16731:        MOV  VRSVO(XL),XL     ELSE POINT TO SVBLK
                   16732:        MOV  SVLEN(XL),WA     AND LOAD NAME LENGTH
                   16733: *
                   16734: *      MERGE HERE WITH STRING IN XR, LENGTH IN WA
                   16735: *
                   16736: GTS04  ZER  WB               SET OFFSET TO ZERO
                   16737:        JSR  SBSTR            USE SBSTR TO COPY STRING
                   16738:        BRN  GTS29            JUMP TO EXIT
                   16739: *
                   16740: *      COME HERE TO CONVERT AN INTEGER
                   16741: *
                   16742: GTS05  LDI  ICVAL(XR)        LOAD INTEGER VALUE
                   16743: .IF    .CSCI
                   16744:        JSR  SYSCI            CONVERT INTEGER
                   16745:        MOV  SCLEN(XL),WA     GET LENGTH
                   16746:        ZER  WB               ZERO OFFSET FOR SBSTR
                   16747:        JSR  SBSTR            COPY IN RESULT FROM SYSCI
                   16748:        BRN  GTS29            EXIT
                   16749: .ELSE
                   16750:        MOV  =NUM01,GTSSF     SET SIGN FLAG NEGATIVE
                   16751:        ILT  GTS06            SKIP IF INTEGER IS NEGATIVE
                   16752:        NGI                   ELSE NEGATE INTEGER
                   16753:        ZER  GTSSF            AND RESET NEGATIVE FLAG
                   16754:        EJC
                   16755: *
                   16756: *      GTSTG (CONTINUED)
                   16757: *
                   16758: *      HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
                   16759: *      REQUIRED BY THE CVD INSTRUCTION.
                   16760: *
                   16761: GTS06  MOV  GTSWK,XR         POINT TO RESULT WORK AREA
                   16762:        MOV  =NSTMX,WB        INITIALIZE COUNTER TO MAX LENGTH
                   16763:        PSC  XR,WB            PREPARE TO STORE (RIGHT-LEFT)
                   16764: *
                   16765: *      LOOP TO CONVERT DIGITS INTO WORK AREA
                   16766: *
                   16767: GTS07  CVD                   CONVERT ONE DIGIT INTO WA
                   16768:        SCH  WA,-(XR)         STORE IN WORK AREA
                   16769:        DCV  WB               DECREMENT COUNTER
                   16770:        INE  GTS07            LOOP IF MORE DIGITS TO GO
                   16771:        CSC  XR               COMPLETE STORE CHARACTERS
                   16772: *
                   16773: *      MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
                   16774: *      AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
                   16775: *
                   16776: GTS08  MOV  =NSTMX,WA        GET MAX NUMBER OF CHARACTERS
                   16777:        SUB  WB,WA            COMPUTE LENGTH OF RESULT
                   16778:        MOV  WA,XL            REMEMBER LENGTH FOR MOVE LATER ON
                   16779:        ADD  GTSSF,WA         ADD ONE FOR NEGATIVE SIGN IF NEEDED
                   16780:        JSR  ALOCS            ALLOCATE STRING FOR RESULT
                   16781:        MOV  XR,WC            SAVE RESULT POINTER FOR THE MOMENT
                   16782:        PSC  XR               POINT TO CHARS OF RESULT BLOCK
                   16783:        BZE  GTSSF,GTS09      SKIP IF POSITIVE
                   16784:        MOV  =CH$MN,WA        ELSE LOAD NEGATIVE SIGN
                   16785:        SCH  WA,(XR)+         AND STORE IT
                   16786:        CSC  XR               COMPLETE STORE CHARACTERS
                   16787: .FI
                   16788: *
                   16789: *      HERE AFTER DEALING WITH SIGN
                   16790: *
                   16791: GTS09  MOV  XL,WA            RECALL LENGTH TO MOVE
                   16792:        MOV  GTSWK,XL         POINT TO RESULT WORK AREA
                   16793:        PLC  XL,WB            POINT TO FIRST RESULT CHARACTER
                   16794:        MVC                   MOVE CHARS TO RESULT STRING
                   16795:        MOV  WC,XR            RESTORE RESULT POINTER
                   16796: .IF    .CNRA
                   16797: .ELSE
                   16798:        BRN  GTS29            JUMP TO EXIT
                   16799:        EJC
                   16800: *
                   16801: *      GTSTG (CONTINUED)
                   16802: *
                   16803: *      HERE TO CONVERT A REAL
                   16804: *
                   16805: GTS10  LDR  RCVAL(XR)        LOAD REAL
                   16806:        ZER  GTSSF            RESET NEGATIVE FLAG
                   16807:        REQ  GTS31            SKIP IF ZERO
                   16808:        RGE  GTS11            JUMP IF REAL IS POSITIVE
                   16809:        MOV  =NUM01,GTSSF     ELSE SET NEGATIVE FLAG
                   16810:        NGR                   AND GET ABSOLUTE VALUE OF REAL
                   16811: *
                   16812: *      NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
                   16813: *
                   16814: GTS11  LDI  INTV0            INITIALIZE EXPONENT TO ZERO
                   16815: *
                   16816: *      LOOP TO SCALE UP IN STEPS OF 10**10
                   16817: *
                   16818: GTS12  STR  GTSRS            SAVE REAL VALUE
                   16819:        SBR  REAP1            SUBTRACT 0.1 TO COMPARE
                   16820:        RGE  GTS13            JUMP IF SCALE UP NOT REQUIRED
                   16821:        LDR  GTSRS            ELSE RELOAD VALUE
                   16822:        MLR  REATT            MULTIPLY BY 10**10
                   16823:        SBI  INTVT            DECREMENT EXPONENT BY 10
                   16824:        BRN  GTS12            LOOP BACK TO TEST AGAIN
                   16825: *
                   16826: *      TEST FOR SCALE DOWN REQUIRED
                   16827: *
                   16828: GTS13  LDR  GTSRS            RELOAD VALUE
                   16829:        SBR  REAV1            SUBTRACT 1.0
                   16830:        RLT  GTS17            JUMP IF NO SCALE DOWN REQUIRED
                   16831:        LDR  GTSRS            ELSE RELOAD VALUE
                   16832: *
                   16833: *      LOOP TO SCALE DOWN IN STEPS OF 10**10
                   16834: *
                   16835: GTS14  SBR  REATT            SUBTRACT 10**10 TO COMPARE
                   16836:        RLT  GTS15            JUMP IF LARGE STEP NOT REQUIRED
                   16837:        LDR  GTSRS            ELSE RESTORE VALUE
                   16838:        DVR  REATT            DIVIDE BY 10**10
                   16839:        STR  GTSRS            STORE NEW VALUE
                   16840:        ADI  INTVT            INCREMENT EXPONENT BY 10
                   16841:        BRN  GTS14            LOOP BACK
                   16842:        EJC
                   16843: *
                   16844: *      GTSTG (CONTINUED)
                   16845: *
                   16846: *      AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
                   16847: *      COMPLETE SCALING WITH POWERS OF TEN TABLE
                   16848: *
                   16849: GTS15  MOV  =REAV1,XR        POINT TO POWERS OF TEN TABLE
                   16850: *
                   16851: *      LOOP TO LOCATE CORRECT ENTRY IN TABLE
                   16852: *
                   16853: GTS16  LDR  GTSRS            RELOAD VALUE
                   16854:        ADI  INTV1            INCREMENT EXPONENT
                   16855:        ADD  *CFP$R,XR        POINT TO NEXT ENTRY IN TABLE
                   16856:        SBR  (XR)             SUBTRACT IT TO COMPARE
                   16857:        RGE  GTS16            LOOP TILL WE FIND A LARGER ENTRY
                   16858:        LDR  GTSRS            THEN RELOAD THE VALUE
                   16859:        DVR  (XR)             AND COMPLETE SCALING
                   16860:        STR  GTSRS            STORE VALUE
                   16861: *
                   16862: *      WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
                   16863: *
                   16864: GTS17  LDR  GTSRS            GET VALUE AGAIN
                   16865:        ADR  GTSRN            ADD ROUNDING FACTOR
                   16866:        STR  GTSRS            STORE RESULT
                   16867: *
                   16868: *      THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
                   16869: *      1.0 AGAIN, SO CHECK ONE MORE TIME.
                   16870: *
                   16871:        SBR  REAV1            SUBTRACT 1.0 TO COMPARE
                   16872:        RLT  GTS18            SKIP IF OK
                   16873:        ADI  INTV1            ELSE INCREMENT EXPONENT
                   16874:        LDR  GTSRS            RELOAD VALUE
                   16875:        DVR  REAVT            DIVIDE BY 10.0 TO RESCALE
                   16876:        BRN  GTS19            JUMP TO MERGE
                   16877: *
                   16878: *      HERE IF ROUNDING DID NOT MUCK UP SCALING
                   16879: *
                   16880: GTS18  LDR  GTSRS            RELOAD ROUNDED VALUE
                   16881:        EJC
                   16882: *
                   16883: *      GTSTG (CONTINUED)
                   16884: *
                   16885: *      NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
                   16886: *
                   16887: *      (IA)                  SIGNED EXPONENT
                   16888: *      (RA)                  SCALED REAL (ABSOLUTE VALUE)
                   16889: *
                   16890: *      IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
                   16891: *      WE CONVERT THE NUMBER IN THE FORM.
                   16892: *
                   16893: *      (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
                   16894: *
                   16895: *      IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
                   16896: *      CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
                   16897: *
                   16898: *      (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
                   16899: *
                   16900: *      IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
                   16901: *      RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
                   16902: *      DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
                   16903: *      AND THE EXPONENT SIGN IS ALWAYS PRESENT.
                   16904: *
                   16905: GTS19  MOV  =CFP$S,XL        SET NUM DEC DIGITS = CFP$S
                   16906:        MOV  =CH$MN,GTSES     SET EXPONENT SIGN NEGATIVE
                   16907:        ILT  GTS21            ALL SET IF EXPONENT IS NEGATIVE
                   16908:        MFI  WA               ELSE FETCH EXPONENT
                   16909:        BLE  WA,=CFP$S,GTS20  SKIP IF WE CAN USE SPECIAL FORMAT
                   16910:        MTI  WA               ELSE RESTORE EXPONENT
                   16911:        NGI                   SET NEGATIVE FOR CVD
                   16912:        MOV  =CH$PL,GTSES     SET PLUS SIGN FOR EXPONENT SIGN
                   16913:        BRN  GTS21            JUMP TO GENERATE EXPONENT
                   16914: *
                   16915: *      HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
                   16916: *
                   16917: GTS20  SUB  WA,XL            COMPUTE DIGITS AFTER DECIMAL POINT
                   16918:        LDI  INTV0            RESET EXPONENT TO ZERO
                   16919:        EJC
                   16920: *
                   16921: *      GTSTG (CONTINUED)
                   16922: *
                   16923: *      MERGE HERE AS FOLLOWS
                   16924: *
                   16925: *      (IA)                  EXPONENT ABSOLUTE VALUE
                   16926: *      GTSES                 CHARACTER FOR EXPONENT SIGN
                   16927: *      (RA)                  POSITIVE FRACTION
                   16928: *      (XL)                  NUMBER OF DIGITS AFTER DEC POINT
                   16929: *
                   16930: GTS21  MOV  GTSWK,XR         POINT TO WORK AREA
                   16931:        MOV  =NSTMX,WB        SET CHARACTER CTR TO MAX LENGTH
                   16932:        PSC  XR,WB            PREPARE TO STORE (RIGHT TO LEFT)
                   16933:        IEQ  GTS23            SKIP EXPONENT IF IT IS ZERO
                   16934: *
                   16935: *      LOOP TO GENERATE DIGITS OF EXPONENT
                   16936: *
                   16937: GTS22  CVD                   CONVERT A DIGIT INTO WA
                   16938:        SCH  WA,-(XR)         STORE IN WORK AREA
                   16939:        DCV  WB               DECREMENT COUNTER
                   16940:        INE  GTS22            LOOP BACK IF MORE DIGITS TO GO
                   16941: *
                   16942: *      HERE GENERATE EXPONENT SIGN AND E
                   16943: *
                   16944:        MOV  GTSES,WA         LOAD EXPONENT SIGN
                   16945:        SCH  WA,-(XR)         STORE IN WORK AREA
                   16946: .IF    .CPLC
                   16947:        MOV  =CH$$E,WA        GET CHAR LETTER E
                   16948: .ELSE
                   16949:        MOV  =CH$LE,WA        GET CHARACTER LETTER E
                   16950: .FI
                   16951:        SCH  WA,-(XR)         STORE IN WORK AREA
                   16952:        SUB  =NUM02,WB        DECREMENT COUNTER FOR SIGN AND E
                   16953: *
                   16954: *      HERE TO GENERATE THE FRACTION
                   16955: *
                   16956: GTS23  MLR  GTSSC            CONVERT REAL TO INTEGER (10**CFP$S)
                   16957:        RTI                   GET INTEGER (OVERFLOW IMPOSSIBLE)
                   16958:        NGI                   NEGATE AS REQUIRED BY CVD
                   16959: *
                   16960: *      LOOP TO SUPPRESS TRAILING ZEROS
                   16961: *
                   16962: GTS24  BZE  XL,GTS27         JUMP IF NO DIGITS LEFT TO DO
                   16963:        CVD                   ELSE CONVERT ONE DIGIT
                   16964:        BNE  WA,=CH$D0,GTS26  JUMP IF NOT A ZERO
                   16965:        DCV  XL               DECREMENT COUNTER
                   16966:        BRN  GTS24            LOOP BACK FOR NEXT DIGIT
                   16967:        EJC
                   16968: *
                   16969: *      GTSTG (CONTINUED)
                   16970: *
                   16971: *      LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
                   16972: *
                   16973: GTS25  CVD                   CONVERT A DIGIT INTO WA
                   16974: *
                   16975: *      MERGE HERE FIRST TIME
                   16976: *
                   16977: GTS26  SCH  WA,-(XR)         STORE DIGIT
                   16978:        DCV  WB               DECREMENT COUNTER
                   16979:        DCV  XL               DECREMENT COUNTER
                   16980:        BNZ  XL,GTS25         LOOP BACK IF MORE TO GO
                   16981: *
                   16982: *      HERE GENERATE THE DECIMAL POINT
                   16983: *
                   16984: GTS27  MOV  =CH$DT,WA        LOAD DECIMAL POINT
                   16985:        SCH  WA,-(XR)         STORE IN WORK AREA
                   16986:        DCV  WB               DECREMENT COUNTER
                   16987: *
                   16988: *      HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
                   16989: *
                   16990: GTS28  CVD                   CONVERT A DIGIT INTO WA
                   16991:        SCH  WA,-(XR)         STORE IN WORK AREA
                   16992:        DCV  WB               DECREMENT COUNTER
                   16993:        INE  GTS28            LOOP BACK IF MORE TO GO
                   16994:        CSC  XR               COMPLETE STORE CHARACTERS
                   16995:        BRN  GTS08            ELSE JUMP BACK TO EXIT
                   16996: .FI
                   16997: *
                   16998: *      EXIT POINT AFTER SUCCESSFUL CONVERSION
                   16999: *
                   17000: GTS29  MOV  (XS)+,XL         RESTORE XL
                   17001:        ICA  XS               POP ARGUMENT
                   17002:        MOV  GTSVB,WB         RESTORE WB
                   17003:        MOV  GTSVC,WC         RESTORE WC
                   17004: *
                   17005: *      MERGE HERE IF NO CONVERSION REQUIRED
                   17006: *
                   17007: GTS30  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   17008:        EXI                   RETURN TO CALLER
                   17009: .IF    .CNRA
                   17010: .ELSE
                   17011: *
                   17012: *      HERE TO RETURN STRING FOR REAL ZERO
                   17013: *
                   17014: GTS31  MOV  =SCRE0,XL        POINT TO STRING
                   17015:        MOV  =NUM02,WA        2 CHARS
                   17016:        ZER  WB               ZERO OFFSET
                   17017:        JSR  SBSTR            COPY STRING
                   17018:        BRN  GTS29            RETURN
                   17019: .FI
                   17020: .IF    .CNBF
                   17021: .ELSE
                   17022:        EJC
                   17023: *
                   17024: *      HERE TO CONVERT A BUFFER BLOCK
                   17025: *
                   17026: GTS32  MOV  XR,XL            COPY ARG PTR
                   17027:        MOV  BCLEN(XL),WA     GET SIZE TO ALLOCATE
                   17028:        BZE  WA,GTS33         IF NULL THEN RETURN NULL
                   17029:        JSR  ALOCS            ALLOCATE STRING FRAME
                   17030:        MOV  XR,WB            SAVE STRING PTR
                   17031:        MOV  SCLEN(XR),WA     GET LENGTH TO MOVE
                   17032:        CTB  WA,0             GET AS MULTIPLE OF WORD SIZE
                   17033:        MOV  BCBUF(XL),XL     POINT TOBFBLK
                   17034:        ADD  *SCSI$,XR        POINT TO START OF CHARACTER AREA
                   17035:        ADD  *BFSI$,XL        POINT TO START OF BUFFER CHARS
                   17036:        MVW                   COPY WORDS
                   17037:        MOV  WB,XR            RESTORE SCBLK PTR
                   17038:        BRN  GTS29            EXIT WITH SCBLK
                   17039: *
                   17040: *      HERE WHEN NULL BUFFER IS BEING CONVERTED
                   17041: *
                   17042: GTS33  MOV  =NULLS,XR        POINT TO NULL
                   17043:        BRN  GTS29            EXIT WITH NULL
                   17044: .FI
                   17045:        ENP                   END PROCEDURE GTSTG
                   17046:        EJC
                   17047: *
                   17048: *      GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
                   17049: *
                   17050: *      GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
                   17051: *      FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
                   17052: *
                   17053: *      (XR)                  ARGUMENT TO FUNCTION
                   17054: *      JSR  GTVAR            CALL TO LOCATE VARIABLE POINTER
                   17055: *      PPM  LOC              TRANSFER LOC IF NOT OK VARIABLE
                   17056: *      (XL,WA)               NAME BASE,OFFSET OF VARIABLE
                   17057: *      (XR,RA)               DESTROYED
                   17058: *      (WB,WC)               DESTROYED (CONVERT ERROR ONLY)
                   17059: *      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
                   17060: *
                   17061: GTVAR  PRC  E,1              ENTRY POINT
                   17062:        BNE  (XR),=B$NML,GTVR2 JUMP IF NOT A NAME
                   17063:        MOV  NMOFS(XR),WA     ELSE LOAD NAME OFFSET
                   17064:        MOV  NMBAS(XR),XL     LOAD NAME BASE
                   17065:        BEQ  (XL),=B$EVT,GTVR1 ERROR IF EXPRESSION VARIABLE
                   17066:        BNE  (XL),=B$KVT,GTVR3 ALL OK IF NOT KEYWORD VARIABLE
                   17067: *
                   17068: *      HERE ON CONVERSION ERROR
                   17069: *
                   17070: GTVR1  EXI  1                TAKE CONVERT ERROR EXIT
                   17071: *
                   17072: *      HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
                   17073: *
                   17074: GTVR2  MOV  WC,GTVRC         SAVE WC
                   17075:        JSR  GTNVR            LOCATE VRBLK IF POSSIBLE
                   17076:        PPM  GTVR1            JUMP IF CONVERT ERROR
                   17077:        MOV  XR,XL            ELSE COPY VRBLK NAME BASE
                   17078:        MOV  *VRVAL,WA        AND SET OFFSET
                   17079:        MOV  GTVRC,WC         RESTORE WC
                   17080: *
                   17081: *      HERE FOR NAME OBTAINED
                   17082: *
                   17083: GTVR3  BHI  XL,STATE,GTVR4   ALL OK IF NOT NATURAL VARIABLE
                   17084:        BEQ  VRSTO(XL),=B$VRE,GTVR1 ERROR IF PROTECTED VARIABLE
                   17085: *
                   17086: *      COMMON EXIT POINT
                   17087: *
                   17088: GTVR4  EXI                   RETURN TO CALLER
                   17089:        ENP                   END PROCEDURE GTVAR
                   17090:        EJC
                   17091: *
                   17092: *      HASHS -- COMPUTE HASH INDEX FOR STRING
                   17093: *
                   17094: *      HASHS REPRODUCIBLY MAPS A STRING TO AN INTEGER
                   17095: *      VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
                   17096: *      IN THE RANGE 0 TO CFP$M
                   17097: *
                   17098: *      (XR)                  STRING TO BE HASHED
                   17099: *      JSR  HASHS            CALL TO HASH STRING
                   17100: *      (IA)                  HASH VALUE
                   17101: *      (XR,WB,WC)            DESTROYED
                   17102: *
                   17103: *      THE HASH FUNCTION USED IS AS FOLLOWS.
                   17104: *
                   17105: *      START WITH THE LENGTH OF THE STRING
                   17106: *
                   17107: *      TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
                   17108: *      THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
                   17109: *
                   17110: *      COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
                   17111: *      THEM AS ONE WORD BIT STRING VALUES.
                   17112: *
                   17113: *      MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
                   17114: *
                   17115: HASHS  PRC  E,0              ENTRY POINT
                   17116:        MOV  SCLEN(XR),WC     LOAD STRING LENGTH IN CHARACTERS
                   17117:        MOV  WC,WB            INITIALIZE WITH LENGTH
                   17118:        BZE  WC,HSHS3         JUMP IF NULL STRING
                   17119:        CTW  WC,0             ELSE GET NUMBER OF WORDS OF CHARS
                   17120:        ADD  *SCHAR,XR        POINT TO CHARACTERS OF STRING
                   17121:        BLO  WC,=E$HNW,HSHS1  USE WHOLE STRING IF SHORT
                   17122:        MOV  =E$HNW,WC        ELSE SET TO INVOLVE FIRST E$HNW WDS
                   17123: *
                   17124: *      HERE WITH COUNT OF WORDS TO CHECK IN WC
                   17125: *
                   17126: HSHS1  LCT  WC,WC            SET COUNTER TO CONTROL LOOP
                   17127: *
                   17128: *      LOOP TO COMPUTE EXCLUSIVE OR
                   17129: *
                   17130: HSHS2  XOB  (XR)+,WB         EXCLUSIVE OR NEXT WORD OF CHARS
                   17131:        BCT  WC,HSHS2         LOOP TILL ALL PROCESSED
                   17132: *
                   17133: *      MERGE HERE WITH EXCLUSIVE OR IN WB
                   17134: *
                   17135: HSHS3  ZGB  WB               ZEROISE UNDEFINED BITS
                   17136:        ANB  BITSM,WB         ENSURE IN RANGE 0 TO CFP$M
                   17137:        MTI  WB               MOVE RESULT AS INTEGER
                   17138:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   17139:        EXI                   RETURN TO HASHS CALLER
                   17140:        ENP                   END PROCEDURE HASHS
                   17141:        EJC
                   17142: *
                   17143: *      ICBLD -- BUILD INTEGER BLOCK
                   17144: *
                   17145: *      (IA)                  INTEGER VALUE FOR ICBLK
                   17146: *      JSR  ICBLD            CALL TO BUILD INTEGER BLOCK
                   17147: *      (XR)                  POINTER TO RESULT ICBLK
                   17148: *      (WA)                  DESTROYED
                   17149: *
                   17150: ICBLD  PRC  E,0              ENTRY POINT
                   17151:        ILT  ICBL1            SKIP IF NEGATIVE
                   17152:        SBI  INTV2            REDUCE BY TWO
                   17153:        ILE  ICBL3            JUMP IF 0 , 1 OR 2
                   17154:        ADI  INTV2            RESTORE VALUE
                   17155: *
                   17156: *      CONSTRUCT ICBLK
                   17157: *
                   17158: ICBL1  MOV  DNAMP,XR         LOAD POINTER TO NEXT AVAILABLE LOC
                   17159:        ADD  *ICSI$,XR        POINT PAST NEW ICBLK
                   17160:        BLO  XR,DNAME,ICBL2   JUMP IF THERE IS ROOM
                   17161:        MOV  *ICSI$,WA        ELSE LOAD LENGTH OF ICBLK
                   17162:        JSR  ALLOC            USE STANDARD ALLOCATOR TO GET BLOCK
                   17163:        ADD  WA,XR            POINT PAST BLOCK TO MERGE
                   17164: *
                   17165: *      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
                   17166: *
                   17167: ICBL2  MOV  XR,DNAMP         SET NEW POINTER
                   17168:        SUB  *ICSI$,XR        POINT BACK TO START OF BLOCK
                   17169:        MOV  =B$ICL,(XR)      STORE TYPE WORD
                   17170:        STI  ICVAL(XR)        STORE INTEGER VALUE IN ICBLK
                   17171:        EXI                   RETURN TO ICBLD CALLER
                   17172: *
                   17173: *      OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
                   17174: *
                   17175: ICBL3  ADI  INTV2            RESTORE VALUE
                   17176:        MFI  XR               CONVERT TO SHORT INTEGER
                   17177:        WTB  XR               CONVERT INTEGER TO OFFSET
                   17178:        MOV  INTAB(XR),XR     POINT TO PRE-BUILT ICBLK
                   17179:        EXI                   RETURN
                   17180:        ENP                   END PROCEDURE ICBLD
                   17181:        EJC
                   17182: *
                   17183: *      IDENT -- COMPARE TWO VALUES
                   17184: *
                   17185: *      IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
                   17186: *      DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
                   17187: *
                   17188: *      (XR)                  FIRST ARGUMENT
                   17189: *      (XL)                  SECOND ARGUMENT
                   17190: *      JSR  IDENT            CALL TO COMPARE ARGUMENTS
                   17191: *      PPM  LOC              TRANSFER LOC IF IDENT
                   17192: *      (NORMAL RETURN IF DIFFER)
                   17193: *      (XR,XL,WC,RA)         DESTROYED
                   17194: *
                   17195: IDENT  PRC  E,1              ENTRY POINT
                   17196:        BEQ  XR,XL,IDEN7      JUMP IF SAME POINTER (IDENT)
                   17197:        MOV  (XR),WC          ELSE LOAD ARG 1 TYPE WORD
                   17198:        BNE  WC,(XL),IDEN1    DIFFER IF ARG 2 TYPE WORD DIFFER
                   17199:        BEQ  WC,=B$SCL,IDEN2  JUMP IF STRINGS
                   17200:        BEQ  WC,=B$ICL,IDEN4  JUMP IF INTEGERS
                   17201: .IF    .CNRA
                   17202: .ELSE
                   17203:        BEQ  WC,=B$RCL,IDEN5  JUMP IF REALS
                   17204: .FI
                   17205:        BEQ  WC,=B$NML,IDEN6  JUMP IF NAMES
                   17206: *
                   17207: *      FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
                   17208: *
                   17209: *      MERGE HERE FOR DIFFER
                   17210: *
                   17211: IDEN1  EXI                   TAKE DIFFER EXIT
                   17212: *
                   17213: *      HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
                   17214: *
                   17215: IDEN2  MOV  SCLEN(XR),WC     LOAD ARG 1 LENGTH
                   17216:        BNE  WC,SCLEN(XL),IDEN1 DIFFER IF LENGTHS DIFFER
                   17217:        CTW  WC,0             GET NUMBER OF WORDS IN STRINGS
                   17218:        ADD  *SCHAR,XR        POINT TO CHARS OF ARG 1
                   17219:        ADD  *SCHAR,XL        POINT TO CHARS OF ARG 2
                   17220:        LCT  WC,WC            SET LOOP COUNTER
                   17221: *
                   17222: *      LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
                   17223: *      SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
                   17224: *
                   17225: IDEN3  CNE  (XR),(XL),IDEN8  DIFFER IF CHARS DO NOT MATCH
                   17226:        ICA  XR               ELSE BUMP ARG ONE POINTER
                   17227:        ICA  XL               BUMP ARG TWO POINTER
                   17228:        BCT  WC,IDEN3         LOOP BACK TILL ALL CHECKED
                   17229:        EJC
                   17230: *
                   17231: *      IDENT (CONTINUED)
                   17232: *
                   17233: *      HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
                   17234: *
                   17235:        ZER  XL               CLEAR GARBAGE VALUE IN XL
                   17236:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   17237:        EXI  1                TAKE IDENT EXIT
                   17238: *
                   17239: *      HERE FOR INTEGERS, IDENT IF SAME VALUES
                   17240: *
                   17241: IDEN4  LDI  ICVAL(XR)        LOAD ARG 1
                   17242:        SBI  ICVAL(XL)        SUBTRACT ARG 2 TO COMPARE
                   17243:        IOV  IDEN1            DIFFER IF OVERFLOW
                   17244:        INE  IDEN1            DIFFER IF RESULT IS NOT ZERO
                   17245:        EXI  1                TAKE IDENT EXIT
                   17246: .IF    .CNRA
                   17247: .ELSE
                   17248: *
                   17249: *      HERE FOR REALS, IDENT IF SAME VALUES
                   17250: *
                   17251: IDEN5  LDR  RCVAL(XR)        LOAD ARG 1
                   17252:        SBR  RCVAL(XL)        SUBTRACT ARG 2 TO COMPARE
                   17253:        ROV  IDEN1            DIFFER IF OVERFLOW
                   17254:        RNE  IDEN1            DIFFER IF RESULT IS NOT ZERO
                   17255:        EXI  1                TAKE IDENT EXIT
                   17256: .FI
                   17257: *
                   17258: *      HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
                   17259: *
                   17260: IDEN6  BNE  NMOFS(XR),NMOFS(XL),IDEN1 DIFFER IF DIFFERENT OFFSET
                   17261:        BNE  NMBAS(XR),NMBAS(XL),IDEN1 DIFFER IF DIFFERENT BASE
                   17262: *
                   17263: *      MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
                   17264: *
                   17265: IDEN7  EXI  1                TAKE IDENT EXIT
                   17266: *
                   17267: *      HERE FOR DIFFER STRINGS
                   17268: *
                   17269: IDEN8  ZER  XR               CLEAR GARBAGE PTR IN XR
                   17270:        ZER  XL               CLEAR GARBAGE PTR IN XL
                   17271:        EXI                   RETURN TO CALLER (DIFFER)
                   17272:        ENP                   END PROCEDURE IDENT
                   17273:        EJC
                   17274: *
                   17275: *      INOUT - USED TO INITIALISE .INPUT .OUTPUT .TERMINAL
                   17276: *
                   17277: *      (XL)                  POINTER TO VBL NAME STRING
                   17278: *      (WB)                  TRBLK TYPE (TRTYP FIELD)
                   17279: *      JSR  INOUT            CALL TO PERFORM INITIALISATION
                   17280: *      (WA,WC)               DESTROYED
                   17281: *
                   17282: *      NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
                   17283: *      POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
                   17284: *      CASE FOR ORDINARY VARIABLES.
                   17285: *
                   17286: INOUT  PRC  E,0              ENTRY POINT
                   17287:        MOV  WB,-(XS)         STACK TRBLK TYPE
                   17288:        MOV  SCLEN(XL),WA     GET NAME LENGTH
                   17289:        ZER  WB               POINT TO START OF NAME
                   17290:        JSR  SBSTR            BUILD A PROPER SCBLK
                   17291:        JSR  GTNVR            FIND OR BUILD VRBLK
                   17292:        PPM                   NO ERROR RETURN
                   17293:        MOV  XR,WC            SAVE VRBLK POINTER
                   17294:        MOV  (XS)+,WB         GET TRTYP FIELD
                   17295:        ZER  XL               ZERO TRTRI
                   17296:        MOV  VRSVP(XR),XR     GET SVBLK POINTER
                   17297:        JSR  TRBLD            BUILD TRBLK
                   17298:        MOV  WC,XL            RECALL VRBLK POINTER
                   17299:        MOV  *VRVAL,WA        OFFSET TO VALUE FIELD
                   17300:        JSR  TRCHN            PUT TRBLK IN TRACE CHAIN
                   17301:        PPM                   CANT FAIL
                   17302:        EXI                   RETURN TO CALLER
                   17303:        ENP                   END PROCEDURE INOUT
                   17304:        EJC
                   17305: .IF    .CNBF
                   17306: .ELSE
                   17307: *
                   17308: *      INSBF -- INSERT STRING IN BUFFER
                   17309: *
                   17310: *      THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
                   17311: *      CONTENTS OF A GIVEN STRING.  IF THE LENGTH OF THE
                   17312: *      SECTION TO BE REPLACED DIFFERS FROM THAT OF THE
                   17313: *      GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
                   17314: *      THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
                   17315: *      DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
                   17316: *
                   17317: *      (XR)                  POINTER TO BCBLK
                   17318: *      (XL)                  OBJECT WHICH IS STRING CONVERTIBLE
                   17319: *      (WA)                  OFFSET OF START OF INSERT IN (XR)
                   17320: *      (WB)                  LENGTH OF SECTION IN (XR) REPLACED
                   17321: *      JSR  INSBF            CALL TO INSERT CHARACTERS IN BUFFER
                   17322: *      PPM  LOC              ERROR IF (XR) NOT CONVERTIBLE
                   17323: *      PPM  LOC              FAIL IF INSERT NOT POSSIBLE
                   17324: *      (XL,WA,WB,WC)         DESTROYED
                   17325: *
                   17326: *      THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
                   17327: *      OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
                   17328: *      DEFINED END OF THE BUFFER AS GIVEN.
                   17329: *
                   17330: INSBF  PRC  E,2              ENTRY POINT
                   17331:        MOV  WA,INSSA         SAVE ENTRY WA
                   17332:        MOV  WB,INSSB         SAVE ENTRY WB
                   17333:        ADD  WB,WA            ADD TO GET OFFSET PAST REPLACE PART
                   17334:        MOV  WA,INSAB         SAVE WA+WB
                   17335:        MOV  BCLEN(XR),WC     GET CURRENT DEFINED LENGTH
                   17336:        BGT  INSSA,WC,INS07   FAIL IF START OFFSET TOO BIG
                   17337:        BGT  WA,WC,INS07      FAIL IF FINAL OFFSET TOO BIG
                   17338:        MOV  XR,-(XS)         SAVE BCBLK PTR
                   17339:        MOV  XL,-(XS)         STACK STRING POINTER FOR GTSTG
                   17340:        JSR  GTSTG            CALL TO CONVERT TO STRING
                   17341:        PPM  INS06            TAKE STRING CONVERT ERR EXIT
                   17342:        MOV  XR,XL            SAVE STRING PTR
                   17343:        MOV  (XS)+,XR         RESTORE BCBLK PTR
                   17344:        MOV  XR,INSBC         BCBLK PTR - NO DANGER OF GARB COLLN
                   17345:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   17346:        MOV  XR,INSBB         BFBLK PTR - NO DANGER OF GARB COLLN
                   17347:        ADD  WC,WA            ADD BUFFER LEN TO STRING LEN
                   17348:        SUB  INSSB,WA         BIAS OUT COMPONENT BEING REPLACED
                   17349:        BGT  WA,BFALC(XR),INS07 FAIL IF RESULT EXCEEDS ALLOCATION
                   17350:        MOV  INSBC,XR         RESTORE BCBLK PTR
                   17351:        MOV  WC,WA            GET BUFFER LENGTH
                   17352:        SUB  INSAB,WA         SUBTRACT TO GET SHIFT LENGTH
                   17353:        ADD  SCLEN(XL),WC     ADD LENGTH OF NEW
                   17354:        SUB  INSSB,WC         SUBTRACT OLD TO GET TOTAL NEW LEN
                   17355:        MOV  BCLEN(XR),WB     GET OLD BCLEN
                   17356:        MOV  WC,BCLEN(XR)     STUFF NEW LENGTH
                   17357:        MOV  INSBB,XR         POINT TO BFBLK
                   17358:        MOV  XL,-(XS)         SAVE SCBLK PTR
                   17359:        BZE  WA,INS02         SKIP SHIFT IF NOTHING TO DO
                   17360:        BEQ  INSSB,SCLEN(XL),INS02 SKIP SHIFT IF LENGTHS MATCH
                   17361:        BLO  INSSB,SCLEN(XL),INS01 BRN IF SHIFT IS FOR MORE ROOM
                   17362:        EJC
                   17363: *
                   17364: *      INSBF (CONTINUED)
                   17365: *
                   17366: *      WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
                   17367: *      THE BUFFER.  (THE STRING LENGTH IS SMALLER THAN THE
                   17368: *      SEGMENT BEING REPLACED). REGISTERS ARE SET AS -
                   17369: *
                   17370: *      (WA)                  MOVE (SHIFT DOWN) LENGTH
                   17371: *      (WB)                  OLD BCLEN
                   17372: *      (WC)                  NEW BCLEN
                   17373: *      (XR)                  BFBLK PTR
                   17374: *      (XL),(XS)             SCBLK PTR
                   17375: *
                   17376:        MOV  INSSA,WB         GET OFFSET TO INSERT
                   17377:        ADD  SCLEN(XL),WB     ADD INSERT LENGTH TO GET DEST OFF
                   17378:        MOV  XR,XL            MAKE COPY
                   17379:        PLC  XL,INSAB         PREPARE SOURCE FOR MOVE
                   17380:        PSC  XR,WB            PREPARE DESTINATION REG FOR MOVE
                   17381:        MVC                   MOVE EM OUT
                   17382:        BRN  INS02            BRANCH TO PAD
                   17383: *
                   17384: *      WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
                   17385: *      THE BUFFER.  (THE STRING LENGTH IS LARGER THAN THE
                   17386: *      SEGMENT BEING REPLACED.)
                   17387: *
                   17388: INS01  MOV  XR,XL            COPY BFBLK PTR
                   17389:        PLC  XL,WB            SET SOURCE REG FOR MOVE BACKWARDS
                   17390:        PSC  XR,WC            SET DESTINATION PTR FOR MOVE
                   17391:        MCB                   MOVE BACKWARDS (POSSIBLE OVERLAP)
                   17392: *
                   17393: *      MERGE HERE AFTER POSSIBLE MOVE TO ADJUST ZERO FILL AT END
                   17394: *
                   17395: INS02  MOV  (XS)+,XL         RESTORE SCBLK PTR
                   17396:        MOV  WC,WA            COPY NEW BUFFER END
                   17397:        CTB  WA,0             ROUND OUT
                   17398:        BTC  WA               CONVERT TO CHAR COUNT
                   17399:        SUB  WC,WA            SUBTRACT TO GET REMAINDER
                   17400:        BZE  WA,INS04         NO PAD IF ALREADY EVEN BOUNDARY
                   17401:        MOV  INSBB,XR         POINT TO BFBLK
                   17402:        PSC  XR,WC            PREPARE TO PAD
                   17403:        ZER  WB               CLEAR WB
                   17404:        LCT  WA,WA            LOAD LOOP COUNT
                   17405:        EJC
                   17406: *
                   17407: *      INSBF (CONTINUED)
                   17408: *
                   17409: *      LOOP HERE TO STUFF PAD CHARACTERS
                   17410: *
                   17411: INS03  SCH  WB,(XR)+         STUFF ZERO PAD
                   17412:        BCT  WA,INS03         BRANCH FOR MORE
                   17413: *
                   17414: *      MERGE HERE WHEN PADDING OK.  NOW COPY IN THE INSERT
                   17415: *      STRING TO THE HOLE.
                   17416: *
                   17417: INS04  MOV  INSBB,XR         POINT TO BFBLK
                   17418:        MOV  SCLEN(XL),WA     GET MOVE LENGTH
                   17419:        BZE  WA,INS05         SKIP IF NO CHARS TO INSERT
                   17420:        PLC  XL               PREPARE TO COPY FROM FIRST CHAR
                   17421:        PSC  XR,INSSA         PREPARE TO STORE IN HOLE
                   17422:        MVC                   COPY THE CHARACTERS
                   17423: *
                   17424: *      SUCCESSFUL RETURN
                   17425: *
                   17426: INS05  MOV  INSBC,XR         RESTORE ENTRY XR
                   17427:        ZER  XL               CLEAR GARBAGE CHAR POINTER
                   17428:        EXI                   RETURN TO CALLER
                   17429: *
                   17430: *      HERE TO TAKE STRING CONVERT ERROR EXIT
                   17431: *
                   17432: INS06  ICA  XS               DISCARD UNWANTED STACK TOP
                   17433:        EXI  1                ALTERNATE EXIT
                   17434: *
                   17435: *      HERE FOR INVALID OFFSET OR LENGTH
                   17436: *
                   17437: INS07  EXI  2                ALTERNATE EXIT
                   17438:        ENP                   END PROCEDURE INSBF
                   17439:        EJC
                   17440: .FI
                   17441: *      IOFTG -- GET IOTAG
                   17442: *
                   17443: *      USED TO FIND THE IOTAG (IF ANY) CORRESPONDING TO THE
                   17444: *      FILETAG ARGUMENT.
                   17445: *
                   17446: *      -(XS)                 FILETAG ARGUMENT
                   17447: *      JSR  IOFTG            CALL TO FIND IOTAG
                   17448: *      PPM  LOC              ARG IS AN UNSUITABLE FILETAG
                   17449: *      (XS)                  POPPED
                   17450: *      (XL)                  PTR TO FILETAG SCBLK
                   17451: *      (XR)                  PTR TO TRTIO TRACE BLK OR ZERO
                   17452: *      (WA)                  IOTAG OR ZERO
                   17453: *      (WB)                  PTR TO FILETAG VRBLK
                   17454: *      (WC)                  VALUE/0 FOR INTEGER/STRING FILETAG
                   17455: *
                   17456: IOFTG  PRC  N,1              ENTRY POINT
                   17457:        JSR  GTSTG            GET ARG AS STRING
                   17458:        PPM  IOFT4            FAIL
                   17459:        MOV  XR,XL            COPY STRING PTR
                   17460:        MOV  XR,-(XS)         STACK STRING
                   17461:        JSR  GTSMI            TRY CONVERSION TO INTEGER
                   17462:        PPM  IOFT5            SKIP IF CANT
                   17463:        PPM  IOFT5            SKIP IF CANT
                   17464: *
                   17465: *      MERGE WITH WC SET UP
                   17466: *
                   17467: IOFT1  MOV  WC,WB            KEEP INTEGER OR ZERO
                   17468:        MOV  XL,XR            FILETAG STRING TO XR FOR GTNVR CALL
                   17469:        JSR  GTNVR            FIND VRBLK
                   17470:        PPM  IOFT4            SKIP IF NULL STRING
                   17471:        MOV  XL,-(XS)         KEEP SCBLK PTR
                   17472:        ZER  XL               IN CASE NO TRTIO BLK FOUND
                   17473:        MOV  WB,WC            KEEP INTEGER OR ZERO
                   17474:        MOV  XR,WB            COPY VRBLK PTR FOR RETURN
                   17475:        ZER  WA               IN CASE NO TRBLK FOUND
                   17476: *
                   17477: *      LOOP TO FIND FILE ARG1 TRBLK
                   17478: *
                   17479: IOFT2  MOV  VRVAL(XR),XR     GET POSSIBLE TRBLK PTR
                   17480:        BNE  (XR),=B$TRT,IOFT3 SKIP IF END OF CHAIN
                   17481:        BNE  TRTYP(XR),=TRTIO,IOFT2 LOOP IF NOT FILETAG TRBLK
                   17482:        MOV  TRTAG(XR),WA     GET IOTAG OR 0
                   17483:        MOV  XR,XL            TRTIO BLK PTR
                   17484: *
                   17485: *      RETURN POINT
                   17486: *
                   17487: IOFT3  MOV  XL,XR            TRTIO BLK PTR OR 0
                   17488:        MOV  (XS)+,XL         RECOVER SCBLK PTR
                   17489:        EXI                   SUCCESSFUL RETURN
                   17490: *
                   17491: *      FAIL RETURN
                   17492: *
                   17493: IOFT4  EXI  1                FAIL
                   17494:        EJC
                   17495: *
                   17496: *      NON NUMERIC FILETAG
                   17497: *
                   17498: IOFT5  ZER  WC               NOTE NON NUMERIC
                   17499:        BRN  IOFT1            MERGE
                   17500:        ENP                   END PROCEDURE IOFTG
                   17501:        EJC
                   17502: *
                   17503: *      IOPUT -- PROCESS INPUT AND OUTPUT ARGUMENTS
                   17504: *
                   17505: *      IOPUT CHECKS THE ARGUMENTS OF INPUT AND OUTPUT CALLS,
                   17506: *      SETS UP THE REQUIRED ASSOCIATIONS AND CALLS SYSIO TO
                   17507: *      OPEN THE REQUESTED FILES.
                   17508: *
                   17509: *      -(XS)                 1ST ARG (VBL TO BE ASSOCIATED)
                   17510: *      -(XS)                 2ND ARG (FILETAG)
                   17511: *      -(XS)                 3RD ARG (FILEPROPS)
                   17512: *      (WB)                  0 FOR INPUT, 2 FOR OUTPUT ASSOC.
                   17513: *      JSR  IOPUT            CALL FOR INPUT/OUTPUT ASSOCIATION
                   17514: *      PPM  LOC              3RD ARG NOT A STRING
                   17515: *      PPM  LOC              2ND ARG NOT A SUITABLE FILETAG
                   17516: *      PPM  LOC              1ST ARG NOT A SUITABLE NAME
                   17517: *      PPM  LOC              FAIL RETURN
                   17518: *      (XS)                  POPPED
                   17519: *      (XL,XR,WA,WB,WC)      DESTROYED
                   17520: *
                   17521:        EJC
                   17522: *      FIRST ARG NAME
                   17523: *      I      I
                   17524: *      +------+
                   17525: *      I      I-----+
                   17526: *      +------+     V
                   17527: *      I      I   +----------------+
                   17528: *                 I     =B$TRT     I
                   17529: *                 +----------------+
                   17530: *                 I =TRTIN/=TRTOU  I
                   17531: *                 +----------------+
                   17532: *                 I VALUE OR TRCHN +
                   17533: *                 +----------------+
                   17534: *           TRTER I                I-----+
                   17535: *                 +----------------+     V
                   17536: *           TRTRI I        0       I   +------+
                   17537: *                 +----------------+   I      I SVBLK
                   17538: *                  I/O TRACE BLOCK     +------+
                   17539: *
                   17540: *      1. ASSOCIATION TO STANDARD FILES.
                   17541: *
                   17542: *      FIRST ARG NAME                      FILETAG VRBLK
                   17543: *      I      I                              I      I
                   17544: *      +------+  LK1                         +------+ LK2
                   17545: *      I      I---+                  +---+   I      I---+
                   17546: *      +------+   V                  I   V   +------+   V
                   17547: *      I      I  +----------------+  I  +----------------+
                   17548: *                I     =B$TRT     I  I  I     =B$TRT     I
                   17549: *                +----------------+  I  +----------------+
                   17550: *                I =TRTIN/=TRTOU  I  I  I     =TRTIO     I
                   17551: *                +----------------+  I  +----------------+
                   17552: *                I VALUE OR TRCHN I  I  I VALUE OR TRCHN I
                   17553: *                +----------------+  I  +----------------+
                   17554: *          TRTER I       0        I  I  I   0 OR IOTAG   I TRTAG
                   17555: *                +----------------+  I  +----------------+
                   17556: *          TRTRI I                I--+  I        0       I TRTRI
                   17557: *                +----------------+     +----------------+
                   17558: *                 I/O TRACE BLOCK           TRTIO BLOCK
                   17559: *
                   17560: *      2. REGULAR CASE.
                   17561: *
                   17562: *      THE STRUCTURES BUILT FOR I/O ASSOCIATIONS ARE AS SHOWN
                   17563: *      ABOVE. A TRACE BLOCK CHAIN (TRCHN) MAY HOLD ANY OR ALL
                   17564: *      OF THE TYPES, =TRTIN, =TRTOU, =TRTIO, BUT NOT MORE THAN
                   17565: *      ONE BLOCK OF ANY GIVEN TYPE. CASES ARE -
                   17566: *      1. NO FILETAG OR IOTAG IS USED FOR ASSOCIATING STANDARD
                   17567: *         FILES (SYSRD, SYSPR, TERMINAL). THE I/O TRACE BLOCK
                   17568: *         IS DISTINGUISHED BY A NON-NULL TRTER FIELD POINTING
                   17569: *         TO THE RELEVANT SVBLK (V$INP, V$OUP, V$TER) AND A
                   17570: *         ZERO TRTRI FIELD. FOR TERMINAL, TRBLKS OF BOTH
                   17571: *         INPUT AND OUTPUT TYPE ARE CHAINED FROM THE FIRST ARG
                   17572: *         VIA THE TRCHN FIELD.
                   17573: *      2. THE I/O TRACE BLOCK FOR THE REGULAR CASE HAS A ZERO
                   17574: *         TRTER FIELD AND A POINTER TO A TRTIO BLOCK IS IN
                   17575: *         THE TRTRI FIELD. THE FILETAG MUST BE A NATURAL
                   17576: *         VARIABLE AND THE TRTIO TRACE BLOCK ATTACHED TO IT
                   17577: *         HOLDS THE IOTAG.
                   17578: *      THE EFFECT OF ENDFILE() IS TO CLEAR IOTAG AND BREAK LK2.
                   17579: *      THE EFFECT OF DETACH() IS TO BREAK LK1.
                   17580:        EJC
                   17581: IOPUT  PRC  N,4              ENTRY POINT
                   17582:        MOV  WB,IOPWB         KEEP ASSOCIATION TYPE FLAG
                   17583:        JSR  GTSTG            CONVERT THIRD ARG TO STRING
                   17584:        PPM  IOP12            FAIL THIRD ARG
                   17585:        BNZ  WA,IOP01         SKIP IF NON NULL
                   17586:        ZER  XR               NOTE NULL ARG
                   17587: *
                   17588: *      PROCESS SECOND ARG
                   17589: *
                   17590: IOP01  MOV  XR,R$IOR         KEEP FILEPROPS STRING PTR
                   17591:        JSR  IOFTG            CHECK SECOND ARG
                   17592:        PPM  IOP07            FAIL SECOND ARG
                   17593:        MOV  XL,R$IOL         KEEP SCBLK FOR FILETAG
                   17594:        MOV  XR,R$IOT         KEEP TRTIO BLK PTR
                   17595:        MOV  WA,IOPWA         KEEP IOTAG
                   17596:        MOV  WB,IOPVR         KEEP FILETAG VRBLK PTR
                   17597:        MOV  WC,IOPWC         KEEP FILETAG VALUE
                   17598:        MOV  (XS)+,XR         GET FIRST ARG OFF STACK
                   17599:        JSR  GTVAR            CONVERT TO NAME
                   17600:        PPM  IOP13            FAIL FIRST ARG
                   17601:        MOV  XL,R$IO1         SAVE FIRST ARG NAME BASE ADRS
                   17602:        MOV  WA,IOPNF         SAVE FIRST ARG NAME OFFSET
                   17603:        MOV  WB,XR            FILETAG VRBLK PTR
                   17604:        BNZ  VRLEN(XR),IOP02  NOT SPECIAL CASE IF NOT SYS NAME
                   17605:        MOV  VRSVP(XR),WC     GET SVBLK PTR
                   17606:        MOV  =TRTIN,WB        IN CASE .INPUT
                   17607:        BEQ  WC,=V$INP,IOP06  JUMP IF .INPUT
                   17608:        MOV  =TRTOU,WB        IN CASE .OUTPUT OR .TERMINAL
                   17609:        BEQ  WC,=V$OUP,IOP08  JUMP IF .OUTPUT
                   17610:        BEQ  WC,=V$TER,IOP09  JUMP IF .TERMINAL
                   17611:        EJC
                   17612: *
                   17613: *      NORMAL CASE
                   17614: *
                   17615: IOP02  BNZ  R$IOT,IOP03      SKIP IF TRTIO BLK EXISTS ALREADY
                   17616:        MOV  =TRTIO,WB        TRACE BLOCK TYPE WORD
                   17617:        ZER  XR               ZERO IOTAG WORD
                   17618:        ZER  XL               ZERO TRTRI FIELD
                   17619:        JSR  TRBLD            BUILD TRTIO TRBLK
                   17620:        MOV  XR,R$IOT         SAVE TRTIO BLK PTR
                   17621:        MOV  IOPVR,XL         GET FILETAG VRBLK
                   17622:        MOV  *VRVAL,WA        OFFSET TO VALUE FIELD
                   17623:        JSR  TRCHN            PLACE IN TRBLK CHAIN FOR FILETAG
                   17624:        PPM                   UNUSED RETURN
                   17625: *
                   17626: *      MERGE TO BUILD TRBLK FOR FIRST ARG
                   17627: *
                   17628: IOP03  MOV  =TRTIN,WB        IN CASE INPUT
                   17629:        BZE  IOPWB,IOP04      SKIP IF SO
                   17630:        MOV  =TRTOU,WB        IN CASE OUTPUT
                   17631: *
                   17632: *      BUILD TRACE BLOCK
                   17633: *
                   17634: IOP04  ICV  IOPWB            NOTE NOT STANDARD I/O FILE
                   17635:        MOV  R$IOT,XL         TRTIO BLK PTR TO TRTRI FIELD
                   17636:        ZER  XR               ZERO TRTER FIELD
                   17637:        JSR  TRBLD            BUILD I/O TRACE BLOCK
                   17638:        MOV  R$IO1,XL         ASSOCIATED VBL NAME BASE
                   17639:        MOV  IOPNF,WA         NAME OFFSET
                   17640:        JSR  TRCHN            UPDATE TRACE CHAIN FOR FIRST ARG
                   17641:        PPM                   UNUSED RETURN
                   17642: *
                   17643: *      PREPARE FOR AND MAKE SYSIO CALL
                   17644: *
                   17645: IOP05  MOV  R$IOL,XL         FILETAG SCBLK PTR
                   17646:        MOV  R$IOR,XR         FILEPROPS SCBLK PTR
                   17647:        MOV  IOPWA,WA         IOTAG OR ZERO
                   17648:        MOV  IOPWB,WB         ASSOCIATION TYPE NUMBER
                   17649:        MOV  IOPWC,WC         POSSIBLE FILETAG VALUE
                   17650:        JSR  SYSIO            CALL SYSTEM ROUTINE TO OPEN FILE
                   17651:        PPM  IOP14            FAIL RETURN
                   17652:        PPM  EROSI            ERROR RETURN
                   17653:        MOV  R$IOT,XL         TRTIO POINTER
                   17654:        BZE  XL,IOP11         DONE IF ZERO
                   17655:        MOV  WA,TRTAG(XL)     STORE RETURNED IOTAG
                   17656:        BRN  IOP11            SUCCEED
                   17657:        EJC
                   17658: *
                   17659: *      SPECIAL CASE OF .INPUT
                   17660: *
                   17661: IOP06  BZE  IOPWB,IOP09      FAIL OUTPUT(.X,.INPUT)
                   17662: *
                   17663: *      BAD FILETAG
                   17664: *
                   17665: IOP07  EXI  2                ERRONEOUS SECOND ARG
                   17666: *
                   17667: *      SPECIAL CASE OF .OUTPUT
                   17668: *
                   17669: IOP08  BZE  IOPWB,IOP07      FAIL INPUT(.X,.OUTPUT)
                   17670: *
                   17671: *      SPECIAL CASE OF .TERMINAL AND MERGE FOR OTHERS
                   17672: *
                   17673: IOP09  ZER  R$IOT            NOTE NO TRTIO BLOCK
                   17674:        MOV  WC,XR            SVBLK PTR FOR TRTER FIELD
                   17675:        ZER  XL               ZERO TRTRI FIELD
                   17676:        JSR  TRBLD            BUILD TRBLK
                   17677:        MOV  R$IO1,XL         ASSOCIATED VBL NAME BASE
                   17678:        MOV  IOPNF,WA         NAME OFFSET
                   17679:        JSR  TRCHN            UPDATE TRACE CHAIN FOR ARG 1
                   17680:        PPM                   UNUSED RETURN
                   17681:        BNE  TRTER(XR),=V$TER,IOP10 DONE UNLESS TERMINAL
                   17682:        BNE  TRTYP(XR),=TRTOU,IOP10 DONE IF TERM. 2ND TIME ROUND
                   17683:        MOV  =V$TER,WC        TRTER FIELD
                   17684:        MOV  =TRTIN,WB        TRTYP FIELD
                   17685:        BRN  IOP09            REPEAT LOOP FOR TERMINAL
                   17686: *
                   17687: *      CHECK SPECIAL CASES FOR NON-NULL THIRD ARGS
                   17688: *
                   17689: IOP10  ZER  IOPWA            NO IOTAG
                   17690:        BNZ  R$IOR,IOP05      MERGE ONLY IF FILEPROPS NON-NULL
                   17691: *
                   17692: *      SUCCESS RETURN
                   17693: *
                   17694: IOP11  ZER  R$IO1            CLEAR GARBAGE
                   17695:        ZER  R$IOL
                   17696:        ZER  R$IOR
                   17697:        ZER  R$IOT
                   17698:        EXI                   RETURN TO CALLER
                   17699: *
                   17700: *      ERROR RETURNS
                   17701: *
                   17702: IOP12  EXI  1                ERRONEOUS THIRD ARG
                   17703: *
                   17704: IOP13  EXI  3                ERRONEOUS FIRST ARG
                   17705: *
                   17706: IOP14  EXI  4                FAIL RETURN FROM SYSIO
                   17707:        ENP                   END PROCEDURE IOPUT
                   17708:        EJC
                   17709: *
                   17710: *      KTREX -- EXECUTE KEYWORD TRACE
                   17711: *
                   17712: *      KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
                   17713: *      INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
                   17714: *
                   17715: *      (XL)                  PTR TO TRBLK (OR 0 IF UNTRACED)
                   17716: *      JSR  KTREX            CALL TO EXECUTE KEYWORD TRACE
                   17717: *      (XL,WA,WB,WC)         DESTROYED
                   17718: *      (RA)                  DESTROYED
                   17719: *
                   17720: KTREX  PRC  R,0              ENTRY POINT (RECURSIVE)
                   17721:        BZE  XL,KTRX3         IMMEDIATE EXIT IF KEYWORD UNTRACED
                   17722:        BZE  KVTRA,KTRX3      IMMEDIATE EXIT IF TRACE = 0
                   17723:        DCV  KVTRA            ELSE DECREMENT TRACE
                   17724:        MOV  XR,-(XS)         SAVE XR
                   17725:        MOV  XL,XR            COPY TRBLK POINTER
                   17726:        MOV  TRKVR(XR),XL     LOAD VRBLK POINTER (NMBAS)
                   17727:        MOV  *VRVAL,WA        SET NAME OFFSET
                   17728:        BZE  TRFNC(XR),KTRX1  JUMP IF PRINT TRACE
                   17729:        JSR  TRXEQ            ELSE EXECUTE FULL TRACE
                   17730:        BRN  KTRX2            AND JUMP TO EXIT
                   17731: *
                   17732: *      HERE FOR PRINT TRACE
                   17733: *
                   17734: KTRX1  MOV  XL,-(XS)         STACK VRBLK PTR FOR KWNAM
                   17735:        MOV  WA,-(XS)         STACK OFFSET FOR KWNAM
                   17736:        JSR  PRTSN            PRINT STATEMENT NUMBER
                   17737:        MOV  =CH$AM,WA        LOAD AMPERSAND
                   17738:        JSR  PRTCH            PRINT AMPERSAND
                   17739:        JSR  PRTNM            PRINT KEYWORD NAME
                   17740:        MOV  =TMBEB,XR        POINT TO BLANK-EQUAL-BLANK
                   17741:        JSR  PRTST            PRINT BLANK-EQUAL-BLANK
                   17742:        JSR  KWNAM            GET KEYWORD PSEUDO-VARIABLE NAME
                   17743:        MOV  XR,DNAMP         RESET PTR TO DELETE KVBLK
                   17744:        JSR  ACESS            GET KEYWORD VALUE
                   17745:        PPM                   FAILURE IS IMPOSSIBLE
                   17746:        JSR  PRTVF            PRINT KEYWORD VALUE
                   17747: *
                   17748: *      HERE TO EXIT AFTER COMPLETING TRACE
                   17749: *
                   17750: KTRX2  MOV  (XS)+,XR         RESTORE ENTRY XR
                   17751: *
                   17752: *      MERGE HERE TO EXIT IF NO TRACE REQUIRED
                   17753: *
                   17754: KTRX3  EXI                   RETURN TO KTREX CALLER
                   17755:        ENP                   END PROCEDURE KTREX
                   17756:        EJC
                   17757: *
                   17758: *      KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
                   17759: *
                   17760: *      1(XS)                 NAME BASE FOR VRBLK
                   17761: *      0(XS)                 OFFSET (SHOULD BE *VRVAL)
                   17762: *      JSR  KWNAM            CALL TO GET PSEUDO-VARIABLE NAME
                   17763: *      (XS)                  POPPED TWICE
                   17764: *      (XL,WA)               RESULTING PSEUDO-VARIABLE NAME
                   17765: *      (XR,WA,WB)            DESTROYED
                   17766: *
                   17767: KWNAM  PRC  N,0              ENTRY POINT
                   17768:        ICA  XS               IGNORE NAME OFFSET
                   17769:        MOV  (XS)+,XR         LOAD NAME BASE
                   17770:        BGE  XR,STATE,KWNM1   JUMP IF NOT NATURAL VARIABLE NAME
                   17771:        BNZ  VRLEN(XR),KWNM1  ERROR IF NOT SYSTEM VARIABLE
                   17772:        MOV  VRSVP(XR),XR     ELSE POINT TO SVBLK
                   17773:        MOV  SVBIT(XR),WA     LOAD BIT MASK
                   17774:        ANB  BTKNM,WA         AND WITH KEYWORD BIT
                   17775:        ZRB  WA,KWNM1         ERROR IF NO KEYWORD ASSOCIATION
                   17776:        MOV  SVLEN(XR),WA     ELSE LOAD NAME LENGTH IN CHARACTERS
                   17777:        CTB  WA,SVCHS         COMPUTE OFFSET TO FIELD WE WANT
                   17778:        ADD  WA,XR            POINT TO SVKNM FIELD
                   17779:        MOV  (XR),WB          LOAD SVKNM VALUE
                   17780:        MOV  *KVSI$,WA        SET SIZE OF KVBLK
                   17781:        JSR  ALLOC            ALLOCATE KVBLK
                   17782:        MOV  =B$KVT,(XR)      STORE TYPE WORD
                   17783:        MOV  WB,KVNUM(XR)     STORE KEYWORD NUMBER
                   17784:        MOV  =TRBKV,KVVAR(XR) SET DUMMY TRBLK POINTER
                   17785:        MOV  XR,XL            COPY KVBLK POINTER
                   17786:        MOV  *KVVAR,WA        SET PROPER OFFSET
                   17787:        EXI                   RETURN TO KVNAM CALLER
                   17788: *
                   17789: *      HERE IF NOT KEYWORD NAME
                   17790: *
                   17791: KWNM1  ERB  230,KEYWORD OPERAND IS NOT NAME OF DEFINED KEYWORD
                   17792:        ENP                   END PROCEDURE KWNAM
                   17793:        EJC
                   17794: *
                   17795: *      LCOMP-- COMPARE TWO STRINGS LEXICALLY
                   17796: *
                   17797: *      1(XS)                 FIRST ARGUMENT
                   17798: *      0(XS)                 SECOND ARGUMENT
                   17799: *      JSR  LCOMP            CALL TO COMPARE ARUMENTS
                   17800: *      PPM  LOC              TRANSFER LOC FOR ARG1 NOT STRING
                   17801: *      PPM  LOC              TRANSFER LOC FOR ARG2 NOT STRING
                   17802: *      PPM  LOC              TRANSFER LOC IF ARG1 LLT ARG2
                   17803: *      PPM  LOC              TRANSFER LOC IF ARG1 LEQ ARG2
                   17804: *      PPM  LOC              TRANSFER LOC IF ARG1 LGT ARG2
                   17805: *      (THE NORMAL RETURN IS NEVER TAKEN)
                   17806: *      (XS)                  POPPED TWICE
                   17807: *      (XR,XL)               DESTROYED
                   17808: *      (WA,WB,WC,RA)         DESTROYED
                   17809: *
                   17810: LCOMP  PRC  N,5              ENTRY POINT
                   17811:        JSR  GTSTG            CONVERT SECOND ARG TO STRING
                   17812:        PPM  LCMP6            JUMP IF SECOND ARG NOT STRING
                   17813:        MOV  XR,XL            ELSE SAVE POINTER
                   17814:        MOV  WA,WB            AND LENGTH
                   17815:        JSR  GTSTG            CONVERT FIRST ARGUMENT TO STRING
                   17816:        PPM  LCMP5            JUMP IF NOT STRING
                   17817:        MOV  WA,WC            SAVE ARG 1 LENGTH
                   17818:        PLC  XR               POINT TO CHARS OF ARG 1
                   17819:        PLC  XL               POINT TO CHARS OF ARG 2
                   17820:        BLO  WA,WB,LCMP0      JUMP IF ARG 1 LENGTH IS SMALLER
                   17821:        MOV  WB,WA            ELSE SET ARG 2 LENGTH AS SMALLER
                   17822: *
                   17823: *      HERE WITH SMALLER LENGTH IN (WA)
                   17824: *
                   17825: LCMP0  BZE  WA,LCMP1         SKIP IF A NULL ARG
                   17826:        CMC  LCMP4,LCMP3      COMPARE STRINGS, JUMP IF UNEQUAL
                   17827: *
                   17828: *      EQUAL STRINGS OR AT LEAST ONE NULL ARG
                   17829: *
                   17830: LCMP1  BNE  WB,WC,LCMP2      IF EQUAL, JUMP IF LENGTHS UNEQUAL
                   17831:        EXI  4                ELSE IDENTICAL STRINGS, LEQ EXIT
                   17832:        EJC
                   17833: *
                   17834: *      LCOMP (CONTINUED)
                   17835: *
                   17836: *      HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
                   17837: *
                   17838: LCMP2  BHI  WC,WB,LCMP4      JUMP IF ARG 1 LENGTH GT ARG 2 LENG
                   17839: *
                   17840: *      HERE IF FIRST ARG LLT SECOND ARG
                   17841: *
                   17842: LCMP3  EXI  3                TAKE LLT EXIT
                   17843: *
                   17844: *      HERE IF FIRST ARG LGT SECOND ARG
                   17845: *
                   17846: LCMP4  EXI  5                TAKE LGT EXIT
                   17847: *
                   17848: *      HERE IF FIRST ARG IS NOT A STRING
                   17849: *
                   17850: LCMP5  EXI  1                TAKE BAD FIRST ARG EXIT
                   17851: *
                   17852: *      HERE FOR SECOND ARG NOT A STRING
                   17853: *
                   17854: LCMP6  EXI  2                TAKE BAD SECOND ARG ERROR EXIT
                   17855:        ENP                   END PROCEDURE LCOMP
                   17856:        EJC
                   17857: *
                   17858: *      LISTR -- LIST SOURCE LINE
                   17859: *
                   17860: *      LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
                   17861: *      COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
                   17862: *
                   17863: *      JSR  LISTR            CALL TO LIST LINE
                   17864: *      (XR,XL,WA,WB,WC)      DESTROYED
                   17865: *
                   17866: *      GLOBAL LOCATIONS USED BY LISTR
                   17867: *
                   17868: *      ERLST                 IF LISTING ON ACCOUNT OF AN ERROR
                   17869: *
                   17870: *      LSTLC                 COUNT LINES ON CURRENT PAGE
                   17871: *
                   17872: *      LSTNP                 MAX NUMBER OF LINES/PAGE
                   17873: *
                   17874: *      LSTPF                 SET NON-ZERO IF THE CURRENT SOURCE
                   17875: *                            LINE HAS BEEN LISTED, ELSE ZERO.
                   17876: *
                   17877: *      LSTPG                 COMPILER LISTING PAGE NUMBER
                   17878: *
                   17879: *      LSTSN                 SET IF STMNT NUM TO BE LISTED
                   17880: *
                   17881: *      R$CIM                 POINTER TO CURRENT INPUT LINE.
                   17882: *
                   17883: *      R$TTL                 TITLE FOR SOURCE LISTING
                   17884: *
                   17885: *      R$STL                 PTR TO SUB-TITLE STRING
                   17886: *
                   17887: *      ENTRY POINT
                   17888: *
                   17889: LISTR  PRC  E,0              ENTRY POINT
                   17890:        MOV  STAGE,WA         GET COMPILER STAGE
                   17891:        BEQ  WA,=STGIC,LIST0  LIST OK IF INITIAL COMPILE
                   17892:        BEQ  WA,=STGCE,LIST0  LIST OK IF END LINE
                   17893:        BRN  LIST4            ELSE NO LISTING OF SOURCE
                   17894: *
                   17895: *      HERE WHEN STAGE IS OK TO LIST
                   17896: *
                   17897: LIST0  BNZ  CNTTL,LIST5      JUMP IF -TITLE OR -STITL
                   17898:        BNZ  LSTPF,LIST4      IMMEDIATE EXIT IF ALREADY LISTED
                   17899:        BGE  LSTLC,LSTNP,LIST6 JUMP IF NO ROOM
                   17900: *
                   17901: *      HERE AFTER PRINTING TITLE (IF NEEDED)
                   17902: *
                   17903: LIST1  MOV  R$CIM,XR         LOAD POINTER TO CURRENT IMAGE
                   17904:        PLC  XR               POINT TO CHARACTERS
                   17905:        LCH  WA,(XR)          LOAD FIRST CHARACTER
                   17906:        MOV  LSTSN,XR         LOAD STATEMENT NUMBER
                   17907:        BZE  XR,LIST2         JUMP IF NO STATEMENT NUMBER
                   17908:        MTI  XR               ELSE GET STMNT NUMBER AS INTEGER
                   17909:        BEQ  WA,=CH$AS,LIST2  NO STMNT NUMBER LIST IF COMMENT
                   17910:        BEQ  WA,=CH$MN,LIST2  NO STMNT NO. IF CONTROL CARD
                   17911:        JSR  PRTIN            ELSE PRINT STATEMENT NUMBER
                   17912:        ZER  LSTSN            AND CLEAR FOR NEXT TIME IN
                   17913:        EJC
                   17914: *
                   17915: *      LISTR (CONTINUED)
                   17916: *
                   17917: *      MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
                   17918: *
                   17919: LIST2  MOV  =STNPD,PROFS     POINT PAST STATEMENT NUMBER
                   17920:        MOV  R$CIM,XR         LOAD POINTER TO CURRENT IMAGE
                   17921:        JSR  PRTSF            PRINT IT
                   17922:        ICV  LSTLC            BUMP LINE COUNTER
                   17923:        MNZ  LSTPF            SET FLAG FOR LINE PRINTED
                   17924: *
                   17925: *      MERGE HERE TO EXIT
                   17926: *
                   17927: LIST4  EXI                   RETURN TO LISTR CALLER
                   17928: *
                   17929: *      PRINT TITLE AFTER -TITLE OR -STITL CARD
                   17930: *
                   17931: LIST5  ZER  CNTTL            CLEAR FLAG
                   17932: *
                   17933: *      EJECT TO NEW PAGE AND LIST TITLE
                   17934: *
                   17935: LIST6  JSR  PRTPS            EJECT
                   17936:        BNZ  PRLEN,LIST7      SKIP IF LISTING TO REGULAR PRINTER
                   17937:        BEQ  R$TTL,=NULLS,LIST1 TERMINAL LISTING OMITS NULL TITLE
                   17938: *
                   17939: *      LIST TITLE
                   17940: *
                   17941: LIST7  JSR  LISTT            LIST TITLE
                   17942:        BRN  LIST1            MERGE
                   17943:        ENP                   END PROCEDURE LISTR
                   17944:        EJC
                   17945: *
                   17946: *      LISTT -- LIST TITLE AND SUBTITLE
                   17947: *
                   17948: *      USED DURING COMPILATION TO PRINT PAGE HEADING
                   17949: *
                   17950: *      JSR  LISTT            CALL TO LIST TITLE
                   17951: *      (XR,WA)               DESTROYED
                   17952: *
                   17953: LISTT  PRC  E,0              ENTRY POINT
                   17954:        MOV  R$TTL,XR         POINT TO SOURCE LISTING TITLE
                   17955:        JSR  PRTST            PRINT TITLE
                   17956:        MOV  LSTPO,PROFS      SET OFFSET
                   17957:        MOV  =LSTMS,XR        SET PAGE MESSAGE
                   17958:        JSR  PRTST            PRINT PAGE MESSAGE
                   17959:        ICV  LSTPG            BUMP PAGE NUMBER
                   17960:        MTI  LSTPG            LOAD PAGE NUMBER AS INTEGER
                   17961:        JSR  PRTIN            PRINT PAGE NUMBER
                   17962:        JSR  PRTFH            TERMINATE TITLE LINE
                   17963:        ADD  =NUM02,LSTLC     COUNT TITLE LINE AND BLANK LINE
                   17964: *
                   17965: *      PRINT SUB-TITLE (IF ANY)
                   17966: *
                   17967:        MOV  R$STL,XR         LOAD POINTER TO SUB-TITLE
                   17968:        BZE  XR,LSTT1         JUMP IF NO SUB-TITLE
                   17969:        JSR  PRTSF            ELSE PRINT SUB-TITLE
                   17970:        ICV  LSTLC            BUMP LINE COUNT
                   17971: *
                   17972: *      RETURN POINT
                   17973: *
                   17974: LSTT1  JSR  PRTFH            PRINT A BLANK LINE
                   17975:        EXI                   RETURN TO CALLER
                   17976:        ENP                   END PROCEDURE LISTT
                   17977:        EJC
                   17978: *
                   17979: *      NEXTS -- ACQUIRE NEXT SOURCE IMAGE
                   17980: *
                   17981: *      NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
                   17982: *      TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
                   17983: *      A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
                   17984: *      IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
                   17985: *
                   17986: *      JSR  NEXTS            CALL TO ACQUIRE NEXT INPUT LINE
                   17987: *      (XR,XL,WA,WB,WC)      DESTROYED
                   17988: *
                   17989: *      GLOBAL VALUES AFFECTED
                   17990: *
                   17991: *      R$CNI                 ON INPUT, NEXT IMAGE. ON
                   17992: *                            EXIT RESET TO ZERO
                   17993: *
                   17994: *      R$CIM                 ON EXIT, SET TO POINT TO IMAGE
                   17995: *
                   17996: *      SCNIL                 INPUT IMAGE LENGTH ON EXIT
                   17997: *
                   17998: *      SCNSE                 RESET TO ZERO ON EXIT
                   17999: *
                   18000: *      LSTPF                 SET ON EXIT IF LINE IS LISTED
                   18001: *
                   18002: NEXTS  PRC  E,0              ENTRY POINT
                   18003:        BZE  CSWLS,NXTS1      JUMP IF -NOLIST
                   18004:        MOV  R$CIM,XR         POINT TO IMAGE
                   18005:        BZE  XR,NXTS1         JUMP IF NO IMAGE
                   18006:        PLC  XR               GET CHAR PTR
                   18007:        LCH  WA,(XR)          GET FIRST CHAR
                   18008:        BEQ  WA,=CH$MN,NXTS1  SKIP LISTING IF CONTROL CARD
                   18009:        JSR  LISTR            LIST LINE
                   18010: *
                   18011: *      HERE AFTER POSSIBLE LISTING
                   18012: *
                   18013: NXTS1  MOV  R$CNI,XR         POINT TO NEXT IMAGE
                   18014:        MOV  XR,R$CIM         SET AS NEXT IMAGE
                   18015:        ZER  R$CNI            CLEAR NEXT IMAGE POINTER
                   18016:        MOV  SCLEN(XR),WA     GET INPUT IMAGE LENGTH
                   18017:        MOV  CSWIN,WB         GET MAX ALLOWABLE LENGTH
                   18018:        BLO  WA,WB,NXTS2      SKIP IF NOT TOO LONG
                   18019:        MOV  WB,WA            ELSE TRUNCATE
                   18020: *
                   18021: *      HERE WITH LENGTH IN (WA)
                   18022: *
                   18023: NXTS2  MOV  WA,SCNIL         USE AS RECORD LENGTH
                   18024:        ZER  SCNSE            RESET SCNSE
                   18025:        ZER  LSTPF            SET LINE NOT LISTED YET
                   18026:        EXI                   RETURN TO NEXTS CALLER
                   18027:        ENP                   END PROCEDURE NEXTS
                   18028:        EJC
                   18029: *
                   18030: *      PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
                   18031: *
                   18032: *      THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
                   18033: *      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
                   18034: *      FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
                   18035: *
                   18036: *      (WA)                  PCODE FOR EXPRESSION ARG CASE
                   18037: *      (WB)                  PCODE FOR INTEGER ARG CASE
                   18038: *      JSR  PATIN            CALL TO BUILD PATTERN NODE
                   18039: *      PPM  LOC              TRANSFER LOC FOR NOT INTEGER OR EXP
                   18040: *      PPM  LOC              TRANSFER LOC FOR INT OUT OF RANGE
                   18041: *      (XR)                  POINTER TO CONSTRUCTED NODE
                   18042: *      (XL,WA,WB,WC,IA)      DESTROYED
                   18043: *
                   18044: PATIN  PRC  N,2              ENTRY POINT
                   18045:        MOV  WA,XL            PRESERVE EXPRESSION ARG PCODE
                   18046:        JSR  GTSMI            TRY TO CONVERT ARG AS SMALL INTEGER
                   18047:        PPM  PTIN2            JUMP IF NOT INTEGER
                   18048:        PPM  PTIN3            JUMP IF OUT OF RANGE
                   18049: *
                   18050: *      COMMON SUCCESSFUL EXIT POINT
                   18051: *
                   18052: PTIN1  JSR  PBILD            BUILD PATTERN NODE
                   18053:        EXI                   RETURN TO CALLER
                   18054: *
                   18055: *      HERE IF ARGUMENT IS NOT AN INTEGER
                   18056: *
                   18057: PTIN2  MOV  XL,WB            COPY EXPR ARG CASE PCODE
                   18058:        BLO  (XR),=B$E$$,PTIN1 ALL OK IF EXPRESSION ARG
                   18059:        EXI  1                ELSE TAKE ERROR EXIT FOR WRONG TYPE
                   18060: *
                   18061: *      HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
                   18062: *
                   18063: PTIN3  EXI  2                TAKE OUT-OF-RANGE ERROR EXIT
                   18064:        ENP                   END PROCEDURE PATIN
                   18065:        EJC
                   18066: *
                   18067: *      PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
                   18068: *               BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
                   18069: *
                   18070: *      THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
                   18071: *      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
                   18072: *      FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
                   18073: *
                   18074: *      0(XS)                 STRING ARGUMENT
                   18075: *      (WB)                  PCODE FOR ONE CHAR ARGUMENT
                   18076: *      (XL)                  PCODE FOR MULTI-CHAR ARGUMENT
                   18077: *      (WC)                  PCODE FOR EXPRESSION ARGUMENT
                   18078: *      JSR  PATST            CALL TO BUILD NODE
                   18079: *      PPM  LOC              TRANSFER LOC IF NOT STRING OR EXPR
                   18080: *      (XS)                  POPPED PAST STRING ARGUMENT
                   18081: *      (XR)                  POINTER TO CONSTRUCTED NODE
                   18082: *      (XL)                  DESTROYED
                   18083: *      (WA,WB,WC,RA)         DESTROYED
                   18084: *
                   18085: *      NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
                   18086: *      PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
                   18087: *      FOR DETAILS OF THE FORM OF THIS CALL.
                   18088: *
                   18089: PATST  PRC  N,1              ENTRY POINT
                   18090:        JSR  GTSTG            CONVERT ARGUMENT AS STRING
                   18091:        PPM  PATS7            JUMP IF NOT STRING
                   18092:        BNE  WA,=NUM01,PATS2  JUMP IF NOT ONE CHAR STRING
                   18093: *
                   18094: *      HERE FOR ONE CHAR STRING CASE
                   18095: *
                   18096:        BZE  WB,PATS2         TREAT AS MULTI-CHAR IF EVALS CALL
                   18097:        PLC  XR               POINT TO CHARACTER
                   18098:        LCH  XR,(XR)          LOAD CHARACTER
                   18099: *
                   18100: *      COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
                   18101: *
                   18102: PATS1  JSR  PBILD            CALL ROUTINE TO BUILD NODE
                   18103:        EXI                   RETURN TO PATST CALLER
                   18104:        EJC
                   18105: *
                   18106: *      PATST (CONTINUED)
                   18107: *
                   18108: *      HERE FOR MULTI-CHARACTER STRING CASE
                   18109: *
                   18110: PATS2  MOV  XL,-(XS)         SAVE MULTI-CHAR PCODE
                   18111:        MOV  XR,-(XS)         SAVE STRING POINTER
                   18112:        MOV  CTMSK,WC         LOAD CURRENT MASK BIT
                   18113:        LSH  WC,1             SHIFT TO NEXT POSITION
                   18114:        NZB  WC,PATS4         SKIP IF POSITION LEFT IN THIS TBL
                   18115: *
                   18116: *      HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
                   18117: *
                   18118:        MOV  *CTSI$,WA        SET SIZE OF CTBLK
                   18119:        JSR  ALLOC            ALLOCATE CTBLK
                   18120:        MOV  XR,R$CTP         STORE PTR TO NEW CTBLK
                   18121:        MOV  =B$CTT,(XR)+     STORE TYPE CODE, BUMP PTR
                   18122:        LCT  WB,=CFP$A        SET NUMBER OF WORDS TO CLEAR
                   18123:        MOV  BITS0,WC         LOAD ALL ZERO BITS
                   18124: *
                   18125: *      LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
                   18126: *
                   18127: PATS3  MOV  WC,(XR)+         MOVE WORD OF ZERO BITS
                   18128:        BCT  WB,PATS3         LOOP TILL ALL CLEARED
                   18129:        MOV  BITS1,WC         SET INITIAL BIT POSITION
                   18130: *
                   18131: *      MERGE HERE WITH BIT POSITION AVAILABLE
                   18132: *
                   18133: PATS4  MOV  WC,CTMSK         SAVE PARM2 (NEW BIT POSITION)
                   18134:        MOV  (XS)+,XL         RESTORE POINTER TO ARGUMENT STRING
                   18135:        MOV  SCLEN(XL),WB     LOAD STRING LENGTH
                   18136:        BZE  WB,PATS6         JUMP IF NULL STRING CASE
                   18137:        LCT  WB,WB            ELSE SET LOOP COUNTER
                   18138:        PLC  XL               POINT TO CHARACTERS IN ARGUMENT
                   18139:        EJC
                   18140: *
                   18141: *      PATST (CONTINUED)
                   18142: *
                   18143: *      LOOP TO SET BITS IN COLUMN OF TABLE
                   18144: *
                   18145: PATS5  LCH  WA,(XL)+         LOAD NEXT CHARACTER
                   18146:        WTB  WA               CONVERT TO BAU OFFSET
                   18147:        MOV  R$CTP,XR         POINT TO CTBLK
                   18148:        ADD  WA,XR            POINT TO CTBLK ENTRY
                   18149:        MOV  WC,WA            COPY BIT MASK
                   18150:        ORB  CTCHS(XR),WA     OR IN BITS ALREADY SET
                   18151:        MOV  WA,CTCHS(XR)     STORE RESULTING BIT STRING
                   18152:        BCT  WB,PATS5         LOOP TILL ALL BITS SET
                   18153: *
                   18154: *      COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
                   18155: *
                   18156: PATS6  MOV  R$CTP,XR         LOAD CTBLK PTR AS PARM1 FOR PBILD
                   18157:        ZER  XL               CLEAR GARBAGE PTR IN XL
                   18158:        MOV  (XS)+,WB         LOAD PCODE FOR MULTI-CHAR STR CASE
                   18159:        BRN  PATS1            BACK TO EXIT (WC=BITSTRING=PARM2)
                   18160: *
                   18161: *      HERE IF ARGUMENT IS NOT A STRING
                   18162: *
                   18163: *      NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
                   18164: *      SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
                   18165: *
                   18166: PATS7  MOV  WC,WB            SET PCODE FOR EXPRESSION ARGUMENT
                   18167:        BLO  (XR),=B$E$$,PATS1 JUMP TO EXIT IF EXPRESSION ARG
                   18168:        EXI  1                ELSE TAKE WRONG TYPE ERROR EXIT
                   18169:        ENP                   END PROCEDURE PATST
                   18170:        EJC
                   18171: *
                   18172: *      PBILD -- BUILD PATTERN NODE
                   18173: *
                   18174: *      (XR)                  PARM1 (ONLY IF REQUIRED)
                   18175: *      (WB)                  PCODE FOR NODE
                   18176: *      (WC)                  PARM2 (ONLY IF REQUIRED)
                   18177: *      JSR  PBILD            CALL TO BUILD NODE
                   18178: *      (XR)                  POINTER TO CONSTRUCTED NODE
                   18179: *      (WA)                  DESTROYED
                   18180: *
                   18181: PBILD  PRC  E,0              ENTRY POINT
                   18182:        MOV  XR,-(XS)         STACK POSSIBLE PARM1
                   18183:        MOV  WB,XR            COPY PCODE
                   18184:        LEI  XR               LOAD ENTRY POINT ID (BL$PX)
                   18185:        BEQ  XR,=BL$P1,PBLD1  JUMP IF ONE PARAMETER
                   18186:        BEQ  XR,=BL$P0,PBLD3  JUMP IF NO PARAMETERS
                   18187: *
                   18188: *      HERE FOR TWO PARAMETER CASE
                   18189: *
                   18190:        MOV  *PCSI$,WA        SET SIZE OF P2BLK
                   18191:        JSR  ALLOC            ALLOCATE BLOCK
                   18192:        MOV  WC,PARM2(XR)     STORE SECOND PARAMETER
                   18193:        BRN  PBLD2            MERGE WITH ONE PARM CASE
                   18194: *
                   18195: *      HERE FOR ONE PARAMETER CASE
                   18196: *
                   18197: PBLD1  MOV  *PBSI$,WA        SET SIZE OF P1BLK
                   18198:        JSR  ALLOC            ALLOCATE NODE
                   18199: *
                   18200: *      MERGE HERE FROM TWO PARM CASE
                   18201: *
                   18202: PBLD2  MOV  (XS),PARM1(XR)   STORE FIRST PARAMETER
                   18203:        BRN  PBLD4            MERGE WITH NO PARAMETER CASE
                   18204: *
                   18205: *      HERE FOR CASE OF NO PARAMETERS
                   18206: *
                   18207: PBLD3  MOV  *PASI$,WA        SET SIZE OF P0BLK
                   18208:        JSR  ALLOC            ALLOCATE NODE
                   18209: *
                   18210: *      MERGE HERE FROM OTHER CASES
                   18211: *
                   18212: PBLD4  MOV  WB,(XR)          STORE PCODE
                   18213:        ICA  XS               POP FIRST PARAMETER
                   18214:        MOV  =NDNTH,PTHEN(XR) SET NOTHEN SUCCESSOR POINTER
                   18215:        EXI                   RETURN TO PBILD CALLER
                   18216:        ENP                   END PROCEDURE PBILD
                   18217:        EJC
                   18218: *
                   18219: *      PCONC -- CONCATENATE TWO PATTERNS
                   18220: *
                   18221: *      (XL)                  PTR TO RIGHT PATTERN
                   18222: *      (XR)                  PTR TO LEFT PATTERN
                   18223: *      JSR  PCONC            CALL TO CONCATENATE PATTERNS
                   18224: *      (XR)                  PTR TO CONCATENATED PATTERN
                   18225: *      (XL,WA,WB,WC)         DESTROYED
                   18226: *
                   18227: *
                   18228: *      TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
                   18229: *      PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
                   18230: *      POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
                   18231: *      MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
                   18232: *      THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
                   18233: *      MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
                   18234: *
                   18235: *      ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
                   18236: *      THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
                   18237: *      NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
                   18238: *      THE FOLLOWING ALGORITHM IS EMPLOYED.
                   18239: *
                   18240: *      THE STACK IS USED TO STORE A LIST OF NODES WHICH
                   18241: *      HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
                   18242: *      THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
                   18243: *      IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
                   18244: *      OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
                   18245: *      ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
                   18246: *      USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
                   18247: *      A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
                   18248: *      ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
                   18249: *      ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
                   18250: *      THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
                   18251: *
                   18252: PCONC  PRC  E,0              ENTRY POINT
                   18253:        ZER  -(XS)            MAKE ROOM FOR ONE ENTRY AT BOTTOM
                   18254:        MOV  XS,WC            STORE POINTER TO START OF LIST
                   18255:        MOV  =NDNTH,-(XS)     STACK NOTHEN NODE AS OLD NODE
                   18256:        MOV  XL,-(XS)         STORE RIGHT ARG AS COPY OF NOTHEN
                   18257:        MOV  XS,XT            INITIALIZE POINTER TO STACK ENTRIES
                   18258:        JSR  PCOPY            COPY FIRST NODE OF LEFT ARG
                   18259:        MOV  WA,2(XT)         STORE AS RESULT UNDER LIST
                   18260:        EJC
                   18261: *
                   18262: *      PCONC (CONTINUED)
                   18263: *
                   18264: *      THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
                   18265: *      SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
                   18266: *
                   18267: PCNC1  BEQ  XT,XS,PCNC2      JUMP IF ALL ENTRIES PROCESSED
                   18268:        MOV  -(XT),XR         ELSE LOAD NEXT OLD ADDRESS
                   18269:        MOV  PTHEN(XR),XR     LOAD POINTER TO SUCCESSOR
                   18270:        JSR  PCOPY            COPY SUCCESSOR NODE
                   18271:        MOV  -(XT),XR         LOAD POINTER TO NEW NODE (COPY)
                   18272:        MOV  WA,PTHEN(XR)     STORE PTR TO NEW SUCCESSOR
                   18273: *
                   18274: *      NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
                   18275: *      PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
                   18276: *
                   18277:        BNE  (XR),=P$ALT,PCNC1 LOOP BACK IF NOT
                   18278:        MOV  PARM1(XR),XR     ELSE LOAD POINTER TO ALTERNATIVE
                   18279:        JSR  PCOPY            COPY IT
                   18280:        MOV  (XT),XR          RESTORE PTR TO NEW NODE
                   18281:        MOV  WA,PARM1(XR)     STORE PTR TO COPIED ALTERNATIVE
                   18282:        BRN  PCNC1            LOOP BACK FOR NEXT ENTRY
                   18283: *
                   18284: *      HERE AT END OF COPY PROCESS
                   18285: *
                   18286: PCNC2  MOV  WC,XS            RESTORE STACK POINTER
                   18287:        MOV  (XS)+,XR         LOAD POINTER TO COPY
                   18288:        EXI                   RETURN TO PCONC CALLER
                   18289:        ENP                   END PROCEDURE PCONC
                   18290:        EJC
                   18291: *
                   18292: *      PCOPY -- COPY A PATTERN NODE
                   18293: *
                   18294: *      PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
                   18295: *      PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
                   18296: *      HAS NOT BEEN COPIED ALREADY.
                   18297: *
                   18298: *      (XR)                  POINTER TO NODE TO BE COPIED
                   18299: *      (XT)                  PTR TO CURRENT LOC IN COPY LIST
                   18300: *      (WC)                  POINTER TO LIST OF COPIED NODES
                   18301: *      JSR  PCOPY            CALL TO COPY A NODE
                   18302: *      (WA)                  POINTER TO COPY
                   18303: *      (WB,XR)               DESTROYED
                   18304: *
                   18305: PCOPY  PRC  N,0              ENTRY POINT
                   18306:        MOV  XT,WB            SAVE XT
                   18307:        MOV  WC,XT            POINT TO START OF LIST
                   18308: *
                   18309: *      LOOP TO SEARCH LIST OF NODES COPIED ALREADY
                   18310: *
                   18311: PCOP1  DCA  XT               POINT TO NEXT ENTRY ON LIST
                   18312:        BEQ  XR,(XT),PCOP2    JUMP IF MATCH
                   18313:        DCA  XT               ELSE SKIP OVER COPIED ADDRESS
                   18314:        BNE  XT,XS,PCOP1      LOOP BACK IF MORE TO TEST
                   18315: *
                   18316: *      HERE IF NOT IN LIST, PERFORM COPY
                   18317: *
                   18318:        MOV  (XR),WA          LOAD FIRST WORD OF BLOCK
                   18319:        JSR  BLKLN            GET LENGTH OF BLOCK
                   18320:        MOV  XR,XL            SAVE POINTER TO OLD NODE
                   18321:        JSR  ALLOC            ALLOCATE SPACE FOR COPY
                   18322:        MOV  XL,-(XS)         STORE OLD ADDRESS ON LIST
                   18323:        MOV  XR,-(XS)         STORE NEW ADDRESS ON LIST
                   18324:        CHK                   CHECK FOR STACK OVERFLOW
                   18325:        MVW                   MOVE WORDS FROM OLD BLOCK TO COPY
                   18326:        MOV  (XS),WA          LOAD POINTER TO COPY
                   18327:        BRN  PCOP3            JUMP TO EXIT
                   18328: *
                   18329: *      HERE IF WE FIND ENTRY IN LIST
                   18330: *
                   18331: PCOP2  MOV  -(XT),WA         LOAD ADDRESS OF COPY FROM LIST
                   18332: *
                   18333: *      COMMON EXIT POINT
                   18334: *
                   18335: PCOP3  MOV  WB,XT            RESTORE XT
                   18336:        EXI                   RETURN TO PCOPY CALLER
                   18337:        ENP                   END PROCEDURE PCOPY
                   18338: .IF    .CNPF
                   18339: .ELSE
                   18340:        EJC
                   18341: *
                   18342: *      PRFLR -- PRINT PROFILE
                   18343: *      PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
                   18344: *      TABLE IN A FAIRLY READABLE TABULAR FORMAT.
                   18345: *
                   18346: *      JSR  PRFLR            CALL TO PRINT PROFILE
                   18347: *      (WA,IA)               DESTROYED
                   18348: *
                   18349: PRFLR  PRC  E,0
                   18350:        BZE  PFDMP,PRFL4      NO PRINTING IF NO PROFILING DONE
                   18351:        MOV  XR,-(XS)         PRESERVE ENTRY XR
                   18352:        MOV  WB,PFSVW         AND ALSO WB
                   18353:        JSR  PRTPG            EJECT
                   18354:        MOV  =PFMS1,XR        LOAD MSG /PROGRAM PROFILE/
                   18355:        JSR  PRTFB            AND PRINT IT
                   18356:        MOV  =PFMS2,XR        POINT TO FIRST HDR
                   18357:        JSR  PRTSF            PRINT IT
                   18358:        MOV  =PFMS3,XR        SECOND HDR
                   18359:        JSR  PRTFB
                   18360:        ZER  WB               INITIAL STMT COUNT
                   18361:        MOV  PFTBL,XR         POINT TO TABLE ORIGIN
                   18362:        ADD  *NUM02,XR        BIASS PAST XNBLK HEADER
                   18363:        EJC
                   18364: *
                   18365: *      PRFLR (CONTINUED)
                   18366: *
                   18367: *      LOOP FOR PRINTING TABLE ENTRIES
                   18368: *
                   18369: PRFL1  ICV  WB               BUMP STMT NR
                   18370:        LDI  (XR)             LOAD NR OF EXECUTIONS
                   18371:        IEQ  PRFL3            NO PRINTING IF ZERO
                   18372:        MOV  =PFPD1,PROFS     POINT WHERE TO PRINT
                   18373:        JSR  PRTIN            AND PRINT IT
                   18374:        ZER  PROFS            BACK TO START OF LINE
                   18375:        MTI  WB               LOAD STMT NR
                   18376:        JSR  PRTIN            PRINT IT THERE
                   18377:        MOV  =PFPD2,PROFS     AND PAD PAST COUNT
                   18378:        LDI  CFP$I(XR)        LOAD TOTAL EXEC TIME
                   18379:        JSR  PRTIN            PRINT THAT TOO
                   18380:        LDI  CFP$I(XR)        RELOAD TIME
                   18381:        MLI  INTTH            CONVERT TO MICROSEC
                   18382:        IOV  PRFL2            OMIT NEXT BIT IF OVERFLOW
                   18383:        DVI  (XR)             DIVIDE BY EXECUTIONS
                   18384:        MOV  =PFPD3,PROFS     PAD LAST PRINT
                   18385:        JSR  PRTIN            AND PRINT MCSEC/EXECN
                   18386: *
                   18387: *      PRINT A BLANK
                   18388: *
                   18389: PRFL2  JSR  PRTFH            THATS ANOTHER LINE
                   18390: *
                   18391: *      TEST TO SEE IF LOOP FINISHED
                   18392: *
                   18393: PRFL3  ADD  *PF$I2,XR        BUMP INDEX POINTER
                   18394:        BLT  WB,PFNTE,PRFL1   LOOP IF MORE STMTS
                   18395:        MOV  (XS)+,XR         RESTORE CALLERS XR
                   18396:        MOV  PFSVW,WB         AND WB TOO
                   18397: *
                   18398: *      RETURN POINT
                   18399: *
                   18400: PRFL4  EXI                   RETURN
                   18401:        ENP                   END OF PRFLR
                   18402:        EJC
                   18403: *
                   18404: *      PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
                   18405: *
                   18406: *      ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
                   18407: *
                   18408: *      JSR  PRFLU            CALL TO UPDATE ENTRY
                   18409: *      (IA)                  DESTROYED
                   18410: *
                   18411: PRFLU  PRC  E,0
                   18412:        BNZ  PFFNC,PFLU4      SKIP IF JUST ENTERED FUNCTION
                   18413:        MOV  XR,-(XS)         PRESERVE ENTRY XR
                   18414:        MOV  WA,PFSVW         SAVE WA
                   18415:        BNZ  PFTBL,PFLU2      BRANCH IF TABLE ALLOCATED
                   18416: *
                   18417: *      HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
                   18418: *      CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
                   18419: *      INITIALIZE IT ALL TO ZERO.
                   18420: *      THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
                   18421: *      STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
                   18422: *      TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
                   18423: *      DOESNT REALLY MATTER...
                   18424: *
                   18425:        SUB  =NUM01,PFNTE     ADJUST FOR EXTRA COUNT
                   18426:        MTI  PFI2A            CONVRT ENTRY SIZE TO INT
                   18427:        STI  PFSTE            AND STORE SAFELY FOR LATER
                   18428:        MTI  PFNTE            LOAD TABLE LENGTH AS INTEGER
                   18429:        MLI  PFSTE            MULTIPLY BY ENTRY SIZE
                   18430:        MFI  WA               GET BACK ADDRESS-STYLE
                   18431:        ADD  =NUM02,WA        ADD ON 2 WORD OVERHEAD
                   18432:        WTB  WA               CONVERT THE WHOLE LOT TO BYTES
                   18433:        JSR  ALOST            GIMME THE SPACE
                   18434:        MOV  XR,PFTBL         SAVE BLOCK POINTER
                   18435:        MOV  =B$XNT,(XR)+     PUT BLOCK TYPE AND ...
                   18436:        MOV  WA,(XR)+         ... LENGTH INTO HEADER
                   18437:        MFI  WA               GET BACK NR OF WDS IN DATA AREA
                   18438:        LCT  WA,WA            LOAD THE COUNTER
                   18439: *
                   18440: *      LOOP HERE TO ZERO THE BLOCK DATA
                   18441: *
                   18442: PFLU1  ZER  (XR)+            BLANK A WORD
                   18443:        BCT  WA,PFLU1         AND ALL THE REST
                   18444:        EJC
                   18445: *
                   18446: *      PRFLU (CONTINUED)
                   18447: *
                   18448: *      END OF ALLOCATION. MERGE BACK INTO ROUTINE
                   18449: *
                   18450: PFLU2  MTI  KVSTN            LOAD NR OF STMT JUST ENDED
                   18451:        SBI  INTV1            MAKE INTO INDEX OFFSET
                   18452:        MLI  PFSTE            MAKE OFFSET OF TABLE ENTRY
                   18453:        MFI  WA               CONVERT TO ADDRESS
                   18454:        WTB  WA               GET AS BAUS
                   18455:        ADD  *NUM02,WA        OFFSET INCLUDES TABLE HEADER
                   18456:        MOV  PFTBL,XR         GET TABLE START
                   18457:        BGE  WA,NUM01(XR),PFLU3  IF OUT OF TABLE, SKIP IT
                   18458:        ADD  WA,XR            ELSE POINT TO ENTRY
                   18459:        LDI  (XR)             GET NR OF EXECUTIONS SO FAR
                   18460:        ADI  INTV1            NUDGE UP ONE
                   18461:        STI  (XR)             AND PUT BACK
                   18462:        JSR  SYSTM            GET TIME NOW
                   18463:        STI  PFETM            STASH ENDING TIME
                   18464:        SBI  PFSTM            SUBTRACT START TIME
                   18465:        ADI  CFP$I(XR)        ADD CUMULATIVE TIME SO FAR
                   18466:        STI  CFP$I(XR)        AND PUT BACK NEW TOTAL
                   18467:        LDI  PFETM            LOAD END TIME OF THIS STMT ...
                   18468:        STI  PFSTM            ... WHICH IS START TIME OF NEXT
                   18469: *
                   18470: *      RETURN POINT
                   18471: *
                   18472: PFLU3  MOV  (XS)+,XR         RESTORE CALLERS XR
                   18473:        MOV  PFSVW,WA         RESTORE WA
                   18474:        EXI                   AND RETURN
                   18475: *
                   18476: *      HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
                   18477: *      FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
                   18478: *      HAS NOT YET FINISHED
                   18479: *
                   18480: PFLU4  ZER  PFFNC            RESET THE CONDITION FLAG
                   18481:        EXI                   AND IMMEDIATE RETURN
                   18482:        ENP                   END OF PROCEDURE PRFLU
                   18483: .FI
                   18484:        EJC
                   18485: *
                   18486: *      PRPAR -- PROCESS PRINT PARAMETERS
                   18487: *
                   18488: *      JSR  PRPAR            CALL TO PROCESS PRINT PARAMETERS
                   18489: *      (XR,WA,WB,WC)         DESTROYED
                   18490: *
                   18491: PRPAR  PRC  E,0              ENTRY POINT
                   18492:        MOV  XL,-(XS)         SAVE XL
                   18493:        JSR  SYSPP            GET PRINT PARAMETERS
                   18494:        BNZ  WB,PRPA1         JUMP IF LINES/PAGE SPECIFIED
                   18495:        MOV  =CFP$M,WB        ELSE USE A LARGE VALUE
                   18496:        RSH  WB,1             BUT NOT TOO LARGE
                   18497: *
                   18498: *      STORE LINE COUNT/PAGE
                   18499: *
                   18500: PRPA1  MOV  WB,LSTNP         STORE NUMBER OF LINES/PAGE
                   18501:        MOV  WB,LSTLC         PRETEND PAGE IS FULL INITIALLY
                   18502:        ZER  LSTPG            CLEAR PAGE NUMBER
                   18503:        BZE  PRLEN,PRPA2      SKIP IF NOT SYSXI RESUMPTION
                   18504:        BHI  WA,PRLEN,PRPA3   SKIP IF BIGGER THAN PRIOR BFRS
                   18505: *
                   18506: *      STORE PRINT BUFFER LENGTH
                   18507: *
                   18508: PRPA2  MOV  WA,PRLEN         STORE VALUE
                   18509: *
                   18510: *      CHECK TERMINAL BUFFER SIZE
                   18511: *
                   18512: PRPA3  BZE  TTLEN,PRPA4      SKIP IF NOT SYSXI RESUMPTION
                   18513:        BHI  XL,TTLEN,PRPA5   SKIP IF TOO BIG
                   18514: *
                   18515: *      STORE TERMINAL BUFFER LENGTH
                   18516: *
                   18517: PRPA4  MOV  XL,TTLEN         BFR LENGTH
                   18518: *
                   18519: *      PROCESS BITS OPTIONS
                   18520: *
                   18521: PRPA5  MOV  BITS1,WB         BIT 1 MASK
                   18522:        ANB  WC,WB            GET BIT
                   18523:        MOV  WB,TTINS         INPUT FROM TERMINAL FLAG
                   18524:        MOV  BITS2,WB         BIT 2 MASK
                   18525:        ANB  WC,WB            GET BIT
                   18526:        MOV  WB,TTOUS         STD OUTPUT TO TERMINAL FLAG
                   18527:        MOV  TTLEN,TTERL      ERRORS TO TERML IF AVAILABLE
                   18528:        MOV  PRLEN,PRAVL      NOTE IF A PRINT FILE IS AVAILABLE
                   18529:        ZRB  WB,PRPA6         IF FLAG SET, CLEAR TTERL SINCE ...
                   18530:        ZER  TTERL            ... TERML GETS ALL OUTPUT ALREADY
                   18531:        MOV  TTLEN,TTOUS      REGULAR O/P TO TERML IF AVAILABLE
                   18532:        MOV  TTLEN,PRLEN      REVISED PRINT BUFFER LENGTH
                   18533:        ZER  TTLEN            DONT NEED SEPARATE TERML BUFFER
                   18534:        EJC
                   18535: *
                   18536: *      PRPAR (CONTINUED)
                   18537: *
                   18538: *      GET OFFSET TO /PAGE NN/ PART OF HEADER
                   18539: *
                   18540: PRPA6  MOV  PRLEN,WA         STD BFR LENGTH
                   18541:        BNZ  WA,PRPA7         USE IF NON-ZERO
                   18542:        MOV  TTLEN,WA         ELSE TRY TERMINAL
                   18543:        BZE  WA,PRPA8         GIVE UP IF ZERO ALSO
                   18544: *
                   18545: *      GET OFFSET
                   18546: *
                   18547: PRPA7  MOV  WA,PRLEN         STORE AS BUFFER LENGTH
                   18548:        SUB  =NUM08,WA        JUST BEFORE END OF LINE
                   18549:        MOV  WA,LSTPO         KEEP IT
                   18550:        MOV  TTOUS,WB         CONSTRUCT VALUE FOR ...
                   18551:        ORB  PRAVL,WB         ... USE IN DECIDING WHETHER TO ...
                   18552:        MOV  WB,PRPUT         ... PUT STRINGS IN OUTPUT BUFFER
                   18553: *
                   18554: *      MORE BITS
                   18555: *
                   18556: PRPA8  MOV  BITS3,WB         BIT 3 MASK
                   18557:        ANB  WC,WB            GET -NOLIST BIT
                   18558:        ZRB  WB,PRPA9         SKIP IF CLEAR
                   18559:        ZER  CSWLS            SET -NOLIST
                   18560: *
                   18561: *      MORE BITS
                   18562: *
                   18563: PRPA9  MOV  BITS4,WB         BIT 4 MASK
                   18564:        ANB  WC,WB            GET BIT
                   18565:        MOV  WB,CPSTS         FLAG FOR COMPILE STATS SUPPRESSN.
                   18566:        MOV  BITS5,WB         BIT 5 MASK
                   18567:        ANB  WC,WB            GET BIT
                   18568:        MOV  WB,EXSTS         FLAG FOR EXEC STATS SUPPRESSION
                   18569:        MOV  BITS6,WB         BIT 6 MASK
                   18570:        ANB  WC,WB            GET BIT
                   18571:        MOV  WB,NOXEQ         SET NOEXECUTE IF NON-ZERO
                   18572:        MOV  BITS7,WB         BIT 7 MASK
                   18573:        ANB  WC,WB            GET BIT
                   18574:        ZRB  WB,PRP10         SKIP IF NOT SET
                   18575:        ZER  TTERL            CLEAR ERRORS TO TERML IF SET
                   18576: *
                   18577: *      MORE BITS
                   18578: *
                   18579: PRP10  MOV  BITS8,WB         BIT 8 MASK
                   18580:        ANB  WC,WB            GET BIT
                   18581:        MOV  WB,HEADN         SYSID HEADERS INCLUDE/OMIT FLAG
                   18582:        MOV  BITS9,WB         BIT 9 MASK
                   18583:        ANB  WC,WB            GET BIT
                   18584:        MOV  WB,PRSTO         STANDARD LISTING FLAG
                   18585:        MOV  BIT10,WB         BIT 10 MASK
                   18586:        ANB  WC,WB            GET BIT
                   18587:        MOV  WB,PRECL         EXTENDED LISTING OPTION
                   18588:        MOV  (XS)+,XL         RESTORE XL
                   18589:        EXI                   RETURN
                   18590:        ENP                   END PROCEDURE PRPAR
                   18591:        EJC
                   18592: *
                   18593: *      PRTCF -- PRINT CHAR TO STD PRINTER AND FLUSH BFR
                   18594: *
                   18595: *      (WA)                  CHAR TO PRINT
                   18596: *      JSR  PRTCF            CALL TO PRINT AND FLUSH
                   18597: *
                   18598: PRTCF  PRC  E,0              ENTRY POINT
                   18599:        JSR  PRTCH            PRINT CHARACTER
                   18600:        JSR  PRTFH            FLUSH BUFFER
                   18601:        EXI                   RETURN TO CALLER
                   18602:        ENP                   END PROCEDURE PRTCF
                   18603: *
                   18604: *      PRTCH -- PRINT A CHARACTER ON STANDARD PRINTER
                   18605: *
                   18606: *      PRTCH IS USED TO PRINT A SINGLE CHARACTER
                   18607: *
                   18608: *      (WA)                  CHARACTER TO BE PRINTED
                   18609: *      JSR  PRTCH            CALL TO PRINT CHARACTER
                   18610: *
                   18611: PRTCH  PRC  E,0              ENTRY POINT
                   18612:        BZE  PRLEN,PTCH2      SKIP IF NO PRINT FILE
                   18613:        MOV  XR,-(XS)         SAVE XR
                   18614:        BNE  PROFS,PRLEN,PTCH1 JUMP IF ROOM IN BUFFER
                   18615:        JSR  PRTFH            ELSE PRINT THIS LINE
                   18616: *
                   18617: *      HERE AFTER MAKING SURE WE HAVE ROOM
                   18618: *
                   18619: PTCH1  MOV  PRBUF,XR         POINT TO PRINT BUFFER
                   18620:        PSC  XR,PROFS         POINT TO NEXT CHARACTER LOCATION
                   18621:        SCH  WA,(XR)          STORE NEW CHARACTER
                   18622:        CSC  XR               COMPLETE STORE CHARACTERS
                   18623:        ICV  PROFS            BUMP POINTER
                   18624:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   18625: *
                   18626: *      RETURN POINT
                   18627: *
                   18628: PTCH2  EXI                   RETURN TO PRTCH CALLER
                   18629:        ENP                   END PROCEDURE PRTCH
                   18630: *
                   18631: *      PRTFB -- PRINT STRING, FLUSH BFR AND PRINT BLANK LINE
                   18632: *
                   18633: *      (XR)                  STRING TO PRINT
                   18634: *      JSR  PRTFB            CALL FOR PRINT FLUSH AND BLANK
                   18635: *
                   18636: PRTFB  PRC  E,0              ENTRY POINT
                   18637:        JSR  PRTSF            PRINT AND FLUSH
                   18638:        JSR  PRTFH            PRINT BLANK
                   18639:        EXI                   RETURN TO CALLER
                   18640:        ENP                   END PROCEDURE PRTFB
                   18641:        EJC
                   18642: *
                   18643: *      PRTFH -- FLUSH STANDARD PRINT BUFFER
                   18644: *
                   18645: *      PRTFH PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
                   18646: *      THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
                   18647: *      ON ITS FIRST CALL IT MAY PRINT LISTING HEADERS.
                   18648: *      IF TTLST IS NON-ZERO, IT COPIES PRINT BUFFER TO
                   18649: *      TERMINAL AND FLUSHES THIS ALSO.
                   18650: *
                   18651: *      JSR  PRTFH            CALL TO FLUSH BUFFER
                   18652: *
                   18653: PRTFH  PRC  R,0              ENTRY POINT
                   18654:        BNZ  HEADP,PTFH1      WERE HEADERS PRINTED
                   18655:        JSR  PRTPS            NO - PRINT THEM
                   18656: *
                   18657: *      HEADERS DONE
                   18658: *
                   18659: PTFH1  BZE  PRLEN,PTFH4      SKIP IF NO OUTPUT POSSIBLE
                   18660:        MOV  XL,-(XS)         SAVE XL
                   18661:        MOV  XR,-(XS)         SAVE XR
                   18662:        MOV  WA,-(XS)         SAVE WA
                   18663:        MOV  WC,-(XS)         SAVE WC
                   18664:        MOV  PRBUF,XR         LOAD POINTER TO BUFFER
                   18665:        MOV  PROFS,WC         LOAD NUMBER OF CHARS IN BUFFER
                   18666:        BNZ  PRAVL,PTFH5      SKIP IF PRINT FILE AVAILABLE
                   18667:        BNZ  TTOUS,PTFH2      SKIP IF STD OUTPUT TO TERML
                   18668:        BZE  TTLST,PTFH3      LAST POSSIBILITY IS ERROR TO TERML
                   18669: *
                   18670: *       SEND TO TERMINAL
                   18671: *
                   18672: PTFH2  JSR  SYSPI            PRINT TO TERMINAL
                   18673:        PPM  PTFH6            FAIL
                   18674:        PPM  EROSI            ERROR
                   18675:        EJC
                   18676: *      PRTFH (CONTINUED)
                   18677: *
                   18678: *      BLANK BUFFER
                   18679: *
                   18680: PTFH3  MOV  PRBLK,XL         POINT TO BLANKING STRING
                   18681:        MOV  PRCHS,XR         POINT TO BUFFER
                   18682:        MOV  PRCMV,WA         COUNT OF BAUS TO MOVE
                   18683:        MVW                   MOVE BLANKS INTO BUFFER
                   18684:        ZER  PROFS            RESET OFFSET
                   18685:        MOV  (XS)+,WC         RESTORE WC
                   18686:        MOV  (XS)+,WA         RECOVER WA
                   18687:        MOV  (XS)+,XR         RESTORE XR
                   18688:        MOV  (XS)+,XL         RESTORE XL
                   18689: *
                   18690: *      RETURN POINT
                   18691: *
                   18692: PTFH4  EXI                   RETURN TO CALLER
                   18693: *
                   18694: *      HERE FOR REGULAR PRINT FILE
                   18695: *
                   18696: PTFH5  JSR  SYSPR            CALL SYSTEM PRINT ROUTINE
                   18697:        PPM  PTFH6            JUMP IF FAILED
                   18698:        PPM  EROSI            STOP IF ERROR
                   18699:        BZE  TTLST,PTFH3      SKIP IF NO COPY TO TERMINAL
                   18700:        MOV  PROFS,SCLEN(XR)  SET STRING LENGTH FOR PTTST
                   18701:        JSR  PTTST            COPY STD BUFFER TO TERML BFR
                   18702:        JSR  PTTFH            FLUSH IT
                   18703:        MOV  PRLEN,SCLEN(XR)  RESTORE BUFFER LENGTH
                   18704:        BRN  PTFH3            MERGE
                   18705: *
                   18706: *      A FAILURE SUCH AS FILE OVERFILLED OCCURRED
                   18707: *
                   18708: PTFH6  BZE  STAGX,PTFH3      IGNORE IF COMPILE TIME
                   18709:        BRN  EXFAL            ELSE CAUSE STMT FAILURE
                   18710:        ENP                   END PROCEDURE PRTFH
                   18711:        EJC
                   18712: *
                   18713: *      PRTIN -- PRINT AN INTEGER
                   18714: *
                   18715: *      PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
                   18716: *      ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
                   18717: *      DURING THIS PROCESS ARE IMMEDIATELY DELETED.
                   18718: *
                   18719: *      (IA)                  INTEGER VALUE TO BE PRINTED
                   18720: *      JSR  PRTIN            CALL TO PRINT INTEGER
                   18721: *      (IA,RA)               DESTROYED
                   18722: *
                   18723: PRTIN  PRC  E,0              ENTRY POINT
                   18724:        MOV  XR,-(XS)         SAVE XR
                   18725:        JSR  ICBLD            BUILD INTEGER BLOCK
                   18726:        BLO  XR,DNAMB,PRTI1   JUMP IF ICBLK BELOW DYNAMIC
                   18727:        BHI  XR,DNAMP,PRTI1   JUMP IF ABOVE DYNAMIC
                   18728:        MOV  XR,DNAMP         IMMEDIATELY DELETE IT
                   18729: *
                   18730: *      DELETE ICBLK FROM DYNAMIC STORE
                   18731: *
                   18732: PRTI1  MOV  XR,-(XS)         STACK PTR FOR GTSTG
                   18733:        JSR  GTSTG            CONVERT TO STRING
                   18734:        PPM                   CONVERT ERROR IS IMPOSSIBLE
                   18735:        MOV  XR,DNAMP         RESET POINTER TO DELETE SCBLK
                   18736:        JSR  PRTST            PRINT INTEGER STRING
                   18737:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   18738:        EXI                   RETURN TO PRTIN CALLER
                   18739:        ENP                   END PROCEDURE PRTIN
                   18740: *
                   18741: *      PRTMI -- PRINT MESSAGE AND INTEGER
                   18742: *
                   18743: *      PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
                   18744: *      VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
                   18745: *      THE END OF COMPILATION).
                   18746: *
                   18747: *      JSR  PRTMI            CALL TO PRINT MESSAGE AND INTEGER
                   18748: *
                   18749: PRTMI  PRC  E,0              ENTRY POINT
                   18750:        JSR  PRTST            PRINT STRING MESSAGE
                   18751:        MOV  =PRTMF,PROFS     SET OFFSET TO COL 15
                   18752:        JSR  PRTIN            PRINT INTEGER
                   18753:        JSR  PRTFH            PRINT LINE
                   18754:        EXI                   RETURN TO PRTMI CALLER
                   18755:        ENP                   END PROCEDURE PRTMI
                   18756:        EJC
                   18757: *
                   18758: *      PRTNM -- PRINT VARIABLE NAME
                   18759: *
                   18760: *      PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
                   18761: *      NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
                   18762: *      NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
                   18763: *
                   18764: *      (XL)                  NAME BASE
                   18765: *      (WA)                  NAME OFFSET
                   18766: *      JSR  PRTNM            CALL TO PRINT NAME
                   18767: *      (WB,WC,RA)            DESTROYED
                   18768: *
                   18769: PRTNM  PRC  R,0              ENTRY POINT (RECURSIVE, SEE PRTVL)
                   18770:        MOV  WA,-(XS)         SAVE WA (OFFSET IS COLLECTABLE)
                   18771:        MOV  XR,-(XS)         SAVE ENTRY XR
                   18772:        MOV  XL,-(XS)         SAVE NAME BASE
                   18773:        BHI  XL,STATE,PRN02   JUMP IF NOT NATURAL VARIABLE
                   18774: *
                   18775: *      HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
                   18776: *      THAT THE NAME BASE POINTS INTO THE STATIC AREA.
                   18777: *
                   18778:        MOV  XL,XR            POINT TO VRBLK
                   18779:        JSR  PRTVN            PRINT NAME OF VARIABLE
                   18780: *
                   18781: *      COMMON EXIT POINT
                   18782: *
                   18783: PRN01  MOV  (XS)+,XL         RESTORE NAME BASE
                   18784:        MOV  (XS)+,XR         RESTORE ENTRY VALUE OF XR
                   18785:        MOV  (XS)+,WA         RESTORE WA
                   18786:        EXI                   RETURN TO PRTNM CALLER
                   18787: *
                   18788: *      HERE FOR CASE OF NON-NATURAL VARIABLE
                   18789: *
                   18790: PRN02  MOV  WA,WB            COPY NAME OFFSET
                   18791:        BNE  (XL),=B$PDT,PRN03 JUMP IF ARRAY OR TABLE
                   18792: *
                   18793: *      FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
                   18794: *
                   18795:        MOV  PDDFP(XL),XR     LOAD POINTER TO DFBLK
                   18796:        ADD  WA,XR            ADD NAME OFFSET
                   18797:        MOV  PDFOF(XR),XR     LOAD VRBLK POINTER FOR FIELD
                   18798:        JSR  PRTVN            PRINT FIELD NAME
                   18799:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   18800:        JSR  PRTCH            PRINT CHARACTER
                   18801:        EJC
                   18802: *
                   18803: *      PRTNM (CONTINUED)
                   18804: *
                   18805: *      NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
                   18806: *      CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
                   18807: *      VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
                   18808: *      VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
                   18809: *      OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
                   18810: *
                   18811: *      FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
                   18812: *      A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
                   18813: *
                   18814: PRN03  BNE  (XL),=B$TET,PRN04 JUMP IF WE GOT THERE (OR NOT TE)
                   18815:        MOV  TENXT(XL),XL     ELSE MOVE OUT ON CHAIN
                   18816:        BRN  PRN03            AND LOOP BACK
                   18817: *
                   18818: *      NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
                   18819: *      THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
                   18820: *      WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
                   18821: *      WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
                   18822: *      FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
                   18823: *
                   18824: PRN04  MOV  PRNMV,XR         POINT TO VRBLK WE FOUND LAST TIME
                   18825:        MOV  HSHTB,WA         POINT TO HASH TABLE IN CASE NOT
                   18826:        BRN  PRN07            JUMP INTO SEARCH FOR SPECIAL CHECK
                   18827: *
                   18828: *      LOOP THROUGH HASH SLOTS
                   18829: *
                   18830: PRN05  MOV  WA,XR            COPY SLOT POINTER
                   18831:        ICA  WA               BUMP SLOT POINTER
                   18832:        SUB  *VRNXT,XR        INTRODUCE STANDARD VRBLK OFFSET
                   18833: *
                   18834: *      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
                   18835: *
                   18836: PRN06  MOV  VRNXT(XR),XR     POINT TO NEXT VRBLK ON HASH CHAIN
                   18837: *
                   18838: *      MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
                   18839: *
                   18840: PRN07  MOV  XR,WC            COPY VRBLK POINTER
                   18841:        BZE  WC,PRN09         JUMP IF CHAIN END (OR PRNMV ZERO)
                   18842:        EJC
                   18843: *
                   18844: *      PRTNM (CONTINUED)
                   18845: *
                   18846: *      LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
                   18847: *
                   18848: PRN08  MOV  VRVAL(XR),XR     LOAD VALUE
                   18849:        BEQ  (XR),=B$TRT,PRN08 LOOP IF THAT WAS A TRBLK
                   18850: *
                   18851: *      NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
                   18852: *
                   18853:        BEQ  XR,XL,PRN10      JUMP IF THIS MATCHES THE NAME BASE
                   18854:        MOV  WC,XR            ELSE POINT BACK TO THAT VRBLK
                   18855:        BRN  PRN06            AND LOOP BACK
                   18856: *
                   18857: *      HERE TO MOVE TO NEXT HASH SLOT
                   18858: *
                   18859: PRN09  BLT  WA,HSHTE,PRN05   LOOP BACK IF MORE TO GO
                   18860:        MOV  XL,XR            ELSE NOT FOUND, COPY VALUE POINTER
                   18861:        JSR  PRTVL            PRINT VALUE
                   18862:        BRN  PRN11            AND MERGE AHEAD
                   18863: *
                   18864: *      HERE WHEN WE FIND A MATCHING ENTRY
                   18865: *
                   18866: PRN10  MOV  WC,XR            COPY VRBLK POINTER
                   18867:        MOV  XR,PRNMV         SAVE FOR NEXT TIME IN
                   18868:        JSR  PRTVN            PRINT VARIABLE NAME
                   18869: *
                   18870: *      MERGE HERE IF NO ENTRY FOUND
                   18871: *
                   18872: PRN11  MOV  (XL),WC          LOAD FIRST WORD OF NAME BASE
                   18873:        BNE  WC,=B$PDT,PRN13  JUMP IF NOT PROGRAM DEFINED
                   18874: *
                   18875: *      FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
                   18876: *
                   18877:        MOV  =CH$RP,WA        LOAD RIGHT PAREN, MERGE
                   18878: *
                   18879: *      MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
                   18880: *
                   18881: PRN12  JSR  PRTCH            PRINT FINAL CHARACTER
                   18882:        MOV  WB,WA            RESTORE NAME OFFSET
                   18883:        BRN  PRN01            MERGE BACK TO EXIT
                   18884:        EJC
                   18885: *
                   18886: *      PRTNM (CONTINUED)
                   18887: *
                   18888: *      HERE FOR ARRAY OR TABLE
                   18889: *
                   18890: PRN13  MOV  =CH$BB,WA        LOAD LEFT BRACKET
                   18891:        JSR  PRTCH            AND PRINT IT
                   18892:        MOV  (XS),XL          RESTORE BLOCK POINTER
                   18893:        MOV  (XL),WC          LOAD TYPE WORD AGAIN
                   18894:        BNE  WC,=B$TET,PRN15  JUMP IF NOT TABLE
                   18895: *
                   18896: *      HERE FOR TABLE, PRINT SUBSCRIPT VALUE
                   18897: *
                   18898:        MOV  TESUB(XL),XR     LOAD SUBSCRIPT VALUE
                   18899:        MOV  WB,XL            SAVE NAME OFFSET
                   18900:        JSR  PRTVL            PRINT SUBSCRIPT VALUE
                   18901:        MOV  XL,WB            RESTORE NAME OFFSET
                   18902: *
                   18903: *      MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
                   18904: *
                   18905: PRN14  MOV  =CH$RB,WA        LOAD RIGHT BRACKET
                   18906:        BRN  PRN12            MERGE BACK TO PRINT IT
                   18907: *
                   18908: *      HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
                   18909: *
                   18910: PRN15  MOV  WB,WA            COPY NAME OFFSET
                   18911:        BTW  WA               CONVERT TO WORDS
                   18912:        BEQ  WC,=B$ART,PRN16  JUMP IF ARBLK
                   18913: *
                   18914: *      HERE FOR VECTOR
                   18915: *
                   18916:        SUB  =VCVLB,WA        ADJUST FOR STANDARD FIELDS
                   18917:        MTI  WA               MOVE TO INTEGER ACCUM
                   18918:        JSR  PRTIN            PRINT LINEAR SUBSCRIPT
                   18919:        BRN  PRN14            MERGE BACK FOR RIGHT BRACKET
                   18920:        EJC
                   18921: *
                   18922: *      PRTNM (CONTINUED)
                   18923: *
                   18924: *      HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
                   18925: *      OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
                   18926: *      THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
                   18927: *      STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
                   18928: *
                   18929: PRN16  MOV  AROFS(XL),WC     LOAD LENGTH OF BOUNDS INFO
                   18930:        ICA  WC               ADJUST FOR ARPRO FIELD
                   18931:        BTW  WC               CONVERT TO WORDS
                   18932:        SUB  WC,WA            GET LINEAR ZERO-ORIGIN SUBSCRIPT
                   18933:        MTI  WA               GET INTEGER VALUE
                   18934:        LCT  WA,ARNDM(XL)     SET NUM OF DIMENSIONS AS LOOP COUNT
                   18935:        ADD  AROFS(XL),XL     POINT PAST BOUNDS INFORMATION
                   18936:        SUB  *ARLBD,XL        SET OK OFFSET FOR PROPER PTR LATER
                   18937: *
                   18938: *      LOOP TO STACK SUBSCRIPT OFFSETS
                   18939: *
                   18940: PRN17  SUB  *ARDMS,XL        POINT TO NEXT SET OF BOUNDS
                   18941:        STI  PRNSI            SAVE CURRENT OFFSET
                   18942:        RMI  ARDIM(XL)        GET REMAINDER ON DIVIDING BY DIMENS
                   18943:        MFI  -(XS)            STORE ON STACK (ONE WORD)
                   18944:        LDI  PRNSI            RELOAD ARGUMENT
                   18945:        DVI  ARDIM(XL)        DIVIDE TO GET QUOTIENT
                   18946:        BCT  WA,PRN17         LOOP TILL ALL STACKED
                   18947:        ZER  XR               SET OFFSET TO FIRST SET OF BOUNDS
                   18948:        LCT  WB,ARNDM(XL)     LOAD COUNT OF DIMS TO CONTROL LOOP
                   18949:        BRN  PRN19            JUMP INTO PRINT LOOP
                   18950: *
                   18951: *      LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
                   18952: *      THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
                   18953: *
                   18954: PRN18  MOV  =CH$CM,WA        LOAD A COMMA
                   18955:        JSR  PRTCH            PRINT IT
                   18956: *
                   18957: *      MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
                   18958: *
                   18959: PRN19  MTI  (XS)+            LOAD SUBSCRIPT OFFSET AS INTEGER
                   18960:        ADD  XR,XL            POINT TO CURRENT LBD
                   18961:        ADI  ARLBD(XL)        ADD LBD TO GET SIGNED SUBSCRIPT
                   18962:        SUB  XR,XL            POINT BACK TO START OF ARBLK
                   18963:        JSR  PRTIN            PRINT SUBSCRIPT
                   18964:        ADD  *ARDMS,XR        BUMP OFFSET TO NEXT BOUNDS
                   18965:        BCT  WB,PRN18         LOOP BACK TILL ALL PRINTED
                   18966:        BRN  PRN14            MERGE BACK TO PRINT RIGHT BRACKET
                   18967:        ENP                   END PROCEDURE PRTNM
                   18968:        EJC
                   18969: *
                   18970: *      PRTNV -- PRINT NAME VALUE
                   18971: *
                   18972: *      PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
                   18973: *      A LINE OF THE FORM
                   18974: *
                   18975: *      NAME = VALUE
                   18976: *
                   18977: *      NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
                   18978: *
                   18979: *      (XL)                  NAME BASE
                   18980: *      (WA)                  NAME OFFSET
                   18981: *      JSR  PRTNV            CALL TO PRINT NAME = VALUE
                   18982: *      (WB,WC,RA)            DESTROYED
                   18983: *
                   18984: PRTNV  PRC  E,0              ENTRY POINT
                   18985:        JSR  PRTNM            PRINT ARGUMENT NAME
                   18986:        MOV  XR,-(XS)         SAVE ENTRY XR
                   18987:        MOV  WA,-(XS)         SAVE NAME OFFSET (COLLECTABLE)
                   18988:        MOV  =TMBEB,XR        POINT TO BLANK EQUAL BLANK
                   18989:        JSR  PRTST            PRINT IT
                   18990:        MOV  XL,XR            COPY NAME BASE
                   18991:        ADD  WA,XR            POINT TO VALUE
                   18992:        MOV  (XR),XR          LOAD VALUE POINTER
                   18993:        JSR  PRTVF            PRINT VALUE
                   18994:        MOV  (XS)+,WA         RESTORE NAME OFFSET
                   18995:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   18996:        EXI                   RETURN TO CALLER
                   18997:        ENP                   END PROCEDURE PRTNV
                   18998:        EJC
                   18999: *
                   19000: *      PRTPG -- PRINT A PAGE THROW
                   19001: *
                   19002: *      PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
                   19003: *      LISTING FILE DEPENDING ON THE LISTING OPTIONS CHOSEN.
                   19004: *
                   19005: *      JSR  PRTPG            CALL FOR PAGE EJECT
                   19006: *
                   19007: PRTPG  PRC  E,0              ENTRY POINT
                   19008:        BNZ  STAGX,PTPG1      SKIP IF EXECUTION TIME
                   19009:        BZE  LSTLC,PTPG6      RETURN IF TOP OF PAGE ALREADY
                   19010:        ZER  LSTLC            CLEAR LINE COUNT
                   19011: *
                   19012: *      CHECK TYPE OF LISTING
                   19013: *
                   19014: PTPG1  MOV  XR,-(XS)         PRESERVE XR
                   19015:        BNZ  PRECL,PTPG2      EJECT IF EXTENDED LISTING
                   19016:        BZE  PRSTD,PTPG3      SKIP IF COMPACT LISTING
                   19017:        BNZ  TTOUS,PTPG3      SKIP IF LISTING TO TERMINAL
                   19018: *
                   19019: *      PERFORM AN EJECT
                   19020: *
                   19021: PTPG2  JSR  SYSEP            EJECT
                   19022:        PPM  PTPG4            IGNORE FAILURE
                   19023:        PPM  EROSI            ERROR
                   19024:        BRN  PTPG4            MERGE
                   19025: *
                   19026: *      COMPACT LISTING.
                   19027: *
                   19028: PTPG3  BNZ  HEADN,PTPG4      SKIP IF HEADERS OMITTED
                   19029:        MOV  HEADP,XR         REMEMBER HEADP
                   19030:        MNZ  HEADP            SET TO AVOID RECURSIVE PRTPG CALLS
                   19031:        JSR  PRTFH            PRINT BLANK LINE
                   19032:        JSR  PRTFH            PRINT BLANK LINE
                   19033:        JSR  PRTFH            PRINT BLANK LINE
                   19034:        MOV  =NUM03,LSTLC     COUNT BLANK LINES
                   19035:        MOV  XR,HEADP         RESTORE HEADER FLAG
                   19036:        EJC
                   19037: *
                   19038: *      PRPTG (CONTINUED)
                   19039: *
                   19040: *      PRINT THE HEADING
                   19041: *
                   19042: PTPG4  BNZ  HEADP,PTPG5      JUMP IF HEADER LISTED
                   19043:        MNZ  HEADP            MARK HEADERS PRINTED
                   19044:        BNZ  HEADN,PTPG5      SKIP IF HEADERS OMITTED
                   19045:        MOV  XL,-(XS)         KEEP XL
                   19046:        MOV  =HEADR,XR        POINT TO LISTING HEADER
                   19047:        JSR  PRTST            PLACE IT
                   19048:        JSR  SYSID            GET SYSTEM IDENTIFICATION
                   19049:        JSR  PRTSF            APPEND EXTRA CHARS AND PRINT
                   19050:        MOV  XL,XR            EXTRA HEADER LINE
                   19051:        JSR  PRTFB            PLACE IT AND A BLANK
                   19052:        JSR  PRTFH            AND ANOTHER
                   19053:        ADD  =NUM04,LSTLC     FOUR HEADER LINES PRINTED
                   19054:        MOV  (XS)+,XL         RESTORE XL
                   19055: *
                   19056: *      MERGE IF HEADER NOT PRINTED
                   19057: *
                   19058: PTPG5  MOV  (XS)+,XR         RESTORE XR
                   19059: *
                   19060: *      RETURN
                   19061: *
                   19062: PTPG6  EXI                   RETURN
                   19063:        ENP                   END PROCEDURE PRTPG
                   19064:        EJC
                   19065: *
                   19066: *      PRTPS -- PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
                   19067: *
                   19068: *      IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
                   19069: *      AN EJECT BE DONE
                   19070: *
                   19071: *      JSR  PRTPS            CALL FOR EJECT
                   19072: *
                   19073: PRTPS  PRC  E,0              ENTRY POINT
                   19074:        MOV  PRSTO,PRSTD      COPY OPTION FLAG
                   19075:        JSR  PRTPG            PRINT PAGE
                   19076:        ZER  PRSTD            CLEAR FLAG
                   19077:        EXI                   RETURN
                   19078:        ENP                   END PROCEDURE PRTPS
                   19079: *
                   19080: *      PRTSF -- PRINT STRING TO STD PRINTER AND FLUSH BFR
                   19081: *
                   19082: *      (XR)                  STRING TO PRINT
                   19083: *      JSR  PRTSF            CALL TO PRINT AND FLUSH
                   19084: *
                   19085: PRTSF  PRC  E,0              ENTRY POINT
                   19086:        JSR  PRTST            PRINT STRING
                   19087:        JSR  PRTFH            FLUSH BUFFER
                   19088:        EXI                   RETURN TO CALLER
                   19089:        ENP                   END PROCEDURE PRTSF
                   19090:        EJC
                   19091: *
                   19092: *      PRTSN -- PRINT STATEMENT NUMBER
                   19093: *
                   19094: *      PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
                   19095: *      ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
                   19096: *      FORMAT OF THE OUTPUT GENERATED IS.
                   19097: *
                   19098: *      ***NNNNN**** III.....IIII
                   19099: *
                   19100: *      NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
                   19101: *      BY ASTERISKS (E.G. *******9****)
                   19102: *
                   19103: *      III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
                   19104: *      OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
                   19105: *
                   19106: *      JSR  PRTSN            CALL TO PRINT STATEMENT NUMBER
                   19107: *      (WC)                  DESTROYED
                   19108: *
                   19109: PRTSN  PRC  E,0              ENTRY POINT
                   19110:        MOV  XR,-(XS)         SAVE ENTRY XR
                   19111:        MOV  WA,PRSNA         SAVE ENTRY WA
                   19112:        MOV  =TMASB,XR        POINT TO ASTERISKS
                   19113:        JSR  PRTST            PRINT ASTERISKS
                   19114:        MOV  =NUM04,PROFS     POINT INTO MIDDLE OF ASTERISKS
                   19115:        MTI  KVSTN            LOAD STATEMENT NUMBER AS INTEGER
                   19116:        JSR  PRTIN            PRINT INTEGER STATEMENT NUMBER
                   19117:        MOV  =PRSNF,PROFS     POINT PAST ASTERISKS PLUS BLANK
                   19118:        MOV  KVFNC,XR         GET FNCLEVEL
                   19119:        MOV  =CH$LI,WA        SET LETTER I
                   19120: *
                   19121: *      LOOP TO GENERATE LETTER I FNCLEVEL TIMES
                   19122: *
                   19123: PRSN1  BZE  XR,PRSN2         JUMP IF ALL SET
                   19124:        JSR  PRTCH            ELSE PRINT AN I
                   19125:        DCV  XR               DECREMENT COUNTER
                   19126:        BRN  PRSN1            LOOP BACK
                   19127: *
                   19128: *      MERRE WITH ALL LETTER I CHARACTERS GENERATED
                   19129: *
                   19130: PRSN2  MOV  =CH$BL,WA        GET BLANK
                   19131:        JSR  PRTCH            PRINT BLANK
                   19132:        MOV  PRSNA,WA         RESTORE ENTRY WA
                   19133:        MOV  (XS)+,XR         RESTORE ENTRY XR
                   19134:        EXI                   RETURN TO PRTSN CALLER
                   19135:        ENP                   END PROCEDURE PRTSN
                   19136:        EJC
                   19137: *
                   19138: *      PRTST -- PRINT STRING TO STANDARD FILE
                   19139: *
                   19140: *      PLACE A STRING OF CHARACTERS IN THE STANDARD PRINT BUFFER
                   19141: *
                   19142: *      NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
                   19143: *      IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
                   19144: *      IF GLOBAL TTOUS IS NON-ZERO, STRING IS SENT TO TERMINAL
                   19145: *      INSTEAD OF STANDARD OUTPUT FILE.
                   19146: *      IF GLOBAL TTLST IS NON-ZERO, STRING IS SENT TO
                   19147: *      TERMINAL AS WELL AS STANDARD OUTPUT FILE
                   19148: *
                   19149: *      (XR)                  STRING TO BE PRINTED
                   19150: *      JSR  PRTST            CALL TO PRINT STRING
                   19151: *      (PROFS)               UPDATED PAST CHARS PLACED
                   19152: *
                   19153: PRTST  PRC  R,0              ENTRY POINT
                   19154:        BNZ  HEADP,PTST1      WERE HEADERS PRINTED
                   19155:        JSR  PRTPS            NO - PRINT THEM
                   19156: *
                   19157: *      HEADERS DEALT WITH
                   19158: *
                   19159: PTST1  BZE  PRLEN,PTST7      SKIP IF NO O/P POSSIBLE
                   19160:        BNZ  PRPUT,PTST2      SKIP IF PUTTING IS OK
                   19161:        BZE  TTLST,PTST7      SKIP OUT IF NOT ERROR TO TERML
                   19162: *
                   19163: *       KEEP REGISTERS
                   19164: *
                   19165: PTST2  MOV  WA,PRSVA         SAVE WA
                   19166:        MOV  WB,PRSVB         SAVE WB
                   19167:        ZER  WB               SET CHARS PRINTED COUNT TO ZERO
                   19168: *
                   19169: *      LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
                   19170: *
                   19171: PTST3  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   19172:        SUB  WB,WA            SUBTRACT COUNT OF CHARS ALREADY OUT
                   19173:        BZE  WA,PTST6         JUMP TO EXIT IF NONE LEFT
                   19174:        MOV  XL,-(XS)         ELSE STACK ENTRY XL
                   19175:        MOV  XR,-(XS)         SAVE ARGUMENT
                   19176:        MOV  XR,XL            COPY FOR EVENTUAL MOVE
                   19177:        MOV  PRLEN,XR         LOAD PRINT BUFFER LENGTH
                   19178:        SUB  PROFS,XR         GET CHARS LEFT IN PRINT BUFFER
                   19179:        BNZ  XR,PTST4         SKIP IF ROOM LEFT ON THIS LINE
                   19180:        JSR  PRTFH            PRINT THIS LINE
                   19181:        MOV  PRLEN,XR         AND SET FULL WIDTH AVAILABLE
                   19182:        EJC
                   19183: *
                   19184: *      PRTST (CONTINUED)
                   19185: *
                   19186: *      HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
                   19187: *
                   19188: PTST4  BLO  WA,XR,PTST5      JUMP IF ROOM FOR REST OF STRING
                   19189:        MOV  XR,WA            ELSE SET TO FILL LINE
                   19190: *
                   19191: *      MERGE HERE WITH CHARACTER COUNT IN WA
                   19192: *
                   19193: PTST5  MOV  PRBUF,XR         POINT TO PRINT BUFFER
                   19194:        PLC  XL,WB            POINT TO LOCATION IN STRING
                   19195:        PSC  XR,PROFS         POINT TO LOCATION IN BUFFER
                   19196:        ADD  WA,WB            BUMP STRING CHARS COUNT
                   19197:        ADD  WA,PROFS         BUMP BUFFER POINTER
                   19198:        MVC                   MOVE CHARACTERS TO BUFFER
                   19199:        MOV  (XS)+,XR         RESTORE ARGUMENT POINTER
                   19200:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   19201:        BRN  PTST3            LOOP BACK TO TEST FOR MORE
                   19202: *
                   19203: *      HERE TO EXIT AFTER PRINTING STRING
                   19204: *
                   19205: PTST6  MOV  PRSVB,WB         RESTORE ENTRY WB
                   19206:        MOV  PRSVA,WA         RESTORE ENTRY WA
                   19207: *
                   19208: *      RETURN POINT
                   19209: *
                   19210: PTST7  EXI                   RETURN TO PRTST CALLER
                   19211:        ENP                   END PROCEDURE PRTST
                   19212: *
                   19213: *      PRTVF -- PLACE A VALUE AND FLUSH STANDARD BUFFER
                   19214: *
                   19215: *      (XR)                  VALUE TO PRINT
                   19216: *      JSR  PRTVF            CALL TO PRINT AND FLUSH
                   19217: *
                   19218: PRTVF  PRC  E,0              ENTRY POINT
                   19219:        JSR  PRTVL            PLACE VALUE
                   19220:        JSR  PRTFH            FLUSH BUFFER
                   19221:        EXI                   RETURN TO CALLER
                   19222:        ENP                   END PROCEDURE PRTVF
                   19223:        EJC
                   19224: *
                   19225: *      PRTVL -- PRINT A VALUE
                   19226: *
                   19227: *      PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
                   19228: *      A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
                   19229: *
                   19230: *      (XR)                  VALUE TO BE PRINTED
                   19231: *      JSR  PRTVL            CALL TO PRINT VALUE
                   19232: *      (WA,WB,WC,RA)         DESTROYED
                   19233: *
                   19234: PRTVL  PRC  R,0              ENTRY POINT, RECURSIVE
                   19235:        MOV  XL,-(XS)         SAVE ENTRY XL
                   19236:        MOV  XR,-(XS)         SAVE ARGUMENT
                   19237:        CHK                   CHECK FOR STACK OVERFLOW
                   19238: *
                   19239: *      LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
                   19240: *
                   19241: PRV01  MOV  IDVAL(XR),PRVSI  COPY IDVAL (IF ANY)
                   19242:        MOV  (XR),XL          LOAD FIRST WORD OF BLOCK
                   19243:        LEI  XL               LOAD ENTRY POINT ID
                   19244:        BSW  XL,BL$$T,PRV02   SWITCH ON BLOCK TYPE
                   19245:        IFF  BL$TR,PRV04      TRBLK
                   19246:        IFF  BL$AR,PRV05      ARBLK
                   19247:        IFF  BL$IC,PRV08      ICBLK
                   19248:        IFF  BL$NM,PRV09      NMBLK
                   19249:        IFF  BL$PD,PRV10      PDBLK
                   19250: .IF    .CNRA
                   19251: .ELSE
                   19252:        IFF  BL$RC,PRV08      RCBLK
                   19253: .FI
                   19254:        IFF  BL$SC,PRV11      SCBLK
                   19255:        IFF  BL$SE,PRV12      SEBLK
                   19256:        IFF  BL$TB,PRV13      TBBLK
                   19257:        IFF  BL$VC,PRV13      VCBLK
                   19258: .IF    .CNBF
                   19259: .ELSE
                   19260:        IFF  BL$BC,PRV15      BCBLK
                   19261: .FI
                   19262:        ESW                   END OF SWITCH ON BLOCK TYPE
                   19263: *
                   19264: *      HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
                   19265: *
                   19266: PRV02  JSR  DTYPE            GET DATATYPE NAME
                   19267:        JSR  PRTST            PRINT DATATYPE NAME
                   19268: *
                   19269: *      COMMON EXIT POINT
                   19270: *
                   19271: PRV03  MOV  (XS)+,XR         RELOAD ARGUMENT
                   19272:        MOV  (XS)+,XL         RESTORE XL
                   19273:        EXI                   RETURN TO PRTVL CALLER
                   19274: *
                   19275: *      HERE FOR TRBLK
                   19276: *
                   19277: PRV04  MOV  TRVAL(XR),XR     LOAD REAL VALUE
                   19278:        BRN  PRV01            AND LOOP BACK
                   19279:        EJC
                   19280: *
                   19281: *      PRTVL (CONTINUED)
                   19282: *
                   19283: *      HERE FOR ARRAY (ARBLK)
                   19284: *
                   19285: *      PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
                   19286: *
                   19287: PRV05  MOV  XR,XL            PRESERVE ARGUMENT
                   19288:        MOV  =SCARR,XR        POINT TO DATATYPE NAME (ARRAY)
                   19289:        JSR  PRTST            PRINT IT
                   19290:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   19291:        JSR  PRTCH            PRINT LEFT PAREN
                   19292:        ADD  AROFS(XL),XL     POINT TO PROTOTYPE
                   19293:        MOV  (XL),XR          LOAD PROTOTYPE
                   19294:        JSR  PRTST            PRINT PROTOTYPE
                   19295: *
                   19296: *      VCBLK, TBBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
                   19297: *
                   19298: PRV06  MOV  =CH$RP,WA        LOAD RIGHT PAREN
                   19299:        JSR  PRTCH            PRINT RIGHT PAREN
                   19300: *
                   19301: *      PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
                   19302: *
                   19303: PRV07  MOV  =CH$BL,WA        LOAD BLANK
                   19304:        JSR  PRTCH            PRINT IT
                   19305:        MOV  =CH$NM,WA        LOAD NUMBER SIGN
                   19306:        JSR  PRTCH            PRINT IT
                   19307:        MTI  PRVSI            GET IDVAL
                   19308:        JSR  PRTIN            PRINT ID NUMBER
                   19309:        BRN  PRV03            BACK TO EXIT
                   19310: *
                   19311: *      HERE FOR INTEGER (ICBLK), REAL (RCBLK)
                   19312: *
                   19313: *      PRINT CHARACTER REPRESENTATION OF VALUE
                   19314: *
                   19315: PRV08  MOV  XR,-(XS)         STACK ARGUMENT FOR GTSTG
                   19316:        JSR  GTSTG            CONVERT TO STRING
                   19317:        PPM                   ERROR RETURN IS IMPOSSIBLE
                   19318:        JSR  PRTST            PRINT THE STRING
                   19319:        MOV  XR,DNAMP         DELETE GARBAGE STRING FROM STORAGE
                   19320:        BRN  PRV03            BACK TO EXIT
                   19321:        EJC
                   19322: *
                   19323: *      PRTVL (CONTINUED)
                   19324: *
                   19325: *      NAME (NMBLK)
                   19326: *
                   19327: *      FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
                   19328: *      FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
                   19329: *
                   19330: PRV09  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   19331:        MOV  (XL),WA          LOAD FIRST WORD OF BLOCK
                   19332:        BEQ  WA,=B$KVT,PRV02  JUST PRINT NAME IF KEYWORD
                   19333:        BEQ  WA,=B$EVT,PRV02  JUST PRINT NAME IF EXPRESSION VAR
                   19334:        MOV  =CH$DT,WA        ELSE GET DOT
                   19335:        JSR  PRTCH            AND PRINT IT
                   19336:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
                   19337:        JSR  PRTNM            PRINT NAME
                   19338:        BRN  PRV03            BACK TO EXIT
                   19339: *
                   19340: *      PROGRAM DATATYPE (PDBLK)
                   19341: *
                   19342: *      PRINT DATATYPE NAME CH$BL CH$NM IDVAL
                   19343: *
                   19344: PRV10  JSR  DTYPE            GET DATATYPE NAME
                   19345:        JSR  PRTST            PRINT DATATYPE NAME
                   19346:        BRN  PRV07            MERGE BACK TO PRINT ID
                   19347: *
                   19348: *      HERE FOR STRING (SCBLK)
                   19349: *
                   19350: *      PRINT QUOTE STRING-CHARACTERS QUOTE
                   19351: *
                   19352: PRV11  MOV  =CH$SQ,WA        LOAD SINGLE QUOTE
                   19353:        JSR  PRTCH            PRINT QUOTE
                   19354:        JSR  PRTST            PRINT STRING VALUE
                   19355:        JSR  PRTCH            PRINT ANOTHER QUOTE
                   19356:        BRN  PRV03            BACK TO EXIT
                   19357:        EJC
                   19358: *
                   19359: *      PRTVL (CONTINUED)
                   19360: *
                   19361: *      HERE FOR SIMPLE EXPRESSION (SEBLK)
                   19362: *
                   19363: *      PRINT ASTERISK VARIABLE-NAME
                   19364: *
                   19365: PRV12  MOV  =CH$AS,WA        LOAD ASTERISK
                   19366:        JSR  PRTCH            PRINT ASTERISK
                   19367:        MOV  SEVAR(XR),XR     LOAD VARIABLE POINTER
                   19368:        JSR  PRTVN            PRINT VARIABLE NAME
                   19369:        BRN  PRV03            JUMP BACK TO EXIT
                   19370: *
                   19371: *      HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
                   19372: *
                   19373: *      PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
                   19374: *
                   19375: PRV13  MOV  XR,XL            PRESERVE ARGUMENT
                   19376:        JSR  DTYPE            GET DATATYPE NAME
                   19377:        JSR  PRTST            PRINT DATATYPE NAME
                   19378:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   19379:        JSR  PRTCH            PRINT LEFT PAREN
                   19380:        MOV  TBLEN(XL),WA     LOAD LENGTH OF BLOCK (=VCLEN)
                   19381:        BTW  WA               CONVERT TO WORD COUNT
                   19382:        SUB  =TBSI$,WA        ALLOW FOR STANDARD FIELDS
                   19383:        BEQ  (XL),=B$TBT,PRV14 JUMP IF TABLE
                   19384:        ADD  =VCTBD,WA        FOR VCBLK, ADJUST SIZE
                   19385: *
                   19386: *      PRINT PROTOTYPE
                   19387: *
                   19388: PRV14  MTI  WA               MOVE AS INTEGER
                   19389:        JSR  PRTIN            PRINT INTEGER PROTOTYPE
                   19390:        BRN  PRV06            MERGE BACK FOR REST
                   19391: .IF    .CNBF
                   19392: .ELSE
                   19393:        EJC
                   19394: *
                   19395: *      PRTVL (CONTINUED)
                   19396: *
                   19397: *      HERE FOR BUFFER (BCBLK)
                   19398: *
                   19399: PRV15  MOV  XR,XL            PRESERVE ARGUMENT
                   19400:        MOV  =SCBUF,XR        POINT TO DATATYPE NAME (BUFFER)
                   19401:        JSR  PRTST            PRINT IT
                   19402:        MOV  =CH$PP,WA        LOAD LEFT PAREN
                   19403:        JSR  PRTCH            PRINT LEFT PAREN
                   19404:        MOV  BCBUF(XL),XR     POINT TO BFBLK
                   19405:        MTI  BFALC(XR)        LOAD ALLOCATION SIZE
                   19406:        JSR  PRTIN            PRINT IT
                   19407:        MOV  =CH$CM,WA        LOAD COMMA
                   19408:        JSR  PRTCH            PRINT IT
                   19409:        MTI  BCLEN(XL)        LOAD DEFINED LENGTH
                   19410:        JSR  PRTIN            PRINT IT
                   19411:        BRN  PRV06            MERGE TO FINISH UP
                   19412: .FI
                   19413:        ENP                   END PROCEDURE PRTVL
                   19414:        EJC
                   19415: *
                   19416: *      PRTVN -- PRINT NATURAL VARIABLE NAME
                   19417: *
                   19418: *      PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
                   19419: *
                   19420: *      (XR)                  POINTER TO VRBLK
                   19421: *      JSR  PRTVN            CALL TO PRINT VARIABLE NAME
                   19422: *
                   19423: PRTVN  PRC  E,0              ENTRY POINT
                   19424:        MOV  XR,-(XS)         STACK VRBLK POINTER
                   19425:        ADD  *VRSOF,XR        POINT TO POSSIBLE STRING NAME
                   19426:        BNZ  SCLEN(XR),PRVN1  JUMP IF NOT SYSTEM VARIABLE
                   19427:        MOV  VRSVO(XR),XR     POINT TO SVBLK WITH NAME
                   19428: *
                   19429: *      MERGE HERE WITH DUMMY SCBLK POINTER IN XR
                   19430: *
                   19431: PRVN1  JSR  PRTST            PRINT STRING NAME OF VARIABLE
                   19432:        MOV  (XS)+,XR         RESTORE VRBLK POINTER
                   19433:        EXI                   RETURN TO PRTVN CALLER
                   19434:        ENP                   END PROCEDURE PRTVN
                   19435:        EJC
                   19436: *
                   19437: *      PTTFH -- FLUSH TERMINAL BUFFER
                   19438: *
                   19439: *      PRINTS THE CONTENTS OF THE TTY BUFFER, RESETS
                   19440: *      THE BUFFER TO ALL BLANKS AND RESETS THE POINTER.
                   19441: *
                   19442: *      JSR  PTTFH            CALL TO FLUSH BUFFER
                   19443: *
                   19444: PTTFH  PRC  E,0              ENTRY POINT
                   19445:        BZE  TTLEN,PTTF2      SKIP IF NO TERMINAL
                   19446:        MOV  XL,-(XS)         SAVE XL
                   19447:        MOV  XR,-(XS)         SAVE XR
                   19448:        MOV  WA,-(XS)         SAVE WA
                   19449:        MOV  WC,-(XS)         SAVE WC
                   19450:        MOV  TTBUF,XR         LOAD POINTER TO BUFFER
                   19451:        MOV  TTOFS,WC         LOAD NUMBER OF CHARS IN BUFFER
                   19452:        JSR  SYSPI            CALL SYSTEM PRINT ROUTINE
                   19453:        PPM  PTTF3            JUMP IF FAILED
                   19454:        PPM  EROSI            STOP IF ERROR
                   19455: *
                   19456: *      BLANK BUFFER
                   19457: *
                   19458: PTTF1  MOV  TTBLK,XL         POINT TO BLANKING STRING
                   19459:        MOV  TTCHS,XR         POINT TO BUFFER
                   19460:        MOV  TTCMV,WA         COUNT OF BAUS TO MOVE
                   19461:        MVW                   MOVE BLANKS INTO BUFFER
                   19462:        ZER  TTOFS            RESET OFFSET
                   19463:        MOV  (XS)+,WC         RESTORE WC
                   19464:        MOV  (XS)+,WA         RECOVER WA
                   19465:        MOV  (XS)+,XR         RESTORE XR
                   19466:        MOV  (XS)+,XL         RESTORE XL
                   19467: *
                   19468: *      RETURN POINT
                   19469: *
                   19470: PTTF2  EXI                   RETURN TO CALLER
                   19471: *
                   19472: *      A FAILURE SUCH AS FILE OVERFILLED OCCURRED
                   19473: *
                   19474: PTTF3  BZE  STAGX,PTTF1      IGNORE IF COMPILE TIME
                   19475:        BRN  EXFAL            ELSE CAUSE STMT FAILURE
                   19476:        ENP                   END PROCEDURE
                   19477:        EJC
                   19478: *
                   19479: *      PTTST -- PRINT STRING TO TERMINAL
                   19480: *
                   19481: *      PLACE A STRING OF CHARACTERS IN THE TERMINAL BUFFER
                   19482: *
                   19483: *      NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
                   19484: *      IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
                   19485: *
                   19486: *      (XR)                  STRING TO BE PRINTED
                   19487: *      JSR  PTTST            CALL TO PRINT STRING
                   19488: *      (TTOFS)               UPDATED PAST CHARS PLACED
                   19489: *
                   19490: PTTST  PRC  E,0              ENTRY POINT
                   19491:        BZE  TTLEN,PTTS5      SKIP IF NO TERMINAL
                   19492:        MOV  WA,PRTVA         SAVE WA
                   19493:        MOV  WB,PRTVB         SAVE WB
                   19494:        ZER  WB               SET CHARS PRINTED COUNT TO ZERO
                   19495: *
                   19496: *      LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
                   19497: *
                   19498: PTTS1  MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   19499:        SUB  WB,WA            SUBTRACT COUNT OF CHARS ALREADY OUT
                   19500:        BZE  WA,PTTS4         JUMP TO EXIT IF NONE LEFT
                   19501:        MOV  XL,-(XS)         ELSE STACK ENTRY XL
                   19502:        MOV  XR,-(XS)         SAVE ARGUMENT
                   19503:        MOV  XR,XL            COPY FOR EVENTUAL MOVE
                   19504:        MOV  TTLEN,XR         LOAD BUFFER LENGTH
                   19505:        SUB  TTOFS,XR         GET CHARS LEFT IN BUFFER
                   19506:        BNZ  XR,PTTS2         SKIP IF ROOM LEFT ON THIS LINE
                   19507:        JSR  PTTFH            ELSE PRINT THIS LINE
                   19508:        MOV  TTLEN,XR         AND SET FULL WIDTH AVAILABLE
                   19509: *
                   19510: *      HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
                   19511: *
                   19512: PTTS2  BLO  WA,XR,PTTS3      JUMP IF ROOM FOR REST OF STRING
                   19513:        MOV  XR,WA            ELSE SET TO FILL LINE
                   19514: *
                   19515: *      MERGE HERE WITH CHARACTER COUNT IN WA
                   19516: *
                   19517: PTTS3  MOV  TTBUF,XR         POINT TO PRINT BUFFER
                   19518:        PLC  XL,WB            POINT TO LOCATION IN STRING
                   19519:        PSC  XR,TTOFS         POINT TO LOCATION IN BUFFER
                   19520:        ADD  WA,WB            BUMP STRING CHARS COUNT
                   19521:        ADD  WA,TTOFS         BUMP BUFFER POINTER
                   19522:        MVC                   MOVE CHARACTERS TO BUFFER
                   19523:        MOV  (XS)+,XR         RESTORE ARGUMENT POINTER
                   19524:        MOV  (XS)+,XL         RESTORE ENTRY XL
                   19525:        BRN  PTTS1            LOOP BACK TO TEST FOR MORE
                   19526:        EJC
                   19527: *
                   19528: *      HERE TO EXIT AFTER PRINTING STRING
                   19529: *
                   19530: PTTS4  MOV  PRTVB,WB         RESTORE ENTRY WB
                   19531:        MOV  PRTVA,WA         RESTORE ENTRY WA
                   19532: *
                   19533: *      RETURN POINT
                   19534: *
                   19535: PTTS5  EXI                   RETURN TO PTTST CALLER
                   19536:        ENP                   END PROCEDURE PTTST
                   19537: .IF    .CNRA
                   19538: .ELSE
                   19539:        EJC
                   19540: *
                   19541: *      RCBLD -- BUILD A REAL BLOCK
                   19542: *
                   19543: *      (RA)                  REAL VALUE FOR RCBLK
                   19544: *      JSR  RCBLD            CALL TO BUILD REAL BLOCK
                   19545: *      (XR)                  POINTER TO RESULT RCBLK
                   19546: *      (WA)                  DESTROYED
                   19547: *
                   19548: RCBLD  PRC  E,0              ENTRY POINT
                   19549:        MOV  DNAMP,XR         LOAD POINTER TO NEXT AVAILABLE LOC
                   19550:        ADD  *RCSI$,XR        POINT PAST NEW RCBLK
                   19551:        BLO  XR,DNAME,RCBL1   JUMP IF THERE IS ROOM
                   19552:        MOV  *RCSI$,WA        ELSE LOAD RCBLK LENGTH
                   19553:        JSR  ALLOC            USE STANDARD ALLOCATOR TO GET BLOCK
                   19554:        ADD  WA,XR            POINT PAST BLOCK TO MERGE
                   19555: *
                   19556: *      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
                   19557: *
                   19558: RCBL1  MOV  XR,DNAMP         SET NEW POINTER
                   19559:        SUB  *RCSI$,XR        POINT BACK TO START OF BLOCK
                   19560:        MOV  =B$RCL,(XR)      STORE TYPE WORD
                   19561:        STR  RCVAL(XR)        STORE REAL VALUE IN RCBLK
                   19562:        EXI                   RETURN TO RCBLD CALLER
                   19563:        ENP                   END PROCEDURE RCBLD
                   19564: .FI
                   19565:        EJC
                   19566: *
                   19567: *      READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
                   19568: *
                   19569: *      READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
                   19570: *      CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
                   19571: *      LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
                   19572: *      SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
                   19573: *
                   19574: *      THE GLOBAL FLAG RDRER IS SET JUST BEFORE THE READ, AND
                   19575: *      CLEARED AFTER IT.  THIS IS SO THAT IN THE EVENT SYSRD
                   19576: *      OR SYSRI TAKE AN EROSI EXIT, THE ERROR APPENDAGE CAN
                   19577: *      RECOGNIZE THE SITUATION AND TAKE APPROPRIATE ACTION.
                   19578: *
                   19579: *      JSR  READR            CALL TO READ NEXT IMAGE
                   19580: *      (XR)                  PTR TO NEXT IMAGE (0 IF NONE)
                   19581: *      (R$CNI)               COPY OF POINTER
                   19582: *      (WA,WB,WC,XL)         DESTROYED
                   19583: *
                   19584: READR  PRC  E,0              ENTRY POINT
                   19585:        MOV  R$CNI,XR         GET PTR TO NEXT IMAGE
                   19586:        BNZ  XR,READ5         EXIT IF ALREADY READ
                   19587: *
                   19588: *      MERGE FROM -COPY EOF TO TRY READ
                   19589: *
                   19590: READ0  BEQ  STAGE,=STGIC,READ1 READ IF INITIAL COMPILE
                   19591:        BZE  R$COP,READ6      ELSE EXIT IF NO -COPY IN FORCE
                   19592: *
                   19593: *      ATTEMPT READ
                   19594: *
                   19595: READ1  MOV  CSWIN,WA         MAX READ LENGTH
                   19596:        MNZ  RDRER            NOTE IN-READR IN CASE EROSI
                   19597:        JSR  ALOCS            ALLOCATE BUFFER
                   19598:        BZE  TTINS,READ2      SKIP IF STANDARD INPUT FILE
                   19599:        JSR  SYSRI            READ FROM TERMINAL
                   19600:        PPM  READ7            FAIL
                   19601:        PPM  EROSI            ERROR
                   19602:        BRN  READ3            MERGE
                   19603: *
                   19604: *      READ FROM STANDARD FILE
                   19605: *
                   19606: READ2  JSR  SYSRD            READ INPUT IMAGE
                   19607:        PPM  READ7            JUMP IF END OF FILE
                   19608:        PPM  EROSI            ERROR RETURN
                   19609: *
                   19610: *      MERGE
                   19611: *
                   19612: READ3  ZER  RDRER            NOTE NOT-IN-READR FOR ERROR RTN
                   19613:        MNZ  WB               SET TRIMR TO PERFORM TRIM
                   19614:        BLE  SCLEN(XR),CSWIN,READ4  USE SMALLER OF STRING LNTH..
                   19615:        MOV  CSWIN,SCLEN(XR)  ... AND XXX OF -INXXX
                   19616: *
                   19617: *      PERFORM THE TRIM
                   19618: *
                   19619: READ4  JSR  TRIMR            TRIM TRAILING BLANKS
                   19620: *
                   19621: *      MERGE HERE AFTER READ
                   19622: *
                   19623: READ5  MOV  XR,R$CNI         STORE COPY OF POINTER
                   19624: *
                   19625: *      MERGE HERE IF NO READ ATTEMPTED
                   19626: *
                   19627: READ6  EXI                   RETURN TO READR CALLER
                   19628: *
                   19629: *      HERE ON END OF FILE
                   19630: *
                   19631: READ7  ZER  RDRER            NOTE NOT-IN-READR FOR ERR
                   19632:        MOV  XR,DNAMP         POP UNUSED SCBLK
                   19633:        ZER  XR               ZERO PTR AS RESULT
                   19634:        BZE  R$COP,READ5      SKIP IF NO -COPY IN FORCE
                   19635:        JSR  COPND            CALL TO END THIS -COPY (EOF)
                   19636:        BRN  READ0            TRY AGAIN
                   19637:        ENP                   END PROCEDURE READR
                   19638: .IF    .CASL
                   19639:        EJC
                   19640: *
                   19641: *      SBSCC -- BUILD SUBSTRING WITH CASE CONVERSION
                   19642: *
                   19643: *      (XL)                  PTR TO SCBLK CONTAINING CHARS
                   19644: *      (WA)                  CHAR COUNT
                   19645: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
                   19646: *      JSR  SBSCC            CALL TO BUILD SUBSTRING
                   19647: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
                   19648: *      (WA,WB,WC,XL,IA)      DESTROYED
                   19649: *
                   19650: *      IF OPTION .CPLC IS SELECTED (PREFER LOWER CASE), TARGET
                   19651: *      CASE IS LOWER CASE, OTHERWISE IT IS UPPER CASE.
                   19652: *
                   19653: SBSCC  PRC  E,0              ENTRY POINT
                   19654:        BZE  WA,SBSC4         JUMP IF NULL SUBSTRING
                   19655:        JSR  ALOCS            ELSE ALLOCATE SCBLK
                   19656:        MOV  WC,WA            MOVE NUMBER OF CHARACTERS
                   19657:        MOV  XR,WC            SAVE PTR TO NEW SCBLK
                   19658:        PLC  XL,WB            PREPARE TO LOAD CHARS FROM OLD BLK
                   19659:        PSC  XR               PREPARE TO STORE CHARS IN NEW BLK
                   19660:        LCT  WA,WA            TO COUNT ROUND LOOP
                   19661: *
                   19662: *      LOOP TO COPY AND TRANSLATE CHARS
                   19663: *
                   19664: SBSC1  LCH  WB,(XL)+         GET CHAR
                   19665: .IF    .CPLC
                   19666:        BGT  WB,=CH$L$,SBSC2  SKIP IF NOT UC LETTER
                   19667:        BLT  WB,=CH$LA,SBSC2  SKIP IF NOT UC LETTER
                   19668: .IF    .CSCV
                   19669:        CUL  WB               CONVERT FROM UC TO LC
                   19670: .ELSE
                   19671:        ADD  =DFA$A,WB        CONVERT FROM UC TO LC
                   19672: .FI
                   19673: .ELSE
                   19674:        BGT  WB,=CH$$$,SBSC2  SKIP IF NOT A LC LETTER
                   19675:        BLT  WB,=CH$$A,SBSC2  SKIP IF NOT A LC LETTER
                   19676: .IF    .CSCV
                   19677:        CLU  WB               CONVERT FROM LC TO UC
                   19678: .ELSE
                   19679:        SUB  =DFA$A,WB        CONVERT FROM LC TO UC
                   19680: .FI
                   19681: .FI
                   19682: *
                   19683: *      STORE CHAR IN NEW SUBSTRING
                   19684: *
                   19685: SBSC2  SCH  WB,(XR)+         STORE CHAR
                   19686:        BCT  WA,SBSC1         LOOP
                   19687:        MOV  WC,XR            RESTORE SCBLK POINTER
                   19688: *
                   19689: *      RETURN POINT
                   19690: *
                   19691: SBSC3  ZER  XL               CLEAR GARBAGE POINTER IN XL
                   19692:        EXI                   RETURN TO SBSCC CALLER
                   19693: *
                   19694: *      HERE FOR NULL SUBSTRING
                   19695: *
                   19696: SBSC4  MOV  =NULLS,XR        SET NULL STRING AS RESULT
                   19697:        BRN  SBSC3            RETURN
                   19698:        ENP                   END PROCEDURE SBSCC
                   19699:        EJC
                   19700: *
                   19701: *      SBSTG -- BUILD SUBSTRING POSSIBLY CONVERTING CASE
                   19702: *
                   19703: *      (XL)                  PTR TO SCBLK CONTAINING CHARS
                   19704: *      (WA)                  CHAR COUNT
                   19705: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
                   19706: *      JSR  SBSTG            CALL TO BUILD SUBSTRING
                   19707: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
                   19708: *      (WA,WB,WC,XL,IA)      DESTROYED
                   19709: *
                   19710: *      IF CASE IS TO BE IGNORED (-CASEIG OR .CSIG), SUBSTRING
                   19711: *      IS CONVERTED TO PREFERRED CASE (DEFAULT UPPER),
                   19712: *      OTHERWISE CASE IS LEFT ALONE.
                   19713: *
                   19714: SBSTG  PRC  E,0              ENTRY POINT
                   19715:        BZE  CSWCI,SBSG1      SKIP IF CASE NOT IGNORED
                   19716:        JSR  SBSCC            CONVERT TO IGNORE CASE
                   19717:        EXI                   RETURN TO CALLER
                   19718: *
                   19719: SBSG1  JSR  SBSTR            READ SUBSTRING IN MIXED CASE
                   19720:        EXI                   RETURN TO CALLER
                   19721:        ENP                   END PROCEDURE SBSTG
                   19722: .FI
                   19723:        EJC
                   19724: *
                   19725: *      SBSTR -- BUILD A SUBSTRING
                   19726: *
                   19727: *      (XL)                  PTR TO SCBLK CONTAINING CHARS
                   19728: *      (WA)                  NUMBER OF CHARS IN SUBSTRING
                   19729: *      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
                   19730: *      JSR  SBSTR            CALL TO BUILD SUBSTRING
                   19731: *      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
                   19732: *      (WA,WB,WC,XL,IA)      DESTROYED
                   19733: *
                   19734: *      NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
                   19735: *      (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
                   19736: *      VARIABLE AS A STANDARD STRING VALUE.
                   19737: *
                   19738: SBSTR  PRC  E,0              ENTRY POINT
                   19739:        BZE  WA,SBST2         JUMP IF NULL SUBSTRING
                   19740:        JSR  ALOCS            ELSE ALLOCATE SCBLK
                   19741:        MOV  WC,WA            MOVE NUMBER OF CHARACTERS
                   19742:        MOV  XR,WC            SAVE PTR TO NEW SCBLK
                   19743:        PLC  XL,WB            PREPARE TO LOAD CHARS FROM OLD BLK
                   19744:        PSC  XR               PREPARE TO STORE CHARS IN NEW BLK
                   19745:        MVC                   MOVE CHARACTERS TO NEW STRING
                   19746:        MOV  WC,XR            THEN RESTORE SCBLK POINTER
                   19747: *
                   19748: *      RETURN POINT
                   19749: *
                   19750: SBST1  ZER  XL               CLEAR GARBAGE POINTER IN XL
                   19751:        EXI                   RETURN TO SBSTR CALLER
                   19752: *
                   19753: *      HERE FOR NULL SUBSTRING
                   19754: *
                   19755: SBST2  MOV  =NULLS,XR        SET NULL STRING AS RESULT
                   19756:        BRN  SBST1            RETURN
                   19757:        ENP                   END PROCEDURE SBSTR
                   19758:        EJC
                   19759: *
                   19760: *      SCANE -- SCAN AN ELEMENT
                   19761: *
                   19762: *      SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
                   19763: *      TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
                   19764: *
                   19765: *      (SCNCC)               NON-ZERO IF CALLED FROM CNCRD
                   19766: *      JSR  SCANE            CALL TO SCAN ELEMENT
                   19767: *      (XR)                  RESULT POINTER (SEE BELOW)
                   19768: *      (XL)                  SYNTAX TYPE CODE (T$XXX)
                   19769: *
                   19770: *      THE FOLLOWING GLOBAL LOCATIONS ARE USED.
                   19771: *
                   19772: *      R$CIM                 POINTER TO STRING BLOCK (SCBLK)
                   19773: *                            FOR CURRENT INPUT IMAGE.
                   19774: *
                   19775: *      R$CNI                 POINTER TO NEXT INPUT IMAGE STRING
                   19776: *                            POINTER (ZERO IF NONE).
                   19777: *
                   19778: *      R$SCP                 SAVE POINTER (EXIT XR) FROM LAST
                   19779: *                            CALL IN CASE RESCAN IS SET.
                   19780: *
                   19781: *      SCNBL                 THIS LOCATION IS SET NON-ZERO ON
                   19782: *                            EXIT IF SCANE SCANNED PAST BLANKS
                   19783: *                            BEFORE LOCATING THE CURRENT ELEMENT
                   19784: *                            THE END OF A LINE COUNTS AS BLANKS.
                   19785: *
                   19786: *      SCNCC                 CNCRD SETS THIS NON-ZERO TO SCAN
                   19787: *                            CONTROL CARD NAMES AND CLEARS IT
                   19788: *                            ON RETURN
                   19789: *
                   19790: *      SCNIL                 LENGTH OF CURRENT INPUT IMAGE
                   19791: *
                   19792: *      SCNGO                 IF SET NON-ZERO ON ENTRY, F AND S
                   19793: *                            ARE RETURNED AS SEPARATE SYNTAX
                   19794: *                            TYPES (NOT LETTERS) (GOTO PRO-
                   19795: *                            CESSING). SCNGO IS RESET ON EXIT.
                   19796: *
                   19797: *      SCNPT                 OFFSET TO CURRENT LOC IN R$CIM
                   19798: *
                   19799: *      SCNRS                 IF SET NON-ZERO ON ENTRY, SCANE
                   19800: *                            RETURNS THE SAME RESULT AS ON THE
                   19801: *                            LAST CALL (RESCAN). SCNRS IS RESET
                   19802: *                            ON EXIT FROM ANY CALL TO SCANE.
                   19803: *
                   19804: *      SCNTP                 SAVE SYNTAX TYPE FROM LAST
                   19805: *                            CALL (IN CASE RESCAN IS SET).
                   19806:        EJC
                   19807: *
                   19808: *      SCANE (CONTINUED)
                   19809: *
                   19810: *
                   19811: *
                   19812: *      ELEMENT SCANNED       XL        XR
                   19813: *      ---------------       --        --
                   19814: *
                   19815: *      CONTROL CARD NAME     0         POINTER TO SCBLK FOR NAME
                   19816: *
                   19817: *      UNARY OPERATOR        T$UOP     PTR TO OPERATOR DVBLK
                   19818: *
                   19819: *      LEFT PAREN            T$LPR     T$LPR
                   19820: *
                   19821: *      LEFT BRACKET          T$LBR     T$LBR
                   19822: *
                   19823: *      COMMA                 T$CMA     T$CMA
                   19824: *
                   19825: *      FUNCTION CALL         T$FNC     PTR TO FUNCTION VRBLK
                   19826: *
                   19827: *      VARIABLE              T$VAR     PTR TO VRBLK
                   19828: *
                   19829: *      STRING CONSTANT       T$CON     PTR TO SCBLK
                   19830: *
                   19831: *      INTEGER CONSTANT      T$CON     PTR TO ICBLK
                   19832: *
                   19833: .IF    .CNRA
                   19834: .ELSE
                   19835: *      REAL CONSTANT         T$CON     PTR TO RCBLK
                   19836: *
                   19837: .FI
                   19838: *      BINARY OPERATOR       T$BOP     PTR TO OPERATOR DVBLK
                   19839: *
                   19840: *      RIGHT PAREN           T$RPR     T$RPR
                   19841: *
                   19842: *      RIGHT BRACKET         T$RBR     T$RBR
                   19843: *
                   19844: *      COLON                 T$COL     T$COL
                   19845: *
                   19846: *      SEMI-COLON            T$SMC     T$SMC
                   19847: *
                   19848: *      F (SCNGO NE 0)        T$FGO     T$FGO
                   19849: *
                   19850: *      S (SCNGO NE 0)        T$SGO     T$SGO
                   19851:        EJC
                   19852: *
                   19853: *      SCANE (CONTINUED)
                   19854: *
                   19855: *      ENTRY POINT
                   19856: *
                   19857: SCANE  PRC  E,0              ENTRY POINT
                   19858:        ZER  SCNBL            RESET BLANKS FLAG
                   19859:        MOV  WA,SCNSA         SAVE WA
                   19860:        MOV  WB,SCNSB         SAVE WB
                   19861:        MOV  WC,SCNSC         SAVE WC
                   19862:        BZE  SCNRS,SCN03      JUMP IF NO RESCAN
                   19863: *
                   19864: *      HERE FOR RESCAN REQUEST
                   19865: *
                   19866:        MOV  SCNTP,XL         SET PREVIOUS RETURNED SCAN TYPE
                   19867:        MOV  R$SCP,XR         SET PREVIOUS RETURNED POINTER
                   19868:        ZER  SCNRS            RESET RESCAN SWITCH
                   19869:        BRN  SCN13            JUMP TO EXIT
                   19870: *
                   19871: *      COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
                   19872: *
                   19873: SCN01  JSR  READR            READ NEXT IMAGE
                   19874:        MOV  *DVUBS,WB        SET WB FOR NOT READING NAME
                   19875:        BZE  XR,SCN30         TREAT AS SEMI-COLON IF NONE
                   19876:        PLC  XR               ELSE POINT TO FIRST CHARACTER
                   19877:        LCH  WC,(XR)          LOAD FIRST CHARACTER
                   19878:        BEQ  WC,=CH$DT,SCN02  JUMP IF DOT FOR CONTINUATION
                   19879:        BNE  WC,=CH$PL,SCN30  ELSE TREAT AS SEMICOLON UNLESS PLUS
                   19880: *
                   19881: *      HERE FOR CONTINUATION LINE
                   19882: *
                   19883: SCN02  JSR  NEXTS            ACQUIRE NEXT SOURCE IMAGE
                   19884:        MOV  =NUM01,SCNPT     SET SCAN POINTER PAST CONTINUATION
                   19885:        MNZ  SCNBL            SET BLANKS FLAG
                   19886:        EJC
                   19887: *
                   19888: *      SCANE (CONTINUED)
                   19889: *
                   19890: *      MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
                   19891: *
                   19892: SCN03  MOV  SCNPT,WA         LOAD CURRENT OFFSET
                   19893:        BEQ  WA,SCNIL,SCN01   CHECK CONTINUATION IF END
                   19894:        MOV  R$CIM,XL         POINT TO CURRENT LINE
                   19895:        PLC  XL,WA            POINT TO CURRENT CHARACTER
                   19896:        MOV  WA,SCNSE         SET START OF ELEMENT LOCATION
                   19897:        MOV  =OPDVS,WC        POINT TO OPERATOR DV LIST
                   19898:        MOV  *DVUBS,WB        SET CONSTANT FOR OPERATOR CIRCUIT
                   19899:        BRN  SCN06            START SCANNING
                   19900: *
                   19901: *      LOOP HERE TO IGNORE LEADING BLANKS AND TABS
                   19902: *
                   19903: SCN05  BZE  WB,SCN10         JUMP IF TRAILING
                   19904:        ICV  SCNSE            INCREMENT START OF ELEMENT
                   19905:        BEQ  WA,SCNIL,SCN01   JUMP IF END OF IMAGE
                   19906:        MNZ  SCNBL            NOTE BLANKS SEEN
                   19907: *
                   19908: *      THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
                   19909: *      THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
                   19910: *      THE REGISTERS ARE USED AS FOLLOWS.
                   19911: *
                   19912: *      (XR)                  SCRATCH
                   19913: *      (XL)                  PTR TO NEXT CHARACTER
                   19914: *      (WA)                  CURRENT SCAN OFFSET
                   19915: *      (WB)                  *DVUBS (0 IF SCANNING NAME,CONST)
                   19916: *      (WC)                  =OPDVS (0 IF SCANNING CONSTANT)
                   19917: *
                   19918: SCN06  LCH  XR,(XL)+         GET NEXT CHARACTER
                   19919:        ICV  WA               BUMP SCAN OFFSET
                   19920:        MOV  WA,SCNPT         STORE OFFSET PAST CHAR SCANNED
                   19921:        BGE  XR,=CFP$U,SCN07  QUICK CHECK FOR OTHER CHAR
                   19922:        BSW  XR,CFP$U,SCN07   SWITCH ON SCANNED CHARACTER
                   19923: *
                   19924: *      SWITCH TABLE FOR SWITCH ON CHARACTER
                   19925: *
                   19926:        IFF  CH$BL,SCN05      BLANK
                   19927: .IF    .CAHT
                   19928:        IFF  CH$HT,SCN05      HORIZONTAL TAB
                   19929: .FI
                   19930: .IF    .CAVT
                   19931:        IFF  CH$VT,SCN05      VERTICAL TAB
                   19932: .FI
                   19933:        IFF  CH$D0,SCN08      DIGIT 0
                   19934:        IFF  CH$D1,SCN08      DIGIT 1
                   19935:        IFF  CH$D2,SCN08      DIGIT 2
                   19936:        IFF  CH$D3,SCN08      DIGIT 3
                   19937:        IFF  CH$D4,SCN08      DIGIT 4
                   19938:        IFF  CH$D5,SCN08      DIGIT 5
                   19939:        IFF  CH$D6,SCN08      DIGIT 6
                   19940:        IFF  CH$D7,SCN08      DIGIT 7
                   19941:        IFF  CH$D8,SCN08      DIGIT 8
                   19942:        IFF  CH$D9,SCN08      DIGIT 9
                   19943:        EJC
                   19944: *
                   19945: *      SCANE (CONTINUED)
                   19946: *
                   19947:        IFF  CH$LA,SCN09      LETTER A
                   19948:        IFF  CH$LB,SCN09      LETTER B
                   19949:        IFF  CH$LC,SCN09      LETTER C
                   19950:        IFF  CH$LD,SCN09      LETTER D
                   19951:        IFF  CH$LE,SCN09      LETTER E
                   19952:        IFF  CH$LG,SCN09      LETTER G
                   19953:        IFF  CH$LH,SCN09      LETTER H
                   19954:        IFF  CH$LI,SCN09      LETTER I
                   19955:        IFF  CH$LJ,SCN09      LETTER J
                   19956:        IFF  CH$LK,SCN09      LETTER K
                   19957:        IFF  CH$LL,SCN09      LETTER L
                   19958:        IFF  CH$LM,SCN09      LETTER M
                   19959:        IFF  CH$LN,SCN09      LETTER N
                   19960:        IFF  CH$LO,SCN09      LETTER O
                   19961:        IFF  CH$LP,SCN09      LETTER P
                   19962:        IFF  CH$LQ,SCN09      LETTER Q
                   19963:        IFF  CH$LR,SCN09      LETTER R
                   19964:        IFF  CH$LT,SCN09      LETTER T
                   19965:        IFF  CH$LU,SCN09      LETTER U
                   19966:        IFF  CH$LV,SCN09      LETTER V
                   19967:        IFF  CH$LW,SCN09      LETTER W
                   19968:        IFF  CH$LX,SCN09      LETTER X
                   19969:        IFF  CH$LY,SCN09      LETTER Y
                   19970:        IFF  CH$L$,SCN09      LETTER Z
                   19971: .IF    .CASL
                   19972:        IFF  CH$$A,SCN09      SHIFTED A
                   19973:        IFF  CH$$B,SCN09      SHIFTED B
                   19974:        IFF  CH$$C,SCN09      SHIFTED C
                   19975:        IFF  CH$$D,SCN09      SHIFTED D
                   19976:        IFF  CH$$E,SCN09      SHIFTED E
                   19977:        IFF  CH$$F,SCN20      SHIFTED F
                   19978:        IFF  CH$$G,SCN09      SHIFTED G
                   19979:        IFF  CH$$H,SCN09      SHIFTED H
                   19980:        IFF  CH$$I,SCN09      SHIFTED I
                   19981:        IFF  CH$$J,SCN09      SHIFTED J
                   19982:        IFF  CH$$K,SCN09      SHIFTED K
                   19983:        IFF  CH$$L,SCN09      SHIFTED L
                   19984:        IFF  CH$$M,SCN09      SHIFTED M
                   19985:        IFF  CH$$N,SCN09      SHIFTED N
                   19986:        IFF  CH$$O,SCN09      SHIFTED O
                   19987:        IFF  CH$$P,SCN09      SHIFTED P
                   19988:        IFF  CH$$Q,SCN09      SHIFTED Q
                   19989:        IFF  CH$$R,SCN09      SHIFTED R
                   19990:        IFF  CH$$S,SCN21      SHIFTED S
                   19991:        IFF  CH$$T,SCN09      SHIFTED T
                   19992:        IFF  CH$$U,SCN09      SHIFTED U
                   19993:        IFF  CH$$V,SCN09      SHIFTED V
                   19994:        IFF  CH$$W,SCN09      SHIFTED W
                   19995:        IFF  CH$$X,SCN09      SHIFTED X
                   19996:        IFF  CH$$Y,SCN09      SHIFTED Y
                   19997:        IFF  CH$$$,SCN09      SHIFTED Z
                   19998: .FI
                   19999:        EJC
                   20000: *
                   20001: *      SCANE (CONTINUED)
                   20002: *
                   20003:        IFF  CH$SQ,SCN16      SINGLE QUOTE
                   20004:        IFF  CH$DQ,SCN17      DOUBLE QUOTE
                   20005:        IFF  CH$LF,SCN20      LETTER F
                   20006:        IFF  CH$LS,SCN21      LETTER S
                   20007:        IFF  CH$UN,SCN24      UNDERLINE
                   20008:        IFF  CH$PP,SCN25      LEFT PAREN
                   20009:        IFF  CH$RP,SCN26      RIGHT PAREN
                   20010:        IFF  CH$RB,SCN27      RIGHT BRACKET
                   20011:        IFF  CH$BB,SCN28      LEFT BRACKET
                   20012:        IFF  CH$CB,SCN27      RIGHT BRACKET
                   20013:        IFF  CH$OB,SCN28      LEFT BRACKET
                   20014:        IFF  CH$CL,SCN29      COLON
                   20015:        IFF  CH$SM,SCN30      SEMI-COLON
                   20016:        IFF  CH$CM,SCN31      COMMA
                   20017:        IFF  CH$DT,SCN32      DOT
                   20018:        IFF  CH$PL,SCN34      PLUS
                   20019:        IFF  CH$MN,SCN35      MINUS
                   20020:        IFF  CH$NT,SCN36      NOT
                   20021:        IFF  CH$DL,SCN33      DOLLAR
                   20022:        IFF  CH$EX,SCN37      EXCLAMATION MARK
                   20023:        IFF  CH$PC,SCN38      PERCENT
                   20024:        IFF  CH$SL,SCN40      SLASH
                   20025:        IFF  CH$NM,SCN41      NUMBER SIGN
                   20026:        IFF  CH$AT,SCN42      AT
                   20027:        IFF  CH$BR,SCN43      VERTICAL BAR
                   20028:        IFF  CH$AM,SCN44      AMPERSAND
                   20029:        IFF  CH$QU,SCN45      QUESTION MARK
                   20030:        IFF  CH$EQ,SCN46      EQUAL
                   20031:        IFF  CH$AS,SCN49      ASTERISK
                   20032:        ESW                   END SWITCH ON CHARACTER
                   20033: *
                   20034: *      HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
                   20035: *
                   20036: SCN07  BZE  WB,SCN10         JUMP IF SCANNING NAME OR CONSTANT
                   20037:        ERB  232,SYNTAX ERROR. ILLEGAL CHARACTER
                   20038:        EJC
                   20039: *
                   20040: *      SCANE (CONTINUED)
                   20041: *
                   20042: *      HERE FOR DIGITS 0-9
                   20043: *
                   20044: SCN08  BZE  WB,SCN09         KEEP SCANNING IF NAME/CONSTANT
                   20045:        ZER  WC               ELSE SET FLAG FOR SCANNING CONSTANT
                   20046: *
                   20047: *      HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
                   20048: *
                   20049: SCN09  BEQ  WA,SCNIL,SCN11   JUMP IF END OF IMAGE
                   20050:        ZER  WB               SET FLAG FOR SCANNING NAME/CONST
                   20051:        BRN  SCN06            MERGE BACK TO CONTINUE SCAN
                   20052: *
                   20053: *      COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
                   20054: *
                   20055: SCN10  DCV  WA               RESET OFFSET TO POINT TO DELIMITER
                   20056: *
                   20057: *      COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
                   20058: *
                   20059: SCN11  MOV  WA,SCNPT         STORE UPDATED SCAN OFFSET
                   20060:        MOV  SCNSE,WB         POINT TO START OF ELEMENT
                   20061:        SUB  WB,WA            GET NUMBER OF CHARACTERS
                   20062:        MOV  R$CIM,XL         POINT TO LINE IMAGE
                   20063:        BNZ  WC,SCN15         JUMP IF NAME
                   20064: *
                   20065: *      HERE AFTER SCANNING OUT NUMERIC CONSTANT
                   20066: *
                   20067:        JSR  SBSTR            GET STRING FOR CONSTANT
                   20068:        MOV  XR,DNAMP         DELETE FROM STORAGE (NOT NEEDED)
                   20069:        JSR  GTNUM            CONVERT TO NUMERIC
                   20070:        PPM  SCN14            JUMP IF CONVERSION FAILURE
                   20071: *
                   20072: *      MERGE HERE TO EXIT WITH CONSTANT
                   20073: *
                   20074: SCN12  MOV  =T$CON,XL        SET RESULT TYPE OF CONSTANT
                   20075:        EJC
                   20076: *
                   20077: *      SCANE (CONTINUED)
                   20078: *
                   20079: *      COMMON EXIT POINT (XR,XL) SET
                   20080: *
                   20081: SCN13  MOV  SCNSA,WA         RESTORE WA
                   20082:        MOV  SCNSB,WB         RESTORE WB
                   20083:        MOV  SCNSC,WC         RESTORE WC
                   20084:        MOV  XR,R$SCP         SAVE XR IN CASE RESCAN
                   20085:        MOV  XL,SCNTP         SAVE XL IN CASE RESCAN
                   20086:        ZER  SCNGO            RESET POSSIBLE GOTO FLAG
                   20087:        EXI                   RETURN TO SCANE CALLER
                   20088: *
                   20089: *      HERE IF CONVERSION ERROR ON NUMERIC ITEM
                   20090: *
                   20091: SCN14  ERB  233,SYNTAX ERROR. INVALID NUMERIC ITEM
                   20092: *
                   20093: *      HERE AFTER SCANNING OUT VARIABLE NAME
                   20094: *
                   20095: .IF    .CASL
                   20096: SCN15  JSR  SBSTG            BUILD STRING NAME OF VARIABLE
                   20097: .ELSE
                   20098: SCN15  JSR  SBSTR            BUILD STRING NAME OF VARIABLE
                   20099: .FI
                   20100:        BNZ  SCNCC,SCN13      RETURN IF CNCRD CALL
                   20101:        JSR  GTNVR            LOCATE/BUILD VRBLK
                   20102:        PPM                   DUMMY (UNUSED) ERROR RETURN
                   20103:        MOV  =T$VAR,XL        SET TYPE AS VARIABLE
                   20104:        BRN  SCN13            BACK TO EXIT
                   20105: *
                   20106: *      HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
                   20107: *
                   20108: SCN16  BZE  WB,SCN10         TERMINATOR IF SCANNING NAME OR CNST
                   20109:        MOV  =CH$SQ,WB        SET TERMINATOR AS SINGLE QUOTE
                   20110:        BRN  SCN18            MERGE
                   20111: *
                   20112: *      HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
                   20113: *
                   20114: SCN17  BZE  WB,SCN10         TERMINATOR IF SCANNING NAME OR CNST
                   20115:        MOV  =CH$DQ,WB        SET DOUBLE QUOTE TERMINATOR, MERGE
                   20116: *
                   20117: *      LOOP TO SCAN OUT STRING CONSTANT
                   20118: *
                   20119: SCN18  BEQ  WA,SCNIL,SCN19   ERROR IF END OF IMAGE
                   20120:        LCH  WC,(XL)+         ELSE LOAD NEXT CHARACTER
                   20121:        ICV  WA               BUMP OFFSET
                   20122:        BNE  WC,WB,SCN18      LOOP BACK IF NOT TERMINATOR
                   20123:        EJC
                   20124: *
                   20125: *      SCANE (CONTINUED)
                   20126: *
                   20127: *      HERE AFTER SCANNING OUT STRING CONSTANT
                   20128: *
                   20129:        MOV  SCNPT,WB         POINT TO FIRST CHARACTER
                   20130:        MOV  WA,SCNPT         SAVE OFFSET PAST FINAL QUOTE
                   20131:        DCV  WA               POINT BACK PAST LAST CHARACTER
                   20132:        SUB  WB,WA            GET NUMBER OF CHARACTERS
                   20133:        MOV  R$CIM,XL         POINT TO INPUT IMAGE
                   20134:        JSR  SBSTR            BUILD SUBSTRING VALUE
                   20135:        BRN  SCN12            BACK TO EXIT WITH CONSTANT RESULT
                   20136: *
                   20137: *      HERE IF NO MATCHING QUOTE FOUND
                   20138: *
                   20139: SCN19  MOV  WA,SCNPT         SET UPDATED SCAN POINTER
                   20140:        ERB  234,SYNTAX ERROR. UNMATCHED STRING QUOTE
                   20141: *
                   20142: *      HERE FOR F (POSSIBLE FAILURE GOTO)
                   20143: *
                   20144: SCN20  MOV  =T$FGO,XR        SET RETURN CODE FOR FAIL GOTO
                   20145:        BRN  SCN22            JUMP TO MERGE
                   20146: *
                   20147: *      HERE FOR S (POSSIBLE SUCCESS GOTO)
                   20148: *
                   20149: SCN21  MOV  =T$SGO,XR        SET SUCCESS GOTO AS RETURN CODE
                   20150: *
                   20151: *      SPECIAL GOTO CASES MERGE HERE
                   20152: *
                   20153: SCN22  BZE  SCNGO,SCN09      TREAT AS NORMAL LETTER IF NOT GOTO
                   20154: *
                   20155: *      MERGE HERE FOR SPECIAL CHARACTER EXIT
                   20156: *
                   20157: SCN23  BZE  WB,SCN10         JUMP IF END OF NAME/CONSTANT
                   20158:        MOV  XR,XL            ELSE COPY CODE
                   20159:        BRN  SCN13            AND JUMP TO EXIT
                   20160: *
                   20161: *      HERE FOR UNDERLINE
                   20162: *
                   20163: SCN24  BZE  WB,SCN09         PART OF NAME IF SCANNING NAME
                   20164:        BRN  SCN07            ELSE ILLEGAL
                   20165:        EJC
                   20166: *
                   20167: *      SCANE (CONTINUED)
                   20168: *
                   20169: *      HERE FOR LEFT PAREN
                   20170: *
                   20171: SCN25  MOV  =T$LPR,XR        SET LEFT PAREN RETURN CODE
                   20172:        BNZ  WB,SCN23         RETURN LEFT PAREN UNLESS NAME
                   20173:        BZE  WC,SCN10         DELIMITER IF SCANNING CONSTANT
                   20174: *
                   20175: *      HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
                   20176: *
                   20177:        MOV  SCNSE,WB         POINT TO START OF NAME
                   20178:        MOV  WA,SCNPT         SET POINTER PAST LEFT PAREN
                   20179:        DCV  WA               POINT BACK PAST LAST CHAR OF NAME
                   20180:        SUB  WB,WA            GET NAME LENGTH
                   20181:        MOV  R$CIM,XL         POINT TO INPUT IMAGE
                   20182:        JSR  SBSTR            GET STRING NAME FOR FUNCTION
                   20183:        JSR  GTNVR            LOCATE/BUILD VRBLK
                   20184:        PPM                   DUMMY (UNUSED) ERROR RETURN
                   20185:        MOV  =T$FNC,XL        SET CODE FOR FUNCTION CALL
                   20186:        BRN  SCN13            BACK TO EXIT
                   20187: *
                   20188: *      PROCESSING FOR SPECIAL CHARACTERS
                   20189: *
                   20190: SCN26  MOV  =T$RPR,XR        RIGHT PAREN, SET CODE
                   20191:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   20192: *
                   20193: SCN27  MOV  =T$RBR,XR        RIGHT BRACKET, SET CODE
                   20194:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   20195: *
                   20196: SCN28  MOV  =T$LBR,XR        LEFT BRACKET, SET CODE
                   20197:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   20198: *
                   20199: SCN29  MOV  =T$COL,XR        COLON, SET CODE
                   20200:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   20201: *
                   20202: SCN30  MOV  =T$SMC,XR        SEMI-COLON, SET CODE
                   20203:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   20204: *
                   20205: SCN31  MOV  =T$CMA,XR        COMMA, SET CODE
                   20206:        BRN  SCN23            TAKE SPECIAL CHARACTER EXIT
                   20207:        EJC
                   20208: *
                   20209: *      SCANE (CONTINUED)
                   20210: *
                   20211: *      HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
                   20212: *      OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
                   20213: *      TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
                   20214: *      LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
                   20215: *      POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
                   20216: *      THE FIRST FOUR ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
                   20217: *      AS PART OF A VARIABLE NAME (.$) OR CONSTANT (.+-).
                   20218: *
                   20219: SCN32  BZE  WB,SCN09         DOT CAN BE PART OF NAME OR CONSTANT
                   20220:        ADD  WB,WC            ELSE BUMP POINTER
                   20221: *
                   20222: SCN33  BZE  WB,SCN09         DOLLAR CAN BE PART OF NAME
                   20223:        ADD  WB,WC            ELSE BUMP POINTER
                   20224: *
                   20225: SCN34  BZE  WC,SCN09         PLUS CAN BE PART OF CONSTANT
                   20226:        BZE  WB,SCN48         PLUS CANNOT BE PART OF NAME
                   20227:        ADD  WB,WC            ELSE BUMP POINTER
                   20228: *
                   20229: SCN35  BZE  WC,SCN09         MINUS CAN BE PART OF CONSTANT
                   20230:        BZE  WB,SCN48         MINUS CANNOT BE PART OF NAME
                   20231:        ADD  WB,WC            ELSE BUMP POINTER
                   20232:        LCH  XR,(XL)          GET NEXT CHARACTER
                   20233:        BLT  XR,=CH$D0,SCN36  SKIP IF NOT DIGIT
                   20234:        BLE  XR,=CH$D9,SCN08  JUMP IF DIGIT
                   20235: *
                   20236: SCN36  ADD  WB,WC            NOT
                   20237: SCN37  ADD  WB,WC            EXCLAMATION
                   20238: SCN38  ADD  WB,WC            PERCENT
                   20239: SCN39  ADD  WB,WC            ASTERISK
                   20240: SCN40  ADD  WB,WC            SLASH
                   20241: SCN41  ADD  WB,WC            NUMBER SIGN
                   20242: SCN42  ADD  WB,WC            AT SIGN
                   20243: SCN43  ADD  WB,WC            VERTICAL BAR
                   20244: SCN44  ADD  WB,WC            AMPERSAND
                   20245: SCN45  ADD  WB,WC            QUESTION MARK
                   20246:        EJC
                   20247: *
                   20248: *      SCANE (CONTINUED)
                   20249: *
                   20250: *      ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
                   20251: *      (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
                   20252: *
                   20253: SCN46  BZE  WB,SCN10         OPERATOR TERMINATES NAME/CONSTANT
                   20254:        MOV  WC,XR            ELSE COPY DV POINTER
                   20255:        LCH  WC,(XL)          LOAD NEXT CHARACTER
                   20256:        MOV  =T$BOP,XL        SET BINARY OP IN CASE
                   20257:        BEQ  WA,SCNIL,SCN47   SHOULD BE BINARY IF IMAGE END
                   20258:        BEQ  WC,=CH$BL,SCN47  SHOULD BE BINARY IF FOLLOWED BY BLK
                   20259: .IF    .CAHT
                   20260:        BEQ  WC,=CH$HT,SCN47  JUMP IF HORIZONTAL TAB
                   20261: .FI
                   20262: .IF    .CAVT
                   20263:        BEQ  WC,=CH$VT,SCN47  JUMP IF VERTICAL TAB
                   20264: .FI
                   20265:        BEQ  WC,=CH$SM,SCN47  SEMICOLON CAN IMMEDIATELY FOLLOW =
                   20266: *
                   20267: *      HERE FOR UNARY OPERATOR
                   20268: *
                   20269:        ADD  *DVBS$,XR        POINT TO DV FOR UNARY OP
                   20270:        MOV  =T$UOP,XL        SET TYPE FOR UNARY OPERATOR
                   20271:        BLE  SCNTP,=T$UOK,SCN13 OK UNARY IF OK PRECEDING ELEMENT
                   20272:        EJC
                   20273: *
                   20274: *      SCANE (CONTINUED)
                   20275: *
                   20276: *      MERGE HERE TO REQUIRE PRECEDING BLANKS
                   20277: *
                   20278: SCN47  BNZ  SCNBL,SCN13      ALL OK IF PRECEDING BLANKS, EXIT
                   20279: *
                   20280: *      FAIL OPERATOR IN THIS POSITION
                   20281: *
                   20282: SCN48  ERB  235,SYNTAX ERROR. INVALID USE OF OPERATOR
                   20283: *
                   20284: *      HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
                   20285: *
                   20286: SCN49  BZE  WB,SCN10         END OF NAME IF SCANNING NAME
                   20287:        BEQ  WA,SCNIL,SCN39   NOT ** IF * AT IMAGE END
                   20288:        MOV  WA,XR            ELSE SAVE OFFSET PAST FIRST *
                   20289:        MOV  WA,SCNOF         SAVE ANOTHER COPY
                   20290:        LCH  WA,(XL)+         LOAD NEXT CHARACTER
                   20291:        BNE  WA,=CH$AS,SCN50  NOT ** IF NEXT CHAR NOT *
                   20292:        ICV  XR               ELSE STEP OFFSET PAST SECOND *
                   20293:        BEQ  XR,SCNIL,SCN51   OK EXCLAM IF END OF IMAGE
                   20294:        LCH  WA,(XL)          ELSE LOAD NEXT CHARACTER
                   20295:        BEQ  WA,=CH$BL,SCN51  EXCLAMATION IF BLANK
                   20296: .IF    .CAHT
                   20297:        BEQ  WA,=CH$HT,SCN51  EXCLAMATION IF HORIZONTAL TAB
                   20298: .FI
                   20299: .IF    .CAVT
                   20300:        BEQ  WA,=CH$VT,SCN51  EXCLAMATION IF VERTICAL TAB
                   20301: .FI
                   20302: *
                   20303: *      UNARY *
                   20304: *
                   20305: SCN50  MOV  SCNOF,WA         RECOVER STORED OFFSET
                   20306:        MOV  R$CIM,XL         POINT TO LINE AGAIN
                   20307:        PLC  XL,WA            POINT TO CURRENT CHAR
                   20308:        BRN  SCN39            MERGE WITH UNARY *
                   20309: *
                   20310: *      HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
                   20311: *
                   20312: SCN51  MOV  XR,SCNPT         SAVE SCAN POINTER PAST 2ND *
                   20313:        MOV  XR,WA            COPY SCAN POINTER
                   20314:        BRN  SCN37            MERGE WITH EXCLAMATION
                   20315:        ENP                   END PROCEDURE SCANE
                   20316:        EJC
                   20317: *
                   20318: *      SCNGF -- SCAN GOTO FIELD
                   20319: *
                   20320: *      SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
                   20321: *      FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
                   20322: *      FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
                   20323: *      POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
                   20324: *      EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
                   20325: *      (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
                   20326: *      POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
                   20327: *      UNARY OPERATOR O$GOD.
                   20328: *
                   20329: *      JSR  SCNGF            CALL TO SCAN GOTO FIELD
                   20330: *      (XR)                  RESULT (SEE ABOVE)
                   20331: *      (XL,WA,WB,WC)         DESTROYED
                   20332: *
                   20333: SCNGF  PRC  E,0              ENTRY POINT
                   20334:        JSR  SCANE            SCAN INITIAL ELEMENT
                   20335:        BEQ  XL,=T$LPR,SCNG1  SKIP IF LEFT PAREN (NORMAL GOTO)
                   20336:        BEQ  XL,=T$LBR,SCNG2  SKIP IF LEFT BRACKET (DIRECT GOTO)
                   20337:        ERB  236,SYNTAX ERROR. GOTO FIELD INCORRECT
                   20338: *
                   20339: *      HERE FOR LEFT PAREN (NORMAL GOTO)
                   20340: *
                   20341: SCNG1  MOV  =NUM01,WB        SET EXPAN FLAG FOR NORMAL GOTO
                   20342:        JSR  EXPAN            ANALYZE GOTO FIELD
                   20343:        MOV  =OPDVN,WA        ELSE POINT TO OPDV FOR COMPLEX GOTO
                   20344:        BLE  XR,STATB,SCNG3   JUMP IF NOT IN STATIC
                   20345:        BLO  XR,STATE,SCNG4   JUMP TO EXIT IF SIMPLE LABEL NAME
                   20346:        BRN  SCNG3            AND MERGE
                   20347: *
                   20348: *      HERE FOR LEFT BRACKET (DIRECT GOTO)
                   20349: *
                   20350: SCNG2  MOV  =NUM02,WB        SET EXPAN FLAG FOR DIRECT GOTO
                   20351:        JSR  EXPAN            SCAN GOTO FIELD
                   20352:        MOV  =OPDVD,WA        SET OPDV POINTER FOR DIRECT GOTO
                   20353:        EJC
                   20354: *
                   20355: *      SCNGF (CONTINUED)
                   20356: *
                   20357: *      MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
                   20358: *
                   20359: SCNG3  MOV  WA,-(XS)         STACK OPERATOR DV POINTER
                   20360:        MOV  XR,-(XS)         STACK POINTER TO EXPRESSION TREE
                   20361:        JSR  EXPOP            POP OPERATOR OFF
                   20362:        MOV  (XS)+,XR         RELOAD NEW EXPRESSION TREE POINTER
                   20363: *
                   20364: *      COMMON EXIT POINT
                   20365: *
                   20366: SCNG4  EXI                   RETURN TO CALLER
                   20367:        ENP                   END PROCEDURE SCNGF
                   20368:        EJC
                   20369: *
                   20370: *      SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
                   20371: *
                   20372: *      SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
                   20373: *      FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
                   20374: *      ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
                   20375: *
                   20376: *      (XR)                  POINTER TO VRBLK
                   20377: *      JSR  SETVR            CALL TO SET FIELDS
                   20378: *      (XL,WA)               DESTROYED
                   20379: *
                   20380: *      NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
                   20381: *      INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
                   20382: *
                   20383: SETVR  PRC  E,0              ENTRY POINT
                   20384:        BHI  XR,STATE,SETV1   EXIT IF NOT NATURAL VARIABLE
                   20385: *
                   20386: *      HERE IF WE HAVE A VRBLK
                   20387: *
                   20388:        MOV  XR,XL            COPY VRBLK POINTER
                   20389:        MOV  =B$VRL,VRGET(XR) STORE NORMAL GET VALUE
                   20390:        BEQ  VRSTO(XR),=B$VRE,SETV1 SKIP IF PROTECTED VARIABLE
                   20391:        MOV  =B$VRS,VRSTO(XR) STORE NORMAL STORE VALUE
                   20392:        MOV  VRVAL(XL),XL     POINT TO NEXT ENTRY ON CHAIN
                   20393:        BNE  (XL),=B$TRT,SETV1 JUMP IF END OF TRBLK CHAIN
                   20394:        MOV  =B$VRA,VRGET(XR) STORE TRAPPED ROUTINE ADDRESS
                   20395:        MOV  =B$VRV,VRSTO(XR) SET TRAPPED ROUTINE ADDRESS
                   20396: *
                   20397: *      MERGE HERE TO EXIT TO CALLER
                   20398: *
                   20399: SETV1  EXI                   RETURN TO SETVR CALLER
                   20400:        ENP                   END PROCEDURE SETVR
                   20401: .IF    .CNSR
                   20402: .ELSE
                   20403:        EJC
                   20404: *
                   20405: *      SORTA -- SORT ARRAY
                   20406: *
                   20407: *      ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
                   20408: *      SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
                   20409: *      DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
                   20410: *      WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
                   20411: *      ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
                   20412: *      REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
                   20413: *      FOR A VECTOR.
                   20414: *      THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURES,
                   20415: *      HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
                   20416: *      IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
                   20417: *      TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
                   20418: *      IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
                   20419: *      SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BAU
                   20420: *      OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
                   20421: *      ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
                   20422: *      COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
                   20423: *      OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
                   20424: *      COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
                   20425: *      OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
                   20426: *      THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
                   20427: *      REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
                   20428: *      PRECEDING FIRST ACTUAL ITEM.
                   20429: *      REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
                   20430: *      TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
                   20431: *      GREATER THAN TEST.
                   20432: *      GIVES ERROR MESSAGES FOR INCORRECT ARGS, RETURNS EXI 1
                   20433: *      FOR EMPTY TABLE.
                   20434: *
                   20435: *      1(XS)                 FIRST ARG - ARRAY OR TABLE
                   20436: *      0(XS)                 2ND ARG - INDEX OR PDTYPE NAME
                   20437: *      (WA)                  0 , NON-ZERO FOR SORT , RSORT
                   20438: *      JSR  SORTA            CALL TO SORT ARRAY
                   20439: *      PPM  LOC              FAIL RETURN FOR EMPTY TABLE
                   20440: *      (XR)                  SORTED ARRAY
                   20441: *      (XL,WA,WB,WC)         DESTROYED
                   20442:        EJC
                   20443: *
                   20444: *      SORTA (CONTINUED)
                   20445: *
                   20446: SORTA  PRC  N,1              ENTRY POINT
                   20447:        MOV  WA,SRTSR         SORT/RSORT INDICATOR
                   20448:        MOV  *NUM01,SRTST     DEFAULT STRIDE OF 1
                   20449:        ZER  SRTOF            DEFAULT ZERO OFFSET TO SORT KEY
                   20450:        MOV  =NULLS,SRTDF     CLEAR DATATYPE FIELD NAME
                   20451:        MOV  (XS)+,R$SXR      UNSTACK ARGUMENT 2
                   20452:        MOV  (XS)+,XR         GET FIRST ARGUMENT
                   20453:        MOV  (XR),WA          GET ARG TYPE
                   20454:        BEQ  WA,=B$ART,SRT00  SKIP IF ARRAY
                   20455:        BNE  WA,=B$TBT,SRT16  ERROR IF NOT TABLE
                   20456:        JSR  GTARR            CONVERT TO ARRAY
                   20457:        PPM  SRT18            FAIL
                   20458: *
                   20459: *      MAKE COPY OF ARRAY
                   20460: *
                   20461: SRT00  MOV  XR,-(XS)         STACK PTR TO RESULTING KEY ARRAY
                   20462:        MOV  XR,-(XS)         ANOTHER COPY FOR CBLCK
                   20463:        JSR  CBLCK            GET COPY ARRAY FOR SORTING INTO
                   20464:        PPM                   CANT FAIL
                   20465:        MOV  XR,-(XS)         STACK POINTER TO SORT ARRAY
                   20466:        MOV  R$SXR,XR         GET SECOND ARG
                   20467:        MOV  1(XS),XL         GET PTR TO KEY ARRAY
                   20468:        BNE  (XL),=B$VCT,SRT02 JUMP IF ARBLK
                   20469:        BEQ  XR,=NULLS,SRT01  JUMP IF NULL SECOND ARG
                   20470:        JSR  GTNVR            GET VRBLK PTR FOR IT
                   20471:        ERR  237,ERRONEOUS 2ND ARG IN SORT/RSORT OF VECTOR
                   20472:        MOV  XR,SRTDF         STORE DATATYPE FIELD NAME VRBLK
                   20473: *
                   20474: *      COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
                   20475: *
                   20476: SRT01  MOV  *VCLEN,WC        OFFSET TO A(0)
                   20477:        MOV  *VCVLS,WB        OFFSET TO FIRST ITEM
                   20478:        MOV  VCLEN(XL),WA     GET BLOCK LENGTH
                   20479:        SUB  *VCSI$,WA        GET NO. OF ENTRIES, N (IN BAUS)
                   20480:        BRN  SRT04            MERGE
                   20481: *
                   20482: *      HERE FOR ARRAY
                   20483: *
                   20484: SRT02  LDI  ARDIM(XL)        GET POSSIBLE DIMENSION
                   20485:        MFI  WA               CONVERT TO SHORT INTEGER
                   20486:        WTB  WA               FURTHER CONVERT TO BAUS
                   20487:        MOV  *ARVLS,WB        OFFSET TO FIRST VALUE IF ONE DIM.
                   20488:        MOV  *ARPRO,WC        OFFSET BEFORE VALUES IF ONE DIM.
                   20489:        BEQ  ARNDM(XL),=NUM01,SRT04 JUMP IF IN FACT ONE DIMENSION
                   20490:        BNE  ARNDM(XL),=NUM02,SRT16  FAIL UNLESS TWO DIMENSIONAL
                   20491:        LDI  ARLB2(XL)        GET LOWER BOUND 2 AS DEFAULT COLUMN
                   20492:        BEQ  XR,=NULLS,SRT03  JUMP IF DEFAULT SECOND ARG
                   20493:        JSR  GTINT            CONVERT TO INTEGER
                   20494:        PPM  SRT17            FAIL
                   20495:        LDI  ICVAL(XR)        GET ACTUAL INTEGER VALUE
                   20496:        EJC
                   20497: *
                   20498: *      SORTA (CONTINUED)
                   20499: *
                   20500: *      HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
                   20501: *
                   20502: SRT03  SBI  ARLB2(XL)        SUBTRACT LOW BOUND
                   20503:        IOV  SRT17            FAIL IF OVERFLOW
                   20504:        ILT  SRT17            FAIL IF BELOW LOW BOUND
                   20505:        SBI  ARDM2(XL)        CHECK AGAINST DIMENSION
                   20506:        IGE  SRT17            FAIL IF TOO LARGE
                   20507:        ADI  ARDM2(XL)        RESTORE VALUE
                   20508:        MFI  WA               GET AS SMALL INTEGER
                   20509:        WTB  WA               OFFSET WITHIN ROW TO KEY
                   20510:        MOV  WA,SRTOF         KEEP OFFSET
                   20511:        LDI  ARDM2(XL)        SECOND DIMENSION IS ROW LENGTH
                   20512:        MFI  WA               CONVERT TO SHORT INTEGER
                   20513:        MOV  WA,XR            COPY ROW LENGTH
                   20514:        WTB  WA               CONVERT TO BAUS
                   20515:        MOV  WA,SRTST         STORE AS STRIDE
                   20516:        LDI  ARDIM(XL)        GET NUMBER OF ROWS
                   20517:        MFI  WA               AS A SHORT INTEGER
                   20518:        WTB  WA               CONVERT N TO BAUS
                   20519:        MOV  ARLEN(XL),WC     OFFSET PAST ARRAY END
                   20520:        SUB  WA,WC            ADJUST, GIVING SPACE FOR N OFFSETS
                   20521:        DCA  WC               POINT TO A(0)
                   20522:        MOV  AROFS(XL),WB     OFFSET TO WORD BEFORE FIRST ITEM
                   20523:        ICA  WB               OFFSET TO FIRST ITEM
                   20524: *
                   20525: *      SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
                   20526: *      TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
                   20527: *      TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
                   20528: *
                   20529: *      (XL) = 1(XS) = POINTER TO KEY ARRAY
                   20530: *      (XS) = POINTER TO SORT ARRAY
                   20531: *      WA = NUMBER OF ITEMS, N (CONVERTED TO BAUS).
                   20532: *      WB = OFFSET TO FIRST ITEM OF ARRAYS.
                   20533: *      WC = OFFSET TO A(0)
                   20534: *
                   20535: SRT04  BLE  WA,*NUM01,SRT15  RETURN IF ONLY A SINGLE ITEM
                   20536:        MOV  WA,SRTSN         STORE NUMBER OF ITEMS (IN BAUS)
                   20537:        MOV  WC,SRTSO         STORE OFFSET TO A(0)
                   20538:        MOV  ARLEN(XL),WC     LENGTH OF ARRAY OR VEC (=VCLEN)
                   20539:        ADD  XL,WC            POINT PAST END OF ARRAY OR VECTOR
                   20540:        MOV  WB,SRTSF         STORE OFFSET TO FIRST ROW
                   20541:        ADD  WB,XL            POINT TO FIRST ITEM IN KEY ARRAY
                   20542: *
                   20543: *      LOOP THROUGH ARRAY
                   20544: *
                   20545: SRT05  MOV  (XL),XR          GET AN ENTRY
                   20546: *
                   20547: *      HUNT ALONG TRBLK CHAIN
                   20548: *
                   20549: SRT06  BNE  (XR),=B$TRT,SRT07 JUMP OUT IF NOT TRBLK
                   20550:        MOV  TRVAL(XR),XR     GET VALUE FIELD
                   20551:        BRN  SRT06            LOOP
                   20552:        EJC
                   20553: *
                   20554: *      SORTA (CONTINUED)
                   20555: *
                   20556: *      XR IS VALUE FROM END OF CHAIN
                   20557: *
                   20558: SRT07  MOV  XR,(XL)+         STORE AS ARRAY ENTRY
                   20559:        BLT  XL,WC,SRT05      LOOP IF NOT DONE
                   20560:        MOV  (XS),XL          GET ADRS OF SORT ARRAY
                   20561:        MOV  SRTSF,XR         INITIAL OFFSET TO FIRST KEY
                   20562:        MOV  SRTST,WB         GET STRIDE
                   20563:        ADD  SRTSO,XL         OFFSET TO A(0)
                   20564:        ICA  XL               POINT TO A(1)
                   20565:        MOV  SRTSN,WC         GET N
                   20566:        BTW  WC               CONVERT FROM BAUS
                   20567:        MOV  WC,SRTNR         STORE AS ROW COUNT
                   20568:        LCT  WC,WC            LOOP COUNTER
                   20569: *
                   20570: *      STORE KEY OFFSETS AT TOP OF SORT ARRAY
                   20571: *
                   20572: SRT08  MOV  XR,(XL)+         STORE AN OFFSET
                   20573:        ADD  WB,XR            BUMP OFFSET BY STRIDE
                   20574:        BCT  WC,SRT08         LOOP THROUGH ROWS
                   20575: *
                   20576: *      PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
                   20577: *
                   20578: *      (SRTSN)               NUMBER OF ITEMS TO SORT, N (BAUS)
                   20579: *      (SRTSO)               OFFSET TO A(0)
                   20580: *
                   20581: SRT09  MOV  SRTSN,WA         GET N
                   20582:        MOV  SRTNR,WC         GET NUMBER OF ROWS
                   20583:        RSH  WC,1             I = N / 2 (WC=I, INDEX INTO ARRAY)
                   20584:        WTB  WC               CONVERT BACK TO BAUS
                   20585: *
                   20586: *      LOOP TO FORM INITIAL HEAP
                   20587: *
                   20588: SRT10  JSR  SORTH            SORTH(I,N)
                   20589:        DCA  WC               I = I - 1
                   20590:        BNZ  WC,SRT10         LOOP IF I GT 0
                   20591:        MOV  WA,WC            I = N
                   20592: *
                   20593: *      SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
                   20594: *      ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAINS
                   20595: *      IT AS, ROOT OF TREE.
                   20596: *
                   20597: SRT11  DCA  WC               I = I - 1 (N - 1 INITIALLY)
                   20598:        BZE  WC,SRT12         JUMP IF DONE
                   20599:        MOV  (XS),XR          GET SORT ARRAY ADDRESS
                   20600:        ADD  SRTSO,XR         POINT TO A(0)
                   20601:        MOV  XR,XL            A(0) ADDRESS
                   20602:        ADD  WC,XL            A(I) ADDRESS
                   20603:        MOV  1(XL),WB         COPY A(I+1)
                   20604:        MOV  1(XR),1(XL)      MOVE A(1) TO A(I+1)
                   20605:        MOV  WB,1(XR)         COMPLETE EXCHANGE OF A(1), A(I+1)
                   20606:        MOV  WC,WA            N = I FOR SORTH
                   20607:        MOV  *NUM01,WC        I = 1 FOR SORTH
                   20608:        JSR  SORTH            SORTH(1,N)
                   20609:        MOV  WA,WC            RESTORE WC
                   20610:        BRN  SRT11            LOOP
                   20611:        EJC
                   20612: *
                   20613: *      SORTA (CONTINUED)
                   20614: *
                   20615: *      OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
                   20616: *      COPY ARRAY ELEMENTS OVER THEM.
                   20617: *
                   20618: SRT12  MOV  (XS),XL          BASE ADRS OF KEY ARRAY
                   20619:        MOV  XL,WC            COPY IT
                   20620:        ADD  SRTSO,WC         OFFSET OF A(0)
                   20621:        ADD  SRTSF,XL         ADRS OF FIRST ROW OF SORT ARRAY
                   20622:        MOV  SRTST,WB         GET STRIDE
                   20623:        BTW  WB               CONVERT TO WORDS
                   20624: *
                   20625: *      COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
                   20626: *      HELD AT END OF SORT ARRAY.
                   20627: *
                   20628: SRT13  ICA  WC               ADRS OF NEXT OF SORTED OFFSETS
                   20629:        MOV  WC,XR            COPY IT FOR ACCESS
                   20630:        MOV  (XR),XR          GET OFFSET
                   20631:        ADD  1(XS),XR         ADD KEY ARRAY BASE ADRS
                   20632:        LCT  WA,WB            GET COUNT OF WORDS IN ROW
                   20633: *
                   20634: *      COPY A COMPLETE ROW
                   20635: *
                   20636: SRT14  MOV  (XR)+,(XL)+      MOVE A WORD
                   20637:        BCT  WA,SRT14         LOOP
                   20638:        DCV  SRTNR            DECREMENT ROW COUNT
                   20639:        BNZ  SRTNR,SRT13      REPEAT TILL ALL ROWS DONE
                   20640: *
                   20641: *      RETURN POINT
                   20642: *
                   20643: SRT15  MOV  (XS)+,XR         POP RESULT ARRAY PTR
                   20644:        ICA  XS               POP KEY ARRAY PTR
                   20645:        ZER  R$SXL            CLEAR JUNK
                   20646:        ZER  R$SXR            CLEAR JUNK
                   20647:        EXI                   RETURN
                   20648: *
                   20649: *      ERROR POINT
                   20650: *
                   20651: SRT16  ERB  238,SORT/RSORT 1ST ARG NOT SUITABLE ARRAY OR TABLE
                   20652: SRT17  ERB  239,SORT/RSORT 2ND ARG OUT OF RANGE OR NON-INTEGER
                   20653: *
                   20654: *      SOFT FAIL RETURN
                   20655: *
                   20656: SRT18  EXI  1                RETURN
                   20657:        ENP                   END PROCUDURE SORTA
                   20658:        EJC
                   20659: *
                   20660: *      SORTC --  COMPARE SORT KEYS
                   20661: *
                   20662: *      COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
                   20663: *      EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
                   20664: *      NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
                   20665: *      SORT), THE QUOTED RETURNS ARE INVERTED.
                   20666: *      FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
                   20667: *      IDENTIFICATIONS ARE COMPARED.
                   20668: *
                   20669: *      (XL)                  BASE ADRS FOR KEYS
                   20670: *      (WA)                  OFFSET TO KEY 1 ITEM
                   20671: *      (WB)                  OFFSET TO KEY 2 ITEM
                   20672: *      (SRTSR)               ZERO/NON-ZERO FOR SORT/RSORT
                   20673: *      (SRTOF)               OFFSET WITHIN ROW TO COMPARANDS
                   20674: *      JSR  SORTC            CALL TO COMPARE KEYS
                   20675: *      PPM  LOC              KEY1 LESS THAN KEY2
                   20676: *                            NORMAL RETURN, KEY1 GT THAN KEY2
                   20677: *      (XL,XR,WA,WB)         DESTROYED
                   20678: *
                   20679: SORTC  PRC  E,1              ENTRY POINT
                   20680:        MOV  WA,SRTS1         SAVE OFFSET 1
                   20681:        MOV  WB,SRTS2         SAVE OFFSET 2
                   20682:        MOV  WC,SRTSC         SAVE WC
                   20683:        ADD  SRTOF,XL         ADD OFFSET TO COMPARAND FIELD
                   20684:        MOV  XL,XR            COPY BASE + OFFSET
                   20685:        ADD  WA,XL            ADD KEY1 OFFSET
                   20686:        ADD  WB,XR            ADD KEY2 OFFSET
                   20687:        MOV  (XL),XL          GET KEY1
                   20688:        MOV  (XR),XR          GET KEY2
                   20689:        BNE  SRTDF,=NULLS,SRC11 JUMP IF DATATYPE FIELD NAME USED
                   20690:        EJC
                   20691: *
                   20692: *      SORTC (CONTINUED)
                   20693: *
                   20694: *      MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
                   20695: *
                   20696: SRC01  MOV  (XL),WC          GET TYPE CODE
                   20697:        BNE  WC,(XR),SRC02    SKIP IF NOT SAME DATATYPE
                   20698:        BEQ  WC,=B$SCL,SRC09  JUMP IF BOTH STRINGS
                   20699: *
                   20700: *      NOW TRY FOR NUMERIC
                   20701: *
                   20702: SRC02  MOV  XL,R$SXL         KEEP ARG1
                   20703:        MOV  XR,R$SXR         KEEP ARG2
                   20704:        MOV  XL,-(XS)         STACK
                   20705:        MOV  XR,-(XS)         ARGS
                   20706:        JSR  ACOMP            COMPARE OBJECTS
                   20707:        PPM  SRC10            NOT NUMERIC
                   20708:        PPM  SRC10            NOT NUMERIC
                   20709:        PPM  SRC03            KEY1 LESS
                   20710:        PPM  SRC08            KEYS EQUAL
                   20711:        PPM  SRC05            KEY1 GREATER
                   20712: *
                   20713: *      RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
                   20714: *
                   20715: SRC03  BNZ  SRTSR,SRC06      JUMP IF RSORT
                   20716: *
                   20717: SRC04  MOV  SRTSC,WC         RESTORE WC
                   20718:        EXI  1                RETURN
                   20719: *
                   20720: *      RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
                   20721: *
                   20722: SRC05  BNZ  SRTSR,SRC04      JUMP IF RSORT
                   20723: *
                   20724: SRC06  MOV  SRTSC,WC         RESTORE WC
                   20725:        EXI                   RETURN
                   20726: *
                   20727: *      KEYS ARE OF SAME DATATYPE
                   20728: *
                   20729: SRC07  BLT  XL,XR,SRC03      ITEM FIRST CREATED IS LESS
                   20730:        BGT  XL,XR,SRC05      ADDRESSES RISE IN ORDER OF CREATION
                   20731: *
                   20732: *      DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
                   20733: *
                   20734: SRC08  BLT  SRTS1,SRTS2,SRC04 TEST OFFSETS OR KEY ADDRSS INSTEAD
                   20735:        BRN  SRC06            OFFSET 1 GREATER
                   20736:        EJC
                   20737: *
                   20738: *      SORTC (CONTINUED)
                   20739: *
                   20740: *      STRINGS
                   20741: *
                   20742: SRC09  MOV  XL,-(XS)         STACK
                   20743:        MOV  XR,-(XS)         ARGS
                   20744:        JSR  LCOMP            COMPARE OBJECTS
                   20745:        PPM                   CANT
                   20746:        PPM                   FAIL
                   20747:        PPM  SRC03            KEY1 LESS
                   20748:        PPM  SRC08            KEYS EQUAL
                   20749:        PPM  SRC05            KEY1 GREATER
                   20750: *
                   20751: *      ARITHMETIC COMPARISON FAILED - RECOVER ARGS
                   20752: *
                   20753: SRC10  MOV  R$SXL,XL         GET ARG1
                   20754:        MOV  R$SXR,XR         GET ARG2
                   20755:        MOV  (XL),WC          GET TYPE OF KEY1
                   20756:        BEQ  WC,(XR),SRC07    JUMP IF KEYS OF SAME TYPE
                   20757:        MOV  WC,XL            GET BLOCK TYPE WORD
                   20758:        MOV  (XR),XR          GET BLOCK TYPE WORD
                   20759:        LEI  XL               ENTRY POINT ID FOR KEY1
                   20760:        LEI  XR               ENTRY POINT ID FOR KEY2
                   20761:        BGT  XL,XR,SRC05      JUMP IF KEY1 GT KEY2
                   20762:        BRN  SRC03            KEY1 LT KEY2
                   20763: *
                   20764: *      DATATYPE FIELD NAME USED
                   20765: *
                   20766: SRC11  JSR  SORTF            CALL ROUTINE TO FIND FIELD 1
                   20767:        MOV  XL,-(XS)         STACK ITEM POINTER
                   20768:        MOV  XR,XL            GET KEY2
                   20769:        JSR  SORTF            FIND FIELD 2
                   20770:        MOV  XL,XR            PLACE AS KEY2
                   20771:        MOV  (XS)+,XL         RECOVER KEY1
                   20772:        BRN  SRC01            MERGE
                   20773:        ENP                   PROCEDURE SORTC
                   20774:        EJC
                   20775: *
                   20776: *      SORTF -- FIND FIELD FOR SORTC
                   20777: *
                   20778: *      ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
                   20779: *      TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
                   20780: *      DEFINED OBJECT PASSED AS ARGUMENT.
                   20781: *      IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
                   20782: *      NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
                   20783: *      SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
                   20784: *      DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
                   20785: *
                   20786: *      (SRTDF)               VRBLK POINTER OF FIELD NAME
                   20787: *      (XL)                  POSSIBLE PDBLK POINTER
                   20788: *      JSR  SORTF            CALL TO SEARCH FOR FIELD NAME
                   20789: *      (XL)                  ITEM FOUND OR ORIGINAL PDBLK PTR
                   20790: *      (WC)                  DESTROYED
                   20791: *
                   20792: SORTF  PRC  E,0              ENTRY POINT
                   20793:        BNE  (XL),=B$PDT,SRTF3 RETURN IF NOT PDBLK
                   20794:        MOV  XR,-(XS)         KEEP XR
                   20795:        MOV  SRTFD,XR         GET POSSIBLE FORMER DFBLK PTR
                   20796:        BZE  XR,SRTF4         JUMP IF NOT
                   20797:        BNE  XR,PDDFP(XL),SRTF4 JUMP IF NOT RIGHT DATATYPE
                   20798:        BNE  SRTDF,SRTFF,SRTF4 JUMP IF NOT RIGHT FIELD NAME
                   20799:        ADD  SRTFO,XL         ADD OFFSET TO REQUIRED FIELD
                   20800: *
                   20801: *      HERE WITH XL POINTING TO FOUND FIELD
                   20802: *
                   20803: SRTF1  MOV  (XL),XL          GET ITEM FROM FIELD
                   20804: *
                   20805: *      RETURN POINT
                   20806: *
                   20807: SRTF2  MOV  (XS)+,XR         RESTORE XR
                   20808: *
                   20809: SRTF3  EXI                   RETURN
                   20810:        EJC
                   20811: *
                   20812: *      SORTF (CONTINUED)
                   20813: *
                   20814: *      CONDUCT A SEARCH
                   20815: *
                   20816: SRTF4  MOV  XL,XR            COPY ORIGINAL POINTER
                   20817:        MOV  PDDFP(XR),XR     POINT TO DFBLK
                   20818:        MOV  XR,SRTFD         KEEP A COPY
                   20819:        MOV  FARGS(XR),WC     GET NUMBER OF FIELDS
                   20820:        WTB  WC               CONVERT TO BAUS
                   20821:        ADD  DFLEN(XR),XR     POINT PAST LAST FIELD
                   20822: *
                   20823: *      LOOP TO FIND NAME IN PDFBLK
                   20824: *
                   20825: SRTF5  DCA  WC               COUNT DOWN
                   20826:        DCA  XR               POINT IN FRONT
                   20827:        BEQ  (XR),SRTDF,SRTF6 SKIP OUT IF FOUND
                   20828:        BNZ  WC,SRTF5         LOOP
                   20829:        BRN  SRTF2            RETURN - NOT FOUND
                   20830: *
                   20831: *      FOUND
                   20832: *
                   20833: SRTF6  MOV  (XR),SRTFF       KEEP FIELD NAME PTR
                   20834:        ADD  *PDFLD,WC        ADD OFFSET TO FIRST FIELD
                   20835:        MOV  WC,SRTFO         STORE AS FIELD OFFSET
                   20836:        ADD  WC,XL            POINT TO FIELD
                   20837:        BRN  SRTF1            RETURN
                   20838:        ENP                   PROCEDURE SORTF
                   20839:        EJC
                   20840: *
                   20841: *      SORTH -- HEAP ROUTINE FOR SORTA
                   20842: *
                   20843: *      THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
                   20844: *      IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
                   20845: *      A KEY ARRAY.
                   20846: *
                   20847: *      (XS)                  POINTER TO SORT ARRAY BASE
                   20848: *      1(XS)                 POINTER TO KEY ARRAY BASE
                   20849: *      (WA)                  MAX ARRAY INDEX, N (IN BAUS)
                   20850: *      (WC)                  OFFSET J IN A TO ROOT (IN *1 TO *N)
                   20851: *      JSR  SORTH            CALL SORTH(J,N) TO MAKE HEAP
                   20852: *      (XL,XR,WB)            DESTROYED
                   20853: *
                   20854: SORTH  PRC  N,0              ENTRY POINT
                   20855:        MOV  WA,SRTSN         SAVE N
                   20856:        MOV  WC,SRTWC         KEEP WC
                   20857:        MOV  (XS),XL          SORT ARRAY BASE ADRS
                   20858:        ADD  SRTSO,XL         ADD OFFSET TO A(0)
                   20859:        ADD  WC,XL            POINT TO A(J)
                   20860:        MOV  (XL),SRTRT       GET OFFSET TO ROOT
                   20861:        ADD  WC,WC            DOUBLE J - CANT EXCEED N
                   20862: *
                   20863: *      LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
                   20864: *
                   20865: SRH01  BGT  WC,SRTSN,SRH03   DONE IF J GT N
                   20866:        BEQ  WC,SRTSN,SRH02   SKIP IF J EQUALS N
                   20867:        MOV  (XS),XR          SORT ARRAY BASE ADRS
                   20868:        MOV  1(XS),XL         KEY ARRAY BASE ADRS
                   20869:        ADD  SRTSO,XR         POINT TO A(0)
                   20870:        ADD  WC,XR            ADRS OF A(J)
                   20871:        MOV  1(XR),WA         GET A(J+1)
                   20872:        MOV  (XR),WB          GET A(J)
                   20873: *
                   20874: *      COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
                   20875: *
                   20876:        JSR  SORTC            COMPARE KEYS - LT(A(J+1),A(J))
                   20877:        PPM  SRH02            A(J+1) LT A(J)
                   20878:        ICA  WC               POINT TO GREATER SON, A(J+1)
                   20879:        EJC
                   20880: *
                   20881: *      SORTH (CONTINUED)
                   20882: *
                   20883: *      COMPARE ROOT WITH GREATER SON
                   20884: *
                   20885: SRH02  MOV  1(XS),XL         KEY ARRAY BASE ADRS
                   20886:        MOV  (XS),XR          GET SORT ARRAY ADDRESS
                   20887:        ADD  SRTSO,XR         ADRS OF A(0)
                   20888:        MOV  XR,WB            COPY THIS ADRS
                   20889:        ADD  WC,XR            ADRS OF GREATER SON, A(J)
                   20890:        MOV  (XR),WA          GET A(J)
                   20891:        MOV  WB,XR            POINT BACK TO A(0)
                   20892:        MOV  SRTRT,WB         GET ROOT
                   20893:        JSR  SORTC            COMPARE THEM - LT(A(J),ROOT)
                   20894:        PPM  SRH03            FATHER EXCEEDS SONS - DONE
                   20895:        MOV  (XS),XR          GET SORT ARRAY ADRS
                   20896:        ADD  SRTSO,XR         POINT TO A(0)
                   20897:        MOV  XR,XL            COPY IT
                   20898:        MOV  WC,WA            COPY J
                   20899:        BTW  WC               CONVERT TO WORDS
                   20900:        RSH  WC,1             GET J/2
                   20901:        WTB  WC               CONVERT BACK TO BAUS
                   20902:        ADD  WA,XL            POINT TO A(J)
                   20903:        ADD  WC,XR            ADRS OF A(J/2)
                   20904:        MOV  (XL),(XR)        A(J/2) = A(J)
                   20905:        MOV  WA,WC            RECOVER J
                   20906:        AOV  WC,WC,SRH03      J = J*2. DONE IF TOO BIG
                   20907:        BRN  SRH01            LOOP
                   20908: *
                   20909: *      FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
                   20910: *
                   20911: SRH03  BTW  WC               CONVERT TO WORDS
                   20912:        RSH  WC,1             J = J/2
                   20913:        WTB  WC               CONVERT BACK TO BAUS
                   20914:        MOV  (XS),XR          SORT ARRAY ADRS
                   20915:        ADD  SRTSO,XR         ADRS OF A(0)
                   20916:        ADD  WC,XR            ADRS OF A(J/2)
                   20917:        MOV  SRTRT,(XR)       A(J/2) = ROOT
                   20918:        MOV  SRTSN,WA         RESTORE WA
                   20919:        MOV  SRTWC,WC         RESTORE WC
                   20920:        EXI                   RETURN
                   20921:        ENP                   END PROCEDURE SORTH
                   20922:        EJC
                   20923: .FI
                   20924:        EJC
                   20925: *
                   20926: *      TFIND -- LOCATE TABLE ELEMENT
                   20927: *
                   20928: *      (XR)                  SUBSCRIPT VALUE FOR ELEMENT
                   20929: *      (XL)                  POINTER TO TABLE
                   20930: *      (WB)                  ZERO BY VALUE, NON-ZERO BY NAME
                   20931: *      JSR  TFIND            CALL TO LOCATE ELEMENT
                   20932: *      PPM  LOC              TRANSFER LOCATION IF ACCESS FAILS
                   20933: *      (XR)                  ELEMENT VALUE (IF BY VALUE)
                   20934: *      (XR)                  DESTROYED (IF BY NAME)
                   20935: *      (XL,WA)               TEBLK NAME (IF BY NAME)
                   20936: *      (XL,WA)               DESTROYED (IF BY VALUE)
                   20937: *      (WC,RA)               DESTROYED
                   20938: *
                   20939: *      NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
                   20940: *      SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
                   20941: *
                   20942: TFIND  PRC  E,1              ENTRY POINT
                   20943:        MOV  WB,-(XS)         SAVE NAME/VALUE INDICATOR
                   20944:        MOV  XR,-(XS)         SAVE SUBSCRIPT VALUE
                   20945:        MOV  XL,-(XS)         SAVE TABLE POINTER
                   20946:        MOV  TBLEN(XL),WA     LOAD LENGTH OF TBBLK
                   20947:        BTW  WA               CONVERT TO WORD COUNT
                   20948:        SUB  =TBBUK,WA        GET NUMBER OF BUCKETS
                   20949:        MTI  WA               CONVERT TO INTEGER VALUE
                   20950:        STI  TFNSI            SAVE FOR LATER
                   20951:        MOV  (XR),XL          LOAD FIRST WORD OF SUBSCRIPT
                   20952:        LEI  XL               LOAD BLOCK ENTRY ID (BL$XX)
                   20953:        BSW  XL,BL$$D,TFN00   SWITCH ON BLOCK TYPE
                   20954:        IFF  BL$IC,TFN02      JUMP IF INTEGER
                   20955: .IF    .CNRA
                   20956: .ELSE
                   20957:        IFF  BL$RC,TFN02      REAL
                   20958: .FI
                   20959:        IFF  BL$P0,TFN03      JUMP IF PATTERN
                   20960:        IFF  BL$P1,TFN03      JUMP IF PATTERN
                   20961:        IFF  BL$P2,TFN03      JUMP IF PATTERN
                   20962:        IFF  BL$NM,TFN04      JUMP IF NAME
                   20963:        IFF  BL$SC,TFN05      JUMP IF STRING
                   20964:        ESW                   END SWITCH ON BLOCK TYPE
                   20965: *
                   20966: *      HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
                   20967: *      BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
                   20968: *
                   20969: TFN00  MOV  1(XR),WA         LOAD SECOND WORD
                   20970: *
                   20971: *      MERGE HERE WITH ONE WORD HASH SOURCE IN WA
                   20972: *
                   20973: TFN01  MTI  WA               CONVERT TO INTEGER
                   20974:        BRN  TFN06            JUMP TO MERGE
                   20975:        EJC
                   20976: *
                   20977: *      TFIND (CONTINUED)
                   20978: *
                   20979: *      HERE FOR INTEGER OR REAL
                   20980: *      POSSIBILITY OF OVERFLOW EXIST ON TWOS COMPLEMENT
                   20981: *      MACHINE IF HASH SOURCE IS MOST NEGATIVE INTEGER OR IS
                   20982: *      A REAL HAVING THE SAME BIT PATTERN.
                   20983: *
                   20984: TFN02  LDI  1(XR)            LOAD VALUE AS HASH SOURCE
                   20985:        IGE  TFN06            OK IF POSITIVE OR ZERO
                   20986:        NGI                   MAKE POSITIVE
                   20987:        IOV  TFN06            CLEAR POSSIBLE OVERFLOW
                   20988:        BRN  TFN06            MERGE
                   20989: *
                   20990: *      FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
                   20991: *
                   20992: TFN03  MOV  (XR),WA          LOAD FIRST WORD AS HASH SOURCE
                   20993:        BRN  TFN01            MERGE BACK
                   20994: *
                   20995: *      FOR NAME, USE OFFSET AS HASH SOURCE
                   20996: *
                   20997: TFN04  MOV  NMOFS(XR),WA     LOAD OFFSET AS HASH SOURCE
                   20998:        BRN  TFN01            MERGE BACK
                   20999: *
                   21000: *      HERE FOR STRING
                   21001: *
                   21002: TFN05  JSR  HASHS            CALL ROUTINE TO COMPUTE HASH
                   21003: *
                   21004: *      MERGE HERE WITH HASH SOURCE IN (IA)
                   21005: *
                   21006: TFN06  RMI  TFNSI            COMPUTE HASH INDEX BY REMAINDERING
                   21007:        MFI  WC               GET AS ONE WORD INTEGER
                   21008:        WTB  WC               CONVERT TO BAU OFFSET
                   21009:        MOV  (XS),XL          GET TABLE PTR AGAIN
                   21010:        ADD  WC,XL            POINT TO PROPER BUCKET
                   21011:        MOV  TBBUK(XL),XR     LOAD FIRST TEBLK POINTER
                   21012:        BEQ  XR,(XS),TFN10    JUMP IF NO TEBLKS ON CHAIN
                   21013: *
                   21014: *      LOOP THROUGH TEBLKS ON HASH CHAIN
                   21015: *
                   21016: TFN07  MOV  XR,WB            SAVE TEBLK POINTER
                   21017:        MOV  TESUB(XR),XR     LOAD SUBSCRIPT VALUE
                   21018:        MOV  1(XS),XL         LOAD INPUT ARGUMENT SUBSCRIPT VAL
                   21019:        JSR  IDENT            COMPARE THEM
                   21020:        PPM  TFN08            JUMP IF EQUAL (IDENT)
                   21021: *
                   21022: *      HERE IF NO MATCH WITH THAT TEBLK
                   21023: *
                   21024:        MOV  WB,XL            RESTORE TEBLK POINTER
                   21025:        MOV  TENXT(XL),XR     POINT TO NEXT TEBLK ON CHAIN
                   21026:        BNE  XR,(XS),TFN07    JUMP IF THERE IS ONE
                   21027: *
                   21028: *      HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
                   21029: *
                   21030:        MOV  *TENXT,WC        SET OFFSET TO LINK FIELD (XL BASE)
                   21031:        BRN  TFN11            JUMP TO MERGE
                   21032:        EJC
                   21033: *
                   21034: *      TFIND (CONTINUED)
                   21035: *
                   21036: *      HERE WE HAVE FOUND A MATCHING ELEMENT
                   21037: *
                   21038: TFN08  MOV  WB,XL            RESTORE TEBLK POINTER
                   21039:        MOV  *TEVAL,WA        SET TEBLK NAME OFFSET
                   21040:        MOV  2(XS),WB         RESTORE NAME/VALUE INDICATOR
                   21041:        BNZ  WB,TFN09         JUMP IF CALLED BY NAME
                   21042:        JSR  ACESS            ELSE GET VALUE
                   21043:        PPM  TFN12            JUMP IF REFERENCE FAILS
                   21044:        ZER  WB               RESTORE NAME/VALUE INDICATOR
                   21045: *
                   21046: *      COMMON EXIT FOR ENTRY FOUND
                   21047: *
                   21048: TFN09  ADD  *NUM03,XS        POP STACK ENTRIES
                   21049:        EXI                   RETURN TO TFIND CALLER
                   21050: *
                   21051: *      HERE IF NO TEBLKS ON THE HASH CHAIN
                   21052: *
                   21053: TFN10  ADD  *TBBUK,WC        GET OFFSET TO BUCKET PTR
                   21054:        MOV  (XS),XL          SET TBBLK PTR AS BASE
                   21055: *
                   21056: *      MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
                   21057: *
                   21058: TFN11  MOV  (XS),XR          TBBLK POINTER
                   21059:        MOV  TBINV(XR),XR     LOAD DEFAULT VALUE IN CASE
                   21060:        MOV  2(XS),WB         LOAD NAME/VALUE INDICATOR
                   21061:        BZE  WB,TFN09         EXIT WITH DEFAULT IF VALUE CALL
                   21062:        MOV  XR,WB            COPY DEFAULT VALUE
                   21063: *
                   21064: *      HERE WE MUST BUILD A NEW TEBLK
                   21065: *
                   21066:        MOV  *TESI$,WA        SET SIZE OF TEBLK
                   21067:        JSR  ALLOC            ALLOCATE TEBLK
                   21068:        ADD  WC,XL            POINT TO HASH LINK
                   21069:        MOV  XR,(XL)          LINK NEW TEBLK AT END OF CHAIN
                   21070:        MOV  =B$TET,(XR)      STORE TYPE WORD
                   21071:        MOV  WB,TEVAL(XR)     SET DEFAULT AS INITIAL VALUE
                   21072:        MOV  (XS)+,TENXT(XR)  SET TBBLK PTR TO MARK END OF CHAIN
                   21073:        MOV  (XS)+,TESUB(XR)  STORE SUBSCRIPT VALUE
                   21074:        MOV  (XS)+,WB         RESTORE NAME/VALUE INDICATOR
                   21075:        MOV  XR,XL            COPY TEBLK POINTER (NAME BASE)
                   21076:        MOV  *TEVAL,WA        SET OFFSET
                   21077:        EXI                   RETURN TO CALLER WITH NEW TEBLK
                   21078: *
                   21079: *      ACESS FAIL RETURN
                   21080: *
                   21081: TFN12  EXI  1                ALTERNATIVE RETURN
                   21082:        ENP                   END PROCEDURE TFIND
                   21083:        EJC
                   21084: *
                   21085: *      TRACE -- SET/RESET A TRACE ASSOCIATION
                   21086: *
                   21087: *      THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
                   21088: *      EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
                   21089: *
                   21090: *      (XL)                  TRBLK PTR (TRACE) OR ZERO (STOPTR)
                   21091: *      1(XS)                 FIRST ARGUMENT (NAME)
                   21092: *      0(XS)                 SECOND ARGUMENT (TRACE TYPE)
                   21093: *      JSR  TRACE            CALL TO SET/RESET TRACE
                   21094: *      PPM  LOC              TRANSFER LOC IF 1ST ARG IS BAD NAME
                   21095: *      PPM  LOC              TRANSFER LOC IF 2ND ARG IS BAD TYPE
                   21096: *      PPM  LOC              FAIL STOPTR IF NON-EXISTENT TRACE
                   21097: *      (XS)                  POPPED
                   21098: *      (XL,XR,WA,WB,WC,IA)   DESTROYED
                   21099: *
                   21100: TRACE  PRC  N,3              ENTRY POINT
                   21101:        JSR  GTSTG            GET TRACE TYPE STRING
                   21102:        PPM  TRC15            JUMP IF NOT STRING
                   21103:        PLC  XR               ELSE POINT TO STRING
                   21104:        LCH  WA,(XR)          LOAD FIRST CHARACTER
                   21105: .IF    .CASL
                   21106:        BLT  WA,=CH$$A,TRC00  SKIP IF NOT LOWER CASE
                   21107:        SUB  =DFA$A,WA        CONVERT LOWER TO UPPER CASE
                   21108: *
                   21109: *      HERE WITH UPPER CASE TRACE TYPE CODE
                   21110: *
                   21111: TRC00  MOV  (XS),XR          LOAD NAME ARGUMENT
                   21112: .ELSE
                   21113:        MOV  (XS),XR          LOAD NAME ARGUMENT
                   21114: .FI
                   21115:        MOV  XL,(XS)          STACK TRBLK PTR OR ZERO
                   21116:        MOV  =TRTAC,WC        SET TRTYP FOR ACCESS TRACE
                   21117:        BEQ  WA,=CH$LA,TRC10  JUMP IF A (ACCESS)
                   21118:        MOV  =TRTVL,WC        SET TRTYP FOR VALUE TRACE
                   21119:        BEQ  WA,=CH$LV,TRC10  JUMP IF V (VALUE)
                   21120:        BEQ  WA,=CH$BL,TRC10  JUMP IF BLANK (VALUE)
                   21121: *
                   21122: *      HERE FOR L,K,F,C,R
                   21123: *
                   21124:        BEQ  WA,=CH$LF,TRC01  JUMP IF F (FUNCTION)
                   21125:        BEQ  WA,=CH$LR,TRC01  JUMP IF R (RETURN)
                   21126:        BEQ  WA,=CH$LL,TRC03  JUMP IF L (LABEL)
                   21127:        BEQ  WA,=CH$LK,TRC06  JUMP IF K (KEYWORD)
                   21128:        BNE  WA,=CH$LC,TRC15  ELSE ERROR IF NOT C (CALL)
                   21129: *
                   21130: *      HERE FOR F,C,R
                   21131: *
                   21132: TRC01  JSR  GTNVR            POINT TO VRBLK FOR NAME
                   21133:        PPM  TRC16            JUMP IF BAD NAME
                   21134:        ICA  XS               POP STACK
                   21135:        MOV  VRFNC(XR),XR     POINT TO FUNCTION BLOCK
                   21136:        BNE  (XR),=B$PFC,TRC17 ERROR IF NOT PROGRAM FUNCTION
                   21137:        MOV  XL,WB            COPY TRBLK PTR OR 0
                   21138:        BEQ  WA,=CH$LR,TRC02  JUMP IF R (RETURN)
                   21139:        EJC
                   21140: *
                   21141: *      TRACE (CONTINUED)
                   21142: *
                   21143: *      HERE FOR F,C TO SET/RESET CALL TRACE
                   21144: *
                   21145:        ORB  PFCTR(XR),WB     STOPTR FAIL CHECK
                   21146:        MOV  XL,PFCTR(XR)     SET/RESET CALL TRACE
                   21147:        BEQ  WA,=CH$LC,TRC11  RETURN IF LETTER C
                   21148: *
                   21149: *      HERE FOR F,R TO SET/RESET RETURN TRACE
                   21150: *
                   21151: TRC02  ORB  PFRTR(XR),WB     STOPTR FAIL CHECK
                   21152:        MOV  XL,PFRTR(XR)     SET/RESET RETURN TRACE
                   21153:        BRN  TRC11            RETURN
                   21154: *
                   21155: *      HERE FOR L TO SET/RESET LABEL TRACE
                   21156: *
                   21157: TRC03  JSR  GTNVR            POINT TO VRBLK
                   21158:        PPM  TRC16            JUMP IF BAD NAME
                   21159:        MOV  (XS)+,WB         GET TRBLK OR ZERO
                   21160:        MOV  VRLBL(XR),XL     LOAD LABEL POINTER
                   21161:        BNE  (XL),=B$TRT,TRC04 JUMP IF NO OLD TRACE
                   21162:        MOV  TRLBL(XL),XL     ELSE DELETE OLD TRACE ASSOCIATION
                   21163:        BRN  TRCA4            MERGE
                   21164: *
                   21165: *      HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
                   21166: *
                   21167: TRC04  BZE  WB,TRC12         FAIL IF STOPTR OF UNTRACED LABEL
                   21168: *
                   21169: *      TEST FOR UNDEFINED LABEL
                   21170: *
                   21171: TRCA4  BEQ  XL,=STNDL,TRC17  ERROR IF UNDEFINED LABEL
                   21172:        BZE  WB,TRC05         JUMP IF STOPTR CASE
                   21173:        MOV  WB,VRLBL(XR)     ELSE SET NEW TRBLK POINTER
                   21174:        MOV  =B$VRT,VRTRA(XR) SET LABEL TRACE ROUTINE ADDRESS
                   21175:        MOV  WB,XR            COPY TRBLK POINTER
                   21176:        MOV  XL,TRLBL(XR)     STORE REAL LABEL IN TRBLK
                   21177:        EXI                   RETURN
                   21178: *
                   21179: *      HERE FOR STOPTR CASE FOR LABEL
                   21180: *
                   21181: TRC05  MOV  XL,VRLBL(XR)     STORE LABEL PTR BACK IN VRBLK
                   21182:        MOV  =B$VRG,VRTRA(XR) STORE NORMAL TRANSFER ADDRESS
                   21183:        EXI                   RETURN
                   21184:        EJC
                   21185: *
                   21186: *      TRACE (CONTINUED)
                   21187: *
                   21188: *      HERE FOR K (KEYWORD)
                   21189: *
                   21190: TRC06  JSR  GTNVR            POINT TO VRBLK
                   21191:        PPM  TRC16            ERROR IF NOT NATURAL VAR
                   21192:        BNZ  VRLEN(XR),TRC16  ERROR IF NOT SYSTEM VAR
                   21193:        ICA  XS               POP STACK
                   21194:        BZE  XL,TRC07         JUMP IF STOPTR CASE
                   21195:        MOV  XR,TRKVR(XL)     STORE VRBLK PTR IN TRBLK FOR KTREX
                   21196: *
                   21197: *      MERGE HERE WITH TRBLK SET UP IN XL (OR ZERO)
                   21198: *
                   21199: TRC07  MOV  VRSVP(XR),XR     POINT TO SVBLK
                   21200:        MOV  XL,WB            COPY TRBLK PR OR 0
                   21201:        BEQ  XR,=V$ERT,TRC08  JUMP IF ERRTYPE
                   21202:        BEQ  XR,=V$STC,TRC09  JUMP IF STCOUNT
                   21203:        BNE  XR,=V$FNC,TRC17  ELSE ERROR IF NOT FNCLEVEL
                   21204: *
                   21205: *      FNCLEVEL
                   21206: *
                   21207:        ORB  R$FNC,WB         STOPTR FAIL CHECK
                   21208:        MOV  XL,R$FNC         SET/RESET FNCLEVEL TRACE
                   21209:        BRN  TRC11            RETURN
                   21210: *
                   21211: *      ERRTYPE
                   21212: *
                   21213: TRC08  ORB  R$ERT,WB         STOPTR FAIL CHECK
                   21214:        MOV  XL,R$ERT         SET/RESET ERRTYPE TRACE
                   21215:        BRN  TRC11            RETURN
                   21216: *
                   21217: *      STCOUNT
                   21218: *
                   21219: TRC09  ORB  R$STC,WB         STOPTR FAIL CHECK
                   21220:        MOV  XL,R$STC         SET/RESET STCOUNT TRACE
                   21221:        BRN  TRC11            RETURN
                   21222:        EJC
                   21223: *
                   21224: *      TRACE (CONTINUED)
                   21225: *
                   21226: *      A,V MERGE HERE WITH TRTYP VALUE IN WC
                   21227: *
                   21228: TRC10  JSR  GTVAR            LOCATE VARIABLE
                   21229:        PPM  TRC16            ERROR IF NOT APPROPRIATE NAME
                   21230:        MOV  (XS)+,XR         GET NEW TRBLK PTR AGAIN
                   21231:        MOV  WC,WB            COPY TRACE TYPE
                   21232:        JSR  TRCHN            UPDATE TRACE CHAIN
                   21233:        PPM  TRC12            FAIL
                   21234:        EXI                   RETURN
                   21235: *
                   21236: *      RETURN AFTER CHECKING STOPTR FAIL CONDITION (WB = 0)
                   21237: *
                   21238: TRC11  ZRB  WB,TRC12         FAIL IF NECESSARY
                   21239:        EXI                   ELSE RETURN
                   21240: *
                   21241: *      FAIL STOPTR
                   21242: *
                   21243: TRC12  EXI  3                FAIL RETURN
                   21244: *
                   21245: *      HERE FOR BAD TRACE TYPE
                   21246: *
                   21247: TRC15  EXI  2                TAKE BAD TRACE TYPE ERROR EXIT
                   21248: *
                   21249: *      POP STACK BEFORE FAILING
                   21250: *
                   21251: TRC16  ICA  XS               POP STACK
                   21252: *
                   21253: *      HERE FOR BAD NAME ARGUMENT
                   21254: *
                   21255: TRC17  EXI  1                TAKE BAD NAME ERROR EXIT
                   21256:        ENP                   END PROCEDURE TRACE
                   21257:        EJC
                   21258: *
                   21259: *      TRBLD -- BUILD TRBLK
                   21260: *
                   21261: *      TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
                   21262: *      TO CONSTRUCT A TRBLK (TRAP BLOCK)
                   21263: *
                   21264: *      (XR)                  TRTAG OR TRTER
                   21265: *      (XL)                  TRFNC OR TRTRI
                   21266: *      (WB)                  TRTYP
                   21267: *      JSR  TRBLD            CALL TO BUILD TRBLK
                   21268: *      (XR)                  POINTER TO TRBLK
                   21269: *      (WA)                  DESTROYED
                   21270: *
                   21271: TRBLD  PRC  E,0              ENTRY POINT
                   21272:        MOV  XR,-(XS)         STACK TRTAG (OR TRFNM)
                   21273:        MOV  *TRSI$,WA        SET SIZE OF TRBLK
                   21274:        JSR  ALLOC            ALLOCATE TRBLK
                   21275:        MOV  =B$TRT,(XR)      STORE FIRST WORD
                   21276:        MOV  XL,TRFNC(XR)     STORE TRFNC (OR TRTRI)
                   21277:        MOV  (XS)+,TRTAG(XR)  STORE TRTAG (OR TRTER)
                   21278:        MOV  WB,TRTYP(XR)     STORE TYPE
                   21279:        MOV  =NULLS,TRVAL(XR) FOR NOW, A NULL VALUE
                   21280:        EXI                   RETURN TO CALLER
                   21281:        ENP                   END PROCEDURE TRBLD
                   21282:        EJC
                   21283: *
                   21284: *      TRCHN -- UPDATE TRACE BLOCK CHAIN
                   21285: *
                   21286: *      CALLED WHEN A TRACE BLOCK CHAIN IS TO BE UPDATED BY
                   21287: *      ADDITION OR REMOVAL OF A TRBLK.
                   21288: *      IF A TRBLK OF THE SAME TYPE AS AN ADDITION IS ALREADY
                   21289: *      PRESENT IT IS DELETED. THE TRTAG FIELD OF ANY DELETED
                   21290: *      TRBLK IS CLEARED AS REQUIRED BY S$ENF.
                   21291: *
                   21292: *      (XL,WA)               POINTER, OFFSET TO TRACED VARIABLE
                   21293: *      (XR)                  PTR TO NEW TRBLK OR 0 FOR REMOVAL
                   21294: *      (WB)                  TRACE TYPE (TRTYP)
                   21295: *      JSR  TRCHN            CALL TO UPDATE TRACE CHAIN
                   21296: *      PPM  LOC              NO TRACE BLK OF REQD DELETION TYPE
                   21297: *      (WA,WC)               DESTROYED
                   21298: *
                   21299: TRCHN  PRC  E,1              ENTRY POINT
                   21300:        ADD  XL,WA            KEEP POINTER TO TRACED LOCATION
                   21301:        MOV  WA,XL            COPY POINTER
                   21302:        SUB  *TRNXT,XL        ADJUST OFFSET BEFORE ENTERING LOOP
                   21303:        MOV  XR,WC            COPY TRBLK PTR
                   21304: *
                   21305: *      LOOP TO FIND TRACE BLOCK
                   21306: *
                   21307: TRCH1  MOV  XL,XR            COPY SO XR POINTS TO PREDECESSOR
                   21308:        MOV  TRNXT(XL),XL     POINT TO POSSIBLE TRACE BLOCK
                   21309:        BNE  (XL),=B$TRT,TRCH2 SKIP OUT AT CHAIN END
                   21310:        BLT  WB,TRTYP(XL),TRCH2 SKIP IF TOO FAR OUT ON CHAIN
                   21311:        BNE  WB,TRTYP(XL),TRCH1 LOOP UNLESS TYPE MATCHES
                   21312:        MOV  TRNXT(XL),TRNXT(XR) REMOVE LINK TO OLD TRBLK
                   21313:        ZER  TRTAG(XL)        CLEAR IOTAG FIELD OF DELETED BLOCK
                   21314:        BZE  WC,TRCH3         DONE IF NO NEW TRBLK
                   21315: *
                   21316: *      OLD TRBLK REMOVED AND/OR END OF CHAIN REACHED
                   21317: *
                   21318: TRCH2  BZE  WC,TRCH4         FAIL IF REQD BLOCK TYPE NOT FOUND
                   21319:        MOV  WC,XL            POINT TO NEW TRBLK
                   21320:        MOV  TRNXT(XR),TRNXT(XL) ATTACH TAIL OF CHAIN TO IT
                   21321:        MOV  WC,TRNXT(XR)     LINK NEW BLOCK IN
                   21322:        MOV  WB,TRTYP(XL)     ENSURE TRTYP FIELD SET UP
                   21323: *
                   21324: *      UPDATE ACCESS FIELDS OF NAME IF IT IS A VRBLK
                   21325: *
                   21326: TRCH3  MOV  WA,XR            POINT TO VBL
                   21327:        SUB  *VRVAL,XR        ADJUST TO POSSIBLE VRBLK NAME BASE
                   21328:        JSR  SETVR            UPDATE ACCESS FIELDS
                   21329:        MOV  WA,XL            RECOVER XL
                   21330:        MOV  WC,XR            RECOVER XR
                   21331:        EXI                   RETURN TO CALLER
                   21332: *
                   21333: *      FAIL RETURN
                   21334: *
                   21335: TRCH4  MOV  WA,XL            RECOVER XL
                   21336:        MOV  WC,XR            RECOVER XR
                   21337:        EXI  1                FAIL
                   21338:        ENP                   END PROCEDURE TRCHN
                   21339:        EJC
                   21340: *
                   21341: *      TRIMR -- TRIM TRAILING BLANKS
                   21342: *
                   21343: *      TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
                   21344: *      LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
                   21345: *      TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
                   21346: *      THE END OF THE (POSSIBLY) SHORTENED BLOCK.
                   21347: *
                   21348: *      (WB)                  NON-ZERO TO TRIM TRAILING BLANKS
                   21349: *      (XR)                  POINTER TO STRING TO TRIM
                   21350: *      JSR  TRIMR            CALL TO TRIM STRING
                   21351: *      (XR)                  POINTER TO TRIMMED STRING
                   21352: *      (XL,WA,WB,WC)         DESTROYED
                   21353: *
                   21354: *      THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
                   21355: *      AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
                   21356: *
                   21357: TRIMR  PRC  E,0              ENTRY POINT
                   21358:        MOV  XR,XL            COPY STRING POINTER
                   21359:        MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   21360:        BZE  WA,TRIM2         JUMP IF NULL INPUT
                   21361:        PLC  XL,WA            ELSE POINT PAST LAST CHARACTER
                   21362:        BZE  WB,TRIM3         JUMP IF NO TRIM
                   21363:        MOV  =CH$BL,WC        LOAD BLANK CHARACTER
                   21364: *
                   21365: *      LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
                   21366: *
                   21367: TRIM0  LCH  WB,-(XL)         LOAD NEXT CHARACTER
                   21368: .IF    .CAHT
                   21369:        BEQ  WB,=CH$HT,TRIM1  JUMP IF HORIZONTAL TAB
                   21370: .FI
                   21371:        BNE  WB,WC,TRIM3      JUMP IF NON-BLANK FOUND
                   21372: TRIM1  DCV  WA               ELSE DECREMENT CHARACTER COUNT
                   21373:        BNZ  WA,TRIM0         LOOP BACK IF MORE TO CHECK
                   21374: *
                   21375: *      HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
                   21376: *
                   21377: TRIM2  MOV  XR,DNAMP         WIPE OUT INPUT STRING BLOCK
                   21378:        MOV  =NULLS,XR        LOAD NULL RESULT
                   21379:        BRN  TRIM5            MERGE TO EXIT
                   21380:        EJC
                   21381: *
                   21382: *      TRIMR (CONTINUED)
                   21383: *
                   21384: *      HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
                   21385: *
                   21386: TRIM3  MOV  WA,SCLEN(XR)     SET NEW LENGTH
                   21387:        MOV  XR,XL            COPY STRING POINTER
                   21388:        PSC  XL,WA            READY FOR STORING ZEROES
                   21389:        CTB  WA,SCHAR         GET LENGTH OF BLOCK IN BAUS
                   21390:        ADD  XR,WA            POINT PAST NEW BLOCK
                   21391:        MOV  WA,DNAMP         SET NEW TOP OF STORAGE POINTER
                   21392:        LCT  WA,=CFP$C        GET COUNT OF CHARS IN WORD
                   21393:        ZER  WC               SET ZERO CHAR
                   21394: *
                   21395: *      LOOP TO ZERO PAD LAST WORD OF CHARACTERS
                   21396: *
                   21397: TRIM4  SCH  WC,(XL)+         STORE ZERO CHARACTER
                   21398:        BCT  WA,TRIM4         LOOP BACK TILL ALL STORED
                   21399:        CSC  XL               COMPLETE STORE CHARACTERS
                   21400: *
                   21401: *      COMMON EXIT POINT
                   21402: *
                   21403: TRIM5  ZER  XL               CLEAR GARBAGE XL POINTER
                   21404:        EXI                   RETURN TO CALLER
                   21405:        ENP                   END PROCEDURE TRIMR
                   21406:        EJC
                   21407: *
                   21408: *      TRXEQ -- EXECUTE FUNCTION TYPE TRACE
                   21409: *
                   21410: *      TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
                   21411: *      HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
                   21412: *
                   21413: *      (XR)                  POINTER TO TRBLK
                   21414: *      (XL,WA)               NAME BASE,OFFSET FOR VARIABLE
                   21415: *      JSR  TRXEQ            CALL TO EXECUTE TRACE
                   21416: *      (WB,WC,RA)            DESTROYED
                   21417: *
                   21418: *      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
                   21419: *      CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
                   21420: *
                   21421: *                            TRXEQ RETURN POINT WORD(S)
                   21422: *                            SAVED VALUE OF TRACE KEYWORD
                   21423: *                            TRBLK POINTER
                   21424: *                            NAME BASE
                   21425: *                            NAME OFFSET
                   21426: *                            SAVED VALUE OF R$COD
                   21427: *                            SAVED CODE PTR (-R$COD)
                   21428: *                            SAVED VALUE OF FLPTR
                   21429: *      FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
                   21430: *                            NMBLK FOR VARIABLE NAME
                   21431: *      XS ------------------ TRACE TAG
                   21432: *
                   21433: *      R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
                   21434: *      CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
                   21435: *      OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
                   21436: *
                   21437: TRXEQ  PRC  R,0              ENTRY POINT (RECURSIVE)
                   21438:        MOV  R$COD,WC         LOAD CODE BLOCK POINTER
                   21439:        SCP  WB               GET CURRENT CODE POINTER
                   21440:        SUB  WC,WB            MAKE CODE POINTER INTO OFFSET
                   21441:        MOV  KVTRA,-(XS)      STACK TRACE KEYWORD VALUE
                   21442:        MOV  XR,-(XS)         STACK TRBLK POINTER
                   21443:        MOV  XL,-(XS)         STACK NAME BASE
                   21444:        MOV  WA,-(XS)         STACK NAME OFFSET
                   21445:        MOV  WC,-(XS)         STACK CODE BLOCK POINTER
                   21446:        MOV  WB,-(XS)         STACK CODE POINTER OFFSET
                   21447:        MOV  FLPTR,-(XS)      STACK OLD FAILURE POINTER
                   21448:        ZER  -(XS)            SET DUMMY FAIL OFFSET
                   21449:        MOV  XS,FLPTR         SET NEW FAILURE POINTER
                   21450:        ZER  KVTRA            RESET TRACE KEYWORD TO ZERO
                   21451:        MOV  =TRXDC,WC        LOAD NEW (DUMMY) CODE BLK POINTER
                   21452:        MOV  WC,R$COD         SET AS CODE BLOCK POINTER
                   21453:        LCP  WC               AND NEW CODE POINTER
                   21454:        EJC
                   21455: *
                   21456: *      TRXEQ (CONTINUED)
                   21457: *
                   21458: *      NOW PREPARE ARGUMENTS FOR FUNCTION
                   21459: *
                   21460:        MOV  WA,WB            SAVE NAME OFFSET
                   21461:        MOV  *NMSI$,WA        LOAD NMBLK SIZE
                   21462:        JSR  ALLOC            ALLOCATE SPACE FOR NMBLK
                   21463:        MOV  =B$NML,(XR)      SET TYPE WORD
                   21464:        MOV  XL,NMBAS(XR)     STORE NAME BASE
                   21465:        MOV  WB,NMOFS(XR)     STORE NAME OFFSET
                   21466:        MOV  6(XS),XL         RELOAD POINTER TO TRBLK
                   21467:        MOV  XR,-(XS)         STACK NMBLK POINTER (1ST ARGUMENT)
                   21468:        MOV  TRTAG(XL),-(XS)  STACK TRACE TAG (2ND ARGUMENT)
                   21469:        MOV  TRFNC(XL),XL     LOAD TRACE FUNCTION POINTER
                   21470:        MOV  =NUM02,WA        SET NUMBER OF ARGUMENTS TO TWO
                   21471:        BRN  CFUNC            JUMP TO CALL FUNCTION
                   21472: *
                   21473: *      SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
                   21474: *
                   21475: TRXQR  MOV  FLPTR,XS         POINT BACK TO OUR STACK ENTRIES
                   21476:        ICA  XS               POP OFF GARBAGE FAIL OFFSET
                   21477:        MOV  (XS)+,FLPTR      RESTORE OLD FAILURE POINTER
                   21478:        MOV  (XS)+,WB         RELOAD CODE OFFSET
                   21479:        MOV  (XS)+,WC         LOAD OLD CODE BASE POINTER
                   21480:        MOV  WC,XR            COPY CDBLK POINTER
                   21481:        MOV  CDSTM(XR),KVSTN  RESTORE STMNT NO
                   21482:        MOV  (XS)+,WA         RELOAD NAME OFFSET
                   21483:        MOV  (XS)+,XL         RELOAD NAME BASE
                   21484:        MOV  (XS)+,XR         RELOAD TRBLK POINTER
                   21485:        MOV  (XS)+,KVTRA      RESTORE TRACE KEYWORD VALUE
                   21486:        ADD  WC,WB            RECOMPUTE ABSOLUTE CODE POINTER
                   21487:        LCP  WB               RESTORE CODE POINTER
                   21488:        MOV  WC,R$COD         AND CODE BLOCK POINTER
                   21489:        EXI                   RETURN TO TRXEQ CALLER
                   21490:        ENP                   END PROCEDURE TRXEQ
                   21491:        EJC
                   21492: *
                   21493: *      XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
                   21494: *
                   21495: *      XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
                   21496: *      ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
                   21497: *      CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
                   21498: *      PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
                   21499: *
                   21500: *      R$XSC                 POINTER TO SCBLK FOR FUNCTION ARG
                   21501: *      XSOFS                 OFFSET (NUM CHARS SCANNED SO FAR)
                   21502: *
                   21503: *      (WC)                  DELIMITER ONE (CH$XX)
                   21504: *      (XL)                  DELIMITER TWO (CH$XX)
                   21505: *      JSR  XSCAN            CALL TO SCAN NEXT ITEM
                   21506: *      (XR)                  POINTER TO SCBLK FOR TOKEN SCANNED
                   21507: *      (WA)                  COMPLETION CODE (SEE BELOW)
                   21508: *      (WC,XL)               DESTROYED
                   21509: *      (XSCNB)               ERROR INDICATOR - SEE 4) BELOW
                   21510: *
                   21511: *      LEADING BLANKS AND TRAILING BLANKS POSITIONED BEFORE A
                   21512: *      DELIMITER OR AT THE END OF THE ARGUMENT STRING ARE
                   21513: *      IGNORED. OTHER BLANKS ARE ILLEGAL.
                   21514: *      THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
                   21515: *      UNTIL ONE OF THE FOLLOWING CONDITIONS OCCURS.
                   21516: *
                   21517: *      1)   DELIMITER ONE IS ENCOUNTERED  (WA SET TO 1)
                   21518: *
                   21519: *      2)   DELIMITER TWO ENCOUNTERED  (WA SET TO 2)
                   21520: *
                   21521: *      3)   END OF STRING ENCOUNTERED  (WA AND XSCNB SET TO 0)
                   21522: *
                   21523: *      4)   ILLEGAL BLANK  (WA 0, XSCNB NON-ZERO)
                   21524: *
                   21525: *      THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
                   21526: *      UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
                   21527: *      THE POINTER IS LEFT POINTING PAST THE DELIMITER.
                   21528: *
                   21529: *      IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
                   21530: *      AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
                   21531: *
                   21532: *      IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
                   21533: *      STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
                   21534: *      STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
                   21535: *      XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
                   21536:        EJC
                   21537: *
                   21538: *      XSCAN (CONTINUED)
                   21539: *
                   21540: XSCAN  PRC  E,0              ENTRY POINT
                   21541:        MOV  WB,XSCWB         PRESERVE WB
                   21542:        ZER  XSCBL            CLEAR COUNT OF TRAILING BLANKS
                   21543:        ZER  XSCNB            CLEAR NON-BLANK SEEN FLAG
                   21544:        MOV  R$XSC,XR         POINT TO ARGUMENT STRING
                   21545:        MOV  SCLEN(XR),WA     LOAD STRING LENGTH
                   21546:        MOV  XSOFS,WB         LOAD CURRENT OFFSET
                   21547:        SUB  WB,WA            GET NUMBER OF REMAINING CHARACTERS
                   21548:        BZE  WA,XSCN2         JUMP IF NO CHARACTERS LEFT
                   21549:        PLC  XR,WB            POINT TO CURRENT CHARACTER
                   21550: *
                   21551: *      LOOP TO SEARCH FOR DELIMITER
                   21552: *
                   21553: XSCN0  LCH  WB,(XR)+         LOAD NEXT CHARACTER
                   21554:        BEQ  WB,WC,XSCN3      JUMP IF DELIMITER ONE FOUND
                   21555:        BEQ  WB,XL,XSCN4      JUMP IF DELIMITER TWO FOUND
                   21556:        BEQ  WB,=CH$BL,XSCN7  SKIP IF IT IS A BLANK
                   21557: .IF    .CAHT
                   21558:        BEQ  WB,=CH$HT,XSCN7  SKIP IF IT IS A TAB
                   21559: .FI
                   21560:        BNZ  XSCBL,XSCN2      FAIL CHAR AFTER TRAILING BLANK
                   21561:        MNZ  XSCNB            NOTE A NON-BLANK SEEN
                   21562: *
                   21563: *      COUNT CHARS DONE
                   21564: *
                   21565: XSCN1  DCV  WA               DECREMENT COUNT OF CHARS LEFT
                   21566:        BNZ  WA,XSCN0         LOOP BACK IF MORE CHARS TO GO
                   21567:        ZER  XSCNB            CLEAR ERRONEOUS BLANKS FLAG
                   21568: *
                   21569: *      HERE FOR RUNOUT
                   21570: *
                   21571: XSCN2  MOV  R$XSC,XL         POINT TO STRING BLOCK
                   21572:        MOV  SCLEN(XL),WA     GET STRING LENGTH
                   21573:        MOV  XSOFS,WB         LOAD OFFSET
                   21574:        SUB  WB,WA            GET SUBSTRING LENGTH
                   21575:        SUB  XSCBL,WA         ADJUST FOR TRAILING BLANKS
                   21576:        ZER  R$XSC            CLEAR STRING PTR FOR COLLECTOR
                   21577:        ZER  XSCRT            SET ZERO (RUNOUT) RETURN CODE
                   21578:        BRN  XSCN6            JUMP TO EXIT
                   21579:        EJC
                   21580: *
                   21581: *      XSCAN (CONTINUED)
                   21582: *
                   21583: *      HERE IF DELIMITER ONE FOUND
                   21584: *
                   21585: XSCN3  MOV  =NUM01,XSCRT     SET RETURN CODE
                   21586:        BRN  XSCN5            JUMP TO MERGE
                   21587: *
                   21588: *      HERE IF DELIMITER TWO FOUND
                   21589: *
                   21590: XSCN4  MOV  =NUM02,XSCRT     SET RETURN CODE
                   21591: *
                   21592: *      MERGE HERE AFTER DETECTING A DELIMITER
                   21593: *
                   21594: XSCN5  MOV  R$XSC,XL         RELOAD POINTER TO STRING
                   21595:        MOV  SCLEN(XL),WC     GET ORIGINAL LENGTH OF STRING
                   21596:        SUB  WA,WC            MINUS CHARS LEFT = CHARS SCANNED
                   21597:        MOV  WC,WA            MOVE TO REG FOR SBSTR
                   21598:        SUB  XSCBL,WA         ADJUST FOR TRAILING BLANKS
                   21599:        MOV  XSOFS,WB         SET OFFSET
                   21600:        SUB  WB,WA            COMPUTE LENGTH FOR SBSTR
                   21601:        ICV  WC               ADJUST NEW CURSOR PAST DELIMITER
                   21602:        MOV  WC,XSOFS         STORE NEW OFFSET
                   21603: *
                   21604: *      COMMON EXIT POINT
                   21605: *
                   21606: XSCN6  ZER  XR               CLEAR GARBAGE CHARACTER PTR IN XR
                   21607: .IF    .CASL
                   21608:        JSR  SBSTG            BUILD SUBSTRING
                   21609: .ELSE
                   21610:        JSR  SBSTR            BUILD SUB-STRING
                   21611: .FI
                   21612:        MOV  XSCRT,WA         LOAD RETURN CODE
                   21613:        MOV  XSCWB,WB         RESTORE WB
                   21614:        EXI                   RETURN TO XSCAN CALLER
                   21615: *
                   21616: *      DEAL WITH BLANK
                   21617: *
                   21618: XSCN7  BZE  XSCNB,XSCN8      SKIP IF LEADING BLANK
                   21619:        ICV  XSCBL            ELSE COUNT TRAILING BLANK
                   21620:        BRN  XSCN1            LOOP
                   21621: *
                   21622: *      LEADING BLANK
                   21623: *
                   21624: XSCN8  ICV  XSOFS            PUSH OFFSET PAST BLANK
                   21625:        BRN  XSCN1            LOOP
                   21626:        ENP                   END PROCEDURE XSCAN
                   21627:        EJC
                   21628: *
                   21629: *      XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
                   21630: *
                   21631: *      XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
                   21632: *      IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
                   21633: *      XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
                   21634: *
                   21635: *      -(XS)                 ARGUMENT TO BE SCANNED (ON STACK)
                   21636: *      JSR  XSCNI            CALL TO SCAN ARGUMENT
                   21637: *      PPM  LOC              TRANSFER LOC IF ARG IS NOT STRING
                   21638: *      PPM  LOC              TRANSFER LOC IF ARGUMENT IS NULL
                   21639: *      (XS)                  POPPED
                   21640: *      (XR,R$XSC)            ARGUMENT (SCBLK PTR)
                   21641: *      (WA)                  ARGUMENT LENGTH
                   21642: *      (IA,RA)               DESTROYED
                   21643: *
                   21644: XSCNI  PRC  N,2              ENTRY POINT
                   21645:        JSR  GTSTG            FETCH ARGUMENT AS STRING
                   21646:        PPM  XSCI1            JUMP IF NOT CONVERTIBLE
                   21647:        MOV  XR,R$XSC         ELSE STORE SCBLK PTR FOR XSCAN
                   21648:        ZER  XSOFS            SET OFFSET TO ZERO
                   21649:        BZE  WA,XSCI2         JUMP IF NULL STRING
                   21650:        EXI                   RETURN TO XSCNI CALLER
                   21651: *
                   21652: *      HERE IF ARGUMENT IS NOT A STRING
                   21653: *
                   21654: XSCI1  EXI  1                TAKE NOT-STRING ERROR EXIT
                   21655: *
                   21656: *      HERE FOR NULL STRING
                   21657: *
                   21658: XSCI2  EXI  2                TAKE NULL-STRING ERROR EXIT
                   21659:        ENP                   END PROCEDURE XSCNI
                   21660:        TTL  S P I T B O L -- UTILITY ROUTINES
                   21661: *
                   21662: *      THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
                   21663: *      VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
                   21664: *      FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
                   21665: *      THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
                   21666: *      TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
                   21667: *      INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
                   21668: *      PARAMETER VALUES.
                   21669: *
                   21670: *      THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
                   21671: *      DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
                   21672: *      MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
                   21673: *      CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
                   21674: *
                   21675: *      SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
                   21676: *      IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
                   21677: *      EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
                   21678: *      EXITING AFTER COMPLETING ITS TASK.
                   21679: *
                   21680: *      THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
                   21681: *      AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
                   21682:        EJC
                   21683: *      ARREF -- ARRAY REFERENCE
                   21684: *
                   21685: *      (XL)                  MAY BE NON-COLLECTABLE
                   21686: *      (XR)                  NUMBER OF SUBSCRIPTS
                   21687: *      (WB)                  SET ZERO/NONZERO FOR VALUE/NAME
                   21688: *                            THE VALUE IN WB MUST BE COLLECTABLE
                   21689: *      STACK                 SUBSCRIPTS AND ARRAY OPERAND
                   21690: *      BRN  ARREF            JUMP TO CALL FUNCTION
                   21691: *
                   21692: *      ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
                   21693: *      THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
                   21694: *      TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
                   21695: *      ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
                   21696: *      WORKING BELOW THE STACK POINTER.
                   21697: *
                   21698: ARREF  RTN
                   21699:        MOV  XR,WA            COPY NUMBER OF SUBSCRIPTS
                   21700:        MOV  XS,XT            POINT TO STACK FRONT
                   21701:        WTB  XR               CONVERT TO BAU OFFSET
                   21702:        ADD  XR,XT            POINT TO ARRAY OPERAND ON STACK
                   21703:        ICA  XT               FINAL VALUE FOR STACK POPPING
                   21704:        MOV  XT,ARFXS         KEEP FOR LATER
                   21705:        MOV  -(XT),XR         LOAD ARRAY OPERAND POINTER
                   21706:        MOV  XR,R$ARF         KEEP ARRAY POINTER
                   21707:        MOV  XT,XR            SAVE POINTER TO SUBSCRIPTS
                   21708:        MOV  R$ARF,XL         POINT XL TO POSSIBLE VCBLK OR TBBLK
                   21709:        MOV  (XL),WC          LOAD FIRST WORD
                   21710:        BEQ  WC,=B$ART,ARF01  JUMP IF ARBLK
                   21711:        BEQ  WC,=B$VCT,ARF07  JUMP IF VCBLK
                   21712:        BEQ  WC,=B$TBT,ARF10  JUMP IF TBBLK
                   21713:        ERB  240,SUBSCRIPTED OPERAND IS NOT TABLE OR ARRAY
                   21714: *
                   21715: *      HERE FOR ARRAY (ARBLK)
                   21716: *
                   21717: ARF01  BNE  WA,ARNDM(XL),ARF09 JUMP IF WRONG NUMBER OF DIMS
                   21718:        LDI  INTV0            GET INITIAL SUBSCRIPT OF ZERO
                   21719:        MOV  XR,XT            POINT BEFORE SUBSCRIPTS
                   21720:        ZER  WA               INITIAL OFFSET TO BOUNDS
                   21721:        BRN  ARF03            JUMP INTO LOOP
                   21722: *
                   21723: *      LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
                   21724: *
                   21725: ARF02  MLI  ARDM2(XR)        MULTIPLY TOTAL BY NEXT DIMENSION
                   21726: *
                   21727: *      MERGE HERE FIRST TIME
                   21728: *
                   21729: ARF03  MOV  -(XT),XR         LOAD NEXT SUBSCRIPT
                   21730:        STI  ARFSI            SAVE CURRENT SUBSCRIPT
                   21731:        LDI  ICVAL(XR)        LOAD INTEGER VALUE IN CASE
                   21732:        BEQ  (XR),=B$ICL,ARF04 JUMP IF IT WAS AN INTEGER
                   21733:        EJC
                   21734: *
                   21735: *      ARREF (CONTINUED)
                   21736: *
                   21737: *
                   21738:        JSR  GTINT            CONVERT TO INTEGER
                   21739:        PPM  ARF12            JUMP IF NOT INTEGER
                   21740:        LDI  ICVAL(XR)        IF OK, LOAD INTEGER VALUE
                   21741: *
                   21742: *      HERE WITH INTEGER SUBSCRIPT IN (IA)
                   21743: *
                   21744: ARF04  MOV  R$ARF,XR         POINT TO ARRAY
                   21745:        ADD  WA,XR            OFFSET TO NEXT BOUNDS
                   21746:        SBI  ARLBD(XR)        SUBTRACT LOW BOUND TO COMPARE
                   21747:        IOV  ARF13            OUT OF RANGE FAIL IF OVERFLOW
                   21748:        ILT  ARF13            OUT OF RANGE FAIL IF TOO SMALL
                   21749:        SBI  ARDIM(XR)        SUBTRACT DIMENSION
                   21750:        IGE  ARF13            OUT OF RANGE FAIL IF TOO LARGE
                   21751:        ADI  ARDIM(XR)        ELSE RESTORE SUBSCRIPT OFFSET
                   21752:        ADI  ARFSI            ADD TO CURRENT TOTAL
                   21753:        ADD  *ARDMS,WA        POINT TO NEXT BOUNDS
                   21754:        BNE  XT,XS,ARF02      LOOP BACK IF MORE TO GO
                   21755: *
                   21756: *      HERE WITH INTEGER SUBSCRIPT COMPUTED
                   21757: *
                   21758:        MFI  WA               GET AS ONE WORD INTEGER
                   21759:        WTB  WA               CONVERT TO OFFSET
                   21760:        MOV  R$ARF,XL         POINT TO ARBLK
                   21761:        ADD  AROFS(XL),WA     ADD OFFSET PAST BOUNDS
                   21762:        ICA  WA               ADJUST FOR ARPRO FIELD
                   21763:        BNZ  WB,ARF08         EXIT WITH NAME IF NAME CALL
                   21764: *
                   21765: *      MERGE HERE TO GET VALUE FOR VALUE CALL
                   21766: *
                   21767: ARF05  JSR  ACESS            GET VALUE
                   21768:        PPM  ARF13            FAIL IF ACESS FAILS
                   21769: *
                   21770: *      RETURN VALUE
                   21771: *
                   21772: ARF06  MOV  ARFXS,XS         POP STACK ENTRIES
                   21773:        ZER  R$ARF            FINISHED WITH ARRAY POINTER
                   21774:        BRN  EXIXR            EXIT WITH VALUE IN XR
                   21775:        EJC
                   21776: *
                   21777: *      ARREF (CONTINUED)
                   21778: *
                   21779: *      HERE FOR VECTOR
                   21780: *
                   21781: ARF07  BNE  WA,=NUM01,ARF09  ERROR IF MORE THAN 1 SUBSCRIPT
                   21782:        MOV  (XS),XR          ELSE LOAD SUBSCRIPT
                   21783:        JSR  GTINT            CONVERT TO INTEGER
                   21784:        PPM  ARF12            ERROR IF NOT INTEGER
                   21785:        LDI  ICVAL(XR)        ELSE LOAD INTEGER VALUE
                   21786:        SBI  INTV1            SUBTRACT FOR ONES OFFSET
                   21787:        MFI  WA,ARF13         GET SUBSCRIPT AS ONE WORD
                   21788:        ADD  =VCVLS,WA        ADD OFFSET FOR STANDARD FIELDS
                   21789:        WTB  WA               CONVERT OFFSET TO BAUS
                   21790:        BGE  WA,VCLEN(XL),ARF13 FAIL IF OUT OF RANGE SUBSCRIPT
                   21791:        BZE  WB,ARF05         BACK TO GET VALUE IF VALUE CALL
                   21792: *
                   21793: *      RETURN NAME
                   21794: *
                   21795: ARF08  MOV  ARFXS,XS         POP STACK ENTRIES
                   21796:        ZER  R$ARF            FINISHED WITH ARRAY POINTER
                   21797:        BRN  EXNAM            ELSE EXIT WITH NAME
                   21798: *
                   21799: *      HERE IF SUBSCRIPT COUNT IS WRONG
                   21800: *
                   21801: ARF09  ERB  241,ARRAY REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
                   21802: *
                   21803: *      TABLE
                   21804: *
                   21805: ARF10  BNE  WA,=NUM01,ARF11  ERROR IF MORE THAN 1 SUBSCRIPT
                   21806:        MOV  (XS),XR          ELSE LOAD SUBSCRIPT
                   21807:        JSR  TFIND            CALL TABLE SEARCH ROUTINE
                   21808:        PPM  ARF13            FAIL IF FAILED
                   21809:        BNZ  WB,ARF08         EXIT WITH NAME IF NAME CALL
                   21810:        BRN  ARF06            ELSE EXIT WITH VALUE
                   21811: *
                   21812: *      HERE FOR BAD TABLE REFERENCE
                   21813: *
                   21814: ARF11  ERB  242,TABLE REFERENCED WITH MORE THAN ONE SUBSCRIPT
                   21815: *
                   21816: *      HERE FOR BAD SUBSCRIPT
                   21817: *
                   21818: ARF12  ERB  243,ARRAY SUBSCRIPT IS NOT INTEGER
                   21819: *
                   21820: *      HERE TO SIGNAL FAILURE
                   21821: *
                   21822: ARF13  ZER  R$ARF            FINISHED WITH ARRAY POINTER
                   21823:        BRN  EXFAL            FAIL
                   21824:        EJC
                   21825: *
                   21826: *      CFUNC -- CALL A FUNCTION
                   21827: *
                   21828: *      CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
                   21829: *      USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
                   21830: *      TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
                   21831: *      (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
                   21832: *      IF THE NUMBER OF ARGUMENTS IS INCORRECT.
                   21833: *
                   21834: *      (XL)                  POINTER TO FUNCTION BLOCK
                   21835: *      (WA)                  ACTUAL NUMBER OF ARGUMENTS
                   21836: *      (XS)                  POINTS TO STACKED ARGUMENTS
                   21837: *      BRN  CFUNC            JUMP TO CALL FUNCTION
                   21838: *
                   21839: *      CFUNC CONTINUES BY EXECUTING THE FUNCTION
                   21840: *
                   21841: CFUNC  RTN
                   21842:        BLT  WA,FARGS(XL),CFNC1 JUMP IF TOO FEW ARGUMENTS
                   21843:        BEQ  WA,FARGS(XL),CFNC3 JUMP IF CORRECT NUMBER OF ARGS
                   21844: *
                   21845: *      HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
                   21846: *
                   21847:        MOV  WA,WB            COPY ACTUAL NUMBER
                   21848:        SUB  FARGS(XL),WB     GET NUMBER OF EXTRA ARGS
                   21849:        WTB  WB               CONVERT TO BAUS
                   21850:        ADD  WB,XS            POP OFF UNWANTED ARGUMENTS
                   21851:        BRN  CFNC3            JUMP TO GO OFF TO FUNCTION
                   21852: *
                   21853: *      HERE IF TOO FEW ARGUMENTS
                   21854: *
                   21855: CFNC1  MOV  FARGS(XL),WB     LOAD REQUIRED NUMBER OF ARGUMENTS
                   21856:        BEQ  WB,=NINI9,CFNC3  JUMP IF CASE OF VAR NUM OF ARGS
                   21857:        SUB  WA,WB            CALCULATE NUMBER MISSING
                   21858:        LCT  WB,WB            SET COUNTER TO CONTROL LOOP
                   21859: *
                   21860: *      LOOP TO SUPPLY EXTRA NULL ARGUMENTS
                   21861: *
                   21862: CFNC2  MOV  =NULLS,-(XS)     STACK A NULL ARGUMENT
                   21863:        BCT  WB,CFNC2         LOOP TILL PROPER NUMBER STACKED
                   21864: *
                   21865: *      MERGE HERE TO JUMP TO FUNCTION
                   21866: *
                   21867: CFNC3  BRI  (XL)             JUMP THROUGH FCODE FIELD
                   21868:        EJC
                   21869: *
                   21870: *      EROSI -- PROCESS ERROR RETURN FROM OSINT
                   21871: *
                   21872: *      (WA)                  0 OR ERROR CODE IN 256 TO 998
                   21873: *      (XL)                  0 OR PSEUDO SCBLK FOR ERROR MESSAGE
                   21874: *      (IA)                  NEW VALUE FOR CODE KEYWORD
                   21875: *      BRN  EROSI            JUMP TO PROCESS ERROR
                   21876: *
                   21877: EROSI  RTN
                   21878:        STI  KVCOD            STORE NEW CODE KEYWORD VALUE
                   21879:        MOV  WA,KVERT         STORE ERROR CODE
                   21880:        BZE  XL,ERROR         FAIL AT ONCE IF NO ERROR MSG TEXT
                   21881:        MOV  SCLEN(XL),WA     STRING LENGTH
                   21882:        ZER  WB               ZERO OFFSET
                   21883:        JSR  SBSTR            COPY ERROR MESSAGE STRING
                   21884:        MOV  XR,R$ETX         AND STORE IT
                   21885:        MNZ  EROSN            NOTE NO CALL OF SYSEM
                   21886:        MOV  KVERT,WA         RECALL ERROR CODE
                   21887:        BRN  ERROR            ENTER ERROR SECTION
                   21888: *
                   21889: *      EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
                   21890: *
                   21891: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   21892: *      BRN  EXFAL            JUMP TO FAIL
                   21893: *
                   21894: *      EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
                   21895: *
                   21896: EXFAL  RTN
                   21897:        MOV  FLPTR,XS         POP STACK
                   21898:        MOV  (XS),XR          LOAD FAILURE OFFSET
                   21899:        ADD  R$COD,XR         POINT TO FAILURE CODE LOCATION
                   21900:        LCP  XR               SET CODE POINTER
                   21901:        BRN  EXITS            DO NEXT CODE WORD
                   21902: *
                   21903: *      EXINT -- EXIT WITH INTEGER RESULT
                   21904: *
                   21905: *      (XL,XR)               MAY BE NONCOLLECTABLE
                   21906: *      (IA)                  INTEGER VALUE
                   21907: *      BRN  EXINT            JUMP TO EXIT WITH INTEGER
                   21908: *
                   21909: *      EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
                   21910: *      WHICH IT DOES BY FALLING THROUGH TO EXIXR
                   21911: *
                   21912: EXINT  RTN
                   21913:        JSR  ICBLD            BUILD ICBLK
                   21914:        EJC
                   21915: *      EXIXR -- EXIT WITH RESULT IN (XR)
                   21916: *
                   21917: *      (XR)                  RESULT
                   21918: *      (XL)                  MAY BE NON-COLLECTABLE
                   21919: *      BRN  EXIXR            JUMP TO EXIT WITH RESULT IN (XR)
                   21920: *
                   21921: *      EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
                   21922: *      WHICH IT DOES BY FALLING THROUGH TO EXITS.
                   21923: EXIXR  RTN
                   21924: *
                   21925:        MOV  XR,-(XS)         STACK RESULT
                   21926: *
                   21927: *
                   21928: *      EXITS -- EXIT WITH RESULT IF ANY STACKED
                   21929: *
                   21930: *      (XR,XL)               MAY BE NON-COLLECTABLE
                   21931: *
                   21932: *      BRN  EXITS            ENTER EXITS ROUTINE
                   21933: *
                   21934: EXITS  RTN
                   21935:        LCW  XR               LOAD NEXT CODE WORD
                   21936:        MOV  (XR),XL          LOAD ENTRY ADDRESS
                   21937:        BRI  XL               JUMP TO EXECUTE NEXT CODE WORD
                   21938: *
                   21939: *      EXNAM -- EXIT WITH NAME IN (XL,WA)
                   21940: *
                   21941: *      (XL)                  NAME BASE
                   21942: *      (WA)                  NAME OFFSET
                   21943: *      (XR)                  MAY BE NON-COLLECTABLE
                   21944: *      BRN  EXNAM            JUMP TO EXIT WITH NAME IN (XL,WA)
                   21945: *
                   21946: *      EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
                   21947: *
                   21948: EXNAM  RTN
                   21949:        MOV  XL,-(XS)         STACK NAME BASE
                   21950:        MOV  WA,-(XS)         STACK NAME OFFSET
                   21951:        BRN  EXITS            DO NEXT CODE WORD
                   21952:        EJC
                   21953: *
                   21954: *      EXNUL -- EXIT WITH NULL RESULT
                   21955: *
                   21956: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   21957: *      BRN  EXNUL            JUMP TO EXIT WITH NULL VALUE
                   21958: *
                   21959: *      EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
                   21960: *
                   21961: EXNUL  RTN
                   21962:        MOV  =NULLS,-(XS)     STACK NULL VALUE
                   21963:        BRN  EXITS            DO NEXT CODE WORD
                   21964: .IF    .CNRA
                   21965: .ELSE
                   21966: *
                   21967: *      EXREA -- EXIT WITH REAL RESULT
                   21968: *
                   21969: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   21970: *      (RA)                  REAL VALUE
                   21971: *      BRN  EXREA            JUMP TO EXIT WITH REAL VALUE
                   21972: *
                   21973: *      EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
                   21974: *
                   21975: EXREA  RTN
                   21976:        JSR  RCBLD            BUILD RCBLK
                   21977:        BRN  EXIXR            JUMP TO EXIT WITH RESULT IN XR
                   21978: .FI
                   21979: *
                   21980: *      EXSID -- EXIT SETTING ID FIELD
                   21981: *
                   21982: *      EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
                   21983: *      BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
                   21984: *
                   21985: *      (XR)                  PTR TO BLOCK WITH IDVAL FIELD
                   21986: *      (XL)                  MAY BE NON-COLLECTABLE
                   21987: *      BRN  EXSID            JUMP TO EXIT AFTER SETTING ID FIELD
                   21988: *
                   21989: *      EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
                   21990: *
                   21991: EXSID  RTN
                   21992:        MOV  CURID,WA         LOAD CURRENT ID VALUE
                   21993:        BNE  WA,=CFP$M,EXSI1  JUMP IF NO OVERFLOW
                   21994:        ZER  WA               ELSE RESET FOR WRAPAROUND
                   21995: *
                   21996: *      HERE WITH OLD IDVAL IN WA
                   21997: *
                   21998: EXSI1  ICV  WA               BUMP ID VALUE
                   21999:        MOV  WA,CURID         STORE FOR NEXT TIME
                   22000:        MOV  WA,IDVAL(XR)     STORE ID VALUE
                   22001:        BRN  EXIXR            EXIT WITH RESULT IN (XR)
                   22002:        EJC
                   22003: *
                   22004: *      EXVNM -- EXIT WITH NAME OF VARIABLE
                   22005: *
                   22006: *      EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
                   22007: *      REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
                   22008: *
                   22009: *      (XR)                  VRBLK POINTER
                   22010: *      (XL)                  MAY BE NON-COLLECTABLE
                   22011: *      BRN  EXVNM            EXIT WITH VRBLK POINTER IN XR
                   22012: *
                   22013: EXVNM  RTN
                   22014:        MOV  XR,XL            COPY NAME BASE POINTER
                   22015:        MOV  *NMSI$,WA        SET SIZE OF NMBLK
                   22016:        JSR  ALLOC            ALLOCATE NMBLK
                   22017:        MOV  =B$NML,(XR)      STORE TYPE WORD
                   22018:        MOV  XL,NMBAS(XR)     STORE NAME BASE
                   22019:        MOV  *VRVAL,NMOFS(XR) STORE NAME OFFSET
                   22020:        BRN  EXIXR            EXIT WITH RESULT IN XR
                   22021: *
                   22022: *      FLPOP -- FAIL AND POP IN PATTERN MATCHING
                   22023: *
                   22024: *      FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
                   22025: *      DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
                   22026: *
                   22027: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   22028: *      BRN  FLPOP            JUMP TO FAIL AND POP STACK
                   22029: *
                   22030: FLPOP  RTN
                   22031:        ADD  *NUM02,XS        POP TWO ENTRIES OFF STACK
                   22032: *
                   22033: *      FAILP -- FAILURE IN MATCHING PATTERN NODE
                   22034: *
                   22035: *      FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
                   22036: *      SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
                   22037: *
                   22038: *      (XL,XR)               MAY BE NON-COLLECTABLE
                   22039: *      BRN  FAILP            SIGNAL FAILURE TO MATCH
                   22040: *
                   22041: *      FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
                   22042: *
                   22043: FAILP  RTN
                   22044:        MOV  (XS)+,XR         LOAD ALTERNATIVE NODE POINTER
                   22045:        MOV  (XS)+,WB         RESTORE OLD CURSOR
                   22046:        MOV  (XR),XL          LOAD PCODE ENTRY POINTER
                   22047:        BRI  XL               JUMP TO EXECUTE CODE FOR NODE
                   22048:        EJC
                   22049: *
                   22050: *      INDIR -- COMPUTE INDIRECT REFERENCE
                   22051: *
                   22052: *      (WB)                  NONZERO/ZERO FOR BY NAME/VALUE
                   22053: *      BRN  INDIR            JUMP TO GET INDIRECT REF ON STACK
                   22054: *
                   22055: *      INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
                   22056: *
                   22057: INDIR  RTN
                   22058:        MOV  (XS)+,XR         LOAD ARGUMENT
                   22059:        BEQ  (XR),=B$NML,INDR2 JUMP IF A NAME
                   22060:        JSR  GTNVR            ELSE CONVERT TO VARIABLE
                   22061:        ERR  244,INDIRECTION OPERAND IS NOT NAME
                   22062:        BZE  WB,INDR1         SKIP IF BY VALUE
                   22063:        MOV  XR,-(XS)         ELSE STACK VRBLK PTR
                   22064:        MOV  *VRVAL,-(XS)     STACK NAME OFFSET
                   22065:        BRN  EXITS            EXIT WITH RESULT ON STACK
                   22066: *
                   22067: *      HERE TO GET VALUE OF NATURAL VARIABLE
                   22068: *
                   22069: INDR1  BRI  (XR)             JUMP THROUGH VRGET FIELD OF VRBLK
                   22070: *
                   22071: *      HERE IF OPERAND IS A NAME
                   22072: *
                   22073: INDR2  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   22074:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
                   22075:        BNZ  WB,EXNAM         EXIT IF CALLED BY NAME
                   22076:        JSR  ACESS            ELSE GET VALUE FIRST
                   22077:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   22078:        BRN  EXIXR            ELSE RETURN WITH VALUE IN XR
                   22079:        EJC
                   22080: *
                   22081: *      MATCH -- INITIATE PATTERN MATCH
                   22082: *
                   22083: *      (WB)                  MATCH TYPE CODE
                   22084: *      BRN  MATCH            JUMP TO INITIATE PATTERN MATCH
                   22085: *
                   22086: *      MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
                   22087: *      PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
                   22088: *
                   22089: MATCH  RTN
                   22090:        MOV  (XS)+,XR         LOAD PATTERN OPERAND
                   22091:        JSR  GTPAT            CONVERT TO PATTERN
                   22092:        ERR  245,PATTERN MATCH RIGHT OPERAND IS NOT PATTERN
                   22093:        MOV  XR,XL            IF OK, SAVE PATTERN POINTER
                   22094:        BNZ  WB,MTCH1         JUMP IF NOT MATCH BY NAME
                   22095:        MOV  (XS),WA          ELSE LOAD NAME OFFSET
                   22096:        MOV  XL,-(XS)         SAVE PATTERN POINTER
                   22097:        MOV  2(XS),XL         LOAD NAME BASE
                   22098:        JSR  ACESS            ACCESS SUBJECT VALUE
                   22099:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   22100:        MOV  (XS),XL          RESTORE PATTERN POINTER
                   22101:        MOV  XR,(XS)          STACK SUBJECT STRING VAL FOR MERGE
                   22102:        ZER  WB               RESTORE TYPE CODE
                   22103: *
                   22104: *      MERGE HERE WITH SUBJECT VALUE ON STACK
                   22105: *
                   22106: .IF    .CNBF
                   22107: MTCH1  JSR  GTSTG            CONVERT SUBJECT TO STRING
                   22108: .ELSE
                   22109: MTCH1  MOV  (XS),XR          LOAD SUBJECT VALUE
                   22110:        ZER  R$PMB            ASSUME NOT A BUFFER
                   22111:        BNE  (XR),=B$BCT,MTCHA BRANCH IF NOT
                   22112:        ICA  XS               ELSE POP VALUE
                   22113:        MOV  XR,R$PMB         SAVE POINTER
                   22114:        MOV  BCLEN(XR),WA     GET DEFINED LENGTH
                   22115:        MOV  BCBUF(XR),XR     POINT TO BFBLK
                   22116:        BRN  MTCHB
                   22117: *
                   22118: *      HERE IF NOT BUFFER TO CONVERT TO STRING
                   22119: *
                   22120: MTCHA  JSR  GTSTG            NOT BUFFER - CONVERT TO STRING
                   22121: .FI
                   22122:        ERR  246,PATTERN MATCH LEFT OPERAND IS NOT STRING
                   22123: .IF    .CNBF
                   22124:        MOV  XR,R$PMS         IF OK, STORE SUBJECT STRING POINTER
                   22125: .ELSE
                   22126: *
                   22127: *      MERGE WITH NULL STRING OR BUFFER
                   22128: *
                   22129: MTCHB  MOV  XR,R$PMS         IF OK, STORE SUBJECT STRING POINTER
                   22130: .FI
                   22131:        MOV  WA,PMSSL         AND LENGTH
                   22132:        MOV  WB,-(XS)         STACK MATCH TYPE CODE
                   22133:        ZER  -(XS)            STACK INITIAL CURSOR (ZERO)
                   22134:        ZER  WB               SET INITIAL CURSOR
                   22135:        MOV  XS,PMHBS         SET HISTORY STACK BASE PTR
                   22136:        ZER  PMDFL            RESET PATTERN ASSIGNMENT FLAG
                   22137:        MOV  XL,XR            SET INITIAL NODE POINTER
                   22138:        BNZ  KVANC,MTCH2      JUMP IF ANCHORED
                   22139:        EJC
                   22140: *
                   22141: *      MATCH (CONTINUED)
                   22142: *
                   22143: *      HERE FOR UNANCHORED
                   22144: *
                   22145:        MOV  XR,-(XS)         STACK INITIAL NODE POINTER
                   22146:        MOV  =NDUNA,-(XS)     STACK POINTER TO ANCHOR MOVE NODE
                   22147:        BRI  (XR)             START MATCH OF FIRST NODE
                   22148: *
                   22149: *      HERE IN ANCHORED MODE
                   22150: *
                   22151: MTCH2  ZER  -(XS)            DUMMY CURSOR VALUE
                   22152:        MOV  =NDABO,-(XS)     STACK POINTER TO ABORT NODE
                   22153:        BRI  (XR)             START MATCH OF FIRST NODE
                   22154:        EJC
                   22155: *
                   22156: *      RETRN -- RETURN FROM FUNCTION
                   22157: *
                   22158: *      (WA)                  STRING POINTER FOR RETURN TYPE
                   22159: *      BRN  RETRN            JUMP TO RETURN FROM (SNOBOL) FUNC
                   22160: *
                   22161: *      RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
                   22162: *      THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
                   22163: *      ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
                   22164: *      ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
                   22165: *      FUNCTION CALL AND RETURN.
                   22166: *
                   22167: RETRN  RTN
                   22168:        BNZ  KVFNC,RTN01      JUMP IF NOT LEVEL ZERO
                   22169:        ERB  247,FUNCTION RETURN FROM LEVEL ZERO
                   22170: *
                   22171: *      HERE IF NOT LEVEL ZERO RETURN
                   22172: *
                   22173: RTN01  MOV  FLPRT,XS         POP STACK
                   22174:        ICA  XS               REMOVE FAILURE OFFSET
                   22175:        MOV  (XS)+,XR         POP PFBLK POINTER
                   22176:        MOV  (XS)+,FLPTR      POP FAILURE POINTER
                   22177:        MOV  (XS)+,FLPRT      POP OLD FLPRT
                   22178:        MOV  (XS)+,WB         POP CODE POINTER OFFSET
                   22179:        MOV  (XS)+,WC         POP OLD CODE BLOCK POINTER
                   22180:        ADD  WC,WB            MAKE OLD CODE POINTER ABSOLUTE
                   22181:        LCP  WB               RESTORE OLD CODE POINTER
                   22182:        MOV  WC,R$COD         RESTORE OLD CODE BLOCK POINTER
                   22183:        DCV  KVFNC            DECREMENT FUNCTION LEVEL
                   22184:        MOV  KVTRA,WB         LOAD TRACE
                   22185:        ADD  KVFTR,WB         ADD FTRACE
                   22186:        BZE  WB,RTN06         JUMP IF NO TRACING POSSIBLE
                   22187: *
                   22188: *      HERE IF THERE MAY BE A TRACE
                   22189: *
                   22190:        MOV  WA,-(XS)         SAVE FUNCTION RETURN TYPE
                   22191:        MOV  XR,-(XS)         SAVE PFBLK POINTER
                   22192:        MOV  WA,KVRTN         SET RTNTYPE FOR TRACE FUNCTION
                   22193:        MOV  R$FNC,XL         LOAD FNCLEVEL TRBLK PTR (IF ANY)
                   22194:        JSR  KTREX            EXECUTE POSSIBLE FNCLEVEL TRACE
                   22195:        MOV  PFVBL(XR),XL     LOAD VRBLK POINTER
                   22196:        BZE  KVTRA,RTN02      JUMP IF TRACE IS OFF
                   22197:        MOV  PFRTR(XR),XR     ELSE LOAD RETURN TRACE TRBLK PTR
                   22198:        BZE  XR,RTN02         JUMP IF NOT RETURN TRACED
                   22199:        DCV  KVTRA            ELSE DECREMENT TRACE COUNT
                   22200:        BZE  TRFNC(XR),RTN03  JUMP IF PRINT TRACE
                   22201:        MOV  *VRVAL,WA        ELSE SET NAME OFFSET
                   22202:        MOV  1(XS),KVRTN      MAKE SURE RTNTYPE IS SET RIGHT
                   22203:        JSR  TRXEQ            EXECUTE FULL TRACE
                   22204:        EJC
                   22205: *
                   22206: *      RETRN (CONTINUED)
                   22207: *
                   22208: *      HERE TO TEST FOR FTRACE
                   22209: *
                   22210: RTN02  BZE  KVFTR,RTN05      JUMP IF FTRACE IS OFF
                   22211:        DCV  KVFTR            ELSE DECREMENT FTRACE
                   22212: *
                   22213: *      HERE FOR PRINT TRACE OF FUNCTION RETURN
                   22214: *
                   22215: RTN03  JSR  PRTSN            PRINT STATEMENT NUMBER
                   22216:        MOV  1(XS),XR         LOAD RETURN TYPE
                   22217:        JSR  PRTST            PRINT IT
                   22218:        MOV  =CH$BL,WA        LOAD BLANK
                   22219:        JSR  PRTCH            PRINT IT
                   22220:        MOV  0(XS),XL         LOAD PFBLK PTR
                   22221:        MOV  PFVBL(XL),XL     LOAD FUNCTION VRBLK PTR
                   22222:        MOV  *VRVAL,WA        SET VRBLK NAME OFFSET
                   22223:        BNE  XR,=SCFRT,RTN04  JUMP IF NOT FRETURN CASE
                   22224: *
                   22225: *      FOR FRETURN, JUST PRINT FUNCTION NAME
                   22226: *
                   22227:        JSR  PRTNM            PRINT NAME
                   22228:        JSR  PRTFH            TERMINATE PRINT LINE
                   22229:        BRN  RTN05            MERGE
                   22230: *
                   22231: *      HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
                   22232: *
                   22233: RTN04  JSR  PRTNV            PRINT NAME = VALUE
                   22234: *
                   22235: *      HERE AFTER COMPLETING TRACE
                   22236: *
                   22237: RTN05  MOV  (XS)+,XR         POP PFBLK POINTER
                   22238:        MOV  (XS)+,WA         POP RETURN TYPE STRING
                   22239: *
                   22240: *      MERGE HERE IF NO TRACE REQUIRED
                   22241: *
                   22242: RTN06  MOV  WA,KVRTN         SET RTNTYPE KEYWORD
                   22243:        MOV  PFVBL(XR),XL     LOAD POINTER TO FN VRBLK
                   22244:        EJC
                   22245: *      RETRN (CONTINUED)
                   22246: *
                   22247: *      GET VALUE OF FUNCTION
                   22248: *
                   22249: RTN07  MOV  XL,RTNBP         SAVE BLOCK POINTER
                   22250:        MOV  VRVAL(XL),XL     LOAD VALUE
                   22251:        BEQ  (XL),=B$TRT,RTN07 LOOP BACK IF TRAPPED
                   22252:        MOV  XL,RTNFV         ELSE SAVE FUNCTION RESULT VALUE
                   22253:        MOV  (XS)+,RTNSV      SAVE ORIGINAL FUNCTION VALUE
                   22254: .IF    .CNPF
                   22255:        MOV  FARGS(XR),WB     GET NUMBER OF ARGUMENTS
                   22256: .ELSE
                   22257:        MOV  (XS)+,XL         POP SAVED POINTER
                   22258:        BZE  XL,RTN7C         NO ACTION IF NONE
                   22259:        BZE  KVPFL,RTN7C      JUMP IF NO PROFILING
                   22260:        JSR  PRFLU            ELSE PROFILE LAST FUNC STMT
                   22261:        BEQ  KVPFL,=NUM02,RTN7A BRANCH ON VALUE OF PROFILE KEYWD
                   22262: *
                   22263: *      HERE IF PROFILE = 1. START TIME MUST BE FRIGGED TO
                   22264: *      APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
                   22265: *      THE CALL.
                   22266: *
                   22267:        LDI  PFSTM            LOAD CURRENT TIME
                   22268:        SBI  ICVAL(XL)        FRIG BY SUBTRACTING SAVED AMOUNT
                   22269:        BRN  RTN7B            AND MERGE
                   22270: *
                   22271: *      HERE IF PROFILE = 2
                   22272: *
                   22273: RTN7A  LDI  ICVAL(XL)        LOAD SAVED TIME
                   22274: *
                   22275: *      BOTH PROFILE TYPES MERGE HERE
                   22276: *
                   22277: RTN7B  STI  PFSTM            STORE BACK CORRECT START TIME
                   22278: *
                   22279: *      MERGE HERE IF NO PROFILING
                   22280: *
                   22281: RTN7C  MOV  FARGS(XR),WB     GET NUMBER OF ARGS
                   22282: .FI
                   22283:        ADD  PFNLO(XR),WB     ADD NUMBER OF LOCALS
                   22284:        BZE  WB,RTN10         JUMP IF NO ARGS/LOCALS
                   22285:        LCT  WB,WB            ELSE SET LOOP COUNTER
                   22286:        ADD  PFLEN(XR),XR     AND POINT TO END OF PFBLK
                   22287: *
                   22288: *      LOOP TO RESTORE FUNCTIONS AND LOCALS
                   22289: *
                   22290: RTN08  MOV  -(XR),XL         LOAD NEXT VRBLK POINTER
                   22291: *
                   22292: *      LOOP TO FIND VALUE BLOCK
                   22293: *
                   22294: RTN09  MOV  XL,WA            SAVE BLOCK POINTER
                   22295:        MOV  VRVAL(XL),XL     LOAD POINTER TO NEXT VALUE
                   22296:        BEQ  (XL),=B$TRT,RTN09 LOOP BACK IF TRAPPED
                   22297:        MOV  WA,XL            ELSE RESTORE LAST BLOCK POINTER
                   22298:        MOV  (XS)+,VRVAL(XL)  RESTORE OLD VARIABLE VALUE
                   22299:        BCT  WB,RTN08         LOOP TILL ALL PROCESSED
                   22300:        EJC
                   22301: *
                   22302: *      RETRN (CONTINUED)
                   22303: *
                   22304: *      NOW RESTORE FUNCTION VALUE AND EXIT
                   22305: *
                   22306: RTN10  MOV  RTNBP,XL         RESTORE PTR TO LAST FUNCTION BLOCK
                   22307:        MOV  RTNSV,VRVAL(XL)  RESTORE OLD FUNCTION VALUE
                   22308:        MOV  RTNFV,XR         RELOAD FUNCTION RESULT
                   22309:        MOV  R$COD,XL         POINT TO NEW CODE BLOCK
                   22310:        MOV  KVSTN,KVLST      SET LASTNO FROM STNO
                   22311:        MOV  CDSTM(XL),KVSTN  RESET PROPER STNO VALUE
                   22312:        MOV  KVRTN,WA         LOAD RETURN TYPE
                   22313:        BEQ  WA,=SCRTN,EXIXR  EXIT WITH RESULT IN XR IF RETURN
                   22314:        BEQ  WA,=SCFRT,EXFAL  FAIL IF FRETURN
                   22315: *
                   22316: *      HERE FOR NRETURN
                   22317: *
                   22318:        BEQ  (XR),=B$NML,RTN11 JUMP IF IS A NAME
                   22319:        JSR  GTNVR            ELSE TRY CONVERT TO VARIABLE NAME
                   22320:        ERR  248,FUNCTION RESULT IN NRETURN IS NOT NAME
                   22321:        MOV  XR,XL            IF OK, COPY VRBLK (NAME BASE) PTR
                   22322:        MOV  *VRVAL,WA        SET NAME OFFSET
                   22323:        BRN  RTN12            AND MERGE
                   22324: *
                   22325: *      HERE IF RETURNED RESULT IS A NAME
                   22326: *
                   22327: RTN11  MOV  NMBAS(XR),XL     LOAD NAME BASE
                   22328:        MOV  NMOFS(XR),WA     LOAD NAME OFFSET
                   22329: *
                   22330: *      MERGE HERE WITH RETURNED NAME IN (XL,WA)
                   22331: *
                   22332: RTN12  MOV  XL,XR            PRESERVE XL
                   22333:        LCW  WB               LOAD NEXT WORD
                   22334:        MOV  XR,XL            RESTORE XL
                   22335:        BEQ  WB,=OFNE$,EXNAM  EXIT IF CALLED BY NAME
                   22336:        MOV  WB,-(XS)         ELSE SAVE CODE WORD
                   22337:        JSR  ACESS            GET VALUE
                   22338:        PPM  EXFAL            FAIL IF ACCESS FAILS
                   22339:        MOV  XR,XL            IF OK, COPY RESULT
                   22340:        MOV  (XS),XR          RELOAD NEXT CODE WORD
                   22341:        MOV  XL,(XS)          STORE RESULT ON STACK
                   22342:        MOV  (XR),XL          LOAD ROUTINE ADDRESS
                   22343:        BRI  XL               JUMP TO EXECUTE NEXT CODE WORD
                   22344:        EJC
                   22345: *
                   22346: *      STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
                   22347: *
                   22348: *      BRN  STCOV            JUMP TO SIGNAL STATEMENT COUNT OFLO
                   22349: *
                   22350: *      PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
                   22351: *      SETEXIT TRAP CAN REGAIN CONTROL.
                   22352: *      STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
                   22353: *
                   22354: STCOV  RTN
                   22355:        ICV  ERRFT            FATAL ERROR
                   22356:        LDI  INTVT            GET 10
                   22357:        ADI  KVSTL            ADD TO FORMER LIMIT
                   22358:        STI  KVSTL            STORE AS NEW STLIMIT
                   22359:        LDI  INTVT            GET 10
                   22360:        STI  KVSTC            SET AS NEW COUNT
                   22361:        ERB  249,STATEMENT COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
                   22362:        EJC
                   22363: *
                   22364: *      STMGO -- START EXECUTION OF NEW STATEMENT
                   22365: *
                   22366: *      (XR)                  POINTER TO CDBLK FOR NEW STATEMENT
                   22367: *      BRN  STMGO            JUMP TO EXECUTE NEW STATEMENT
                   22368: *
                   22369: *      STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
                   22370: *
                   22371: STMGO  RTN
                   22372:        MOV  XR,R$COD         SET NEW CODE BLOCK POINTER
                   22373: .IF    .CNPF
                   22374:        MOV  KVSTN,KVLST      SET LASTNO
                   22375: .ELSE
                   22376:        BZE  KVPFL,STGO1      SKIP IF NO PROFILING
                   22377:        JSR  PRFLU            ELSE PROFILE THE STATEMENT
                   22378: *
                   22379: *      MERGE PROFILE, NO-PROFILE CASES
                   22380: *
                   22381: STGO1  MOV  KVSTN,KVLST      SET LASTNO
                   22382: .FI
                   22383:        MOV  CDSTM(XR),KVSTN  SET STNO
                   22384:        ADD  *CDCOD,XR        POINT TO FIRST CODE WORD
                   22385:        LCP  XR               SET CODE POINTER
                   22386:        LDI  KVSTC            GET STMT COUNT
                   22387:        ILT  EXITS            OMIT COUNTING IF NEGATIVE
                   22388:        IEQ  STCOV            FAIL IF STLIMIT REACHED
                   22389:        SBI  INTV1            DECREMENT
                   22390:        STI  KVSTC            REPLACE IT
                   22391:        BZE  R$STC,EXITS      EXIT IF NO STCOUNT TRACE
                   22392: *
                   22393: *      HERE FOR STCOUNT TRACE
                   22394: *
                   22395:        ZER  XR               CLEAR GARBAGE VALUE IN XR
                   22396:        MOV  R$STC,XL         LOAD POINTER TO STCOUNT TRBLK
                   22397:        JSR  KTREX            EXECUTE KEYWORD TRACE
                   22398:        BRN  EXITS            AND THEN EXIT FOR NEXT CODE WORD
                   22399:        EJC
                   22400: *
                   22401: *      STOPR -- TERMINATE RUN
                   22402: *
                   22403: *      (WA)                  0 OR ERROR MESSAGE CODE
                   22404: *      (XR)                  0 OR ENDING MESSAGE POINTER
                   22405: *      BRN STOPR             JUMP TO TERMINATE RUN
                   22406: *
                   22407: *      TERMINATE RUN AND PRINT STATISTICS.  ON ENTRY XR POINTS
                   22408: *      TO ENDING MESSAGE OR IS ZERO IF MESSAGE PRINTED ALREADY.
                   22409: *      (WA) AND (XR) ARE BOTH NON-ZERO ONLY IN THE CASE OF FATAL
                   22410: *      ERRORS DURING INITIAL COMPILE.
                   22411: *
                   22412: STOPR  RTN
                   22413: .IF    .CSAX
                   22414:        JSR  SYSAX            CALL AFTER EXECUTION PROC
                   22415: .ELSE
                   22416: .FI
                   22417:        ADD  RSMEM,DNAME      USE THE RESERVE MEMORY
                   22418:        BZE  WA,STPR1         SKIP IF NO ERROR MESSAGE
                   22419:        MOV  XR,STPXR         KEEP 0 OR ENDING MESSAGE
                   22420:        MOV  TTERL,TTLST      SEND ERROR AND STATS TO TERML
                   22421:        JSR  PRTPG            PAGE THROW
                   22422:        JSR  ERMSG            PRINT ERROR MESSAGE
                   22423:        MOV  STPXR,XR         RECOVER 0 OR ENDING MESSAGE
                   22424:        ZER  EXSTS            TO FORCE ENDING STATS OUT FOR ERROR
                   22425: *
                   22426: *      PROCESS ENDING STATISTICS
                   22427: *
                   22428: STPR1  MTI  KVSTN            GET STATEMENT NUMBER
                   22429:        IEQ  STPR6            SKIP IF COMPILE TIME
                   22430:        BNZ  EXSTS,STPR4      SKIP IF NO STATS TO BE PRINTED
                   22431:        JSR  PRTPG            EJECT PRINTER
                   22432:        BZE  XR,STPR2         SKIP IF NO MESSAGE
                   22433:        JSR  PRTFB            PRINT MESSAGE
                   22434: *
                   22435: *      MERGE HERE IF NO MESSAGE TO PRINT
                   22436: *
                   22437: STPR2  JSR  PRTFH            PRINT BLANK LINE
                   22438:        MOV  =STPM1,XR        POINT TO MESSAGE /IN STATEMENT XXX/
                   22439:        JSR  PRTMI            PRINT IT
                   22440:        JSR  SYSTM            GET CURRENT TIME
                   22441:        SBI  TIMSX            MINUS START TIME = ELAPSED EXEC TIM
                   22442:        STI  STPTI            SAVE FOR LATER
                   22443:        MOV  =STPM3,XR        POINT TO MSG /EXECUTION TIME MSEC /
                   22444:        JSR  PRTMI            PRINT IT
                   22445:        LDI  KVSTL            GET STATEMENT LIMIT
                   22446:        ILT  STPR3            SKIP IF NEGATIVE
                   22447:        SBI  KVSTC            MINUS COUNTER = COUNT
                   22448:        STI  STPSI            SAVE
                   22449:        MOV  =STPM2,XR        POINT TO MESSAGE /STMTS EXECUTED/
                   22450:        JSR  PRTMI            PRINT IT
                   22451: .IF    .CTMD
                   22452: .ELSE
                   22453:        LDI  STPTI            RELOAD ELAPSED TIME
                   22454:        MLI  INTTH            *1000 (MICROSECS)
                   22455:        IOV  STPR3            JUMP IF WE CANNOT COMPUTE
                   22456:        DVI  STPSI            DIVIDE BY STATEMENT COUNT
                   22457:        IOV  STPR3            JUMP IF OVERFLOW
                   22458:        MOV  =STPM4,XR        POINT TO MSG (MCSEC PER STATEMENT /
                   22459:        JSR  PRTMI            PRINT IT
                   22460: .FI
                   22461:        EJC
                   22462: *
                   22463: *      STOPR (CONTINUED)
                   22464: *
                   22465: *      MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
                   22466: *
                   22467: STPR3  MTI  GBCNT            LOAD COUNT OF COLLECTIONS
                   22468:        MOV  =STPM5,XR        POINT TO MESSAGE /REGENERATIONS /
                   22469:        JSR  PRTMI            PRINT IT
                   22470:        JSR  PRTFH            ONE MORE BLANK FOR LUCK
                   22471: *
                   22472: *      CHECK IF DUMP REQUESTED
                   22473: *
                   22474: .IF    .CNPF
                   22475: STPR4  MOV  KVDMP,XR         LOAD DUMP KEYWORD
                   22476: .ELSE
                   22477: STPR4  JSR  PRFLR            PRINT PROFILE IF WANTED
                   22478:        MOV  KVDMP,XR         LOAD DUMP KEYWORD
                   22479: .FI
                   22480:        JSR  DUMPR            EXECUTE DUMP IF REQUESTED
                   22481: *
                   22482: *      MERGE TO END RUN FOR SEVERE COMPILATION ERRORS
                   22483: *
                   22484: STPR5  MOV  =KVCOD,WA        LOAD CODE VALUE
                   22485:        JSR  SYSEJ            EXIT TO SYSTEM
                   22486: *
                   22487: *      TERMINATION DURING COMPILE
                   22488: *
                   22489: STPR6  BZE  XR,STPR7         SKIP IF NO MESSAGE
                   22490:        JSR  PRTSF            ELSE PRINT IT
                   22491: *
                   22492: *      NOTIFICATION THAT IT IS COMPILE TIME
                   22493: *
                   22494: STPR7  MOV  =ENDIC,XR        NOTIFY USER
                   22495:        JSR  PRTSF            SEND IT
                   22496:        BRN  STPR5            END
                   22497:        EJC
                   22498: *
                   22499: *      SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
                   22500: *
                   22501: *      SEE PATTERN MATCH ROUTINES FOR DETAILS
                   22502: *
                   22503: *      (XR)                  CURRENT NODE
                   22504: *      (WB)                  CURRENT CURSOR
                   22505: *      (XL)                  MAY BE NON-COLLECTABLE
                   22506: *      BRN  SUCCP            SIGNAL SUCCESSFUL PATTERN MATCH
                   22507: *
                   22508: *      SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
                   22509: *
                   22510: SUCCP  RTN
                   22511:        MOV  PTHEN(XR),XR     LOAD SUCCESSOR NODE
                   22512:        MOV  (XR),XL          LOAD NODE CODE ENTRY ADDRESS
                   22513:        BRI  XL               JUMP TO MATCH SUCCESSOR NODE
                   22514:        TTL  S P I T B O L -- STACK OVERFLOW SECTION
                   22515: *
                   22516: *      CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
                   22517: *
                   22518:        SEC                   START OF STACK OVERFLOW SECTION
                   22519: *
                   22520: STAKV  RTN                   ENTRY POINT FOR STACK OVERFLOW
                   22521:        ICV  ERRFT            FATAL ERROR
                   22522:        MOV  FLPTR,XS         POP STACK TO AVOID MORE FAILS
                   22523:        BNZ  GBCFL,STAK1      JUMP IF GARBAGE COLLECTING
                   22524:        ERB  250,STACK OVERFLOW
                   22525: *
                   22526: *      NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
                   22527: *
                   22528: STAK1  MOV  =ENDSO,XR        POINT TO MESSAGE
                   22529:        ZER  KVDMP            MEMORY IS UNDUMPABLE
                   22530:        ZER  WA               NO ERROR MESSAGE
                   22531:        MOV  TTERL,TTLST      SEND MESSAGE TO TERML IF POSSIBLE
                   22532:        BRN  STOPR            GIVE UP
                   22533:        TTL  S P I T B O L -- ERROR SECTION
                   22534: *
                   22535: *      THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
                   22536: *      RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
                   22537: *
                   22538: *      (WA)                  IS THE ERROR CODE
                   22539: *
                   22540: *      THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
                   22541: *      THE ERROR OCCURED AS FOLLOWS.
                   22542: *
                   22543: *      STAGE=STGIC           ERROR DURING INITIAL COMPILE
                   22544: *
                   22545: *      STAGE=STGXC           ERROR DURING COMPILE AT EXECUTE
                   22546: *                            TIME (CODE, CONVERT FUNCTION CALLS)
                   22547: *
                   22548: *      STAGE=STGEV           ERROR DURING COMPILATION OF
                   22549: *                            EXPRESSION AT EXECUTION TIME
                   22550: *                            (EVAL, CONVERT FUNCTION CALL).
                   22551: *
                   22552: *      STAGE=STGXT           ERROR AT EXECUTE TIME. COMPILER
                   22553: *                            NOT ACTIVE.
                   22554: *
                   22555: *      STAGE=STGCE           ERROR DURING INITIAL COMPILE AFTER
                   22556: *                            SCANNING OUT THE END LINE.
                   22557: *
                   22558: *      STAGE=STGXE           ERROR DURING COMPILE AT EXECUTE
                   22559: *                            TIME AFTER SCANNING END LINE.
                   22560: *
                   22561: *      STAGE=STGEE           ERROR DURING EXPRESSION EVALUATION
                   22562: *
                   22563:        SEC                   START OF ERROR SECTION
                   22564: *
                   22565: ERROR  RTN                   ERROR CODE ENTRY POINT
                   22566:        BGE  ERRFT,=NUM03,ERR16 SKIP IF TOO MANY FATALS
                   22567:        BEQ  R$CIM,=CMLAB,ERRG1 JUMP IF ERROR IN LABEL SCAN
                   22568:        MOV  WA,KVERT         SAVE ERROR CODE
                   22569:        ZER  SCNRS            RESET RESCAN SWITCH FOR SCANE
                   22570:        ZER  SCNGO            RESET GOTO SWITCH FOR SCANE
                   22571:        MOV  STAGE,XR         LOAD CURRENT STAGE
                   22572:        BSW  XR,STGNO         JUMP TO APPROPRIATE ERROR CIRCUIT
                   22573:        IFF  STGIC,ERR01      INITIAL COMPILE
                   22574:        IFF  STGXC,ERR08      EXECUTE TIME COMPILE
                   22575:        IFF  STGEV,ERR08      EVAL COMPILING EXPR.
                   22576:        IFF  STGEE,ERR08      EVAL EVALUATING EXPR
                   22577:        IFF  STGXT,ERR12      EXECUTE TIME
                   22578:        IFF  STGCE,ERR01      COMPILE - AFTER END
                   22579:        IFF  STGXE,ERR08      XEQ COMPILE-PAST END
                   22580:        ESW                   END SWITCH ON ERROR TYPE
                   22581: *
                   22582: *      ERROR DURING INITIAL COMPILE
                   22583: *      THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
                   22584: *      OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
                   22585: *      PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
                   22586: *      COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
                   22587: *      AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
                   22588: *      MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
                   22589: *      THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
                   22590: *      IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
                   22591: *      IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
                   22592:        EJC
                   22593: *
                   22594: ERR01  MOV  CMPXS,XS         RESET STACK POINTER
                   22595:        SSL  CMPSS            RESTORE S-R STACK PTR FOR CMPIL
                   22596:        BNZ  ERRSP,ERR06      JUMP IF ERROR SUPPRESS FLAG SET
                   22597:        JSR  PRTFH            PRINT A BLANK
                   22598:        MOV  TTERL,TTLST      SET FLAG FOR LISTR
                   22599:        ADD  =NUM03,LSTLC     CAUSE EJECT IF BELOW 4 LINES LEFT
                   22600:        MOV  LSTLC,-(XS)      KEEP LINE COUNT
                   22601:        JSR  LISTR            LIST LINE
                   22602:        JSR  PRTFH            TERMINATE LISTING
                   22603:        MOV  (XS)+,WA         RECOVER LINE COUNT
                   22604:        BGT  LSTLC,WA,ERR02   SKIP IF NOT NEW PAGE
                   22605:        ADD  =NUM04,LSTLC     BUMP FOR LINES PRINTED
                   22606: *
                   22607: *      PRINT FLAG UNDER BAD ELEMENT
                   22608: *
                   22609: ERR02  MOV  SCNSE,WA         LOAD SCAN ELEMENT OFFSET
                   22610: .IF    .CAHT
                   22611:        MOV  WA,WB            COPY OFFSET
                   22612:        ICV  WA               INCREASE FOR CH$EX
                   22613:        JSR  ALOCS            STRING BLOCK FOR ERROR FLAG
                   22614:        MOV  XR,WA            REMEMBER STRING PTR
                   22615:        PSC  XR               READY FOR CHARACTER STORING
                   22616:        BZE  WB,ERR05         SKIP IF NO BLANKS BEFORE ERROR FLAG
                   22617:        MOV  R$CIM,XL         POINT TO BAD STATEMENT
                   22618:        PLC  XL               READY TO GET CHARS
                   22619:        LCT  WB,WB            LOOP COUNTER
                   22620: *
                   22621: *      LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
                   22622: *
                   22623: ERR03  LCH  WC,(XL)+         GET NEXT CHAR
                   22624:        BEQ  WC,=CH$HT,ERR04  SKIP IF TAB
                   22625:        MOV  =CH$BL,WC        GET A BLANK
                   22626:        EJC
                   22627: *
                   22628: *      MERGE TO STORE BLANK OR TAB IN ERROR LINE
                   22629: *
                   22630: ERR04  SCH  WC,(XR)+         STORE CHAR
                   22631:        BCT  WB,ERR03         LOOP
                   22632:        EJC
                   22633: *
                   22634: *      MERGE IN CASE OF NO PRECEDING BLANKS
                   22635: *
                   22636: ERR05  MOV  =CH$EX,XL        EXCLAMATION MARK
                   22637:        SCH  XL,(XR)          STORE AT END OF ERROR LINE
                   22638:        CSC  XR               END OF SCH LOOP
                   22639:        MOV  =STNPD,PROFS     ALLOW FOR STATEMENT NUMBER
                   22640:        MOV  WA,XR            POINT TO ERROR LINE
                   22641:        JSR  PRTST            PRINT ERROR LINE
                   22642: .ELSE
                   22643:        MTI  PRLEN            GET PRINT BUFFER LENGTH
                   22644:        STI  GTNSI            STORE AS SIGNED INTEGER
                   22645:        ADD  =STNPD,WA        ADJUST FOR STATEMENT NUMBER
                   22646:        MTI  WA               COPY TO INTEGER ACCUMULATOR
                   22647:        RMI  GTNSI            REMAINDER MODULO PRINT BFR LENGTH
                   22648:        MFI  PROFS            USE AS CHARACTER OFFSET
                   22649:        MOV  =CH$EX,WA        GET EXCLAMATION MARK
                   22650:        JSR  PRTCH            GENERATE UNDER BAD COLUMN
                   22651: .FI
                   22652: *
                   22653: *      HERE AFTER PLACING ERROR FLAG AS REQUIRED
                   22654: *
                   22655:        JSR  ERMSG            GENERATE FLAG AND ERROR MESSAGE
                   22656:        ZER  TTLST            REVERT TO REGULAR LISTING
                   22657:        ZER  XR               IN CASE OF FATAL ERROR
                   22658:        ICV  CMERC            BUMP ERROR COUNT
                   22659:        BNE  STAGE,=STGIC,ERRG2  SPECIAL RETURN IF AFTER END LINE
                   22660: *
                   22661: *      IF ERROR IN READR THEN EITHER CLOSE OUT
                   22662: *      CURRENT -COPY LEVEL, OR IF AT TOP THEN ABORT
                   22663: *
                   22664:        BZE  RDRER,ERR06      SKIP IF NOT ERROR WHILE READING
                   22665:        BZE  R$COP,ERR16      ABORT IF AT TOP LEVEL INPUT FILE
                   22666:        ZER  RDRER            ELSE CLEAR READR ERROR FLAG
                   22667:        JSR  COPND            AND CLOSE OUT THIS COPY LEVEL
                   22668: *
                   22669: *      LOOP TO SCAN TO END OF STATEMENT
                   22670: *
                   22671: ERR06  MOV  R$CIM,XR         POINT TO START OF IMAGE
                   22672:        BZE  XR,ERR07         SKIP IF NO INPUT IMAGE
                   22673:        PLC  XR               POINT TO FIRST CHAR
                   22674:        LCH  XR,(XR)          GET FIRST CHAR
                   22675:        BEQ  XR,=CH$MN,ERRG3  JUMP IF ERROR IN CONTROL CARD
                   22676:        ZER  SCNRS            CLEAR RESCAN FLAG
                   22677:        MNZ  ERRSP            SET ERROR SUPPRESS FLAG
                   22678:        JSR  SCANE            SCAN NEXT ELEMENT
                   22679:        BNE  XL,=T$SMC,ERR06  LOOP BACK IF NOT STATEMENT END
                   22680:        ZER  ERRSP            CLEAR ERROR SUPPRESS FLAG
                   22681:        EJC
                   22682: *
                   22683: *      GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
                   22684: *
                   22685: ERR07  MOV  *CDCOD,CWCOF     RESET OFFSET IN CCBLK
                   22686:        MOV  =OCER$,WA        LOAD COMPILE ERROR CALL
                   22687:        JSR  CDWRD            GENERATE IT
                   22688:        MOV  CWCOF,CMSOC(XS)  SET SUCCESS FILL IN OFFSET
                   22689:        MNZ  CMFFC(XS)        SET FAILURE FILL IN FLAG
                   22690:        JSR  CDWRD            GENERATE SUCC. FILL IN WORD
                   22691:        JMG  CMPSE            MERGE TO GENERATE ERROR AS CDFAL
                   22692:        EJC
                   22693: *
                   22694: *      ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATION.
                   22695: *
                   22696: *      EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
                   22697: *      GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
                   22698: *      BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
                   22699: *      HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
                   22700: *      THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
                   22701: *
                   22702: ERR08  JSR  COPND            CALL TO CLOSE OFF THIS LEVEL
                   22703:        BNZ  R$COP,ERR08      LOOP IF NOT ALL -COPYS CLOSED
                   22704:        ZER  R$CCB            FORGET GARBAGE CODE BLOCK
                   22705:        SSL  INISS            RESTORE MAIN PROG S-R STACK PTR
                   22706:        JSR  ERTEX            GET FAIL MESSAGE TEXT
                   22707:        DCA  XS               ENSURE STACK OK ON LOOP START
                   22708: *
                   22709: *      POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
                   22710: *      DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
                   22711: *
                   22712: ERR09  ICA  XS               POP STACK
                   22713:        BEQ  XS,FLPRT,ERR11   JUMP IF PROG DEFINED FN CALL FOUND
                   22714:        BNE  XS,GTCEF,ERR09   LOOP IF NOT EVAL OR CODE CALL YET
                   22715:        MOV  =STGXT,STAGE     RE-SET STAGE FOR EXECUTE
                   22716:        MOV  R$GTC,R$COD      RECOVER CODE PTR
                   22717:        MOV  XS,FLPTR         RESTORE FAIL POINTER
                   22718:        ZER  R$CIM            FORGET POSSIBLE IMAGE
                   22719: *
                   22720: *      TEST ERRLIMIT
                   22721: *
                   22722: ERR10  BNZ  KVERL,ERR14      JUMP IF ERRLIMIT NON-ZERO
                   22723:        BRN  EXFAL            FAIL
                   22724: *
                   22725: *      RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
                   22726: *
                   22727: ERR11  MOV  FLPTR,XS         RESTORE STACK FROM FLPTR
                   22728:        BRN  ERR10            MERGE
                   22729: *
                   22730: *      ERROR AT EXECUTE TIME.
                   22731: *
                   22732: *      THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
                   22733: *
                   22734: *      IF ERRLIMIT KEYWORD IS ZERO, THE RUN IS ABORTED.
                   22735: *      OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
                   22736: *      GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
                   22737: *      TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
                   22738: *      SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
                   22739: *      IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT OCCURS
                   22740: *      REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
                   22741: *      PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
                   22742: *      AND EXCEEDING STLIMIT.
                   22743:        EJC
                   22744: *
                   22745: ERR12  SSL  INISS            RESTORE MAIN PROG S-R STACK PTR
                   22746:        BNZ  DMVCH,ERR15      JUMP IF IN MID-DUMP
                   22747: *
                   22748: *      MERGE HERE AFTER DUMP TIDY UP
                   22749: *
                   22750: ERR13  ZER  XR               CLEAR XR FLAG
                   22751:        BZE  KVERL,STOPR      ABORT IF ERRLIMIT IS ZERO
                   22752:        JSR  ERTEX            GET FAIL MESSAGE TEXT
                   22753: *
                   22754: *      MERGE AFTER ERRLIMIT TEST
                   22755: *
                   22756: ERR14  DCV  KVERL            DECREMENT ERRLIMIT
                   22757:        MOV  R$ERT,XL         LOAD ERRTYPE TRACE POINTER
                   22758:        JSR  KTREX            GENERATE ERRTYPE TRACE IF REQUIRED
                   22759:        MOV  R$COD,R$CNT      SET CDBLK PTR FOR CONTINUATION
                   22760:        MOV  FLPTR,XR         SET PTR TO FAILURE OFFSET
                   22761:        MOV  (XR),STXOF       SAVE FAILURE OFFSET FOR CONTINUE
                   22762:        MOV  R$SXC,XR         LOAD SETEXIT CDBLK POINTER
                   22763:        BZE  XR,ERRG4         CONTINUE IF NO SETEXIT TRAP
                   22764:        ZER  R$SXC            ELSE RESET TRAP
                   22765:        MOV  =NULLS,STXVR     RESET SETEXIT ARG TO NULL
                   22766:        MOV  (XR),XL          LOAD PTR TO CODE BLOCK ROUTINE
                   22767:        BRI  XL               EXECUTE FIRST TRAP STATEMENT
                   22768: *
                   22769: *      INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
                   22770: *      MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
                   22771: *
                   22772: ERR15  MOV  DMVCH,XR         CHAIN HEAD FOR AFFECTED VRBLKS
                   22773:        BZE  XR,ERR13         DONE IF ZERO
                   22774:        MOV  (XR),DMVCH       SET NEXT LINK AS CHAIN HEAD
                   22775:        JSR  SETVR            RESTORE VRGET FIELD
                   22776:        BRN  ERR15            LOOP THROUGH CHAIN
                   22777: *
                   22778: *      TAKE DRACONIAN STEPS FOR REPEATED FATAL ERRORS
                   22779: *
                   22780: ERR16  MOV  ERRTF,WA         ERROR CODE
                   22781:        MOV  WA,KVERT         PLACE ERROR CODE FOR ERMSG
                   22782:        MNZ  XR               IN CASE COMPILE TIME
                   22783:        BEQ  STAGE,=STGIC,STOPR JUMP IF SO
                   22784:        BEQ  STAGE,=STGCE,STOPR ALSO COMPILE TIME
                   22785:        ZER  XR               INDICATE EXECUTION
                   22786:        BRN  STOPR            TERMINATE RUN
                   22787: *
                   22788: ERRAF  ERB  251,TOO MANY FATAL ERRORS
                   22789: *
                   22790: *      HERE FOR GLOBAL ERROR JUMPS
                   22791: *
                   22792: ERRG1  JMG  CMPLE
                   22793: ERRG2  JMG  CMPEE
                   22794: ERRG3  JMG  CMPCE
                   22795: ERRG4  JMG  LCNXE
                   22796:        TTL  S P I T B O L -- HERE ENDETH THE CODE
                   22797: *
                   22798: *      END OF ASSEMBLY
                   22799: *
                   22800:        END                   END MACRO-SPITBOL ASSEMBLY

unix.superglobalmegacorp.com

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