Annotation of researchv10no/cmd/spitbol/b, revision 1.1

1.1     ! root        1:        TTL  S P I T B O L - REVISION HISTORY
        !             2:        EJC
        !             3: *      R E V I S I O N   H I S T O R Y
        !             4: *      -------------------------------
        !             5: *
        !             6: *
        !             7: *      VERSION 3.5B (FEB 81... - SGD PATCHES)
        !             8: *      -----------------------------------
        !             9: *
        !            10: *      SGD03 - ADDITION OF .CNCI AND SYSCI (INT->STRING
        !            11: *              SYSTEM ROUTINE OPTION)
        !            12: *      SGD04 - (06-MAY-1981) MODIFIED INILN TO 132
        !            13: *      SGD05 - (13-MAY-1981) INSERTED MISSING WTB AFTER SYSMM
        !            14: *              CALLS
        !            15: *      SGD06 - (25-MAY-1981) MERGED IN PROFILER PATCHES
        !            16: *              (NOT MARKED)
        !            17: *      SGD07 - (25-MAY-1981) MUCHO PATCHES TO PROFILER (MARKED,
        !            18: *              BUT BEST JUST TO EXTRACT ENMASSE)
        !            19: *      SGD08 - (25-MAY-1981) USE STRING LENGTH IN HASHS
        !            20: *      SGD09 - (25-MAY-1981) FIXED SERIOUS PARSER PROBLEM
        !            21: *              RELATING TO (X Y) ON LINE BEING VIEWED AS PATTERN
        !            22: *              MATCH.  FIXED BY ADDITION OF NEW CMTYP VALUE
        !            23: *              C$CNP (CONCATENATION - NOT PATTERN MATCH)
        !            24: *      SGD10 - (01-AUG-1981) FIXED EXIT(N) RESPECIFICATION CODE
        !            25: *              TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN.
        !            26: *      SGD11 - (07-AUG-1981) BYPASS PRTPG CALL AT INITIALIZATION
        !            27: *              FOLLOWING COMPILATION IF NO OUTPUT GENERATED.
        !            28: *              THIS PREVENTS OUTPUT FILES CONSISTING OF THE
        !            29: *              HEADERS AND A FEW BLANK LINES WHEN THERE IS NO
        !            30: *              SOURCE LISTING AND NO COMPILATION STATS.
        !            31: *              ALSO FIX TIMSX INITIALIZATION IN SAME CODE.
        !            32: *      SGD12 - (17-AUG-1981) B$EFC CODE DID NOT CHECK FOR
        !            33: *              UNCONVERTED RESULT RETURNING NULL STRING.  FIXED.
        !            34: *      SGDBF - (   NOV-1981) ADDED BUFFER TYPE AND SYMBOL CNBF
        !            35: *      SGD13 - (03-MAR-1982) LOAD PFVBL FIELD IN RETRN FOR
        !            36: *              RETURN TRACING. THIS WAS CAUSING BUG ON RETURN
        !            37: *              TRACES THAT TRIED TO ACCESS THE VARIABLE NAME
        !            38: *      SGD14 - ADDED CHAR FUNCTION.  CHAR(N) RETURNS NTH
        !            39: *              CHARACTER OF HOST MACHINE CHARACTER SET.
        !            40: *              NOT CONDITIONALIZED OR MARKED.
        !            41: *      SGD15 - FIXED PROBLEM RELATING TO COMPILATION OF GOTO
        !            42: *              FIELDS CONTAINING SMALL INTEGERS (IN CONST SEC).
        !            43: *
        !            44: *      REG01 - (XX-AUG-82)
        !            45: *              ADDED CFP$U TO EASE TRANSLATION ON SMALLER
        !            46: *              SYSTEMS                  - CONDITIONAL .CUCF
        !            47: *              ADDED LOWER CASE SUPPORT - CONDITIONAL .CULC
        !            48: *              ADDED SET I/O FUNCTION   - CONDITIONAL .CUST
        !            49: *
        !            50: *      REG02 - (XX-SEP-82)
        !            51: *              CHANGED INILN AND AND INILS TO 258
        !            52: *
        !            53: *      REG03 - (XX-OCT-82)
        !            54: *              CONDITIONALIZED THE PAGE EJECT AFTER CALL TO SYSBX
        !            55: *              AND ADDED ANOTHER BEFORE CALL TO SYSBX, SO THAT,
        !            56: *              IF DESIRED BY THE IMPLEMENTOR, STANDARD OUTPUT
        !            57: *              WILL REFLECT ASSIGNMENTS MADE BY EXECUTING PROGRAM
        !            58: *              ONLY. CONDITIONAL .CUEJ CONTROLS - IF DEFINED
        !            59: *              EJECT IS BEFORE CALL TO SYSBX.
        !            60: *
        !            61: *      REG04 - (XX-NOV-82)
        !            62: *              FIXED DIFFICULTIES WITH LISTINGS DURING EXECUTION
        !            63: *              WHEN NO LISTING GENERATED DURING COMPILATION.
        !            64: *
        !            65: *              -LIST TO CODE() CAUSED BOMB. FIX IS TO RESET
        !            66: *              R$TTL AND R$STL TO NULLS NOT 0 AFTER COMPILATION.
        !            67: *              (LISTR AND LISTT EXPECT NULLS)
        !            68: *
        !            69: *              WHEN LISTING AND STATISTICS ROUTED TO DIFFERENT
        !            70: *              FILE THAN EXECUTION OUTPUT, ERROR MESSAGE IS SENT
        !            71: *              TO EXECUTION OUTPUT (AND GETS SEPARATED FROM
        !            72: *              ... IN STATEMENT ... MSG). LABO1 CALLS SYSAX AND
        !            73: *              STOPR DOES NOT CALL SYSAX IF ENTERED FROM LABO1.
        !            74: *
        !            75: *      REG05 - (XX-NOV-82)
        !            76: *              PREVENT CLEAR() FROM CLOBBERING PROTECTED VARIABLES
        !            77: *              AT LABEL SCLR5.
        !            78: *
        !            79: *      REG06 - (XX-NOV-82)
        !            80: *              FIXED GTEXP FROM ACCEPTING TRAILING SEMICOLON OR
        !            81: *              COLON. NOT LEGAL WAY TO END AN EXPRESSION.
        !            82: *
        !            83: *      VERSION 3.5A (OCT 79 - SGD PATCHES)
        !            84: *      -----------------------------------
        !            85: *
        !            86: *      SGD01 - PATCH IN ASIGN TO FIX MULTIPLE TRAP BLOCK PROBLEM
        !            87: *              (ASG10+2)
        !            88: *      SGD02 - PATCH IN GTARR TO FIX NULL CONVERT (GTAR9+0)
        !            89: *
        !            90:        TTL  S P I T B O L  -- BASIC INFORMATION
        !            91:        EJC
        !            92: *
        !            93: *      GENERAL STRUCTURE
        !            94: *      -----------------
        !            95: *
        !            96: *      THIS PROGRAM IS A TRANSLATOR FOR A VERSION OF THE SNOBOL4
        !            97: *      PROGRAMMING LANGUAGE. LANGUAGE DETAILS ARE CONTAINED IN
        !            98: *      THE MANUAL MACRO SPITBOL BY DEWAR AND MCCANN, TECHNICAL
        !            99: *      REPORT 90, UNIVERSITY OF LEEDS 1976.  THE LANGUAGE
        !           100: *      IS IDENTICAL TO THAT IMPLEMENTED BY THE BTL TRANSLATOR
        !           101: *      (R. E. GRISWOLD ET AL.) WITH THE FOLLOWING EXCEPTIONS.
        !           102: *
        !           103: *      1)   REDEFINITION OF STANDARD SYSTEM FUNCTIONS AND
        !           104: *           OPERATORS IS NOT PERMITTED.
        !           105: *
        !           106: *      2)   THE VALUE FUNCTION IS NOT PROVIDED.
        !           107: *
        !           108: *      3)   ACCESS TRACING IS PROVIDED IN ADDITION TO THE
        !           109: *           OTHER STANDARD TRACE MODES.
        !           110: *
        !           111: *      4)   THE KEYWORD STFCOUNT IS NOT PROVIDED.
        !           112: *
        !           113: *      5)   THE KEYWORD FULLSCAN IS NOT PROVIDED AND ALL PATTERN
        !           114: *           MATCHING TAKES PLACE IN FULLSCAN MODE (I.E. WITH NO
        !           115: *           HEURISTICS APPLIED).
        !           116: *
        !           117: *      6)   A SERIES OF EXPRESSIONS SEPARATED BY COMMAS MAY
        !           118: *           BE GROUPED WITHIN PARENTHESES TO PROVIDE A SELECTION
        !           119: *           CAPABILITY. THE SEMANTICS ARE THAT THE SELECTION
        !           120: *           ASSUMES THE VALUE OF THE FIRST EXPRESSION WITHIN IT
        !           121: *           WHICH SUCCEEDS AS THEY ARE EVALUATED FROM THE LEFT.
        !           122: *           IF NO EXPRESSION SUCCEEDS THE ENTIRE STATEMENT FAILS
        !           123: *
        !           124: *      7)   AN EXPLICIT PATTERN MATCHING OPERATOR IS PROVIDED.
        !           125: *           THIS IS THE BINARY QUERY (SEE GIMPEL SIGPLAN OCT 74)
        !           126: *
        !           127: *      8)   THE ASSIGNMENT OPERATOR IS INTRODUCED AS IN THE
        !           128: *           GIMPEL REFERENCE.
        !           129: *
        !           130: *      9)   THE EXIT FUNCTION IS PROVIDED FOR GENERATING LOAD
        !           131: *           MODULES - CF. GIMPELS SITBOL.
        !           132: *
        !           133: *
        !           134: *      THE METHOD USED IN THIS PROGRAM IS TO TRANSLATE THE
        !           135: *      SOURCE CODE INTO AN INTERNAL PSEUDO-CODE (SEE FOLLOWING
        !           136: *      SECTION). AN INTERPRETOR IS THEN USED TO EXECUTE THIS
        !           137: *      GENERATED PSEUDO-CODE. THE NATURE OF THE SNOBOL4 LANGUAGE
        !           138: *      IS SUCH THAT THE LATTER TASK IS MUCH MORE COMPLEX THAN
        !           139: *      THE ACTUAL TRANSLATION PHASE. ACCORDINGLY, NEARLY ALL THE
        !           140: *      CODE IN THE PROGRAM SECTION IS CONCERNED WITH THE ACTUAL
        !           141: *      EXECUTION OF THE SNOBOL4 PROGRAM.
        !           142:        EJC
        !           143: *
        !           144: *      INTERPRETIVE CODE FORMAT
        !           145: *      ------------------------
        !           146: *
        !           147: *      THE INTERPRETIVE PSEUDO-CODE CONSISTS OF A SERIES OF
        !           148: *      ADDRESS POINTERS. THE EXACT FORMAT OF THE CODE IS
        !           149: *      DESCRIBED IN CONNECTION WITH THE CDBLK FORMAT. THE
        !           150: *      PURPOSE OF THIS SECTION IS TO GIVE GENERAL INSIGHT INTO
        !           151: *      THE INTERPRETIVE APPROACH INVOLVED.
        !           152: *
        !           153: *      THE BASIC FORM OF THE CODE IS RELATED TO REVERSE POLISH.
        !           154: *      IN OTHER WORDS, THE OPERANDS PRECEDE THE OPERATORS WHICH
        !           155: *      ARE ZERO ADDRESS OPERATORS. THERE ARE SOME EXCEPTIONS TO
        !           156: *      THESE RULES, NOTABLY THE UNARY NOT OPERATOR AND THE
        !           157: *      SELECTION CONSTRUCTION WHICH CLEARLY REQUIRE ADVANCE
        !           158: *      KNOWLEDGE OF THE OPERATOR INVOLVED.
        !           159: *
        !           160: *      THE OPERANDS ARE MOVED TO THE TOP OF THE MAIN STACK AND
        !           161: *      THE OPERATORS ARE APPLIED TO THE TOP STACK ENTRIES. LIKE
        !           162: *      OTHER VERSIONS OF SPITBOL, THIS PROCESSOR DEPENDS ON
        !           163: *      KNOWING WHETHER OPERANDS ARE REQUIRED BY NAME OR BY VALUE
        !           164: *      AND MOVES THE APPROPRIATE OBJECT TO THE STACK. THUS NO
        !           165: *      NAME/VALUE CHECKS ARE INCLUDED IN THE OPERATOR CIRCUITS.
        !           166: *
        !           167: *      THE ACTUAL POINTERS IN THE CODE POINT TO A BLOCK WHOSE
        !           168: *      FIRST WORD IS THE ADDRESS OF THE INTERPRETOR ROUTINE
        !           169: *      TO BE EXECUTED FOR THE CODE WORD.
        !           170: *
        !           171: *      IN THE CASE OF OPERATORS, THE POINTER IS TO A WORD WHICH
        !           172: *      CONTAINS THE ADDRESS OF THE OPERATOR TO BE EXECUTED. IN
        !           173: *      THE CASE OF OPERANDS SUCH AS CONSTANTS, THE POINTER IS TO
        !           174: *      THE OPERAND ITSELF. ACCORDINGLY, ALL OPERANDS CONTAIN
        !           175: *      A FIELD WHICH POINTS TO THE ROUTINE TO LOAD THE VALUE OF
        !           176: *      THE OPERAND ONTO THE STACK. IN THE CASE OF A VARIABLE,
        !           177: *      THERE ARE THREE SUCH POINTERS. ONE TO LOAD THE VALUE,
        !           178: *      ONE TO STORE THE VALUE AND A THIRD TO JUMP TO THE LABEL.
        !           179: *
        !           180: *      THE HANDLING OF FAILURE RETURNS DESERVES SPECIAL COMMENT.
        !           181: *      THE LOCATION FLPTR CONTAINS THE POINTER TO THE LOCATION
        !           182: *      ON THE MAIN STACK WHICH CONTAINS THE FAILURE RETURN
        !           183: *      WHICH IS IN THE FORM OF A BYTE OFFSET IN THE CURRENT
        !           184: *      CODE BLOCK (CDBLK OR EXBLK). WHEN A FAILURE OCCURS, THE
        !           185: *      STACK IS POPPED AS INDICATED BY THE SETTING OF FLPTR AND
        !           186: *      CONTROL IS PASSED TO THE APPROPRIATE LOCATION IN THE
        !           187: *      CURRENT CODE BLOCK WITH THE STACK POINTER POINTING TO THE
        !           188: *      FAILURE OFFSET ON THE STACK AND FLPTR UNCHANGED.
        !           189:        EJC
        !           190: *
        !           191: *      INTERNAL DATA REPRESENTATIONS
        !           192: *      -----------------------------
        !           193: *
        !           194: *      REPRESENTATION OF VALUES
        !           195: *
        !           196: *      A VALUE IS REPRESENTED BY A POINTER TO A BLOCK WHICH
        !           197: *      DESCRIBES THE TYPE AND PARTICULARS OF THE DATA VALUE.
        !           198: *      IN GENERAL, A VARIABLE IS A LOCATION CONTAINING SUCH A
        !           199: *      POINTER (ALTHOUGH IN THE CASE OF TRACE ASSOCIATIONS THIS
        !           200: *      IS MODIFIED, SEE DESCRIPTION OF TRBLK).
        !           201: *
        !           202: *      THE FOLLOWING IS A LIST OF POSSIBLE DATATYPES SHOWING THE
        !           203: *      TYPE OF BLOCK USED TO HOLD THE VALUE. THE DETAILS OF
        !           204: *      EACH BLOCK FORMAT ARE GIVEN LATER.
        !           205: *
        !           206: *      DATATYPE              BLOCK TYPE
        !           207: *      --------              ----------
        !           208: *
        !           209: *
        !           210: *      ARRAY                 ARBLK OR VCBLK
        !           211: *
        !           212: *      CODE                  CDBLK
        !           213: *
        !           214: *      EXPRESSION            EXBLK OR SEBLK
        !           215: *
        !           216: *      INTEGER               ICBLK
        !           217: *
        !           218: *      NAME                  NMBLK
        !           219: *
        !           220: *      PATTERN               P0BLK OR P1BLK OR P2BLK
        !           221: *
        !           222: *      REAL                  RCBLK
        !           223: *
        !           224: *      STRING                SCBLK
        !           225: *
        !           226: *      TABLE                 TBBLK
        !           227: *
        !           228: *      PROGRAM DATATYPE      PDBLK
        !           229:        EJC
        !           230: *
        !           231: *      REPRESENTATION OF VARIABLES
        !           232: *      ---------------------------
        !           233: *
        !           234: *      DURING THE COURSE OF EVALUATING EXPRESSIONS, IT IS
        !           235: *      NECESSARY TO GENERATE NAMES OF VARIABLES (FOR EXAMPLE
        !           236: *      ON THE LEFT SIDE OF A BINARY EQUALS OPERATOR). THESE ARE
        !           237: *      NOT TO BE CONFUSED WITH OBJECTS OF DATATYPE NAME WHICH
        !           238: *      ARE IN FACT VALUES.
        !           239: *
        !           240: *      FROM A LOGICAL POINT OF VIEW, SUCH NAMES COULD BE SIMPLY
        !           241: *      REPRESENTED BY A POINTER TO THE APPROPRIATE VALUE CELL.
        !           242: *      HOWEVER IN THE CASE OF ARRAYS AND PROGRAM DEFINED
        !           243: *      DATATYPES, THIS WOULD VIOLATE THE RULE THAT THERE MUST BE
        !           244: *      NO POINTERS INTO THE MIDDLE OF A BLOCK IN DYNAMIC STORE.
        !           245: *      ACCORDINGLY, A NAME IS ALWAYS REPRESENTED BY A BASE AND
        !           246: *      OFFSET. THE BASE POINTS TO THE START OF THE BLOCK
        !           247: *      CONTAINING THE VARIABLE VALUE AND THE OFFSET IS THE
        !           248: *      OFFSET WITHIN THIS BLOCK IN BYTES. THUS THE ADDRESS
        !           249: *      OF THE ACTUAL VARIABLE IS DETERMINED BY ADDING THE BASE
        !           250: *      AND OFFSET VALUES.
        !           251: *
        !           252: *      THE FOLLOWING ARE THE INSTANCES OF VARIABLES REPRESENTED
        !           253: *      IN THIS MANNER.
        !           254: *
        !           255: *      1)   NATURAL VARIABLE BASE IS PTR TO VRBLK
        !           256: *                            OFFSET IS *VRVAL
        !           257: *
        !           258: *      2)   TABLE ELEMENT    BASE IS PTR TO TEBLK
        !           259: *                            OFFSET IS *TEVAL
        !           260: *
        !           261: *      3)   ARRAY ELEMENT    BASE IS PTR TO ARBLK
        !           262: *                            OFFSET IS OFFSET TO ELEMENT
        !           263: *
        !           264: *      4)   VECTOR ELEMENT   BASE IS PTR TO VCBLK
        !           265: *                            OFFSET IS OFFSET TO ELEMENT
        !           266: *
        !           267: *      5)   PROG DEF DTP     BASE IS PTR TO PDBLK
        !           268: *                            OFFSET IS OFFSET TO FIELD VALUE
        !           269: *
        !           270: *      IN ADDITION THERE ARE TWO CASES OF OBJECTS WHICH ARE
        !           271: *      LIKE VARIABLES BUT CANNOT BE HANDLED IN THIS MANNER.
        !           272: *      THESE ARE CALLED PSEUDO-VARIABLES AND ARE REPRESENTED
        !           273: *      WITH A SPECIAL BASE POINTER AS FOLLOWS=
        !           274: *
        !           275: *      EXPRESSION VARIABLE   PTR TO EVBLK (SEE EVBLK)
        !           276: *
        !           277: *      KEYWORD VARIABLE      PTR TO KVBLK (SEE KVBLK)
        !           278: *
        !           279: *      PSEUDO-VARIABLES ARE HANDLED AS SPECIAL CASES BY THE
        !           280: *      ACCESS PROCEDURE (ACESS) AND THE ASSIGNMENT PROCEDURE
        !           281: *      (ASIGN). SEE THESE TWO PROCEDURES FOR DETAILS.
        !           282:        EJC
        !           283: *
        !           284: *      ORGANIZATION OF DATA AREA
        !           285: *      -------------------------
        !           286: *
        !           287: *
        !           288: *      THE DATA AREA IS DIVIDED INTO TWO REGIONS.
        !           289: *
        !           290: *      STATIC AREA
        !           291: *
        !           292: *      THE STATIC AREA BUILDS UP FROM THE BOTTOM AND CONTAINS
        !           293: *      DATA AREAS WHICH ARE ALLOCATED DYNAMICALLY BUT ARE NEVER
        !           294: *      DELETED OR MOVED AROUND. THE MACRO-PROGRAM ITSELF
        !           295: *      USES THE STATIC AREA FOR THE FOLLOWING.
        !           296: *
        !           297: *      1)   ALL VARIABLE BLOCKS (VRBLK).
        !           298: *
        !           299: *      2)   THE HASH TABLE FOR VARIABLE BLOCKS.
        !           300: *
        !           301: *      3)   MISCELLANEOUS BUFFERS AND WORK AREAS (SEE PROGRAM
        !           302: *           INITIALIZATION SECTION).
        !           303: *
        !           304: *      IN ADDITION, THE SYSTEM PROCEDURES MAY USE THIS AREA FOR
        !           305: *      INPUT/OUTPUT BUFFERS, EXTERNAL FUNCTIONS ETC. SPACE IN
        !           306: *      THE STATIC REGION IS ALLOCATED BY CALLING PROCEDURE ALOST
        !           307: *
        !           308: *      THE FOLLOWING GLOBAL VARIABLES DEFINE THE CURRENT
        !           309: *      LOCATION AND SIZE OF THE STATIC AREA.
        !           310: *
        !           311: *      STATB                 ADDRESS OF START OF STATIC AREA
        !           312: *      STATE                 ADDRESS+1 OF LAST WORD IN AREA.
        !           313: *
        !           314: *      THE MINIMUM SIZE OF STATIC IS GIVEN APPROXIMATELY BY
        !           315: *           12 + *E$HNB + *E$STS + SPACE FOR ALPHABET STRING
        !           316: *           AND STANDARD PRINT BUFFER.
        !           317:        EJC
        !           318: *
        !           319: *      DYNAMIC AREA
        !           320: *
        !           321: *      THE DYNAMIC AREA IS BUILT UPWARDS IN MEMORY AFTER THE
        !           322: *      STATIC REGION. DATA IN THIS AREA MUST ALL BE IN STANDARD
        !           323: *      BLOCK FORMATS SO THAT IT CAN BE PROCESSED BY THE GARBAGE
        !           324: *      COLLECTOR (PROCEDURE GBCOL). GBCOL COMPACTS BLOCKS DOWN
        !           325: *      IN THIS REGION AS REQUIRED BY SPACE EXHAUSTION AND CAN
        !           326: *      ALSO MOVE ALL BLOCKS UP TO ALLOW FOR EXPANSION OF THE
        !           327: *      STATIC REGION.
        !           328: *      WITH THE EXCEPTION OF TABLES AND ARRAYS, NO SPITBOL
        !           329: *      OBJECT ONCE BUILT IN DYNAMIC MEMORY IS EVER SUBSEQUENTLY
        !           330: *      MODIFIED. OBSERVING THIS RULE NECESSITATES A COPYING
        !           331: *      ACTION DURING STRING AND PATTERN CONCATENATION.
        !           332: *
        !           333: *      GARBAGE COLLECTION IS FUNDAMENTAL TO THE ALLOCATION OF
        !           334: *      SPACE FOR VALUES. SPITBOL USES A VERY EFFICIENT GARBAGE
        !           335: *      COLLECTOR WHICH INSISTS THAT POINTERS INTO DYNAMIC STORE
        !           336: *      SHOULD BE IDENTIFIABLE WITHOUT USE OF BIT TABLES,
        !           337: *      MARKER BITS ETC. TO SATISFY THIS REQUIREMENT, DYNAMIC
        !           338: *      MEMORY MUST NOT START AT TOO LOW AN ADDRESS AND LENGTHS
        !           339: *      OF ARRAYS, TABLES, STRINGS, CODE AND EXPRESSION BLOCKS
        !           340: *      MAY NOT EXCEED THE NUMERICAL VALUE OF THE LOWEST DYNAMIC
        !           341: *      ADDRESS. TO AVOID EITHER PENALIZING USERS WITH MODEST
        !           342: *      REQUIREMENTS OR RESTRICTING THOSE WITH GREATER NEEDS ON
        !           343: *      HOST SYSTEMS WHERE DYNAMIC MEMORY IS ALLOCATED IN LOW
        !           344: *      ADDRESSES, THE MINIMUM DYNAMIC ADDRESS MAY BE SPECIFIED
        !           345: *      SUFFICIENTLY HIGH TO PERMIT ARBITRARILY LARGE SPITBOL
        !           346: *      OBJECTS TO BE CREATED ( WITH THE POSSIBILITY IN EXTREME
        !           347: *      CASES OF WASTING LARGE AMOUNTS OF MEMORY BELOW THE
        !           348: *      START ADDRESS). THIS MINIMUM VALUE IS MADE AVAILABLE
        !           349: *      IN VARIABLE MXLEN BY A SYSTEM ROUTINE, SYSMX.
        !           350: *      ALTERNATIVELY SYSMX MAY INDICATE THAT A
        !           351: *      DEFAULT MAY BE USED IN WHICH DYNAMIC IS PLACED
        !           352: *      AT THE LOWEST POSSIBLE ADDRESS FOLLOWING STATIC.
        !           353: *
        !           354: *      THE FOLLOWING GLOBAL WORK CELLS DEFINE THE LOCATION AND
        !           355: *      LENGTH OF THE DYNAMIC AREA.
        !           356: *
        !           357: *      DNAMB                 START OF DYNAMIC AREA
        !           358: *      DNAMP                 NEXT AVAILABLE LOCATION
        !           359: *      DNAME                 LAST AVAILABLE LOCATION + 1
        !           360: *
        !           361: *      DNAMB IS ALWAYS HIGHER THAN STATE SINCE THE ALOST
        !           362: *      PROCEDURE MAINTAINS SOME EXPANSION SPACE ABOVE STATE.
        !           363: *      *** DNAMB MUST NEVER BE PERMITTED TO HAVE A VALUE LESS
        !           364: *      THAN THAT IN MXLEN ***
        !           365: *
        !           366: *      SPACE IN THE DYNAMIC REGION IS ALLOCATED BY THE ALLOC
        !           367: *      PROCEDURE. THE DYNAMIC REGION MAY BE USED BY SYSTEM
        !           368: *      PROCEDURES PROVIDED THAT ALL THE RULES ARE OBEYED.
        !           369:        EJC
        !           370: *
        !           371: *      REGISTER USAGE
        !           372: *      --------------
        !           373: *
        !           374: *      (CP)                  CODE POINTER REGISTER. USED TO
        !           375: *                            HOLD A POINTER TO THE CURRENT
        !           376: *                            LOCATION IN THE INTERPRETIVE PSEUDO
        !           377: *                            CODE (I.E. PTR INTO A CDBLK).
        !           378: *
        !           379: *      (XL,XR)               GENERAL INDEX REGISTERS. USUALLY
        !           380: *                            USED TO HOLD POINTERS TO BLOCKS IN
        !           381: *                            DYNAMIC STORAGE. AN IMPORTANT
        !           382: *                            RESTRICTION IS THAT THE VALUE IN
        !           383: *                            XL MUST BE COLLECTABLE FOR
        !           384: *                            A GARBAGE COLLECT CALL. A VALUE
        !           385: *                            IS COLLECTABLE IF IT EITHER POINTS
        !           386: *                            OUTSIDE THE DYNAMIC AREA, OR IF IT
        !           387: *                            POINTS TO THE START OF A BLOCK IN
        !           388: *                            THE DYNAMIC AREA.
        !           389: *
        !           390: *      (XS)                  STACK POINTER. USED TO POINT TO
        !           391: *                            THE STACK FRONT. THE STACK MAY
        !           392: *                            BUILD UP OR DOWN AND IS USED
        !           393: *                            TO STACK SUBROUTINE RETURN POINTS
        !           394: *                            AND OTHER RECURSIVELY SAVED DATA.
        !           395: *
        !           396: *      (XT)                  AN ALTERNATIVE NAME FOR XL DURING
        !           397: *                            ITS USE IN ACCESSING STACKED ITEMS.
        !           398: *
        !           399: *      (WA,WB,WC)            GENERAL WORK REGISTERS. CANNOT BE
        !           400: *                            USED FOR INDEXING, BUT MAY HOLD
        !           401: *                            VARIOUS TYPES OF DATA.
        !           402: *
        !           403: *      (IA)                  USED FOR ALL SIGNED INTEGER
        !           404: *                            ARITHMETIC, BOTH THAT USED BY THE
        !           405: *                            TRANSLATOR AND THAT ARISING FROM
        !           406: *                            USE OF SNOBOL4 ARITHMETIC OPERATORS
        !           407: *
        !           408: *      (RA)                  REAL ACCUMULATOR. USED FOR ALL
        !           409: *                            FLOATING POINT ARITHMETIC.
        !           410:        EJC
        !           411: *
        !           412: *      SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
        !           413: *      ------------------------------------
        !           414: *
        !           415: *      IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
        !           416: *      ASSEMBLY SYMBOLS ARE REFERRED TO. TO INCORPORATE THE
        !           417: *      FEATURES REFERRED TO, THE MINIMAL SOURCE SHOULD BE
        !           418: *      PREFACED BY SUITABLE CONDITIONAL ASSEMBLY SYMBOL
        !           419: *      DEFINITIONS.
        !           420: *      IN ALL CASES IT IS PERMISSIBLE TO DEFAULT THE DEFINITIONS
        !           421: *      IN WHICH CASE THE ADDITIONAL FEATURES WILL BE OMITTED
        !           422: *      FROM THE TARGET CODE.
        !           423: *
        !           424: *      .CASL                 DEFINE TO INCLUDE 26 SHIFTED LETTRS
        !           425: *      .CAHT                 DEFINE TO INCLUDE HORIZONTAL TAB
        !           426: *      .CAVT                 DEFINE TO INCLUDE VERTICAL TAB
        !           427: *      .CIOD                 IF DEFINED, DEFAULT DELIMITER IS
        !           428: *                            NOT USED IN PROCESSING 3RD ARG OF
        !           429: *                            INPUT() AND OUTPUT()
        !           430: *      .CNBT                 DEFINE TO OMIT BATCH INITIALISATION
        !           431: *      .CNCI                 DEFINE TO ENABLE SYSCI ROUTINE
        !           432: *      .CNEX                 DEFINE TO OMIT EXIT() CODE.
        !           433: *      .CNLD                 DEFINE TO OMIT LOAD() CODE.
        !           434: *      .CNPF                 DEFINE TO OMIT PROFILE STUFF
        !           435: *      .CNRA                 DEFINE TO OMIT ALL REAL ARITHMETIC
        !           436: *      .CNSR                 DEFINE TO OMIT SORT, RSORT
        !           437: *      .CSAX                 DEFINE IF SYSAX IS TO BE CALLED
        !           438: *      .CSN6                 DEFINE TO PAD STMT NOS TO 6 CHARS
        !           439: *      .CSN8                 DEFINE TO PAD STMT NOS TO 8 CHARS
        !           440: *      .CUCF                 DEFINE TO INCLUDE CFP$U
        !           441: *      .CULC                 DEFINE TO INCLUDE &CASE (LC NAMES)
        !           442: *      .CUST                 DEFINE TO INCLUDE SET() CODE
        !           443: .DEF   .CASL
        !           444: .DEF   .CAHT
        !           445: .DEF   .CIOD
        !           446: .DEF   .CSAX
        !           447: .DEF   .CSN8
        !           448: .DEF   .CUCF
        !           449: .DEF   .CUEJ
        !           450: .DEF   .CULC
        !           451: .DEF   .CUST
        !           452:        TTL  S P I T B O L -- PROCEDURES SECTION
        !           453: *
        !           454: *      THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING
        !           455: *      SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL
        !           456: *      TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES
        !           457: *      BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL
        !           458: *      ORDER.
        !           459: *      ALL PROCEDURES HAVE A  SPECIFICATION CONSISTING OF A
        !           460: *      MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER
        !           461: *      CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND
        !           462: *      FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS
        !           463: *      REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD
        !           464: *      THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY
        !           465: *      MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR
        !           466: *      VALUES CHANGED.
        !           467: *      THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS
        !           468: *      CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM
        !           469: *      INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE
        !           470: *      FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN
        !           471: *      ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES,
        !           472: *      IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH
        !           473: *      DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS
        !           474: *      OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT.
        !           475: *      E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB,
        !           476: *      JSR SYSTC IN SOME IMPLEMENTATIONS.
        !           477: *
        !           478: *      IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK
        !           479: *      FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL
        !           480: *      DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL
        !           481: *      SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD
        !           482: *      BE CONSULTED.
        !           483: *
        !           484: *      SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL
        !           485: *      PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR
        !           486: *      INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS
        !           487: *      IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT
        !           488: *      TYPES IF THIS PROVES NECESSARY.
        !           489: *
        !           490:        SEC                   START OF PROCEDURES SECTION
        !           491: .IF    .CSAX
        !           492:        EJC
        !           493: *
        !           494: *      SYSAX -- AFTER EXECUTION
        !           495: *
        !           496: SYSAX  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           497: *
        !           498: *      IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED,
        !           499: *      THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND
        !           500: *      BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT.
        !           501: *      PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND
        !           502: *      IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX
        !           503: *      IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED.
        !           504: *
        !           505: *      JSR  SYSAX            CALL AFTER EXECUTION
        !           506: .ELSE
        !           507: .FI
        !           508:        EJC
        !           509: *
        !           510: *      SYSBX -- BEFORE EXECUTION
        !           511: *
        !           512: SYSBX  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           513: *
        !           514: *      CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE
        !           515: *      COMMENCING EXECUTION IN CASE OSINT NEEDS
        !           516: *      TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES.
        !           517: *      OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE
        !           518: *      TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING.
        !           519: *
        !           520: *      JSR  SYSBX            CALL BEFORE EXECUTION STARTS
        !           521:        EJC
        !           522: .IF    .CNCI
        !           523: *
        !           524: *      SYSCI -- CONVERT INTEGER
        !           525: *
        !           526: SYSCI  EXP
        !           527: *
        !           528: *      SYSCI IS AN OPTIONAL OSINT ROUTINE THAT CAUSES SPITBOL TO
        !           529: *      CALL SYSCI TO CONVERT INTEGER VALUES TO STRINGS, RATHER
        !           530: *      THAN USING SPITBOL'S OWN INTERNAL CONVERSION CODE.  THIS
        !           531: *      CODE MAY BE LESS EFFICIENT ON MACHINES WITH HARDWARE
        !           532: *      CONVERSION INSTRUCTIONS AND IN SUCH CASES, IT MAY BE AN
        !           533: *      ADVANTAGE TO INCLUDE SYSCI.  THE SYMBOL .CNCI MUST BE
        !           534: *      DEFINED IF THIS ROUTINE IS TO BE USED.
        !           535: *
        !           536: *      THE RULES FOR CONVERTING INTEGERS TO STRINGS ARE THAT
        !           537: *      POSITIVE VALUES ARE REPRESENTED WITHOUT ANY SIGN, AND
        !           538: *      THERE ARE NEVER ANY LEADING BLANKS OR ZEROS, EXCEPT IN
        !           539: *      THE CASE OF ZERO ITSELF WHICH IS REPRESENTED AS A SINGLE
        !           540: *      ZERO DIGIT.  NEGATIVE NUMBERS ARE REPRESENTED WITH A
        !           541: *      PRECEEDING MINUS SIGN.  THERE ARE NEVER ANY TRAILING
        !           542: *      BLANKS, AND CONVERSION CANNOT FAIL.
        !           543: *
        !           544: *      (IA)                  VALUE TO BE CONVERTED
        !           545: *      JSR  SYSCI            CALL TO CONVERT INTEGER VALUE
        !           546: *      (XL)                  POINTER TO PSEUDO-SCBLK WITH STRING
        !           547:        EJC
        !           548: .FI
        !           549: *
        !           550: *      SYSDC -- DATE CHECK
        !           551: *
        !           552: SYSDC  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           553: *
        !           554: *      SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL
        !           555: *      VERSION OF SPITBOL IS UNEXPIRED.
        !           556: *
        !           557: *      JSR  SYSDC            CALL TO CHECK DATE
        !           558: *      RETURN ONLY IF DATE IS OK
        !           559:        EJC
        !           560: *
        !           561: *      SYSDM  -- DUMP CORE
        !           562: *
        !           563: SYSDM  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           564: *
        !           565: *      SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH
        !           566: *      N GE 3.  ITS PURPOSE IS TO PROVIDE A CORE DUMP.
        !           567: *      N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND
        !           568: *      AMOUNT TO BE DUMPED E.G.  N = 256*A + S , S = START ADRS
        !           569: *      IN KILOWORDS,  A = KILOWORDS TO DUMP
        !           570: *
        !           571: *      (XR)                  PARAMETER N OF CALL DUMP(N)
        !           572: *      JSR  SYSDM            CALL TO ENTER ROUTINE
        !           573:        EJC
        !           574: *
        !           575: *      SYSDT -- GET CURRENT DATE
        !           576: *
        !           577: SYSDT  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           578: *
        !           579: *      SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS
        !           580: *      RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE
        !           581: *      TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE
        !           582: *      CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE
        !           583: *      SNOBOL4 FUNCTION DATE.
        !           584: *
        !           585: *      JSR  SYSDT            CALL TO GET DATE
        !           586: *      (XL)                  POINTER TO BLOCK CONTAINING DATE
        !           587: *
        !           588: *      THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT
        !           589: *      THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED
        !           590: *      INTO SPITBOL DYNAMIC MEMORY ON RETURN.
        !           591:        EJC
        !           592: *
        !           593: *      SYSEF -- EJECT FILE
        !           594: *
        !           595: SYSEF  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           596: *
        !           597: *      SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT
        !           598: *      MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES
        !           599: *      SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE
        !           600: *      STANDARD OUTPUT FILE (SEE SYSEP).
        !           601: *
        !           602: *      (WA)                  PTR TO FCBLK OR ZERO
        !           603: *      (XR)                  EJECT ARGUMENT (SCBLK PTR)
        !           604: *      JSR  SYSEF            CALL TO EJECT FILE
        !           605: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
        !           606: *      PPM  LOC              RETURN HERE IF INAPPROPRIATE FILE
        !           607: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !           608:        EJC
        !           609: *
        !           610: *      SYSEJ -- END OF JOB
        !           611: *
        !           612: SYSEJ  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           613: *
        !           614: *      SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO
        !           615: *      TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND
        !           616: *      CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE
        !           617: *      VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE
        !           618: *      ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS
        !           619: *      A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER.
        !           620: *      SEE SYSXI FOR DETAILS OF FCBLK CHAIN
        !           621: *
        !           622: *      (WA)                  VALUE OF ABEND KEYWORD
        !           623: *      (WB)                  VALUE OF CODE KEYWORD
        !           624: *      (XL)                  O OR PTR TO HEAD OF FCBLK CHAIN
        !           625: *      JSR  SYSEJ            CALL TO END JOB
        !           626: *
        !           627: *      THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB)
        !           628: *      999  EXECUTION SUPPRESSED
        !           629: *      998  STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI
        !           630: *           LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER
        !           631: *           OF THE STATEMENT CAUSING PREMATURE TERMINATION.
        !           632:        EJC
        !           633: *
        !           634: *      SYSEM -- GET ERROR MESSAGE TEXT
        !           635: *
        !           636: SYSEM  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           637: *
        !           638: *      SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE
        !           639: *      SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED
        !           640: *      TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE.
        !           641: *
        !           642: *      (WA)                  ERROR CODE NUMBER
        !           643: *      JSR  SYSEM            CALL TO GET TEXT
        !           644: *      (XR)                  TEXT OF MESSAGE
        !           645: *
        !           646: *      THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK
        !           647: *      FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE
        !           648: *      STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN.
        !           649: *      IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES
        !           650: *      NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF
        !           651: *      RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT
        !           652: *      KEYWORD.
        !           653:        EJC
        !           654: *
        !           655: *      SYSEN -- ENDFILE
        !           656: *
        !           657: SYSEN  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           658: *
        !           659: *      SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE.
        !           660: *      THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE
        !           661: *      IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED,
        !           662: *      BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE
        !           663: *      SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ
        !           664: *      OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE
        !           665: *      NECESSARY TO REOPEN THE FILE VIA SYSIO.
        !           666: *
        !           667: *      (WA)                  PTR TO FCBLK OR ZERO
        !           668: *      (XR)                  ENDFILE ARGUMENT (SCBLK PTR)
        !           669: *      JSR  SYSEN            CALL TO ENDFILE
        !           670: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
        !           671: *      PPM  LOC              RETURN HERE IF ENDFILE NOT ALLOWED
        !           672: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !           673: *      (WA,WB)               DESTROYED
        !           674: *
        !           675: *      THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH
        !           676: *      ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED
        !           677: *      THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS
        !           678: *      CATEGORY.
        !           679:        EJC
        !           680: *
        !           681: *      SYSEP -- EJECT PRINTER PAGE
        !           682: *
        !           683: SYSEP  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           684: *
        !           685: *      SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD
        !           686: *      PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT).
        !           687: *
        !           688: *      JSR  SYSEP            CALL TO EJECT PRINTER OUTPUT
        !           689:        EJC
        !           690: *
        !           691: *      SYSEX -- CALL EXTERNAL FUNCTION
        !           692: *
        !           693: SYSEX  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           694: *
        !           695: *      SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION
        !           696: *      PREVIOUSLY LOADED WITH A CALL TO SYSLD.
        !           697: *
        !           698: *      (XS)                  POINTER TO ARGUMENTS ON STACK
        !           699: *      (XL)                  POINTER TO CONTROL BLOCK (EFBLK)
        !           700: *      (WA)                  NUMBER OF ARGUMENTS ON STACK
        !           701: *      JSR  SYSEX            CALL TO PASS CONTROL TO FUNCTION
        !           702: *      PPM  LOC              RETURN HERE IF FUNCTION CALL FAILS
        !           703: *      (XS)                  POPPED PAST ARGUMENTS
        !           704: *      (XR)                  RESULT RETURNED
        !           705: *
        !           706: *      THE ARGUMENTS ARE STORED ON THE STACK WITH
        !           707: *      THE LAST ARGUMENT AT 0(XS). ON RETURN, XS
        !           708: *      IS POPPED PAST THE ARGUMENTS.
        !           709: *
        !           710: *      THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE
        !           711: *      SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES
        !           712: *      SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED
        !           713: *      (UNDER EFBLK) IN THIS SECTION.
        !           714: *
        !           715: *      THERE ARE TWO WAYS OF RETURNING A RESULT.
        !           716: *
        !           717: *      1)   RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS
        !           718: *           BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING
        !           719: *           THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE
        !           720: *           KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY.
        !           721: *
        !           722: *      2)   STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY
        !           723: *           POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY.
        !           724: *           THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT
        !           725: *           THAT THE FIRST WORD WILL BE OVERWRITTEN
        !           726: *           BY A TYPE WORD ON RETURN AND SO NEED NOT
        !           727: *           BE CORRECTLY SET. SUCH A RESULT IS
        !           728: *           COPIED INTO MAIN STORAGE BEFORE PROCEEDING.
        !           729: *           UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A
        !           730: *           PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING
        !           731: *           TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE
        !           732: *           BLOCK IS COPIED INTO DYNAMIC MEMORY.
        !           733:        EJC
        !           734: *
        !           735: *      SYSFC -- FILE CONTROL BLOCK ROUTINE
        !           736: *
        !           737: SYSFC  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           738: *
        !           739: *      SEE ALSO SYSIO
        !           740: *      INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN
        !           741: *           INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
        !           742: *           OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
        !           743: *      FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY
        !           744: *      AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING.
        !           745: *      THE EXACT SIGNIFICANCE OF FILE ARG2
        !           746: *      IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY,
        !           747: *      THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL
        !           748: *      SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS
        !           749: *      A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$  WHERE
        !           750: *      $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST.
        !           751: *       REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER.
        !           752: *      $R$ IS MAXIMUM RECORD LENGTH
        !           753: *      $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING
        !           754: *      $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE
        !           755: *         ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE
        !           756: *         WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT
        !           757: *         SPITBOL LOAD TIME.
        !           758: *      ,...,Z$Z$ ARE ADDITIONAL FIELDS.
        !           759: *      IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD
        !           760: *      SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY
        !           761: *      ANOTHER DELIMITER (SEE
        !           762: *        IODEL  EQU  *
        !           763: *      EARLY IN DEFINITIONS SECTION).
        !           764: *      SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT
        !           765: *      ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND
        !           766: *      TO  REPORT WHETHER AN FCBLK (FILE CONTROL
        !           767: *      BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE.
        !           768: *      THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO
        !           769: *      ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED
        !           770: *      OR ALTERNATIVELY IN STATIC MEMORY.
        !           771: *      THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS
        !           772: *      ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION
        !           773: *      IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC
        !           774: *      MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO
        !           775: *      THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE
        !           776: *      BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS
        !           777: *      SPITBOL TO PROVIDE AN FCBLK).
        !           778: *      AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN
        !           779: *      XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR
        !           780: *      WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER.
        !           781: *      PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL
        !           782: *      STORES NOTHING IN THEM.
        !           783:        EJC
        !           784: *      THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY
        !           785: *      SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND
        !           786: *      LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE
        !           787: *      REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL
        !           788: *      NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS
        !           789: *      FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE
        !           790: *      CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY
        !           791: *      APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK
        !           792: *      POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK
        !           793: *      IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL.
        !           794: *      IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED
        !           795: *      TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF
        !           796: *      WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH
        !           797: *      FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY.
        !           798: *      FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS
        !           799: *      ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE
        !           800: *      FOUND - SEE SYSXI FOR DETAILS.
        !           801: *      IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC
        !           802: *      AND SYSIO ARE OMITTED.
        !           803: *      IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC
        !           804: *      IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST
        !           805: *      FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE
        !           806: *      STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK
        !           807: *      POINTERS FOR THEM.
        !           808: *      FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING
        !           809: *      MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS.
        !           810: *      FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND
        !           811: *      CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES
        !           812: *      ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH
        !           813: *      FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED
        !           814: *      FIRST.
        !           815: *      THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS,
        !           816: *      POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS
        !           817: *      STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER
        !           818: *      ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO
        !           819: *      PASSED A POINTER TO THIS FCBLK.
        !           820: *
        !           821: *      (XL)                  FILE ARG1 SCBLK PTR (2ND ARG)
        !           822: *      (XR)                  FILEARG2 (3RD ARG) OR NULL
        !           823: *      -(XS)...-(XS)         SCBLKS FOR $F$,$R$,$C$,...
        !           824: *      (WC)                  NO. OF STACKED SCBLKS ABOVE
        !           825: *      (WA)                  EXISTING FILE ARG1 FCBLK PTR OR 0
        !           826: *      (WB)                  0/3 FOR INPUT/OUTPUT ASSOCN
        !           827: *      JSR  SYSFC            CALL TO CHECK NEED FOR FCBLK
        !           828: *      PPM  LOC              INVALID FILE ARGUMENT
        !           829: *      (XS)                  POPPED (WC) TIMES
        !           830: *      (WA NON ZERO)         BYTE SIZE OF REQUESTED FCBLK
        !           831: *      (WA=0,XL NON ZERO)    PRIVATE FCBLK PTR IN XL
        !           832: *      (WA=XL=0)             NO FCBLK WANTED, NO PRIVATE FCBLK
        !           833: *      (WC)                  0/1/2 REQUEST ALLOC OF XRBLK/XNBLK
        !           834: *                            /STATIC BLOCK FOR USE AS FCBLK
        !           835: *      (WB)                  DESTROYED
        !           836:        EJC
        !           837: *
        !           838: *      SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES
        !           839: *
        !           840: SYSHS  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           841: *
        !           842: *      PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES
        !           843: *      ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS
        !           844: *      THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS
        !           845: *      RETURNS AN SCBLK CONTAINING NAME OF COMPUTER,
        !           846: *      NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY
        !           847: *      COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD
        !           848: *      AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY.
        !           849: *      SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A
        !           850: *      SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS
        !           851: *      BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR
        !           852: *      RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE
        !           853: *      MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL
        !           854: *      DOCUMENTATION, SECTION 10.
        !           855: *      SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST
        !           856: *      CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION
        !           857: *      DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS
        !           858: *      PERMIT RESPECTIVELY,  RETURN A NULL RESULT, RETURN WITH A
        !           859: *      RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A
        !           860: *      RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED
        !           861: *      RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE
        !           862: *      COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN
        !           863: *      ARE STRINGS RETURNED VIA PPM LOC3 RETURN.
        !           864: *
        !           865: *      (WA)                  ARGUMENT 1
        !           866: *      (XL)                  ARGUMENT 2
        !           867: *      (XR)                  ARGUMENT 3
        !           868: *      JSR  SYSHS            CALL TO GET HOST INFORMATION
        !           869: *      PPM  LOC1             ERRONEOUS ARG
        !           870: *      PPM  LOC2             EXECUTION ERROR
        !           871: *      PPM  LOC3             SCBLK PTR IN XL OR 0 IF UNAVAILABLE
        !           872: *      PPM  LOC4             RETURN A NULL RESULT
        !           873: *      PPM  LOC5             RETURN RESULT IN XR
        !           874: *      PPM  LOC6             CAUSE STATEMENT FAILURE
        !           875:        EJC
        !           876: *
        !           877: *      SYSID -- RETURN SYSTEM IDENTIFICATION
        !           878: *
        !           879: SYSID  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           880: *
        !           881: *      THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD
        !           882: *      PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO
        !           883: *      A HEADING LINE OF THE FORM
        !           884: *           MACRO SPITBOL VERSION V.V
        !           885: *      SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE
        !           886: *      MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR
        !           887: *      VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO
        !           888: *      GIVE SAY
        !           889: *           MACRO SPITBOL VERSION V.V(M.M)
        !           890: *      THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE
        !           891: *      AND OPERATING SYSTEM.  PREFERABLY IT SHOULD INCLUDE
        !           892: *      THE DATE AND TIME OF THE RUN.
        !           893: *      OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE
        !           894: *      THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE,
        !           895: *      UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS
        !           896: *      APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A
        !           897: *      NUISANCE TO USERS.
        !           898: *      THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE
        !           899: *      CORRECTLY SET.
        !           900: *
        !           901: *      JSR  SYSID            CALL FOR SYSTEM IDENTIFICATION
        !           902: *      (XR)                  SCBLK PTR FOR ADDITION TO HEADER
        !           903: *      (XL)                  PTR TO SECOND HEADER SCBLK
        !           904:        EJC
        !           905: *
        !           906: *      SYSIL -- GET INPUT RECORD LENGTH
        !           907: *
        !           908: SYSIL  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           909: *
        !           910: *      SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD
        !           911: *      FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO
        !           912: *      CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER
        !           913: *      FOR A SUBSEQUENT SYSIN CALL.
        !           914: *
        !           915: *      (WA)                  PTR TO FCBLK OR ZERO
        !           916: *      JSR  SYSIL            CALL TO GET RECORD LENGTH
        !           917: *      (WA)                  LENGTH OR ZERO IF FILE CLOSED
        !           918: *
        !           919: *      NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE
        !           920: *      UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL.
        !           921: *
        !           922: *      NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH
        !           923: *      CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
        !           924: *      RECORD INPUT FROM THE FILE.
        !           925:        EJC
        !           926: *
        !           927: *      SYSIN -- READ INPUT RECORD
        !           928: *
        !           929: SYSIN  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           930: *
        !           931: *      SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS
        !           932: *      REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS
        !           933: *      ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN
        !           934: *      SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL.
        !           935: *      IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH
        !           936: *      FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING
        !           937: *      UNLESS BUFFER IS RIGHT PADDED WITH ZEROES.
        !           938: *      IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE
        !           939: *      RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED.
        !           940: *
        !           941: *      (WA)                  PTR TO FCBLK OR ZERO
        !           942: *      (XR)                  POINTER TO BUFFER (SCBLK PTR)
        !           943: *      JSR  SYSIN            CALL TO READ RECORD
        !           944: *      PPM  LOC              ENDFILE OR NO I/P FILE AFTER SYSXI
        !           945: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !           946: *      PPM  LOC              RETURN HERE IF RECORD FORMAT ERROR
        !           947: *      (WA,WB,WC)            DESTROYED
        !           948:        EJC
        !           949: *
        !           950: *      SYSIO -- INPUT/OUTPUT FILE ASSOCIATION
        !           951: *
        !           952: SYSIO  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           953: *
        !           954: *      SEE ALSO SYSFC.
        !           955: *      SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT
        !           956: *      FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2
        !           957: *      ARE BOTH NULL.
        !           958: *      ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL
        !           959: *      OF SYSFC. IF SYSFC REQUESTED ALLOCATION
        !           960: *      OF AN FCBLK, ITS ADDRESS WILL BE IN WA.
        !           961: *      FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE
        !           962: *      COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$
        !           963: *      IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED.
        !           964: *      ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT()
        !           965: *      CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT
        !           966: *      IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL
        !           967: *      VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT
        !           968: *      RESULT IN RE-OPENING THE FILE.
        !           969: *      IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER
        !           970: *      TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE.
        !           971: *
        !           972: *      (XL)                  FILE ARG1 SCBLK PTR (2ND ARG)
        !           973: *      (XR)                  FILE ARG2 SCBLK PTR (3RD ARG)
        !           974: *      (WA)                  FCBLK PTR (0 IF NONE)
        !           975: *      (WB)                  0 FOR INPUT, 3 FOR OUTPUT
        !           976: *      JSR  SYSIO            CALL TO ASSOCIATE FILE
        !           977: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
        !           978: *      PPM  LOC              RETURN IF INPUT/OUTPUT NOT ALLOWED
        !           979: *      (XL)                  FCBLK POINTER (0 IF NONE)
        !           980: *      (WC)                  0 (FOR DEFAULT) OR MAX RECORD LNGTH
        !           981: *      (WA,WB)               DESTROYED
        !           982: *
        !           983: *      THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS
        !           984: *      BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR
        !           985: *      EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY
        !           986: *      AS REGARDS INPUT ASSOCIATION.
        !           987:        EJC
        !           988: *
        !           989: *      SYSLD -- LOAD EXTERNAL FUNCTION
        !           990: *
        !           991: SYSLD  EXP                   DEFINE EXTERNAL ENTRY POINT
        !           992: *
        !           993: *      SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4
        !           994: *      LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER
        !           995: *      THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL
        !           996: *      BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX).
        !           997: *
        !           998: *      (XR)                  POINTER TO FUNCTION NAME (SCBLK)
        !           999: *      (XL)                  POINTER TO LIBRARY NAME (SCBLK)
        !          1000: *      JSR  SYSLD            CALL TO LOAD FUNCTION
        !          1001: *      PPM  LOC              RETURN HERE IF FUNC DOES NOT EXIST
        !          1002: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !          1003: *      (XR)                  POINTER TO LOADED CODE
        !          1004: *
        !          1005: *      THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE
        !          1006: *      SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT
        !          1007: *      IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE
        !          1008: *      A PROPER BLOCK POINTER.
        !          1009:        EJC
        !          1010: *
        !          1011: *      SYSMM -- GET MORE MEMORY
        !          1012: *
        !          1013: SYSMM  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1014: *
        !          1015: *      SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC
        !          1016: *      MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH
        !          1017: *      THE CURRENT DYNAMIC DATA AREA.
        !          1018: *
        !          1019: *      THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY
        !          1020: *      VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS
        !          1021: *      IMPOSSIBLE.
        !          1022: *
        !          1023: *      JSR  SYSMM            CALL TO GET MORE MEMORY
        !          1024: *      (XR)                  NUMBER OF ADDITIONAL WORDS OBTAINED
        !          1025:        EJC
        !          1026: *
        !          1027: *      SYSMX -- SUPPLY MXLEN
        !          1028: *
        !          1029: SYSMX  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1030: *
        !          1031: *      BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL
        !          1032: *      OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN
        !          1033: *      THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC
        !          1034: *      (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO
        !          1035: *      REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST
        !          1036: *      USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY
        !          1037: *      STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS,
        !          1038: *      THERE IS NO PROBLEM.
        !          1039: *      IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR
        !          1040: *      20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A
        !          1041: *      USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER
        !          1042: *      OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF
        !          1043: *      ANY. THE VALUE RETURNED IS EITHER AN INTEGER
        !          1044: *      REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE
        !          1045: *      MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN
        !          1046: *      NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE
        !          1047: *      IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED
        !          1048: *      TO DYNAMIC STORE BEFORE COMPILATION STARTS.
        !          1049: *      IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD
        !          1050: *      MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC
        !          1051: *      MEMORY IS USED FOR THIS KEYWORD.
        !          1052: *
        !          1053: *      JSR  SYSMX            CALL TO GET MXLEN
        !          1054: *      (WA)                  EITHER MXLEN OR 0 FOR DEFAULT
        !          1055:        EJC
        !          1056: *
        !          1057: *      SYSOU -- OUTPUT RECORD
        !          1058: *
        !          1059: SYSOU  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1060: *
        !          1061: *      SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY
        !          1062: *      ASSOCIATED WITH A SYSIO CALL.
        !          1063: *
        !          1064: *      (WA)                  PTR TO FCBLK OR ZERO
        !          1065: *      (XR)                  RECORD TO BE WRITTEN (SCBLK)
        !          1066: *      JSR  SYSOU            CALL TO OUTPUT RECORD
        !          1067: *      PPM  LOC              FILE FULL OR NO FILE AFTER SYSXI
        !          1068: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !          1069: *      (WA,WB,WC)            DESTROYED
        !          1070: *
        !          1071: *      NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH
        !          1072: *      CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
        !          1073: *      RECORD OUTPUT TO THE FILE.
        !          1074:        EJC
        !          1075: *
        !          1076: *      SYSPI -- PRINT ON INTERACTIVE CHANNEL
        !          1077: *
        !          1078: SYSPI  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1079: *
        !          1080: *      IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN
        !          1081: *      REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION
        !          1082: *      ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT
        !          1083: *      REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH
        !          1084: *      MESSAGES TO THE INTERACTIVE CHANNEL.
        !          1085: *      SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL
        !          1086: *      THROUGH THE SPECIAL VARIABLE NAME, TERMINAL.
        !          1087: *
        !          1088: *      (XR)                  PTR TO LINE BUFFER (SCBLK)
        !          1089: *      (WA)                  LINE LENGTH
        !          1090: *      JSR  SYSPI            CALL TO PRINT LINE
        !          1091: *      PPM  LOC              FAILURE RETURN
        !          1092: *      (WA,WB)               DESTROYED
        !          1093:        EJC
        !          1094: *
        !          1095: *      SYSPP -- OBTAIN PRINT PARAMETERS
        !          1096: *
        !          1097: SYSPP  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1098: *
        !          1099: *      SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN
        !          1100: *      PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT
        !          1101: *      AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN
        !          1102: *      AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS
        !          1103: *      CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL
        !          1104: *      TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE
        !          1105: *      GREATER.
        !          1106: *      THE INFORMATION RETURNED IS -
        !          1107: *      1.   LINE LENGTH IN CHARS FOR STANDARD PRINT FILE
        !          1108: *      2.   NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED
        !          1109: *           DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING
        !          1110: *           PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS
        !          1111: *           RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT.
        !          1112: *      3.   AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS
        !          1113: *           THE PROGRAM CONTAINS AN EXPLICIT -LIST.
        !          1114: *      4.   OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR
        !          1115: *           EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) -
        !          1116: *           COMBINED WITH 3. GIVES POSSIBILITY OF LISTING
        !          1117: *           FILE NEVER BEING OPENED.
        !          1118: *      5.   OPTION TO HAVE COPIES OF ERRORS SENT TO AN
        !          1119: *           INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER.
        !          1120: *      6.   OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING
        !          1121: *           TO AN ONLINE TERMINAL).
        !          1122: *      7.   AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING
        !          1123: *           FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER
        !          1124: *           A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH
        !          1125: *           OF-- LISTING, COMPILATION STATISTICS, EXECUTION
        !          1126: *           OUTPUT AND EXECUTION STATISTICS.
        !          1127: *      8.   AN OPTION TO SUPPRESS EXECUTION AS THOUGH A
        !          1128: *           -NOEXECUTE CARD WERE SUPPLIED.
        !          1129: *      9.   AN OPTION TO REQUEST THAT NAME /TERMINAL/  BE PRE-
        !          1130: *           ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI
        !          1131: *      10.  AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING
        !          1132: *           THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT
        !          1133: *           IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS
        !          1134: *           COMPACT OPTION.
        !          1135: *      11.  OPTION TO SUPPRESS SYSID IDENTIFICATION.
        !          1136: *
        !          1137: *      JSR  SYSPP            CALL TO GET PRINT PARAMETERS
        !          1138: *      (WA)                  PRINT LINE LENGTH IN CHARS
        !          1139: *      (WB)                  NUMBER OF LINES/PAGE
        !          1140: *      (WC)                  BITS VALUE ...JIHGFEDCBA WHERE
        !          1141: *                            A = 1 TO SEND ERROR COPY TO INT.CH.
        !          1142: *                            B = 1 MEANS STD PRINTER IS INT. CH.
        !          1143: *                            C = 1 FOR -NOLIST OPTION
        !          1144: *                            D = 1 TO SUPPRESS COMPILN. STATS
        !          1145: *                            E = 1 TO SUPPRESS EXECN. STATS
        !          1146: *                            F = 1/0 FOR EXTNDED/COMPACT LISTING
        !          1147: *                            G = 1 FOR -NOEXECUTE
        !          1148: *                            H = 1 PRE-ASSOCIATE /TERMINAL/
        !          1149: *                            I = 1 FOR STANDARD LISTING OPTION.
        !          1150: *                            J = 1 SUPPRESSES LISTING HEADER
        !          1151:        EJC
        !          1152: *
        !          1153: *      SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE
        !          1154: *
        !          1155: SYSPR  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1156: *
        !          1157: *      SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD
        !          1158: *      OUTPUT FILE.
        !          1159: *
        !          1160: *      (XR)                  POINTER TO LINE BUFFER (SCBLK)
        !          1161: *      (WA)                  LINE LENGTH
        !          1162: *      JSR  SYSPR            CALL TO PRINT LINE
        !          1163: *      PPM  LOC              TOO MUCH O/P OR NO FILE AFTER SYSXI
        !          1164: *      (WA,WB)               DESTROYED
        !          1165: *
        !          1166: *      THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE
        !          1167: *      SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE
        !          1168: *      VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS
        !          1169: *      THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE
        !          1170: *      CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED
        !          1171: *      SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE
        !          1172: *      IN WHICH CASE A BLANK LINE IS TO BE PRINTED.
        !          1173: *
        !          1174: *      THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT
        !          1175: *      OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE
        !          1176: *      PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO
        !          1177: *      ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION.
        !          1178: *      ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR
        !          1179: *      CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION
        !          1180: *      IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998.
        !          1181:        EJC
        !          1182: *
        !          1183: *      SYSRD -- READ RECORD FROM STANDARD INPUT FILE
        !          1184: *
        !          1185: SYSRD  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1186: *
        !          1187: *      SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT
        !          1188: *      FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE
        !          1189: *      LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS
        !          1190: *      CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH
        !          1191: *      SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT
        !          1192: *      CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD
        !          1193: *      (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT
        !          1194: *      ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT()
        !          1195: *      STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80).
        !          1196: *      IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH
        !          1197: *      FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING
        !          1198: *      UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES.
        !          1199: *      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN
        !          1200: *      AFTER SUCH AN ADJUSTMENT HAS BEEN MADE.
        !          1201: *      SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE
        !          1202: *      RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE
        !          1203: *      REPEATED ENDFILE RETURNS.
        !          1204: *
        !          1205: *      (XR)                  POINTER TO BUFFER (SCBLK PTR)
        !          1206: *      (WC)                  LENGTH OF BUFFER IN CHARACTERS
        !          1207: *      JSR  SYSRD            CALL TO READ LINE
        !          1208: *      PPM  LOC              ENDFILE OR NO I/P FILE AFTER SYSXI
        !          1209: *      (WA,WB,WC)            DESTROYED
        !          1210:        EJC
        !          1211: *
        !          1212: *      SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL
        !          1213: *
        !          1214: SYSRI  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1215: *
        !          1216: *      READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE,
        !          1217: *      TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE
        !          1218: *      ENDFILE RETURN ONLY.
        !          1219: *      THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI
        !          1220: *      SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK
        !          1221: *      BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT
        !          1222: *      PADDED WITH ZEROES.
        !          1223: *      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE
        !          1224: *      RETURN AFTER ADJUSTING THE COUNT.
        !          1225: *      THE END OF FILE RETURN MAY BE USED IF THIS MAKES
        !          1226: *      SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN
        !          1227: *      EOF CHARACTER.)
        !          1228: *
        !          1229: *      (XR)                  PTR TO 120 CHAR BUFFER (SCBLK PTR)
        !          1230: *      JSR  SYSRI            CALL TO READ LINE FROM TERMINAL
        !          1231: *      PPM  LOC              END OF FILE RETURN
        !          1232: *      (WA,WB,WC)            MAY BE DESTROYED
        !          1233:        EJC
        !          1234: *
        !          1235: *      SYSRW -- REWIND FILE
        !          1236: *
        !          1237: SYSRW  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1238: *
        !          1239: *      SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE
        !          1240: *      AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE
        !          1241: *      CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE
        !          1242: *      FILE AT THE START.
        !          1243: *
        !          1244: *      (WA)                  PTR TO FCBLK OR ZERO
        !          1245: *      (XR)                  REWIND ARG (SCBLK PTR)
        !          1246: *      JSR  SYSRW            CALL TO REWIND FILE
        !          1247: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
        !          1248: *      PPM  LOC              RETURN HERE IF REWIND NOT ALLOWED
        !          1249: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !          1250:        EJC
        !          1251: .IF    .CUST
        !          1252: *
        !          1253: *      SYSST -- SET FILE POINTER
        !          1254: *
        !          1255: SYSST  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1256: *
        !          1257: *      SYSST IS CALLED TO CHANGE THE POSITION OF A FILE
        !          1258: *      POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT
        !          1259: *      MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED
        !          1260: *      UNCONVERTED.
        !          1261: *
        !          1262: *      (WA)                  FCBLK POINTER
        !          1263: *      (WB)                  2ND ARGUMENT
        !          1264: *      (WC)                  3RD ARGUMENT
        !          1265: *      JSR  SYSST            CALL TO SET FILE POINTER
        !          1266: *      PPM  LOC              RETURN HERE IF INVALID 2ND ARG
        !          1267: *      PPM  LOC              RETURN HERE IF INVALID 3RD ARG
        !          1268: *      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
        !          1269: *      PPM  LOC              RETURN HERE IF SET NOT ALLOWED
        !          1270: *      PPM  LOC              RETURN HERE IF I/O ERROR
        !          1271: *
        !          1272:        EJC
        !          1273: .FI
        !          1274: *
        !          1275: *      SYSTM -- GET EXECUTION TIME SO FAR
        !          1276: *
        !          1277: SYSTM  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1278: *
        !          1279: *      SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME
        !          1280: *      USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS
        !          1281: *      ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT
        !          1282: *      THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE,
        !          1283: *      THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK
        !          1284: *      TIMING VALUES.
        !          1285: *
        !          1286: *      JSR  SYSTM            CALL TO GET TIMER VALUE
        !          1287: *      (IA)                  TIME SO FAR IN MILLISECONDS
        !          1288:        EJC
        !          1289: *
        !          1290: *      SYSTT -- TRACE TOGGLE
        !          1291: *
        !          1292: SYSTT  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1293: *
        !          1294: *      CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO
        !          1295: *      TOGGLE THE SYSTEM TRACE SWITCH.  THIS PERMITS TRACING OF
        !          1296: *      LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF.
        !          1297: *
        !          1298: *      JSR  SYSTT            CALL TO TOGGLE TRACE SWITCH
        !          1299:        EJC
        !          1300: *
        !          1301: *      SYSUL -- UNLOAD EXTERNAL FUNCTION
        !          1302: *
        !          1303: SYSUL  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1304: *
        !          1305: *      SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY
        !          1306: *      LOADED WITH A CALL TO SYSLD.
        !          1307: *
        !          1308: *      (XR)                  PTR TO CONTROL BLOCK (EFBLK)
        !          1309: *      JSR  SYSUL            CALL TO UNLOAD FUNCTION
        !          1310: *
        !          1311: *      THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL
        !          1312: *      UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION.
        !          1313: *
        !          1314: *      THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A
        !          1315: *      POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE
        !          1316: *      DEFINITIONS AND DATA STRUCTURES SECTION).
        !          1317: .IF    .CNEX
        !          1318: .ELSE
        !          1319:        EJC
        !          1320: *
        !          1321: *      SYSXI -- EXIT TO PRODUCE LOAD MODULE
        !          1322: *
        !          1323: SYSXI  EXP                   DEFINE EXTERNAL ENTRY POINT
        !          1324: *
        !          1325: *      WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER
        !          1326: *      OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE
        !          1327: *      CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT
        !          1328: *      SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND
        !          1329: *      THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN
        !          1330: *      EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY
        !          1331: *      CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE.
        !          1332: *      IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS
        !          1333: *
        !          1334: *      -1, -2, -3
        !          1335: *           CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE
        !          1336: *           IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH
        !          1337: *           A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS.
        !          1338: *           VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE
        !          1339: *           KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING.
        !          1340: *           TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A
        !          1341: *           POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR
        !          1342: *           VERSION NUMBER V.V (SEE SYSID).
        !          1343: *
        !          1344: *      0    IF POSSIBLE, RETURN CONTROL TO JOB CONTROL
        !          1345: *           COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE
        !          1346: *           SYSTEM DEPENDENT.
        !          1347: *
        !          1348: *      +1, +2, +3
        !          1349: *           CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF
        !          1350: *           MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE
        !          1351: *           THIS MODULE DIRECTLY.
        !          1352: *
        !          1353: *      IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN
        !          1354: *      FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO
        !          1355: *      OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD
        !          1356: *      MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE
        !          1357: *      SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM.
        !          1358: *      SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS,
        !          1359: *      INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT
        !          1360: *      CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS
        !          1361: *      NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE.
        !          1362: *      AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS
        !          1363: *      RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH
        !          1364: *      A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE
        !          1365: *      PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE
        !          1366: *      IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL
        !          1367: *      ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A
        !          1368: *      REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS
        !          1369: *      BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998.
        !          1370: *      AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT
        !          1371: *      CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE.
        !          1372: *
        !          1373: *      IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL
        !          1374: *      BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI
        !          1375: *      AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD
        !          1376: *      CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS
        !          1377: *      FCBLK POINTER.
        !          1378:        EJC
        !          1379: *
        !          1380: *      SYSXI (CONTINUED)
        !          1381: *
        !          1382: *      (XL)                  ZERO OR SCBLK PTR
        !          1383: *      (XR)                  PTR TO V.V SCBLK
        !          1384: *      (IA)                  SIGNED INTEGER ARGUMENT
        !          1385: *      (WB)                  0 OR PTR TO HEAD OF FCBLK CHAIN
        !          1386: *      JSR  SYSXI            CALL TO EXIT
        !          1387: *      PPM  LOC              REQUESTED ACTION NOT POSSIBLE
        !          1388: *      PPM  LOC              ACTION CAUSED IRRECOVERABLE ERROR
        !          1389: *      (REGISTERS)           SHOULD BE PRESERVED OVER CALL
        !          1390: *
        !          1391: *      LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM
        !          1392: *      JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT
        !          1393: *      AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI.
        !          1394: *      THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE
        !          1395: *      OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE.
        !          1396: *      +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE
        !          1397: *      CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE.
        !          1398: *      +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID
        !          1399: *      AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE.
        !          1400: *      ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A
        !          1401: *      STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE.
        !          1402: *      +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP
        !          1403: *      AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE.
        !          1404: *      NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM
        !          1405: *      IS LOADED AND ENTERED.
        !          1406: .FI

unix.superglobalmegacorp.com

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