V10/cmd/spitbol/spitv35.tok

{{TTL{S{{{P I T B O L - REVISION HISTORY
{{EJC{{{{
*      R E V I S I O N   H I S T O R Y
*      -------------------------------
*
*
*      VERSION 3.5B (FEB 81... - SGD PATCHES)
*      -----------------------------------
*
*      SGD03 - ADDITION OF .CNCI AND SYSCI (INT->STRING
*              SYSTEM ROUTINE OPTION)
*      SGD04 - (06-MAY-1981) MODIFIED INILN TO 132
*      SGD05 - (13-MAY-1981) INSERTED MISSING WTB AFTER SYSMM
*              CALLS
*      SGD06 - (25-MAY-1981) MERGED IN PROFILER PATCHES
*              (NOT MARKED)
*      SGD07 - (25-MAY-1981) MUCHO PATCHES TO PROFILER (MARKED,
*              BUT BEST JUST TO EXTRACT ENMASSE)
*      SGD08 - (25-MAY-1981) USE STRING LENGTH IN HASHS
*      SGD09 - (25-MAY-1981) FIXED SERIOUS PARSER PROBLEM
*              RELATING TO (X Y) ON LINE BEING VIEWED AS PATTERN
*              MATCH.  FIXED BY ADDITION OF NEW CMTYP VALUE
*              C$CNP (CONCATENATION - NOT PATTERN MATCH)
*      SGD10 - (01-AUG-1981) FIXED EXIT(N) RESPECIFICATION CODE
*              TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN.
*      SGD11 - (07-AUG-1981) BYPASS PRTPG CALL AT INITIALIZATION
*              FOLLOWING COMPILATION IF NO OUTPUT GENERATED.
*              THIS PREVENTS OUTPUT FILES CONSISTING OF THE
*              HEADERS AND A FEW BLANK LINES WHEN THERE IS NO
*              SOURCE LISTING AND NO COMPILATION STATS.
*              ALSO FIX TIMSX INITIALIZATION IN SAME CODE.
*      SGD12 - (17-AUG-1981) B$EFC CODE DID NOT CHECK FOR
*              UNCONVERTED RESULT RETURNING NULL STRING.  FIXED.
*      SGDBF - (   NOV-1981) ADDED BUFFER TYPE AND SYMBOL CNBF
*      SGD13 - (03-MAR-1982) LOAD PFVBL FIELD IN RETRN FOR
*              RETURN TRACING. THIS WAS CAUSING BUG ON RETURN
*              TRACES THAT TRIED TO ACCESS THE VARIABLE NAME
*      SGD14 - ADDED CHAR FUNCTION.  CHAR(N) RETURNS NTH
*              CHARACTER OF HOST MACHINE CHARACTER SET.
*              NOT CONDITIONALIZED OR MARKED.
*      SGD15 - FIXED PROBLEM RELATING TO COMPILATION OF GOTO
*              FIELDS CONTAINING SMALL INTEGERS (IN CONST SEC).
*
*      REG01 - (XX-AUG-82)
*              ADDED CFP$U TO EASE TRANSLATION ON SMALLER
*              SYSTEMS                  - CONDITIONAL .CUCF
*              ADDED LOWER CASE SUPPORT - CONDITIONAL .CULC
*              ADDED SET I/O FUNCTION   - CONDITIONAL .CUST
*
*      REG02 - (XX-SEP-82)
*              CHANGED INILN AND AND INILS TO 258
*
*      REG03 - (XX-OCT-82)
*              CONDITIONALIZED THE PAGE EJECT AFTER CALL TO SYSBX
*              AND ADDED ANOTHER BEFORE CALL TO SYSBX, SO THAT,
*              IF DESIRED BY THE IMPLEMENTOR, STANDARD OUTPUT
*              WILL REFLECT ASSIGNMENTS MADE BY EXECUTING PROGRAM
*              ONLY. CONDITIONAL .CUEJ CONTROLS - IF DEFINED
*              EJECT IS BEFORE CALL TO SYSBX.
*
*      REG04 - (XX-NOV-82)
*              FIXED DIFFICULTIES WITH LISTINGS DURING EXECUTION
*              WHEN NO LISTING GENERATED DURING COMPILATION.
*
*              -LIST TO CODE() CAUSED BOMB. FIX IS TO RESET
*              R$TTL AND R$STL TO NULLS NOT 0 AFTER COMPILATION.
*              (LISTR AND LISTT EXPECT NULLS)
*
*              WHEN LISTING AND STATISTICS ROUTED TO DIFFERENT
*              FILE THAN EXECUTION OUTPUT, ERROR MESSAGE IS SENT
*              TO EXECUTION OUTPUT (AND GETS SEPARATED FROM
*              ... IN STATEMENT ... MSG). LABO1 CALLS SYSAX AND
*              STOPR DOES NOT CALL SYSAX IF ENTERED FROM LABO1.
*
*      REG05 - (XX-NOV-82)
*              PREVENT CLEAR() FROM CLOBBERING PROTECTED VARIABLES
*              AT LABEL SCLR5.
*
*      REG06 - (XX-NOV-82)
*              FIXED GTEXP FROM ACCEPTING TRAILING SEMICOLON OR
*              COLON. NOT LEGAL WAY TO END AN EXPRESSION.
*
*      VERSION 3.5A (OCT 79 - SGD PATCHES)
*      -----------------------------------
*
*      SGD01 - PATCH IN ASIGN TO FIX MULTIPLE TRAP BLOCK PROBLEM
*              (ASG10+2)
*      SGD02 - PATCH IN GTARR TO FIX NULL CONVERT (GTAR9+0)
*
{{TTL{S{{{P I T B O L  -- BASIC INFORMATION
{{EJC{{{{
*
*      GENERAL STRUCTURE
*      -----------------
*
*      THIS PROGRAM IS A TRANSLATOR FOR A VERSION OF THE SNOBOL4
*      PROGRAMMING LANGUAGE. LANGUAGE DETAILS ARE CONTAINED IN
*      THE MANUAL MACRO SPITBOL BY DEWAR AND MCCANN, TECHNICAL
*      REPORT 90, UNIVERSITY OF LEEDS 1976.  THE LANGUAGE
*      IS IDENTICAL TO THAT IMPLEMENTED BY THE BTL TRANSLATOR
*      (R. E. GRISWOLD ET AL.) WITH THE FOLLOWING EXCEPTIONS.
*
*      1)   REDEFINITION OF STANDARD SYSTEM FUNCTIONS AND
*           OPERATORS IS NOT PERMITTED.
*
*      2)   THE VALUE FUNCTION IS NOT PROVIDED.
*
*      3)   ACCESS TRACING IS PROVIDED IN ADDITION TO THE
*           OTHER STANDARD TRACE MODES.
*
*      4)   THE KEYWORD STFCOUNT IS NOT PROVIDED.
*
*      5)   THE KEYWORD FULLSCAN IS NOT PROVIDED AND ALL PATTERN
*           MATCHING TAKES PLACE IN FULLSCAN MODE (I.E. WITH NO
*           HEURISTICS APPLIED).
*
*      6)   A SERIES OF EXPRESSIONS SEPARATED BY COMMAS MAY
*           BE GROUPED WITHIN PARENTHESES TO PROVIDE A SELECTION
*           CAPABILITY. THE SEMANTICS ARE THAT THE SELECTION
*           ASSUMES THE VALUE OF THE FIRST EXPRESSION WITHIN IT
*           WHICH SUCCEEDS AS THEY ARE EVALUATED FROM THE LEFT.
*           IF NO EXPRESSION SUCCEEDS THE ENTIRE STATEMENT FAILS
*
*      7)   AN EXPLICIT PATTERN MATCHING OPERATOR IS PROVIDED.
*           THIS IS THE BINARY QUERY (SEE GIMPEL SIGPLAN OCT 74)
*
*      8)   THE ASSIGNMENT OPERATOR IS INTRODUCED AS IN THE
*           GIMPEL REFERENCE.
*
*      9)   THE EXIT FUNCTION IS PROVIDED FOR GENERATING LOAD
*           MODULES - CF. GIMPELS SITBOL.
*
*
*      THE METHOD USED IN THIS PROGRAM IS TO TRANSLATE THE
*      SOURCE CODE INTO AN INTERNAL PSEUDO-CODE (SEE FOLLOWING
*      SECTION). AN INTERPRETOR IS THEN USED TO EXECUTE THIS
*      GENERATED PSEUDO-CODE. THE NATURE OF THE SNOBOL4 LANGUAGE
*      IS SUCH THAT THE LATTER TASK IS MUCH MORE COMPLEX THAN
*      THE ACTUAL TRANSLATION PHASE. ACCORDINGLY, NEARLY ALL THE
*      CODE IN THE PROGRAM SECTION IS CONCERNED WITH THE ACTUAL
*      EXECUTION OF THE SNOBOL4 PROGRAM.
{{EJC{{{{
*
*      INTERPRETIVE CODE FORMAT
*      ------------------------
*
*      THE INTERPRETIVE PSEUDO-CODE CONSISTS OF A SERIES OF
*      ADDRESS POINTERS. THE EXACT FORMAT OF THE CODE IS
*      DESCRIBED IN CONNECTION WITH THE CDBLK FORMAT. THE
*      PURPOSE OF THIS SECTION IS TO GIVE GENERAL INSIGHT INTO
*      THE INTERPRETIVE APPROACH INVOLVED.
*
*      THE BASIC FORM OF THE CODE IS RELATED TO REVERSE POLISH.
*      IN OTHER WORDS, THE OPERANDS PRECEDE THE OPERATORS WHICH
*      ARE ZERO ADDRESS OPERATORS. THERE ARE SOME EXCEPTIONS TO
*      THESE RULES, NOTABLY THE UNARY NOT OPERATOR AND THE
*      SELECTION CONSTRUCTION WHICH CLEARLY REQUIRE ADVANCE
*      KNOWLEDGE OF THE OPERATOR INVOLVED.
*
*      THE OPERANDS ARE MOVED TO THE TOP OF THE MAIN STACK AND
*      THE OPERATORS ARE APPLIED TO THE TOP STACK ENTRIES. LIKE
*      OTHER VERSIONS OF SPITBOL, THIS PROCESSOR DEPENDS ON
*      KNOWING WHETHER OPERANDS ARE REQUIRED BY NAME OR BY VALUE
*      AND MOVES THE APPROPRIATE OBJECT TO THE STACK. THUS NO
*      NAME/VALUE CHECKS ARE INCLUDED IN THE OPERATOR CIRCUITS.
*
*      THE ACTUAL POINTERS IN THE CODE POINT TO A BLOCK WHOSE
*      FIRST WORD IS THE ADDRESS OF THE INTERPRETOR ROUTINE
*      TO BE EXECUTED FOR THE CODE WORD.
*
*      IN THE CASE OF OPERATORS, THE POINTER IS TO A WORD WHICH
*      CONTAINS THE ADDRESS OF THE OPERATOR TO BE EXECUTED. IN
*      THE CASE OF OPERANDS SUCH AS CONSTANTS, THE POINTER IS TO
*      THE OPERAND ITSELF. ACCORDINGLY, ALL OPERANDS CONTAIN
*      A FIELD WHICH POINTS TO THE ROUTINE TO LOAD THE VALUE OF
*      THE OPERAND ONTO THE STACK. IN THE CASE OF A VARIABLE,
*      THERE ARE THREE SUCH POINTERS. ONE TO LOAD THE VALUE,
*      ONE TO STORE THE VALUE AND A THIRD TO JUMP TO THE LABEL.
*
*      THE HANDLING OF FAILURE RETURNS DESERVES SPECIAL COMMENT.
*      THE LOCATION FLPTR CONTAINS THE POINTER TO THE LOCATION
*      ON THE MAIN STACK WHICH CONTAINS THE FAILURE RETURN
*      WHICH IS IN THE FORM OF A BYTE OFFSET IN THE CURRENT
*      CODE BLOCK (CDBLK OR EXBLK). WHEN A FAILURE OCCURS, THE
*      STACK IS POPPED AS INDICATED BY THE SETTING OF FLPTR AND
*      CONTROL IS PASSED TO THE APPROPRIATE LOCATION IN THE
*      CURRENT CODE BLOCK WITH THE STACK POINTER POINTING TO THE
*      FAILURE OFFSET ON THE STACK AND FLPTR UNCHANGED.
{{EJC{{{{
*
*      INTERNAL DATA REPRESENTATIONS
*      -----------------------------
*
*      REPRESENTATION OF VALUES
*
*      A VALUE IS REPRESENTED BY A POINTER TO A BLOCK WHICH
*      DESCRIBES THE TYPE AND PARTICULARS OF THE DATA VALUE.
*      IN GENERAL, A VARIABLE IS A LOCATION CONTAINING SUCH A
*      POINTER (ALTHOUGH IN THE CASE OF TRACE ASSOCIATIONS THIS
*      IS MODIFIED, SEE DESCRIPTION OF TRBLK).
*
*      THE FOLLOWING IS A LIST OF POSSIBLE DATATYPES SHOWING THE
*      TYPE OF BLOCK USED TO HOLD THE VALUE. THE DETAILS OF
*      EACH BLOCK FORMAT ARE GIVEN LATER.
*
*      DATATYPE              BLOCK TYPE
*      --------              ----------
*
*
*      ARRAY                 ARBLK OR VCBLK
*
*      CODE                  CDBLK
*
*      EXPRESSION            EXBLK OR SEBLK
*
*      INTEGER               ICBLK
*
*      NAME                  NMBLK
*
*      PATTERN               P0BLK OR P1BLK OR P2BLK
*
*      REAL                  RCBLK
*
*      STRING                SCBLK
*
*      TABLE                 TBBLK
*
*      PROGRAM DATATYPE      PDBLK
{{EJC{{{{
*
*      REPRESENTATION OF VARIABLES
*      ---------------------------
*
*      DURING THE COURSE OF EVALUATING EXPRESSIONS, IT IS
*      NECESSARY TO GENERATE NAMES OF VARIABLES (FOR EXAMPLE
*      ON THE LEFT SIDE OF A BINARY EQUALS OPERATOR). THESE ARE
*      NOT TO BE CONFUSED WITH OBJECTS OF DATATYPE NAME WHICH
*      ARE IN FACT VALUES.
*
*      FROM A LOGICAL POINT OF VIEW, SUCH NAMES COULD BE SIMPLY
*      REPRESENTED BY A POINTER TO THE APPROPRIATE VALUE CELL.
*      HOWEVER IN THE CASE OF ARRAYS AND PROGRAM DEFINED
*      DATATYPES, THIS WOULD VIOLATE THE RULE THAT THERE MUST BE
*      NO POINTERS INTO THE MIDDLE OF A BLOCK IN DYNAMIC STORE.
*      ACCORDINGLY, A NAME IS ALWAYS REPRESENTED BY A BASE AND
*      OFFSET. THE BASE POINTS TO THE START OF THE BLOCK
*      CONTAINING THE VARIABLE VALUE AND THE OFFSET IS THE
*      OFFSET WITHIN THIS BLOCK IN BYTES. THUS THE ADDRESS
*      OF THE ACTUAL VARIABLE IS DETERMINED BY ADDING THE BASE
*      AND OFFSET VALUES.
*
*      THE FOLLOWING ARE THE INSTANCES OF VARIABLES REPRESENTED
*      IN THIS MANNER.
*
*      1)   NATURAL VARIABLE BASE IS PTR TO VRBLK
*                            OFFSET IS *VRVAL
*
*      2)   TABLE ELEMENT    BASE IS PTR TO TEBLK
*                            OFFSET IS *TEVAL
*
*      3)   ARRAY ELEMENT    BASE IS PTR TO ARBLK
*                            OFFSET IS OFFSET TO ELEMENT
*
*      4)   VECTOR ELEMENT   BASE IS PTR TO VCBLK
*                            OFFSET IS OFFSET TO ELEMENT
*
*      5)   PROG DEF DTP     BASE IS PTR TO PDBLK
*                            OFFSET IS OFFSET TO FIELD VALUE
*
*      IN ADDITION THERE ARE TWO CASES OF OBJECTS WHICH ARE
*      LIKE VARIABLES BUT CANNOT BE HANDLED IN THIS MANNER.
*      THESE ARE CALLED PSEUDO-VARIABLES AND ARE REPRESENTED
*      WITH A SPECIAL BASE POINTER AS FOLLOWS=
*
*      EXPRESSION VARIABLE   PTR TO EVBLK (SEE EVBLK)
*
*      KEYWORD VARIABLE      PTR TO KVBLK (SEE KVBLK)
*
*      PSEUDO-VARIABLES ARE HANDLED AS SPECIAL CASES BY THE
*      ACCESS PROCEDURE (ACESS) AND THE ASSIGNMENT PROCEDURE
*      (ASIGN). SEE THESE TWO PROCEDURES FOR DETAILS.
{{EJC{{{{
*
*      ORGANIZATION OF DATA AREA
*      -------------------------
*
*
*      THE DATA AREA IS DIVIDED INTO TWO REGIONS.
*
*      STATIC AREA
*
*      THE STATIC AREA BUILDS UP FROM THE BOTTOM AND CONTAINS
*      DATA AREAS WHICH ARE ALLOCATED DYNAMICALLY BUT ARE NEVER
*      DELETED OR MOVED AROUND. THE MACRO-PROGRAM ITSELF
*      USES THE STATIC AREA FOR THE FOLLOWING.
*
*      1)   ALL VARIABLE BLOCKS (VRBLK).
*
*      2)   THE HASH TABLE FOR VARIABLE BLOCKS.
*
*      3)   MISCELLANEOUS BUFFERS AND WORK AREAS (SEE PROGRAM
*           INITIALIZATION SECTION).
*
*      IN ADDITION, THE SYSTEM PROCEDURES MAY USE THIS AREA FOR
*      INPUT/OUTPUT BUFFERS, EXTERNAL FUNCTIONS ETC. SPACE IN
*      THE STATIC REGION IS ALLOCATED BY CALLING PROCEDURE ALOST
*
*      THE FOLLOWING GLOBAL VARIABLES DEFINE THE CURRENT
*      LOCATION AND SIZE OF THE STATIC AREA.
*
*      STATB                 ADDRESS OF START OF STATIC AREA
*      STATE                 ADDRESS+1 OF LAST WORD IN AREA.
*
*      THE MINIMUM SIZE OF STATIC IS GIVEN APPROXIMATELY BY
*           12 + *E$HNB + *E$STS + SPACE FOR ALPHABET STRING
*           AND STANDARD PRINT BUFFER.
{{EJC{{{{
*
*      DYNAMIC AREA
*
*      THE DYNAMIC AREA IS BUILT UPWARDS IN MEMORY AFTER THE
*      STATIC REGION. DATA IN THIS AREA MUST ALL BE IN STANDARD
*      BLOCK FORMATS SO THAT IT CAN BE PROCESSED BY THE GARBAGE
*      COLLECTOR (PROCEDURE GBCOL). GBCOL COMPACTS BLOCKS DOWN
*      IN THIS REGION AS REQUIRED BY SPACE EXHAUSTION AND CAN
*      ALSO MOVE ALL BLOCKS UP TO ALLOW FOR EXPANSION OF THE
*      STATIC REGION.
*      WITH THE EXCEPTION OF TABLES AND ARRAYS, NO SPITBOL
*      OBJECT ONCE BUILT IN DYNAMIC MEMORY IS EVER SUBSEQUENTLY
*      MODIFIED. OBSERVING THIS RULE NECESSITATES A COPYING
*      ACTION DURING STRING AND PATTERN CONCATENATION.
*
*      GARBAGE COLLECTION IS FUNDAMENTAL TO THE ALLOCATION OF
*      SPACE FOR VALUES. SPITBOL USES A VERY EFFICIENT GARBAGE
*      COLLECTOR WHICH INSISTS THAT POINTERS INTO DYNAMIC STORE
*      SHOULD BE IDENTIFIABLE WITHOUT USE OF BIT TABLES,
*      MARKER BITS ETC. TO SATISFY THIS REQUIREMENT, DYNAMIC
*      MEMORY MUST NOT START AT TOO LOW AN ADDRESS AND LENGTHS
*      OF ARRAYS, TABLES, STRINGS, CODE AND EXPRESSION BLOCKS
*      MAY NOT EXCEED THE NUMERICAL VALUE OF THE LOWEST DYNAMIC
*      ADDRESS. TO AVOID EITHER PENALIZING USERS WITH MODEST
*      REQUIREMENTS OR RESTRICTING THOSE WITH GREATER NEEDS ON
*      HOST SYSTEMS WHERE DYNAMIC MEMORY IS ALLOCATED IN LOW
*      ADDRESSES, THE MINIMUM DYNAMIC ADDRESS MAY BE SPECIFIED
*      SUFFICIENTLY HIGH TO PERMIT ARBITRARILY LARGE SPITBOL
*      OBJECTS TO BE CREATED ( WITH THE POSSIBILITY IN EXTREME
*      CASES OF WASTING LARGE AMOUNTS OF MEMORY BELOW THE
*      START ADDRESS). THIS MINIMUM VALUE IS MADE AVAILABLE
*      IN VARIABLE MXLEN BY A SYSTEM ROUTINE, SYSMX.
*      ALTERNATIVELY SYSMX MAY INDICATE THAT A
*      DEFAULT MAY BE USED IN WHICH DYNAMIC IS PLACED
*      AT THE LOWEST POSSIBLE ADDRESS FOLLOWING STATIC.
*
*      THE FOLLOWING GLOBAL WORK CELLS DEFINE THE LOCATION AND
*      LENGTH OF THE DYNAMIC AREA.
*
*      DNAMB                 START OF DYNAMIC AREA
*      DNAMP                 NEXT AVAILABLE LOCATION
*      DNAME                 LAST AVAILABLE LOCATION + 1
*
*      DNAMB IS ALWAYS HIGHER THAN STATE SINCE THE ALOST
*      PROCEDURE MAINTAINS SOME EXPANSION SPACE ABOVE STATE.
*      *** DNAMB MUST NEVER BE PERMITTED TO HAVE A VALUE LESS
*      THAN THAT IN MXLEN ***
*
*      SPACE IN THE DYNAMIC REGION IS ALLOCATED BY THE ALLOC
*      PROCEDURE. THE DYNAMIC REGION MAY BE USED BY SYSTEM
*      PROCEDURES PROVIDED THAT ALL THE RULES ARE OBEYED.
{{EJC{{{{
*
*      REGISTER USAGE
*      --------------
*
*      (CP)                  CODE POINTER REGISTER. USED TO
*                            HOLD A POINTER TO THE CURRENT
*                            LOCATION IN THE INTERPRETIVE PSEUDO
*                            CODE (I.E. PTR INTO A CDBLK).
*
*      (XL,XR)               GENERAL INDEX REGISTERS. USUALLY
*                            USED TO HOLD POINTERS TO BLOCKS IN
*                            DYNAMIC STORAGE. AN IMPORTANT
*                            RESTRICTION IS THAT THE VALUE IN
*                            XL MUST BE COLLECTABLE FOR
*                            A GARBAGE COLLECT CALL. A VALUE
*                            IS COLLECTABLE IF IT EITHER POINTS
*                            OUTSIDE THE DYNAMIC AREA, OR IF IT
*                            POINTS TO THE START OF A BLOCK IN
*                            THE DYNAMIC AREA.
*
*      (XS)                  STACK POINTER. USED TO POINT TO
*                            THE STACK FRONT. THE STACK MAY
*                            BUILD UP OR DOWN AND IS USED
*                            TO STACK SUBROUTINE RETURN POINTS
*                            AND OTHER RECURSIVELY SAVED DATA.
*
*      (XT)                  AN ALTERNATIVE NAME FOR XL DURING
*                            ITS USE IN ACCESSING STACKED ITEMS.
*
*      (WA,WB,WC)            GENERAL WORK REGISTERS. CANNOT BE
*                            USED FOR INDEXING, BUT MAY HOLD
*                            VARIOUS TYPES OF DATA.
*
*      (IA)                  USED FOR ALL SIGNED INTEGER
*                            ARITHMETIC, BOTH THAT USED BY THE
*                            TRANSLATOR AND THAT ARISING FROM
*                            USE OF SNOBOL4 ARITHMETIC OPERATORS
*
*      (RA)                  REAL ACCUMULATOR. USED FOR ALL
*                            FLOATING POINT ARITHMETIC.
{{EJC{{{{
*
*      SPITBOL CONDITIONAL ASSEMBLY SYMBOLS
*      ------------------------------------
*
*      IN THE SPITBOL TRANSLATOR, THE FOLLOWING CONDITIONAL
*      ASSEMBLY SYMBOLS ARE REFERRED TO. TO INCORPORATE THE
*      FEATURES REFERRED TO, THE MINIMAL SOURCE SHOULD BE
*      PREFACED BY SUITABLE CONDITIONAL ASSEMBLY SYMBOL
*      DEFINITIONS.
*      IN ALL CASES IT IS PERMISSIBLE TO DEFAULT THE DEFINITIONS
*      IN WHICH CASE THE ADDITIONAL FEATURES WILL BE OMITTED
*      FROM THE TARGET CODE.
*
*      .CASL                 DEFINE TO INCLUDE 26 SHIFTED LETTRS
*      .CAHT                 DEFINE TO INCLUDE HORIZONTAL TAB
*      .CAVT                 DEFINE TO INCLUDE VERTICAL TAB
*      .CIOD                 IF DEFINED, DEFAULT DELIMITER IS
*                            NOT USED IN PROCESSING 3RD ARG OF
*                            INPUT() AND OUTPUT()
*      .CNBT                 DEFINE TO OMIT BATCH INITIALISATION
*      .CNCI                 DEFINE TO ENABLE SYSCI ROUTINE
*      .CNEX                 DEFINE TO OMIT EXIT() CODE.
*      .CNLD                 DEFINE TO OMIT LOAD() CODE.
*      .CNPF                 DEFINE TO OMIT PROFILE STUFF
*      .CNRA                 DEFINE TO OMIT ALL REAL ARITHMETIC
*      .CNSR                 DEFINE TO OMIT SORT, RSORT
*      .CSAX                 DEFINE IF SYSAX IS TO BE CALLED
*      .CSN6                 DEFINE TO PAD STMT NOS TO 6 CHARS
*      .CSN8                 DEFINE TO PAD STMT NOS TO 8 CHARS
*      .CUCF                 DEFINE TO INCLUDE CFP$U
*      .CULC                 DEFINE TO INCLUDE &CASE (LC NAMES)
*      .CUST                 DEFINE TO INCLUDE SET() CODE
{{TTL{S{{{P I T B O L -- PROCEDURES SECTION
*
*      THIS SECTION STARTS WITH DESCRIPTIONS OF THE OPERATING
*      SYSTEM DEPENDENT PROCEDURES WHICH ARE USED BY THE SPITBOL
*      TRANSLATOR. ALL SUCH PROCEDURES HAVE FIVE LETTER NAMES
*      BEGINNING WITH SYS. THEY ARE LISTED IN ALPHABETICAL
*      ORDER.
*      ALL PROCEDURES HAVE A  SPECIFICATION CONSISTING OF A
*      MODEL CALL, PRECEDED BY A POSSIBLY EMPTY LIST OF REGISTER
*      CONTENTS GIVING PARAMETERS AVAILABLE TO THE PROCEDURE AND
*      FOLLOWED BY A POSSIBLY EMPTY LIST OF REGISTER CONTENTS
*      REQUIRED ON RETURN FROM THE CALL OR WHICH MAY HAVE HAD
*      THEIR CONTENTS DESTROYED. ONLY THOSE REGISTERS EXPLICITLY
*      MENTIONED IN THE LIST AFTER THE CALL MAY HAVE THEIR
*      VALUES CHANGED.
*      THE SEGMENT OF CODE PROVIDING THE EXTERNAL PROCEDURES IS
*      CONVENIENTLY REFERRED TO AS OSINT (OPERATING SYSTEM
*      INTERFACE). THE SYSXX PROCEDURES IT CONTAINS PROVIDE
*      FACILITIES NOT USUALLY AVAILABLE AS PRIMITIVES IN
*      ASSEMBLY LANGUAGES. FOR PARTICULAR TARGET MACHINES,
*      IMPLEMENTORS MAY CHOOSE FOR SOME MINIMAL OPCODES WHICH
*      DO NOT HAVE REASONABLY DIRECT TRANSLATIONS, TO USE CALLS
*      OF ADDITIONAL PROCEDURES WHICH THEY PROVIDE IN OSINT.
*      E.G. MWB OR TRC MIGHT BE TRANSLATED AS JSR SYSMB,
*      JSR SYSTC IN SOME IMPLEMENTATIONS.
*
*      IN THE DESCRIPTIONS, REFERENCE IS MADE TO --BLK
*      FORMATS (-- = A PAIR OF LETTERS). SEE THE SPITBOL
*      DEFINITIONS SECTION FOR DETAILED DESCRIPTIONS OF ALL
*      SUCH BLOCK FORMATS EXCEPT FCBLK FOR WHICH SYSFC SHOULD
*      BE CONSULTED.
*
*      SECTION 0 CONTAINS INP,INR SPECIFICATIONS OF INTERNAL
*      PROCEDURES,ROUTINES. THIS GIVES A SINGLE PASS TRANSLATOR
*      INFORMATION MAKING IT EASY TO GENERATE ALTERNATIVE CALLS
*      IN THE TRANSLATION OF JSR-S FOR PROCEDURES OF DIFFERENT
*      TYPES IF THIS PROVES NECESSARY.
*
{{SEC{{{{START OF PROCEDURES SECTION
{{EJC{{{{
*
*      SYSAX -- AFTER EXECUTION
*
{SYSAX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      IF THE CONDITIONAL ASSEMBLY SYMBOL .CSAX IS DEFINED,
*      THIS ROUTINE IS CALLED IMMEDIATELY AFTER EXECUTION AND
*      BEFORE PRINTING OF EXECUTION STATISTICS OR DUMP OUTPUT.
*      PURPOSE OF CALL IS FOR IMPLEMENTOR TO DETERMINE AND
*      IF THE CALL IS NOT REQUIRED IT WILL BE OMITTED IF .CSAX
*      IS UNDEFINED. IN THIS CASE SYSAX NEED NOT BE CODED.
*
*      JSR  SYSAX            CALL AFTER EXECUTION
{{EJC{{{{
*
*      SYSBX -- BEFORE EXECUTION
*
{SYSBX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      CALLED AFTER INITIAL SPITBOL COMPILATION AND BEFORE
*      COMMENCING EXECUTION IN CASE OSINT NEEDS
*      TO ASSIGN FILES OR PERFORM OTHER NECESSARY SERVICES.
*      OSINT MAY ALSO CHOOSE TO SEND A MESSAGE TO ONLINE
*      TERMINAL (IF ANY) INDICATING THAT EXECUTION IS STARTING.
*
*      JSR  SYSBX            CALL BEFORE EXECUTION STARTS
{{EJC{{{{
*
*      SYSDC -- DATE CHECK
*
{SYSDC{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSDC IS CALLED TO CHECK THAT THE EXPIRY DATE FOR A TRIAL
*      VERSION OF SPITBOL IS UNEXPIRED.
*
*      JSR  SYSDC            CALL TO CHECK DATE
*      RETURN ONLY IF DATE IS OK
{{EJC{{{{
*
*      SYSDM  -- DUMP CORE
*
{SYSDM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSDM IS CALLED BY A SPITBOL PROGRAM CALL OF DUMP(N) WITH
*      N GE 3.  ITS PURPOSE IS TO PROVIDE A CORE DUMP.
*      N COULD HOLD AN ENCODING OF THE START ADRS FOR DUMP AND
*      AMOUNT TO BE DUMPED E.G.  N = 256*A + S , S = START ADRS
*      IN KILOWORDS,  A = KILOWORDS TO DUMP
*
*      (XR)                  PARAMETER N OF CALL DUMP(N)
*      JSR  SYSDM            CALL TO ENTER ROUTINE
{{EJC{{{{
*
*      SYSDT -- GET CURRENT DATE
*
{SYSDT{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSDT IS USED TO OBTAIN THE CURRENT DATE. THE DATE IS
*      RETURNED AS A CHARACTER STRING IN ANY FORMAT APPROPRIATE
*      TO THE OPERATING SYSTEM IN USE. IT MAY ALSO CONTAIN THE
*      CURRENT TIME OF DAY. SYSDT IS USED TO IMPLEMENT THE
*      SNOBOL4 FUNCTION DATE.
*
*      JSR  SYSDT            CALL TO GET DATE
*      (XL)                  POINTER TO BLOCK CONTAINING DATE
*
*      THE FORMAT OF THE BLOCK IS LIKE AN SCBLK EXCEPT THAT
*      THE FIRST WORD NEED NOT BE SET. THE RESULT IS COPIED
*      INTO SPITBOL DYNAMIC MEMORY ON RETURN.
{{EJC{{{{
*
*      SYSEF -- EJECT FILE
*
{SYSEF{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSEF IS USED TO WRITE A PAGE EJECT TO A NAMED FILE. IT
*      MAY ONLY BE USED FOR FILES WHERE THIS CONCEPT MAKES
*      SENSE. NOTE THAT SYSEF IS NOT NORMALLY USED FOR THE
*      STANDARD OUTPUT FILE (SEE SYSEP).
*
*      (WA)                  PTR TO FCBLK OR ZERO
*      (XR)                  EJECT ARGUMENT (SCBLK PTR)
*      JSR  SYSEF            CALL TO EJECT FILE
*      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
*      PPM  LOC              RETURN HERE IF INAPPROPRIATE FILE
*      PPM  LOC              RETURN HERE IF I/O ERROR
{{EJC{{{{
*
*      SYSEJ -- END OF JOB
*
{SYSEJ{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO
*      TERMINATE THE RUN. THE SIGNIFICANCE OF THE ABEND AND
*      CODE VALUES IS SYSTEM DEPENDENT. IN GENERAL, THE CODE
*      VALUE SHOULD BE MADE AVAILABLE FOR TESTING, AND THE
*      ABEND VALUE SHOULD CAUSE SOME POST-MORTEM ACTION SUCH AS
*      A DUMP. NOTE THAT SYSEJ DOES NOT RETURN TO ITS CALLER.
*      SEE SYSXI FOR DETAILS OF FCBLK CHAIN
*
*      (WA)                  VALUE OF ABEND KEYWORD
*      (WB)                  VALUE OF CODE KEYWORD
*      (XL)                  O OR PTR TO HEAD OF FCBLK CHAIN
*      JSR  SYSEJ            CALL TO END JOB
*
*      THE FOLLOWING SPECIAL VALUES ARE USED AS CODES IN (WB)
*      999  EXECUTION SUPPRESSED
*      998  STANDARD OUTPUT FILE FULL OR UNAVAILABLE IN A SYSXI
*           LOAD MODULE. IN THESE CASES (WA) CONTAINS THE NUMBER
*           OF THE STATEMENT CAUSING PREMATURE TERMINATION.
{{EJC{{{{
*
*      SYSEM -- GET ERROR MESSAGE TEXT
*
{SYSEM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE
*      SOURCE PROGRAM GIVEN THE ERROR CODE NUMBER. IT IS ALLOWED
*      TO RETURN A NULL STRING IF THIS FACILITY IS UNAVAILABLE.
*
*      (WA)                  ERROR CODE NUMBER
*      JSR  SYSEM            CALL TO GET TEXT
*      (XR)                  TEXT OF MESSAGE
*
*      THE RETURNED VALUE IS A POINTER TO A BLOCK IN SCBLK
*      FORMAT EXCEPT THAT THE FIRST WORD NEED NOT BE SET. THE
*      STRING IS COPIED INTO DYNAMIC MEMORY ON RETURN.
*      IF THE NULL STRING IS RETURNED EITHER BECAUSE SYSEM DOES
*      NOT PROVIDE ERROR MESSAGE TEXTS OR BECAUSE WA IS OUT OF
*      RANGE, SPITBOL WILL PRINT THE STRING STORED IN ERRTEXT
*      KEYWORD.
{{EJC{{{{
*
*      SYSEN -- ENDFILE
*
{SYSEN{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE.
*      THE MEANING IS SYSTEM DEPENDENT. IN GENERAL, ENDFILE
*      IMPLIES THAT NO FURTHER I/O OPERATIONS WILL BE PERFORMED,
*      BUT DOES NOT GUARANTEE THIS TO BE THE CASE. THE FILE
*      SHOULD BE CLOSED AFTER THE CALL, A SUBSEQUENT READ
*      OR WRITE MAY REOPEN THE FILE AT THE START OR IT MAY BE
*      NECESSARY TO REOPEN THE FILE VIA SYSIO.
*
*      (WA)                  PTR TO FCBLK OR ZERO
*      (XR)                  ENDFILE ARGUMENT (SCBLK PTR)
*      JSR  SYSEN            CALL TO ENDFILE
*      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
*      PPM  LOC              RETURN HERE IF ENDFILE NOT ALLOWED
*      PPM  LOC              RETURN HERE IF I/O ERROR
*      (WA,WB)               DESTROYED
*
*      THE SECOND ERROR RETURN IS USED FOR FILES FOR WHICH
*      ENDFILE IS NOT PERMITTED. FOR EXAMPLE, IT MAY BE EXPECTED
*      THAT THE STANDARD INPUT AND OUTPUT FILES ARE IN THIS
*      CATEGORY.
{{EJC{{{{
*
*      SYSEP -- EJECT PRINTER PAGE
*
{SYSEP{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD
*      PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT).
*
*      JSR  SYSEP            CALL TO EJECT PRINTER OUTPUT
{{EJC{{{{
*
*      SYSEX -- CALL EXTERNAL FUNCTION
*
{SYSEX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSEX IS CALLED TO PASS CONTROL TO AN EXTERNAL FUNCTION
*      PREVIOUSLY LOADED WITH A CALL TO SYSLD.
*
*      (XS)                  POINTER TO ARGUMENTS ON STACK
*      (XL)                  POINTER TO CONTROL BLOCK (EFBLK)
*      (WA)                  NUMBER OF ARGUMENTS ON STACK
*      JSR  SYSEX            CALL TO PASS CONTROL TO FUNCTION
*      PPM  LOC              RETURN HERE IF FUNCTION CALL FAILS
*      (XS)                  POPPED PAST ARGUMENTS
*      (XR)                  RESULT RETURNED
*
*      THE ARGUMENTS ARE STORED ON THE STACK WITH
*      THE LAST ARGUMENT AT 0(XS). ON RETURN, XS
*      IS POPPED PAST THE ARGUMENTS.
*
*      THE FORM OF THE ARGUMENTS AS PASSED IS THAT USED IN THE
*      SPITBOL TRANSLATOR (SEE DEFINITIONS AND DATA STRUCTURES
*      SECTION). THE CONTROL BLOCK FORMAT IS ALSO DESCRIBED
*      (UNDER EFBLK) IN THIS SECTION.
*
*      THERE ARE TWO WAYS OF RETURNING A RESULT.
*
*      1)   RETURN A POINTER TO A BLOCK IN DYNAMIC STORAGE. THIS
*           BLOCK MUST BE IN EXACTLY CORRECT FORMAT, INCLUDING
*           THE FIRST WORD. ONLY FUNCTIONS WRITTEN WITH INTIMATE
*           KNOWLEDGE OF THE SYSTEM WILL RETURN IN THIS WAY.
*
*      2)   STRING, INTEGER AND REAL RESULTS MAY BE RETURNED BY
*           POINTING TO A PSEUDO-BLOCK OUTSIDE DYNAMIC MEMORY.
*           THIS BLOCK IS IN ICBLK, RCBLK OR SCBLK FORMAT EXCEPT
*           THAT THE FIRST WORD WILL BE OVERWRITTEN
*           BY A TYPE WORD ON RETURN AND SO NEED NOT
*           BE CORRECTLY SET. SUCH A RESULT IS
*           COPIED INTO MAIN STORAGE BEFORE PROCEEDING.
*           UNCONVERTED RESULTS MAY SIMILARLY BE RETURNED IN A
*           PSEUDO-BLOCK WHICH IS IN CORRECT FORMAT INCLUDING
*           TYPE WORD RECOGNISABLE BY GARBAGE COLLECTOR SINCE
*           BLOCK IS COPIED INTO DYNAMIC MEMORY.
{{EJC{{{{
*
*      SYSFC -- FILE CONTROL BLOCK ROUTINE
*
{SYSFC{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SEE ALSO SYSIO
*      INPUT AND OUTPUT HAVE 3 ARGUMENTS REFERRED TO AS SHOWN
*           INPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
*           OUTPUT(VARIABLE NAME,FILE ARG1,FILE ARG2)
*      FILE ARG1 MAY BE AN INTEGER OR STRING USED TO IDENTIFY
*      AN I/O CHANNEL. IT IS CONVERTED TO A STRING FOR CHECKING.
*      THE EXACT SIGNIFICANCE OF FILE ARG2
*      IS NOT RIGOROUSLY PRESCRIBED BUT TO IMPROVE PORTABILITY,
*      THE SCHEME DESCRIBED IN THE SPITBOL USER MANUAL
*      SHOULD BE ADOPTED WHEN POSSIBLE. THE PREFERRED FORM IS
*      A STRING $F$,R$R$,C$C$,I$I$,...,Z$Z$  WHERE
*      $F$ IS AN OPTIONAL FILE NAME WHICH IS PLACED FIRST.
*       REMAINING ITEMS MAY BE OMITTED OR INCLUDED IN ANY ORDER.
*      $R$ IS MAXIMUM RECORD LENGTH
*      $C$ IS A CARRIAGE CONTROL CHARACTER OR CHARACTER STRING
*      $I$ IS SOME FORM OF CHANNEL IDENTIFICATION USED IN THE
*         ABSENCE OF $F$ TO ASSOCIATE THE VARIABLE
*         WITH A FILE ALLOCATED DYNAMICALLY BY JCL COMMANDS AT
*         SPITBOL LOAD TIME.
*      ,...,Z$Z$ ARE ADDITIONAL FIELDS.
*      IF , (COMMA) CANNOT BE USED AS A DELIMITER, .CIOD
*      SHOULD BE DEFINED TO INTRODUCE BY CONDITIONAL ASSEMBLY
*      ANOTHER DELIMITER (SEE
*        IODEL  EQU  *
*      EARLY IN DEFINITIONS SECTION).
*      SYSFC IS CALLED WHEN A VARIABLE IS INPUT OR OUTPUT
*      ASSOCIATED TO CHECK FILE ARG1 AND FILE ARG2 AND
*      TO  REPORT WHETHER AN FCBLK (FILE CONTROL
*      BLOCK) IS NECESSARY AND IF SO WHAT SIZE IT SHOULD BE.
*      THIS MAKES IT POSSIBLE FOR SPITBOL RATHER THAN OSINT TO
*      ALLOCATE SUCH A BLOCK IN DYNAMIC MEMORY IF REQUIRED
*      OR ALTERNATIVELY IN STATIC MEMORY.
*      THE SIGNIFICANCE OF AN FCBLK , IF ONE IS REQUESTED, IS
*      ENTIRELY UP TO THE SYSTEM INTERFACE. THE ONLY RESTRICTION
*      IS THAT IF THE FCBLK SHOULD APPEAR TO LIE IN DYNAMIC
*      MEMORY , POINTERS TO IT SHOULD BE PROPER POINTERS TO
*      THE START OF A RECOGNISABLE AND GARBAGE COLLECTABLE
*      BLOCK (THIS CONDITION WILL BE MET IF SYSFC REQUESTS
*      SPITBOL TO PROVIDE AN FCBLK).
*      AN OPTION IS PROVIDED FOR OSINT TO RETURN A POINTER IN
*      XL TO AN FCBLK WHICH IT PRIVATELY ALLOCATED. THIS PTR
*      WILL BE MADE AVAILABLE WHEN I/O OCCURS LATER.
*      PRIVATE FCBLKS MAY HAVE ARBITRARY CONTENTS AND SPITBOL
*      STORES NOTHING IN THEM.
{{EJC{{{{
*      THE REQUESTED SIZE FOR AN FCBLK IN DYNAMIC MEMORY
*      SHOULD ALLOW A 2 WORD OVERHEAD FOR BLOCK TYPE AND
*      LENGTH FIELDS. INFORMATION SUBSEQUENTLY STORED IN THE
*      REMAINING WORDS MAY BE ARBITRARY IF AN XNBLK (EXTERNAL
*      NON-RELOCATABLE BLOCK) IS REQUESTED. IF THE REQUEST IS
*      FOR AN XRBLK (EXTERNAL RELOCATABLE BLOCK) THE
*      CONTENTS OF WORDS SHOULD BE COLLECTABLE (I.E. ANY
*      APPARENT POINTERS INTO DYNAMIC SHOULD BE GENUINE BLOCK
*      POINTERS). THESE RESTRICTIONS DO NOT APPLY IF AN FCBLK
*      IS ALLOCATED OUTSIDE DYNAMIC OR IS NOT ALLOCATED AT ALL.
*      IF AN FCBLK IS REQUESTED, ITS FIELDS WILL BE INITIALISED
*      TO ZERO BEFORE ENTRY TO SYSIO WITH THE EXCEPTION OF
*      WORDS 0 AND 1 IN WHICH THE BLOCK TYPE AND LENGTH
*      FIELDS ARE PLACED FOR FCBLKS IN DYNAMIC MEMORY ONLY.
*      FOR THE POSSIBLE USE OF SYSEJ AND SYSXI, IF FCBLKS
*      ARE USED, A CHAIN IS BUILT SO THAT THEY MAY ALL BE
*      FOUND - SEE SYSXI FOR DETAILS.
*      IF BOTH FILE ARG1 AND FILE ARG2 ARE NULL, CALLS OF SYSFC
*      AND SYSIO ARE OMITTED.
*      IF FILE ARG1 IS NULL (STANDARD INPUT/OUTPUT FILE), SYSFC
*      IS CALLED TO CHECK NON-NULL FILE ARG2 BUT ANY REQUEST
*      FOR AN FCBLK WILL BE IGNORED, SINCE SPITBOL HANDLES THE
*      STANDARD FILES SPECIALLY AND CANNOT READILY KEEP FCBLK
*      POINTERS FOR THEM.
*      FILEARG1 IS TYPE CHECKED BY SPITBOL SO FURTHER CHECKING
*      MAY BE UNNECCESSARY IN MANY IMPLEMENTATIONS.
*      FILE ARG2 IS PASSED SO THAT SYSFC MAY ANALYSE AND
*      CHECK IT. HOWEVER TO ASSIST IN THIS, SPITBOL ALSO PASSES
*      ON THE STACK THE COMPONENTS OF THIS ARGUMENT WITH
*      FILE NAME, $F$ (OTHERWISE NULL) EXTRACTED AND STACKED
*      FIRST.
*      THE OTHER FIELDS, IF ANY, ARE EXTRACTED AS SUBSTRINGS,
*      POINTERS TO THEM ARE STACKED AND A COUNT OF ALL ITEMS
*      STACKED IS PLACED IN WC. IF AN FCBLK WAS EARLIER
*      ALLOCATED AND POINTED TO VIA FILE ARG1, SYSFC IS ALSO
*      PASSED A POINTER TO THIS FCBLK.
*
*      (XL)                  FILE ARG1 SCBLK PTR (2ND ARG)
*      (XR)                  FILEARG2 (3RD ARG) OR NULL
*      -(XS)...-(XS)         SCBLKS FOR $F$,$R$,$C$,...
*      (WC)                  NO. OF STACKED SCBLKS ABOVE
*      (WA)                  EXISTING FILE ARG1 FCBLK PTR OR 0
*      (WB)                  0/3 FOR INPUT/OUTPUT ASSOCN
*      JSR  SYSFC            CALL TO CHECK NEED FOR FCBLK
*      PPM  LOC              INVALID FILE ARGUMENT
*      (XS)                  POPPED (WC) TIMES
*      (WA NON ZERO)         BYTE SIZE OF REQUESTED FCBLK
*      (WA=0,XL NON ZERO)    PRIVATE FCBLK PTR IN XL
*      (WA=XL=0)             NO FCBLK WANTED, NO PRIVATE FCBLK
*      (WC)                  0/1/2 REQUEST ALLOC OF XRBLK/XNBLK
*                            /STATIC BLOCK FOR USE AS FCBLK
*      (WB)                  DESTROYED
{{EJC{{{{
*
*      SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES
*
{SYSHS{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES
*      ON DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRY IS
*      THAT WHERE ALL ARGUMENTS ARE NULL IN WHICH CASE SYSHS
*      RETURNS AN SCBLK CONTAINING NAME OF COMPUTER,
*      NAME OF OPERATING SYSTEM AND NAME OF SITE SEPARATED BY
*      COLONS. THE SCBLK NEED NOT HAVE A CORRECT FIRST FIELD
*      AS THIS IS SUPPLIED ON COPYING STRING TO DYNAMIC MEMORY.
*      SPITBOL DOES NO ARGUMENT CHECKING BUT DOES PROVIDE A
*      SINGLE ERROR RETURN FOR ARGUMENTS CHECKED AS ERRONEOUS
*      BY OSINT. IT ALSO PROVIDES A SINGLE EXECUTION ERROR
*      RETURN. IF THESE ARE INADEQUATE, USE MAY BE MADE OF THE
*      MINIMAL ERROR SECTION DIRECT AS DESCRIBED IN MINIMAL
*      DOCUMENTATION, SECTION 10.
*      SEVERAL NON-ERROR RETURNS ARE PROVIDED. THE FIRST
*      CORRESPONDS TO THE DEFINED ENTRY OR, FOR IMPLEMENTATION
*      DEFINED ENTRIES, ANY STRING MAY BE RETURNED. THE OTHERS
*      PERMIT RESPECTIVELY,  RETURN A NULL RESULT, RETURN WITH A
*      RESULT TO BE STACKED WHICH IS POINTED AT BY XR, AND A
*      RETURN CAUSING SPITBOL STATEMENT FAILURE. IF A RETURNED
*      RESULT IS IN DYNAMIC MEMORY IT MUST OBEY GARBAGE
*      COLLECTOR RULES. THE ONLY RESULTS COPIED ON RETURN
*      ARE STRINGS RETURNED VIA PPM LOC3 RETURN.
*
*      (WA)                  ARGUMENT 1
*      (XL)                  ARGUMENT 2
*      (XR)                  ARGUMENT 3
*      JSR  SYSHS            CALL TO GET HOST INFORMATION
*      PPM  LOC1             ERRONEOUS ARG
*      PPM  LOC2             EXECUTION ERROR
*      PPM  LOC3             SCBLK PTR IN XL OR 0 IF UNAVAILABLE
*      PPM  LOC4             RETURN A NULL RESULT
*      PPM  LOC5             RETURN RESULT IN XR
*      PPM  LOC6             CAUSE STATEMENT FAILURE
{{EJC{{{{
*
*      SYSID -- RETURN SYSTEM IDENTIFICATION
*
{SYSID{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      THIS ROUTINE SHOULD RETURN STRINGS TO HEAD THE STANDARD
*      PRINTER OUTPUT. THE FIRST STRING WILL BE APPENDED TO
*      A HEADING LINE OF THE FORM
*           MACRO SPITBOL VERSION V.V
*      SUPPLIED BY SPITBOL ITSELF. V.V ARE DIGITS GIVING THE
*      MAJOR VERSION NUMBER AND GENERALLY AT LEAST A MINOR
*      VERSION NUMBER RELATING TO OSINT SHOULD BE SUPPLIED TO
*      GIVE SAY
*           MACRO SPITBOL VERSION V.V(M.M)
*      THE SECOND STRING SHOULD IDENTIFY AT LEAST THE MACHINE
*      AND OPERATING SYSTEM.  PREFERABLY IT SHOULD INCLUDE
*      THE DATE AND TIME OF THE RUN.
*      OPTIONALLY THE STRINGS MAY INCLUDE SITE NAME OF THE
*      THE IMPLEMENTOR AND/OR MACHINE ON WHICH RUN TAKES PLACE,
*      UNIQUE SITE OR COPY NUMBER AND OTHER INFORMATION AS
*      APPROPRIATE WITHOUT MAKING IT SO LONG AS TO BE A
*      NUISANCE TO USERS.
*      THE FIRST WORDS OF THE SCBLKS POINTED AT NEED NOT BE
*      CORRECTLY SET.
*
*      JSR  SYSID            CALL FOR SYSTEM IDENTIFICATION
*      (XR)                  SCBLK PTR FOR ADDITION TO HEADER
*      (XL)                  PTR TO SECOND HEADER SCBLK
{{EJC{{{{
*
*      SYSIL -- GET INPUT RECORD LENGTH
*
{SYSIL{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSIL IS USED TO GET THE LENGTH OF THE NEXT INPUT RECORD
*      FROM A FILE PREVIOUSLY INPUT ASSOCIATED WITH A SYSIO
*      CALL. THE LENGTH RETURNED IS USED TO ESTABLISH A BUFFER
*      FOR A SUBSEQUENT SYSIN CALL.
*
*      (WA)                  PTR TO FCBLK OR ZERO
*      JSR  SYSIL            CALL TO GET RECORD LENGTH
*      (WA)                  LENGTH OR ZERO IF FILE CLOSED
*
*      NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE
*      UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL.
*
*      NOTE THAT IT IS THE SYSIL CALL (NOT THE SYSIO CALL) WHICH
*      CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
*      RECORD INPUT FROM THE FILE.
{{EJC{{{{
*
*      SYSIN -- READ INPUT RECORD
*
{SYSIN{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSIN IS USED TO READ A RECORD FROM THE FILE WHICH WAS
*      REFERENCED IN A PRIOR CALL TO SYSIL (I.E. THESE CALLS
*      ALWAYS OCCUR IN PAIRS). THE BUFFER PROVIDED IS AN
*      SCBLK FOR A STRING OF LENGTH SET FROM THE SYSIL CALL.
*      IF THE ACTUAL LENGTH READ IS LESS THAN THIS, THE LENGTH
*      FIELD OF THE SCBLK MUST BE MODIFIED BEFORE RETURNING
*      UNLESS BUFFER IS RIGHT PADDED WITH ZEROES.
*      IT IS ALSO PERMISSIBLE TO TAKE ANY OF THE ALTERNATIVE
*      RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED.
*
*      (WA)                  PTR TO FCBLK OR ZERO
*      (XR)                  POINTER TO BUFFER (SCBLK PTR)
*      JSR  SYSIN            CALL TO READ RECORD
*      PPM  LOC              ENDFILE OR NO I/P FILE AFTER SYSXI
*      PPM  LOC              RETURN HERE IF I/O ERROR
*      PPM  LOC              RETURN HERE IF RECORD FORMAT ERROR
*      (WA,WB,WC)            DESTROYED
{{EJC{{{{
*
*      SYSIO -- INPUT/OUTPUT FILE ASSOCIATION
*
{SYSIO{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SEE ALSO SYSFC.
*      SYSIO IS CALLED IN RESPONSE TO A SNOBOL4 INPUT OR OUTPUT
*      FUNCTION CALL EXCEPT WHEN FILE ARG1 AND FILE ARG2
*      ARE BOTH NULL.
*      ITS CALL ALWAYS FOLLOWS IMMEDIATELY AFTER A CALL
*      OF SYSFC. IF SYSFC REQUESTED ALLOCATION
*      OF AN FCBLK, ITS ADDRESS WILL BE IN WA.
*      FOR INPUT FILES, NON-ZERO VALUES OF $R$ SHOULD BE
*      COPIED TO WC FOR USE IN ALLOCATING INPUT BUFFERS. IF $R$
*      IS DEFAULTED OR NOT IMPLEMENTED, WC SHOULD BE ZEROISED.
*      ONCE A FILE HAS BEEN OPENED, SUBSEQUENT INPUT(),OUTPUT()
*      CALLS IN WHICH THE SECOND ARGUMENT IS IDENTICAL WITH THAT
*      IN A PREVIOUS CALL, MERELY ASSOCIATE THE ADDITIONAL
*      VARIABLE NAME (FIRST ARGUMENT) TO THE FILE AND DO NOT
*      RESULT IN RE-OPENING THE FILE.
*      IN SUBSEQUENT ASSOCIATED ACCESSES TO THE FILE A POINTER
*      TO ANY FCBLK ALLOCATED WILL BE MADE AVAILABLE.
*
*      (XL)                  FILE ARG1 SCBLK PTR (2ND ARG)
*      (XR)                  FILE ARG2 SCBLK PTR (3RD ARG)
*      (WA)                  FCBLK PTR (0 IF NONE)
*      (WB)                  0 FOR INPUT, 3 FOR OUTPUT
*      JSR  SYSIO            CALL TO ASSOCIATE FILE
*      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
*      PPM  LOC              RETURN IF INPUT/OUTPUT NOT ALLOWED
*      (XL)                  FCBLK POINTER (0 IF NONE)
*      (WC)                  0 (FOR DEFAULT) OR MAX RECORD LNGTH
*      (WA,WB)               DESTROYED
*
*      THE SECOND ERROR RETURN IS USED IF THE FILE NAMED EXISTS
*      BUT INPUT/OUTPUT FROM THE FILE IS NOT ALLOWED. FOR
*      EXAMPLE, THE STANDARD OUTPUT FILE MAY BE IN THIS CATEGORY
*      AS REGARDS INPUT ASSOCIATION.
{{EJC{{{{
*
*      SYSLD -- LOAD EXTERNAL FUNCTION
*
{SYSLD{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSLD IS CALLED IN RESPONSE TO THE USE OF THE SNOBOL4
*      LOAD FUNCTION. THE NAMED FUNCTION IS LOADED (WHATEVER
*      THIS MEANS), AND A POINTER IS RETURNED. THE POINTER WILL
*      BE USED ON SUBSEQUENT CALLS TO THE FUNCTION (SEE SYSEX).
*
*      (XR)                  POINTER TO FUNCTION NAME (SCBLK)
*      (XL)                  POINTER TO LIBRARY NAME (SCBLK)
*      JSR  SYSLD            CALL TO LOAD FUNCTION
*      PPM  LOC              RETURN HERE IF FUNC DOES NOT EXIST
*      PPM  LOC              RETURN HERE IF I/O ERROR
*      (XR)                  POINTER TO LOADED CODE
*
*      THE SIGNIFICANCE OF THE POINTER RETURNED IS UP TO THE
*      SYSTEM INTERFACE ROUTINE. THE ONLY RESTRICTION IS THAT
*      IF THE POINTER IS WITHIN DYNAMIC STORAGE, IT MUST BE
*      A PROPER BLOCK POINTER.
{{EJC{{{{
*
*      SYSMM -- GET MORE MEMORY
*
{SYSMM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSMM IS CALLED IN AN ATTEMPT TO ALLOCATE MORE DYNAMIC
*      MEMORY. THIS MEMORY MUST BE ALLOCATED CONTIGUOUSLY WITH
*      THE CURRENT DYNAMIC DATA AREA.
*
*      THE AMOUNT ALLOCATED IS UP TO THE SYSTEM TO DECIDE. ANY
*      VALUE IS ACCEPTABLE INCLUDING ZERO IF ALLOCATION IS
*      IMPOSSIBLE.
*
*      JSR  SYSMM            CALL TO GET MORE MEMORY
*      (XR)                  NUMBER OF ADDITIONAL WORDS OBTAINED
{{EJC{{{{
*
*      SYSMX -- SUPPLY MXLEN
*
{SYSMX{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL
*      OBJECT IS ALLOWED TO OCCUPY MORE BYTES OF MEMORY THAN
*      THE INTEGER GIVING THE LOWEST ADDRESS OF DYNAMIC
*      (GARBAGE COLLECTABLE) MEMORY. MXLEN IS THE NAME USED TO
*      REFER TO THIS MAXIMUM LENGTH OF AN OBJECT AND FOR MOST
*      USERS OF MOST IMPLEMENTATIONS, PROVIDED DYNAMIC MEMORY
*      STARTS AT AN ADDRESS OF AT LEAST A FEW THOUSAND WORDS,
*      THERE IS NO PROBLEM.
*      IF THE DEFAULT STARTING ADDRESS IS LESS THAN SAY 10000 OR
*      20000, THEN A LOAD TIME OPTION SHOULD BE PROVIDED WHERE A
*      USER CAN REQUEST THAT HE BE ABLE TO CREATE LARGER
*      OBJECTS. THIS ROUTINE INFORMS SPITBOL OF THIS REQUEST IF
*      ANY. THE VALUE RETURNED IS EITHER AN INTEGER
*      REPRESENTING THE DESIRED VALUE OF MXLEN (AND HENCE THE
*      MINIMUM DYNAMIC STORE ADDRESS WHICH MAY RESULT IN
*      NON-USE OF SOME STORE) OR ZERO IF A DEFAULT IS ACCEPTABLE
*      IN WHICH MXLEN IS SET TO THE LOWEST ADDRESS ALLOCATED
*      TO DYNAMIC STORE BEFORE COMPILATION STARTS.
*      IF A NON-ZERO VALUE IS RETURNED, THIS IS USED FOR KEYWORD
*      MAXLNGTH. OTHERWISE THE INITIAL LOW ADDRESS OF DYNAMIC
*      MEMORY IS USED FOR THIS KEYWORD.
*
*      JSR  SYSMX            CALL TO GET MXLEN
*      (WA)                  EITHER MXLEN OR 0 FOR DEFAULT
{{EJC{{{{
*
*      SYSOU -- OUTPUT RECORD
*
{SYSOU{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY
*      ASSOCIATED WITH A SYSIO CALL.
*
*      (WA)                  PTR TO FCBLK OR ZERO
*      (XR)                  RECORD TO BE WRITTEN (SCBLK)
*      JSR  SYSOU            CALL TO OUTPUT RECORD
*      PPM  LOC              FILE FULL OR NO FILE AFTER SYSXI
*      PPM  LOC              RETURN HERE IF I/O ERROR
*      (WA,WB,WC)            DESTROYED
*
*      NOTE THAT IT IS THE SYSOU CALL (NOT THE SYSIO CALL) WHICH
*      CAUSES THE FILE TO BE OPENED AS REQUIRED FOR THE FIRST
*      RECORD OUTPUT TO THE FILE.
{{EJC{{{{
*
*      SYSPI -- PRINT ON INTERACTIVE CHANNEL
*
{SYSPI{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      IF SPITBOL IS RUN FROM AN ONLINE TERMINAL, OSINT CAN
*      REQUEST THAT MESSAGES SUCH AS COPIES OF COMPILATION
*      ERRORS BE SENT TO THE TERMINAL (SEE SYSPP). IF RELEVANT
*      REPLY WAS MADE BY SYSPP THEN SYSPI IS CALLED TO SEND SUCH
*      MESSAGES TO THE INTERACTIVE CHANNEL.
*      SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL
*      THROUGH THE SPECIAL VARIABLE NAME, TERMINAL.
*
*      (XR)                  PTR TO LINE BUFFER (SCBLK)
*      (WA)                  LINE LENGTH
*      JSR  SYSPI            CALL TO PRINT LINE
*      PPM  LOC              FAILURE RETURN
*      (WA,WB)               DESTROYED
{{EJC{{{{
*
*      SYSPP -- OBTAIN PRINT PARAMETERS
*
{SYSPP{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSPP IS CALLED ONCE DURING COMPILATION TO OBTAIN
*      PARAMETERS REQUIRED FOR CORRECT PRINTED OUTPUT FORMAT
*      AND TO SELECT OTHER OPTIONS. IT MAY ALSO BE CALLED AGAIN
*      AFTER SYSXI WHEN A LOAD MODULE IS RESUMED. IN THIS
*      CASE THE VALUE RETURNED IN WA MAY BE LESS THAN OR EQUAL
*      TO THAT RETURNED IN INITIAL CALL BUT MAY NOT BE
*      GREATER.
*      THE INFORMATION RETURNED IS -
*      1.   LINE LENGTH IN CHARS FOR STANDARD PRINT FILE
*      2.   NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED
*           DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING
*           PAGE THROWS ARE SUPPRESSED AND PAGE HEADERS
*           RESULTING FROM -TITLE,-STITL LINES ARE KEPT SHORT.
*      3.   AN INITIAL -NOLIST OPTION TO SUPPRESS LISTING UNLESS
*           THE PROGRAM CONTAINS AN EXPLICIT -LIST.
*      4.   OPTIONS TO SUPPRESS LISTING OF COMPILATION AND/OR
*           EXECUTION STATS (USEFUL FOR ESTABLISHED PROGRAMS) -
*           COMBINED WITH 3. GIVES POSSIBILITY OF LISTING
*           FILE NEVER BEING OPENED.
*      5.   OPTION TO HAVE COPIES OF ERRORS SENT TO AN
*           INTERACTIVE CHANNEL IN ADDITION TO STANDARD PRINTER.
*      6.   OPTION TO KEEP PAGE HEADERS SHORT (E.G. IF LISTING
*           TO AN ONLINE TERMINAL).
*      7.   AN OPTION TO CHOOSE EXTENDED OR COMPACT LISTING
*           FORMAT. IN THE FORMER A PAGE EJECT AND IN THE LATTER
*           A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH
*           OF-- LISTING, COMPILATION STATISTICS, EXECUTION
*           OUTPUT AND EXECUTION STATISTICS.
*      8.   AN OPTION TO SUPPRESS EXECUTION AS THOUGH A
*           -NOEXECUTE CARD WERE SUPPLIED.
*      9.   AN OPTION TO REQUEST THAT NAME /TERMINAL/  BE PRE-
*           ASSOCIATED TO AN ONLINE TERMINAL VIA SYSPI AND SYSRI
*      10.  AN INTERMEDIATE (STANDARD) LISTING OPTION REQUIRING
*           THAT PAGE EJECTS OCCUR IN SOURCE LISTINGS. REDUNDANT
*           IF EXTENDED OPTION CHOSEN BUT PARTIALLY EXTENDS
*           COMPACT OPTION.
*      11.  OPTION TO SUPPRESS SYSID IDENTIFICATION.
*
*      JSR  SYSPP            CALL TO GET PRINT PARAMETERS
*      (WA)                  PRINT LINE LENGTH IN CHARS
*      (WB)                  NUMBER OF LINES/PAGE
*      (WC)                  BITS VALUE ...JIHGFEDCBA WHERE
*                            A = 1 TO SEND ERROR COPY TO INT.CH.
*                            B = 1 MEANS STD PRINTER IS INT. CH.
*                            C = 1 FOR -NOLIST OPTION
*                            D = 1 TO SUPPRESS COMPILN. STATS
*                            E = 1 TO SUPPRESS EXECN. STATS
*                            F = 1/0 FOR EXTNDED/COMPACT LISTING
*                            G = 1 FOR -NOEXECUTE
*                            H = 1 PRE-ASSOCIATE /TERMINAL/
*                            I = 1 FOR STANDARD LISTING OPTION.
*                            J = 1 SUPPRESSES LISTING HEADER
{{EJC{{{{
*
*      SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE
*
{SYSPR{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSPR IS USED TO PRINT A SINGLE LINE ON THE STANDARD
*      OUTPUT FILE.
*
*      (XR)                  POINTER TO LINE BUFFER (SCBLK)
*      (WA)                  LINE LENGTH
*      JSR  SYSPR            CALL TO PRINT LINE
*      PPM  LOC              TOO MUCH O/P OR NO FILE AFTER SYSXI
*      (WA,WB)               DESTROYED
*
*      THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE
*      SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE
*      VALUE IN WA IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS
*      THAN THE MAXIMUM LINE LENGTH POSSIBLE. THERE IS NO SPACE
*      CONTROL ASSOCIATED WITH THE LINE, ALL LINES ARE PRINTED
*      SINGLE SPACED. NOTE THAT NULL LINES (WA=0) ARE POSSIBLE
*      IN WHICH CASE A BLANK LINE IS TO BE PRINTED.
*
*      THE ERROR EXIT IS USED FOR SYSTEMS WHICH LIMIT THE AMOUNT
*      OF PRINTED OUTPUT. IF POSSIBLE, PRINTING SHOULD BE
*      PERMITTED AFTER THIS CONDITION HAS BEEN SIGNALLED ONCE TO
*      ALLOW FOR DUMP AND OTHER DIAGNOSTIC INFORMATION.
*      ASSUMING THIS TO BE POSSIBLE, SPITBOL MAY MAKE MORE SYSPR
*      CALLS. IF THE ERROR RETURN OCCURS ANOTHER TIME, EXECUTION
*      IS TERMINATED BY A CALL OF SYSEJ WITH ENDING CODE 998.
{{EJC{{{{
*
*      SYSRD -- READ RECORD FROM STANDARD INPUT FILE
*
{SYSRD{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSRD IS USED TO READ A RECORD FROM THE STANDARD INPUT
*      FILE. THE BUFFER PROVIDED IS AN SCBLK FOR A STRING THE
*      LENGTH OF WHICH IN CHARACTERS IS GIVEN IN WC, THIS
*      CORRESPONDING TO THE MAXIMUM LENGTH OF STRING WHICH
*      SPITBOL IS PREPARED TO RECEIVE. AT COMPILE TIME IT
*      CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD
*      (DEFAULT 72) AND AT EXECUTION TIME TO THE MOST RECENT
*      ,R$R$ (RECORD LENGTH) IN THE THIRD ARG OF AN INPUT()
*      STATEMENT FOR THE STANDARD INPUT FILE (DEFAULT 80).
*      IF FEWER THAN (WC) CHARACTERS ARE READ, THE LENGTH
*      FIELD OF THE SCBLK MUST BE ADJUSTED BEFORE RETURNING
*      UNLESS THE BUFFER IS RIGHT PADDED WITH ZEROES.
*      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURN
*      AFTER SUCH AN ADJUSTMENT HAS BEEN MADE.
*      SPITBOL MAY CONTINUE TO MAKE CALLS AFTER AN ENDFILE
*      RETURN SO THIS ROUTINE SHOULD BE PREPARED TO MAKE
*      REPEATED ENDFILE RETURNS.
*
*      (XR)                  POINTER TO BUFFER (SCBLK PTR)
*      (WC)                  LENGTH OF BUFFER IN CHARACTERS
*      JSR  SYSRD            CALL TO READ LINE
*      PPM  LOC              ENDFILE OR NO I/P FILE AFTER SYSXI
*      (WA,WB,WC)            DESTROYED
{{EJC{{{{
*
*      SYSRI -- READ RECORD FROM INTERACTIVE CHANNEL
*
{SYSRI{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      READS A RECORD FROM ONLINE TERMINAL FOR SPITBOL VARIABLE,
*      TERMINAL. IF ONLINE TERMINAL IS UNAVAILABLE THEN CODE THE
*      ENDFILE RETURN ONLY.
*      THE BUFFER PROVIDED IS OF LENGTH 120 CHARACTERS. SYSRI
*      SHOULD REPLACE THE COUNT IN THE SECOND WORD OF THE SCBLK
*      BY THE ACTUAL CHARACTER COUNT UNLESS BUFFER IS RIGHT
*      PADDED WITH ZEROES.
*      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE
*      RETURN AFTER ADJUSTING THE COUNT.
*      THE END OF FILE RETURN MAY BE USED IF THIS MAKES
*      SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN
*      EOF CHARACTER.)
*
*      (XR)                  PTR TO 120 CHAR BUFFER (SCBLK PTR)
*      JSR  SYSRI            CALL TO READ LINE FROM TERMINAL
*      PPM  LOC              END OF FILE RETURN
*      (WA,WB,WC)            MAY BE DESTROYED
{{EJC{{{{
*
*      SYSRW -- REWIND FILE
*
{SYSRW{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSRW IS USED TO REWIND A FILE I.E. REPOSITION THE FILE
*      AT THE START BEFORE THE FIRST RECORD. THE FILE SHOULD BE
*      CLOSED AND THE NEXT READ OR WRITE CALL WILL OPEN THE
*      FILE AT THE START.
*
*      (WA)                  PTR TO FCBLK OR ZERO
*      (XR)                  REWIND ARG (SCBLK PTR)
*      JSR  SYSRW            CALL TO REWIND FILE
*      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
*      PPM  LOC              RETURN HERE IF REWIND NOT ALLOWED
*      PPM  LOC              RETURN HERE IF I/O ERROR
{{EJC{{{{
*
*      SYSST -- SET FILE POINTER
*
{SYSST{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSST IS CALLED TO CHANGE THE POSITION OF A FILE
*      POINTER. THIS IS ACCOMPLISHED IN A SYSTEM DEPENDENT
*      MANNER, AND THUS THE 2ND AND 3RD ARGUMENTS ARE PASSED
*      UNCONVERTED.
*
*      (WA)                  FCBLK POINTER
*      (WB)                  2ND ARGUMENT
*      (WC)                  3RD ARGUMENT
*      JSR  SYSST            CALL TO SET FILE POINTER
*      PPM  LOC              RETURN HERE IF INVALID 2ND ARG
*      PPM  LOC              RETURN HERE IF INVALID 3RD ARG
*      PPM  LOC              RETURN HERE IF FILE DOES NOT EXIST
*      PPM  LOC              RETURN HERE IF SET NOT ALLOWED
*      PPM  LOC              RETURN HERE IF I/O ERROR
*
{{EJC{{{{
*
*      SYSTM -- GET EXECUTION TIME SO FAR
*
{SYSTM{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSTM IS USED TO OBTAIN THE AMOUNT OF EXECUTION TIME
*      USED SO FAR SINCE SPITBOL WAS GIVEN CONTROL. THE UNITS
*      ARE DESCRIBED AS MILLISECONDS IN THE SPITBOL OUTPUT, BUT
*      THE EXACT MEANING IS SYSTEM DEPENDENT. WHERE APPROPRIATE,
*      THIS VALUE SHOULD RELATE TO PROCESSOR RATHER THAN CLOCK
*      TIMING VALUES.
*
*      JSR  SYSTM            CALL TO GET TIMER VALUE
*      (IA)                  TIME SO FAR IN MILLISECONDS
{{EJC{{{{
*
*      SYSTT -- TRACE TOGGLE
*
{SYSTT{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO
*      TOGGLE THE SYSTEM TRACE SWITCH.  THIS PERMITS TRACING OF
*      LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF.
*
*      JSR  SYSTT            CALL TO TOGGLE TRACE SWITCH
{{EJC{{{{
*
*      SYSUL -- UNLOAD EXTERNAL FUNCTION
*
{SYSUL{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      SYSUL IS USED TO UNLOAD A FUNCTION PREVIOUSLY
*      LOADED WITH A CALL TO SYSLD.
*
*      (XR)                  PTR TO CONTROL BLOCK (EFBLK)
*      JSR  SYSUL            CALL TO UNLOAD FUNCTION
*
*      THE FUNCTION CANNOT BE CALLED FOLLOWING A SYSUL CALL
*      UNTIL ANOTHER SYSLD CALL IS MADE FOR THE SAME FUNCTION.
*
*      THE EFBLK CONTAINS THE FUNCTION CODE POINTER AND ALSO A
*      POINTER TO THE VRBLK CONTAINING THE FUNCTION NAME (SEE
*      DEFINITIONS AND DATA STRUCTURES SECTION).
{{EJC{{{{
*
*      SYSXI -- EXIT TO PRODUCE LOAD MODULE
*
{SYSXI{EXP{{{{DEFINE EXTERNAL ENTRY POINT
*
*      WHEN SYSXI IS CALLED, XL CONTAINS EITHER A STRING POINTER
*      OR ZERO. IN THE FORMER CASE, THE STRING GIVES THE
*      CHARACTER NAME OF A PROGRAM. THE INTENTION IS THAT
*      SPITBOL EXECUTION SHOULD BE TERMINATED FORTHWITH AND
*      THE NAMED PROGRAM LOADED AND EXECUTED. THIS TYPE OF CHAIN
*      EXECUTION IS VERY SYSTEM DEPENDENT AND IMPLEMENTORS MAY
*      CHOOSE TO OMIT IT OR FIND IT IMPOSSIBLE TO PROVIDE.
*      IF (XL) IS ZERO,IA CONTAINS ONE OF THE FOLLOWING INTEGERS
*
*      -1, -2, -3
*           CREATE IF POSSIBLE A LOAD MODULE CONTAINING ONLY THE
*           IMPURE AREA OF MEMORY WHICH NEEDS TO BE LOADED WITH
*           A COMPATIBLE PURE SEGMENT FOR SUBSEQUENT EXECUTIONS.
*           VERSION NUMBERS TO CHECK COMPATIBILITY SHOULD BE
*           KEPT IN BOTH SEGMENTS AND CHECKED ON LOADING.
*           TO ASSIST WITH THIS CHECK, (XR) ON ENTRY IS A
*           POINTER TO AN SCBLK CONTAINING THE SPITBOL MAJOR
*           VERSION NUMBER V.V (SEE SYSID).
*
*      0    IF POSSIBLE, RETURN CONTROL TO JOB CONTROL
*           COMMAND LEVEL. THE EFFECT IF AVAILABLE WILL BE
*           SYSTEM DEPENDENT.
*
*      +1, +2, +3
*           CREATE IF POSSIBLE A LOAD MODULE FROM ALL OF
*           MEMORY. IT SHOULD BE POSSIBLE TO LOAD AND EXECUTE
*           THIS MODULE DIRECTLY.
*
*      IN THE CASE OF SAVED LOAD MODULES, THE STATUS OF OPEN
*      FILES IS NOT PRESERVED AND IMPLEMENTORS MAY CHOOSE TO
*      OFFER MEANS OF ATTACHING FILES BEFORE EXECUTION OF LOAD
*      MODULES STARTS OR LEAVE IT TO THE USER TO INCLUDE
*      SUITABLE INPUT(), OUTPUT() CALLS IN HIS PROGRAM.
*      SYSXI SHOULD MAKE A NOTE THAT NO I/O CHANNELS,
*      INCLUDING STANDARD FILES, HAVE FILES ATTACHED SO THAT
*      CALLS OF SYSIN, SYSOU, SYSPR, SYSRD SHOULD FAIL UNLESS
*      NEW ASSOCIATIONS ARE MADE FOR THE LOAD MODULE.
*      AT LEAST IN THE CASE OF THE STANDARD OUTPUT FILE, IT IS
*      RECOMMENDED THAT EITHER THE USER BE REQUIRED TO ATTACH
*      A FILE OR THAT A DEFAULT FILE IS ATTACHED, SINCE THE
*      PROBLEM OF ERROR MESSAGES GENERATED BY THE LOAD MODULE
*      IS OTHERWISE SEVERE. AS A LAST RESORT, IF SPITBOL
*      ATTEMPTS TO WRITE TO THE STANDARD OUTPUT FILE AND GETS A
*      REPLY INDICATING THAT SUCH OUPUT IS UNACCEPTABLE IT STOPS
*      BY USING AN ENTRY TO SYSEJ WITH ENDING CODE 998.
*      AS DESCRIBED BELOW, PASSING OF SOME ARGUMENTS MAKES IT
*      CLEAR THAT LOAD MODULE WILL USE A STANDARD OUTPUT FILE.
*
*      IF USE IS MADE OF FCBLKS FOR I/O ASSOCIATION, SPITBOL
*      BUILDS A CHAIN SO THAT THOSE IN USE MAY BE FOUND IN SYSXI
*      AND SYSEJ. THE NODES ARE 4 WORDS LONG. THIRD WORD
*      CONTAINS LINK TO NEXT NODE OR 0, FOURTH WORD CONTAINS
*      FCBLK POINTER.
{{EJC{{{{
*
*      SYSXI (CONTINUED)
*
*      (XL)                  ZERO OR SCBLK PTR
*      (XR)                  PTR TO V.V SCBLK
*      (IA)                  SIGNED INTEGER ARGUMENT
*      (WB)                  0 OR PTR TO HEAD OF FCBLK CHAIN
*      JSR  SYSXI            CALL TO EXIT
*      PPM  LOC              REQUESTED ACTION NOT POSSIBLE
*      PPM  LOC              ACTION CAUSED IRRECOVERABLE ERROR
*      (REGISTERS)           SHOULD BE PRESERVED OVER CALL
*
*      LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM
*      JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AT THE POINT
*      AFTER THE ERROR RETURNS WHICH FOLLOW THE CALL OF SYSXI.
*      THE VALUE PASSED AS EXIT ARGUMENT IS USED TO INDICATE
*      OPTIONS REQUIRED ON RESUMPTION OF LOAD MODULE.
*      +1 OR -1 REQUIRE THAT ON RESUMPTION, SYSID AND SYSPP BE
*      CALLED AND A HEADING PRINTED ON THE STANDARD OUTPUT FILE.
*      +2 OR -2 INDICATE THAT SYSPP WILL BE CALLED BUT NOT SYSID
*      AND NO HEADING WILL BE PUT ON STANDARD OUTPUT FILE.
*      ABOVE OPTIONS HAVE THE OBVIOUS IMPLICATION THAT A
*      STANDARD O/P FILE MUST BE PROVIDED FOR THE LOAD MODULE.
*      +3 OR -3 INDICATE CALLS OF NEITHER SYSID NOR SYSPP
*      AND NO HEADING WILL BE PLACED ON STANDARD OUTPUT FILE.
*      NO RETURN FROM SYSXI IS POSSIBLE IF ANOTHER PROGRAM
*      IS LOADED AND ENTERED.
{{EJC{{{{
*
*      INTRODUCE THE INTERNAL PROCEDURES.
*
{ACESS{INP{R{1{{
{ACOMP{INP{N{5{{
{ALLOC{INP{E{0{{
{ALOBF{INP{E{0{{
{ALOCS{INP{E{0{{
{ALOST{INP{E{0{{
{APNDB{INP{E{2{{
{ARITH{INP{N{3{{
{ASIGN{INP{R{1{{
{ASINP{INP{R{1{{
{BLKLN{INP{E{0{{
{CDGCG{INP{E{0{{
{CDGEX{INP{R{0{{
{CDGNM{INP{R{0{{
{CDGVL{INP{R{0{{
{CDWRD{INP{E{0{{
{CMGEN{INP{R{0{{
{CMPIL{INP{E{0{{
{CNCRD{INP{E{0{{
{COPYB{INP{N{1{{
{DFFNC{INP{E{0{{
{DTACH{INP{E{0{{
{DTYPE{INP{E{0{{
{DUMPR{INP{E{0{{
{ERMSG{INP{E{0{{
{ERTEX{INP{E{0{{
{EVALI{INP{R{4{{
{EVALP{INP{R{1{{
{EVALS{INP{R{3{{
{EVALX{INP{R{1{{
{EXBLD{INP{E{0{{
{EXPAN{INP{E{0{{
{EXPAP{INP{E{1{{
{EXPDM{INP{N{0{{
{EXPOP{INP{N{0{{
{FLSTG{INP{R{0{{
{GBCOL{INP{E{0{{
{GBCPF{INP{E{0{{
{GTARR{INP{E{1{{
{{EJC{{{{
{GTCOD{INP{E{1{{
{GTEXP{INP{E{1{{
{GTINT{INP{E{1{{
{GTNUM{INP{E{1{{
{GTNVR{INP{E{1{{
{GTPAT{INP{E{1{{
{GTREA{INP{E{1{{
{GTSMI{INP{N{2{{
{GTSTG{INP{N{1{{
{GTVAR{INP{E{1{{
{HASHS{INP{E{0{{
{ICBLD{INP{E{0{{
{IDENT{INP{E{1{{
{INOUT{INP{E{0{{
{INSBF{INP{E{2{{
{IOFCB{INP{N{2{{
{IOPPF{INP{N{0{{
{IOPUT{INP{N{6{{
{KTREX{INP{R{0{{
{KWNAM{INP{N{0{{
{LCOMP{INP{N{5{{
{LISTR{INP{E{0{{
{LISTT{INP{E{0{{
{NEXTS{INP{E{0{{
{PATIN{INP{N{2{{
{PATST{INP{N{1{{
{PBILD{INP{E{0{{
{PCONC{INP{E{0{{
{PCOPY{INP{N{0{{
{PRFLR{INP{E{0{{
{PRFLU{INP{E{0{{
{PRPAR{INP{E{0{{
{PRTCH{INP{E{0{{
{PRTIC{INP{E{0{{
{PRTIS{INP{E{0{{
{PRTIN{INP{E{0{{
{PRTMI{INP{E{0{{
{PRTMX{INP{E{0{{
{PRTNL{INP{R{0{{
{PRTNM{INP{R{0{{
{PRTNV{INP{E{0{{
{PRTPG{INP{E{0{{
{PRTPS{INP{E{0{{
{PRTSN{INP{E{0{{
{PRTST{INP{R{0{{
{{EJC{{{{
{PRTTR{INP{E{0{{
{PRTVL{INP{R{0{{
{PRTVN{INP{E{0{{
{RCBLD{INP{E{0{{
{READR{INP{E{0{{
{SBSTR{INP{E{0{{
{SCANE{INP{E{0{{
{SCNGF{INP{E{0{{
{SETVR{INP{E{0{{
{SORTA{INP{N{0{{
{SORTC{INP{E{1{{
{SORTF{INP{E{0{{
{SORTH{INP{E{0{{
{TFIND{INP{E{1{{
{TRACE{INP{N{2{{
{TRBLD{INP{E{0{{
{TRIMR{INP{E{0{{
{TRXEQ{INP{R{0{{
{XSCAN{INP{E{0{{
{XSCNI{INP{N{2{{
*
*      INTRODUCE THE INTERNAL ROUTINES
*
{ARREF{INR{{{{
{CFUNC{INR{{{{
{EXFAL{INR{{{{
{EXINT{INR{{{{
{EXITS{INR{{{{
{EXIXR{INR{{{{
{EXNAM{INR{{{{
{EXNUL{INR{{{{
{EXREA{INR{{{{
{EXSID{INR{{{{
{EXVNM{INR{{{{
{FAILP{INR{{{{
{FLPOP{INR{{{{
{INDIR{INR{{{{
{MATCH{INR{{{{
{RETRN{INR{{{{
{STCOV{INR{{{{
{STMGO{INR{{{{
{STOPR{INR{{{{
{SUCCP{INR{{{{
{SYSAB{INR{{{{
{SYSTU{INR{{{{
{{TTL{S{{{P I T B O L -- DEFINITIONS AND DATA STRUCTURES
{{SEC{{{{START OF DEFINITIONS SECTION
*
*      DEFINITIONS OF MACHINE PARAMETERS
*
*      THE MINIMAL TRANSLATOR SHOULD SUPPLY APPROPRIATE VALUES
*      FOR THE PARTICULAR TARGET MACHINE FOR ALL THE
*      EQU  *
*      DEFINITIONS GIVEN AT THE START OF THIS SECTION.
*
{CFP$A{EQU{*{{{NUMBER OF CHARACTERS IN ALPHABET
*
{CFP$B{EQU{*{{{BYTES/WORD ADDRESSING FACTOR
*
{CFP$C{EQU{*{{{NUMBER OF CHARACTERS PER WORD
*
{CFP$F{EQU{*{{{OFFSET IN BYTES TO CHARS IN
*                            SCBLK. SEE SCBLK FORMAT.
*
{CFP$I{EQU{*{{{NUMBER OF WORDS IN INTEGER CONSTANT
*
{CFP$M{EQU{*{{{MAX POSITIVE INTEGER IN ONE WORD
*
{CFP$N{EQU{*{{{NUMBER OF BITS IN ONE WORD
*
*      THE FOLLOWING DEFINITIONS REQUIRE THE SUPPLY OF EITHER
*      A SINGLE PARAMETER IF REAL ARITHMETIC IS OMITTED OR
*      THREE PARAMETERS IF REAL ARITHMETIC IS INCLUDED.
*
*
{CFP$R{EQU{*{{{NUMBER OF WORDS IN REAL CONSTANT
*
{CFP$S{EQU{*{{{NUMBER OF SIG DIGS FOR REAL OUTPUT
*
{CFP$X{EQU{*{{{MAX DIGITS IN REAL EXPONENT
*
{MXDGS{EQU{CFP$S+CFP$X{{{MAX DIGITS IN REAL NUMBER
*
{NSTMX{EQU{MXDGS+5{{{MAX SPACE FOR REAL (FOR +0.E+)
*
*      THE FOLLOWING DEFINITION FOR CFP$U SUPPLIES A REALISTIC
*      UPPER BOUND ON THE SIZE OF THE ALPHABET.  CFP$U IS USED
*      TO SAVE SPACE IN THE SCANE BSW-IFF-ESW TABLE AND TO EASE
*      TRANSLATION STORAGE REQUIREMENTS.
*
{CFP$U{EQU{*{{{REALISTIC UPPER BOUND ON ALPHABET
{{EJC{{{{
*
*      ENVIRONMENT PARAMETERS
*
*      THE SPITBOL PROGRAM IS ESSENTIALLY INDEPENDENT OF
*      THE DEFINITIONS OF THESE PARAMETERS. HOWEVER, THE
*      EFFICIENCY OF THE SYSTEM MAY BE AFFECTED. CONSEQUENTLY,
*      THESE PARAMETERS MAY REQUIRE TUNING FOR A GIVEN VERSION
*      THE VALUES GIVEN IN COMMENTS HAVE BEEN SUCCESSFULLY USED.
*
*      E$SRS IS THE NUMBER OF WORDS TO RESERVE AT THE END OF
*      STORAGE FOR END OF RUN PROCESSING. IT SHOULD BE
*      SET AS SMALL AS POSSIBLE WITHOUT CAUSING MEMORY OVERFLOW
*      IN CRITICAL SITUATIONS (E.G. MEMORY OVERFLOW TERMINATION)
*      AND SHOULD THUS RESERVE SUFFICIENT SPACE AT LEAST FOR
*      AN SCBLK CONTAINING SAY 30 CHARACTERS.
*
{E$SRS{EQU{*{{{30 WORDS
*
*      E$STS IS THE NUMBER OF WORDS GRABBED IN A CHUNK WHEN
*      STORAGE IS ALLOCATED IN THE STATIC REGION. THE MINIMUM
*      PERMITTED VALUE IS 256/CFP$B. LARGER VALUES WILL LEAD
*      TO INCREASED EFFICIENCY AT THE COST OF WASTING MEMORY.
*
{E$STS{EQU{*{{{500 WORDS
*
*      E$CBS IS THE SIZE OF CODE BLOCK ALLOCATED INITIALLY AND
*      THE EXPANSION INCREMENT IF OVERFLOW OCCURS. IF THIS VALUE
*      IS TOO SMALL OR TOO LARGE, EXCESSIVE GARBAGE COLLECTIONS
*      WILL OCCUR DURING COMPILATION AND MEMORY MAY BE LOST
*      IN THE CASE OF A TOO LARGE VALUE.
*
{E$CBS{EQU{*{{{500 WORDS
*
*      E$HNB IS THE NUMBER OF BUCKET HEADERS IN THE VARIABLE
*      HASH TABLE. IT SHOULD ALWAYS BE ODD. LARGER VALUES WILL
*      SPEED UP COMPILATION AND INDIRECT REFERENCES AT THE
*      EXPENSE OF ADDITIONAL STORAGE FOR THE HASH TABLE ITSELF.
*
{E$HNB{EQU{*{{{127 BUCKET HEADERS
*
*      E$HNW IS THE MAXIMUM NUMBER OF WORDS OF A STRING
*      NAME WHICH PARTICIPATE IN THE STRING HASH ALGORITHM.
*      LARGER VALUES GIVE A BETTER HASH AT THE EXPENSE OF TAKING
*      LONGER TO COMPUTE THE HASH. THERE IS SOME OPTIMAL VALUE.
*
{E$HNW{EQU{*{{{6 WORDS
*
*      E$FSP .  IF THE AMOUNT OF FREE SPACE LEFT AFTER A GARBAGE
*      COLLECTION IS SMALL COMPARED TO THE TOTAL AMOUNT OF SPACE
*      IN USE GARBAGE COLLECTOR THRASHING IS LIKELY TO OCCUR AS
*      THIS SPACE IS USED UP.  E$FSP IS A MEASURE OF THE
*      MINIMUM PERCENTAGE OF DYNAMIC MEMORY LEFT AS FREE SPACE
*      BEFORE THE SYSTEM ROUTINE SYSMM IS CALLED TO TRY TO
*      OBTAIN MORE MEMORY.
*
{E$FSP{EQU{*{{{15 PERCENT
{{EJC{{{{
*
*      DEFINITIONS OF CODES FOR LETTERS
*
{CH$LA{EQU{*{{{LETTER A
{CH$LB{EQU{*{{{LETTER B
{CH$LC{EQU{*{{{LETTER C
{CH$LD{EQU{*{{{LETTER D
{CH$LE{EQU{*{{{LETTER E
{CH$LF{EQU{*{{{LETTER F
{CH$LG{EQU{*{{{LETTER G
{CH$LH{EQU{*{{{LETTER H
{CH$LI{EQU{*{{{LETTER I
{CH$LJ{EQU{*{{{LETTER J
{CH$LK{EQU{*{{{LETTER K
{CH$LL{EQU{*{{{LETTER L
{CH$LM{EQU{*{{{LETTER M
{CH$LN{EQU{*{{{LETTER N
{CH$LO{EQU{*{{{LETTER O
{CH$LP{EQU{*{{{LETTER P
{CH$LQ{EQU{*{{{LETTER Q
{CH$LR{EQU{*{{{LETTER R
{CH$LS{EQU{*{{{LETTER S
{CH$LT{EQU{*{{{LETTER T
{CH$LU{EQU{*{{{LETTER U
{CH$LV{EQU{*{{{LETTER V
{CH$LW{EQU{*{{{LETTER W
{CH$LX{EQU{*{{{LETTER X
{CH$LY{EQU{*{{{LETTER Y
{CH$L${EQU{*{{{LETTER Z
*
*      DEFINITIONS OF CODES FOR DIGITS
*
{CH$D0{EQU{*{{{DIGIT 0
{CH$D1{EQU{*{{{DIGIT 1
{CH$D2{EQU{*{{{DIGIT 2
{CH$D3{EQU{*{{{DIGIT 3
{CH$D4{EQU{*{{{DIGIT 4
{CH$D5{EQU{*{{{DIGIT 5
{CH$D6{EQU{*{{{DIGIT 6
{CH$D7{EQU{*{{{DIGIT 7
{CH$D8{EQU{*{{{DIGIT 8
{CH$D9{EQU{*{{{DIGIT 9
{{EJC{{{{
*
*      DEFINITIONS OF CODES FOR SPECIAL CHARACTERS
*
*      THE NAMES OF THESE CHARACTERS ARE RELATED TO THEIR
*      ORIGINAL REPRESENTATION IN THE EBCDIC SET CORRESPONDING
*      TO THE DESCRIPTION IN STANDARD SNOBOL4 MANUALS AND TEXTS.
*
{CH$AM{EQU{*{{{KEYWORD OPERATOR (AMPERSAND)
{CH$AS{EQU{*{{{MULTIPLICATION SYMBOL (ASTERISK)
{CH$AT{EQU{*{{{CURSOR POSITION OPERATOR (AT)
{CH$BB{EQU{*{{{LEFT ARRAY BRACKET (LESS THAN)
{CH$BL{EQU{*{{{BLANK
{CH$BR{EQU{*{{{ALTERNATION OPERATOR (VERTICAL BAR)
{CH$CL{EQU{*{{{GOTO SYMBOL (COLON)
{CH$CM{EQU{*{{{COMMA
{CH$DL{EQU{*{{{INDIRECTION OPERATOR (DOLLAR)
{CH$DT{EQU{*{{{NAME OPERATOR (DOT)
{CH$DQ{EQU{*{{{DOUBLE QUOTE
{CH$EQ{EQU{*{{{EQUAL SIGN
{CH$EX{EQU{*{{{EXPONENTIATION OPERATOR (EXCLM)
{CH$MN{EQU{*{{{MINUS SIGN
{CH$NM{EQU{*{{{NUMBER SIGN
{CH$NT{EQU{*{{{NEGATION OPERATOR (NOT)
{CH$PC{EQU{*{{{PERCENT
{CH$PL{EQU{*{{{PLUS SIGN
{CH$PP{EQU{*{{{LEFT PARENTHESIS
{CH$RB{EQU{*{{{RIGHT ARRAY BRACKET (GRTR THAN)
{CH$RP{EQU{*{{{RIGHT PARENTHESIS
{CH$QU{EQU{*{{{INTERROGATION OPERATOR (QUESTION)
{CH$SL{EQU{*{{{SLASH
{CH$SM{EQU{*{{{SEMICOLON
{CH$SQ{EQU{*{{{SINGLE QUOTE
{CH$UN{EQU{*{{{SPECIAL IDENTIFIER CHAR (UNDERLINE)
{CH$OB{EQU{*{{{OPENING BRACKET
{CH$CB{EQU{*{{{CLOSING BRACKET
{{EJC{{{{
*
*      REMAINING CHARS ARE OPTIONAL ADDITIONS TO THE STANDARDS.
*
*      TAB CHARACTERS - SYNTACTICALLY EQUIVALENT TO BLANK
*
{CH$HT{EQU{*{{{HORIZONTAL TAB
*
*      LOWER CASE OR SHIFTED CASE ALPHABETIC CHARS
*
{CH$$A{EQU{*{{{SHIFTED A
{CH$$B{EQU{*{{{SHIFTED B
{CH$$C{EQU{*{{{SHIFTED C
{CH$$D{EQU{*{{{SHIFTED D
{CH$$E{EQU{*{{{SHIFTED E
{CH$$F{EQU{*{{{SHIFTED F
{CH$$G{EQU{*{{{SHIFTED G
{CH$$H{EQU{*{{{SHIFTED H
{CH$$I{EQU{*{{{SHIFTED I
{CH$$J{EQU{*{{{SHIFTED J
{CH$$K{EQU{*{{{SHIFTED K
{CH$$L{EQU{*{{{SHIFTED L
{CH$$M{EQU{*{{{SHIFTED M
{CH$$N{EQU{*{{{SHIFTED N
{CH$$O{EQU{*{{{SHIFTED O
{CH$$P{EQU{*{{{SHIFTED P
{CH$$Q{EQU{*{{{SHIFTED Q
{CH$$R{EQU{*{{{SHIFTED R
{CH$$S{EQU{*{{{SHIFTED S
{CH$$T{EQU{*{{{SHIFTED T
{CH$$U{EQU{*{{{SHIFTED U
{CH$$V{EQU{*{{{SHIFTED V
{CH$$W{EQU{*{{{SHIFTED W
{CH$$X{EQU{*{{{SHIFTED X
{CH$$Y{EQU{*{{{SHIFTED Y
{CH$$${EQU{*{{{SHIFTED Z
*      IF A DELIMITER OTHER THAN CH$CM MUST BE USED IN
*      THE THIRD ARGUMENT OF INPUT(),OUTPUT() THEN .CIOD SHOULD
*      BE DEFINED AND A PARAMETER SUPPLIED FOR IODEL.
*
{IODEL{EQU{*{{{
{{EJC{{{{
*
*      DATA BLOCK FORMATS AND DEFINITIONS
*
*      THE FOLLOWING SECTIONS DESCRIBE THE DETAILED FORMAT OF
*      ALL POSSIBLE DATA BLOCKS IN STATIC AND DYNAMIC MEMORY.
*
*      EVERY BLOCK HAS A NAME OF THE FORM XXBLK WHERE XX IS A
*      UNIQUE TWO CHARACTER IDENTIFIER. THE FIRST WORD OF EVERY
*      BLOCK MUST CONTAIN A POINTER TO A PROGRAM LOCATION IN THE
*      INTERPRETOR WHICH IS IMMEDIATELY PRECEDED BY AN ADDRESS
*      CONSTANT CONTAINING THE VALUE BL$XX WHERE XX IS THE BLOCK
*      IDENTIFIER. THIS PROVIDES A UNIFORM MECHANISM FOR
*      DISTINGUISHING BETWEEN THE VARIOUS BLOCK TYPES.
*
*      IN SOME CASES, THE CONTENTS OF THE FIRST WORD IS CONSTANT
*      FOR A GIVEN BLOCK TYPE AND MERELY SERVES AS A POINTER
*      TO THE IDENTIFYING ADDRESS CONSTANT. HOWEVER, IN OTHER
*      CASES THERE ARE SEVERAL POSSIBILITIES FOR THE FIRST
*      WORD IN WHICH CASE EACH OF THE SEVERAL PROGRAM ENTRY
*      POINTS MUST BE PRECEDED BY THE APPROPRIATE CONSTANT.
*
*      IN EACH BLOCK, SOME OF THE FIELDS ARE RELOCATABLE. THIS
*      MEANS THAT THEY MAY CONTAIN A POINTER TO ANOTHER BLOCK
*      IN THE DYNAMIC AREA. (TO BE MORE PRECISE, IF THEY CONTAIN
*      A POINTER WITHIN THE DYNAMIC AREA, THEN IT IS A POINTER
*      TO A BLOCK). SUCH FIELDS MUST BE MODIFIED BY THE GARBAGE
*      COLLECTOR (PROCEDURE GBCOL) WHENEVER BLOCKS ARE COMPACTED
*      IN THE DYNAMIC REGION. THE GARBAGE COLLECTOR (ACTUALLY
*      PROCEDURE GBCPF) REQUIRES THAT ALL SUCH RELOCATABLE
*      FIELDS IN A BLOCK MUST BE CONTIGUOUS.
{{EJC{{{{
*
*      THE DESCRIPTION FORMAT USES THE FOLLOWING SCHEME.
*
*      1)   BLOCK TITLE AND TWO CHARACTER IDENTIFIER
*
*      2)   DESCRIPTION OF BASIC USE OF BLOCK AND INDICATION
*           OF CIRCUMSTANCES UNDER WHICH IT IS CONSTRUCTED.
*
*      3)   PICTURE OF THE BLOCK FORMAT. IN THESE PICTURES LOW
*           MEMORY ADDRESSES ARE AT THE TOP OF THE PAGE. FIXED
*           LENGTH FIELDS ARE SURROUNDED BY I (LETTER I). FIELDS
*           WHICH ARE FIXED LENGTH BUT WHOSE LENGTH IS DEPENDENT
*           ON A CONFIGURATION PARAMETER ARE SURROUNDED BY *
*           (ASTERISK). VARIABLE LENGTH FIELDS ARE SURROUNDED
*           BY / (SLASH).
*
*      4)   DEFINITION OF SYMBOLIC OFFSETS TO FIELDS IN
*           BLOCK AND OF THE SIZE OF THE BLOCK IF FIXED LENGTH
*           OR OF THE SIZE OF THE FIXED LENGTH FIELDS IF THE
*           BLOCK IS VARIABLE LENGTH.
*           NOTE THAT SOME ROUTINES SUCH AS GBCPF ASSUME
*           CERTAIN OFFSETS ARE EQUAL. THE DEFINITIONS
*           GIVEN HERE ENFORCE THIS.  MAKE CHANGES TO
*           THEM ONLY WITH DUE CARE.
*
*      DEFINITIONS OF COMMON OFFSETS
*
{OFFS1{EQU{1{{{
{OFFS2{EQU{2{{{
{OFFS3{EQU{3{{{
*
*      5)   DETAILED COMMENTS ON THE SIGNIFICANCE AND FORMATS
*           OF THE VARIOUS FIELDS.
*
*      THE ORDER IS ALPHABETICAL BY IDENTIFICATION CODE.
{{EJC{{{{
*
*      DEFINITIONS OF BLOCK CODES
*
*      THIS TABLE PROVIDES A UNIQUE IDENTIFICATION CODE FOR
*      EACH SEPARATE BLOCK TYPE. THE FIRST WORD OF A BLOCK IN
*      THE DYNAMIC AREA ALWAYS CONTAINS THE ADDRESS OF A PROGRAM
*      ENTRY POINT. THE BLOCK CODE IS USED AS THE ENTRY POINT ID
*      THE ORDER OF THESE CODES DICTATES THE ORDER OF THE TABLE
*      USED BY THE DATATYPE FUNCTION (SCNMT IN THE CONSTANT SEC)
*
*      BLOCK CODES FOR ACCESSIBLE DATATYPES
*
{BL$AR{EQU{0{{{ARBLK     ARRAY
{BL$BC{EQU{BL$AR+1{{{BCBLK     BUFFER
{BL$CD{EQU{BL$BC+1{{{CDBLK     CODE
{BL$EX{EQU{BL$CD+1{{{EXBLK     EXPRESSION
{BL$IC{EQU{BL$EX+1{{{ICBLK     INTEGER
{BL$NM{EQU{BL$IC+1{{{NMBLK     NAME
{BL$P0{EQU{BL$NM+1{{{P0BLK     PATTERN
{BL$P1{EQU{BL$P0+1{{{P1BLK     PATTERN
{BL$P2{EQU{BL$P1+1{{{P2BLK     PATTERN
{BL$RC{EQU{BL$P2+1{{{RCBLK     REAL
{BL$SC{EQU{BL$RC+1{{{SCBLK     STRING
{BL$SE{EQU{BL$SC+1{{{SEBLK     EXPRESSION
{BL$TB{EQU{BL$SE+1{{{TBBLK     TABLE
{BL$VC{EQU{BL$TB+1{{{VCBLK     ARRAY
{BL$XN{EQU{BL$VC+1{{{XNBLK     EXTERNAL
{BL$XR{EQU{BL$XN+1{{{XRBLK     EXTERNAL
{BL$PD{EQU{BL$XR+1{{{PDBLK     PROGRAM DEFINED DATATYPE
*
{BL$$D{EQU{BL$PD+1{{{NUMBER OF BLOCK CODES FOR DATA
*
*      OTHER BLOCK CODES
*
{BL$TR{EQU{BL$PD+1{{{TRBLK
{BL$BF{EQU{BL$TR+1{{{BFBLK
{BL$CC{EQU{BL$BF+1{{{CCBLK
{BL$CM{EQU{BL$CC+1{{{CMBLK
{BL$CT{EQU{BL$CM+1{{{CTBLK
{BL$DF{EQU{BL$CT+1{{{DFBLK
{BL$EF{EQU{BL$DF+1{{{EFBLK
{BL$EV{EQU{BL$EF+1{{{EVBLK
{BL$FF{EQU{BL$EV+1{{{FFBLK
{BL$KV{EQU{BL$FF+1{{{KVBLK
{BL$PF{EQU{BL$KV+1{{{PFBLK
{BL$TE{EQU{BL$PF+1{{{TEBLK
*
{BL$$I{EQU{0{{{DEFAULT IDENTIFICATION CODE
{BL$$T{EQU{BL$TR+1{{{CODE FOR DATA OR TRACE BLOCK
{BL$$${EQU{BL$TE+1{{{NUMBER OF BLOCK CODES
{{EJC{{{{
*
*      FIELD REFERENCES
*
*      REFERENCES TO THE FIELDS OF DATA BLOCKS ARE SYMBOLIC
*      (I.E. USE THE SYMBOLIC OFFSETS) WITH THE FOLLOWING
*      EXCEPTIONS.
*
*      1)   REFERENCES TO THE FIRST WORD ARE USUALLY NOT
*           SYMBOLIC SINCE THEY USE THE (X) OPERAND FORMAT.
*
*      2)   THE CODE WHICH CONSTRUCTS A BLOCK IS OFTEN NOT
*           SYMBOLIC AND SHOULD BE CHANGED IF THE CORRESPONDING
*           BLOCK FORMAT IS MODIFIED.
*
*      3)   THE PLC AND PSC INSTRUCTIONS IMPLY AN OFFSET
*           CORRESPONDING TO THE DEFINITION OF CFP$F.
*
*      4)   THERE ARE NON-SYMBOLIC REFERENCES (EASILY CHANGED)
*           IN THE GARBAGE COLLECTOR (PROCEDURES GBCPF, BLKLN).
*
*      5)   THE FIELDS IDVAL, FARGS APPEAR IN SEVERAL BLOCKS
*           AND ANY CHANGES MUST BE MADE IN PARALLEL TO ALL
*           BLOCKS CONTAINING THE FIELDS. THE ACTUAL REFERENCES
*           TO THESE FIELDS ARE SYMBOLIC WITH THE ABOVE
*           LISTED EXCEPTIONS.
*
*      6)   SEVERAL SPOTS IN THE CODE ASSUME THAT THE
*           DEFINITIONS OF THE FIELDS VRVAL, TEVAL, TRNXT ARE
*           THE SAME (THESE ARE SECTIONS OF CODE WHICH SEARCH
*           OUT ALONG A TRBLK CHAIN FROM A VARIABLE).
*
*      7)   REFERENCES TO THE FIELDS OF AN ARRAY BLOCK IN THE
*           ARRAY REFERENCE ROUTINE ARREF ARE NON-SYMBOLIC.
*
*      APART FROM THE EXCEPTIONS LISTED, REFERENCES ARE SYMBOLIC
*      AS FAR AS POSSIBLE AND MODIFYING THE ORDER OR NUMBER
*      OF FIELDS WILL NOT REQUIRE CHANGES.
{{EJC{{{{
*
*      COMMON FIELDS FOR FUNCTION BLOCKS
*
*      BLOCKS WHICH REPRESENT CALLABLE FUNCTIONS HAVE TWO
*      COMMON FIELDS AT THE START OF THE BLOCK AS FOLLOWS.
*
*           +------------------------------------+
*           I                FCODE               I
*           +------------------------------------+
*           I                FARGS               I
*           +------------------------------------+
*           /                                    /
*           /       REST OF FUNCTION BLOCK       /
*           /                                    /
*           +------------------------------------+
*
{FCODE{EQU{0{{{POINTER TO CODE FOR FUNCTION
{FARGS{EQU{1{{{NUMBER OF ARGUMENTS
*
*      FCODE IS A POINTER TO THE LOCATION IN THE INTERPRETOR
*      PROGRAM WHICH PROCESSES THIS TYPE OF FUNCTION CALL.
*
*      FARGS IS THE EXPECTED NUMBER OF ARGUMENTS. THE ACTUAL
*      NUMBER OF ARGUMENTS IS ADJUSTED TO THIS AMOUNT BY
*      DELETING EXTRA ARGUMENTS OR SUPPLYING TRAILING NULLS
*      FOR MISSING ONES BEFORE TRANSFERRING THOUGH FCODE.
*      A VALUE OF 999 MAY BE USED IN THIS FIELD TO INDICATE A
*      VARIABLE NUMBER OF ARGUMENTS (SEE SVBLK FIELD SVNAR).
*
*      THE BLOCK TYPES WHICH FOLLOW THIS SCHEME ARE.
*
*      FFBLK                 FIELD FUNCTION
*      DFBLK                 DATATYPE FUNCTION
*      PFBLK                 PROGRAM DEFINED FUNCTION
*      EFBLK                 EXTERNAL LOADED FUNCTION
{{EJC{{{{
*
*      IDENTIFICATION FIELD
*
*
*      ID   FIELD
*
*      CERTAIN PROGRAM ACCESSIBLE OBJECTS (THOSE WHICH CONTAIN
*      OTHER DATA VALUES AND CAN BE COPIED) ARE GIVEN A UNIQUE
*      IDENTIFICATION NUMBER (SEE EXSID). THIS ID VALUE IS AN
*      ADDRESS INTEGER VALUE WHICH IS ALWAYS STORED IN WORD TWO.
*
{IDVAL{EQU{1{{{ID VALUE FIELD
*
*      THE BLOCKS CONTAINING AN IDVAL FIELD ARE.
*
*      ARBLK                 ARRAY
*      BCBLK                 BUFFER CONTROL BLOCK
*      PDBLK                 PROGRAM DEFINED DATATYPE
*      TBBLK                 TABLE
*      VCBLK                 VECTOR BLOCK (ARRAY)
*
*      NOTE THAT A ZERO IDVAL MEANS THAT THE BLOCK IS ONLY
*      HALF BUILT AND SHOULD NOT BE DUMPED (SEE DUMPR).
{{EJC{{{{
*
*      ARRAY BLOCK (ARBLK)
*
*      AN ARRAY BLOCK REPRESENTS AN ARRAY VALUE OTHER THAN ONE
*      WITH ONE DIMENSION WHOSE LOWER BOUND IS ONE (SEE VCBLK).
*      AN ARBLK IS BUILT WITH A CALL TO THE FUNCTIONS CONVERT
*      (S$CNV) OR ARRAY (S$ARR).
*
*           +------------------------------------+
*           I                ARTYP               I
*           +------------------------------------+
*           I                IDVAL               I
*           +------------------------------------+
*           I                ARLEN               I
*           +------------------------------------+
*           I                AROFS               I
*           +------------------------------------+
*           I                ARNDM               I
*           +------------------------------------+
*           *                ARLBD               *
*           +------------------------------------+
*           *                ARDIM               *
*           +------------------------------------+
*           *                                    *
*           * ABOVE 2 FLDS REPEATED FOR EACH DIM *
*           *                                    *
*           +------------------------------------+
*           I                ARPRO               I
*           +------------------------------------+
*           /                                    /
*           /                ARVLS               /
*           /                                    /
*           +------------------------------------+
{{EJC{{{{
*
*      ARRAY BLOCK (CONTINUED)
*
{ARTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$ART
{ARLEN{EQU{IDVAL+1{{{LENGTH OF ARBLK IN BYTES
{AROFS{EQU{ARLEN+1{{{OFFSET IN ARBLK TO ARPRO FIELD
{ARNDM{EQU{AROFS+1{{{NUMBER OF DIMENSIONS
{ARLBD{EQU{ARNDM+1{{{LOW BOUND (FIRST SUBSCRIPT)
{ARDIM{EQU{ARLBD+CFP$I{{{DIMENSION (FIRST SUBSCRIPT)
{ARLB2{EQU{ARDIM+CFP$I{{{LOW BOUND (SECOND SUBSCRIPT)
{ARDM2{EQU{ARLB2+CFP$I{{{DIMENSION (SECOND SUBSCRIPT)
{ARPRO{EQU{ARDIM+CFP$I{{{ARRAY PROTOTYPE (ONE DIMENSION)
{ARVLS{EQU{ARPRO+1{{{START OF VALUES (ONE DIMENSION)
{ARPR2{EQU{ARDM2+CFP$I{{{ARRAY PROTOTYPE (TWO DIMENSIONS)
{ARVL2{EQU{ARPR2+1{{{START OF VALUES (TWO DIMENSIONS)
{ARSI${EQU{ARLBD{{{NUMBER OF STANDARD FIELDS IN BLOCK
{ARDMS{EQU{ARLB2-ARLBD{{{SIZE OF INFO FOR ONE SET OF BOUNDS
*
*      THE BOUNDS AND DIMENSION FIELDS ARE SIGNED INTEGER
*      VALUES AND EACH OCCUPY CFP$I WORDS IN THE ARBLK.
*
*      THE LENGTH OF AN ARBLK IN BYTES MAY NOT EXCEED MXLEN.
*      THIS IS REQUIRED TO KEEP NAME OFFSETS GARBAGE COLLECTABLE
*
*      THE ACTUAL VALUES ARE ARRANGED IN ROW-WISE ORDER AND
*      CAN CONTAIN A DATA POINTER OR A POINTER TO A TRBLK.
*
*      BUFFER CONTROL BLOCK (BCBLK)
*
*      A BCBLK IS BUILT FOR EVERY BFBLK.
*
*           +------------------------------------+
*           I                BCTYP               I
*           +------------------------------------+
*           I                IDVAL               I
*           +------------------------------------+
*           I                BCLEN               I
*           +------------------------------------+
*           I                BCBUF               I
*           +------------------------------------+
*
{BCTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$BCT
{BCLEN{EQU{IDVAL+1{{{DEFINED BUFFER LENGTH
{BCBUF{EQU{BCLEN+1{{{PTR TO BFBLK
{BCSI${EQU{BCBUF+1{{{SIZE OF BCBLK
*
*      A BCBLK IS AN INDIRECT CONTROL HEADER FOR BFBLK.
*      THE REASON FOR NOT STORING THIS DATA DIRECTLY
*      IN THE RELATED BFBLK IS SO THAT THE BFBLK CAN
*      MAINTAIN THE SAME SKELETAL STRUCTURE AS AN SCBLK
*      THUS FACILITATING TRANSPARENT STRING OPERATIONS
*      (FOR THE MOST PART).  SPECIFICALLY, CFP$F IS THE
*      SAME FOR A BFBLK AS FOR AN SCBLK.  BY CONVENTION,
*      WHEREEVER A BUFFER VALUE IS EMPLOYED, THE BCBLK
*      IS POINTED TO.
*
*      THE CORRESPONDING BFBLK IS POINTED TO BY THE
*      BCBUF POINTER IN THE BCBLK.
*
*      BCLEN IS THE CURRENT DEFINED SIZE OF THE CHARACTER
*      ARRAY IN THE BFBLK.  CHARACTERS FOLLOWING THE OFFSET
*      OF BCLEN ARE UNDEFINED.
*
{{EJC{{{{
*
*      STRING BUFFER BLOCK (BFBLK)
*
*      A BFBLK IS BUILT BY A CALL TO BUFFER(...)
*
*           +------------------------------------+
*           I                BFTYP               I
*           +------------------------------------+
*           I                BFALC               I
*           +------------------------------------+
*           /                                    /
*           /                BFCHR               /
*           /                                    /
*           +------------------------------------+
*
{BFTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$BFT
{BFALC{EQU{BFTYP+1{{{ALLOCATED SIZE OF BUFFER
{BFCHR{EQU{BFALC+1{{{CHARACTERS OF STRING
{BFSI${EQU{BFCHR{{{SIZE OF STANDARD FIELDS IN BFBLK
*
*      THE CHARACTERS IN THE BUFFER ARE STORED LEFT JUSTIFIED.
*      THE FINAL WORD OF DEFINED CHARACTERS IS ALWAYS ZERO
*      (CHARACTER) PADDED.  ANY TRAILING ALLOCATION PAST THE
*      WORD CONTAINING THE LAST CHARACTER CONTAINS
*      UNPREDICTABLE CONTENTS AND IS NEVER REFERENCED.
*
*      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
*      IS GIVEN BY CFP$F, AS WITH AN SCBLK.  HOWEVER, THE
*      OFFSET WHICH IS OCCUPIED BY THE LENGTH FOR AN SCBLK
*      IS THE TOTAL CHAR SPACE FOR BFBLKS, AND ROUTINES WHICH
*      DEAL WITH BOTH MUST ACCOUNT FOR THIS DIFFERENCE.
*
*      THE VALUE OF BFALC MAY NOT EXCEED MXLEN.  THE VALUE OF
*      BCLEN IS ALWAYS LESS THAN OR EQUAL TO BFALC.
*
{{EJC{{{{
*
*      CODE CONSTRUCTION BLOCK (CCBLK)
*
*      AT ANY ONE MOMENT THERE IS AT MOST ONE CCBLK INTO
*      WHICH THE COMPILER IS CURRENTLY STORING CODE (CDWRD).
*
*           +------------------------------------+
*           I                CCTYP               I
*           +------------------------------------+
*           I                CCLEN               I
*           +------------------------------------+
*           I                CCUSE               I
*           +------------------------------------+
*           /                                    /
*           /                CCCOD               /
*           /                                    /
*           +------------------------------------+
*
{CCTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$CCT
{CCLEN{EQU{CCTYP+1{{{LENGTH OF CCBLK IN BYTES
{CCUSE{EQU{CCLEN+1{{{OFFSET PAST LAST USED WORD (BYTES)
{CCCOD{EQU{CCUSE+1{{{START OF GENERATED CODE IN BLOCK
*
*      THE REASON THAT THE CCBLK IS A SEPARATE BLOCK TYPE FROM
*      THE USUAL CDBLK IS THAT THE GARBAGE COLLECTOR MUST
*      ONLY PROCESS THOSE FIELDS WHICH HAVE BEEN SET (SEE GBCPF)
{{EJC{{{{
*
*      CODE BLOCK (CDBLK)
*
*      A CODE BLOCK IS BUILT FOR EACH STATEMENT COMPILED DURING
*      THE INITIAL COMPILATION OR BY SUBSEQUENT CALLS TO CODE.
*
*           +------------------------------------+
*           I                CDJMP               I
*           +------------------------------------+
*           I                CDSTM               I
*           +------------------------------------+
*           I                CDLEN               I
*           +------------------------------------+
*           I                CDFAL               I
*           +------------------------------------+
*           /                                    /
*           /                CDCOD               /
*           /                                    /
*           +------------------------------------+
*
{CDJMP{EQU{0{{{PTR TO ROUTINE TO EXECUTE STATEMENT
{CDSTM{EQU{CDJMP+1{{{STATEMENT NUMBER
{CDLEN{EQU{OFFS2{{{LENGTH OF CDBLK IN BYTES
{CDFAL{EQU{OFFS3{{{FAILURE EXIT (SEE BELOW)
{CDCOD{EQU{CDFAL+1{{{EXECUTABLE PSEUDO-CODE
{CDSI${EQU{CDCOD{{{NUMBER OF STANDARD FIELDS IN CDBLK
*
*      CDSTM IS THE STATEMENT NUMBER OF THE CURRENT STATEMENT.
*
*      CDJMP, CDFAL ARE SET AS FOLLOWS.
*
*      1)   IF THE FAILURE EXIT IS THE NEXT STATEMENT
*
*           CDJMP = B$CDS
*           CDFAL = PTR TO CDBLK FOR NEXT STATEMENT
*
*      2)   IF THE FAILURE EXIT IS A SIMPLE LABEL NAME
*
*           CDJMP = B$CDS
*           CDFAL IS A PTR TO THE VRTRA FIELD OF THE VRBLK
*
*      3)   IF THERE IS NO FAILURE EXIT (-NOFAIL MODE)
*
*           CDJMP = B$CDS
*           CDFAL = O$UNF
*
*      4)   IF THE FAILURE EXIT IS COMPLEX OR DIRECT
*
*           CDJMP = B$CDC
*           CDFAL IS THE OFFSET TO THE O$GOF WORD
{{EJC{{{{
*
*      CODE BLOCK (CONTINUED)
*
*      CDCOD IS THE START OF THE ACTUAL CODE. FIRST WE DESCRIBE
*      THE CODE GENERATED FOR AN EXPRESSION. IN AN EXPRESSION,
*      ELEMENTS ARE FETCHED BY NAME OR BY VALUE. FOR EXAMPLE,
*      THE BINARY EQUAL OPERATOR FETCHES ITS LEFT ARGUMENT
*      BY NAME AND ITS RIGHT ARGUMENT BY VALUE. THESE TWO
*      CASES GENERATE QUITE DIFFERENT CODE AND ARE DESCRIBED
*      SEPARATELY. FIRST WE CONSIDER THE CODE BY VALUE CASE.
*
*      GENERATION OF CODE BY VALUE FOR EXPRESSIONS ELEMENTS.
*
*      EXPRESSION            POINTER TO EXBLK OR SEBLK
*
*      INTEGER CONSTANT      POINTER TO ICBLK
*
*      NULL CONSTANT         POINTER TO NULLS
*
*      PATTERN               (RESULTING FROM PREEVALUATION)
*                            =O$LPT
*                            POINTER TO P0BLK,P1BLK OR P2BLK
*
*      REAL CONSTANT         POINTER TO RCBLK
*
*      STRING CONSTANT       POINTER TO SCBLK
*
*      VARIABLE              POINTER TO VRGET FIELD OF VRBLK
*
*      ADDITION              VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$ADD
*
*      AFFIRMATION           VALUE CODE FOR OPERAND
*                            =O$AFF
*
*      ALTERNATION           VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$ALT
*
*      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
*                            VALUE CODE FOR ARRAY OPERAND
*                            VALUE CODE FOR SUBSCRIPT OPERAND
*                            =O$AOV
*
*                            (CASE OF MORE THAN ONE SUBSCRIPT)
*                            VALUE CODE FOR ARRAY OPERAND
*                            VALUE CODE FOR FIRST SUBSCRIPT
*                            VALUE CODE FOR SECOND SUBSCRIPT
*                            ...
*                            VALUE CODE FOR LAST SUBSCRIPT
*                            =O$AMV
*                            NUMBER OF SUBSCRIPTS
{{EJC{{{{
*
*      CODE BLOCK (CONTINUED)
*
*      ASSIGNMENT            (TO NATURAL VARIABLE)
*                            VALUE CODE FOR RIGHT OPERAND
*                            POINTER TO VRSTO FIELD OF VRBLK
*
*                            (TO ANY OTHER VARIABLE)
*                            NAME CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$ASS
*
*      COMPILE ERROR         =O$CER
*
*
*      COMPLEMENTATION       VALUE CODE FOR OPERAND
*                            =O$COM
*
*      CONCATENATION         (CASE OF PRED FUNC LEFT OPERAND)
*                            VALUE CODE FOR LEFT OPERAND
*                            =O$POP
*                            VALUE CODE FOR RIGHT OPERAND
*
*                            (ALL OTHER CASES)
*                            VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$CNC
*
*      CURSOR ASSIGNMENT     NAME CODE FOR OPERAND
*                            =O$CAS
*
*      DIVISION              VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$DVD
*
*      EXPONENTIATION        VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$EXP
*
*      FUNCTION CALL         (CASE OF CALL TO SYSTEM FUNCTION)
*                            VALUE CODE FOR FIRST ARGUMENT
*                            VALUE CODE FOR SECOND ARGUMENT
*                            ...
*                            VALUE CODE FOR LAST ARGUMENT
*                            POINTER TO SVFNC FIELD OF SVBLK
*
{{EJC{{{{
*
*      CODE BLOCK (CONTINUED)
*
*      FUNCTION CALL         (CASE OF NON-SYSTEM FUNCTION 1 ARG)
*                            VALUE CODE FOR ARGUMENT
*                            =O$FNS
*                            POINTER TO VRBLK FOR FUNCTION
*
*                            (NON-SYSTEM FUNCTION, GT 1 ARG)
*                            VALUE CODE FOR FIRST ARGUMENT
*                            VALUE CODE FOR SECOND ARGUMENT
*                            ...
*                            VALUE CODE FOR LAST ARGUMENT
*                            =O$FNC
*                            NUMBER OF ARGUMENTS
*                            POINTER TO VRBLK FOR FUNCTION
*
*      IMMEDIATE ASSIGNMENT  VALUE CODE FOR LEFT OPERAND
*                            NAME CODE FOR RIGHT OPERAND
*                            =O$IMA
*
*      INDIRECTION           VALUE CODE FOR OPERAND
*                            =O$INV
*
*      INTERROGATION         VALUE CODE FOR OPERAND
*                            =O$INT
*
*      KEYWORD REFERENCE     NAME CODE FOR OPERAND
*                            =O$KWV
*
*      MULTIPLICATION        VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$MLT
*
*      NAME REFERENCE        (NATURAL VARIABLE CASE)
*                            POINTER TO NMBLK FOR NAME
*
*                            (ALL OTHER CASES)
*                            NAME CODE FOR OPERAND
*                            =O$NAM
*
*      NEGATION              =O$NTA
*                            CDBLK OFFSET OF O$NTC WORD
*                            VALUE CODE FOR OPERAND
*                            =O$NTB
*                            =O$NTC
{{EJC{{{{
*
*      CODE BLOCK (CONTINUED)
*
*      PATTERN ASSIGNMENT    VALUE CODE FOR LEFT OPERAND
*                            NAME CODE FOR RIGHT OPERAND
*                            =O$PAS
*
*      PATTERN MATCH         VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$PMV
*
*      PATTERN REPLACEMENT   NAME CODE FOR SUBJECT
*                            VALUE CODE FOR PATTERN
*                            =O$PMN
*                            VALUE CODE FOR REPLACEMENT
*                            =O$RPL
*
*      SELECTION             (FOR FIRST ALTERNATIVE)
*                            =O$SLA
*                            CDBLK OFFSET TO NEXT O$SLC WORD
*                            VALUE CODE FOR FIRST ALTERNATIVE
*                            =O$SLB
*                            CDBLK OFFSET PAST ALTERNATIVES
*
*                            (FOR SUBSEQUENT ALTERNATIVES)
*                            =O$SLC
*                            CDBLK OFFSET TO NEXT O$SLC,O$SLD
*                            VALUE CODE FOR ALTERNATIVE
*                            =O$SLB
*                            OFFSET IN CDBLK PAST ALTERNATIVES
*
*                            (FOR LAST ALTERNATIVE)
*                            =O$SLD
*                            VALUE CODE FOR LAST ALTERNATIVE
*
*      SUBTRACTION           VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$SUB
{{EJC{{{{
*
*      CODE BLOCK (CONTINUED)
*
*      GENERATION OF CODE BY NAME FOR EXPRESSION ELEMENTS.
*
*      VARIABLE              =O$LVN
*                            POINTER TO VRBLK
*
*      EXPRESSION            (CASE OF *NATURAL VARIABLE)
*                            =O$LVN
*                            POINTER TO VRBLK
*
*                            (ALL OTHER CASES)
*                            =O$LEX
*                            POINTER TO EXBLK
*
*
*      ARRAY REFERENCE       (CASE OF ONE SUBSCRIPT)
*                            VALUE CODE FOR ARRAY OPERAND
*                            VALUE CODE FOR SUBSCRIPT OPERAND
*                            =O$AON
*
*                            (CASE OF MORE THAN ONE SUBSCRIPT)
*                            VALUE CODE FOR ARRAY OPERAND
*                            VALUE CODE FOR FIRST SUBSCRIPT
*                            VALUE CODE FOR SECOND SUBSCRIPT
*                            ...
*                            VALUE CODE FOR LAST SUBSCRIPT
*                            =O$AMN
*                            NUMBER OF SUBSCRIPTS
*
*      COMPILE ERROR         =O$CER
*
*      FUNCTION CALL         (SAME CODE AS FOR VALUE CALL)
*                            =O$FNE
*
*      INDIRECTION           VALUE CODE FOR OPERAND
*                            =O$INN
*
*      KEYWORD REFERENCE     NAME CODE FOR OPERAND
*                            =O$KWN
*
*      ANY OTHER OPERAND IS AN ERROR IN A NAME POSITION
*
*      NOTE THAT IN THIS DESCRIPTION, =O$XXX REFERS TO THE
*      GENERATION OF A WORD CONTAINING THE ADDRESS OF ANOTHER
*      WORD WHICH CONTAINS THE ENTRY POINT ADDRESS O$XXX.
{{EJC{{{{
*
*      CODE BLOCK (CONTINUED)
*
*      NOW WE CONSIDER THE OVERALL STRUCTURE OF THE CODE BLOCK
*      FOR A STATEMENT WITH POSSIBLE GOTO FIELDS.
*
*      FIRST COMES THE CODE FOR THE STATEMENT BODY.
*      THE STATEMENT BODY IS AN EXPRESSION TO BE EVALUATED
*      BY VALUE ALTHOUGH THE VALUE IS NOT ACTUALLY REQUIRED.
*      NORMAL VALUE CODE IS GENERATED FOR THE BODY OF THE
*      STATEMENT EXCEPT IN THE CASE OF A PATTERN MATCH BY
*      VALUE, IN WHICH CASE THE FOLLOWING IS GENERATED.
*
*                            VALUE CODE FOR LEFT OPERAND
*                            VALUE CODE FOR RIGHT OPERAND
*                            =O$PMS
*
*      NEXT WE HAVE THE CODE FOR THE SUCCESS GOTO. THERE ARE
*      SEVERAL CASES AS FOLLOWS.
*
*      1)   NO SUCCESS GOTO  PTR TO CDBLK FOR NEXT STATEMENT
*
*      2)   SIMPLE LABEL     PTR TO VRTRA FIELD OF VRBLK
*
*      3)   COMPLEX GOTO     (CODE BY NAME FOR GOTO OPERAND)
*                            =O$GOC
*
*      4)   DIRECT GOTO      (CODE BY VALUE FOR GOTO OPERAND)
*                            =O$GOD
*
*      FOLLOWING THIS WE GENERATE CODE FOR THE FAILURE GOTO IF
*      IT IS DIRECT OR IF IT IS COMPLEX, SIMPLE FAILURE GOTOS
*      HAVING BEEN HANDLED BY AN APPROPRIATE SETTING OF THE
*      CDFAL FIELD OF THE CDBLK. THE GENERATED CODE IS ONE
*      OF THE FOLLOWING.
*
*      1)   COMPLEX FGOTO    =O$FIF
*                            =O$GOF
*                            NAME CODE FOR GOTO OPERAND
*                            =O$GOC
*
*      2)   DIRECT FGOTO     =O$FIF
*                            =O$GOF
*                            VALUE CODE FOR GOTO OPERAND
*                            =O$GOD
*
*      AN OPTIMIZATION OCCURS IF THE SUCCESS AND FAILURE GOTOS
*      ARE IDENTICAL AND EITHER COMPLEX OR DIRECT. IN THIS CASE,
*      NO CODE IS GENERATED FOR THE SUCCESS GOTO AND CONTROL
*      IS ALLOWED TO FALL INTO THE FAILURE GOTO ON SUCCESS.
{{EJC{{{{
*
*      COMPILER BLOCK (CMBLK)
*
*      A COMPILER BLOCK (CMBLK) IS BUILT BY EXPAN TO REPRESENT
*      ONE NODE OF A TREE STRUCTURED EXPRESSION REPRESENTATION.
*
*           +------------------------------------+
*           I                CMIDN               I
*           +------------------------------------+
*           I                CMLEN               I
*           +------------------------------------+
*           I                CMTYP               I
*           +------------------------------------+
*           I                CMOPN               I
*           +------------------------------------+
*           /           CMVLS OR CMROP           /
*           /                                    /
*           /                CMLOP               /
*           /                                    /
*           +------------------------------------+
*
{CMIDN{EQU{0{{{POINTER TO DUMMY ROUTINE B$CMT
{CMLEN{EQU{CMIDN+1{{{LENGTH OF CMBLK IN BYTES
{CMTYP{EQU{CMLEN+1{{{TYPE (C$XXX, SEE LIST BELOW)
{CMOPN{EQU{CMTYP+1{{{OPERAND POINTER (SEE BELOW)
{CMVLS{EQU{CMOPN+1{{{OPERAND VALUE POINTERS (SEE BELOW)
{CMROP{EQU{CMVLS{{{RIGHT (ONLY) OPERATOR OPERAND
{CMLOP{EQU{CMVLS+1{{{LEFT OPERATOR OPERAND
{CMSI${EQU{CMVLS{{{NUMBER OF STANDARD FIELDS IN CMBLK
{CMUS${EQU{CMSI$+1{{{SIZE OF UNARY OPERATOR CMBLK
{CMBS${EQU{CMSI$+2{{{SIZE OF BINARY OPERATOR CMBLK
{CMAR1{EQU{CMVLS+1{{{ARRAY SUBSCRIPT POINTERS
*
*      THE CMOPN AND CMVLS FIELDS ARE SET AS FOLLOWS
*
*      ARRAY REFERENCE       CMOPN = PTR TO ARRAY OPERAND
*                            CMVLS = PTRS TO SUBSCRIPT OPERANDS
*
*      FUNCTION CALL         CMOPN = PTR TO VRBLK FOR FUNCTION
*                            CMVLS = PTRS TO ARGUMENT OPERANDS
*
*      SELECTION             CMOPN = ZERO
*                            CMVLS = PTRS TO ALTERNATE OPERANDS
*
*      UNARY OPERATOR        CMOPN = PTR TO OPERATOR DVBLK
*                            CMROP = PTR TO OPERAND
*
*      BINARY OPERATOR       CMOPN = PTR TO OPERATOR DVBLK
*                            CMROP = PTR TO RIGHT OPERAND
*                            CMLOP = PTR TO LEFT OPERAND
{{EJC{{{{
*
*      CMTYP IS SET TO INDICATE THE TYPE OF EXPRESSION ELEMENT
*      AS SHOWN BY THE FOLLOWING TABLE OF DEFINITIONS.
*
{C$ARR{EQU{0{{{ARRAY REFERENCE
{C$FNC{EQU{C$ARR+1{{{FUNCTION CALL
{C$DEF{EQU{C$FNC+1{{{DEFERRED EXPRESSION (UNARY *)
{C$IND{EQU{C$DEF+1{{{INDIRECTION (UNARY $)
{C$KEY{EQU{C$IND+1{{{KEYWORD REFERENCE (UNARY AMPERSAND)
{C$UBO{EQU{C$KEY+1{{{UNDEFINED BINARY OPERATOR
{C$UUO{EQU{C$UBO+1{{{UNDEFINED UNARY OPERATOR
{C$UO${EQU{C$UUO+1{{{TEST VALUE (=C$UUO+1=C$UBO+2)
{C$$NM{EQU{C$UUO+1{{{NUMBER OF CODES FOR NAME OPERANDS
*
*      THE REMAINING TYPES INDICATE EXPRESSION ELEMENTS WHICH
*      CAN ONLY BE EVALUATED BY VALUE (NOT BY NAME).
*
{C$BVL{EQU{C$UUO+1{{{BINARY OP WITH VALUE OPERANDS
{C$UVL{EQU{C$BVL+1{{{UNARY OPERATOR WITH VALUE OPERAND
{C$ALT{EQU{C$UVL+1{{{ALTERNATION (BINARY BAR)
{C$CNC{EQU{C$ALT+1{{{CONCATENATION
{C$CNP{EQU{C$CNC+1{{{CONCATENATION, NOT PATTERN MATCH
{C$UNM{EQU{C$CNP+1{{{UNARY OP WITH NAME OPERAND
{C$BVN{EQU{C$UNM+1{{{BINARY OP (OPERANDS BY VALUE, NAME)
{C$ASS{EQU{C$BVN+1{{{ASSIGNMENT
{C$INT{EQU{C$ASS+1{{{INTERROGATION
{C$NEG{EQU{C$INT+1{{{NEGATION (UNARY NOT)
{C$SEL{EQU{C$NEG+1{{{SELECTION
{C$PMT{EQU{C$SEL+1{{{PATTERN MATCH
*
{C$PR${EQU{C$BVN{{{LAST PREEVALUABLE CODE
{C$$NV{EQU{C$PMT+1{{{NUMBER OF DIFFERENT CMBLK TYPES
{{EJC{{{{
*
*      CHARACTER TABLE BLOCK (CTBLK)
*
*      A CHARACTER TABLE BLOCK IS USED TO HOLD LOGICAL CHARACTER
*      TABLES FOR USE WITH ANY,NOTANY,SPAN,BREAK,BREAKX
*      PATTERNS. EACH CHARACTER TABLE CAN BE USED TO STORE
*      CFP$N DISTINCT TABLES AS BIT COLUMNS. A BIT COLUMN
*      ALLOCATED FOR EACH ARGUMENT OF MORE THAN ONE CHARACTER
*      IN LENGTH TO ONE OF THE ABOVE LISTED PATTERN PRIMITIVES.
*
*           +------------------------------------+
*           I                CTTYP               I
*           +------------------------------------+
*           *                                    *
*           *                                    *
*           *                CTCHS               *
*           *                                    *
*           *                                    *
*           +------------------------------------+
*
{CTTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$CTT
{CTCHS{EQU{CTTYP+1{{{START OF CHARACTER TABLE WORDS
{CTSI${EQU{CTCHS+CFP$A{{{NUMBER OF WORDS IN CTBLK
*
*      CTCHS IS CFP$A WORDS LONG AND CONSISTS OF A ONE WORD
*      BIT STRING VALUE FOR EACH POSSIBLE CHARACTER IN THE
*      INTERNAL ALPHABET. EACH OF THE CFP$N POSSIBLE BITS IN
*      A BITSTRING IS USED TO FORM A COLUMN OF BIT INDICATORS.
*      A BIT IS SET ON IF THE CHARACTER IS IN THE TABLE AND OFF
*      IF THE CHARACTER IS NOT PRESENT.
{{EJC{{{{
*
*      DATATYPE FUNCTION BLOCK (DFBLK)
*
*      A DATATYPE FUNCTION IS USED TO CONTROL THE CONSTRUCTION
*      OF A PROGRAM DEFINED DATATYPE OBJECT. A CALL TO THE
*      SYSTEM FUNCTION DATA BUILDS A DFBLK FOR THE DATATYPE NAME
*
*      NOTE THAT THESE BLOCKS ARE BUILT IN STATIC BECAUSE PDBLK
*      LENGTH IS GOT FROM DFLEN FIELD.  IF DFBLK WAS IN DYNAMIC
*      STORE THIS WOULD CAUSE TROUBLE DURING PASS TWO OF GARBAGE
*      COLLECTION.  SCBLK REFERRED TO BY DFNAM FIELD IS ALSO PUT
*      IN STATIC SO THAT THERE ARE NO RELOC. FIELDS. THIS CUTS
*      GARBAGE COLLECTION TASK APPRECIABLY FOR PDBLKS WHICH ARE
*      LIKELY TO BE PRESENT IN LARGE NUMBERS.
*
*           +------------------------------------+
*           I                FCODE               I
*           +------------------------------------+
*           I                FARGS               I
*           +------------------------------------+
*           I                DFLEN               I
*           +------------------------------------+
*           I                DFPDL               I
*           +------------------------------------+
*           I                DFNAM               I
*           +------------------------------------+
*           /                                    /
*           /                DFFLD               /
*           /                                    /
*           +------------------------------------+
*
{DFLEN{EQU{FARGS+1{{{LENGTH OF DFBLK IN BYTES
{DFPDL{EQU{DFLEN+1{{{LENGTH OF CORRESPONDING PDBLK
{DFNAM{EQU{DFPDL+1{{{POINTER TO SCBLK FOR DATATYPE NAME
{DFFLD{EQU{DFNAM+1{{{START OF VRBLK PTRS FOR FIELD NAMES
{DFFLB{EQU{DFFLD-1{{{OFFSET BEHIND DFFLD FOR FIELD FUNC
{DFSI${EQU{DFFLD{{{NUMBER OF STANDARD FIELDS IN DFBLK
*
*      THE FCODE FIELD POINTS TO THE ROUTINE B$DFC
*
*      FARGS (THE NUMBER OF ARGUMENTS) IS THE NUMBER OF FIELDS.
{{EJC{{{{
*
*      DOPE VECTOR BLOCK (DVBLK)
*
*      A DOPE VECTOR IS ASSEMBLED FOR EACH POSSIBLE OPERATOR IN
*      THE SNOBOL4 LANGUAGE AS PART OF THE CONSTANT SECTION.
*
*           +------------------------------------+
*           I                DVOPN               I
*           +------------------------------------+
*           I                DVTYP               I
*           +------------------------------------+
*           I                DVLPR               I
*           +------------------------------------+
*           I                DVRPR               I
*           +------------------------------------+
*
{DVOPN{EQU{0{{{ENTRY ADDRESS (PTR TO O$XXX)
{DVTYP{EQU{DVOPN+1{{{TYPE CODE (C$XXX, SEE CMBLK)
{DVLPR{EQU{DVTYP+1{{{LEFT PRECEDENCE (LLXXX, SEE BELOW)
{DVRPR{EQU{DVLPR+1{{{RIGHT PRECEDENCE (RRXXX, SEE BELOW)
{DVUS${EQU{DVLPR+1{{{SIZE OF UNARY OPERATOR DV
{DVBS${EQU{DVRPR+1{{{SIZE OF BINARY OPERATOR DV
{DVUBS{EQU{DVUS$+DVBS${{{SIZE OF UNOP + BINOP (SEE SCANE)
*
*      THE CONTENTS OF THE DVTYP FIELD IS COPIED INTO THE CMTYP
*      FIELD OF THE CMBLK FOR THE OPERATOR IF IT IS USED.
*
*      THE CMOPN FIELD OF AN OPERATOR CMBLK POINTS TO THE DVBLK
*      ITSELF, PROVIDING THE REQUIRED ENTRY ADDRESS POINTER PTR.
*
*      FOR NORMALLY UNDEFINED OPERATORS, THE DVOPN (AND CMOPN)
*      FIELDS CONTAIN A WORD OFFSET FROM R$UBA OF THE FUNCTION
*      BLOCK POINTER FOR THE OPERATOR (INSTEAD OF O$XXX PTR).
*      FOR CERTAIN SPECIAL OPERATORS, THE DVOPN FIELD IS NOT
*      REQUIRED AT ALL AND IS ASSEMBLED AS ZERO.
*
*      THE LEFT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
*      THE LEFT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS THE
*      PRECEDENCE OF THE OPERATOR TOWARDS ITS RIGHT OPERAND.
*
*      THE RIGHT PRECEDENCE IS USED IN COMPARING AN OPERATOR TO
*      THE RIGHT OF SOME OTHER OPERATOR. IT THEREFORE GOVERNS
*      THE PRECEDENCE OF THE OPERATOR TOWARDS ITS LEFT OPERAND.
*
*      HIGHER PRECEDENCE VALUES CORRESPOND TO A TIGHTER BINDING
*      CAPABILITY. THUS WE HAVE THE LEFT PRECEDENCE LOWER
*      (HIGHER) THAN THE RIGHT PRECEDENCE FOR RIGHT (LEFT)
*      ASSOCIATIVE BINARY OPERATORS.
*
*      THE LEFT PRECEDENCE OF UNARY OPERATORS IS SET TO AN
*      ARBITRARY HIGH VALUE. THE RIGHT VALUE IS NOT REQUIRED AND
*      CONSEQUENTLY THE DVRPR FIELD IS OMITTED FOR UNARY OPS.
{{EJC{{{{
*
*      TABLE OF OPERATOR PRECEDENCE VALUES
*
{RRASS{EQU{10{{{RIGHT     EQUAL
{LLASS{EQU{00{{{LEFT      EQUAL
{RRPMT{EQU{20{{{RIGHT     QUESTION MARK
{LLPMT{EQU{30{{{LEFT      QUESTION MARK
{RRAMP{EQU{40{{{RIGHT     AMPERSAND
{LLAMP{EQU{50{{{LEFT      AMPERSAND
{RRALT{EQU{70{{{RIGHT     VERTICAL BAR
{LLALT{EQU{60{{{LEFT      VERTICAL BAR
{RRCNC{EQU{90{{{RIGHT     BLANK
{LLCNC{EQU{80{{{LEFT      BLANK
{RRATS{EQU{110{{{RIGHT     AT
{LLATS{EQU{100{{{LEFT      AT
{RRPLM{EQU{120{{{RIGHT     PLUS, MINUS
{LLPLM{EQU{130{{{LEFT      PLUS, MINUS
{RRNUM{EQU{140{{{RIGHT     NUMBER
{LLNUM{EQU{150{{{LEFT      NUMBER
{RRDVD{EQU{160{{{RIGHT     SLASH
{LLDVD{EQU{170{{{LEFT      SLASH
{RRMLT{EQU{180{{{RIGHT     ASTERISK
{LLMLT{EQU{190{{{LEFT      ASTERISK
{RRPCT{EQU{200{{{RIGHT     PERCENT
{LLPCT{EQU{210{{{LEFT      PERCENT
{RREXP{EQU{230{{{RIGHT     EXCLAMATION
{LLEXP{EQU{220{{{LEFT      EXCLAMATION
{RRDLD{EQU{240{{{RIGHT     DOLLAR, DOT
{LLDLD{EQU{250{{{LEFT      DOLLAR, DOT
{RRNOT{EQU{270{{{RIGHT     NOT
{LLNOT{EQU{260{{{LEFT      NOT
{LLUNO{EQU{999{{{LEFT      ALL UNARY OPERATORS
*
*      PRECEDENCES ARE THE SAME AS IN BTL SNOBOL4 WITH THE
*      FOLLOWING EXCEPTIONS.
*
*      1)   BINARY QUESTION MARK IS LOWERED AND MADE LEFT ASSOC-
*           IATIVE TO REFLECT ITS NEW USE FOR PATTERN MATCHING.
*
*      2)   ALTERNATION AND CONCATENATION ARE MADE RIGHT
*           ASSOCIATIVE FOR GREATER EFFICIENCY IN PATTERN
*           CONSTRUCTION AND MATCHING RESPECTIVELY. THIS CHANGE
*           IS TRANSPARENT TO THE SNOBOL4 PROGRAMMER.
*
*      3)   THE EQUAL SIGN HAS BEEN ADDED AS A LOW PRECEDENCE
*           OPERATOR WHICH IS RIGHT ASSOCIATIVE TO REFLECT ITS
*           MORE GENERAL USAGE IN THIS VERSION OF SNOBOL4.
{{EJC{{{{
*
*      EXTERNAL FUNCTION BLOCK (EFBLK)
*
*      AN EXTERNAL FUNCTION BLOCK IS USED TO CONTROL THE CALLING
*      OF AN EXTERNAL FUNCTION. IT IS BUILT BY A CALL TO LOAD.
*
*           +------------------------------------+
*           I                FCODE               I
*           +------------------------------------+
*           I                FARGS               I
*           +------------------------------------+
*           I                EFLEN               I
*           +------------------------------------+
*           I                EFUSE               I
*           +------------------------------------+
*           I                EFCOD               I
*           +------------------------------------+
*           I                EFVAR               I
*           +------------------------------------+
*           I                EFRSL               I
*           +------------------------------------+
*           /                                    /
*           /                EFTAR               /
*           /                                    /
*           +------------------------------------+
*
{EFLEN{EQU{FARGS+1{{{LENGTH OF EFBLK IN BYTES
{EFUSE{EQU{EFLEN+1{{{USE COUNT (FOR OPSYN)
{EFCOD{EQU{EFUSE+1{{{PTR TO CODE (FROM SYSLD)
{EFVAR{EQU{EFCOD+1{{{PTR TO ASSOCIATED VRBLK
{EFRSL{EQU{EFVAR+1{{{RESULT TYPE (SEE BELOW)
{EFTAR{EQU{EFRSL+1{{{ARGUMENT TYPES (SEE BELOW)
{EFSI${EQU{EFTAR{{{NUMBER OF STANDARD FIELDS IN EFBLK
*
*      THE FCODE FIELD POINTS TO THE ROUTINE B$EFC.
*
*      EFUSE IS USED TO KEEP TRACK OF MULTIPLE USE WHEN OPSYN
*      IS EMPLOYED. THE FUNCTION IS AUTOMATICALLY UNLOADED
*      WHEN THERE ARE NO MORE REFERENCES TO THE FUNCTION.
*
*      EFRSL AND EFTAR ARE TYPE CODES AS FOLLOWS.
*
*           0                TYPE IS UNCONVERTED
*           1                TYPE IS STRING
*           2                TYPE IS INTEGER
*           3                TYPE IS REAL
{{EJC{{{{
*
*      EXPRESSION VARIABLE BLOCK (EVBLK)
*
*      IN THIS VERSION OF SPITBOL, AN EXPRESSION CAN BE USED IN
*      ANY POSITION WHICH WOULD NORMALLY EXPECT A NAME (FOR
*      EXAMPLE ON THE LEFT SIDE OF EQUALS OR AS THE RIGHT
*      ARGUMENT OF BINARY DOT). THIS CORRESPONDS TO THE CREATION
*      OF A PSEUDO-VARIABLE WHICH IS REPRESENTED BY A POINTER TO
*      AN EXPRESSION VARIABLE BLOCK AS FOLLOWS.
*
*           +------------------------------------+
*           I                EVTYP               I
*           +------------------------------------+
*           I                EVEXP               I
*           +------------------------------------+
*           I                EVVAR               I
*           +------------------------------------+
*
{EVTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$EVT
{EVEXP{EQU{EVTYP+1{{{POINTER TO EXBLK FOR EXPRESSION
{EVVAR{EQU{EVEXP+1{{{POINTER TO TRBEV DUMMY TRBLK
{EVSI${EQU{EVVAR+1{{{SIZE OF EVBLK
*
*      THE NAME OF AN EXPRESSION VARIABLE IS REPRESENTED BY A
*      BASE POINTER TO THE EVBLK AND AN OFFSET OF EVVAR. THIS
*      VALUE APPEARS TO BE TRAPPED BY THE DUMMY TRBEV BLOCK.
*
*      NOTE THAT THERE IS NO NEED TO ALLOW FOR THE CASE OF AN
*      EXPRESSION VARIABLE WHICH REFERENCES AN SEBLK SINCE A
*      VARIABLE WHICH IS OF THE FORM *VAR IS EQUIVALENT TO VAR.
{{EJC{{{{
*
*      EXPRESSION BLOCK (EXBLK)
*
*      AN EXPRESSION BLOCK IS BUILT FOR EACH EXPRESSION
*      REFERENCED IN A PROGRAM OR CREATED BY EVAL OR CONVERT
*      DURING EXECUTION OF A PROGRAM.
*
*           +------------------------------------+
*           I                EXTYP               I
*           +------------------------------------+
*           I                EXSTM               I
*           +------------------------------------+
*           I                EXLEN               I
*           +------------------------------------+
*           I                EXFLC               I
*           +------------------------------------+
*           /                                    /
*           /                EXCOD               /
*           /                                    /
*           +------------------------------------+
*
{EXTYP{EQU{0{{{PTR TO ROUTINE B$EXL TO LOAD EXPR
{EXSTM{EQU{CDSTM{{{STORES STMNT NO. DURING EVALUATION
{EXLEN{EQU{EXSTM+1{{{LENGTH OF EXBLK IN BYTES
{EXFLC{EQU{EXLEN+1{{{FAILURE CODE (=O$FEX)
{EXCOD{EQU{EXFLC+1{{{PSEUDO-CODE FOR EXPRESSION
{EXSI${EQU{EXCOD{{{NUMBER OF STANDARD FIELDS IN EXBLK
*
*      THERE ARE TWO CASES FOR EXCOD DEPENDING ON WHETHER THE
*      EXPRESSION CAN BE EVALUATED BY NAME (SEE DESCRIPTION
*      OF CDBLK FOR DETAILS OF CODE FOR EXPRESSIONS).
*
*      IF THE EXPRESSION CAN BE EVALUATED BY NAME WE HAVE.
*
*                            (CODE FOR EXPR BY NAME)
*                            =O$RNM
*
*      IF THE EXPRESSION CAN ONLY BE EVALUATED BY VALUE.
*
*                            (CODE FOR EXPR BY VALUE)
*                            =O$RVL
{{EJC{{{{
*
*      FIELD FUNCTION BLOCK (FFBLK)
*
*      A FIELD FUNCTION BLOCK IS USED TO CONTROL THE SELECTION
*      OF A FIELD FROM A PROGRAM DEFINED DATATYPE BLOCK.
*      A CALL TO DATA CREATES AN FFBLK FOR EACH FIELD.
*
*           +------------------------------------+
*           I                FCODE               I
*           +------------------------------------+
*           I                FARGS               I
*           +------------------------------------+
*           I                FFDFP               I
*           +------------------------------------+
*           I                FFNXT               I
*           +------------------------------------+
*           I                FFOFS               I
*           +------------------------------------+
*
{FFDFP{EQU{FARGS+1{{{POINTER TO ASSOCIATED DFBLK
{FFNXT{EQU{FFDFP+1{{{PTR TO NEXT FFBLK ON CHAIN OR ZERO
{FFOFS{EQU{FFNXT+1{{{OFFSET (BYTES) TO FIELD IN PDBLK
{FFSI${EQU{FFOFS+1{{{SIZE OF FFBLK IN WORDS
*
*      THE FCODE FIELD POINTS TO THE ROUTINE B$FFC.
*
*      FARGS ALWAYS CONTAINS ONE.
*
*      FFDFP IS USED TO VERIFY THAT THE CORRECT PROGRAM DEFINED
*      DATATYPE IS BEING ACCESSED BY THIS CALL.
*      FFDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
*
*      FFOFS IS USED TO SELECT THE APPROPRIATE FIELD. NOTE THAT
*      IT IS AN ACTUAL OFFSET (NOT A FIELD NUMBER)
*
*      FFNXT IS USED TO POINT TO THE NEXT FFBLK OF THE SAME NAME
*      IN THE CASE WHERE THERE ARE SEVERAL FIELDS OF THE SAME
*      NAME FOR DIFFERENT DATATYPES. ZERO MARKS THE END OF CHAIN
{{EJC{{{{
*
*      INTEGER CONSTANT BLOCK (ICBLK)
*
*      AN ICBLK IS CREATED FOR EVERY INTEGER REFERENCED OR
*      CREATED BY A PROGRAM. NOTE HOWEVER THAT CERTAIN INTERNAL
*      INTEGER VALUES ARE STORED AS ADDRESSES (E.G. THE LENGTH
*      FIELD IN A STRING CONSTANT BLOCK)
*
*           +------------------------------------+
*           I                ICGET               I
*           +------------------------------------+
*           *                ICVAL               *
*           +------------------------------------+
*
{ICGET{EQU{0{{{PTR TO ROUTINE B$ICL TO LOAD INT
{ICVAL{EQU{ICGET+1{{{INTEGER VALUE
{ICSI${EQU{ICVAL+CFP$I{{{SIZE OF ICBLK
*
*      THE LENGTH OF THE ICVAL FIELD IS CFP$I.
{{EJC{{{{
*
*      KEYWORD VARIABLE BLOCK (KVBLK)
*
*      A KVBLK IS USED TO REPRESENT A KEYWORD PSEUDO-VARIABLE.
*      A KVBLK IS BUILT FOR EACH KEYWORD REFERENCE (KWNAM).
*
*           +------------------------------------+
*           I                KVTYP               I
*           +------------------------------------+
*           I                KVVAR               I
*           +------------------------------------+
*           I                KVNUM               I
*           +------------------------------------+
*
{KVTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$KVT
{KVVAR{EQU{KVTYP+1{{{POINTER TO DUMMY BLOCK TRBKV
{KVNUM{EQU{KVVAR+1{{{KEYWORD NUMBER
{KVSI${EQU{KVNUM+1{{{SIZE OF KVBLK
*
*      THE NAME OF A KEYWORD VARIABLE IS REPRESENTED BY A
*      BASE POINTER TO THE KVBLK AND AN OFFSET OF KVVAR. THE
*      VALUE APPEARS TO BE TRAPPED BY THE POINTER TO TRBKV.
{{EJC{{{{
*
*      NAME BLOCK (NMBLK)
*
*      A NAME BLOCK IS USED WHEREVER A NAME MUST BE STORED AS
*      A VALUE FOLLOWING USE OF THE UNARY DOT OPERATOR.
*
*           +------------------------------------+
*           I                NMTYP               I
*           +------------------------------------+
*           I                NMBAS               I
*           +------------------------------------+
*           I                NMOFS               I
*           +------------------------------------+
*
{NMTYP{EQU{0{{{PTR TO ROUTINE B$NML TO LOAD NAME
{NMBAS{EQU{NMTYP+1{{{BASE POINTER FOR VARIABLE
{NMOFS{EQU{NMBAS+1{{{OFFSET FOR VARIABLE
{NMSI${EQU{NMOFS+1{{{SIZE OF NMBLK
*
*      THE ACTUAL FIELD REPRESENTING THE CONTENTS OF THE NAME
*      IS FOUND NMOFS BYTES PAST THE ADDRESS IN NMBAS.
*
*      THE NAME IS SPLIT INTO BASE AND OFFSET FORM TO AVOID
*      CREATION OF A POINTER INTO THE MIDDLE OF A BLOCK WHICH
*      COULD NOT BE HANDLED PROPERLY BY THE GARBAGE COLLECTOR.
*
*      A NAME MAY BE BUILT FOR ANY VARIABLE (SEE SECTION ON
*      REPRESENTATIONS OF VARIABLES) THIS INCLUDES THE
*      CASES OF PSEUDO-VARIABLES.
{{EJC{{{{
*
*      PATTERN BLOCK, NO PARAMETERS (P0BLK)
*
*      A P0BLK IS USED TO REPRESENT PATTERN NODES WHICH DO
*      NOT REQUIRE THE USE OF ANY PARAMETER VALUES.
*
*           +------------------------------------+
*           I                PCODE               I
*           +------------------------------------+
*           I                PTHEN               I
*           +------------------------------------+
*
{PCODE{EQU{0{{{PTR TO MATCH ROUTINE (P$XXX)
{PTHEN{EQU{PCODE+1{{{POINTER TO SUBSEQUENT NODE
{PASI${EQU{PTHEN+1{{{SIZE OF P0BLK
*
*      PTHEN POINTS TO THE PATTERN BLOCK FOR THE SUBSEQUENT
*      NODE TO BE MATCHED. THIS IS A POINTER TO THE PATTERN
*      BLOCK NDNTH IF THERE IS NO SUBSEQUENT (END OF PATTERN)
*
*      PCODE IS A POINTER TO THE MATCH ROUTINE FOR THE NODE.
{{EJC{{{{
*
*      PATTERN BLOCK (ONE PARAMETER)
*
*      A P1BLK IS USED TO REPRESENT PATTERN NODES WHICH
*      REQUIRE ONE PARAMETER VALUE.
*
*           +------------------------------------+
*           I                PCODE               I
*           +------------------------------------+
*           I                PTHEN               I
*           +------------------------------------+
*           I                PARM1               I
*           +------------------------------------+
*
{PARM1{EQU{PTHEN+1{{{FIRST PARAMETER VALUE
{PBSI${EQU{PARM1+1{{{SIZE OF P1BLK IN WORDS
*
*      SEE P0BLK FOR DEFINITIONS OF PCODE, PTHEN
*
*      PARM1 CONTAINS A PARAMETER VALUE USED IN MATCHING THE
*      NODE. FOR EXAMPLE, IN A LEN PATTERN, IT IS THE INTEGER
*      ARGUMENT TO LEN. THE DETAILS OF THE USE OF THE PARAMETER
*      FIELD ARE INCLUDED IN THE DESCRIPTION OF THE INDIVIDUAL
*      MATCH ROUTINES. PARM1 IS ALWAYS AN ADDRESS POINTER WHICH
*      IS PROCESSED BY THE GARBAGE COLLECTOR.
{{EJC{{{{
*
*      PATTERN BLOCK (TWO PARAMETERS)
*
*      A P2BLK IS USED TO REPRESENT PATTERN NODES WHICH
*      REQUIRE TWO PARAMETER VALUES.
*
*           +------------------------------------+
*           I                PCODE               I
*           +------------------------------------+
*           I                PTHEN               I
*           +------------------------------------+
*           I                PARM1               I
*           +------------------------------------+
*           I                PARM2               I
*           +------------------------------------+
*
{PARM2{EQU{PARM1+1{{{SECOND PARAMETER VALUE
{PCSI${EQU{PARM2+1{{{SIZE OF P2BLK IN WORDS
*
*      SEE P1BLK FOR DEFINITIONS OF PCODE, PTHEN, PARM1
*
*      PARM2 IS A PARAMETER WHICH PERFORMS THE SAME SORT OF
*      FUNCTION AS PARM1 (SEE DESCRIPTION OF P1BLK).
*
*      PARM2 IS A NON-RELOCATABLE FIELD AND IS NOT
*      PROCESSED BY THE GARBAGE COLLECTOR. ACCORDINGLY, IT MAY
*      NOT CONTAIN A POINTER TO A BLOCK IN DYNAMIC MEMORY.
{{EJC{{{{
*
*      PROGRAM-DEFINED DATATYPE BLOCK
*
*      A PDBLK REPRESENTS THE DATA ITEM FORMED BY A CALL TO A
*      DATATYPE FUNCTION AS DEFINED BY THE SYSTEM FUNCTION DATA.
*
*           +------------------------------------+
*           I                PDTYP               I
*           +------------------------------------+
*           I                IDVAL               I
*           +------------------------------------+
*           I                PDDFP               I
*           +------------------------------------+
*           /                                    /
*           /                PDFLD               /
*           /                                    /
*           +------------------------------------+
*
{PDTYP{EQU{0{{{PTR TO DUMMY ROUTINE B$PDT
{PDDFP{EQU{IDVAL+1{{{PTR TO ASSOCIATED DFBLK
{PDFLD{EQU{PDDFP+1{{{START OF FIELD VALUE POINTERS
{PDFOF{EQU{DFFLD-PDFLD{{{DIFFERENCE IN OFFSET TO FIELD PTRS
{PDSI${EQU{PDFLD{{{SIZE OF STANDARD FIELDS IN PDBLK
{PDDFS{EQU{DFSI$-PDSI${{{DIFFERENCE IN DFBLK, PDBLK SIZES
*
*      THE PDDFP POINTER MAY BE USED TO DETERMINE THE DATATYPE
*      AND THE NAMES OF THE FIELDS IF REQUIRED. THE DFBLK ALSO
*      CONTAINS THE LENGTH OF THE PDBLK IN BYTES (FIELD DFPDL).
*      PDDFP IS NON-RELOC. BECAUSE DFBLK IS IN STATIC
*
*      PDFLD VALUES ARE STORED IN ORDER FROM LEFT TO RIGHT.
*      THEY CONTAIN VALUES OR POINTERS TO TRBLK CHAINS.
{{EJC{{{{
*
*      PROGRAM DEFINED FUNCTION BLOCK (PFBLK)
*
*      A PFBLK IS CREATED FOR EACH CALL TO THE DEFINE FUNCTION
*      AND A POINTER TO THE PFBLK PLACED IN THE PROPER VRBLK.
*
*           +------------------------------------+
*           I                FCODE               I
*           +------------------------------------+
*           I                FARGS               I
*           +------------------------------------+
*           I                PFLEN               I
*           +------------------------------------+
*           I                PFVBL               I
*           +------------------------------------+
*           I                PFNLO               I
*           +------------------------------------+
*           I                PFCOD               I
*           +------------------------------------+
*           I                PFCTR               I
*           +------------------------------------+
*           I                PFRTR               I
*           +------------------------------------+
*           /                                    /
*           /                PFARG               /
*           /                                    /
*           +------------------------------------+
*
{PFLEN{EQU{FARGS+1{{{LENGTH OF PFBLK IN BYTES
{PFVBL{EQU{PFLEN+1{{{POINTER TO VRBLK FOR FUNCTION NAME
{PFNLO{EQU{PFVBL+1{{{NUMBER OF LOCALS
{PFCOD{EQU{PFNLO+1{{{PTR TO CDBLK FOR FIRST STATEMENT
{PFCTR{EQU{PFCOD+1{{{TRBLK PTR IF CALL TRACED ELSE 0
{PFRTR{EQU{PFCTR+1{{{TRBLK PTR IF RETURN TRACED ELSE 0
{PFARG{EQU{PFRTR+1{{{VRBLK PTRS FOR ARGUMENTS AND LOCALS
{PFAGB{EQU{PFARG-1{{{OFFSET BEHIND PFARG FOR ARG, LOCAL
{PFSI${EQU{PFARG{{{NUMBER OF STANDARD FIELDS IN PFBLK
*
*      THE FCODE FIELD POINTS TO THE ROUTINE B$PFC.
*
*      PFARG IS STORED IN THE FOLLOWING ORDER.
*
*           ARGUMENTS (LEFT TO RIGHT)
*           LOCALS (LEFT TO RIGHT)
{{EJC{{{{
*
*      REAL CONSTANT BLOCK (RCBLK)
*
*      AN RCBLK IS CREATED FOR EVERY REAL REFERENCED OR
*      CREATED BY A PROGRAM.
*
*           +------------------------------------+
*           I                RCGET               I
*           +------------------------------------+
*           *                RCVAL               *
*           +------------------------------------+
*
{RCGET{EQU{0{{{PTR TO ROUTINE B$RCL TO LOAD REAL
{RCVAL{EQU{RCGET+1{{{REAL VALUE
{RCSI${EQU{RCVAL+CFP$R{{{SIZE OF RCBLK
*
*      THE LENGTH OF THE RCVAL FIELD IS CFP$R.
{{EJC{{{{
*
*      STRING CONSTANT BLOCK (SCBLK)
*
*      AN SCBLK IS BUILT FOR EVERY STRING REFERENCED OR CREATED
*      BY A PROGRAM.
*
*           +------------------------------------+
*           I                SCGET               I
*           +------------------------------------+
*           I                SCLEN               I
*           +------------------------------------+
*           /                                    /
*           /                SCHAR               /
*           /                                    /
*           +------------------------------------+
*
{SCGET{EQU{0{{{PTR TO ROUTINE B$SCL TO LOAD STRING
{SCLEN{EQU{SCGET+1{{{LENGTH OF STRING IN CHARACTERS
{SCHAR{EQU{SCLEN+1{{{CHARACTERS OF STRING
{SCSI${EQU{SCHAR{{{SIZE OF STANDARD FIELDS IN SCBLK
*
*      THE CHARACTERS OF THE STRING ARE STORED LEFT JUSTIFIED.
*      THE FINAL WORD IS PADDED ON THE RIGHT WITH ZEROS.
*      (I.E. THE CHARACTER WHOSE INTERNAL CODE IS ZERO).
*
*      THE VALUE OF SCLEN MAY NOT EXCEED MXLEN. THIS ENSURES
*      THAT CHARACTER OFFSETS (E.G. THE PATTERN MATCH CURSOR)
*      CAN BE CORRECTLY PROCESSED BY THE GARBAGE COLLECTOR.
*
*      NOTE THAT THE OFFSET TO THE CHARACTERS OF THE STRING
*      IS GIVEN IN BYTES BY CFP$F AND THAT THIS VALUE IS
*      AUTOMATICALLY ALLOWED FOR IN PLC, PSC.
*      NOTE THAT FOR A SPITBOL SCBLK, THE VALUE OF CFP$F
*      IS GIVEN BY CFP$B*SCHAR.
{{EJC{{{{
*
*      SIMPLE EXPRESSION BLOCK (SEBLK)
*
*      AN SEBLK IS USED TO REPRESENT AN EXPRESSION OF THE FORM
*      *(NATURAL VARIABLE). ALL OTHER EXPRESSIONS ARE EXBLKS.
*
*           +------------------------------------+
*           I                SETYP               I
*           +------------------------------------+
*           I                SEVAR               I
*           +------------------------------------+
*
{SETYP{EQU{0{{{PTR TO ROUTINE B$SEL TO LOAD EXPR
{SEVAR{EQU{SETYP+1{{{PTR TO VRBLK FOR VARIABLE
{SESI${EQU{SEVAR+1{{{LENGTH OF SEBLK IN WORDS
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCK (SVBLK)
*
*      AN SVBLK IS ASSEMBLED IN THE CONSTANT SECTION FOR EACH
*      VARIABLE WHICH SATISFIES ONE OF THE FOLLOWING CONDITIONS.
*
*      1)   IT IS THE NAME OF A SYSTEM FUNCTION
*      2)   IT HAS AN INITIAL VALUE
*      3)   IT HAS A KEYWORD ASSOCIATION
*      4)   IT HAS A STANDARD I/O ASSOCIATION
*      6)   IT HAS A STANDARD LABEL ASSOCIATION
*
*      IF VRBLKS ARE CONSTRUCTED FOR ANY OF THESE VARIABLES,
*      THEN THE VRSVP FIELD POINTS TO THE SVBLK (SEE VRBLK)
*
*           +------------------------------------+
*           I                SVBIT               I
*           +------------------------------------+
*           I                SVLEN               I
*           +------------------------------------+
*           I                SVCHS               I
*           +------------------------------------+
*           I                SVKNM               I
*           +------------------------------------+
*           I                SVFNC               I
*           +------------------------------------+
*           I                SVNAR               I
*           +------------------------------------+
*           I                SVLBL               I
*           +------------------------------------+
*           I                SVVAL               I
*           +------------------------------------+
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCK (CONTINUED)
*
{SVBIT{EQU{0{{{BIT STRING INDICATING ATTRIBUTES
{SVLEN{EQU{1{{{(=SCLEN) LENGTH OF NAME IN CHARS
{SVCHS{EQU{2{{{(=SCHAR) CHARACTERS OF NAME
{SVSI${EQU{2{{{NUMBER OF STANDARD FIELDS IN SVBLK
{SVPRE{EQU{1{{{SET IF PREEVALUATION PERMITTED
{SVFFC{EQU{SVPRE+SVPRE{{{SET ON IF FAST CALL PERMITTED
{SVCKW{EQU{SVFFC+SVFFC{{{SET ON IF KEYWORD VALUE CONSTANT
{SVPRD{EQU{SVCKW+SVCKW{{{SET ON IF PREDICATE FUNCTION
{SVNBT{EQU{4{{{NUMBER OF BITS TO RIGHT OF SVKNM
{SVKNM{EQU{SVPRD+SVPRD{{{SET ON IF KEYWORD ASSOCIATION
{SVFNC{EQU{SVKNM+SVKNM{{{SET ON IF SYSTEM FUNCTION
{SVNAR{EQU{SVFNC+SVFNC{{{SET ON IF SYSTEM FUNCTION
{SVLBL{EQU{SVNAR+SVNAR{{{SET ON IF SYSTEM LABEL
{SVVAL{EQU{SVLBL+SVLBL{{{SET ON IF PREDEFINED VALUE
*
*      NOTE THAT THE LAST FIVE BITS CORRESPOND IN ORDER
*      TO THE FIELDS WHICH ARE PRESENT (SEE PROCEDURE GTNVR).
*
*      THE FOLLOWING DEFINITIONS ARE USED IN THE SVBLK TABLE
*
{SVFNF{EQU{SVFNC+SVNAR{{{FUNCTION WITH NO FAST CALL
{SVFNN{EQU{SVFNF+SVFFC{{{FUNCTION WITH FAST CALL, NO PREEVAL
{SVFNP{EQU{SVFNN+SVPRE{{{FUNCTION ALLOWING PREEVALUATION
{SVFPR{EQU{SVFNN+SVPRD{{{PREDICATE FUNCTION
{SVFNK{EQU{SVFNN+SVKNM{{{NO PREEVAL FUNC + KEYWORD
{SVKWV{EQU{SVKNM+SVVAL{{{KEYWORD + VALUE
{SVKWC{EQU{SVCKW+SVKNM{{{KEYWORD WITH CONSTANT VALUE
{SVKVC{EQU{SVKWV+SVCKW{{{CONSTANT KEYWORD + VALUE
{SVKVL{EQU{SVKVC+SVLBL{{{CONSTANT KEYWORD + VALUE + LABEL
{SVFPK{EQU{SVFNP+SVKVC{{{PREEVAL FCN + CONST KEYWD + VAL
*
*      THE SVPRE BIT ALLOWS THE COMPILER TO PREEVALUATE A CALL
*      TO THE ASSOCIATED SYSTEM FUNCTION IF ALL THE ARGUMENTS
*      ARE THEMSELVES CONSTANTS. FUNCTIONS IN THIS CATEGORY
*      MUST HAVE NO SIDE EFFECTS AND MUST NEVER CAUSE FAILURE.
*      THE CALL MAY GENERATE AN ERROR CONDITION.
*
*      THE SVFFC BIT ALLOWS THE COMPILER TO GENERATE THE SPECIAL
*      FAST CALL AFTER ADJUSTING THE NUMBER OF ARGUMENTS. ONLY
*      THE ITEM AND APPLY FUNCTIONS FALL OUTSIDE THIS CATEGORY.
*
*      THE SVCKW BIT IS SET IF THE ASSOCIATED KEYWORD VALUE IS
*      A CONSTANT, THUS ALLOWING PREEVALUATION FOR A VALUE CALL.
*
*      THE SVPRD BIT IS SET ON FOR ALL PREDICATE FUNCTIONS TO
*      ENABLE THE SPECIAL CONCATENATION CODE OPTIMIZATION.
{{EJC{{{{
*
*      SVBLK (CONTINUED)
*
*      SVKNM                 KEYWORD NUMBER
*
*           SVKNM IS PRESENT ONLY FOR A STANDARD KEYWORD ASSOC.
*           IT CONTAINS A KEYWORD NUMBER AS DEFINED BY THE
*           KEYWORD NUMBER TABLE GIVEN LATER ON.
*
*      SVFNC                 SYSTEM FUNCTION POINTER
*
*           SVFNC IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
*           IT IS A POINTER TO THE ACTUAL CODE FOR THE SYSTEM
*           FUNCTION. THE GENERATED CODE FOR A FAST CALL IS A
*           POINTER TO THE SVFNC FIELD OF THE SVBLK FOR THE
*           FUNCTION. THE VRFNC FIELD OF THE VRBLK POINTS TO
*           THIS SAME FIELD, IN WHICH CASE, IT SERVES AS THE
*           FCODE FIELD FOR THE FUNCTION CALL.
*
*      SVNAR                 NUMBER OF FUNCTION ARGUMENTS
*
*           SVNAR IS PRESENT ONLY FOR A SYSTEM FUNCTION ASSOC.
*           IT IS THE NUMBER OF ARGUMENTS REQUIRED FOR A CALL
*           TO THE SYSTEM FUNCTION. THE COMPILER USES THIS
*           VALUE TO ADJUST THE NUMBER OF ARGUMENTS IN A FAST
*           CALL AND IN THE CASE OF A FUNCTION CALLED THROUGH
*           THE VRFNC FIELD OF THE VRBLK, THE SVNAR FIELD
*           SERVES AS THE FARGS FIELD FOR O$FNC. A SPECIAL
*           CASE OCCURS IF THIS VALUE IS SET TO 999. THIS IS
*           USED TO INDICATE THAT THE FUNCTION HAS A VARIABLE
*           NUMBER OF ARGUMENTS AND CAUSES O$FNC TO PASS CONTROL
*           WITHOUT ADJUSTING THE ARGUMENT COUNT. THE ONLY
*           PREDEFINED FUNCTIONS USING THIS ARE APPLY AND ITEM.
*
*      SVLBL                 SYSTEM LABEL POINTER
*
*           SVLBL IS PRESENT ONLY FOR A STANDARD LABEL ASSOC.
*           IT IS A POINTER TO A SYSTEM LABEL ROUTINE (L$XXX).
*           THE VRLBL FIELD OF THE CORRESPONDING VRBLK POINTS TO
*           THE SVLBL FIELD OF THE SVBLK.
*
*      SVVAL                 SYSTEM VALUE POINTER
*
*           SVVAL IS PRESENT ONLY FOR A STANDARD VALUE.
*           IT IS A POINTER TO THE PATTERN NODE (NDXXX) WHICH
*           IS THE STANDARD INITIAL VALUE OF THE VARIABLE.
*           THIS VALUE IS COPIED TO THE VRVAL FIELD OF THE VRBLK
{{EJC{{{{
*
*      SVBLK (CONTINUED)
*
*      KEYWORD NUMBER TABLE
*
*      THE FOLLOWING TABLE GIVES SYMBOLIC NAMES FOR KEYWORD
*      NUMBERS. THESE VALUES ARE STORED IN THE SVKNM FIELD OF
*      SVBLKS AND IN THE KVNUM FIELD OF KVBLKS. SEE ALSO
*      PROCEDURES ASIGN, ACESS AND KWNAM.
*
*      UNPROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
*
{K$ABE{EQU{0{{{ABEND
{K$ANC{EQU{K$ABE+CFP$B{{{ANCHOR
{K$CAS{EQU{K$ANC+CFP$B{{{CASE
{K$COD{EQU{K$CAS+CFP$B{{{CODE
{K$DMP{EQU{K$COD+CFP$B{{{DUMP
{K$ERL{EQU{K$DMP+CFP$B{{{ERRLIMIT
{K$ERT{EQU{K$ERL+CFP$B{{{ERRTYPE
{K$FTR{EQU{K$ERT+CFP$B{{{FTRACE
{K$INP{EQU{K$FTR+CFP$B{{{INPUT
{K$MXL{EQU{K$INP+CFP$B{{{MAXLENGTH
{K$OUP{EQU{K$MXL+CFP$B{{{OUTPUT
{K$PFL{EQU{K$OUP+CFP$B{{{PROFILE
{K$TRA{EQU{K$PFL+CFP$B{{{TRACE
{K$TRM{EQU{K$TRA+CFP$B{{{TRIM
*
*      PROTECTED KEYWORDS WITH ONE WORD INTEGER VALUES
*
{K$FNC{EQU{K$TRM+CFP$B{{{FNCLEVEL
{K$LST{EQU{K$FNC+CFP$B{{{LASTNO
{K$STN{EQU{K$LST+CFP$B{{{STNO
*
*      KEYWORDS WITH CONSTANT PATTERN VALUES
*
{K$ABO{EQU{K$STN+CFP$B{{{ABORT
{K$ARB{EQU{K$ABO+PASI${{{ARB
{K$BAL{EQU{K$ARB+PASI${{{BAL
{K$FAL{EQU{K$BAL+PASI${{{FAIL
{K$FEN{EQU{K$FAL+PASI${{{FENCE
{K$REM{EQU{K$FEN+PASI${{{REM
{K$SUC{EQU{K$REM+PASI${{{SUCCEED
{{EJC{{{{
*
*      KEYWORD NUMBER TABLE (CONTINUED)
*
*      SPECIAL KEYWORDS
*
{K$ALP{EQU{K$SUC+1{{{ALPHABET
{K$RTN{EQU{K$ALP+1{{{RTNTYPE
{K$STC{EQU{K$RTN+1{{{STCOUNT
{K$ETX{EQU{K$STC+1{{{ERRTEXT
{K$STL{EQU{K$ETX+1{{{STLIMIT
*
*      RELATIVE OFFSETS OF SPECIAL KEYWORDS
*
{K$$AL{EQU{K$ALP-K$ALP{{{ALPHABET
{K$$RT{EQU{K$RTN-K$ALP{{{RTNTYPE
{K$$SC{EQU{K$STC-K$ALP{{{STCOUNT
{K$$ET{EQU{K$ETX-K$ALP{{{ERRTEXT
{K$$SL{EQU{K$STL-K$ALP{{{STLIMIT
*
*      SYMBOLS USED IN ASIGN AND ACESS PROCEDURES
*
{K$P$${EQU{K$FNC{{{FIRST PROTECTED KEYWORD
{K$V$${EQU{K$ABO{{{FIRST KEYWORD WITH CONSTANT VALUE
{K$S$${EQU{K$ALP{{{FIRST KEYWORD WITH SPECIAL ACESS
{{EJC{{{{
*
*      FORMAT OF A TABLE BLOCK (TBBLK)
*
*      A TABLE BLOCK IS USED TO REPRESENT A TABLE VALUE.
*      IT IS BUILT BY A CALL TO THE TABLE OR CONVERT FUNCTIONS.
*
*           +------------------------------------+
*           I                TBTYP               I
*           +------------------------------------+
*           I                IDVAL               I
*           +------------------------------------+
*           I                TBLEN               I
*           +------------------------------------+
*           +------------------------------------+
*           I                TBINV               I
*           +------------------------------------+
*           /                                    /
*           /                TBBUK               /
*           /                                    /
*           +------------------------------------+
*
{TBTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$TBT
{TBLEN{EQU{OFFS2{{{LENGTH OF TBBLK IN BYTES
{TBINV{EQU{OFFS3{{{DEFAULT INITIAL LOOKUP VALUE
{TBBUK{EQU{TBINV+1{{{START OF HASH BUCKET POINTERS
{TBSI${EQU{TBBUK{{{SIZE OF STANDARD FIELDS IN TBBLK
{TBNBK{EQU{11{{{DEFAULT NO. OF BUCKETS
*
*      THE TABLE BLOCK IS A HASH TABLE WHICH POINTS TO CHAINS
*      OF TABLE ELEMENT BLOCKS REPRESENTING THE ELEMENTS
*      IN THE TABLE WHICH HASH INTO THE SAME BUCKET.
*
*      TBBUK ENTRIES EITHER POINT TO THE FIRST TEBLK ON THE
*      CHAIN OR THEY POINT TO THE TBBLK ITSELF TO INDICATE THE
*      END OF THE CHAIN.
{{EJC{{{{
*
*      TABLE ELEMENT BLOCK (TEBLK)
*
*      A TABLE ELEMENT IS USED TO REPRESENT A SINGLE ENTRY IN
*      A TABLE (SEE DESCRIPTION OF TBBLK FORMAT FOR HASH TABLE)
*
*           +------------------------------------+
*           I                TETYP               I
*           +------------------------------------+
*           I                TESUB               I
*           +------------------------------------+
*           I                TEVAL               I
*           +------------------------------------+
*           I                TENXT               I
*           +------------------------------------+
*
{TETYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$TET
{TESUB{EQU{TETYP+1{{{SUBSCRIPT VALUE
{TEVAL{EQU{TESUB+1{{{(=VRVAL) TABLE ELEMENT VALUE
{TENXT{EQU{TEVAL+1{{{LINK TO NEXT TEBLK
*      SEE S$CNV WHERE RELATION IS ASSUMED WITH TENXT AND TBBUK
{TESI${EQU{TENXT+1{{{SIZE OF TEBLK IN WORDS
*
*      TENXT POINTS TO THE NEXT TEBLK ON THE HASH CHAIN FROM THE
*      TBBUK CHAIN FOR THIS HASH INDEX. AT THE END OF THE CHAIN,
*      TENXT POINTS BACK TO THE START OF THE TBBLK.
*
*      TEVAL CONTAINS A DATA POINTER OR A TRBLK POINTER.
*
*      TESUB CONTAINS A DATA POINTER.
{{EJC{{{{
*
*      TRAP BLOCK (TRBLK)
*
*      A TRAP BLOCK IS USED TO REPRESENT A TRACE OR INPUT OR
*      OUTPUT ASSOCIATION IN RESPONSE TO A CALL TO THE TRACE
*      INPUT OR OUTPUT SYSTEM FUNCTIONS. SEE BELOW FOR DETAILS
*
*           +------------------------------------+
*           I                TRIDN               I
*           +------------------------------------+
*           I                TRTYP               I
*           +------------------------------------+
*           I  TRVAL OR TRLBL OR TRNXT OR TRKVR  I
*           +------------------------------------+
*           I       TRTAG OR TRTER OR TRTRF      I
*           +------------------------------------+
*           I            TRFNC OR TRFPT          I
*           +------------------------------------+
*
{TRIDN{EQU{0{{{POINTER TO DUMMY ROUTINE B$TRT
{TRTYP{EQU{TRIDN+1{{{TRAP TYPE CODE
{TRVAL{EQU{TRTYP+1{{{VALUE OF TRAPPED VARIABLE (=VRVAL)
{TRNXT{EQU{TRVAL{{{PTR TO NEXT TRBLK ON TRBLK CHAIN
{TRLBL{EQU{TRVAL{{{PTR TO ACTUAL LABEL (TRACED LABEL)
{TRKVR{EQU{TRVAL{{{VRBLK POINTER FOR KEYWORD TRACE
{TRTAG{EQU{TRVAL+1{{{TRACE TAG
{TRTER{EQU{TRTAG{{{PTR TO TERMINAL VRBLK OR NULL
{TRTRF{EQU{TRTAG{{{PTR TO TRBLK HOLDING FCBLK PTR
{TRFNC{EQU{TRTAG+1{{{TRACE FUNCTION VRBLK (ZERO IF NONE)
{TRFPT{EQU{TRFNC{{{FCBLK PTR FOR SYSIO
{TRSI${EQU{TRFNC+1{{{NUMBER OF WORDS IN TRBLK
*
{TRTIN{EQU{0{{{TRACE TYPE FOR INPUT ASSOCIATION
{TRTAC{EQU{TRTIN+1{{{TRACE TYPE FOR ACCESS TRACE
{TRTVL{EQU{TRTAC+1{{{TRACE TYPE FOR VALUE TRACE
{TRTOU{EQU{TRTVL+1{{{TRACE TYPE FOR OUTPUT ASSOCIATION
{TRTFC{EQU{TRTOU+1{{{TRACE TYPE FOR FCBLK IDENTIFICATION
{{EJC{{{{
*
*      TRAP BLOCK (CONTINUED)
*
*      VARIABLE INPUT ASSOCIATION
*
*           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
*           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
*           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
*           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
*
*           TRTYP IS SET TO TRTIN
*           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
*           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
*           FOR INPUT, TERMINAL, ELSE IT IS NULL.
*           TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
*           TO AN FCBLK USED FOR I/O ASSOCIATION.
*           TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
*
*      VARIABLE ACCESS TRACE ASSOCIATION
*
*           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
*           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
*           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
*           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
*
*           TRTYP IS SET TO TRTAC
*           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
*           TRTAG IS THE TRACE TAG (0 IF NONE)
*           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
*
*      VARIABLE VALUE TRACE ASSOCIATION
*
*           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
*           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
*           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
*           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
*
*           TRTYP IS SET TO TRTVL
*           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
*           TRTAG IS THE TRACE TAG (0 IF NONE)
*           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
{{EJC{{{{
*      TRAP BLOCK (CONTINUED)
*
*      VARIABLE OUTPUT ASSOCIATION
*
*           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
*           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE
*           OF A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
*           CONTAIN =B$VRA AND =B$VRV TO ACTIVATE THE CHECK.
*
*           TRTYP IS SET TO TRTOU
*           TRNXT POINTS TO NEXT TRBLK OR TRVAL HAS VARIABLE VAL
*           TRTER IS A POINTER TO SVBLK IF ASSOCIATION IS
*           FOR OUTPUT, TERMINAL, ELSE IT IS NULL.
*           TRTRF POINTS TO THE TRAP BLOCK WHICH IN TURN POINTS
*           TO AN FCBLK USED FOR I/O ASSOCIATION.
*           TRFPT IS THE FCBLK PTR RETURNED BY SYSIO.
*
*      FUNCTION CALL TRACE
*
*           THE PFCTR FIELD OF THE CORRESPONDING PFBLK IS SET
*           TO POINT TO A TRBLK.
*
*           TRTYP IS SET TO TRTIN
*           TRNXT IS ZERO
*           TRTAG IS THE TRACE TAG (0 IF NONE)
*           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
*
*      FUNCTION RETURN TRACE
*
*           THE PFRTR FIELD OF THE CORRESPONDING PFBLK IS SET
*           TO POINT TO A TRBLK
*
*           TRTYP IS SET TO TRTIN
*           TRNXT IS ZERO
*           TRTAG IS THE TRACE TAG (0 IF NONE)
*           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
*
*      LABEL TRACE
*
*           THE VRLBL OF THE VRBLK FOR THE LABEL IS
*           CHANGED TO POINT TO A TRBLK AND THE VRTRA FIELD IS
*           SET TO B$VRT TO ACTIVATE THE CHECK.
*
*           TRTYP IS SET TO TRTIN
*           TRLBL POINTS TO THE ACTUAL LABEL (CDBLK) VALUE
*           TRTAG IS THE TRACE TAG (0 IF NONE)
*           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
{{EJC{{{{
*
*      TRAP BLOCK (CONTINUED)
*
*      KEYWORD TRACE
*
*           KEYWORDS WHICH CAN BE TRACED POSSESS A UNIQUE
*           LOCATION WHICH IS ZERO IF THERE IS NO TRACE AND
*           POINTS TO A TRBLK IF THERE IS A TRACE. THE LOCATIONS
*           ARE AS FOLLOWS.
*
*           R$ERT            ERRTYPE
*           R$FNC            FNCLEVEL
*           R$STC            STCOUNT
*
*           THE FORMAT OF THE TRBLK IS AS FOLLOWS.
*
*           TRTYP IS SET TO TRTIN
*           TRKVR IS A POINTER TO THE VRBLK FOR THE KEYWORD
*           TRTAG IS THE TRACE TAG (0 IF NONE)
*           TRFNC IS THE TRACE FUNCTION VRBLK PTR (0 IF NONE)
*
*      INPUT/OUTPUT FILE ARG1 TRAP BLOCK
*
*           THE VALUE FIELD OF THE VARIABLE POINTS TO A TRBLK
*           INSTEAD OF CONTAINING THE DATA VALUE. IN THE CASE OF
*           A NATURAL VARIABLE, THE VRGET AND VRSTO FIELDS
*           CONTAIN =B$VRA AND =B$VRV. THIS TRAP BLOCK IS USED
*           TO HOLD A POINTER TO THE FCBLK WHICH AN
*           IMPLEMENTATION MAY REQUEST TO HOLD INFORMATION
*           ABOUT A FILE.
*
*           TRTYP IS SET TO TRTFC
*           TRNEXT POINTS TO NEXT TRBLK OR TRVAL IS VARIABLE VAL
*           TRFNM IS 0
*           TRFPT IS THE FCBLK POINTER.
*
*      NOTE THAT WHEN MULTIPLE TRAPS ARE SET ON A VARIABLE
*      THE ORDER IS IN ASCENDING VALUE OF TRTYP FIELD.
*
*      INPUT ASSOCIATION (IF PRESENT)
*      ACCESS TRACE (IF PRESENT)
*      VALUE TRACE (IF PRESENT)
*      OUTPUT ASSOCIATION (IF PRESENT)
*
*      THE ACTUAL VALUE OF THE VARIABLE IS STORED IN THE TRVAL
*      FIELD OF THE LAST TRBLK ON THE CHAIN.
*
*      THIS IMPLEMENTATION DOES NOT PERMIT TRACE OR I/O
*      ASSOCIATIONS TO ANY OF THE PSEUDO-VARIABLES.
{{EJC{{{{
*
*      VECTOR BLOCK (VCBLK)
*
*      A VCBLK IS USED TO REPRESENT AN ARRAY VALUE WHICH HAS
*      ONE DIMENSION WHOSE LOWER BOUND IS ONE. ALL OTHER ARRAYS
*      ARE REPRESENTED BY ARBLKS. A VCBLK IS CREATED BY THE
*      SYSTEM FUNCTION ARRAY (S$ARR) WHEN PASSED AN INTEGER ARG.
*
*           +------------------------------------+
*           I                VCTYP               I
*           +------------------------------------+
*           I                IDVAL               I
*           +------------------------------------+
*           I                VCLEN               I
*           +------------------------------------+
*           I                VCVLS               I
*           +------------------------------------+
*
{VCTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$VCT
{VCLEN{EQU{OFFS2{{{LENGTH OF VCBLK IN BYTES
{VCVLS{EQU{OFFS3{{{START OF VECTOR VALUES
{VCSI${EQU{VCVLS{{{SIZE OF STANDARD FIELDS IN VCBLK
{VCVLB{EQU{VCVLS-1{{{OFFSET ONE WORD BEHIND VCVLS
{VCTBD{EQU{TBSI$-VCSI${{{DIFFERENCE IN SIZES - SEE PRTVL
*
*      VCVLS ARE EITHER DATA POINTERS OR TRBLK POINTERS
*
*      THE DIMENSION CAN BE DEDUCED FROM VCLEN.
{{EJC{{{{
*
*      VARIABLE BLOCK (VRBLK)
*
*      A VARIABLE BLOCK IS BUILT IN THE STATIC MEMORY AREA
*      FOR EVERY VARIABLE REFERENCED OR CREATED BY A PROGRAM.
*
*      NOTE THAT SINCE THESE BLOCKS ONLY OCCUR IN THE STATIC
*      REGION, IT IS PERMISSIBLE TO POINT TO ANY WORD IN
*      THE BLOCK AND THIS IS USED TO PROVIDE THREE DISTINCT
*      ACCESS POINTS FROM THE GENERATED CODE AS FOLLOWS.
*
*      1)   POINT TO VRGET (FIRST WORD OF VRBLK) TO LOAD THE
*           VALUE OF THE VARIABLE ONTO THE MAIN STACK.
*
*      2)   POINT TO VRSTO (SECOND WORD OF VRBLK) TO STORE THE
*           TOP STACK ELEMENT AS THE VALUE OF THE VARIABLE.
*
*      3)   POINT TO VRTRA (FOURTH WORD OF VRBLK) TO JUMP TO
*           THE LABEL ASSOCIATED WITH THE VARIABLE NAME.
*
*           +------------------------------------+
*           I                VRGET               I
*           +------------------------------------+
*           I                VRSTO               I
*           +------------------------------------+
*           I                VRVAL               I
*           +------------------------------------+
*           I                VRTRA               I
*           +------------------------------------+
*           I                VRLBL               I
*           +------------------------------------+
*           I                VRFNC               I
*           +------------------------------------+
*           I                VRNXT               I
*           +------------------------------------+
*           I                VRLEN               I
*           +------------------------------------+
*           /                                    /
*           /            VRCHS = VRSVP           /
*           /                                    /
*           +------------------------------------+
{{EJC{{{{
*
*      VARIABLE BLOCK (CONTINUED)
*
{VRGET{EQU{0{{{POINTER TO ROUTINE TO LOAD VALUE
{VRSTO{EQU{VRGET+1{{{POINTER TO ROUTINE TO STORE VALUE
{VRVAL{EQU{VRSTO+1{{{VARIABLE VALUE
{VRVLO{EQU{VRVAL-VRSTO{{{OFFSET TO VALUE FROM STORE FIELD
{VRTRA{EQU{VRVAL+1{{{POINTER TO ROUTINE TO JUMP TO LABEL
{VRLBL{EQU{VRTRA+1{{{POINTER TO CODE FOR LABEL
{VRLBO{EQU{VRLBL-VRTRA{{{OFFSET TO LABEL FROM TRANSFER FIELD
{VRFNC{EQU{VRLBL+1{{{POINTER TO FUNCTION BLOCK
{VRNXT{EQU{VRFNC+1{{{POINTER TO NEXT VRBLK ON HASH CHAIN
{VRLEN{EQU{VRNXT+1{{{LENGTH OF NAME (OR ZERO)
{VRCHS{EQU{VRLEN+1{{{CHARACTERS OF NAME (VRLEN GT 0)
{VRSVP{EQU{VRLEN+1{{{PTR TO SVBLK (VRLEN EQ 0)
{VRSI${EQU{VRCHS+1{{{NUMBER OF STANDARD FIELDS IN VRBLK
{VRSOF{EQU{VRLEN-SCLEN{{{OFFSET TO DUMMY SCBLK FOR NAME
{VRSVO{EQU{VRSVP-VRSOF{{{PSEUDO-OFFSET TO VRSVP FIELD
*
*      VRGET = B$VRL IF NOT INPUT ASSOCIATED OR ACCESS TRACED
*      VRGET = B$VRA IF INPUT ASSOCIATED OR ACCESS TRACED
*
*      VRSTO = B$VRS IF NOT OUTPUT ASSOCIATED OR VALUE TRACED
*      VRSTO = B$VRV IF OUTPUT ASSOCIATED OR VALUE TRACED
*      VRSTO = B$VRE IF VALUE IS PROTECTED PATTERN VALUE
*
*      VRVAL POINTS TO THE APPROPRIATE VALUE UNLESS THE
*      VARIABLE IS I/O/TRACE ASSOCIATED IN WHICH CASE, VRVAL
*      POINTS TO AN APPROPRIATE TRBLK (TRAP BLOCK) CHAIN.
*
*      VRTRA = B$VRG IF THE LABEL IS NOT TRACED
*      VRTRA = B$VRT IF THE LABEL IS TRACED
*
*      VRLBL POINTS TO A CDBLK IF THERE IS A LABEL
*      VRLBL POINTS TO THE SVBLK SVLBL FIELD FOR A SYSTEM LABEL
*      VRLBL POINTS TO STNDL FOR AN UNDEFINED LABEL
*      VRLBL POINTS TO A TRBLK IF THE LABEL IS TRACED
*
*      VRFNC POINTS TO A FFBLK FOR A FIELD FUNCTION
*      VRFNC POINTS TO A DFBLK FOR A DATATYPE FUNCTION
*      VRFNC POINTS TO A PFBLK FOR A PROGRAM DEFINED FUNCTION
*      VRFNC POINTS TO A EFBLK FOR AN EXTERNAL LOADED FUNCTION
*      VRFNC POINTS TO SVFNC (SVBLK) FOR A SYSTEM FUNCTION
*      VRFNC POINTS TO STNDF IF THE FUNCTION IS UNDEFINED
*
*      VRNXT POINTS TO THE NEXT VRBLK ON THIS CHAIN UNLESS
*      THIS IS THE END OF THE CHAIN IN WHICH CASE IT IS ZERO.
*
*      VRLEN IS THE NAME LENGTH FOR A NON-SYSTEM VARIABLE.
*      VRLEN IS ZERO FOR A SYSTEM VARIABLE.
*
*      VRCHS IS THE NAME (LJRZ) IF VRLEN IS NON-ZERO.
*      VRSVP IS A PTR TO THE SVBLK IF VRLEN IS ZERO.
{{EJC{{{{
*
*      FORMAT OF A NON-RELOCATABLE EXTERNAL BLOCK (XNBLK)
*
*      AN XNBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
*      DATA VALUE. THE BLOCK CONTAINS NO POINTERS TO OTHER
*      RELOCATABLE BLOCKS. AN XNBLK IS USED BY EXTERNAL FUNCTION
*      PROCESSING OR POSSIBLY FOR SYSTEM I/O ROUTINES ETC.
*      THE MACRO-SYSTEM ITSELF DOES NOT USE XNBLKS.
*      THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
*      SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
*
*           +------------------------------------+
*           I                XNTYP               I
*           +------------------------------------+
*           I                XNLEN               I
*           +------------------------------------+
*           /                                    /
*           /                XNDTA               /
*           /                                    /
*           +------------------------------------+
*
{XNTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$XNT
{XNLEN{EQU{XNTYP+1{{{LENGTH OF XNBLK IN BYTES
{XNDTA{EQU{XNLEN+1{{{DATA WORDS
{XNSI${EQU{XNDTA{{{SIZE OF STANDARD FIELDS IN XNBLK
*
*      NOTE THAT THE TERM NON-RELOCATABLE REFERS TO THE CONTENTS
*      AND NOT THE BLOCK ITSELF. AN XNBLK CAN BE MOVED AROUND IF
*      IT IS BUILT IN THE DYNAMIC MEMORY AREA.
{{EJC{{{{
*
*      RELOCATABLE EXTERNAL BLOCK (XRBLK)
*
*      AN XRBLK IS A BLOCK REPRESENTING AN UNKNOWN (EXTERNAL)
*      DATA VALUE. THE DATA AREA IN THIS BLOCK CONSISTS ONLY
*      OF ADDRESS VALUES AND ANY ADDRESSES POINTING INTO THE
*      DYNAMIC MEMORY AREA MUST POINT TO THE START OF OTHER
*      DATA BLOCKS. SEE ALSO DESCRIPTION OF XNBLK.
*      THIS TYPE OF BLOCK MAY BE USED AS A FILE CONTROL BLOCK.
*      SEE SYSFC,SYSIN,SYSOU,S$INP,S$OUP FOR DETAILS.
*
*           +------------------------------------+
*           I                XRTYP               I
*           +------------------------------------+
*           I                XRLEN               I
*           +------------------------------------+
*           /                                    /
*           /                XRPTR               /
*           /                                    /
*           +------------------------------------+
*
{XRTYP{EQU{0{{{POINTER TO DUMMY ROUTINE B$XRT
{XRLEN{EQU{XRTYP+1{{{LENGTH OF XRBLK IN BYTES
{XRPTR{EQU{XRLEN+1{{{START OF ADDRESS POINTERS
{XRSI${EQU{XRPTR{{{SIZE OF STANDARD FIELDS IN XRBLK
{{EJC{{{{
*
*      S$CNV (CONVERT) FUNCTION SWITCH CONSTANTS.  THE VALUES
*      ARE TIED TO THE ORDER OF THE ENTRIES IN THE SVCTB TABLE
*      AND HENCE TO THE BRANCH TABLE IN S$CNV.
*
{CNVST{EQU{8{{{MAX STANDARD TYPE CODE FOR CONVERT
{CNVRT{EQU{CNVST+1{{{CONVERT CODE FOR REALS
{CNVBT{EQU{CNVRT+1{{{CONVERT CODE FOR BUFFER
{CNVTT{EQU{CNVBT+1{{{BSW CODE FOR CONVERT
*
*      INPUT IMAGE LENGTH
*
{INILN{EQU{132{{{DEFAULT IMAGE LENGTH FOR COMPILER
{INILS{EQU{80{{{IMAGE LENGTH IF -SEQU IN EFFECT
*
{IONMB{EQU{2{{{NAME BASE USED FOR IOCHN IN SYSIO
{IONMO{EQU{4{{{NAME OFFSET USED FOR IOCHN IN SYSIO
*
*      IN GENERAL, MEANINGFUL MNEMONICS SHOULD BE USED FOR
*      OFFSETS. HOWEVER FOR SMALL INTEGERS USED OFTEN IN
*      LITERALS THE FOLLOWING GENERAL DEFINITIONS ARE PROVIDED.
*
{NUM01{EQU{1{{{
{NUM02{EQU{2{{{
{NUM03{EQU{3{{{
{NUM04{EQU{4{{{
{NUM05{EQU{5{{{
{NUM06{EQU{6{{{
{NUM07{EQU{7{{{
{NUM08{EQU{8{{{
{NUM09{EQU{9{{{
{NUM10{EQU{10{{{
{NINI8{EQU{998{{{
{NINI9{EQU{999{{{
{THSND{EQU{1000{{{
{{EJC{{{{
*
*      NUMBERS OF UNDEFINED SPITBOL OPERATORS
*
{OPBUN{EQU{5{{{NO. OF BINARY UNDEFINED OPS
{OPUUN{EQU{6{{{NO OF UNARY UNDEFINED OPS
*
*      OFFSETS USED IN PRTSN, PRTMI AND ACESS
*
{PRSNF{EQU{13{{{OFFSET USED IN PRTSN
{PRTMF{EQU{15{{{OFFSET TO COL 15 (PRTMI)
{RILEN{EQU{120{{{BUFFER LENGTH FOR SYSRI
*
*      CODES FOR STAGES OF PROCESSING
*
{STGIC{EQU{0{{{INITIAL COMPILE
{STGXC{EQU{STGIC+1{{{EXECUTION COMPILE (CODE)
{STGEV{EQU{STGXC+1{{{EXPRESSION EVAL DURING EXECUTION
{STGXT{EQU{STGEV+1{{{EXECUTION TIME
{STGCE{EQU{STGXT+1{{{INITIAL COMPILE AFTER END LINE
{STGXE{EQU{STGCE+1{{{EXEC. COMPILE AFTER END LINE
{STGND{EQU{STGCE-STGIC{{{DIFFERENCE IN STAGE AFTER END
{STGEE{EQU{STGXE+1{{{EVAL EVALUATING EXPRESSION
{STGNO{EQU{STGEE+1{{{NUMBER OF CODES
{{EJC{{{{
*
*
*      STATEMENT NUMBER PAD COUNT FOR LISTR
*
{STNPD{EQU{8{{{STATEMENT NO. PAD COUNT
*
*      SYNTAX TYPE CODES
*
*      THESE CODES ARE RETURNED FROM THE SCANE PROCEDURE.
*
*      THEY ARE SPACED 3 APART FOR THE BENEFIT OF EXPAN.
*
{T$UOP{EQU{0{{{UNARY OPERATOR
{T$LPR{EQU{T$UOP+3{{{LEFT PAREN
{T$LBR{EQU{T$LPR+3{{{LEFT BRACKET
{T$CMA{EQU{T$LBR+3{{{COMMA
{T$FNC{EQU{T$CMA+3{{{FUNCTION CALL
{T$VAR{EQU{T$FNC+3{{{VARIABLE
{T$CON{EQU{T$VAR+3{{{CONSTANT
{T$BOP{EQU{T$CON+3{{{BINARY OPERATOR
{T$RPR{EQU{T$BOP+3{{{RIGHT PAREN
{T$RBR{EQU{T$RPR+3{{{RIGHT BRACKET
{T$COL{EQU{T$RBR+3{{{COLON
{T$SMC{EQU{T$COL+3{{{SEMI-COLON
*
*      THE FOLLOWING DEFINITIONS ARE USED ONLY IN THE GOTO FIELD
*
{T$FGO{EQU{T$SMC+1{{{FAILURE GOTO
{T$SGO{EQU{T$FGO+1{{{SUCCESS GOTO
*
*      THE ABOVE CODES ARE GROUPED SO THAT CODES FOR ELEMENTS
*      WHICH CAN LEGITIMATELY IMMEDIATELY PRECEDE A UNARY
*      OPERATOR COME FIRST TO FACILITATE OPERATOR SYNTAX CHECK.
*
{T$UOK{EQU{T$FNC{{{LAST CODE OK BEFORE UNARY OPERATOR
{{EJC{{{{
*
*      DEFINITIONS OF VALUES FOR EXPAN JUMP TABLE
*
{T$UO0{EQU{T$UOP+0{{{UNARY OPERATOR, STATE ZERO
{T$UO1{EQU{T$UOP+1{{{UNARY OPERATOR, STATE ONE
{T$UO2{EQU{T$UOP+2{{{UNARY OPERATOR, STATE TWO
{T$LP0{EQU{T$LPR+0{{{LEFT PAREN, STATE ZERO
{T$LP1{EQU{T$LPR+1{{{LEFT PAREN, STATE ONE
{T$LP2{EQU{T$LPR+2{{{LEFT PAREN, STATE TWO
{T$LB0{EQU{T$LBR+0{{{LEFT BRACKET, STATE ZERO
{T$LB1{EQU{T$LBR+1{{{LEFT BRACKET, STATE ONE
{T$LB2{EQU{T$LBR+2{{{LEFT BRACKET, STATE TWO
{T$CM0{EQU{T$CMA+0{{{COMMA, STATE ZERO
{T$CM1{EQU{T$CMA+1{{{COMMA, STATE ONE
{T$CM2{EQU{T$CMA+2{{{COMMA, STATE TWO
{T$FN0{EQU{T$FNC+0{{{FUNCTION CALL, STATE ZERO
{T$FN1{EQU{T$FNC+1{{{FUNCTION CALL, STATE ONE
{T$FN2{EQU{T$FNC+2{{{FUNCTION CALL, STATE TWO
{T$VA0{EQU{T$VAR+0{{{VARIABLE, STATE ZERO
{T$VA1{EQU{T$VAR+1{{{VARIABLE, STATE ONE
{T$VA2{EQU{T$VAR+2{{{VARIABLE, STATE TWO
{T$CO0{EQU{T$CON+0{{{CONSTANT, STATE ZERO
{T$CO1{EQU{T$CON+1{{{CONSTANT, STATE ONE
{T$CO2{EQU{T$CON+2{{{CONSTANT, STATE TWO
{T$BO0{EQU{T$BOP+0{{{BINARY OPERATOR, STATE ZERO
{T$BO1{EQU{T$BOP+1{{{BINARY OPERATOR, STATE ONE
{T$BO2{EQU{T$BOP+2{{{BINARY OPERATOR, STATE TWO
{T$RP0{EQU{T$RPR+0{{{RIGHT PAREN, STATE ZERO
{T$RP1{EQU{T$RPR+1{{{RIGHT PAREN, STATE ONE
{T$RP2{EQU{T$RPR+2{{{RIGHT PAREN, STATE TWO
{T$RB0{EQU{T$RBR+0{{{RIGHT BRACKET, STATE ZERO
{T$RB1{EQU{T$RBR+1{{{RIGHT BRACKET, STATE ONE
{T$RB2{EQU{T$RBR+2{{{RIGHT BRACKET, STATE TWO
{T$CL0{EQU{T$COL+0{{{COLON, STATE ZERO
{T$CL1{EQU{T$COL+1{{{COLON, STATE ONE
{T$CL2{EQU{T$COL+2{{{COLON, STATE TWO
{T$SM0{EQU{T$SMC+0{{{SEMICOLON, STATE ZERO
{T$SM1{EQU{T$SMC+1{{{SEMICOLON, STATE ONE
{T$SM2{EQU{T$SMC+2{{{SEMICOLON, STATE TWO
*
{T$NES{EQU{T$SM2+1{{{NUMBER OF ENTRIES IN BRANCH TABLE
{{EJC{{{{
*
*       DEFINITION OF OFFSETS USED IN CONTROL CARD PROCESSING
*
{CC$CA{EQU{0{{{-CASE
{CC$DO{EQU{CC$CA+1{{{-DOUBLE
{CC$DU{EQU{CC$DO+1{{{-DUMP
{CC$EJ{EQU{CC$DU+1{{{-EJECT
{CC$ER{EQU{CC$EJ+1{{{-ERRORS
{CC$EX{EQU{CC$ER+1{{{-EXECUTE
{CC$FA{EQU{CC$EX+1{{{-FAIL
{CC$LI{EQU{CC$FA+1{{{-LIST
{CC$NR{EQU{CC$LI+1{{{-NOERRORS
{CC$NX{EQU{CC$NR+1{{{-NOEXECUTE
{CC$NF{EQU{CC$NX+1{{{-NOFAIL
{CC$NL{EQU{CC$NF+1{{{-NOLIST
{CC$NO{EQU{CC$NL+1{{{-NOOPT
{CC$NP{EQU{CC$NO+1{{{-NOPRINT
{CC$OP{EQU{CC$NP+1{{{-OPTIMISE
{CC$PR{EQU{CC$OP+1{{{-PRINT
{CC$SI{EQU{CC$PR+1{{{-SINGLE
{CC$SP{EQU{CC$SI+1{{{-SPACE
{CC$ST{EQU{CC$SP+1{{{-STITL
{CC$TI{EQU{CC$ST+1{{{-TITLE
{CC$TR{EQU{CC$TI+1{{{-TRACE
{CC$NC{EQU{CC$TR+1{{{NUMBER OF CONTROL CARDS
{CCNOC{EQU{4{{{NO. OF CHARS INCLUDED IN MATCH
{CCOFS{EQU{7{{{OFFSET TO START OF TITLE/SUBTITLE
{{EJC{{{{
*
*      DEFINITIONS OF STACK OFFSETS USED IN CMPIL PROCEDURE
*
*      SEE DESCRIPTION AT START OF CMPIL PROCEDURE FOR DETAILS
*      OF USE OF THESE LOCATIONS ON THE STACK.
*
{CMSTM{EQU{0{{{TREE FOR STATEMENT BODY
{CMSGO{EQU{CMSTM+1{{{TREE FOR SUCCESS GOTO
{CMFGO{EQU{CMSGO+1{{{TREE FOR FAIL GOTO
{CMCGO{EQU{CMFGO+1{{{CONDITIONAL GOTO FLAG
{CMPCD{EQU{CMCGO+1{{{PREVIOUS CDBLK POINTER
{CMFFP{EQU{CMPCD+1{{{FAILURE FILL IN FLAG FOR PREVIOUS
{CMFFC{EQU{CMFFP+1{{{FAILURE FILL IN FLAG FOR CURRENT
{CMSOP{EQU{CMFFC+1{{{SUCCESS FILL IN OFFSET FOR PREVIOUS
{CMSOC{EQU{CMSOP+1{{{SUCCESS FILL IN OFFSET FOR CURRENT
{CMLBL{EQU{CMSOC+1{{{PTR TO VRBLK FOR CURRENT LABEL
{CMTRA{EQU{CMLBL+1{{{PTR TO ENTRY CDBLK
*
{CMNEN{EQU{CMTRA+1{{{COUNT OF STACK ENTRIES FOR CMPIL
*
*      A FEW CONSTANTS USED BY THE PROFILER
{PFPD1{EQU{8{{{PAD POSITIONS ...
{PFPD2{EQU{20{{{... FOR PROFILE ...
{PFPD3{EQU{32{{{... PRINTOUT
{PF$I2{EQU{CFP$I+CFP$I{{{SIZE OF TABLE ENTRY (2 INTS)
*
{{TTL{S{{{P I T B O L -- CONSTANT SECTION
*
*      THIS SECTION CONSISTS ENTIRELY OF ASSEMBLED CONSTANTS.
*
*      ALL LABEL NAMES ARE FIVE LETTERS. THE ORDER IS
*      APPROXIMATELY ALPHABETICAL, BUT IN SOME CASES (ALWAYS
*      DOCUMENTED), CONSTANTS MUST BE PLACED IN SOME SPECIAL
*      ORDER WHICH MUST NOT BE DISTURBED.
*
*      IT MUST ALSO BE REMEMBERED THAT THERE IS A REQUIREMENT
*      FOR NO FORWARD REFERENCES WHICH ALSO DISTURBS THE
*      ALPHABETICAL ORDER IN SOME CASES.
*
{{SEC{{{{START OF CONSTANT SECTION
*
*      FREE STORE PERCENTAGE (USED BY ALLOC)
*
{ALFSP{DAC{E$FSP{{{FREE STORE PERCENTAGE
*
*      BIT CONSTANTS FOR GENERAL USE
*
{BITS0{DBC{0{{{ALL ZERO BITS
{BITS1{DBC{1{{{ONE BIT IN LOW ORDER POSITION
{BITS2{DBC{2{{{BIT IN POSITION 2
{BITS3{DBC{4{{{BIT IN POSITION 3
{BITS4{DBC{8{{{BIT IN POSITION 4
{BITS5{DBC{16{{{BIT IN POSITION 5
{BITS6{DBC{32{{{BIT IN POSITION 6
{BITS7{DBC{64{{{BIT IN POSITION 7
{BITS8{DBC{128{{{BIT IN POSITION 8
{BITS9{DBC{256{{{BIT IN POSITION 9
{BIT10{DBC{512{{{BIT IN POSITION 10
{BITSM{DBC{CFP$M{{{MASK FOR MAX INTEGER
*
*      BIT CONSTANTS FOR SVBLK (SVBIT FIELD) TESTS
*
{BTFNC{DBC{SVFNC{{{BIT TO TEST FOR FUNCTION
{BTKNM{DBC{SVKNM{{{BIT TO TEST FOR KEYWORD NUMBER
{BTLBL{DBC{SVLBL{{{BIT TO TEST FOR LABEL
{BTFFC{DBC{SVFFC{{{BIT TO TEST FOR FAST CALL
{BTCKW{DBC{SVCKW{{{BIT TO TEST FOR CONSTANT KEYWORD
{BTPRD{DBC{SVPRD{{{BIT TO TEST FOR PREDICATE FUNCTION
{BTPRE{DBC{SVPRE{{{BIT TO TEST FOR PREEVALUATION
{BTVAL{DBC{SVVAL{{{BIT TO TEST FOR VALUE
{{EJC{{{{
*
*      LIST OF NAMES USED FOR CONTROL CARD PROCESSING
*
{CCNMS{DTC{/CASE/{{{
{{DTC{/DOUB/{{{
{{DTC{/DUMP/{{{
{{DTC{/EJEC/{{{
{{DTC{/ERRO/{{{
{{DTC{/EXEC/{{{
{{DTC{/FAIL/{{{
{{DTC{/LIST/{{{
{{DTC{/NOER/{{{
{{DTC{/NOEX/{{{
{{DTC{/NOFA/{{{
{{DTC{/NOLI/{{{
{{DTC{/NOOP/{{{
{{DTC{/NOPR/{{{
{{DTC{/OPTI/{{{
{{DTC{/PRIN/{{{
{{DTC{/SING/{{{
{{DTC{/SPAC/{{{
{{DTC{/STIT/{{{
{{DTC{/TITL/{{{
{{DTC{/TRAC/{{{
*
*      HEADER MESSAGES FOR DUMPR PROCEDURE (SCBLK FORMAT)
*
{DMHDK{DAC{B$SCL{{{DUMP OF KEYWORD VALUES
{{DAC{22{{{
{{DTC{/DUMP OF KEYWORD VALUES/{{{
*
{DMHDV{DAC{B$SCL{{{DUMP OF NATURAL VARIABLES
{{DAC{25{{{
{{DTC{/DUMP OF NATURAL VARIABLES/{{{
{{EJC{{{{
*
*      MESSAGE TEXT FOR COMPILATION STATISTICS
*
{ENCM1{DAC{B$SCL{{{
{{DAC{10{{{
{{DTC{/STORE USED/{{{
*
{ENCM2{DAC{B$SCL{{{
{{DAC{10{{{
{{DTC{/STORE LEFT/{{{
*
{ENCM3{DAC{B$SCL{{{
{{DAC{11{{{
{{DTC{/COMP ERRORS/{{{
*
{ENCM4{DAC{B$SCL{{{
{{DAC{14{{{
{{DTC{/COMP TIME-MSEC/{{{
*
{ENCM5{DAC{B$SCL{{{EXECUTION SUPPRESSED
{{DAC{20{{{
{{DTC{/EXECUTION SUPPRESSED/{{{
*
*      STRING CONSTANT FOR ABNORMAL END
*
{ENDAB{DAC{B$SCL{{{
{{DAC{12{{{
{{DTC{/ABNORMAL END/{{{
{{EJC{{{{
*
*      MEMORY OVERFLOW DURING INITIALISATION
*
{ENDMO{DAC{B$SCL{{{
{ENDML{DAC{15{{{
{{DTC{/MEMORY OVERFLOW/{{{
*
*      STRING CONSTANT FOR MESSAGE ISSUED BY L$END
*
{ENDMS{DAC{B$SCL{{{
{{DAC{10{{{
{{DTC{/NORMAL END/{{{
*
*      FAIL MESSAGE FOR STACK FAIL SECTION
*
{ENDSO{DAC{B$SCL{{{STACK OVERFLOW IN GARBAGE COLLECTOR
{{DAC{36{{{
{{DTC{/STACK OVERFLOW IN GARBAGE COLLECTION/{{{
*
*      STRING CONSTANT FOR TIME UP
*
{ENDTU{DAC{B$SCL{{{
{{DAC{15{{{
{{DTC{/ERROR - TIME UP/{{{
{{EJC{{{{
*
*      STRING CONSTANT FOR ERROR MESSAGE (ERROR SECTION)
*
{ERMMS{DAC{B$SCL{{{ERROR
{{DAC{5{{{
{{DTC{/ERROR/{{{
*
{ERMNS{DAC{B$SCL{{{STRING / -- /
{{DAC{4{{{
{{DTC{/ -- /{{{
*
*      STRING CONSTANT FOR PAGE NUMBERING
*
{LSTMS{DAC{B$SCL{{{PAGE
{{DAC{5{{{
{{DTC{/PAGE /{{{
*
*      LISTING HEADER MESSAGE
*
{HEADR{DAC{B$SCL{{{
{{DAC{25{{{
{{DTC{/MACRO SPITBOL VERSION 3.5/{{{
*
{HEADV{DAC{B$SCL{{{FOR EXIT() VERSION NO. CHECK
{{DAC{3{{{
{{DTC{/3.5/{{{
*
*      INTEGER CONSTANTS FOR GENERAL USE
*      ICBLD OPTIMISATION USES THE FIRST THREE.
*
{INT$R{DAC{B$ICL{{{
{INTV0{DIC{+0{{{0
{INTON{DAC{B$ICL{{{
{INTV1{DIC{+1{{{1
{INTTW{DAC{B$ICL{{{
{INTV2{DIC{+2{{{2
{INTVT{DIC{+10{{{10
{INTVH{DIC{+100{{{100
{INTTH{DIC{+1000{{{1000
*
*      TABLE USED IN ICBLD OPTIMISATION
*
{INTAB{DAC{INT$R{{{POINTER TO 0
{{DAC{INTON{{{POINTER TO 1
{{DAC{INTTW{{{POINTER TO 2
{{EJC{{{{
*
*      SPECIAL PATTERN NODES. THE FOLLOWING PATTERN NODES
*      CONSIST SIMPLY OF A PCODE POINTER, SEE MATCH ROUTINES
*      (P$XXX) FOR FULL DETAILS OF THEIR USE AND FORMAT).
*
{NDABB{DAC{P$ABB{{{ARBNO
{NDABD{DAC{P$ABD{{{ARBNO
{NDARC{DAC{P$ARC{{{ARB
{NDEXB{DAC{P$EXB{{{EXPRESSION
{NDFNB{DAC{P$FNB{{{FENCE()
{NDFND{DAC{P$FND{{{FENCE()
{NDEXC{DAC{P$EXC{{{EXPRESSION
{NDIMB{DAC{P$IMB{{{IMMEDIATE ASSIGNMENT
{NDIMD{DAC{P$IMD{{{IMMEDIATE ASSIGNMENT
{NDNTH{DAC{P$NTH{{{PATTERN END (NULL PATTERN)
{NDPAB{DAC{P$PAB{{{PATTERN ASSIGNMENT
{NDPAD{DAC{P$PAD{{{PATTERN ASSIGNMENT
{NDUNA{DAC{P$UNA{{{ANCHOR POINT MOVEMENT
*
*      KEYWORD CONSTANT PATTERN NODES. THE FOLLOWING NODES ARE
*      USED AS THE VALUES OF PATTERN KEYWORDS AND THE INITIAL
*      VALUES OF THE CORRESPONDING NATURAL VARIABLES. ALL
*      NODES ARE IN P0BLK FORMAT AND THE ORDER IS TIED TO THE
*      DEFINITIONS OF CORRESPONDING K$XXX SYMBOLS.
*
{NDABO{DAC{P$ABO{{{ABORT
{{DAC{NDNTH{{{
{NDARB{DAC{P$ARB{{{ARB
{{DAC{NDNTH{{{
{NDBAL{DAC{P$BAL{{{BAL
{{DAC{NDNTH{{{
{NDFAL{DAC{P$FAL{{{FAIL
{{DAC{NDNTH{{{
{NDFEN{DAC{P$FEN{{{FENCE
{{DAC{NDNTH{{{
{NDREM{DAC{P$REM{{{REM
{{DAC{NDNTH{{{
{NDSUC{DAC{P$SUC{{{SUCCEED
{{DAC{NDNTH{{{
*
*      NULL STRING. ALL NULL VALUES POINT TO THIS STRING. THE
*      SVCHS FIELD CONTAINS A BLANK TO PROVIDE FOR EASY DEFAULT
*      PROCESSING IN TRACE, STOPTR, LPAD AND RPAD.
*      NULLW CONTAINS 10 BLANKS WHICH ENSURES AN ALL BLANK WORD
*      BUT FOR VERY EXCEPTIONAL MACHINES.
*
{NULLS{DAC{B$SCL{{{NULL STRING VALUE
{{DAC{0{{{SCLEN = 0
{NULLW{DTC{/          /{{{
{{EJC{{{{
*
*      OPERATOR DOPE VECTORS (SEE DVBLK FORMAT)
*
{OPDVC{DAC{O$CNC{{{CONCATENATION
{{DAC{C$CNC{{{
{{DAC{LLCNC{{{
{{DAC{RRCNC{{{
*
*      OPDVS IS USED WHEN SCANNING BELOW THE TOP LEVEL TO
*      INSURE THAT THE CONCATENATION WILL NOT BE LATER
*      MISTAKEN FOR PATTERN MATCHING
*
{OPDVP{DAC{O$CNC{{{CONCATENATION - NOT PATTERN MATCH
{{DAC{C$CNP{{{
{{DAC{LLCNC{{{
{{DAC{RRCNC{{{
*
*      NOTE THAT THE ORDER OF THE REMAINING ENTRIES IS TIED TO
*      THE ORDER OF THE CODING IN THE SCANE PROCEDURE.
*
{OPDVS{DAC{O$ASS{{{ASSIGNMENT
{{DAC{C$ASS{{{
{{DAC{LLASS{{{
{{DAC{RRASS{{{
*
{{DAC{6{{{UNARY EQUAL
{{DAC{C$UUO{{{
{{DAC{LLUNO{{{
*
{{DAC{O$PMV{{{PATTERN MATCH
{{DAC{C$PMT{{{
{{DAC{LLPMT{{{
{{DAC{RRPMT{{{
*
{{DAC{O$INT{{{INTERROGATION
{{DAC{C$UVL{{{
{{DAC{LLUNO{{{
*
{{DAC{1{{{BINARY AMPERSAND
{{DAC{C$UBO{{{
{{DAC{LLAMP{{{
{{DAC{RRAMP{{{
*
{{DAC{O$KWV{{{KEYWORD REFERENCE
{{DAC{C$KEY{{{
{{DAC{LLUNO{{{
*
{{DAC{O$ALT{{{ALTERNATION
{{DAC{C$ALT{{{
{{DAC{LLALT{{{
{{DAC{RRALT{{{
{{EJC{{{{
*
*      OPERATOR DOPE VECTORS (CONTINUED)
*
{{DAC{5{{{UNARY VERTICAL BAR
{{DAC{C$UUO{{{
{{DAC{LLUNO{{{
*
{{DAC{0{{{BINARY AT
{{DAC{C$UBO{{{
{{DAC{LLATS{{{
{{DAC{RRATS{{{
*
{{DAC{O$CAS{{{CURSOR ASSIGNMENT
{{DAC{C$UNM{{{
{{DAC{LLUNO{{{
*
{{DAC{2{{{BINARY NUMBER SIGN
{{DAC{C$UBO{{{
{{DAC{LLNUM{{{
{{DAC{RRNUM{{{
*
{{DAC{7{{{UNARY NUMBER SIGN
{{DAC{C$UUO{{{
{{DAC{LLUNO{{{
*
{{DAC{O$DVD{{{DIVISION
{{DAC{C$BVL{{{
{{DAC{LLDVD{{{
{{DAC{RRDVD{{{
*
{{DAC{9{{{UNARY SLASH
{{DAC{C$UUO{{{
{{DAC{LLUNO{{{
*
{{DAC{O$MLT{{{MULTIPLICATION
{{DAC{C$BVL{{{
{{DAC{LLMLT{{{
{{DAC{RRMLT{{{
{{EJC{{{{
*
*      OPERATOR DOPE VECTORS (CONTINUED)
*
{{DAC{0{{{DEFERRED EXPRESSION
{{DAC{C$DEF{{{
{{DAC{LLUNO{{{
*
{{DAC{3{{{BINARY PERCENT
{{DAC{C$UBO{{{
{{DAC{LLPCT{{{
{{DAC{RRPCT{{{
*
{{DAC{8{{{UNARY PERCENT
{{DAC{C$UUO{{{
{{DAC{LLUNO{{{
*
{{DAC{O$EXP{{{EXPONENTIATION
{{DAC{C$BVL{{{
{{DAC{LLEXP{{{
{{DAC{RREXP{{{
*
{{DAC{10{{{UNARY EXCLAMATION
{{DAC{C$UUO{{{
{{DAC{LLUNO{{{
*
{{DAC{O$IMA{{{IMMEDIATE ASSIGNMENT
{{DAC{C$BVN{{{
{{DAC{LLDLD{{{
{{DAC{RRDLD{{{
*
{{DAC{O$INV{{{INDIRECTION
{{DAC{C$IND{{{
{{DAC{LLUNO{{{
*
{{DAC{4{{{BINARY NOT
{{DAC{C$UBO{{{
{{DAC{LLNOT{{{
{{DAC{RRNOT{{{
*
{{DAC{0{{{NEGATION
{{DAC{C$NEG{{{
{{DAC{LLUNO{{{
{{EJC{{{{
*
*      OPERATOR DOPE VECTORS (CONTINUED)
*
{{DAC{O$SUB{{{SUBTRACTION
{{DAC{C$BVL{{{
{{DAC{LLPLM{{{
{{DAC{RRPLM{{{
*
{{DAC{O$COM{{{COMPLEMENTATION
{{DAC{C$UVL{{{
{{DAC{LLUNO{{{
*
{{DAC{O$ADD{{{ADDITION
{{DAC{C$BVL{{{
{{DAC{LLPLM{{{
{{DAC{RRPLM{{{
*
{{DAC{O$AFF{{{AFFIRMATION
{{DAC{C$UVL{{{
{{DAC{LLUNO{{{
*
{{DAC{O$PAS{{{PATTERN ASSIGNMENT
{{DAC{C$BVN{{{
{{DAC{LLDLD{{{
{{DAC{RRDLD{{{
*
{{DAC{O$NAM{{{NAME REFERENCE
{{DAC{C$UNM{{{
{{DAC{LLUNO{{{
*
*      SPECIAL DVS FOR GOTO OPERATORS (SEE PROCEDURE SCNGF)
*
{OPDVD{DAC{O$GOD{{{DIRECT GOTO
{{DAC{C$UVL{{{
{{DAC{LLUNO{{{
*
{OPDVN{DAC{O$GOC{{{COMPLEX NORMAL GOTO
{{DAC{C$UNM{{{
{{DAC{LLUNO{{{
{{EJC{{{{
*
*      OPERATOR ENTRY ADDRESS POINTERS, USED IN CODE
*
{OAMN${DAC{O$AMN{{{ARRAY REF (MULTI-SUBS BY VALUE)
{OAMV${DAC{O$AMV{{{ARRAY REF (MULTI-SUBS BY VALUE)
{OAON${DAC{O$AON{{{ARRAY REF (ONE SUB BY NAME)
{OAOV${DAC{O$AOV{{{ARRAY REF (ONE SUB BY VALUE)
{OCER${DAC{O$CER{{{COMPILATION ERROR
{OFEX${DAC{O$FEX{{{FAILURE IN EXPRESSION EVALUATION
{OFIF${DAC{O$FIF{{{FAILURE DURING GOTO EVALUATION
{OFNC${DAC{O$FNC{{{FUNCTION CALL (MORE THAN ONE ARG)
{OFNE${DAC{O$FNE{{{FUNCTION NAME ERROR
{OFNS${DAC{O$FNS{{{FUNCTION CALL (SINGLE ARGUMENT)
{OGOF${DAC{O$GOF{{{SET GOTO FAILURE TRAP
{OINN${DAC{O$INN{{{INDIRECTION BY NAME
{OKWN${DAC{O$KWN{{{KEYWORD REFERENCE BY NAME
{OLEX${DAC{O$LEX{{{LOAD EXPRESSION BY NAME
{OLPT${DAC{O$LPT{{{LOAD PATTERN
{OLVN${DAC{O$LVN{{{LOAD VARIABLE NAME
{ONTA${DAC{O$NTA{{{NEGATION, FIRST ENTRY
{ONTB${DAC{O$NTB{{{NEGATION, SECOND ENTRY
{ONTC${DAC{O$NTC{{{NEGATION, THIRD ENTRY
{OPMN${DAC{O$PMN{{{PATTERN MATCH BY NAME
{OPMS${DAC{O$PMS{{{PATTERN MATCH (STATEMENT)
{OPOP${DAC{O$POP{{{POP TOP STACK ITEM
{ORNM${DAC{O$RNM{{{RETURN NAME FROM EXPRESSION
{ORPL${DAC{O$RPL{{{PATTERN REPLACEMENT
{ORVL${DAC{O$RVL{{{RETURN VALUE FROM EXPRESSION
{OSLA${DAC{O$SLA{{{SELECTION, FIRST ENTRY
{OSLB${DAC{O$SLB{{{SELECTION, SECOND ENTRY
{OSLC${DAC{O$SLC{{{SELECTION, THIRD ENTRY
{OSLD${DAC{O$SLD{{{SELECTION, FOURTH ENTRY
{OSTP${DAC{O$STP{{{STOP EXECUTION
{OUNF${DAC{O$UNF{{{UNEXPECTED FAILURE
{{EJC{{{{
*
*      TABLE OF NAMES OF UNDEFINED BINARY OPERATORS FOR OPSYN
*
{OPSNB{DAC{CH$AT{{{AT
{{DAC{CH$AM{{{AMPERSAND
{{DAC{CH$NM{{{NUMBER
{{DAC{CH$PC{{{PERCENT
{{DAC{CH$NT{{{NOT
*
*      TABLE OF NAMES OF UNDEFINED UNARY OPERATORS FOR OPSYN
*
{OPNSU{DAC{CH$BR{{{VERTICAL BAR
{{DAC{CH$EQ{{{EQUAL
{{DAC{CH$NM{{{NUMBER
{{DAC{CH$PC{{{PERCENT
{{DAC{CH$SL{{{SLASH
{{DAC{CH$EX{{{EXCLAMATION
*
*      ADDRESS CONST CONTAINING PROFILE TABLE ENTRY SIZE
*
{PFI2A{DAC{PF$I2{{{
*
*      PROFILER MESSAGE STRINGS
*
{PFMS1{DAC{B$SCL{{{
{{DAC{15{{{
{{DTC{/PROGRAM PROFILE/{{{
{PFMS2{DAC{B$SCL{{{
{{DAC{42{{{
{{DTC{/STMT    NUMBER OF     -- EXECUTION TIME --/{{{
{PFMS3{DAC{B$SCL{{{
{{DAC{47{{{
{{DTC{/NUMBER  EXECUTIONS  TOTAL(MSEC) PER EXCN(MCSEC)/{{{
*
*
*      REAL CONSTANTS FOR GENERAL USE. NOTE THAT THE CONSTANTS
*      STARTING AT REAV1 FORM A POWERS OF TEN TABLE (GTSTG)
*
{REAV0{DRC{+0.0{{{0.0
{REAP1{DRC{+0.1{{{0.1
{REAP5{DRC{+0.5{{{0.5
{REAV1{DRC{+1.0{{{10**0
{REAVT{DRC{+1.0E+1{{{10**1
{{DRC{+1.0E+2{{{10**2
{{DRC{+1.0E+3{{{10**3
{{DRC{+1.0E+4{{{10**4
{{DRC{+1.0E+5{{{10**5
{{DRC{+1.0E+6{{{10**6
{{DRC{+1.0E+7{{{10**7
{{DRC{+1.0E+8{{{10**8
{{DRC{+1.0E+9{{{10**9
{REATT{DRC{+1.0E+10{{{10**10
{{EJC{{{{
*
*      STRING CONSTANTS (SCBLK FORMAT) FOR DTYPE PROCEDURE
*
{SCARR{DAC{B$SCL{{{ARRAY
{{DAC{5{{{
{{DTC{/ARRAY/{{{
*
{SCBUF{DAC{B$SCL{{{BUFFER
{{DAC{6{{{
{{DTC{/BUFFER/{{{
*
{SCCOD{DAC{B$SCL{{{CODE
{{DAC{4{{{
{{DTC{/CODE/{{{
*
{SCEXP{DAC{B$SCL{{{EXPRESSION
{{DAC{10{{{
{{DTC{/EXPRESSION/{{{
*
{SCEXT{DAC{B$SCL{{{EXTERNAL
{{DAC{8{{{
{{DTC{/EXTERNAL/{{{
*
{SCINT{DAC{B$SCL{{{INTEGER
{{DAC{7{{{
{{DTC{/INTEGER/{{{
*
{SCNAM{DAC{B$SCL{{{NAME
{{DAC{4{{{
{{DTC{/NAME/{{{
*
{SCNUM{DAC{B$SCL{{{NUMERIC
{{DAC{7{{{
{{DTC{/NUMERIC/{{{
*
{SCPAT{DAC{B$SCL{{{PATTERN
{{DAC{7{{{
{{DTC{/PATTERN/{{{
*
{SCREA{DAC{B$SCL{{{REAL
{{DAC{4{{{
{{DTC{/REAL/{{{
*
{SCSTR{DAC{B$SCL{{{STRING
{{DAC{6{{{
{{DTC{/STRING/{{{
*
{SCTAB{DAC{B$SCL{{{TABLE
{{DAC{5{{{
{{DTC{/TABLE/{{{
{{EJC{{{{
*
*      STRING CONSTANTS (SCBLK FORMAT) FOR KVRTN (SEE RETRN)
*
{SCFRT{DAC{B$SCL{{{FRETURN
{{DAC{7{{{
{{DTC{/FRETURN/{{{
*
{SCNRT{DAC{B$SCL{{{NRETURN
{{DAC{7{{{
{{DTC{/NRETURN/{{{
*
{SCRTN{DAC{B$SCL{{{RETURN
{{DAC{6{{{
{{DTC{/RETURN/{{{
*
*      DATATYPE NAME TABLE FOR DTYPE PROCEDURE. THE ORDER OF
*      THESE ENTRIES IS TIED TO THE B$XXX DEFINITIONS FOR BLOCKS
*
{SCNMT{DAC{SCARR{{{ARBLK     ARRAY
{{DAC{SCBUF{{{BFBLK     BUFFER
{{DAC{SCCOD{{{CDBLK     CODE
{{DAC{SCEXP{{{EXBLK     EXPRESSION
{{DAC{SCINT{{{ICBLK     INTEGER
{{DAC{SCNAM{{{NMBLK     NAME
{{DAC{SCPAT{{{P0BLK     PATTERN
{{DAC{SCPAT{{{P1BLK     PATTERN
{{DAC{SCPAT{{{P2BLK     PATTERN
{{DAC{SCREA{{{RCBLK     REAL
{{DAC{SCSTR{{{SCBLK     STRING
{{DAC{SCEXP{{{SEBLK     EXPRESSION
{{DAC{SCTAB{{{TBBLK     TABLE
{{DAC{SCARR{{{VCBLK     ARRAY
{{DAC{SCEXT{{{XNBLK     EXTERNAL
{{DAC{SCEXT{{{XRBLK     EXTERNAL
*
*      STRING CONSTANT FOR REAL ZERO
*
{SCRE0{DAC{B$SCL{{{
{{DAC{2{{{
{{DTC{/0./{{{
{{EJC{{{{
*
*      USED TO RE-INITIALISE KVSTL
*
{STLIM{DIC{+50000{{{DEFAULT STATEMENT LIMIT
*
*      DUMMY FUNCTION BLOCK USED FOR UNDEFINED FUNCTIONS
*
{STNDF{DAC{O$FUN{{{PTR TO UNDEFINED FUNCTION ERR CALL
{{DAC{0{{{DUMMY FARGS COUNT FOR CALL CIRCUIT
*
*      DUMMY CODE BLOCK USED FOR UNDEFINED LABELS
*
{STNDL{DAC{L$UND{{{CODE PTR POINTS TO UNDEFINED LBL
*
*      DUMMY OPERATOR BLOCK USED FOR UNDEFINED OPERATORS
*
{STNDO{DAC{O$OUN{{{PTR TO UNDEFINED OPERATOR ERR CALL
{{DAC{0{{{DUMMY FARGS COUNT FOR CALL CIRCUIT
*
*      STANDARD VARIABLE BLOCK. THIS BLOCK IS USED TO INITIALIZE
*      THE FIRST SEVEN FIELDS OF A NEWLY CONSTRUCTED VRBLK.
*      ITS FORMAT IS TIED TO THE VRBLK DEFINITIONS (SEE GTNVR).
*
{STNVR{DAC{B$VRL{{{VRGET
{{DAC{B$VRS{{{VRSTO
{{DAC{NULLS{{{VRVAL
{{DAC{B$VRG{{{VRTRA
{{DAC{STNDL{{{VRLBL
{{DAC{STNDF{{{VRFNC
{{DAC{0{{{VRNXT
{{EJC{{{{
*
*      MESSAGES USED IN END OF RUN PROCESSING (STOPR)
*
{STPM1{DAC{B$SCL{{{IN STATEMENT
{{DAC{12{{{
{{DTC{/IN STATEMENT/{{{
*
{STPM2{DAC{B$SCL{{{
{{DAC{14{{{
{{DTC{/STMTS EXECUTED/{{{
*
{STPM3{DAC{B$SCL{{{
{{DAC{13{{{
{{DTC{/RUN TIME-MSEC/{{{
*
{STPM4{DAC{B$SCL{{{
{{DAC{12{{{
{{DTC{$MCSEC / STMT${{{
*
{STPM5{DAC{B$SCL{{{
{{DAC{13{{{
{{DTC{/REGENERATIONS/{{{
*
*      CHARS FOR /TU/ ENDING CODE
*
{STRTU{DTC{/TU/{{{
*
*      TABLE USED BY CONVERT FUNCTION TO CHECK DATATYPE NAME
*      THE ENTRIES ARE ORDERED TO CORRESPOND TO BRANCH TABLE
*      IN S$CNV
*
{SVCTB{DAC{SCSTR{{{STRING
{{DAC{SCINT{{{INTEGER
{{DAC{SCNAM{{{NAME
{{DAC{SCPAT{{{PATTERN
{{DAC{SCARR{{{ARRAY
{{DAC{SCTAB{{{TABLE
{{DAC{SCEXP{{{EXPRESSION
{{DAC{SCCOD{{{CODE
{{DAC{SCNUM{{{NUMERIC
{{DAC{SCREA{{{REAL
{{DAC{SCBUF{{{BUFFER
{{DAC{0{{{ZERO MARKS END OF LIST
{{EJC{{{{
*
*      MESSAGES (SCBLK FORMAT) USED BY TRACE PROCEDURES
*
*
{TMASB{DAC{B$SCL{{{ASTERISKS FOR TRACE STATEMENT NO
{{DAC{13{{{
{{DTC{/************ /{{{
*
{TMBEB{DAC{B$SCL{{{BLANK-EQUAL-BLANK
{{DAC{3{{{
{{DTC{/ = /{{{
*
*      DUMMY TRBLK FOR EXPRESSION VARIABLE
*
{TRBEV{DAC{B$TRT{{{DUMMY TRBLK
*
*      DUMMY TRBLK FOR KEYWORD VARIABLE
*
{TRBKV{DAC{B$TRT{{{DUMMY TRBLK
*
*      DUMMY CODE BLOCK TO RETURN CONTROL TO TRXEQ PROCEDURE
*
{TRXDR{DAC{O$TXR{{{BLOCK POINTS TO RETURN ROUTINE
{TRXDC{DAC{TRXDR{{{POINTER TO BLOCK
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS
*
*      SEE SVBLK FORMAT FOR FULL DETAILS OF THE FORMAT. THE
*      VRBLKS ARE ORDERED BY LENGTH AND WITHIN EACH LENGTH THE
*      ORDER IS ALPHABETICAL BY NAME OF THE VARIABLE.
*
{V$EQF{DBC{SVFPR{{{EQ
{{DAC{2{{{
{{DTC{/EQ/{{{
{{DAC{S$EQF{{{
{{DAC{2{{{
*
{V$GEF{DBC{SVFPR{{{GE
{{DAC{2{{{
{{DTC{/GE/{{{
{{DAC{S$GEF{{{
{{DAC{2{{{
*
{V$GTF{DBC{SVFPR{{{GT
{{DAC{2{{{
{{DTC{/GT/{{{
{{DAC{S$GTF{{{
{{DAC{2{{{
*
{V$LEF{DBC{SVFPR{{{LE
{{DAC{2{{{
{{DTC{/LE/{{{
{{DAC{S$LEF{{{
{{DAC{2{{{
*
{V$LTF{DBC{SVFPR{{{LT
{{DAC{2{{{
{{DTC{/LT/{{{
{{DAC{S$LTF{{{
{{DAC{2{{{
*
{V$NEF{DBC{SVFPR{{{NE
{{DAC{2{{{
{{DTC{/NE/{{{
{{DAC{S$NEF{{{
{{DAC{2{{{
*
{V$ANY{DBC{SVFNP{{{ANY
{{DAC{3{{{
{{DTC{/ANY/{{{
{{DAC{S$ANY{{{
{{DAC{1{{{
*
{V$ARB{DBC{SVKVC{{{ARB
{{DAC{3{{{
{{DTC{/ARB/{{{
{{DAC{K$ARB{{{
{{DAC{NDARB{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$ARG{DBC{SVFNN{{{ARG
{{DAC{3{{{
{{DTC{/ARG/{{{
{{DAC{S$ARG{{{
{{DAC{2{{{
*
{V$BAL{DBC{SVKVC{{{BAL
{{DAC{3{{{
{{DTC{/BAL/{{{
{{DAC{K$BAL{{{
{{DAC{NDBAL{{{
*
{V$END{DBC{SVLBL{{{END
{{DAC{3{{{
{{DTC{/END/{{{
{{DAC{L$END{{{
*
{V$LEN{DBC{SVFNP{{{LEN
{{DAC{3{{{
{{DTC{/LEN/{{{
{{DAC{S$LEN{{{
{{DAC{1{{{
*
{V$LEQ{DBC{SVFPR{{{LEQ
{{DAC{3{{{
{{DTC{/LEQ/{{{
{{DAC{S$LEQ{{{
{{DAC{2{{{
*
{V$LGE{DBC{SVFPR{{{LGE
{{DAC{3{{{
{{DTC{/LGE/{{{
{{DAC{S$LGE{{{
{{DAC{2{{{
*
{V$LGT{DBC{SVFPR{{{LGT
{{DAC{3{{{
{{DTC{/LGT/{{{
{{DAC{S$LGT{{{
{{DAC{2{{{
*
{V$LLE{DBC{SVFPR{{{LLE
{{DAC{3{{{
{{DTC{/LLE/{{{
{{DAC{S$LLE{{{
{{DAC{2{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$LLT{DBC{SVFPR{{{LLT
{{DAC{3{{{
{{DTC{/LLT/{{{
{{DAC{S$LLT{{{
{{DAC{2{{{
*
{V$LNE{DBC{SVFPR{{{LNE
{{DAC{3{{{
{{DTC{/LNE/{{{
{{DAC{S$LNE{{{
{{DAC{2{{{
*
{V$POS{DBC{SVFNP{{{POS
{{DAC{3{{{
{{DTC{/POS/{{{
{{DAC{S$POS{{{
{{DAC{1{{{
*
{V$REM{DBC{SVKVC{{{REM
{{DAC{3{{{
{{DTC{/REM/{{{
{{DAC{K$REM{{{
{{DAC{NDREM{{{
*
{V$SET{DBC{SVFNN{{{SET
{{DAC{3{{{
{{DTC{/SET/{{{
{{DAC{S$SET{{{
{{DAC{3{{{
*
{V$TAB{DBC{SVFNP{{{TAB
{{DAC{3{{{
{{DTC{/TAB/{{{
{{DAC{S$TAB{{{
{{DAC{1{{{
*
{V$CAS{DBC{SVKNM{{{CASE
{{DAC{4{{{
{{DTC{/CASE/{{{
{{DAC{K$CAS{{{
*
{V$CHR{DBC{SVFNP{{{CHAR
{{DAC{4{{{
{{DTC{/CHAR/{{{
{{DAC{S$CHR{{{
{{DAC{1{{{
*
{V$COD{DBC{SVFNK{{{CODE
{{DAC{4{{{
{{DTC{/CODE/{{{
{{DAC{K$COD{{{
{{DAC{S$COD{{{
{{DAC{1{{{
*
{V$COP{DBC{SVFNN{{{COPY
{{DAC{4{{{
{{DTC{/COPY/{{{
{{DAC{S$COP{{{
{{DAC{1{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$DAT{DBC{SVFNN{{{DATA
{{DAC{4{{{
{{DTC{/DATA/{{{
{{DAC{S$DAT{{{
{{DAC{1{{{
*
{V$DTE{DBC{SVFNN{{{DATE
{{DAC{4{{{
{{DTC{/DATE/{{{
{{DAC{S$DTE{{{
{{DAC{0{{{
*
{V$DMP{DBC{SVFNK{{{DUMP
{{DAC{4{{{
{{DTC{/DUMP/{{{
{{DAC{K$DMP{{{
{{DAC{S$DMP{{{
{{DAC{1{{{
*
{V$DUP{DBC{SVFNN{{{DUPL
{{DAC{4{{{
{{DTC{/DUPL/{{{
{{DAC{S$DUP{{{
{{DAC{2{{{
*
{V$EVL{DBC{SVFNN{{{EVAL
{{DAC{4{{{
{{DTC{/EVAL/{{{
{{DAC{S$EVL{{{
{{DAC{1{{{
*
{V$EXT{DBC{SVFNN{{{EXIT
{{DAC{4{{{
{{DTC{/EXIT/{{{
{{DAC{S$EXT{{{
{{DAC{1{{{
*
{V$FAL{DBC{SVKVC{{{FAIL
{{DAC{4{{{
{{DTC{/FAIL/{{{
{{DAC{K$FAL{{{
{{DAC{NDFAL{{{
*
{V$HST{DBC{SVFNN{{{HOST
{{DAC{4{{{
{{DTC{/HOST/{{{
{{DAC{S$HST{{{
{{DAC{3{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$ITM{DBC{SVFNF{{{ITEM
{{DAC{4{{{
{{DTC{/ITEM/{{{
{{DAC{S$ITM{{{
{{DAC{999{{{
*
{V$LOD{DBC{SVFNN{{{LOAD
{{DAC{4{{{
{{DTC{/LOAD/{{{
{{DAC{S$LOD{{{
{{DAC{2{{{
*
{V$LPD{DBC{SVFNP{{{LPAD
{{DAC{4{{{
{{DTC{/LPAD/{{{
{{DAC{S$LPD{{{
{{DAC{3{{{
*
{V$RPD{DBC{SVFNP{{{RPAD
{{DAC{4{{{
{{DTC{/RPAD/{{{
{{DAC{S$RPD{{{
{{DAC{3{{{
*
{V$RPS{DBC{SVFNP{{{RPOS
{{DAC{4{{{
{{DTC{/RPOS/{{{
{{DAC{S$RPS{{{
{{DAC{1{{{
*
{V$RTB{DBC{SVFNP{{{RTAB
{{DAC{4{{{
{{DTC{/RTAB/{{{
{{DAC{S$RTB{{{
{{DAC{1{{{
*
{V$SI${DBC{SVFNP{{{SIZE
{{DAC{4{{{
{{DTC{/SIZE/{{{
{{DAC{S$SI${{{
{{DAC{1{{{
*
*
{V$SRT{DBC{SVFNN{{{SORT
{{DAC{4{{{
{{DTC{/SORT/{{{
{{DAC{S$SRT{{{
{{DAC{2{{{
{V$SPN{DBC{SVFNP{{{SPAN
{{DAC{4{{{
{{DTC{/SPAN/{{{
{{DAC{S$SPN{{{
{{DAC{1{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$STN{DBC{SVKNM{{{STNO
{{DAC{4{{{
{{DTC{/STNO/{{{
{{DAC{K$STN{{{
*
{V$TIM{DBC{SVFNN{{{TIME
{{DAC{4{{{
{{DTC{/TIME/{{{
{{DAC{S$TIM{{{
{{DAC{0{{{
*
{V$TRM{DBC{SVFNK{{{TRIM
{{DAC{4{{{
{{DTC{/TRIM/{{{
{{DAC{K$TRM{{{
{{DAC{S$TRM{{{
{{DAC{1{{{
*
{V$ABE{DBC{SVKNM{{{ABEND
{{DAC{5{{{
{{DTC{/ABEND/{{{
{{DAC{K$ABE{{{
*
{V$ABO{DBC{SVKVL{{{ABORT
{{DAC{5{{{
{{DTC{/ABORT/{{{
{{DAC{K$ABO{{{
{{DAC{L$ABO{{{
{{DAC{NDABO{{{
*
{V$APP{DBC{SVFNF{{{APPLY
{{DAC{5{{{
{{DTC{/APPLY/{{{
{{DAC{S$APP{{{
{{DAC{999{{{
*
{V$ABN{DBC{SVFNP{{{ARBNO
{{DAC{5{{{
{{DTC{/ARBNO/{{{
{{DAC{S$ABN{{{
{{DAC{1{{{
*
{V$ARR{DBC{SVFNN{{{ARRAY
{{DAC{5{{{
{{DTC{/ARRAY/{{{
{{DAC{S$ARR{{{
{{DAC{2{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$BRK{DBC{SVFNP{{{BREAK
{{DAC{5{{{
{{DTC{/BREAK/{{{
{{DAC{S$BRK{{{
{{DAC{1{{{
*
{V$CLR{DBC{SVFNN{{{CLEAR
{{DAC{5{{{
{{DTC{/CLEAR/{{{
{{DAC{S$CLR{{{
{{DAC{1{{{
*
{V$EJC{DBC{SVFNN{{{EJECT
{{DAC{5{{{
{{DTC{/EJECT/{{{
{{DAC{S$EJC{{{
{{DAC{1{{{
*
{V$FEN{DBC{SVFPK{{{FENCE
{{DAC{5{{{
{{DTC{/FENCE/{{{
{{DAC{K$FEN{{{
{{DAC{S$FNC{{{
{{DAC{1{{{
{{DAC{NDFEN{{{
*
{V$FLD{DBC{SVFNN{{{FIELD
{{DAC{5{{{
{{DTC{/FIELD/{{{
{{DAC{S$FLD{{{
{{DAC{2{{{
*
{V$IDN{DBC{SVFPR{{{IDENT
{{DAC{5{{{
{{DTC{/IDENT/{{{
{{DAC{S$IDN{{{
{{DAC{2{{{
*
{V$INP{DBC{SVFNK{{{INPUT
{{DAC{5{{{
{{DTC{/INPUT/{{{
{{DAC{K$INP{{{
{{DAC{S$INP{{{
{{DAC{3{{{
*
{V$LOC{DBC{SVFNN{{{LOCAL
{{DAC{5{{{
{{DTC{/LOCAL/{{{
{{DAC{S$LOC{{{
{{DAC{2{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$OPS{DBC{SVFNN{{{OPSYN
{{DAC{5{{{
{{DTC{/OPSYN/{{{
{{DAC{S$OPS{{{
{{DAC{3{{{
*
{V$RMD{DBC{SVFNP{{{REMDR
{{DAC{5{{{
{{DTC{/REMDR/{{{
{{DAC{S$RMD{{{
{{DAC{2{{{
*
{V$RSR{DBC{SVFNN{{{RSORT
{{DAC{5{{{
{{DTC{/RSORT/{{{
{{DAC{S$RSR{{{
{{DAC{2{{{
*
{V$TBL{DBC{SVFNN{{{TABLE
{{DAC{5{{{
{{DTC{/TABLE/{{{
{{DAC{S$TBL{{{
{{DAC{3{{{
*
{V$TRA{DBC{SVFNK{{{TRACE
{{DAC{5{{{
{{DTC{/TRACE/{{{
{{DAC{K$TRA{{{
{{DAC{S$TRA{{{
{{DAC{4{{{
*
{V$ANC{DBC{SVKNM{{{ANCHOR
{{DAC{6{{{
{{DTC{/ANCHOR/{{{
{{DAC{K$ANC{{{
*
{V$APN{DBC{SVFNN{{{
{{DAC{6{{{
{{DTC{/APPEND/{{{
{{DAC{S$APN{{{
{{DAC{2{{{
*
{V$BKX{DBC{SVFNP{{{BREAKX
{{DAC{6{{{
{{DTC{/BREAKX/{{{
{{DAC{S$BKX{{{
{{DAC{1{{{
*
{V$BUF{DBC{SVFNN{{{BUFFER
{{DAC{6{{{
{{DTC{/BUFFER/{{{
{{DAC{S$BUF{{{
{{DAC{2{{{
*
{V$DEF{DBC{SVFNN{{{DEFINE
{{DAC{6{{{
{{DTC{/DEFINE/{{{
{{DAC{S$DEF{{{
{{DAC{2{{{
*
{V$DET{DBC{SVFNN{{{DETACH
{{DAC{6{{{
{{DTC{/DETACH/{{{
{{DAC{S$DET{{{
{{DAC{1{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$DIF{DBC{SVFPR{{{DIFFER
{{DAC{6{{{
{{DTC{/DIFFER/{{{
{{DAC{S$DIF{{{
{{DAC{2{{{
*
{V$FTR{DBC{SVKNM{{{FTRACE
{{DAC{6{{{
{{DTC{/FTRACE/{{{
{{DAC{K$FTR{{{
*
{V$INS{DBC{SVFNN{{{INSERT
{{DAC{6{{{
{{DTC{/INSERT/{{{
{{DAC{S$INS{{{
{{DAC{4{{{
*
{V$LST{DBC{SVKNM{{{LASTNO
{{DAC{6{{{
{{DTC{/LASTNO/{{{
{{DAC{K$LST{{{
*
{V$NAY{DBC{SVFNP{{{NOTANY
{{DAC{6{{{
{{DTC{/NOTANY/{{{
{{DAC{S$NAY{{{
{{DAC{1{{{
*
{V$OUP{DBC{SVFNK{{{OUTPUT
{{DAC{6{{{
{{DTC{/OUTPUT/{{{
{{DAC{K$OUP{{{
{{DAC{S$OUP{{{
{{DAC{3{{{
*
{V$RET{DBC{SVLBL{{{RETURN
{{DAC{6{{{
{{DTC{/RETURN/{{{
{{DAC{L$RTN{{{
*
{V$REW{DBC{SVFNN{{{REWIND
{{DAC{6{{{
{{DTC{/REWIND/{{{
{{DAC{S$REW{{{
{{DAC{1{{{
*
{V$STT{DBC{SVFNN{{{STOPTR
{{DAC{6{{{
{{DTC{/STOPTR/{{{
{{DAC{S$STT{{{
{{DAC{2{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$SUB{DBC{SVFNN{{{SUBSTR
{{DAC{6{{{
{{DTC{/SUBSTR/{{{
{{DAC{S$SUB{{{
{{DAC{3{{{
*
{V$UNL{DBC{SVFNN{{{UNLOAD
{{DAC{6{{{
{{DTC{/UNLOAD/{{{
{{DAC{S$UNL{{{
{{DAC{1{{{
*
{V$COL{DBC{SVFNN{{{COLLECT
{{DAC{7{{{
{{DTC{/COLLECT/{{{
{{DAC{S$COL{{{
{{DAC{1{{{
*
{V$CNV{DBC{SVFNN{{{CONVERT
{{DAC{7{{{
{{DTC{/CONVERT/{{{
{{DAC{S$CNV{{{
{{DAC{2{{{
*
{V$ENF{DBC{SVFNN{{{ENDFILE
{{DAC{7{{{
{{DTC{/ENDFILE/{{{
{{DAC{S$ENF{{{
{{DAC{1{{{
*
{V$ETX{DBC{SVKNM{{{ERRTEXT
{{DAC{7{{{
{{DTC{/ERRTEXT/{{{
{{DAC{K$ETX{{{
*
{V$ERT{DBC{SVKNM{{{ERRTYPE
{{DAC{7{{{
{{DTC{/ERRTYPE/{{{
{{DAC{K$ERT{{{
*
{V$FRT{DBC{SVLBL{{{FRETURN
{{DAC{7{{{
{{DTC{/FRETURN/{{{
{{DAC{L$FRT{{{
*
{V$INT{DBC{SVFPR{{{INTEGER
{{DAC{7{{{
{{DTC{/INTEGER/{{{
{{DAC{S$INT{{{
{{DAC{1{{{
*
{V$NRT{DBC{SVLBL{{{NRETURN
{{DAC{7{{{
{{DTC{/NRETURN/{{{
{{DAC{L$NRT{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
*
{V$PFL{DBC{SVKNM{{{PROFILE
{{DAC{7{{{
{{DTC{/PROFILE/{{{
{{DAC{K$PFL{{{
*
{V$RPL{DBC{SVFNP{{{REPLACE
{{DAC{7{{{
{{DTC{/REPLACE/{{{
{{DAC{S$RPL{{{
{{DAC{3{{{
*
{V$RVS{DBC{SVFNP{{{REVERSE
{{DAC{7{{{
{{DTC{/REVERSE/{{{
{{DAC{S$RVS{{{
{{DAC{1{{{
*
{V$RTN{DBC{SVKNM{{{RTNTYPE
{{DAC{7{{{
{{DTC{/RTNTYPE/{{{
{{DAC{K$RTN{{{
*
{V$STX{DBC{SVFNN{{{SETEXIT
{{DAC{7{{{
{{DTC{/SETEXIT/{{{
{{DAC{S$STX{{{
{{DAC{1{{{
*
{V$STC{DBC{SVKNM{{{STCOUNT
{{DAC{7{{{
{{DTC{/STCOUNT/{{{
{{DAC{K$STC{{{
*
{V$STL{DBC{SVKNM{{{STLIMIT
{{DAC{7{{{
{{DTC{/STLIMIT/{{{
{{DAC{K$STL{{{
*
{V$SUC{DBC{SVKVC{{{SUCCEED
{{DAC{7{{{
{{DTC{/SUCCEED/{{{
{{DAC{K$SUC{{{
{{DAC{NDSUC{{{
*
{V$ALP{DBC{SVKWC{{{ALPHABET
{{DAC{8{{{
{{DTC{/ALPHABET/{{{
{{DAC{K$ALP{{{
*
{V$CNT{DBC{SVLBL{{{CONTINUE
{{DAC{8{{{
{{DTC{/CONTINUE/{{{
{{DAC{L$CNT{{{
{{EJC{{{{
*
*      STANDARD VARIABLE BLOCKS (CONTINUED)
*
{V$DTP{DBC{SVFNP{{{DATATYPE
{{DAC{8{{{
{{DTC{/DATATYPE/{{{
{{DAC{S$DTP{{{
{{DAC{1{{{
*
{V$ERL{DBC{SVKNM{{{ERRLIMIT
{{DAC{8{{{
{{DTC{/ERRLIMIT/{{{
{{DAC{K$ERL{{{
*
{V$FNC{DBC{SVKNM{{{FNCLEVEL
{{DAC{8{{{
{{DTC{/FNCLEVEL/{{{
{{DAC{K$FNC{{{
*
{V$MXL{DBC{SVKNM{{{MAXLNGTH
{{DAC{8{{{
{{DTC{/MAXLNGTH/{{{
{{DAC{K$MXL{{{
*
{V$TER{DBC{0{{{TERMINAL
{{DAC{8{{{
{{DTC{/TERMINAL/{{{
{{DAC{0{{{
*
{V$PRO{DBC{SVFNN{{{PROTOTYPE
{{DAC{9{{{
{{DTC{/PROTOTYPE/{{{
{{DAC{S$PRO{{{
{{DAC{1{{{
*
{{DBC{0{{{DUMMY ENTRY TO END LIST
{{DAC{10{{{LENGTH GT 9 (PROTOTYPE)
{{EJC{{{{
*
*      LIST OF SVBLK POINTERS FOR KEYWORDS TO BE DUMPED. THE
*      LIST IS IN THE ORDER WHICH APPEARS ON THE DUMP OUTPUT.
*
{VDMKW{DAC{V$ANC{{{ANCHOR
{{DAC{V$CAS{{{CCASE
{{DAC{V$COD{{{CODE
{{DAC{V$DMP{{{DUMP
{{DAC{V$ERL{{{ERRLIMIT
{{DAC{V$ETX{{{ERRTEXT
{{DAC{V$ERT{{{ERRTYPE
{{DAC{V$FNC{{{FNCLEVEL
{{DAC{V$FTR{{{FTRACE
{{DAC{V$INP{{{INPUT
{{DAC{V$LST{{{LASTNO
{{DAC{V$MXL{{{MAXLENGTH
{{DAC{V$OUP{{{OUTPUT
{{DAC{V$PFL{{{PROFILE
{{DAC{V$RTN{{{RTNTYPE
{{DAC{V$STC{{{STCOUNT
{{DAC{V$STL{{{STLIMIT
{{DAC{V$STN{{{STNO
{{DAC{V$TRA{{{TRACE
{{DAC{V$TRM{{{TRIM
{{DAC{0{{{END OF LIST
*
*      TABLE USED BY GTNVR TO SEARCH SVBLK LISTS
*
{VSRCH{DAC{0{{{DUMMY ENTRY TO GET PROPER INDEXING
{{DAC{V$EQF{{{START OF 1 CHAR VARIABLES (NONE)
{{DAC{V$EQF{{{START OF 2 CHAR VARIABLES
{{DAC{V$ANY{{{START OF 3 CHAR VARIABLES
{{DAC{V$CAS{{{START OF 4 CHAR VARIABLES
{{DAC{V$ABE{{{START OF 5 CHAR VARIABLES
{{DAC{V$ANC{{{START OF 6 CHAR VARIABLES
{{DAC{V$COL{{{START OF 7 CHAR VARIABLES
{{DAC{V$ALP{{{START OF 8 CHAR VARIABLES
{{DAC{V$PRO{{{START OF 9 CHAR VARIABLES
{{TTL{S{{{P I T B O L -- WORKING STORAGE SECTION
*
*      THE WORKING STORAGE SECTION CONTAINS AREAS WHICH ARE
*      CHANGED DURING EXECUTION OF THE PROGRAM. THE VALUE
*      ASSEMBLED IS THE INITIAL VALUE BEFORE EXECUTION STARTS.
*
*      ALL THESE AREAS ARE FIXED LENGTH AREAS. VARIABLE LENGTH
*      DATA IS STORED IN THE STATIC OR DYNAMIC REGIONS OF THE
*      ALLOCATED DATA AREAS.
*
*      THE VALUES IN THIS AREA ARE DESCRIBED EITHER AS WORK
*      AREAS OR AS GLOBAL VALUES. A WORK AREA IS USED IN AN
*      EPHEMERAL MANNER AND THE VALUE IS NOT SAVED FROM ONE
*      ENTRY INTO A ROUTINE TO ANOTHER. A GLOBAL VALUE IS A
*      LESS TEMPORARY LOCATION WHOSE VALUE IS SAVED FROM ONE
*      CALL TO ANOTHER.
*
*      A GENERAL PART OF THE APPROACH IN THIS PROGRAM IS NOT
*      TO OVERLAP WORK AREAS BETWEEN PROCEDURES EVEN THOUGH A
*      SMALL AMOUNT OF SPACE COULD BE SAVED. SUCH OVERLAP IS
*      CONSIDERED A SOURCE OF PROGRAM ERRORS AND DECREASES THE
*      INFORMATION LEFT BEHIND AFTER A SYSTEM CRASH OF ANY KIND.
*
*      THE NAMES OF THESE LOCATIONS ARE LABELS WITH FIVE LETTER
*      (A-Y,$) NAMES. AS FAR AS POSSIBLE THE ORDER IS KEPT
*      ALPHABETICAL BY THESE NAMES BUT IN SOME CASES THERE
*      ARE SLIGHT DEPARTURES CAUSED BY OTHER ORDER REQUIREMENTS.
*
*      UNLESS OTHERWISE DOCUMENTED, THE ORDER OF WORK AREAS
*      DOES NOT AFFECT THE EXECUTION OF THE SPITBOL PROGRAM.
*
{{SEC{{{{START OF WORKING STORAGE SECTION
{{EJC{{{{
*
*      THIS AREA IS NOT CLEARED BY INITIAL CODE
*
{CMLAB{DAC{B$SCL{{{STRING USED TO CHECK LABEL LEGALITY
{{DAC{2{{{
{{DTC{/  /{{{
*
*      LABEL TO MARK START OF WORK AREA
*
{AAAAA{DAC{0{{{
*
*      WORK AREAS FOR ALLOC PROCEDURE
*
{ALDYN{DAC{0{{{AMOUNT OF DYNAMIC STORE
{ALFSF{DIC{+0{{{FACTOR IN FREE STORE PCNTAGE CHECK
{ALLIA{DIC{+0{{{DUMP IA
{ALLSV{DAC{0{{{SAVE WB IN ALLOC
*
*      WORK AREAS FOR ALOST PROCEDURE
*
{ALSTA{DAC{0{{{SAVE WA IN ALOST
*
*      SAVE AREAS FOR ARRAY FUNCTION (S$ARR)
*
{ARCDM{DAC{0{{{COUNT DIMENSIONS
{ARNEL{DIC{+0{{{COUNT ELEMENTS
{ARPTR{DAC{0{{{OFFSET PTR INTO ARBLK
{ARSVL{DIC{+0{{{SAVE INTEGER LOW BOUND
{{EJC{{{{
*      WORK AREAS FOR ARREF ROUTINE
*
{ARFSI{DIC{+0{{{SAVE CURRENT EVOLVING SUBSCRIPT
{ARFXS{DAC{0{{{SAVE BASE STACK POINTER
*
*      WORK AREAS FOR B$EFC BLOCK ROUTINE
*
{BEFOF{DAC{0{{{SAVE OFFSET PTR INTO EFBLK
*
*      WORK AREAS FOR B$PFC BLOCK ROUTINE
*
{BPFPF{DAC{0{{{SAVE PFBLK POINTER
{BPFSV{DAC{0{{{SAVE OLD FUNCTION VALUE
{BPFXT{DAC{0{{{POINTER TO STACKED ARGUMENTS
*
*      SAVE AREAS FOR COLLECT FUNCTION (S$COL)
*
{CLSVI{DIC{+0{{{SAVE INTEGER ARGUMENT
*
*      GLOBAL VALUES FOR CMPIL PROCEDURE
*
{CMERC{DAC{0{{{COUNT OF INITIAL COMPILE ERRORS
{CMPXS{DAC{0{{{SAVE STACK PTR IN CASE OF ERRORS
{CMPSN{DAC{1{{{NUMBER OF NEXT STATEMENT TO COMPILE
{CMPSS{DAC{0{{{SAVE SUBROUTINE STACK PTR
*
*      WORK AREA FOR CNCRD
*
{CNSCC{DAC{0{{{POINTER TO CONTROL CARD STRING
{CNSWC{DAC{0{{{WORD COUNT
{CNR$T{DAC{0{{{POINTER TO R$TTL OR R$STL
{CNTTL{DAC{0{{{FLAG FOR -TITLE, -STITL
*
*      WORK AREAS FOR CONVERT FUNCTION (S$CNV)
*
{CNVTP{DAC{0{{{SAVE PTR INTO SCVTB
*
*      FLAG FOR SUPPRESSION OF COMPILATION STATISTICS.
*
{CPSTS{DAC{0{{{SUPPRESS COMP. STATS IF NON ZERO
*
*      GLOBAL VALUES FOR CONTROL CARD SWITCHES
*
{CSWDB{DAC{0{{{0/1 FOR -SINGLE/-DOUBLE
{CSWER{DAC{0{{{0/1 FOR -ERRORS/-NOERRORS
{CSWEX{DAC{0{{{0/1 FOR -EXECUTE/-NOEXECUTE
{CSWFL{DAC{1{{{0/1 FOR -NOFAIL/-FAIL
{CSWIN{DAC{INILN{{{XXX FOR -INXXX
{CSWLS{DAC{1{{{0/1 FOR -NOLIST/-LIST
{CSWNO{DAC{0{{{0/1 FOR -OPTIMISE/-NOOPT
{CSWPR{DAC{0{{{0/1 FOR -NOPRINT/-PRINT
*
*      GLOBAL LOCATION USED BY PATST PROCEDURE
*
{CTMSK{DBC{0{{{LAST BIT POSITION USED IN R$CTP
{CURID{DAC{0{{{CURRENT ID VALUE
{{EJC{{{{
*
*      GLOBAL VALUE FOR CDWRD PROCEDURE
*
{CWCOF{DAC{0{{{NEXT WORD OFFSET IN CURRENT CCBLK
*
*      WORK AREAS FOR DATA FUNCTION (S$DAT)
*
{DATDV{DAC{0{{{SAVE VRBLK PTR FOR DATATYPE NAME
{DATXS{DAC{0{{{SAVE INITIAL STACK POINTER
*
*      WORK AREAS FOR DEFINE FUNCTION (S$DEF)
*
{DEFLB{DAC{0{{{SAVE VRBLK PTR FOR LABEL
{DEFNA{DAC{0{{{COUNT FUNCTION ARGUMENTS
{DEFVR{DAC{0{{{SAVE VRBLK PTR FOR FUNCTION NAME
{DEFXS{DAC{0{{{SAVE INITIAL STACK POINTER
*
*      WORK AREAS FOR DUMPR PROCEDURE
*
{DMARG{DAC{0{{{DUMP ARGUMENT
{DMPKB{DAC{B$KVT{{{DUMMY KVBLK FOR USE IN DUMPR
{DMPKT{DAC{TRBKV{{{KVVAR TRBLK POINTER
{DMPKN{DAC{0{{{KEYWORD NUMBER (MUST FOLLOW DMPKB)
{DMPSA{DAC{0{{{PRESERVE WA OVER PRTVL CALL
{DMPSV{DAC{0{{{GENERAL SCRATCH SAVE
{DMVCH{DAC{0{{{CHAIN POINTER FOR VARIABLE BLOCKS
{DMPCH{DAC{0{{{SAVE SORTED VRBLK CHAIN POINTER
*
*      GLOBAL LOCATIONS FOR DYNAMIC STORAGE POINTERS
*
{DNAMB{DAC{0{{{START OF DYNAMIC AREA
{DNAMP{DAC{0{{{NEXT AVAILABLE LOC IN DYNAMIC AREA
{DNAME{DAC{0{{{END OF AVAILABLE DYNAMIC AREA
*
*      WORK AREA FOR DTACH
*
{DTCNB{DAC{0{{{NAME BASE
{DTCNM{DAC{0{{{NAME PTR
*
*      WORK AREAS FOR DUPL FUNCTION (S$DUP)
*
{DUPSI{DIC{+0{{{STORE INTEGER STRING LENGTH
*
*      WORK AREA FOR ENDFILE (S$ENF)
*
{ENFCH{DAC{0{{{FOR IOCHN CHAIN HEAD
*
*      WORK AREA FOR ERROR PROCESSING.
*
{ERICH{DAC{0{{{COPY ERROR REPORTS TO INT.CHAN IF 1
{ERLST{DAC{0{{{FOR LISTR WHEN ERRORS GO TO INT.CH.
{ERRFT{DAC{0{{{FATAL ERROR FLAG
{ERRSP{DAC{0{{{ERROR SUPPRESSION FLAG
{{EJC{{{{
*
*      DUMP AREA FOR ERTEX
*
{ERTWA{DAC{0{{{SAVE WA
{ERTWB{DAC{0{{{SAVE WB
*
*      GLOBAL VALUES FOR EVALI
*
{EVLIN{DAC{P$LEN{{{DUMMY PATTERN BLOCK PCODE
{EVLIS{DAC{0{{{POINTER TO SUBSEQUENT NODE
{EVLIV{DAC{0{{{VALUE OF PARAMETER
*      WORK AREA FOR EXPAN
*
{EXPSV{DAC{0{{{SAVE OP DOPE VECTOR POINTER
*
*      FLAG FOR SUPPRESSION OF EXECUTION STATS
*
{EXSTS{DAC{0{{{SUPPRESS EXEC STATS IF SET
*
*      GLOBAL VALUES FOR EXFAL AND RETURN
*
{FLPRT{DAC{0{{{LOCATION OF FAIL OFFSET FOR RETURN
{FLPTR{DAC{0{{{LOCATION OF FAILURE OFFSET ON STACK
*
*      WORK AREAS FOR GBCOL PROCEDURE
*
{GBCFL{DAC{0{{{GARBAGE COLLECTOR ACTIVE FLAG
{GBCLM{DAC{0{{{POINTER TO LAST MOVE BLOCK (PASS 3)
{GBCNM{DAC{0{{{DUMMY FIRST MOVE BLOCK
{GBCNS{DAC{0{{{REST OF DUMMY BLOCK (FOLLOWS GBCNM)
{GBSVA{DAC{0{{{SAVE WA
{GBSVB{DAC{0{{{SAVE WB
{GBSVC{DAC{0{{{SAVE WC
*
*      GLOBAL LOCATION TO COUNT GARBAGE COLLECTIONS (GBCOL)
*
{GBCNT{DAC{0{{{COUNT OF GARBAGE COLLECTIONS
*
*      WORK AREAS FOR GTNVR PROCEDURE
*
{GNVHE{DAC{0{{{PTR TO END OF HASH CHAIN
{GNVNW{DAC{0{{{NUMBER OF WORDS IN STRING NAME
{GNVSA{DAC{0{{{SAVE WA
{GNVSB{DAC{0{{{SAVE WB
{GNVSP{DAC{0{{{POINTER INTO VSRCH TABLE
{GNVST{DAC{0{{{POINTER TO CHARS OF STRING
*
*      GLOBAL VALUE FOR GTCOD AND GTEXP
*
{GTCEF{DAC{0{{{SAVE FAIL PTR IN CASE OF ERROR
*
*      WORK AREAS FOR GTINT
*
{GTINA{DAC{0{{{SAVE WA
{GTINB{DAC{0{{{SAVE WB
{{EJC{{{{
*
*      WORK AREAS FOR GTNUM PROCEDURE
*
{GTNNF{DAC{0{{{ZERO/NONZERO FOR RESULT +/-
{GTNSI{DIC{+0{{{GENERAL INTEGER SAVE
{GTNDF{DAC{0{{{0/1 FOR DEC POINT SO FAR NO/YES
{GTNES{DAC{0{{{ZERO/NONZERO EXPONENT +/-
{GTNEX{DIC{+0{{{REAL EXPONENT
{GTNSC{DAC{0{{{SCALE (PLACES AFTER POINT)
{GTNSR{DRC{+0.0{{{GENERAL REAL SAVE
{GTNRD{DAC{0{{{FLAG FOR OK REAL NUMBER
*
*      WORK AREAS FOR GTPAT PROCEDURE
*
{GTPSB{DAC{0{{{SAVE WB
*
*      WORK AREAS FOR GTSTG PROCEDURE
*
{GTSSF{DAC{0{{{0/1 FOR RESULT +/-
{GTSVC{DAC{0{{{SAVE WC
{GTSVB{DAC{0{{{SAVE WB
{GTSWK{DAC{0{{{PTR TO WORK AREA FOR GTSTG
{GTSES{DAC{0{{{CHAR + OR - FOR EXPONENT +/-
{GTSRS{DRC{+0.0{{{GENERAL REAL SAVE
*
*      GLOBAL LOCATIONS (CONSTANTS) FOR GTSTG PROCEDURE
*
{GTSRN{DRC{+0.0{{{ROUNDING FACTOR 0.5*10**-CFP$S
{GTSSC{DRC{+0.0{{{SCALING VALUE 10**CFP$S
*
*      WORK AREAS FOR GTVAR PROCEDURE
*
{GTVRC{DAC{0{{{SAVE WC
*
*      FLAG FOR HEADER PRINTING
*
{HEADP{DAC{0{{{HEADER PRINTED FLAG
*
*      GLOBAL VALUES FOR VARIABLE HASH TABLE
*
{HSHNB{DIC{+0{{{NUMBER OF HASH BUCKETS
{HSHTB{DAC{0{{{POINTER TO START OF VRBLK HASH TABL
{HSHTE{DAC{0{{{POINTER PAST END OF VRBLK HASH TABL
*
*      WORK AREA FOR INIT
*
{INISS{DAC{0{{{SAVE SUBROUTINE STACK PTR
{INITR{DAC{0{{{SAVE TERMINAL FLAG
*
*      SAVE AREA FOR INSBF
*
{INSAB{DAC{0{{{ENTRY WA + ENTRY WB
{INSSA{DAC{0{{{SAVE ENTRY WA
{INSSB{DAC{0{{{SAVE ENTRY WB
{INSSC{DAC{0{{{SAVE ENTRY WC
*
*      WORK AREAS FOR IOPUT
*
{IOPTT{DAC{0{{{TYPE OF ASSOCIATION
{{EJC{{{{
*
*      GLOBAL VALUES FOR KEYWORD VALUES WHICH ARE STORED AS ONE
*      WORD INTEGERS. THESE VALUES MUST BE ASSEMBLED IN THE
*      FOLLOWING ORDER (AS DICTATED BY K$XXX DEFINITION VALUES).
*
{KVABE{DAC{0{{{ABEND
{KVANC{DAC{0{{{ANCHOR
{KVCAS{DAC{0{{{CASE
{KVCOD{DAC{0{{{CODE
{KVDMP{DAC{0{{{DUMP
{KVERL{DAC{0{{{ERRLIMIT
{KVERT{DAC{0{{{ERRTYPE
{KVFTR{DAC{0{{{FTRACE
{KVINP{DAC{1{{{INPUT
{KVMXL{DAC{5000{{{MAXLENGTH
{KVOUP{DAC{1{{{OUTPUT
{KVPFL{DAC{0{{{PROFILE
{KVTRA{DAC{0{{{TRACE
{KVTRM{DAC{0{{{TRIM
{KVFNC{DAC{0{{{FNCLEVEL
{KVLST{DAC{0{{{LASTNO
{KVSTN{DAC{0{{{STNO
*
*      GLOBAL VALUES FOR OTHER KEYWORDS
*
{KVALP{DAC{0{{{ALPHABET
{KVRTN{DAC{NULLS{{{RTNTYPE (SCBLK POINTER)
{KVSTL{DIC{+50000{{{STLIMIT
{KVSTC{DIC{+50000{{{STCOUNT (COUNTS DOWN FROM STLIMIT)
*
*      WORK AREAS FOR LOAD FUNCTION
*
{LODFN{DAC{0{{{POINTER TO VRBLK FOR FUNC NAME
{LODNA{DAC{0{{{COUNT NUMBER OF ARGUMENTS
*
*      GLOBAL VALUES FOR LISTR PROCEDURE
*
{LSTLC{DAC{0{{{COUNT LINES ON SOURCE LIST PAGE
{LSTNP{DAC{0{{{MAX NUMBER OF LINES ON PAGE
{LSTPF{DAC{1{{{SET NONZERO IF CURRENT IMAGE LISTED
{LSTPG{DAC{0{{{CURRENT SOURCE LIST PAGE NUMBER
{LSTPO{DAC{0{{{OFFSET TO   PAGE NNN   MESSAGE
{LSTSN{DAC{0{{{REMEMBER LAST STMNUM LISTED
*
*      MAXIMUM SIZE OF SPITBOL OBJECTS
*
{MXLEN{DAC{0{{{INITIALISED BY SYSMX CALL
*
*      EXECUTION CONTROL VARIABLE
*
{NOXEQ{DAC{0{{{SET NON-ZERO TO INHIBIT EXECUTION
*
*      PROFILER GLOBAL VALUES AND WORK LOCATIONS
*
{PFDMP{DAC{0{{{SET NON-0 IF &PROFILE SET NON-0
{PFFNC{DAC{0{{{SET NON-0 IF FUNCT JUST ENTERED
{PFSTM{DIC{+0{{{TO STORE STARTING TIME OF STMT
{PFETM{DIC{+0{{{TO STORE ENDING TIME OF STMT
{PFSVW{DAC{0{{{TO SAVE A W-REG
{PFTBL{DAC{0{{{GETS ADRS OF (IMAG) TABLE BASE
{PFNTE{DAC{0{{{NR OF TABLE ENTRIES
{PFSTE{DIC{+0{{{GETS INT REP OF TABLE ENTRY SIZE
*
{{EJC{{{{
*
*      GLOBAL VALUES USED IN PATTERN MATCH ROUTINES
*
{PMDFL{DAC{0{{{PATTERN ASSIGNMENT FLAG
{PMHBS{DAC{0{{{HISTORY STACK BASE POINTER
{PMSSL{DAC{0{{{LENGTH OF SUBJECT STRING IN CHARS
*
*      FLAGS USED FOR STANDARD FILE LISTING OPTIONS
*
{PRICH{DAC{0{{{PRINTER ON INTERACTIVE CHANNEL
{PRSTD{DAC{0{{{TESTED BY PRTPG
{PRSTO{DAC{0{{{STANDARD LISTING OPTION FLAG
*
*      GLOBAL VALUE FOR PRTNM PROCEDURE
*
{PRNMV{DAC{0{{{VRBLK PTR FROM LAST NAME SEARCH
*
*      WORK AREAS FOR PRTNM PROCEDURE
*
{PRNSI{DIC{+0{{{SCRATCH INTEGER LOC
*
*      WORK AREAS FOR PRTSN PROCEDURE
*
{PRSNA{DAC{0{{{SAVE WA
*
*      GLOBAL VALUES FOR PRINT PROCEDURES
*
{PRBUF{DAC{0{{{PTR TO PRINT BFR IN STATIC
{PRECL{DAC{0{{{EXTENDED/COMPACT LISTING FLAG
{PRLEN{DAC{0{{{LENGTH OF PRINT BUFFER IN CHARS
{PRLNW{DAC{0{{{LENGTH OF PRINT BUFFER IN WORDS
{PROFS{DAC{0{{{OFFSET TO NEXT LOCATION IN PRBUF
{PRTEF{DAC{0{{{ENDFILE FLAG
*
*      WORK AREAS FOR PRTST PROCEDURE
*
{PRSVA{DAC{0{{{SAVE WA
{PRSVB{DAC{0{{{SAVE WB
{PRSVC{DAC{0{{{SAVE CHAR COUNTER
*
*      WORK AREA FOR PRTNL
*
{PRTSA{DAC{0{{{SAVE WA
{PRTSB{DAC{0{{{SAVE WB
*
*      WORK AREA FOR PRTVL
*
{PRVSI{DAC{0{{{SAVE IDVAL
*
*      WORK AREAS FOR PATTERN MATCH ROUTINES
*
{PSAVE{DAC{0{{{TEMPORARY SAVE FOR CURRENT NODE PTR
{PSAVC{DAC{0{{{SAVE CURSOR IN P$SPN, P$STR
{{EJC{{{{
*
*      AMOUNT OF MEMORY RESERVED FOR END OF EXECUTION
*
{RSMEM{DAC{0{{{RESERVE MEMORY
*
*      WORK AREAS FOR RETRN ROUTINE
*
{RTNBP{DAC{0{{{TO SAVE A BLOCK POINTER
{RTNFV{DAC{0{{{NEW FUNCTION VALUE (RESULT)
{RTNSV{DAC{0{{{OLD FUNCTION VALUE (SAVED VALUE)
*
*      RELOCATABLE GLOBAL VALUES
*
*      ALL THE POINTERS IN THIS SECTION CAN POINT TO BLOCKS IN
*      THE DYNAMIC STORAGE AREA AND MUST BE RELOCATED BY THE
*      GARBAGE COLLECTOR. THEY ARE IDENTIFIED BY R$XXX NAMES.
*
{R$AAA{DAC{0{{{START OF RELOCATABLE VALUES
{R$ARF{DAC{0{{{ARRAY BLOCK POINTER FOR ARREF
{R$CCB{DAC{0{{{PTR TO CCBLK BEING BUILT (CDWRD)
{R$CIM{DAC{0{{{PTR TO CURRENT COMPILER INPUT STR
{R$CMP{DAC{0{{{COPY OF R$CIM USED IN CMPIL
{R$CNI{DAC{0{{{PTR TO NEXT COMPILER INPUT STRING
{R$CNT{DAC{0{{{CDBLK POINTER FOR SETEXIT CONTINUE
{R$COD{DAC{0{{{POINTER TO CURRENT CDBLK OR EXBLK
{R$CTP{DAC{0{{{PTR TO CURRENT CTBLK FOR PATST
{R$ERT{DAC{0{{{TRBLK POINTER FOR ERRTYPE TRACE
{R$ETX{DAC{NULLS{{{POINTER TO ERRTEXT STRING
{R$EXS{DAC{0{{{= SAVE XL IN EXPDM
{R$FCB{DAC{0{{{FCBLK CHAIN HEAD
{R$FNC{DAC{0{{{TRBLK POINTER FOR FNCLEVEL TRACE
{R$GTC{DAC{0{{{KEEP CODE PTR FOR GTCOD,GTEXP
{R$IO1{DAC{0{{{FILE ARG1 FOR IOPUT
{R$IO2{DAC{0{{{FILE ARG2 FOR IOPUT
{R$IOF{DAC{0{{{FCBLK PTR OR 0
{R$ION{DAC{0{{{NAME BASE PTR
{R$IOP{DAC{0{{{PREDECESSOR BLOCK PTR FOR IOPUT
{R$IOT{DAC{0{{{TRBLK PTR FOR IOPUT
{R$PMB{DAC{0{{{BUFFER PTR IN PATTERN MATCH
{R$PMS{DAC{0{{{SUBJECT STRING PTR IN PATTERN MATCH
{R$RA2{DAC{0{{{REPLACE SECOND ARGUMENT LAST TIME
{R$RA3{DAC{0{{{REPLACE THIRD ARGUMENT LAST TIME
{R$RPT{DAC{0{{{PTR TO CTBLK REPLACE TABLE LAST USD
{R$SCP{DAC{0{{{SAVE POINTER FROM LAST SCANE CALL
{R$SXL{DAC{0{{{PRESERVE XL IN SORTC
{R$SXR{DAC{0{{{PRESERVE XR IN SORTA/SORTC
{R$STC{DAC{0{{{TRBLK POINTER FOR STCOUNT TRACE
{R$STL{DAC{0{{{SOURCE LISTING SUB-TITLE
{R$SXC{DAC{0{{{CODE (CDBLK) PTR FOR SETEXIT TRAP
{R$TTL{DAC{NULLS{{{SOURCE LISTING TITLE
{R$XSC{DAC{0{{{STRING POINTER FOR XSCAN
{{EJC{{{{
*
*      THE REMAINING POINTERS IN THIS LIST ARE USED TO POINT
*      TO FUNCTION BLOCKS FOR NORMALLY UNDEFINED OPERATORS.
*
{R$UBA{DAC{STNDO{{{BINARY AT
{R$UBM{DAC{STNDO{{{BINARY AMPERSAND
{R$UBN{DAC{STNDO{{{BINARY NUMBER SIGN
{R$UBP{DAC{STNDO{{{BINARY PERCENT
{R$UBT{DAC{STNDO{{{BINARY NOT
{R$UUB{DAC{STNDO{{{UNARY VERTICAL BAR
{R$UUE{DAC{STNDO{{{UNARY EQUAL
{R$UUN{DAC{STNDO{{{UNARY NUMBER SIGN
{R$UUP{DAC{STNDO{{{UNARY PERCENT
{R$UUS{DAC{STNDO{{{UNARY SLASH
{R$UUX{DAC{STNDO{{{UNARY EXCLAMATION
{R$YYY{DAC{0{{{LAST RELOCATABLE LOCATION
*
*      WORK AREAS FOR SUBSTR FUNCTION (S$SUB)
*
{SBSSV{DAC{0{{{SAVE THIRD ARGUMENT
*
*      GLOBAL LOCATIONS USED IN SCAN PROCEDURE
*
{SCNBL{DAC{0{{{SET NON-ZERO IF SCANNED PAST BLANKS
{SCNCC{DAC{0{{{NON-ZERO TO SCAN CONTROL CARD NAME
{SCNGO{DAC{0{{{SET NON-ZERO TO SCAN GOTO FIELD
{SCNIL{DAC{0{{{LENGTH OF CURRENT INPUT IMAGE
{SCNPT{DAC{0{{{POINTER TO NEXT LOCATION IN R$CIM
{SCNRS{DAC{0{{{SET NON-ZERO TO SIGNAL RESCAN
{SCNTP{DAC{0{{{SAVE SYNTAX TYPE FROM LAST CALL
*
*      WORK AREAS FOR SCAN PROCEDURE
*
{SCNSA{DAC{0{{{SAVE WA
{SCNSB{DAC{0{{{SAVE WB
{SCNSC{DAC{0{{{SAVE WC
{SCNSE{DAC{0{{{START OF CURRENT ELEMENT
{SCNOF{DAC{0{{{SAVE OFFSET
{{EJC{{{{
*
*      WORK AREA USED BY SORTA, SORTC, SORTF, SORTH
*
{SRTDF{DAC{0{{{DATATYPE FIELD NAME
{SRTFD{DAC{0{{{FOUND DFBLK ADDRESS
{SRTFF{DAC{0{{{FOUND FIELD NAME
{SRTFO{DAC{0{{{OFFSET TO FIELD NAME
{SRTNR{DAC{0{{{NUMBER OF ROWS
{SRTOF{DAC{0{{{OFFSET WITHIN ROW TO SORT KEY
{SRTRT{DAC{0{{{ROOT OFFSET
{SRTS1{DAC{0{{{SAVE OFFSET 1
{SRTS2{DAC{0{{{SAVE OFFSET 2
{SRTSC{DAC{0{{{SAVE WC
{SRTSF{DAC{0{{{SORT ARRAY FIRST ROW OFFSET
{SRTSN{DAC{0{{{SAVE N
{SRTSO{DAC{0{{{OFFSET TO A(0)
{SRTSR{DAC{0{{{0 , NON-ZERO FOR SORT, RSORT
{SRTST{DAC{0{{{STRIDE FROM ONE ROW TO NEXT
{SRTWC{DAC{0{{{DUMP WC
*
*      GLOBAL VALUE FOR INDICATING STAGE (SEE ERROR SECTION)
*
{STAGE{DAC{0{{{INITIAL VALUE = INITIAL COMPILE
*
*      GLOBAL VALUES DEFINING EXTENT OF STATIC AREA (ALOST)
*
{STATB{DAC{0{{{START OF STATIC AREA
{STATE{DAC{0{{{END OF STATIC AREA
{{EJC{{{{
*
*      GLOBAL STACK POINTER
*
{STBAS{DAC{0{{{POINTER PAST STACK BASE
*
*      WORK AREAS FOR STOPR ROUTINE
*
{STPSI{DIC{+0{{{SAVE VALUE OF STCOUNT
{STPTI{DIC{+0{{{SAVE TIME ELAPSED
*
*      GLOBAL VALUES FOR SETEXIT FUNCTION (S$STX)
*
{STXOF{DAC{0{{{FAILURE OFFSET
{STXVR{DAC{NULLS{{{VRBLK POINTER OR NULL
*
*      WORK AREAS FOR TFIND PROCEDURE
*
{TFNSI{DIC{+0{{{NUMBER OF HEADERS
*
*      GLOBAL VALUE FOR TIME KEEPING
*
{TIMSX{DIC{+0{{{TIME AT START OF EXECUTION
{TIMUP{DAC{0{{{SET WHEN TIME UP OCCURS
*
*      WORK AREAS FOR XSCAN PROCEDURE
*
{XSCRT{DAC{0{{{SAVE RETURN CODE
{XSCWB{DAC{0{{{SAVE REGISTER WB
*
*      GLOBAL VALUES FOR XSCAN AND XSCNI PROCEDURES
*
{XSOFS{DAC{0{{{OFFSET TO CURRENT LOCATION IN R$XSC
*
*      LABEL TO MARK END OF WORK AREA
*
{YYYYY{DAC{0{{{
{{TTL{S{{{P I T B O L -- INITIALIZATION
*
*      INITIALISATION
*      THE FOLLOWING SECTION RECEIVES CONTROL FROM THE SYSTEM
*      AT THE START OF A RUN WITH THE REGISTERS SET AS FOLLOWS.
*
*      (XS)                  POINTS PAST STACK BASE
*      (XR)                  POINTS TO FIRST WORD OF DATA AREA
*      (XL)                  POINTS TO LAST WORD OF DATA AREA
*
{{SEC{{{{START OF PROGRAM SECTION
{{JSR{SYSTM{{{INITIALISE TIMER
*
*      INITIALISE WORK AREA (ESSENTIAL FOR BATCHED RUNS)
*
{{MOV{R9{R7{{PRESERVE XR
{{MOV{#YYYYY{R6{{POINT TO END OF WORK AREA
{{SUB{#AAAAA{R6{{GET LENGTH OF WORK AREA
{{BTW{R6{{{CONVERT TO WORDS
{{LCT{R6{R6{{COUNT FOR LOOP
{{MOV{#AAAAA{R9{{SET UP INDEX REGISTER
*
*      CLEAR WORK SPACE
*
{INI01{ZER{(R9)+{{{CLEAR A WORD
{{BCT{R6{INI01{{LOOP TILL DONE
{{MOV{#STNDO{R6{{UNDEFINED OPERATORS POINTER
{{MOV{#R$YYY{R8{{POINT TO TABLE END
{{SUB{#R$UBA{R8{{LENGTH OF UNDEF. OPERATORS TABLE
{{BTW{R8{{{CONVERT TO WORDS
{{LCT{R8{R8{{LOOP COUNTER
{{MOV{#R$UBA{R9{{SET UP XR
*
*      SET CORRECT VALUE INTO UNDEFINED OPERATORS TABLE
*
{INI02{MOV{R6{(R9)+{{STORE VALUE
{{BCT{R8{INI02{{LOOP TILL ALL DONE
{{MOV{#NUM01{R6{{GET A 1
{{MOV{R6{CMPSN{{STATEMENT NO
{{MOV{R6{CSWFL{{NOFAIL
{{MOV{R6{CSWLS{{LIST
{{MOV{R6{KVINP{{INPUT
{{MOV{R6{KVOUP{{OUTPUT
{{MOV{R6{LSTPF{{NOTHING FOR LISTR YET
{{MOV{#INILN{R6{{INPUT IMAGE LENGTH
{{MOV{R6{CSWIN{{-IN72
{{MOV{#B$KVT{DMPKB{{DUMP
{{MOV{#TRBKV{DMPKT{{DUMP
{{MOV{#P$LEN{EVLIN{{EVAL
{{EJC{{{{
{{MOV{#NULLS{R6{{GET NULLSTRING POINTER
{{MOV{R6{KVRTN{{RETURN
{{MOV{R6{R$ETX{{ERRTEXT
{{MOV{R6{R$TTL{{TITLE FOR LISTING
{{MOV{R6{STXVR{{SETEXIT
{{STI{TIMSX{{{STORE TIME IN CORRECT PLACE
{{LDI{STLIM{{{GET DEFAULT STLIMIT
{{STI{KVSTL{{{STATEMENT LIMIT
{{STI{KVSTC{{{STATEMENT COUNT
{{MOV{R7{STATB{{STORE START ADRS OF STATIC
{{MOV{#4*E$SRS{RSMEM{{RESERVE MEMORY
{{MOV{SP{STBAS{{STORE STACK BASE
{{SSS{INISS{{{SAVE S-R STACK PTR
*
*      NOW CONVERT FREE STORE PERCENTAGE TO A SUITABLE FACTOR
*      FOR EASY TESTING IN ALLOC ROUTINE.
*
{{LDI{INTVH{{{GET 100
{{DVI{ALFSP{{{FORM 100 / ALFSP
{{STI{ALFSF{{{STORE THE FACTOR
*
*      INITIALIZE VALUES FOR REAL CONVERSION ROUTINE
*
{{LCT{R7{#CFP$S{{LOAD COUNTER FOR SIGNIFICANT DIGITS
{{LDR{REAV1{{{LOAD 1.0
*
*      LOOP TO COMPUTE 10**(MAX NUMBER SIGNIFICANT DIGITS)
*
{INI03{MLR{REAVT{{{* 10.0
{{BCT{R7{INI03{{LOOP TILL DONE
{{STR{GTSSC{{{STORE 10**(MAX SIG DIGITS)
{{LDR{REAP5{{{LOAD 0.5
{{DVR{GTSSC{{{COMPUTE 0.5*10**(MAX SIG DIGITS)
{{STR{GTSRN{{{STORE AS ROUNDING BIAS
{{ZER{R8{{{SET TO READ PARAMETERS
{{JSR{PRPAR{{{READ THEM
{{EJC{{{{
*
*      NOW COMPUTE STARTING ADDRESS FOR DYNAMIC STORE AND IF
*      NECESSARY REQUEST MORE MEMORY.
*
{{SUB{#4*E$SRS{R10{{ALLOW FOR RESERVE MEMORY
{{MOV{PRLEN{R6{{GET PRINT BUFFER LENGTH
{{ADD{#CFP$A{R6{{ADD NO. OF CHARS IN ALPHABET
{{ADD{#NSTMX{R6{{ADD CHARS FOR GTSTG BFR
{{CTB{R6{8{{CONVERT TO BYTES, ALLOWING A MARGIN
{{MOV{STATB{R9{{POINT TO STATIC BASE
{{ADD{R6{R9{{INCREMENT FOR ABOVE BUFFERS
{{ADD{#4*E$HNB{R9{{INCREMENT FOR HASH TABLE
{{ADD{#4*E$STS{R9{{BUMP FOR INITIAL STATIC BLOCK
{{JSR{SYSMX{{{GET MXLEN
{{MOV{R6{KVMXL{{PROVISIONALLY STORE AS MAXLNGTH
{{MOV{R6{MXLEN{{AND AS MXLEN
{{BGT{R9{R6{INI06{SKIP IF STATIC HI EXCEEDS MXLEN
{{MOV{R6{R9{{USE MXLEN INSTEAD
{{ICA{R9{{{MAKE BIGGER THAN MXLEN
*
*      HERE TO STORE VALUES WHICH MARK INITIAL DIVISION
*      OF DATA AREA INTO STATIC AND DYNAMIC
*
{INI06{MOV{R9{DNAMB{{DYNAMIC BASE ADRS
{{MOV{R9{DNAMP{{DYNAMIC PTR
{{BNZ{R6{INI07{{SKIP IF NON-ZERO MXLEN
{{DCA{R9{{{POINT A WORD IN FRONT
{{MOV{R9{KVMXL{{USE AS MAXLNGTH
{{MOV{R9{MXLEN{{AND AS MXLEN
{{EJC{{{{
*
*      LOOP HERE IF NECESSARY TILL ENOUGH MEMORY OBTAINED
*      SO THAT DNAME IS ABOVE DNAMB
*
{INI07{MOV{R10{DNAME{{STORE DYNAMIC END ADDRESS
{{BLT{DNAMB{R10{INI09{SKIP IF HIGH ENOUGH
{{JSR{SYSMM{{{REQUEST MORE MEMORY
{{WTB{R9{{{GET AS BAUS (SGD05)
{{ADD{R9{R10{{BUMP BY AMOUNT OBTAINED
{{BNZ{R9{INI07{{TRY AGAIN
{{MOV{#ENDMO{R9{{POINT TO FAILURE MESSAGE
{{MOV{ENDML{R6{{MESSAGE LENGTH
{{JSR{SYSPR{{{PRINT IT (PRTST NOT YET USABLE)
{{PPM{{{{SHOULD NOT FAIL
{{JSR{SYSEJ{{{PACK UP (STOPR NOT YET USABLE)
*
*      INITIALISE PRINT BUFFER WITH BLANK WORDS
*
{INI09{MOV{PRLEN{R8{{NO. OF CHARS IN PRINT BFR
{{MOV{STATB{R9{{POINT TO STATIC AGAIN
{{MOV{R9{PRBUF{{PRINT BFR IS PUT AT STATIC START
{{MOV{#B$SCL{(R9)+{{STORE STRING TYPE CODE
{{MOV{R8{(R9)+{{AND STRING LENGTH
{{CTW{R8{0{{GET NUMBER OF WORDS IN BUFFER
{{MOV{R8{PRLNW{{STORE FOR BUFFER CLEAR
{{LCT{R8{R8{{WORDS TO CLEAR
*
*      LOOP TO CLEAR BUFFER
*
{INI10{MOV{NULLW{(R9)+{{STORE BLANK
{{BCT{R8{INI10{{LOOP
*
*      INITIALIZE NUMBER OF HASH HEADERS
*
{{MOV{#E$HNB{R6{{GET NUMBER OF HASH HEADERS
{{MTI{R6{{{CONVERT TO INTEGER
{{STI{HSHNB{{{STORE FOR USE BY GTNVR PROCEDURE
{{LCT{R6{R6{{COUNTER FOR CLEARING HASH TABLE
{{MOV{R9{HSHTB{{POINTER TO HASH TABLE
*
*      LOOP TO CLEAR HASH TABLE
*
{INI11{ZER{(R9)+{{{BLANK A WORD
{{BCT{R6{INI11{{LOOP
{{MOV{R9{HSHTE{{END OF HASH TABLE ADRS IS KEPT
*
*      ALLOCATE WORK AREA FOR GTSTG CONVERSION PROCEDURE
*
{{MOV{#NSTMX{R6{{GET MAX NUM CHARS IN OUTPUT NUMBER
{{CTB{R6{SCSI${{NO OF BYTES NEEDED
{{MOV{R9{GTSWK{{STORE BFR ADRS
{{ADD{R6{R9{{BUMP FOR WORK BFR
{{EJC{{{{
*
*      BUILD ALPHABET STRING FOR ALPHABET KEYWORD AND REPLACE
*
{{MOV{R9{KVALP{{SAVE ALPHABET POINTER
{{MOV{#B$SCL{(R9){{STRING BLK TYPE
{{MOV{#CFP$A{R8{{NO OF CHARS IN ALPHABET
{{MOV{R8{4*SCLEN(R9){{STORE AS STRING LENGTH
{{MOV{R8{R7{{COPY CHAR COUNT
{{CTB{R7{SCSI${{NO. OF BYTES NEEDED
{{ADD{R9{R7{{CURRENT END ADDRESS FOR STATIC
{{MOV{R7{STATE{{STORE STATIC END ADRS
{{LCT{R8{R8{{LOOP COUNTER
{{PSC{R9{{{POINT TO CHARS OF STRING
{{ZER{R7{{{SET INITIAL CHARACTER VALUE
*
*      LOOP TO ENTER CHARACTER CODES IN ORDER
*
{INI12{SCH{R7{(R9)+{{STORE NEXT CODE
{{ICV{R7{{{BUMP CODE VALUE
{{BCT{R8{INI12{{LOOP TILL ALL STORED
{{CSC{R9{{{COMPLETE STORE CHARACTERS
*
*      INITIALIZE VARIABLE BLOCKS FOR INPUT AND OUTPUT
*
{{MOV{#V$INP{R10{{POINT TO STRING /INPUT/
{{MOV{#TRTIN{R7{{TRBLK TYPE FOR INPUT
{{JSR{INOUT{{{PERFORM INPUT ASSOCIATION
{{MOV{#V$OUP{R10{{POINT TO STRING /OUTPUT/
{{MOV{#TRTOU{R7{{TRBLK TYPE FOR OUTPUT
{{JSR{INOUT{{{PERFORM OUTPUT ASSOCIATION
{{MOV{INITR{R8{{TERMINAL FLAG
{{BZE{R8{INI13{{SKIP IF NO TERMINAL
{{JSR{PRPAR{{{ASSOCIATE TERMINAL
{{EJC{{{{
*
*      CHECK FOR EXPIRY DATE
*
{INI13{JSR{SYSDC{{{CALL DATE CHECK
{{MOV{SP{FLPTR{{IN CASE STACK OVERFLOWS IN COMPILER
*
*      NOW COMPILE SOURCE INPUT CODE
*
{{JSR{CMPIL{{{CALL COMPILER
{{MOV{R9{R$COD{{SET PTR TO FIRST CODE BLOCK
{{MOV{#NULLS{R$TTL{{FORGET TITLE      (REG04)
{{MOV{#NULLS{R$STL{{FORGET SUB-TITLE  (REG04)
{{ZER{R$CIM{{{FORGET COMPILER INPUT IMAGE
{{ZER{R10{{{CLEAR DUD VALUE
{{ZER{R7{{{DONT SHIFT DYNAMIC STORE UP
{{JSR{GBCOL{{{CLEAR GARBAGE LEFT FROM COMPILE
{{BNZ{CPSTS{INIX0{{SKIP IF NO LISTING OF COMP STATS
{{JSR{PRTPG{{{EJECT PAGE
*
*      PRINT COMPILE STATISTICS
*
{{MOV{DNAMP{R6{{NEXT AVAILABLE LOC
{{SUB{STATB{R6{{MINUS START
{{BTW{R6{{{CONVERT TO WORDS
{{MTI{R6{{{CONVERT TO INTEGER
{{MOV{#ENCM1{R9{{POINT TO /MEMORY USED (WORDS)/
{{JSR{PRTMI{{{PRINT MESSAGE
{{MOV{DNAME{R6{{END OF MEMORY
{{SUB{DNAMP{R6{{MINUS NEXT AVAILABLE LOC
{{BTW{R6{{{CONVERT TO WORDS
{{MTI{R6{{{CONVERT TO INTEGER
{{MOV{#ENCM2{R9{{POINT TO /MEMORY AVAILABLE (WORDS)/
{{JSR{PRTMI{{{PRINT LINE
{{MTI{CMERC{{{GET COUNT OF ERRORS AS INTEGER
{{MOV{#ENCM3{R9{{POINT TO /COMPILE ERRORS/
{{JSR{PRTMI{{{PRINT IT
{{MTI{GBCNT{{{GARBAGE COLLECTION COUNT
{{SBI{INTV1{{{ADJUST FOR UNAVOIDABLE COLLECT
{{MOV{#STPM5{R9{{POINT TO /STORAGE REGENERATIONS/
{{JSR{PRTMI{{{PRINT GBCOL COUNT
{{JSR{SYSTM{{{GET TIME
{{SBI{TIMSX{{{GET COMPILATION TIME
{{MOV{#ENCM4{R9{{POINT TO COMPILATION TIME (MSEC)/
{{JSR{PRTMI{{{PRINT MESSAGE
{{ADD{#NUM05{LSTLC{{BUMP LINE COUNT
{{BZE{HEADP{INIX0{{NO EJECT IF NOTHING PRINTED (SDG11)
{{JSR{PRTPG{{{EJECT PRINTER
{{EJC{{{{
*
*      PREPARE NOW TO START EXECUTION
*
*      SET DEFAULT INPUT RECORD LENGTH
*
{INIX0{BGT{CSWIN{#INILN{INIX1{SKIP IF NOT DEFAULT -IN72 USED
{{MOV{#INILS{CSWIN{{ELSE USE DEFAULT RECORD LENGTH
*
*      RESET TIMER
*
{INIX1{JSR{SYSTM{{{GET TIME AGAIN
{{STI{TIMSX{{{STORE FOR END RUN PROCESSING
{{ADD{CSWEX{NOXEQ{{ADD -NOEXECUTE FLAG
{{BNZ{NOXEQ{INIX2{{JUMP IF EXECUTION SUPPRESSED
{{ZER{GBCNT{{{INITIALISE COLLECT COUNT
{{JSR{SYSBX{{{CALL BEFORE STARTING EXECUTION
*
*      MERGE WHEN LISTING FILE SET FOR EXECUTION
*
{INIY0{MNZ{HEADP{{{MARK HEADERS OUT REGARDLESS
{{ZER{-(SP){{{SET FAILURE LOCATION ON STACK
{{MOV{SP{FLPTR{{SAVE PTR TO FAILURE OFFSET WORD
{{MOV{R$COD{R9{{LOAD PTR TO ENTRY CODE BLOCK
{{MOV{#STGXT{STAGE{{SET STAGE FOR EXECUTE TIME
{{MOV{CMPSN{PFNTE{{COPY STMTS COMPILED COUNT IN CASE
{{JSR{SYSTM{{{TIME YET AGAIN
{{STI{PFSTM{{{
{{BRI{(R9){{{START XEQ WITH FIRST STATEMENT
*
*      HERE IF EXECUTION IS SUPPRESSED
*
{INIX2{JSR{PRTNL{{{PRINT A BLANK LINE
{{MOV{#ENCM5{R9{{POINT TO /EXECUTION SUPPRESSED/
{{JSR{PRTST{{{PRINT STRING
{{JSR{PRTNL{{{OUTPUT LINE
{{ZER{R6{{{SET ABEND VALUE TO ZERO
{{MOV{#NINI9{R7{{SET SPECIAL CODE VALUE
{{JSR{SYSEJ{{{END OF JOB, EXIT TO SYSTEM
{{TTL{S{{{P I T B O L -- SNOBOL4 OPERATOR ROUTINES
*
*      THIS SECTION INCLUDES ALL ROUTINES WHICH CAN BE ACCESSED
*      DIRECTLY FROM THE GENERATED CODE EXCEPT SYSTEM FUNCTIONS.
*
*      ALL ROUTINES IN THIS SECTION START WITH A LABEL OF THE
*      FORM O$XXX WHERE XXX IS THREE LETTERS. THE GENERATED CODE
*      CONTAINS A POINTER TO THE APPROPRIATE ENTRY LABEL.
*
*      SINCE THE GENERAL FORM OF THE GENERATED CODE CONSISTS OF
*      POINTERS TO BLOCKS WHOSE FIRST WORD IS THE ADDRESS OF THE
*      ACTUAL ENTRY POINT LABEL (O$XXX).
*
*      THESE ROUTINES ARE IN ALPHABETICAL ORDER BY THEIR
*      ENTRY LABEL NAMES (I.E. BY THE XXX OF THE O$XXX NAME)
*
*      THESE ROUTINES RECEIVE CONTROL AS FOLLOWS
*
*      (CP)                  POINTER TO NEXT CODE WORD
*      (XS)                  CURRENT STACK POINTER
{{EJC{{{{
*
*      BINARY PLUS (ADDITION)
*
{O$ADD{ENT{{{{ENTRY POINT
{{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
{{ERR{001{ADDITION{{LEFT OPERAND IS NOT NUMERIC
{{ERR{002{ADDITION{{RIGHT OPERAND IS NOT NUMERIC
{{PPM{OADD1{{{JUMP IF REAL OPERANDS
*
*      HERE TO ADD TWO INTEGERS
*
{{ADI{4*ICVAL(R10){{{ADD RIGHT OPERAND TO LEFT
{{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
{{ERB{003{ADDITION{{CAUSED INTEGER OVERFLOW
*
*      HERE TO ADD TWO REALS
*
{OADD1{ADR{4*RCVAL(R10){{{ADD RIGHT OPERAND TO LEFT
{{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
{{ERB{261{ADDITION{{CAUSED REAL OVERFLOW
{{EJC{{{{
*
*      UNARY PLUS (AFFIRMATION)
*
{O$AFF{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD OPERAND
{{JSR{GTNUM{{{CONVERT TO NUMERIC
{{ERR{004{AFFIRMATION{{OPERAND IS NOT NUMERIC
{{BRN{EXIXR{{{RETURN IF CONVERTED TO NUMERIC
{{EJC{{{{
*
*      BINARY BAR (ALTERNATION)
*
{O$ALT{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD RIGHT OPERAND
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{005{ALTERNATION{{RIGHT OPERAND IS NOT PATTERN
*
*      MERGE HERE FROM SPECIAL (LEFT ALTERNATION) CASE
*
{OALT1{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATIVE NODE
{{JSR{PBILD{{{BUILD ALTERNATIVE NODE
{{MOV{R9{R10{{SAVE ADDRESS OF ALTERNATIVE NODE
{{MOV{(SP)+{R9{{LOAD LEFT OPERAND
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{006{ALTERNATION{{LEFT OPERAND IS NOT PATTERN
{{BEQ{R9{#P$ALT{OALT2{JUMP IF LEFT ARG IS ALTERNATION
{{MOV{R9{4*PTHEN(R10){{SET LEFT OPERAND AS SUCCESSOR
{{MOV{R10{R9{{MOVE RESULT TO PROPER REGISTER
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
*
*      COME HERE IF LEFT ARGUMENT IS ITSELF AN ALTERNATION
*
*      THE RESULT IS MORE EFFICIENT IF WE MAKE THE REPLACEMENT
*
*      (A / B) / C = A / (B / C)
*
{OALT2{MOV{4*PARM1(R9){4*PTHEN(R10){{BUILD THE (B / C) NODE
{{MOV{4*PTHEN(R9){-(SP){{SET A AS NEW LEFT ARG
{{MOV{R10{R9{{SET (B / C) AS NEW RIGHT ARG
{{BRN{OALT1{{{MERGE BACK TO BUILD A / (B / C)
{{EJC{{{{
*
*      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY NAME)
*
{O$AMN{ENT{{{{ENTRY POINT
{{LCW{R9{{{LOAD NUMBER OF SUBSCRIPTS
{{MOV{R9{R7{{SET FLAG FOR BY NAME
{{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
{{EJC{{{{
*
*      ARRAY REFERENCE (MULTIPLE SUBSCRIPTS, BY VALUE)
*
{O$AMV{ENT{{{{ENTRY POINT
{{LCW{R9{{{LOAD NUMBER OF SUBSCRIPTS
{{ZER{R7{{{SET FLAG FOR BY VALUE
{{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
{{EJC{{{{
*
*      ARRAY REFERENCE (ONE SUBSCRIPT, BY NAME)
*
{O$AON{ENT{{{{ENTRY POINT
{{MOV{(SP){R9{{LOAD SUBSCRIPT VALUE
{{MOV{4*1(SP){R10{{LOAD ARRAY VALUE
{{MOV{(R10){R6{{LOAD FIRST WORD OF ARRAY OPERAND
{{BEQ{R6{#B$VCT{OAON2{JUMP IF VECTOR REFERENCE
{{BEQ{R6{#B$TBT{OAON3{JUMP IF TABLE REFERENCE
*
*      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
*
{OAON1{MOV{#NUM01{R9{{SET NUMBER OF SUBSCRIPTS TO ONE
{{MOV{R9{R7{{SET FLAG FOR BY NAME
{{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
*
*      HERE IF WE HAVE A VECTOR REFERENCE
*
{OAON2{BNE{(R9){#B$ICL{OAON1{USE LONG ROUTINE IF NOT INTEGER
{{LDI{4*ICVAL(R9){{{LOAD INTEGER SUBSCRIPT VALUE
{{MFI{R6{EXFAL{{COPY AS ADDRESS INT, FAIL IF OVFLO
{{BZE{R6{EXFAL{{FAIL IF ZERO
{{ADD{#VCVLB{R6{{COMPUTE OFFSET IN WORDS
{{WTB{R6{{{CONVERT TO BYTES
{{MOV{R6{(SP){{COMPLETE NAME ON STACK
{{BLT{R6{4*VCLEN(R10){EXITS{EXIT IF SUBSCRIPT NOT TOO LARGE
{{BRN{EXFAL{{{ELSE FAIL
*
*      HERE FOR TABLE REFERENCE
*
{OAON3{MNZ{R7{{{SET FLAG FOR NAME REFERENCE
{{JSR{TFIND{{{LOCATE/CREATE TABLE ELEMENT
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{MOV{R10{4*1(SP){{STORE NAME BASE ON STACK
{{MOV{R6{(SP){{STORE NAME OFFSET ON STACK
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
{{EJC{{{{
*
*      ARRAY REFERENCE (ONE SUBSCRIPT, BY VALUE)
*
{O$AOV{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD SUBSCRIPT VALUE
{{MOV{(SP)+{R10{{LOAD ARRAY VALUE
{{MOV{(R10){R6{{LOAD FIRST WORD OF ARRAY OPERAND
{{BEQ{R6{#B$VCT{OAOV2{JUMP IF VECTOR REFERENCE
{{BEQ{R6{#B$TBT{OAOV3{JUMP IF TABLE REFERENCE
*
*      HERE TO USE CENTRAL ARRAY REFERENCE ROUTINE
*
{OAOV1{MOV{R10{-(SP){{RESTACK ARRAY VALUE
{{MOV{R9{-(SP){{RESTACK SUBSCRIPT
{{MOV{#NUM01{R9{{SET NUMBER OF SUBSCRIPTS TO ONE
{{ZER{R7{{{SET FLAG FOR VALUE CALL
{{BRN{ARREF{{{JUMP TO ARRAY REFERENCE ROUTINE
*
*      HERE IF WE HAVE A VECTOR REFERENCE
*
{OAOV2{BNE{(R9){#B$ICL{OAOV1{USE LONG ROUTINE IF NOT INTEGER
{{LDI{4*ICVAL(R9){{{LOAD INTEGER SUBSCRIPT VALUE
{{MFI{R6{EXFAL{{MOVE AS ONE WORD INT, FAIL IF OVFLO
{{BZE{R6{EXFAL{{FAIL IF ZERO
{{ADD{#VCVLB{R6{{COMPUTE OFFSET IN WORDS
{{WTB{R6{{{CONVERT TO BYTES
{{BGE{R6{4*VCLEN(R10){EXFAL{FAIL IF SUBSCRIPT TOO LARGE
{{JSR{ACESS{{{ACCESS VALUE
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{BRN{EXIXR{{{ELSE RETURN VALUE TO CALLER
*
*      HERE FOR TABLE REFERENCE BY VALUE
*
{OAOV3{ZER{R7{{{SET FLAG FOR VALUE REFERENCE
{{JSR{TFIND{{{CALL TABLE SEARCH ROUTINE
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{BRN{EXIXR{{{EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      ASSIGNMENT
*
{O$ASS{ENT{{{{ENTRY POINT
*
*      O$RPL (PATTERN REPLACEMENT) MERGES HERE
*
{OASS0{MOV{(SP)+{R7{{LOAD VALUE TO BE ASSIGNED
{{MOV{(SP)+{R6{{LOAD NAME OFFSET
{{MOV{(SP){R10{{LOAD NAME BASE
{{MOV{R7{(SP){{STORE ASSIGNED VALUE AS RESULT
{{JSR{ASIGN{{{PERFORM ASSIGNMENT
{{PPM{EXFAL{{{FAIL IF ASSIGNMENT FAILS
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
{{EJC{{{{
*
*      COMPILATION ERROR
*
{O$CER{ENT{{{{ENTRY POINT
{{ERB{007{COMPILATION{{ERROR ENCOUNTERED DURING EXECUTION
{{EJC{{{{
*
*      UNARY AT (CURSOR ASSIGNMENT)
*
{O$CAS{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R8{{LOAD NAME OFFSET (PARM2)
{{MOV{(SP)+{R9{{LOAD NAME BASE (PARM1)
{{MOV{#P$CAS{R7{{SET PCODE FOR CURSOR ASSIGNMENT
{{JSR{PBILD{{{BUILD NODE
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      CONCATENATION
*
{O$CNC{ENT{{{{ENTRY POINT
{{MOV{(SP){R9{{LOAD RIGHT ARGUMENT
{{BEQ{R9{#NULLS{OCNC3{JUMP IF RIGHT ARG IS NULL
{{MOV{4*1(SP){R10{{LOAD LEFT ARGUMENT
{{BEQ{R10{#NULLS{OCNC4{JUMP IF LEFT ARGUMENT IS NULL
{{MOV{#B$SCL{R6{{GET CONSTANT TO TEST FOR STRING
{{BNE{R6{(R10){OCNC2{JUMP IF LEFT ARG NOT A STRING
{{BNE{R6{(R9){OCNC2{JUMP IF RIGHT ARG NOT A STRING
*
*      MERGE HERE TO CONCATENATE TWO STRINGS
*
{OCNC1{MOV{4*SCLEN(R10){R6{{LOAD LEFT ARGUMENT LENGTH
{{ADD{4*SCLEN(R9){R6{{COMPUTE RESULT LENGTH
{{JSR{ALOCS{{{ALLOCATE SCBLK FOR RESULT
{{MOV{R9{4*1(SP){{STORE RESULT PTR OVER LEFT ARGUMENT
{{PSC{R9{{{PREPARE TO STORE CHARS OF RESULT
{{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARS IN LEFT ARG
{{PLC{R10{{{PREPARE TO LOAD LEFT ARG CHARS
{{MVC{{{{MOVE CHARACTERS OF LEFT ARGUMENT
{{MOV{(SP)+{R10{{LOAD RIGHT ARG POINTER, POP STACK
{{MOV{4*SCLEN(R10){R6{{LOAD NUMBER OF CHARS IN RIGHT ARG
{{PLC{R10{{{PREPARE TO LOAD RIGHT ARG CHARS
{{MVC{{{{MOVE CHARACTERS OF RIGHT ARGUMENT
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
*
*      COME HERE IF ARGUMENTS ARE NOT BOTH STRINGS
*
{OCNC2{JSR{GTSTG{{{CONVERT RIGHT ARG TO STRING
{{PPM{OCNC5{{{JUMP IF RIGHT ARG IS NOT STRING
{{MOV{R9{R10{{SAVE RIGHT ARG PTR
{{JSR{GTSTG{{{CONVERT LEFT ARG TO STRING
{{PPM{OCNC6{{{JUMP IF LEFT ARG IS NOT A STRING
{{MOV{R9{-(SP){{STACK LEFT ARGUMENT
{{MOV{R10{-(SP){{STACK RIGHT ARGUMENT
{{MOV{R9{R10{{MOVE LEFT ARG TO PROPER REG
{{MOV{(SP){R9{{MOVE RIGHT ARG TO PROPER REG
{{BRN{OCNC1{{{MERGE BACK TO CONCATENATE STRINGS
{{EJC{{{{
*
*      CONCATENATION (CONTINUED)
*
*      COME HERE FOR NULL RIGHT ARGUMENT
*
{OCNC3{ICA{SP{{{REMOVE RIGHT ARG FROM STACK
{{BRN{EXITS{{{RETURN WITH LEFT ARGUMENT ON STACK
*
*      HERE FOR NULL LEFT ARGUMENT
*
{OCNC4{ICA{SP{{{UNSTACK ONE ARGUMENT
{{MOV{R9{(SP){{STORE RIGHT ARGUMENT
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
*
*      HERE IF RIGHT ARGUMENT IS NOT A STRING
*
{OCNC5{MOV{R9{R10{{MOVE RIGHT ARGUMENT PTR
{{MOV{(SP)+{R9{{LOAD LEFT ARG POINTER
*
*      MERGE HERE WHEN LEFT ARGUMENT IS NOT A STRING
*
{OCNC6{JSR{GTPAT{{{CONVERT LEFT ARG TO PATTERN
{{ERR{008{CONCATENATION{{LEFT OPND IS NOT STRING OR PATTERN
{{MOV{R9{-(SP){{SAVE RESULT ON STACK
{{MOV{R10{R9{{POINT TO RIGHT OPERAND
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{009{CONCATENATION{{RIGHT OPD IS NOT STRING OR PATTERN
{{MOV{R9{R10{{MOVE FOR PCONC
{{MOV{(SP)+{R9{{RELOAD LEFT OPERAND PTR
{{JSR{PCONC{{{CONCATENATE PATTERNS
{{BRN{EXIXR{{{EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      COMPLEMENTATION
*
{O$COM{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD OPERAND
{{MOV{(R9){R6{{LOAD TYPE WORD
*
*      MERGE BACK HERE AFTER CONVERSION
*
{OCOM1{BEQ{R6{#B$ICL{OCOM2{JUMP IF INTEGER
{{BEQ{R6{#B$RCL{OCOM3{JUMP IF REAL
{{JSR{GTNUM{{{ELSE CONVERT TO NUMERIC
{{ERR{010{COMPLEMENTATION{{OPERAND IS NOT NUMERIC
{{BRN{OCOM1{{{BACK TO CHECK CASES
*
*      HERE TO COMPLEMENT INTEGER
*
{OCOM2{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
{{NGI{{{{NEGATE
{{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
{{ERB{011{COMPLEMENTATION{{CAUSED INTEGER OVERFLOW
*
*      HERE TO COMPLEMENT REAL
*
{OCOM3{LDR{4*RCVAL(R9){{{LOAD REAL VALUE
{{NGR{{{{NEGATE
{{BRN{EXREA{{{RETURN REAL RESULT
{{EJC{{{{
*
*      BINARY SLASH (DIVISION)
*
{O$DVD{ENT{{{{ENTRY POINT
{{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
{{ERR{012{DIVISION{{LEFT OPERAND IS NOT NUMERIC
{{ERR{013{DIVISION{{RIGHT OPERAND IS NOT NUMERIC
{{PPM{ODVD2{{{JUMP IF REAL OPERANDS
*
*      HERE TO DIVIDE TWO INTEGERS
*
{{DVI{4*ICVAL(R10){{{DIVIDE LEFT OPERAND BY RIGHT
{{INO{EXINT{{{RESULT OK IF NO OVERFLOW
{{ERB{014{DIVISION{{CAUSED INTEGER OVERFLOW
*
*      HERE TO DIVIDE TWO REALS
*
{ODVD2{DVR{4*RCVAL(R10){{{DIVIDE LEFT OPERAND BY RIGHT
{{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
{{ERB{262{DIVISION{{CAUSED REAL OVERFLOW
{{EJC{{{{
*
*      EXPONENTIATION
*
{O$EXP{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD EXPONENT
{{JSR{GTNUM{{{CONVERT TO NUMBER
{{ERR{015{EXPONENTIATION{{RIGHT OPERAND IS NOT NUMERIC
{{BNE{R6{#B$ICL{OEXP7{JUMP IF REAL
{{MOV{R9{R10{{MOVE EXPONENT
{{MOV{(SP)+{R9{{LOAD BASE
{{JSR{GTNUM{{{CONVERT TO NUMERIC
{{ERR{016{EXPONENTIATION{{LEFT OPERAND IS NOT NUMERIC
{{LDI{4*ICVAL(R10){{{LOAD EXPONENT
{{ILT{OEXP8{{{ERROR IF NEGATIVE EXPONENT
{{BEQ{R6{#B$RCL{OEXP3{JUMP IF BASE IS REAL
*
*      HERE TO EXPONENTIATE AN INTEGER
*
{{MFI{R6{OEXP2{{CONVERT EXPONENT TO 1 WORD INTEGER
{{LCT{R6{R6{{SET LOOP COUNTER
{{LDI{INTV1{{{LOAD INITIAL VALUE OF 1
{{BNZ{R6{OEXP1{{JUMP IF NON-ZERO EXPONENT
{{INE{EXINT{{{GIVE ZERO AS RESULT FOR NONZERO**0
{{BRN{OEXP4{{{ELSE ERROR OF 0**0
*
*      LOOP TO PERFORM EXPONENTIATION
*
{OEXP1{MLI{4*ICVAL(R9){{{MULTIPLY BY BASE
{{IOV{OEXP2{{{JUMP IF OVERFLOW
{{BCT{R6{OEXP1{{LOOP BACK TILL COMPUTATION COMPLETE
{{BRN{EXINT{{{THEN RETURN INTEGER RESULT
*
*      HERE IF INTEGER OVERFLOW
*
{OEXP2{ERB{017{EXPONENTIATION{{CAUSED INTEGER OVERFLOW
{{EJC{{{{
*
*      EXPONENTIATION (CONTINUED)
*
*      HERE TO EXPONENTIATE A REAL
*
{OEXP3{MFI{R6{OEXP6{{CONVERT EXPONENT TO ONE WORD
{{LCT{R6{R6{{SET LOOP COUNTER
{{LDR{REAV1{{{LOAD 1.0 AS INITIAL VALUE
{{BNZ{R6{OEXP5{{JUMP IF NON-ZERO EXPONENT
{{RNE{EXREA{{{RETURN 1.0 IF NONZERO**ZERO
*
*      HERE FOR ERROR OF 0**0 OR 0.0**0
*
{OEXP4{ERB{018{EXPONENTIATION{{RESULT IS UNDEFINED
*
*      LOOP TO PERFORM EXPONENTIATION
*
{OEXP5{MLR{4*RCVAL(R9){{{MULTIPLY BY BASE
{{ROV{OEXP6{{{JUMP IF OVERFLOW
{{BCT{R6{OEXP5{{LOOP TILL COMPUTATION COMPLETE
{{BRN{EXREA{{{THEN RETURN REAL RESULT
*
*      HERE IF REAL OVERFLOW
*
{OEXP6{ERB{266{EXPONENTIATION{{CAUSED REAL OVERFLOW
*
*      HERE IF REAL EXPONENT
*
{OEXP7{ERB{267{EXPONENTIATION{{RIGHT OPERAND IS REAL NOT INTEGER
*
*      HERE FOR NEGATIVE EXPONENT
*
{OEXP8{ERB{019{EXPONENTIATION{{RIGHT OPERAND IS NEGATIVE
{{EJC{{{{
*
*      FAILURE IN EXPRESSION EVALUATION
*
*      THIS ENTRY POINT IS USED IF THE EVALUATION OF AN
*      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, FAILS.
*      CONTROL IS RETURNED TO AN APPROPRIATE POINT IN EVALX.
*
{O$FEX{ENT{{{{ENTRY POINT
{{BRN{EVLX6{{{JUMP TO FAILURE LOC IN EVALX
{{EJC{{{{
*
*      FAILURE DURING EVALUATION OF A COMPLEX OR DIRECT GOTO
*
{O$FIF{ENT{{{{ENTRY POINT
{{ERB{020{GOTO{{EVALUATION FAILURE
{{EJC{{{{
*
*      FUNCTION CALL (MORE THAN ONE ARGUMENT)
*
{O$FNC{ENT{{{{ENTRY POINT
{{LCW{R6{{{LOAD NUMBER OF ARGUMENTS
{{LCW{R9{{{LOAD FUNCTION VRBLK POINTER
{{MOV{4*VRFNC(R9){R10{{LOAD FUNCTION POINTER
{{BNE{R6{4*FARGS(R10){CFUNC{USE CENTRAL ROUTINE IF WRONG NUM
{{BRI{(R10){{{JUMP TO FUNCTION IF ARG COUNT OK
{{EJC{{{{
*
*      FUNCTION NAME ERROR
*
{O$FNE{ENT{{{{ENTRY POINT
{{LCW{R6{{{GET NEXT CODE WORD
{{BNE{R6{#ORNM${OFNE1{FAIL IF NOT EVALUATING EXPRESSION
{{BZE{4*2(SP){EVLX3{{OK IF EXPR. WAS WANTED BY VALUE
*
*      HERE FOR ERROR
*
{OFNE1{ERB{021{FUNCTION{{CALLED BY NAME RETURNED A VALUE
{{EJC{{{{
*
*      FUNCTION CALL (SINGLE ARGUMENT)
*
{O$FNS{ENT{{{{ENTRY POINT
{{LCW{R9{{{LOAD FUNCTION VRBLK POINTER
{{MOV{#NUM01{R6{{SET NUMBER OF ARGUMENTS TO ONE
{{MOV{4*VRFNC(R9){R10{{LOAD FUNCTION POINTER
{{BNE{R6{4*FARGS(R10){CFUNC{USE CENTRAL ROUTINE IF WRONG NUM
{{BRI{(R10){{{JUMP TO FUNCTION IF ARG COUNT OK
{{EJC{{{{
*      CALL TO UNDEFINED FUNCTION
*
{O$FUN{ENT{{{{ENTRY POINT
{{ERB{022{UNDEFINED{{FUNCTION CALLED
{{EJC{{{{
*
*      EXECUTE COMPLEX GOTO
*
{O$GOC{ENT{{{{ENTRY POINT
{{MOV{4*1(SP){R9{{LOAD NAME BASE POINTER
{{BHI{R9{STATE{OGOC1{JUMP IF NOT NATURAL VARIABLE
{{ADD{#4*VRTRA{R9{{ELSE POINT TO VRTRA FIELD
{{BRI{(R9){{{AND JUMP THROUGH IT
*
*      HERE IF GOTO OPERAND IS NOT NATURAL VARIABLE
*
{OGOC1{ERB{023{GOTO{{OPERAND IS NOT A NATURAL VARIABLE
{{EJC{{{{
*
*      EXECUTE DIRECT GOTO
*
{O$GOD{ENT{{{{ENTRY POINT
{{MOV{(SP){R9{{LOAD OPERAND
{{MOV{(R9){R6{{LOAD FIRST WORD
{{BEQ{R6{#B$CDS{BCDS0{JUMP IF CODE BLOCK TO CODE ROUTINE
{{BEQ{R6{#B$CDC{BCDC0{JUMP IF CODE BLOCK TO CODE ROUTINE
{{ERB{024{GOTO{{OPERAND IN DIRECT GOTO IS NOT CODE
{{EJC{{{{
*
*      SET GOTO FAILURE TRAP
*
*      THIS ROUTINE IS EXECUTED AT THE START OF A COMPLEX OR
*      DIRECT FAILURE GOTO TO TRAP A SUBSEQUENT FAIL (SEE EXFAL)
*
{O$GOF{ENT{{{{ENTRY POINT
{{MOV{FLPTR{R9{{POINT TO FAIL OFFSET ON STACK
{{ICA{(R9){{{POINT FAILURE TO O$FIF WORD
{{ICP{{{{POINT TO NEXT CODE WORD
{{BRN{EXITS{{{EXIT TO CONTINUE
{{EJC{{{{
*
*      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
*
*      THE PATTERN BUILT BY BINARY DOLLAR IS A COMPOUND PATTERN.
*      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
*      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
*
{O$IMA{ENT{{{{ENTRY POINT
{{MOV{#P$IMC{R7{{SET PCODE FOR LAST NODE
{{MOV{(SP)+{R8{{POP NAME OFFSET (PARM2)
{{MOV{(SP)+{R9{{POP NAME BASE (PARM1)
{{JSR{PBILD{{{BUILD P$IMC NODE
{{MOV{R9{R10{{SAVE PTR TO NODE
{{MOV{(SP){R9{{LOAD LEFT ARGUMENT
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{025{IMMEDIATE{{ASSIGNMENT LEFT OPERAND IS NOT PATTERN
{{MOV{R9{(SP){{SAVE PTR TO LEFT OPERAND PATTERN
{{MOV{#P$IMA{R7{{SET PCODE FOR FIRST NODE
{{JSR{PBILD{{{BUILD P$IMA NODE
{{MOV{(SP)+{4*PTHEN(R9){{SET LEFT OPERAND AS P$IMA SUCCESSOR
{{JSR{PCONC{{{CONCATENATE TO FORM FINAL PATTERN
{{BRN{EXIXR{{{ALL DONE
{{EJC{{{{
*
*      INDIRECTION (BY NAME)
*
{O$INN{ENT{{{{ENTRY POINT
{{MNZ{R7{{{SET FLAG FOR RESULT BY NAME
{{BRN{INDIR{{{JUMP TO COMMON ROUTINE
{{EJC{{{{
*
*      INTERROGATION
*
{O$INT{ENT{{{{ENTRY POINT
{{MOV{#NULLS{(SP){{REPLACE OPERAND WITH NULL
{{BRN{EXITS{{{EXIT FOR NEXT CODE WORD
{{EJC{{{{
*
*      INDIRECTION (BY VALUE)
*
{O$INV{ENT{{{{ENTRY POINT
{{ZER{R7{{{SET FLAG FOR BY VALUE
{{BRN{INDIR{{{JUMP TO COMMON ROUTINE
{{EJC{{{{
*
*      KEYWORD REFERENCE (BY NAME)
*
{O$KWN{ENT{{{{ENTRY POINT
{{JSR{KWNAM{{{GET KEYWORD NAME
{{BRN{EXNAM{{{EXIT WITH RESULT NAME
{{EJC{{{{
*
*      KEYWORD REFERENCE (BY VALUE)
*
{O$KWV{ENT{{{{ENTRY POINT
{{JSR{KWNAM{{{GET KEYWORD NAME
{{MOV{R9{DNAMP{{DELETE KVBLK
{{JSR{ACESS{{{ACCESS VALUE
{{PPM{EXNUL{{{DUMMY (UNUSED) FAILURE RETURN
{{BRN{EXIXR{{{JUMP WITH VALUE IN XR
{{EJC{{{{
*
*      LOAD EXPRESSION BY NAME
*
{O$LEX{ENT{{{{ENTRY POINT
{{MOV{#4*EVSI${R6{{SET SIZE OF EVBLK
{{JSR{ALLOC{{{ALLOCATE SPACE FOR EVBLK
{{MOV{#B$EVT{(R9){{SET TYPE WORD
{{MOV{#TRBEV{4*EVVAR(R9){{SET DUMMY TRBLK POINTER
{{LCW{R6{{{LOAD EXBLK POINTER
{{MOV{R6{4*EVEXP(R9){{SET EXBLK POINTER
{{MOV{R9{R10{{MOVE NAME BASE TO PROPER REG
{{MOV{#4*EVVAR{R6{{SET NAME OFFSET = ZERO
{{BRN{EXNAM{{{EXIT WITH NAME IN (XL,WA)
{{EJC{{{{
*
*      LOAD PATTERN VALUE
*
{O$LPT{ENT{{{{ENTRY POINT
{{LCW{R9{{{LOAD PATTERN POINTER
{{BRN{EXIXR{{{STACK PTR AND OBEY NEXT CODE WORD
{{EJC{{{{
*
*      LOAD VARIABLE NAME
*
{O$LVN{ENT{{{{ENTRY POINT
{{LCW{R6{{{LOAD VRBLK POINTER
{{MOV{R6{-(SP){{STACK VRBLK PTR (NAME BASE)
{{MOV{#4*VRVAL{-(SP){{STACK NAME OFFSET
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
{{EJC{{{{
*
*      BINARY ASTERISK (MULTIPLICATION)
*
{O$MLT{ENT{{{{ENTRY POINT
{{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
{{ERR{026{MULTIPLICATION{{LEFT OPERAND IS NOT NUMERIC
{{ERR{027{MULTIPLICATION{{RIGHT OPERAND IS NOT NUMERIC
{{PPM{OMLT1{{{JUMP IF REAL OPERANDS
*
*      HERE TO MULTIPLY TWO INTEGERS
*
{{MLI{4*ICVAL(R10){{{MULTIPLY LEFT OPERAND BY RIGHT
{{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
{{ERB{028{MULTIPLICATION{{CAUSED INTEGER OVERFLOW
*
*      HERE TO MULTIPLY TWO REALS
*
{OMLT1{MLR{4*RCVAL(R10){{{MULTIPLY LEFT OPERAND BY RIGHT
{{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
{{ERB{263{MULTIPLICATION{{CAUSED REAL OVERFLOW
{{EJC{{{{
*
*      NAME REFERENCE
*
{O$NAM{ENT{{{{ENTRY POINT
{{MOV{#4*NMSI${R6{{SET LENGTH OF NMBLK
{{JSR{ALLOC{{{ALLOCATE NMBLK
{{MOV{#B$NML{(R9){{SET NAME BLOCK CODE
{{MOV{(SP)+{4*NMOFS(R9){{SET NAME OFFSET FROM OPERAND
{{MOV{(SP)+{4*NMBAS(R9){{SET NAME BASE FROM OPERAND
{{BRN{EXIXR{{{EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      NEGATION
*
*      INITIAL ENTRY
*
{O$NTA{ENT{{{{ENTRY POINT
{{LCW{R6{{{LOAD NEW FAILURE OFFSET
{{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
{{MOV{R6{-(SP){{STACK NEW FAILURE OFFSET
{{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
{{BRN{EXITS{{{JUMP TO CONTINUE EXECUTION
*
*      ENTRY AFTER SUCCESSFUL EVALUATION OF OPERAND
*
{O$NTB{ENT{{{{ENTRY POINT
{{MOV{4*2(SP){FLPTR{{RESTORE OLD FAILURE POINTER
{{BRN{EXFAL{{{AND FAIL
*
*      ENTRY FOR FAILURE DURING OPERAND EVALUATION
*
{O$NTC{ENT{{{{ENTRY POINT
{{ICA{SP{{{POP FAILURE OFFSET
{{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
{{BRN{EXNUL{{{EXIT GIVING NULL RESULT
{{EJC{{{{
*
*      USE OF UNDEFINED OPERATOR
*
{O$OUN{ENT{{{{ENTRY POINT
{{ERB{029{UNDEFINED{{OPERATOR REFERENCED
{{EJC{{{{
*
*      BINARY DOT (PATTERN ASSIGNMENT)
*
*      THE PATTERN BUILT BY BINARY DOT IS A COMPOUND PATTERN.
*      SEE DESCRIPTION AT START OF PATTERN MATCH SECTION FOR
*      DETAILS OF THE STRUCTURE WHICH IS CONSTRUCTED.
*
{O$PAS{ENT{{{{ENTRY POINT
{{MOV{#P$PAC{R7{{LOAD PCODE FOR P$PAC NODE
{{MOV{(SP)+{R8{{LOAD NAME OFFSET (PARM2)
{{MOV{(SP)+{R9{{LOAD NAME BASE (PARM1)
{{JSR{PBILD{{{BUILD P$PAC NODE
{{MOV{R9{R10{{SAVE PTR TO NODE
{{MOV{(SP){R9{{LOAD LEFT OPERAND
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{030{PATTERN{{ASSIGNMENT LEFT OPERAND IS NOT PATTERN
{{MOV{R9{(SP){{SAVE PTR TO LEFT OPERAND PATTERN
{{MOV{#P$PAA{R7{{SET PCODE FOR P$PAA NODE
{{JSR{PBILD{{{BUILD P$PAA NODE
{{MOV{(SP)+{4*PTHEN(R9){{SET LEFT OPERAND AS P$PAA SUCCESSOR
{{JSR{PCONC{{{CONCATENATE TO FORM FINAL PATTERN
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      PATTERN MATCH (BY NAME, FOR REPLACEMENT)
*
{O$PMN{ENT{{{{ENTRY POINT
{{ZER{R7{{{SET TYPE CODE FOR MATCH BY NAME
{{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH
{{EJC{{{{
*
*      PATTERN MATCH (STATEMENT)
*
*      O$PMS IS USED IN PLACE OF O$PMV WHEN THE PATTERN MATCH
*      OCCURS AT THE OUTER (STATEMENT) LEVEL SINCE IN THIS
*      CASE THE SUBSTRING VALUE NEED NOT BE CONSTRUCTED.
*
{O$PMS{ENT{{{{ENTRY POINT
{{MOV{#NUM02{R7{{SET FLAG FOR STATEMENT TO MATCH
{{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH
{{EJC{{{{
*
*      PATTERN MATCH (BY VALUE)
*
{O$PMV{ENT{{{{ENTRY POINT
{{MOV{#NUM01{R7{{SET TYPE CODE FOR VALUE MATCH
{{BRN{MATCH{{{JUMP TO ROUTINE TO START MATCH
{{EJC{{{{
*
*      POP TOP ITEM ON STACK
*
{O$POP{ENT{{{{ENTRY POINT
{{ICA{SP{{{POP TOP STACK ENTRY
{{BRN{EXITS{{{OBEY NEXT CODE WORD
{{EJC{{{{
*
*      TERMINATE EXECUTION (CODE COMPILED FOR END STATEMENT)
*
{O$STP{ENT{{{{ENTRY POINT
{{BRN{LEND0{{{JUMP TO END CIRCUIT
{{EJC{{{{
*
*      RETURN NAME FROM EXPRESSION
*      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
*      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
*      A NAME. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX.
*
{O$RNM{ENT{{{{ENTRY POINT
{{BRN{EVLX4{{{RETURN TO EVALX PROCEDURE
{{EJC{{{{
*
*      PATTERN REPLACEMENT
*
*      WHEN THIS ROUTINE GETS CONTROL, THE FOLLOWING STACK
*      ENTRIES HAVE BEEN MADE (SEE END OF MATCH ROUTINE P$NTH)
*
*                            SUBJECT NAME BASE
*                            SUBJECT NAME OFFSET
*                            INITIAL CURSOR VALUE
*                            FINAL CURSOR VALUE
*                            SUBJECT POINTER
*      (XS) ---------------- REPLACEMENT VALUE
*
{O$RPL{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{CONVERT REPLACEMENT VAL TO STRING
{{ERR{031{PATTERN{{REPLACEMENT RIGHT OPERAND IS NOT STRING
*
*      GET RESULT LENGTH AND ALLOCATE RESULT SCBLK
*
{{MOV{(SP){R10{{LOAD SUBJECT STRING POINTER
{{BEQ{(R10){#B$BCT{ORPL4{BRANCH IF BUFFER ASSIGNMENT
{{ADD{4*SCLEN(R10){R6{{ADD SUBJECT STRING LENGTH
{{ADD{4*2(SP){R6{{ADD STARTING CURSOR
{{SUB{4*1(SP){R6{{MINUS FINAL CURSOR = TOTAL LENGTH
{{BZE{R6{ORPL3{{JUMP IF RESULT IS NULL
{{MOV{R9{-(SP){{RESTACK REPLACEMENT STRING
{{JSR{ALOCS{{{ALLOCATE SCBLK FOR RESULT
{{MOV{4*3(SP){R6{{GET INITIAL CURSOR (PART 1 LEN)
{{MOV{R9{4*3(SP){{STACK RESULT POINTER
{{PSC{R9{{{POINT TO CHARACTERS OF RESULT
*
*      MOVE PART 1 (START OF SUBJECT) TO RESULT
*
{{BZE{R6{ORPL1{{JUMP IF FIRST PART IS NULL
{{MOV{4*1(SP){R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{{{POINT TO SUBJECT STRING CHARS
{{MVC{{{{MOVE FIRST PART TO RESULT
{{EJC{{{{
*      PATTERN REPLACEMENT (CONTINUED)
*
*      NOW MOVE IN REPLACEMENT VALUE
*
{ORPL1{MOV{(SP)+{R10{{LOAD REPLACEMENT STRING, POP
{{MOV{4*SCLEN(R10){R6{{LOAD LENGTH
{{BZE{R6{ORPL2{{JUMP IF NULL REPLACEMENT
{{PLC{R10{{{ELSE POINT TO CHARS OF REPLACEMENT
{{MVC{{{{MOVE IN CHARS (PART 2)
*
*      NOW MOVE IN REMAINDER OF STRING (PART 3)
*
{ORPL2{MOV{(SP)+{R10{{LOAD SUBJECT STRING POINTER, POP
{{MOV{(SP)+{R8{{LOAD FINAL CURSOR, POP
{{MOV{4*SCLEN(R10){R6{{LOAD SUBJECT STRING LENGTH
{{SUB{R8{R6{{MINUS FINAL CURSOR = PART 3 LENGTH
{{BZE{R6{OASS0{{JUMP TO ASSIGN IF PART 3 IS NULL
{{PLC{R10{R8{{ELSE POINT TO LAST PART OF STRING
{{MVC{{{{MOVE PART 3 TO RESULT
{{BRN{OASS0{{{JUMP TO PERFORM ASSIGNMENT
*
*      HERE IF RESULT IS NULL
*
{ORPL3{ADD{#4*NUM02{SP{{POP SUBJECT STR PTR, FINAL CURSOR
{{MOV{#NULLS{(SP){{SET NULL RESULT
{{BRN{OASS0{{{JUMP TO ASSIGN NULL VALUE
*
*      HERE FOR BUFFER SUBSTRING ASSIGNMENT
*
{ORPL4{MOV{R9{R10{{COPY SCBLK REPLACEMENT PTR
{{MOV{(SP)+{R9{{UNSTACK BCBLK PTR
{{MOV{(SP)+{R7{{GET FINAL CURSOR VALUE
{{MOV{(SP)+{R6{{GET INITIAL CURSOR
{{SUB{R6{R7{{GET LENGTH IN WB
{{ADD{#4*NUM02{SP{{GET RID OF NAME BASE/OFFSET
{{JSR{INSBF{{{INSERT SUBSTRING
{{PPM{{{{CONVERT FAIL IMPOSSIBLE
{{PPM{EXFAL{{{FAIL IF INSERT FAILS
{{BRN{EXNUL{{{ELSE NULL RESULT
{{EJC{{{{
*
*      RETURN VALUE FROM EXPRESSION
*
*      THIS ENTRY POINTS IS USED IF THE EVALUATION OF AN
*      EXPRESSION, INITIATED BY THE EVALX PROCEDURE, RETURNS
*      A VALUE. CONTROL IS RETURNED TO THE PROPER POINT IN EVALX
*
{O$RVL{ENT{{{{ENTRY POINT
{{BRN{EVLX3{{{RETURN TO EVALX PROCEDURE
{{EJC{{{{
*
*      SELECTION
*
*      INITIAL ENTRY
*
{O$SLA{ENT{{{{ENTRY POINT
{{LCW{R6{{{LOAD NEW FAILURE OFFSET
{{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
{{MOV{R6{-(SP){{STACK NEW FAILURE OFFSET
{{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
{{BRN{EXITS{{{JUMP TO EXECUTE FIRST ALTERNATIVE
*
*      ENTRY AFTER SUCCESSFUL EVALUATION OF ALTERNATIVE
*
{O$SLB{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD RESULT
{{ICA{SP{{{POP FAIL OFFSET
{{MOV{(SP){FLPTR{{RESTORE OLD FAILURE POINTER
{{MOV{R9{(SP){{RESTACK RESULT
{{LCW{R6{{{LOAD NEW CODE OFFSET
{{ADD{R$COD{R6{{POINT TO ABSOLUTE CODE LOCATION
{{LCP{R6{{{SET NEW CODE POINTER
{{BRN{EXITS{{{JUMP TO CONTINUE PAST SELECTION
*
*      ENTRY AT START OF SUBSEQUENT ALTERNATIVES
*
{O$SLC{ENT{{{{ENTRY POINT
{{LCW{R6{{{LOAD NEW FAIL OFFSET
{{MOV{R6{(SP){{STORE NEW FAIL OFFSET
{{BRN{EXITS{{{JUMP TO EXECUTE NEXT ALTERNATIVE
*
*      ENTRY AT START OF LAST ALTERNATIVE
*
{O$SLD{ENT{{{{ENTRY POINT
{{ICA{SP{{{POP FAILURE OFFSET
{{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
{{BRN{EXITS{{{JUMP TO EXECUTE LAST ALTERNATIVE
{{EJC{{{{
*
*      BINARY MINUS (SUBTRACTION)
*
{O$SUB{ENT{{{{ENTRY POINT
{{JSR{ARITH{{{FETCH ARITHMETIC OPERANDS
{{ERR{032{SUBTRACTION{{LEFT OPERAND IS NOT NUMERIC
{{ERR{033{SUBTRACTION{{RIGHT OPERAND IS NOT NUMERIC
{{PPM{OSUB1{{{JUMP IF REAL OPERANDS
*
*      HERE TO SUBTRACT TWO INTEGERS
*
{{SBI{4*ICVAL(R10){{{SUBTRACT RIGHT OPERAND FROM LEFT
{{INO{EXINT{{{RETURN INTEGER IF NO OVERFLOW
{{ERB{034{SUBTRACTION{{CAUSED INTEGER OVERFLOW
*
*      HERE TO SUBTRACT TWO REALS
*
{OSUB1{SBR{4*RCVAL(R10){{{SUBTRACT RIGHT OPERAND FROM LEFT
{{RNO{EXREA{{{RETURN REAL IF NO OVERFLOW
{{ERB{264{SUBTRACTION{{CAUSED REAL OVERFLOW
{{EJC{{{{
*
*      DUMMY OPERATOR TO RETURN CONTROL TO TRXEQ PROCEDURE
*
{O$TXR{ENT{{{{ENTRY POINT
{{BRN{TRXQ1{{{JUMP INTO TRXEQ PROCEDURE
{{EJC{{{{
*
*      UNEXPECTED FAILURE
*
*      NOTE THAT IF A SETEXIT TRAP IS OPERATING THEN
*      TRANSFER TO SYSTEM LABEL CONTINUE
*      WILL RESULT IN LOOPING HERE.  DIFFICULT TO AVOID EXCEPT
*      WITH A CONSIDERABLE OVERHEAD WHICH IS NOT WORTHWHILE OR
*      ELSE BY A TECHNIQUE SUCH AS SETTING KVERL TO ZERO.
*
{O$UNF{ENT{{{{ENTRY POINT
{{ERB{035{UNEXPECTED{{FAILURE IN -NOFAIL MODE
{{TTL{S{{{P I T B O L -- SNOBOL4 BUILTIN LABEL ROUTINES
*
*      THE FOLLOWING SECTION CONTAINS THE ROUTINES FOR LABELS
*      WHICH HAVE A PREDEFINED MEANING IN SNOBOL4.
*
*      CONTROL IS PASSED DIRECTLY TO THE LABEL NAME ENTRY POINT.
*
*      ENTRY NAMES ARE OF THE FORM L$XXX WHERE XXX IS THE THREE
*      LETTER VARIABLE NAME IDENTIFIER.
*
*      ENTRIES ARE IN ALPHABETICAL ORDER
{{EJC{{{{
*
*      ABORT
*
{L$ABO{ENT{{{{ENTRY POINT
*
*      MERGE HERE IF EXECUTION TERMINATES IN ERROR
*
{LABO1{MOV{KVERT{R6{{LOAD ERROR CODE
{{BZE{R6{LABO2{{JUMP IF NO ERROR HAS OCCURED
{{JSR{SYSAX{{{CALL AFTER EXECUTION PROC (REG04)
{{JSR{PRTPG{{{ELSE EJECT PRINTER
{{JSR{ERMSG{{{PRINT ERROR MESSAGE
{{ZER{R9{{{INDICATE NO MESSAGE TO PRINT
{{BRN{STOPR{{{JUMP TO ROUTINE TO STOP RUN
*
*      HERE IF NO ERROR HAD OCCURED
*
{LABO2{ERB{036{GOTO{{ABORT WITH NO PRECEDING ERROR
{{EJC{{{{
*
*      CONTINUE
*
{L$CNT{ENT{{{{ENTRY POINT
*
*      MERGE HERE AFTER EXECUTION ERROR
*
{LCNT1{MOV{R$CNT{R9{{LOAD CONTINUATION CODE BLOCK PTR
{{BZE{R9{LCNT2{{JUMP IF NO PREVIOUS ERROR
{{ZER{R$CNT{{{CLEAR FLAG
{{MOV{R9{R$COD{{ELSE STORE AS NEW CODE BLOCK PTR
{{ADD{STXOF{R9{{ADD FAILURE OFFSET
{{LCP{R9{{{LOAD CODE POINTER
{{MOV{FLPTR{SP{{RESET STACK POINTER
{{BRN{EXITS{{{JUMP TO TAKE INDICATED FAILURE
*
*      HERE IF NO PREVIOUS ERROR
*
{LCNT2{ERB{037{GOTO{{CONTINUE WITH NO PRECEDING ERROR
{{EJC{{{{
*
*      END
*
{L$END{ENT{{{{ENTRY POINT
*
*      MERGE HERE FROM END CODE CIRCUIT
*
{LEND0{MOV{#ENDMS{R9{{POINT TO MESSAGE /NORMAL TERM../
{{BRN{STOPR{{{JUMP TO ROUTINE TO STOP RUN
{{EJC{{{{
*
*      FRETURN
*
{L$FRT{ENT{{{{ENTRY POINT
{{MOV{#SCFRT{R6{{POINT TO STRING /FRETURN/
{{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE
{{EJC{{{{
*
*      NRETURN
*
{L$NRT{ENT{{{{ENTRY POINT
{{MOV{#SCNRT{R6{{POINT TO STRING /NRETURN/
{{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE
{{EJC{{{{
*
*      RETURN
*
{L$RTN{ENT{{{{ENTRY POINT
{{MOV{#SCRTN{R6{{POINT TO STRING /RETURN/
{{BRN{RETRN{{{JUMP TO COMMON RETURN ROUTINE
{{EJC{{{{
*
*      UNDEFINED LABEL
*
{L$UND{ENT{{{{ENTRY POINT
{{ERB{038{GOTO{{UNDEFINED LABEL
{{TTL{S{{{P I T B O L -- BLOCK ACTION ROUTINES
*
*      THE FIRST WORD OF EVERY BLOCK IN DYNAMIC STORAGE AND THE
*      VRGET, VRSTO AND VRTRA FIELDS OF A VRBLK CONTAIN A
*      POINTER TO AN ENTRY POINT IN THE PROGRAM. ALL SUCH ENTRY
*      POINTS ARE IN THE FOLLOWING SECTION EXCEPT THOSE FOR
*      PATTERN BLOCKS WHICH ARE IN THE PATTERN MATCHING SEGMENT
*      LATER ON (LABELS OF THE FORM P$XXX), AND DOPE VECTORS
*      (D$XXX) WHICH ARE IN THE DOPE VECTOR SECTION FOLLOWING
*      THE PATTERN ROUTINES (DOPE VECTORS ARE USED FOR CMBLKS).
*
*      THE ENTRY POINTS IN THIS SECTION HAVE LABELS OF THE
*      FORM B$XXY WHERE XX IS THE TWO CHARACTER BLOCK TYPE FOR
*      THE CORRESPONDING BLOCK AND Y IS ANY LETTER.
*
*      IN SOME CASES, THE POINTERS SERVE NO OTHER PURPOSE THAN
*      TO IDENTIFY THE BLOCK TYPE. IN THIS CASE THE ROUTINE
*      IS NEVER EXECUTED AND THUS NO CODE IS ASSEMBLED.
*
*      FOR EACH OF THESE ENTRY POINTS CORRESPONDING TO A BLOCK
*      AN ENTRY POINT IDENTIFICATION IS ASSEMBLED (BL$XX).
*
*      THE EXACT ENTRY CONDITIONS DEPEND ON THE MANNER IN
*      WHICH THE ROUTINE IS ACCESSED AND ARE DOCUMENTED WITH
*      THE INDIVIDUAL ROUTINES AS REQUIRED.
*
*      THE ORDER OF THESE ROUTINES IS ALPHABETICAL WITH THE
*      FOLLOWING EXCEPTIONS.
*
*      THE ROUTINES FOR SEBLK AND EXBLK ENTRIES OCCUR FIRST SO
*      THAT EXPRESSIONS CAN BE QUICKLY IDENTIFIED FROM THE FACT
*      THAT THEIR ROUTINES LIE BEFORE THE SYMBOL B$E$$.
*
*      THESE ARE IMMEDIATELY FOLLOWED BY THE ROUTINE FOR A TRBLK
*      SO THAT THE TEST AGAINST THE SYMBOL B$T$$ CHECKS FOR
*      TRAPPED VALUES OR EXPRESSION VALUES (SEE PROCEDURE EVALP)
*
*      THE PATTERN ROUTINES LIE AFTER THIS SECTION SO THAT
*      PATTERNS ARE IDENTIFIED WITH ROUTINES STARTING AT OR
*      AFTER THE INITIAL INSTRUCTION IN THESE ROUTINES (P$AAA).
*
*      THE SYMBOL B$AAA DEFINES THE FIRST LOCATION FOR BLOCK
*      ROUTINES AND THE SYMBOL P$YYY (AT THE END OF THE PATTERN
*      MATCH ROUTINES SECTION) DEFINES THE LAST SUCH ENTRY POINT
*
{B$AAA{ENT{BL$$I{{{ENTRY POINT OF FIRST BLOCK ROUTINE
{{EJC{{{{
*
*      EXBLK
*
*      THE ROUTINE FOR AN EXBLK LOADS THE EXPRESSION ONTO
*      THE STACK AS A VALUE.
*
*      (XR)                  POINTER TO EXBLK
*
{B$EXL{ENT{BL$EX{{{ENTRY POINT (EXBLK)
{{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
{{EJC{{{{
*
*      SEBLK
*
*      THE ROUTINE FOR SEBLK IS ACCESSED FROM THE GENERATED
*      CODE TO LOAD THE EXPRESSION VALUE ONTO THE STACK.
*
{B$SEL{ENT{BL$SE{{{ENTRY POINT (SEBLK)
{{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
*
*      DEFINE SYMBOL WHICH MARKS END OF ENTRIES FOR EXPRESSIONS
*
{B$E$${ENT{BL$$I{{{ENTRY POINT
{{EJC{{{{
*
*      TRBLK
*
*      THE ROUTINE FOR A TRBLK IS NEVER EXECUTED
*
{B$TRT{ENT{BL$TR{{{ENTRY POINT (TRBLK)
*
*      DEFINE SYMBOL MARKING END OF TRAP AND EXPRESSION BLOCKS
*
{B$T$${ENT{BL$$I{{{END OF TRBLK,SEBLK,EXBLK ENTRIES
{{EJC{{{{
*
*      ARBLK
*
*      THE ROUTINE FOR ARBLK IS NEVER EXECUTED
*
{B$ART{ENT{BL$AR{{{ENTRY POINT (ARBLK)
{{EJC{{{{
*
*      BCBLK
*
*      THE ROUTINE FOR A BCBLK IS NEVER EXECUTED
*
*      (XR)                  POINTER TO BCBLK
*
{B$BCT{ENT{BL$BC{{{ENTRY POINT (BCBLK)
{{EJC{{{{
*
*      BFBLK
*
*      THE ROUTINE FOR A BFBLK IS NEVER EXECUTED
*
*      (XR)                  POINTER TO BFBLK
*
{B$BFT{ENT{BL$BF{{{ENTRY POINT (BFBLK)
{{EJC{{{{
*
*      CCBLK
*
*      THE ROUTINE FOR CCBLK IS NEVER ENTERED
*
{B$CCT{ENT{BL$CC{{{ENTRY POINT (CCBLK)
{{EJC{{{{
*
*      CDBLK
*
*      THE CDBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
*      THERE ARE TWO CASES DEPENDING ON THE FORM OF CDFAL.
*
*      ENTRY FOR COMPLEX FAILURE CODE AT CDFAL
*
*      (XR)                  POINTER TO CDBLK
*
{B$CDC{ENT{BL$CD{{{ENTRY POINT (CDBLK)
{BCDC0{MOV{FLPTR{SP{{POP GARBAGE OFF STACK
{{MOV{4*CDFAL(R9){(SP){{SET FAILURE OFFSET
{{BRN{STMGO{{{ENTER STMT
{{EJC{{{{
*
*      CDBLK (CONTINUED)
*
*      ENTRY FOR SIMPLE FAILURE CODE AT CDFAL
*
*      (XR)                  POINTER TO CDBLK
*
{B$CDS{ENT{BL$CD{{{ENTRY POINT (CDBLK)
{BCDS0{MOV{FLPTR{SP{{POP GARBAGE OFF STACK
{{MOV{#4*CDFAL{(SP){{SET FAILURE OFFSET
{{BRN{STMGO{{{ENTER STMT
{{EJC{{{{
*
*      CMBLK
*
*      THE ROUTINE FOR A CMBLK IS NEVER EXECUTED
*
{B$CMT{ENT{BL$CM{{{ENTRY POINT (CMBLK)
{{EJC{{{{
*
*      CTBLK
*
*      THE ROUTINE FOR A CTBLK IS NEVER EXECUTED
*
{B$CTT{ENT{BL$CT{{{ENTRY POINT (CTBLK)
{{EJC{{{{
*
*      DFBLK
*
*      THE ROUTINE FOR A DFBLK IS ACCESSED FROM THE O$FNC ENTRY
*      TO CALL A DATATYPE FUNCTION AND BUILD A PDBLK.
*
*      (XL)                  POINTER TO DFBLK
*
{B$DFC{ENT{BL$DF{{{ENTRY POINT
{{MOV{4*DFPDL(R10){R6{{LOAD LENGTH OF PDBLK
{{JSR{ALLOC{{{ALLOCATE PDBLK
{{MOV{#B$PDT{(R9){{STORE TYPE WORD
{{MOV{R10{4*PDDFP(R9){{STORE DFBLK POINTER
{{MOV{R9{R8{{SAVE POINTER TO PDBLK
{{ADD{R6{R9{{POINT PAST PDBLK
{{LCT{R6{4*FARGS(R10){{SET TO COUNT FIELDS
*
*      LOOP TO ACQUIRE FIELD VALUES FROM STACK
*
{BDFC1{MOV{(SP)+{-(R9){{MOVE A FIELD VALUE
{{BCT{R6{BDFC1{{LOOP TILL ALL MOVED
{{MOV{R8{R9{{RECALL POINTER TO PDBLK
{{BRN{EXSID{{{EXIT SETTING ID FIELD
{{EJC{{{{
*
*      EFBLK
*
*      THE ROUTINE FOR AN EFBLK IS PASSED CONTROL FORM THE O$FNC
*      ENTRY TO CALL AN EXTERNAL FUNCTION.
*
*      (XL)                  POINTER TO EFBLK
*
{B$EFC{ENT{BL$EF{{{ENTRY POINT (EFBLK)
{{MOV{4*FARGS(R10){R8{{LOAD NUMBER OF ARGUMENTS
{{WTB{R8{{{CONVERT TO OFFSET
{{MOV{R10{-(SP){{SAVE POINTER TO EFBLK
{{MOV{SP{R10{{COPY POINTER TO ARGUMENTS
*
*      LOOP TO CONVERT ARGUMENTS
*
{BEFC1{ICA{R10{{{POINT TO NEXT ENTRY
{{MOV{(SP){R9{{LOAD POINTER TO EFBLK
{{DCA{R8{{{DECREMENT EFTAR OFFSET
{{ADD{R8{R9{{POINT TO NEXT EFTAR ENTRY
{{MOV{4*EFTAR(R9){R9{{LOAD EFTAR ENTRY
{{BSW{R9{4{{SWITCH ON TYPE
{{IFF{0{BEFC7{{NO CONVERSION NEEDED
{{IFF{1{BEFC2{{STRING
{{IFF{2{BEFC3{{INTEGER
{{IFF{3{BEFC4{{REAL
{{ESW{{{{END OF SWITCH ON TYPE
*
*      HERE TO CONVERT TO STRING
*
{BEFC2{MOV{(R10){-(SP){{STACK ARG PTR
{{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
{{ERR{039{EXTERNAL{{FUNCTION ARGUMENT IS NOT STRING
{{BRN{BEFC6{{{JUMP TO MERGE
{{EJC{{{{
*
*      EFBLK (CONTINUED)
*
*      HERE TO CONVERT AN INTEGER
*
{BEFC3{MOV{(R10){R9{{LOAD NEXT ARGUMENT
{{MOV{R8{BEFOF{{SAVE OFFSET
{{JSR{GTINT{{{CONVERT TO INTEGER
{{ERR{040{EXTERNAL{{FUNCTION ARGUMENT IS NOT INTEGER
{{BRN{BEFC5{{{MERGE WITH REAL CASE
*
*      HERE TO CONVERT A REAL
*
{BEFC4{MOV{(R10){R9{{LOAD NEXT ARGUMENT
{{MOV{R8{BEFOF{{SAVE OFFSET
{{JSR{GTREA{{{CONVERT TO REAL
{{ERR{265{EXTERNAL{{FUNCTION ARGUMENT IS NOT REAL
*
*      INTEGER CASE MERGES HERE
*
{BEFC5{MOV{BEFOF{R8{{RESTORE OFFSET
*
*      STRING MERGES HERE
*
{BEFC6{MOV{R9{(R10){{STORE CONVERTED RESULT
*
*      NO CONVERSION MERGES HERE
*
{BEFC7{BNZ{R8{BEFC1{{LOOP BACK IF MORE TO GO
*
*      HERE AFTER CONVERTING ALL THE ARGUMENTS
*
{{MOV{(SP)+{R10{{RESTORE EFBLK POINTER
{{MOV{4*FARGS(R10){R6{{GET NUMBER OF ARGS
{{JSR{SYSEX{{{CALL ROUTINE TO CALL EXTERNAL FNC
{{PPM{EXFAL{{{FAIL IF FAILURE
{{EJC{{{{
*
*      EFBLK (CONTINUED)
*
*      RETURN HERE WITH RESULT IN XR
*
*      FIRST DEFEND AGAINST NON-STANDARD NULL STRING RETURNED
*
{{MOV{4*EFRSL(R10){R7{{GET RESULT TYPE ID
{{BNZ{R7{BEFA8{{BRANCH IF NOT UNCONVERTED
{{BNE{(R9){#B$SCL{BEFC8{JUMP IF NOT A STRING
{{BZE{4*SCLEN(R9){EXNUL{{RETURN NULL IF NULL
*
*      HERE IF CONVERTED RESULT TO CHECK FOR NULL STRING
*
{BEFA8{BNE{R7{#NUM01{BEFC8{JUMP IF NOT A STRING
{{BZE{4*SCLEN(R9){EXNUL{{RETURN NULL IF NULL
*
*      RETURN IF RESULT IS IN DYNAMIC STORAGE
*
{BEFC8{BLT{R9{DNAMB{BEFC9{JUMP IF NOT IN DYNAMIC STORAGE
{{BLE{R9{DNAMP{EXIXR{RETURN RESULT IF ALREADY DYNAMIC
*
*      HERE WE COPY A RESULT INTO THE DYNAMIC REGION
*
{BEFC9{MOV{(R9){R6{{GET POSSIBLE TYPE WORD
{{BZE{R7{BEF11{{JUMP IF UNCONVERTED RESULT
{{MOV{#B$SCL{R6{{STRING
{{BEQ{R7{#NUM01{BEF10{YES JUMP
{{MOV{#B$ICL{R6{{INTEGER
{{BEQ{R7{#NUM02{BEF10{YES JUMP
{{MOV{#B$RCL{R6{{REAL
*
*      STORE TYPE WORD IN RESULT
*
{BEF10{MOV{R6{(R9){{STORED BEFORE COPYING TO DYNAMIC
*
*      MERGE FOR UNCONVERTED RESULT
*
{BEF11{JSR{BLKLN{{{GET LENGTH OF BLOCK
{{MOV{R9{R10{{COPY ADDRESS OF OLD BLOCK
{{JSR{ALLOC{{{ALLOCATE DYNAMIC BLOCK SAME SIZE
{{MOV{R9{-(SP){{SET POINTER TO NEW BLOCK AS RESULT
{{MVW{{{{COPY OLD BLOCK TO DYNAMIC BLOCK
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
{{EJC{{{{
*
*      EVBLK
*
*      THE ROUTINE FOR AN EVBLK IS NEVER EXECUTED
*
{B$EVT{ENT{BL$EV{{{ENTRY POINT (EVBLK)
{{EJC{{{{
*
*      FFBLK
*
*      THE ROUTINE FOR AN FFBLK IS EXECUTED FROM THE O$FNC ENTRY
*      TO CALL A FIELD FUNCTION AND EXTRACT A FIELD VALUE/NAME.
*
*      (XL)                  POINTER TO FFBLK
*
{B$FFC{ENT{BL$FF{{{ENTRY POINT (FFBLK)
{{MOV{R10{R9{{COPY FFBLK POINTER
{{LCW{R8{{{LOAD NEXT CODE WORD
{{MOV{(SP){R10{{LOAD PDBLK POINTER
{{BNE{(R10){#B$PDT{BFFC2{JUMP IF NOT PDBLK AT ALL
{{MOV{4*PDDFP(R10){R6{{LOAD DFBLK POINTER FROM PDBLK
*
*      LOOP TO FIND CORRECT FFBLK FOR THIS PDBLK
*
{BFFC1{BEQ{R6{4*FFDFP(R9){BFFC3{JUMP IF THIS IS THE CORRECT FFBLK
{{MOV{4*FFNXT(R9){R9{{ELSE LINK TO NEXT FFBLK ON CHAIN
{{BNZ{R9{BFFC1{{LOOP BACK IF ANOTHER ENTRY TO CHECK
*
*      HERE FOR BAD ARGUMENT
*
{BFFC2{ERB{041{FIELD{{FUNCTION ARGUMENT IS WRONG DATATYPE
{{EJC{{{{
*
*      FFBLK (CONTINUED)
*
*      HERE AFTER LOCATING CORRECT FFBLK
*
{BFFC3{MOV{4*FFOFS(R9){R6{{LOAD FIELD OFFSET
{{BEQ{R8{#OFNE${BFFC5{JUMP IF CALLED BY NAME
{{ADD{R6{R10{{ELSE POINT TO VALUE FIELD
{{MOV{(R10){R9{{LOAD VALUE
{{BNE{(R9){#B$TRT{BFFC4{JUMP IF NOT TRAPPED
{{SUB{R6{R10{{ELSE RESTORE NAME BASE,OFFSET
{{MOV{R8{(SP){{SAVE NEXT CODE WORD OVER PDBLK PTR
{{JSR{ACESS{{{ACCESS VALUE
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{MOV{(SP){R8{{RESTORE NEXT CODE WORD
*
*      HERE AFTER GETTING VALUE IN (XR)
*
{BFFC4{MOV{R9{(SP){{STORE VALUE ON STACK (OVER PDBLK)
{{MOV{R8{R9{{COPY NEXT CODE WORD
{{MOV{(R9){R10{{LOAD ENTRY ADDRESS
{{BRI{R10{{{JUMP TO ROUTINE FOR NEXT CODE WORD
*
*      HERE IF CALLED BY NAME
*
{BFFC5{MOV{R6{-(SP){{STORE NAME OFFSET (BASE IS SET)
{{BRN{EXITS{{{EXIT WITH NAME ON STACK
{{EJC{{{{
*
*      ICBLK
*
*      THE ROUTINE FOR ICBLK IS EXECUTED FROM THE GENERATED
*      CODE TO LOAD AN INTEGER VALUE ONTO THE STACK.
*
*      (XR)                  POINTER TO ICBLK
*
{B$ICL{ENT{BL$IC{{{ENTRY POINT (ICBLK)
{{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
{{EJC{{{{
*
*      KVBLK
*
*      THE ROUTINE FOR A KVBLK IS NEVER EXECUTED.
*
{B$KVT{ENT{BL$KV{{{ENTRY POINT (KVBLK)
{{EJC{{{{
*
*      NMBLK
*
*      THE ROUTINE FOR A NMBLK IS EXECUTED FROM THE GENERATED
*      CODE FOR THE CASE OF LOADING A NAME ONTO THE STACK
*      WHERE THE NAME IS THAT OF A NATURAL VARIABLE WHICH CAN
*      BE PREEVALUATED AT COMPILE TIME.
*
*      (XR)                  POINTER TO NMBLK
*
{B$NML{ENT{BL$NM{{{ENTRY POINT (NMBLK)
{{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
{{EJC{{{{
*
*      PDBLK
*
*      THE ROUTINE FOR A PDBLK IS NEVER EXECUTED
*
{B$PDT{ENT{BL$PD{{{ENTRY POINT (PDBLK)
{{EJC{{{{
*
*      PFBLK
*
*      THE ROUTINE FOR A PFBLK IS EXECUTED FROM THE ENTRY O$FNC
*      TO CALL A PROGRAM DEFINED FUNCTION.
*
*      (XL)                  POINTER TO PFBLK
*
*      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
*      CONTROL TO THE PROGRAM DEFINED FUNCTION.
*
*                            SAVED VALUE OF FIRST ARGUMENT
*                            .
*                            SAVED VALUE OF LAST ARGUMENT
*                            SAVED VALUE OF FIRST LOCAL
*                            .
*                            SAVED VALUE OF LAST LOCAL
*                            SAVED VALUE OF FUNCTION NAME
*                            SAVED CODE BLOCK PTR (R$COD)
*                            SAVED CODE POINTER (-R$COD)
*                            SAVED VALUE OF FLPRT
*                            SAVED VALUE OF FLPTR
*                            POINTER TO PFBLK
*      FLPTR --------------- ZERO (TO BE OVERWRITTEN WITH OFFS)
*
{B$PFC{ENT{BL$PF{{{ENTRY POINT (PFBLK)
{{MOV{R10{BPFPF{{SAVE PFBLK PTR (NEED NOT BE RELOC)
{{MOV{R10{R9{{COPY FOR THE MOMENT
{{MOV{4*PFVBL(R9){R10{{POINT TO VRBLK FOR FUNCTION
*
*      LOOP TO FIND OLD VALUE OF FUNCTION
*
{BPF01{MOV{R10{R7{{SAVE POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD VALUE
{{BEQ{(R10){#B$TRT{BPF01{LOOP IF TRBLK
*
*      SET VALUE TO NULL AND SAVE OLD FUNCTION VALUE
*
{{MOV{R10{BPFSV{{SAVE OLD VALUE
{{MOV{R7{R10{{POINT BACK TO BLOCK WITH VALUE
{{MOV{#NULLS{4*VRVAL(R10){{SET VALUE TO NULL
{{MOV{4*FARGS(R9){R6{{LOAD NUMBER OF ARGUMENTS
{{ADD{#4*PFARG{R9{{POINT TO PFARG ENTRIES
{{BZE{R6{BPF04{{JUMP IF NO ARGUMENTS
{{MOV{SP{R10{{PTR TO LAST ARG
{{WTB{R6{{{CONVERT NO. OF ARGS TO BYTES OFFSET
{{ADD{R6{R10{{POINT BEFORE FIRST ARG
{{MOV{R10{BPFXT{{REMEMBER ARG POINTER
{{EJC{{{{
*
*      PFBLK (CONTINUED)
*
*      LOOP TO SAVE OLD ARGUMENT VALUES AND SET NEW ONES
*
{BPF02{MOV{(R9)+{R10{{LOAD VRBLK PTR FOR NEXT ARGUMENT
*
*      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
*
{BPF03{MOV{R10{R8{{SAVE POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE
{{BEQ{(R10){#B$TRT{BPF03{LOOP BACK IF TRBLK
*
*      SAVE OLD VALUE AND GET NEW VALUE
*
{{MOV{R10{R6{{KEEP OLD VALUE
{{MOV{BPFXT{R10{{POINT BEFORE NEXT STACKED ARG
{{MOV{-(R10){R7{{LOAD ARGUMENT (NEW VALUE)
{{MOV{R6{(R10){{SAVE OLD VALUE
{{MOV{R10{BPFXT{{KEEP ARG PTR FOR NEXT TIME
{{MOV{R8{R10{{POINT BACK TO BLOCK WITH VALUE
{{MOV{R7{4*VRVAL(R10){{SET NEW VALUE
{{BNE{SP{BPFXT{BPF02{LOOP IF NOT ALL DONE
*
*      NOW PROCESS LOCALS
*
{BPF04{MOV{BPFPF{R10{{RESTORE PFBLK POINTER
{{MOV{4*PFNLO(R10){R6{{LOAD NUMBER OF LOCALS
{{BZE{R6{BPF07{{JUMP IF NO LOCALS
{{MOV{#NULLS{R7{{GET NULL CONSTANT
{{LCT{R6{R6{{SET LOCAL COUNTER
*
*      LOOP TO PROCESS LOCALS
*
{BPF05{MOV{(R9)+{R10{{LOAD VRBLK PTR FOR NEXT LOCAL
*
*      LOOP THROUGH POSSIBLE TRBLK CHAIN TO FIND VALUE
*
{BPF06{MOV{R10{R8{{SAVE POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE
{{BEQ{(R10){#B$TRT{BPF06{LOOP BACK IF TRBLK
*
*      SAVE OLD VALUE AND SET NULL AS NEW VALUE
*
{{MOV{R10{-(SP){{STACK OLD VALUE
{{MOV{R8{R10{{POINT BACK TO BLOCK WITH VALUE
{{MOV{R7{4*VRVAL(R10){{SET NULL AS NEW VALUE
{{BCT{R6{BPF05{{LOOP TILL ALL LOCALS PROCESSED
{{EJC{{{{
*
*      PFBLK (CONTINUED)
*
*      HERE AFTER PROCESSING ARGUMENTS AND LOCALS
*
{BPF07{ZER{R9{{{ZERO REG XR IN CASE
{{BZE{KVPFL{BPF7C{{SKIP IF PROFILING IS OFF
{{BEQ{KVPFL{#NUM02{BPF7A{BRANCH ON TYPE OF PROFILE
*
*      HERE IF &PROFILE = 1
*
{{JSR{SYSTM{{{GET CURRENT TIME
{{STI{PFETM{{{SAVE FOR A SEC
{{SBI{PFSTM{{{FIND TIME USED BY CALLER
{{JSR{ICBLD{{{BUILD INTO AN ICBLK
{{LDI{PFETM{{{RELOAD CURRENT TIME
{{BRN{BPF7B{{{MERGE
*
*       HERE IF &PROFILE = 2
*
{BPF7A{LDI{PFSTM{{{GET START TIME OF CALLING STMT
{{JSR{ICBLD{{{ASSEMBLE AN ICBLK ROUND IT
{{JSR{SYSTM{{{GET NOW TIME
*
*      BOTH TYPES OF PROFILE MERGE HERE
*
{BPF7B{STI{PFSTM{{{SET START TIME OF 1ST FUNC STMT
{{MNZ{PFFNC{{{FLAG FUNCTION ENTRY
*
*      NO PROFILING MERGES HERE
*
{BPF7C{MOV{R9{-(SP){{STACK ICBLK PTR (OR ZERO)
{{MOV{R$COD{R6{{LOAD OLD CODE BLOCK POINTER
{{SCP{R7{{{GET CODE POINTER
{{SUB{R6{R7{{MAKE CODE POINTER INTO OFFSET
{{MOV{BPFPF{R10{{RECALL PFBLK POINTER
{{MOV{BPFSV{-(SP){{STACK OLD VALUE OF FUNCTION NAME
{{MOV{R6{-(SP){{STACK CODE BLOCK POINTER
{{MOV{R7{-(SP){{STACK CODE OFFSET
{{MOV{FLPRT{-(SP){{STACK OLD FLPRT
{{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
{{MOV{R10{-(SP){{STACK POINTER TO PFBLK
{{ZER{-(SP){{{DUMMY ZERO ENTRY FOR FAIL RETURN
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{MOV{SP{FLPTR{{SET NEW FAIL RETURN VALUE
{{MOV{SP{FLPRT{{SET NEW FLPRT
{{MOV{KVTRA{R6{{LOAD TRACE VALUE
{{ADD{KVFTR{R6{{ADD FTRACE VALUE
{{BNZ{R6{BPF09{{JUMP IF TRACING POSSIBLE
{{ICV{KVFNC{{{ELSE BUMP FNCLEVEL
*
*      HERE TO ACTUALLY JUMP TO FUNCTION
*
{BPF08{MOV{4*PFCOD(R10){R9{{POINT TO CODE
{{BRI{(R9){{{OFF TO EXECUTE FUNCTION
*
*      HERE IF TRACING IS POSSIBLE
*
{BPF09{MOV{4*PFCTR(R10){R9{{LOAD POSSIBLE CALL TRACE TRBLK
{{MOV{4*PFVBL(R10){R10{{LOAD VRBLK POINTER FOR FUNCTION
{{MOV{#4*VRVAL{R6{{SET NAME OFFSET FOR VARIABLE
{{BZE{KVTRA{BPF10{{JUMP IF TRACE MODE IS OFF
{{BZE{R9{BPF10{{OR IF THERE IS NO CALL TRACE
*
*      HERE IF CALL TRACED
*
{{DCV{KVTRA{{{DECREMENT TRACE COUNT
{{BZE{4*TRFNC(R9){BPF11{{JUMP IF PRINT TRACE
{{JSR{TRXEQ{{{EXECUTE FUNCTION TYPE TRACE
{{EJC{{{{
*
*      PFBLK (CONTINUED)
*
*      HERE TO TEST FOR FTRACE TRACE
*
{BPF10{BZE{KVFTR{BPF16{{JUMP IF FTRACE IS OFF
{{DCV{KVFTR{{{ELSE DECREMENT FTRACE
*
*      HERE FOR PRINT TRACE
*
{BPF11{JSR{PRTSN{{{PRINT STATEMENT NUMBER
{{JSR{PRTNM{{{PRINT FUNCTION NAME
{{MOV{#CH$PP{R6{{LOAD LEFT PAREN
{{JSR{PRTCH{{{PRINT LEFT PAREN
{{MOV{4*1(SP){R10{{RECOVER PFBLK POINTER
{{BZE{4*FARGS(R10){BPF15{{SKIP IF NO ARGUMENTS
{{ZER{R7{{{ELSE SET ARGUMENT COUNTER
{{BRN{BPF13{{{JUMP INTO LOOP
*
*      LOOP TO PRINT ARGUMENT VALUES
*
{BPF12{MOV{#CH$CM{R6{{LOAD COMMA
{{JSR{PRTCH{{{PRINT TO SEPARATE FROM LAST ARG
*
*      MERGE HERE FIRST TIME (NO COMMA REQUIRED)
*
{BPF13{MOV{R7{(SP){{SAVE ARG CTR (OVER FAILOFFS IS OK)
{{WTB{R7{{{CONVERT TO BYTE OFFSET
{{ADD{R7{R10{{POINT TO NEXT ARGUMENT POINTER
{{MOV{4*PFARG(R10){R9{{LOAD NEXT ARGUMENT VRBLK PTR
{{SUB{R7{R10{{RESTORE PFBLK POINTER
{{MOV{4*VRVAL(R9){R9{{LOAD NEXT VALUE
{{JSR{PRTVL{{{PRINT ARGUMENT VALUE
{{EJC{{{{
*
*      HERE AFTER DEALING WITH ONE ARGUMENT
*
{{MOV{(SP){R7{{RESTORE ARGUMENT COUNTER
{{ICV{R7{{{INCREMENT ARGUMENT COUNTER
{{BLT{R7{4*FARGS(R10){BPF12{LOOP IF MORE TO PRINT
*
*      MERGE HERE IN NO ARGS CASE TO PRINT PAREN
*
{BPF15{MOV{#CH$RP{R6{{LOAD RIGHT PAREN
{{JSR{PRTCH{{{PRINT TO TERMINATE OUTPUT
{{JSR{PRTNL{{{TERMINATE PRINT LINE
*
*      MERGE HERE TO EXIT WITH TEST FOR FNCLEVEL TRACE
*
{BPF16{ICV{KVFNC{{{INCREMENT FNCLEVEL
{{MOV{R$FNC{R10{{LOAD PTR TO POSSIBLE TRBLK
{{JSR{KTREX{{{CALL KEYWORD TRACE ROUTINE
*
*      CALL FUNCTION AFTER TRACE TESTS COMPLETE
*
{{MOV{4*1(SP){R10{{RESTORE PFBLK POINTER
{{BRN{BPF08{{{JUMP BACK TO EXECUTE FUNCTION
{{EJC{{{{
*
*      RCBLK
*
*      THE ROUTINE FOR AN RCBLK IS EXECUTED FROM THE GENERATED
*      CODE TO LOAD A REAL VALUE ONTO THE STACK.
*
*      (XR)                  POINTER TO RCBLK
*
{B$RCL{ENT{BL$RC{{{ENTRY POINT (RCBLK)
{{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
{{EJC{{{{
*
*      SCBLK
*
*      THE ROUTINE FOR AN SCBLK IS EXECUTED FROM THE GENERATED
*      CODE TO LOAD A STRING VALUE ONTO THE STACK.
*
*      (XR)                  POINTER TO SCBLK
*
{B$SCL{ENT{BL$SC{{{ENTRY POINT (SCBLK)
{{BRN{EXIXR{{{STACK XR AND OBEY NEXT CODE WORD
{{EJC{{{{
*
*      TBBLK
*
*      THE ROUTINE FOR A TBBLK IS NEVER EXECUTED
*
{B$TBT{ENT{BL$TB{{{ENTRY POINT (TBBLK)
{{EJC{{{{
*
*      TEBLK
*
*      THE ROUTINE FOR A TEBLK IS NEVER EXECUTED
*
{B$TET{ENT{BL$TE{{{ENTRY POINT (TEBLK)
{{EJC{{{{
*
*      VCBLK
*
*      THE ROUTINE FOR A VCBLK IS NEVER EXECUTED
*
{B$VCT{ENT{BL$VC{{{ENTRY POINT (VCBLK)
{{EJC{{{{
*
*      VRBLK
*
*      THE VRBLK ROUTINES ARE EXECUTED FROM THE GENERATED CODE.
*      THERE ARE SIX ENTRIES FOR VRBLK COVERING VARIOUS CASES
*
{B$VR${ENT{BL$$I{{{MARK START OF VRBLK ENTRY POINTS
*
*      ENTRY FOR VRGET (TRAPPED CASE). THIS ROUTINE IS CALLED
*      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
*      THIS ENTRY POINT IS USED IF AN ACCESS TRACE OR INPUT
*      ASSOCIATION IS CURRENTLY ACTIVE.
*
*      (XR)                  POINTER TO VRGET FIELD OF VRBLK
*
{B$VRA{ENT{BL$$I{{{ENTRY POINT
{{MOV{R9{R10{{COPY NAME BASE (VRGET = 0)
{{MOV{#4*VRVAL{R6{{SET NAME OFFSET
{{JSR{ACESS{{{ACCESS VALUE
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{BRN{EXIXR{{{ELSE EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      VRBLK (CONTINUED)
*
*      ENTRY FOR VRSTO (ERROR CASE. THIS ROUTINE IS CALLED FROM
*      THE EXECUTED CODE FOR AN ATTEMPT TO MODIFY THE VALUE
*      OF A PROTECTED (PATTERN VALUED) NATURAL VARIABLE.
*
{B$VRE{ENT{{{{ENTRY POINT
{{ERB{042{ATTEMPT{{TO CHANGE VALUE OF PROTECTED VARIABLE
{{EJC{{{{
*
*      VRBLK (CONTINUED)
*
*      ENTRY FOR VRTRA (UNTRAPPED CASE). THIS ROUTINE IS CALLED
*      FROM THE EXECUTED CODE TO TRANSFER TO A LABEL.
*
*      (XR)                  POINTER TO VRTRA FIELD OF VRBLK
*
{B$VRG{ENT{{{{ENTRY POINT
{{MOV{4*VRLBO(R9){R9{{LOAD CODE POINTER
{{MOV{(R9){R10{{LOAD ENTRY ADDRESS
{{BRI{R10{{{JUMP TO ROUTINE FOR NEXT CODE WORD
{{EJC{{{{
*
*      VRBLK (CONTINUED)
*
*      ENTRY FOR VRGET (UNTRAPPED CASE). THIS ROUTINE IS CALLED
*      FROM THE GENERATED CODE TO LOAD THE VALUE OF A VARIABLE.
*
*      (XR)                  POINTS TO VRGET FIELD OF VRBLK
*
{B$VRL{ENT{{{{ENTRY POINT
{{MOV{4*VRVAL(R9){-(SP){{LOAD VALUE ONTO STACK (VRGET = 0)
{{BRN{EXITS{{{OBEY NEXT CODE WORD
{{EJC{{{{
*
*      VRBLK (CONTINUED)
*
*      ENTRY FOR VRSTO (UNTRAPPED CASE). THIS ROUTINE IS CALLED
*      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
*
*      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
*
{B$VRS{ENT{{{{ENTRY POINT
{{MOV{(SP){4*VRVLO(R9){{STORE VALUE, LEAVE ON STACK
{{BRN{EXITS{{{OBEY NEXT CODE WORD
{{EJC{{{{
*
*      VRBLK (CONTINUED)
*
*      VRTRA (TRAPPED CASE). THIS ROUTINE IS CALLED FROM THE
*      GENERATED CODE TO TRANSFER TO A LABEL WHEN A LABEL
*      TRACE IS CURRENTLY ACTIVE.
*
{B$VRT{ENT{{{{ENTRY POINT
{{SUB{#4*VRTRA{R9{{POINT BACK TO START OF VRBLK
{{MOV{R9{R10{{COPY VRBLK POINTER
{{MOV{#4*VRVAL{R6{{SET NAME OFFSET
{{MOV{4*VRLBL(R10){R9{{LOAD POINTER TO TRBLK
{{BZE{KVTRA{BVRT2{{JUMP IF TRACE IS OFF
{{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
{{BZE{4*TRFNC(R9){BVRT1{{JUMP IF PRINT TRACE CASE
{{JSR{TRXEQ{{{ELSE EXECUTE FULL TRACE
{{BRN{BVRT2{{{MERGE TO JUMP TO LABEL
*
*      HERE FOR PRINT TRACE -- PRINT COLON ( LABEL NAME )
*
{BVRT1{JSR{PRTSN{{{PRINT STATEMENT NUMBER
{{MOV{R10{R9{{COPY VRBLK POINTER
{{MOV{#CH$CL{R6{{COLON
{{JSR{PRTCH{{{PRINT IT
{{MOV{#CH$PP{R6{{LEFT PAREN
{{JSR{PRTCH{{{PRINT IT
{{JSR{PRTVN{{{PRINT LABEL NAME
{{MOV{#CH$RP{R6{{RIGHT PAREN
{{JSR{PRTCH{{{PRINT IT
{{JSR{PRTNL{{{TERMINATE LINE
{{MOV{4*VRLBL(R10){R9{{POINT BACK TO TRBLK
*
*      MERGE HERE TO JUMP TO LABEL
*
{BVRT2{MOV{4*TRLBL(R9){R9{{LOAD POINTER TO ACTUAL CODE
{{BRI{(R9){{{EXECUTE STATEMENT AT LABEL
{{EJC{{{{
*
*      VRBLK (CONTINUED)
*
*      ENTRY FOR VRSTO (TRAPPED CASE). THIS ROUTINE IS CALLED
*      FROM THE GENERATED CODE TO STORE THE VALUE OF A VARIABLE.
*      THIS ENTRY IS USED WHEN A VALUE TRACE OR OUTPUT
*      ASSOCIATION IS CURRENTLY ACTIVE.
*
*      (XR)                  POINTER TO VRSTO FIELD OF VRBLK
*
{B$VRV{ENT{{{{ENTRY POINT
{{MOV{(SP){R7{{LOAD VALUE (LEAVE COPY ON STACK)
{{SUB{#4*VRSTO{R9{{POINT TO VRBLK
{{MOV{R9{R10{{COPY VRBLK POINTER
{{MOV{#4*VRVAL{R6{{SET OFFSET
{{JSR{ASIGN{{{CALL ASSIGNMENT ROUTINE
{{PPM{EXFAL{{{FAIL IF ASSIGNMENT FAILS
{{BRN{EXITS{{{ELSE RETURN WITH RESULT ON STACK
{{EJC{{{{
*
*      XNBLK
*
*      THE ROUTINE FOR AN XNBLK IS NEVER EXECUTED
*
{B$XNT{ENT{BL$XN{{{ENTRY POINT (XNBLK)
{{EJC{{{{
*
*      XRBLK
*
*      THE ROUTINE FOR AN XRBLK IS NEVER EXECUTED
*
{B$XRT{ENT{BL$XR{{{ENTRY POINT (XRBLK)
*
*      MARK ENTRY ADDRESS PAST LAST BLOCK ACTION ROUTINE
*
{B$YYY{ENT{BL$$I{{{LAST BLOCK ROUTINE ENTRY POINT
{{TTL{S{{{P I T B O L -- PATTERN MATCHING ROUTINES
*
*      THE FOLLOWING SECTION CONSISTS OF THE PATTERN MATCHING
*      ROUTINES. ALL PATTERN NODES CONTAIN A POINTER (PCODE)
*      TO ONE OF THE ROUTINES IN THIS SECTION (P$XXX).
*
*      NOTE THAT THIS SECTION FOLLOWS THE B$XXX ROUTINES TO
*      ENABLE A FAST TEST FOR THE PATTERN DATATYPE.
*
{P$AAA{ENT{BL$$I{{{ENTRY TO MARK FIRST PATTERN
*
*
*      THE ENTRY CONDITIONS TO THE MATCH ROUTINE ARE AS FOLLOWS
*      (SEE O$PMN, O$PMV, O$PMS AND PROCEDURE MATCH).
*
*      STACK CONTENTS.
*
*                            NAME BASE (O$PMN ONLY)
*                            NAME OFFSET (O$PMN ONLY)
*                            TYPE (0-O$PMN, 1-O$PMV, 2-O$PMS)
*      PMHBS --------------- INITIAL CURSOR (ZERO)
*                            INITIAL NODE POINTER
*      XS ------------------ =NDABO (ANCHORED), =NDUNA (UNANCH)
*
*      REGISTER VALUES.
*
*           (XS)             SET AS SHOWN IN STACK DIAGRAM
*           (XR)             POINTER TO INITIAL PATTERN NODE
*           (WB)             INITIAL CURSOR (ZERO)
*
*      GLOBAL PATTERN VALUES
*
*           R$PMS            POINTER TO SUBJECT STRING SCBLK
*           PMSSL            LENGTH OF SUBJECT STRING IN CHARS
*           PMDFL            DOT FLAG, INITIALLY ZERO
*           PMHBS            SET AS SHOWN IN STACK DIAGRAM
*
*      CONTROL IS PASSED BY BRANCHING THROUGH THE PCODE
*      FIELD OF THE INITIAL PATTERN NODE (BRI (XR)).
{{EJC{{{{
*
*      DESCRIPTION OF ALGORITHM
*
*      A PATTERN STRUCTURE IS REPRESENTED AS A LINKED GRAPH
*      OF NODES WITH THE FOLLOWING STRUCTURE.
*
*           +------------------------------------+
*           I                PCODE               I
*           +------------------------------------+
*           I                PTHEN               I
*           +------------------------------------+
*           I                PARM1               I
*           +------------------------------------+
*           I                PARM2               I
*           +------------------------------------+
*
*      PCODE IS A POINTER TO THE ROUTINE WHICH WILL PERFORM
*      THE MATCH OF THIS PARTICULAR NODE TYPE.
*
*      PTHEN IS A POINTER TO THE SUCCESSOR NODE. I.E. THE NODE
*      TO BE MATCHED IF THE ATTEMPT TO MATCH THIS NODE SUCCEEDS.
*      IF THIS IS THE LAST NODE OF THE PATTERN PTHEN POINTS
*      TO THE DUMMY NODE NDNTH WHICH INITIATES PATTERN EXIT.
*
*      PARM1, PARM2 ARE PARAMETERS WHOSE USE VARIES WITH THE
*      PARTICULAR NODE. THEY ARE ONLY PRESENT IF REQUIRED.
*
*      ALTERNATIVES ARE HANDLED WITH THE SPECIAL ALTERNATIVE
*      NODE WHOSE PARAMETER POINTS TO THE NODE TO BE MATCHED
*      IF THERE IS A FAILURE ON THE SUCCESSOR PATH.
*
*      THE FOLLOWING EXAMPLE ILLUSTRATES THE MANNER IN WHICH
*      THE STRUCTURE IS BUILT UP. THE PATTERN IS
*
*      (A / B / C) (D / E)   WHERE / IS ALTERNATION
*
*      IN THE DIAGRAM, THE NODE MARKED + REPRESENTS AN
*      ALTERNATIVE NODE AND THE DOTTED LINE FROM A + NODE
*      REPRESENTS THE PARAMETER POINTER TO THE ALTERNATIVE.
*
*      +---+     +---+     +---+     +---+
*      I + I-----I A I-----I + I-----I D I-----
*      +---+     +---+  I  +---+     +---+
*        .              I    .
*        .              I    .
*      +---+     +---+  I  +---+
*      I + I-----I B I--I  I E I-----
*      +---+     +---+  I  +---+
*        .              I
*        .              I
*      +---+            I
*      I C I------------I
*      +---+
{{EJC{{{{
*
*      DURING THE MATCH, THE REGISTERS ARE USED AS FOLLOWS.
*
*      (XR)                  POINTS TO THE CURRENT NODE
*      (XL)                  SCRATCH
*      (XS)                  MAIN STACK POINTER
*      (WB)                  CURSOR (NUMBER OF CHARS MATCHED)
*      (WA,WC)               SCRATCH
*
*      TO KEEP TRACK OF ALTERNATIVES, THE MAIN STACK IS USED AS
*      A HISTORY STACK AND CONTAINS TWO WORD ENTRIES.
*
*      WORD 1                SAVED CURSOR VALUE
*      WORD 2                NODE TO MATCH ON FAILURE
*
*      WHEN A FAILURE OCCURS, THE MOST RECENT ENTRY ON THIS
*      STACK IS POPPED OFF TO RESTORE THE CURSOR AND POINT
*      TO THE NODE TO BE MATCHED AS AN ALTERNATIVE. THE ENTRY
*      AT THE BOTTOM OF THE STACK POINTS TO THE FOLLOWING
*      SPECIAL NODES DEPENDING ON THE SCAN MODE.
*
*      ANCHORED MODE         THE BOTTOM ENTRY POINTS TO THE
*                            SPECIAL NODE NDABO WHICH CAUSES AN
*                            ABORT. THE CURSOR VALUE STORED
*                            WITH THIS ENTRY IS ALWAYS ZERO.
*
*      UNANCHORED MODE       THE BOTTOM ENTRY POINTS TO THE
*                            SPECIAL NODE NDUNA WHICH MOVES THE
*                            ANCHOR POINT AND RESTARTS THE MATCH
*                            THE CURSOR SAVED WITH THIS ENTRY
*                            IS THE NUMBER OF CHARACTERS WHICH
*                            LIE BEFORE THE INITIAL ANCHOR POINT
*                            (I.E. THE NUMBER OF ANCHOR MOVES).
*                            THIS ENTRY IS THREE WORDS LONG AND
*                            ALSO CONTAINS THE INITIAL PATTERN.
*
*      ENTRIES ARE MADE ON THIS HISTORY STACK BY ALTERNATIVE
*      NODES AND BY SOME SPECIAL COMPOUD PATTERNS AS DESCRIBED
*      LATER ON. THE FOLLOWING GLOBAL LOCATIONS ARE USED DURING
*      PATTERN MATCHING.
*
*      R$PMS                 POINTER TO SUBJECT STRING
*      PMSSL                 LENGTH OF SUBJECT STRING
*      PMDFL                 FLAG SET NON-ZERO FOR DOT PATTERNS
*      PMHBS                 BASE PTR FOR CURRENT HISTORY STACK
*
*      THE FOLLOWING EXIT POINTS ARE AVAILABLE TO MATCH ROUTINES
*
*      SUCCP                 SUCCESS IN MATCHING CURRENT NODE
*      FAILP                 FAILURE IN MATCHING CURRENT NODE
{{EJC{{{{
*
*      COMPOUND PATTERNS
*
*      SOME PATTERNS HAVE IMPLICIT ALTERNATIVES AND THEIR
*      REPRESENTATION IN THE PATTERN STRUCTURE CONSISTS OF A
*      LINKED SET OF NODES AS INDICATED BY THESE DIAGRAMS.
*
*      AS BEFORE, THE + REPRESENTS AN ALTERNATIVE NODE AND
*      THE DOTTED LINE FROM A + NODE IS THE PARAMETER POINTER
*      TO THE ALTERNATIVE PATTERN.
*
*      ARB
*      ---
*
*           +---+            THIS NODE (P$ARB) MATCHES NULL
*           I B I-----       AND STACKS CURSOR, SUCCESSOR PTR,
*           +---+            CURSOR (COPY) AND A PTR TO NDARC.
*
*
*
*
*      BAL
*      ---
*
*           +---+            THE P$BAL NODE SCANS A BALANCED
*           I B I-----       STRING AND THEN STACKS A POINTER
*           +---+            TO ITSELF ON THE HISTORY STACK.
{{EJC{{{{
*
*      COMPOUND PATTERN STRUCTURES (CONTINUED)
*
*
*      ARBNO
*      -----
*
*           +---+            THIS ALTERNATIVE NODE MATCHES NULL
*      +----I + I-----       THE FIRST TIME AND STACKS A POINTER
*      I    +---+            TO THE ARGUMENT PATTERN X.
*      I      .
*      I      .
*      I    +---+            NODE (P$ABA) TO STACK CURSOR
*      I    I A I            AND HISTORY STACK BASE PTR.
*      I    +---+
*      I      I
*      I      I
*      I    +---+            THIS IS THE ARGUMENT PATTERN. AS
*      I    I X I            INDICATED, THE SUCCESSOR OF THE
*      I    +---+            PATTERN IS THE P$ABC NODE
*      I      I
*      I      I
*      I    +---+            THIS NODE (P$ABC) POPS PMHBS,
*      +----I C I            STACKS OLD PMHBS AND PTR TO NDABD
*           +---+            (UNLESS OPTIMISATION HAS OCCURRED)
*
*      STRUCTURE AND EXECUTION OF THIS PATTERN RESEMBLE THOSE OF
*      RECURSIVE PATTERN MATCHING AND IMMEDIATE ASSIGNMENT.
*      THE ALTERNATIVE NODE AT THE HEAD OF THE STRUCTURE MATCHES
*      NULL INITIALLY BUT ON SUBSEQUENT FAILURE ENSURES ATTEMPT
*      TO MATCH THE ARGUMENT.  BEFORE THE ARGUMENT IS MATCHED
*      P$ABA STACKS THE CURSOR,PMHBS AND A PTR TO P$ABB.  IF
*      THE ARGUMENT CANT BE MATCHED , P$ABB REMOVES THIS SPECIAL
*      STACK ENTRY AND FAILS.
*      IF ARGUMENT IS MATCHED , P$ABC RESTORES THE OUTER PMHBS
*      VALUE (SAVED BY P$ABA) .  THEN IF THE ARGUMENT HAS LEFT
*      ALTERNATIVES ON STACK IT STACKS THE INNER VALUE OF PMHBS
*      AND A PTR TO NDABD. IF ARGUMENT LEFT NOTHING ON THE STACK
*      IT OPTIMISES BY REMOVING ITEMS STACKED BY P$ABA.  FINALLY
*      A CHECK IS MADE THAT ARGUMENT MATCHED MORE THAN THE NULL
*      STRING (CHECK IS INTENDED TO PREVENT USELESS LOOPING).
*      IF SO THE SUCCESSOR IS AGAIN THE ALTERNATIVE NODE AT THE
*      HEAD OF THE STRUCTURE , ENSURING A POSSIBLE EXTRA ATTEMPT
*      TO MATCH THE ARG IF NECESSARY.  IF NOT , THE SUCCESSOR TO
*      ALTERNATIVE IS TAKEN SO AS TO TERMINATE THE LOOP.  P$ABD
*      RESTORES INNER PMHBS PTR AND FAILS , THUS TRYING TO MATCH
*      ALTERNATIVES LEFT BY THE ARBNO ARGUMENT.
{{EJC{{{{
*
*      COMPOUND PATTERN STRUCTURES (CONTINUED)
*
*      BREAKX
*      ------
*
*           +---+            THIS NODE IS A BREAK NODE FOR
*      +----I B I            THE ARGUMENT TO BREAKX, IDENTICAL
*      I    +---+            TO AN ORDINARY BREAK NODE.
*      I      I
*      I      I
*      I    +---+            THIS ALTERNATIVE NODE STACKS A
*      I    I + I-----       POINTER TO THE BREAKX NODE TO
*      I    +---+            ALLOW FOR SUBSEQUENT FAILURE
*      I      .
*      I      .
*      I    +---+            THIS IS THE BREAKX NODE ITSELF. IT
*      +----I X I            MATCHES ONE CHARACTER AND THEN
*           +---+            PROCEEDS BACK TO THE BREAK NODE.
*
*
*
*
*      FENCE
*      -----
*
*           +---+            THE FENCE NODE MATCHES NULL AND
*           I F I-----       STACKS A POINTER TO NODE NDABO TO
*           +---+            ABORT ON A SUBSEQUENT REMATCH
*
*
*
*
*      SUCCEED
*      -------
*
*           +---+            THE NODE FOR SUCCEED MATCHES NULL
*           I S I-----       AND STACKS A POINTER TO ITSELF
*           +---+            TO REPEAT THE MATCH ON A FAILURE.
{{EJC{{{{
*
*      COMPOUND PATTERNS (CONTINUED)
*
*      BINARY DOT (PATTERN ASSIGNMENT)
*      -------------------------------
*
*           +---+            THIS NODE (P$PAA) SAVES THE CURRENT
*           I A I            CURSOR AND A POINTER TO THE
*           +---+            SPECIAL NODE NDPAB ON THE STACK.
*             I
*             I
*           +---+            THIS IS THE STRUCTURE FOR THE
*           I X I            PATTERN LEFT ARGUMENT OF THE
*           +---+            PATTERN ASSIGNMENT CALL.
*             I
*             I
*           +---+            THIS NODE (P$PAC) SAVES THE CURSOR,
*           I C I-----       A PTR TO ITSELF, THE CURSOR (COPY)
*           +---+            AND A PTR TO NDPAD ON THE STACK.
*
*
*      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAB (P$PAB)
*      IS SIMPLY TO UNSTACK ITSELF AND FAIL BACK ONTO THE STACK.
*
*      THE MATCH ROUTINE FOR P$PAC ALSO SETS THE GLOBAL PATTERN
*      FLAG PMDFL NON-ZERO TO INDICATE THAT PATTERN ASSIGNMENTS
*      MAY HAVE OCCURED IN THE PATTERN MATCH
*
*      IF PMDFL IS SET AT THE END OF THE MATCH (SEE P$NTH), THE
*      HISTORY STACK IS SCANNED FOR MATCHING NDPAB-NDPAD PAIRS
*      AND THE CORRESPONDING PATTERN ASSIGNMENTS ARE EXECUTED.
*
*      THE FUNCTION OF THE MATCH ROUTINE FOR NDPAD (P$PAD)
*      IS SIMPLY TO REMOVE ITS ENTRY FROM THE STACK AND FAIL.
*      THIS INCLUDES REMOVING THE SPECIAL NODE POINTER STORED
*      IN ADDITION TO THE STANDARD TWO ENTRIES ON THE STACK.
{{EJC{{{{
*
*      COMPOUNT PATTERN STRUCTURES (CONTINUED)
*
*      FENCE (FUNCTION)
*      ----------------
*
*           +---+            THIS NODE (P$FNA) SAVES THE
*           I A I            CURRENT HISTORY STACK AND A
*           +---+            POINTER TO NDFNB ON THE STACK.
*             I
*             I
*           +---+            THIS IS THE PATTERN STRUCTURE
*           I X I            GIVEN AS THE ARGUMENT TO THE
*           +---+            FENCE FUNCTION.
*             I
*             I
*           +---+            THIS NODE P$FNC RESTORES THE OUTER
*           I C I            HISTORY STACK PTR SAVED IN P$FNA,
*           +---+            AND STACKS THE INNER STACK BASE
*                            PTR AND A POINTER TO NDFND ON THE
*                            STACK.
*
*      NDFNB (F$FNB) SIMPLY IS THE FAILURE EXIT FOR PATTERN
*      ARGUMENT FAILURE, AND IT POPS ITSELF AND FAILS ONTO THE
*      STACK.
*
*      THE MATCH ROUTINE P$FNC ALLOWS FOR AN OPTIMIZATION WHEN
*      THE FENCE PATTERN LEAVES NO ALTERNATIVES.  IN THIS CASE,
*      THE NDFNB ENTRY IS POPPED, AND THE MATCH CONTINUES.
*
*      NDFND (P$FND) IS ENTERED WHEN THE PATTERN FAILS AFTER
*      GOING THROUGH A NON-OPTIMIZED P$FNC, AND IT POPS THE
*      STACK BACK PAST THE INNTER STACK BASE CREATED BY P$FNA
{{EJC{{{{
*
*      COMPOUND PATTERNS (CONTINUED)
*
*      EXPRESSION PATTERNS (RECURSIVE PATTERN MATCHES)
*      -----------------------------------------------
*
*      INITIAL ENTRY FOR A PATTERN NODE IS TO THE ROUTINE P$EXA.
*      IF THE EVALUATED RESULT OF THE EXPRESSION IS ITSELF A
*      PATTERN, THEN THE FOLLOWING STEPS ARE TAKEN TO ARRANGE
*      FOR PROPER RECURSIVE PROCESSING.
*
*      1)   A POINTER TO THE CURRENT NODE (THE P$EXA NODE) IS
*           STORED ON THE HISTORY STACK WITH A DUMMY CURSOR.
*
*      2)   A SPECIAL HISTORY STACK ENTRY IS MADE IN WHICH THE
*           NODE POINTER POINTS TO NDEXB, AND THE CURSOR VALUE
*           IS THE SAVED VALUE OF PMHBS ON ENTRY TO THIS NODE.
*           THE MATCH ROUTINE FOR NDEXB (P$EXB) RESTORES PMHBS
*           FROM THIS CURSOR ENTRY, POPS OFF THE P$EXA NODE
*           POINTER AND FAILS.
*
*      3)   THE RESULTING HISTORY STACK POINTER IS SAVED IN
*           PMHBS TO ESTABLISH A NEW LEVEL OF HISTORY STACK.
*
*      AFTER MATCHING A PATTERN, THE END OF MATCH ROUTINE GETS
*      CONTROL (P$NTH). THIS ROUTINE PROCEEDS AS FOLLOWS.
*
*      1)   LOAD THE CURRENT VALUE OF PMHBS AND RECOGNIZE THE
*           OUTER LEVEL CASE BY THE FACT THAT THE ASSOCIATED
*           CURSOR IN THIS CASE IS THE PATTERN MATCH TYPE CODE
*           WHICH IS LESS THAN 3. TERMINATE THE MATCH IN THIS
*           CASE AND CONTINUE EXECUTION OF THE PROGRAM.
*
*      2)   OTHERWISE MAKE A SPECIAL HISTORY STACK ENTRY IN
*           WHICH THE NODE POINTER POINTS TO THE SPECIAL NODE
*           NDEXC AND THE CURSOR IS THE CURRENT VALUE OF PMHBS.
*           THE MATCH ROUTINE FOR NDEXC (P$EXC) RESETS PMHBS TO
*           THIS (INNER) VALUE AND AND THEN FAILS.
*
*      3)   USING THE HISTORY STACK ENTRY MADE ON STARTING THE
*           EXPRESSION (ACCESSIBLE WITH THE CURRENT VALUE OF
*           PMHBS), RESTORE THE P$EXA NODE POINTER AND THE OLD
*           PMHBS SETTING. TAKE THE SUCCESSOR AND CONTINUE.
*
*      AN OPTIMIZATION IS POSSIBLE IF THE EXPRESSION PATTERN
*      MAKES NO ENTRIES ON THE HISTORY STACK. IN THIS CASE,
*      INSTEAD OF BUILDING THE P$EXC NODE IN STEP 2, IT IS MORE
*      EFFICIENT TO SIMPLY POP OFF THE P$EXB ENTRY AND ITS
*      ASSOCIATED NODE POINTER. THE EFFECT IS THE SAME.
{{EJC{{{{
*
*      COMPOUND PATTERNS (CONTINUED)
*
*      BINARY DOLLAR (IMMEDIATE ASSIGNMENT)
*      ------------------------------------
*
*           +---+            THIS NODE (P$IMA) STACKS THE CURSOR
*           I A I            PMHBS AND A PTR TO NDIMB AND RESETS
*           +---+            THE STACK PTR PMHBS.
*             I
*             I
*           +---+            THIS IS THE LEFT STRUCTURE FOR THE
*           I X I            PATTERN LEFT ARGUMENT OF THE
*           +---+            IMMEDIATE ASSIGNMENT CALL.
*             I
*             I
*           +---+            THIS NODE (P$IMC) PERFORMS THE
*           I C I-----       ASSIGNMENT, POPS PMHBS AND STACKS
*           +---+            THE OLD PMHBS AND A PTR TO NDIMD.
*
*
*      THE STRUCTURE AND EXECUTION OF THIS PATTERN ARE SIMILAR
*      TO THOSE OF THE RECURSIVE EXPRESSION PATTERN MATCHING.
*
*      THE MATCH ROUTINE FOR NDIMB (P$IMB) RESTORES THE OUTER
*      LEVEL VALUE OF PMHBS, UNSTACKS THE SAVED CURSOR AND FAILS
*
*      THE MATCH ROUTINE P$IMC USES THE CURRENT VALUE OF PMHBS
*      TO LOCATE THE P$IMB ENTRY. THIS ENTRY IS USED TO MAKE
*      THE ASSIGNMENT AND RESTORE THE OUTER LEVEL VALUE OF
*      PMHBS. FINALLY, THE INNER LEVEL VALUE OF PMHBS AND A
*      POINTER TO THE SPECIAL NODE NDIMD ARE STACKED.
*
*      THE MATCH ROUTINE FOR NDIMD (P$IMD) RESTORES THE INNER
*      LEVEL VALUE OF PMHBS AND FAILS BACK INTO THE STACK.
*
*      AN OPTIMIZATION OCCURS IF THE INNER PATTERN MAKES NO
*      ENTRIES ON THE HISTORY STACK. IN THIS CASE, P$IMC POPS
*      THE P$IMB ENTRY INSTEAD OF MAKING A P$IMD ENTRY.
{{EJC{{{{
*
*      ARBNO
*
*      SEE COMPOUND PATTERNS SECTION FOR STUCTURE AND
*      ALGORITHM FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS
*
{P$ABA{ENT{BL$P0{{{P0BLK
{{MOV{R7{-(SP){{STACK CURSOR
{{MOV{R9{-(SP){{STACK DUMMY NODE PTR
{{MOV{PMHBS{-(SP){{STACK OLD STACK BASE PTR
{{MOV{#NDABB{-(SP){{STACK PTR TO NODE NDABB
{{MOV{SP{PMHBS{{STORE NEW STACK BASE PTR
{{BRN{SUCCP{{{SUCCEED
{{EJC{{{{
*
*      ARBNO (REMOVE P$ABA SPECIAL STACK ENTRY)
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$ABB{ENT{{{{ENTRY POINT
{{MOV{R7{PMHBS{{RESTORE HISTORY STACK BASE PTR
{{BRN{FLPOP{{{FAIL AND POP DUMMY NODE PTR
{{EJC{{{{
*
*      ARBNO (CHECK IF ARG MATCHED NULL STRING)
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$ABC{ENT{BL$P0{{{P0BLK
{{MOV{PMHBS{R10{{KEEP P$ABB STACK BASE
{{MOV{4*3(R10){R6{{LOAD INITIAL CURSOR
{{MOV{4*1(R10){PMHBS{{RESTORE OUTER STACK BASE PTR
{{BEQ{R10{SP{PABC1{JUMP IF NO HISTORY STACK ENTRIES
{{MOV{R10{-(SP){{ELSE SAVE INNER PMHBS ENTRY
{{MOV{#NDABD{-(SP){{STACK PTR TO SPECIAL NODE NDABD
{{BRN{PABC2{{{MERGE
*
*      OPTIMISE CASE OF NO EXTRA ENTRIES ON STACK FROM ARBNO ARG
*
{PABC1{ADD{#4*NUM04{SP{{REMOVE NDABB ENTRY AND CURSOR
*
*      MERGE TO CHECK FOR MATCHING OF NULL STRING
*
{PABC2{BNE{R6{R7{SUCCP{ALLOW FURTHER ATTEMPT IF NON-NULL
{{MOV{4*PTHEN(R9){R9{{BYPASS ALTERNATIVE NODE SO AS TO ..
{{BRN{SUCCP{{{... REFUSE FURTHER MATCH ATTEMPTS
{{EJC{{{{
*
*      ARBNO (TRY FOR ALTERNATIVES IN ARBNO ARGUMENT)
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$ABD{ENT{{{{ENTRY POINT
{{MOV{R7{PMHBS{{RESTORE INNER STACK BASE PTR
{{BRN{FAILP{{{AND FAIL
{{EJC{{{{
*
*      ABORT
*
*      NO PARAMETERS
*
{P$ABO{ENT{BL$P0{{{P0BLK
{{BRN{EXFAL{{{SIGNAL STATEMENT FAILURE
{{EJC{{{{
*
*      ALTERNATION
*
*      PARM1                 ALTERNATIVE NODE
*
{P$ALT{ENT{BL$P1{{{P1BLK
{{MOV{R7{-(SP){{STACK CURSOR
{{MOV{4*PARM1(R9){-(SP){{STACK POINTER TO ALTERNATIVE
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{BRN{SUCCP{{{IF ALL OK, THEN SUCCEED
{{EJC{{{{
*
*      ANY (ONE CHARACTER ARGUMENT) (1-CHAR STRING ALSO)
*
*      PARM1                 CHARACTER ARGUMENT
*
{P$ANS{ENT{BL$P1{{{P1BLK
{{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARS LEFT
{{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
{{LCH{R6{(R10){{LOAD CURRENT CHARACTER
{{BNE{R6{4*PARM1(R9){FAILP{FAIL IF NO MATCH
{{ICV{R7{{{ELSE BUMP CURSOR
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      ANY (MULTI-CHARACTER ARGUMENT CASE)
*
*      PARM1                 POINTER TO CTBLK
*      PARM2                 BIT MASK TO SELECT BIT IN CTBLK
*
{P$ANY{ENT{BL$P2{{{P2BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PANY1{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARACTERS LEFT
{{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{R7{{GET CHAR PTR TO CURRENT CHARACTER
{{LCH{R6{(R10){{LOAD CURRENT CHARACTER
{{MOV{4*PARM1(R9){R10{{POINT TO CTBLK
{{WTB{R6{{{CHANGE TO BYTE OFFSET
{{ADD{R6{R10{{POINT TO ENTRY IN CTBLK
{{MOV{4*CTCHS(R10){R6{{LOAD WORD FROM CTBLK
{{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
{{ZRB{R6{FAILP{{FAIL IF NO MATCH
{{ICV{R7{{{ELSE BUMP CURSOR
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      ANY (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$AYD{ENT{BL$P1{{{P1BLK
{{JSR{EVALS{{{EVALUATE STRING ARGUMENT
{{ERR{043{ANY{{EVALUATED ARGUMENT IS NOT STRING
{{PPM{FAILP{{{FAIL IF EVALUATION FAILURE
{{PPM{PANY1{{{MERGE MULTI-CHAR CASE IF OK
{{EJC{{{{
*
*      P$ARB                 INITIAL ARB MATCH
*
*      NO PARAMETERS
*
*      THE P$ARB NODE IS PART OF A COMPOUND PATTERN STRUCTURE
*      FOR AN ARB PATTERN (SEE DESCRIPTION OF COMPOUND PATTERNS)
*
{P$ARB{ENT{BL$P0{{{P0BLK
{{MOV{4*PTHEN(R9){R9{{LOAD SUCCESSOR POINTER
{{MOV{R7{-(SP){{STACK DUMMY CURSOR
{{MOV{R9{-(SP){{STACK SUCCESSOR POINTER
{{MOV{R7{-(SP){{STACK CURSOR
{{MOV{#NDARC{-(SP){{STACK PTR TO SPECIAL NODE NDARC
{{BRI{(R9){{{EXECUTE NEXT NODE MATCHING NULL
{{EJC{{{{
*
*      P$ARC                 EXTEND ARB MATCH
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$ARC{ENT{{{{ENTRY POINT
{{BEQ{R7{PMSSL{FLPOP{FAIL AND POP STACK TO SUCCESSOR
{{ICV{R7{{{ELSE BUMP CURSOR
{{MOV{R7{-(SP){{STACK UPDATED CURSOR
{{MOV{R9{-(SP){{RESTACK POINTER TO NDARC NODE
{{MOV{4*2(SP){R9{{LOAD SUCCESSOR POINTER
{{BRI{(R9){{{OFF TO REEXECUTE SUCCESSOR NODE
{{EJC{{{{
*
*      BAL
*
*      NO PARAMETERS
*
*      THE P$BAL NODE IS PART OF THE COMPOUND STRUCTURE BUILT
*      FOR BAL (SEE SECTION ON COMPOUND PATTERNS).
*
{P$BAL{ENT{BL$P0{{{P0BLK
{{ZER{R8{{{ZERO PARENTHESES LEVEL COUNTER
{{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
{{BRN{PBAL2{{{JUMP INTO SCAN LOOP
*
*      LOOP TO SCAN OUT CHARACTERS
*
{PBAL1{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER
{{ICV{R7{{{PUSH CURSOR FOR CHARACTER
{{BEQ{R6{#CH$PP{PBAL3{JUMP IF LEFT PAREN
{{BEQ{R6{#CH$RP{PBAL4{JUMP IF RIGHT PAREN
{{BZE{R8{PBAL5{{ELSE SUCCEED IF AT OUTER LEVEL
*
*      HERE AFTER PROCESSING ONE CHARACTER
*
{PBAL2{BNE{R7{PMSSL{PBAL1{LOOP BACK UNLESS END OF STRING
{{BRN{FAILP{{{IN WHICH CASE, FAIL
*
*      HERE ON LEFT PAREN
*
{PBAL3{ICV{R8{{{BUMP PAREN LEVEL
{{BRN{PBAL2{{{LOOP BACK TO CHECK END OF STRING
*
*      HERE FOR RIGHT PAREN
*
{PBAL4{BZE{R8{FAILP{{FAIL IF NO MATCHING LEFT PAREN
{{DCV{R8{{{ELSE DECREMENT LEVEL COUNTER
{{BNZ{R8{PBAL2{{LOOP BACK IF NOT AT OUTER LEVEL
*
*      HERE AFTER SUCCESSFULLY SCANNING A BALANCED STRING
*
{PBAL5{MOV{R7{-(SP){{STACK CURSOR
{{MOV{R9{-(SP){{STACK PTR TO BAL NODE FOR EXTEND
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      BREAK (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$BKD{ENT{BL$P1{{{P1BLK
{{JSR{EVALS{{{EVALUATE STRING EXPRESSION
{{ERR{044{BREAK{{EVALUATED ARGUMENT IS NOT STRING
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PBRK1{{{MERGE WITH MULTI-CHAR CASE IF OK
{{EJC{{{{
*
*      BREAK (ONE CHARACTER ARGUMENT)
*
*      PARM1                 CHARACTER ARGUMENT
*
{P$BKS{ENT{BL$P1{{{P1BLK
{{MOV{PMSSL{R8{{GET SUBJECT STRING LENGTH
{{SUB{R7{R8{{GET NUMBER OF CHARACTERS LEFT
{{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
{{LCT{R8{R8{{SET COUNTER FOR CHARS LEFT
{{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
*
*      LOOP TO SCAN TILL BREAK CHARACTER FOUND
*
{PBKS1{LCH{R6{(R10)+{{LOAD NEXT CHAR, BUMP POINTER
{{BEQ{R6{4*PARM1(R9){SUCCP{SUCCEED IF BREAK CHARACTER FOUND
{{ICV{R7{{{ELSE PUSH CURSOR
{{BCT{R8{PBKS1{{LOOP BACK IF MORE TO GO
{{BRN{FAILP{{{FAIL IF END OF STRING, NO BREAK CHR
{{EJC{{{{
*
*      BREAK (MULTI-CHARACTER ARGUMENT)
*
*      PARM1                 POINTER TO CTBLK
*      PARM2                 BIT MASK TO SELECT BIT COLUMN
*
{P$BRK{ENT{BL$P2{{{P2BLK
*
*      EXPRESSION ARGUMENT MERGES HERE
*
{PBRK1{MOV{PMSSL{R8{{LOAD SUBJECT STRING LENGTH
{{SUB{R7{R8{{GET NUMBER OF CHARACTERS LEFT
{{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
{{LCT{R8{R8{{SET COUNTER FOR CHARACTERS LEFT
{{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
{{MOV{R9{PSAVE{{SAVE NODE POINTER
*
*      LOOP TO SEARCH FOR BREAK CHARACTER
*
{PBRK2{LCH{R6{(R10)+{{LOAD NEXT CHAR, BUMP POINTER
{{MOV{4*PARM1(R9){R9{{LOAD POINTER TO CTBLK
{{WTB{R6{{{CONVERT TO BYTE OFFSET
{{ADD{R6{R9{{POINT TO CTBLK ENTRY
{{MOV{4*CTCHS(R9){R6{{LOAD CTBLK WORD
{{MOV{PSAVE{R9{{RESTORE NODE POINTER
{{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
{{NZB{R6{SUCCP{{SUCCEED IF BREAK CHARACTER FOUND
{{ICV{R7{{{ELSE PUSH CURSOR
{{BCT{R8{PBRK2{{LOOP BACK UNLESS END OF STRING
{{BRN{FAILP{{{FAIL IF END OF STRING, NO BREAK CHR
{{EJC{{{{
*
*      BREAKX (EXTENSION)
*
*      THIS IS THE ENTRY WHICH CAUSES AN EXTENSION OF A BREAKX
*      MATCH WHEN FAILURE OCCURS. SEE SECTION ON COMPOUND
*      PATTERNS FOR FULL DETAILS OF BREAKX MATCHING.
*
*      NO PARAMETERS
*
{P$BKX{ENT{BL$P0{{{P0BLK
{{ICV{R7{{{STEP CURSOR PAST PREVIOUS BREAK CHR
{{BRN{SUCCP{{{SUCCEED TO REMATCH BREAK
{{EJC{{{{
*
*      BREAKX (EXPRESSION ARGUMENT)
*
*      SEE SECTION ON COMPOUND PATTERNS FOR FULL STRUCTURE OF
*      BREAKX PATTERN. THE ACTUAL CHARACTER MATCHING USES A
*      BREAK NODE. HOWEVER, THE ENTRY FOR THE EXPRESSION
*      ARGUMENT CASE IS SEPARATED TO GET PROPER ERROR MESSAGES.
*
*      PARM1                 EXPRESSION POINTER
*
{P$BXD{ENT{BL$P1{{{P1BLK
{{JSR{EVALS{{{EVALUATE STRING ARGUMENT
{{ERR{045{BREAKX{{EVALUATED ARGUMENT IS NOT STRING
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PBRK1{{{MERGE WITH BREAK IF ALL OK
{{EJC{{{{
*
*      CURSOR ASSIGNMENT
*
*      PARM1                 NAME BASE
*      PARM2                 NAME OFFSET
*
{P$CAS{ENT{BL$P2{{{P2BLK
{{MOV{R9{-(SP){{SAVE NODE POINTER
{{MOV{R7{-(SP){{SAVE CURSOR
{{MOV{4*PARM1(R9){R10{{LOAD NAME BASE
{{MTI{R7{{{LOAD CURSOR AS INTEGER
{{MOV{4*PARM2(R9){R7{{LOAD NAME OFFSET
{{JSR{ICBLD{{{GET ICBLK FOR CURSOR VALUE
{{MOV{R7{R6{{MOVE NAME OFFSET
{{MOV{R9{R7{{MOVE VALUE TO ASSIGN
{{JSR{ASINP{{{PERFORM ASSIGNMENT
{{PPM{FLPOP{{{FAIL ON ASSIGNMENT FAILURE
{{MOV{(SP)+{R7{{ELSE RESTORE CURSOR
{{MOV{(SP)+{R9{{RESTORE NODE POINTER
{{BRN{SUCCP{{{AND SUCCEED MATCHING NULL
{{EJC{{{{
*
*      EXPRESSION NODE (P$EXA, INITIAL ENTRY)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR HANDLING EXPRESSION NODES.
*
*      PARM1                 EXPRESSION POINTER
*
{P$EXA{ENT{BL$P1{{{P1BLK
{{JSR{EVALP{{{EVALUATE EXPRESSION
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{BLO{R6{#P$AAA{PEXA1{JUMP IF RESULT IS NOT A PATTERN
*
*      HERE IF RESULT OF EXPRESSION IS A PATTERN
*
{{MOV{R7{-(SP){{STACK DUMMY CURSOR
{{MOV{R9{-(SP){{STACK PTR TO P$EXA NODE
{{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE PTR
{{MOV{#NDEXB{-(SP){{STACK PTR TO SPECIAL NODE NDEXB
{{MOV{SP{PMHBS{{STORE NEW STACK BASE POINTER
{{MOV{R10{R9{{COPY NODE POINTER
{{BRI{(R9){{{MATCH FIRST NODE IN EXPRESSION PAT
*
*      HERE IF RESULT OF EXPRESSION IS NOT A PATTERN
*
{PEXA1{BEQ{R6{#B$SCL{PEXA2{JUMP IF IT IS ALREADY A STRING
{{MOV{R10{-(SP){{ELSE STACK RESULT
{{MOV{R9{R10{{SAVE NODE POINTER
{{JSR{GTSTG{{{CONVERT RESULT TO STRING
{{ERR{046{EXPRESSION{{DOES NOT EVALUATE TO PATTERN
{{MOV{R9{R8{{COPY STRING POINTER
{{MOV{R10{R9{{RESTORE NODE POINTER
{{MOV{R8{R10{{COPY STRING POINTER AGAIN
*
*      MERGE HERE WITH STRING POINTER IN XL
*
{PEXA2{BZE{4*SCLEN(R10){SUCCP{{JUST SUCCEED IF NULL STRING
{{BRN{PSTR1{{{ELSE MERGE WITH STRING CIRCUIT
{{EJC{{{{
*
*      EXPRESSION NODE (P$EXB, REMOVE NDEXB ENTRY)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR HANDLING EXPRESSION NODES.
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$EXB{ENT{{{{ENTRY POINT
{{MOV{R7{PMHBS{{RESTORE OUTER LEVEL STACK POINTER
{{BRN{FLPOP{{{FAIL AND POP P$EXA NODE PTR
{{EJC{{{{
*
*      EXPRESSION NODE (P$EXC, REMOVE NDEXC ENTRY)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR HANDLING EXPRESSION NODES.
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$EXC{ENT{{{{ENTRY POINT
{{MOV{R7{PMHBS{{RESTORE INNER STACK BASE POINTER
{{BRN{FAILP{{{AND FAIL INTO EXPR PATTERN ALTERNVS
{{EJC{{{{
*
*      FAIL
*
*      NO PARAMETERS
*
{P$FAL{ENT{BL$P0{{{P0BLK
{{BRN{FAILP{{{JUST SIGNAL FAILURE
{{EJC{{{{
*
*      FENCE
*
*      SEE COMPOUND PATTERNS SECTION FOR THE STRUCTURE AND
*      ALGORITHM FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS
*
{P$FEN{ENT{BL$P0{{{P0BLK
{{MOV{R7{-(SP){{STACK DUMMY CURSOR
{{MOV{#NDABO{-(SP){{STACK PTR TO ABORT NODE
{{BRN{SUCCP{{{AND SUCCEED MATCHING NULL
{{EJC{{{{
*
*      FENCE (FUNCTION)
*
*      SEE COMPOUND PATTERNS COMMENTS AT START OF THIS SECTION
*      FOR DETAILS OF SCHEME
*
*      NO PARAMETERS
*
{P$FNA{ENT{BL$P0{{{P0BLK
{{MOV{PMHBS{-(SP){{STACK CURRENT HISTORY STACK BASE
{{MOV{#NDFNB{-(SP){{STACK INDIR PTR TO P$FNB (FAILURE)
{{MOV{SP{PMHBS{{BEGIN NEW HISTORY STACK
{{BRN{SUCCP{{{SUCCEED
{{EJC{{{{
*
*      FENCE (FUNCTION) (RESET HISTORY STACK AND FAIL)
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$FNB{ENT{BL$P0{{{P0BLK
{{MOV{R7{PMHBS{{RESTORE OUTER PMHBS STACK BASE
{{BRN{FAILP{{{...AND FAIL
{{EJC{{{{
*
*      FENCE (FUNCTION) (MAKE FENCE TRAP ENTRY ON STACK)
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$FNC{ENT{BL$P0{{{P0BLK
{{MOV{PMHBS{R10{{GET INNER STACK BASE PTR
{{MOV{4*NUM01(R10){PMHBS{{RESTORE OUTER STACK BASE
{{BEQ{R10{SP{PFNC1{OPTIMIZE IF NO ALTERNATIVES
{{MOV{R10{-(SP){{ELSE STACK INNER STACK BASE
{{MOV{#NDFND{-(SP){{STACK PTR TO NDFND
{{BRN{SUCCP{{{SUCCEED
*
*      HERE WHEN FENCE FUNCTION LEFT NOTHING ON THE STACK
*
{PFNC1{ADD{#4*NUM02{SP{{POP OFF P$FNB ENTRY
{{BRN{SUCCP{{{SUCCEED
{{EJC{{{{
*
*      FENCE (FUNCTION) (SKIP PAST ALTERNATIVES ON FAILURE)
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$FND{ENT{BL$P0{{{P0BLK
{{MOV{R7{SP{{POP STACK TO FENCE() HISTORY BASE
{{BRN{FLPOP{{{POP BASE ENTRY AND FAIL
{{EJC{{{{
*
*      IMMEDIATE ASSIGNMENT (INITIAL ENTRY, SAVE CURRENT CURSOR)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
*      STRUCTURE AND ALGORITHM FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS
*
{P$IMA{ENT{BL$P0{{{P0BLK
{{MOV{R7{-(SP){{STACK CURSOR
{{MOV{R9{-(SP){{STACK DUMMY NODE POINTER
{{MOV{PMHBS{-(SP){{STACK OLD STACK BASE POINTER
{{MOV{#NDIMB{-(SP){{STACK PTR TO SPECIAL NODE NDIMB
{{MOV{SP{PMHBS{{STORE NEW STACK BASE POINTER
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      IMMEDIATE ASSIGNMENT (REMOVE CURSOR MARK ENTRY)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
*      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$IMB{ENT{{{{ENTRY POINT
{{MOV{R7{PMHBS{{RESTORE HISTORY STACK BASE PTR
{{BRN{FLPOP{{{FAIL AND POP DUMMY NODE PTR
{{EJC{{{{
*
*      IMMEDIATE ASSIGNMENT (PERFORM ACTUAL ASSIGNMENT)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
*      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      PARM1                 NAME BASE OF VARIABLE
*      PARM2                 NAME OFFSET OF VARIABLE
*
{P$IMC{ENT{BL$P2{{{P2BLK
{{MOV{PMHBS{R10{{LOAD POINTER TO P$IMB ENTRY
{{MOV{R7{R6{{COPY FINAL CURSOR
{{MOV{4*3(R10){R7{{LOAD INITIAL CURSOR
{{MOV{4*1(R10){PMHBS{{RESTORE OUTER STACK BASE POINTER
{{BEQ{R10{SP{PIMC1{JUMP IF NO HISTORY STACK ENTRIES
{{MOV{R10{-(SP){{ELSE SAVE INNER PMHBS POINTER
{{MOV{#NDIMD{-(SP){{AND A PTR TO SPECIAL NODE NDIMD
{{BRN{PIMC2{{{MERGE
*
*      HERE IF NO ENTRIES MADE ON HISTORY STACK
*
{PIMC1{ADD{#4*NUM04{SP{{REMOVE NDIMB ENTRY AND CURSOR
*
*      MERGE HERE TO PERFORM ASSIGNMENT
*
{PIMC2{MOV{R6{-(SP){{SAVE CURRENT (FINAL) CURSOR
{{MOV{R9{-(SP){{SAVE CURRENT NODE POINTER
{{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
{{SUB{R7{R6{{COMPUTE SUBSTRING LENGTH
{{JSR{SBSTR{{{BUILD SUBSTRING
{{MOV{R9{R7{{MOVE RESULT
{{MOV{(SP){R9{{RELOAD NODE POINTER
{{MOV{4*PARM1(R9){R10{{LOAD NAME BASE
{{MOV{4*PARM2(R9){R6{{LOAD NAME OFFSET
{{JSR{ASINP{{{PERFORM ASSIGNMENT
{{PPM{FLPOP{{{FAIL IF ASSIGNMENT FAILS
{{MOV{(SP)+{R9{{ELSE RESTORE NODE POINTER
{{MOV{(SP)+{R7{{RESTORE CURSOR
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      IMMEDIATE ASSIGNMENT (REMOVE NDIMD ENTRY ON FAILURE)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR DETAILS OF THE
*      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$IMD{ENT{{{{ENTRY POINT
{{MOV{R7{PMHBS{{RESTORE INNER STACK BASE POINTER
{{BRN{FAILP{{{AND FAIL
{{EJC{{{{
*
*      LEN (INTEGER ARGUMENT)
*
*      PARM1                 INTEGER ARGUMENT
*
{P$LEN{ENT{BL$P1{{{P1BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PLEN1{ADD{4*PARM1(R9){R7{{PUSH CURSOR INDICATED AMOUNT
{{BLE{R7{PMSSL{SUCCP{SUCCEED IF NOT OFF END
{{BRN{FAILP{{{ELSE FAIL
{{EJC{{{{
*
*      LEN (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$LND{ENT{BL$P1{{{P1BLK
{{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
{{ERR{047{LEN{{EVALUATED ARGUMENT IS NOT INTEGER
{{ERR{048{LEN{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PLEN1{{{MERGE WITH NORMAL CIRCUIT IF OK
{{EJC{{{{
*
*      NOTANY (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$NAD{ENT{BL$P1{{{P1BLK
{{JSR{EVALS{{{EVALUATE STRING ARGUMENT
{{ERR{049{NOTANY{{EVALUATED ARGUMENT IS NOT STRING
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PNAY1{{{MERGE WITH MULTI-CHAR CASE IF OK
{{EJC{{{{
*
*      NOTANY (ONE CHARACTER ARGUMENT)
*
*      PARM1                 CHARACTER ARGUMENT
*
{P$NAS{ENT{BL$P1{{{ENTRY POINT
{{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARS LEFT
{{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER IN STRIN
{{LCH{R6{(R10){{LOAD CURRENT CHARACTER
{{BEQ{R6{4*PARM1(R9){FAILP{FAIL IF MATCH
{{ICV{R7{{{ELSE BUMP CURSOR
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      NOTANY (MULTI-CHARACTER STRING ARGUMENT)
*
*      PARM1                 POINTER TO CTBLK
*      PARM2                 BIT MASK TO SELECT BIT COLUMN
*
{P$NAY{ENT{BL$P2{{{P2BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PNAY1{BEQ{R7{PMSSL{FAILP{FAIL IF NO CHARACTERS LEFT
{{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
{{LCH{R6{(R10){{LOAD CURRENT CHARACTER
{{WTB{R6{{{CONVERT TO BYTE OFFSET
{{MOV{4*PARM1(R9){R10{{LOAD POINTER TO CTBLK
{{ADD{R6{R10{{POINT TO ENTRY IN CTBLK
{{MOV{4*CTCHS(R10){R6{{LOAD ENTRY FROM CTBLK
{{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
{{NZB{R6{FAILP{{FAIL IF CHARACTER IS MATCHED
{{ICV{R7{{{ELSE BUMP CURSOR
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      END OF PATTERN MATCH
*
*      THIS ROUTINE IS ENTERED ON SUCCESSFUL COMPLETION.
*      SEE DESCRIPTION OF EXPRESSION PATTERNS IN COMPOUND
*      PATTERN SECTION FOR HANDLING OF RECURSION IN MATCHING.
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$NTH{ENT{{{{ENTRY POINT
{{MOV{PMHBS{R10{{LOAD POINTER TO BASE OF STACK
{{MOV{4*1(R10){R6{{LOAD SAVED PMHBS (OR PATTERN TYPE)
{{BLE{R6{#NUM02{PNTH2{JUMP IF OUTER LEVEL (PATTERN TYPE)
*
*      HERE WE ARE AT THE END OF MATCHING AN EXPRESSION PATTERN
*
{{MOV{R6{PMHBS{{RESTORE OUTER STACK BASE POINTER
{{MOV{4*2(R10){R9{{RESTORE POINTER TO P$EXA NODE
{{BEQ{R10{SP{PNTH1{JUMP IF NO HISTORY STACK ENTRIES
{{MOV{R10{-(SP){{ELSE STACK INNER STACK BASE PTR
{{MOV{#NDEXC{-(SP){{STACK PTR TO SPECIAL NODE NDEXC
{{BRN{SUCCP{{{AND SUCCEED
*
*      HERE IF NO HISTORY STACK ENTRIES DURING PATTERN
*
{PNTH1{ADD{#4*NUM04{SP{{REMOVE P$EXB ENTRY AND NODE PTR
{{BRN{SUCCP{{{AND SUCCEED
*
*      HERE IF END OF MATCH AT OUTER LEVEL
*
{PNTH2{MOV{R7{PMSSL{{SAVE FINAL CURSOR IN SAFE PLACE
{{BZE{PMDFL{PNTH6{{JUMP IF NO PATTERN ASSIGNMENTS
{{EJC{{{{
*
*      END OF PATTERN MATCH (CONTINUED)
*
*      NOW WE MUST PERFORM PATTERN ASSIGNMENTS. THIS IS DONE BY
*      SCANNING THE HISTORY STACK FOR MATCHING NDPAB-NDPAD PAIRS
*
{PNTH3{DCA{R10{{{POINT PAST CURSOR ENTRY
{{MOV{-(R10){R6{{LOAD NODE POINTER
{{BEQ{R6{#NDPAD{PNTH4{JUMP IF NDPAD ENTRY
{{BNE{R6{#NDPAB{PNTH5{JUMP IF NOT NDPAB ENTRY
*
*      HERE FOR NDPAB ENTRY, STACK INITIAL CURSOR
*      NOTE THAT THERE MUST BE MORE ENTRIES ON THE STACK.
*
{{MOV{4*1(R10){-(SP){{STACK INITIAL CURSOR
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{BRN{PNTH3{{{LOOP BACK IF OK
*
*      HERE FOR NDPAD ENTRY. THE STARTING CURSOR FROM THE
*      MATCHING NDPAD ENTRY IS NOW THE TOP STACK ENTRY.
*
{PNTH4{MOV{4*1(R10){R6{{LOAD FINAL CURSOR
{{MOV{(SP){R7{{LOAD INITIAL CURSOR FROM STACK
{{MOV{R10{(SP){{SAVE HISTORY STACK SCAN PTR
{{SUB{R7{R6{{COMPUTE LENGTH OF STRING
*
*      BUILD SUBSTRING AND PERFORM ASSIGNMENT
*
{{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
{{JSR{SBSTR{{{CONSTRUCT SUBSTRING
{{MOV{R9{R7{{COPY SUBSTRING POINTER
{{MOV{(SP){R10{{RELOAD HISTORY STACK SCAN PTR
{{MOV{4*2(R10){R10{{LOAD POINTER TO P$PAC NODE WITH NAM
{{MOV{4*PARM2(R10){R6{{LOAD NAME OFFSET
{{MOV{4*PARM1(R10){R10{{LOAD NAME BASE
{{JSR{ASINP{{{PERFORM ASSIGNMENT
{{PPM{EXFAL{{{MATCH FAILS IF NAME EVAL FAILS
{{MOV{(SP)+{R10{{ELSE RESTORE HISTORY STACK PTR
{{EJC{{{{
*
*      END OF PATTERN MATCH (CONTINUED)
*
*      HERE CHECK FOR END OF ENTRIES
*
{PNTH5{BNE{R10{SP{PNTH3{LOOP IF MORE ENTRIES TO SCAN
*
*      HERE AFTER DEALING WITH PATTERN ASSIGNMENTS
*
{PNTH6{MOV{PMHBS{SP{{WIPE OUT HISTORY STACK
{{MOV{(SP)+{R7{{LOAD INITIAL CURSOR
{{MOV{(SP)+{R8{{LOAD MATCH TYPE CODE
{{MOV{PMSSL{R6{{LOAD FINAL CURSOR VALUE
{{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
{{ZER{R$PMS{{{CLEAR SUBJECT STRING PTR FOR GBCOL
{{BZE{R8{PNTH7{{JUMP IF CALL BY NAME
{{BEQ{R8{#NUM02{EXITS{EXIT IF STATEMENT LEVEL CALL
*
*      HERE WE HAVE A CALL BY VALUE, BUILD SUBSTRING
*
{{SUB{R7{R6{{COMPUTE LENGTH OF STRING
{{JSR{SBSTR{{{BUILD SUBSTRING
{{BRN{EXIXR{{{AND EXIT WITH SUBSTRING VALUE
*
*      HERE FOR CALL BY NAME, MAKE STACK ENTRIES FOR O$RPL
*
{PNTH7{MOV{R7{-(SP){{STACK INITIAL CURSOR
{{MOV{R6{-(SP){{STACK FINAL CURSOR
{{BZE{R$PMB{PNTH8{{SKIP IF SUBJECT NOT BUFFER
{{MOV{R$PMB{R10{{ELSE GET PTR TO BCBLK INSTEAD
*
*      HERE WITH XL POINTING TO SCBLK OR BCBLK
*
{PNTH8{MOV{R10{-(SP){{STACK SUBJECT POINTER
{{BRN{EXITS{{{EXIT WITH SPECIAL ENTRY ON STACK
{{EJC{{{{
*
*      POS (INTEGER ARGUMENT)
*
*      PARM1                 INTEGER ARGUMENT
*
{P$POS{ENT{BL$P1{{{P1BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PPOS1{BEQ{R7{4*PARM1(R9){SUCCP{SUCCEED IF AT RIGHT LOCATION
{{BRN{FAILP{{{ELSE FAIL
{{EJC{{{{
*
*      POS (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$PSD{ENT{BL$P1{{{P1BLK
{{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
{{ERR{050{POS{{EVALUATED ARGUMENT IS NOT INTEGER
{{ERR{051{POS{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PPOS1{{{MERGE WITH NORMAL CASE IF OK
{{EJC{{{{
*
*      PATTERN ASSIGNMENT (INITIAL ENTRY, SAVE CURSOR)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS
*
{P$PAA{ENT{BL$P0{{{P0BLK
{{MOV{R7{-(SP){{STACK INITIAL CURSOR
{{MOV{#NDPAB{-(SP){{STACK PTR TO NDPAB SPECIAL NODE
{{BRN{SUCCP{{{AND SUCCEED MATCHING NULL
{{EJC{{{{
*
*      PATTERN ASSIGNMENT (REMOVE SAVED CURSOR)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS (DUMMY PATTERN)
*
{P$PAB{ENT{{{{ENTRY POINT
{{BRN{FAILP{{{JUST FAIL (ENTRY IS ALREADY POPPED)
{{EJC{{{{
*
*      PATTERN ASSIGNMENT (END OF MATCH, MAKE ASSIGN ENTRY)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      PARM1                 NAME BASE OF VARIABLE
*      PARM2                 NAME OFFSET OF VARIABLE
*
{P$PAC{ENT{BL$P2{{{P2BLK
{{MOV{R7{-(SP){{STACK DUMMY CURSOR VALUE
{{MOV{R9{-(SP){{STACK POINTER TO P$PAC NODE
{{MOV{R7{-(SP){{STACK FINAL CURSOR
{{MOV{#NDPAD{-(SP){{STACK PTR TO SPECIAL NDPAD NODE
{{MNZ{PMDFL{{{SET DOT FLAG NON-ZERO
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      PATTERN ASSIGNMENT (REMOVE ASSIGN ENTRY)
*
*      SEE COMPOUND PATTERNS DESCRIPTION FOR THE STRUCTURE AND
*      ALGORITHMS FOR MATCHING THIS NODE TYPE.
*
*      NO PARAMETERS (DUMMY NODE)
*
{P$PAD{ENT{{{{ENTRY POINT
{{BRN{FLPOP{{{FAIL AND REMOVE P$PAC NODE
{{EJC{{{{
*
*      REM
*
*      NO PARAMETERS
*
{P$REM{ENT{BL$P0{{{P0BLK
{{MOV{PMSSL{R7{{POINT CURSOR TO END OF STRING
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      RPOS (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$RPD{ENT{BL$P1{{{P1BLK
{{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
{{ERR{052{RPOS{{EVALUATED ARGUMENT IS NOT INTEGER
{{ERR{053{RPOS{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PRPS1{{{MERGE WITH NORMAL CASE IF OK
{{EJC{{{{
*
*      RPOS (INTEGER ARGUMENT)
*
*      PARM1                 INTEGER ARGUMENT
*
{P$RPS{ENT{BL$P1{{{P1BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PRPS1{MOV{PMSSL{R8{{GET LENGTH OF STRING
{{SUB{R7{R8{{GET NUMBER OF CHARACTERS REMAINING
{{BEQ{R8{4*PARM1(R9){SUCCP{SUCCEED IF AT RIGHT LOCATION
{{BRN{FAILP{{{ELSE FAIL
{{EJC{{{{
*
*      RTAB (INTEGER ARGUMENT)
*
*      PARM1                 INTEGER ARGUMENT
*
{P$RTB{ENT{BL$P1{{{P1BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PRTB1{MOV{R7{R8{{SAVE INITIAL CURSOR
{{MOV{PMSSL{R7{{POINT TO END OF STRING
{{BLT{R7{4*PARM1(R9){FAILP{FAIL IF STRING NOT LONG ENOUGH
{{SUB{4*PARM1(R9){R7{{ELSE SET NEW CURSOR
{{BGE{R7{R8{SUCCP{AND SUCCEED IF NOT TOO FAR ALREADY
{{BRN{FAILP{{{IN WHICH CASE, FAIL
{{EJC{{{{
*
*      RTAB (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$RTD{ENT{BL$P1{{{P1BLK
{{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
{{ERR{054{RTAB{{EVALUATED ARGUMENT IS NOT INTEGER
{{ERR{055{RTAB{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PRTB1{{{MERGE WITH NORMAL CASE IF SUCCESS
{{EJC{{{{
*
*      SPAN (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$SPD{ENT{BL$P1{{{P1BLK
{{JSR{EVALS{{{EVALUATE STRING ARGUMENT
{{ERR{056{SPAN{{EVALUATED ARGUMENT IS NOT STRING
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PSPN1{{{MERGE WITH MULTI-CHAR CASE IF OK
{{EJC{{{{
*
*      SPAN (MULTI-CHARACTER ARGUMENT CASE)
*
*      PARM1                 POINTER TO CTBLK
*      PARM2                 BIT MASK TO SELECT BIT COLUMN
*
{P$SPN{ENT{BL$P2{{{P2BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PSPN1{MOV{PMSSL{R8{{COPY SUBJECT STRING LENGTH
{{SUB{R7{R8{{CALCULATE NUMBER OF CHARACTERS LEFT
{{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
{{MOV{R$PMS{R10{{POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
{{MOV{R7{PSAVC{{SAVE INITIAL CURSOR
{{MOV{R9{PSAVE{{SAVE NODE POINTER
{{LCT{R8{R8{{SET COUNTER FOR CHARS LEFT
*
*      LOOP TO SCAN MATCHING CHARACTERS
*
{PSPN2{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER
{{WTB{R6{{{CONVERT TO BYTE OFFSET
{{MOV{4*PARM1(R9){R9{{POINT TO CTBLK
{{ADD{R6{R9{{POINT TO CTBLK ENTRY
{{MOV{4*CTCHS(R9){R6{{LOAD CTBLK ENTRY
{{MOV{PSAVE{R9{{RESTORE NODE POINTER
{{ANB{4*PARM2(R9){R6{{AND WITH SELECTED BIT
{{ZRB{R6{PSPN3{{JUMP IF NO MATCH
{{ICV{R7{{{ELSE PUSH CURSOR
{{BCT{R8{PSPN2{{LOOP BACK UNLESS END OF STRING
*
*      HERE AFTER SCANNING MATCHING CHARACTERS
*
{PSPN3{BNE{R7{PSAVC{SUCCP{SUCCEED IF CHARS MATCHED
{{BRN{FAILP{{{ELSE FAIL IF NULL STRING MATCHED
{{EJC{{{{
*
*      SPAN (ONE CHARACTER ARGUMENT)
*
*      PARM1                 CHARACTER ARGUMENT
*
{P$SPS{ENT{BL$P1{{{P1BLK
{{MOV{PMSSL{R8{{GET SUBJECT STRING LENGTH
{{SUB{R7{R8{{CALCULATE NUMBER OF CHARACTERS LEFT
{{BZE{R8{FAILP{{FAIL IF NO CHARACTERS LEFT
{{MOV{R$PMS{R10{{ELSE POINT TO SUBJECT STRING
{{PLC{R10{R7{{POINT TO CURRENT CHARACTER
{{MOV{R7{PSAVC{{SAVE INITIAL CURSOR
{{LCT{R8{R8{{SET COUNTER FOR CHARACTERS LEFT
*
*      LOOP TO SCAN MATCHING CHARACTERS
*
{PSPS1{LCH{R6{(R10)+{{LOAD NEXT CHARACTER, BUMP POINTER
{{BNE{R6{4*PARM1(R9){PSPS2{JUMP IF NO MATCH
{{ICV{R7{{{ELSE PUSH CURSOR
{{BCT{R8{PSPS1{{AND LOOP UNLESS END OF STRING
*
*      HERE AFTER SCANNING MATCHING CHARACTERS
*
{PSPS2{BNE{R7{PSAVC{SUCCP{SUCCEED IF CHARS MATCHED
{{BRN{FAILP{{{FAIL IF NULL STRING MATCHED
{{EJC{{{{
*
*      MULTI-CHARACTER STRING
*
*      NOTE THAT ONE CHARACTER STRINGS USE THE CIRCUIT FOR
*      ONE CHARACTER ANY ARGUMENTS (P$AN1).
*
*      PARM1                 POINTER TO SCBLK FOR STRING ARG
*
{P$STR{ENT{BL$P1{{{P1BLK
{{MOV{4*PARM1(R9){R10{{GET POINTER TO STRING
*
*      MERGE HERE AFTER EVALUATING EXPRESSION WITH STRING VALUE
*
{PSTR1{MOV{R9{PSAVE{{SAVE NODE POINTER
{{MOV{R$PMS{R9{{LOAD SUBJECT STRING POINTER
{{PLC{R9{R7{{POINT TO CURRENT CHARACTER
{{ADD{4*SCLEN(R10){R7{{COMPUTE NEW CURSOR POSITION
{{BGT{R7{PMSSL{FAILP{FAIL IF PAST END OF STRING
{{MOV{R7{PSAVC{{SAVE UPDATED CURSOR
{{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARS TO COMPARE
{{PLC{R10{{{POINT TO CHARS OF TEST STRING
{{CMC{FAILP{FAILP{{COMPARE, FAIL IF NOT EQUAL
{{MOV{PSAVE{R9{{IF ALL MATCHED, RESTORE NODE PTR
{{MOV{PSAVC{R7{{RESTORE UPDATED CURSOR
{{BRN{SUCCP{{{AND SUCCEED
{{EJC{{{{
*
*      SUCCEED
*
*      SEE SECTION ON COMPOUND PATTERNS FOR DETAILS OF THE
*      STRUCTURE AND ALGORITHMS FOR MATCHING THIS NODE TYPE
*
*      NO PARAMETERS
*
{P$SUC{ENT{BL$P0{{{P0BLK
{{MOV{R7{-(SP){{STACK CURSOR
{{MOV{R9{-(SP){{STACK POINTER TO THIS NODE
{{BRN{SUCCP{{{SUCCEED MATCHING NULL
{{EJC{{{{
*
*      TAB (INTEGER ARGUMENT)
*
*      PARM1                 INTEGER ARGUMENT
*
{P$TAB{ENT{BL$P1{{{P1BLK
*
*      EXPRESSION ARGUMENT CASE MERGES HERE
*
{PTAB1{BGT{R7{4*PARM1(R9){FAILP{FAIL IF TOO FAR ALREADY
{{MOV{4*PARM1(R9){R7{{ELSE SET NEW CURSOR POSITION
{{BLE{R7{PMSSL{SUCCP{SUCCEED IF NOT OFF END
{{BRN{FAILP{{{ELSE FAIL
{{EJC{{{{
*
*      TAB (EXPRESSION ARGUMENT)
*
*      PARM1                 EXPRESSION POINTER
*
{P$TBD{ENT{BL$P1{{{P1BLK
{{JSR{EVALI{{{EVALUATE INTEGER ARGUMENT
{{ERR{057{TAB{{EVALUATED ARGUMENT IS NOT INTEGER
{{ERR{058{TAB{{EVALUATED ARGUMENT IS NEGATIVE OR TOO LARGE
{{PPM{FAILP{{{FAIL IF EVALUATION FAILS
{{PPM{PTAB1{{{MERGE WITH NORMAL CASE IF OK
{{EJC{{{{
*
*      ANCHOR MOVEMENT
*
*      NO PARAMETERS (DUMMY NODE)
*
{P$UNA{ENT{{{{ENTRY POINT
{{MOV{R7{R9{{COPY INITIAL PATTERN NODE POINTER
{{MOV{(SP){R7{{GET INITIAL CURSOR
{{BEQ{R7{PMSSL{EXFAL{MATCH FAILS IF AT END OF STRING
{{ICV{R7{{{ELSE INCREMENT CURSOR
{{MOV{R7{(SP){{STORE INCREMENTED CURSOR
{{MOV{R9{-(SP){{RESTACK INITIAL NODE PTR
{{MOV{#NDUNA{-(SP){{RESTACK UNANCHORED NODE
{{BRI{(R9){{{REMATCH FIRST NODE
{{EJC{{{{
*
*      END OF PATTERN MATCH ROUTINES
*
*      THE FOLLOWING ENTRY POINT MARKS THE END OF THE PATTERN
*      MATCHING ROUTINES AND ALSO THE END OF THE ENTRY POINTS
*      REFERENCED FROM THE FIRST WORD OF BLOCKS IN DYNAMIC STORE
*
{P$YYY{ENT{BL$$I{{{MARK LAST ENTRY IN PATTERN SECTION
{{TTL{S{{{P I T B O L -- PREDEFINED SNOBOL4 FUNCTIONS
*
*      THE FOLLOWING SECTION CONTAINS CODING FOR FUNCTIONS
*      WHICH ARE PREDEFINED AND AVAILABLE AT THE SNOBOL LEVEL.
*
*      THESE ROUTINES RECEIVE CONTROL DIRECTLY FROM THE CODE OR
*      INDIRECTLY THROUGH THE O$FNC, O$FNS OR CFUNC ROUTINES.
*      IN BOTH CASES THE CONDITIONS ON ENTRY ARE AS FOLLOWS
*
*      THE ARGUMENTS ARE ON THE STACK. THE NUMBER OF ARGUMENTS
*      HAS BEEN ADJUSTED TO CORRESPOND TO THE SVBLK SVNAR FIELD.
*
*      IN CERTAIN FUNCTIONS THE DIRECT CALL IS NOT PERMITTED
*      AND IN THESE INSTANCES WE ALSO HAVE.
*
*      (WA)                  ACTUAL NUMBER OF ARGUMENTS IN CALL
*
*      CONTROL RETURNS BY PLACING THE FUNCTION RESULT VALUE ON
*      ON THE STACK AND CONTINUING EXECUTION WITH THE NEXT
*      WORD FROM THE GENERATED CODE.
*
*      THE NAMES OF THE ENTRY POINTS OF THESE FUNCTIONS ARE OF
*      THE FORM S$XXX WHERE XXX IS THE THREE LETTER CODE FOR
*      THE SYSTEM VARIABLE NAME. THE FUNCTIONS ARE IN ORDER
*      ALPHABETICALLY BY THEIR ENTRY NAMES.
{{EJC{{{{
*
*      ANY
*
{S$ANY{ENT{{{{ENTRY POINT
{{MOV{#P$ANS{R7{{SET PCODE FOR SINGLE CHAR CASE
{{MOV{#P$ANY{R10{{PCODE FOR MULTI-CHAR CASE
{{MOV{#P$AYD{R8{{PCODE FOR EXPRESSION CASE
{{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{059{ANY{{ARGUMENT IS NOT STRING OR EXPRESSION
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      APPEND
*
{S$APN{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R10{{GET APPEND ARGUMENT
{{MOV{(SP)+{R9{{GET BCBLK
{{BEQ{(R9){#B$BCT{SAPN1{OK IF FIRST ARG IS BCBLK
{{ERB{275{APPEND{{FIRST ARGUMENT IS NOT BUFFER
*
*      HERE TO DO THE APPEND
*
{SAPN1{JSR{APNDB{{{DO THE APPEND
{{ERR{276{APPEND{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXFAL{{{NO ROOM - FAIL
{{BRN{EXNUL{{{EXIT WITH NULL RESULT
{{EJC{{{{
*
*      APPLY
*
*      APPLY DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
*      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
*
{S$APP{ENT{{{{ENTRY POINT
{{BZE{R6{SAPP3{{JUMP IF NO ARGUMENTS
{{DCV{R6{{{ELSE GET APPLIED FUNC ARG COUNT
{{MOV{R6{R7{{COPY
{{WTB{R7{{{CONVERT TO BYTES
{{MOV{SP{R10{{COPY STACK POINTER
{{ADD{R7{R10{{POINT TO FUNCTION ARGUMENT ON STACK
{{MOV{(R10){R9{{LOAD FUNCTION PTR (APPLY 1ST ARG)
{{BZE{R6{SAPP2{{JUMP IF NO ARGS FOR APPLIED FUNC
{{LCT{R7{R6{{ELSE SET COUNTER FOR LOOP
*
*      LOOP TO MOVE ARGUMENTS UP ON STACK
*
{SAPP1{DCA{R10{{{POINT TO NEXT ARGUMENT
{{MOV{(R10){4*1(R10){{MOVE ARGUMENT UP
{{BCT{R7{SAPP1{{LOOP TILL ALL MOVED
*
*      MERGE HERE TO CALL FUNCTION (WA = NUMBER OF ARGUMENTS)
*
{SAPP2{ICA{SP{{{ADJUST STACK PTR FOR APPLY 1ST ARG
{{JSR{GTNVR{{{GET VARIABLE BLOCK ADDR FOR FUNC
{{PPM{SAPP3{{{JUMP IF NOT NATURAL VARIABLE
{{MOV{4*VRFNC(R9){R10{{ELSE POINT TO FUNCTION BLOCK
{{BRN{CFUNC{{{GO CALL APPLIED FUNCTION
*
*      HERE FOR INVALID FIRST ARGUMENT
*
{SAPP3{ERB{060{APPLY{{FIRST ARG IS NOT NATURAL VARIABLE NAME
{{EJC{{{{
*
*      ARBNO
*
*      ARBNO BUILDS A COMPOUND PATTERN. SEE DESCRIPTION AT
*      START OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
*
{S$ABN{ENT{{{{ENTRY POINT
{{ZER{R9{{{SET PARM1 = 0 FOR THE MOMENT
{{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATIVE NODE
{{JSR{PBILD{{{BUILD ALTERNATIVE NODE
{{MOV{R9{R10{{SAVE PTR TO ALTERNATIVE PATTERN
{{MOV{#P$ABC{R7{{PCODE FOR P$ABC
{{ZER{R9{{{P0BLK
{{JSR{PBILD{{{BUILD P$ABC NODE
{{MOV{R10{4*PTHEN(R9){{PUT ALTERNATIVE NODE AS SUCCESSOR
{{MOV{R10{R6{{REMEMBER ALTERNATIVE NODE POINTER
{{MOV{R9{R10{{COPY P$ABC NODE PTR
{{MOV{(SP){R9{{LOAD ARBNO ARGUMENT
{{MOV{R6{(SP){{STACK ALTERNATIVE NODE POINTER
{{JSR{GTPAT{{{GET ARBNO ARGUMENT AS PATTERN
{{ERR{061{ARBNO{{ARGUMENT IS NOT PATTERN
{{JSR{PCONC{{{CONCAT ARG WITH P$ABC NODE
{{MOV{R9{R10{{REMEMBER PTR TO CONCD PATTERNS
{{MOV{#P$ABA{R7{{PCODE FOR P$ABA
{{ZER{R9{{{P0BLK
{{JSR{PBILD{{{BUILD P$ABA NODE
{{MOV{R10{4*PTHEN(R9){{CONCATENATE NODES
{{MOV{(SP){R10{{RECALL PTR TO ALTERNATIVE NODE
{{MOV{R9{4*PARM1(R10){{POINT ALTERNATIVE BACK TO ARGUMENT
{{BRN{EXITS{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      ARG
*
{S$ARG{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{GET SECOND ARG AS SMALL INTEGER
{{ERR{062{ARG{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{EXFAL{{{FAIL IF OUT OF RANGE OR NEGATIVE
{{MOV{R9{R6{{SAVE ARGUMENT NUMBER
{{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
{{JSR{GTNVR{{{LOCATE VRBLK
{{PPM{SARG1{{{JUMP IF NOT NATURAL VARIABLE
{{MOV{4*VRFNC(R9){R9{{ELSE LOAD FUNCTION BLOCK POINTER
{{BNE{(R9){#B$PFC{SARG1{JUMP IF NOT PROGRAM DEFINED
{{BZE{R6{EXFAL{{FAIL IF ARG NUMBER IS ZERO
{{BGT{R6{4*FARGS(R9){EXFAL{FAIL IF ARG NUMBER IS TOO LARGE
{{WTB{R6{{{ELSE CONVERT TO BYTE OFFSET
{{ADD{R6{R9{{POINT TO ARGUMENT SELECTED
{{MOV{4*PFAGB(R9){R9{{LOAD ARGUMENT VRBLK POINTER
{{BRN{EXVNM{{{EXIT TO BUILD NMBLK
*
*      HERE IF 1ST ARGUMENT IS BAD
*
{SARG1{ERB{063{ARG{{FIRST ARGUMENT IS NOT PROGRAM FUNCTION NAME
{{EJC{{{{
*
*      ARRAY
*
{S$ARR{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R10{{LOAD INITIAL ELEMENT VALUE
{{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
{{JSR{GTINT{{{CONVERT FIRST ARG TO INTEGER
{{PPM{SAR02{{{JUMP IF NOT INTEGER
*
*      HERE FOR INTEGER FIRST ARGUMENT, BUILD VCBLK
*
{{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
{{ILE{SAR10{{{JUMP IF ZERO OR NEG (BAD DIMENSION)
{{MFI{R6{SAR11{{ELSE CONVERT TO ONE WORD, TEST OVFL
{{LCT{R7{R6{{COPY ELEMENTS FOR LOOP LATER ON
{{ADD{#VCSI${R6{{ADD SPACE FOR STANDARD FIELDS
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{BGE{R6{MXLEN{SAR11{FAIL IF TOO LARGE
{{JSR{ALLOC{{{ALLOCATE SPACE FOR VCBLK
{{MOV{#B$VCT{(R9){{STORE TYPE WORD
{{MOV{R6{4*VCLEN(R9){{SET LENGTH
{{MOV{R10{R8{{COPY DEFAULT VALUE
{{MOV{R9{R10{{COPY VCBLK POINTER
{{ADD{#4*VCVLS{R10{{POINT TO FIRST ELEMENT VALUE
*
*      LOOP TO SET VECTOR ELEMENTS TO DEFAULT VALUE
*
{SAR01{MOV{R8{(R10)+{{STORE ONE VALUE
{{BCT{R7{SAR01{{LOOP TILL ALL STORED
{{BRN{EXSID{{{EXIT SETTING IDVAL
{{EJC{{{{
*
*      ARRAY (CONTINUED)
*
*      HERE IF FIRST ARGUMENT IS NOT AN INTEGER
*
{SAR02{MOV{R9{-(SP){{REPLACE ARGUMENT ON STACK
{{JSR{XSCNI{{{INITIALIZE SCAN OF FIRST ARGUMENT
{{ERR{064{ARRAY{{FIRST ARGUMENT IS NOT INTEGER OR STRING
{{PPM{EXNUL{{{DUMMY (UNUSED) NULL STRING EXIT
{{MOV{R$XSC{-(SP){{SAVE PROTOTYPE POINTER
{{MOV{R10{-(SP){{SAVE DEFAULT VALUE
{{ZER{ARCDM{{{ZERO COUNT OF DIMENSIONS
{{ZER{ARPTR{{{ZERO OFFSET TO INDICATE PASS ONE
{{LDI{INTV1{{{LOAD INTEGER ONE
{{STI{ARNEL{{{INITIALIZE ELEMENT COUNT
*
*      THE FOLLOWING CODE IS EXECUTED TWICE. THE FIRST TIME
*      (ARPTR EQ 0), IT IS USED TO COUNT THE NUMBER OF ELEMENTS
*      AND NUMBER OF DIMENSIONS. THE SECOND TIME (ARPTR GT 0) IS
*      USED TO ACTUALLY FILL IN THE DIM,LBD FIELDS OF THE ARBLK.
*
{SAR03{LDI{INTV1{{{LOAD ONE AS DEFAULT LOW BOUND
{{STI{ARSVL{{{SAVE AS LOW BOUND
{{MOV{#CH$CL{R8{{SET DELIMITER ONE = COLON
{{MOV{#CH$CM{R10{{SET DELIMITER TWO = COMMA
{{JSR{XSCAN{{{SCAN NEXT BOUND
{{BNE{R6{#NUM01{SAR04{JUMP IF NOT COLON
*
*      HERE WE HAVE A COLON ENDING A LOW BOUND
*
{{JSR{GTINT{{{CONVERT LOW BOUND
{{ERR{065{ARRAY{{FIRST ARGUMENT LOWER BOUND IS NOT INTEGER
{{LDI{4*ICVAL(R9){{{LOAD VALUE OF LOW BOUND
{{STI{ARSVL{{{STORE LOW BOUND VALUE
{{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA
{{MOV{R8{R10{{AND DELIMITER TWO = COMMA
{{JSR{XSCAN{{{SCAN HIGH BOUND
{{EJC{{{{
*
*      ARRAY (CONTINUED)
*
*      MERGE HERE TO PROCESS UPPER BOUND
*
{SAR04{JSR{GTINT{{{CONVERT HIGH BOUND TO INTEGER
{{ERR{066{ARRAY{{FIRST ARGUMENT UPPER BOUND IS NOT INTEGER
{{LDI{4*ICVAL(R9){{{GET HIGH BOUND
{{SBI{ARSVL{{{SUBTRACT LOWER BOUND
{{IOV{SAR10{{{BAD DIMENSION IF OVERFLOW
{{ILT{SAR10{{{BAD DIMENSION IF NEGATIVE
{{ADI{INTV1{{{ADD 1 TO GET DIMENSION
{{IOV{SAR10{{{BAD DIMENSION IF OVERFLOW
{{MOV{ARPTR{R10{{LOAD OFFSET (ALSO PASS INDICATOR)
{{BZE{R10{SAR05{{JUMP IF FIRST PASS
*
*      HERE IN SECOND PASS TO STORE LBD AND DIM IN ARBLK
*
{{ADD{(SP){R10{{POINT TO CURRENT LOCATION IN ARBLK
{{STI{4*CFP$I(R10){{{STORE DIMENSION
{{LDI{ARSVL{{{LOAD LOW BOUND
{{STI{(R10){{{STORE LOW BOUND
{{ADD{#4*ARDMS{ARPTR{{BUMP OFFSET TO NEXT BOUNDS
{{BRN{SAR06{{{JUMP TO CHECK FOR END OF BOUNDS
*
*      HERE IN PASS 1
*
{SAR05{ICV{ARCDM{{{BUMP DIMENSION COUNT
{{MLI{ARNEL{{{MULTIPLY DIMENSION BY COUNT SO FAR
{{IOV{SAR11{{{TOO LARGE IF OVERFLOW
{{STI{ARNEL{{{ELSE STORE UPDATED ELEMENT COUNT
*
*      MERGE HERE AFTER PROCESSING ONE SET OF BOUNDS
*
{SAR06{BNZ{R6{SAR03{{LOOP BACK UNLESS END OF BOUNDS
{{BNZ{ARPTR{SAR09{{JUMP IF END OF PASS 2
{{EJC{{{{
*
*      ARRAY (CONTINUED)
*
*      HERE AT END OF PASS ONE, BUILD ARBLK
*
{{LDI{ARNEL{{{GET NUMBER OF ELEMENTS
{{MFI{R7{SAR11{{GET AS ADDR INTEGER, TEST OVFLO
{{WTB{R7{{{ELSE CONVERT TO LENGTH IN BYTES
{{MOV{#4*ARSI${R6{{SET SIZE OF STANDARD FIELDS
{{LCT{R8{ARCDM{{SET DIMENSION COUNT TO CONTROL LOOP
*
*      LOOP TO ALLOW SPACE FOR DIMENSIONS
*
{SAR07{ADD{#4*ARDMS{R6{{ALLOW SPACE FOR ONE SET OF BOUNDS
{{BCT{R8{SAR07{{LOOP BACK TILL ALL ACCOUNTED FOR
{{MOV{R6{R10{{SAVE SIZE (=AROFS)
*
*      NOW ALLOCATE SPACE FOR ARBLK
*
{{ADD{R7{R6{{ADD SPACE FOR ELEMENTS
{{ICA{R6{{{ALLOW FOR ARPRO PROTOTYPE FIELD
{{BGE{R6{MXLEN{SAR11{FAIL IF TOO LARGE
{{JSR{ALLOC{{{ELSE ALLOCATE ARBLK
{{MOV{(SP){R7{{LOAD DEFAULT VALUE
{{MOV{R9{(SP){{SAVE ARBLK POINTER
{{MOV{R6{R8{{SAVE LENGTH IN BYTES
{{BTW{R6{{{CONVERT LENGTH BACK TO WORDS
{{LCT{R6{R6{{SET COUNTER TO CONTROL LOOP
*
*      LOOP TO CLEAR ENTIRE ARBLK TO DEFAULT VALUE
*
{SAR08{MOV{R7{(R9)+{{SET ONE WORD
{{BCT{R6{SAR08{{LOOP TILL ALL SET
{{EJC{{{{
*
*      ARRAY (CONTINUED)
*
*      NOW SET INITIAL FIELDS OF ARBLK
*
{{MOV{(SP)+{R9{{RELOAD ARBLK POINTER
{{MOV{(SP){R7{{LOAD PROTOTYPE
{{MOV{#B$ART{(R9){{SET TYPE WORD
{{MOV{R8{4*ARLEN(R9){{STORE LENGTH IN BYTES
{{ZER{4*IDVAL(R9){{{ZERO ID TILL WE GET IT BUILT
{{MOV{R10{4*AROFS(R9){{SET PROTOTYPE FIELD PTR
{{MOV{ARCDM{4*ARNDM(R9){{SET NUMBER OF DIMENSIONS
{{MOV{R9{R8{{SAVE ARBLK POINTER
{{ADD{R10{R9{{POINT TO PROTOTYPE FIELD
{{MOV{R7{(R9){{STORE PROTOTYPE PTR IN ARBLK
{{MOV{#4*ARLBD{ARPTR{{SET OFFSET FOR PASS 2 BOUNDS SCAN
{{MOV{R7{R$XSC{{RESET STRING POINTER FOR XSCAN
{{MOV{R8{(SP){{STORE ARBLK POINTER ON STACK
{{ZER{XSOFS{{{RESET OFFSET PTR TO START OF STRING
{{BRN{SAR03{{{JUMP BACK TO RESCAN BOUNDS
*
*      HERE AFTER FILLING IN BOUNDS INFORMATION (END PASS TWO)
*
{SAR09{MOV{(SP)+{R9{{RELOAD POINTER TO ARBLK
{{BRN{EXSID{{{EXIT SETTING IDVAL
*
*      HERE FOR BAD DIMENSION
*
{SAR10{ERB{067{ARRAY{{DIMENSION IS ZERO,NEGATIVE OR OUT OF RANGE
*
*      HERE IF ARRAY IS TOO LARGE
*
{SAR11{ERB{068{ARRAY{{SIZE EXCEEDS MAXIMUM PERMITTED
{{EJC{{{{
*
*      BUFFER
*
{S$BUF{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R10{{GET INITIAL VALUE
{{MOV{(SP)+{R9{{GET REQUESTED ALLOCATION
{{JSR{GTINT{{{CONVERT TO INTEGER
{{ERR{269{BUFFER{{FIRST ARGUMENT IS NOT INTEGER
{{LDI{4*ICVAL(R9){{{GET VALUE
{{ILE{SBF01{{{BRANCH IF NEGATIVE OR ZERO
{{MFI{R6{SBF02{{MOVE WITH OVERFLOW CHECK
{{JSR{ALOBF{{{ALLOCATE THE BUFFER
{{JSR{APNDB{{{COPY IT IN
{{ERR{270{BUFFER{{SECOND ARGUMENT IS NOT STRING OR BUFFER
{{ERR{271{BUFFER{{INITIAL VALUE TOO BIG FOR ALLOCATION
{{BRN{EXSID{{{EXIT SETTING IDVAL
*
*      HERE FOR INVALID ALLOCATION SIZE
*
{SBF01{ERB{272{BUFFER{{FIRST ARGUMENT IS NOT POSITIVE
*
*      HERE FOR ALLOCATION SIZE INTEGER OVERFLOW
*
{SBF02{ERB{273{BUFFER{{SIZE IS TOO BIG
{{EJC{{{{
*
*      BREAK
*
{S$BRK{ENT{{{{ENTRY POINT
{{MOV{#P$BKS{R7{{SET PCODE FOR SINGLE CHAR CASE
{{MOV{#P$BRK{R10{{PCODE FOR MULTI-CHAR CASE
{{MOV{#P$BKD{R8{{PCODE FOR EXPRESSION CASE
{{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{069{BREAK{{ARGUMENT IS NOT STRING OR EXPRESSION
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      BREAKX
*
*      BREAKX IS A COMPOUND PATTERN. SEE DESCRIPTION AT START
*      OF PATTERN MATCHING SECTION FOR STRUCTURE FORMED.
*
{S$BKX{ENT{{{{ENTRY POINT
{{MOV{#P$BKS{R7{{PCODE FOR SINGLE CHAR ARGUMENT
{{MOV{#P$BRK{R10{{PCODE FOR MULTI-CHAR ARGUMENT
{{MOV{#P$BXD{R8{{PCODE FOR EXPRESSION CASE
{{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{070{BREAKX{{ARGUMENT IS NOT STRING OR EXPRESSION
*
*      NOW HOOK BREAKX NODE ON AT FRONT END
*
{{MOV{R9{-(SP){{SAVE PTR TO BREAK NODE
{{MOV{#P$BKX{R7{{SET PCODE FOR BREAKX NODE
{{JSR{PBILD{{{BUILD IT
{{MOV{(SP){4*PTHEN(R9){{SET BREAK NODE AS SUCCESSOR
{{MOV{#P$ALT{R7{{SET PCODE FOR ALTERNATION NODE
{{JSR{PBILD{{{BUILD (PARM1=ALT=BREAKX NODE)
{{MOV{R9{R6{{SAVE PTR TO ALTERNATION NODE
{{MOV{(SP){R9{{POINT TO BREAK NODE
{{MOV{R6{4*PTHEN(R9){{SET ALTERNATE NODE AS SUCCESSOR
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
{{EJC{{{{
*
*      CHAR
*
{S$CHR{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{CONVERT ARG TO INTEGER
{{ERR{281{CHAR{{ARGUMENT NOT INTEGER
{{PPM{SCHR1{{{TOO BIG ERROR EXIT
{{BGE{R8{#CFP$A{SCHR1{SEE IF OUT OF RANGE OF HOST SET
{{MOV{#NUM01{R6{{IF NOT SET SCBLK ALLOCATION
{{MOV{R8{R7{{SAVE CHAR CODE
{{JSR{ALOCS{{{ALLOCATE 1 BAU SCBLK
{{MOV{R9{R10{{COPY SCBLK POINTER
{{PSC{R10{{{GET SET TO STUFF CHAR
{{SCH{R7{(R10)+{{STUFF IT
{{ZER{R10{{{CLEAR SLOP IN XL
{{BRN{EXIXR{{{EXIT WITH SCBLK POINTER
*
*      HERE IF CHAR ARGUMENT IS OUT OF RANGE
*
{SCHR1{ERB{282{CHAR{{ARGUMENT NOT IN RANGE
{{EJC{{{{
*
*      CLEAR
*
{S$CLR{ENT{{{{ENTRY POINT
{{JSR{XSCNI{{{INITIALIZE TO SCAN ARGUMENT
{{ERR{071{CLEAR{{ARGUMENT IS NOT STRING
{{PPM{SCLR2{{{JUMP IF NULL
*
*      LOOP TO SCAN OUT NAMES IN FIRST ARGUMENT. VARIABLES IN
*      THE LIST ARE FALGGED BY SETTING VRGET OF VRBLK TO ZERO.
*
{SCLR1{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA
{{MOV{R8{R10{{DELIMITER TWO = COMMA
{{JSR{XSCAN{{{SCAN NEXT VARIABLE NAME
{{JSR{GTNVR{{{LOCATE VRBLK
{{ERR{072{CLEAR{{ARGUMENT HAS NULL VARIABLE NAME
{{ZER{4*VRGET(R9){{{ELSE FLAG BY ZEROING VRGET FIELD
{{BNZ{R6{SCLR1{{LOOP BACK IF STOPPED BY COMMA
*
*      HERE AFTER FLAGGING VARIABLES IN ARGUMENT LIST
*
{SCLR2{MOV{HSHTB{R7{{POINT TO START OF HASH TABLE
*
*      LOOP THROUGH SLOTS IN HASH TABLE
*
{SCLR3{BEQ{R7{HSHTE{EXNUL{EXIT RETURNING NULL IF NONE LEFT
{{MOV{R7{R9{{ELSE COPY SLOT POINTER
{{ICA{R7{{{BUMP SLOT POINTER
{{SUB{#4*VRNXT{R9{{SET OFFSET TO MERGE INTO LOOP
*
*      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
*
{SCLR4{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON CHAIN
{{BZE{R9{SCLR3{{JUMP FOR NEXT BUCKET IF CHAIN END
{{BNZ{4*VRGET(R9){SCLR5{{JUMP IF NOT FLAGGED
{{EJC{{{{
*
*      CLEAR (CONTINUED)
*
*      HERE FOR FLAGGED VARIABLE, DO NOT SET VALUE TO NULL
*
{{JSR{SETVR{{{FOR FLAGGED VAR, RESTORE VRGET
{{BRN{SCLR4{{{AND LOOP BACK FOR NEXT VRBLK
*
*      HERE TO SET VALUE OF A VARIABLE TO NULL
*      PRROTECTED VARIABLES (ARB, ETC) ARE EXEMPT
*
{SCLR5{BEQ{4*VRSTO(R9){#B$VRE{SCLR4{CHECK FOR PROTECTED VARIABLE (REG05)
{{MOV{R9{R10{{COPY VRBLK POINTER (REG05)
*
*      LOOP TO LOCATE VALUE AT END OF POSSIBLE TRBLK CHAIN
*
{SCLR6{MOV{R10{R6{{SAVE BLOCK POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD NEXT VALUE FIELD
{{BEQ{(R10){#B$TRT{SCLR6{LOOP BACK IF TRAPPED
*
*      NOW STORE THE NULL VALUE
*
{{MOV{R6{R10{{RESTORE BLOCK POINTER
{{MOV{#NULLS{4*VRVAL(R10){{STORE NULL CONSTANT VALUE
{{BRN{SCLR4{{{LOOP BACK FOR NEXT VRBLK
{{EJC{{{{
*
*      CODE
*
{S$COD{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{GTCOD{{{CONVERT TO CODE
{{PPM{EXFAL{{{FAIL IF CONVERSION IS IMPOSSIBLE
{{BRN{EXIXR{{{ELSE RETURN CODE AS RESULT
{{EJC{{{{
*
*      COLLECT
*
{S$COL{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{GTINT{{{CONVERT TO INTEGER
{{ERR{073{COLLECT{{ARGUMENT IS NOT INTEGER
{{LDI{4*ICVAL(R9){{{LOAD COLLECT ARGUMENT
{{STI{CLSVI{{{SAVE COLLECT ARGUMENT
{{ZER{R7{{{SET NO MOVE UP
{{JSR{GBCOL{{{PERFORM GARBAGE COLLECTION
{{MOV{DNAME{R6{{POINT TO END OF MEMORY
{{SUB{DNAMP{R6{{SUBTRACT NEXT LOCATION
{{BTW{R6{{{CONVERT BYTES TO WORDS
{{MTI{R6{{{CONVERT WORDS AVAILABLE AS INTEGER
{{SBI{CLSVI{{{SUBTRACT ARGUMENT
{{IOV{EXFAL{{{FAIL IF OVERFLOW
{{ILT{EXFAL{{{FAIL IF NOT ENOUGH
{{ADI{CLSVI{{{ELSE RECOMPUTE AVAILABLE
{{BRN{EXINT{{{AND EXIT WITH INTEGER RESULT
{{EJC{{{{
*
*      CONVERT
*
{S$CNV{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{CONVERT SECOND ARGUMENT TO STRING
{{ERR{074{CONVERT{{SECOND ARGUMENT IS NOT STRING
{{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE
{{MOV{(SP){R10{{LOAD FIRST ARGUMENT
{{BNE{(R10){#B$PDT{SCV01{JUMP IF NOT PROGRAM DEFINED
*
*      HERE FOR PROGRAM DEFINED DATATYPE
*
{{MOV{4*PDDFP(R10){R10{{POINT TO DFBLK
{{MOV{4*DFNAM(R10){R10{{LOAD DATATYPE NAME
{{JSR{IDENT{{{COMPARE WITH SECOND ARG
{{PPM{EXITS{{{EXIT IF IDENT WITH ARG AS RESULT
{{BRN{EXFAL{{{ELSE FAIL
*
*      HERE IF NOT PROGRAM DEFINED DATATYPE
*
{SCV01{MOV{R9{-(SP){{SAVE STRING ARGUMENT
{{MOV{#SVCTB{R10{{POINT TO TABLE OF NAMES TO COMPARE
{{ZER{R7{{{INITIALIZE COUNTER
{{MOV{R6{R8{{SAVE LENGTH OF ARGUMENT STRING
*
*      LOOP THROUGH TABLE ENTRIES
*
{SCV02{MOV{(R10)+{R9{{LOAD NEXT TABLE ENTRY, BUMP POINTER
{{BZE{R9{EXFAL{{FAIL IF ZERO MARKING END OF LIST
{{BNE{R8{4*SCLEN(R9){SCV05{JUMP IF WRONG LENGTH
{{MOV{R10{CNVTP{{ELSE STORE TABLE POINTER
{{PLC{R9{{{POINT TO CHARS OF TABLE ENTRY
{{MOV{(SP){R10{{LOAD POINTER TO STRING ARGUMENT
{{PLC{R10{{{POINT TO CHARS OF STRING ARG
{{MOV{R8{R6{{SET NUMBER OF CHARS TO COMPARE
{{CMC{SCV04{SCV04{{COMPARE, JUMP IF NO MATCH
{{EJC{{{{
*
*      CONVERT (CONTINUED)
*
*      HERE WE HAVE A MATCH
*
{SCV03{MOV{R7{R10{{COPY ENTRY NUMBER
{{ICA{SP{{{POP STRING ARG OFF STACK
{{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
{{BSW{R10{CNVTT{{JUMP TO APPROPRIATE ROUTINE
{{IFF{0{SCV06{{STRING
{{IFF{1{SCV07{{INTEGER
{{IFF{2{SCV09{{NAME
{{IFF{3{SCV10{{PATTERN
{{IFF{4{SCV11{{ARRAY
{{IFF{5{SCV19{{TABLE
{{IFF{6{SCV25{{EXPRESSION
{{IFF{7{SCV26{{CODE
{{IFF{8{SCV27{{NUMERIC
{{IFF{CNVRT{SCV08{{REAL
{{IFF{CNVBT{SCV28{{BUFFER
{{ESW{{{{END OF SWITCH TABLE
*
*      HERE IF NO MATCH WITH TABLE ENTRY
*
{SCV04{MOV{CNVTP{R10{{RESTORE TABLE POINTER, MERGE
*
*      MERGE HERE IF LENGTHS DID NOT MATCH
*
{SCV05{ICV{R7{{{BUMP ENTRY NUMBER
{{BRN{SCV02{{{LOOP BACK TO CHECK NEXT ENTRY
*
*      HERE TO CONVERT TO STRING
*
{SCV06{MOV{R9{-(SP){{REPLACE STRING ARGUMENT ON STACK
{{JSR{GTSTG{{{CONVERT TO STRING
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{BRN{EXIXR{{{ELSE RETURN STRING
{{EJC{{{{
*
*      CONVERT (CONTINUED)
*
*      HERE TO CONVERT TO INTEGER
*
{SCV07{JSR{GTINT{{{CONVERT TO INTEGER
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{BRN{EXIXR{{{ELSE RETURN INTEGER
*
*      HERE TO CONVERT TO REAL
*
{SCV08{JSR{GTREA{{{CONVERT TO REAL
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{BRN{EXIXR{{{ELSE RETURN REAL
*
*      HERE TO CONVERT TO NAME
*
{SCV09{BEQ{(R9){#B$NML{EXIXR{RETURN IF ALREADY A NAME
{{JSR{GTNVR{{{ELSE TRY STRING TO NAME CONVERT
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{BRN{EXVNM{{{ELSE EXIT BUILDING NMBLK FOR VRBLK
*
*      HERE TO CONVERT TO PATTERN
*
{SCV10{JSR{GTPAT{{{CONVERT TO PATTERN
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{BRN{EXIXR{{{ELSE RETURN PATTERN
*
*      CONVERT TO ARRAY
*
{SCV11{JSR{GTARR{{{GET AN ARRAY
{{PPM{EXFAL{{{FAIL IF NOT CONVERTIBLE
{{BRN{EXSID{{{EXIT SETTING ID FIELD
*
*      CONVERT TO TABLE
*
{SCV19{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
{{MOV{R9{-(SP){{REPLACE ARBLK POINTER ON STACK
{{BEQ{R6{#B$TBT{EXITS{RETURN ARG IF ALREADY A TABLE
{{BNE{R6{#B$ART{EXFAL{ELSE FAIL IF NOT AN ARRAY
{{EJC{{{{
*
*      CONVERT (CONTINUED)
*
*      HERE TO CONVERT AN ARRAY TO TABLE
*
{{BNE{4*ARNDM(R9){#NUM02{EXFAL{FAIL IF NOT 2-DIM ARRAY
{{LDI{4*ARDM2(R9){{{LOAD DIM 2
{{SBI{INTV2{{{SUBTRACT 2 TO COMPARE
{{INE{EXFAL{{{FAIL IF DIM2 NOT 2
*
*      HERE WE HAVE AN ARBLK OF THE RIGHT SHAPE
*
{{LDI{4*ARDIM(R9){{{LOAD DIM 1 (NUMBER OF ELEMENTS)
{{MFI{R6{{{GET AS ONE WORD INTEGER
{{LCT{R7{R6{{COPY TO CONTROL LOOP
{{ADD{#TBSI${R6{{ADD SPACE FOR STANDARD FIELDS
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{JSR{ALLOC{{{ALLOCATE SPACE FOR TBBLK
{{MOV{R9{R8{{COPY TBBLK POINTER
{{MOV{R9{-(SP){{SAVE TBBLK POINTER
{{MOV{#B$TBT{(R9)+{{STORE TYPE WORD
{{ZER{(R9)+{{{STORE ZERO FOR IDVAL FOR NOW
{{MOV{R6{(R9)+{{STORE LENGTH
{{MOV{#NULLS{(R9)+{{NULL INITIAL LOOKUP VALUE
*
*      LOOP TO INITIALIZE BUCKET PTRS TO POINT TO TABLE
*
{SCV20{MOV{R8{(R9)+{{SET BUCKET PTR TO POINT TO TBBLK
{{BCT{R7{SCV20{{LOOP TILL ALL INITIALIZED
{{MOV{#4*ARVL2{R7{{SET OFFSET TO FIRST ARBLK ELEMENT
*
*      LOOP TO COPY ELEMENTS FROM ARRAY TO TABLE
*
{SCV21{MOV{4*1(SP){R10{{POINT TO ARBLK
{{BEQ{R7{4*ARLEN(R10){SCV24{JUMP IF ALL MOVED
{{ADD{R7{R10{{ELSE POINT TO CURRENT LOCATION
{{ADD{#4*NUM02{R7{{BUMP OFFSET
{{MOV{(R10){R9{{LOAD SUBSCRIPT NAME
{{DCA{R10{{{ADJUST PTR TO MERGE (TRVAL=1+1)
{{EJC{{{{
*
*      CONVERT (CONTINUED)
*
*      LOOP TO CHASE DOWN TRBLK CHAIN FOR VALUE
*
{SCV22{MOV{4*TRVAL(R10){R10{{POINT TO NEXT VALUE
{{BEQ{(R10){#B$TRT{SCV22{LOOP BACK IF TRAPPED
*
*      HERE WITH NAME IN XR, VALUE IN XL
*
{SCV23{MOV{R10{-(SP){{STACK VALUE
{{MOV{4*1(SP){R10{{LOAD TBBLK POINTER
{{JSR{TFIND{{{BUILD TEBLK (NOTE WB GT 0 BY NAME)
{{PPM{EXFAL{{{FAIL IF ACESS FAILS
{{MOV{(SP)+{4*TEVAL(R10){{STORE VALUE IN TEBLK
{{BRN{SCV21{{{LOOP BACK FOR NEXT ELEMENT
*
*      HERE AFTER MOVING ALL ELEMENTS TO TBBLK
*
{SCV24{MOV{(SP)+{R9{{LOAD TBBLK POINTER
{{ICA{SP{{{POP ARBLK POINTER
{{BRN{EXSID{{{EXIT SETTING IDVAL
*
*      CONVERT TO EXPRESSION
*
{SCV25{JSR{GTEXP{{{CONVERT TO EXPRESSION
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{BRN{EXIXR{{{ELSE RETURN EXPRESSION
*
*      CONVERT TO CODE
*
{SCV26{JSR{GTCOD{{{CONVERT TO CODE
{{PPM{EXFAL{{{FAIL IF CONVERSION IS NOT POSSIBLE
{{BRN{EXIXR{{{ELSE RETURN CODE
*
*      CONVERT TO NUMERIC
*
{SCV27{JSR{GTNUM{{{CONVERT TO NUMERIC
{{PPM{EXFAL{{{FAIL IF UNCONVERTIBLE
{{BRN{EXIXR{{{RETURN NUMBER
{{EJC{{{{
*
*      CONVERT TO BUFFER
*
{SCV28{MOV{R9{-(SP){{STACK STRING FOR PROCEDURE
{{JSR{GTSTG{{{CONVERT TO STRING
{{PPM{EXFAL{{{FAIL IF CONVERSION NOT POSSIBLE
{{MOV{R9{R10{{SAVE STRING POINTER
{{JSR{ALOBF{{{ALLOCATE BUFFER OF SAME SIZE
{{JSR{APNDB{{{COPY IN THE STRING
{{PPM{{{{ALREADY STRING - CANT FAIL TO CNV
{{PPM{{{{MUST BE ENOUGH ROOM
{{BRN{EXSID{{{EXIT SETTING IDVAL FIELD
{{EJC{{{{
*
*      COPY
*
{S$COP{ENT{{{{ENTRY POINT
{{JSR{COPYB{{{COPY THE BLOCK
{{PPM{EXITS{{{RETURN IF NO IDVAL FIELD
{{BRN{EXSID{{{EXIT SETTING ID VALUE
{{EJC{{{{
*
*      DATA
*
{S$DAT{ENT{{{{ENTRY POINT
{{JSR{XSCNI{{{PREPARE TO SCAN ARGUMENT
{{ERR{075{DATA{{ARGUMENT IS NOT STRING
{{ERR{076{DATA{{ARGUMENT IS NULL
*
*      SCAN OUT DATATYPE NAME
*
{{MOV{#CH$PP{R8{{DELIMITER ONE = LEFT PAREN
{{MOV{R8{R10{{DELIMITER TWO = LEFT PAREN
{{JSR{XSCAN{{{SCAN DATATYPE NAME
{{BNZ{R6{SDAT1{{SKIP IF LEFT PAREN FOUND
{{ERB{077{DATA{{ARGUMENT IS MISSING A LEFT PAREN
*
*      HERE AFTER SCANNING DATATYPE NAME
*
{SDAT1{MOV{4*SCLEN(R9){R6{{GET LENGTH
{{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE
{{MOV{R9{R10{{SAVE NAME PTR
{{MOV{4*SCLEN(R9){R6{{GET LENGTH
{{CTB{R6{SCSI${{COMPUTE SPACE NEEDED
{{JSR{ALOST{{{REQUEST STATIC STORE FOR NAME
{{MOV{R9{-(SP){{SAVE DATATYPE NAME
{{MVW{{{{COPY NAME TO STATIC
{{MOV{(SP){R9{{GET NAME PTR
{{ZER{R10{{{SCRUB DUD REGISTER
{{JSR{GTNVR{{{LOCATE VRBLK FOR DATATYPE NAME
{{ERR{078{DATA{{ARGUMENT HAS NULL DATATYPE NAME
{{MOV{R9{DATDV{{SAVE VRBLK POINTER FOR DATATYPE
{{MOV{SP{DATXS{{STORE STARTING STACK VALUE
{{ZER{R7{{{ZERO COUNT OF FIELD NAMES
*
*      LOOP TO SCAN FIELD NAMES AND STACK VRBLK POINTERS
*
{SDAT2{MOV{#CH$RP{R8{{DELIMITER ONE = RIGHT PAREN
{{MOV{#CH$CM{R10{{DELIMITER TWO = COMMA
{{JSR{XSCAN{{{SCAN NEXT FIELD NAME
{{BNZ{R6{SDAT3{{JUMP IF DELIMITER FOUND
{{ERB{079{DATA{{ARGUMENT IS MISSING A RIGHT PAREN
*
*      HERE AFTER SCANNING OUT ONE FIELD NAME
*
{SDAT3{JSR{GTNVR{{{LOCATE VRBLK FOR FIELD NAME
{{ERR{080{DATA{{ARGUMENT HAS NULL FIELD NAME
{{MOV{R9{-(SP){{STACK VRBLK POINTER
{{ICV{R7{{{INCREMENT COUNTER
{{BEQ{R6{#NUM02{SDAT2{LOOP BACK IF STOPPED BY COMMA
{{EJC{{{{
*
*      DATA (CONTINUED)
*
*      NOW BUILD THE DFBLK
*
{{MOV{#DFSI${R6{{SET SIZE OF DFBLK STANDARD FIELDS
{{ADD{R7{R6{{ADD NUMBER OF FIELDS
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{MOV{R7{R8{{PRESERVE NO. OF FIELDS
{{JSR{ALOST{{{ALLOCATE SPACE FOR DFBLK
{{MOV{R8{R7{{GET NO OF FIELDS
{{MOV{DATXS{R10{{POINT TO START OF STACK
{{MOV{(R10){R8{{LOAD DATATYPE NAME
{{MOV{R9{(R10){{SAVE DFBLK POINTER ON STACK
{{MOV{#B$DFC{(R9)+{{STORE TYPE WORD
{{MOV{R7{(R9)+{{STORE NUMBER OF FIELDS (FARGS)
{{MOV{R6{(R9)+{{STORE LENGTH (DFLEN)
{{SUB{#4*PDDFS{R6{{COMPUTE PDBLK LENGTH (FOR DFPDL)
{{MOV{R6{(R9)+{{STORE PDBLK LENGTH (DFPDL)
{{MOV{R8{(R9)+{{STORE DATATYPE NAME (DFNAM)
{{LCT{R8{R7{{COPY NUMBER OF FIELDS
*
*      LOOP TO MOVE FIELD NAME VRBLK POINTERS TO DFBLK
*
{SDAT4{MOV{-(R10){(R9)+{{MOVE ONE FIELD NAME VRBLK POINTER
{{BCT{R8{SDAT4{{LOOP TILL ALL MOVED
*
*      NOW DEFINE THE DATATYPE FUNCTION
*
{{MOV{R6{R8{{COPY LENGTH OF PDBLK FOR LATER LOOP
{{MOV{DATDV{R9{{POINT TO VRBLK
{{MOV{DATXS{R10{{POINT BACK ON STACK
{{MOV{(R10){R10{{LOAD DFBLK POINTER
{{JSR{DFFNC{{{DEFINE FUNCTION
{{EJC{{{{
*
*      DATA (CONTINUED)
*
*      LOOP TO BUILD FFBLKS
*
*
*      NOTICE THAT THE FFBLKS ARE CONSTRUCTED IN REVERSE ORDER
*      SO THAT THE REQUIRED OFFSETS CAN BE OBTAINED FROM
*      SUCCESSIVE DECREMENTATION OF THE PDBLK LENGTH (IN WC).
*
{SDAT5{MOV{#4*FFSI${R6{{SET LENGTH OF FFBLK
{{JSR{ALLOC{{{ALLOCATE SPACE FOR FFBLK
{{MOV{#B$FFC{(R9){{SET TYPE WORD
{{MOV{#NUM01{4*FARGS(R9){{STORE FARGS (ALWAYS ONE)
{{MOV{DATXS{R10{{POINT BACK ON STACK
{{MOV{(R10){4*FFDFP(R9){{COPY DFBLK PTR TO FFBLK
{{DCA{R8{{{DECREMENT OLD DFPDL TO GET NEXT OFS
{{MOV{R8{4*FFOFS(R9){{SET OFFSET TO THIS FIELD
{{ZER{4*FFNXT(R9){{{TENTATIVELY SET ZERO FORWARD PTR
{{MOV{R9{R10{{COPY FFBLK POINTER FOR DFFNC
{{MOV{(SP){R9{{LOAD VRBLK POINTER FOR FIELD
{{MOV{4*VRFNC(R9){R9{{LOAD CURRENT FUNCTION POINTER
{{BNE{(R9){#B$FFC{SDAT6{SKIP IF NOT CURRENTLY A FIELD FUNC
*
*      HERE WE MUST CHAIN AN OLD FFBLK PTR TO PRESERVE IT IN THE
*      CASE OF MULTIPLE FIELD FUNCTIONS WITH THE SAME NAME
*
{{MOV{R9{4*FFNXT(R10){{LINK NEW FFBLK TO PREVIOUS CHAIN
*
*      MERGE HERE TO DEFINE FIELD FUNCTION
*
{SDAT6{MOV{(SP)+{R9{{LOAD VRBLK POINTER
{{JSR{DFFNC{{{DEFINE FIELD FUNCTION
{{BNE{SP{DATXS{SDAT5{LOOP BACK TILL ALL DONE
{{ICA{SP{{{POP DFBLK POINTER
{{BRN{EXNUL{{{RETURN WITH NULL RESULT
{{EJC{{{{
*
*      DATATYPE
*
{S$DTP{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{DTYPE{{{GET DATATYPE
{{BRN{EXIXR{{{AND RETURN IT AS RESULT
{{EJC{{{{
*
*      DATE
*
{S$DTE{ENT{{{{ENTRY POINT
{{JSR{SYSDT{{{CALL SYSTEM DATE ROUTINE
{{MOV{4*1(R10){R6{{LOAD LENGTH FOR SBSTR
{{BZE{R6{EXNUL{{RETURN NULL IF LENGTH IS ZERO
{{ZER{R7{{{SET ZERO OFFSET
{{JSR{SBSTR{{{USE SBSTR TO BUILD SCBLK
{{BRN{EXIXR{{{RETURN DATE STRING
{{EJC{{{{
*
*      DEFINE
*
{S$DEF{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
{{ZER{DEFLB{{{ZERO LABEL POINTER IN CASE NULL
{{BEQ{R9{#NULLS{SDF01{JUMP IF NULL SECOND ARGUMENT
{{JSR{GTNVR{{{ELSE FIND VRBLK FOR LABEL
{{PPM{SDF13{{{JUMP IF NOT A VARIABLE NAME
{{MOV{R9{DEFLB{{ELSE SET SPECIFIED ENTRY
*
*      SCAN FUNCTION NAME
*
{SDF01{JSR{XSCNI{{{PREPARE TO SCAN FIRST ARGUMENT
{{ERR{081{DEFINE{{FIRST ARGUMENT IS NOT STRING
{{ERR{082{DEFINE{{FIRST ARGUMENT IS NULL
{{MOV{#CH$PP{R8{{DELIMITER ONE = LEFT PAREN
{{MOV{R8{R10{{DELIMITER TWO = LEFT PAREN
{{JSR{XSCAN{{{SCAN OUT FUNCTION NAME
{{BNZ{R6{SDF02{{JUMP IF LEFT PAREN FOUND
{{ERB{083{DEFINE{{FIRST ARGUMENT IS MISSING A LEFT PAREN
*
*      HERE AFTER SCANNING OUT FUNCTION NAME
*
{SDF02{JSR{GTNVR{{{GET VARIABLE NAME
{{ERR{084{DEFINE{{FIRST ARGUMENT HAS NULL FUNCTION NAME
{{MOV{R9{DEFVR{{SAVE VRBLK POINTER FOR FUNCTION NAM
{{ZER{R7{{{ZERO COUNT OF ARGUMENTS
{{MOV{SP{DEFXS{{SAVE INITIAL STACK POINTER
{{BNZ{DEFLB{SDF03{{JUMP IF SECOND ARGUMENT GIVEN
{{MOV{R9{DEFLB{{ELSE DEFAULT IS FUNCTION NAME
*
*      LOOP TO SCAN ARGUMENT NAMES AND STACK VRBLK POINTERS
*
{SDF03{MOV{#CH$RP{R8{{DELIMITER ONE = RIGHT PAREN
{{MOV{#CH$CM{R10{{DELIMITER TWO = COMMA
{{JSR{XSCAN{{{SCAN OUT NEXT ARGUMENT NAME
{{BNZ{R6{SDF04{{SKIP IF DELIMITER FOUND
{{ERB{085{NULL{{ARG NAME OR MISSING ) IN DEFINE FIRST ARG.
{{EJC{{{{
*
*      DEFINE (CONTINUED)
*
*      HERE AFTER SCANNING AN ARGUMENT NAME
*
{SDF04{BNE{R9{#NULLS{SDF05{SKIP IF NON-NULL
{{BZE{R7{SDF06{{IGNORE NULL IF CASE OF NO ARGUMENTS
*
*      HERE AFTER DEALING WITH THE CASE OF NO ARGUMENTS
*
{SDF05{JSR{GTNVR{{{GET VRBLK POINTER
{{PPM{SDF03{{{LOOP BACK TO IGNORE NULL NAME
{{MOV{R9{-(SP){{STACK ARGUMENT VRBLK POINTER
{{ICV{R7{{{INCREMENT COUNTER
{{BEQ{R6{#NUM02{SDF03{LOOP BACK IF STOPPED BY A COMMA
*
*      HERE AFTER SCANNING OUT FUNCTION ARGUMENT NAMES
*
{SDF06{MOV{R7{DEFNA{{SAVE NUMBER OF ARGUMENTS
{{ZER{R7{{{ZERO COUNT OF LOCALS
*
*      LOOP TO SCAN LOCAL NAMES AND STACK VRBLK POINTERS
*
{SDF07{MOV{#CH$CM{R8{{SET DELIMITER ONE = COMMA
{{MOV{R8{R10{{SET DELIMITER TWO = COMMA
{{JSR{XSCAN{{{SCAN OUT NEXT LOCAL NAME
{{BNE{R9{#NULLS{SDF08{SKIP IF NON-NULL
{{BZE{R7{SDF09{{IGNORE NULL IF CASE OF NO LOCALS
*
*      HERE AFTER SCANNING OUT A LOCAL NAME
*
{SDF08{JSR{GTNVR{{{GET VRBLK POINTER
{{PPM{SDF07{{{LOOP BACK TO IGNORE NULL NAME
{{ICV{R7{{{IF OK, INCREMENT COUNT
{{MOV{R9{-(SP){{STACK VRBLK POINTER
{{BNZ{R6{SDF07{{LOOP BACK IF STOPPED BY A COMMA
{{EJC{{{{
*
*      DEFINE (CONTINUED)
*
*      HERE AFTER SCANNING LOCALS, BUILD PFBLK
*
{SDF09{MOV{R7{R6{{COPY COUNT OF LOCALS
{{ADD{DEFNA{R6{{ADD NUMBER OF ARGUMENTS
{{MOV{R6{R8{{SET SUM ARGS+LOCALS AS LOOP COUNT
{{ADD{#PFSI${R6{{ADD SPACE FOR STANDARD FIELDS
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{JSR{ALLOC{{{ALLOCATE SPACE FOR PFBLK
{{MOV{R9{R10{{SAVE POINTER TO PFBLK
{{MOV{#B$PFC{(R9)+{{STORE FIRST WORD
{{MOV{DEFNA{(R9)+{{STORE NUMBER OF ARGUMENTS
{{MOV{R6{(R9)+{{STORE LENGTH (PFLEN)
{{MOV{DEFVR{(R9)+{{STORE VRBLK PTR FOR FUNCTION NAME
{{MOV{R7{(R9)+{{STORE NUMBER OF LOCALS
{{ZER{(R9)+{{{DEAL WITH LABEL LATER
{{ZER{(R9)+{{{ZERO PFCTR
{{ZER{(R9)+{{{ZERO PFRTR
{{BZE{R8{SDF11{{SKIP IF NO ARGS OR LOCALS
{{MOV{R10{R6{{KEEP PFBLK POINTER
{{MOV{DEFXS{R10{{POINT BEFORE ARGUMENTS
{{LCT{R8{R8{{GET COUNT OF ARGS+LOCALS FOR LOOP
*
*      LOOP TO MOVE LOCALS AND ARGS TO PFBLK
*
{SDF10{MOV{-(R10){(R9)+{{STORE ONE ENTRY AND BUMP POINTERS
{{BCT{R8{SDF10{{LOOP TILL ALL STORED
{{MOV{R6{R10{{RECOVER PFBLK POINTER
{{EJC{{{{
*
*      DEFINE (CONTINUED)
*
*      NOW DEAL WITH LABEL
*
{SDF11{MOV{DEFXS{SP{{POP STACK
{{MOV{DEFLB{R9{{POINT TO VRBLK FOR LABEL
{{MOV{4*VRLBL(R9){R9{{LOAD LABEL POINTER
{{BNE{(R9){#B$TRT{SDF12{SKIP IF NOT TRAPPED
{{MOV{4*TRLBL(R9){R9{{ELSE POINT TO REAL LABEL
*
*      HERE AFTER LOCATING REAL LABEL POINTER
*
{SDF12{BEQ{R9{#STNDL{SDF13{JUMP IF LABEL IS NOT DEFINED
{{MOV{R9{4*PFCOD(R10){{ELSE STORE LABEL POINTER
{{MOV{DEFVR{R9{{POINT BACK TO VRBLK FOR FUNCTION
{{JSR{DFFNC{{{DEFINE FUNCTION
{{BRN{EXNUL{{{AND EXIT RETURNING NULL
*
*      HERE FOR ERRONEOUS LABEL
*
{SDF13{ERB{086{DEFINE{{FUNCTION ENTRY POINT IS NOT DEFINED LABEL
{{EJC{{{{
*
*      DETACH
*
{S$DET{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{GTVAR{{{LOCATE VARIABLE
{{ERR{087{DETACH{{ARGUMENT IS NOT APPROPRIATE NAME
{{JSR{DTACH{{{DETACH I/O ASSOCIATION FROM NAME
{{BRN{EXNUL{{{RETURN NULL RESULT
{{EJC{{{{
*
*      DIFFER
*
{S$DIF{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
{{MOV{(SP)+{R10{{LOAD FIRST ARGUMENT
{{JSR{IDENT{{{CALL IDENT COMPARISON ROUTINE
{{PPM{EXFAL{{{FAIL IF IDENT
{{BRN{EXNUL{{{RETURN NULL IF DIFFER
{{EJC{{{{
*
*      DUMP
*
{S$DMP{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{LOAD DUMP ARG AS SMALL INTEGER
{{ERR{088{DUMP{{ARGUMENT IS NOT INTEGER
{{ERR{089{DUMP{{ARGUMENT IS NEGATIVE OR TOO LARGE
{{JSR{DUMPR{{{ELSE CALL DUMP ROUTINE
{{BRN{EXNUL{{{AND RETURN NULL AS RESULT
{{EJC{{{{
*
*      DUPL
*
{S$DUP{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{GET SECOND ARGUMENT AS SMALL INTEGE
{{ERR{090{DUPL{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{SDUP7{{{JUMP IF NEGATIVE OT TOO BIG
{{MOV{R9{R7{{SAVE DUPLICATION FACTOR
{{JSR{GTSTG{{{GET FIRST ARG AS STRING
{{PPM{SDUP4{{{JUMP IF NOT A STRING
*
*      HERE FOR CASE OF DUPLICATION OF A STRING
*
{{MTI{R6{{{ACQUIRE LENGTH AS INTEGER
{{STI{DUPSI{{{SAVE FOR THE MOMENT
{{MTI{R7{{{GET DUPLICATION FACTOR AS INTEGER
{{MLI{DUPSI{{{FORM PRODUCT
{{IOV{SDUP3{{{JUMP IF OVERFLOW
{{IEQ{EXNUL{{{RETURN NULL IF RESULT LENGTH = 0
{{MFI{R6{SDUP3{{GET AS ADDR INTEGER, CHECK OVFLO
*
*      MERGE HERE WITH RESULT LENGTH IN WA
*
{SDUP1{MOV{R9{R10{{SAVE STRING POINTER
{{JSR{ALOCS{{{ALLOCATE SPACE FOR STRING
{{MOV{R9{-(SP){{SAVE AS RESULT POINTER
{{MOV{R10{R8{{SAVE POINTER TO ARGUMENT STRING
{{PSC{R9{{{PREPARE TO STORE CHARS OF RESULT
{{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP
*
*      LOOP THROUGH DUPLICATIONS
*
{SDUP2{MOV{R8{R10{{POINT BACK TO ARGUMENT STRING
{{MOV{4*SCLEN(R10){R6{{GET NUMBER OF CHARACTERS
{{PLC{R10{{{POINT TO CHARS IN ARGUMENT STRING
{{MVC{{{{MOVE CHARACTERS TO RESULT STRING
{{BCT{R7{SDUP2{{LOOP TILL ALL DUPLICATIONS DONE
{{BRN{EXITS{{{THEN EXIT FOR NEXT CODE WORD
{{EJC{{{{
*
*      DUPL (CONTINUED)
*
*      HERE IF TOO LARGE, SET MAX LENGTH AND LET ALOCS CATCH IT
*
{SDUP3{MOV{DNAME{R6{{SET IMPOSSIBLE LENGTH FOR ALOCS
{{BRN{SDUP1{{{MERGE BACK
*
*      HERE IF NOT A STRING
*
{SDUP4{JSR{GTPAT{{{CONVERT ARGUMENT TO PATTERN
{{ERR{091{DUPL{{FIRST ARGUMENT IS NOT STRING OR PATTERN
*
*      HERE TO DUPLICATE A PATTERN ARGUMENT
*
{{MOV{R9{-(SP){{STORE PATTERN ON STACK
{{MOV{#NDNTH{R9{{START OFF WITH NULL PATTERN
{{BZE{R7{SDUP6{{NULL PATTERN IS RESULT IF DUPFAC=0
{{MOV{R7{-(SP){{PRESERVE LOOP COUNT
*
*      LOOP TO DUPLICATE BY SUCCESSIVE CONCATENATION
*
{SDUP5{MOV{R9{R10{{COPY CURRENT VALUE AS RIGHT ARGUMNT
{{MOV{4*1(SP){R9{{GET A NEW COPY OF LEFT
{{JSR{PCONC{{{CONCATENATE
{{DCV{(SP){{{COUNT DOWN
{{BNZ{(SP){SDUP5{{LOOP
{{ICA{SP{{{POP LOOP COUNT
*
*      HERE TO EXIT AFTER CONSTRUCTING PATTERN
*
{SDUP6{MOV{R9{(SP){{STORE RESULT ON STACK
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
*
*      FAIL IF SECOND ARG IS OUT OF RANGE
*
{SDUP7{ICA{SP{{{POP FIRST ARGUMENT
{{BRN{EXFAL{{{FAIL
{{EJC{{{{
*
*      EJECT
*
{S$EJC{ENT{{{{ENTRY POINT
{{JSR{IOFCB{{{CALL FCBLK ROUTINE
{{ERR{092{EJECT{{ARGUMENT IS NOT A SUITABLE NAME
{{PPM{SEJC1{{{NULL ARGUMENT
{{JSR{SYSEF{{{CALL EJECT FILE FUNCTION
{{ERR{093{EJECT{{FILE DOES NOT EXIST
{{ERR{094{EJECT{{FILE DOES NOT PERMIT PAGE EJECT
{{ERR{095{EJECT{{CAUSED NON-RECOVERABLE OUTPUT ERROR
{{BRN{EXNUL{{{RETURN NULL AS RESULT
*
*      HERE TO EJECT STANDARD OUTPUT FILE
*
{SEJC1{JSR{SYSEP{{{CALL ROUTINE TO EJECT PRINTER
{{BRN{EXNUL{{{EXIT WITH NULL RESULT
{{EJC{{{{
*
*      ENDFILE
*
{S$ENF{ENT{{{{ENTRY POINT
{{JSR{IOFCB{{{CALL FCBLK ROUTINE
{{ERR{096{ENDFILE{{ARGUMENT IS NOT A SUITABLE NAME
{{ERR{097{ENDFILE{{ARGUMENT IS NULL
{{JSR{SYSEN{{{CALL ENDFILE ROUTINE
{{ERR{098{ENDFILE{{FILE DOES NOT EXIST
{{ERR{099{ENDFILE{{FILE DOES NOT PERMIT ENDFILE
{{ERR{100{ENDFILE{{CAUSED NON-RECOVERABLE OUTPUT ERROR
{{MOV{R10{R7{{REMEMBER VRBLK PTR FROM IOFCB CALL
*
*      LOOP TO FIND TRTRF BLOCK
*
{SENF1{MOV{R10{R9{{COPY POINTER
{{MOV{4*TRVAL(R9){R9{{CHAIN ALONG
{{BNE{(R9){#B$TRT{EXNUL{SKIP OUT IF CHAIN END
{{BNE{4*TRTYP(R9){#TRTFC{SENF1{LOOP IF NOT FOUND
{{MOV{4*TRVAL(R9){4*TRVAL(R10){{REMOVE TRTRF
{{MOV{4*TRTRF(R9){ENFCH{{POINT TO HEAD OF IOCHN
{{MOV{4*TRFPT(R9){R8{{POINT TO FCBLK
{{MOV{R7{R9{{FILEARG1 VRBLK FROM IOFCB
{{JSR{SETVR{{{RESET IT
{{MOV{#R$FCB{R10{{PTR TO HEAD OF FCBLK CHAIN
{{SUB{#4*NUM02{R10{{ADJUST READY TO ENTER LOOP
*
*      FIND FCBLK
*
{SENF2{MOV{R10{R9{{COPY PTR
{{MOV{4*2(R10){R10{{GET NEXT LINK
{{BZE{R10{SENF4{{STOP IF CHAIN END
{{BEQ{4*3(R10){R8{SENF3{JUMP IF FCBLK FOUND
{{BRN{SENF2{{{LOOP
*
*      REMOVE FCBLK
*
{SENF3{MOV{4*2(R10){4*2(R9){{DELETE FCBLK FROM CHAIN
*
*      LOOP WHICH DETACHES ALL VBLS ON IOCHN CHAIN
*
{SENF4{MOV{ENFCH{R10{{GET CHAIN HEAD
{{BZE{R10{EXNUL{{FINISHED IF CHAIN END
{{MOV{4*TRTRF(R10){ENFCH{{CHAIN ALONG
{{MOV{4*IONMO(R10){R6{{NAME OFFSET
{{MOV{4*IONMB(R10){R10{{NAME BASE
{{JSR{DTACH{{{DETACH NAME
{{BRN{SENF4{{{LOOP TILL DONE
{{EJC{{{{
*
*      EQ
*
{S$EQF{ENT{{{{ENTRY POINT
{{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
{{ERR{101{EQ{{FIRST ARGUMENT IS NOT NUMERIC
{{ERR{102{EQ{{SECOND ARGUMENT IS NOT NUMERIC
{{PPM{EXFAL{{{FAIL IF LT
{{PPM{EXNUL{{{RETURN NULL IF EQ
{{PPM{EXFAL{{{FAIL IF GT
{{EJC{{{{
*
*      EVAL
*
{S$EVL{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{GTEXP{{{CONVERT TO EXPRESSION
{{ERR{103{EVAL{{ARGUMENT IS NOT EXPRESSION
{{LCW{R8{{{LOAD NEXT CODE WORD
{{BNE{R8{#OFNE${SEVL1{JUMP IF CALLED BY VALUE
{{SCP{R10{{{COPY CODE POINTER
{{MOV{(R10){R6{{GET NEXT CODE WORD
{{BNE{R6{#ORNM${SEVL2{BY NAME UNLESS EXPRESSION
{{BNZ{4*1(SP){SEVL2{{JUMP IF BY NAME
*
*      HERE IF CALLED BY VALUE
*
{SEVL1{ZER{R7{{{SET FLAG FOR BY VALUE
{{MOV{R8{-(SP){{SAVE CODE WORD
{{JSR{EVALX{{{EVALUATE EXPRESSION BY VALUE
{{PPM{EXFAL{{{FAIL IF EVALUATION FAILS
{{MOV{R9{R10{{COPY RESULT
{{MOV{(SP){R9{{RELOAD NEXT CODE WORD
{{MOV{R10{(SP){{STACK RESULT
{{BRI{(R9){{{JUMP TO EXECUTE NEXT CODE WORD
*
*      HERE IF CALLED BY NAME
*
{SEVL2{MOV{#NUM01{R7{{SET FLAG FOR BY NAME
{{JSR{EVALX{{{EVALUATE EXPRESSION BY NAME
{{PPM{EXFAL{{{FAIL IF EVALUATION FAILS
{{BRN{EXNAM{{{EXIT WITH NAME
{{EJC{{{{
*
*      EXIT
*
{S$EXT{ENT{{{{ENTRY POINT
{{ZER{R7{{{CLEAR AMOUNT OF STATIC SHIFT
{{JSR{GBCOL{{{COMPACT MEMORY BY COLLECTING
{{JSR{GTSTG{{{CONVERT ARG TO STRING
{{ERR{104{EXIT{{ARGUMENT IS NOT SUITABLE INTEGER OR STRING
{{MOV{R9{R10{{COPY STRING PTR
{{JSR{GTINT{{{CHECK IT IS INTEGER
{{PPM{SEXT1{{{SKIP IF UNCONVERTIBLE
{{ZER{R10{{{NOTE IT IS INTEGER
{{LDI{4*ICVAL(R9){{{GET INTEGER ARG
{{MOV{R$FCB{R7{{GET FCBLK CHAIN HEADER
*
*      MERGE TO CALL OSINT EXIT ROUTINE
*
{SEXT1{MOV{#HEADV{R9{{POINT TO V.V STRING
{{JSR{SYSXI{{{CALL EXTERNAL ROUTINE
{{ERR{105{EXIT{{ACTION NOT AVAILABLE IN THIS IMPLEMENTATION
{{ERR{106{EXIT{{ACTION CAUSED IRRECOVERABLE ERROR
{{IEQ{EXNUL{{{RETURN IF ARGUMENT 0
{{ZER{GBCNT{{{RESUMING EXECUTION SO RESET
{{IGT{SEXT2{{{SKIP IF POSITIVE
{{NGI{{{{MAKE POSITIVE
*
*      CHECK FOR OPTION RESPECIFICATION
*
{SEXT2{MFI{R8{{{GET VALUE IN WORK REG
{{BEQ{R8{#NUM03{SEXT3{SKIP IF WAS 3
{{MOV{R8{-(SP){{SAVE VALUE
{{ZER{R8{{{SET TO READ OPTIONS
{{JSR{PRPAR{{{READ SYSPP OPTIONS
{{MOV{(SP)+{R8{{RESTORE VALUE
*
*      DEAL WITH HEADER OPTION (FIDDLED BY PRPAR)
*
{SEXT3{MNZ{HEADP{{{ASSUME NO HEADERS
{{BNE{R8{#NUM01{SEXT4{SKIP IF NOT 1
{{ZER{HEADP{{{REQUEST HEADER PRINTING
*
*      ALMOST READY TO RESUME RUNNING
*
{SEXT4{JSR{SYSTM{{{GET EXECUTION TIME START (SGD11)
{{STI{TIMSX{{{SAVE AS INITIAL TIME
{{LDI{KVSTC{{{RESET TO ENSURE ...
{{STI{KVSTL{{{... CORRECT EXECUTION STATS
{{BRN{EXNUL{{{RESUME EXECUTION
{{EJC{{{{
*
*      FIELD
*
{S$FLD{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{GET SECOND ARGUMENT (FIELD NUMBER)
{{ERR{107{FIELD{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{EXFAL{{{FAIL IF OUT OF RANGE
{{MOV{R9{R7{{ELSE SAVE INTEGER VALUE
{{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
{{JSR{GTNVR{{{POINT TO VRBLK
{{PPM{SFLD1{{{JUMP (ERROR) IF NOT VARIABLE NAME
{{MOV{4*VRFNC(R9){R9{{ELSE POINT TO FUNCTION BLOCK
{{BNE{(R9){#B$DFC{SFLD1{ERROR IF NOT DATATYPE FUNCTION
*
*      HERE IF FIRST ARGUMENT IS A DATATYPE FUNCTION NAME
*
{{BZE{R7{EXFAL{{FAIL IF ARGUMENT NUMBER IS ZERO
{{BGT{R7{4*FARGS(R9){EXFAL{FAIL IF TOO LARGE
{{WTB{R7{{{ELSE CONVERT TO BYTE OFFSET
{{ADD{R7{R9{{POINT TO FIELD NAME
{{MOV{4*DFFLB(R9){R9{{LOAD VRBLK POINTER
{{BRN{EXVNM{{{EXIT TO BUILD NMBLK
*
*      HERE FOR BAD FIRST ARGUMENT
*
{SFLD1{ERB{108{FIELD{{FIRST ARGUMENT IS NOT DATATYPE NAME
{{EJC{{{{
*
*      FENCE
*
{S$FNC{ENT{{{{ENTRY POINT
{{MOV{#P$FNC{R7{{SET PCODE FOR P$FNC
{{ZER{R9{{{P0BLK
{{JSR{PBILD{{{BUILD P$FNC NODE
{{MOV{R9{R10{{SAVE POINTER TO IT
{{MOV{(SP)+{R9{{GET ARGUMENT
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{259{FENCE{{ARGUMENT IS NOT PATTERN
{{JSR{PCONC{{{CONCATENATE TO P$FNC NODE
{{MOV{R9{R10{{SAVE PTR TO CONCATENATED PATTERN
{{MOV{#P$FNA{R7{{SET FOR P$FNA PCODE
{{ZER{R9{{{P0BLK
{{JSR{PBILD{{{CONSTRUCT P$FNA NODE
{{MOV{R10{4*PTHEN(R9){{SET PATTERN AS PTHEN
{{MOV{R9{-(SP){{SET AS RESULT
{{BRN{EXITS{{{DO NEXT CODE WORD
{{EJC{{{{
*
*      GE
*
{S$GEF{ENT{{{{ENTRY POINT
{{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
{{ERR{109{GE{{FIRST ARGUMENT IS NOT NUMERIC
{{ERR{110{GE{{SECOND ARGUMENT IS NOT NUMERIC
{{PPM{EXFAL{{{FAIL IF LT
{{PPM{EXNUL{{{RETURN NULL IF EQ
{{PPM{EXNUL{{{RETURN NULL IF GT
{{EJC{{{{
*
*      GT
*
{S$GTF{ENT{{{{ENTRY POINT
{{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
{{ERR{111{GT{{FIRST ARGUMENT IS NOT NUMERIC
{{ERR{112{GT{{SECOND ARGUMENT IS NOT NUMERIC
{{PPM{EXFAL{{{FAIL IF LT
{{PPM{EXFAL{{{FAIL IF EQ
{{PPM{EXNUL{{{RETURN NULL IF GT
{{EJC{{{{
*
*      HOST
*
{S$HST{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{GET THIRD ARG
{{MOV{(SP)+{R10{{GET SECOND ARG
{{MOV{(SP)+{R6{{GET FIRST ARG
{{JSR{SYSHS{{{ENTER SYSHS ROUTINE
{{ERR{254{ERRONEOUS{{ARGUMENT FOR HOST
{{ERR{255{ERROR{{DURING EXECUTION OF HOST
{{PPM{SHST1{{{STORE HOST STRING
{{PPM{EXNUL{{{RETURN NULL RESULT
{{PPM{EXIXR{{{RETURN XR
{{PPM{EXFAL{{{FAIL RETURN
*
*      RETURN HOST STRING
*
{SHST1{BZE{R10{EXNUL{{NULL STRING IF SYSHS UNCOOPERATIVE
{{MOV{4*SCLEN(R10){R6{{LENGTH
{{ZER{R7{{{ZERO OFFSET
{{JSR{SBSTR{{{BUILD COPY OF STRING
{{MOV{R9{-(SP){{STACK THE RESULT
{{BRN{EXITS{{{RETURN RESULT ON STACK
{{EJC{{{{
*
*      IDENT
*
{S$IDN{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
{{MOV{(SP)+{R10{{LOAD FIRST ARGUMENT
{{JSR{IDENT{{{CALL IDENT COMPARISON ROUTINE
{{PPM{EXNUL{{{RETURN NULL IF IDENT
{{BRN{EXFAL{{{FAIL IF DIFFER
{{EJC{{{{
*
*      INPUT
*
{S$INP{ENT{{{{ENTRY POINT
{{ZER{R7{{{INPUT FLAG
{{JSR{IOPUT{{{CALL INPUT/OUTPUT ASSOC. ROUTINE
{{ERR{113{INPUT{{THIRD ARGUMENT IS NOT A STRING
{{ERR{114{INAPPROPRIATE{{SECOND ARGUMENT FOR INPUT
{{ERR{115{INAPPROPRIATE{{FIRST ARGUMENT FOR INPUT
{{ERR{116{INAPPROPRIATE{{FILE SPECIFICATION FOR INPUT
{{PPM{EXFAL{{{FAIL IF FILE DOES NOT EXIST
{{ERR{117{INPUT{{FILE CANNOT BE READ
{{BRN{EXNUL{{{RETURN NULL STRING
{{EJC{{{{
*
*      INSERT
*
{S$INS{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R10{{GET STRING ARG
{{JSR{GTSMI{{{GET REPLACE LENGTH
{{ERR{277{INSERT{{THIRD ARGUMENT NOT INTEGER
{{PPM{EXFAL{{{FAIL IF OUT OF RANGE
{{MOV{R8{R7{{COPY TO PROPER REG
{{JSR{GTSMI{{{GET REPLACE POSITION
{{ERR{278{INSERT{{SECOND ARGUMENT NOT INTEGER
{{PPM{EXFAL{{{FAIL IF OUT OF RANGE
{{BZE{R8{EXFAL{{FAIL IF ZERO
{{DCV{R8{{{DECREMENT TO GET OFFSET
{{MOV{R8{R6{{PUT IN PROPER REGISTER
{{MOV{(SP)+{R9{{GET BUFFER
{{BEQ{(R9){#B$BCT{SINS1{PRESS ON IF TYPE OK
{{ERB{279{INSERT{{FIRST ARGUMENT NOT BUFFER
*
*      HERE WHEN EVERYTHING LOADED UP
*
{SINS1{JSR{INSBF{{{CALL TO INSERT
{{ERR{280{INSERT{{FOURTH ARGUMENT NOT A STRING
{{PPM{EXFAL{{{FAIL IF OUT OF RANGE
{{BRN{EXNUL{{{ELSE OK - EXIT WITH NULL
{{EJC{{{{
*
*      INTEGER
*
{S$INT{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{GTNUM{{{CONVERT TO NUMERIC
{{PPM{EXFAL{{{FAIL IF NON-NUMERIC
{{BEQ{R6{#B$ICL{EXNUL{RETURN NULL IF INTEGER
{{BRN{EXFAL{{{FAIL IF REAL
{{EJC{{{{
*
*      ITEM
*
*      ITEM DOES NOT PERMIT THE DIRECT (FAST) CALL SO THAT
*      WA CONTAINS THE ACTUAL NUMBER OF ARGUMENTS PASSED.
*
{S$ITM{ENT{{{{ENTRY POINT
*
*      DEAL WITH CASE OF NO ARGS
*
{{BNZ{R6{SITM1{{JUMP IF AT LEAST ONE ARG
{{MOV{#NULLS{-(SP){{ELSE SUPPLY GARBAGE NULL ARG
{{MOV{#NUM01{R6{{AND FIX ARGUMENT COUNT
*
*      CHECK FOR NAME/VALUE CASES
*
{SITM1{SCP{R9{{{GET CURRENT CODE POINTER
{{MOV{(R9){R10{{LOAD NEXT CODE WORD
{{DCV{R6{{{GET NUMBER OF SUBSCRIPTS
{{MOV{R6{R9{{COPY FOR ARREF
{{BEQ{R10{#OFNE${SITM2{JUMP IF CALLED BY NAME
*
*      HERE IF CALLED BY VALUE
*
{{ZER{R7{{{SET CODE FOR CALL BY VALUE
{{BRN{ARREF{{{OFF TO ARRAY REFERENCE ROUTINE
*
*      HERE FOR CALL BY NAME
*
{SITM2{MNZ{R7{{{SET CODE FOR CALL BY NAME
{{LCW{R6{{{LOAD AND IGNORE OFNE$ CALL
{{BRN{ARREF{{{OFF TO ARRAY REFERENCE ROUTINE
{{EJC{{{{
*
*      LE
*
{S$LEF{ENT{{{{ENTRY POINT
{{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
{{ERR{118{LE{{FIRST ARGUMENT IS NOT NUMERIC
{{ERR{119{LE{{SECOND ARGUMENT IS NOT NUMERIC
{{PPM{EXNUL{{{RETURN NULL IF LT
{{PPM{EXNUL{{{RETURN NULL IF EQ
{{PPM{EXFAL{{{FAIL IF GT
{{EJC{{{{
*
*      LEN
*
{S$LEN{ENT{{{{ENTRY POINT
{{MOV{#P$LEN{R7{{SET PCODE FOR INTEGER ARG CASE
{{MOV{#P$LND{R6{{SET PCODE FOR EXPR ARG CASE
{{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{120{LEN{{ARGUMENT IS NOT INTEGER OR EXPRESSION
{{ERR{121{LEN{{ARGUMENT IS NEGATIVE OR TOO LARGE
{{BRN{EXIXR{{{RETURN PATTERN NODE
{{EJC{{{{
*
*      LEQ
*
{S$LEQ{ENT{{{{ENTRY POINT
{{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
{{ERR{122{LEQ{{FIRST ARGUMENT IS NOT STRING
{{ERR{123{LEQ{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXFAL{{{FAIL IF LLT
{{PPM{EXNUL{{{RETURN NULL IF LEQ
{{PPM{EXFAL{{{FAIL IF LGT
{{EJC{{{{
*
*      LGE
*
{S$LGE{ENT{{{{ENTRY POINT
{{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
{{ERR{124{LGE{{FIRST ARGUMENT IS NOT STRING
{{ERR{125{LGE{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXFAL{{{FAIL IF LLT
{{PPM{EXNUL{{{RETURN NULL IF LEQ
{{PPM{EXNUL{{{RETURN NULL IF LGT
{{EJC{{{{
*
*      LGT
*
{S$LGT{ENT{{{{ENTRY POINT
{{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
{{ERR{126{LGT{{FIRST ARGUMENT IS NOT STRING
{{ERR{127{LGT{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXFAL{{{FAIL IF LLT
{{PPM{EXFAL{{{FAIL IF LEQ
{{PPM{EXNUL{{{RETURN NULL IF LGT
{{EJC{{{{
*
*      LLE
*
{S$LLE{ENT{{{{ENTRY POINT
{{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
{{ERR{128{LLE{{FIRST ARGUMENT IS NOT STRING
{{ERR{129{LLE{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXNUL{{{RETURN NULL IF LLT
{{PPM{EXNUL{{{RETURN NULL IF LEQ
{{PPM{EXFAL{{{FAIL IF LGT
{{EJC{{{{
*
*      LLT
*
{S$LLT{ENT{{{{ENTRY POINT
{{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
{{ERR{130{LLT{{FIRST ARGUMENT IS NOT STRING
{{ERR{131{LLT{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXNUL{{{RETURN NULL IF LLT
{{PPM{EXFAL{{{FAIL IF LEQ
{{PPM{EXFAL{{{FAIL IF LGT
{{EJC{{{{
*
*      LNE
*
{S$LNE{ENT{{{{ENTRY POINT
{{JSR{LCOMP{{{CALL STRING COMPARISON ROUTINE
{{ERR{132{LNE{{FIRST ARGUMENT IS NOT STRING
{{ERR{133{LNE{{SECOND ARGUMENT IS NOT STRING
{{PPM{EXNUL{{{RETURN NULL IF LLT
{{PPM{EXFAL{{{FAIL IF LEQ
{{PPM{EXNUL{{{RETURN NULL IF LGT
{{EJC{{{{
*
*      LOCAL
*
{S$LOC{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{GET SECOND ARGUMENT (LOCAL NUMBER)
{{ERR{134{LOCAL{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{EXFAL{{{FAIL IF OUT OF RANGE
{{MOV{R9{R7{{SAVE LOCAL NUMBER
{{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
{{JSR{GTNVR{{{POINT TO VRBLK
{{PPM{SLOC1{{{JUMP IF NOT VARIABLE NAME
{{MOV{4*VRFNC(R9){R9{{ELSE LOAD FUNCTION POINTER
{{BNE{(R9){#B$PFC{SLOC1{JUMP IF NOT PROGRAM DEFINED
*
*      HERE IF WE HAVE A PROGRAM DEFINED FUNCTION NAME
*
{{BZE{R7{EXFAL{{FAIL IF SECOND ARG IS ZERO
{{BGT{R7{4*PFNLO(R9){EXFAL{OR TOO LARGE
{{ADD{4*FARGS(R9){R7{{ELSE ADJUST OFFSET TO INCLUDE ARGS
{{WTB{R7{{{CONVERT TO BYTES
{{ADD{R7{R9{{POINT TO LOCAL POINTER
{{MOV{4*PFAGB(R9){R9{{LOAD VRBLK POINTER
{{BRN{EXVNM{{{EXIT BUILDING NMBLK
*
*      HERE IF FIRST ARGUMENT IS NO GOOD
*
{SLOC1{ERB{135{LOCAL{{FIRST ARG IS NOT A PROGRAM FUNCTION NAME
{{EJC{{{{
*
*      LOAD
*
{S$LOD{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{LOAD LIBRARY NAME
{{ERR{136{LOAD{{SECOND ARGUMENT IS NOT STRING
{{MOV{R9{R10{{SAVE LIBRARY NAME
{{JSR{XSCNI{{{PREPARE TO SCAN FIRST ARGUMENT
{{ERR{137{LOAD{{FIRST ARGUMENT IS NOT STRING
{{ERR{138{LOAD{{FIRST ARGUMENT IS NULL
{{MOV{R10{-(SP){{STACK LIBRARY NAME
{{MOV{#CH$PP{R8{{SET DELIMITER ONE = LEFT PAREN
{{MOV{R8{R10{{SET DELIMITER TWO = LEFT PAREN
{{JSR{XSCAN{{{SCAN FUNCTION NAME
{{MOV{R9{-(SP){{SAVE PTR TO FUNCTION NAME
{{BNZ{R6{SLOD1{{JUMP IF LEFT PAREN FOUND
{{ERB{139{LOAD{{FIRST ARGUMENT IS MISSING A LEFT PAREN
*
*      HERE AFTER SUCCESSFULLY SCANNING FUNCTION NAME
*
{SLOD1{JSR{GTNVR{{{LOCATE VRBLK
{{ERR{140{LOAD{{FIRST ARGUMENT HAS NULL FUNCTION NAME
{{MOV{R9{LODFN{{SAVE VRBLK POINTER
{{ZER{LODNA{{{ZERO COUNT OF ARGUMENTS
*
*      LOOP TO SCAN ARGUMENT DATATYPE NAMES
*
{SLOD2{MOV{#CH$RP{R8{{DELIMITER ONE IS RIGHT PAREN
{{MOV{#CH$CM{R10{{DELIMITER TWO IS COMMA
{{JSR{XSCAN{{{SCAN NEXT ARGUMENT NAME
{{ICV{LODNA{{{BUMP ARGUMENT COUNT
{{BNZ{R6{SLOD3{{JUMP IF OK DELIMITER WAS FOUND
{{ERB{141{LOAD{{FIRST ARGUMENT IS MISSING A RIGHT PAREN
{{EJC{{{{
*
*      LOAD (CONTINUED)
*
*      COME HERE TO ANALYZE THE DATATYPE POINTER IN (XR). THIS
*      CODE IS USED BOTH FOR ARGUMENTS (WA=1,2) AND FOR THE
*      RESULT DATATYPE (WITH WA SET TO ZERO).
*
{SLOD3{MOV{R9{-(SP){{STACK DATATYPE NAME POINTER
{{MOV{#NUM01{R7{{SET STRING CODE IN CASE
{{MOV{#SCSTR{R10{{POINT TO /STRING/
{{JSR{IDENT{{{CHECK FOR MATCH
{{PPM{SLOD4{{{JUMP IF MATCH
{{MOV{(SP){R9{{ELSE RELOAD NAME
{{ADD{R7{R7{{SET CODE FOR INTEGER (2)
{{MOV{#SCINT{R10{{POINT TO /INTEGER/
{{JSR{IDENT{{{CHECK FOR MATCH
{{PPM{SLOD4{{{JUMP IF MATCH
{{MOV{(SP){R9{{ELSE RELOAD STRING POINTER
{{ICV{R7{{{SET CODE FOR REAL (3)
{{MOV{#SCREA{R10{{POINT TO /REAL/
{{JSR{IDENT{{{CHECK FOR MATCH
{{PPM{SLOD4{{{JUMP IF MATCH
{{ZER{R7{{{ELSE GET CODE FOR NO CONVERT
*
*      MERGE HERE WITH PROPER DATATYPE CODE IN WB
*
{SLOD4{MOV{R7{(SP){{STORE CODE ON STACK
{{BEQ{R6{#NUM02{SLOD2{LOOP BACK IF ARG STOPPED BY COMMA
{{BZE{R6{SLOD5{{JUMP IF THAT WAS THE RESULT TYPE
*
*      HERE WE SCAN OUT THE RESULT TYPE (ARG STOPPED BY ) )
*
{{MOV{MXLEN{R8{{SET DUMMY (IMPOSSIBLE) DELIMITER 1
{{MOV{R8{R10{{AND DELIMITER TWO
{{JSR{XSCAN{{{SCAN RESULT NAME
{{ZER{R6{{{SET CODE FOR PROCESSING RESULT
{{BRN{SLOD3{{{JUMP BACK TO PROCESS RESULT NAME
{{EJC{{{{
*
*      LOAD (CONTINUED)
*
*      HERE AFTER PROCESSING ALL ARGS AND RESULT
*
{SLOD5{MOV{LODNA{R6{{GET NUMBER OF ARGUMENTS
{{MOV{R6{R8{{COPY FOR LATER
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{ADD{#4*EFSI${R6{{ADD SPACE FOR STANDARD FIELDS
{{JSR{ALLOC{{{ALLOCATE EFBLK
{{MOV{#B$EFC{(R9){{SET TYPE WORD
{{MOV{R8{4*FARGS(R9){{SET NUMBER OF ARGUMENTS
{{ZER{4*EFUSE(R9){{{SET USE COUNT (DFFNC WILL SET TO 1)
{{ZER{4*EFCOD(R9){{{ZERO CODE POINTER FOR NOW
{{MOV{(SP)+{4*EFRSL(R9){{STORE RESULT TYPE CODE
{{MOV{LODFN{4*EFVAR(R9){{STORE FUNCTION VRBLK POINTER
{{MOV{R6{4*EFLEN(R9){{STORE EFBLK LENGTH
{{MOV{R9{R7{{SAVE EFBLK POINTER
{{ADD{R6{R9{{POINT PAST END OF EFBLK
{{LCT{R8{R8{{SET NUMBER OF ARGUMENTS FOR LOOP
*
*      LOOP TO SET ARGUMENT TYPE CODES FROM STACK
*
{SLOD6{MOV{(SP)+{-(R9){{STORE ONE TYPE CODE FROM STACK
{{BCT{R8{SLOD6{{LOOP TILL ALL STORED
*
*      NOW LOAD THE EXTERNAL FUNCTION AND PERFORM DEFINITION
*
{{MOV{(SP)+{R9{{LOAD FUNCTION STRING NAME
{{MOV{(SP){R10{{LOAD LIBRARY NAME
{{MOV{R7{(SP){{STORE EFBLK POINTER
{{JSR{SYSLD{{{CALL FUNCTION TO LOAD EXTERNAL FUNC
{{ERR{142{LOAD{{FUNCTION DOES NOT EXIST
{{ERR{143{LOAD{{FUNCTION CAUSED INPUT ERROR DURING LOAD
{{MOV{(SP)+{R10{{RECALL EFBLK POINTER
{{MOV{R9{4*EFCOD(R10){{STORE CODE POINTER
{{MOV{LODFN{R9{{POINT TO VRBLK FOR FUNCTION
{{JSR{DFFNC{{{PERFORM FUNCTION DEFINITION
{{BRN{EXNUL{{{RETURN NULL RESULT
{{EJC{{{{
*
*      LPAD
*
{S$LPD{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{GET PAD CHARACTER
{{ERR{144{LPAD{{THIRD ARGUMENT NOT A STRING
{{PLC{R9{{{POINT TO CHARACTER (NULL IS BLANK)
{{LCH{R7{(R9){{LOAD PAD CHARACTER
{{JSR{GTSMI{{{GET PAD LENGTH
{{ERR{145{LPAD{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{SLPD3{{{SKIP IF NEGATIVE OR LARGE
*
*      MERGE TO CHECK FIRST ARG
*
{SLPD1{JSR{GTSTG{{{GET FIRST ARGUMENT (STRING TO PAD)
{{ERR{146{LPAD{{FIRST ARGUMENT IS NOT STRING
{{BGE{R6{R8{EXIXR{RETURN 1ST ARG IF TOO LONG TO PAD
{{MOV{R9{R10{{ELSE MOVE PTR TO STRING TO PAD
*
*      NOW WE ARE READY FOR THE PAD
*
*      (XL)                  POINTER TO STRING TO PAD
*      (WB)                  PAD CHARACTER
*      (WC)                  LENGTH TO PAD STRING TO
*
{{MOV{R8{R6{{COPY LENGTH
{{JSR{ALOCS{{{ALLOCATE SCBLK FOR NEW STRING
{{MOV{R9{-(SP){{SAVE AS RESULT
{{MOV{4*SCLEN(R10){R6{{LOAD LENGTH OF ARGUMENT
{{SUB{R6{R8{{CALCULATE NUMBER OF PAD CHARACTERS
{{PSC{R9{{{POINT TO CHARS IN RESULT STRING
{{LCT{R8{R8{{SET COUNTER FOR PAD LOOP
*
*      LOOP TO PERFORM PAD
*
{SLPD2{SCH{R7{(R9)+{{STORE PAD CHARACTER, BUMP PTR
{{BCT{R8{SLPD2{{LOOP TILL ALL PAD CHARS STORED
{{CSC{R9{{{COMPLETE STORE CHARACTERS
*
*      NOW COPY STRING
*
{{BZE{R6{EXITS{{EXIT IF NULL STRING
{{PLC{R10{{{ELSE POINT TO CHARS IN ARGUMENT
{{MVC{{{{MOVE CHARACTERS TO RESULT STRING
{{BRN{EXITS{{{JUMP FOR NEXT CODE WORD
*
*      HERE IF 2ND ARG IS NEGATIVE OR LARGE
*
{SLPD3{ZER{R8{{{ZERO PAD COUNT
{{BRN{SLPD1{{{MERGE
{{EJC{{{{
*
*      LT
*
{S$LTF{ENT{{{{ENTRY POINT
{{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
{{ERR{147{LT{{FIRST ARGUMENT IS NOT NUMERIC
{{ERR{148{LT{{SECOND ARGUMENT IS NOT NUMERIC
{{PPM{EXNUL{{{RETURN NULL IF LT
{{PPM{EXFAL{{{FAIL IF EQ
{{PPM{EXFAL{{{FAIL IF GT
{{EJC{{{{
*
*      NE
*
{S$NEF{ENT{{{{ENTRY POINT
{{JSR{ACOMP{{{CALL ARITHMETIC COMPARISON ROUTINE
{{ERR{149{NE{{FIRST ARGUMENT IS NOT NUMERIC
{{ERR{150{NE{{SECOND ARGUMENT IS NOT NUMERIC
{{PPM{EXNUL{{{RETURN NULL IF LT
{{PPM{EXFAL{{{FAIL IF EQ
{{PPM{EXNUL{{{RETURN NULL IF GT
{{EJC{{{{
*
*      NOTANY
*
{S$NAY{ENT{{{{ENTRY POINT
{{MOV{#P$NAS{R7{{SET PCODE FOR SINGLE CHAR ARG
{{MOV{#P$NAY{R10{{PCODE FOR MULTI-CHAR ARG
{{MOV{#P$NAD{R8{{SET PCODE FOR EXPR ARG
{{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{151{NOTANY{{ARGUMENT IS NOT STRING OR EXPRESSION
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      OPSYN
*
{S$OPS{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{LOAD THIRD ARGUMENT
{{ERR{152{OPSYN{{THIRD ARGUMENT IS NOT INTEGER
{{ERR{153{OPSYN{{THIRD ARGUMENT IS NEGATIVE OR TOO LARGE
{{MOV{R8{R7{{IF OK, SAVE THIRD ARGUMNET
{{MOV{(SP)+{R9{{LOAD SECOND ARGUMENT
{{JSR{GTNVR{{{LOCATE VARIABLE BLOCK
{{ERR{154{OPSYN{{SECOND ARG IS NOT NATURAL VARIABLE NAME
{{MOV{4*VRFNC(R9){R10{{IF OK, LOAD FUNCTION BLOCK POINTER
{{BNZ{R7{SOPS2{{JUMP IF OPERATOR OPSYN CASE
*
*      HERE FOR FUNCTION OPSYN (THIRD ARG ZERO)
*
{{MOV{(SP)+{R9{{LOAD FIRST ARGUMENT
{{JSR{GTNVR{{{GET VRBLK POINTER
{{ERR{155{OPSYN{{FIRST ARG IS NOT NATURAL VARIABLE NAME
*
*      MERGE HERE TO PERFORM FUNCTION DEFINITION
*
{SOPS1{JSR{DFFNC{{{CALL FUNCTION DEFINER
{{BRN{EXNUL{{{EXIT WITH NULL RESULT
*
*      HERE FOR OPERATOR OPSYN (THIRD ARG NON-ZERO)
*
{SOPS2{JSR{GTSTG{{{GET OPERATOR NAME
{{PPM{SOPS5{{{JUMP IF NOT STRING
{{BNE{R6{#NUM01{SOPS5{ERROR IF NOT ONE CHAR LONG
{{PLC{R9{{{ELSE POINT TO CHARACTER
{{LCH{R8{(R9){{LOAD CHARACTER NAME
{{EJC{{{{
*
*      OPSYN (CONTINUED)
*
*      NOW SET TO SEARCH FOR MATCHING UNARY OR BINARY OPERATOR
*      NAME AS APPROPRIATE. NOTE THAT THERE ARE =OPBUN UNDEFINED
*      BINARY OPERATORS AND =OPUUN UNDEFINED UNARY OPERATORS.
*
{{MOV{#R$UUB{R6{{POINT TO UNOP POINTERS IN CASE
{{MOV{#OPNSU{R9{{POINT TO NAMES OF UNARY OPERATORS
{{ADD{#OPBUN{R7{{ADD NO. OF UNDEFINED BINARY OPS
{{BEQ{R7{#OPUUN{SOPS3{JUMP IF UNOP (THIRD ARG WAS 1)
{{MOV{#R$UBA{R6{{ELSE POINT TO BINARY OPERATOR PTRS
{{MOV{#OPSNB{R9{{POINT TO NAMES OF BINARY OPERATORS
{{MOV{#OPBUN{R7{{SET NUMBER OF UNDEFINED BINOPS
*
*      MERGE HERE TO CHECK LIST (WB = NUMBER TO CHECK)
*
{SOPS3{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP
*
*      LOOP TO SEARCH FOR NAME MATCH
*
{SOPS4{BEQ{R8{(R9){SOPS6{JUMP IF NAMES MATCH
{{ICA{R6{{{ELSE PUSH POINTER TO FUNCTION PTR
{{ICA{R9{{{BUMP POINTER
{{BCT{R7{SOPS4{{LOOP BACK TILL ALL CHECKED
*
*      HERE IF BAD OPERATOR NAME
*
{SOPS5{ERB{156{OPSYN{{FIRST ARG IS NOT CORRECT OPERATOR NAME
*
*      COME HERE ON FINDING A MATCH IN THE OPERATOR NAME TABLE
*
{SOPS6{MOV{R6{R9{{COPY POINTER TO FUNCTION BLOCK PTR
{{SUB{#4*VRFNC{R9{{MAKE IT LOOK LIKE DUMMY VRBLK
{{BRN{SOPS1{{{MERGE BACK TO DEFINE OPERATOR
{{EJC{{{{
*
*      OUTPUT
*
{S$OUP{ENT{{{{ENTRY POINT
{{MOV{#NUM03{R7{{OUTPUT FLAG
{{JSR{IOPUT{{{CALL INPUT/OUTPUT ASSOC. ROUTINE
{{ERR{157{OUTPUT{{THIRD ARGUMENT IS NOT A STRING
{{ERR{158{INAPPROPRIATE{{SECOND ARGUMENT FOR OUTPUT
{{ERR{159{INAPPROPRIATE{{FIRST ARGUMENT FOR OUTPUT
{{ERR{160{INAPPROPRIATE{{FILE SPECIFICATION FOR OUTPUT
{{PPM{EXFAL{{{FAIL IF FILE DOES NOT EXIST
{{ERR{161{OUTPUT{{FILE CANNOT BE WRITTEN TO
{{BRN{EXNUL{{{RETURN NULL STRING
{{EJC{{{{
*
*      POS
*
{S$POS{ENT{{{{ENTRY POINT
{{MOV{#P$POS{R7{{SET PCODE FOR INTEGER ARG CASE
{{MOV{#P$PSD{R6{{SET PCODE FOR EXPRESSION ARG CASE
{{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{162{POS{{ARGUMENT IS NOT INTEGER OR EXPRESSION
{{ERR{163{POS{{ARGUMENT IS NEGATIVE OR TOO LARGE
{{BRN{EXIXR{{{RETURN PATTERN NODE
{{EJC{{{{
*
*      PROTOTYPE
*
{S$PRO{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{MOV{4*TBLEN(R9){R7{{LENGTH IF TABLE, VECTOR (=VCLEN)
{{BTW{R7{{{CONVERT TO WORDS
{{MOV{(R9){R6{{LOAD TYPE WORD OF ARGUMENT BLOCK
{{BEQ{R6{#B$ART{SPRO4{JUMP IF ARRAY
{{BEQ{R6{#B$TBT{SPRO1{JUMP IF TABLE
{{BEQ{R6{#B$VCT{SPRO3{JUMP IF VECTOR
{{BEQ{R6{#B$BCT{SPR05{JUMP IF BUFFER
{{ERB{164{PROTOTYPE{{ARGUMENT IS NOT VALID OBJECT
*
*      HERE FOR TABLE
*
{SPRO1{SUB{#TBSI${R7{{SUBTRACT STANDARD FIELDS
*
*      MERGE FOR VECTOR
*
{SPRO2{MTI{R7{{{CONVERT TO INTEGER
{{BRN{EXINT{{{EXIT WITH INTEGER RESULT
*
*      HERE FOR VECTOR
*
{SPRO3{SUB{#VCSI${R7{{SUBTRACT STANDARD FIELDS
{{BRN{SPRO2{{{MERGE
*
*      HERE FOR ARRAY
*
{SPRO4{ADD{4*AROFS(R9){R9{{POINT TO PROTOTYPE FIELD
{{MOV{(R9){R9{{LOAD PROTOTYPE
{{BRN{EXIXR{{{RETURN PROTOTYPE AS RESULT
*
*      HERE FOR BUFFER
*
{SPR05{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
{{MTI{4*BFALC(R9){{{LOAD ALLOCATED LENGTH
{{BRN{EXINT{{{EXIT WITH INTEGER ALLOCATION
{{EJC{{{{
*
*      REMDR
*
{S$RMD{ENT{{{{ENTRY POINT
{{ZER{R7{{{SET POSITIVE FLAG
{{MOV{(SP){R9{{LOAD SECOND ARGUMENT
{{JSR{GTINT{{{CONVERT TO INTEGER
{{ERR{165{REMDR{{SECOND ARGUMENT IS NOT INTEGER
{{JSR{ARITH{{{CONVERT ARGS
{{PPM{SRM01{{{FIRST ARG NOT INTEGER
{{PPM{{{{SECOND ARG CHECKED ABOVE
{{PPM{SRM01{{{FIRST ARG REAL
{{LDI{4*ICVAL(R9){{{LOAD LEFT ARGUMENT VALUE
{{RMI{4*ICVAL(R10){{{GET REMAINDER
{{INO{EXINT{{{JUMP IF NO OVERFLOW
{{ERB{167{REMDR{{CAUSED INTEGER OVERFLOW
*
*      FAIL FIRST ARGUMENT
*
{SRM01{ERB{166{REMDR{{FIRST ARGUMENT IS NOT INTEGER
{{EJC{{{{
*
*      REPLACE
*
*      THE ACTUAL REPLACE OPERATION USES AN SCBLK WHOSE CFP$A
*      CHARS CONTAIN THE TRANSLATED VERSIONS OF ALL THE CHARS.
*      THE TABLE POINTER IS REMEMBERED FROM CALL TO CALL AND
*      THE TABLE IS ONLY BUILT WHEN THE ARGUMENTS CHANGE.
*
{S$RPL{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{LOAD THIRD ARGUMENT AS STRING
{{ERR{168{REPLACE{{THIRD ARGUMENT IS NOT STRING
{{MOV{R9{R10{{SAVE THIRD ARG PTR
{{JSR{GTSTG{{{GET SECOND ARGUMENT
{{ERR{169{REPLACE{{SECOND ARGUMENT IS NOT STRING
*
*      CHECK TO SEE IF THIS IS THE SAME TABLE AS LAST TIME
*
{{BNE{R9{R$RA2{SRPL1{JUMP IF 2ND ARGUMENT DIFFERENT
{{BEQ{R10{R$RA3{SRPL4{JUMP IF ARGS SAME AS LAST TIME
*
*      HERE WE BUILD A NEW REPLACE TABLE (NOTE WA = 2ND ARG LEN)
*
{SRPL1{MOV{4*SCLEN(R10){R7{{LOAD 3RD ARGUMENT LENGTH
{{BNE{R6{R7{SRPL5{JUMP IF ARGUMENTS NOT SAME LENGTH
{{BZE{R7{SRPL5{{JUMP IF NULL 2ND ARGUMENT
{{MOV{R10{R$RA3{{SAVE THIRD ARG FOR NEXT TIME IN
{{MOV{R9{R$RA2{{SAVE SECOND ARG FOR NEXT TIME IN
{{MOV{KVALP{R10{{POINT TO ALPHABET STRING
{{MOV{4*SCLEN(R10){R6{{LOAD ALPHABET SCBLK LENGTH
{{MOV{R$RPT{R9{{POINT TO CURRENT TABLE (IF ANY)
{{BNZ{R9{SRPL2{{JUMP IF WE ALREADY HAVE A TABLE
*
*      HERE WE ALLOCATE A NEW TABLE
*
{{JSR{ALOCS{{{ALLOCATE NEW TABLE
{{MOV{R8{R6{{KEEP SCBLK LENGTH
{{MOV{R9{R$RPT{{SAVE TABLE POINTER FOR NEXT TIME
*
*      MERGE HERE WITH POINTER TO NEW TABLE BLOCK IN (XR)
*
{SRPL2{CTB{R6{SCSI${{COMPUTE LENGTH OF SCBLK
{{MVW{{{{COPY TO GET INITIAL TABLE VALUES
{{EJC{{{{
*
*      REPLACE (CONTINUED)
*
*      NOW WE MUST PLUG SELECTED ENTRIES AS REQUIRED. NOTE THAT
*      WE ARE SHORT OF INDEX REGISTERS FOR THE FOLLOWING LOOP.
*      HENCE THE NEED TO REPEATEDLY RE-INITIALISE CHAR PTR XL
*
{{MOV{R$RA2{R10{{POINT TO SECOND ARGUMENT
{{LCT{R7{R7{{NUMBER OF CHARS TO PLUG
{{ZER{R8{{{ZERO CHAR OFFSET
{{MOV{R$RA3{R9{{POINT TO 3RD ARG
{{PLC{R9{{{GET CHAR PTR FOR 3RD ARG
*
*      LOOP TO PLUG CHARS
*
{SRPL3{MOV{R$RA2{R10{{POINT TO 2ND ARG
{{PLC{R10{R8{{POINT TO NEXT CHAR
{{ICV{R8{{{INCREMENT OFFSET
{{LCH{R6{(R10){{GET NEXT CHAR
{{MOV{R$RPT{R10{{POINT TO TRANSLATE TABLE
{{PSC{R10{R6{{CONVERT CHAR TO OFFSET INTO TABLE
{{LCH{R6{(R9)+{{GET TRANSLATED CHAR
{{SCH{R6{(R10){{STORE IN TABLE
{{CSC{R10{{{COMPLETE STORE CHARACTERS
{{BCT{R7{SRPL3{{LOOP TILL DONE
{{EJC{{{{
*
*      REPLACE (CONTINUED)
*
*      HERE TO PERFORM TRANSLATE
*
{SRPL4{JSR{GTSTG{{{GET FIRST ARGUMENT
{{ERR{170{REPLACE{{FIRST ARGUMENT IS NOT STRING
{{BZE{R6{EXNUL{{RETURN NULL IF NULL ARGUMENT
{{MOV{R9{R10{{COPY POINTER
{{MOV{R6{R8{{SAVE LENGTH
{{CTB{R6{SCHAR{{GET SCBLK LENGTH
{{JSR{ALLOC{{{ALLOCATE SPACE FOR COPY
{{MOV{R9{R7{{SAVE ADDRESS OF COPY
{{MVW{{{{MOVE SCBLK CONTENTS TO COPY
{{MOV{R$RPT{R9{{POINT TO REPLACE TABLE
{{PLC{R9{{{POINT TO CHARS OF TABLE
{{MOV{R7{R10{{POINT TO STRING TO TRANSLATE
{{PLC{R10{{{POINT TO CHARS OF STRING
{{MOV{R8{R6{{SET NUMBER OF CHARS TO TRANSLATE
{{TRC{{{{PERFORM TRANSLATION
{{MOV{R7{-(SP){{STACK NEW STRING AS RESULT
{{BRN{EXITS{{{RETURN WITH RESULT ON STACK
*
*      ERROR POINT
*
{SRPL5{ERB{171{NULL{{OR UNEQUALLY LONG 2ND, 3RD ARGS TO REPLACE
{{EJC{{{{
*
*      REWIND
*
{S$REW{ENT{{{{ENTRY POINT
{{JSR{IOFCB{{{CALL FCBLK ROUTINE
{{ERR{172{REWIND{{ARGUMENT IS NOT A SUITABLE NAME
{{ERR{173{REWIND{{ARGUMENT IS NULL
{{JSR{SYSRW{{{CALL SYSTEM REWIND FUNCTION
{{ERR{174{REWIND{{FILE DOES NOT EXIST
{{ERR{175{REWIND{{FILE DOES NOT PERMIT REWIND
{{ERR{176{REWIND{{CAUSED NON-RECOVERABLE ERROR
{{BRN{EXNUL{{{EXIT WITH NULL RESULT IF NO ERROR
{{EJC{{{{
*
*      REVERSE
*
{S$RVS{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{LOAD STRING ARGUMENT
{{ERR{177{REVERSE{{ARGUMENT IS NOT STRING
{{BZE{R6{EXIXR{{RETURN ARGUMENT IF NULL
{{MOV{R9{R10{{ELSE SAVE POINTER TO STRING ARG
{{JSR{ALOCS{{{ALLOCATE SPACE FOR NEW SCBLK
{{MOV{R9{-(SP){{STORE SCBLK PTR ON STACK AS RESULT
{{PSC{R9{{{PREPARE TO STORE IN NEW SCBLK
{{PLC{R10{R8{{POINT PAST LAST CHAR IN ARGUMENT
{{LCT{R8{R8{{SET LOOP COUNTER
*
*      LOOP TO MOVE CHARS IN REVERSE ORDER
*
{SRVS1{LCH{R7{-(R10){{LOAD NEXT CHAR FROM ARGUMENT
{{SCH{R7{(R9)+{{STORE IN RESULT
{{BCT{R8{SRVS1{{LOOP TILL ALL MOVED
{{CSC{R9{{{COMPLETE STORE CHARACTERS
{{BRN{EXITS{{{AND THEN JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      RPAD
*
{S$RPD{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{GET PAD CHARACTER
{{ERR{178{RPAD{{THIRD ARGUMENT IS NOT STRING
{{PLC{R9{{{POINT TO CHARACTER (NULL IS BLANK)
{{LCH{R7{(R9){{LOAD PAD CHARACTER
{{JSR{GTSMI{{{GET PAD LENGTH
{{ERR{179{RPAD{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{SRPD3{{{SKIP IF NEGATIVE OR LARGE
*
*      MERGE TO CHECK FIRST ARG.
*
{SRPD1{JSR{GTSTG{{{GET FIRST ARGUMENT (STRING TO PAD)
{{ERR{180{RPAD{{FIRST ARGUMENT IS NOT STRING
{{BGE{R6{R8{EXIXR{RETURN 1ST ARG IF TOO LONG TO PAD
{{MOV{R9{R10{{ELSE MOVE PTR TO STRING TO PAD
*
*      NOW WE ARE READY FOR THE PAD
*
*      (XL)                  POINTER TO STRING TO PAD
*      (WB)                  PAD CHARACTER
*      (WC)                  LENGTH TO PAD STRING TO
*
{{MOV{R8{R6{{COPY LENGTH
{{JSR{ALOCS{{{ALLOCATE SCBLK FOR NEW STRING
{{MOV{R9{-(SP){{SAVE AS RESULT
{{MOV{4*SCLEN(R10){R6{{LOAD LENGTH OF ARGUMENT
{{SUB{R6{R8{{CALCULATE NUMBER OF PAD CHARACTERS
{{PSC{R9{{{POINT TO CHARS IN RESULT STRING
{{LCT{R8{R8{{SET COUNTER FOR PAD LOOP
*
*      COPY ARGUMENT STRING
*
{{BZE{R6{SRPD2{{JUMP IF ARGUMENT IS NULL
{{PLC{R10{{{ELSE POINT TO ARGUMENT CHARS
{{MVC{{{{MOVE CHARACTERS TO RESULT STRING
*
*      LOOP TO SUPPLY PAD CHARACTERS
*
{SRPD2{SCH{R7{(R9)+{{STORE PAD CHARACTER, BUMP PTR
{{BCT{R8{SRPD2{{LOOP TILL ALL PAD CHARS STORED
{{CSC{R9{{{COMPLETE CHARACTER STORING
{{BRN{EXITS{{{AND EXIT FOR NEXT WORD
*
*      HERE IF 2ND ARG IS NEGATIVE OR LARGE
*
{SRPD3{ZER{R8{{{ZERO PAD COUNT
{{BRN{SRPD1{{{MERGE
{{EJC{{{{
*
*      RTAB
*
{S$RTB{ENT{{{{ENTRY POINT
{{MOV{#P$RTB{R7{{SET PCODE FOR INTEGER ARG CASE
{{MOV{#P$RTD{R6{{SET PCODE FOR EXPRESSION ARG CASE
{{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{181{RTAB{{ARGUMENT IS NOT INTEGER OR EXPRESSION
{{ERR{182{RTAB{{ARGUMENT IS NEGATIVE OR TOO LARGE
{{BRN{EXIXR{{{RETURN PATTERN NODE
{{EJC{{{{
*
*      SET
*
{S$SET{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R$IO2{{SAVE THIRD ARG
{{MOV{(SP)+{R$IO1{{SAVE SECOND ARG
{{JSR{IOFCB{{{CALL FCBLK ROUTINE
{{ERR{291{SET{{FIRST ARGUMENT IS NOT A SUITABLE NAME
{{ERR{292{SET{{FIRST ARGUMENT IS NULL
{{MOV{R$IO1{R7{{LOAD SECOND ARG
{{MOV{R$IO2{R8{{LOAD THIRD ARG
{{JSR{SYSST{{{CALL SYSTEM SET ROUTINE
{{ERR{293{INAPPROPRIATE{{SECOND ARGUMENT TO SET
{{ERR{294{INAPPROPRIATE{{THIRD ARGUMENT TO SET
{{ERR{295{SET{{FILE DOES NOT EXIST
{{ERR{296{SET{{FILE DOES NOT PERMIT SETTING FILE POINTER
{{ERR{297{SET{{CAUSED NON-RECOVERABLE I/O ERROR
{{BRN{EXNUL{{{OTHERWISEW RETURN NULL
{{EJC{{{{
*
*      TAB
*
{S$TAB{ENT{{{{ENTRY POINT
{{MOV{#P$TAB{R7{{SET PCODE FOR INTEGER ARG CASE
{{MOV{#P$TBD{R6{{SET PCODE FOR EXPRESSION ARG CASE
{{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{183{TAB{{ARGUMENT IS NOT INTEGER OR EXPRESSION
{{ERR{184{TAB{{ARGUMENT IS NEGATIVE OR TOO LARGE
{{BRN{EXIXR{{{RETURN PATTERN NODE
{{EJC{{{{
*
*      RPOS
*
{S$RPS{ENT{{{{ENTRY POINT
{{MOV{#P$RPS{R7{{SET PCODE FOR INTEGER ARG CASE
{{MOV{#P$RPD{R6{{SET PCODE FOR EXPRESSION ARG CASE
{{JSR{PATIN{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{185{RPOS{{ARGUMENT IS NOT INTEGER OR EXPRESSION
{{ERR{186{RPOS{{ARGUMENT IS NEGATIVE OR TOO LARGE
{{BRN{EXIXR{{{RETURN PATTERN NODE
{{EJC{{{{
*
*      RSORT
*
{S$RSR{ENT{{{{ENTRY POINT
{{MNZ{R6{{{MARK AS RSORT
{{JSR{SORTA{{{CALL SORT ROUTINE
{{BRN{EXSID{{{RETURN, SETTING IDVAL
{{EJC{{{{
*
*      SETEXIT
*
{S$STX{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{MOV{STXVR{R6{{LOAD OLD VRBLK POINTER
{{ZER{R10{{{LOAD ZERO IN CASE NULL ARG
{{BEQ{R9{#NULLS{SSTX1{JUMP IF NULL ARGUMENT (RESET CALL)
{{JSR{GTNVR{{{ELSE GET SPECIFIED VRBLK
{{PPM{SSTX2{{{JUMP IF NOT NATURAL VARIABLE
{{MOV{4*VRLBL(R9){R10{{ELSE LOAD LABEL
{{BEQ{R10{#STNDL{SSTX2{JUMP IF LABEL IS NOT DEFINED
{{BNE{(R10){#B$TRT{SSTX1{JUMP IF NOT TRAPPED
{{MOV{4*TRLBL(R10){R10{{ELSE LOAD PTR TO REAL LABEL CODE
*
*      HERE TO SET/RESET SETEXIT TRAP
*
{SSTX1{MOV{R9{STXVR{{STORE NEW VRBLK POINTER (OR NULL)
{{MOV{R10{R$SXC{{STORE NEW CODE PTR (OR ZERO)
{{BEQ{R6{#NULLS{EXNUL{RETURN NULL IF NULL RESULT
{{MOV{R6{R9{{ELSE COPY VRBLK POINTER
{{BRN{EXVNM{{{AND RETURN BUILDING NMBLK
*
*      HERE IF BAD ARGUMENT
*
{SSTX2{ERB{187{SETEXIT{{ARGUMENT IS NOT LABEL NAME OR NULL
{{EJC{{{{
*
*      SORT
*
{S$SRT{ENT{{{{ENTRY POINT
{{ZER{R6{{{MARK AS SORT
{{JSR{SORTA{{{CALL SORT ROUTINE
{{BRN{EXSID{{{RETURN, SETTING IDVAL
{{EJC{{{{
*
*      SPAN
*
{S$SPN{ENT{{{{ENTRY POINT
{{MOV{#P$SPS{R7{{SET PCODE FOR SINGLE CHAR ARG
{{MOV{#P$SPN{R10{{SET PCODE FOR MULTI-CHAR ARG
{{MOV{#P$SPD{R8{{SET PCODE FOR EXPRESSION ARG
{{JSR{PATST{{{CALL COMMON ROUTINE TO BUILD NODE
{{ERR{188{SPAN{{ARGUMENT IS NOT STRING OR EXPRESSION
{{BRN{EXIXR{{{JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      SIZE
*
{S$SI${ENT{{{{ENTRY POINT
{{MOV{(SP){R9{{LOAD ARGUMENT
{{BNE{(R9){#B$BCT{SSI$1{BRANCH IF NOT BUFFER
{{ICA{SP{{{ELSE POP ARGUMENT
{{MTI{4*BCLEN(R9){{{LOAD DEFINED LENGTH
{{BRN{EXINT{{{EXIT WITH INTEGER
*
*      HERE IF NOT BUFFER
*
{SSI$1{JSR{GTSTG{{{LOAD STRING ARGUMENT
{{ERR{189{SIZE{{ARGUMENT IS NOT STRING
{{MTI{R6{{{LOAD LENGTH AS INTEGER
{{BRN{EXINT{{{EXIT WITH INTEGER RESULT
{{EJC{{{{
*
*      STOPTR
*
{S$STT{ENT{{{{ENTRY POINT
{{ZER{R10{{{INDICATE STOPTR CASE
{{JSR{TRACE{{{CALL TRACE PROCEDURE
{{ERR{190{STOPTR{{FIRST ARGUMENT IS NOT APPROPRIATE NAME
{{ERR{191{STOPTR{{SECOND ARGUMENT IS NOT TRACE TYPE
{{BRN{EXNUL{{{RETURN NULL
{{EJC{{{{
*
*      SUBSTR
*
{S$SUB{ENT{{{{ENTRY POINT
{{JSR{GTSMI{{{LOAD THIRD ARGUMENT
{{ERR{192{SUBSTR{{THIRD ARGUMENT IS NOT INTEGER
{{PPM{EXFAL{{{JUMP IF NEGATIVE OR TOO LARGE
{{MOV{R9{SBSSV{{SAVE THIRD ARGUMENT
{{JSR{GTSMI{{{LOAD SECOND ARGUMENT
{{ERR{193{SUBSTR{{SECOND ARGUMENT IS NOT INTEGER
{{PPM{EXFAL{{{JUMP IF OUT OF RANGE
{{MOV{R9{R7{{SAVE SECOND ARGUMENT
{{BZE{R7{EXFAL{{JUMP IF SECOND ARGUMENT ZERO
{{DCV{R7{{{ELSE DECREMENT FOR ONES ORIGIN
{{MOV{(SP){R10{{GET FIRST ARG PTR
{{BNE{(R10){#B$BCT{SSUBA{BRANCH IF NOT BUFFER
{{MOV{4*BCBUF(R10){R9{{GET BFBLK PTR
{{MOV{4*BCLEN(R10){R6{{GET LENGTH
{{BRN{SSUBB{{{MERGE
*
*      HERE IF NOT BUFFER TO GET STRING
*
{SSUBA{JSR{GTSTG{{{LOAD FIRST ARGUMENT
{{ERR{194{SUBSTR{{FIRST ARGUMENT IS NOT STRING
*
*      MERGE WITH BFBLK OR SCBLK PTR IN XR.  WA HAS LENGTH
*
{SSUBB{MOV{SBSSV{R8{{RELOAD THIRD ARGUMENT
{{BNZ{R8{SSUB1{{SKIP IF THIRD ARG GIVEN
{{MOV{R6{R8{{ELSE GET STRING LENGTH
{{BGT{R7{R8{EXFAL{FAIL IF IMPROPER
{{SUB{R7{R8{{REDUCE BY OFFSET TO START
*
*      MERGE
*
{SSUB1{MOV{R6{R10{{SAVE STRING LENGTH
{{MOV{R8{R6{{SET LENGTH OF SUBSTRING
{{ADD{R7{R8{{ADD 2ND ARG TO 3RD ARG
{{BGT{R8{R10{EXFAL{JUMP IF IMPROPER SUBSTRING
{{MOV{R9{R10{{COPY POINTER TO FIRST ARG
{{JSR{SBSTR{{{BUILD SUBSTRING
{{BRN{EXIXR{{{AND JUMP FOR NEXT CODE WORD
{{EJC{{{{
*
*      TABLE
*
{S$TBL{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R10{{GET INITIAL LOOKUP VALUE
{{ICA{SP{{{POP SECOND ARGUMENT
{{JSR{GTSMI{{{LOAD ARGUMENT
{{ERR{195{TABLE{{ARGUMENT IS NOT INTEGER
{{ERR{196{TABLE{{ARGUMENT IS OUT OF RANGE
{{BNZ{R8{STBL1{{JUMP IF NON-ZERO
{{MOV{#TBNBK{R8{{ELSE SUPPLY DEFAULT VALUE
*
*      MERGE HERE WITH NUMBER OF HEADERS IN WA
*
{STBL1{MOV{R8{R6{{COPY NUMBER OF HEADERS
{{ADD{#TBSI${R6{{ADJUST FOR STANDARD FIELDS
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{JSR{ALLOC{{{ALLOCATE SPACE FOR TBBLK
{{MOV{R9{R7{{COPY POINTER TO TBBLK
{{MOV{#B$TBT{(R9)+{{STORE TYPE WORD
{{ZER{(R9)+{{{ZERO ID FOR THE MOMENT
{{MOV{R6{(R9)+{{STORE LENGTH (TBLEN)
{{MOV{R10{(R9)+{{STORE INITIAL LOOKUP VALUE
{{LCT{R8{R8{{SET LOOP COUNTER (NUM HEADERS)
*
*      LOOP TO INITIALIZE ALL BUCKET POINTERS
*
{STBL2{MOV{R7{(R9)+{{STORE TBBLK PTR IN BUCKET HEADER
{{BCT{R8{STBL2{{LOOP TILL ALL STORED
{{MOV{R7{R9{{RECALL POINTER TO TBBLK
{{BRN{EXSID{{{EXIT SETTING IDVAL
{{EJC{{{{
*
*      TIME
*
{S$TIM{ENT{{{{ENTRY POINT
{{JSR{SYSTM{{{GET TIMER VALUE
{{SBI{TIMSX{{{SUBTRACT STARTING TIME
{{BRN{EXINT{{{EXIT WITH INTEGER VALUE
{{EJC{{{{
*
*      TRACE
*
{S$TRA{ENT{{{{ENTRY POINT
{{BEQ{4*3(SP){#NULLS{STR03{JUMP IF FIRST ARGUMENT IS NULL
{{MOV{(SP)+{R9{{LOAD FOURTH ARGUMENT
{{ZER{R10{{{TENTATIVELY SET ZERO POINTER
{{BEQ{R9{#NULLS{STR02{JUMP IF 4TH ARGUMENT IS NULL
{{JSR{GTNVR{{{ELSE POINT TO VRBLK
{{PPM{STR01{{{JUMP IF NOT VARIABLE NAME
{{MOV{4*VRFNC(R9){R10{{ELSE LOAD FUNCTION POINTER
{{BNE{R10{#STNDF{STR02{JUMP IF FUNCTION IS DEFINED
*
*      HERE FOR BAD FOURTH ARGUMENT
*
{STR01{ERB{197{TRACE{{FOURTH ARG IS NOT FUNCTION NAME OR NULL
*
*      HERE WITH FUNCTION POINTER IN XL
*
{STR02{MOV{(SP)+{R9{{LOAD THIRD ARGUMENT (TAG)
{{ZER{R7{{{SET ZERO AS TRTYP VALUE FOR NOW
{{JSR{TRBLD{{{BUILD TRBLK FOR TRACE CALL
{{MOV{R9{R10{{MOVE TRBLK POINTER FOR TRACE
{{JSR{TRACE{{{CALL TRACE PROCEDURE
{{ERR{198{TRACE{{FIRST ARGUMENT IS NOT APPROPRIATE NAME
{{ERR{199{TRACE{{SECOND ARGUMENT IS NOT TRACE TYPE
{{BRN{EXNUL{{{RETURN NULL
*
*      HERE TO CALL SYSTEM TRACE TOGGLE ROUTINE
*
{STR03{JSR{SYSTT{{{CALL IT
{{ADD{#4*NUM04{SP{{POP TRACE ARGUMENTS
{{BRN{EXNUL{{{RETURN
{{EJC{{{{
*
*      TRIM
*
{S$TRM{ENT{{{{ENTRY POINT
{{JSR{GTSTG{{{LOAD ARGUMENT AS STRING
{{ERR{200{TRIM{{ARGUMENT IS NOT STRING
{{BZE{R6{EXNUL{{RETURN NULL IF ARGUMENT IS NULL
{{MOV{R9{R10{{COPY STRING POINTER
{{CTB{R6{SCHAR{{GET BLOCK LENGTH
{{JSR{ALLOC{{{ALLOCATE COPY SAME SIZE
{{MOV{R9{R7{{SAVE POINTER TO COPY
{{MVW{{{{COPY OLD STRING BLOCK TO NEW
{{MOV{R7{R9{{RESTORE PTR TO NEW BLOCK
{{JSR{TRIMR{{{TRIM BLANKS (WB IS NON-ZERO)
{{BRN{EXIXR{{{EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      UNLOAD
*
{S$UNL{ENT{{{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{JSR{GTNVR{{{POINT TO VRBLK
{{ERR{201{UNLOAD{{ARGUMENT IS NOT NATURAL VARIABLE NAME
{{MOV{#STNDF{R10{{GET PTR TO UNDEFINED FUNCTION
{{JSR{DFFNC{{{UNDEFINE NAMED FUNCTION
{{BRN{EXNUL{{{RETURN NULL AS RESULT
{{TTL{S{{{P I T B O L -- UTILITY PROCEDURES
*
*      THE FOLLOWING SECTION CONTAINS PROCEDURES WHICH ARE
*      USED FOR VARIOUS PURPOSES THROUGHOUT THE SYSTEM.
*
*      EACH PROCEDURE IS PRECEDED BY A DESCRIPTION OF THE
*      CALLING SEQUENCE. USUALLY THE ARGUMENTS ARE IN REGISTERS
*      BUT ARGUMENTS CAN ALSO OCCUR ON THE STACK AND AS
*      PARAMETERS ASSEMBLED AFTER THE JSR INSTRUCTION.
*
*      THE FOLLOWING CONSIDERATIONS APPLY TO THESE DESCRIPTIONS.
*
*      1)   THE STACK POINTER (XS) IS NOT CHANGED UNLESS THE
*           CHANGE IS EXPLICITLY DOCUMENTED IN THE CALL.
*
*      2)   REGISTERS WHOSE ENTRY VALUES ARE NOT MENTIONED
*           MAY CONTAIN ANY VALUE EXCEPT THAT XL,XR MAY ONLY
*           CONTAIN PROPER (COLLECTABLE) POINTER VALUES.
*           THIS CONDITION ON XR MEANS THAT THE CALLED ROUTINE
*           MAY IF IT CHOOSES PRESERVE XR BY STACKING.
*
*      3)   REGISTERS NOT MENTIONED ON EXIT CONTAIN THE SAME
*           VALUES AS THEY DID ON ENTRY EXCEPT THAT VALUES IN
*           XR,XL MAY HAVE BEEN RELOCATED BY THE COLLECTOR.
*
*      4)   REGISTERS WHICH ARE DESTROYED ON EXIT MAY CONTAIN
*           ANY VALUE EXCEPT THAT VALUES IN XL,XR ARE PROPER
*           (COLLECTABLE) POINTERS.
*
*      5)   THE CODE POINTER REGISTER POINTS TO THE CURRENT
*           CODE LOCATION ON ENTRY AND IS UNCHANGED ON EXIT.
*
*      IN THE ABOVE DESCRIPTION, A COLLECTABLE POINTER IS ONE
*      WHICH EITHER POINTS OUTSIDE THE DYNAMIC REGION OR
*      POINTS TO THE START OF A BLOCK IN THE DYNAMIC REGION.
*
*      IN THOSE CASES WHERE THE CALLING SEQUENCE CONTAINS
*      PARAMETERS WHICH ARE USED AS ALTERNATE RETURN POINTS,
*      THESE PARAMETERS MAY BE REPLACED BY ERROR CODES
*      ASSEMBLED WITH THE ERR INSTRUCTION. THIS WILL RESULT
*      IN THE POSTING OF THE ERROR IF THE RETURN IS TAKEN.
*
*      THE PROCEDURES ALL HAVE NAMES CONSISTING OF FIVE LETTERS
*      AND ARE IN ALPHABETICAL ORDER BY THEIR NAMES.
{{EJC{{{{
*
*      ACESS - ACCESS VARIABLE VALUE WITH TRACE/INPUT CHECKS
*
*      ACESS LOADS THE VALUE OF A VARIABLE. TRACE AND INPUT
*      ASSOCIATIONS ARE TESTED FOR AND EXECUTED AS REQUIRED.
*      ACESS ALSO HANDLES THE SPECIAL CASES OF PSEUDO-VARIABLES.
*
*      (XL)                  VARIABLE NAME BASE
*      (WA)                  VARIABLE NAME OFFSET
*      JSR  ACESS            CALL TO ACCESS VALUE
*      PPM  LOC              TRANSFER LOC IF ACCESS FAILURE
*      (XR)                  VARIABLE VALUE
*      (WA,WB,WC)            DESTROYED
*      (XL,RA)               DESTROYED
*
*      FAILURE CAN OCCUR IF AN INPUT ASSOCIATION CAUSES AN END
*      OF FILE CONDITION OR IF THE EVALUATION OF AN EXPRESSION
*      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
*
{ACESS{PRC{R{1{{ENTRY POINT (RECURSIVE)
{{MOV{R10{R9{{COPY NAME BASE
{{ADD{R6{R9{{POINT TO VARIABLE LOCATION
{{MOV{(R9){R9{{LOAD VARIABLE VALUE
*
*      LOOP HERE TO CHECK FOR SUCCESSIVE TRBLKS
*
{ACS02{BNE{(R9){#B$TRT{ACS18{JUMP IF NOT TRAPPED
*
*      HERE IF TRAPPED
*
{{BEQ{R9{#TRBKV{ACS12{JUMP IF KEYWORD VARIABLE
{{BNE{R9{#TRBEV{ACS05{JUMP IF NOT EXPRESSION VARIABLE
*
*      HERE FOR EXPRESSION VARIABLE, EVALUATE VARIABLE
*
{{MOV{4*EVEXP(R10){R9{{LOAD EXPRESSION POINTER
{{ZER{R7{{{EVALUATE BY VALUE
{{JSR{EVALX{{{EVALUATE EXPRESSION
{{PPM{ACS04{{{JUMP IF EVALUATION FAILURE
{{BRN{ACS02{{{CHECK VALUE FOR MORE TRBLKS
{{EJC{{{{
*
*      ACESS (CONTINUED)
*
*      HERE ON READING END OF FILE
*
{ACS03{ADD{#4*NUM03{SP{{POP TRBLK PTR, NAME BASE AND OFFSET
{{MOV{R9{DNAMP{{POP UNUSED SCBLK
*
*      MERGE HERE WHEN EVALUATION OF EXPRESSION FAILS
*
{ACS04{EXI{1{{{TAKE ALTERNATE (FAILURE) RETURN
*
*      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
*
{ACS05{MOV{4*TRTYP(R9){R7{{LOAD TRAP TYPE CODE
{{BNZ{R7{ACS10{{JUMP IF NOT INPUT ASSOCIATION
{{BZE{KVINP{ACS09{{IGNORE INPUT ASSOC IF INPUT IS OFF
*
*      HERE FOR INPUT ASSOCIATION
*
{{MOV{R10{-(SP){{STACK NAME BASE
{{MOV{R6{-(SP){{STACK NAME OFFSET
{{MOV{R9{-(SP){{STACK TRBLK POINTER
{{MOV{4*TRFPT(R9){R10{{GET FILE CTRL BLK PTR OR ZERO
{{BNZ{R10{ACS06{{JUMP IF NOT STANDARD INPUT FILE
{{BEQ{4*TRTER(R9){#V$TER{ACS21{JUMP IF TERMINAL
*
*      HERE TO READ FROM STANDARD INPUT FILE
*
{{MOV{CSWIN{R6{{LENGTH FOR READ BUFFER
{{JSR{ALOCS{{{BUILD STRING OF APPROPRIATE LENGTH
{{JSR{SYSRD{{{READ NEXT STANDARD INPUT IMAGE
{{PPM{ACS03{{{JUMP TO FAIL EXIT IF END OF FILE
{{BRN{ACS07{{{ELSE MERGE WITH OTHER FILE CASE
*
*      HERE FOR INPUT FROM OTHER THAN STANDARD INPUT FILE
*
{ACS06{MOV{R10{R6{{FCBLK PTR
{{JSR{SYSIL{{{GET INPUT RECORD MAX LENGTH (TO WA)
{{JSR{ALOCS{{{ALLOCATE STRING OF CORRECT SIZE
{{MOV{R10{R6{{FCBLK PTR
{{JSR{SYSIN{{{CALL SYSTEM INPUT ROUTINE
{{PPM{ACS03{{{JUMP TO FAIL EXIT IF END OF FILE
{{PPM{ACS22{{{ERROR
{{PPM{ACS23{{{ERROR
{{EJC{{{{
*
*      ACESS (CONTINUED)
*
*      MERGE HERE AFTER OBTAINING INPUT RECORD
*
{ACS07{MOV{KVTRM{R7{{LOAD TRIM INDICATOR
{{JSR{TRIMR{{{TRIM RECORD AS REQUIRED
{{MOV{R9{R7{{COPY RESULT POINTER
{{MOV{(SP){R9{{RELOAD POINTER TO TRBLK
*
*      LOOP TO CHASE TO END OF TRBLK CHAIN AND STORE VALUE
*
{ACS08{MOV{R9{R10{{SAVE POINTER TO THIS TRBLK
{{MOV{4*TRNXT(R9){R9{{LOAD FORWARD POINTER
{{BEQ{(R9){#B$TRT{ACS08{LOOP IF THIS IS ANOTHER TRBLK
{{MOV{R7{4*TRNXT(R10){{ELSE STORE RESULT AT END OF CHAIN
{{MOV{(SP)+{R9{{RESTORE INITIAL TRBLK POINTER
{{MOV{(SP)+{R6{{RESTORE NAME OFFSET
{{MOV{(SP)+{R10{{RESTORE NAME BASE POINTER
*
*      COME HERE TO MOVE TO NEXT TRBLK
*
{ACS09{MOV{4*TRNXT(R9){R9{{LOAD FORWARD PTR TO NEXT VALUE
{{BRN{ACS02{{{BACK TO CHECK IF TRAPPED
*
*      HERE TO CHECK FOR ACCESS TRACE TRBLK
*
{ACS10{BNE{R7{#TRTAC{ACS09{LOOP BACK IF NOT ACCESS TRACE
{{BZE{KVTRA{ACS09{{IGNORE ACCESS TRACE IF TRACE OFF
{{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
{{BZE{4*TRFNC(R9){ACS11{{JUMP IF PRINT TRACE
{{EJC{{{{
*
*      ACESS (CONTINUED)
*
*      HERE FOR FULL FUNCTION TRACE
*
{{JSR{TRXEQ{{{CALL ROUTINE TO EXECUTE TRACE
{{BRN{ACS09{{{JUMP FOR NEXT TRBLK
*
*      HERE FOR CASE OF PRINT TRACE
*
{ACS11{JSR{PRTSN{{{PRINT STATEMENT NUMBER
{{JSR{PRTNV{{{PRINT NAME = VALUE
{{BRN{ACS09{{{JUMP BACK FOR NEXT TRBLK
*
*      HERE FOR KEYWORD VARIABLE
*
{ACS12{MOV{4*KVNUM(R10){R9{{LOAD KEYWORD NUMBER
{{BGE{R9{#K$V$${ACS14{JUMP IF NOT ONE WORD VALUE
{{MTI{L^KVABE(R9){{{ELSE LOAD VALUE AS INTEGER
*
*      COMMON EXIT WITH KEYWORD VALUE AS INTEGER IN (IA)
*
{ACS13{JSR{ICBLD{{{BUILD ICBLK
{{BRN{ACS18{{{JUMP TO EXIT
*
*      HERE IF NOT ONE WORD KEYWORD VALUE
*
{ACS14{BGE{R9{#K$S$${ACS15{JUMP IF SPECIAL CASE
{{SUB{#K$V$${R9{{ELSE GET OFFSET
{{ADD{#NDABO{R9{{POINT TO PATTERN VALUE
{{BRN{ACS18{{{JUMP TO EXIT
*
*      HERE IF SPECIAL KEYWORD CASE
*
{ACS15{MOV{KVRTN{R10{{LOAD RTNTYPE IN CASE
{{LDI{KVSTL{{{LOAD STLIMIT IN CASE
{{SUB{#K$S$${R9{{GET CASE NUMBER
{{BSW{R9{5{{SWITCH ON KEYWORD NUMBER
{{IFF{K$$AL{ACS16{{JUMP IF ALPHABET
{{IFF{K$$RT{ACS17{{RTNTYPE
{{IFF{K$$SC{ACS19{{STCOUNT
{{IFF{K$$ET{ACS20{{ERRTEXT
{{IFF{K$$SL{ACS13{{STLIMIT
{{ESW{{{{END SWITCH ON KEYWORD NUMBER
{{EJC{{{{
*
*      ACESS (CONTINUED)
*
*      ALPHABET
*
{ACS16{MOV{KVALP{R10{{LOAD POINTER TO ALPHABET STRING
*
*      RTNTYPE MERGES HERE
*
{ACS17{MOV{R10{R9{{COPY STRING PTR TO PROPER REG
*
*      COMMON RETURN POINT
*
{ACS18{EXI{{{{RETURN TO ACESS CALLER
*
*      HERE FOR STCOUNT (IA HAS STLIMIT)
*
{ACS19{SBI{KVSTC{{{STCOUNT = LIMIT - LEFT
{{BRN{ACS13{{{MERGE BACK WITH INTEGER RESULT
*
*      ERRTEXT
*
{ACS20{MOV{R$ETX{R9{{GET ERRTEXT STRING
{{BRN{ACS18{{{MERGE WITH RESULT
*
*      HERE TO READ A RECORD FROM TERMINAL
*
{ACS21{MOV{#RILEN{R6{{BUFFER LENGTH
{{JSR{ALOCS{{{ALLOCATE BUFFER
{{JSR{SYSRI{{{READ RECORD
{{PPM{ACS03{{{ENDFILE
{{BRN{ACS07{{{MERGE WITH RECORD READ
*
*      ERROR RETURNS
*
{ACS22{MOV{R9{DNAMP{{POP UNUSED SCBLK
{{ERB{202{INPUT{{FROM FILE CAUSED NON-RECOVERABLE ERROR
*
{ACS23{MOV{R9{DNAMP{{POP UNUSED SCBLK
{{ERB{203{INPUT{{FILE RECORD HAS INCORRECT FORMAT
{{ENP{{{{END PROCEDURE ACESS
{{EJC{{{{
*
*      ACOMP -- COMPARE TWO ARITHMETIC VALUES
*
*      1(XS)                 FIRST ARGUMENT
*      0(XS)                 SECOND ARGUMENT
*      JSR  ACOMP            CALL TO COMPARE VALUES
*      PPM  LOC              TRANSFER LOC IF ARG1 IS NON-NUMERIC
*      PPM  LOC              TRANSFER LOC IF ARG2 IS NON-NUMERIC
*      PPM  LOC              TRANSFER LOC FOR ARG1 LT ARG2
*      PPM  LOC              TRANSFER LOC FOR ARG1 EQ ARG2
*      PPM  LOC              TRANSFER LOC FOR ARG1 GT ARG2
*      (NORMAL RETURN IS NEVER GIVEN)
*      (WA,WB,WC,IA,RA)      DESTROYED
*      (XL,XR)               DESTROYED
*
{ACOMP{PRC{N{5{{ENTRY POINT
{{JSR{ARITH{{{LOAD ARITHMETIC OPERANDS
{{PPM{ACMP7{{{JUMP IF FIRST ARG NON-NUMERIC
{{PPM{ACMP8{{{JUMP IF SECOND ARG NON-NUMERIC
{{PPM{ACMP4{{{JUMP IF REAL ARGUMENTS
*
*      HERE FOR INTEGER ARGUMENTS
*
{{SBI{4*ICVAL(R10){{{SUBTRACT TO COMPARE
{{IOV{ACMP3{{{JUMP IF OVERFLOW
{{ILT{ACMP5{{{ELSE JUMP IF ARG1 LT ARG2
{{IEQ{ACMP2{{{JUMP IF ARG1 EQ ARG2
*
*      HERE IF ARG1 GT ARG2
*
{ACMP1{EXI{5{{{TAKE GT EXIT
*
*      HERE IF ARG1 EQ ARG2
*
{ACMP2{EXI{4{{{TAKE EQ EXIT
{{EJC{{{{
*
*      ACOMP (CONTINUED)
*
*      HERE FOR INTEGER OVERFLOW ON SUBTRACT
*
{ACMP3{LDI{4*ICVAL(R10){{{LOAD SECOND ARGUMENT
{{ILT{ACMP1{{{GT IF NEGATIVE
{{BRN{ACMP5{{{ELSE LT
*
*      HERE FOR REAL OPERANDS
*
{ACMP4{SBR{4*RCVAL(R10){{{SUBTRACT TO COMPARE
{{ROV{ACMP6{{{JUMP IF OVERFLOW
{{RGT{ACMP1{{{ELSE JUMP IF ARG1 GT
{{REQ{ACMP2{{{JUMP IF ARG1 EQ ARG2
*
*      HERE IF ARG1 LT ARG2
*
{ACMP5{EXI{3{{{TAKE LT EXIT
*
*      HERE IF OVERFLOW ON REAL SUBTRACTION
*
{ACMP6{LDR{4*RCVAL(R10){{{RELOAD ARG2
{{RLT{ACMP1{{{GT IF NEGATIVE
{{BRN{ACMP5{{{ELSE LT
*
*      HERE IF ARG1 NON-NUMERIC
*
{ACMP7{EXI{1{{{TAKE ERROR EXIT
*
*      HERE IF ARG2 NON-NUMERIC
*
{ACMP8{EXI{2{{{TAKE ERROR EXIT
{{ENP{{{{END PROCEDURE ACOMP
{{EJC{{{{
*
*      ALLOC                 ALLOCATE BLOCK OF DYNAMIC STORAGE
*
*      (WA)                  LENGTH REQUIRED IN BYTES
*      JSR  ALLOC            CALL TO ALLOCATE BLOCK
*      (XR)                  POINTER TO ALLOCATED BLOCK
*
*      A POSSIBLE ALTERNATIVE TO AOV .. AND FOLLOWING STMT IS -
*      MOV  DNAME,XR .  SUB  WA,XR .  BLO XR,DNAMP,ALOC2 .
*      MOV  DNAMP,XR .  ADD  WA,XR
*
{ALLOC{PRC{E{0{{ENTRY POINT
*
*      COMMON EXIT POINT
*
{ALOC1{MOV{DNAMP{R9{{POINT TO NEXT AVAILABLE LOC
{{AOV{R6{R9{ALOC2{POINT PAST ALLOCATED BLOCK
{{BGT{R9{DNAME{ALOC2{JUMP IF NOT ENOUGH ROOM
{{MOV{R9{DNAMP{{STORE NEW POINTER
{{SUB{R6{R9{{POINT BACK TO START OF ALLOCATED BK
{{EXI{{{{RETURN TO CALLER
*
*      HERE IF INSUFFICIENT ROOM, TRY A GARBAGE COLLECTION
*
{ALOC2{MOV{R7{ALLSV{{SAVE WB
{{ZER{R7{{{SET NO UPWARD MOVE FOR GBCOL
{{JSR{GBCOL{{{GARBAGE COLLECT
*
*      SEE IF ROOM AFTER GBCOL OR SYSMM CALL
*
{ALOC3{MOV{DNAMP{R9{{POINT TO FIRST AVAILABLE LOC
{{AOV{R6{R9{ALC3A{POINT PAST NEW BLOCK
{{BLO{R9{DNAME{ALOC4{JUMP IF THERE IS ROOM NOW
*
*      FAILED AGAIN, SEE IF WE CAN GET MORE CORE
*
{ALC3A{JSR{SYSMM{{{TRY TO GET MORE MEMORY
{{WTB{R9{{{CONVERT TO BAUS (SGD05)
{{ADD{R9{DNAME{{BUMP PTR BY AMOUNT OBTAINED
{{BNZ{R9{ALOC3{{JUMP IF GOT MORE CORE
{{ADD{RSMEM{DNAME{{GET THE RESERVE MEMORY
{{ZER{RSMEM{{{ONLY PERMISSIBLE ONCE
{{ICV{ERRFT{{{FATAL ERROR
{{ERB{204{MEMORY{{OVERFLOW
{{EJC{{{{
*
*      HERE AFTER SUCCESSFUL GARBAGE COLLECTION
*
{ALOC4{STI{ALLIA{{{SAVE IA
{{MOV{DNAME{R7{{GET DYNAMIC END ADRS
{{SUB{DNAMP{R7{{COMPUTE FREE STORE
{{BTW{R7{{{CONVERT BYTES TO WORDS
{{MTI{R7{{{PUT FREE STORE IN IA
{{MLI{ALFSF{{{MULTIPLY BY FREE STORE FACTOR
{{IOV{ALOC5{{{JUMP IF OVERFLOWED
{{MOV{DNAME{R7{{DYNAMIC END ADRS
{{SUB{DNAMB{R7{{COMPUTE TOTAL AMOUNT OF DYNAMIC
{{BTW{R7{{{CONVERT TO WORDS
{{MOV{R7{ALDYN{{STORE IT
{{SBI{ALDYN{{{SUBTRACT FROM SCALED UP FREE STORE
{{IGT{ALOC5{{{JUMP IF SUFFICIENT FREE STORE
{{JSR{SYSMM{{{TRY TO GET MORE STORE
{{WTB{R9{{{CONVERT TO BAUS (SGD05)
{{ADD{R9{DNAME{{ADJUST DYNAMIC END ADRS
*
*      MERGE TO RESTORE IA AND WB
*
{ALOC5{LDI{ALLIA{{{RECOVER IA
{{MOV{ALLSV{R7{{RESTORE WB
{{BRN{ALOC1{{{JUMP BACK TO EXIT
{{ENP{{{{END PROCEDURE ALLOC
{{EJC{{{{
*
*      ALOBF -- ALLOCATE BUFFER
*
*      THIS ROUTINES ALLOCATES A NEW BUFFER.  AS THE BFBLK
*      AND BCBLK COME IN PAIRS, BOTH ARE ALLOCATED HERE,
*      AND XR POINTS TO THE BCBLK ON RETURN.  THE BFBLK
*      AND BCBLK ARE SET TO THE NULL BUFFER, AND THE IDVAL
*      IS ZERO ON RETURN.
*
*      (WA)                  BUFFER SIZE IN CHARACTERS
*      JSR  ALOBF            CALL TO CREATE BUFFER
*      (XR)                  BCBLK PTR
*      (WA,WB)               DESTROYED
*
{ALOBF{PRC{E{0{{ENTRY POINT
{{MOV{R6{R7{{HANG ONTO ALLOCATION SIZE
{{CTB{R6{BFSI${{GET TOTAL BLOCK SIZE
{{BGE{R6{MXLEN{ALB01{CHECK FOR MAXLEN EXCEEDED
{{ADD{#4*BCSI${R6{{ADD IN ALLOCATION FOR BCBLK
{{JSR{ALLOC{{{ALLOCATE FRAME
{{MOV{#B$BCT{(R9){{SET TYPE
{{ZER{4*IDVAL(R9){{{NO ID YET
{{ZER{4*BCLEN(R9){{{NO DEFINED LENGTH
{{MOV{R10{R6{{SAVE XL
{{MOV{R9{R10{{COPY BCBLK PTR
{{ADD{#4*BCSI${R10{{BIAS PAST PARTIALLY BUILT BCBLK
{{MOV{#B$BFT{(R10){{SET BFBLK TYPE WORD
{{MOV{R7{4*BFALC(R10){{SET ALLOCATED SIZE
{{MOV{R10{4*BCBUF(R9){{SET POINTER IN BCBLK
{{ZER{4*BFCHR(R10){{{CLEAR FIRST WORD (NULL PAD)
{{MOV{R6{R10{{RESTORE ENTRY XL
{{EXI{{{{RETURN TO CALLER
*
*      HERE FOR MXLEN EXCEEDED
*
{ALB01{ERB{274{REQUESTED{{BUFFER ALLOCATION EXCEEDS MXLEN
{{ENP{{{{END PROCEDURE ALOBF
{{EJC{{{{
*
*      ALOCS -- ALLOCATE STRING BLOCK
*
*      ALOCS IS USED TO BUILD A FRAME FOR A STRING BLOCK INTO
*      WHICH THE ACTUAL CHARACTERS ARE PLACED BY THE CALLER.
*      ALL STRINGS ARE CREATED WITH A CALL TO ALOCS (THE
*      EXCEPTIONS OCCUR IN TRIMR AND S$RPL PROCEDURES).
*
*      (WA)                  LENGTH OF STRING TO BE ALLOCATED
*      JSR  ALOCS            CALL TO ALLOCATE SCBLK
*      (XR)                  POINTER TO RESULTING SCBLK
*      (WA)                  DESTROYED
*      (WC)                  CHARACTER COUNT (ENTRY VALUE OF WA)
*
*      THE RESULTING SCBLK HAS THE TYPE WORD AND THE LENGTH
*      FILLED IN AND THE LAST WORD IS CLEARED TO ZERO CHARACTERS
*      TO ENSURE CORRECT RIGHT PADDING OF THE FINAL WORD.
*
{ALOCS{PRC{E{0{{ENTRY POINT
{{BGT{R6{KVMXL{ALCS2{JUMP IF LENGTH EXCEEEDS MAXLENGTH
{{MOV{R6{R8{{ELSE COPY LENGTH
{{CTB{R6{SCSI${{COMPUTE LENGTH OF SCBLK IN BYTES
{{MOV{DNAMP{R9{{POINT TO NEXT AVAILABLE LOCATION
{{AOV{R6{R9{ALCS0{POINT PAST BLOCK
{{BLO{R9{DNAME{ALCS1{JUMP IF THERE IS ROOM
*
*      INSUFFICIENT MEMORY
*
{ALCS0{ZER{R9{{{ELSE CLEAR GARBAGE XR VALUE
{{JSR{ALLOC{{{AND USE STANDARD ALLOCATOR
{{ADD{R6{R9{{POINT PAST END OF BLOCK TO MERGE
*
*      MERGE HERE WITH XR POINTING BEYOND NEW BLOCK
*
{ALCS1{MOV{R9{DNAMP{{SET UPDATED STORAGE POINTER
{{ZER{-(R9){{{STORE ZERO CHARS IN LAST WORD
{{DCA{R6{{{DECREMENT LENGTH
{{SUB{R6{R9{{POINT BACK TO START OF BLOCK
{{MOV{#B$SCL{(R9){{SET TYPE WORD
{{MOV{R8{4*SCLEN(R9){{STORE LENGTH IN CHARS
{{EXI{{{{RETURN TO ALOCS CALLER
*
*      COME HERE IF STRING IS TOO LONG
*
{ALCS2{ERB{205{STRING{{LENGTH EXCEEDS VALUE OF MAXLNGTH KEYWORD
{{ENP{{{{END PROCEDURE ALOCS
{{EJC{{{{
*
*      ALOST -- ALLOCATE SPACE IN STATIC REGION
*
*      (WA)                  LENGTH REQUIRED IN BYTES
*      JSR  ALOST            CALL TO ALLOCATE SPACE
*      (XR)                  POINTER TO ALLOCATED BLOCK
*      (WB)                  DESTROYED
*
*      NOTE THAT THE CODING ENSURES THAT THE RESULTING VALUE
*      OF STATE IS ALWAYS LESS THAN DNAMB. THIS FACT IS USED
*      IN TESTING A VARIABLE NAME FOR BEING IN THE STATIC REGION
*
{ALOST{PRC{E{0{{ENTRY POINT
*
*      MERGE BACK HERE AFTER ALLOCATING NEW CHUNK
*
{ALST1{MOV{STATE{R9{{POINT TO CURRENT END OF AREA
{{AOV{R6{R9{ALST2{POINT BEYOND PROPOSED BLOCK
{{BGE{R9{DNAMB{ALST2{JUMP IF OVERLAP WITH DYNAMIC AREA
{{MOV{R9{STATE{{ELSE STORE NEW POINTER
{{SUB{R6{R9{{POINT BACK TO START OF BLOCK
{{EXI{{{{RETURN TO ALOST CALLER
*
*      HERE IF NO ROOM, PREPARE TO MOVE DYNAMIC STORAGE UP
*
{ALST2{MOV{R6{ALSTA{{SAVE WA
{{BGE{R6{#4*E$STS{ALST3{SKIP IF REQUESTED CHUNK IS LARGE
{{MOV{#4*E$STS{R6{{ELSE SET TO GET LARGE ENOUGH CHUNK
*
*      HERE WITH AMOUNT TO MOVE UP IN WA
*
{ALST3{JSR{ALLOC{{{ALLOCATE BLOCK TO ENSURE ROOM
{{MOV{R9{DNAMP{{AND DELETE IT
{{MOV{R6{R7{{COPY MOVE UP AMOUNT
{{JSR{GBCOL{{{CALL GBCOL TO MOVE DYNAMIC AREA UP
{{MOV{ALSTA{R6{{RESTORE WA
{{BRN{ALST1{{{LOOP BACK TO TRY AGAIN
{{ENP{{{{END PROCEDURE ALOST
{{EJC{{{{
*
*      APNDB -- APPEND STRING TO BUFFER
*
*      THIS ROUTINE IS USED BY BUFFER HANDLING ROUTINES TO
*      APPEND DATA TO AN EXISTING BFBLK.
*
*      (XR)                  EXISTING BCBLK TO BE APPENDED
*      (XL)                  CONVERTABLE TO STRING
*      JSR  APNDB            CALL TO APPEND TO BUFFER
*      PPM  LOC              THREAD IF (XL) CANT BE CONVERTED
*      PPM  LOC              IF NOT ENOUGH ROOM
*      (WA,WB)               DESTROYED
*
*      IF MORE CHARACTERS ARE SPECIFIED THAN CAN BE INSERTED,
*      THEN NO ACTION IS TAKEN AND THE SECOND RETURN IS TAKEN.
*
{APNDB{PRC{E{2{{ENTRY POINT
{{MOV{4*BCLEN(R9){R6{{LOAD OFFSET TO INSERT
{{ZER{R7{{{REPLACE SECTION IS NULL
{{JSR{INSBF{{{CALL TO INSERT AT END
{{PPM{APN01{{{CONVERT ERROR
{{PPM{APN02{{{NO ROOM
{{EXI{{{{RETURN TO CALLER
*
*      HERE TO TAKE CONVERT FAILURE EXIT
*
{APN01{EXI{1{{{RETURN TO CALLER ALTERNATE
*
*      HERE FOR NO FIT EXIT
*
{APN02{EXI{2{{{ALTERNATE EXIT TO CALLER
{{ENP{{{{END PROCEDURE APNDB
{{EJC{{{{
*
*      ARITH -- FETCH ARITHMETIC OPERANDS
*
*      ARITH IS USED BY FUNCTIONS AND OPERATORS WHICH EXPECT
*      TWO NUMERIC ARGUMENTS (OPERANDS) WHICH MUST BOTH BE
*      INTEGER OR BOTH BE REAL. ARITH FETCHES TWO ARGUMENTS FROM
*      THE STACK AND PERFORMS ANY NECESSARY CONVERSIONS.
*
*      1(XS)                 FIRST ARGUMENT (LEFT OPERAND)
*      0(XS)                 SECOND ARGUMENT (RIGHT OPERAND)
*      JSR  ARITH            CALL TO FETCH NUMERIC ARGUMENTS
*      PPM  LOC              TRANSFER LOC FOR OPND 1 NON-NUMERIC
*      PPM  LOC              TRANSFER LOC FOR OPND 2 NON-NUMERIC
*      PPM  LOC              TRANSFER LOC FOR REAL OPERANDS
*
*      FOR INTEGER ARGS, CONTROL RETURNS PAST THE PARAMETERS
*
*      (IA)                  LEFT OPERAND VALUE
*      (XR)                  PTR TO ICBLK FOR LEFT OPERAND
*      (XL)                  PTR TO ICBLK FOR RIGHT OPERAND
*      (XS)                  POPPED TWICE
*      (WA,WB,RA)            DESTROYED
*
*      FOR REAL ARGUMENTS, CONTROL RETURNS TO THE LOCATION
*      SPECIFIED BY THE THIRD PARAMETER.
*
*      (RA)                  LEFT OPERAND VALUE
*      (XR)                  PTR TO RCBLK FOR LEFT OPERAND
*      (XL)                  PTR TO RCBLK FOR RIGHT OPERAND
*      (WA,WB,WC)            DESTROYED
*      (XS)                  POPPED TWICE
{{EJC{{{{
*
*      ARITH (CONTINUED)
*
*      ENTRY POINT
*
{ARITH{PRC{N{3{{ENTRY POINT
{{MOV{(SP)+{R10{{LOAD RIGHT OPERAND
{{MOV{(SP)+{R9{{LOAD LEFT OPERAND
{{MOV{(R10){R6{{GET RIGHT OPERAND TYPE WORD
{{BEQ{R6{#B$ICL{ARTH1{JUMP IF INTEGER
{{BEQ{R6{#B$RCL{ARTH4{JUMP IF REAL
{{MOV{R9{-(SP){{ELSE REPLACE LEFT ARG ON STACK
{{MOV{R10{R9{{COPY LEFT ARG POINTER
{{JSR{GTNUM{{{CONVERT TO NUMERIC
{{PPM{ARTH6{{{JUMP IF UNCONVERTIBLE
{{MOV{R9{R10{{ELSE COPY CONVERTED RESULT
{{MOV{(R10){R6{{GET RIGHT OPERAND TYPE WORD
{{MOV{(SP)+{R9{{RELOAD LEFT ARGUMENT
{{BEQ{R6{#B$RCL{ARTH4{JUMP IF RIGHT ARG IS REAL
*
*      HERE IF RIGHT ARG IS AN INTEGER
*
{ARTH1{BNE{(R9){#B$ICL{ARTH3{JUMP IF LEFT ARG NOT INTEGER
*
*      EXIT FOR INTEGER CASE
*
{ARTH2{LDI{4*ICVAL(R9){{{LOAD LEFT OPERAND VALUE
{{EXI{{{{RETURN TO ARITH CALLER
*
*      HERE FOR RIGHT OPERAND INTEGER, LEFT OPERAND NOT
*
{ARTH3{JSR{GTNUM{{{CONVERT LEFT ARG TO NUMERIC
{{PPM{ARTH7{{{JUMP IF NOT CONVERTIBLE
{{BEQ{R6{#B$ICL{ARTH2{JUMP BACK IF INTEGER-INTEGER
*
*      HERE WE MUST CONVERT REAL-INTEGER TO REAL-REAL
*
{{MOV{R9{-(SP){{PUT LEFT ARG BACK ON STACK
{{LDI{4*ICVAL(R10){{{LOAD RIGHT ARGUMENT VALUE
{{ITR{{{{CONVERT TO REAL
{{JSR{RCBLD{{{GET REAL BLOCK FOR RIGHT ARG, MERGE
{{MOV{R9{R10{{COPY RIGHT ARG PTR
{{MOV{(SP)+{R9{{LOAD LEFT ARGUMENT
{{BRN{ARTH5{{{MERGE FOR REAL-REAL CASE
{{EJC{{{{
*
*      ARITH (CONTINUED)
*
*      HERE IF RIGHT ARGUMENT IS REAL
*
{ARTH4{BEQ{(R9){#B$RCL{ARTH5{JUMP IF LEFT ARG REAL
{{JSR{GTREA{{{ELSE CONVERT TO REAL
{{PPM{ARTH7{{{ERROR IF UNCONVERTIBLE
*
*      HERE FOR REAL-REAL
*
{ARTH5{LDR{4*RCVAL(R9){{{LOAD LEFT OPERAND VALUE
{{EXI{3{{{TAKE REAL-REAL EXIT
*
*      HERE FOR ERROR CONVERTING RIGHT ARGUMENT
*
{ARTH6{ICA{SP{{{POP UNWANTED LEFT ARG
{{EXI{2{{{TAKE APPROPRIATE ERROR EXIT
*
*      HERE FOR ERROR CONVERTING LEFT OPERAND
*
{ARTH7{EXI{1{{{TAKE APPROPRIATE ERROR RETURN
{{ENP{{{{END PROCEDURE ARITH
{{EJC{{{{
*
*      ASIGN -- PERFORM ASSIGNMENT
*
*      ASIGN PERFORMS THE ASSIGNMENT OF A VALUE TO A VARIABLE
*      WITH APPROPRIATE CHECKS FOR OUTPUT ASSOCIATIONS AND
*      VALUE TRACE ASSOCIATIONS WHICH ARE EXECUTED AS REQUIRED.
*      ASIGN ALSO HANDLES THE SPECIAL CASES OF ASSIGNMENT TO
*      PATTERN AND EXPRESSION VARIABLES.
*
*      (WB)                  VALUE TO BE ASSIGNED
*      (XL)                  BASE POINTER FOR VARIABLE
*      (WA)                  OFFSET FOR VARIABLE
*      JSR  ASIGN            CALL TO ASSIGN VALUE TO VARIABLE
*      PPM  LOC              TRANSFER LOC FOR FAILURE
*      (XR,XL,WA,WB,WC)      DESTROYED
*      (RA)                  DESTROYED
*
*      FAILURE OCCURS IF THE EVALUATION OF AN EXPRESSION
*      ASSOCIATED WITH AN EXPRESSION VARIABLE FAILS.
*
{ASIGN{PRC{R{1{{ENTRY POINT (RECURSIVE)
*
*      MERGE BACK HERE TO ASSIGN RESULT TO EXPRESSION VARIABLE.
*
{ASG01{ADD{R6{R10{{POINT TO VARIABLE VALUE
{{MOV{(R10){R9{{LOAD VARIABLE VALUE
{{BEQ{(R9){#B$TRT{ASG02{JUMP IF TRAPPED
{{MOV{R7{(R10){{ELSE PERFORM ASSIGNMENT
{{ZER{R10{{{CLEAR GARBAGE VALUE IN XL
{{EXI{{{{AND RETURN TO ASIGN CALLER
*
*      HERE IF VALUE IS TRAPPED
*
{ASG02{SUB{R6{R10{{RESTORE NAME BASE
{{BEQ{R9{#TRBKV{ASG14{JUMP IF KEYWORD VARIABLE
{{BNE{R9{#TRBEV{ASG04{JUMP IF NOT EXPRESSION VARIABLE
*
*      HERE FOR ASSIGNMENT TO EXPRESSION VARIABLE
*
{{MOV{4*EVEXP(R10){R9{{POINT TO EXPRESSION
{{MOV{R7{-(SP){{STORE VALUE TO ASSIGN ON STACK
{{MOV{#NUM01{R7{{SET FOR EVALUATION BY NAME
{{JSR{EVALX{{{EVALUATE EXPRESSION BY NAME
{{PPM{ASG03{{{JUMP IF EVALUATION FAILS
{{MOV{(SP)+{R7{{ELSE RELOAD VALUE TO ASSIGN
{{BRN{ASG01{{{LOOP BACK TO PERFORM ASSIGNMENT
{{EJC{{{{
*
*      ASIGN (CONTINUED)
*
*      HERE FOR FAILURE DURING EXPRESSION EVALUATION
*
{ASG03{ICA{SP{{{REMOVE STACKED VALUE ENTRY
{{EXI{1{{{TAKE FAILURE EXIT
*
*      HERE IF NOT KEYWORD OR EXPRESSION VARIABLE
*
{ASG04{MOV{R9{-(SP){{SAVE PTR TO FIRST TRBLK
*
*      LOOP TO CHASE DOWN TRBLK CHAIN AND ASSIGN VALUE AT END
*
{ASG05{MOV{R9{R8{{SAVE PTR TO THIS TRBLK
{{MOV{4*TRNXT(R9){R9{{POINT TO NEXT TRBLK
{{BEQ{(R9){#B$TRT{ASG05{LOOP BACK IF ANOTHER TRBLK
{{MOV{R8{R9{{ELSE POINT BACK TO LAST TRBLK
{{MOV{R7{4*TRVAL(R9){{STORE VALUE AT END OF CHAIN
{{MOV{(SP)+{R9{{RESTORE PTR TO FIRST TRBLK
*
*      LOOP TO PROCESS TRBLK ENTRIES ON CHAIN
*
{ASG06{MOV{4*TRTYP(R9){R7{{LOAD TYPE CODE OF TRBLK
{{BEQ{R7{#TRTVL{ASG08{JUMP IF VALUE TRACE
{{BEQ{R7{#TRTOU{ASG10{JUMP IF OUTPUT ASSOCIATION
*
*      HERE TO MOVE TO NEXT TRBLK ON CHAIN
*
{ASG07{MOV{4*TRNXT(R9){R9{{POINT TO NEXT TRBLK ON CHAIN
{{BEQ{(R9){#B$TRT{ASG06{LOOP BACK IF ANOTHER TRBLK
{{EXI{{{{ELSE END OF CHAIN, RETURN TO CALLER
*
*      HERE TO PROCESS VALUE TRACE
*
{ASG08{BZE{KVTRA{ASG07{{IGNORE VALUE TRACE IF TRACE OFF
{{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
{{BZE{4*TRFNC(R9){ASG09{{JUMP IF PRINT TRACE
{{JSR{TRXEQ{{{ELSE EXECUTE FUNCTION TRACE
{{BRN{ASG07{{{AND LOOP BACK
{{EJC{{{{
*
*      ASIGN (CONTINUED)
*
*      HERE FOR PRINT TRACE
*
{ASG09{JSR{PRTSN{{{PRINT STATEMENT NUMBER
{{JSR{PRTNV{{{PRINT NAME = VALUE
{{BRN{ASG07{{{LOOP BACK FOR NEXT TRBLK
*
*      HERE FOR OUTPUT ASSOCIATION
*
{ASG10{BZE{KVOUP{ASG07{{IGNORE OUTPUT ASSOC IF OUTPUT OFF
{{MOV{R9{R10{{ELSE COPY TRBLK POINTER
{{MOV{4*TRVAL(R8){-(SP){{STACK VALUE TO OUTPUT (SGD01)
{{JSR{GTSTG{{{CONVERT TO STRING
{{PPM{ASG12{{{GET DATATYPE NAME IF UNCONVERTIBLE
*
*      MERGE WITH STRING FOR OUTPUT
*
{ASG11{MOV{4*TRFPT(R10){R6{{FCBLK PTR
{{BZE{R6{ASG13{{JUMP IF STANDARD OUTPUT FILE
*
*      HERE FOR OUTPUT TO NON-STANDARD OUTPUT FILE
*
{{JSR{SYSOU{{{CALL SYSTEM OUTPUT ROUTINE
{{ERR{206{OUTPUT{{CAUSED FILE OVERFLOW
{{ERR{207{OUTPUT{{CAUSED NON-RECOVERABLE ERROR
{{EXI{{{{ELSE ALL DONE, RETURN TO CALLER
*
*      IF NOT PRINTABLE, GET DATATYPE NAME INSTEAD
*
{ASG12{JSR{DTYPE{{{CALL DATATYPE ROUTINE
{{BRN{ASG11{{{MERGE
*
*      HERE TO PRINT A STRING ON THE PRINTER
*
{ASG13{JSR{PRTST{{{PRINT STRING VALUE
{{BEQ{4*TRTER(R10){#V$TER{ASG20{JUMP IF TERMINAL OUTPUT
{{JSR{PRTNL{{{END OF LINE
{{EXI{{{{RETURN TO CALLER
{{EJC{{{{
*
*      ASIGN (CONTINUED)
*
*      HERE FOR KEYWORD ASSIGNMENT
*
{ASG14{MOV{4*KVNUM(R10){R10{{LOAD KEYWORD NUMBER
{{BEQ{R10{#K$ETX{ASG19{JUMP IF ERRTEXT
{{MOV{R7{R9{{COPY VALUE TO BE ASSIGNED
{{JSR{GTINT{{{CONVERT TO INTEGER
{{ERR{208{KEYWORD{{VALUE ASSIGNED IS NOT INTEGER
{{LDI{4*ICVAL(R9){{{ELSE LOAD VALUE
{{BEQ{R10{#K$STL{ASG16{JUMP IF SPECIAL CASE OF STLIMIT
{{MFI{R6{ASG18{{ELSE GET ADDR INTEGER, TEST OVFLOW
{{BGE{R6{MXLEN{ASG18{FAIL IF TOO LARGE
{{BEQ{R10{#K$ERT{ASG17{JUMP IF SPECIAL CASE OF ERRTYPE
{{BEQ{R10{#K$PFL{ASG21{JUMP IF SPECIAL CASE OF PROFILE
{{BLT{R10{#K$P$${ASG15{JUMP UNLESS PROTECTED
{{ERB{209{KEYWORD{{IN ASSIGNMENT IS PROTECTED
*
*      HERE TO DO ASSIGNMENT IF NOT PROTECTED
*
{ASG15{MOV{R6{L^KVABE(R10){{STORE NEW VALUE
{{EXI{{{{RETURN TO ASIGN CALLER
*
*      HERE FOR SPECIAL CASE OF STLIMIT
*
*      SINCE STCOUNT IS MAINTAINED AS (STLIMIT-STCOUNT)
*      IT IS ALSO NECESSARY TO MODIFY STCOUNT APPROPRIATELY.
*
{ASG16{SBI{KVSTL{{{SUBTRACT OLD LIMIT
{{ADI{KVSTC{{{ADD OLD COUNTER
{{STI{KVSTC{{{STORE NEW COUNTER VALUE
{{LDI{4*ICVAL(R9){{{RELOAD NEW LIMIT VALUE
{{STI{KVSTL{{{STORE NEW LIMIT VALUE
{{EXI{{{{RETURN TO ASIGN CALLER
*
*      HERE FOR SPECIAL CASE OF ERRTYPE
*
{ASG17{BLE{R6{#NINI9{ERROR{OK TO SIGNAL IF IN RANGE
*
*      HERE IF VALUE ASSIGNED IS OUT OF RANGE
*
{ASG18{ERB{210{KEYWORD{{VALUE ASSIGNED IS NEGATIVE OR TOO LARGE
*
*      HERE FOR SPECIAL CASE OF ERRTEXT
*
{ASG19{MOV{R7{-(SP){{STACK VALUE
{{JSR{GTSTG{{{CONVERT TO STRING
{{ERR{211{VALUE{{ASSIGNED TO KEYWORD ERRTEXT NOT A STRING
{{MOV{R9{R$ETX{{MAKE ASSIGNMENT
{{EXI{{{{RETURN TO CALLER
*
*      PRINT STRING TO TERMINAL
*
{ASG20{JSR{PRTTR{{{PRINT
{{EXI{{{{RETURN
*
*      HERE FOR KEYWORD PROFILE
*
{ASG21{BGT{R6{#NUM02{ASG18{MOAN IF NOT 0,1, OR 2
{{BZE{R6{ASG15{{JUST ASSIGN IF ZERO
{{BZE{PFDMP{ASG22{{BRANCH IF FIRST ASSIGNMENT
{{BEQ{R6{PFDMP{ASG23{ALSO IF SAME VALUE AS BEFORE
{{ERB{268{INCONSISTENT{{VALUE ASSIGNED TO KEYWORD PROFILE
*
{ASG22{MOV{R6{PFDMP{{NOTE VALUE ON FIRST ASSIGNMENT
{ASG23{JSR{SYSTM{{{GET THE TIME
{{STI{PFSTM{{{FUDGE SOME KIND OF START TIME
{{BRN{ASG15{{{AND GO ASSIGN
{{ENP{{{{END PROCEDURE ASIGN
{{EJC{{{{
*
*      ASINP -- ASSIGN DURING PATTERN MATCH
*
*      ASINP IS LIKE ASIGN AND HAS A SIMILAR CALLING SEQUENCE
*      AND EFFECT. THE DIFFERENCE IS THAT THE GLOBAL PATTERN
*      VARIABLES ARE SAVED AND RESTORED IF REQUIRED.
*
*      (XL)                  BASE POINTER FOR VARIABLE
*      (WA)                  OFFSET FOR VARIABLE
*      (WB)                  VALUE TO BE ASSIGNED
*      JSR  ASINP            CALL TO ASSIGN VALUE TO VARIABLE
*      PPM  LOC              TRANSFER LOC IF FAILURE
*      (XR,XL)               DESTROYED
*      (WA,WB,WC,RA)         DESTROYED
*
{ASINP{PRC{R{1{{ENTRY POINT, RECURSIVE
{{ADD{R6{R10{{POINT TO VARIABLE
{{MOV{(R10){R9{{LOAD CURRENT CONTENTS
{{BEQ{(R9){#B$TRT{ASNP1{JUMP IF TRAPPED
{{MOV{R7{(R10){{ELSE PERFORM ASSIGNMENT
{{ZER{R10{{{CLEAR GARBAGE VALUE IN XL
{{EXI{{{{RETURN TO ASINP CALLER
*
*      HERE IF VARIABLE IS TRAPPED
*
{ASNP1{SUB{R6{R10{{RESTORE BASE POINTER
{{MOV{PMSSL{-(SP){{STACK SUBJECT STRING LENGTH
{{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE PTR
{{MOV{R$PMS{-(SP){{STACK SUBJECT STRING POINTER
{{MOV{PMDFL{-(SP){{STACK DOT FLAG
{{JSR{ASIGN{{{CALL FULL-BLOWN ASSIGNMENT ROUTINE
{{PPM{ASNP2{{{JUMP IF FAILURE
{{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
{{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
{{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
{{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
{{EXI{{{{RETURN TO ASINP CALLER
*
*      HERE IF FAILURE IN ASIGN CALL
*
{ASNP2{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
{{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
{{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
{{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
{{EXI{1{{{TAKE FAILURE EXIT
{{ENP{{{{END PROCEDURE ASINP
{{EJC{{{{
*
*      BLKLN -- DETERMINE LENGTH OF BLOCK
*
*      BLKLN DETERMINES THE LENGTH OF A BLOCK IN DYNAMIC STORE.
*
*      (WA)                  FIRST WORD OF BLOCK
*      (XR)                  POINTER TO BLOCK
*      JSR  BLKLN            CALL TO GET BLOCK LENGTH
*      (WA)                  LENGTH OF BLOCK IN BYTES
*      (XL)                  DESTROYED
*
*      BLKLN IS USED BY THE GARBAGE COLLECTOR AND IS NOT
*      PERMITTED TO CALL GBCOL DIRECTLY OR INDIRECTLY.
*
*      THE FIRST WORD STORED IN THE BLOCK (I.E. AT XR) MAY
*      BE ANYTHING, BUT THE CONTENTS OF WA MUST BE CORRECT.
*
{BLKLN{PRC{E{0{{ENTRY POINT
{{MOV{R6{R10{{COPY FIRST WORD
{{LEI{R10{{{GET ENTRY ID (BL$XX)
{{BSW{R10{BL$$${BLN00{SWITCH ON BLOCK TYPE
{{IFF{BL$AR{BLN01{{ARBLK
{{IFF{BL$BC{BLN04{{BCBLK
{{IFF{BL$CD{BLN01{{CDBLK
{{IFF{BL$EX{BLN01{{EXBLK
{{IFF{BL$IC{BLN07{{ICBLK
{{IFF{BL$NM{BLN03{{NMBLK
{{IFF{BL$P0{BLN02{{P0BLK
{{IFF{BL$P1{BLN03{{P1BLK
{{IFF{BL$P2{BLN04{{P2BLK
{{IFF{BL$RC{BLN09{{RCBLK
{{IFF{BL$SC{BLN10{{SCBLK
{{IFF{BL$SE{BLN02{{SEBLK
{{IFF{BL$TB{BLN01{{TBBLK
{{IFF{BL$VC{BLN01{{VCBLK
{{IFF{DUMMY{BLN00{{
{{IFF{DUMMY{BLN00{{
{{IFF{BL$PD{BLN08{{PDBLK
{{IFF{BL$TR{BLN05{{TRBLK
{{IFF{BL$BF{BLN11{{BFBLK
{{IFF{DUMMY{BLN00{{
{{IFF{DUMMY{BLN00{{
{{IFF{BL$CT{BLN06{{CTBLK
{{IFF{BL$DF{BLN01{{DFBLK
{{IFF{BL$EF{BLN01{{EFBLK
{{IFF{BL$EV{BLN03{{EVBLK
{{IFF{BL$FF{BLN05{{FFBLK
{{IFF{BL$KV{BLN03{{KVBLK
{{IFF{BL$PF{BLN01{{PFBLK
{{IFF{BL$TE{BLN04{{TEBLK
{{ESW{{{{END OF JUMP TABLE ON BLOCK TYPE
{{EJC{{{{
*
*      BLKLN (CONTINUED)
*
*      HERE FOR BLOCKS WITH LENGTH IN SECOND WORD
*
{BLN00{MOV{4*1(R9){R6{{LOAD LENGTH
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR LENGTH IN THIRD WORD (AR,CD,DF,EF,EX,PF,TB,VC)
*
{BLN01{MOV{4*2(R9){R6{{LOAD LENGTH FROM THIRD WORD
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR TWO WORD BLOCKS (P0,SE)
*
{BLN02{MOV{#4*NUM02{R6{{LOAD LENGTH (TWO WORDS)
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR THREE WORD BLOCKS (NM,P1,EV,KV)
*
{BLN03{MOV{#4*NUM03{R6{{LOAD LENGTH (THREE WORDS)
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR FOUR WORD BLOCKS (P2,TE,BC)
*
{BLN04{MOV{#4*NUM04{R6{{LOAD LENGTH (FOUR WORDS)
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR FIVE WORD BLOCKS (FF,TR)
*
{BLN05{MOV{#4*NUM05{R6{{LOAD LENGTH
{{EXI{{{{RETURN TO BLKLN CALLER
{{EJC{{{{
*
*      BLKLN (CONTINUED)
*
*      HERE FOR CTBLK
*
{BLN06{MOV{#4*CTSI${R6{{SET SIZE OF CTBLK
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR ICBLK
*
{BLN07{MOV{#4*ICSI${R6{{SET SIZE OF ICBLK
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR PDBLK
*
{BLN08{MOV{4*PDDFP(R9){R10{{POINT TO DFBLK
{{MOV{4*DFPDL(R10){R6{{LOAD PDBLK LENGTH FROM DFBLK
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR RCBLK
*
{BLN09{MOV{#4*RCSI${R6{{SET SIZE OF RCBLK
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR SCBLK
*
{BLN10{MOV{4*SCLEN(R9){R6{{LOAD LENGTH IN CHARACTERS
{{CTB{R6{SCSI${{CALCULATE LENGTH IN BYTES
{{EXI{{{{RETURN TO BLKLN CALLER
*
*      HERE FOR BFBLK
*
{BLN11{MOV{4*BFALC(R9){R6{{GET ALLOCATION IN BYTES
{{CTB{R6{BFSI${{CALCULATE LENGTH IN BYTES
{{EXI{{{{RETURN TO BLKLN CALLER
{{ENP{{{{END PROCEDURE BLKLN
{{EJC{{{{
*
*      COPYB -- COPY A BLOCK
*
*      (XS)                  BLOCK TO BE COPIED
*      JSR  COPYB            CALL TO COPY BLOCK
*      PPM  LOC              RETURN IF BLOCK HAS NO IDVAL FIELD
*                            NORMAL RETURN IF IDVAL FIELD
*      (XR)                  COPY OF BLOCK
*      (XS)                  POPPED
*      (XL,WA,WB,WC)         DESTROYED
*
{COPYB{PRC{N{1{{ENTRY POINT
{{MOV{(SP){R9{{LOAD ARGUMENT
{{BEQ{R9{#NULLS{COP10{RETURN ARGUMENT IF IT IS NULL
{{MOV{(R9){R6{{ELSE LOAD TYPE WORD
{{MOV{R6{R7{{COPY TYPE WORD
{{JSR{BLKLN{{{GET LENGTH OF ARGUMENT BLOCK
{{MOV{R9{R10{{COPY POINTER
{{JSR{ALLOC{{{ALLOCATE BLOCK OF SAME SIZE
{{MOV{R9{(SP){{STORE POINTER TO COPY
{{MVW{{{{COPY CONTENTS OF OLD BLOCK TO NEW
{{MOV{(SP){R9{{RELOAD POINTER TO START OF COPY
{{BEQ{R7{#B$TBT{COP05{JUMP IF TABLE
{{BEQ{R7{#B$VCT{COP01{JUMP IF VECTOR
{{BEQ{R7{#B$PDT{COP01{JUMP IF PROGRAM DEFINED
{{BEQ{R7{#B$BCT{COP11{JUMP IF BUFFER
{{BNE{R7{#B$ART{COP10{RETURN COPY IF NOT ARRAY
*
*      HERE FOR ARRAY (ARBLK)
*
{{ADD{4*AROFS(R9){R9{{POINT TO PROTOTYPE FIELD
{{BRN{COP02{{{JUMP TO MERGE
*
*      HERE FOR VECTOR, PROGRAM DEFINED
*
{COP01{ADD{#4*PDFLD{R9{{POINT TO PDFLD = VCVLS
*
*      MERGE HERE FOR ARBLK, VCBLK, PDBLK TO DELETE TRAP
*      BLOCKS FROM ALL VALUE FIELDS (THE COPY IS UNTRAPPED)
*
{COP02{MOV{(R9){R10{{LOAD NEXT POINTER
*
*      LOOP TO GET VALUE AT END OF TRBLK CHAIN
*
{COP03{BNE{(R10){#B$TRT{COP04{JUMP IF NOT TRAPPED
{{MOV{4*TRVAL(R10){R10{{ELSE POINT TO NEXT VALUE
{{BRN{COP03{{{AND LOOP BACK
{{EJC{{{{
*
*      COPYB (CONTINUED)
*
*      HERE WITH UNTRAPPED VALUE IN XL
*
{COP04{MOV{R10{(R9)+{{STORE REAL VALUE, BUMP POINTER
{{BNE{R9{DNAMP{COP02{LOOP BACK IF MORE TO GO
{{BRN{COP09{{{ELSE JUMP TO EXIT
*
*      HERE TO COPY A TABLE
*
{COP05{ZER{4*IDVAL(R9){{{ZERO ID TO STOP DUMP BLOWING UP
{{MOV{#4*TESI${R6{{SET SIZE OF TEBLK
{{MOV{#4*TBBUK{R8{{SET INITIAL OFFSET
*
*      LOOP THROUGH BUCKETS IN TABLE
*
{COP06{MOV{(SP){R9{{LOAD TABLE POINTER
{{BEQ{R8{4*TBLEN(R9){COP09{JUMP TO EXIT IF ALL DONE
{{ADD{R8{R9{{ELSE POINT TO NEXT BUCKET HEADER
{{ICA{R8{{{BUMP OFFSET
{{SUB{#4*TENXT{R9{{SUBTRACT LINK OFFSET TO MERGE
*
*      LOOP THROUGH TEBLKS ON ONE CHAIN
*
{COP07{MOV{4*TENXT(R9){R10{{LOAD POINTER TO NEXT TEBLK
{{MOV{(SP){4*TENXT(R9){{SET END OF CHAIN POINTER IN CASE
{{BEQ{(R10){#B$TBT{COP06{BACK FOR NEXT BUCKET IF CHAIN END
{{MOV{R9{-(SP){{ELSE STACK PTR TO PREVIOUS BLOCK
{{MOV{#4*TESI${R6{{SET SIZE OF TEBLK
{{JSR{ALLOC{{{ALLOCATE NEW TEBLK
{{MOV{R9{R7{{SAVE PTR TO NEW TEBLK
{{MVW{{{{COPY OLD TEBLK TO NEW TEBLK
{{MOV{R7{R9{{RESTORE POINTER TO NEW TEBLK
{{MOV{(SP)+{R10{{RESTORE POINTER TO PREVIOUS BLOCK
{{MOV{R9{4*TENXT(R10){{LINK NEW BLOCK TO PREVIOUS
{{MOV{R9{R10{{COPY POINTER TO NEW BLOCK
*
*      LOOP TO SET REAL VALUE AFTER REMOVING TRAP CHAIN
*
{COP08{MOV{4*TEVAL(R10){R10{{LOAD VALUE
{{BEQ{(R10){#B$TRT{COP08{LOOP BACK IF TRAPPED
{{MOV{R10{4*TEVAL(R9){{STORE UNTRAPPED VALUE IN TEBLK
{{BRN{COP07{{{BACK FOR NEXT TEBLK
*
*      COMMON EXIT POINT
*
{COP09{MOV{(SP)+{R9{{LOAD POINTER TO BLOCK
{{EXI{{{{RETURN
*
*      ALTERNATIVE RETURN
*
{COP10{EXI{1{{{RETURN
{{EJC{{{{
*
*      HERE TO COPY BUFFER
*
{COP11{MOV{4*BCBUF(R9){R10{{GET BFBLK PTR
{{MOV{4*BFALC(R10){R6{{GET ALLOCATION
{{CTB{R6{BFSI${{SET TOTAL SIZE
{{MOV{R9{R10{{SAVE BCBLK PTR
{{JSR{ALLOC{{{ALLOCATE BFBLK
{{MOV{4*BCBUF(R10){R7{{GET OLD BFBLK
{{MOV{R9{4*BCBUF(R10){{SET POINTER TO NEW BFBLK
{{MOV{R7{R10{{POINT TO OLD BFBLK
{{MVW{{{{COPY BFBLK TOO
{{ZER{R10{{{CLEAR RUBBISH PTR
{{BRN{COP09{{{BRANCH TO EXIT
{{ENP{{{{END PROCEDURE COPYB
*
*      CDGCG -- GENERATE CODE FOR COMPLEX GOTO
*
*      USED BY CMPIL TO PROCESS COMPLEX GOTO TREE
*
*      (WB)                  MUST BE COLLECTABLE
*      (XR)                  EXPRESSION POINTER
*      JSR  CDGCG            CALL TO GENERATE COMPLEX GOTO
*      (XL,XR,WA)            DESTROYED
*
{CDGCG{PRC{E{0{{ENTRY POINT
{{MOV{4*CMOPN(R9){R10{{GET UNARY GOTO OPERATOR
{{MOV{4*CMROP(R9){R9{{POINT TO GOTO OPERAND
{{BEQ{R10{#OPDVD{CDGC2{JUMP IF DIRECT GOTO
{{JSR{CDGNM{{{GENERATE OPND BY NAME IF NOT DIRECT
*
*      RETURN POINT
*
{CDGC1{MOV{R10{R6{{GOTO OPERATOR
{{JSR{CDWRD{{{GENERATE IT
{{EXI{{{{RETURN TO CALLER
*
*      DIRECT GOTO
*
{CDGC2{JSR{CDGVL{{{GENERATE OPERAND BY VALUE
{{BRN{CDGC1{{{MERGE TO RETURN
{{ENP{{{{END PROCEDURE CDGCG
{{EJC{{{{
*
*      CDGEX -- BUILD EXPRESSION BLOCK
*
*      CDGEX IS PASSED A POINTER TO AN EXPRESSION TREE (SEE
*      EXPAN) AND RETURNS AN EXPRESSION (SEBLK OR EXBLK).
*
*      (WC)                  SOME COLLECTABLE VALUE
*      (WB)                  INTEGER IN RANGE 0 LE X LE MXLEN
*      (XL)                  PTR TO EXPRESSION TREE
*      JSR  CDGEX            CALL TO BUILD EXPRESSION
*      (XR)                  PTR TO SEBLK OR EXBLK
*      (XL,WA,WB)            DESTROYED
*
{CDGEX{PRC{R{0{{ENTRY POINT, RECURSIVE
{{BLO{(R10){#B$VR${CDGX1{JUMP IF NOT VARIABLE
*
*      HERE FOR NATURAL VARIABLE, BUILD SEBLK
*
{{MOV{#4*SESI${R6{{SET SIZE OF SEBLK
{{JSR{ALLOC{{{ALLOCATE SPACE FOR SEBLK
{{MOV{#B$SEL{(R9){{SET TYPE WORD
{{MOV{R10{4*SEVAR(R9){{STORE VRBLK POINTER
{{EXI{{{{RETURN TO CDGEX CALLER
*
*      HERE IF NOT VARIABLE, BUILD EXBLK
*
{CDGX1{MOV{R10{R9{{COPY TREE POINTER
{{MOV{R8{-(SP){{SAVE WC
{{MOV{CWCOF{R10{{SAVE CURRENT OFFSET
{{MOV{(R9){R6{{GET TYPE WORD
{{BNE{R6{#B$CMT{CDGX2{CALL BY VALUE IF NOT CMBLK
{{BGE{4*CMTYP(R9){#C$$NM{CDGX2{JUMP IF CMBLK ONLY BY VALUE
{{EJC{{{{
*
*      CDGEX (CONTINUED)
*
*      HERE IF EXPRESSION CAN BE EVALUATED BY NAME
*
{{JSR{CDGNM{{{GENERATE CODE BY NAME
{{MOV{#ORNM${R6{{LOAD RETURN BY NAME WORD
{{BRN{CDGX3{{{MERGE WITH VALUE CASE
*
*      HERE IF EXPRESSION CAN ONLY BE EVALUATED BY VALUE
*
{CDGX2{JSR{CDGVL{{{GENERATE CODE BY VALUE
{{MOV{#ORVL${R6{{LOAD RETURN BY VALUE WORD
*
*      MERGE HERE TO CONSTRUCT EXBLK
*
{CDGX3{JSR{CDWRD{{{GENERATE RETURN WORD
{{JSR{EXBLD{{{BUILD EXBLK
{{MOV{(SP)+{R8{{RESTORE WC
{{EXI{{{{RETURN TO CDGEX CALLER
{{ENP{{{{END PROCEDURE CDGEX
{{EJC{{{{
*
*      CDGNM -- GENERATE CODE BY NAME
*
*      CDGNM IS CALLED DURING THE COMPILATION PROCESS TO
*      GENERATE CODE BY NAME FOR AN EXPRESSION. SEE CDBLK
*      DESCRIPTION FOR DETAILS OF CODE GENERATED. THE INPUT
*      TO CDGNM IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
*
*      CDGNM IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
*      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
*
*      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
*      (XR)                  PTR TO TREE GENERATED BY EXPAN
*      (WC)                  CONSTANT FLAG (SEE BELOW)
*      JSR  CDGNM            CALL TO GENERATE CODE BY NAME
*      (XR,WA)               DESTROYED
*      (WC)                  SET NON-ZERO IF NON-CONSTANT
*
*      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
*      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
*      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
*
*      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
*
{CDGNM{PRC{R{0{{ENTRY POINT, RECURSIVE
{{MOV{R10{-(SP){{SAVE ENTRY XL
{{MOV{R7{-(SP){{SAVE ENTRY WB
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{MOV{(R9){R6{{LOAD TYPE WORD
{{BEQ{R6{#B$CMT{CGN04{JUMP IF CMBLK
{{BHI{R6{#B$VR${CGN02{JUMP IF SIMPLE VARIABLE
*
*      MERGE HERE FOR OPERAND YIELDING VALUE (E.G. CONSTANT)
*
{CGN01{ERB{212{SYNTAX{{ERROR. VALUE USED WHERE NAME IS REQUIRED
*
*      HERE FOR NATURAL VARIABLE REFERENCE
*
{CGN02{MOV{#OLVN${R6{{LOAD VARIABLE LOAD CALL
{{JSR{CDWRD{{{GENERATE IT
{{MOV{R9{R6{{COPY VRBLK POINTER
{{JSR{CDWRD{{{GENERATE VRBLK POINTER
{{EJC{{{{
*
*      CDGNM (CONTINUED)
*
*      HERE TO EXIT WITH WC SET CORRECTLY
*
{CGN03{MOV{(SP)+{R7{{RESTORE ENTRY WB
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{EXI{{{{RETURN TO CDGNM CALLER
*
*      HERE FOR CMBLK
*
{CGN04{MOV{R9{R10{{COPY CMBLK POINTER
{{MOV{4*CMTYP(R9){R9{{LOAD CMBLK TYPE
{{BGE{R9{#C$$NM{CGN01{ERROR IF NOT NAME OPERAND
{{BSW{R9{C$$NM{{ELSE SWITCH ON TYPE
{{IFF{C$ARR{CGN05{{ARRAY REFERENCE
{{IFF{C$FNC{CGN08{{FUNCTION CALL
{{IFF{C$DEF{CGN09{{DEFERRED EXPRESSION
{{IFF{C$IND{CGN10{{INDIRECT REFERENCE
{{IFF{C$KEY{CGN11{{KEYWORD REFERENCE
{{IFF{C$UBO{CGN08{{UNDEFINED BINARY OP
{{IFF{C$UUO{CGN08{{UNDEFINED UNARY OP
{{ESW{{{{END SWITCH ON CMBLK TYPE
*
*      HERE TO GENERATE CODE FOR ARRAY REFERENCE
*
{CGN05{MOV{#4*CMOPN{R7{{POINT TO ARRAY OPERAND
*
*      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
*
{CGN06{JSR{CMGEN{{{GENERATE CODE FOR NEXT OPERAND
{{MOV{4*CMLEN(R10){R8{{LOAD LENGTH OF CMBLK
{{BLT{R7{R8{CGN06{LOOP TILL ALL GENERATED
*
*      GENERATE APPROPRIATE ARRAY CALL
*
{{MOV{#OAON${R6{{LOAD ONE-SUBSCRIPT CASE CALL
{{BEQ{R8{#4*CMAR1{CGN07{JUMP TO EXIT IF ONE SUBSCRIPT CASE
{{MOV{#OAMN${R6{{ELSE LOAD MULTI-SUBSCRIPT CASE CALL
{{JSR{CDWRD{{{GENERATE CALL
{{MOV{R8{R6{{COPY CMBLK LENGTH
{{BTW{R6{{{CONVERT TO WORDS
{{SUB{#CMVLS{R6{{CALCULATE NUMBER OF SUBSCRIPTS
{{EJC{{{{
*
*      CDGNM (CONTINUED)
*
*      HERE TO EXIT GENERATING WORD (NON-CONSTANT)
*
{CGN07{MNZ{R8{{{SET RESULT NON-CONSTANT
{{JSR{CDWRD{{{GENERATE WORD
{{BRN{CGN03{{{BACK TO EXIT
*
*      HERE TO GENERATE CODE FOR FUNCTIONS AND UNDEFINED OPRS
*
{CGN08{MOV{R10{R9{{COPY CMBLK POINTER
{{JSR{CDGVL{{{GEN CODE BY VALUE FOR CALL
{{MOV{#OFNE${R6{{GET EXTRA CALL FOR BY NAME
{{BRN{CGN07{{{BACK TO GENERATE AND EXIT
*
*      HERE TO GENERATE CODE FOR DEFERED EXPRESSION
*
{CGN09{MOV{4*CMROP(R10){R9{{CHECK IF VARIABLE
{{BHI{(R9){#B$VR${CGN02{TREAT *VARIABLE AS SIMPLE VAR
{{MOV{R9{R10{{COPY PTR TO EXPRESSION TREE
{{JSR{CDGEX{{{ELSE BUILD EXBLK
{{MOV{#OLEX${R6{{SET CALL TO LOAD EXPR BY NAME
{{JSR{CDWRD{{{GENERATE IT
{{MOV{R9{R6{{COPY EXBLK POINTER
{{JSR{CDWRD{{{GENERATE EXBLK POINTER
{{BRN{CGN03{{{BACK TO EXIT
*
*      HERE TO GENERATE CODE FOR INDIRECT REFERENCE
*
{CGN10{MOV{4*CMROP(R10){R9{{GET OPERAND
{{JSR{CDGVL{{{GENERATE CODE BY VALUE FOR IT
{{MOV{#OINN${R6{{LOAD CALL FOR INDIRECT BY NAME
{{BRN{CGN12{{{MERGE
*
*      HERE TO GENERATE CODE FOR KEYWORD REFERENCE
*
{CGN11{MOV{4*CMROP(R10){R9{{GET OPERAND
{{JSR{CDGNM{{{GENERATE CODE BY NAME FOR IT
{{MOV{#OKWN${R6{{LOAD CALL FOR KEYWORD BY NAME
*
*      KEYWORD, INDIRECT MERGE HERE
*
{CGN12{JSR{CDWRD{{{GENERATE CODE FOR OPERATOR
{{BRN{CGN03{{{EXIT
{{ENP{{{{END PROCEDURE CDGNM
{{EJC{{{{
*
*      CDGVL -- GENERATE CODE BY VALUE
*
*      CDGVL IS CALLED DURING THE COMPILATION PROCESS TO
*      GENERATE CODE BY VALUE FOR AN EXPRESSION. SEE CDBLK
*      DESCRIPTION FOR DETAILS OF THE CODE GENERATED. THE INPUT
*      TO CDGVL IS AN EXPRESSION TREE AS GENERATED BY EXPAN.
*
*      CDGVL IS A RECURSIVE PROCEDURE WHICH PROCEEDS BY MAKING
*      RECURSIVE CALLS TO GENERATE CODE FOR OPERANDS.
*
*      (WB)                  INTEGER IN RANGE 0 LE N LE DNAMB
*      (XR)                  PTR TO TREE GENERATED BY EXPAN
*      (WC)                  CONSTANT FLAG (SEE BELOW)
*      JSR  CDGVL            CALL TO GENERATE CODE BY VALUE
*      (XR,WA)               DESTROYED
*      (WC)                  SET NON-ZERO IF NON-CONSTANT
*
*      WC IS SET TO A NON-ZERO (COLLECTABLE) VALUE IF THE
*      EXPRESSION FOR WHICH CODE IS GENERATED CANNOT BE
*      EVALUATED AT COMPILE TIME, OTHERWISE WC IS UNCHANGED.
*
*      IF WC IS NON-ZERO ON ENTRY, THEN PREEVALUATION IS NOT
*      ALLOWED REGARDLESS OF THE NATURE OF THE OPERAND.
*
*      THE CODE IS GENERATED IN THE CURRENT CCBLK (SEE CDWRD).
*
{CDGVL{PRC{R{0{{ENTRY POINT, RECURSIVE
{{MOV{(R9){R6{{LOAD TYPE WORD
{{BEQ{R6{#B$CMT{CGV01{JUMP IF CMBLK
{{BLT{R6{#B$VRA{CGV00{JUMP IF ICBLK, RCBLK, SCBLK
{{BNZ{4*VRLEN(R9){CGVL0{{JUMP IF NOT SYSTEM VARIABLE
{{MOV{R9{-(SP){{STACK XR
{{MOV{4*VRSVP(R9){R9{{POINT TO SVBLK
{{MOV{4*SVBIT(R9){R6{{GET SVBLK PROPERTY BITS
{{MOV{(SP)+{R9{{RECOVER XR
{{ANB{BTCKW{R6{{CHECK IF CONSTANT KEYWORD
{{NZB{R6{CGV00{{JUMP IF CONSTANT KEYWORD
*
*      HERE FOR VARIABLE VALUE REFERENCE
*
{CGVL0{MNZ{R8{{{INDICATE NON-CONSTANT VALUE
*
*      MERGE HERE FOR SIMPLE CONSTANT (ICBLK,RCBLK,SCBLK)
*      AND FOR VARIABLES CORRESPONDING TO CONSTANT KEYWORDS.
*
{CGV00{MOV{R9{R6{{COPY PTR TO VAR OR CONSTANT
{{JSR{CDWRD{{{GENERATE AS CODE WORD
{{EXI{{{{RETURN TO CALLER
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE FOR TREE NODE (CMBLK)
*
{CGV01{MOV{R7{-(SP){{SAVE ENTRY WB
{{MOV{R10{-(SP){{SAVE ENTRY XL
{{MOV{R8{-(SP){{SAVE ENTRY CONSTANT FLAG
{{MOV{CWCOF{-(SP){{SAVE INITIAL CODE OFFSET
{{CHK{{{{CHECK FOR STACK OVERFLOW
*
*      PREPARE TO GENERATE CODE FOR CMBLK. WC IS SET TO THE
*      VALUE OF CSWNO (ZERO IF -OPTIMISE, 1 IF -NOOPT) TO
*      START WITH AND IS RESET NON-ZERO FOR ANY NON-CONSTANT
*      CODE GENERATED. IF IT IS STILL ZERO AFTER GENERATING ALL
*      THE CMBLK CODE, THEN ITS VALUE IS COMPUTED AS THE RESULT.
*
{{MOV{R9{R10{{COPY CMBLK POINTER
{{MOV{4*CMTYP(R9){R9{{LOAD CMBLK TYPE
{{MOV{CSWNO{R8{{RESET CONSTANT FLAG
{{BLE{R9{#C$PR${CGV02{JUMP IF NOT PREDICATE VALUE
{{MNZ{R8{{{ELSE FORCE NON-CONSTANT CASE
*
*      HERE WITH WC SET APPROPRIATELY
*
{CGV02{BSW{R9{C$$NV{{SWITCH TO APPROPRIATE GENERATOR
{{IFF{C$ARR{CGV03{{ARRAY REFERENCE
{{IFF{C$FNC{CGV05{{FUNCTION CALL
{{IFF{C$DEF{CGV14{{DEFERRED EXPRESSION
{{IFF{C$IND{CGV31{{INDIRECT REFERENCE
{{IFF{C$KEY{CGV27{{KEYWORD REFERENCE
{{IFF{C$UBO{CGV29{{UNDEFINED BINOP
{{IFF{C$UUO{CGV30{{UNDEFINED UNOP
{{IFF{C$BVL{CGV18{{BINOPS WITH VAL OPDS
{{IFF{C$UVL{CGV19{{UNOPS WITH VALU OPND
{{IFF{C$ALT{CGV18{{ALTERNATION
{{IFF{C$CNC{CGV24{{CONCATENATION
{{IFF{C$CNP{CGV24{{CONCATENATION (NOT PATTERN MATCH)
{{IFF{C$UNM{CGV27{{UNOPS WITH NAME OPND
{{IFF{C$BVN{CGV26{{BINARY $ AND .
{{IFF{C$ASS{CGV21{{ASSIGNMENT
{{IFF{C$INT{CGV31{{INTERROGATION
{{IFF{C$NEG{CGV28{{NEGATION
{{IFF{C$SEL{CGV15{{SELECTION
{{IFF{C$PMT{CGV18{{PATTERN MATCH
{{ESW{{{{END SWITCH ON CMBLK TYPE
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE TO GENERATE CODE FOR ARRAY REFERENCE
*
{CGV03{MOV{#4*CMOPN{R7{{SET OFFSET TO ARRAY OPERAND
*
*      LOOP TO GENERATE CODE FOR ARRAY OPERAND AND SUBSCRIPTS
*
{CGV04{JSR{CMGEN{{{GEN VALUE CODE FOR NEXT OPERAND
{{MOV{4*CMLEN(R10){R8{{LOAD CMBLK LENGTH
{{BLT{R7{R8{CGV04{LOOP BACK IF MORE TO GO
*
*      GENERATE CALL TO APPROPRIATE ARRAY REFERENCE ROUTINE
*
{{MOV{#OAOV${R6{{SET ONE SUBSCRIPT CALL IN CASE
{{BEQ{R8{#4*CMAR1{CGV32{JUMP TO EXIT IF 1-SUB CASE
{{MOV{#OAMV${R6{{ELSE SET CALL FOR MULTI-SUBSCRIPTS
{{JSR{CDWRD{{{GENERATE CALL
{{MOV{R8{R6{{COPY LENGTH OF CMBLK
{{SUB{#4*CMVLS{R6{{SUBTRACT STANDARD LENGTH
{{BTW{R6{{{GET NUMBER OF WORDS
{{BRN{CGV32{{{JUMP TO GENERATE SUBSCRIPT COUNT
*
*      HERE TO GENERATE CODE FOR FUNCTION CALL
*
{CGV05{MOV{#4*CMVLS{R7{{SET OFFSET TO FIRST ARGUMENT
*
*      LOOP TO GENERATE CODE FOR ARGUMENTS
*
{CGV06{BEQ{R7{4*CMLEN(R10){CGV07{JUMP IF ALL GENERATED
{{JSR{CMGEN{{{ELSE GEN VALUE CODE FOR NEXT ARG
{{BRN{CGV06{{{BACK TO GENERATE NEXT ARGUMENT
*
*      HERE TO GENERATE ACTUAL FUNCTION CALL
*
{CGV07{SUB{#4*CMVLS{R7{{GET NUMBER OF ARG PTRS (BYTES)
{{BTW{R7{{{CONVERT BYTES TO WORDS
{{MOV{4*CMOPN(R10){R9{{LOAD FUNCTION VRBLK POINTER
{{BNZ{4*VRLEN(R9){CGV12{{JUMP IF NOT SYSTEM FUNCTION
{{MOV{4*VRSVP(R9){R10{{LOAD SVBLK PTR IF SYSTEM VAR
{{MOV{4*SVBIT(R10){R6{{LOAD BIT MASK
{{ANB{BTFFC{R6{{TEST FOR FAST FUNCTION CALL ALLOWED
{{ZRB{R6{CGV12{{JUMP IF NOT
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE IF FAST FUNCTION CALL IS ALLOWED
*
{{MOV{4*SVBIT(R10){R6{{RELOAD BIT INDICATORS
{{ANB{BTPRE{R6{{TEST FOR PREEVALUATION OK
{{NZB{R6{CGV08{{JUMP IF PREEVALUATION PERMITTED
{{MNZ{R8{{{ELSE SET RESULT NON-CONSTANT
*
*      TEST FOR CORRECT NUMBER OF ARGS FOR FAST CALL
*
{CGV08{MOV{4*VRFNC(R9){R10{{LOAD PTR TO SVFNC FIELD
{{MOV{4*FARGS(R10){R6{{LOAD SVNAR FIELD VALUE
{{BEQ{R6{R7{CGV11{JUMP IF ARGUMENT COUNT IS CORRECT
{{BHI{R6{R7{CGV09{JUMP IF TOO FEW ARGUMENTS GIVEN
*
*      HERE IF TOO MANY ARGUMENTS, PREPARE TO GENERATE O$POPS
*
{{SUB{R6{R7{{GET NUMBER OF EXTRA ARGS
{{LCT{R7{R7{{SET AS COUNT TO CONTROL LOOP
{{MOV{#OPOP${R6{{SET POP CALL
{{BRN{CGV10{{{JUMP TO COMMON LOOP
*
*      HERE IF TOO FEW ARGUMENTS, PREPARE TO GENERATE NULLS
*
{CGV09{SUB{R7{R6{{GET NUMBER OF MISSING ARGUMENTS
{{LCT{R7{R6{{LOAD AS COUNT TO CONTROL LOOP
{{MOV{#NULLS{R6{{LOAD PTR TO NULL CONSTANT
*
*      LOOP TO GENERATE CALLS TO FIX ARGUMENT COUNT
*
{CGV10{JSR{CDWRD{{{GENERATE ONE CALL
{{BCT{R7{CGV10{{LOOP TILL ALL GENERATED
*
*      HERE AFTER ADJUSTING ARG COUNT AS REQUIRED
*
{CGV11{MOV{R10{R6{{COPY POINTER TO SVFNC FIELD
{{BRN{CGV36{{{JUMP TO GENERATE CALL
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      COME HERE IF FAST CALL IS NOT PERMITTED
*
{CGV12{MOV{#OFNS${R6{{SET ONE ARG CALL IN CASE
{{BEQ{R7{#NUM01{CGV13{JUMP IF ONE ARG CASE
{{MOV{#OFNC${R6{{ELSE LOAD CALL FOR MORE THAN 1 ARG
{{JSR{CDWRD{{{GENERATE IT
{{MOV{R7{R6{{COPY ARGUMENT COUNT
*
*      ONE ARG CASE MERGES HERE
*
{CGV13{JSR{CDWRD{{{GENERATE =O$FNS OR ARG COUNT
{{MOV{R9{R6{{COPY VRBLK POINTER
{{BRN{CGV32{{{JUMP TO GENERATE VRBLK PTR
*
*      HERE FOR DEFERRED EXPRESSION
*
{CGV14{MOV{4*CMROP(R10){R10{{POINT TO EXPRESSION TREE
{{JSR{CDGEX{{{BUILD EXBLK OR SEBLK
{{MOV{R9{R6{{COPY BLOCK PTR
{{JSR{CDWRD{{{GENERATE PTR TO EXBLK OR SEBLK
{{BRN{CGV34{{{JUMP TO EXIT, CONSTANT TEST
*
*      HERE TO GENERATE CODE FOR SELECTION
*
{CGV15{ZER{-(SP){{{ZERO PTR TO CHAIN OF FORWARD JUMPS
{{ZER{-(SP){{{ZERO PTR TO PREV O$SLC FORWARD PTR
{{MOV{#4*CMVLS{R7{{POINT TO FIRST ALTERNATIVE
{{MOV{#OSLA${R6{{SET INITIAL CODE WORD
*
*      0(XS)                 IS THE OFFSET TO THE PREVIOUS WORD
*                            WHICH REQUIRES FILLING IN WITH AN
*                            OFFSET TO THE FOLLOWING O$SLC,O$SLD
*
*      1(XS)                 IS THE HEAD OF A CHAIN OF OFFSET
*                            POINTERS INDICATING THOSE LOCATIONS
*                            TO BE FILLED WITH OFFSETS PAST
*                            THE END OF ALL THE ALTERNATIVES
*
{CGV16{JSR{CDWRD{{{GENERATE O$SLC (O$SLA FIRST TIME)
{{MOV{CWCOF{(SP){{SET CURRENT LOC AS PTR TO FILL IN
{{JSR{CDWRD{{{GENERATE GARBAGE WORD THERE FOR NOW
{{JSR{CMGEN{{{GEN VALUE CODE FOR ALTERNATIVE
{{MOV{#OSLB${R6{{LOAD O$SLB POINTER
{{JSR{CDWRD{{{GENERATE O$SLB CALL
{{MOV{4*1(SP){R6{{LOAD OLD CHAIN PTR
{{MOV{CWCOF{4*1(SP){{SET CURRENT LOC AS NEW CHAIN HEAD
{{JSR{CDWRD{{{GENERATE FORWARD CHAIN LINK
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      NOW TO FILL IN THE SKIP OFFSET TO O$SLC,O$SLD
*
{{MOV{(SP){R9{{LOAD OFFSET TO WORD TO PLUG
{{ADD{R$CCB{R9{{POINT TO ACTUAL LOCATION TO PLUG
{{MOV{CWCOF{(R9){{PLUG PROPER OFFSET IN
{{MOV{#OSLC${R6{{LOAD O$SLC PTR FOR NEXT ALTERNATIVE
{{MOV{R7{R9{{COPY OFFSET (DESTROY GARBAGE XR)
{{ICA{R9{{{BUMP EXTRA TIME FOR TEST
{{BLT{R9{4*CMLEN(R10){CGV16{LOOP BACK IF NOT LAST ALTERNATIVE
*
*      HERE TO GENERATE CODE FOR LAST ALTERNATIVE
*
{{MOV{#OSLD${R6{{GET HEADER CALL
{{JSR{CDWRD{{{GENERATE O$SLD CALL
{{JSR{CMGEN{{{GENERATE CODE FOR LAST ALTERNATIVE
{{ICA{SP{{{POP OFFSET PTR
{{MOV{(SP)+{R9{{LOAD CHAIN PTR
*
*      LOOP TO PLUG OFFSETS PAST STRUCTURE
*
{CGV17{ADD{R$CCB{R9{{MAKE NEXT PTR ABSOLUTE
{{MOV{(R9){R6{{LOAD FORWARD PTR
{{MOV{CWCOF{(R9){{PLUG REQUIRED OFFSET
{{MOV{R6{R9{{COPY FORWARD PTR
{{BNZ{R6{CGV17{{LOOP BACK IF MORE TO GO
{{BRN{CGV33{{{ELSE JUMP TO EXIT (NOT CONSTANT)
*
*      HERE FOR BINARY OPS WITH VALUE OPERANDS
*
{CGV18{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND POINTER
{{JSR{CDGVL{{{GEN VALUE CODE FOR LEFT OPERAND
*
*      HERE FOR UNARY OPS WITH VALUE OPERAND (BINOPS MERGE)
*
{CGV19{MOV{4*CMROP(R10){R9{{LOAD RIGHT (ONLY) OPERAND PTR
{{JSR{CDGVL{{{GEN CODE BY VALUE
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      MERGE HERE TO GENERATE OPERATOR CALL FROM CMOPN FIELD
*
{CGV20{MOV{4*CMOPN(R10){R6{{LOAD OPERATOR CALL POINTER
{{BRN{CGV36{{{JUMP TO GENERATE IT WITH CONS TEST
*
*      HERE FOR ASSIGNMENT
*
{CGV21{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND POINTER
{{BLO{(R9){#B$VR${CGV22{JUMP IF NOT VARIABLE
*
*      HERE FOR ASSIGNMENT TO SIMPLE VARIABLE
*
{{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR
{{JSR{CDGVL{{{GENERATE CODE BY VALUE
{{MOV{4*CMLOP(R10){R6{{RELOAD LEFT OPERAND VRBLK PTR
{{ADD{#4*VRSTO{R6{{POINT TO VRSTO FIELD
{{BRN{CGV32{{{JUMP TO GENERATE STORE PTR
*
*      HERE IF NOT SIMPLE VARIABLE ASSIGNMENT
*
{CGV22{JSR{EXPAP{{{TEST FOR PATTERN MATCH ON LEFT SIDE
{{PPM{CGV23{{{JUMP IF NOT PATTERN MATCH
*
*      HERE FOR PATTERN REPLACEMENT
*
{{MOV{4*CMROP(R9){4*CMLOP(R10){{SAVE PATTERN PTR IN SAFE PLACE
{{MOV{4*CMLOP(R9){R9{{LOAD SUBJECT PTR
{{JSR{CDGNM{{{GEN CODE BY NAME FOR SUBJECT
{{MOV{4*CMLOP(R10){R9{{LOAD PATTERN PTR
{{JSR{CDGVL{{{GEN CODE BY VALUE FOR PATTERN
{{MOV{#OPMN${R6{{LOAD MATCH BY NAME CALL
{{JSR{CDWRD{{{GENERATE IT
{{MOV{4*CMROP(R10){R9{{LOAD REPLACEMENT VALUE PTR
{{JSR{CDGVL{{{GEN CODE BY VALUE
{{MOV{#ORPL${R6{{LOAD REPLACE CALL
{{BRN{CGV32{{{JUMP TO GEN AND EXIT (NOT CONSTANT)
*
*      HERE FOR ASSIGNMENT TO COMPLEX VARIABLE
*
{CGV23{MNZ{R8{{{INHIBIT PRE-EVALUATION
{{JSR{CDGNM{{{GEN CODE BY NAME FOR LEFT SIDE
{{BRN{CGV31{{{MERGE WITH UNOP CIRCUIT
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE FOR CONCATENATION
*
{CGV24{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND PTR
{{BNE{(R9){#B$CMT{CGV18{ORDINARY BINOP IF NOT CMBLK
{{MOV{4*CMTYP(R9){R7{{LOAD CMBLK TYPE CODE
{{BEQ{R7{#C$INT{CGV25{SPECIAL CASE IF INTERROGATION
{{BEQ{R7{#C$NEG{CGV25{OR NEGATION
{{BNE{R7{#C$FNC{CGV18{ELSE ORDINARY BINOP IF NOT FUNCTION
{{MOV{4*CMOPN(R9){R9{{ELSE LOAD FUNCTION VRBLK PTR
{{BNZ{4*VRLEN(R9){CGV18{{ORDINARY BINOP IF NOT SYSTEM VAR
{{MOV{4*VRSVP(R9){R9{{ELSE POINT TO SVBLK
{{MOV{4*SVBIT(R9){R6{{LOAD BIT INDICATORS
{{ANB{BTPRD{R6{{TEST FOR PREDICATE FUNCTION
{{ZRB{R6{CGV18{{ORDINARY BINOP IF NOT
*
*      HERE IF LEFT ARG OF CONCATENATION IS PREDICATE FUNCTION
*
{CGV25{MOV{4*CMLOP(R10){R9{{RELOAD LEFT ARG
{{JSR{CDGVL{{{GEN CODE BY VALUE
{{MOV{#OPOP${R6{{LOAD POP CALL
{{JSR{CDWRD{{{GENERATE IT
{{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND
{{JSR{CDGVL{{{GEN CODE BY VALUE AS RESULT CODE
{{BRN{CGV33{{{EXIT (NOT CONSTANT)
*
*      HERE TO GENERATE CODE FOR PATTERN, IMMEDIATE ASSIGNMENT
*
{CGV26{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND
{{JSR{CDGVL{{{GEN CODE BY VALUE, MERGE
*
*      HERE FOR UNOPS WITH ARG BY NAME (BINARY $ . MERGE)
*
{CGV27{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR
{{JSR{CDGNM{{{GEN CODE BY NAME FOR RIGHT ARG
{{MOV{4*CMOPN(R10){R9{{GET OPERATOR CODE WORD
{{BNE{(R9){#O$KWV{CGV20{GEN CALL UNLESS KEYWORD VALUE
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE FOR KEYWORD BY VALUE. THIS IS CONSTANT ONLY IF
*      THE OPERAND IS ONE OF THE SPECIAL SYSTEM VARIABLES WITH
*      THE SVCKW BIT SET TO INDICATE A CONSTANT KEYWORD VALUE.
*      NOTE THAT THE ONLY CONSTANT OPERAND BY NAME IS A VARIABLE
*
{{BNZ{R8{CGV20{{GEN CALL IF NON-CONSTANT (NOT VAR)
{{MNZ{R8{{{ELSE SET NON-CONSTANT IN CASE
{{MOV{4*CMROP(R10){R9{{LOAD PTR TO OPERAND VRBLK
{{BNZ{4*VRLEN(R9){CGV20{{GEN (NON-CONSTANT) IF NOT SYS VAR
{{MOV{4*VRSVP(R9){R9{{ELSE LOAD PTR TO SVBLK
{{MOV{4*SVBIT(R9){R6{{LOAD BIT MASK
{{ANB{BTCKW{R6{{TEST FOR CONSTANT KEYWORD
{{ZRB{R6{CGV20{{GO GEN IF NOT CONSTANT
{{ZER{R8{{{ELSE SET RESULT CONSTANT
{{BRN{CGV20{{{AND JUMP BACK TO GENERATE CALL
*
*      HERE TO GENERATE CODE FOR NEGATION
*
{CGV28{MOV{#ONTA${R6{{GET INITIAL WORD
{{JSR{CDWRD{{{GENERATE IT
{{MOV{CWCOF{R7{{SAVE NEXT OFFSET
{{JSR{CDWRD{{{GENERATE GUNK WORD FOR NOW
{{MOV{4*CMROP(R10){R9{{LOAD RIGHT OPERAND PTR
{{JSR{CDGVL{{{GEN CODE BY VALUE
{{MOV{#ONTB${R6{{LOAD END OF EVALUATION CALL
{{JSR{CDWRD{{{GENERATE IT
{{MOV{R7{R9{{COPY OFFSET TO WORD TO PLUG
{{ADD{R$CCB{R9{{POINT TO ACTUAL WORD TO PLUG
{{MOV{CWCOF{(R9){{PLUG WORD WITH CURRENT OFFSET
{{MOV{#ONTC${R6{{LOAD FINAL CALL
{{BRN{CGV32{{{JUMP TO GENERATE IT (NOT CONSTANT)
*
*      HERE TO GENERATE CODE FOR UNDEFINED BINARY OPERATOR
*
{CGV29{MOV{4*CMLOP(R10){R9{{LOAD LEFT OPERAND PTR
{{JSR{CDGVL{{{GENERATE CODE BY VALUE
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE TO GENERATE CODE FOR UNDEFINED UNARY OPERATOR
*
{CGV30{MOV{#C$UO${R7{{SET UNOP CODE + 1
{{SUB{4*CMTYP(R10){R7{{SET NUMBER OF ARGS (1 OR 2)
*
*      MERGE HERE FOR UNDEFINED OPERATORS
*
{{MOV{4*CMROP(R10){R9{{LOAD RIGHT (ONLY) OPERAND POINTER
{{JSR{CDGVL{{{GEN VALUE CODE FOR RIGHT OPERAND
{{MOV{4*CMOPN(R10){R9{{LOAD POINTER TO OPERATOR DV
{{MOV{4*DVOPN(R9){R9{{LOAD POINTER OFFSET
{{WTB{R9{{{CONVERT WORD OFFSET TO BYTES
{{ADD{#R$UBA{R9{{POINT TO PROPER FUNCTION PTR
{{SUB{#4*VRFNC{R9{{SET STANDARD FUNCTION OFFSET
{{BRN{CGV12{{{MERGE WITH FUNCTION CALL CIRCUIT
*
*      HERE TO GENERATE CODE FOR INTERROGATION, INDIRECTION
*
{CGV31{MNZ{R8{{{SET NON CONSTANT
{{BRN{CGV19{{{MERGE
*
*      HERE TO EXIT GENERATING A WORD, RESULT NOT CONSTANT
*
{CGV32{JSR{CDWRD{{{GENERATE WORD, MERGE
*
*      HERE TO EXIT WITH NO WORD GENERATED, NOT CONSTANT
*
{CGV33{MNZ{R8{{{INDICATE RESULT IS NOT CONSTANT
*
*      COMMON EXIT POINT
*
{CGV34{ICA{SP{{{POP INITIAL CODE OFFSET
{{MOV{(SP)+{R6{{RESTORE OLD CONSTANT FLAG
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{MOV{(SP)+{R7{{RESTORE ENTRY WB
{{BNZ{R8{CGV35{{JUMP IF NOT CONSTANT
{{MOV{R6{R8{{ELSE RESTORE ENTRY CONSTANT FLAG
*
*      HERE TO RETURN AFTER DEALING WITH WC SETTING
*
{CGV35{EXI{{{{RETURN TO CDGVL CALLER
*
*      EXIT HERE TO GENERATE WORD AND TEST FOR CONSTANT
*
{CGV36{JSR{CDWRD{{{GENERATE WORD
{{BNZ{R8{CGV34{{JUMP TO EXIT IF NOT CONSTANT
{{EJC{{{{
*
*      CDGVL (CONTINUED)
*
*      HERE TO PREEVALUATE CONSTANT SUB-EXPRESSION
*
{{MOV{#ORVL${R6{{LOAD CALL TO RETURN VALUE
{{JSR{CDWRD{{{GENERATE IT
{{MOV{(SP){R10{{LOAD INITIAL CODE OFFSET
{{JSR{EXBLD{{{BUILD EXBLK FOR EXPRESSION
{{ZER{R7{{{SET TO EVALUATE BY VALUE
{{JSR{EVALX{{{EVALUATE EXPRESSION
{{PPM{{{{SHOULD NOT FAIL
{{MOV{(R9){R6{{LOAD TYPE WORD OF RESULT
{{BLO{R6{#P$AAA{CGV37{JUMP IF NOT PATTERN
{{MOV{#OLPT${R6{{ELSE LOAD SPECIAL PATTERN LOAD CALL
{{JSR{CDWRD{{{GENERATE IT
*
*      MERGE HERE TO GENERATE POINTER TO RESULTING CONSTANT
*
{CGV37{MOV{R9{R6{{COPY CONSTANT POINTER
{{JSR{CDWRD{{{GENERATE PTR
{{ZER{R8{{{SET RESULT CONSTANT
{{BRN{CGV34{{{JUMP BACK TO EXIT
{{ENP{{{{END PROCEDURE CDGVL
{{EJC{{{{
*
*      CDWRD -- GENERATE ONE WORD OF CODE
*
*      CDWRD WRITES ONE WORD INTO THE CURRENT CODE BLOCK UNDER
*      CONSTRUCTION. A NEW, LARGER, BLOCK IS ALLOCATED IF THERE
*      IS INSUFFICIENT ROOM IN THE CURRENT BLOCK. CDWRD ENSURES
*      THAT THERE ARE AT LEAST THREE WORDS LEFT IN THE BLOCK
*      AFTER ENTERING THE NEW WORD. THIS GUARANTEES THAT ANY
*      EXTRA SPACE AT THE END CAN BE SPLIT OFF AS A CCBLK.
*
*      (WA)                  WORD TO BE GENERATED
*      JSR  CDWRD            CALL TO GENERATE WORD
*
{CDWRD{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{SAVE ENTRY XR
{{MOV{R6{-(SP){{SAVE CODE WORD TO BE GENERATED
*
*      MERGE BACK HERE AFTER ALLOCATING LARGER BLOCK
*
{CDWD1{MOV{R$CCB{R9{{LOAD PTR TO CCBLK BEING BUILT
{{BNZ{R9{CDWD2{{JUMP IF BLOCK ALLOCATED
*
*      HERE WE ALLOCATE AN ENTIRELY FRESH BLOCK
*
{{MOV{#4*E$CBS{R6{{LOAD INITIAL LENGTH
{{JSR{ALLOC{{{ALLOCATE CCBLK
{{MOV{#B$CCT{(R9){{STORE TYPE WORD
{{MOV{#4*CCCOD{CWCOF{{SET INITIAL OFFSET
{{MOV{R6{4*CCLEN(R9){{STORE BLOCK LENGTH
{{MOV{R9{R$CCB{{STORE PTR TO NEW BLOCK
*
*      HERE WE HAVE A BLOCK WE CAN USE
*
{CDWD2{MOV{CWCOF{R6{{LOAD CURRENT OFFSET
{{ADD{#4*NUM04{R6{{ADJUST FOR TEST (FOUR WORDS)
{{BLO{R6{4*CCLEN(R9){CDWD4{JUMP IF ROOM IN THIS BLOCK
*
*      HERE IF NO ROOM IN CURRENT BLOCK
*
{{BGE{R6{MXLEN{CDWD5{JUMP IF ALREADY AT MAX SIZE
{{ADD{#4*E$CBS{R6{{ELSE GET NEW SIZE
{{MOV{R10{-(SP){{SAVE ENTRY XL
{{MOV{R9{R10{{COPY POINTER
{{BLT{R6{MXLEN{CDWD3{JUMP IF NOT TOO LARGE
{{MOV{MXLEN{R6{{ELSE RESET TO MAX ALLOWED SIZE
{{EJC{{{{
*
*      CDWRD (CONTINUED)
*
*      HERE WITH NEW BLOCK SIZE IN WA
*
{CDWD3{JSR{ALLOC{{{ALLOCATE NEW BLOCK
{{MOV{R9{R$CCB{{STORE POINTER TO NEW BLOCK
{{MOV{#B$CCT{(R9)+{{STORE TYPE WORD IN NEW BLOCK
{{MOV{R6{(R9)+{{STORE BLOCK LENGTH
{{ADD{#4*CCUSE{R10{{POINT TO CCUSE,CCCOD FIELDS IN OLD
{{MOV{(R10){R6{{LOAD CCUSE VALUE
{{MVW{{{{COPY USEFUL WORDS FROM OLD BLOCK
{{MOV{(SP)+{R10{{RESTORE XL
{{BRN{CDWD1{{{MERGE BACK TO TRY AGAIN
*
*      HERE WITH ROOM IN CURRENT BLOCK
*
{CDWD4{MOV{CWCOF{R6{{LOAD CURRENT OFFSET
{{ICA{R6{{{GET NEW OFFSET
{{MOV{R6{CWCOF{{STORE NEW OFFSET
{{MOV{R6{4*CCUSE(R9){{STORE IN CCBLK FOR GBCOL
{{DCA{R6{{{RESTORE PTR TO THIS WORD
{{ADD{R6{R9{{POINT TO CURRENT ENTRY
{{MOV{(SP)+{R6{{RELOAD WORD TO GENERATE
{{MOV{R6{(R9){{STORE WORD IN BLOCK
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{EXI{{{{RETURN TO CALLER
*
*      HERE IF COMPILED CODE IS TOO LONG FOR CDBLK
*
{CDWD5{ERB{213{SYNTAX{{ERROR. STATEMENT IS TOO COMPLICATED.
{{ENP{{{{END PROCEDURE CDWRD
{{EJC{{{{
*
*      CMGEN -- GENERATE CODE FOR CMBLK PTR
*
*      CMGEN IS A SUBSIDIARY PROCEDURE USED TO GENERATE VALUE
*      CODE FOR A CMBLK PTR FROM THE MAIN CODE GENERATORS.
*
*      (XL)                  CMBLK POINTER
*      (WB)                  OFFSET TO POINTER IN CMBLK
*      JSR  CMGEN            CALL TO GENERATE CODE
*      (XR,WA)               DESTROYED
*      (WB)                  BUMPED BY ONE WORD
*
{CMGEN{PRC{R{0{{ENTRY POINT, RECURSIVE
{{MOV{R10{R9{{COPY CMBLK POINTER
{{ADD{R7{R9{{POINT TO CMBLK POINTER
{{MOV{(R9){R9{{LOAD CMBLK POINTER
{{JSR{CDGVL{{{GENERATE CODE BY VALUE
{{ICA{R7{{{BUMP OFFSET
{{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE CMGEN
{{EJC{{{{
*
*      CMPIL (COMPILE SOURCE CODE)
*
*      CMPIL IS USED TO CONVERT SNOBOL4 SOURCE CODE TO INTERNAL
*      FORM (SEE CDBLK FORMAT). IT IS USED BOTH FOR THE INITIAL
*      COMPILE AND AT RUN TIME BY THE CODE AND CONVERT FUNCTIONS
*      THIS PROCEDURE HAS CONTROL FOR THE ENTIRE DURATION OF
*      INITIAL COMPILATION. AN ERROR IN ANY PROCEDURE CALLED
*      DURING COMPILATION WILL LEAD FIRST TO THE ERROR SECTION
*      AND ULTIMATELY BACK HERE FOR RESUMED COMPILATION. THE
*      RE-ENTRY POINTS AFTER AN ERROR ARE SPECIALLY LABELLED -
*
*      CMPCE                 RESUME AFTER CONTROL CARD ERROR
*      CMPLE                 RESUME AFTER LABEL ERROR
*      CMPSE                 RESUME AFTER STATEMENT ERROR
*
*      JSR  CMPIL            CALL TO COMPILE CODE
*      (XR)                  PTR TO CDBLK FOR ENTRY STATEMENT
*      (XL,WA,WB,WC,RA)      DESTROYED
*
*      THE FOLLOWING GLOBAL VARIABLES ARE REFERENCED
*
*      CMPSN                 NUMBER OF NEXT STATEMENT
*                            TO BE COMPILED.
*
*      CSWXX                 CONTROL CARD SWITCH VALUES ARE
*                            CHANGED WHEN RELEVANT CONTROL
*                            CARDS ARE MET.
*
*      CWCOF                 OFFSET TO NEXT WORD IN CODE BLOCK
*                            BEING BUILT (SEE CDWRD).
*
*      LSTSN                 NUMBER OF STATEMENT MOST RECENTLY
*                            COMPILED (INITIALLY SET TO ZERO).
*
*      R$CIM                 CURRENT (INITIAL) COMPILER IMAGE
*                            (ZERO FOR INITIAL COMPILE CALL)
*
*      R$CNI                 USED TO POINT TO FOLLOWING IMAGE.
*                            (SEE READR PROCEDURE).
*
*      SCNGO                 GOTO SWITCH FOR SCANE PROCEDURE
*
*      SCNIL                 LENGTH OF CURRENT IMAGE EXCLUDING
*                            CHARACTERS REMOVED BY -INPUT.
*
*      SCNPT                 CURRENT SCAN OFFSET, SEE SCANE.
*
*      SCNRS                 RESCAN SWITCH FOR SCANE PROCEDURE.
*
*      SCNSE                 OFFSET (IN R$CIM) OF MOST RECENTLY
*                            SCANNED ELEMENT. SET ZERO IF NOT
*                            CURRENTLY SCANNING ITEMS
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      STAGE               STGIC  INITIAL COMPILE IN PROGRESS
*                          STGXC  CODE/CONVERT COMPILE
*                          STGEV  BUILDING EXBLK FOR EVAL
*                          STGXT  EXECUTE TIME (OUTSIDE COMPILE)
*                          STGCE  INITIAL COMPILE AFTER END LINE
*                          STGXE  EXECUTE COMPILE AFTER END LINE
*
*      CMPIL ALSO USES A FIXED NUMBER OF LOCATIONS ON THE
*      MAIN STACK AS FOLLOWS. (THE DEFINITIONS OF THE ACTUAL
*      OFFSETS ARE IN THE DEFINITIONS SECTION).
*
*      CMSTM(XS)             POINTER TO EXPAN TREE FOR BODY OF
*                            STATEMENT (SEE EXPAN PROCEDURE).
*
*      CMSGO(XS)             POINTER TO TREE REPRESENTATION OF
*                            SUCCESS GOTO (SEE PROCEDURE SCNGO)9
*                            ZERO IF NO SUCCESS GOTO IS GIVEN
*
*      CMFGO(XS)             LIKE CMSGO FOR FAILURE GOTO.
*
*      CMCGO(XS)             SET NON-ZERO ONLY IF THERE IS A
*                            CONDITIONAL GOTO. USED FOR -FAIL,
*                            -NOFAIL CODE GENERATION.
*
*      CMPCD(XS)             POINTER TO CDBLK FOR PREVIOUS
*                            STATEMENT. ZERO FOR 1ST STATEMENT.
*
*      CMFFP(XS)             SET NON-ZERO IF CDFAL IN PREVIOUS
*                            CDBLK NEEDS FILLING WITH FORWARD
*                            POINTER, ELSE SET TO ZERO.
*
*      CMFFC(XS)             SAME AS CMFFP FOR CURRENT CDBLK
*
*      CMSOP(XS)             OFFSET TO WORD IN PREVIOUS CDBLK
*                            TO BE FILLED IN WITH FORWARD PTR
*                            TO NEXT CDBLK FOR SUCCESS GOTO.
*                            ZERO IF NO FILL IN IS REQUIRED.
*
*      CMSOC(XS)             SAME AS CMSOP FOR CURRENT CDBLK.
*
*      CMLBL(XS)             POINTER TO VRBLK FOR LABEL OF
*                            CURRENT STATEMENT. ZERO IF NO LABEL
*
*      CMTRA(XS)             POINTER TO CDBLK FOR ENTRY STMNT.
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      ENTRY POINT
*
{CMPIL{PRC{E{0{{ENTRY POINT
{{LCT{R7{#CMNEN{{SET NUMBER OF STACK WORK LOCATIONS
*
*      LOOP TO INITIALIZE STACK WORKING LOCATIONS
*
{CMP00{ZER{-(SP){{{STORE A ZERO, MAKE ONE ENTRY
{{BCT{R7{CMP00{{LOOP BACK UNTIL ALL SET
{{MOV{SP{CMPXS{{SAVE STACK POINTER FOR ERROR SEC
{{SSS{CMPSS{{{SAVE S-R STACK POINTER IF ANY
*
*      LOOP THROUGH STATEMENTS
*
{CMP01{MOV{SCNPT{R7{{SET SCAN POINTER OFFSET
{{MOV{R7{SCNSE{{SET START OF ELEMENT LOCATION
{{MOV{#OCER${R6{{POINT TO COMPILE ERROR CALL
{{JSR{CDWRD{{{GENERATE AS TEMPORARY CDFAL
{{BLT{R7{SCNIL{CMP04{JUMP IF CHARS LEFT ON THIS IMAGE
*
*      LOOP HERE AFTER COMMENT OR CONTROL CARD
*      ALSO SPECIAL ENTRY AFTER CONTROL CARD ERROR
*
{CMPCE{ZER{R9{{{CLEAR POSSIBLE GARBAGE XR VALUE
{{BNE{STAGE{#STGIC{CMP02{SKIP UNLESS INITIAL COMPILE
{{JSR{READR{{{READ NEXT INPUT IMAGE
{{BZE{R9{CMP09{{JUMP IF NO INPUT AVAILABLE
{{JSR{NEXTS{{{ACQUIRE NEXT SOURCE IMAGE
{{MOV{CMPSN{LSTSN{{STORE STMT NO FOR USE BY LISTR
{{ZER{SCNPT{{{RESET SCAN POINTER
{{BRN{CMP04{{{GO PROCESS IMAGE
*
*      FOR EXECUTE TIME COMPILE, PERMIT EMBEDDED CONTROL CARDS
*      AND COMMENTS (BY SKIPPING TO NEXT SEMI-COLON)
*
{CMP02{MOV{R$CIM{R9{{GET CURRENT IMAGE
{{MOV{SCNPT{R7{{GET CURRENT OFFSET
{{PLC{R9{R7{{PREPARE TO GET CHARS
*
*      SKIP TO SEMI-COLON
*
{CMP03{LCH{R8{(R9)+{{GET CHAR
{{ICV{SCNPT{{{ADVANCE OFFSET
{{BEQ{R8{#CH$SM{CMP04{SKIP IF SEMI-COLON FOUND
{{BLT{SCNPT{SCNIL{CMP03{LOOP IF MORE CHARS
{{ZER{R9{{{CLEAR GARBAGE XR VALUE
{{BRN{CMP09{{{END OF IMAGE
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      HERE WITH IMAGE AVAILABLE TO SCAN. NOTE THAT IF THE INPUT
*      STRING IS NULL, THEN EVERYTHING IS OK SINCE NULL IS
*      ACTUALLY ASSEMBLED AS A WORD OF BLANKS.
*
{CMP04{MOV{R$CIM{R9{{POINT TO CURRENT IMAGE
{{MOV{SCNPT{R7{{LOAD CURRENT OFFSET
{{MOV{R7{R6{{COPY FOR LABEL SCAN
{{PLC{R9{R7{{POINT TO FIRST CHARACTER
{{LCH{R8{(R9)+{{LOAD FIRST CHARACTER
{{BEQ{R8{#CH$SM{CMP12{NO LABEL IF SEMICOLON
{{BEQ{R8{#CH$AS{CMPCE{LOOP BACK IF COMMENT CARD
{{BEQ{R8{#CH$MN{CMP32{JUMP IF CONTROL CARD
{{MOV{R$CIM{R$CMP{{ABOUT TO DESTROY R$CIM
{{MOV{#CMLAB{R10{{POINT TO LABEL WORK STRING
{{MOV{R10{R$CIM{{SCANE IS TO SCAN WORK STRING
{{PSC{R10{{{POINT TO FIRST CHARACTER POSITION
{{SCH{R8{(R10)+{{STORE CHAR JUST LOADED
{{MOV{#CH$SM{R8{{GET A SEMICOLON
{{SCH{R8{(R10){{STORE AFTER FIRST CHAR
{{CSC{R10{{{FINISHED CHARACTER STORING
{{ZER{R10{{{CLEAR POINTER
{{ZER{SCNPT{{{START AT FIRST CHARACTER
{{MOV{SCNIL{-(SP){{PRESERVE IMAGE LENGTH
{{MOV{#NUM02{SCNIL{{READ 2 CHARS AT MOST
{{JSR{SCANE{{{SCAN FIRST CHAR FOR TYPE
{{MOV{(SP)+{SCNIL{{RESTORE IMAGE LENGTH
{{MOV{R10{R8{{NOTE RETURN CODE
{{MOV{R$CMP{R10{{GET OLD R$CIM
{{MOV{R10{R$CIM{{PUT IT BACK
{{MOV{R7{SCNPT{{REINSTATE OFFSET
{{BNZ{SCNBL{CMP12{{BLANK SEEN - CANT BE LABEL
{{MOV{R10{R9{{POINT TO CURRENT IMAGE
{{PLC{R9{R7{{POINT TO FIRST CHAR AGAIN
{{BEQ{R8{#T$VAR{CMP06{OK IF LETTER
{{BEQ{R8{#T$CON{CMP06{OK IF DIGIT
*
*      DROP IN OR JUMP FROM ERROR SECTION IF SCANE FAILED
*
{CMPLE{MOV{R$CMP{R$CIM{{POINT TO BAD LINE
{{ERB{214{BAD{{LABEL OR MISPLACED CONTINUATION LINE
*
*      LOOP TO SCAN LABEL
*
{CMP05{BEQ{R8{#CH$SM{CMP07{SKIP IF SEMICOLON
{{ICV{R6{{{BUMP OFFSET
{{BEQ{R6{SCNIL{CMP07{JUMP IF END OF IMAGE (LABEL END)
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      ENTER LOOP AT THIS POINT
*
{CMP06{LCH{R8{(R9)+{{ELSE LOAD NEXT CHARACTER
{{BEQ{R8{#CH$HT{CMP07{JUMP IF HORIZONTAL TAB
{{BNE{R8{#CH$BL{CMP05{LOOP BACK IF NON-BLANK
*
*      HERE AFTER SCANNING OUT LABEL
*
{CMP07{MOV{R6{SCNPT{{SAVE UPDATED SCAN OFFSET
{{SUB{R7{R6{{GET LENGTH OF LABEL
{{BZE{R6{CMP12{{SKIP IF LABEL LENGTH ZERO
{{ZER{R9{{{CLEAR GARBAGE XR VALUE
{{JSR{SBSTR{{{BUILD SCBLK FOR LABEL NAME
{{JSR{GTNVR{{{LOCATE/CONTRUCT VRBLK
{{PPM{{{{DUMMY (IMPOSSIBLE) ERROR RETURN
{{MOV{R9{4*CMLBL(SP){{STORE LABEL POINTER
{{BNZ{4*VRLEN(R9){CMP11{{JUMP IF NOT SYSTEM LABEL
{{BNE{4*VRSVP(R9){#V$END{CMP11{JUMP IF NOT END LABEL
*
*      HERE FOR END LABEL SCANNED OUT
*
{{ADD{#STGND{STAGE{{ADJUST STAGE APPROPRIATELY
{{JSR{SCANE{{{SCAN OUT NEXT ELEMENT
{{BEQ{R10{#T$SMC{CMP10{JUMP IF END OF IMAGE
{{BNE{R10{#T$VAR{CMP08{ELSE ERROR IF NOT VARIABLE
*
*      HERE CHECK FOR VALID INITIAL TRANSFER
*
{{BEQ{4*VRLBL(R9){#STNDL{CMP08{JUMP IF NOT DEFINED (ERROR)
{{MOV{4*VRLBL(R9){4*CMTRA(SP){{ELSE SET INITIAL ENTRY POINTER
{{JSR{SCANE{{{SCAN NEXT ELEMENT
{{BEQ{R10{#T$SMC{CMP10{JUMP IF OK (END OF IMAGE)
*
*      HERE FOR BAD TRANSFER LABEL
*
{CMP08{ERB{215{SYNTAX{{ERROR. UNDEFINED OR ERRONEOUS ENTRY LABEL
*
*      HERE FOR END OF INPUT (NO END LABEL DETECTED)
*
{CMP09{ADD{#STGND{STAGE{{ADJUST STAGE APPROPRIATELY
{{BEQ{STAGE{#STGXE{CMP10{JUMP IF CODE CALL (OK)
{{ERB{216{SYNTAX{{ERROR. MISSING END LINE
*
*      HERE AFTER PROCESSING END LINE (MERGE HERE ON END ERROR)
*
{CMP10{MOV{#OSTP${R6{{SET STOP CALL POINTER
{{JSR{CDWRD{{{GENERATE AS STATEMENT CALL
{{BRN{CMPSE{{{JUMP TO GENERATE AS FAILURE
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      HERE AFTER PROCESSING LABEL OTHER THAN END
*
{CMP11{BNE{STAGE{#STGIC{CMP12{JUMP IF CODE CALL - REDEF. OK
{{BEQ{4*VRLBL(R9){#STNDL{CMP12{ELSE CHECK FOR REDEFINITION
{{ZER{4*CMLBL(SP){{{LEAVE FIRST LABEL DECLN UNDISTURBED
{{ERB{217{SYNTAX{{ERROR. DUPLICATE LABEL
*
*      HERE AFTER DEALING WITH LABEL
*
{CMP12{ZER{R7{{{SET FLAG FOR STATEMENT BODY
{{JSR{EXPAN{{{GET TREE FOR STATEMENT BODY
{{MOV{R9{4*CMSTM(SP){{STORE FOR LATER USE
{{ZER{4*CMSGO(SP){{{CLEAR SUCCESS GOTO POINTER
{{ZER{4*CMFGO(SP){{{CLEAR FAILURE GOTO POINTER
{{ZER{4*CMCGO(SP){{{CLEAR CONDITIONAL GOTO FLAG
{{JSR{SCANE{{{SCAN NEXT ELEMENT
{{BNE{R10{#T$COL{CMP18{JUMP IT NOT COLON (NO GOTO)
*
*      LOOP TO PROCESS GOTO FIELDS
*
{CMP13{MNZ{SCNGO{{{SET GOTO FLAG
{{JSR{SCANE{{{SCAN NEXT ELEMENT
{{BEQ{R10{#T$SMC{CMP31{JUMP IF NO FIELDS LEFT
{{BEQ{R10{#T$SGO{CMP14{JUMP IF S FOR SUCCESS GOTO
{{BEQ{R10{#T$FGO{CMP16{JUMP IF F FOR FAILURE GOTO
*
*      HERE FOR UNCONDITIONAL GOTO (I.E. NOT F OR S)
*
{{MNZ{SCNRS{{{SET TO RESCAN ELEMENT NOT F,S
{{JSR{SCNGF{{{SCAN OUT GOTO FIELD
{{BNZ{4*CMFGO(SP){CMP17{{ERROR IF FGOTO ALREADY
{{MOV{R9{4*CMFGO(SP){{ELSE SET AS FGOTO
{{BRN{CMP15{{{MERGE WITH SGOTO CIRCUIT
*
*      HERE FOR SUCCESS GOTO
*
{CMP14{JSR{SCNGF{{{SCAN SUCCESS GOTO FIELD
{{MOV{#NUM01{4*CMCGO(SP){{SET CONDITIONAL GOTO FLAG
*
*      UNCONTIONAL GOTO MERGES HERE
*
{CMP15{BNZ{4*CMSGO(SP){CMP17{{ERROR IF SGOTO ALREADY GIVEN
{{MOV{R9{4*CMSGO(SP){{ELSE SET SGOTO
{{BRN{CMP13{{{LOOP BACK FOR NEXT GOTO FIELD
*
*      HERE FOR FAILURE GOTO
*
{CMP16{JSR{SCNGF{{{SCAN GOTO FIELD
{{MOV{#NUM01{4*CMCGO(SP){{SET CONDITONAL GOTO FLAG
{{BNZ{4*CMFGO(SP){CMP17{{ERROR IF FGOTO ALREADY GIVEN
{{MOV{R9{4*CMFGO(SP){{ELSE STORE FGOTO POINTER
{{BRN{CMP13{{{LOOP BACK FOR NEXT FIELD
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      HERE FOR DUPLICATED GOTO FIELD
*
{CMP17{ERB{218{SYNTAX{{ERROR. DUPLICATED GOTO FIELD
*
*      HERE TO GENERATE CODE
*
{CMP18{ZER{SCNSE{{{STOP POSITIONAL ERROR FLAGS
{{MOV{4*CMSTM(SP){R9{{LOAD TREE PTR FOR STATEMENT BODY
{{ZER{R7{{{COLLECTABLE VALUE FOR WB FOR CDGVL
{{ZER{R8{{{RESET CONSTANT FLAG FOR CDGVL
{{JSR{EXPAP{{{TEST FOR PATTERN MATCH
{{PPM{CMP19{{{JUMP IF NOT PATTERN MATCH
{{MOV{#OPMS${4*CMOPN(R9){{ELSE SET PATTERN MATCH POINTER
{{MOV{#C$PMT{4*CMTYP(R9){{
*
*      HERE AFTER DEALING WITH SPECIAL PATTERN MATCH CASE
*
{CMP19{JSR{CDGVL{{{GENERATE CODE FOR BODY OF STATEMENT
{{MOV{4*CMSGO(SP){R9{{LOAD SGOTO POINTER
{{MOV{R9{R6{{COPY IT
{{BZE{R9{CMP21{{JUMP IF NO SUCCESS GOTO
{{ZER{4*CMSOC(SP){{{CLEAR SUCCESS OFFSET FILLIN PTR
{{BHI{R9{STATE{CMP20{JUMP IF COMPLEX GOTO
*
*      HERE FOR SIMPLE SUCCESS GOTO (LABEL)
*
{{ADD{#4*VRTRA{R6{{POINT TO VRTRA FIELD AS REQUIRED
{{JSR{CDWRD{{{GENERATE SUCCESS GOTO
{{BRN{CMP22{{{JUMP TO DEAL WITH FGOTO
*
*      HERE FOR COMPLEX SUCCESS GOTO
*
{CMP20{BEQ{R9{4*CMFGO(SP){CMP22{NO CODE IF SAME AS FGOTO
{{ZER{R7{{{ELSE SET OK VALUE FOR CDGVL IN WB
{{JSR{CDGCG{{{GENERATE CODE FOR SUCCESS GOTO
{{BRN{CMP22{{{JUMP TO DEAL WITH FGOTO
*
*      HERE FOR NO SUCCESS GOTO
*
{CMP21{MOV{CWCOF{4*CMSOC(SP){{SET SUCCESS FILL IN OFFSET
{{MOV{#OCER${R6{{POINT TO COMPILE ERROR CALL
{{JSR{CDWRD{{{GENERATE AS TEMPORARY VALUE
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      HERE TO DEAL WITH FAILURE GOTO
*
{CMP22{MOV{4*CMFGO(SP){R9{{LOAD FAILURE GOTO POINTER
{{MOV{R9{R6{{COPY IT
{{ZER{4*CMFFC(SP){{{SET NO FILL IN REQUIRED YET
{{BZE{R9{CMP23{{JUMP IF NO FAILURE GOTO GIVEN
{{ADD{#4*VRTRA{R6{{POINT TO VRTRA FIELD IN CASE
{{BLO{R9{STATE{CMPSE{JUMP TO GEN IF SIMPLE FGOTO
*
*      HERE FOR COMPLEX FAILURE GOTO
*
{{MOV{CWCOF{R7{{SAVE OFFSET TO O$GOF CALL
{{MOV{#OGOF${R6{{POINT TO FAILURE GOTO CALL
{{JSR{CDWRD{{{GENERATE
{{MOV{#OFIF${R6{{POINT TO FAIL IN FAIL WORD
{{JSR{CDWRD{{{GENERATE
{{JSR{CDGCG{{{GENERATE CODE FOR FAILURE GOTO
{{MOV{R7{R6{{COPY OFFSET TO O$GOF FOR CDFAL
{{MOV{#B$CDC{R7{{SET COMPLEX CASE CDTYP
{{BRN{CMP25{{{JUMP TO BUILD CDBLK
*
*      HERE IF NO FAILURE GOTO GIVEN
*
{CMP23{MOV{#OUNF${R6{{LOAD UNEXPECTED FAILURE CALL IN CAS
{{MOV{CSWFL{R8{{GET -NOFAIL FLAG
{{ORB{4*CMCGO(SP){R8{{CHECK IF CONDITIONAL GOTO
{{ZRB{R8{CMPSE{{JUMP IF -NOFAIL AND NO COND. GOTO
{{MNZ{4*CMFFC(SP){{{ELSE SET FILL IN FLAG
{{MOV{#OCER${R6{{AND SET COMPILE ERROR FOR TEMPORARY
*
*      MERGE HERE WITH CDFAL VALUE IN WA, SIMPLE CDBLK
*      ALSO SPECIAL ENTRY AFTER STATEMENT ERROR
*
{CMPSE{MOV{#B$CDS{R7{{SET CDTYP FOR SIMPLE CASE
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      MERGE HERE TO BUILD CDBLK
*
*      (WA)                  CDFAL VALUE TO BE GENERATED
*      (WB)                  CDTYP VALUE TO BE GENERATED
*
*      AT THIS STAGE, WE CHOP OFF AN APPROPRIATE CHUNK OF THE
*      CURRENT CCBLK AND CONVERT IT INTO A CDBLK. THE REMAINDER
*      OF THE CCBLK IS REFORMATTED TO BE THE NEW CCBLK.
*
{CMP25{MOV{R$CCB{R9{{POINT TO CCBLK
{{MOV{4*CMLBL(SP){R10{{GET POSSIBLE LABEL POINTER
{{BZE{R10{CMP26{{SKIP IF NO LABEL
{{ZER{4*CMLBL(SP){{{CLEAR FLAG FOR NEXT STATEMENT
{{MOV{R9{4*VRLBL(R10){{PUT CDBLK PTR IN VRBLK LABEL FIELD
*
*      MERGE AFTER DOING LABEL
*
{CMP26{MOV{R7{(R9){{SET TYPE WORD FOR NEW CDBLK
{{MOV{R6{4*CDFAL(R9){{SET FAILURE WORD
{{MOV{R9{R10{{COPY POINTER TO CCBLK
{{MOV{4*CCUSE(R9){R7{{LOAD LENGTH GEN (= NEW CDLEN)
{{MOV{4*CCLEN(R9){R8{{LOAD TOTAL CCBLK LENGTH
{{ADD{R7{R10{{POINT PAST CDBLK
{{SUB{R7{R8{{GET LENGTH LEFT FOR CHOP OFF
{{MOV{#B$CCT{(R10){{SET TYPE CODE FOR NEW CCBLK AT END
{{MOV{#4*CCCOD{4*CCUSE(R10){{SET INITIAL CODE OFFSET
{{MOV{#4*CCCOD{CWCOF{{REINITIALISE CWCOF
{{MOV{R8{4*CCLEN(R10){{SET NEW LENGTH
{{MOV{R10{R$CCB{{SET NEW CCBLK POINTER
{{MOV{CMPSN{4*CDSTM(R9){{SET STATEMENT NUMBER
{{ICV{CMPSN{{{BUMP STATEMENT NUMBER
*
*      SET POINTERS IN PREVIOUS CODE BLOCK AS REQUIRED
*
{{MOV{4*CMPCD(SP){R10{{LOAD PTR TO PREVIOUS CDBLK
{{BZE{4*CMFFP(SP){CMP27{{JUMP IF NO FAILURE FILL IN REQUIRED
{{MOV{R9{4*CDFAL(R10){{ELSE SET FAILURE PTR IN PREVIOUS
*
*      HERE TO DEAL WITH SUCCESS FORWARD POINTER
*
{CMP27{MOV{4*CMSOP(SP){R6{{LOAD SUCCESS OFFSET
{{BZE{R6{CMP28{{JUMP IF NO FILL IN REQUIRED
{{ADD{R6{R10{{ELSE POINT TO FILL IN LOCATION
{{MOV{R9{(R10){{STORE FORWARD POINTER
{{ZER{R10{{{CLEAR GARBAGE XL VALUE
{{EJC{{{{
*
*      CMPIL (CONTINUED)
*
*      NOW SET FILL IN POINTERS FOR THIS STATEMENT
*
{CMP28{MOV{4*CMFFC(SP){4*CMFFP(SP){{COPY FAILURE FILL IN FLAG
{{MOV{4*CMSOC(SP){4*CMSOP(SP){{COPY SUCCESS FILL IN OFFSET
{{MOV{R9{4*CMPCD(SP){{SAVE PTR TO THIS CDBLK
{{BNZ{4*CMTRA(SP){CMP29{{JUMP IF INITIAL ENTRY ALREADY SET
{{MOV{R9{4*CMTRA(SP){{ELSE SET PTR HERE AS DEFAULT
*
*      HERE AFTER COMPILING ONE STATEMENT
*
{CMP29{BLT{STAGE{#STGCE{CMP01{JUMP IF NOT END LINE JUST DONE
{{BZE{CSWLS{CMP30{{SKIP IF -NOLIST
{{JSR{LISTR{{{LIST LAST LINE
*
*      RETURN
*
{CMP30{MOV{4*CMTRA(SP){R9{{LOAD INITIAL ENTRY CDBLK POINTER
{{ADD{#4*CMNEN{SP{{POP WORK LOCATIONS OFF STACK
{{EXI{{{{AND RETURN TO CMPIL CALLER
*
*      HERE AT END OF GOTO FIELD
*
{CMP31{MOV{4*CMFGO(SP){R7{{GET FAIL GOTO
{{ORB{4*CMSGO(SP){R7{{OR IN SUCCESS GOTO
{{BNZ{R7{CMP18{{OK IF NON-NULL FIELD
{{ERB{219{SYNTAX{{ERROR. EMPTY GOTO FIELD
*
*      CONTROL CARD FOUND
*
{CMP32{ICV{R7{{{POINT PAST CH$MN
{{JSR{CNCRD{{{PROCESS CONTROL CARD
{{ZER{SCNSE{{{CLEAR START OF ELEMENT LOC.
{{BRN{CMPCE{{{LOOP FOR NEXT STATEMENT
{{ENP{{{{END PROCEDURE CMPIL
{{EJC{{{{
*
*      CNCRD -- CONTROL CARD PROCESSOR
*
*      CALLED TO DEAL WITH CONTROL CARDS
*
*      R$CIM                 POINTS TO CURRENT IMAGE
*      (WB)                  OFFSET TO 1ST CHAR OF CONTROL CARD
*      JSR  CNCRD            CALL TO PROCESS CONTROL CARDS
*      (XL,XR,WA,WB,WC,IA)   DESTROYED
*
{CNCRD{PRC{E{0{{ENTRY POINT
{{MOV{R7{SCNPT{{OFFSET FOR CONTROL CARD SCAN
{{MOV{#CCNOC{R6{{NUMBER OF CHARS FOR COMPARISON
{{CTW{R6{0{{CONVERT TO WORD COUNT
{{MOV{R6{CNSWC{{SAVE WORD COUNT
*
*      LOOP HERE IF MORE THAN ONE CONTROL CARD
*
{CNC01{BGE{SCNPT{SCNIL{CNC09{RETURN IF END OF IMAGE
{{MOV{R$CIM{R9{{POINT TO IMAGE
{{PLC{R9{SCNPT{{CHAR PTR FOR FIRST CHAR
{{LCH{R6{(R9)+{{GET FIRST CHAR
{{FLC{R6{{{FOLD TO UPPER CASE
{{BEQ{R6{#CH$LI{CNC07{SPECIAL CASE OF -INXXX
{{MNZ{SCNCC{{{SET FLAG FOR SCANE
{{JSR{SCANE{{{SCAN CARD NAME
{{ZER{SCNCC{{{CLEAR SCANE FLAG
{{BNZ{R10{CNC06{{FAIL UNLESS CONTROL CARD NAME
{{MOV{#CCNOC{R6{{NO. OF CHARS TO BE COMPARED
{{BLT{4*SCLEN(R9){R6{CNC06{FAIL IF TOO FEW CHARS
{{MOV{R9{R10{{POINT TO CONTROL CARD NAME
{{ZER{R7{{{ZERO OFFSET FOR SUBSTRING
{{JSR{SBSTR{{{EXTRACT SUBSTRING FOR COMPARISON
{{MOV{4*SCLEN(R9){R6{{RELOAD LENGTH
{{JSR{FLSTG{{{FOLD TO UPPER CASE
{{MOV{R9{CNSCC{{KEEP CONTROL CARD SUBSTRING PTR
{{MOV{#CCNMS{R9{{POINT TO LIST OF STANDARD NAMES
{{ZER{R7{{{INITIALISE NAME OFFSET
{{LCT{R8{#CC$NC{{NUMBER OF STANDARD NAMES
*
*      TRY TO MATCH NAME
*
{CNC02{MOV{CNSCC{R10{{POINT TO NAME
{{LCT{R6{CNSWC{{COUNTER FOR INNER LOOP
{{BRN{CNC04{{{JUMP INTO LOOP
*
*      INNER LOOP TO MATCH CARD NAME CHARS
*
{CNC03{ICA{R9{{{BUMP STANDARD NAMES PTR
{{ICA{R10{{{BUMP NAME POINTER
*
*      HERE TO INITIATE THE LOOP
*
{CNC04{CNE{4*SCHAR(R10){(R9){CNC05{COMP. UP TO CFP$C CHARS AT ONCE
{{BCT{R6{CNC03{{LOOP IF MORE WORDS TO COMPARE
{{EJC{{{{
*
*      CNCRD (CONTINUED)
*
*      MATCHED - BRANCH ON CARD OFFSET
*
{{MOV{R7{R10{{GET NAME OFFSET
{{BSW{R10{CC$NC{{SWITCH
{{IFF{CC$CA{CNC37{{-CASE
{{IFF{CC$DO{CNC10{{-DOUBLE
{{IFF{CC$DU{CNC11{{-DUMP
{{IFF{CC$EJ{CNC12{{-EJECT
{{IFF{CC$ER{CNC13{{-ERRORS
{{IFF{CC$EX{CNC14{{-EXECUTE
{{IFF{CC$FA{CNC15{{-FAIL
{{IFF{CC$LI{CNC16{{-LIST
{{IFF{CC$NR{CNC17{{-NOERRORS
{{IFF{CC$NX{CNC18{{-NOEXECUTE
{{IFF{CC$NF{CNC19{{-NOFAIL
{{IFF{CC$NL{CNC20{{-NOLIST
{{IFF{CC$NO{CNC21{{-NOOPT
{{IFF{CC$NP{CNC22{{-NOPRINT
{{IFF{CC$OP{CNC24{{-OPTIMISE
{{IFF{CC$PR{CNC25{{-PRINT
{{IFF{CC$SI{CNC27{{-SINGLE
{{IFF{CC$SP{CNC28{{-SPACE
{{IFF{CC$ST{CNC31{{-STITLE
{{IFF{CC$TI{CNC32{{-TITLE
{{IFF{CC$TR{CNC36{{-TRACE
{{ESW{{{{END SWITCH
*
*      NOT MATCHED YET. ALIGN STD NAMES PTR AND TRY AGAIN
*
{CNC05{ICA{R9{{{BUMP STANDARD NAMES PTR
{{BCT{R6{CNC05{{LOOP
{{ICV{R7{{{BUMP NAMES OFFSET
{{BCT{R8{CNC02{{CONTINUE IF MORE NAMES
*
*      INVALID CONTROL CARD NAME
*
{CNC06{ERB{247{INVALID{{CONTROL CARD
*
*      SPECIAL PROCESSING FOR -INXXX
*
{CNC07{LCH{R6{(R9){{GET NEXT CHAR
{{FLC{R6{{{FOLD TO UPPER CASE
{{BNE{R6{#CH$LN{CNC06{FAIL IF NOT LETTER N
{{ADD{#NUM02{SCNPT{{BUMP OFFSET PAST -IN
{{JSR{SCANE{{{SCAN INTEGER AFTER -IN
{{MOV{R9{-(SP){{STACK SCANNED ITEM
{{JSR{GTSMI{{{CHECK IF INTEGER
{{PPM{CNC06{{{FAIL IF NOT INTEGER
{{PPM{CNC06{{{FAIL IF NEGATIVE OR LARGE
{{MOV{R9{CSWIN{{KEEP INTEGER
{{EJC{{{{
*
*      CNCRD (CONTINUED)
*
*      CHECK FOR MORE CONTROL CARDS BEFORE RETURNING
*
{CNC08{MOV{SCNPT{R6{{PRESERVE IN CASE XEQ TIME COMPILE
{{JSR{SCANE{{{LOOK FOR COMMA
{{BEQ{R10{#T$CMA{CNC01{LOOP IF COMMA FOUND
{{MOV{R6{SCNPT{{RESTORE SCNPT IN CASE XEQ TIME
*
*      RETURN POINT
*
{CNC09{EXI{{{{RETURN
*
*      -DOUBLE
*
{CNC10{MNZ{CSWDB{{{SET SWITCH
{{BRN{CNC08{{{MERGE
*
*      -DUMP
*      THIS IS USED FOR SYSTEM DEBUGGING . IT HAS THE EFFECT OF
*      PRODUCING A CORE DUMP AT COMPILATION TIME
*
{CNC11{JSR{SYSDM{{{CALL DUMPER
{{BRN{CNC09{{{FINISHED
*
*      -EJECT
*
{CNC12{BZE{CSWLS{CNC09{{RETURN IF -NOLIST
{{JSR{PRTPS{{{EJECT
{{JSR{LISTT{{{LIST TITLE
{{BRN{CNC09{{{FINISHED
*
*      -ERRORS
*
{CNC13{ZER{CSWER{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -EXECUTE
*
{CNC14{ZER{CSWEX{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -FAIL
*
{CNC15{MNZ{CSWFL{{{SET SWITCH
{{BRN{CNC08{{{MERGE
*
*      -LIST
*
{CNC16{MNZ{CSWLS{{{SET SWITCH
{{BEQ{STAGE{#STGIC{CNC08{DONE IF COMPILE TIME
*
*      LIST CODE LINE IF EXECUTE TIME COMPILE
*
{{ZER{LSTPF{{{PERMIT LISTING
{{JSR{LISTR{{{LIST LINE
{{BRN{CNC08{{{MERGE
{{EJC{{{{
*
*      CNCRD (CONTINUED)
*
*      -NOERRORS
*
{CNC17{MNZ{CSWER{{{SET SWITCH
{{BRN{CNC08{{{MERGE
*
*      -NOEXECUTE
*
{CNC18{MNZ{CSWEX{{{SET SWITCH
{{BRN{CNC08{{{MERGE
*
*      -NOFAIL
*
{CNC19{ZER{CSWFL{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -NOLIST
*
{CNC20{ZER{CSWLS{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -NOOPTIMISE
*
{CNC21{MNZ{CSWNO{{{SET SWITCH
{{BRN{CNC08{{{MERGE
*
*      -NOPRINT
*
{CNC22{ZER{CSWPR{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -OPTIMISE
*
{CNC24{ZER{CSWNO{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -PRINT
*
{CNC25{MNZ{CSWPR{{{SET SWITCH
{{BRN{CNC08{{{MERGE
{{EJC{{{{
*
*      CNCRD (CONTINUED)
*
*      -SINGLE
*
{CNC27{ZER{CSWDB{{{CLEAR SWITCH
{{BRN{CNC08{{{MERGE
*
*      -SPACE
*
{CNC28{BZE{CSWLS{CNC09{{RETURN IF -NOLIST
{{JSR{SCANE{{{SCAN INTEGER AFTER -SPACE
{{MOV{#NUM01{R8{{1 SPACE IN CASE
{{BEQ{R9{#T$SMC{CNC29{JUMP IF NO INTEGER
{{MOV{R9{-(SP){{STACK IT
{{JSR{GTSMI{{{CHECK INTEGER
{{PPM{CNC06{{{FAIL IF NOT INTEGER
{{PPM{CNC06{{{FAIL IF NEGATIVE OR LARGE
{{BNZ{R8{CNC29{{JUMP IF NON ZERO
{{MOV{#NUM01{R8{{ELSE 1 SPACE
*
*      MERGE WITH COUNT OF LINES TO SKIP
*
{CNC29{ADD{R8{LSTLC{{BUMP LINE COUNT
{{LCT{R8{R8{{CONVERT TO LOOP COUNTER
{{BLT{LSTLC{LSTNP{CNC30{JUMP IF FITS ON PAGE
{{JSR{PRTPS{{{EJECT
{{JSR{LISTT{{{LIST TITLE
{{BRN{CNC09{{{MERGE
*
*      SKIP LINES
*
{CNC30{JSR{PRTNL{{{PRINT A BLANK
{{BCT{R8{CNC30{{LOOP
{{BRN{CNC09{{{MERGE
{{EJC{{{{
*
*      CNCRD (CONTINUED)
*
*      -STITL
*
{CNC31{MOV{#R$STL{CNR$T{{PTR TO R$STL
{{BRN{CNC33{{{MERGE
*
*      -TITLE
*
{CNC32{MOV{#NULLS{R$STL{{CLEAR SUBTITLE
{{MOV{#R$TTL{CNR$T{{PTR TO R$TTL
*
*      COMMON PROCESSING FOR -TITLE, -STITL
*
{CNC33{MOV{#NULLS{R9{{NULL IN CASE NEEDED
{{MNZ{CNTTL{{{SET FLAG FOR NEXT LISTR CALL
{{MOV{#CCOFS{R7{{OFFSET TO TITLE/SUBTITLE
{{MOV{SCNIL{R6{{INPUT IMAGE LENGTH
{{BLO{R6{R7{CNC34{JUMP IF NO CHARS LEFT
{{SUB{R7{R6{{NO OF CHARS TO EXTRACT
{{MOV{R$CIM{R10{{POINT TO IMAGE
{{JSR{SBSTR{{{GET TITLE/SUBTITLE
*
*      STORE TITLE/SUBTITLE
*
{CNC34{MOV{CNR$T{R10{{POINT TO STORAGE LOCATION
{{MOV{R9{(R10){{STORE TITLE/SUBTITLE
{{BEQ{R10{#R$STL{CNC09{RETURN IF STITL
{{BNZ{PRECL{CNC09{{RETURN IF EXTENDED LISTING
{{BZE{PRICH{CNC09{{RETURN IF REGULAR PRINTER
{{MOV{4*SCLEN(R9){R10{{GET LENGTH OF TITLE
{{MOV{R10{R6{{COPY IT
{{BZE{R10{CNC35{{JUMP IF NULL
{{ADD{#NUM10{R10{{INCREMENT
{{BHI{R10{PRLEN{CNC09{USE DEFAULT LSTP0 VAL IF TOO LONG
{{ADD{#NUM04{R6{{POINT JUST PAST TITLE
*
*      STORE OFFSET TO PAGE NN MESSAGE FOR SHORT TITLE
*
{CNC35{MOV{R6{LSTPO{{STORE OFFSET
{{BRN{CNC09{{{RETURN
*
*      -TRACE
*      PROVIDED FOR SYSTEM DEBUGGING.  TOGGLES THE SYSTEM LABEL
*      TRACE SWITCH AT COMPILE TIME
*
{CNC36{JSR{SYSTT{{{TOGGLE SWITCH
{{BRN{CNC08{{{MERGE
*
*      -CASE
*      SETS VALUE OF KVCAS SO THAT NAMES ARE FOLDED OR NOT
*      DURING COMPILATION.
*
{CNC37{JSR{SCANE{{{SCAN INTEGER AFTER -CASE
{{ZER{R8{{{GET 0 IN CASE NONE THERE
{{BEQ{R10{#T$SMC{CNC38{SKIP IF NO INTEGER
{{MOV{R9{-(SP){{STACK IT
{{JSR{GTSMI{{{CHECK INTEGER
{{PPM{CNC06{{{FAIL IF NOT INTEGER
{{PPM{CNC06{{{FAIL IF NEGATIVE OR TOO LARGE
{CNC38{MOV{R8{KVCAS{{STORE NEW CASE VALUE
{{BRN{CNC09{{{MERGE
{{ENP{{{{END PROCEDURE CNCRD
{{EJC{{{{
*
*      DFFNC -- DEFINE FUNCTION
*
*      DFFNC IS CALLED WHENEVER A NEW FUNCTION IS ASSIGNED TO
*      A VARIABLE. IT DEALS WITH EXTERNAL FUNCTION USE COUNTS.
*
*      (XR)                  POINTER TO VRBLK
*      (XL)                  POINTER TO NEW FUNCTION BLOCK
*      JSR  DFFNC            CALL TO DEFINE FUNCTION
*      (WA,WB)               DESTROYED
*
{DFFNC{PRC{E{0{{ENTRY POINT
{{BNE{(R10){#B$EFC{DFFN1{SKIP IF NEW FUNCTION NOT EXTERNAL
{{ICV{4*EFUSE(R10){{{ELSE INCREMENT ITS USE COUNT
*
*      HERE AFTER DEALING WITH NEW FUNCTION USE COUNT
*
{DFFN1{MOV{R9{R6{{SAVE VRBLK POINTER
{{MOV{4*VRFNC(R9){R9{{LOAD OLD FUNCTION POINTER
{{BNE{(R9){#B$EFC{DFFN2{JUMP IF OLD FUNCTION NOT EXTERNAL
{{MOV{4*EFUSE(R9){R7{{ELSE GET USE COUNT
{{DCV{R7{{{DECREMENT
{{MOV{R7{4*EFUSE(R9){{STORE DECREMENTED VALUE
{{BNZ{R7{DFFN2{{JUMP IF USE COUNT STILL NON-ZERO
{{JSR{SYSUL{{{ELSE CALL SYSTEM UNLOAD FUNCTION
*
*      HERE AFTER DEALING WITH OLD FUNCTION USE COUNT
*
{DFFN2{MOV{R6{R9{{RESTORE VRBLK POINTER
{{MOV{R10{R6{{COPY FUNCTION BLOCK PTR
{{BLT{R9{#R$YYY{DFFN3{SKIP CHECKS IF OPSYN OP DEFINITION
{{BNZ{4*VRLEN(R9){DFFN3{{JUMP IF NOT SYSTEM VARIABLE
*
*      FOR SYSTEM VARIABLE, CHECK FOR ILLEGAL REDEFINITION
*
{{MOV{4*VRSVP(R9){R10{{POINT TO SVBLK
{{MOV{4*SVBIT(R10){R7{{LOAD BIT INDICATORS
{{ANB{BTFNC{R7{{IS IT A SYSTEM FUNCTION
{{ZRB{R7{DFFN3{{REDEF OK IF NOT
{{ERB{248{ATTEMPTED{{REDEFINITION OF SYSTEM FUNCTION
*
*      HERE IF REDEFINITION IS PERMITTED
*
{DFFN3{MOV{R6{4*VRFNC(R9){{STORE NEW FUNCTION POINTER
{{MOV{R6{R10{{RESTORE FUNCTION BLOCK POINTER
{{EXI{{{{RETURN TO DFFNC CALLER
{{ENP{{{{END PROCEDURE DFFNC
{{EJC{{{{
*
*      DTACH -- DETACH I/O ASSOCIATED NAMES
*
*      DETACHES TRBLKS FROM I/O ASSOCIATED VARIABLES, REMOVES
*      ENTRY FROM IOCHN CHAIN ATTACHED TO FILEARG1 VRBLK AND MAY
*      REMOVE VRBLK ACCESS AND STORE TRAPS.
*      INPUT, OUTPUT, TERMINAL ARE HANDLED SPECIALLY.
*
*      (XL)                  I/O ASSOC. VBL NAME BASE PTR
*      (WA)                  OFFSET TO NAME
*      JSR  DTACH            CALL FOR DETACH OPERATION
*      (XL,XR,WA,WB,WC)      DESTROYED
*
{DTACH{PRC{E{0{{ENTRY POINT
{{MOV{R10{DTCNB{{STORE NAME BASE (GBCOL NOT CALLED)
{{ADD{R6{R10{{POINT TO NAME LOCATION
{{MOV{R10{DTCNM{{STORE IT
*
*      LOOP TO SEARCH FOR I/O TRBLK
*
{DTCH1{MOV{R10{R9{{COPY NAME POINTER
*
*      CONTINUE AFTER BLOCK DELETION
*
{DTCH2{MOV{(R10){R10{{POINT TO NEXT VALUE
{{BNE{(R10){#B$TRT{DTCH6{JUMP AT CHAIN END
{{MOV{4*TRTYP(R10){R6{{GET TRAP BLOCK TYPE
{{BEQ{R6{#TRTIN{DTCH3{JUMP IF INPUT
{{BEQ{R6{#TRTOU{DTCH3{JUMP IF OUTPUT
{{ADD{#4*TRNXT{R10{{POINT TO NEXT LINK
{{BRN{DTCH1{{{LOOP
*
*      DELETE AN OLD ASSOCIATION
*
{DTCH3{MOV{4*TRVAL(R10){(R9){{DELETE TRBLK
{{MOV{R10{R6{{DUMP XL ...
{{MOV{R9{R7{{... AND XR
{{MOV{4*TRTRF(R10){R10{{POINT TO TRTRF TRAP BLOCK
{{BZE{R10{DTCH5{{JUMP IF NO IOCHN
{{BNE{(R10){#B$TRT{DTCH5{JUMP IF INPUT, OUTPUT, TERMINAL
*
*      LOOP TO SEARCH IOCHN CHAIN FOR NAME PTR
*
{DTCH4{MOV{R10{R9{{REMEMBER LINK PTR
{{MOV{4*TRTRF(R10){R10{{POINT TO NEXT LINK
{{BZE{R10{DTCH5{{JUMP IF END OF CHAIN
{{MOV{4*IONMB(R10){R8{{GET NAME BASE
{{ADD{4*IONMO(R10){R8{{ADD OFFSET
{{BNE{R8{DTCNM{DTCH4{LOOP IF NO MATCH
{{MOV{4*TRTRF(R10){4*TRTRF(R9){{REMOVE NAME FROM CHAIN
{{EJC{{{{
*
*      DTACH (CONTINUED)
*
*      PREPARE TO RESUME I/O TRBLK SCAN
*
{DTCH5{MOV{R6{R10{{RECOVER XL ...
{{MOV{R7{R9{{... AND XR
{{ADD{#4*TRVAL{R10{{POINT TO VALUE FIELD
{{BRN{DTCH2{{{CONTINUE
*
*      EXIT POINT
*
{DTCH6{MOV{DTCNB{R9{{POSSIBLE VRBLK PTR
{{JSR{SETVR{{{RESET VRBLK IF NECESSARY
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE DTACH
{{EJC{{{{
*
*      DTYPE -- GET DATATYPE NAME
*
*      (XR)                  OBJECT WHOSE DATATYPE IS REQUIRED
*      JSR  DTYPE            CALL TO GET DATATYPE
*      (XR)                  RESULT DATATYPE
*
{DTYPE{PRC{E{0{{ENTRY POINT
{{BEQ{(R9){#B$PDT{DTYP1{JUMP IF PROG.DEFINED
{{MOV{(R9){R9{{LOAD TYPE WORD
{{LEI{R9{{{GET ENTRY POINT ID (BLOCK CODE)
{{WTB{R9{{{CONVERT TO BYTE OFFSET
{{MOV{L^SCNMT(R9){R9{{LOAD TABLE ENTRY
{{EXI{{{{EXIT TO DTYPE CALLER
*
*      HERE IF PROGRAM DEFINED
*
{DTYP1{MOV{4*PDDFP(R9){R9{{POINT TO DFBLK
{{MOV{4*DFNAM(R9){R9{{GET DATATYPE NAME FROM DFBLK
{{EXI{{{{RETURN TO DTYPE CALLER
{{ENP{{{{END PROCEDURE DTYPE
{{EJC{{{{
*
*      DUMPR -- PRINT DUMP OF STORAGE
*
*      (XR)                  DUMP ARGUMENT (SEE BELOW)
*      JSR  DUMPR            CALL TO PRINT DUMP
*      (XR,XL)               DESTROYED
*      (WA,WB,WC,RA)         DESTROYED
*
*      THE DUMP ARGUMENT HAS THE FOLLOWING SIGNIFICANCE
*
*      DMARG = 0             NO DUMP PRINTED
*      DMARG = 1             PARTIAL DUMP (NAT VARS, KEYWORDS)
*      DMARG EQ 2            FULL DUMP (INCL ARRAYS ETC.)
*      DMARG GE 3            CORE DUMP
*
*      SINCE DUMPR SCRAMBLES STORE, IT IS NOT PERMISSIBLE TO
*      COLLECT IN MID-DUMP. HENCE A COLLECT IS DONE INITIALLY
*      AND THEN IF STORE RUNS OUT AN ERROR MESSAGE IS PRODUCED.
*
{DUMPR{PRC{E{0{{ENTRY POINT
{{BZE{R9{DMP28{{SKIP DUMP IF ARGUMENT IS ZERO
{{BGT{R9{#NUM02{DMP29{JUMP IF CORE DUMP REQUIRED
{{ZER{R10{{{CLEAR XL
{{ZER{R7{{{ZERO MOVE OFFSET
{{MOV{R9{DMARG{{SAVE DUMP ARGUMENT
{{JSR{GBCOL{{{COLLECT GARBAGE
{{JSR{PRTPG{{{EJECT PRINTER
{{MOV{#DMHDV{R9{{POINT TO HEADING FOR VARIABLES
{{JSR{PRTST{{{PRINT IT
{{JSR{PRTNL{{{TERMINATE PRINT LINE
{{JSR{PRTNL{{{AND PRINT A BLANK LINE
*
*      FIRST ALL NATURAL VARIABLE BLOCKS (VRBLK) WHOSE VALUES
*      ARE NON-NULL ARE LINKED IN LEXICAL ORDER USING DMVCH AS
*      THE CHAIN HEAD AND CHAINING THROUGH THE VRGET FIELDS.
*      NOTE THAT THIS SCRAMBLES STORE IF THE PROCESS IS
*      INTERRUPTED BEFORE COMPLETION E.G. BY EXCEEDING TIME  OR
*      PRINT LIMITS. SINCE THE SUBSEQUENT CORE DUMPS AND
*      FAILURES IF EXECUTION IS RESUMED ARE VERY CONFUSING, THE
*      EXECUTION TIME ERROR ROUTINE CHECKS FOR THIS EVENT AND
*      ATTEMPTS AN UNSCRAMBLE. SIMILAR PRECAUTIONS SHOULD BE
*      OBSERVED IF TRANSLATE TIME DUMPING IS IMPLEMENTED.
*
{{ZER{DMVCH{{{SET NULL CHAIN TO START
{{MOV{HSHTB{R6{{POINT TO HASH TABLE
*
*      LOOP THROUGH HEADERS IN HASH TABLE
*
{DMP00{MOV{R6{R9{{COPY HASH BUCKET POINTER
{{ICA{R6{{{BUMP POINTER
{{SUB{#4*VRNXT{R9{{SET OFFSET TO MERGE
*
*      LOOP THROUGH VRBLKS ON ONE CHAIN
*
{DMP01{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON CHAIN
{{BZE{R9{DMP09{{JUMP IF END OF THIS HASH CHAIN
{{MOV{R9{R10{{ELSE COPY VRBLK POINTER
{{EJC{{{{
*
*      DUMPR (CONTINUED)
*
*      LOOP TO FIND VALUE AND SKIP IF NULL
*
{DMP02{MOV{4*VRVAL(R10){R10{{LOAD VALUE
{{BEQ{R10{#NULLS{DMP01{LOOP FOR NEXT VRBLK IF NULL VALUE
{{BEQ{(R10){#B$TRT{DMP02{LOOP BACK IF VALUE IS TRAPPED
*
*      NON-NULL VALUE, PREPARE TO SEARCH CHAIN
*
{{MOV{R9{R8{{SAVE VRBLK POINTER
{{ADD{#4*VRSOF{R9{{ADJUST PTR TO BE LIKE SCBLK PTR
{{BNZ{4*SCLEN(R9){DMP03{{JUMP IF NON-SYSTEM VARIABLE
{{MOV{4*VRSVO(R9){R9{{ELSE LOAD PTR TO NAME IN SVBLK
*
*      HERE WITH NAME POINTER FOR NEW BLOCK IN XR
*
{DMP03{MOV{R9{R7{{SAVE POINTER TO CHARS
{{MOV{R6{DMPSV{{SAVE HASH BUCKET POINTER
{{MOV{#DMVCH{R6{{POINT TO CHAIN HEAD
*
*      LOOP TO SEARCH CHAIN FOR CORRECT INSERTION POINT
*
{DMP04{MOV{R6{DMPCH{{SAVE CHAIN POINTER
{{MOV{R6{R10{{COPY IT
{{MOV{(R10){R9{{LOAD POINTER TO NEXT ENTRY
{{BZE{R9{DMP08{{JUMP IF END OF CHAIN TO INSERT
{{ADD{#4*VRSOF{R9{{ELSE GET NAME PTR FOR CHAINED VRBLK
{{BNZ{4*SCLEN(R9){DMP05{{JUMP IF NOT SYSTEM VARIABLE
{{MOV{4*VRSVO(R9){R9{{ELSE POINT TO NAME IN SVBLK
*
*      HERE PREPARE TO COMPARE THE NAMES
*
*      (WA)                  SCRATCH
*      (WB)                  POINTER TO STRING OF ENTERING VRBLK
*      (WC)                  POINTER TO ENTERING VRBLK
*      (XR)                  POINTER TO STRING OF CURRENT BLOCK
*      (XL)                  SCRATCH
*
{DMP05{MOV{R7{R10{{POINT TO ENTERING VRBLK STRING
{{MOV{4*SCLEN(R10){R6{{LOAD ITS LENGTH
{{PLC{R10{{{POINT TO CHARS OF ENTERING STRING
{{BHI{R6{4*SCLEN(R9){DMP06{JUMP IF ENTERING LENGTH HIGH
{{PLC{R9{{{ELSE POINT TO CHARS OF OLD STRING
{{CMC{DMP08{DMP07{{COMPARE, INSERT IF NEW IS LLT OLD
{{BRN{DMP08{{{OR IF LEQ (WE HAD SHORTER LENGTH)
*
*      HERE WHEN NEW LENGTH IS LONGER THAN OLD LENGTH
*
{DMP06{MOV{4*SCLEN(R9){R6{{LOAD SHORTER LENGTH
{{PLC{R9{{{POINT TO CHARS OF OLD STRING
{{CMC{DMP08{DMP07{{COMPARE, INSERT IF NEW ONE LOW
{{EJC{{{{
*
*      DUMPR (CONTINUED)
*
*      HERE WE MOVE OUT ON THE CHAIN
*
{DMP07{MOV{DMPCH{R10{{COPY CHAIN POINTER
{{MOV{(R10){R6{{MOVE TO NEXT ENTRY ON CHAIN
{{BRN{DMP04{{{LOOP BACK
*
*      HERE AFTER LOCATING THE PROPER INSERTION POINT
*
{DMP08{MOV{DMPCH{R10{{COPY CHAIN POINTER
{{MOV{DMPSV{R6{{RESTORE HASH BUCKET POINTER
{{MOV{R8{R9{{RESTORE VRBLK POINTER
{{MOV{(R10){4*VRGET(R9){{LINK VRBLK TO REST OF CHAIN
{{MOV{R9{(R10){{LINK VRBLK INTO CURRENT CHAIN LOC
{{BRN{DMP01{{{LOOP BACK FOR NEXT VRBLK
*
*      HERE AFTER PROCESSING ALL VRBLKS ON ONE CHAIN
*
{DMP09{BNE{R6{HSHTE{DMP00{LOOP BACK IF MORE BUCKETS TO GO
*
*      LOOP TO GENERATE DUMP OF NATURAL VARIABLE VALUES
*
{DMP10{MOV{DMVCH{R9{{LOAD POINTER TO NEXT ENTRY ON CHAIN
{{BZE{R9{DMP11{{JUMP IF END OF CHAIN
{{MOV{(R9){DMVCH{{ELSE UPDATE CHAIN PTR TO NEXT ENTRY
{{JSR{SETVR{{{RESTORE VRGET FIELD
{{MOV{R9{R10{{COPY VRBLK POINTER (NAME BASE)
{{MOV{#4*VRVAL{R6{{SET OFFSET FOR VRBLK NAME
{{JSR{PRTNV{{{PRINT NAME = VALUE
{{BRN{DMP10{{{LOOP BACK TILL ALL PRINTED
*
*      PREPARE TO PRINT KEYWORDS
*
{DMP11{JSR{PRTNL{{{PRINT BLANK LINE
{{JSR{PRTNL{{{AND ANOTHER
{{MOV{#DMHDK{R9{{POINT TO KEYWORD HEADING
{{JSR{PRTST{{{PRINT HEADING
{{JSR{PRTNL{{{END LINE
{{JSR{PRTNL{{{PRINT ONE BLANK LINE
{{MOV{#VDMKW{R10{{POINT TO LIST OF KEYWORD SVBLK PTRS
{{EJC{{{{
*
*      DUMPR (CONTINUED)
*
*      LOOP TO DUMP KEYWORD VALUES
*
{DMP12{MOV{(R10)+{R9{{LOAD NEXT SVBLK PTR FROM TABLE
{{BZE{R9{DMP13{{JUMP IF END OF LIST
{{MOV{#CH$AM{R6{{LOAD AMPERSAND
{{JSR{PRTCH{{{PRINT AMPERSAND
{{JSR{PRTST{{{PRINT KEYWORD NAME
{{MOV{4*SVLEN(R9){R6{{LOAD NAME LENGTH FROM SVBLK
{{CTB{R6{SVCHS{{GET LENGTH OF NAME
{{ADD{R6{R9{{POINT TO SVKNM FIELD
{{MOV{(R9){DMPKN{{STORE IN DUMMY KVBLK
{{MOV{#TMBEB{R9{{POINT TO BLANK-EQUAL-BLANK
{{JSR{PRTST{{{PRINT IT
{{MOV{R10{DMPSV{{SAVE TABLE POINTER
{{MOV{#DMPKB{R10{{POINT TO DUMMY KVBLK
{{MOV{#4*KVVAR{R6{{SET ZERO OFFSET
{{JSR{ACESS{{{GET KEYWORD VALUE
{{PPM{{{{FAILURE IS IMPOSSIBLE
{{JSR{PRTVL{{{PRINT KEYWORD VALUE
{{JSR{PRTNL{{{TERMINATE PRINT LINE
{{MOV{DMPSV{R10{{RESTORE TABLE POINTER
{{BRN{DMP12{{{LOOP BACK TILL ALL PRINTED
*
*      HERE AFTER COMPLETING PARTIAL DUMP
*
{DMP13{BEQ{DMARG{#NUM01{DMP27{EXIT IF PARTIAL DUMP COMPLETE
{{MOV{DNAMB{R9{{ELSE POINT TO FIRST DYNAMIC BLOCK
*
*      LOOP THROUGH BLOCKS IN DYNAMIC STORAGE
*
{DMP14{BEQ{R9{DNAMP{DMP27{JUMP IF END OF USED REGION
{{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF BLOCK
{{BEQ{R6{#B$VCT{DMP16{JUMP IF VECTOR
{{BEQ{R6{#B$ART{DMP17{JUMP IF ARRAY
{{BEQ{R6{#B$PDT{DMP18{JUMP IF PROGRAM DEFINED
{{BEQ{R6{#B$TBT{DMP19{JUMP IF TABLE
{{BEQ{R6{#B$BCT{DMP30{JUMP IF BUFFER
*
*      MERGE HERE TO MOVE TO NEXT BLOCK
*
{DMP15{JSR{BLKLN{{{GET LENGTH OF BLOCK
{{ADD{R6{R9{{POINT PAST THIS BLOCK
{{BRN{DMP14{{{LOOP BACK FOR NEXT BLOCK
{{EJC{{{{
*
*      DUMPR (CONTINUED)
*
*      HERE FOR VECTOR
*
{DMP16{MOV{#4*VCVLS{R7{{SET OFFSET TO FIRST VALUE
{{BRN{DMP19{{{JUMP TO MERGE
*
*      HERE FOR ARRAY
*
{DMP17{MOV{4*AROFS(R9){R7{{SET OFFSET TO ARPRO FIELD
{{ICA{R7{{{BUMP TO GET OFFSET TO VALUES
{{BRN{DMP19{{{JUMP TO MERGE
*
*      HERE FOR PROGRAM DEFINED
*
{DMP18{MOV{#4*PDFLD{R7{{POINT TO VALUES, MERGE
*
*      HERE FOR TABLE (OTHERS MERGE)
*
{DMP19{BZE{4*IDVAL(R9){DMP15{{IGNORE BLOCK IF ZERO ID VALUE
{{JSR{BLKLN{{{ELSE GET BLOCK LENGTH
{{MOV{R9{R10{{COPY BLOCK POINTER
{{MOV{R6{DMPSV{{SAVE LENGTH
{{MOV{R7{R6{{COPY OFFSET TO FIRST VALUE
{{JSR{PRTNL{{{PRINT BLANK LINE
{{MOV{R6{DMPSA{{PRESERVE OFFSET
{{JSR{PRTVL{{{PRINT BLOCK VALUE (FOR TITLE)
{{MOV{DMPSA{R6{{RECOVER OFFSET
{{JSR{PRTNL{{{END PRINT LINE
{{BEQ{(R9){#B$TBT{DMP22{JUMP IF TABLE
{{DCA{R6{{{POINT BEFORE FIRST WORD
*
*      LOOP TO PRINT CONTENTS OF ARRAY, VECTOR, OR PROGRAM DEF
*
{DMP20{MOV{R10{R9{{COPY BLOCK POINTER
{{ICA{R6{{{BUMP OFFSET
{{ADD{R6{R9{{POINT TO NEXT VALUE
{{BEQ{R6{DMPSV{DMP14{EXIT IF END (XR PAST BLOCK)
{{SUB{#4*VRVAL{R9{{SUBTRACT OFFSET TO MERGE INTO LOOP
*
*      LOOP TO FIND VALUE AND IGNORE NULLS
*
{DMP21{MOV{4*VRVAL(R9){R9{{LOAD NEXT VALUE
{{BEQ{R9{#NULLS{DMP20{LOOP BACK IF NULL VALUE
{{BEQ{(R9){#B$TRT{DMP21{LOOP BACK IF TRAPPED
{{JSR{PRTNV{{{ELSE PRINT NAME = VALUE
{{BRN{DMP20{{{LOOP BACK FOR NEXT FIELD
{{EJC{{{{
*
*      DUMPR (CONTINUED)
*
*      HERE TO DUMP A TABLE
*
{DMP22{MOV{#4*TBBUK{R8{{SET OFFSET TO FIRST BUCKET
{{MOV{#4*TEVAL{R6{{SET NAME OFFSET FOR ALL TEBLKS
*
*      LOOP THROUGH TABLE BUCKETS
*
{DMP23{MOV{R10{-(SP){{SAVE TBBLK POINTER
{{ADD{R8{R10{{POINT TO NEXT BUCKET HEADER
{{ICA{R8{{{BUMP BUCKET OFFSET
{{SUB{#4*TENXT{R10{{SUBTRACT OFFSET TO MERGE INTO LOOP
*
*      LOOP TO PROCESS TEBLKS ON ONE CHAIN
*
{DMP24{MOV{4*TENXT(R10){R10{{POINT TO NEXT TEBLK
{{BEQ{R10{(SP){DMP26{JUMP IF END OF CHAIN
{{MOV{R10{R9{{ELSE COPY TEBLK POINTER
*
*      LOOP TO FIND VALUE AND IGNORE IF NULL
*
{DMP25{MOV{4*TEVAL(R9){R9{{LOAD NEXT VALUE
{{BEQ{R9{#NULLS{DMP24{IGNORE IF NULL VALUE
{{BEQ{(R9){#B$TRT{DMP25{LOOP BACK IF TRAPPED
{{MOV{R8{DMPSV{{ELSE SAVE OFFSET POINTER
{{JSR{PRTNV{{{PRINT NAME = VALUE
{{MOV{DMPSV{R8{{RELOAD OFFSET
{{BRN{DMP24{{{LOOP BACK FOR NEXT TEBLK
*
*      HERE TO MOVE TO NEXT HASH CHAIN
*
{DMP26{MOV{(SP)+{R10{{RESTORE TBBLK POINTER
{{BNE{R8{4*TBLEN(R10){DMP23{LOOP BACK IF MORE BUCKETS TO GO
{{MOV{R10{R9{{ELSE COPY TABLE POINTER
{{ADD{R8{R9{{POINT TO FOLLOWING BLOCK
{{BRN{DMP14{{{LOOP BACK TO PROCESS NEXT BLOCK
*
*      HERE AFTER COMPLETING DUMP
*
{DMP27{JSR{PRTPG{{{EJECT PRINTER
*
*      MERGE HERE IF NO DUMP GIVEN (DMARG=0)
*
{DMP28{EXI{{{{RETURN TO DUMP CALLER
*
*      CALL SYSTEM CORE DUMP ROUTINE
*
{DMP29{JSR{SYSDM{{{CALL IT
{{BRN{DMP28{{{RETURN
{{EJC{{{{
*
*      DUMPR (CONTINUED)
*
*      HERE TO DUMP BUFFER BLOCK
*
{DMP30{JSR{PRTNL{{{PRINT BLANK LINE
{{JSR{PRTVL{{{PRINT VALUE ID FOR TITLE
{{JSR{PRTNL{{{FORCE NEW LINE
{{MOV{#CH$DQ{R6{{LOAD DOUBLE QUOTE
{{JSR{PRTCH{{{PRINT IT
{{MOV{4*BCLEN(R9){R8{{LOAD DEFINED LENGTH
{{BZE{R8{DMP32{{SKIP CHARACTERS IF NONE
{{LCT{R8{R8{{LOAD COUNT FOR LOOP
{{MOV{R9{R7{{SAVE BCBLK PTR
{{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
{{PLC{R9{{{GET SET TO LOAD CHARACTERS
*
*      LOOP HERE STUFFING CHARACTERS IN OUTPUT STREAM
*
{DMP31{LCH{R6{(R9)+{{GET NEXT CHARACTER
{{JSR{PRTCH{{{STUFF IT
{{BCT{R8{DMP31{{BRANCH FOR NEXT ONE
{{MOV{R7{R9{{RESTORE BCBLK POINTER
*
*      MERGE TO STUFF CLOSING QUOTE MARK
*
{DMP32{MOV{#CH$DQ{R6{{STUFF QUOTE
{{JSR{PRTCH{{{PRINT IT
{{JSR{PRTNL{{{PRINT NEW LINE
{{MOV{(R9){R6{{GET FIRST WD FOR BLKLN
{{BRN{DMP15{{{MERGE TO GET NEXT BLOCK
{{ENP{{{{END PROCEDURE DUMPR
{{EJC{{{{
*
*      ERMSG -- PRINT ERROR CODE AND ERROR MESSAGE
*
*      KVERT                 ERROR CODE
*      JSR  ERMSG            CALL TO PRINT MESSAGE
*      (XR,XL,WA,WB,WC,IA)   DESTROYED
*
{ERMSG{PRC{E{0{{ENTRY POINT
{{JSR{PRTIS{{{PRINT ERROR PTR OR BLANK LINE
{{MOV{KVERT{R6{{LOAD ERROR CODE
{{MOV{#ERMMS{R9{{POINT TO ERROR MESSAGE /ERROR/
{{JSR{PRTST{{{PRINT IT
{{JSR{ERTEX{{{GET ERROR MESSAGE TEXT
{{ADD{#THSND{R6{{BUMP ERROR CODE FOR PRINT
{{MTI{R6{{{FAIL CODE IN INT ACC
{{JSR{PRTIN{{{PRINT CODE (NOW HAVE ERROR1XXX)
{{MOV{PRBUF{R10{{POINT TO PRINT BUFFER
{{PSC{R10{#NUM05{{POINT TO THE 1
{{MOV{#CH$BL{R6{{LOAD A BLANK
{{SCH{R6{(R10){{STORE BLANK OVER 1 (ERROR XXX)
{{CSC{R10{{{COMPLETE STORE CHARACTERS
{{ZER{R10{{{CLEAR GARBAGE POINTER IN XL
{{MOV{R9{R6{{KEEP ERROR TEXT
{{MOV{#ERMNS{R9{{POINT TO / -- /
{{JSR{PRTST{{{PRINT IT
{{MOV{R6{R9{{GET ERROR TEXT AGAIN
{{JSR{PRTST{{{PRINT ERROR MESSAGE TEXT
{{JSR{PRTIS{{{PRINT LINE
{{JSR{PRTIS{{{PRINT BLANK LINE
{{EXI{{{{RETURN TO ERMSG CALLER
{{ENP{{{{END PROCEDURE ERMSG
{{EJC{{{{
*
*      ERTEX -- GET ERROR MESSAGE TEXT
*
*      (WA)                  ERROR CODE
*      JSR  ERTEX            CALL TO GET ERROR TEXT
*      (XR)                  PTR TO ERROR TEXT IN DYNAMIC
*      (R$ETX)               COPY OF PTR TO ERROR TEXT
*      (XL,WC,IA)            DESTROYED
*
{ERTEX{PRC{E{0{{ENTRY POINT
{{MOV{R6{ERTWA{{SAVE WA
{{MOV{R7{ERTWB{{SAVE WB
{{JSR{SYSEM{{{GET FAILURE MESSAGE TEXT
{{MOV{R9{R10{{COPY POINTER TO IT
{{MOV{4*SCLEN(R9){R6{{GET LENGTH OF STRING
{{BZE{R6{ERT02{{JUMP IF NULL
{{ZER{R7{{{OFFSET OF ZERO
{{JSR{SBSTR{{{COPY INTO DYNAMIC STORE
{{MOV{R9{R$ETX{{STORE FOR RELOCATION
*
*      RETURN
*
{ERT01{MOV{ERTWB{R7{{RESTORE WB
{{MOV{ERTWA{R6{{RESTORE WA
{{EXI{{{{RETURN TO CALLER
*
*      RETURN ERRTEXT CONTENTS INSTEAD OF NULL
*
{ERT02{MOV{R$ETX{R9{{GET ERRTEXT
{{BRN{ERT01{{{RETURN
{{ENP{{{{
{{EJC{{{{
*
*      EVALI -- EVALUATE INTEGER ARGUMENT
*
*      EVALI IS USED BY PATTERN PRIMITIVES LEN,TAB,RTAB,POS,RPOS
*      WHEN THEIR ARGUMENT IS AN EXPRESSION VALUE.
*
*      (XR)                  NODE POINTER
*      (WB)                  CURSOR
*      JSR  EVALI            CALL TO EVALUATE INTEGER
*      PPM  LOC              TRANSFER LOC FOR NON-INTEGER ARG
*      PPM  LOC              TRANSFER LOC FOR OUT OF RANGE ARG
*      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
*      PPM  LOC              TRANSFER LOC FOR SUCCESSFUL EVAL
*      (THE NORMAL RETURN IS NEVER TAKEN)
*      (XR)                  PTR TO NODE WITH INTEGER ARGUMENT
*      (WC,XL,RA)            DESTROYED
*
*      ON RETURN, THE NODE POINTED TO HAS THE INTEGER ARGUMENT
*      IN PARM1 AND THE PROPER SUCCESSOR POINTER IN PTHEN.
*      THIS ALLOWS MERGING WITH THE NORMAL (INTEGER ARG) CASE.
*
{EVALI{PRC{R{4{{ENTRY POINT (RECURSIVE)
{{JSR{EVALP{{{EVALUATE EXPRESSION
{{PPM{EVLI1{{{JUMP ON FAILURE
{{MOV{R10{-(SP){{STACK RESULT FOR GTSMI
{{MOV{4*PTHEN(R9){R10{{LOAD SUCCESSOR POINTER
{{JSR{GTSMI{{{CONVERT ARG TO SMALL INTEGER
{{PPM{EVLI2{{{JUMP IF NOT INTEGER
{{PPM{EVLI3{{{JUMP IF OUT OF RANGE
{{MOV{R9{EVLIV{{STORE RESULT IN SPECIAL DUMMY NODE
{{MOV{R10{EVLIS{{STORE SUCCESSOR POINTER
{{MOV{#EVLIN{R9{{POINT TO DUMMY NODE WITH RESULT
{{EXI{4{{{TAKE SUCCESSFUL EXIT
*
*      HERE IF EVALUATION FAILS
*
{EVLI1{EXI{3{{{TAKE FAILURE RETURN
*
*      HERE IF ARGUMENT IS NOT INTEGER
*
{EVLI2{EXI{1{{{TAKE NON-INTEGER ERROR EXIT
*
*      HERE IF ARGUMENT IS OUT OF RANGE
*
{EVLI3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT
{{ENP{{{{END PROCEDURE EVALI
{{EJC{{{{
*
*      EVALP -- EVALUATE EXPRESSION DURING PATTERN MATCH
*
*      EVALP IS USED TO EVALUATE AN EXPRESSION (BY VALUE) DURING
*      A PATTERN MATCH. THE EFFECT IS LIKE EVALX, BUT PATTERN
*      VARIABLES ARE STACKED AND RESTORED IF NECESSARY.
*
*      EVALP ALSO DIFFERS FROM EVALX IN THAT IF THE RESULT IS
*      AN EXPRESSION IT IS REEVALUATED. THIS OCCURS REPEATEDLY.
*
*      (XR)                  NODE POINTER
*      (WB)                  PATTERN MATCH CURSOR
*      JSR  EVALP            CALL TO EVALUATE EXPRESSION
*      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
*      (XL)                  RESULT
*      (WA)                  FIRST WORD OF RESULT BLOCK
*      (XR,WB)               DESTROYED (FAILURE CASE ONLY)
*      (WC,RA)               DESTROYED
*
*      THE EXPRESSION POINTER IS STORED IN PARM1 OF THE NODE
*
*      CONTROL RETURNS TO FAILP ON FAILURE OF EVALUATION
*
{EVALP{PRC{R{1{{ENTRY POINT (RECURSIVE)
{{MOV{4*PARM1(R9){R10{{LOAD EXPRESSION POINTER
{{BEQ{(R10){#B$EXL{EVLP1{JUMP IF EXBLK CASE
*
*      HERE FOR CASE OF SEBLK
*
*      WE CAN GIVE A FAST RETURN IF THE VALUE OF THE VRBLK IS
*      NOT AN EXPRESSION AND IS NOT TRAPPED.
*
{{MOV{4*SEVAR(R10){R10{{LOAD VRBLK POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD VALUE OF VRBLK
{{MOV{(R10){R6{{LOAD FIRST WORD OF VALUE
{{BHI{R6{#B$T$${EVLP3{JUMP IF NOT SEBLK, TRBLK OR EXBLK
*
*      HERE FOR EXBLK OR SEBLK WITH EXPR VALUE OR TRAPPED VALUE
*
{EVLP1{MOV{R9{-(SP){{STACK NODE POINTER
{{MOV{R7{-(SP){{STACK CURSOR
{{MOV{R$PMS{-(SP){{STACK SUBJECT STRING POINTER
{{MOV{PMSSL{-(SP){{STACK SUBJECT STRING LENGTH
{{MOV{PMDFL{-(SP){{STACK DOT FLAG
{{MOV{PMHBS{-(SP){{STACK HISTORY STACK BASE POINTER
{{MOV{4*PARM1(R9){R9{{LOAD EXPRESSION POINTER
{{EJC{{{{
*
*      EVALP (CONTINUED)
*
*      LOOP BACK HERE TO REEVALUATE EXPRESSION RESULT
*
{EVLP2{ZER{R7{{{SET FLAG FOR BY VALUE
{{JSR{EVALX{{{EVALUATE EXPRESSION
{{PPM{EVLP4{{{JUMP ON FAILURE
{{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF VALUE
{{BLO{R6{#B$E$${EVLP2{LOOP BACK TO REEVALUATE EXPRESSION
*
*      HERE TO RESTORE PATTERN VALUES AFTER SUCCESSFUL EVAL
*
{{MOV{R9{R10{{COPY RESULT POINTER
{{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
{{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
{{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
{{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
{{MOV{(SP)+{R7{{RESTORE CURSOR
{{MOV{(SP)+{R9{{RESTORE NODE POINTER
*
*      COMMON EXIT POINT
*
{EVLP3{EXI{{{{RETURN TO EVALP CALLER
*
*      HERE FOR FAILURE DURING EVALUATION
*
{EVLP4{MOV{(SP)+{PMHBS{{RESTORE HISTORY STACK BASE POINTER
{{MOV{(SP)+{PMDFL{{RESTORE DOT FLAG
{{MOV{(SP)+{PMSSL{{RESTORE SUBJECT STRING LENGTH
{{MOV{(SP)+{R$PMS{{RESTORE SUBJECT STRING POINTER
{{ADD{#4*NUM02{SP{{REMOVE NODE PTR, CURSOR
{{EXI{1{{{TAKE FAILURE EXIT
{{ENP{{{{END PROCEDURE EVALP
{{EJC{{{{
*
*      EVALS -- EVALUATE STRING ARGUMENT
*
*      EVALS IS USED BY SPAN, ANY, NOTANY, BREAK, BREAKX WHEN
*      THEY ARE PASSED AN EXPRESSION ARGUMENT.
*
*      (XR)                  NODE POINTER
*      (WB)                  CURSOR
*      JSR  EVALS            CALL TO EVALUATE STRING
*      PPM  LOC              TRANSFER LOC FOR NON-STRING ARG
*      PPM  LOC              TRANSFER LOC FOR EVALUATION FAILURE
*      PPM  LOC              TRANSFER LOC FOR SUCCESSFUL EVAL
*      (THE NORMAL RETURN IS NEVER TAKEN)
*      (XR)                  PTR TO NODE WITH PARMS SET
*      (XL,WC,RA)            DESTROYED
*
*      ON RETURN, THE NODE POINTED TO HAS A CHARACTER TABLE
*      POINTER IN PARM1 AND A BIT MASK IN PARM2. THE PROPER
*      SUCCESSOR IS STORED IN PTHEN OF THIS NODE. THUS IT IS
*      OK FOR MERGING WITH THE NORMAL (MULTI-CHAR STRING) CASE.
*
{EVALS{PRC{R{3{{ENTRY POINT (RECURSIVE)
{{JSR{EVALP{{{EVALUATE EXPRESSION
{{PPM{EVLS1{{{JUMP IF EVALUATION FAILS
{{MOV{4*PTHEN(R9){-(SP){{SAVE SUCCESSOR POINTER
{{MOV{R7{-(SP){{SAVE CURSOR
{{MOV{R10{-(SP){{STACK RESULT PTR FOR PATST
{{ZER{R7{{{DUMMY PCODE FOR ONE CHAR STRING
{{ZER{R8{{{DUMMY PCODE FOR EXPRESSION ARG
{{MOV{#P$BRK{R10{{APPROPRIATE PCODE FOR OUR USE
{{JSR{PATST{{{CALL ROUTINE TO BUILD NODE
{{PPM{EVLS2{{{JUMP IF NOT STRING
{{MOV{(SP)+{R7{{RESTORE CURSOR
{{MOV{(SP)+{4*PTHEN(R9){{STORE SUCCESSOR POINTER
{{EXI{3{{{TAKE SUCCESS RETURN
*
*      HERE IF EVALUATION FAILS
*
{EVLS1{EXI{2{{{TAKE FAILURE RETURN
*
*      HERE IF ARGUMENT IS NOT STRING
*
{EVLS2{ADD{#4*NUM02{SP{{POP SUCCESSOR AND CURSOR
{{EXI{1{{{TAKE NON-STRING ERROR EXIT
{{ENP{{{{END PROCEDURE EVALS
{{EJC{{{{
*
*      EVALX -- EVALUATE EXPRESSION
*
*      EVALX IS CALLED TO EVALUATE AN EXPRESSION
*
*      (XR)                  POINTER TO EXBLK OR SEBLK
*      (WB)                  0 IF BY VALUE, 1 IF BY NAME
*      JSR  EVALX            CALL TO EVALUATE EXPRESSION
*      PPM  LOC              TRANSFER LOC IF EVALUATION FAILS
*      (XR)                  RESULT IF CALLED BY VALUE
*      (XL,WA)               RESULT NAME BASE,OFFSET IF BY NAME
*      (XR)                  DESTROYED (NAME CASE ONLY)
*      (XL,WA)               DESTROYED (VALUE CASE ONLY)
*      (WB,WC,RA)            DESTROYED
*
{EVALX{PRC{R{1{{ENTRY POINT, RECURSIVE
{{BEQ{(R9){#B$EXL{EVLX2{JUMP IF EXBLK CASE
*
*      HERE FOR SEBLK
*
{{MOV{4*SEVAR(R9){R10{{LOAD VRBLK POINTER (NAME BASE)
{{MOV{#4*VRVAL{R6{{SET NAME OFFSET
{{BNZ{R7{EVLX1{{JUMP IF CALLED BY NAME
{{JSR{ACESS{{{CALL ROUTINE TO ACCESS VALUE
{{PPM{EVLX9{{{JUMP IF FAILURE ON ACCESS
*
*      MERGE HERE TO EXIT FOR SEBLK CASE
*
{EVLX1{EXI{{{{RETURN TO EVALX CALLER
{{EJC{{{{
*
*      EVALX (CONTINUED)
*
*      HERE FOR FULL EXPRESSION (EXBLK) CASE
*
*      IF AN ERROR OCCURS IN THE EXPRESSION CODE AT EXECUTION
*      TIME, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
*      WITHOUT RETURNING TO THIS ROUTINE.
*      THE FOLLOWING ENTRIES ARE MADE ON THE STACK BEFORE
*      GIVING CONTROL TO THE EXPRESSION CODE
*
*                            EVALX RETURN POINT
*                            SAVED VALUE OF R$COD
*                            CODE POINTER (-R$COD)
*                            SAVED VALUE OF FLPTR
*                            0 IF BY VALUE, 1 IF BY NAME
*      FLPTR --------------- *EXFLC, FAIL OFFSET IN EXBLK
*
{EVLX2{SCP{R8{{{GET CODE POINTER
{{MOV{R$COD{R6{{LOAD CODE BLOCK POINTER
{{SUB{R6{R8{{GET CODE POINTER AS OFFSET
{{MOV{R6{-(SP){{STACK OLD CODE BLOCK POINTER
{{MOV{R8{-(SP){{STACK RELATIVE CODE OFFSET
{{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
{{MOV{R7{-(SP){{STACK NAME/VALUE INDICATOR
{{MOV{#4*EXFLC{-(SP){{STACK NEW FAIL OFFSET
{{MOV{FLPTR{GTCEF{{KEEP IN CASE OF ERROR
{{MOV{R$COD{R$GTC{{KEEP CODE BLOCK POINTER SIMILARLY
{{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
{{MOV{R9{R$COD{{SET NEW CODE BLOCK POINTER
{{MOV{KVSTN{4*EXSTM(R9){{REMEMBER STMNT NUMBER
{{ADD{#4*EXCOD{R9{{POINT TO FIRST CODE WORD
{{LCP{R9{{{SET CODE POINTER
{{BNE{STAGE{#STGXT{EXITS{JUMP IF NOT EXECUTION TIME
{{MOV{#STGEE{STAGE{{EVALUATING EXPRESSION
{{BRN{EXITS{{{JUMP TO EXECUTE FIRST CODE WORD
{{EJC{{{{
*
*      EVALX (CONTINUED)
*
*      COME HERE IF SUCCESSFUL RETURN BY VALUE (SEE O$RVL)
*
{EVLX3{MOV{(SP)+{R9{{LOAD VALUE
{{BZE{4*1(SP){EVLX5{{JUMP IF CALLED BY VALUE
{{ERB{249{EXPRESSION{{EVALUATED BY NAME RETURNED VALUE
*
*      HERE FOR EXPRESSION RETURNING BY NAME (SEE O$RNM)
*
{EVLX4{MOV{(SP)+{R6{{LOAD NAME OFFSET
{{MOV{(SP)+{R10{{LOAD NAME BASE
{{BNZ{4*1(SP){EVLX5{{JUMP IF CALLED BY NAME
{{JSR{ACESS{{{ELSE ACCESS VALUE FIRST
{{PPM{EVLX6{{{JUMP IF FAILURE DURING ACCESS
*
*      HERE AFTER LOADING CORRECT RESULT INTO XR OR XL,WA
*
{EVLX5{ZER{R7{{{NOTE SUCCESSFUL
{{BRN{EVLX7{{{MERGE
*
*      HERE FOR FAILURE IN EXPRESSION EVALUATION (SEE O$FEX)
*
{EVLX6{MNZ{R7{{{NOTE UNSUCCESSFUL
*
*      RESTORE ENVIRONMENT
*
{EVLX7{BNE{STAGE{#STGEE{EVLX8{SKIP IF WAS NOT PREVIOUSLY XT
{{MOV{#STGXT{STAGE{{EXECUTE TIME
*
*      MERGE WITH STAGE SET UP
*
{EVLX8{ADD{#4*NUM02{SP{{POP NAME/VALUE INDICATOR, *EXFAL
{{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
{{MOV{(SP)+{R8{{LOAD CODE OFFSET
{{ADD{(SP){R8{{MAKE CODE POINTER ABSOLUTE
{{MOV{(SP)+{R$COD{{RESTORE OLD CODE BLOCK POINTER
{{LCP{R8{{{RESTORE OLD CODE POINTER
{{BZE{R7{EVLX1{{JUMP FOR SUCCESSFUL RETURN
*
*      MERGE HERE FOR FAILURE IN SEBLK CASE
*
{EVLX9{EXI{1{{{TAKE FAILURE EXIT
{{ENP{{{{END OF PROCEDURE EVALX
{{EJC{{{{
*
*      EXBLD -- BUILD EXBLK
*
*      EXBLD IS USED TO BUILD AN EXPRESSION BLOCK FROM THE
*      CODE COMPILED MOST RECENTLY IN THE CURRENT CCBLK.
*
*      (XL)                  OFFSET IN CCBLK TO START OF CODE
*      (WB)                  INTEGER IN RANGE 0 LE N LE MXLEN
*      JSR  EXBLD            CALL TO BUILD EXBLK
*      (XR)                  PTR TO CONSTRUCTED EXBLK
*      (WA,WB,XL)            DESTROYED
*
{EXBLD{PRC{E{0{{ENTRY POINT
{{MOV{R10{R6{{COPY OFFSET TO START OF CODE
{{SUB{#4*EXCOD{R6{{CALC REDUCTION IN OFFSET IN EXBLK
{{MOV{R6{-(SP){{STACK FOR LATER
{{MOV{CWCOF{R6{{LOAD FINAL OFFSET
{{SUB{R10{R6{{COMPUTE LENGTH OF CODE
{{ADD{#4*EXSI${R6{{ADD SPACE FOR STANDARD FIELDS
{{JSR{ALLOC{{{ALLOCATE SPACE FOR EXBLK
{{MOV{R9{-(SP){{SAVE POINTER TO EXBLK
{{MOV{#B$EXL{4*EXTYP(R9){{STORE TYPE WORD
{{ZER{4*EXSTM(R9){{{ZEROISE STMNT NUMBER FIELD
{{MOV{R6{4*EXLEN(R9){{STORE LENGTH
{{MOV{#OFEX${4*EXFLC(R9){{STORE FAILURE WORD
{{ADD{#4*EXSI${R9{{SET XR FOR SYSMW
{{MOV{R10{CWCOF{{RESET OFFSET TO START OF CODE
{{ADD{R$CCB{R10{{POINT TO START OF CODE
{{SUB{#4*EXSI${R6{{LENGTH OF CODE TO MOVE
{{MOV{R6{-(SP){{STACK LENGTH OF CODE
{{MVW{{{{MOVE CODE TO EXBLK
{{MOV{(SP)+{R6{{GET LENGTH OF CODE
{{BTW{R6{{{CONVERT BYTE COUNT TO WORD COUNT
{{LCT{R6{R6{{PREPARE COUNTER FOR LOOP
{{MOV{(SP){R10{{COPY EXBLK PTR, DONT UNSTACK
{{ADD{#4*EXCOD{R10{{POINT TO CODE ITSELF
{{MOV{4*1(SP){R7{{GET REDUCTION IN OFFSET
*
*      THIS LOOP SEARCHES FOR NEGATION AND SELECTION CODE SO
*      THAT THE OFFSETS COMPUTED WHILST CODE WAS IN CODE BLOCK
*      CAN BE TRANSFORMED TO REDUCED VALUES APPLICABLE IN AN
*      EXBLK.
*
{EXBL1{MOV{(R10)+{R9{{GET NEXT CODE WORD
{{BEQ{R9{#OSLA${EXBL3{JUMP IF SELECTION FOUND
{{BEQ{R9{#ONTA${EXBL3{JUMP IF NEGATION FOUND
{{BCT{R6{EXBL1{{LOOP TO END OF CODE
*
*      NO SELECTION FOUND OR MERGE TO EXIT ON TERMINATION
*
{EXBL2{MOV{(SP)+{R9{{POP EXBLK PTR INTO XR
{{MOV{(SP)+{R10{{POP REDUCTION CONSTANT
{{EXI{{{{RETURN TO CALLER
{{EJC{{{{
*
*      EXBLD (CONTINUED)
*
*      SELECTION OR NEGATION FOUND
*      REDUCE THE OFFSETS AS NEEDED. OFFSETS OCCUR IN WORDS
*      FOLLOWING CODE WORDS -
*           =ONTA$, =OSLA$, =OSLB$, =OSLC$
*
{EXBL3{SUB{R7{(R10)+{{ADJUST OFFSET
{{BCT{R6{EXBL4{{DECREMENT COUNT
*
{EXBL4{BCT{R6{EXBL5{{DECREMENT COUNT
*
*      CONTINUE SEARCH FOR MORE OFFSETS
*
{EXBL5{MOV{(R10)+{R9{{GET NEXT CODE WORD
{{BEQ{R9{#OSLA${EXBL3{JUMP IF OFFSET FOUND
{{BEQ{R9{#OSLB${EXBL3{JUMP IF OFFSET FOUND
{{BEQ{R9{#OSLC${EXBL3{JUMP IF OFFSET FOUND
{{BEQ{R9{#ONTA${EXBL3{JUMP IF OFFSET FOUND
{{BCT{R6{EXBL5{{LOOP
{{BRN{EXBL2{{{MERGE TO RETURN
{{ENP{{{{END PROCEDURE EXBLD
{{EJC{{{{
*
*      EXPAN -- ANALYZE EXPRESSION
*
*      THE EXPRESSION ANALYZER (EXPAN) PROCEDURE IS USED TO SCAN
*      AN EXPRESSION AND CONVERT IT INTO A TREE REPRESENTATION.
*      SEE DESCRIPTIONS OF CMBLK, CUBLK, CBBLK IN THE STRUCTURES
*      SECTION FOR DETAILED FORMAT OF TREE BLOCKS.
*
*      THE ANALYZER USES A SIMPLE PRECEDENCE SCHEME IN WHICH
*      OPERANDS AND OPERATORS ARE PLACED ON A SINGLE STACK
*      AND CONDENSATIONS ARE MADE WHEN LOW PRECEDENCE OPERATORS
*      ARE STACKED AFTER A HIGHER PRECEDENCE OPERATOR. A GLOBAL
*      VARIABLE (IN WB) KEEPS TRACK OF THE LEVEL AS FOLLOWS.
*
*      0    SCANNING OUTER LEVEL OF STATEMENT OR EXPRESSION
*      1    SCANNING OUTER LEVEL OF NORMAL GOTO
*      2    SCANNING OUTER LEVEL OF DIRECT GOTO
*      3    SCANNING INSIDE ARRAY BRACKETS
*      4    SCANNING INSIDE GROUPING PARENTHESES
*      5    SCANNING INSIDE FUNCTION PARENTHESES
*
*      THIS VARIABLE IS SAVED ON THE STACK ON ENCOUNTERING A
*      GROUPING AND RESTORED AT THE END OF THE GROUPING.
*
*      ANOTHER GLOBAL VARIABLE (IN WC) COUNTS THE NUMBER OF
*      ITEMS AT ONE GROUPING LEVEL AND IS INCREMENTED FOR EACH
*      COMMA ENCOUNTERED. IT IS STACKED WITH THE LEVEL INDICATOR
*
*      THE SCAN IS CONTROLLED BY A THREE STATE FINITE MACHINE.
*      A GLOBAL VARIABLE STORED IN WA IS THE CURRENT STATE.
*
*      WA=0                  NOTHING SCANNED AT THIS LEVEL
*      WA=1                  OPERAND EXPECTED
*      WA=2                  OPERATOR EXPECTED
*
*      (WB)                  CALL TYPE (SEE BELOW)
*      JSR  EXPAN            CALL TO ANALYZE EXPRESSION
*      (XR)                  POINTER TO RESULTING TREE
*      (XL,WA,WB,WC,RA)      DESTROYED
*
*      THE ENTRY VALUE OF WB INDICATES THE CALL TYPE AS FOLLOWS.
*
*      0    SCANNING EITHER THE MAIN BODY OF A STATEMENT OR THE
*           TEXT OF AN EXPRESSION (FROM EVAL CALL). VALID
*           TERMINATORS ARE COLON, SEMICOLON. THE RESCAN FLAG IS
*           SET TO RETURN THE TERMINATOR ON THE NEXT SCANE CALL.
*
*      1    SCANNING A NORMAL GOTO. THE ONLY VALID
*           TERMINATOR IS A RIGHT PAREN.
*
*      2    SCANNING A DIRECT GOTO. THE ONLY VALID
*           TERMINATOR IS A RIGHT BRACKET.
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      ENTRY POINT
*
{EXPAN{PRC{E{0{{ENTRY POINT
{{ZER{-(SP){{{SET TOP OF STACK INDICATOR
{{ZER{R6{{{SET INITIAL STATE TO ZERO
{{ZER{R8{{{ZERO COUNTER VALUE
*
*      LOOP HERE FOR SUCCESSIVE ENTRIES
*
{EXP01{JSR{SCANE{{{SCAN NEXT ELEMENT
{{ADD{R6{R10{{ADD STATE TO SYNTAX CODE
{{BSW{R10{T$NES{{SWITCH ON ELEMENT TYPE/STATE
{{IFF{T$UO0{EXP27{{UNOP, S=0
{{IFF{T$UO1{EXP27{{UNOP, S=1
{{IFF{T$UO2{EXP04{{UNOP, S=2
{{IFF{T$LP0{EXP06{{LEFT PAREN, S=0
{{IFF{T$LP1{EXP06{{LEFT PAREN, S=1
{{IFF{T$LP2{EXP04{{LEFT PAREN, S=2
{{IFF{T$LB0{EXP08{{LEFT BRKT, S=0
{{IFF{T$LB1{EXP08{{LEFT BRKT, S=1
{{IFF{T$LB2{EXP09{{LEFT BRKT, S=2
{{IFF{T$CM0{EXP02{{COMMA, S=0
{{IFF{T$CM1{EXP05{{COMMA, S=1
{{IFF{T$CM2{EXP11{{COMMA, S=2
{{IFF{T$FN0{EXP10{{FUNCTION, S=0
{{IFF{T$FN1{EXP10{{FUNCTION, S=1
{{IFF{T$FN2{EXP04{{FUNCTION, S=2
{{IFF{T$VA0{EXP03{{VARIABLE, S=0
{{IFF{T$VA1{EXP03{{VARIABLE, STATE ONE
{{IFF{T$VA2{EXP04{{VARIABLE, S=2
{{IFF{T$CO0{EXP03{{CONSTANT, S=0
{{IFF{T$CO1{EXP03{{CONSTANT, S=1
{{IFF{T$CO2{EXP04{{CONSTANT, S=2
{{IFF{T$BO0{EXP05{{BINOP, S=0
{{IFF{T$BO1{EXP05{{BINOP, S=1
{{IFF{T$BO2{EXP26{{BINOP, S=2
{{IFF{T$RP0{EXP02{{RIGHT PAREN, S=0
{{IFF{T$RP1{EXP05{{RIGHT PAREN, S=1
{{IFF{T$RP2{EXP12{{RIGHT PAREN, S=2
{{IFF{T$RB0{EXP02{{RIGHT BRKT, S=0
{{IFF{T$RB1{EXP05{{RIGHT BRKT, S=1
{{IFF{T$RB2{EXP18{{RIGHT BRKT, S=2
{{IFF{T$CL0{EXP02{{COLON, S=0
{{IFF{T$CL1{EXP05{{COLON, S=1
{{IFF{T$CL2{EXP19{{COLON, S=2
{{IFF{T$SM0{EXP02{{SEMICOLON, S=0
{{IFF{T$SM1{EXP05{{SEMICOLON, S=1
{{IFF{T$SM2{EXP19{{SEMICOLON, S=2
{{ESW{{{{END SWITCH ON ELEMENT TYPE/STATE
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      HERE FOR RBR,RPR,COL,SMC,CMA IN STATE 0
*
*      SET TO RESCAN THE TERMINATOR ENCOUNTERED AND CREATE
*      A NULL CONSTANT (CASE OF OMITTED NULL)
*
{EXP02{MNZ{SCNRS{{{SET TO RESCAN ELEMENT
{{MOV{#NULLS{R9{{POINT TO NULL, MERGE
*
*      HERE FOR VAR OR CON IN STATES 0,1
*
*      STACK THE VARIABLE/CONSTANT AND SET STATE=2
*
{EXP03{MOV{R9{-(SP){{STACK POINTER TO OPERAND
{{MOV{#NUM02{R6{{SET STATE 2
{{BRN{EXP01{{{JUMP FOR NEXT ELEMENT
*
*      HERE FOR VAR,CON,LPR,FNC,UOP IN STATE 2
*
*      WE RESCAN THE ELEMENT AND CREATE A CONCATENATION OPERATOR
*      THIS IS THE CASE OF THE BLANK CONCATENATION OPERATOR.
*
{EXP04{MNZ{SCNRS{{{SET TO RESCAN ELEMENT
{{MOV{#OPDVC{R9{{POINT TO CONCAT OPERATOR DV
{{BZE{R7{EXP4A{{OK IF AT TOP LEVEL
{{MOV{#OPDVP{R9{{ELSE POINT TO UNMISTAKABLE CONCAT.
*
*      MERGE HERE WHEN XR SET UP WITH PROPER CONCATENATION DVBLK
*
{EXP4A{BNZ{SCNBL{EXP26{{MERGE BOP IF BLANKS, ELSE ERROR
{{DCV{SCNSE{{{ADJUST START OF ELEMENT LOCATION
{{ERB{220{SYNTAX{{ERROR. MISSING OPERATOR
*
*      HERE FOR CMA,RPR,RBR,COL,SMC,BOP(S=1) BOP(S=0)
*
*      THIS IS AN ERRONOUS CONTRUCTION
*
{EXP05{DCV{SCNSE{{{ADJUST START OF ELEMENT LOCATION
{{ERB{221{SYNTAX{{ERROR. MISSING OPERAND
*
*      HERE FOR LPR (S=0,1)
*
{EXP06{MOV{#NUM04{R10{{SET NEW LEVEL INDICATOR
{{ZER{R9{{{SET ZERO VALUE FOR CMOPN
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      MERGE HERE TO STORE OLD LEVEL ON STACK AND START NEW ONE
*
{EXP07{MOV{R9{-(SP){{STACK CMOPN VALUE
{{MOV{R8{-(SP){{STACK OLD COUNTER
{{MOV{R7{-(SP){{STACK OLD LEVEL INDICATOR
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{ZER{R6{{{SET NEW STATE TO ZERO
{{MOV{R10{R7{{SET NEW LEVEL INDICATOR
{{MOV{#NUM01{R8{{INITIALIZE NEW COUNTER
{{BRN{EXP01{{{JUMP TO SCAN NEXT ELEMENT
*
*      HERE FOR LBR (S=0,1)
*
*      THIS IS AN ILLEGAL USE OF LEFT BRACKET
*
{EXP08{ERB{222{SYNTAX{{ERROR. INVALID USE OF LEFT BRACKET
*
*      HERE FOR LBR (S=2)
*
*      SET NEW LEVEL AND START TO SCAN SUBSCRIPTS
*
{EXP09{MOV{(SP)+{R9{{LOAD ARRAY PTR FOR CMOPN
{{MOV{#NUM03{R10{{SET NEW LEVEL INDICATOR
{{BRN{EXP07{{{JUMP TO STACK OLD AND START NEW
*
*      HERE FOR FNC (S=0,1)
*
*      STACK OLD LEVEL AND START TO SCAN ARGUMENTS
*
{EXP10{MOV{#NUM05{R10{{SET NEW LEV INDIC (XR=VRBLK=CMOPN)
{{BRN{EXP07{{{JUMP TO STACK OLD AND START NEW
*
*      HERE FOR CMA (S=2)
*
*      INCREMENT ARGUMENT COUNT AND CONTINUE
*
{EXP11{ICV{R8{{{INCREMENT COUNTER
{{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL
{{ZER{-(SP){{{SET NEW LEVEL FOR PARAMETER
{{ZER{R6{{{SET NEW STATE
{{BGT{R7{#NUM02{EXP01{LOOP BACK UNLESS OUTER LEVEL
{{ERB{223{SYNTAX{{ERROR. INVALID USE OF COMMA
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      HERE FOR RPR (S=2)
*
*      AT OUTER LEVEL IN A NORMAL GOTO THIS IS A TERMINATOR
*      OTHERWISE IT MUST TERMINATE A FUNCTION OR GROUPING
*
{EXP12{BEQ{R7{#NUM01{EXP20{END OF NORMAL GOTO
{{BEQ{R7{#NUM05{EXP13{END OF FUNCTION ARGUMENTS
{{BEQ{R7{#NUM04{EXP14{END OF GROUPING / SELECTION
{{ERB{224{SYNTAX{{ERROR. UNBALANCED RIGHT PARENTHESIS
*
*      HERE AT END OF FUNCTION ARGUMENTS
*
{EXP13{MOV{#C$FNC{R10{{SET CMTYP VALUE FOR FUNCTION
{{BRN{EXP15{{{JUMP TO BUILD CMBLK
*
*      HERE FOR END OF GROUPING
*
{EXP14{BEQ{R8{#NUM01{EXP17{JUMP IF END OF GROUPING
{{MOV{#C$SEL{R10{{ELSE SET CMTYP FOR SELECTION
*
*      MERGE HERE TO BUILD CMBLK FOR LEVEL JUST SCANNED AND
*      TO POP UP TO THE PREVIOUS SCAN LEVEL BEFORE CONTINUING.
*
{EXP15{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL
{{MOV{R8{R6{{COPY COUNT
{{ADD{#CMVLS{R6{{ADD FOR STANDARD FIELDS AT START
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK
{{MOV{#B$CMT{(R9){{STORE TYPE CODE FOR CMBLK
{{MOV{R10{4*CMTYP(R9){{STORE CMBLK NODE TYPE INDICATOR
{{MOV{R6{4*CMLEN(R9){{STORE LENGTH
{{ADD{R6{R9{{POINT PAST END OF BLOCK
{{LCT{R8{R8{{SET LOOP COUNTER
*
*      LOOP TO MOVE REMAINING WORDS TO CMBLK
*
{EXP16{MOV{(SP)+{-(R9){{MOVE ONE OPERAND PTR FROM STACK
{{MOV{(SP)+{R7{{POP TO OLD LEVEL INDICATOR
{{BCT{R8{EXP16{{LOOP TILL ALL MOVED
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      COMPLETE CMBLK AND STACK POINTER TO IT ON STACK
*
{{SUB{#4*CMVLS{R9{{POINT BACK TO START OF BLOCK
{{MOV{(SP)+{R8{{RESTORE OLD COUNTER
{{MOV{(SP){4*CMOPN(R9){{STORE OPERAND PTR IN CMBLK
{{MOV{R9{(SP){{STACK CMBLK POINTER
{{MOV{#NUM02{R6{{SET NEW STATE
{{BRN{EXP01{{{BACK FOR NEXT ELEMENT
*
*      HERE AT END OF A PARENTHESIZED EXPRESSION
*
{EXP17{JSR{EXPDM{{{DUMP OPERATORS AT THIS LEVEL
{{MOV{(SP)+{R9{{RESTORE XR
{{MOV{(SP)+{R7{{RESTORE OUTER LEVEL
{{MOV{(SP)+{R8{{RESTORE OUTER COUNT
{{MOV{R9{(SP){{STORE OPND OVER UNUSED CMOPN VAL
{{MOV{#NUM02{R6{{SET NEW STATE
{{BRN{EXP01{{{BACK FOR NEXT ELE8ENT
*
*      HERE FOR RBR (S=2)
*
*      AT OUTER LEVEL IN A DIRECT GOTO, THIS IS A TERMINATOR.
*      OTHERWISE IT MUST TERMINATE A SUBSCRIPT LIST.
*
{EXP18{MOV{#C$ARR{R10{{SET CMTYP FOR ARRAY REFERENCE
{{BEQ{R7{#NUM03{EXP15{JUMP TO BUILD CMBLK IF END ARRAYREF
{{BEQ{R7{#NUM02{EXP20{JUMP IF END OF DIRECT GOTO
{{ERB{225{SYNTAX{{ERROR. UNBALANCED RIGHT BRACKET
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      HERE FOR COL,SMC (S=2)
*
*      ERROR UNLESS TERMINATING STATEMENT BODY AT OUTER LEVEL
*
{EXP19{MNZ{SCNRS{{{RESCAN TERMINATOR
{{MOV{R7{R10{{COPY LEVEL INDICATOR
{{BSW{R10{6{{SWITCH ON LEVEL INDICATOR
{{IFF{0{EXP20{{NORMAL OUTER LEVEL
{{IFF{1{EXP22{{FAIL IF NORMAL GOTO
{{IFF{2{EXP23{{FAIL IF DIRECT GOTO
{{IFF{3{EXP24{{FAIL ARRAY BRACKETS
{{IFF{4{EXP21{{FAIL IF IN GROUPING
{{IFF{5{EXP21{{FAIL FUNCTION ARGS
{{ESW{{{{END SWITCH ON LEVEL
*
*      HERE AT NORMAL END OF EXPRESSION
*
{EXP20{JSR{EXPDM{{{DUMP REMAINING OPERATORS
{{MOV{(SP)+{R9{{LOAD TREE POINTER
{{ICA{SP{{{POP OFF BOTTOM OF STACK MARKER
{{EXI{{{{RETURN TO EXPAN CALLER
*
*      MISSING RIGHT PAREN
*
{EXP21{ERB{226{SYNTAX{{ERROR. MISSING RIGHT PAREN
*
*      MISSING RIGHT PAREN IN GOTO FIELD
*
{EXP22{ERB{227{SYNTAX{{ERROR. RIGHT PAREN MISSING FROM GOTO
*
*      MISSING BRACKET IN GOTO
*
{EXP23{ERB{228{SYNTAX{{ERROR. RIGHT BRACKET MISSING FROM GOTO
*
*      MISSING ARRAY BRACKET
*
{EXP24{ERB{229{SYNTAX{{ERROR. MISSING RIGHT ARRAY BRACKET
{{EJC{{{{
*
*      EXPAN (CONTINUED)
*
*      LOOP HERE WHEN AN OPERATOR CAUSES AN OPERATOR DUMP
*
{EXP25{MOV{R9{EXPSV{{
{{JSR{EXPOP{{{POP ONE OPERATOR
{{MOV{EXPSV{R9{{RESTORE OP DV POINTER AND MERGE
*
*      HERE FOR BOP (S=2)
*
*      REMOVE OPERATORS (CONDENSE) FROM STACK UNTIL NO MORE
*      LEFT AT THIS LEVEL OR TOP ONE HAS LOWER PRECEDENCE.
*      LOOP HERE TILL THIS CONDITION IS MET.
*
{EXP26{MOV{4*1(SP){R10{{LOAD OPERATOR DVPTR FROM STACK
{{BLE{R10{#NUM05{EXP27{JUMP IF BOTTOM OF STACK LEVEL
{{BLT{4*DVRPR(R9){4*DVLPR(R10){EXP25{ELSE POP IF NEW PREC IS LO
*
*      HERE FOR UOP (S=0,1)
*
*      BINARY OPERATOR MERGES AFTER PRECEDENCE CHECK
*
*      THE OPERATOR DV IS STORED ON THE STACK AND THE SCAN
*      CONTINUES AFTER SETTING THE SCAN STATE TO ONE.
*
{EXP27{MOV{R9{-(SP){{STACK OPERATOR DVPTR ON STACK
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{MOV{#NUM01{R6{{SET NEW STATE
{{BNE{R9{#OPDVS{EXP01{BACK FOR NEXT ELEMENT UNLESS =
*
*      HERE FOR SPECIAL CASE OF BINARY =. THE SYNTAX ALLOWS A
*      NULL RIGHT ARGUMENT FOR THIS OPERATOR TO BE LEFT
*      OUT. ACCORDINGLY WE RESET TO STATE ZERO TO GET PROPER
*      ACTION ON A TERMINATOR (SUPPLY A NULL CONSTANT).
*
{{ZER{R6{{{SET STATE ZERO
{{BRN{EXP01{{{JUMP FOR NEXT ELEMENT
{{ENP{{{{END PROCEDURE EXPAN
{{EJC{{{{
*
*      EXPAP -- TEST FOR PATTERN MATCH TREE
*
*      EXPAP IS PASSED AN EXPRESSION TREE TO DETERMINE IF IT
*      IS A PATTERN MATCH. THE FOLLOWING ARE RECOGIZED AS
*      MATCHES IN THE CONTEXT OF THIS CALL.
*
*      1)   AN EXPLICIT USE OF BINARY QUESTION MARK
*      2)   A CONCATENATION
*      3)   AN ALTERNATION WHOSE LEFT OPERAND IS A CONCATENATION
*
*      (XR)                  PTR TO EXPAN TREE
*      JSR  EXPAP            CALL TO TEST FOR PATTERN MATCH
*      PPM  LOC              TRANSFER LOC IF NOT A PATTERN MATCH
*      (WA)                  DESTROYED
*      (XR)                  UNCHANGED (IF NOT MATCH)
*      (XR)                  PTR TO BINARY OPERATOR BLK IF MATCH
*
{EXPAP{PRC{E{1{{ENTRY POINT
{{MOV{R10{-(SP){{SAVE XL
{{BNE{(R9){#B$CMT{EXPP2{NO MATCH IF NOT COMPLEX
{{MOV{4*CMTYP(R9){R6{{ELSE LOAD TYPE CODE
{{BEQ{R6{#C$CNC{EXPP1{CONCATENATION IS A MATCH
{{BEQ{R6{#C$PMT{EXPP1{BINARY QUESTION MARK IS A MATCH
{{BNE{R6{#C$ALT{EXPP2{ELSE NOT MATCH UNLESS ALTERNATION
*
*      HERE FOR ALTERNATION. CHANGE (A B) / C TO A QM (B / C)
*
{{MOV{4*CMLOP(R9){R10{{LOAD LEFT OPERAND POINTER
{{BNE{(R10){#B$CMT{EXPP2{NOT MATCH IF LEFT OPND NOT COMPLEX
{{BNE{4*CMTYP(R10){#C$CNC{EXPP2{NOT MATCH IF LEFT OP NOT CONC
{{MOV{4*CMROP(R10){4*CMLOP(R9){{XR POINTS TO (B / C)
{{MOV{R9{4*CMROP(R10){{SET XL OPNDS TO A, (B / C)
{{MOV{R10{R9{{POINT TO THIS ALTERED NODE
*
*      EXIT HERE FOR PATTERN MATCH
*
{EXPP1{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{EXI{{{{GIVE PATTERN MATCH RETURN
*
*      EXIT HERE IF NOT PATTERN MATCH
*
{EXPP2{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{EXI{1{{{GIVE NON-MATCH RETURN
{{ENP{{{{END PROCEDURE EXPAP
{{EJC{{{{
*
*      EXPDM -- DUMP OPERATORS AT CURRENT LEVEL (FOR EXPAN)
*
*      EXPDM USES EXPOP TO CONDENSE ALL OPERATORS AT THIS SYNTAX
*      LEVEL. THE STACK BOTTOM IS RECOGNIZED FROM THE LEVEL
*      VALUE WHICH IS SAVED ON THE TOP OF THE STACK.
*
*      JSR  EXPDM            CALL TO DUMP OPERATORS
*      (XS)                  POPPED AS REQUIRED
*      (XR,WA)               DESTROYED
*
{EXPDM{PRC{N{0{{ENTRY POINT
{{MOV{R10{R$EXS{{SAVE XL VALUE
*
*      LOOP TO DUMP OPERATORS
*
{EXDM1{BLE{4*1(SP){#NUM05{EXDM2{JUMP IF STACK BOTTOM (SAVED LEVEL
{{JSR{EXPOP{{{ELSE POP ONE OPERATOR
{{BRN{EXDM1{{{AND LOOP BACK
*
*      HERE AFTER POPPING ALL OPERATORS
*
{EXDM2{MOV{R$EXS{R10{{RESTORE XL
{{ZER{R$EXS{{{RELEASE SAVE LOCATION
{{EXI{{{{RETURN TO EXPDM CALLER
{{ENP{{{{END PROCEDURE EXPDM
{{EJC{{{{
*
*      EXPOP-- POP OPERATOR (FOR EXPAN)
*
*      EXPOP IS USED BY THE EXPAN ROUTINE TO CONDENSE ONE
*      OPERATOR FROM THE TOP OF THE SYNTAX STACK. AN APPROPRIATE
*      CMBLK IS BUILT FOR THE OPERATOR (UNARY OR BINARY) AND A
*      POINTER TO THIS CMBLK IS STACKED.
*
*      EXPOP IS ALSO USED BY SCNGF (GOTO FIELD SCAN) PROCEDURE
*
*      JSR  EXPOP            CALL TO POP OPERATOR
*      (XS)                  POPPED APPROPRIATELY
*      (XR,XL,WA)            DESTROYED
*
{EXPOP{PRC{N{0{{ENTRY POINT
{{MOV{4*1(SP){R9{{LOAD OPERATOR DV POINTER
{{BEQ{4*DVLPR(R9){#LLUNO{EXPO2{JUMP IF UNARY
*
*      HERE FOR BINARY OPERATOR
*
{{MOV{#4*CMBS${R6{{SET SIZE OF BINARY OPERATOR CMBLK
{{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK
{{MOV{(SP)+{4*CMROP(R9){{POP AND STORE RIGHT OPERAND PTR
{{MOV{(SP)+{R10{{POP AND LOAD OPERATOR DV PTR
{{MOV{(SP){4*CMLOP(R9){{STORE LEFT OPERAND POINTER
*
*      COMMON EXIT POINT
*
{EXPO1{MOV{#B$CMT{(R9){{STORE TYPE CODE FOR CMBLK
{{MOV{4*DVTYP(R10){4*CMTYP(R9){{STORE CMBLK NODE TYPE CODE
{{MOV{R10{4*CMOPN(R9){{STORE DVPTR (=PTR TO DAC O$XXX)
{{MOV{R6{4*CMLEN(R9){{STORE CMBLK LENGTH
{{MOV{R9{(SP){{STORE RESULTING NODE PTR ON STACK
{{EXI{{{{RETURN TO EXPOP CALLER
*
*      HERE FOR UNARY OPERATOR
*
{EXPO2{MOV{#4*CMUS${R6{{SET SIZE OF UNARY OPERATOR CMBLK
{{JSR{ALLOC{{{ALLOCATE SPACE FOR CMBLK
{{MOV{(SP)+{4*CMROP(R9){{POP AND STORE OPERAND POINTER
{{MOV{(SP){R10{{LOAD OPERATOR DV POINTER
{{BRN{EXPO1{{{MERGE BACK TO EXIT
{{ENP{{{{END PROCEDURE EXPOP
{{EJC{{{{
*
*      FLSTG -- FOLD STRING TO UPPER CASE
*
*      FLSTG FOLDS A CHARACTER STRING CONTAINING LOWER CASE
*      CHARACCTERS TO ONE CONTAINING UPPER CASE CHARACTERS.
*      FOLDING IS ONLY DONE IF &CASE (KVCAS) IS NOT ZERO.
*
*      (XR)                  STRING ARGUMENT
*      (WA)                  LENGTH OF STRING
*      JSR  FLSTG            CALL TO FOLD STRING
*      (XR)                  RESULT STRING (POSSIBLY ORIGINAL)
*      (WC)                  DESTROYED
*
{FLSTG{PRC{R{0{{ENTRY POINT
{{BZE{KVCAS{FST99{{SKIP IF &CASE IS 0
{{MOV{R10{-(SP){{SAVE XL ACROSS CALL
{{MOV{R9{-(SP){{SAVE ORIGINAL SCBLK PTR
{{JSR{ALOCS{{{ALLOCATE NEW STRING BLOCK
{{MOV{(SP){R10{{POINT TO ORIGINAL SCBLK
{{MOV{R9{-(SP){{SAVE POINTER TO NEW SCBLK
{{PLC{R10{{{POINT TO ORIGINAL CHARS
{{PLC{R9{{{POINT TO NEW CHARS
{{ZER{-(SP){{{INIT DID FOLD FLAG
{{LCT{R8{R8{{LOAD LOOP COUNTER
{FST01{LCH{R6{(R10)+{{LOAD CHARACTER
{{BGT{#CH$$A{R6{FST02{SKIP IF LESS THAN LC A
{{BGT{R6{#CH$$${FST02{SKIP IF GREATER THAN LC Z
{{FLC{R6{{{FOLD CHARACTER TO UPPER CASE
{{MNZ{(SP){{{SET DID FOLD CHARACTER FLAG
{FST02{SCH{R6{(R9)+{{STORE (POSSIBLY FOLDED) CHARACTER
{{BCT{R8{FST01{{LOOP THRU ENTIRE STRING
{{CSC{R9{{{COMPLETE STORE CHARACTERS
{{BNZ{(SP)+{FST10{{SKIP IF FOLDING DONE
{{MOV{(SP)+{DNAMP{{DO NOT NEED NEW SCBLK
{{MOV{(SP)+{R9{{RETURN ORIGINAL SCBLK
{{BRN{FST20{{{MERGE BELOW
{FST10{MOV{(SP)+{R9{{RETURN NEW SCBLK
{{ICA{SP{{{THROW AWAY ORIGINAL SCBLK POINTER
{FST20{MOV{4*SCLEN(R9){R6{{RELOAD STRING LENGTH
{{MOV{(SP)+{R10{{RESTORE XL
{FST99{EXI{{{{RETURN
{{ENP{{{{
{{EJC{{{{
*
*      GBCOL -- PERFORM GARBAGE COLLECTION
*
*      GBCOL PERFORMS A GARBAGE COLLECTION ON THE DYNAMIC REGION
*      ALL BLOCKS WHICH ARE NO LONGER IN USE ARE ELIMINATED
*      BY MOVING BLOCKS WHICH ARE IN USE DOWN AND RESETTING
*      DNAMP, THE POINTER TO THE NEXT AVAILABLE LOCATION.
*
*      (WB)                  MOVE OFFSET (SEE BELOW)
*      JSR  GBCOL            CALL TO COLLECT GARBAGE
*      (XR)                  DESTROYED
*
*      THE FOLLOWING CONDITIONS MUST BE MET AT THE TIME WHEN
*      GBCOL IS CALLED.
*
*      1)   ALL POINTERS TO BLOCKS IN THE DYNAMIC AREA MUST BE
*           ACCESSIBLE TO THE GARBAGE COLLECTOR. THIS MEANS
*           THAT THEY MUST OCCUR IN ONE OF THE FOLLOWING.
*
*           A)               MAIN STACK, WITH CURRENT TOP
*                            ELEMENT BEING INDICATED BY XS
*
*           B)               IN RELOCATABLE FIELDS OF VRBLKS.
*
*           C)               IN REGISTER XL AT THE TIME OF CALL
*
*           E)               IN THE SPECIAL REGION OF WORKING
*                            STORAGE WHERE NAMES BEGIN WITH R$.
*
*      2)   ALL POINTERS MUST POINT TO THE START OF BLOCKS WITH
*           THE SOLE EXCEPTION OF THE CONTENTS OF THE CODE
*           POINTER REGISTER WHICH POINTS INTO THE R$COD BLOCK.
*
*      3)   NO LOCATION WHICH APPEARS TO CONTAIN A POINTER
*           INTO THE DYNAMIC REGION MAY OCCUR UNLESS IT IS IN
*           FACT A POINTER TO THE START OF THE BLOCK. HOWEVER
*           POINTERS OUTSIDE THIS AREA MAY OCCUR AND WILL
*           NOT BE CHANGED BY THE GARBAGE COLLECTOR.
*           IT IS ESPECIALLY IMPORTANT TO MAKE SURE THAT XL
*           DOES NOT CONTAIN A GARBAGE VALUE FROM SOME PROCESS
*           CARRIED OUT BEFORE THE CALL TO THE COLLECTOR.
*
*      GBCOL HAS THE CAPABILITY OF MOVING THE FINAL COMPACTED
*      RESULT UP IN MEMORY (WITH ADDRESSES ADJUSTED ACCORDINGLY)
*      THIS IS USED TO ADD SPACE TO THE STATIC REGION. THE
*      ENTRY VALUE OF WB IS THE NUMBER OF BYTES TO MOVE UP.
*      THE CALLER MUST GUARANTEE THAT THERE IS ENOUGH ROOM.
*      FURTHERMORE THE VALUE IN WB IF IT IS NON-ZERO, MUST BE AT
*      LEAST 256 SO THAT THE MWB INSTRUCTION CONDITIONS ARE MET.
{{EJC{{{{
*
*      GBCOL (CONTINUED)
*
*      THE ALGORITHM, WHICH IS A MODIFICATION OF THE LISP-2
*      GARBAGE COLLECTOR DEVISED BY R.DEWAR AND K.BELCHER
*      TAKES THREE PASSES AS FOLLOWS.
*
*      1)   ALL POINTERS IN MEMORY ARE SCANNED AND BLOCKS IN USE
*           DETERMINED FROM THIS SCAN. NOTE THAT THIS PROCEDURE
*           IS RECURSIVE AND USES THE MAIN STACK FOR LINKAGE.
*           THE MARKING PROCESS IS THUS SIMILAR TO THAT USED IN
*           A STANDARD LISP COLLECTOR. HOWEVER THE METHOD OF
*           ACTUALLY MARKING THE BLOCKS IS DIFFERENT.
*
*           THE FIRST FIELD OF A BLOCK NORMALLY CONTAINS A
*           CODE ENTRY POINT POINTER. SUCH AN ENTRY POINTER
*           CAN BE DISTINGUISHED FROM THE ADDRESS OF ANY POINTER
*           TO BE PROCESSED BY THE COLLECTOR. DURING GARBAGE
*           COLLECTION, THIS WORD IS USED TO BUILD A BACK CHAIN
*           OF POINTERS THROUGH FIELDS WHICH POINT TO THE BLOCK.
*           THE END OF THE CHAIN IS MARKED BY THE OCCURENCE
*           OF THE WORD WHICH USED TO BE IN THE FIRST WORD OF
*           THE BLOCK. THIS BACKCHAIN SERVES BOTH AS A MARK
*           INDICATING THAT THE BLOCK IS IN USE AND AS A LIST OF
*           REFERENCES FOR THE RELOCATION PHASE.
*
*      2)   STORAGE IS SCANNED SEQUENTIALLY TO DISCOVER WHICH
*           BLOCKS ARE CURRENTLY IN USE AS INDICATED BY THE
*           PRESENCE OF A BACKCHAIN. TWO POINTERS ARE MAINTAINED
*           ONE SCANS THROUGH LOOKING AT EACH BLOCK. THE OTHER
*           IS INCREMENTED ONLY FOR BLOCKS FOUND TO BE IN USE.
*           IN THIS WAY, THE EVENTUAL LOCATION OF EACH BLOCK CAN
*           BE DETERMINED WITHOUT ACTUALLY MOVING ANY BLOCKS.
*           AS EACH BLOCK WHICH IS IN USE IS PROCESSED, THE BACK
*           CHAIN IS USED TO RESET ALL POINTERS WHICH POINT TO
*           THIS BLOCK TO CONTAIN ITS NEW ADDRESS, I.E. THE
*           ADDRESS IT WILL OCCUPY AFTER THE BLOCKS ARE MOVED.
*           THE FIRST WORD OF THE BLOCK, TAKEN FROM THE END OF
*           THE CHAIN IS RESTORED AT THIS POINT.
*
*           DURING PASS 2, THE COLLECTOR BUILDS BLOCKS WHICH
*           DESCRIBE THE REGIONS OF STORAGE WHICH ARE TO BE
*           MOVED IN THE THIRD PASS. THERE IS ONE DESCRIPTOR FOR
*           EACH CONTIGUOUS SET OF GOOD BLOCKS. THE DESCRIPTOR
*           IS BUILT JUST BEHIND THE BLOCK TO BE MOVED AND
*           CONTAINS A POINTER TO THE NEXT BLOCK AND THE NUMBER
*           OF WORDS TO BE MOVED.
*
*      3)   IN THE THIRD AND FINAL PASS, THE MOVE DESCRIPTOR
*           BLOCKS BUILT IN PASS TWO ARE USED TO ACTUALLY MOVE
*           THE BLOCKS DOWN TO THE BOTTOM OF THE DYNAMIC REGION.
*           THE COLLECTION IS THEN COMPLETE AND THE NEXT
*           AVAILABLE LOCATION POINTER IS RESET.
{{EJC{{{{
*
*      GBCOL (CONTINUED)
*
{GBCOL{PRC{E{0{{ENTRY POINT
{{BNZ{DMVCH{GBC14{{FAIL IF IN MID-DUMP
{{MNZ{GBCFL{{{NOTE GBCOL ENTERED
{{MOV{R6{GBSVA{{SAVE ENTRY WA
{{MOV{R7{GBSVB{{SAVE ENTRY WB
{{MOV{R8{GBSVC{{SAVE ENTRY WC
{{MOV{R10{-(SP){{SAVE ENTRY XL
{{SCP{R6{{{GET CODE POINTER VALUE
{{SUB{R$COD{R6{{MAKE RELATIVE
{{LCP{R6{{{AND RESTORE
*
*      PROCESS STACK ENTRIES
*
{{MOV{SP{R9{{POINT TO STACK FRONT
{{MOV{STBAS{R10{{POINT PAST END OF STACK
{{BGE{R10{R9{GBC00{OK IF D-STACK
{{MOV{R10{R9{{REVERSE IF ...
{{MOV{SP{R10{{... U-STACK
*
*      PROCESS THE STACK
*
{GBC00{JSR{GBCPF{{{PROCESS POINTERS ON STACK
*
*      PROCESS SPECIAL WORK LOCATIONS
*
{{MOV{#R$AAA{R9{{POINT TO START OF RELOCATABLE LOCS
{{MOV{#R$YYY{R10{{POINT PAST END OF RELOCATABLE LOCS
{{JSR{GBCPF{{{PROCESS WORK FIELDS
*
*      PREPARE TO PROCESS VARIABLE BLOCKS
*
{{MOV{HSHTB{R6{{POINT TO FIRST HASH SLOT POINTER
*
*      LOOP THROUGH HASH SLOTS
*
{GBC01{MOV{R6{R10{{POINT TO NEXT SLOT
{{ICA{R6{{{BUMP BUCKET POINTER
{{MOV{R6{GBCNM{{SAVE BUCKET POINTER
{{EJC{{{{
*
*      GBCOL (CONTINUED)
*
*      LOOP THROUGH VARIABLES ON ONE HASH CHAIN
*
{GBC02{MOV{(R10){R9{{LOAD PTR TO NEXT VRBLK
{{BZE{R9{GBC03{{JUMP IF END OF CHAIN
{{MOV{R9{R10{{ELSE COPY VRBLK POINTER
{{ADD{#4*VRVAL{R9{{POINT TO FIRST RELOC FLD
{{ADD{#4*VRNXT{R10{{POINT PAST LAST (AND TO LINK PTR)
{{JSR{GBCPF{{{PROCESS RELOC FIELDS IN VRBLK
{{BRN{GBC02{{{LOOP BACK FOR NEXT BLOCK
*
*      HERE AT END OF ONE HASH CHAIN
*
{GBC03{MOV{GBCNM{R6{{RESTORE BUCKET POINTER
{{BNE{R6{HSHTE{GBC01{LOOP BACK IF MORE BUCKETS TO GO
{{EJC{{{{
*
*      GBCOL (CONTINUED)
*
*      NOW WE ARE READY TO START PASS TWO. REGISTERS ARE USED
*      AS FOLLOWS IN PASS TWO.
*
*      (XR)                  SCANS THROUGH ALL BLOCKS
*      (WC)                  POINTER TO EVENTUAL LOCATION
*
*      THE MOVE DESCRIPTION BLOCKS BUILT IN THIS PASS HAVE
*      THE FOLLOWING FORMAT.
*
*      WORD 1                POINTER TO NEXT MOVE BLOCK,
*                            ZERO IF END OF CHAIN OF BLOCKS
*
*      WORD 2                LENGTH OF BLOCKS TO BE MOVED IN
*                            BYTES. SET TO THE ADDRESS OF THE
*                            FIRST BYTE WHILE ACTUALLY SCANNING
*                            THE BLOCKS.
*
*      THE FIRST ENTRY ON THIS CHAIN IS A SPECIAL ENTRY
*      CONSISTING OF THE TWO WORDS GBCNM AND GBCNS. AFTER
*      BUILDING THE CHAIN OF MOVE DESCRIPTORS, GBCNM POINTS TO
*      THE FIRST REAL MOVE BLOCK, AND GBCNS IS THE LENGTH OF
*      BLOCKS IN USE AT THE START OF STORAGE WHICH NEED NOT
*      BE MOVED SINCE THEY ARE IN THE CORRECT POSITION.
*
{GBC04{MOV{DNAMB{R9{{POINT TO FIRST BLOCK
{{MOV{R9{R8{{SET AS FIRST EVENTUAL LOCATION
{{ADD{GBSVB{R8{{ADD OFFSET FOR EVENTUAL MOVE UP
{{ZER{GBCNM{{{CLEAR INITIAL FORWARD POINTER
{{MOV{#GBCNM{GBCLM{{INITIALIZE PTR TO LAST MOVE BLOCK
{{MOV{R9{GBCNS{{INITIALIZE FIRST ADDRESS
*
*      LOOP THROUGH A SERIES OF BLOCKS IN USE
*
{GBC05{BEQ{R9{DNAMP{GBC07{JUMP IF END OF USED REGION
{{MOV{(R9){R6{{ELSE GET FIRST WORD
{{BHI{R6{#P$YYY{GBC06{SKIP IF NOT ENTRY PTR (IN USE)
{{BHI{R6{#B$AAA{GBC07{JUMP IF ENTRY POINTER (UNUSED)
*
*      HERE FOR BLOCK IN USE, LOOP TO RELOCATE REFERENCES
*
{GBC06{MOV{R6{R10{{COPY POINTER
{{MOV{(R10){R6{{LOAD FORWARD POINTER
{{MOV{R8{(R10){{RELOCATE REFERENCE
{{BHI{R6{#P$YYY{GBC06{LOOP BACK IF NOT END OF CHAIN
{{BLO{R6{#B$AAA{GBC06{LOOP BACK IF NOT END OF CHAIN
{{EJC{{{{
*
*      GBCOL (CONTINUED)
*
*      AT END OF CHAIN, RESTORE FIRST WORD AND BUMP PAST
*
{{MOV{R6{(R9){{RESTORE FIRST WORD
{{JSR{BLKLN{{{GET LENGTH OF THIS BLOCK
{{ADD{R6{R9{{BUMP ACTUAL POINTER
{{ADD{R6{R8{{BUMP EVENTUAL POINTER
{{BRN{GBC05{{{LOOP BACK FOR NEXT BLOCK
*
*      HERE AT END OF A SERIES OF BLOCKS IN USE
*
{GBC07{MOV{R9{R6{{COPY POINTER PAST LAST BLOCK
{{MOV{GBCLM{R10{{POINT TO PREVIOUS MOVE BLOCK
{{SUB{4*1(R10){R6{{SUBTRACT STARTING ADDRESS
{{MOV{R6{4*1(R10){{STORE LENGTH OF BLOCK TO BE MOVED
*
*      LOOP THROUGH A SERIES OF BLOCKS NOT IN USE
*
{GBC08{BEQ{R9{DNAMP{GBC10{JUMP IF END OF USED REGION
{{MOV{(R9){R6{{ELSE LOAD FIRST WORD OF NEXT BLOCK
{{BHI{R6{#P$YYY{GBC09{JUMP IF IN USE
{{BLO{R6{#B$AAA{GBC09{JUMP IF IN USE
{{JSR{BLKLN{{{ELSE GET LENGTH OF NEXT BLOCK
{{ADD{R6{R9{{PUSH POINTER
{{BRN{GBC08{{{AND LOOP BACK
*
*      HERE FOR A BLOCK IN USE AFTER PROCESSING A SERIES OF
*      BLOCKS WHICH WERE NOT IN USE, BUILD NEW MOVE BLOCK.
*
{GBC09{SUB{#4*NUM02{R9{{POINT 2 WORDS BEHIND FOR MOVE BLOCK
{{MOV{GBCLM{R10{{POINT TO PREVIOUS MOVE BLOCK
{{MOV{R9{(R10){{SET FORWARD PTR IN PREVIOUS BLOCK
{{ZER{(R9){{{ZERO FORWARD PTR OF NEW BLOCK
{{MOV{R9{GBCLM{{REMEMBER ADDRESS OF THIS BLOCK
{{MOV{R9{R10{{COPY PTR TO MOVE BLOCK
{{ADD{#4*NUM02{R9{{POINT BACK TO BLOCK IN USE
{{MOV{R9{4*1(R10){{STORE STARTING ADDRESS
{{BRN{GBC06{{{JUMP TO PROCESS BLOCK IN USE
{{EJC{{{{
*
*      GBCOL (CONTINUED)
*
*      HERE FOR PASS THREE -- ACTUALLY MOVE THE BLOCKS DOWN
*
*      (XL)                  POINTER TO OLD LOCATION
*      (XR)                  POINTER TO NEW LOCATION
*
{GBC10{MOV{DNAMB{R9{{POINT TO START OF STORAGE
{{ADD{GBCNS{R9{{BUMP PAST UNMOVED BLOCKS AT START
*
*      LOOP THROUGH MOVE DESCRIPTORS
*
{GBC11{MOV{GBCNM{R10{{POINT TO NEXT MOVE BLOCK
{{BZE{R10{GBC12{{JUMP IF END OF CHAIN
{{MOV{(R10)+{GBCNM{{MOVE POINTER DOWN CHAIN
{{MOV{(R10)+{R6{{GET LENGTH TO MOVE
{{MVW{{{{PERFORM MOVE
{{BRN{GBC11{{{LOOP BACK
*
*      NOW TEST FOR MOVE UP
*
{GBC12{MOV{R9{DNAMP{{SET NEXT AVAILABLE LOC PTR
{{MOV{GBSVB{R7{{RELOAD MOVE OFFSET
{{BZE{R7{GBC13{{JUMP IF NO MOVE REQUIRED
{{MOV{R9{R10{{ELSE COPY OLD TOP OF CORE
{{ADD{R7{R9{{POINT TO NEW TOP OF CORE
{{MOV{R9{DNAMP{{SAVE NEW TOP OF CORE POINTER
{{MOV{R10{R6{{COPY OLD TOP
{{SUB{DNAMB{R6{{MINUS OLD BOTTOM = LENGTH
{{ADD{R7{DNAMB{{BUMP BOTTOM TO GET NEW VALUE
{{MWB{{{{PERFORM MOVE (BACKWARDS)
*
*      MERGE HERE TO EXIT
*
{GBC13{MOV{GBSVA{R6{{RESTORE WA
{{SCP{R8{{{GET CODE POINTER
{{ADD{R$COD{R8{{MAKE ABSOLUTE AGAIN
{{LCP{R8{{{AND REPLACE ABSOLUTE VALUE
{{MOV{GBSVC{R8{{RESTORE WC
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{ICV{GBCNT{{{INCREMENT COUNT OF COLLECTIONS
{{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
{{ZER{GBCFL{{{NOTE EXIT FROM GBCOL
{{EXI{{{{EXIT TO GBCOL CALLER
*
*      GARBAGE COLLECTION NOT ALLOWED WHILST DUMPING
*
{GBC14{ICV{ERRFT{{{FATAL ERROR
{{ERB{250{INSUFFICIENT{{MEMORY TO COMPLETE DUMP
{{ENP{{{{END PROCEDURE GBCOL
{{EJC{{{{
*
*      GBCPF -- PROCESS FIELDS FOR GARBAGE COLLECTOR
*
*      THIS PROCEDURE IS USED BY THE GARBAGE COLLECTOR TO
*      PROCESS FIELDS IN PASS ONE. SEE GBCOL FOR FULL DETAILS.
*
*      (XR)                  PTR TO FIRST LOCATION TO PROCESS
*      (XL)                  PTR PAST LAST LOCATION TO PROCESS
*      JSR  GBCPF            CALL TO PROCESS FIELDS
*      (XR,WA,WB,WC,IA)      DESTROYED
*
*      NOTE THAT ALTHOUGH THIS PROCEDURE USES A RECURSIVE
*      APPROACH, IT CONTROLS ITS OWN STACK AND IS NOT RECURSIVE.
*
{GBCPF{PRC{E{0{{ENTRY POINT
{{ZER{-(SP){{{SET ZERO TO MARK BOTTOM OF STACK
{{MOV{R10{-(SP){{SAVE END POINTER
*
*      MERGE HERE TO GO DOWN A LEVEL AND START A NEW LOOP
*
*      1(XS)                 NEXT LVL FIELD PTR (0 AT OUTER LVL)
*      0(XS)                 PTR PAST LAST FIELD TO PROCESS
*      (XR)                  PTR TO FIRST FIELD TO PROCESS
*
*      LOOP TO PROCESS SUCCESSIVE FIELDS
*
{GPF01{MOV{(R9){R10{{LOAD FIELD CONTENTS
{{MOV{R9{R8{{SAVE FIELD POINTER
{{BLT{R10{DNAMB{GPF02{JUMP IF NOT PTR INTO DYNAMIC AREA
{{BGE{R10{DNAMP{GPF02{JUMP IF NOT PTR INTO DYNAMIC AREA
*
*      HERE WE HAVE A PTR TO A BLOCK IN THE DYNAMIC AREA.
*      LINK THIS FIELD ONTO THE REFERENCE BACKCHAIN.
*
{{MOV{(R10){R6{{LOAD PTR TO CHAIN (OR ENTRY PTR)
{{MOV{R9{(R10){{SET THIS FIELD AS NEW HEAD OF CHAIN
{{MOV{R6{(R9){{SET FORWARD POINTER
*
*      NOW SEE IF THIS BLOCK HAS BEEN PROCESSED BEFORE
*
{{BHI{R6{#P$YYY{GPF02{JUMP IF ALREADY PROCESSED
{{BHI{R6{#B$AAA{GPF03{JUMP IF NOT ALREADY PROCESSED
*
*      HERE TO MOVE TO NEXT FIELD
*
{GPF02{MOV{R8{R9{{RESTORE FIELD POINTER
{{ICA{R9{{{BUMP TO NEXT FIELD
{{BNE{R9{(SP){GPF01{LOOP BACK IF MORE TO GO
{{EJC{{{{
*
*      GBCPF (CONTINUED)
*
*      HERE WE POP UP A LEVEL AFTER FINISHING A BLOCK
*
{{MOV{(SP)+{R10{{RESTORE POINTER PAST END
{{MOV{(SP)+{R8{{RESTORE BLOCK POINTER
{{BNZ{R8{GPF02{{CONTINUE LOOP UNLESS OUTER LEVL
{{EXI{{{{RETURN TO CALLER IF OUTER LEVEL
*
*      HERE TO PROCESS AN ACTIVE BLOCK WHICH HAS NOT BEEN DONE
*
{GPF03{MOV{R10{R9{{COPY BLOCK POINTER
{{MOV{R6{R10{{COPY FIRST WORD OF BLOCK
{{LEI{R10{{{LOAD ENTRY POINT ID (BL$XX)
*
*      BLOCK TYPE SWITCH. NOTE THAT BLOCKS WITH NO RELOCATABLE
*      FIELDS JUST RETURN TO GPF02 HERE TO CONTINE TO NEXT FLD.
*
{{BSW{R10{BL$$${{SWITCH ON BLOCK TYPE
{{IFF{BL$AR{GPF06{{ARBLK
{{IFF{BL$BC{GPF18{{BCBLK
{{IFF{BL$CD{GPF08{{CDBLK
{{IFF{BL$EX{GPF17{{EXBLK
{{IFF{BL$IC{GPF02{{ICBLK
{{IFF{BL$NM{GPF10{{NMBLK
{{IFF{BL$P0{GPF10{{P0BLK
{{IFF{BL$P1{GPF12{{P1BLK
{{IFF{BL$P2{GPF12{{P2BLK
{{IFF{BL$RC{GPF02{{RCBLK
{{IFF{BL$SC{GPF02{{SCBLK
{{IFF{BL$SE{GPF02{{SEBLK
{{IFF{BL$TB{GPF08{{TBBLK
{{IFF{BL$VC{GPF08{{VCBLK
{{IFF{BL$XN{GPF02{{XNBLK
{{IFF{BL$XR{GPF09{{XRBLK
{{IFF{BL$PD{GPF13{{PDBLK
{{IFF{BL$TR{GPF16{{TRBLK
{{IFF{BL$BF{GPF02{{BFBLK
{{IFF{BL$CC{GPF07{{CCBLK
{{IFF{BL$CM{GPF04{{CMBLK
{{IFF{BL$CT{GPF02{{CTBLK
{{IFF{BL$DF{GPF02{{DFBLK
{{IFF{BL$EF{GPF02{{EFBLK
{{IFF{BL$EV{GPF10{{EVBLK
{{IFF{BL$FF{GPF11{{FFBLK
{{IFF{BL$KV{GPF02{{KVBLK
{{IFF{BL$PF{GPF14{{PFBLK
{{IFF{BL$TE{GPF15{{TEBLK
{{ESW{{{{END OF JUMP TABLE
{{EJC{{{{
*
*      GBCPF (CONTINUED)
*
*      CMBLK
*
{GPF04{MOV{4*CMLEN(R9){R6{{LOAD LENGTH
{{MOV{#4*CMTYP{R7{{SET OFFSET
*
*      HERE TO PUSH DOWN TO NEW LEVEL
*
*      (WC)                  FIELD PTR AT PREVIOUS LEVEL
*      (XR)                  PTR TO NEW BLOCK
*      (WA)                  LENGTH (RELOC FLDS + FLDS AT START)
*      (WB)                  OFFSET TO FIRST RELOC FIELD
*
{GPF05{ADD{R9{R6{{POINT PAST LAST RELOC FIELD
{{ADD{R7{R9{{POINT TO FIRST RELOC FIELD
{{MOV{R8{-(SP){{STACK OLD FIELD POINTER
{{MOV{R6{-(SP){{STACK NEW LIMIT POINTER
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{BRN{GPF01{{{IF OK, BACK TO PROCESS
*
*      ARBLK
*
{GPF06{MOV{4*ARLEN(R9){R6{{LOAD LENGTH
{{MOV{4*AROFS(R9){R7{{SET OFFSET TO 1ST RELOC FLD (ARPRO)
{{BRN{GPF05{{{ALL SET
*
*      CCBLK
*
{GPF07{MOV{4*CCUSE(R9){R6{{SET LENGTH IN USE
{{MOV{#4*CCUSE{R7{{1ST WORD (MAKE SURE AT LEAST ONE)
{{BRN{GPF05{{{ALL SET
{{EJC{{{{
*
*      GBCPF (CONTINUED)
*
*      CDBLK, TBBLK, VCBLK
*
{GPF08{MOV{4*OFFS2(R9){R6{{LOAD LENGTH
{{MOV{#4*OFFS3{R7{{SET OFFSET
{{BRN{GPF05{{{JUMP BACK
*
*      XRBLK
*
{GPF09{MOV{4*XRLEN(R9){R6{{LOAD LENGTH
{{MOV{#4*XRPTR{R7{{SET OFFSET
{{BRN{GPF05{{{JUMP BACK
*
*      EVBLK, NMBLK, P0BLK
*
{GPF10{MOV{#4*OFFS2{R6{{POINT PAST SECOND FIELD
{{MOV{#4*OFFS1{R7{{OFFSET IS ONE (ONLY RELOC FLD IS 2)
{{BRN{GPF05{{{ALL SET
*
*      FFBLK
*
{GPF11{MOV{#4*FFOFS{R6{{SET LENGTH
{{MOV{#4*FFNXT{R7{{SET OFFSET
{{BRN{GPF05{{{ALL SET
*
*      P1BLK, P2BLK
*
{GPF12{MOV{#4*PARM2{R6{{LENGTH (PARM2 IS NON-RELOCATABLE)
{{MOV{#4*PTHEN{R7{{SET OFFSET
{{BRN{GPF05{{{ALL SET
{{EJC{{{{
*
*      GBCPF (CONTINUED)
*
*      PDBLK
*
{GPF13{MOV{4*PDDFP(R9){R10{{LOAD PTR TO DFBLK
{{MOV{4*DFPDL(R10){R6{{GET PDBLK LENGTH
{{MOV{#4*PDFLD{R7{{SET OFFSET
{{BRN{GPF05{{{ALL SET
*
*      PFBLK
*
{GPF14{MOV{#4*PFARG{R6{{LENGTH PAST LAST RELOC
{{MOV{#4*PFCOD{R7{{OFFSET TO FIRST RELOC
{{BRN{GPF05{{{ALL SET
*
*      TEBLK
*
{GPF15{MOV{#4*TESI${R6{{SET LENGTH
{{MOV{#4*TESUB{R7{{AND OFFSET
{{BRN{GPF05{{{ALL SET
*
*      TRBLK
*
{GPF16{MOV{#4*TRSI${R6{{SET LENGTH
{{MOV{#4*TRVAL{R7{{AND OFFSET
{{BRN{GPF05{{{ALL SET
*
*      EXBLK
*
{GPF17{MOV{4*EXLEN(R9){R6{{LOAD LENGTH
{{MOV{#4*EXFLC{R7{{SET OFFSET
{{BRN{GPF05{{{JUMP BACK
*
*      BCBLK
*
{GPF18{MOV{#4*BCSI${R6{{SET LENGTH
{{MOV{#4*BCBUF{R7{{AND OFFSET
{{BRN{GPF05{{{ALL SET
{{ENP{{{{END PROCEDURE GBCPF
{{EJC{{{{
*
*      GTARR -- GET ARRAY
*
*      GTARR IS PASSED AN OBJECT AND RETURNS AN ARRAY IF POSSIBL
*
*      (XR)                  VALUE TO BE CONVERTED
*      JSR  GTARR            CALL TO GET ARRAY
*      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
*      (XR)                  RESULTING ARRAY
*      (XL,WA,WB,WC)         DESTROYED
*
{GTARR{PRC{E{1{{ENTRY POINT
{{MOV{(R9){R6{{LOAD TYPE WORD
{{BEQ{R6{#B$ART{GTAR8{EXIT IF ALREADY AN ARRAY
{{BEQ{R6{#B$VCT{GTAR8{EXIT IF ALREADY AN ARRAY
{{BNE{R6{#B$TBT{GTA9A{ELSE FAIL IF NOT A TABLE (SGD02)
*
*      HERE WE CONVERT A TABLE TO AN ARRAY
*
{{MOV{R9{-(SP){{REPLACE TBBLK POINTER ON STACK
{{ZER{R9{{{SIGNAL FIRST PASS
{{ZER{R7{{{ZERO NON-NULL ELEMENT COUNT
*
*      THE FOLLOWING CODE IS EXECUTED TWICE. ON THE FIRST PASS,
*      SIGNALLED BY XR=0, THE NUMBER OF NON-NULL ELEMENTS IN
*      THE TABLE IS COUNTED IN WB. IN THE SECOND PASS, WHERE
*      XR IS A POINTER INTO THE ARBLK, THE NAME AND VALUE ARE
*      ENTERED INTO THE CURRENT ARBLK LOCATION.
*
{GTAR1{MOV{(SP){R10{{POINT TO TABLE
{{ADD{4*TBLEN(R10){R10{{POINT PAST LAST BUCKET
{{SUB{#4*TBBUK{R10{{SET FIRST BUCKET OFFSET
{{MOV{R10{R6{{COPY ADJUSTED POINTER
*
*      LOOP THROUGH BUCKETS IN TABLE BLOCK
*      NEXT THREE LINES OF CODE RELY ON TENXT HAVING A VALUE
*      1 LESS THAN TBBUK.
*
{GTAR2{MOV{R6{R10{{COPY BUCKET POINTER
{{DCA{R6{{{DECREMENT BUCKET POINTER
*
*      LOOP THROUGH TEBLKS ON ONE BUCKET CHAIN
*
{GTAR3{MOV{4*TENXT(R10){R10{{POINT TO NEXT TEBLK
{{BEQ{R10{(SP){GTAR6{JUMP IF CHAIN END (TBBLK PTR)
{{MOV{R10{CNVTP{{ELSE SAVE TEBLK POINTER
*
*      LOOP TO FIND VALUE DOWN TRBLK CHAIN
*
{GTAR4{MOV{4*TEVAL(R10){R10{{LOAD VALUE
{{BEQ{(R10){#B$TRT{GTAR4{LOOP TILL VALUE FOUND
{{MOV{R10{R8{{COPY VALUE
{{MOV{CNVTP{R10{{RESTORE TEBLK POINTER
{{EJC{{{{
*
*      GTARR (CONTINUED)
*
*      NOW CHECK FOR NULL AND TEST CASES
*
{{BEQ{R8{#NULLS{GTAR3{LOOP BACK TO IGNORE NULL VALUE
{{BNZ{R9{GTAR5{{JUMP IF SECOND PASS
{{ICV{R7{{{FOR THE FIRST PASS, BUMP COUNT
{{BRN{GTAR3{{{AND LOOP BACK FOR NEXT TEBLK
*
*      HERE IN SECOND PASS
*
{GTAR5{MOV{4*TESUB(R10){(R9)+{{STORE SUBSCRIPT NAME
{{MOV{R8{(R9)+{{STORE VALUE IN ARBLK
{{BRN{GTAR3{{{LOOP BACK FOR NEXT TEBLK
*
*      HERE AFTER SCANNING TEBLKS ON ONE CHAIN
*
{GTAR6{BNE{R6{(SP){GTAR2{LOOP BACK IF MORE BUCKETS TO GO
{{BNZ{R9{GTAR7{{ELSE JUMP IF SECOND PASS
*
*      HERE AFTER COUNTING NON-NULL ELEMENTS
*
{{BZE{R7{GTAR9{{FAIL IF NO NON-NULL ELEMENTS
{{MOV{R7{R6{{ELSE COPY COUNT
{{ADD{R7{R6{{DOUBLE (TWO WORDS/ELEMENT)
{{ADD{#ARVL2{R6{{ADD SPACE FOR STANDARD FIELDS
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{BGE{R6{MXLEN{GTAR9{FAIL IF TOO LONG FOR ARRAY
{{JSR{ALLOC{{{ELSE ALLOCATE SPACE FOR ARBLK
{{MOV{#B$ART{(R9){{STORE TYPE WORD
{{ZER{4*IDVAL(R9){{{ZERO ID FOR THE MOMENT
{{MOV{R6{4*ARLEN(R9){{STORE LENGTH
{{MOV{#NUM02{4*ARNDM(R9){{SET DIMENSIONS = 2
{{LDI{INTV1{{{GET INTEGER ONE
{{STI{4*ARLBD(R9){{{STORE AS LBD 1
{{STI{4*ARLB2(R9){{{STORE AS LBD 2
{{LDI{INTV2{{{LOAD INTEGER TWO
{{STI{4*ARDM2(R9){{{STORE AS DIM 2
{{MTI{R7{{{GET ELEMENT COUNT AS INTEGER
{{STI{4*ARDIM(R9){{{STORE AS DIM 1
{{ZER{4*ARPR2(R9){{{ZERO PROTOTYPE FIELD FOR NOW
{{MOV{#4*ARPR2{4*AROFS(R9){{SET OFFSET FIELD (SIGNAL PASS 2)
{{MOV{R9{R7{{SAVE ARBLK POINTER
{{ADD{#4*ARVL2{R9{{POINT TO FIRST ELEMENT LOCATION
{{BRN{GTAR1{{{JUMP BACK TO FILL IN ELEMENTS
{{EJC{{{{
*
*      GTARR (CONTINUED)
*
*      HERE AFTER FILLING IN ELEMENT VALUES
*
{GTAR7{MOV{R7{R9{{RESTORE ARBLK POINTER
{{MOV{R7{(SP){{STORE AS RESULT
*
*      NOW WE NEED THE ARRAY PROTOTYPE WHICH IS OF THE FORM NN,2
*      THIS IS OBTAINED BY BUILDING THE STRING FOR NN02 AND
*      CHANGING THE ZERO TO A COMMA BEFORE STORING IT.
*
{{LDI{4*ARDIM(R9){{{GET NUMBER OF ELEMENTS (NN)
{{MLI{INTVH{{{MULTIPLY BY 100
{{ADI{INTV2{{{ADD 2 (NN02)
{{JSR{ICBLD{{{BUILD INTEGER
{{MOV{R9{-(SP){{STORE PTR FOR GTSTG
{{JSR{GTSTG{{{CONVERT TO STRING
{{PPM{{{{CONVERT FAIL IS IMPOSSIBLE
{{MOV{R9{R10{{COPY STRING POINTER
{{MOV{(SP)+{R9{{RELOAD ARBLK POINTER
{{MOV{R10{4*ARPR2(R9){{STORE PROTOTYPE PTR (NN02)
{{SUB{#NUM02{R6{{ADJUST LENGTH TO POINT TO ZERO
{{PSC{R10{R6{{POINT TO ZERO
{{MOV{#CH$CM{R7{{LOAD A COMMA
{{SCH{R7{(R10){{STORE A COMMA OVER THE ZERO
{{CSC{R10{{{COMPLETE STORE CHARACTERS
*
*      NORMAL RETURN
*
{GTAR8{EXI{{{{RETURN TO CALLER
*
*      NON-CONVERSION RETURN
*
{GTAR9{MOV{(SP)+{R9{{RESTORE STACK FOR CONV ERR (SGD02)
*
*      MERGE TO TAKE CONVERT ERROR WHEN STACK ADJUSTED OK
*
{GTA9A{EXI{1{{{RETURN
{{ENP{{{{PROCEDURE GTARR
{{EJC{{{{
*
*      GTCOD -- CONVERT TO CODE
*
*      (XR)                  OBJECT TO BE CONVERTED
*      JSR  GTCOD            CALL TO CONVERT TO CODE
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  POINTER TO RESULTING CDBLK
*      (XL,WA,WB,WC,RA)      DESTROYED
*
*      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
*      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
*      WITHOUT RETURNING TO THIS ROUTINE.
*
{GTCOD{PRC{E{1{{ENTRY POINT
{{BEQ{(R9){#B$CDS{GTCD1{JUMP IF ALREADY CODE
{{BEQ{(R9){#B$CDC{GTCD1{JUMP IF ALREADY CODE
*
*      HERE WE MUST GENERATE A CDBLK BY COMPILATION
*
{{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
{{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
{{PPM{GTCD2{{{JUMP IF NON-CONVERTIBLE
{{MOV{FLPTR{GTCEF{{SAVE FAIL PTR IN CASE OF ERROR
{{MOV{R$COD{R$GTC{{ALSO SAVE CODE PTR
{{MOV{R9{R$CIM{{ELSE SET IMAGE POINTER
{{MOV{R6{SCNIL{{SET IMAGE LENGTH
{{ZER{SCNPT{{{SET SCAN POINTER
{{MOV{#STGXC{STAGE{{SET STAGE FOR EXECUTE COMPILE
{{MOV{CMPSN{LSTSN{{IN CASE LISTR CALLED
{{JSR{CMPIL{{{COMPILE STRING
{{MOV{#STGXT{STAGE{{RESET STAGE FOR EXECUTE TIME
{{ZER{R$CIM{{{CLEAR IMAGE
*
*      MERGE HERE IF NO CONVERT REQUIRED
*
{GTCD1{EXI{{{{GIVE NORMAL GTCOD RETURN
*
*      HERE IF UNCONVERTIBLE
*
{GTCD2{EXI{1{{{GIVE ERROR RETURN
{{ENP{{{{END PROCEDURE GTCOD
{{EJC{{{{
*
*      GTEXP -- CONVERT TO EXPRESSION
*
*      (XR)                  INPUT VALUE TO BE CONVERTED
*      JSR  GTEXP            CALL TO CONVERT TO EXPRESSION
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  POINTER TO RESULT EXBLK OR SEBLK
*      (XL,WA,WB,WC,RA)      DESTROYED
*
*      IF A SPITBOL ERROR OCCURS DURING COMPILATION OR PRE-
*      EVALUATION, CONTROL IS PASSED VIA ERROR SECTION TO EXFAL
*      WITHOUT RETURNING TO THIS ROUTINE.
*
{GTEXP{PRC{E{1{{ENTRY POINT
{{BLO{(R9){#B$E$${GTEX1{JUMP IF ALREADY AN EXPRESSION
{{MOV{R9{-(SP){{STORE ARGUMENT FOR GTSTG
{{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
{{PPM{GTEX2{{{JUMP IF UNCONVERTIBLE
*
*      CHECK THE LAST CHARACTER OF THE STRING FOR COLON OR
*      SEMICOLON.  THESE CHARACTERS CAN LEGITIMATELY END AN
*      EXPRESSION IN OPEN CODE, SO EXPAN WILL NOT DETECT THEM
*      AS ERRORS, BUT THEY ARE INVALID AS TERMINATORS FOR A
*      STRING THAT IS BEING CONVERTED TO EXPRESSION FORM.
*
{{MOV{R9{R10{{COPY INPUT STRING POINTER (REG06)
{{PLC{R10{R6{{POINT ONE PAST THE STRING END (REG06)
{{LCH{R10{-(R10){{FETCH THE LAST CHARACTER (REG06)
{{BEQ{R10{#CH$CL{GTEX2{ERROR IF IT IS A SEMICOLON (REG06)
{{BEQ{R10{#CH$SM{GTEX2{OR IF IT IS A COLON (REG06)
*
*      HERE WE CONVERT A STRING BY COMPILATION
*
{{MOV{R9{R$CIM{{SET INPUT IMAGE POINTER
{{ZER{SCNPT{{{SET SCAN POINTER
{{MOV{R6{SCNIL{{SET INPUT IMAGE LENGTH
{{ZER{R7{{{SET CODE FOR NORMAL SCAN
{{MOV{FLPTR{GTCEF{{SAVE FAIL PTR IN CASE OF ERROR
{{MOV{R$COD{R$GTC{{ALSO SAVE CODE PTR
{{MOV{#STGEV{STAGE{{ADJUST STAGE FOR COMPILE
{{MOV{#T$UOK{SCNTP{{INDICATE UNARY OPERATOR ACCEPTABLE
{{JSR{EXPAN{{{BUILD TREE FOR EXPRESSION
{{ZER{SCNRS{{{RESET RESCAN FLAG
{{BNE{SCNPT{SCNIL{GTEX2{ERROR IF NOT END OF IMAGE
{{ZER{R7{{{SET OK VALUE FOR CDGEX CALL
{{MOV{R9{R10{{COPY TREE POINTER
{{JSR{CDGEX{{{BUILD EXPRESSION BLOCK
{{ZER{R$CIM{{{CLEAR POINTER
{{MOV{#STGXT{STAGE{{RESTORE STAGE FOR EXECUTE TIME
*
*      MERGE HERE IF NO CONVERSION REQUIRED
*
{GTEX1{EXI{{{{RETURN TO GTEXP CALLER
*
*      HERE IF UNCONVERTIBLE
*
{GTEX2{EXI{1{{{TAKE ERROR EXIT
{{ENP{{{{END PROCEDURE GTEXP
{{EJC{{{{
*
*      GTINT -- GET INTEGER VALUE
*
*      GTINT IS PASSED AN OBJECT AND RETURNS AN INTEGER AFTER
*      PERFORMING ANY NECESSARY CONVERSIONS.
*
*      (XR)                  VALUE TO BE CONVERTED
*      JSR  GTINT            CALL TO CONVERT TO INTEGER
*      PPM  LOC              TRANSFER LOC FOR CONVERT IMPOSSIBLE
*      (XR)                  RESULTING INTEGER
*      (WC,RA)               DESTROYED
*      (WA,WB)               DESTROYED (ONLY ON CONVERSION ERR)
*      (XR)                  UNCHANGED (ON CONVERT ERROR)
*
{GTINT{PRC{E{1{{ENTRY POINT
{{BEQ{(R9){#B$ICL{GTIN2{JUMP IF ALREADY AN INTEGER
{{MOV{R6{GTINA{{ELSE SAVE WA
{{MOV{R7{GTINB{{SAVE WB
{{JSR{GTNUM{{{CONVERT TO NUMERIC
{{PPM{GTIN3{{{JUMP IF UNCONVERTIBLE
{{BEQ{R6{#B$ICL{GTIN1{JUMP IF INTEGER
*
*      HERE WE CONVERT A REAL TO INTEGER
*
{{LDR{4*RCVAL(R9){{{LOAD REAL VALUE
{{RTI{GTIN3{{{CONVERT TO INTEGER (ERR IF OVFLOW)
{{JSR{ICBLD{{{IF OK BUILD ICBLK
*
*      HERE AFTER SUCCESSFUL CONVERSION TO INTEGER
*
{GTIN1{MOV{GTINA{R6{{RESTORE WA
{{MOV{GTINB{R7{{RESTORE WB
*
*      COMMON EXIT POINT
*
{GTIN2{EXI{{{{RETURN TO GTINT CALLER
*
*      HERE ON CONVERSION ERROR
*
{GTIN3{EXI{1{{{TAKE CONVERT ERROR EXIT
{{ENP{{{{END PROCEDURE GTINT
{{EJC{{{{
*
*      GTNUM -- GET NUMERIC VALUE
*
*      GTNUM IS GIVEN AN OBJECT AND RETURNS EITHER AN INTEGER
*      OR A REAL, PERFORMING ANY NECESSARY CONVERSIONS.
*
*      (XR)                  OBJECT TO BE CONVERTED
*      JSR  GTNUM            CALL TO CONVERT TO NUMERIC
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  POINTER TO RESULT (INT OR REAL)
*      (WA)                  FIRST WORD OF RESULT BLOCK
*      (WB,WC,RA)            DESTROYED
*      (XR)                  UNCHANGED (ON CONVERT ERROR)
*
{GTNUM{PRC{E{1{{ENTRY POINT
{{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
{{BEQ{R6{#B$ICL{GTN34{JUMP IF INTEGER (NO CONVERSION)
{{BEQ{R6{#B$RCL{GTN34{JUMP IF REAL (NO CONVERSION)
*
*      AT THIS POINT THE ONLY POSSIBILITY IS TO CONVERT A STRING
*      TO AN INTEGER OR REAL AS APPROPRIATE.
*
{{MOV{R9{-(SP){{STACK ARGUMENT IN CASE CONVERT ERR
{{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
{{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
{{PPM{GTN36{{{JUMP IF UNCONVERTIBLE
*
*      INITIALIZE NUMERIC CONVERSION
*
{{LDI{INTV0{{{INITIALIZE INTEGER RESULT TO ZERO
{{BZE{R6{GTN32{{JUMP TO EXIT WITH ZERO IF NULL
{{LCT{R6{R6{{SET BCT COUNTER FOR FOLLOWING LOOPS
{{ZER{GTNNF{{{TENTATIVELY INDICATE RESULT +
{{STI{GTNEX{{{INITIALISE EXPONENT TO ZERO
{{ZER{GTNSC{{{ZERO SCALE IN CASE REAL
{{ZER{GTNDF{{{RESET FLAG FOR DEC POINT FOUND
{{ZER{GTNRD{{{RESET FLAG FOR DIGITS FOUND
{{LDR{REAV0{{{ZERO REAL ACCUM IN CASE REAL
{{PLC{R9{{{POINT TO ARGUMENT CHARACTERS
*
*      MERGE BACK HERE AFTER IGNORING LEADING BLANK
*
{GTN01{LCH{R7{(R9)+{{LOAD FIRST CHARACTER
{{BLT{R7{#CH$D0{GTN02{JUMP IF NOT DIGIT
{{BLE{R7{#CH$D9{GTN06{JUMP IF FIRST CHAR IS A DIGIT
{{EJC{{{{
*
*      GTNUM (CONTINUED)
*
*      HERE IF FIRST DIGIT IS NON-DIGIT
*
{GTN02{BNE{R7{#CH$BL{GTN03{JUMP IF NON-BLANK
{GTNA2{BCT{R6{GTN01{{ELSE DECR COUNT AND LOOP BACK
{{BRN{GTN07{{{JUMP TO RETURN ZERO IF ALL BLANKS
*
*      HERE FOR FIRST CHARACTER NON-BLANK, NON-DIGIT
*
{GTN03{BEQ{R7{#CH$PL{GTN04{JUMP IF PLUS SIGN
{{BEQ{R7{#CH$HT{GTNA2{HORIZONTAL TAB EQUIV TO BLANK
{{BNE{R7{#CH$MN{GTN12{JUMP IF NOT MINUS (MAY BE REAL)
{{MNZ{GTNNF{{{IF MINUS SIGN, SET NEGATIVE FLAG
*
*      MERGE HERE AFTER PROCESSING SIGN
*
{GTN04{BCT{R6{GTN05{{JUMP IF CHARS LEFT
{{BRN{GTN36{{{ELSE ERROR
*
*      LOOP TO FETCH CHARACTERS OF AN INTEGER
*
{GTN05{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
{{BLT{R7{#CH$D0{GTN08{JUMP IF NOT A DIGIT
{{BGT{R7{#CH$D9{GTN08{JUMP IF NOT A DIGIT
*
*      MERGE HERE FOR FIRST DIGIT
*
{GTN06{STI{GTNSI{{{SAVE CURRENT VALUE
{{CVM{GTN35{{{CURRENT*10-(NEW DIG) JUMP IF OVFLOW
{{MNZ{GTNRD{{{SET DIGIT READ FLAG
{{BCT{R6{GTN05{{ELSE LOOP BACK IF MORE CHARS
*
*      HERE TO EXIT WITH CONVERTED INTEGER VALUE
*
{GTN07{BNZ{GTNNF{GTN32{{JUMP IF NEGATIVE (ALL SET)
{{NGI{{{{ELSE NEGATE
{{INO{GTN32{{{JUMP IF NO OVERFLOW
{{BRN{GTN36{{{ELSE SIGNAL ERROR
{{EJC{{{{
*
*      GTNUM (CONTINUED)
*
*      HERE FOR A NON-DIGIT CHARACTER WHILE ATTEMPTING TO
*      CONVERT AN INTEGER, CHECK FOR TRAILING BLANKS OR REAL.
*
{GTN08{BEQ{R7{#CH$BL{GTNA9{JUMP IF A BLANK
{{BEQ{R7{#CH$HT{GTNA9{JUMP IF HORIZONTAL TAB
{{ITR{{{{ELSE CONVERT INTEGER TO REAL
{{NGR{{{{NEGATE TO GET POSITIVE VALUE
{{BRN{GTN12{{{JUMP TO TRY FOR REAL
*
*      HERE WE SCAN OUT BLANKS TO END OF STRING
*
{GTN09{LCH{R7{(R9)+{{GET NEXT CHAR
{{BEQ{R7{#CH$HT{GTNA9{JUMP IF HORIZONTAL TAB
{{BNE{R7{#CH$BL{GTN36{ERROR IF NON-BLANK
{GTNA9{BCT{R6{GTN09{{LOOP BACK IF MORE CHARS TO CHECK
{{BRN{GTN07{{{RETURN INTEGER IF ALL BLANKS
*
*      LOOP TO COLLECT MANTISSA OF REAL
*
{GTN10{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
{{BLT{R7{#CH$D0{GTN12{JUMP IF NON-NUMERIC
{{BGT{R7{#CH$D9{GTN12{JUMP IF NON-NUMERIC
*
*      MERGE HERE TO COLLECT FIRST REAL DIGIT
*
{GTN11{SUB{#CH$D0{R7{{CONVERT DIGIT TO NUMBER
{{MLR{REAVT{{{MULTIPLY REAL BY 10.0
{{ROV{GTN36{{{CONVERT ERROR IF OVERFLOW
{{STR{GTNSR{{{SAVE RESULT
{{MTI{R7{{{GET NEW DIGIT AS INTEGER
{{ITR{{{{CONVERT NEW DIGIT TO REAL
{{ADR{GTNSR{{{ADD TO GET NEW TOTAL
{{ADD{GTNDF{GTNSC{{INCREMENT SCALE IF AFTER DEC POINT
{{MNZ{GTNRD{{{SET DIGIT FOUND FLAG
{{BCT{R6{GTN10{{LOOP BACK IF MORE CHARS
{{BRN{GTN22{{{ELSE JUMP TO SCALE
{{EJC{{{{
*
*      GTNUM (CONTINUED)
*
*      HERE IF NON-DIGIT FOUND WHILE COLLECTING A REAL
*
{GTN12{BNE{R7{#CH$DT{GTN13{JUMP IF NOT DEC POINT
{{BNZ{GTNDF{GTN36{{IF DEC POINT, ERROR IF ONE ALREADY
{{MOV{#NUM01{GTNDF{{ELSE SET FLAG FOR DEC POINT
{{BCT{R6{GTN10{{LOOP BACK IF MORE CHARS
{{BRN{GTN22{{{ELSE JUMP TO SCALE
*
*      HERE IF NOT DECIMAL POINT
*
{GTN13{BEQ{R7{#CH$LE{GTN15{JUMP IF E FOR EXPONENT
{{BEQ{R7{#CH$LD{GTN15{JUMP IF D FOR EXPONENT
{{BEQ{R7{#CH$$E{GTN15{JUMP IF E FOR EXPONENT
{{BEQ{R7{#CH$$D{GTN15{JUMP IF D FOR EXPONENT
*
*      HERE CHECK FOR TRAILING BLANKS
*
{GTN14{BEQ{R7{#CH$BL{GTNB4{JUMP IF BLANK
{{BEQ{R7{#CH$HT{GTNB4{JUMP IF HORIZONTAL TAB
{{BRN{GTN36{{{ERROR IF NON-BLANK
*
{GTNB4{LCH{R7{(R9)+{{GET NEXT CHARACTER
{{BCT{R6{GTN14{{LOOP BACK TO CHECK IF MORE
{{BRN{GTN22{{{ELSE JUMP TO SCALE
*
*      HERE TO READ AND PROCESS AN EXPONENT
*
{GTN15{ZER{GTNES{{{SET EXPONENT SIGN POSITIVE
{{LDI{INTV0{{{INITIALIZE EXPONENT TO ZERO
{{MNZ{GTNDF{{{RESET NO DEC POINT INDICATION
{{BCT{R6{GTN16{{JUMP SKIPPING PAST E OR D
{{BRN{GTN36{{{ERROR IF NULL EXPONENT
*
*      CHECK FOR EXPONENT SIGN
*
{GTN16{LCH{R7{(R9)+{{LOAD FIRST EXPONENT CHARACTER
{{BEQ{R7{#CH$PL{GTN17{JUMP IF PLUS SIGN
{{BNE{R7{#CH$MN{GTN19{ELSE JUMP IF NOT MINUS SIGN
{{MNZ{GTNES{{{SET SIGN NEGATIVE IF MINUS SIGN
*
*      MERGE HERE AFTER PROCESSING EXPONENT SIGN
*
{GTN17{BCT{R6{GTN18{{JUMP IF CHARS LEFT
{{BRN{GTN36{{{ELSE ERROR
*
*      LOOP TO CONVERT EXPONENT DIGITS
*
{GTN18{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
{{EJC{{{{
*
*      GTNUM (CONTINUED)
*
*      MERGE HERE FOR FIRST EXPONENT DIGIT
*
{GTN19{BLT{R7{#CH$D0{GTN20{JUMP IF NOT DIGIT
{{BGT{R7{#CH$D9{GTN20{JUMP IF NOT DIGIT
{{CVM{GTN36{{{ELSE CURRENT*10, SUBTRACT NEW DIGIT
{{BCT{R6{GTN18{{LOOP BACK IF MORE CHARS
{{BRN{GTN21{{{JUMP IF EXPONENT FIELD IS EXHAUSTED
*
*      HERE TO CHECK FOR TRAILING BLANKS AFTER EXPONENT
*
{GTN20{BEQ{R7{#CH$BL{GTNC0{JUMP IF BLANK
{{BEQ{R7{#CH$HT{GTNC0{JUMP IF HORIZONTAL TAB
{{BRN{GTN36{{{ERROR IF NON-BLANK
*
{GTNC0{LCH{R7{(R9)+{{GET NEXT CHARACTER
{{BCT{R6{GTN20{{LOOP BACK TILL ALL BLANKS SCANNED
*
*      MERGE HERE AFTER COLLECTING EXPONENT
*
{GTN21{STI{GTNEX{{{SAVE COLLECTED EXPONENT
{{BNZ{GTNES{GTN22{{JUMP IF IT WAS NEGATIVE
{{NGI{{{{ELSE COMPLEMENT
{{IOV{GTN36{{{ERROR IF OVERFLOW
{{STI{GTNEX{{{AND STORE POSITIVE EXPONENT
*
*      MERGE HERE WITH EXPONENT (0 IF NONE GIVEN)
*
{GTN22{BZE{GTNRD{GTN36{{ERROR IF NOT DIGITS COLLECTED
{{BZE{GTNDF{GTN36{{ERROR IF NO EXPONENT OR DEC POINT
{{MTI{GTNSC{{{ELSE LOAD SCALE AS INTEGER
{{SBI{GTNEX{{{SUBTRACT EXPONENT
{{IOV{GTN36{{{ERROR IF OVERFLOW
{{ILT{GTN26{{{JUMP IF WE MUST SCALE UP
*
*      HERE WE HAVE A NEGATIVE EXPONENT, SO SCALE DOWN
*
{{MFI{R6{GTN36{{LOAD SCALE FACTOR, ERR IF OVFLOW
*
*      LOOP TO SCALE DOWN IN STEPS OF 10**10
*
{GTN23{BLE{R6{#NUM10{GTN24{JUMP IF 10 OR LESS TO GO
{{DVR{REATT{{{ELSE DIVIDE BY 10**10
{{SUB{#NUM10{R6{{DECREMENT SCALE
{{BRN{GTN23{{{AND LOOP BACK
{{EJC{{{{
*
*      GTNUM (CONTINUED)
*
*      HERE SCALE REST OF WAY FROM POWERS OF TEN TABLE
*
{GTN24{BZE{R6{GTN30{{JUMP IF SCALED
{{LCT{R7{#CFP$R{{ELSE GET INDEXING FACTOR
{{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE
{{WTB{R6{{{CONVERT REMAINING SCALE TO BYTE OFS
*
*      LOOP TO POINT TO POWERS OF TEN TABLE ENTRY
*
{GTN25{ADD{R6{R9{{BUMP POINTER
{{BCT{R7{GTN25{{ONCE FOR EACH VALUE WORD
{{DVR{(R9){{{SCALE DOWN AS REQUIRED
{{BRN{GTN30{{{AND JUMP
*
*      COME HERE TO SCALE RESULT UP (POSITIVE EXPONENT)
*
{GTN26{NGI{{{{GET ABSOLUTE VALUE OF EXPONENT
{{IOV{GTN36{{{ERROR IF OVERFLOW
{{MFI{R6{GTN36{{ACQUIRE SCALE, ERROR IF OVFLOW
*
*      LOOP TO SCALE UP IN STEPS OF 10**10
*
{GTN27{BLE{R6{#NUM10{GTN28{JUMP IF 10 OR LESS TO GO
{{MLR{REATT{{{ELSE MULTIPLY BY 10**10
{{ROV{GTN36{{{ERROR IF OVERFLOW
{{SUB{#NUM10{R6{{ELSE DECREMENT SCALE
{{BRN{GTN27{{{AND LOOP BACK
*
*      HERE TO SCALE UP REST OF WAY WITH TABLE
*
{GTN28{BZE{R6{GTN30{{JUMP IF SCALED
{{LCT{R7{#CFP$R{{ELSE GET INDEXING FACTOR
{{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE
{{WTB{R6{{{CONVERT REMAINING SCALE TO BYTE OFS
*
*      LOOP TO POINT TO PROPER ENTRY IN POWERS OF TEN TABLE
*
{GTN29{ADD{R6{R9{{BUMP POINTER
{{BCT{R7{GTN29{{ONCE FOR EACH WORD IN VALUE
{{MLR{(R9){{{SCALE UP
{{ROV{GTN36{{{ERROR IF OVERFLOW
{{EJC{{{{
*
*      GTNUM (CONTINUED)
*
*      HERE WITH REAL VALUE SCALED AND READY EXCEPT FOR SIGN
*
{GTN30{BZE{GTNNF{GTN31{{JUMP IF POSITIVE
{{NGR{{{{ELSE NEGATE
*
*      HERE WITH PROPERLY SIGNED REAL VALUE IN (RA)
*
{GTN31{JSR{RCBLD{{{BUILD REAL BLOCK
{{BRN{GTN33{{{MERGE TO EXIT
*
*      HERE WITH PROPERLY SIGNED INTEGER VALUE IN (IA)
*
{GTN32{JSR{ICBLD{{{BUILD ICBLK
*
*      REAL MERGES HERE
*
{GTN33{MOV{(R9){R6{{LOAD FIRST WORD OF RESULT BLOCK
{{ICA{SP{{{POP ARGUMENT OFF STACK
*
*      COMMON EXIT POINT
*
{GTN34{EXI{{{{RETURN TO GTNUM CALLER
*
*      COME HERE IF OVERFLOW OCCURS DURING COLLECTION OF INTEGER
*
{GTN35{LDI{GTNSI{{{RELOAD INTEGER SO FAR
{{ITR{{{{CONVERT TO REAL
{{NGR{{{{MAKE VALUE POSITIVE
{{BRN{GTN11{{{MERGE WITH REAL CIRCUIT
*
*      HERE FOR UNCONVERTIBLE TO STRING OR CONVERSION ERROR
*
{GTN36{MOV{(SP)+{R9{{RELOAD ORIGINAL ARGUMENT
{{EXI{1{{{TAKE CONVERT-ERROR EXIT
{{ENP{{{{END PROCEDURE GTNUM
{{EJC{{{{
*
*      GTNVR -- CONVERT TO NATURAL VARIABLE
*
*      GTNVR LOCATES A VARIABLE BLOCK (VRBLK) GIVEN EITHER AN
*      APPROPRIATE NAME (NMBLK) OR A NON-NULL STRING (SCBLK).
*
*      (XR)                  ARGUMENT
*      JSR  GTNVR            CALL TO CONVERT TO NATURAL VARIABLE
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  POINTER TO VRBLK
*      (WA,WB)               DESTROYED (CONVERSION ERROR ONLY)
*      (WC)                  DESTROYED
*
{GTNVR{PRC{E{1{{ENTRY POINT
{{BNE{(R9){#B$NML{GNV02{JUMP IF NOT NAME
{{MOV{4*NMBAS(R9){R9{{ELSE LOAD NAME BASE IF NAME
{{BLO{R9{STATE{GNV07{SKIP IF VRBLK (IN STATIC REGION)
*
*      COMMON ERROR EXIT
*
{GNV01{EXI{1{{{TAKE CONVERT-ERROR EXIT
*
*      HERE IF NOT NAME
*
{GNV02{MOV{R6{GNVSA{{SAVE WA
{{MOV{R7{GNVSB{{SAVE WB
{{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
{{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
{{PPM{GNV01{{{JUMP IF CONVERSION ERROR
{{BZE{R6{GNV01{{NULL STRING IS AN ERROR
{{JSR{FLSTG{{{FOLD LOWER CASE TO UPPER CASE
{{MOV{R10{-(SP){{SAVE XL
{{MOV{R9{-(SP){{STACK STRING PTR FOR LATER
{{MOV{R9{R7{{COPY STRING POINTER
{{ADD{#4*SCHAR{R7{{POINT TO CHARACTERS OF STRING
{{MOV{R7{GNVST{{SAVE POINTER TO CHARACTERS
{{MOV{R6{R7{{COPY LENGTH
{{CTW{R7{0{{GET NUMBER OF WORDS IN NAME
{{MOV{R7{GNVNW{{SAVE FOR LATER
{{JSR{HASHS{{{COMPUTE HASH INDEX FOR STRING
{{RMI{HSHNB{{{COMPUTE HASH OFFSET BY TAKING MOD
{{MFI{R8{{{GET AS OFFSET
{{WTB{R8{{{CONVERT OFFSET TO BYTES
{{ADD{HSHTB{R8{{POINT TO PROPER HASH CHAIN
{{SUB{#4*VRNXT{R8{{SUBTRACT OFFSET TO MERGE INTO LOOP
{{EJC{{{{
*
*      GTNVR (CONTINUED)
*
*      LOOP TO SEARCH HASH CHAIN
*
{GNV03{MOV{R8{R10{{COPY HASH CHAIN POINTER
{{MOV{4*VRNXT(R10){R10{{POINT TO NEXT VRBLK ON CHAIN
{{BZE{R10{GNV08{{JUMP IF END OF CHAIN
{{MOV{R10{R8{{SAVE POINTER TO THIS VRBLK
{{BNZ{4*VRLEN(R10){GNV04{{JUMP IF NOT SYSTEM VARIABLE
{{MOV{4*VRSVP(R10){R10{{ELSE POINT TO SVBLK
{{SUB{#4*VRSOF{R10{{ADJUST OFFSET FOR MERGE
*
*      MERGE HERE WITH STRING PTR (LIKE VRBLK) IN XL
*
{GNV04{BNE{R6{4*VRLEN(R10){GNV03{BACK FOR NEXT VRBLK IF LENGTHS NE
{{ADD{#4*VRCHS{R10{{ELSE POINT TO CHARS OF CHAIN ENTRY
{{LCT{R7{GNVNW{{GET WORD COUNTER TO CONTROL LOOP
{{MOV{GNVST{R9{{POINT TO CHARS OF NEW NAME
*
*      LOOP TO COMPARE CHARACTERS OF THE TWO NAMES
*
{GNV05{CNE{(R9){(R10){GNV03{JUMP IF NO MATCH FOR NEXT VRBLK
{{ICA{R9{{{BUMP NEW NAME POINTER
{{ICA{R10{{{BUMP VRBLK IN CHAIN NAME POINTER
{{BCT{R7{GNV05{{ELSE LOOP TILL ALL COMPARED
{{MOV{R8{R9{{WE HAVE FOUND A MATCH, GET VRBLK
*
*      EXIT POINT AFTER FINDING VRBLK OR BUILDING NEW ONE
*
{GNV06{MOV{GNVSA{R6{{RESTORE WA
{{MOV{GNVSB{R7{{RESTORE WB
{{ICA{SP{{{POP STRING POINTER
{{MOV{(SP)+{R10{{RESTORE XL
*
*      COMMON EXIT POINT
*
{GNV07{EXI{{{{RETURN TO GTNVR CALLER
*
*      NOT FOUND, PREPARE TO SEARCH SYSTEM VARIABLE TABLE
*
{GNV08{ZER{R9{{{CLEAR GARBAGE XR POINTER
{{MOV{R8{GNVHE{{SAVE PTR TO END OF HASH CHAIN
{{BGT{R6{#NUM09{GNV14{CANNOT BE SYSTEM VAR IF LENGTH GT 9
{{MOV{R6{R10{{ELSE COPY LENGTH
{{WTB{R10{{{CONVERT TO BYTE OFFSET
{{MOV{L^VSRCH(R10){R10{{POINT TO FIRST SVBLK OF THIS LENGTH
{{EJC{{{{
*
*      GTNVR (CONTINUED)
*
*      LOOP TO SEARCH ENTRIES IN STANDARD VARIABLE TABLE
*
{GNV09{MOV{R10{GNVSP{{SAVE TABLE POINTER
{{MOV{(R10)+{R8{{LOAD SVBIT BIT STRING
{{MOV{(R10)+{R7{{LOAD LENGTH FROM TABLE ENTRY
{{BNE{R6{R7{GNV14{JUMP IF END OF RIGHT LENGTH ENTIRES
{{LCT{R7{GNVNW{{GET WORD COUNTER TO CONTROL LOOP
{{MOV{GNVST{R9{{POINT TO CHARS OF NEW NAME
*
*      LOOP TO CHECK FOR MATCHING NAMES
*
{GNV10{CNE{(R9){(R10){GNV11{JUMP IF NAME MISMATCH
{{ICA{R9{{{ELSE BUMP NEW NAME POINTER
{{ICA{R10{{{BUMP SVBLK POINTER
{{BCT{R7{GNV10{{ELSE LOOP UNTIL ALL CHECKED
*
*      HERE WE HAVE A MATCH IN THE STANDARD VARIABLE TABLE
*
{{ZER{R8{{{SET VRLEN VALUE ZERO
{{MOV{#4*VRSI${R6{{SET STANDARD SIZE
{{BRN{GNV15{{{JUMP TO BUILD VRBLK
*
*      HERE IF NO MATCH WITH TABLE ENTRY IN SVBLKS TABLE
*
{GNV11{ICA{R10{{{BUMP PAST WORD OF CHARS
{{BCT{R7{GNV11{{LOOP BACK IF MORE TO GO
{{RSH{R8{SVNBT{{REMOVE UNINTERESTING BITS
*
*      LOOP TO BUMP TABLE PTR FOR EACH FLAGGED WORD
*
{GNV12{MOV{BITS1{R7{{LOAD BIT TO TEST
{{ANB{R8{R7{{TEST FOR WORD PRESENT
{{ZRB{R7{GNV13{{JUMP IF NOT PRESENT
{{ICA{R10{{{ELSE BUMP TABLE POINTER
*
*      HERE AFTER DEALING WITH ONE WORD (ONE BIT)
*
{GNV13{RSH{R8{1{{REMOVE BIT ALREADY PROCESSED
{{NZB{R8{GNV12{{LOOP BACK IF MORE BITS TO TEST
{{BRN{GNV09{{{ELSE LOOP BACK FOR NEXT SVBLK
*
*      HERE IF NOT SYSTEM VARIABLE
*
{GNV14{MOV{R6{R8{{COPY VRLEN VALUE
{{MOV{#VRCHS{R6{{LOAD STANDARD SIZE -CHARS
{{ADD{GNVNW{R6{{ADJUST FOR CHARS OF NAME
{{WTB{R6{{{CONVERT LENGTH TO BYTES
{{EJC{{{{
*
*      GTNVR (CONTINUED)
*
*      MERGE HERE TO BUILD VRBLK
*
{GNV15{JSR{ALOST{{{ALLOCATE SPACE FOR VRBLK (STATIC)
{{MOV{R9{R7{{SAVE VRBLK POINTER
{{MOV{#STNVR{R10{{POINT TO MODEL VARIABLE BLOCK
{{MOV{#4*VRLEN{R6{{SET LENGTH OF STANDARD FIELDS
{{MVW{{{{SET INITIAL FIELDS OF NEW BLOCK
{{MOV{GNVHE{R10{{LOAD POINTER TO END OF HASH CHAIN
{{MOV{R7{4*VRNXT(R10){{ADD NEW BLOCK TO END OF CHAIN
{{MOV{R8{(R9)+{{SET VRLEN FIELD, BUMP PTR
{{MOV{GNVNW{R6{{GET LENGTH IN WORDS
{{WTB{R6{{{CONVERT TO LENGTH IN BYTES
{{BZE{R8{GNV16{{JUMP IF SYSTEM VARIABLE
*
*      HERE FOR NON-SYSTEM VARIABLE -- SET CHARS OF NAME
*
{{MOV{(SP){R10{{POINT BACK TO STRING NAME
{{ADD{#4*SCHAR{R10{{POINT TO CHARS OF NAME
{{MVW{{{{MOVE CHARACTERS INTO PLACE
{{MOV{R7{R9{{RESTORE VRBLK POINTER
{{BRN{GNV06{{{JUMP BACK TO EXIT
*
*      HERE FOR SYSTEM VARIABLE CASE TO FILL IN FIELDS WHERE
*      NECESSARY FROM THE FIELDS PRESENT IN THE SVBLK.
*
{GNV16{MOV{GNVSP{R10{{LOAD POINTER TO SVBLK
{{MOV{R10{(R9){{SET SVBLK PTR IN VRBLK
{{MOV{R7{R9{{RESTORE VRBLK POINTER
{{MOV{4*SVBIT(R10){R7{{LOAD BIT INDICATORS
{{ADD{#4*SVCHS{R10{{POINT TO CHARACTERS OF NAME
{{ADD{R6{R10{{POINT PAST CHARACTERS
*
*      SKIP PAST KEYWORD NUMBER (SVKNM) IF PRESENT
*
{{MOV{BTKNM{R8{{LOAD TEST BIT
{{ANB{R7{R8{{AND TO TEST
{{ZRB{R8{GNV17{{JUMP IF NO KEYWORD NUMBER
{{ICA{R10{{{ELSE BUMP POINTER
{{EJC{{{{
*
*      GTNVR (CONTINUED)
*
*      HERE TEST FOR FUNCTION (SVFNC AND SVNAR)
*
{GNV17{MOV{BTFNC{R8{{GET TEST BIT
{{ANB{R7{R8{{AND TO TEST
{{ZRB{R8{GNV18{{SKIP IF NO SYSTEM FUNCTION
{{MOV{R10{4*VRFNC(R9){{ELSE POINT VRFNC TO SVFNC FIELD
{{ADD{#4*NUM02{R10{{AND BUMP PAST SVFNC, SVNAR FIELDS
*
*      NOW TEST FOR LABEL (SVLBL)
*
{GNV18{MOV{BTLBL{R8{{GET TEST BIT
{{ANB{R7{R8{{AND TO TEST
{{ZRB{R8{GNV19{{JUMP IF BIT IS OFF (NO SYSTEM LABL)
{{MOV{R10{4*VRLBL(R9){{ELSE POINT VRLBL TO SVLBL FIELD
{{ICA{R10{{{BUMP PAST SVLBL FIELD
*
*      NOW TEST FOR VALUE (SVVAL)
*
{GNV19{MOV{BTVAL{R8{{LOAD TEST BIT
{{ANB{R7{R8{{AND TO TEST
{{ZRB{R8{GNV06{{ALL DONE IF NO VALUE
{{MOV{(R10){4*VRVAL(R9){{ELSE SET INITIAL VALUE
{{MOV{#B$VRE{4*VRSTO(R9){{SET ERROR STORE ACCESS
{{BRN{GNV06{{{MERGE BACK TO EXIT TO CALLER
{{ENP{{{{END PROCEDURE GTNVR
{{EJC{{{{
*
*      GTPAT -- GET PATTERN
*
*      GTPAT IS PASSED AN OBJECT IN (XR) AND RETURNS A
*      PATTERN AFTER PERFORMING ANY NECESSARY CONVERSIONS
*
*      (XR)                  INPUT ARGUMENT
*      JSR  GTPAT            CALL TO CONVERT TO PATTERN
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  RESULTING PATTERN
*      (WA)                  DESTROYED
*      (WB)                  DESTROYED (ONLY ON CONVERT ERROR)
*      (XR)                  UNCHANGED (ONLY ON CONVERT ERROR)
*
{GTPAT{PRC{E{1{{ENTRY POINT
{{BHI{(R9){#P$AAA{GTPT5{JUMP IF PATTERN ALREADY
*
*      HERE IF NOT PATTERN, TRY FOR STRING
*
{{MOV{R7{GTPSB{{SAVE WB
{{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
{{JSR{GTSTG{{{CONVERT ARGUMENT TO STRING
{{PPM{GTPT2{{{JUMP IF IMPOSSIBLE
*
*      HERE WE HAVE A STRING
*
{{BNZ{R6{GTPT1{{JUMP IF NON-NULL
*
*      HERE FOR NULL STRING. GENERATE POINTER TO NULL PATTERN.
*
{{MOV{#NDNTH{R9{{POINT TO NOTHEN NODE
{{BRN{GTPT4{{{JUMP TO EXIT
{{EJC{{{{
*
*      GTPAT (CONTINUED)
*
*      HERE FOR NON-NULL STRING
*
{GTPT1{MOV{#P$STR{R7{{LOAD PCODE FOR MULTI-CHAR STRING
{{BNE{R6{#NUM01{GTPT3{JUMP IF MULTI-CHAR STRING
*
*      HERE FOR ONE CHARACTER STRING, SHARE ONE CHARACTER ANY
*
{{PLC{R9{{{POINT TO CHARACTER
{{LCH{R6{(R9){{LOAD CHARACTER
{{MOV{R6{R9{{SET AS PARM1
{{MOV{#P$ANS{R7{{POINT TO PCODE FOR 1-CHAR ANY
{{BRN{GTPT3{{{JUMP TO BUILD NODE
*
*      HERE IF ARGUMENT IS NOT CONVERTIBLE TO STRING
*
{GTPT2{MOV{#P$EXA{R7{{SET PCODE FOR EXPRESSION IN CASE
{{BLO{(R9){#B$E$${GTPT3{JUMP TO BUILD NODE IF EXPRESSION
*
*      HERE WE HAVE AN ERROR (CONVERSION IMPOSSIBLE)
*
{{EXI{1{{{TAKE CONVERT ERROR EXIT
*
*      MERGE HERE TO BUILD NODE FOR STRING OR EXPRESSION
*
{GTPT3{JSR{PBILD{{{CALL ROUTINE TO BUILD PATTERN NODE
*
*      COMMON EXIT AFTER SUCCESSFUL CONVERSION
*
{GTPT4{MOV{GTPSB{R7{{RESTORE WB
*
*      MERGE HERE TO EXIT OF NO CONVERSION REQUIRED
*
{GTPT5{EXI{{{{RETURN TO GTPAT CALLER
{{ENP{{{{END PROCEDURE GTPAT
{{EJC{{{{
*
*      GTREA -- GET REAL VALUE
*
*      GTREA IS PASSED AN OBJECT AND RETURNS A REAL VALUE
*      PERFORMING ANY NECESSARY CONVERSIONS.
*
*      (XR)                  OBJECT TO BE CONVERTED
*      JSR  GTREA            CALL TO CONVERT OBJECT TO REAL
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  POINTER TO RESULTING REAL
*      (WA,WB,WC,RA)         DESTROYED
*      (XR)                  UNCHANGED (CONVERT ERROR ONLY)
*
{GTREA{PRC{E{1{{ENTRY POINT
{{MOV{(R9){R6{{GET FIRST WORD OF BLOCK
{{BEQ{R6{#B$RCL{GTRE2{JUMP IF REAL
{{JSR{GTNUM{{{ELSE CONVERT ARGUMENT TO NUMERIC
{{PPM{GTRE3{{{JUMP IF UNCONVERTIBLE
{{BEQ{R6{#B$RCL{GTRE2{JUMP IF REAL WAS RETURNED
*
*      HERE FOR CASE OF AN INTEGER TO CONVERT TO REAL
*
{GTRE1{LDI{4*ICVAL(R9){{{LOAD INTEGER
{{ITR{{{{CONVERT TO REAL
{{JSR{RCBLD{{{BUILD RCBLK
*
*      EXIT WITH REAL
*
{GTRE2{EXI{{{{RETURN TO GTREA CALLER
*
*      HERE ON CONVERSION ERROR
*
{GTRE3{EXI{1{{{TAKE CONVERT ERROR EXIT
{{ENP{{{{END PROCEDURE GTREA
{{EJC{{{{
*
*      GTSMI -- GET SMALL INTEGER
*
*      GTSMI IS PASSED A SNOBOL OBJECT AND RETURNS AN ADDRESS
*      INTEGER IN THE RANGE (0 LE N LE DNAMB). SUCH A VALUE CAN
*      ONLY BE DERIVED FROM AN INTEGER IN THE APPROPRIATE RANGE.
*      SMALL INTEGERS NEVER APPEAR AS SNOBOL VALUES. HOWEVER,
*      THEY ARE USED INTERNALLY FOR A VARIETY OF PURPOSES.
*
*      -(XS)                 ARGUMENT TO CONVERT (ON STACK)
*      JSR  GTSMI            CALL TO CONVERT TO SMALL INTEGER
*      PPM  LOC              TRANSFER LOC FOR NOT INTEGER
*      PPM  LOC              TRANSFER LOC FOR LT 0, GT DNAMB
*      (XR,WC)               RESULTING SMALL INT (TWO COPIES)
*      (XS)                  POPPED
*      (RA)                  DESTROYED
*      (WA,WB)               DESTROYED (ON CONVERT ERROR ONLY)
*      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
*
{GTSMI{PRC{N{2{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{BEQ{(R9){#B$ICL{GTSM1{SKIP IF ALREADY AN INTEGER
*
*      HERE IF NOT AN INTEGER
*
{{JSR{GTINT{{{CONVERT ARGUMENT TO INTEGER
{{PPM{GTSM2{{{JUMP IF CONVERT IS IMPOSSIBLE
*
*      MERGE HERE WITH INTEGER
*
{GTSM1{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
{{MFI{R8{GTSM3{{MOVE AS ONE WORD, JUMP IF OVFLOW
{{BGT{R8{MXLEN{GTSM3{OR IF TOO SMALL
{{MOV{R8{R9{{COPY RESULT TO XR
{{EXI{{{{RETURN TO GTSMI CALLER
*
*      HERE IF UNCONVERTIBLE TO INTEGER
*
{GTSM2{EXI{1{{{TAKE NON-INTEGER ERROR EXIT
*
*      HERE IF OUT OF RANGE
*
{GTSM3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT
{{ENP{{{{END PROCEDURE GTSMI
{{EJC{{{{
*
*      GTSTG -- GET STRING
*
*      GTSTG IS PASSED AN OBJECT AND RETURNS A STRING WITH
*      ANY NECESSARY CONVERSIONS PERFORMED.
*
*      -(XS)                 INPUT ARGUMENT (ON STACK)
*      JSR  GTSTG            CALL TO CONVERT TO STRING
*      PPM  LOC              TRANSFER LOC IF CONVERT IMPOSSIBLE
*      (XR)                  POINTER TO RESULTING STRING
*      (WA)                  LENGTH OF STRING IN CHARACTERS
*      (XS)                  POPPED
*      (RA)                  DESTROYED
*      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
*
{GTSTG{PRC{N{1{{ENTRY POINT
{{MOV{(SP)+{R9{{LOAD ARGUMENT, POP STACK
{{BEQ{(R9){#B$SCL{GTS30{JUMP IF ALREADY A STRING
*
*      HERE IF NOT A STRING ALREADY
*
{GTS01{MOV{R9{-(SP){{RESTACK ARGUMENT IN CASE ERROR
{{MOV{R10{-(SP){{SAVE XL
{{MOV{R7{GTSVB{{SAVE WB
{{MOV{R8{GTSVC{{SAVE WC
{{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
{{BEQ{R6{#B$ICL{GTS05{JUMP TO CONVERT INTEGER
{{BEQ{R6{#B$RCL{GTS10{JUMP TO CONVERT REAL
{{BEQ{R6{#B$NML{GTS03{JUMP TO CONVERT NAME
{{BEQ{R6{#B$BCT{GTS32{JUMP TO CONVERT BUFFER
*
*      HERE ON CONVERSION ERROR
*
{GTS02{MOV{(SP)+{R10{{RESTORE XL
{{MOV{(SP)+{R9{{RELOAD INPUT ARGUMENT
{{EXI{1{{{TAKE CONVERT ERROR EXIT
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      HERE TO CONVERT A NAME (ONLY POSSIBLE IF NATURAL VAR)
*
{GTS03{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
{{BHI{R10{STATE{GTS02{ERROR IF NOT NATURAL VAR (STATIC)
{{ADD{#4*VRSOF{R10{{ELSE POINT TO POSSIBLE STRING NAME
{{MOV{4*SCLEN(R10){R6{{LOAD LENGTH
{{BNZ{R6{GTS04{{JUMP IF NOT SYSTEM VARIABLE
{{MOV{4*VRSVO(R10){R10{{ELSE POINT TO SVBLK
{{MOV{4*SVLEN(R10){R6{{AND LOAD NAME LENGTH
*
*      MERGE HERE WITH STRING IN XR, LENGTH IN WA
*
{GTS04{ZER{R7{{{SET OFFSET TO ZERO
{{JSR{SBSTR{{{USE SBSTR TO COPY STRING
{{BRN{GTS29{{{JUMP TO EXIT
*
*      COME HERE TO CONVERT AN INTEGER
*
{GTS05{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE
{{MOV{#NUM01{GTSSF{{SET SIGN FLAG NEGATIVE
{{ILT{GTS06{{{SKIP IF INTEGER IS NEGATIVE
{{NGI{{{{ELSE NEGATE INTEGER
{{ZER{GTSSF{{{AND RESET NEGATIVE FLAG
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      HERE WITH SIGN FLAG SET AND SIGN FORCED NEGATIVE AS
*      REQUIRED BY THE CVD INSTRUCTION.
*
{GTS06{MOV{GTSWK{R9{{POINT TO RESULT WORK AREA
{{MOV{#NSTMX{R7{{INITIALIZE COUNTER TO MAX LENGTH
{{PSC{R9{R7{{PREPARE TO STORE (RIGHT-LEFT)
*
*      LOOP TO CONVERT DIGITS INTO WORK AREA
*
{GTS07{CVD{{{{CONVERT ONE DIGIT INTO WA
{{SCH{R6{-(R9){{STORE IN WORK AREA
{{DCV{R7{{{DECREMENT COUNTER
{{INE{GTS07{{{LOOP IF MORE DIGITS TO GO
{{CSC{R9{{{COMPLETE STORE CHARACTERS
*
*      MERGE HERE AFTER CONVERTING INTEGER OR REAL INTO WORK
*      AREA. WB IS SET TO NSTMX - (NUMBER OF CHARS IN RESULT).
*
{GTS08{MOV{#NSTMX{R6{{GET MAX NUMBER OF CHARACTERS
{{SUB{R7{R6{{COMPUTE LENGTH OF RESULT
{{MOV{R6{R10{{REMEMBER LENGTH FOR MOVE LATER ON
{{ADD{GTSSF{R6{{ADD ONE FOR NEGATIVE SIGN IF NEEDED
{{JSR{ALOCS{{{ALLOCATE STRING FOR RESULT
{{MOV{R9{R8{{SAVE RESULT POINTER FOR THE MOMENT
{{PSC{R9{{{POINT TO CHARS OF RESULT BLOCK
{{BZE{GTSSF{GTS09{{SKIP IF POSITIVE
{{MOV{#CH$MN{R6{{ELSE LOAD NEGATIVE SIGN
{{SCH{R6{(R9)+{{AND STORE IT
{{CSC{R9{{{COMPLETE STORE CHARACTERS
*
*      HERE AFTER DEALING WITH SIGN
*
{GTS09{MOV{R10{R6{{RECALL LENGTH TO MOVE
{{MOV{GTSWK{R10{{POINT TO RESULT WORK AREA
{{PLC{R10{R7{{POINT TO FIRST RESULT CHARACTER
{{MVC{{{{MOVE CHARS TO RESULT STRING
{{MOV{R8{R9{{RESTORE RESULT POINTER
{{BRN{GTS29{{{JUMP TO EXIT
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      HERE TO CONVERT A REAL
*
{GTS10{LDR{4*RCVAL(R9){{{LOAD REAL
{{ZER{GTSSF{{{RESET NEGATIVE FLAG
{{REQ{GTS31{{{SKIP IF ZERO
{{RGE{GTS11{{{JUMP IF REAL IS POSITIVE
{{MOV{#NUM01{GTSSF{{ELSE SET NEGATIVE FLAG
{{NGR{{{{AND GET ABSOLUTE VALUE OF REAL
*
*      NOW SCALE THE REAL TO THE RANGE (0.1 LE X LT 1.0)
*
{GTS11{LDI{INTV0{{{INITIALIZE EXPONENT TO ZERO
*
*      LOOP TO SCALE UP IN STEPS OF 10**10
*
{GTS12{STR{GTSRS{{{SAVE REAL VALUE
{{SBR{REAP1{{{SUBTRACT 0.1 TO COMPARE
{{RGE{GTS13{{{JUMP IF SCALE UP NOT REQUIRED
{{LDR{GTSRS{{{ELSE RELOAD VALUE
{{MLR{REATT{{{MULTIPLY BY 10**10
{{SBI{INTVT{{{DECREMENT EXPONENT BY 10
{{BRN{GTS12{{{LOOP BACK TO TEST AGAIN
*
*      TEST FOR SCALE DOWN REQUIRED
*
{GTS13{LDR{GTSRS{{{RELOAD VALUE
{{SBR{REAV1{{{SUBTRACT 1.0
{{RLT{GTS17{{{JUMP IF NO SCALE DOWN REQUIRED
{{LDR{GTSRS{{{ELSE RELOAD VALUE
*
*      LOOP TO SCALE DOWN IN STEPS OF 10**10
*
{GTS14{SBR{REATT{{{SUBTRACT 10**10 TO COMPARE
{{RLT{GTS15{{{JUMP IF LARGE STEP NOT REQUIRED
{{LDR{GTSRS{{{ELSE RESTORE VALUE
{{DVR{REATT{{{DIVIDE BY 10**10
{{STR{GTSRS{{{STORE NEW VALUE
{{ADI{INTVT{{{INCREMENT EXPONENT BY 10
{{BRN{GTS14{{{LOOP BACK
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      AT THIS POINT WE HAVE (1.0 LE X LT 10**10)
*      COMPLETE SCALING WITH POWERS OF TEN TABLE
*
{GTS15{MOV{#REAV1{R9{{POINT TO POWERS OF TEN TABLE
*
*      LOOP TO LOCATE CORRECT ENTRY IN TABLE
*
{GTS16{LDR{GTSRS{{{RELOAD VALUE
{{ADI{INTV1{{{INCREMENT EXPONENT
{{ADD{#4*CFP$R{R9{{POINT TO NEXT ENTRY IN TABLE
{{SBR{(R9){{{SUBTRACT IT TO COMPARE
{{RGE{GTS16{{{LOOP TILL WE FIND A LARGER ENTRY
{{LDR{GTSRS{{{THEN RELOAD THE VALUE
{{DVR{(R9){{{AND COMPLETE SCALING
{{STR{GTSRS{{{STORE VALUE
*
*      WE ARE NOW SCALED, SO ROUND BY ADDING 0.5 * 10**(-CFP$S)
*
{GTS17{LDR{GTSRS{{{GET VALUE AGAIN
{{ADR{GTSRN{{{ADD ROUNDING FACTOR
{{STR{GTSRS{{{STORE RESULT
*
*      THE ROUNDING OPERATION MAY HAVE PUSHED US UP PAST
*      1.0 AGAIN, SO CHECK ONE MORE TIME.
*
{{SBR{REAV1{{{SUBTRACT 1.0 TO COMPARE
{{RLT{GTS18{{{SKIP IF OK
{{ADI{INTV1{{{ELSE INCREMENT EXPONENT
{{LDR{GTSRS{{{RELOAD VALUE
{{DVR{REAVT{{{DIVIDE BY 10.0 TO RESCALE
{{BRN{GTS19{{{JUMP TO MERGE
*
*      HERE IF ROUNDING DID NOT MUCK UP SCALING
*
{GTS18{LDR{GTSRS{{{RELOAD ROUNDED VALUE
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      NOW WE HAVE COMPLETED THE SCALING AS FOLLOWS
*
*      (IA)                  SIGNED EXPONENT
*      (RA)                  SCALED REAL (ABSOLUTE VALUE)
*
*      IF THE EXPONENT IS NEGATIVE OR GREATER THAN CFP$S, THEN
*      WE CONVERT THE NUMBER IN THE FORM.
*
*      (NEG SIGN) 0 . (CPF$S DIGITS) E (EXP SIGN) (EXP DIGITS)
*
*      IF THE EXPONENT IS POSITIVE AND LESS THAN OR EQUAL TO
*      CFP$S, THE NUMBER IS CONVERTED IN THE FORM.
*
*      (NEG SIGN) (EXPONENT DIGITS) . (CFP$S-EXPONENT DIGITS)
*
*      IN BOTH CASES, THE FORMATS OBTAINED FROM THE ABOVE
*      RULES ARE MODIFIED BY DELETING TRAILING ZEROS AFTER THE
*      DECIMAL POINT. THERE ARE NO LEADING ZEROS IN THE EXPONENT
*      AND THE EXPONENT SIGN IS ALWAYS PRESENT.
*
{GTS19{MOV{#CFP$S{R10{{SET NUM DEC DIGITS = CFP$S
{{MOV{#CH$MN{GTSES{{SET EXPONENT SIGN NEGATIVE
{{ILT{GTS21{{{ALL SET IF EXPONENT IS NEGATIVE
{{MFI{R6{{{ELSE FETCH EXPONENT
{{BLE{R6{#CFP$S{GTS20{SKIP IF WE CAN USE SPECIAL FORMAT
{{MTI{R6{{{ELSE RESTORE EXPONENT
{{NGI{{{{SET NEGATIVE FOR CVD
{{MOV{#CH$PL{GTSES{{SET PLUS SIGN FOR EXPONENT SIGN
{{BRN{GTS21{{{JUMP TO GENERATE EXPONENT
*
*      HERE IF WE CAN USE THE FORMAT WITHOUT AN EXPONENT
*
{GTS20{SUB{R6{R10{{COMPUTE DIGITS AFTER DECIMAL POINT
{{LDI{INTV0{{{RESET EXPONENT TO ZERO
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      MERGE HERE AS FOLLOWS
*
*      (IA)                  EXPONENT ABSOLUTE VALUE
*      GTSES                 CHARACTER FOR EXPONENT SIGN
*      (RA)                  POSITIVE FRACTION
*      (XL)                  NUMBER OF DIGITS AFTER DEC POINT
*
{GTS21{MOV{GTSWK{R9{{POINT TO WORK AREA
{{MOV{#NSTMX{R7{{SET CHARACTER CTR TO MAX LENGTH
{{PSC{R9{R7{{PREPARE TO STORE (RIGHT TO LEFT)
{{IEQ{GTS23{{{SKIP EXPONENT IF IT IS ZERO
*
*      LOOP TO GENERATE DIGITS OF EXPONENT
*
{GTS22{CVD{{{{CONVERT A DIGIT INTO WA
{{SCH{R6{-(R9){{STORE IN WORK AREA
{{DCV{R7{{{DECREMENT COUNTER
{{INE{GTS22{{{LOOP BACK IF MORE DIGITS TO GO
*
*      HERE GENERATE EXPONENT SIGN AND E
*
{{MOV{GTSES{R6{{LOAD EXPONENT SIGN
{{SCH{R6{-(R9){{STORE IN WORK AREA
{{MOV{#CH$LE{R6{{GET CHARACTER LETTER E
{{SCH{R6{-(R9){{STORE IN WORK AREA
{{SUB{#NUM02{R7{{DECREMENT COUNTER FOR SIGN AND E
*
*      HERE TO GENERATE THE FRACTION
*
{GTS23{MLR{GTSSC{{{CONVERT REAL TO INTEGER (10**CFP$S)
{{RTI{{{{GET INTEGER (OVERFLOW IMPOSSIBLE)
{{NGI{{{{NEGATE AS REQUIRED BY CVD
*
*      LOOP TO SUPPRESS TRAILING ZEROS
*
{GTS24{BZE{R10{GTS27{{JUMP IF NO DIGITS LEFT TO DO
{{CVD{{{{ELSE CONVERT ONE DIGIT
{{BNE{R6{#CH$D0{GTS26{JUMP IF NOT A ZERO
{{DCV{R10{{{DECREMENT COUNTER
{{BRN{GTS24{{{LOOP BACK FOR NEXT DIGIT
{{EJC{{{{
*
*      GTSTG (CONTINUED)
*
*      LOOP TO GENERATE DIGITS AFTER DECIMAL POINT
*
{GTS25{CVD{{{{CONVERT A DIGIT INTO WA
*
*      MERGE HERE FIRST TIME
*
{GTS26{SCH{R6{-(R9){{STORE DIGIT
{{DCV{R7{{{DECREMENT COUNTER
{{DCV{R10{{{DECREMENT COUNTER
{{BNZ{R10{GTS25{{LOOP BACK IF MORE TO GO
*
*      HERE GENERATE THE DECIMAL POINT
*
{GTS27{MOV{#CH$DT{R6{{LOAD DECIMAL POINT
{{SCH{R6{-(R9){{STORE IN WORK AREA
{{DCV{R7{{{DECREMENT COUNTER
*
*      HERE GENERATE THE DIGITS BEFORE THE DECIMAL POINT
*
{GTS28{CVD{{{{CONVERT A DIGIT INTO WA
{{SCH{R6{-(R9){{STORE IN WORK AREA
{{DCV{R7{{{DECREMENT COUNTER
{{INE{GTS28{{{LOOP BACK IF MORE TO GO
{{CSC{R9{{{COMPLETE STORE CHARACTERS
{{BRN{GTS08{{{ELSE JUMP BACK TO EXIT
*
*      EXIT POINT AFTER SUCCESSFUL CONVERSION
*
{GTS29{MOV{(SP)+{R10{{RESTORE XL
{{ICA{SP{{{POP ARGUMENT
{{MOV{GTSVB{R7{{RESTORE WB
{{MOV{GTSVC{R8{{RESTORE WC
*
*      MERGE HERE IF NO CONVERSION REQUIRED
*
{GTS30{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
{{EXI{{{{RETURN TO CALLER
*
*      HERE TO RETURN STRING FOR REAL ZERO
*
{GTS31{MOV{#SCRE0{R10{{POINT TO STRING
{{MOV{#NUM02{R6{{2 CHARS
{{ZER{R7{{{ZERO OFFSET
{{JSR{SBSTR{{{COPY STRING
{{BRN{GTS29{{{RETURN
{{EJC{{{{
*
*      HERE TO CONVERT A BUFFER BLOCK
*
{GTS32{MOV{R9{R10{{COPY ARG PTR
{{MOV{4*BCLEN(R10){R6{{GET SIZE TO ALLOCATE
{{BZE{R6{GTS33{{IF NULL THEN RETURN NULL
{{JSR{ALOCS{{{ALLOCATE STRING FRAME
{{MOV{R9{R7{{SAVE STRING PTR
{{MOV{4*SCLEN(R9){R6{{GET LENGTH TO MOVE
{{CTB{R6{0{{GET AS MULTIPLE OF WORD SIZE
{{MOV{4*BCBUF(R10){R10{{POINT TO BFBLK
{{ADD{#4*SCSI${R9{{POINT TO START OF CHARACTER AREA
{{ADD{#4*BFSI${R10{{POINT TO START OF BUFFER CHARS
{{MVW{{{{COPY WORDS
{{MOV{R7{R9{{RESTORE SCBLK PTR
{{BRN{GTS29{{{EXIT WITH SCBLK
*
*      HERE WHEN NULL BUFFER IS BEING CONVERTED
*
{GTS33{MOV{#NULLS{R9{{POINT TO NULL
{{BRN{GTS29{{{EXIT WITH NULL
{{ENP{{{{END PROCEDURE GTSTG
{{EJC{{{{
*
*      GTVAR -- GET VARIABLE FOR I/O/TRACE ASSOCIATION
*
*      GTVAR IS USED TO POINT TO AN ACTUAL VARIABLE LOCATION
*      FOR THE DETACH,INPUT,OUTPUT,TRACE,STOPTR SYSTEM FUNCTIONS
*
*      (XR)                  ARGUMENT TO FUNCTION
*      JSR  GTVAR            CALL TO LOCATE VARIABLE POINTER
*      PPM  LOC              TRANSFER LOC IF NOT OK VARIABLE
*      (XL,WA)               NAME BASE,OFFSET OF VARIABLE
*      (XR,RA)               DESTROYED
*      (WB,WC)               DESTROYED (CONVERT ERROR ONLY)
*      (XR)                  INPUT ARG (CONVERT ERROR ONLY)
*
{GTVAR{PRC{E{1{{ENTRY POINT
{{BNE{(R9){#B$NML{GTVR2{JUMP IF NOT A NAME
{{MOV{4*NMOFS(R9){R6{{ELSE LOAD NAME OFFSET
{{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
{{BEQ{(R10){#B$EVT{GTVR1{ERROR IF EXPRESSION VARIABLE
{{BNE{(R10){#B$KVT{GTVR3{ALL OK IF NOT KEYWORD VARIABLE
*
*      HERE ON CONVERSION ERROR
*
{GTVR1{EXI{1{{{TAKE CONVERT ERROR EXIT
*
*      HERE IF NOT A NAME, TRY CONVERT TO NATURAL VARIABLE
*
{GTVR2{MOV{R8{GTVRC{{SAVE WC
{{JSR{GTNVR{{{LOCATE VRBLK IF POSSIBLE
{{PPM{GTVR1{{{JUMP IF CONVERT ERROR
{{MOV{R9{R10{{ELSE COPY VRBLK NAME BASE
{{MOV{#4*VRVAL{R6{{AND SET OFFSET
{{MOV{GTVRC{R8{{RESTORE WC
*
*      HERE FOR NAME OBTAINED
*
{GTVR3{BHI{R10{STATE{GTVR4{ALL OK IF NOT NATURAL VARIABLE
{{BEQ{4*VRSTO(R10){#B$VRE{GTVR1{ERROR IF PROTECTED VARIABLE
*
*      COMMON EXIT POINT
*
{GTVR4{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE GTVAR
{{EJC{{{{
*
*      HASHS -- COMPUTE HASH INDEX FOR STRING
*
*      HASHS IS USED TO CONVERT A STRING TO A UNIQUE INTEGER
*      VALUE. THE RESULTING HASH VALUE IS A POSITIVE INTEGER
*      IN THE RANGE 0 TO CFP$M
*
*      (XR)                  STRING TO BE HASHED
*      JSR  HASHS            CALL TO HASH STRING
*      (IA)                  HASH VALUE
*      (XR,WB,WC)            DESTROYED
*
*      THE HASH FUNCTION USED IS AS FOLLOWS.
*
*      START WITH THE LENGTH OF THE STRING (SGD07)
*
*      TAKE THE FIRST E$HNW WORDS OF THE CHARACTERS FROM
*      THE STRING OR ALL THE WORDS IF FEWER THAN E$HNW.
*
*      COMPUTE THE EXCLUSIVE OR OF ALL THESE WORDS TREATING
*      THEM AS ONE WORD BIT STRING VALUES.
*
*      MOVE THE RESULT AS AN INTEGER WITH THE MTI INSTRUCTION.
*
{HASHS{PRC{E{0{{ENTRY POINT
{{MOV{4*SCLEN(R9){R8{{LOAD STRING LENGTH IN CHARACTERS
{{MOV{R8{R7{{INITIALIZE WITH LENGTH
{{BZE{R8{HSHS3{{JUMP IF NULL STRING
{{CTW{R8{0{{ELSE GET NUMBER OF WORDS OF CHARS
{{ADD{#4*SCHAR{R9{{POINT TO CHARACTERS OF STRING
{{BLO{R8{#E$HNW{HSHS1{USE WHOLE STRING IF SHORT
{{MOV{#E$HNW{R8{{ELSE SET TO INVOLVE FIRST E$HNW WDS
*
*      HERE WITH COUNT OF WORDS TO CHECK IN WC
*
{HSHS1{LCT{R8{R8{{SET COUNTER TO CONTROL LOOP
*
*      LOOP TO COMPUTE EXCLUSIVE OR
*
{HSHS2{XOB{(R9)+{R7{{EXCLUSIVE OR NEXT WORD OF CHARS
{{BCT{R8{HSHS2{{LOOP TILL ALL PROCESSED
*
*      MERGE HERE WITH EXCLUSIVE OR IN WB
*
{HSHS3{ZGB{R7{{{ZEROISE UNDEFINED BITS
{{ANB{BITSM{R7{{ENSURE IN RANGE 0 TO CFP$M
{{MTI{R7{{{MOVE RESULT AS INTEGER
{{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
{{EXI{{{{RETURN TO HASHS CALLER
{{ENP{{{{END PROCEDURE HASHS
{{EJC{{{{
*
*      ICBLD -- BUILD INTEGER BLOCK
*
*      (IA)                  INTEGER VALUE FOR ICBLK
*      JSR  ICBLD            CALL TO BUILD INTEGER BLOCK
*      (XR)                  POINTER TO RESULT ICBLK
*      (WA)                  DESTROYED
*
{ICBLD{PRC{E{0{{ENTRY POINT
{{MFI{R9{ICBL1{{COPY SMALL INTEGERS
{{BLE{R9{#NUM02{ICBL3{JUMP IF 0,1 OR 2
*
*      CONSTRUCT ICBLK
*
{ICBL1{MOV{DNAMP{R9{{LOAD POINTER TO NEXT AVAILABLE LOC
{{ADD{#4*ICSI${R9{{POINT PAST NEW ICBLK
{{BLO{R9{DNAME{ICBL2{JUMP IF THERE IS ROOM
{{MOV{#4*ICSI${R6{{ELSE LOAD LENGTH OF ICBLK
{{JSR{ALLOC{{{USE STANDARD ALLOCATOR TO GET BLOCK
{{ADD{R6{R9{{POINT PAST BLOCK TO MERGE
*
*      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
*
{ICBL2{MOV{R9{DNAMP{{SET NEW POINTER
{{SUB{#4*ICSI${R9{{POINT BACK TO START OF BLOCK
{{MOV{#B$ICL{(R9){{STORE TYPE WORD
{{STI{4*ICVAL(R9){{{STORE INTEGER VALUE IN ICBLK
{{EXI{{{{RETURN TO ICBLD CALLER
*
*      OPTIMISE BY NOT BUILDING ICBLKS FOR SMALL INTEGERS
*
{ICBL3{WTB{R9{{{CONVERT INTEGER TO OFFSET
{{MOV{L^INTAB(R9){R9{{POINT TO PRE-BUILT ICBLK
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE ICBLD
{{EJC{{{{
*
*      IDENT -- COMPARE TWO VALUES
*
*      IDENT COMPARES TWO VALUES IN THE SENSE OF THE IDENT
*      DIFFER FUNCTIONS AVAILABLE AT THE SNOBOL LEVEL.
*
*      (XR)                  FIRST ARGUMENT
*      (XL)                  SECOND ARGUMENT
*      JSR  IDENT            CALL TO COMPARE ARGUMENTS
*      PPM  LOC              TRANSFER LOC IF IDENT
*      (NORMAL RETURN IF DIFFER)
*      (XR,XL,WC,RA)         DESTROYED
*
{IDENT{PRC{E{1{{ENTRY POINT
{{BEQ{R9{R10{IDEN7{JUMP IF SAME POINTER (IDENT)
{{MOV{(R9){R8{{ELSE LOAD ARG 1 TYPE WORD
{{BNE{R8{(R10){IDEN1{DIFFER IF ARG 2 TYPE WORD DIFFER
{{BEQ{R8{#B$SCL{IDEN2{JUMP IF STRINGS
{{BEQ{R8{#B$ICL{IDEN4{JUMP IF INTEGERS
{{BEQ{R8{#B$RCL{IDEN5{JUMP IF REALS
{{BEQ{R8{#B$NML{IDEN6{JUMP IF NAMES
*
*      FOR ALL OTHER DATATYPES, MUST BE DIFFER IF XR NE XL
*
*      MERGE HERE FOR DIFFER
*
{IDEN1{EXI{{{{TAKE DIFFER EXIT
*
*      HERE FOR STRINGS, IDENT ONLY IF LENGTHS AND CHARS SAME
*
{IDEN2{MOV{4*SCLEN(R9){R8{{LOAD ARG 1 LENGTH
{{BNE{R8{4*SCLEN(R10){IDEN1{DIFFER IF LENGTHS DIFFER
{{CTW{R8{0{{GET NUMBER OF WORDS IN STRINGS
{{ADD{#4*SCHAR{R9{{POINT TO CHARS OF ARG 1
{{ADD{#4*SCHAR{R10{{POINT TO CHARS OF ARG 2
{{LCT{R8{R8{{SET LOOP COUNTER
*
*      LOOP TO COMPARE CHARACTERS. NOTE THAT WA CANNOT BE ZERO
*      SINCE ALL NULL STRINGS POINT TO NULLS AND GIVE XL=XR.
*
{IDEN3{CNE{(R9){(R10){IDEN8{DIFFER IF CHARS DO NOT MATCH
{{ICA{R9{{{ELSE BUMP ARG ONE POINTER
{{ICA{R10{{{BUMP ARG TWO POINTER
{{BCT{R8{IDEN3{{LOOP BACK TILL ALL CHECKED
{{EJC{{{{
*
*      IDENT (CONTINUED)
*
*      HERE TO EXIT FOR CASE OF TWO IDENT STRINGS
*
{{ZER{R10{{{CLEAR GARBAGE VALUE IN XL
{{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
{{EXI{1{{{TAKE IDENT EXIT
*
*      HERE FOR INTEGERS, IDENT IF SAME VALUES
*
{IDEN4{LDI{4*ICVAL(R9){{{LOAD ARG 1
{{SBI{4*ICVAL(R10){{{SUBTRACT ARG 2 TO COMPARE
{{IOV{IDEN1{{{DIFFER IF OVERFLOW
{{INE{IDEN1{{{DIFFER IF RESULT IS NOT ZERO
{{EXI{1{{{TAKE IDENT EXIT
*
*      HERE FOR REALS, IDENT IF SAME VALUES
*
{IDEN5{LDR{4*RCVAL(R9){{{LOAD ARG 1
{{SBR{4*RCVAL(R10){{{SUBTRACT ARG 2 TO COMPARE
{{ROV{IDEN1{{{DIFFER IF OVERFLOW
{{RNE{IDEN1{{{DIFFER IF RESULT IS NOT ZERO
{{EXI{1{{{TAKE IDENT EXIT
*
*      HERE FOR NAMES, IDENT IF BASES AND OFFSETS SAME
*
{IDEN6{BNE{4*NMOFS(R9){4*NMOFS(R10){IDEN1{DIFFER IF DIFFERENT OFFSET
{{BNE{4*NMBAS(R9){4*NMBAS(R10){IDEN1{DIFFER IF DIFFERENT BASE
*
*      MERGE HERE TO SIGNAL IDENT FOR IDENTICAL POINTERS
*
{IDEN7{EXI{1{{{TAKE IDENT EXIT
*
*      HERE FOR DIFFER STRINGS
*
{IDEN8{ZER{R9{{{CLEAR GARBAGE PTR IN XR
{{ZER{R10{{{CLEAR GARBAGE PTR IN XL
{{EXI{{{{RETURN TO CALLER (DIFFER)
{{ENP{{{{END PROCEDURE IDENT
{{EJC{{{{
*
*      INOUT - USED TO INITIALISE INPUT AND OUTPUT VARIABLES
*
*      (XL)                  POINTER TO VBL NAME STRING
*      (WB)                  TRBLK TYPE
*      JSR  INOUT            CALL TO PERFORM INITIALISATION
*      (XL)                  VRBLK PTR
*      (XR)                  TRBLK PTR
*      (WA,WC)               DESTROYED
*
*      NOTE THAT TRTER (= TRTRF) FIELD OF STANDARD I/O VARIABLES
*      POINTS TO CORRESPONDING SVBLK NOT TO A TRBLK AS IS THE
*      CASE FOR ORDINARY VARIABLES.
*
{INOUT{PRC{E{0{{ENTRY POINT
{{MOV{R7{-(SP){{STACK TRBLK TYPE
{{MOV{4*SCLEN(R10){R6{{GET NAME LENGTH
{{ZER{R7{{{POINT TO START OF NAME
{{JSR{SBSTR{{{BUILD A PROPER SCBLK
{{JSR{GTNVR{{{BUILD VRBLK
{{PPM{{{{NO ERROR RETURN
{{MOV{R9{R8{{SAVE VRBLK POINTER
{{MOV{(SP)+{R7{{GET TRTER FIELD
{{ZER{R10{{{ZERO TRFPT
{{JSR{TRBLD{{{BUILD TRBLK
{{MOV{R8{R10{{RECALL VRBLK POINTER
{{MOV{4*VRSVP(R10){4*TRTER(R9){{STORE SVBLK POINTER
{{MOV{R9{4*VRVAL(R10){{STORE TRBLK PTR IN VRBLK
{{MOV{#B$VRA{4*VRGET(R10){{SET TRAPPED ACCESS
{{MOV{#B$VRV{4*VRSTO(R10){{SET TRAPPED STORE
{{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE INOUT
{{EJC{{{{
*
*      INSBF -- INSERT STRING IN BUFFER
*
*      THIS ROUTINE WILL REPLACE A SECTION OF A BUFFER WITH THE
*      CONTENTS OF A GIVEN STRING.  IF THE LENGTH OF THE
*      SECTION TO BE REPLACED IS DIFFERENT THAN THE LENGTH OF
*      THE GIVEN STRING, AND THE REPLACEMENT IS NOT AN APPEND,
*      THEN THE UPPER SECTION OF THE BUFFER IS SHIFTED UP OR
*      DOWN TO CREATE THE PROPER SPACE FOR THE INSERT.
*
*      (XR)                  POINTER TO BFBLK
*      (XL)                  OBJECT WHICH IS STRING CONVERTABLE
*      (WA)                  OFFSET OF START OF INSERT IN (XR)
*      (WB)                  LENGTH OF SECTION IN (XR) REPLACED
*      JSR  INSBF            CALL TO INSERT CHARACTERS IN BUFFER
*      PPM  LOC              THREAD IF (XR) NOT CONVERTABLE
*      PPM  LOC              THREAD IF INSERT NOT POSSIBLE
*
*      THE SECOND ALTERNATE EXIT IS TAKEN IF THE INSERT WOULD
*      OVERFLOW THE BUFFER, OR IF THE INSERT IS OUT PAST THE
*      DEFINED END OF THE BUFFER AS GIVEN.
*
{INSBF{PRC{E{2{{ENTRY POINT
{{MOV{R6{INSSA{{SAVE ENTRY WA
{{MOV{R7{INSSB{{SAVE ENTRY WB
{{MOV{R8{INSSC{{SAVE ENTRY WC
{{ADD{R7{R6{{ADD TO GET OFFSET PAST REPLACE PART
{{MOV{R6{INSAB{{SAVE WA+WB
{{MOV{4*BCLEN(R9){R8{{GET CURRENT DEFINED LENGTH
{{BGT{INSSA{R8{INS07{FAIL IF START OFFSET TOO BIG
{{BGT{R6{R8{INS07{FAIL IF FINAL OFFSET TOO BIG
{{MOV{R10{-(SP){{SAVE ENTRY XL
{{MOV{R9{-(SP){{SAVE BCBLK PTR
{{MOV{R10{-(SP){{STACK AGAIN FOR GTSTG
{{JSR{GTSTG{{{CALL TO CONVERT TO STRING
{{PPM{INS05{{{TAKE STRING CONVERT ERR EXIT
{{MOV{R9{R10{{SAVE STRING PTR
{{MOV{(SP){R9{{RESTORE BCBLK PTR
{{ADD{R8{R6{{ADD BUFFER LEN TO STRING LEN
{{SUB{INSSB{R6{{BIAS OUT COMPONENT BEING REPLACED
{{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
{{BGT{R6{4*BFALC(R9){INS06{FAIL IF RESULT EXCEEDS ALLOCATION
{{MOV{(SP){R9{{RESTORE BCBLK PTR
{{MOV{R8{R6{{GET BUFFER LENGTH
{{SUB{INSAB{R6{{SUBTRACT TO GET SHIFT LENGTH
{{ADD{4*SCLEN(R10){R8{{ADD LENGTH OF NEW
{{SUB{INSSB{R8{{SUBTRACT OLD TO GET TOTAL NEW LEN
{{MOV{4*BCLEN(R9){R7{{GET OLD BCLEN
{{MOV{R8{4*BCLEN(R9){{STUFF NEW LENGTH
{{BZE{R6{INS04{{SKIP SHIFT IF NOTHING TO DO
{{BEQ{INSSB{4*SCLEN(R10){INS04{SKIP SHIFT IF LENGTHS MATCH
{{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
{{MOV{R10{-(SP){{SAVE SCBLK PTR
{{BLO{INSSB{4*SCLEN(R10){INS01{BRN IF SHFT IS FOR MORE ROOM
{{EJC{{{{
*
*      INSBF (CONTINUED)
*
*      WE ARE SHIFTING THE UPPER SEGMENT DOWN TO COMPACT
*      THE BUFFER.  (THE STRING LENGTH IS SMALLER THAN THE
*      SEGMENT BEING REPLACED.)  REGISTERS ARE SET AS:
*
*      (WA)                  MOVE (SHIFT DOWN) LENGTH
*      (WB)                  OLD BCLEN
*      (WC)                  NEW BCLEN
*      (XR)                  BFBLK PTR
*      (XL),(XS)             SCBLK PTR
*
{{MOV{INSSA{R7{{GET OFFSET TO INSERT
{{ADD{4*SCLEN(R10){R7{{ADD INSERT LENGTH TO GET DEST OFF
{{MOV{R9{R10{{MAKE COPY
{{PLC{R10{INSAB{{PREPARE SOURCE FOR MOVE
{{PSC{R9{R7{{PREPARE DESTINATION REG FOR MOVE
{{MVC{{{{MOVE EM OUT
{{BRN{INS02{{{BRANCH TO PAD
*
*      WE ARE SHIFTING THE UPPER SEGMENT UP TO EXPAND
*      THE BUFFER.  (THE STRING LENGTH IS LARGER THAN THE
*      SEGMENT BEING REPLACED.)
*
{INS01{MOV{R9{R10{{COPY BFBLK PTR
{{PLC{R10{R7{{SET SOURCE REG FOR MOVE BACKWARDS
{{PSC{R9{R8{{SET DESTINATION PTR FOR MOVE
{{MCB{{{{MOVE BACKWARDS (POSSIBLE OVERLAP)
*
*      MERGE HERE AFTER MOVE TO ADJUST PADDING AT NEW BUFFER END
*
{INS02{MOV{(SP)+{R10{{RESTORE SCBLK PTR
{{MOV{R8{R6{{COPY NEW BUFFER END
{{CTB{R6{0{{ROUND OUT
{{SUB{R8{R6{{SUBTRACT TO GET REMAINDER
{{BZE{R6{INS04{{NO PAD IF ALREADY EVEN BOUNDARY
{{MOV{(SP){R9{{GET BCBLK PTR
{{MOV{4*BCBUF(R9){R9{{GET BFBLK PTR
{{PSC{R9{R8{{PREPARE TO PAD
{{ZER{R7{{{CLEAR WB
{{LCT{R6{R6{{LOAD LOOP COUNT
*
*      LOOP HERE TO STUFF PAD CHARACTERS
*
{INS03{SCH{R7{(R9)+{{STUFF ZERO PAD
{{BCT{R6{INS03{{BRANCH FOR MORE
{{EJC{{{{
*
*      INSBF (CONTINUED)
*
*      MERGE HERE WHEN PADDING OK.  NOW COPY IN THE INSERT
*      STRING TO THE HOLE.
*
{INS04{MOV{(SP){R9{{GET BCBLK PTR
{{MOV{4*BCBUF(R9){R9{{GET BFBLK PTR
{{MOV{4*SCLEN(R10){R6{{GET MOVE LENGTH
{{PLC{R10{{{PREPARE TO COPY FROM FIRST CHAR
{{PSC{R9{INSSA{{PREPARE TO STORE IN HOLE
{{MVC{{{{COPY THE CHARACTERS
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{MOV{INSSA{R6{{RESTORE ENTRY WA
{{MOV{INSSB{R7{{RESTORE ENTRY WB
{{MOV{INSSC{R8{{RESTORE ENTRY WC
{{EXI{{{{RETURN TO CALLER
*
*      HERE TO TAKE STRING CONVERT ERROR EXIT
*
{INS05{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{MOV{INSSA{R6{{RESTORE ENTRY WA
{{MOV{INSSB{R7{{RESTORE ENTRY WB
{{MOV{INSSC{R8{{RESTORE ENTRY WC
{{EXI{1{{{ALTERNATE EXIT
*
*      HERE FOR INVALID OFFSET OR LENGTH
*
{INS06{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
*
*      MERGE FOR LENGTH FAILURE EXIT WITH STACK SET
*
{INS07{MOV{INSSA{R6{{RESTORE ENTRY WA
{{MOV{INSSB{R7{{RESTORE ENTRY WB
{{MOV{INSSC{R8{{RESTORE ENTRY WC
{{EXI{2{{{ALTERNATE EXIT
{{ENP{{{{END PROCEDURE INSBF
{{EJC{{{{
*
*      IOFCB -- GET INPUT/OUTPUT FCBLK POINTER
*
*      USED BY ENDFILE, EJECT AND REWIND TO FIND THE FCBLK
*      (IF ANY) CORRESPONDING TO THEIR ARGUMENT.
*
*      -(XS)                 ARGUMENT
*      JSR  IOFCB            CALL TO FIND FCBLK
*      PPM  LOC              ARG IS AN UNSUITABLE NAME
*      PPM  LOC              ARG IS NULL STRING
*      (XS)                  POPPED
*      (XL)                  PTR TO FILEARG1 VRBLK
*      (XR)                  ARGUMENT
*      (WA)                  FCBLK PTR OR 0
*      (WB)                  DESTROYED
*
{IOFCB{PRC{N{2{{ENTRY POINT
{{JSR{GTSTG{{{GET ARG AS STRING
{{PPM{IOFC2{{{FAIL
{{MOV{R9{R10{{COPY STRING PTR
{{JSR{GTNVR{{{GET AS NATURAL VARIABLE
{{PPM{IOFC3{{{FAIL IF NULL
{{MOV{R10{R7{{COPY STRING POINTER AGAIN
{{MOV{R9{R10{{COPY VRBLK PTR FOR RETURN
{{ZER{R6{{{IN CASE NO TRBLK FOUND
*
*      LOOP TO FIND FILE ARG1 TRBLK
*
{IOFC1{MOV{4*VRVAL(R9){R9{{GET POSSIBLE TRBLK PTR
{{BNE{(R9){#B$TRT{IOFC2{FAIL IF END OF CHAIN
{{BNE{4*TRTYP(R9){#TRTFC{IOFC1{LOOP IF NOT FILE ARG TRBLK
{{MOV{4*TRFPT(R9){R6{{GET FCBLK PTR
{{MOV{R7{R9{{COPY ARG
{{EXI{{{{RETURN
*
*      FAIL RETURN
*
{IOFC2{EXI{1{{{FAIL
*
*      NULL ARG
*
{IOFC3{EXI{2{{{NULL ARG RETURN
{{ENP{{{{END PROCEDURE IOFCB
{{EJC{{{{
*
*      IOPPF -- PROCESS FILEARG2 FOR IOPUT
*
*      (R$XSC)               FILEARG2 PTR
*      JSR  IOPPF            CALL TO PROCESS FILEARG2
*      (XL)                  FILEARG1 PTR
*      (XR)                  FILE ARG2 PTR
*      -(XS)..-(XS)          FIELDS EXTRACTED FROM FILEARG2
*      (WC)                  NO. OF FIELDS EXTRACTED
*      (WB)                  INPUT/OUTPUT FLAG
*      (WA)                  FCBLK PTR OR 0
*
{IOPPF{PRC{N{0{{ENTRY POINT
{{ZER{R7{{{TO COUNT FIELDS EXTRACTED
*
*      LOOP TO EXTRACT FIELDS
*
{IOPP1{MOV{#IODEL{R10{{GET DELIMITER
{{MOV{R10{R8{{COPY IT
{{JSR{XSCAN{{{GET NEXT FIELD
{{MOV{R9{-(SP){{STACK IT
{{ICV{R7{{{INCREMENT COUNT
{{BNZ{R6{IOPP1{{LOOP
{{MOV{R7{R8{{COUNT OF FIELDS
{{MOV{IOPTT{R7{{I/O MARKER
{{MOV{R$IOF{R6{{FCBLK PTR OR 0
{{MOV{R$IO2{R9{{FILE ARG2 PTR
{{MOV{R$IO1{R10{{FILEARG1
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE IOPPF
{{EJC{{{{
*
*      IOPUT -- ROUTINE USED BY INPUT AND OUTPUT
*
*      IOPUT SETS UP INPUT/OUTPUT  ASSOCIATIONS. IT BUILDS
*      SUCH TRACE AND FILE CONTROL BLOCKS AS ARE NECESSARY AND
*      CALLS SYSFC,SYSIO TO PERFORM CHECKS ON THE
*      ARGUMENTS AND TO OPEN THE FILES.
*
*         +-----------+   +---------------+       +-----------+
*      +-.I           I   I               I------.I   =B$XRT  I
*      I  +-----------+   +---------------+       +-----------+
*      I  /           /        (R$FCB)            I    *4     I
*      I  /           /                           +-----------+
*      I  +-----------+   +---------------+       I           I-
*      I  I   NAME    +--.I    =B$TRT     I       +-----------+
*      I  /           /   +---------------+       I           I
*      I   (FIRST ARG)    I =TRTIN/=TRTOU I       +-----------+
*      I                  +---------------+             I
*      I                  I     VALUE     I             I
*      I                  +---------------+             I
*      I                  I(TRTRF) 0   OR I--+          I
*      I                  +---------------+  I          I
*      I                  I(TRFPT) 0   OR I----+        I
*      I                  +---------------+  I I        I
*      I                     (I/O TRBLK)     I I        I
*      I  +-----------+                      I I        I
*      I  I           I                      I I        I
*      I  +-----------+                      I I        I
*      I  I           I                      I I        I
*      I  +-----------+   +---------------+  I I        I
*      I  I           +--.I    =B$TRT     I.-+ I        I
*      I  +-----------+   +---------------+    I        I
*      I  /           /   I    =TRTFC     I    I        I
*      I  /           /   +---------------+    I        I
*      I    (FILEARG1     I     VALUE     I    I        I
*      I         VRBLK)   +---------------+    I        I
*      I                  I(TRTRF) 0   OR I--+ I        .
*      I                  +---------------+  I .  +-----------+
*      I                  I(TRFPT) 0   OR I------./   FCBLK   /
*      I                  +---------------+  I    +-----------+
*      I                       (TRTRF)       I
*      I                                     I
*      I                                     I
*      I                  +---------------+  I
*      I                  I    =B$XRT     I.-+
*      I                  +---------------+
*      I                  I      *5       I
*      I                  +---------------+
*      +------------------I               I
*                         +---------------+       +-----------+
*                         I(TRTRF) O   OR I------.I  =B$XRT   I
*                         +---------------+       +-----------+
*                         I  NAME OFFSET  I       I    ETC    I
*                         +---------------+
*                           (IOCHN - CHAIN OF NAME POINTERS)
{{EJC{{{{
*
*      IOPUT (CONTINUED)
*
*      NO ADDITIONAL TRAP BLOCKS ARE USED FOR STANDARD INPUT/OUT
*      FILES. OTHERWISE AN I/O TRAP BLOCK IS ATTACHED TO SECOND
*      ARG (FILEARG1) VRBLK. SEE DIAGRAM ABOVE FOR DETAILS OF
*      THE STRUCTURE BUILT.
*
*      -(XS)                 1ST ARG (VBL TO BE ASSOCIATED)
*      -(XS)                 2ND ARG (FILE ARG1)
*      -(XS)                 3RD ARG (FILE ARG2)
*      (WB)                  0 FOR INPUT, 3 FOR OUTPUT ASSOC.
*      JSR  IOPUT            CALL FOR INPUT/OUTPUT ASSOCIATION
*      PPM  LOC              3RD ARG NOT A STRING
*      PPM  LOC              2ND ARG NOT A SUITABLE NAME
*      PPM  LOC              1ST ARG NOT A SUITABLE NAME
*      PPM  LOC              INAPPROPRIATE FILE SPEC FOR I/O
*      PPM  LOC              I/O FILE DOES NOT EXIST
*      PPM  LOC              I/O FILE CANNOT BE READ/WRITTEN
*      (XS)                  POPPED
*      (XL,XR,WA,WB,WC)      DESTROYED
*
{IOPUT{PRC{N{6{{ENTRY POINT
{{ZER{R$IOT{{{IN CASE NO TRTRF BLOCK USED
{{ZER{R$IOF{{{IN CASE NO FCBLK ALOCATED
{{MOV{R7{IOPTT{{STORE I/O TRACE TYPE
{{JSR{XSCNI{{{PREPARE TO SCAN FILEARG2
{{PPM{IOP13{{{FAIL
{{PPM{IOPA0{{{NULL FILE ARG2
*
{IOPA0{MOV{R9{R$IO2{{KEEP FILE ARG2
{{MOV{R6{R10{{COPY LENGTH
{{JSR{GTSTG{{{CONVERT FILEARG1 TO STRING
{{PPM{IOP14{{{FAIL
{{MOV{R9{R$IO1{{KEEP FILEARG1 PTR
{{JSR{GTNVR{{{CONVERT TO NATURAL VARIABLE
{{PPM{IOP00{{{JUMP IF NULL
{{BRN{IOP04{{{JUMP TO PROCESS NON-NULL ARGS
*
*      NULL FILEARG1
*
{IOP00{BZE{R10{IOP01{{SKIP IF BOTH ARGS NULL
{{JSR{IOPPF{{{PROCESS FILEARG2
{{JSR{SYSFC{{{CALL FOR FILEARG2 CHECK
{{PPM{IOP16{{{FAIL
{{BRN{IOP11{{{COMPLETE FILE ASSOCIATION
{{EJC{{{{
*
*      IOPUT (CONTINUED)
*
*      HERE WITH 0 OR FCBLK PTR IN (XL)
*
{IOP01{MOV{IOPTT{R7{{GET TRACE TYPE
{{MOV{R$IOT{R9{{GET 0 OR TRTRF PTR
{{JSR{TRBLD{{{BUILD TRBLK
{{MOV{R9{R8{{COPY TRBLK POINTER
{{MOV{(SP)+{R9{{GET VARIABLE FROM STACK
{{JSR{GTVAR{{{POINT TO VARIABLE
{{PPM{IOP15{{{FAIL
{{MOV{R10{R$ION{{SAVE NAME POINTER
{{MOV{R10{R9{{COPY NAME POINTER
{{ADD{R6{R9{{POINT TO VARIABLE
{{SUB{#4*VRVAL{R9{{SUBTRACT OFFSET,MERGE INTO LOOP
*
*      LOOP TO END OF TRBLK CHAIN IF ANY
*
{IOP02{MOV{R9{R10{{COPY BLK PTR
{{MOV{4*VRVAL(R9){R9{{LOAD PTR TO NEXT TRBLK
{{BNE{(R9){#B$TRT{IOP03{JUMP IF NOT TRAPPED
{{BNE{4*TRTYP(R9){IOPTT{IOP02{LOOP IF NOT SAME ASSOCN
{{MOV{4*TRNXT(R9){R9{{GET VALUE AND DELETE OLD TRBLK
*
*      IOPUT (CONTINUED)
*
*      STORE NEW ASSOCIATION
*
{IOP03{MOV{R8{4*VRVAL(R10){{LINK TO THIS TRBLK
{{MOV{R8{R10{{COPY POINTER
{{MOV{R9{4*TRNXT(R10){{STORE VALUE IN TRBLK
{{MOV{R$ION{R9{{RESTORE POSSIBLE VRBLK POINTER
{{MOV{R6{R7{{KEEP OFFSET TO NAME
{{JSR{SETVR{{{IF VRBLK, SET VRGET,VRSTO
{{MOV{R$IOT{R9{{GET 0 OR TRTRF PTR
{{BNZ{R9{IOP19{{JUMP IF TRTRF BLOCK EXISTS
{{EXI{{{{RETURN TO CALLER
*
*      NON STANDARD FILE
*      SEE IF AN FCBLK HAS ALREADY BEEN ALLOCATED.
*
{IOP04{ZER{R6{{{IN CASE NO FCBLK FOUND
{{EJC{{{{
*
*      IOPUT (CONTINUED)
*
*      SEARCH POSSIBLE TRBLK CHAIN TO PICK UP THE FCBLK
*
{IOP05{MOV{R9{R7{{REMEMBER BLK PTR
{{MOV{4*VRVAL(R9){R9{{CHAIN ALONG
{{BNE{(R9){#B$TRT{IOP06{JUMP IF END OF TRBLK CHAIN
{{BNE{4*TRTYP(R9){#TRTFC{IOP05{LOOP IF MORE TO GO
{{MOV{R9{R$IOT{{POINT TO FILE ARG1 TRBLK
{{MOV{4*TRFPT(R9){R6{{GET FCBLK PTR FROM TRBLK
*
*      WA = 0 OR FCBLK PTR
*      WB = PTR TO PRECEDING BLK TO WHICH ANY TRTRF BLOCK
*           FOR FILE ARG1 MUST BE CHAINED.
*
{IOP06{MOV{R6{R$IOF{{KEEP POSSIBLE FCBLK PTR
{{MOV{R7{R$IOP{{KEEP PRECEDING BLK PTR
{{JSR{IOPPF{{{PROCESS FILEARG2
{{JSR{SYSFC{{{SEE IF FCBLK REQUIRED
{{PPM{IOP16{{{FAIL
{{BZE{R6{IOP12{{SKIP IF NO NEW FCBLK WANTED
{{BLT{R8{#NUM02{IOP6A{JUMP IF FCBLK IN DYNAMIC
{{JSR{ALOST{{{GET IT IN STATIC
{{BRN{IOP6B{{{SKIP
*
*      OBTAIN FCBLK IN DYNAMIC
*
{IOP6A{JSR{ALLOC{{{GET SPACE FOR FCBLK
*
*      MERGE
*
{IOP6B{MOV{R9{R10{{POINT TO FCBLK
{{MOV{R6{R7{{COPY ITS LENGTH
{{BTW{R7{{{GET COUNT AS WORDS (SGD APR80)
{{LCT{R7{R7{{LOOP COUNTER
*
*      CLEAR FCBLK
*
{IOP07{ZER{(R9)+{{{CLEAR A WORD
{{BCT{R7{IOP07{{LOOP
{{BEQ{R8{#NUM02{IOP09{SKIP IF IN STATIC - DONT SET FIELDS
{{MOV{#B$XNT{(R10){{STORE XNBLK CODE IN CASE
{{MOV{R6{4*1(R10){{STORE LENGTH
{{BNZ{R8{IOP09{{JUMP IF XNBLK WANTED
{{MOV{#B$XRT{(R10){{XRBLK CODE REQUESTED
*
{{EJC{{{{
*      IOPUT (CONTINUED)
*
*      COMPLETE FCBLK INITIALISATION
*
{IOP09{MOV{R$IOT{R9{{GET POSSIBLE TRBLK PTR
{{MOV{R10{R$IOF{{STORE FCBLK PTR
{{BNZ{R9{IOP10{{JUMP IF TRBLK ALREADY FOUND
*
*      A NEW TRBLK IS NEEDED
*
{{MOV{#TRTFC{R7{{TRTYP FOR FCBLK TRAP BLK
{{JSR{TRBLD{{{MAKE THE BLOCK
{{MOV{R9{R$IOT{{COPY TRTRF PTR
{{MOV{R$IOP{R10{{POINT TO PRECEDING BLK
{{MOV{4*VRVAL(R10){4*VRVAL(R9){{COPY VALUE FIELD TO TRBLK
{{MOV{R9{4*VRVAL(R10){{LINK NEW TRBLK INTO CHAIN
{{MOV{R10{R9{{POINT TO PREDECESSOR BLK
{{JSR{SETVR{{{SET TRACE INTERCEPTS
{{MOV{4*VRVAL(R9){R9{{RECOVER TRBLK PTR
*
*      XR IS PTR TO TRBLK, XL IS FCBLK PTR OR 0
*
{IOP10{MOV{R$IOF{4*TRFPT(R9){{STORE FCBLK PTR
*
*      CALL SYSIO TO COMPLETE FILE ACCESSING
*
{IOP11{MOV{R$IOF{R6{{COPY FCBLK PTR OR 0
{{MOV{IOPTT{R7{{GET INPUT/OUTPUT FLAG
{{MOV{R$IO2{R9{{GET FILE ARG2
{{MOV{R$IO1{R10{{GET FILE ARG1
{{JSR{SYSIO{{{ASSOCIATE TO THE FILE
{{PPM{IOP17{{{FAIL
{{PPM{IOP18{{{FAIL
{{BNZ{R$IOT{IOP01{{NOT STD INPUT IF NON-NULL TRTRF BLK
{{BNZ{IOPTT{IOP01{{JUMP IF OUTPUT
{{BZE{R8{IOP01{{NO CHANGE TO STANDARD READ LENGTH
{{MOV{R8{CSWIN{{STORE NEW READ LENGTH FOR STD FILE
{{BRN{IOP01{{{MERGE TO FINISH THE TASK
*
*      SYSFC MAY HAVE RETURNED A POINTER TO A PRIVATE FCBLK
*
{IOP12{BNZ{R10{IOP09{{JUMP IF PRIVATE FCBLK
{{BRN{IOP11{{{FINISH THE ASSOCIATION
*
*      FAILURE RETURNS
*
{IOP13{EXI{1{{{3RD ARG NOT A STRING
{IOP14{EXI{2{{{2ND ARG UNSUITABLE
{IOP15{EXI{3{{{1ST ARG UNSUITABLE
{IOP16{EXI{4{{{FILE SPEC WRONG
{IOP17{EXI{5{{{I/O FILE DOES NOT EXIST
{IOP18{EXI{6{{{I/O FILE CANNOT BE READ/WRITTEN
{{EJC{{{{
*
*      IOPUT (CONTINUED)
*
*      ADD TO IOCHN CHAIN OF ASSSOCIATED VARIABLES UNLESS ALREAD
*      PRESENT.
*
{IOP19{MOV{R$ION{R8{{WC = NAME BASE, WB = NAME OFFSET
*
*      SEARCH LOOP
*
{IOP20{MOV{4*TRTRF(R9){R9{{NEXT LINK OF CHAIN
{{BZE{R9{IOP21{{NOT FOUND
{{BNE{R8{4*IONMB(R9){IOP20{NO MATCH
{{BEQ{R7{4*IONMO(R9){IOP22{EXIT IF MATCHED
{{BRN{IOP20{{{LOOP
*
*      NOT FOUND
*
{IOP21{MOV{#4*NUM05{R6{{SPACE NEEDED
{{JSR{ALLOC{{{GET IT
{{MOV{#B$XRT{(R9){{STORE XRBLK CODE
{{MOV{R6{4*1(R9){{STORE LENGTH
{{MOV{R8{4*IONMB(R9){{STORE NAME BASE
{{MOV{R7{4*IONMO(R9){{STORE NAME OFFSET
{{MOV{R$IOT{R10{{POINT TO TRTRF BLK
{{MOV{4*TRTRF(R10){R6{{GET PTR FIELD CONTENTS
{{MOV{R9{4*TRTRF(R10){{STORE PTR TO NEW BLOCK
{{MOV{R6{4*TRTRF(R9){{COMPLETE THE LINKING
*
*      INSERT FCBLK ON FCBLK CHAIN FOR SYSEJ, SYSXI
*
{IOP22{BZE{R$IOF{IOP25{{SKIP IF NO FCBLK
{{MOV{R$FCB{R10{{PTR TO HEAD OF EXISTING CHAIN
*
*      SEE IF FCBLK ALREADY ON CHAIN
*
{IOP23{BZE{R10{IOP24{{NOT ON IF END OF CHAIN
{{BEQ{4*3(R10){R$IOF{IOP25{DONT DUPLICATE IF FIND IT
{{MOV{4*2(R10){R10{{GET NEXT LINK
{{BRN{IOP23{{{LOOP
*
*      NOT FOUND SO ADD AN ENTRY FOR THIS FCBLK
*
{IOP24{MOV{#4*NUM04{R6{{SPACE NEEDED
{{JSR{ALLOC{{{GET IT
{{MOV{#B$XRT{(R9){{STORE BLOCK CODE
{{MOV{R6{4*1(R9){{STORE LENGTH
{{MOV{R$FCB{4*2(R9){{STORE PREVIOUS LINK IN THIS NODE
{{MOV{R$IOF{4*3(R9){{STORE FCBLK PTR
{{MOV{R9{R$FCB{{INSERT NODE INTO FCBLK CHAIN
*
*      RETURN
*
{IOP25{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE IOPUT
{{EJC{{{{
*
*      KTREX -- EXECUTE KEYWORD TRACE
*
*      KTREX IS USED TO EXECUTE A POSSIBLE KEYWORD TRACE. IT
*      INCLUDES THE TEST ON TRACE AND TESTS FOR TRACE ACTIVE.
*
*      (XL)                  PTR TO TRBLK (OR 0 IF UNTRACED)
*      JSR  KTREX            CALL TO EXECUTE KEYWORD TRACE
*      (XL,WA,WB,WC)         DESTROYED
*      (RA)                  DESTROYED
*
{KTREX{PRC{R{0{{ENTRY POINT (RECURSIVE)
{{BZE{R10{KTRX3{{IMMEDIATE EXIT IF KEYWORD UNTRACED
{{BZE{KVTRA{KTRX3{{IMMEDIATE EXIT IF TRACE = 0
{{DCV{KVTRA{{{ELSE DECREMENT TRACE
{{MOV{R9{-(SP){{SAVE XR
{{MOV{R10{R9{{COPY TRBLK POINTER
{{MOV{4*TRKVR(R9){R10{{LOAD VRBLK POINTER (NMBAS)
{{MOV{#4*VRVAL{R6{{SET NAME OFFSET
{{BZE{4*TRFNC(R9){KTRX1{{JUMP IF PRINT TRACE
{{JSR{TRXEQ{{{ELSE EXECUTE FULL TRACE
{{BRN{KTRX2{{{AND JUMP TO EXIT
*
*      HERE FOR PRINT TRACE
*
{KTRX1{MOV{R10{-(SP){{STACK VRBLK PTR FOR KWNAM
{{MOV{R6{-(SP){{STACK OFFSET FOR KWNAM
{{JSR{PRTSN{{{PRINT STATEMENT NUMBER
{{MOV{#CH$AM{R6{{LOAD AMPERSAND
{{JSR{PRTCH{{{PRINT AMPERSAND
{{JSR{PRTNM{{{PRINT KEYWORD NAME
{{MOV{#TMBEB{R9{{POINT TO BLANK-EQUAL-BLANK
{{JSR{PRTST{{{PRINT BLANK-EQUAL-BLANK
{{JSR{KWNAM{{{GET KEYWORD PSEUDO-VARIABLE NAME
{{MOV{R9{DNAMP{{RESET PTR TO DELETE KVBLK
{{JSR{ACESS{{{GET KEYWORD VALUE
{{PPM{{{{FAILURE IS IMPOSSIBLE
{{JSR{PRTVL{{{PRINT KEYWORD VALUE
{{JSR{PRTNL{{{TERMINATE PRINT LINE
*
*      HERE TO EXIT AFTER COMPLETING TRACE
*
{KTRX2{MOV{(SP)+{R9{{RESTORE ENTRY XR
*
*      MERGE HERE TO EXIT IF NO TRACE REQUIRED
*
{KTRX3{EXI{{{{RETURN TO KTREX CALLER
{{ENP{{{{END PROCEDURE KTREX
{{EJC{{{{
*
*      KWNAM -- GET PSEUDO-VARIABLE NAME FOR KEYWORD
*
*      1(XS)                 NAME BASE FOR VRBLK
*      0(XS)                 OFFSET (SHOULD BE *VRVAL)
*      JSR  KWNAM            CALL TO GET PSEUDO-VARIABLE NAME
*      (XS)                  POPPED TWICE
*      (XL,WA)               RESULTING PSEUDO-VARIABLE NAME
*      (XR,WA,WB)            DESTROYED
*
{KWNAM{PRC{N{0{{ENTRY POINT
{{ICA{SP{{{IGNORE NAME OFFSET
{{MOV{(SP)+{R9{{LOAD NAME BASE
{{BGE{R9{STATE{KWNM1{JUMP IF NOT NATURAL VARIABLE NAME
{{BNZ{4*VRLEN(R9){KWNM1{{ERROR IF NOT SYSTEM VARIABLE
{{MOV{4*VRSVP(R9){R9{{ELSE POINT TO SVBLK
{{MOV{4*SVBIT(R9){R6{{LOAD BIT MASK
{{ANB{BTKNM{R6{{AND WITH KEYWORD BIT
{{ZRB{R6{KWNM1{{ERROR IF NO KEYWORD ASSOCIATION
{{MOV{4*SVLEN(R9){R6{{ELSE LOAD NAME LENGTH IN CHARACTERS
{{CTB{R6{SVCHS{{COMPUTE OFFSET TO FIELD WE WANT
{{ADD{R6{R9{{POINT TO SVKNM FIELD
{{MOV{(R9){R7{{LOAD SVKNM VALUE
{{MOV{#4*KVSI${R6{{SET SIZE OF KVBLK
{{JSR{ALLOC{{{ALLOCATE KVBLK
{{MOV{#B$KVT{(R9){{STORE TYPE WORD
{{MOV{R7{4*KVNUM(R9){{STORE KEYWORD NUMBER
{{MOV{#TRBKV{4*KVVAR(R9){{SET DUMMY TRBLK POINTER
{{MOV{R9{R10{{COPY KVBLK POINTER
{{MOV{#4*KVVAR{R6{{SET PROPER OFFSET
{{EXI{{{{RETURN TO KVNAM CALLER
*
*      HERE IF NOT KEYWORD NAME
*
{KWNM1{ERB{251{KEYWORD{{OPERAND IS NOT NAME OF DEFINED KEYWORD
{{ENP{{{{END PROCEDURE KWNAM
{{EJC{{{{
*
*      LCOMP-- COMPARE TWO STRINGS LEXICALLY
*
*      1(XS)                 FIRST ARGUMENT
*      0(XS)                 SECOND ARGUMENT
*      JSR  LCOMP            CALL TO COMPARE ARUMENTS
*      PPM  LOC              TRANSFER LOC FOR ARG1 NOT STRING
*      PPM  LOC              TRANSFER LOC FOR ARG2 NOT STRING
*      PPM  LOC              TRANSFER LOC IF ARG1 LLT ARG2
*      PPM  LOC              TRANSFER LOC IF ARG1 LEQ ARG2
*      PPM  LOC              TRANSFER LOC IF ARG1 LGT ARG2
*      (THE NORMAL RETURN IS NEVER TAKEN)
*      (XS)                  POPPED TWICE
*      (XR,XL)               DESTROYED
*      (WA,WB,WC,RA)         DESTROYED
*
{LCOMP{PRC{N{5{{ENTRY POINT
{{JSR{GTSTG{{{CONVERT SECOND ARG TO STRING
{{PPM{LCMP6{{{JUMP IF SECOND ARG NOT STRING
{{MOV{R9{R10{{ELSE SAVE POINTER
{{MOV{R6{R7{{AND LENGTH
{{JSR{GTSTG{{{CONVERT FIRST ARGUMENT TO STRING
{{PPM{LCMP5{{{JUMP IF NOT STRING
{{MOV{R6{R8{{SAVE ARG 1 LENGTH
{{PLC{R9{{{POINT TO CHARS OF ARG 1
{{PLC{R10{{{POINT TO CHARS OF ARG 2
{{BLO{R6{R7{LCMP1{JUMP IF ARG 1 LENGTH IS SMALLER
{{MOV{R7{R6{{ELSE SET ARG 2 LENGTH AS SMALLER
*
*      HERE WITH SMALLER LENGTH IN (WA)
*
{LCMP1{CMC{LCMP4{LCMP3{{COMPARE STRINGS, JUMP IF UNEQUAL
{{BNE{R7{R8{LCMP2{IF EQUAL, JUMP IF LENGTHS UNEQUAL
{{EXI{4{{{ELSE IDENTICAL STRINGS, LEQ EXIT
{{EJC{{{{
*
*      LCOMP (CONTINUED)
*
*      HERE IF INITIAL STRINGS IDENTICAL, BUT LENGTHS UNEQUAL
*
{LCMP2{BHI{R8{R7{LCMP4{JUMP IF ARG 1 LENGTH GT ARG 2 LENG
*
*      HERE IF FIRST ARG LLT SECOND ARG
*
{LCMP3{EXI{3{{{TAKE LLT EXIT
*
*      HERE IF FIRST ARG LGT SECOND ARG
*
{LCMP4{EXI{5{{{TAKE LGT EXIT
*
*      HERE IF FIRST ARG IS NOT A STRING
*
{LCMP5{EXI{1{{{TAKE BAD FIRST ARG EXIT
*
*      HERE FOR SECOND ARG NOT A STRING
*
{LCMP6{EXI{2{{{TAKE BAD SECOND ARG ERROR EXIT
{{ENP{{{{END PROCEDURE LCOMP
{{EJC{{{{
*
*      LISTR -- LIST SOURCE LINE
*
*      LISTR IS USED TO LIST A SOURCE LINE DURING THE INITIAL
*      COMPILATION. IT IS CALLED FROM SCANE AND SCANL.
*
*      JSR  LISTR            CALL TO LIST LINE
*      (XR,XL,WA,WB,WC)      DESTROYED
*
*      GLOBAL LOCATIONS USED BY LISTR
*
*      ERLST                 IF LISTING ON ACCOUNT OF AN ERROR
*
*      LSTLC                 COUNT LINES ON CURRENT PAGE
*
*      LSTNP                 MAX NUMBER OF LINES/PAGE
*
*      LSTPF                 SET NON-ZERO IF THE CURRENT SOURCE
*                            LINE HAS BEEN LISTED, ELSE ZERO.
*
*      LSTPG                 COMPILER LISTING PAGE NUMBER
*
*      LSTSN                 SET IF STMNT NUM TO BE LISTED
*
*      R$CIM                 POINTER TO CURRENT INPUT LINE.
*
*      R$TTL                 TITLE FOR SOURCE LISTING
*
*      R$STL                 PTR TO SUB-TITLE STRING
*
*      ENTRY POINT
*
{LISTR{PRC{E{0{{ENTRY POINT
{{BNZ{CNTTL{LIST5{{JUMP IF -TITLE OR -STITL
{{BNZ{LSTPF{LIST4{{IMMEDIATE EXIT IF ALREADY LISTED
{{BGE{LSTLC{LSTNP{LIST6{JUMP IF NO ROOM
*
*      HERE AFTER PRINTING TITLE (IF NEEDED)
*
{LIST0{MOV{R$CIM{R9{{LOAD POINTER TO CURRENT IMAGE
{{PLC{R9{{{POINT TO CHARACTERS
{{LCH{R6{(R9){{LOAD FIRST CHARACTER
{{MOV{LSTSN{R9{{LOAD STATEMENT NUMBER
{{BZE{R9{LIST2{{JUMP IF NO STATEMENT NUMBER
{{MTI{R9{{{ELSE GET STMNT NUMBER AS INTEGER
{{BNE{STAGE{#STGIC{LIST1{SKIP IF EXECUTE TIME
{{BEQ{R6{#CH$AS{LIST2{NO STMNT NUMBER LIST IF COMMENT
{{BEQ{R6{#CH$MN{LIST2{NO STMNT NO. IF CONTROL CARD
*
*      PRINT STATEMENT NUMBER
*
{LIST1{JSR{PRTIN{{{ELSE PRINT STATEMENT NUMBER
{{ZER{LSTSN{{{AND CLEAR FOR NEXT TIME IN
{{EJC{{{{
*
*      LISTR (CONTINUED)
*
*      MERGE HERE AFTER PRINTING STATEMENT NUMBER (IF REQUIRED)
*
{LIST2{MOV{#STNPD{PROFS{{POINT PAST STATEMENT NUMBER
{{MOV{R$CIM{R9{{LOAD POINTER TO CURRENT IMAGE
{{JSR{PRTST{{{PRINT IT
{{ICV{LSTLC{{{BUMP LINE COUNTER
{{BNZ{ERLST{LIST3{{JUMP IF ERROR COPY TO INT.CH.
{{JSR{PRTNL{{{TERMINATE LINE
{{BZE{CSWDB{LIST3{{JUMP IF -SINGLE MODE
{{JSR{PRTNL{{{ELSE ADD A BLANK LINE
{{ICV{LSTLC{{{AND BUMP LINE COUNTER
*
*      HERE AFTER PRINTING SOURCE IMAGE
*
{LIST3{MNZ{LSTPF{{{SET FLAG FOR LINE PRINTED
*
*      MERGE HERE TO EXIT
*
{LIST4{EXI{{{{RETURN TO LISTR CALLER
*
*      PRINT TITLE AFTER -TITLE OR -STITL CARD
*
{LIST5{ZER{CNTTL{{{CLEAR FLAG
*
*      EJECT TO NEW PAGE AND LIST TITLE
*
{LIST6{JSR{PRTPS{{{EJECT
{{BZE{PRICH{LIST7{{SKIP IF LISTING TO REGULAR PRINTER
{{BEQ{R$TTL{#NULLS{LIST0{TERMINAL LISTING OMITS NULL TITLE
*
*      LIST TITLE
*
{LIST7{JSR{LISTT{{{LIST TITLE
{{BRN{LIST0{{{MERGE
{{ENP{{{{END PROCEDURE LISTR
{{EJC{{{{
*
*      LISTT -- LIST TITLE AND SUBTITLE
*
*      USED DURING COMPILATION TO PRINT PAGE HEADING
*
*      JSR  LISTT            CALL TO LIST TITLE
*      (XR,WA)               DESTROYED
*
{LISTT{PRC{E{0{{ENTRY POINT
{{MOV{R$TTL{R9{{POINT TO SOURCE LISTING TITLE
{{JSR{PRTST{{{PRINT TITLE
{{MOV{LSTPO{PROFS{{SET OFFSET
{{MOV{#LSTMS{R9{{SET PAGE MESSAGE
{{JSR{PRTST{{{PRINT PAGE MESSAGE
{{ICV{LSTPG{{{BUMP PAGE NUMBER
{{MTI{LSTPG{{{LOAD PAGE NUMBER AS INTEGER
{{JSR{PRTIN{{{PRINT PAGE NUMBER
{{JSR{PRTNL{{{TERMINATE TITLE LINE
{{ADD{#NUM02{LSTLC{{COUNT TITLE LINE AND BLANK LINE
*
*      PRINT SUB-TITLE (IF ANY)
*
{{MOV{R$STL{R9{{LOAD POINTER TO SUB-TITLE
{{BZE{R9{LSTT1{{JUMP IF NO SUB-TITLE
{{JSR{PRTST{{{ELSE PRINT SUB-TITLE
{{JSR{PRTNL{{{TERMINATE LINE
{{ICV{LSTLC{{{BUMP LINE COUNT
*
*      RETURN POINT
*
{LSTT1{JSR{PRTNL{{{PRINT A BLANK LINE
{{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE LISTT
{{EJC{{{{
*
*      NEXTS -- ACQUIRE NEXT SOURCE IMAGE
*
*      NEXTS IS USED TO ACQUIRE THE NEXT SOURCE IMAGE AT COMPILE
*      TIME. IT ASSUMES THAT A PRIOR CALL TO READR HAS INPUT
*      A LINE IMAGE (SEE PROCEDURE READR). BEFORE THE CURRENT
*      IMAGE IS FINALLY LOST IT MAY BE LISTED HERE.
*
*      JSR  NEXTS            CALL TO ACQUIRE NEXT INPUT LINE
*      (XR,XL,WA,WB,WC)      DESTROYED
*
*      GLOBAL VALUES AFFECTED
*
*      R$CNI                 ON INPUT, NEXT IMAGE. ON
*                            EXIT RESET TO ZERO
*
*      R$CIM                 ON EXIT, SET TO POINT TO IMAGE
*
*      SCNIL                 INPUT IMAGE LENGTH ON EXIT
*
*      SCNSE                 RESET TO ZERO ON EXIT
*
*      LSTPF                 SET ON EXIT IF LINE IS LISTED
*
{NEXTS{PRC{E{0{{ENTRY POINT
{{BZE{CSWLS{NXTS2{{JUMP IF -NOLIST
{{MOV{R$CIM{R9{{POINT TO IMAGE
{{BZE{R9{NXTS2{{JUMP IF NO IMAGE
{{PLC{R9{{{GET CHAR PTR
{{LCH{R6{(R9){{GET FIRST CHAR
{{BNE{R6{#CH$MN{NXTS1{JUMP IF NOT CTRL CARD
{{BZE{CSWPR{NXTS2{{JUMP IF -NOPRINT
*
*      HERE TO CALL LISTER
*
{NXTS1{JSR{LISTR{{{LIST LINE
*
*      HERE AFTER POSSIBLE LISTING
*
{NXTS2{MOV{R$CNI{R9{{POINT TO NEXT IMAGE
{{MOV{R9{R$CIM{{SET AS NEXT IMAGE
{{ZER{R$CNI{{{CLEAR NEXT IMAGE POINTER
{{MOV{4*SCLEN(R9){R6{{GET INPUT IMAGE LENGTH
{{MOV{CSWIN{R7{{GET MAX ALLOWABLE LENGTH
{{BLO{R6{R7{NXTS3{SKIP IF NOT TOO LONG
{{MOV{R7{R6{{ELSE TRUNCATE
*
*      HERE WITH LENGTH IN (WA)
*
{NXTS3{MOV{R6{SCNIL{{USE AS RECORD LENGTH
{{ZER{SCNSE{{{RESET SCNSE
{{ZER{LSTPF{{{SET LINE NOT LISTED YET
{{EXI{{{{RETURN TO NEXTS CALLER
{{ENP{{{{END PROCEDURE NEXTS
{{EJC{{{{
*
*      PATIN -- PATTERN CONSTRUCTION FOR LEN,POS,RPOS,TAB,RTAB
*
*      THESE PATTERN TYPES ALL GENERATE A SIMILAR NODE TYPE. SO
*      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
*      FOR ACTUAL ENTRY POINTS FOR THESE FIVE FUNCTIONS.
*
*      (WA)                  PCODE FOR EXPRESSION ARG CASE
*      (WB)                  PCODE FOR INTEGER ARG CASE
*      JSR  PATIN            CALL TO BUILD PATTERN NODE
*      PPM  LOC              TRANSFER LOC FOR NOT INTEGER OR EXP
*      PPM  LOC              TRANSFER LOC FOR INT OUT OF RANGE
*      (XR)                  POINTER TO CONSTRUCTED NODE
*      (XL,WA,WB,WC,IA)      DESTROYED
*
{PATIN{PRC{N{2{{ENTRY POINT
{{MOV{R6{R10{{PRESERVE EXPRESSION ARG PCODE
{{JSR{GTSMI{{{TRY TO CONVERT ARG AS SMALL INTEGER
{{PPM{PTIN2{{{JUMP IF NOT INTEGER
{{PPM{PTIN3{{{JUMP IF OUT OF RANGE
*
*      COMMON SUCCESSFUL EXIT POINT
*
{PTIN1{JSR{PBILD{{{BUILD PATTERN NODE
{{EXI{{{{RETURN TO CALLER
*
*      HERE IF ARGUMENT IS NOT AN INTEGER
*
{PTIN2{MOV{R10{R7{{COPY EXPR ARG CASE PCODE
{{BLO{(R9){#B$E$${PTIN1{ALL OK IF EXPRESSION ARG
{{EXI{1{{{ELSE TAKE ERROR EXIT FOR WRONG TYPE
*
*      HERE FOR ERROR OF OUT OF RANGE INTEGER ARGUMENT
*
{PTIN3{EXI{2{{{TAKE OUT-OF-RANGE ERROR EXIT
{{ENP{{{{END PROCEDURE PATIN
{{EJC{{{{
*
*      PATST -- PATTERN CONSTRUCTION FOR ANY,NOTANY,
*               BREAK,SPAN AND BREAKX PATTERN FUNCTIONS.
*
*      THESE PATTERN FUNCTIONS BUILD SIMILAR TYPES OF NODES AND
*      THE CONSTRUCTION CODE IS SHARED. SEE FUNCTIONS SECTION
*      FOR ACTUAL ENTRY POINTS FOR THESE FIVE PATTERN FUNCTIONS.
*
*      0(XS)                 STRING ARGUMENT
*      (WB)                  PCODE FOR ONE CHAR ARGUMENT
*      (XL)                  PCODE FOR MULTI-CHAR ARGUMENT
*      (WC)                  PCODE FOR EXPRESSION ARGUMENT
*      JSR  PATST            CALL TO BUILD NODE
*      PPM  LOC              TRANSFER LOC IF NOT STRING OR EXPR
*      (XS)                  POPPED PAST STRING ARGUMENT
*      (XR)                  POINTER TO CONSTRUCTED NODE
*      (XL)                  DESTROYED
*      (WA,WB,WC,RA)         DESTROYED
*
*      NOTE THAT THERE IS A SPECIAL CALL TO PATST IN THE EVALS
*      PROCEDURE WITH A SLIGHTLY DIFFERENT FORM. SEE EVALS
*      FOR DETAILS OF THE FORM OF THIS CALL.
*
{PATST{PRC{N{1{{ENTRY POINT
{{JSR{GTSTG{{{CONVERT ARGUMENT AS STRING
{{PPM{PATS7{{{JUMP IF NOT STRING
{{BNE{R6{#NUM01{PATS2{JUMP IF NOT ONE CHAR STRING
*
*      HERE FOR ONE CHAR STRING CASE
*
{{BZE{R7{PATS2{{TREAT AS MULTI-CHAR IF EVALS CALL
{{PLC{R9{{{POINT TO CHARACTER
{{LCH{R9{(R9){{LOAD CHARACTER
*
*      COMMON EXIT POINT AFTER SUCCESSFUL CONSTRUCTION
*
{PATS1{JSR{PBILD{{{CALL ROUTINE TO BUILD NODE
{{EXI{{{{RETURN TO PATST CALLER
{{EJC{{{{
*
*      PATST (CONTINUED)
*
*      HERE FOR MULTI-CHARACTER STRING CASE
*
{PATS2{MOV{R10{-(SP){{SAVE MULTI-CHAR PCODE
{{MOV{R9{-(SP){{SAVE STRING POINTER
{{MOV{CTMSK{R8{{LOAD CURRENT MASK BIT
{{LSH{R8{1{{SHIFT TO NEXT POSITION
{{NZB{R8{PATS4{{SKIP IF POSITION LEFT IN THIS TBL
*
*      HERE WE MUST ALLOCATE A NEW CHARACTER TABLE
*
{{MOV{#4*CTSI${R6{{SET SIZE OF CTBLK
{{JSR{ALLOC{{{ALLOCATE CTBLK
{{MOV{R9{R$CTP{{STORE PTR TO NEW CTBLK
{{MOV{#B$CTT{(R9)+{{STORE TYPE CODE, BUMP PTR
{{LCT{R7{#CFP$A{{SET NUMBER OF WORDS TO CLEAR
{{MOV{BITS0{R8{{LOAD ALL ZERO BITS
*
*      LOOP TO CLEAR ALL BITS IN TABLE TO ZEROS
*
{PATS3{MOV{R8{(R9)+{{MOVE WORD OF ZERO BITS
{{BCT{R7{PATS3{{LOOP TILL ALL CLEARED
{{MOV{BITS1{R8{{SET INITIAL BIT POSITION
*
*      MERGE HERE WITH BIT POSITION AVAILABLE
*
{PATS4{MOV{R8{CTMSK{{SAVE PARM2 (NEW BIT POSITION)
{{MOV{(SP)+{R10{{RESTORE POINTER TO ARGUMENT STRING
{{MOV{4*SCLEN(R10){R7{{LOAD STRING LENGTH
{{BZE{R7{PATS6{{JUMP IF NULL STRING CASE
{{LCT{R7{R7{{ELSE SET LOOP COUNTER
{{PLC{R10{{{POINT TO CHARACTERS IN ARGUMENT
{{EJC{{{{
*
*      PATST (CONTINUED)
*
*      LOOP TO SET BITS IN COLUMN OF TABLE
*
{PATS5{LCH{R6{(R10)+{{LOAD NEXT CHARACTER
{{WTB{R6{{{CONVERT TO BYTE OFFSET
{{MOV{R$CTP{R9{{POINT TO CTBLK
{{ADD{R6{R9{{POINT TO CTBLK ENTRY
{{MOV{R8{R6{{COPY BIT MASK
{{ORB{4*CTCHS(R9){R6{{OR IN BITS ALREADY SET
{{MOV{R6{4*CTCHS(R9){{STORE RESULTING BIT STRING
{{BCT{R7{PATS5{{LOOP TILL ALL BITS SET
*
*      COMPLETE PROCESSING FOR MUTI-CHAR STRING CASE
*
{PATS6{MOV{R$CTP{R9{{LOAD CTBLK PTR AS PARM1 FOR PBILD
{{ZER{R10{{{CLEAR GARBAGE PTR IN XL
{{MOV{(SP)+{R7{{LOAD PCODE FOR MULTI-CHAR STR CASE
{{BRN{PATS1{{{BACK TO EXIT (WC=BITSTRING=PARM2)
*
*      HERE IF ARGUMENT IS NOT A STRING
*
*      NOTE THAT THE CALL FROM EVALS CANNOT PASS AN EXPRESSION
*      SINCE EVALP ALWAYS REEVALUATES EXPRESSIONS.
*
{PATS7{MOV{R8{R7{{SET PCODE FOR EXPRESSION ARGUMENT
{{BLO{(R9){#B$E$${PATS1{JUMP TO EXIT IF EXPRESSION ARG
{{EXI{1{{{ELSE TAKE WRONG TYPE ERROR EXIT
{{ENP{{{{END PROCEDURE PATST
{{EJC{{{{
*
*      PBILD -- BUILD PATTERN NODE
*
*      (XR)                  PARM1 (ONLY IF REQUIRED)
*      (WB)                  PCODE FOR NODE
*      (WC)                  PARM2 (ONLY IF REQUIRED)
*      JSR  PBILD            CALL TO BUILD NODE
*      (XR)                  POINTER TO CONSTRUCTED NODE
*      (WA)                  DESTROYED
*
{PBILD{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{STACK POSSIBLE PARM1
{{MOV{R7{R9{{COPY PCODE
{{LEI{R9{{{LOAD ENTRY POINT ID (BL$PX)
{{BEQ{R9{#BL$P1{PBLD1{JUMP IF ONE PARAMETER
{{BEQ{R9{#BL$P0{PBLD3{JUMP IF NO PARAMETERS
*
*      HERE FOR TWO PARAMETER CASE
*
{{MOV{#4*PCSI${R6{{SET SIZE OF P2BLK
{{JSR{ALLOC{{{ALLOCATE BLOCK
{{MOV{R8{4*PARM2(R9){{STORE SECOND PARAMETER
{{BRN{PBLD2{{{MERGE WITH ONE PARM CASE
*
*      HERE FOR ONE PARAMETER CASE
*
{PBLD1{MOV{#4*PBSI${R6{{SET SIZE OF P1BLK
{{JSR{ALLOC{{{ALLOCATE NODE
*
*      MERGE HERE FROM TWO PARM CASE
*
{PBLD2{MOV{(SP){4*PARM1(R9){{STORE FIRST PARAMETER
{{BRN{PBLD4{{{MERGE WITH NO PARAMETER CASE
*
*      HERE FOR CASE OF NO PARAMETERS
*
{PBLD3{MOV{#4*PASI${R6{{SET SIZE OF P0BLK
{{JSR{ALLOC{{{ALLOCATE NODE
*
*      MERGE HERE FROM OTHER CASES
*
{PBLD4{MOV{R7{(R9){{STORE PCODE
{{ICA{SP{{{POP FIRST PARAMETER
{{MOV{#NDNTH{4*PTHEN(R9){{SET NOTHEN SUCCESSOR POINTER
{{EXI{{{{RETURN TO PBILD CALLER
{{ENP{{{{END PROCEDURE PBILD
{{EJC{{{{
*
*      PCONC -- CONCATENATE TWO PATTERNS
*
*      (XL)                  PTR TO RIGHT PATTERN
*      (XR)                  PTR TO LEFT PATTERN
*      JSR  PCONC            CALL TO CONCATENATE PATTERNS
*      (XR)                  PTR TO CONCATENATED PATTERN
*      (XL,WA,WB,WC)         DESTROYED
*
*
*      TO CONCATENATE TWO PATTERNS, ALL SUCCESSORS IN THE LEFT
*      PATTERN WHICH POINT TO THE NOTHEN NODE MUST BE CHANGED TO
*      POINT TO THE RIGHT PATTERN. HOWEVER, THIS MODIFICATION
*      MUST BE PERFORMED ON A COPY OF THE LEFT ARGUMENT RATHER
*      THAN THE LEFT ARGUMENT ITSELF, SINCE THE LEFT ARGUMENT
*      MAY BE POINTED TO BY SOME OTHER VARIABLE VALUE.
*
*      ACCORDINGLY, IT IS NECESSARY TO COPY THE LEFT ARGUMENT.
*      THIS IS NOT A TRIVIAL PROCESS SINCE WE MUST AVOID COPYING
*      NODES MORE THAN ONCE AND THE PATTERN IS A GRAPH STRUCTURE
*      THE FOLLOWING ALGORITHM IS EMPLOYED.
*
*      THE STACK IS USED TO STORE A LIST OF NODES WHICH
*      HAVE ALREADY BEEN COPIED. THE FORMAT OF THE ENTRIES ON
*      THIS LIST CONSISTS OF A TWO WORD BLOCK. THE FIRST WORD
*      IS THE OLD ADDRESS AND THE SECOND WORD IS THE ADDRESS
*      OF THE COPY. THIS LIST IS SEARCHED BY THE PCOPY
*      ROUTINE TO AVOID MAKING DUPLICATE COPIES. A TRICK IS
*      USED TO ACCOMPLISH THE CONCATENATION AT THE SAME TIME.
*      A SPECIAL ENTRY IS MADE TO START WITH ON THE STACK. THIS
*      ENTRY RECORDS THAT THE NOTHEN NODE HAS BEEN COPIED
*      ALREADY AND THE ADDRESS OF ITS COPY IS THE RIGHT PATTERN.
*      THIS AUTOMATICALLY PERFORMS THE CORRECT REPLACEMENTS.
*
{PCONC{PRC{E{0{{ENTRY POINT
{{ZER{-(SP){{{MAKE ROOM FOR ONE ENTRY AT BOTTOM
{{MOV{SP{R8{{STORE POINTER TO START OF LIST
{{MOV{#NDNTH{-(SP){{STACK NOTHEN NODE AS OLD NODE
{{MOV{R10{-(SP){{STORE RIGHT ARG AS COPY OF NOTHEN
{{MOV{SP{R10{{INITIALIZE POINTER TO STACK ENTRIES
{{JSR{PCOPY{{{COPY FIRST NODE OF LEFT ARG
{{MOV{R6{4*2(R10){{STORE AS RESULT UNDER LIST
{{EJC{{{{
*
*      PCONC (CONTINUED)
*
*      THE FOLLOWING LOOP SCANS ENTRIES IN THE LIST AND MAKES
*      SURE THAT THEIR SUCCESSORS HAVE BEEN COPIED.
*
{PCNC1{BEQ{R10{SP{PCNC2{JUMP IF ALL ENTRIES PROCESSED
{{MOV{-(R10){R9{{ELSE LOAD NEXT OLD ADDRESS
{{MOV{4*PTHEN(R9){R9{{LOAD POINTER TO SUCCESSOR
{{JSR{PCOPY{{{COPY SUCCESSOR NODE
{{MOV{-(R10){R9{{LOAD POINTER TO NEW NODE (COPY)
{{MOV{R6{4*PTHEN(R9){{STORE PTR TO NEW SUCCESSOR
*
*      NOW CHECK FOR SPECIAL CASE OF ALTERNATION NODE WHERE
*      PARM1 POINTS TO A NODE AND MUST BE COPIED LIKE PTHEN.
*
{{BNE{(R9){#P$ALT{PCNC1{LOOP BACK IF NOT
{{MOV{4*PARM1(R9){R9{{ELSE LOAD POINTER TO ALTERNATIVE
{{JSR{PCOPY{{{COPY IT
{{MOV{(R10){R9{{RESTORE PTR TO NEW NODE
{{MOV{R6{4*PARM1(R9){{STORE PTR TO COPIED ALTERNATIVE
{{BRN{PCNC1{{{LOOP BACK FOR NEXT ENTRY
*
*      HERE AT END OF COPY PROCESS
*
{PCNC2{MOV{R8{SP{{RESTORE STACK POINTER
{{MOV{(SP)+{R9{{LOAD POINTER TO COPY
{{EXI{{{{RETURN TO PCONC CALLER
{{ENP{{{{END PROCEDURE PCONC
{{EJC{{{{
*
*      PCOPY -- COPY A PATTERN NODE
*
*      PCOPY IS CALLED FROM THE PCONC PROCEDURE TO COPY A SINGLE
*      PATTERN NODE. THE COPY IS ONLY CARRIED OUT IF THE NODE
*      HAS NOT BEEN COPIED ALREADY.
*
*      (XR)                  POINTER TO NODE TO BE COPIED
*      (XT)                  PTR TO CURRENT LOC IN COPY LIST
*      (WC)                  POINTER TO LIST OF COPIED NODES
*      JSR  PCOPY            CALL TO COPY A NODE
*      (WA)                  POINTER TO COPY
*      (WB,XR)               DESTROYED
*
{PCOPY{PRC{N{0{{ENTRY POINT
{{MOV{R10{R7{{SAVE XT
{{MOV{R8{R10{{POINT TO START OF LIST
*
*      LOOP TO SEARCH LIST OF NODES COPIED ALREADY
*
{PCOP1{DCA{R10{{{POINT TO NEXT ENTRY ON LIST
{{BEQ{R9{(R10){PCOP2{JUMP IF MATCH
{{DCA{R10{{{ELSE SKIP OVER COPIED ADDRESS
{{BNE{R10{SP{PCOP1{LOOP BACK IF MORE TO TEST
*
*      HERE IF NOT IN LIST, PERFORM COPY
*
{{MOV{(R9){R6{{LOAD FIRST WORD OF BLOCK
{{JSR{BLKLN{{{GET LENGTH OF BLOCK
{{MOV{R9{R10{{SAVE POINTER TO OLD NODE
{{JSR{ALLOC{{{ALLOCATE SPACE FOR COPY
{{MOV{R10{-(SP){{STORE OLD ADDRESS ON LIST
{{MOV{R9{-(SP){{STORE NEW ADDRESS ON LIST
{{CHK{{{{CHECK FOR STACK OVERFLOW
{{MVW{{{{MOVE WORDS FROM OLD BLOCK TO COPY
{{MOV{(SP){R6{{LOAD POINTER TO COPY
{{BRN{PCOP3{{{JUMP TO EXIT
*
*      HERE IF WE FIND ENTRY IN LIST
*
{PCOP2{MOV{-(R10){R6{{LOAD ADDRESS OF COPY FROM LIST
*
*      COMMON EXIT POINT
*
{PCOP3{MOV{R7{R10{{RESTORE XT
{{EXI{{{{RETURN TO PCOPY CALLER
{{ENP{{{{END PROCEDURE PCOPY
{{EJC{{{{
*
*      PRFLR -- PRINT PROFILE
*      PRFLR IS CALLED TO PRINT THE CONTENTS OF THE PROFILE
*      TABLE IN A FAIRLY READABLE TABULAR FORMAT.
*
*      JSR  PRFLR            CALL TO PRINT PROFILE
*      (WA,IA)               DESTROYED
*
{PRFLR{PRC{E{0{{
{{BZE{PFDMP{PRFL4{{NO PRINTING IF NO PROFILING DONE
{{MOV{R9{-(SP){{PRESERVE ENTRY XR
{{MOV{R7{PFSVW{{AND ALSO WB
{{JSR{PRTPG{{{EJECT
{{MOV{#PFMS1{R9{{LOAD MSG /PROGRAM PROFILE/
{{JSR{PRTST{{{AND PRINT IT
{{JSR{PRTNL{{{FOLLOWED BY NEWLINE
{{JSR{PRTNL{{{AND ANOTHER
{{MOV{#PFMS2{R9{{POINT TO FIRST HDR
{{JSR{PRTST{{{PRINT IT
{{JSR{PRTNL{{{NEW LINE
{{MOV{#PFMS3{R9{{SECOND HDR
{{JSR{PRTST{{{PRINT IT
{{JSR{PRTNL{{{NEW LINE
{{JSR{PRTNL{{{AND ANOTHER BLANK LINE
{{ZER{R7{{{INITIAL STMT COUNT
{{MOV{PFTBL{R9{{POINT TO TABLE ORIGIN
{{ADD{#4*NUM02{R9{{BIAS PAST XNBLK HEADER (SGD07)
*
*      LOOP HERE TO PRINT SUCCESSIVE ENTRIES
*
{PRFL1{ICV{R7{{{BUMP STMT NR
{{LDI{(R9){{{LOAD NR OF EXECUTIONS
{{IEQ{PRFL3{{{NO PRINTING IF ZERO
{{MOV{#PFPD1{PROFS{{POINT WHERE TO PRINT
{{JSR{PRTIN{{{AND PRINT IT
{{ZER{PROFS{{{BACK TO START OF LINE
{{MTI{R7{{{LOAD STMT NR
{{JSR{PRTIN{{{PRINT IT THERE
{{MOV{#PFPD2{PROFS{{AND PAD PAST COUNT
{{LDI{4*CFP$I(R9){{{LOAD TOTAL EXEC TIME
{{JSR{PRTIN{{{PRINT THAT TOO
{{LDI{4*CFP$I(R9){{{RELOAD TIME
{{MLI{INTTH{{{CONVERT TO MICROSEC
{{IOV{PRFL2{{{OMIT NEXT BIT IF OVERFLOW
{{DVI{(R9){{{DIVIDE BY EXECUTIONS
{{MOV{#PFPD3{PROFS{{PAD LAST PRINT
{{JSR{PRTIN{{{AND PRINT MCSEC/EXECN
*
*      MERGE AFTER PRINTING TIME
*
{PRFL2{JSR{PRTNL{{{THATS ANOTHER LINE
*
*      HERE TO GO TO NEXT ENTRY
*
{PRFL3{ADD{#4*PF$I2{R9{{BUMP INDEX PTR (SGD07)
{{BLT{R7{PFNTE{PRFL1{LOOP IF MORE STMTS
{{MOV{(SP)+{R9{{RESTORE CALLERS XR
{{MOV{PFSVW{R7{{AND WB TOO
*
*      HERE TO EXIT
*
{PRFL4{EXI{{{{RETURN
{{ENP{{{{END OF PRFLR
{{EJC{{{{
*
*      PRFLU -- UPDATE AN ENTRY IN THE PROFILE TABLE
*
*      ON ENTRY, KVSTN CONTAINS NR OF STMT TO PROFILE
*
*      JSR  PRFLU            CALL TO UPDATE ENTRY
*      (IA)                  DESTROYED
*
{PRFLU{PRC{E{0{{
{{BNZ{PFFNC{PFLU4{{SKIP IF JUST ENTERED FUNCTION
{{MOV{R9{-(SP){{PRESERVE ENTRY XR
{{MOV{R6{PFSVW{{SAVE WA (SGD07)
{{BNZ{PFTBL{PFLU2{{BRANCH IF TABLE ALLOCATED
*
*      HERE IF SPACE FOR PROFILE TABLE NOT YET ALLOCATED.
*      CALCULATE SIZE NEEDED, ALLOCATE A STATIC XNBLK, AND
*      INITIALIZE IT ALL TO ZERO.
*      THE TIME TAKEN FOR THIS WILL BE ATTRIBUTED TO THE CURRENT
*      STATEMENT (ASSIGNMENT TO KEYWD PROFILE), BUT SINCE THE
*      TIMING FOR THIS STATEMENT IS UP THE POLE ANYWAY, THIS
*      DOESNT REALLY MATTER...
*
{{SUB{#NUM01{PFNTE{{ADJUST FOR EXTRA COUNT (SGD07)
{{MTI{PFI2A{{{CONVRT ENTRY SIZE TO INT
{{STI{PFSTE{{{AND STORE SAFELY FOR LATER
{{MTI{PFNTE{{{LOAD TABLE LENGTH AS INTEGER
{{MLI{PFSTE{{{MULTIPLY BY ENTRY SIZE
{{MFI{R6{{{GET BACK ADDRESS-STYLE
{{ADD{#NUM02{R6{{ADD ON 2 WORD OVERHEAD
{{WTB{R6{{{CONVERT THE WHOLE LOT TO BYTES
{{JSR{ALOST{{{GIMME THE SPACE
{{MOV{R9{PFTBL{{SAVE BLOCK POINTER
{{MOV{#B$XNT{(R9)+{{PUT BLOCK TYPE AND ...
{{MOV{R6{(R9)+{{... LENGTH INTO HEADER
{{MFI{R6{{{GET BACK NR OF WDS IN DATA AREA
{{LCT{R6{R6{{LOAD THE COUNTER
*
*      LOOP HERE TO ZERO THE BLOCK DATA
*
{PFLU1{ZER{(R9)+{{{BLANK A WORD
{{BCT{R6{PFLU1{{AND ALLLLLLL THE REST
*
*      END OF ALLOCATION. MERGE BACK INTO ROUTINE
*
{PFLU2{MTI{KVSTN{{{LOAD NR OF STMT JUST ENDED
{{SBI{INTV1{{{MAKE INTO INDEX OFFSET
{{MLI{PFSTE{{{MAKE OFFSET OF TABLE ENTRY
{{MFI{R6{{{CONVERT TO ADDRESS
{{WTB{R6{{{GET AS BAUS
{{ADD{#4*NUM02{R6{{OFFSET INCLUDES TABLE HEADER
{{MOV{PFTBL{R9{{GET TABLE START
{{BGE{R6{4*NUM01(R9){PFLU3{IF OUT OF TABLE, SKIP IT
{{ADD{R6{R9{{ELSE POINT TO ENTRY
{{LDI{(R9){{{GET NR OF EXECUTIONS SO FAR
{{ADI{INTV1{{{NUDGE UP ONE
{{STI{(R9){{{AND PUT BACK
{{JSR{SYSTM{{{GET TIME NOW
{{STI{PFETM{{{STASH ENDING TIME
{{SBI{PFSTM{{{SUBTRACT START TIME
{{ADI{4*CFP$I(R9){{{ADD CUMULATIVE TIME SO FAR
{{STI{4*CFP$I(R9){{{AND PUT BACK NEW TOTAL
{{LDI{PFETM{{{LOAD END TIME OF THIS STMT ...
{{STI{PFSTM{{{... WHICH IS START TIME OF NEXT
*
*      MERGE HERE TO EXIT
*
{PFLU3{MOV{(SP)+{R9{{RESTORE CALLERS XR
{{MOV{PFSVW{R6{{RESTORE SAVED REG
{{EXI{{{{AND RETURN
*
*      HERE IF PROFILE IS SUPPRESSED BECAUSE A PROGRAM DEFINED
*      FUNCTION IS ABOUT TO BE ENTERED, AND SO THE CURRENT STMT
*      HAS NOT YET FINISHED
*
{PFLU4{ZER{PFFNC{{{RESET THE CONDITION FLAG
{{EXI{{{{AND IMMEDIATE RETURN
{{ENP{{{{END OF PROCEDURE PRFLU
{{EJC{{{{
*
*      PRPAR - PROCESS PRINT PARAMETERS
*
*      (WC)                  IF NONZERO ASSOCIATE TERMINAL ONLY
*      JSR  PRPAR            CALL TO PROCESS PRINT PARAMETERS
*      (XL,XR,WA,WB,WC)      DESTROYED
*
*      SINCE MEMORY ALLOCATION IS UNDECIDED ON INITIAL CALL,
*      TERMINAL CANNOT BE ASSOCIATED. THE ENTRY WITH WC NON-ZERO
*      IS PROVIDED SO A LATER CALL CAN BE MADE TO COMPLETE THIS.
*
{PRPAR{PRC{E{0{{ENTRY POINT
{{BNZ{R8{PRPA7{{JUMP TO ASSOCIATE TERMINAL
{{JSR{SYSPP{{{GET PRINT PARAMETERS
{{BNZ{R7{PRPA1{{JUMP IF LINES/PAGE SPECIFIED
{{MOV{#CFP$M{R7{{ELSE USE A LARGE VALUE
{{RSH{R7{1{{BUT NOT TOO LARGE
*
*      STORE LINE COUNT/PAGE
*
{PRPA1{MOV{R7{LSTNP{{STORE NUMBER OF LINES/PAGE
{{MOV{R7{LSTLC{{PRETEND PAGE IS FULL INITIALLY
{{ZER{LSTPG{{{CLEAR PAGE NUMBER
{{MOV{PRLEN{R7{{GET PRIOR LENGTH IF ANY
{{BZE{R7{PRPA2{{SKIP IF NO LENGTH
{{BGT{R6{R7{PRPA3{SKIP STORING IF TOO BIG
*
*      STORE PRINT BUFFER LENGTH
*
{PRPA2{MOV{R6{PRLEN{{STORE VALUE
*
*      PROCESS BITS OPTIONS
*
{PRPA3{MOV{BITS3{R7{{BIT 3 MASK
{{ANB{R8{R7{{GET -NOLIST BIT
{{ZRB{R7{PRPA4{{SKIP IF CLEAR
{{ZER{CSWLS{{{SET -NOLIST
*
*      CHECK IF FAIL REPORTS GOTO INTERACTIVE CHANNEL
*
{PRPA4{MOV{BITS1{R7{{BIT 1 MASK
{{ANB{R8{R7{{GET BIT
{{MOV{R7{ERICH{{STORE INT. CHAN. ERROR FLAG
{{MOV{BITS2{R7{{BIT 2 MASK
{{ANB{R8{R7{{GET BIT
{{MOV{R7{PRICH{{FLAG FOR STD PRINTER ON INT. CHAN.
{{MOV{BITS4{R7{{BIT 4 MASK
{{ANB{R8{R7{{GET BIT
{{MOV{R7{CPSTS{{FLAG FOR COMPILE STATS SUPPRESSN.
{{MOV{BITS5{R7{{BIT 5 MASK
{{ANB{R8{R7{{GET BIT
{{MOV{R7{EXSTS{{FLAG FOR EXEC STATS SUPPRESSION
{{EJC{{{{
*
*      PRPAR (CONTINUED)
*
{{MOV{BITS6{R7{{BIT 6 MASK
{{ANB{R8{R7{{GET BIT
{{MOV{R7{PRECL{{EXTENDED/COMPACT LISTING FLAG
{{SUB{#NUM08{R6{{POINT 8 CHARS FROM LINE END
{{ZRB{R7{PRPA5{{JUMP IF NOT EXTENDED
{{MOV{R6{LSTPO{{STORE FOR LISTING PAGE HEADINGS
*
*       CONTINUE OPTION PROCESSING
*
{PRPA5{MOV{BITS7{R7{{BIT 7 MASK
{{ANB{R8{R7{{GET BIT 7
{{MOV{R7{CSWEX{{SET -NOEXECUTE IF NON-ZERO
{{MOV{BIT10{R7{{BIT 10 MASK
{{ANB{R8{R7{{GET BIT 10
{{MOV{R7{HEADP{{PRETEND PRINTED TO OMIT HEADERS
{{MOV{BITS9{R7{{BIT 9 MASK
{{ANB{R8{R7{{GET BIT 9
{{MOV{R7{PRSTO{{KEEP IT AS STD LISTING OPTION
{{ZRB{R7{PRPA6{{SKIP IF CLEAR
{{MOV{PRLEN{R6{{GET PRINT BUFFER LENGTH
{{SUB{#NUM08{R6{{POINT 8 CHARS FROM LINE END
{{MOV{R6{LSTPO{{STORE PAGE OFFSET
*
*      CHECK FOR TERMINAL
*
{PRPA6{ANB{BITS8{R8{{SEE IF TERMINAL TO BE ACTIVATED
{{BNZ{R8{PRPA7{{JUMP IF TERMINAL REQUIRED
{{BZE{INITR{PRPA8{{JUMP IF NO TERMINAL TO DETACH
{{MOV{#V$TER{R10{{PTR TO /TERMINAL/
{{JSR{GTNVR{{{GET VRBLK POINTER
{{PPM{{{{CANT FAIL
{{MOV{#NULLS{4*VRVAL(R9){{CLEAR VALUE OF TERMINAL
{{JSR{SETVR{{{REMOVE ASSOCIATION
{{BRN{PRPA8{{{RETURN
*
*      ASSOCIATE TERMINAL
*
{PRPA7{MNZ{INITR{{{NOTE TERMINAL ASSOCIATED
{{BZE{DNAMB{PRPA8{{CANT IF MEMORY NOT ORGANISED
{{MOV{#V$TER{R10{{POINT TO TERMINAL STRING
{{MOV{#TRTOU{R7{{OUTPUT TRACE TYPE
{{JSR{INOUT{{{ATTACH OUTPUT TRBLK TO VRBLK
{{MOV{R9{-(SP){{STACK TRBLK PTR
{{MOV{#V$TER{R10{{POINT TO TERMINAL STRING
{{MOV{#TRTIN{R7{{INPUT TRACE TYPE
{{JSR{INOUT{{{ATTACH INPUT TRACE BLK
{{MOV{(SP)+{4*VRVAL(R9){{ADD OUTPUT TRBLK TO CHAIN
*
*      RETURN POINT
*
{PRPA8{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE PRPAR
{{EJC{{{{
*
*      PRTCH -- PRINT A CHARACTER
*
*      PRTCH IS USED TO PRINT A SINGLE CHARACTER
*
*      (WA)                  CHARACTER TO BE PRINTED
*      JSR  PRTCH            CALL TO PRINT CHARACTER
*
{PRTCH{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{SAVE XR
{{BNE{PROFS{PRLEN{PRCH1{JUMP IF ROOM IN BUFFER
{{JSR{PRTNL{{{ELSE PRINT THIS LINE
*
*      HERE AFTER MAKING SURE WE HAVE ROOM
*
{PRCH1{MOV{PRBUF{R9{{POINT TO PRINT BUFFER
{{PSC{R9{PROFS{{POINT TO NEXT CHARACTER LOCATION
{{SCH{R6{(R9){{STORE NEW CHARACTER
{{CSC{R9{{{COMPLETE STORE CHARACTERS
{{ICV{PROFS{{{BUMP POINTER
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{EXI{{{{RETURN TO PRTCH CALLER
{{ENP{{{{END PROCEDURE PRTCH
{{EJC{{{{
*
*      PRTIC -- PRINT TO INTERACTIVE CHANNEL
*
*      PRTIC IS CALLED TO PRINT THE CONTENTS OF THE STANDARD
*      PRINT BUFFER TO THE INTERACTIVE CHANNEL. IT IS ONLY
*      CALLED AFTER PRTST HAS SET UP THE STRING FOR PRINTING.
*      IT DOES NOT CLEAR THE BUFFER.
*
*      JSR  PRTIC            CALL FOR PRINT
*      (WA,WB)               DESTROYED
*
{PRTIC{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{SAVE XR
{{MOV{PRBUF{R9{{POINT TO BUFFER
{{MOV{PROFS{R6{{NO OF CHARS
{{JSR{SYSPI{{{PRINT
{{PPM{PRTC2{{{FAIL RETURN
*
*      RETURN
*
{PRTC1{MOV{(SP)+{R9{{RESTORE XR
{{EXI{{{{RETURN
*
*      ERROR OCCURED
*
{PRTC2{ZER{ERICH{{{PREVENT LOOPING
{{ERB{252{ERROR{{ON PRINTING TO INTERACTIVE CHANNEL
{{BRN{PRTC1{{{RETURN
{{ENP{{{{PROCEDURE PRTIC
{{EJC{{{{
*
*      PRTIS -- PRINT TO INTERACTIVE AND STANDARD PRINTER
*
*      PRTIS PUTS A LINE FROM THE PRINT BUFFER ONTO THE
*      INTERACTIVE CHANNEL (IF ANY) AND THE STANDARD PRINTER.
*      IT ALWAYS PRINTS TO THE STANDARD PRINTER BUT DOES
*      NOT DUPLICATE LINES IF THE STANDARD PRINTER IS
*      INTERACTIVE.  IT CLEARS DOWN THE PRINT BUFFER.
*
*      JSR  PRTIS            CALL FOR PRINTING
*      (WA,WB)               DESTROYED
*
{PRTIS{PRC{E{0{{ENTRY POINT
{{BNZ{PRICH{PRTS1{{JUMP IF STANDARD PRINTER IS INT.CH.
{{BZE{ERICH{PRTS1{{SKIP IF NOT DOING INT. ERROR REPS.
{{JSR{PRTIC{{{PRINT TO INTERACTIVE CHANNEL
*
*      MERGE AND EXIT
*
{PRTS1{JSR{PRTNL{{{PRINT TO STANDARD PRINTER
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE PRTIS
{{EJC{{{{
*
*      PRTIN -- PRINT AN INTEGER
*
*      PRTIN PRINTS THE INTEGER VALUE WHICH IS IN THE INTEGER
*      ACCUMULATOR. BLOCKS BUILT IN DYNAMIC STORAGE
*      DURING THIS PROCESS ARE IMMEDIATELY DELETED.
*
*      (IA)                  INTEGER VALUE TO BE PRINTED
*      JSR  PRTIN            CALL TO PRINT INTEGER
*      (IA,RA)               DESTROYED
*
{PRTIN{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{SAVE XR
{{JSR{ICBLD{{{BUILD INTEGER BLOCK
{{BLO{R9{DNAMB{PRTI1{JUMP IF ICBLK BELOW DYNAMIC
{{BHI{R9{DNAMP{PRTI1{JUMP IF ABOVE DYNAMIC
{{MOV{R9{DNAMP{{IMMEDIATELY DELETE IT
*
*      DELETE ICBLK FROM DYNAMIC STORE
*
{PRTI1{MOV{R9{-(SP){{STACK PTR FOR GTSTG
{{JSR{GTSTG{{{CONVERT TO STRING
{{PPM{{{{CONVERT ERROR IS IMPOSSIBLE
{{MOV{R9{DNAMP{{RESET POINTER TO DELETE SCBLK
{{JSR{PRTST{{{PRINT INTEGER STRING
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{EXI{{{{RETURN TO PRTIN CALLER
{{ENP{{{{END PROCEDURE PRTIN
{{EJC{{{{
*
*      PRTMI -- PRINT MESSAGE AND INTEGER
*
*      PRTMI IS USED TO PRINT MESSAGES TOGETHER WITH AN INTEGER
*      VALUE STARTING IN COLUMN 15 (USED BY THE ROUTINES AT
*      THE END OF COMPILATION).
*
*      JSR  PRTMI            CALL TO PRINT MESSAGE AND INTEGER
*
{PRTMI{PRC{E{0{{ENTRY POINT
{{JSR{PRTST{{{PRINT STRING MESSAGE
{{MOV{#PRTMF{PROFS{{SET OFFSET TO COL 15
{{JSR{PRTIN{{{PRINT INTEGER
{{JSR{PRTNL{{{PRINT LINE
{{EXI{{{{RETURN TO PRTMI CALLER
{{ENP{{{{END PROCEDURE PRTMI
{{EJC{{{{
*
*      PRTMX  -- AS PRTMI WITH EXTRA COPY TO INTERACTIVE CHAN.
*
*      JSR  PRTMX            CALL FOR PRINTING
*      (WA,WB)               DESTROYED
*
{PRTMX{PRC{E{0{{ENTRY POINT
{{JSR{PRTST{{{PRINT STRING MESSAGE
{{MOV{#PRTMF{PROFS{{SET PTR TO COLUMN 15
{{JSR{PRTIN{{{PRINT INTEGER
{{JSR{PRTIS{{{PRINT LINE
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE PRTMX
{{EJC{{{{
*
*      PRTNL -- PRINT NEW LINE (END PRINT LINE)
*
*      PRTNL PRINTS THE CONTENTS OF THE PRINT BUFFER, RESETS
*      THE BUFFER TO ALL BLANKS AND RESETS THE PRINT POINTER.
*
*      JSR  PRTNL            CALL TO PRINT LINE
*
{PRTNL{PRC{R{0{{ENTRY POINT
{{BNZ{HEADP{PRNL0{{WERE HEADERS PRINTED
{{JSR{PRTPS{{{NO - PRINT THEM
*
*      CALL SYSPR
*
{PRNL0{MOV{R9{-(SP){{SAVE ENTRY XR
{{MOV{R6{PRTSA{{SAVE WA
{{MOV{R7{PRTSB{{SAVE WB
{{MOV{PRBUF{R9{{LOAD POINTER TO BUFFER
{{MOV{PROFS{R6{{LOAD NUMBER OF CHARS IN BUFFER
{{JSR{SYSPR{{{CALL SYSTEM PRINT ROUTINE
{{PPM{PRNL2{{{JUMP IF FAILED
{{LCT{R6{PRLNW{{LOAD LENGTH OF BUFFER IN WORDS
{{ADD{#4*SCHAR{R9{{POINT TO CHARS OF BUFFER
{{MOV{NULLW{R7{{GET WORD OF BLANKS
*
*      LOOP TO BLANK BUFFER
*
{PRNL1{MOV{R7{(R9)+{{STORE WORD OF BLANKS, BUMP PTR
{{BCT{R6{PRNL1{{LOOP TILL ALL BLANKED
*
*      EXIT POINT
*
{{MOV{PRTSB{R7{{RESTORE WB
{{MOV{PRTSA{R6{{RESTORE WA
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{ZER{PROFS{{{RESET PRINT BUFFER POINTER
{{EXI{{{{RETURN TO PRTNL CALLER
*
*      FILE FULL OR NO OUTPUT FILE FOR LOAD MODULE
*
{PRNL2{BNZ{PRTEF{PRNL3{{JUMP IF NOT FIRST TIME
{{MNZ{PRTEF{{{MARK FIRST OCCURRENCE
{{ERB{253{PRINT{{LIMIT EXCEEDED ON STANDARD OUTPUT CHANNEL
*
*      STOP AT ONCE
*
{PRNL3{MOV{#NINI8{R7{{ENDING CODE
{{MOV{KVSTN{R6{{STATEMENT NUMBER
{{JSR{SYSEJ{{{STOP
{{ENP{{{{END PROCEDURE PRTNL
{{EJC{{{{
*
*      PRTNM -- PRINT VARIABLE NAME
*
*      PRTNM IS USED TO PRINT A CHARACTER REPRESENTATION OF THE
*      NAME OF A VARIABLE (NOT A VALUE OF DATATYPE NAME)
*      NAMES OF PSEUDO-VARIABLES MAY NOT BE PASSED TO PRTNM.
*
*      (XL)                  NAME BASE
*      (WA)                  NAME OFFSET
*      JSR  PRTNM            CALL TO PRINT NAME
*      (WB,WC,RA)            DESTROYED
*
{PRTNM{PRC{R{0{{ENTRY POINT (RECURSIVE, SEE PRTVL)
{{MOV{R6{-(SP){{SAVE WA (OFFSET IS COLLECTABLE)
{{MOV{R9{-(SP){{SAVE ENTRY XR
{{MOV{R10{-(SP){{SAVE NAME BASE
{{BHI{R10{STATE{PRN02{JUMP IF NOT NATURAL VARIABLE
*
*      HERE FOR NATURAL VARIABLE NAME, RECOGNIZED BY THE FACT
*      THAT THE NAME BASE POINTS INTO THE STATIC AREA.
*
{{MOV{R10{R9{{POINT TO VRBLK
{{JSR{PRTVN{{{PRINT NAME OF VARIABLE
*
*      COMMON EXIT POINT
*
{PRN01{MOV{(SP)+{R10{{RESTORE NAME BASE
{{MOV{(SP)+{R9{{RESTORE ENTRY VALUE OF XR
{{MOV{(SP)+{R6{{RESTORE WA
{{EXI{{{{RETURN TO PRTNM CALLER
*
*      HERE FOR CASE OF NON-NATURAL VARIABLE
*
{PRN02{MOV{R6{R7{{COPY NAME OFFSET
{{BNE{(R10){#B$PDT{PRN03{JUMP IF ARRAY OR TABLE
*
*      FOR PROGRAM DEFINED DATATYPE, PRT FLD NAME, LEFT PAREN
*
{{MOV{4*PDDFP(R10){R9{{LOAD POINTER TO DFBLK
{{ADD{R6{R9{{ADD NAME OFFSET
{{MOV{4*PDFOF(R9){R9{{LOAD VRBLK POINTER FOR FIELD
{{JSR{PRTVN{{{PRINT FIELD NAME
{{MOV{#CH$PP{R6{{LOAD LEFT PAREN
{{JSR{PRTCH{{{PRINT CHARACTER
{{EJC{{{{
*
*      PRTNM (CONTINUED)
*
*      NOW WE PRINT AN IDENTIFYING NAME FOR THE OBJECT IF ONE
*      CAN BE FOUND. THE FOLLOWING CODE SEARCHES FOR A NATURAL
*      VARIABLE WHICH CONTAINS THIS OBJECT AS VALUE. IF SUCH A
*      VARIABLE IS FOUND, ITS NAME IS PRINTED, ELSE THE VALUE
*      OF THE OBJECT (AS PRINTED BY PRTVL) IS USED INSTEAD.
*
*      FIRST WE POINT TO THE PARENT TBBLK IF THIS IS THE CASE OF
*      A TABLE ELEMENT. TO DO THIS, CHASE DOWN THE TRNXT CHAIN.
*
{PRN03{BNE{(R10){#B$TET{PRN04{JUMP IF WE GOT THERE (OR NOT TE)
{{MOV{4*TENXT(R10){R10{{ELSE MOVE OUT ON CHAIN
{{BRN{PRN03{{{AND LOOP BACK
*
*      NOW WE ARE READY FOR THE SEARCH. TO SPEED THINGS UP IN
*      THE CASE OF CALLS FROM DUMP WHERE THE SAME NAME BASE
*      WILL OCCUR REPEATEDLY WHILE DUMPING AN ARRAY OR TABLE,
*      WE REMEMBER THE LAST VRBLK POINTER FOUND IN PRNMV. SO
*      FIRST CHECK TO SEE IF WE HAVE THIS ONE AGAIN.
*
{PRN04{MOV{PRNMV{R9{{POINT TO VRBLK WE FOUND LAST TIME
{{MOV{HSHTB{R6{{POINT TO HASH TABLE IN CASE NOT
{{BRN{PRN07{{{JUMP INTO SEARCH FOR SPECIAL CHECK
*
*      LOOP THROUGH HASH SLOTS
*
{PRN05{MOV{R6{R9{{COPY SLOT POINTER
{{ICA{R6{{{BUMP SLOT POINTER
{{SUB{#4*VRNXT{R9{{INTRODUCE STANDARD VRBLK OFFSET
*
*      LOOP THROUGH VRBLKS ON ONE HASH CHAIN
*
{PRN06{MOV{4*VRNXT(R9){R9{{POINT TO NEXT VRBLK ON HASH CHAIN
*
*      MERGE HERE FIRST TIME TO CHECK BLOCK WE FOUND LAST TIME
*
{PRN07{MOV{R9{R8{{COPY VRBLK POINTER
{{BZE{R8{PRN09{{JUMP IF CHAIN END (OR PRNMV ZERO)
{{EJC{{{{
*
*      PRTNM (CONTINUED)
*
*      LOOP TO FIND VALUE (CHASE DOWN POSSIBLE TRBLK CHAIN)
*
{PRN08{MOV{4*VRVAL(R9){R9{{LOAD VALUE
{{BEQ{(R9){#B$TRT{PRN08{LOOP IF THAT WAS A TRBLK
*
*      NOW WE HAVE THE VALUE, IS THIS THE BLOCK WE WANT
*
{{BEQ{R9{R10{PRN10{JUMP IF THIS MATCHES THE NAME BASE
{{MOV{R8{R9{{ELSE POINT BACK TO THAT VRBLK
{{BRN{PRN06{{{AND LOOP BACK
*
*      HERE TO MOVE TO NEXT HASH SLOT
*
{PRN09{BLT{R6{HSHTE{PRN05{LOOP BACK IF MORE TO GO
{{MOV{R10{R9{{ELSE NOT FOUND, COPY VALUE POINTER
{{JSR{PRTVL{{{PRINT VALUE
{{BRN{PRN11{{{AND MERGE AHEAD
*
*      HERE WHEN WE FIND A MATCHING ENTRY
*
{PRN10{MOV{R8{R9{{COPY VRBLK POINTER
{{MOV{R9{PRNMV{{SAVE FOR NEXT TIME IN
{{JSR{PRTVN{{{PRINT VARIABLE NAME
*
*      MERGE HERE IF NO ENTRY FOUND
*
{PRN11{MOV{(R10){R8{{LOAD FIRST WORD OF NAME BASE
{{BNE{R8{#B$PDT{PRN13{JUMP IF NOT PROGRAM DEFINED
*
*      FOR PROGRAM DEFINED DATATYPE, ADD RIGHT PAREN AND EXIT
*
{{MOV{#CH$RP{R6{{LOAD RIGHT PAREN, MERGE
*
*      MERGE HERE TO PRINT FINAL RIGHT PAREN OR BRACKET
*
{PRN12{JSR{PRTCH{{{PRINT FINAL CHARACTER
{{MOV{R7{R6{{RESTORE NAME OFFSET
{{BRN{PRN01{{{MERGE BACK TO EXIT
{{EJC{{{{
*
*      PRTNM (CONTINUED)
*
*      HERE FOR ARRAY OR TABLE
*
{PRN13{MOV{#CH$BB{R6{{LOAD LEFT BRACKET
{{JSR{PRTCH{{{AND PRINT IT
{{MOV{(SP){R10{{RESTORE BLOCK POINTER
{{MOV{(R10){R8{{LOAD TYPE WORD AGAIN
{{BNE{R8{#B$TET{PRN15{JUMP IF NOT TABLE
*
*      HERE FOR TABLE, PRINT SUBSCRIPT VALUE
*
{{MOV{4*TESUB(R10){R9{{LOAD SUBSCRIPT VALUE
{{MOV{R7{R10{{SAVE NAME OFFSET
{{JSR{PRTVL{{{PRINT SUBSCRIPT VALUE
{{MOV{R10{R7{{RESTORE NAME OFFSET
*
*      MERGE HERE FROM ARRAY CASE TO PRINT RIGHT BRACKET
*
{PRN14{MOV{#CH$RB{R6{{LOAD RIGHT BRACKET
{{BRN{PRN12{{{MERGE BACK TO PRINT IT
*
*      HERE FOR ARRAY OR VECTOR, TO PRINT SUBSCRIPT(S)
*
{PRN15{MOV{R7{R6{{COPY NAME OFFSET
{{BTW{R6{{{CONVERT TO WORDS
{{BEQ{R8{#B$ART{PRN16{JUMP IF ARBLK
*
*      HERE FOR VECTOR
*
{{SUB{#VCVLB{R6{{ADJUST FOR STANDARD FIELDS
{{MTI{R6{{{MOVE TO INTEGER ACCUM
{{JSR{PRTIN{{{PRINT LINEAR SUBSCRIPT
{{BRN{PRN14{{{MERGE BACK FOR RIGHT BRACKET
{{EJC{{{{
*
*      PRTNM (CONTINUED)
*
*      HERE FOR ARRAY. FIRST CALCULATE ABSOLUTE SUBSCRIPT
*      OFFSETS BY SUCCESSIVE DIVISIONS BY THE DIMENSION VALUES.
*      THIS MUST BE DONE RIGHT TO LEFT SINCE THE ELEMENTS ARE
*      STORED ROW-WISE. THE SUBSCRIPTS ARE STACKED AS INTEGERS.
*
{PRN16{MOV{4*AROFS(R10){R8{{LOAD LENGTH OF BOUNDS INFO
{{ICA{R8{{{ADJUST FOR ARPRO FIELD
{{BTW{R8{{{CONVERT TO WORDS
{{SUB{R8{R6{{GET LINEAR ZERO-ORIGIN SUBSCRIPT
{{MTI{R6{{{GET INTEGER VALUE
{{LCT{R6{4*ARNDM(R10){{SET NUM OF DIMENSIONS AS LOOP COUNT
{{ADD{4*AROFS(R10){R10{{POINT PAST BOUNDS INFORMATION
{{SUB{#4*ARLBD{R10{{SET OK OFFSET FOR PROPER PTR LATER
*
*      LOOP TO STACK SUBSCRIPT OFFSETS
*
{PRN17{SUB{#4*ARDMS{R10{{POINT TO NEXT SET OF BOUNDS
{{STI{PRNSI{{{SAVE CURRENT OFFSET
{{RMI{4*ARDIM(R10){{{GET REMAINDER ON DIVIDING BY DIMENS
{{MFI{-(SP){{{STORE ON STACK (ONE WORD)
{{LDI{PRNSI{{{RELOAD ARGUMENT
{{DVI{4*ARDIM(R10){{{DIVIDE TO GET QUOTIENT
{{BCT{R6{PRN17{{LOOP TILL ALL STACKED
{{ZER{R9{{{SET OFFSET TO FIRST SET OF BOUNDS
{{LCT{R7{4*ARNDM(R10){{LOAD COUNT OF DIMS TO CONTROL LOOP
{{BRN{PRN19{{{JUMP INTO PRINT LOOP
*
*      LOOP TO PRINT SUBSCRIPTS FROM STACK ADJUSTING BY ADDING
*      THE APPROPRIATE LOW BOUND VALUE FROM THE ARBLK
*
{PRN18{MOV{#CH$CM{R6{{LOAD A COMMA
{{JSR{PRTCH{{{PRINT IT
*
*      MERGE HERE FIRST TIME IN (NO COMMA REQUIRED)
*
{PRN19{MTI{(SP)+{{{LOAD SUBSCRIPT OFFSET AS INTEGER
{{ADD{R9{R10{{POINT TO CURRENT LBD
{{ADI{4*ARLBD(R10){{{ADD LBD TO GET SIGNED SUBSCRIPT
{{SUB{R9{R10{{POINT BACK TO START OF ARBLK
{{JSR{PRTIN{{{PRINT SUBSCRIPT
{{ADD{#4*ARDMS{R9{{BUMP OFFSET TO NEXT BOUNDS
{{BCT{R7{PRN18{{LOOP BACK TILL ALL PRINTED
{{BRN{PRN14{{{MERGE BACK TO PRINT RIGHT BRACKET
{{ENP{{{{END PROCEDURE PRTNM
{{EJC{{{{
*
*      PRTNV -- PRINT NAME VALUE
*
*      PRTNV IS USED BY THE TRACE AND DUMP ROUTINES TO PRINT
*      A LINE OF THE FORM
*
*      NAME = VALUE
*
*      NOTE THAT THE NAME INVOLVED CAN NEVER BE A PSEUDO-VAR
*
*      (XL)                  NAME BASE
*      (WA)                  NAME OFFSET
*      JSR  PRTNV            CALL TO PRINT NAME = VALUE
*      (WB,WC,RA)            DESTROYED
*
{PRTNV{PRC{E{0{{ENTRY POINT
{{JSR{PRTNM{{{PRINT ARGUMENT NAME
{{MOV{R9{-(SP){{SAVE ENTRY XR
{{MOV{R6{-(SP){{SAVE NAME OFFSET (COLLECTABLE)
{{MOV{#TMBEB{R9{{POINT TO BLANK EQUAL BLANK
{{JSR{PRTST{{{PRINT IT
{{MOV{R10{R9{{COPY NAME BASE
{{ADD{R6{R9{{POINT TO VALUE
{{MOV{(R9){R9{{LOAD VALUE POINTER
{{JSR{PRTVL{{{PRINT VALUE
{{JSR{PRTNL{{{TERMINATE LINE
{{MOV{(SP)+{R6{{RESTORE NAME OFFSET
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE PRTNV
{{EJC{{{{
*
*      PRTPG  -- PRINT A PAGE THROW
*
*      PRINTS A PAGE THROW OR A FEW BLANK LINES ON THE STANDARD
*      LISTING CHANNEL DEPENDING ON THE LISTING OPTIONS CHOSEN.
*
*      JSR  PRTPG            CALL FOR PAGE EJECT
*
{PRTPG{PRC{E{0{{ENTRY POINT
{{BEQ{STAGE{#STGXT{PRP01{JUMP IF EXECUTION TIME
{{BZE{LSTLC{PRP06{{RETURN IF TOP OF PAGE ALREADY
{{ZER{LSTLC{{{CLEAR LINE COUNT
*
*      CHECK TYPE OF LISTING
*
{PRP01{MOV{R9{-(SP){{PRESERVE XR
{{BNZ{PRSTD{PRP02{{EJECT IF FLAG SET
{{BNZ{PRICH{PRP03{{JUMP IF INTERACTIVE LISTING CHANNEL
{{BZE{PRECL{PRP03{{JUMP IF COMPACT LISTING
*
*      PERFORM AN EJECT
*
{PRP02{JSR{SYSEP{{{EJECT
{{BRN{PRP04{{{MERGE
*
*      COMPACT OR INTERACTIVE CHANNEL LISTING. CANT PRINT
*      BLANKS UNTIL CHECK MADE FOR HEADERS PRINTED AND FLAG SET.
*
*
{PRP03{MOV{HEADP{R9{{REMEMBER HEADP
{{MNZ{HEADP{{{SET TO AVOID REPEATED PRTPG CALLS
{{JSR{PRTNL{{{PRINT BLANK LINE
{{JSR{PRTNL{{{PRINT BLANK LINE
{{JSR{PRTNL{{{PRINT BLANK LINE
{{MOV{#NUM03{LSTLC{{COUNT BLANK LINES
{{MOV{R9{HEADP{{RESTORE HEADER FLAG
{{EJC{{{{
*
*      PRPTG (CONTINUED)
*
*      PRINT THE HEADING
*
{PRP04{BNZ{HEADP{PRP05{{JUMP IF HEADER LISTED
{{MNZ{HEADP{{{MARK HEADERS PRINTED
{{MOV{R10{-(SP){{KEEP XL
{{MOV{#HEADR{R9{{POINT TO LISTING HEADER
{{JSR{PRTST{{{PLACE IT
{{JSR{SYSID{{{GET SYSTEM IDENTIFICATION
{{JSR{PRTST{{{APPEND EXTRA CHARS
{{JSR{PRTNL{{{PRINT IT
{{MOV{R10{R9{{EXTRA HEADER LINE
{{JSR{PRTST{{{PLACE IT
{{JSR{PRTNL{{{PRINT IT
{{JSR{PRTNL{{{PRINT A BLANK
{{JSR{PRTNL{{{AND ANOTHER
{{ADD{#NUM04{LSTLC{{FOUR HEADER LINES PRINTED
{{MOV{(SP)+{R10{{RESTORE XL
*
*      MERGE IF HEADER NOT PRINTED
*
{PRP05{MOV{(SP)+{R9{{RESTORE XR
*
*      RETURN
*
{PRP06{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE PRTPG
{{EJC{{{{
*
*      PRTPS - PRINT PAGE WITH TEST FOR STANDARD LISTING OPTION
*
*      IF THE STANDARD LISTING OPTION IS SELECTED, INSIST THAT
*      AN EJECT BE DONE
*
*      JSR  PRTPS            CALL FOR EJECT
*
{PRTPS{PRC{E{0{{ENTRY POINT
{{MOV{PRSTO{PRSTD{{COPY OPTION FLAG
{{JSR{PRTPG{{{PRINT PAGE
{{ZER{PRSTD{{{CLEAR FLAG
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE PRTPS
{{EJC{{{{
*
*      PRTSN -- PRINT STATEMENT NUMBER
*
*      PRTSN IS USED TO INITIATE A PRINT TRACE LINE BY PRINTING
*      ASTERISKS AND THE CURRENT STATEMENT NUMBER. THE ACTUAL
*      FORMAT OF THE OUTPUT GENERATED IS.
*
*      ***NNNNN**** III.....IIII
*
*      NNNNN IS THE STATEMENT NUMBER WITH LEADING ZEROS REPLACED
*      BY ASTERISKS (E.G. *******9****)
*
*      III...III REPRESENTS A VARIABLE LENGTH OUTPUT CONSISTING
*      OF A NUMBER OF LETTER I CHARACTERS EQUAL TO FNCLEVEL.
*
*      JSR  PRTSN            CALL TO PRINT STATEMENT NUMBER
*      (WC)                  DESTROYED
*
{PRTSN{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{SAVE ENTRY XR
{{MOV{R6{PRSNA{{SAVE ENTRY WA
{{MOV{#TMASB{R9{{POINT TO ASTERISKS
{{JSR{PRTST{{{PRINT ASTERISKS
{{MOV{#NUM04{PROFS{{POINT INTO MIDDLE OF ASTERISKS
{{MTI{KVSTN{{{LOAD STATEMENT NUMBER AS INTEGER
{{JSR{PRTIN{{{PRINT INTEGER STATEMENT NUMBER
{{MOV{#PRSNF{PROFS{{POINT PAST ASTERISKS PLUS BLANK
{{MOV{KVFNC{R9{{GET FNCLEVEL
{{MOV{#CH$LI{R6{{SET LETTER I
*
*      LOOP TO GENERATE LETTER I FNCLEVEL TIMES
*
{PRSN1{BZE{R9{PRSN2{{JUMP IF ALL SET
{{JSR{PRTCH{{{ELSE PRINT AN I
{{DCV{R9{{{DECREMENT COUNTER
{{BRN{PRSN1{{{LOOP BACK
*
*      MERRE WITH ALL LETTER I CHARACTERS GENERATED
*
{PRSN2{MOV{#CH$BL{R6{{GET BLANK
{{JSR{PRTCH{{{PRINT BLANK
{{MOV{PRSNA{R6{{RESTORE ENTRY WA
{{MOV{(SP)+{R9{{RESTORE ENTRY XR
{{EXI{{{{RETURN TO PRTSN CALLER
{{ENP{{{{END PROCEDURE PRTSN
{{EJC{{{{
*
*      PRTST -- PRINT STRING
*
*      PRTST PLACES A STRING OF CHARACTERS IN THE PRINT BUFFER
*
*      SEE PRTNL FOR GLOBAL LOCATIONS USED
*
*      NOTE THAT THE FIRST WORD OF THE BLOCK (NORMALLY B$SCL)
*      IS NOT USED AND NEED NOT BE SET CORRECTLY (SEE PRTVN)
*
*      (XR)                  STRING TO BE PRINTED
*      JSR  PRTST            CALL TO PRINT STRING
*      (PROFS)               UPDATED PAST CHARS PLACED
*
{PRTST{PRC{R{0{{ENTRY POINT
{{BNZ{HEADP{PRST0{{WERE HEADERS PRINTED
{{JSR{PRTPS{{{NO - PRINT THEM
*
*      CALL SYSPR
*
{PRST0{MOV{R6{PRSVA{{SAVE WA
{{MOV{R7{PRSVB{{SAVE WB
{{ZER{R7{{{SET CHARS PRINTED COUNT TO ZERO
*
*      LOOP TO PRINT SUCCESSIVE LINES FOR LONG STRING
*
{PRST1{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
{{SUB{R7{R6{{SUBTRACT COUNT OF CHARS ALREADY OUT
{{BZE{R6{PRST4{{JUMP TO EXIT IF NONE LEFT
{{MOV{R10{-(SP){{ELSE STACK ENTRY XL
{{MOV{R9{-(SP){{SAVE ARGUMENT
{{MOV{R9{R10{{COPY FOR EVENTUAL MOVE
{{MOV{PRLEN{R9{{LOAD PRINT BUFFER LENGTH
{{SUB{PROFS{R9{{GET CHARS LEFT IN PRINT BUFFER
{{BNZ{R9{PRST2{{SKIP IF ROOM LEFT ON THIS LINE
{{JSR{PRTNL{{{ELSE PRINT THIS LINE
{{MOV{PRLEN{R9{{AND SET FULL WIDTH AVAILABLE
{{EJC{{{{
*
*      PRTST (CONTINUED)
*
*      HERE WITH CHARS TO PRINT AND SOME ROOM IN BUFFER
*
{PRST2{BLO{R6{R9{PRST3{JUMP IF ROOM FOR REST OF STRING
{{MOV{R9{R6{{ELSE SET TO FILL LINE
*
*      MERGE HERE WITH CHARACTER COUNT IN WA
*
{PRST3{MOV{PRBUF{R9{{POINT TO PRINT BUFFER
{{PLC{R10{R7{{POINT TO LOCATION IN STRING
{{PSC{R9{PROFS{{POINT TO LOCATION IN BUFFER
{{ADD{R6{R7{{BUMP STRING CHARS COUNT
{{ADD{R6{PROFS{{BUMP BUFFER POINTER
{{MOV{R7{PRSVC{{PRESERVE CHAR COUNTER
{{MVC{{{{MOVE CHARACTERS TO BUFFER
{{MOV{PRSVC{R7{{RECOVER CHAR COUNTER
{{MOV{(SP)+{R9{{RESTORE ARGUMENT POINTER
{{MOV{(SP)+{R10{{RESTORE ENTRY XL
{{BRN{PRST1{{{LOOP BACK TO TEST FOR MORE
*
*      HERE TO EXIT AFTER PRINTING STRING
*
{PRST4{MOV{PRSVB{R7{{RESTORE ENTRY WB
{{MOV{PRSVA{R6{{RESTORE ENTRY WA
{{EXI{{{{RETURN TO PRTST CALLER
{{ENP{{{{END PROCEDURE PRTST
{{EJC{{{{
*
*      PRTTR -- PRINT TO TERMINAL
*
*      CALLED TO PRINT CONTENTS OF STANDARD PRINT BUFFER TO
*      ONLINE TERMINAL. CLEARS BUFFER DOWN AND RESETS PROFS.
*
*      JSR  PRTTR            CALL FOR PRINT
*      (WA,WB)               DESTROYED
*
{PRTTR{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{SAVE XR
{{JSR{PRTIC{{{PRINT BUFFER CONTENTS
{{MOV{PRBUF{R9{{POINT TO PRINT BFR TO CLEAR IT
{{LCT{R6{PRLNW{{GET BUFFER LENGTH
{{ADD{#4*SCHAR{R9{{POINT PAST SCBLK HEADER
{{MOV{NULLW{R7{{GET BLANKS
*
*      LOOP TO CLEAR BUFFER
*
{PRTT1{MOV{R7{(R9)+{{CLEAR A WORD
{{BCT{R6{PRTT1{{LOOP
{{ZER{PROFS{{{RESET PROFS
{{MOV{(SP)+{R9{{RESTORE XR
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE PRTTR
{{EJC{{{{
*
*      PRTVL -- PRINT A VALUE
*
*      PRTVL PLACES AN APPROPRIATE CHARACTER REPRESENTATION OF
*      A DATA VALUE IN THE PRINT BUFFER FOR DUMP/TRACE USE.
*
*      (XR)                  VALUE TO BE PRINTED
*      JSR  PRTVL            CALL TO PRINT VALUE
*      (WA,WB,WC,RA)         DESTROYED
*
{PRTVL{PRC{R{0{{ENTRY POINT, RECURSIVE
{{MOV{R10{-(SP){{SAVE ENTRY XL
{{MOV{R9{-(SP){{SAVE ARGUMENT
{{CHK{{{{CHECK FOR STACK OVERFLOW
*
*      LOOP BACK HERE AFTER FINDING A TRAP BLOCK (TRBLK)
*
{PRV01{MOV{4*IDVAL(R9){PRVSI{{COPY IDVAL (IF ANY)
{{MOV{(R9){R10{{LOAD FIRST WORD OF BLOCK
{{LEI{R10{{{LOAD ENTRY POINT ID
{{BSW{R10{BL$$T{PRV02{SWITCH ON BLOCK TYPE
{{IFF{BL$AR{PRV05{{ARBLK
{{IFF{BL$BC{PRV15{{BCBLK
{{IFF{DUMMY{PRV02{{
{{IFF{DUMMY{PRV02{{
{{IFF{BL$IC{PRV08{{ICBLK
{{IFF{BL$NM{PRV09{{NMBLK
{{IFF{DUMMY{PRV02{{
{{IFF{DUMMY{PRV02{{
{{IFF{DUMMY{PRV02{{
{{IFF{BL$RC{PRV08{{RCBLK
{{IFF{BL$SC{PRV11{{SCBLK
{{IFF{BL$SE{PRV12{{SEBLK
{{IFF{BL$TB{PRV13{{TBBLK
{{IFF{BL$VC{PRV13{{VCBLK
{{IFF{DUMMY{PRV02{{
{{IFF{DUMMY{PRV02{{
{{IFF{BL$PD{PRV10{{PDBLK
{{IFF{BL$TR{PRV04{{TRBLK
{{ESW{{{{END OF SWITCH ON BLOCK TYPE
*
*      HERE FOR BLOCKS FOR WHICH WE JUST PRINT DATATYPE NAME
*
{PRV02{JSR{DTYPE{{{GET DATATYPE NAME
{{JSR{PRTST{{{PRINT DATATYPE NAME
*
*      COMMON EXIT POINT
*
{PRV03{MOV{(SP)+{R9{{RELOAD ARGUMENT
{{MOV{(SP)+{R10{{RESTORE XL
{{EXI{{{{RETURN TO PRTVL CALLER
*
*      HERE FOR TRBLK
*
{PRV04{MOV{4*TRVAL(R9){R9{{LOAD REAL VALUE
{{BRN{PRV01{{{AND LOOP BACK
{{EJC{{{{
*
*      PRTVL (CONTINUED)
*
*      HERE FOR ARRAY (ARBLK)
*
*      PRINT ARRAY ( PROTOTYPE ) BLANK NUMBER IDVAL
*
{PRV05{MOV{R9{R10{{PRESERVE ARGUMENT
{{MOV{#SCARR{R9{{POINT TO DATATYPE NAME (ARRAY)
{{JSR{PRTST{{{PRINT IT
{{MOV{#CH$PP{R6{{LOAD LEFT PAREN
{{JSR{PRTCH{{{PRINT LEFT PAREN
{{ADD{4*AROFS(R10){R10{{POINT TO PROTOTYPE
{{MOV{(R10){R9{{LOAD PROTOTYPE
{{JSR{PRTST{{{PRINT PROTOTYPE
*
*      VCBLK, TBBLK, BCBLK MERGE HERE FOR ) BLANK NUMBER IDVAL
*
{PRV06{MOV{#CH$RP{R6{{LOAD RIGHT PAREN
{{JSR{PRTCH{{{PRINT RIGHT PAREN
*
*      PDBLK MERGES HERE TO PRINT BLANK NUMBER IDVAL
*
{PRV07{MOV{#CH$BL{R6{{LOAD BLANK
{{JSR{PRTCH{{{PRINT IT
{{MOV{#CH$NM{R6{{LOAD NUMBER SIGN
{{JSR{PRTCH{{{PRINT IT
{{MTI{PRVSI{{{GET IDVAL
{{JSR{PRTIN{{{PRINT ID NUMBER
{{BRN{PRV03{{{BACK TO EXIT
*
*      HERE FOR INTEGER (ICBLK), REAL (RCBLK)
*
*      PRINT CHARACTER REPRESENTATION OF VALUE
*
{PRV08{MOV{R9{-(SP){{STACK ARGUMENT FOR GTSTG
{{JSR{GTSTG{{{CONVERT TO STRING
{{PPM{{{{ERROR RETURN IS IMPOSSIBLE
{{JSR{PRTST{{{PRINT THE STRING
{{MOV{R9{DNAMP{{DELETE GARBAGE STRING FROM STORAGE
{{BRN{PRV03{{{BACK TO EXIT
{{EJC{{{{
*
*      PRTVL (CONTINUED)
*
*      NAME (NMBLK)
*
*      FOR PSEUDO-VARIABLE, JUST PRINT DATATYPE NAME (NAME)
*      FOR ALL OTHER NAMES, PRINT DOT FOLLOWED BY NAME REP
*
{PRV09{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
{{MOV{(R10){R6{{LOAD FIRST WORD OF BLOCK
{{BEQ{R6{#B$KVT{PRV02{JUST PRINT NAME IF KEYWORD
{{BEQ{R6{#B$EVT{PRV02{JUST PRINT NAME IF EXPRESSION VAR
{{MOV{#CH$DT{R6{{ELSE GET DOT
{{JSR{PRTCH{{{AND PRINT IT
{{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET
{{JSR{PRTNM{{{PRINT NAME
{{BRN{PRV03{{{BACK TO EXIT
*
*      PROGRAM DATATYPE (PDBLK)
*
*      PRINT DATATYPE NAME CH$BL CH$NM IDVAL
*
{PRV10{JSR{DTYPE{{{GET DATATYPE NAME
{{JSR{PRTST{{{PRINT DATATYPE NAME
{{BRN{PRV07{{{MERGE BACK TO PRINT ID
*
*      HERE FOR STRING (SCBLK)
*
*      PRINT QUOTE STRING-CHARACTERS QUOTE
*
{PRV11{MOV{#CH$SQ{R6{{LOAD SINGLE QUOTE
{{JSR{PRTCH{{{PRINT QUOTE
{{JSR{PRTST{{{PRINT STRING VALUE
{{JSR{PRTCH{{{PRINT ANOTHER QUOTE
{{BRN{PRV03{{{BACK TO EXIT
{{EJC{{{{
*
*      PRTVL (CONTINUED)
*
*      HERE FOR SIMPLE EXPRESSION (SEBLK)
*
*      PRINT ASTERISK VARIABLE-NAME
*
{PRV12{MOV{#CH$AS{R6{{LOAD ASTERISK
{{JSR{PRTCH{{{PRINT ASTERISK
{{MOV{4*SEVAR(R9){R9{{LOAD VARIABLE POINTER
{{JSR{PRTVN{{{PRINT VARIABLE NAME
{{BRN{PRV03{{{JUMP BACK TO EXIT
*
*      HERE FOR TABLE (TBBLK) AND ARRAY (VCBLK)
*
*      PRINT DATATYPE ( PROTOTYPE ) BLANK NUMBER IDVAL
*
{PRV13{MOV{R9{R10{{PRESERVE ARGUMENT
{{JSR{DTYPE{{{GET DATATYPE NAME
{{JSR{PRTST{{{PRINT DATATYPE NAME
{{MOV{#CH$PP{R6{{LOAD LEFT PAREN
{{JSR{PRTCH{{{PRINT LEFT PAREN
{{MOV{4*TBLEN(R10){R6{{LOAD LENGTH OF BLOCK (=VCLEN)
{{BTW{R6{{{CONVERT TO WORD COUNT
{{SUB{#TBSI${R6{{ALLOW FOR STANDARD FIELDS
{{BEQ{(R10){#B$TBT{PRV14{JUMP IF TABLE
{{ADD{#VCTBD{R6{{FOR VCBLK, ADJUST SIZE
*
*      PRINT PROTOTYPE
*
{PRV14{MTI{R6{{{MOVE AS INTEGER
{{JSR{PRTIN{{{PRINT INTEGER PROTOTYPE
{{BRN{PRV06{{{MERGE BACK FOR REST
{{EJC{{{{
*
*      PRTVL (CONTINUED)
*
*      HERE FOR BUFFER (BCBLK)
*
{PRV15{MOV{R9{R10{{PRESERVE ARGUMENT
{{MOV{#SCBUF{R9{{POINT TO DATATYPE NAME (BUFFER)
{{JSR{PRTST{{{PRINT IT
{{MOV{#CH$PP{R6{{LOAD LEFT PAREN
{{JSR{PRTCH{{{PRINT LEFT PAREN
{{MOV{4*BCBUF(R10){R9{{POINT TO BFBLK
{{MTI{4*BFALC(R9){{{LOAD ALLOCATION SIZE
{{JSR{PRTIN{{{PRINT IT
{{MOV{#CH$CM{R6{{LOAD COMMA
{{JSR{PRTCH{{{PRINT IT
{{MTI{4*BCLEN(R10){{{LOAD DEFINED LENGTH
{{JSR{PRTIN{{{PRINT IT
{{BRN{PRV06{{{MERGE TO FINISH UP
{{ENP{{{{END PROCEDURE PRTVL
{{EJC{{{{
*
*      PRTVN -- PRINT NATURAL VARIABLE NAME
*
*      PRTVN PRINTS THE NAME OF A NATURAL VARIABLE
*
*      (XR)                  POINTER TO VRBLK
*      JSR  PRTVN            CALL TO PRINT VARIABLE NAME
*
{PRTVN{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{STACK VRBLK POINTER
{{ADD{#4*VRSOF{R9{{POINT TO POSSIBLE STRING NAME
{{BNZ{4*SCLEN(R9){PRVN1{{JUMP IF NOT SYSTEM VARIABLE
{{MOV{4*VRSVO(R9){R9{{POINT TO SVBLK WITH NAME
*
*      MERGE HERE WITH DUMMY SCBLK POINTER IN XR
*
{PRVN1{JSR{PRTST{{{PRINT STRING NAME OF VARIABLE
{{MOV{(SP)+{R9{{RESTORE VRBLK POINTER
{{EXI{{{{RETURN TO PRTVN CALLER
{{ENP{{{{END PROCEDURE PRTVN
{{EJC{{{{
*
*      RCBLD -- BUILD A REAL BLOCK
*
*      (RA)                  REAL VALUE FOR RCBLK
*      JSR  RCBLD            CALL TO BUILD REAL BLOCK
*      (XR)                  POINTER TO RESULT RCBLK
*      (WA)                  DESTROYED
*
{RCBLD{PRC{E{0{{ENTRY POINT
{{MOV{DNAMP{R9{{LOAD POINTER TO NEXT AVAILABLE LOC
{{ADD{#4*RCSI${R9{{POINT PAST NEW RCBLK
{{BLO{R9{DNAME{RCBL1{JUMP IF THERE IS ROOM
{{MOV{#4*RCSI${R6{{ELSE LOAD RCBLK LENGTH
{{JSR{ALLOC{{{USE STANDARD ALLOCATOR TO GET BLOCK
{{ADD{R6{R9{{POINT PAST BLOCK TO MERGE
*
*      MERGE HERE WITH XR POINTING PAST THE BLOCK OBTAINED
*
{RCBL1{MOV{R9{DNAMP{{SET NEW POINTER
{{SUB{#4*RCSI${R9{{POINT BACK TO START OF BLOCK
{{MOV{#B$RCL{(R9){{STORE TYPE WORD
{{STR{4*RCVAL(R9){{{STORE REAL VALUE IN RCBLK
{{EXI{{{{RETURN TO RCBLD CALLER
{{ENP{{{{END PROCEDURE RCBLD
{{EJC{{{{
*
*      READR -- READ NEXT SOURCE IMAGE AT COMPILE TIME
*
*      READR IS USED TO READ THE NEXT SOURCE IMAGE. TO PROCESS
*      CONTINUATION CARDS PROPERLY, THE COMPILER MUST READ ONE
*      LINE AHEAD. THUS READR DOES NOT DESTROY THE CURRENT IMAGE
*      SEE ALSO THE NEXTS ROUTINE WHICH ACTUALLY GETS THE IMAGE.
*
*      JSR  READR            CALL TO READ NEXT IMAGE
*      (XR)                  PTR TO NEXT IMAGE (0 IF NONE)
*      (R$CNI)               COPY OF POINTER
*      (WA,WB,WC,XL)         DESTROYED
*
{READR{PRC{E{0{{ENTRY POINT
{{MOV{R$CNI{R9{{GET PTR TO NEXT IMAGE
{{BNZ{R9{READ3{{EXIT IF ALREADY READ
{{BNE{STAGE{#STGIC{READ3{EXIT IF NOT INITIAL COMPILE
{{MOV{CSWIN{R6{{MAX READ LENGTH
{{JSR{ALOCS{{{ALLOCATE BUFFER
{{JSR{SYSRD{{{READ INPUT IMAGE
{{PPM{READ4{{{JUMP IF END OF FILE
{{MNZ{R7{{{SET TRIMR TO PERFORM TRIM
{{BLE{4*SCLEN(R9){CSWIN{READ1{USE SMALLER OF STRING LNTH ..
{{MOV{CSWIN{4*SCLEN(R9){{... AND XXX OF -INXXX
*
*      PERFORM THE TRIM
*
{READ1{JSR{TRIMR{{{TRIM TRAILING BLANKS
*
*      MERGE HERE AFTER READ
*
{READ2{MOV{R9{R$CNI{{STORE COPY OF POINTER
*
*      MERGE HERE IF NO READ ATTEMPTED
*
{READ3{EXI{{{{RETURN TO READR CALLER
*
*      HERE ON END OF FILE
*
{READ4{MOV{R9{DNAMP{{POP UNUSED SCBLK
{{ZER{R9{{{ZERO PTR AS RESULT
{{BRN{READ2{{{MERGE
{{ENP{{{{END PROCEDURE READR
{{EJC{{{{
*
*      SBSTR -- BUILD A SUBSTRING
*
*      (XL)                  PTR TO SCBLK/BFBLK WITH CHARS
*      (WA)                  NUMBER OF CHARS IN SUBSTRING
*      (WB)                  OFFSET TO FIRST CHAR IN SCBLK
*      JSR  SBSTR            CALL TO BUILD SUBSTRING
*      (XR)                  PTR TO NEW SCBLK WITH SUBSTRING
*      (XL)                  ZERO
*      (WA,WB,WC,XL,IA)      DESTROYED
*
*      NOTE THAT SBSTR IS CALLED WITH A DUMMY STRING POINTER
*      (POINTING INTO A VRBLK OR SVBLK) TO COPY THE NAME OF A
*      VARIABLE AS A STANDARD STRING VALUE.
*
{SBSTR{PRC{E{0{{ENTRY POINT
{{BZE{R6{SBST2{{JUMP IF NULL SUBSTRING
{{JSR{ALOCS{{{ELSE ALLOCATE SCBLK
{{MOV{R8{R6{{MOVE NUMBER OF CHARACTERS
{{MOV{R9{R8{{SAVE PTR TO NEW SCBLK
{{PLC{R10{R7{{PREPARE TO LOAD CHARS FROM OLD BLK
{{PSC{R9{{{PREPARE TO STORE CHARS IN NEW BLK
{{MVC{{{{MOVE CHARACTERS TO NEW STRING
{{MOV{R8{R9{{THEN RESTORE SCBLK POINTER
*
*      RETURN POINT
*
{SBST1{ZER{R10{{{CLEAR GARBAGE POINTER IN XL
{{EXI{{{{RETURN TO SBSTR CALLER
*
*      HERE FOR NULL SUBSTRING
*
{SBST2{MOV{#NULLS{R9{{SET NULL STRING AS RESULT
{{BRN{SBST1{{{RETURN
{{ENP{{{{END PROCEDURE SBSTR
{{EJC{{{{
*
*      SCANE -- SCAN AN ELEMENT
*
*      SCANE IS CALLED AT COMPILE TIME (BY EXPAN ,CMPIL,CNCRD)
*      TO SCAN ONE ELEMENT FROM THE INPUT IMAGE.
*
*      (SCNCC)               NON-ZERO IF CALLED FROM CNCRD
*      JSR  SCANE            CALL TO SCAN ELEMENT
*      (XR)                  RESULT POINTER (SEE BELOW)
*      (XL)                  SYNTAX TYPE CODE (T$XXX)
*
*      THE FOLLOWING GLOBAL LOCATIONS ARE USED.
*
*      R$CIM                 POINTER TO STRING BLOCK (SCBLK)
*                            FOR CURRENT INPUT IMAGE.
*
*      R$CNI                 POINTER TO NEXT INPUT IMAGE STRING
*                            POINTER (ZERO IF NONE).
*
*      R$SCP                 SAVE POINTER (EXIT XR) FROM LAST
*                            CALL IN CASE RESCAN IS SET.
*
*      SCNBL                 THIS LOCATION IS SET NON-ZERO ON
*                            EXIT IF SCANE SCANNED PAST BLANKS
*                            BEFORE LOCATING THE CURRENT ELEMENT
*                            THE END OF A LINE COUNTS AS BLANKS.
*
*      SCNCC                 CNCRD SETS THIS NON-ZERO TO SCAN
*                            CONTROL CARD NAMES AND CLEARS IT
*                            ON RETURN
*
*      SCNIL                 LENGTH OF CURRENT INPUT IMAGE
*
*      SCNGO                 IF SET NON-ZERO ON ENTRY, F AND S
*                            ARE RETURNED AS SEPARATE SYNTAX
*                            TYPES (NOT LETTERS) (GOTO PRO-
*                            CESSING). SCNGO IS RESET ON EXIT.
*
*      SCNPT                 OFFSET TO CURRENT LOC IN R$CIM
*
*      SCNRS                 IF SET NON-ZERO ON ENTRY, SCANE
*                            RETURNS THE SAME RESULT AS ON THE
*                            LAST CALL (RESCAN). SCNRS IS RESET
*                            ON EXIT FROM ANY CALL TO SCANE.
*
*      SCNTP                 SAVE SYNTAX TYPE FROM LAST
*                            CALL (IN CASE RESCAN IS SET).
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*
*
*      ELEMENT SCANNED       XL        XR
*      ---------------       --        --
*
*      CONTROL CARD NAME     0         POINTER TO SCBLK FOR NAME
*
*      UNARY OPERATOR        T$UOP     PTR TO OPERATOR DVBLK
*
*      LEFT PAREN            T$LPR     T$LPR
*
*      LEFT BRACKET          T$LBR     T$LBR
*
*      COMMA                 T$CMA     T$CMA
*
*      FUNCTION CALL         T$FNC     PTR TO FUNCTION VRBLK
*
*      VARIABLE              T$VAR     PTR TO VRBLK
*
*      STRING CONSTANT       T$CON     PTR TO SCBLK
*
*      INTEGER CONSTANT      T$CON     PTR TO ICBLK
*
*      REAL CONSTANT         T$CON     PTR TO RCBLK
*
*      BINARY OPERATOR       T$BOP     PTR TO OPERATOR DVBLK
*
*      RIGHT PAREN           T$RPR     T$RPR
*
*      RIGHT BRACKET         T$RBR     T$RBR
*
*      COLON                 T$COL     T$COL
*
*      SEMI-COLON            T$SMC     T$SMC
*
*      F (SCNGO NE 0)        T$FGO     T$FGO
*
*      S (SCNGO NE 0)        T$SGO     T$SGO
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      ENTRY POINT
*
{SCANE{PRC{E{0{{ENTRY POINT
{{ZER{SCNBL{{{RESET BLANKS FLAG
{{MOV{R6{SCNSA{{SAVE WA
{{MOV{R7{SCNSB{{SAVE WB
{{MOV{R8{SCNSC{{SAVE WC
{{BZE{SCNRS{SCN03{{JUMP IF NO RESCAN
*
*      HERE FOR RESCAN REQUEST
*
{{MOV{SCNTP{R10{{SET PREVIOUS RETURNED SCAN TYPE
{{MOV{R$SCP{R9{{SET PREVIOUS RETURNED POINTER
{{ZER{SCNRS{{{RESET RESCAN SWITCH
{{BRN{SCN13{{{JUMP TO EXIT
*
*      COME HERE TO READ NEW IMAGE TO TEST FOR CONTINUATION
*
{SCN01{JSR{READR{{{READ NEXT IMAGE
{{MOV{#4*DVUBS{R7{{SET WB FOR NOT READING NAME
{{BZE{R9{SCN30{{TREAT AS SEMI-COLON IF NONE
{{PLC{R9{{{ELSE POINT TO FIRST CHARACTER
{{LCH{R8{(R9){{LOAD FIRST CHARACTER
{{BEQ{R8{#CH$DT{SCN02{JUMP IF DOT FOR CONTINUATION
{{BNE{R8{#CH$PL{SCN30{ELSE TREAT AS SEMICOLON UNLESS PLUS
*
*      HERE FOR CONTINUATION LINE
*
{SCN02{JSR{NEXTS{{{ACQUIRE NEXT SOURCE IMAGE
{{MOV{#NUM01{SCNPT{{SET SCAN POINTER PAST CONTINUATION
{{MNZ{SCNBL{{{SET BLANKS FLAG
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      MERGE HERE TO SCAN NEXT ELEMENT ON CURRENT LINE
*
{SCN03{MOV{SCNPT{R6{{LOAD CURRENT OFFSET
{{BEQ{R6{SCNIL{SCN01{CHECK CONTINUATION IF END
{{MOV{R$CIM{R10{{POINT TO CURRENT LINE
{{PLC{R10{R6{{POINT TO CURRENT CHARACTER
{{MOV{R6{SCNSE{{SET START OF ELEMENT LOCATION
{{MOV{#OPDVS{R8{{POINT TO OPERATOR DV LIST
{{MOV{#4*DVUBS{R7{{SET CONSTANT FOR OPERATOR CIRCUIT
{{BRN{SCN06{{{START SCANNING
*
*      LOOP HERE TO IGNORE LEADING BLANKS AND TABS
*
{SCN05{BZE{R7{SCN10{{JUMP IF TRAILING
{{ICV{SCNSE{{{INCREMENT START OF ELEMENT
{{BEQ{R6{SCNIL{SCN01{JUMP IF END OF IMAGE
{{MNZ{SCNBL{{{NOTE BLANKS SEEN
*
*      THE FOLLOWING JUMP IS USED REPEATEDLY FOR SCANNING OUT
*      THE CHARACTERS OF A NUMERIC CONSTANT OR VARIABLE NAME.
*      THE REGISTERS ARE USED AS FOLLOWS.
*
*      (XR)                  SCRATCH
*      (XL)                  PTR TO NEXT CHARACTER
*      (WA)                  CURRENT SCAN OFFSET
*      (WB)                  *DVUBS (0 IF SCANNING NAME,CONST)
*      (WC)                  =OPDVS (0 IF SCANNING CONSTANT)
*
{SCN06{LCH{R9{(R10)+{{GET NEXT CHARACTER
{{ICV{R6{{{BUMP SCAN OFFSET
{{MOV{R6{SCNPT{{STORE OFFSET PAST CHAR SCANNED
{{BLO{#CFP$U{R9{SCN07{QUICK CHECK FOR OTHER CHAR
{{BSW{R9{CFP$U{SCN07{SWITCH ON SCANNED CHARACTER
*
*      SWITCH TABLE FOR SWITCH ON CHARACTER
*
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{CH$HT{SCN05{{HORIZONTAL TAB
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{DUMMY{SCN07{{
{{IFF{CH$BL{SCN05{{BLANK
{{IFF{CH$EX{SCN37{{EXCLAMATION MARK
{{IFF{CH$DQ{SCN17{{DOUBLE QUOTE
{{IFF{CH$NM{SCN41{{NUMBER SIGN
{{IFF{CH$DL{SCN36{{DOLLAR
{{IFF{CH$PC{SCN38{{PERCENT
{{IFF{CH$AM{SCN44{{AMPERSAND
{{IFF{CH$SQ{SCN16{{SINGLE QUOTE
{{IFF{CH$PP{SCN25{{LEFT PAREN
{{IFF{CH$RP{SCN26{{RIGHT PAREN
{{IFF{CH$AS{SCN49{{ASTERISK
{{IFF{CH$PL{SCN33{{PLUS
{{IFF{CH$CM{SCN31{{COMMA
{{IFF{CH$MN{SCN34{{MINUS
{{IFF{CH$DT{SCN32{{DOT
{{IFF{CH$SL{SCN40{{SLASH
{{IFF{CH$D0{SCN08{{DIGIT 0
{{IFF{CH$D1{SCN08{{DIGIT 1
{{IFF{CH$D2{SCN08{{DIGIT 2
{{IFF{CH$D3{SCN08{{DIGIT 3
{{IFF{CH$D4{SCN08{{DIGIT 4
{{IFF{CH$D5{SCN08{{DIGIT 5
{{IFF{CH$D6{SCN08{{DIGIT 6
{{IFF{CH$D7{SCN08{{DIGIT 7
{{IFF{CH$D8{SCN08{{DIGIT 8
{{IFF{CH$D9{SCN08{{DIGIT 9
{{IFF{CH$CL{SCN29{{COLON
{{IFF{CH$SM{SCN30{{SEMI-COLON
{{IFF{CH$BB{SCN28{{LEFT BRACKET
{{IFF{CH$EQ{SCN46{{EQUAL
{{IFF{CH$RB{SCN27{{RIGHT BRACKET
{{IFF{CH$QU{SCN45{{QUESTION MARK
{{IFF{CH$AT{SCN42{{AT
{{IFF{CH$LA{SCN09{{LETTER A
{{IFF{CH$LB{SCN09{{LETTER B
{{IFF{CH$LC{SCN09{{LETTER C
{{IFF{CH$LD{SCN09{{LETTER D
{{IFF{CH$LE{SCN09{{LETTER E
{{IFF{CH$LF{SCN20{{LETTER F
{{IFF{CH$LG{SCN09{{LETTER G
{{IFF{CH$LH{SCN09{{LETTER H
{{IFF{CH$LI{SCN09{{LETTER I
{{IFF{CH$LJ{SCN09{{LETTER J
{{IFF{CH$LK{SCN09{{LETTER K
{{IFF{CH$LL{SCN09{{LETTER L
{{IFF{CH$LM{SCN09{{LETTER M
{{IFF{CH$LN{SCN09{{LETTER N
{{IFF{CH$LO{SCN09{{LETTER O
{{IFF{CH$LP{SCN09{{LETTER P
{{IFF{CH$LQ{SCN09{{LETTER Q
{{IFF{CH$LR{SCN09{{LETTER R
{{IFF{CH$LS{SCN21{{LETTER S
{{IFF{CH$LT{SCN09{{LETTER T
{{IFF{CH$LU{SCN09{{LETTER U
{{IFF{CH$LV{SCN09{{LETTER V
{{IFF{CH$LW{SCN09{{LETTER W
{{IFF{CH$LX{SCN09{{LETTER X
{{IFF{CH$LY{SCN09{{LETTER Y
{{IFF{CH$L${SCN09{{LETTER Z
{{IFF{CH$OB{SCN28{{LEFT BRACKET
{{IFF{DUMMY{SCN07{{
{{IFF{CH$CB{SCN27{{RIGHT BRACKET
{{IFF{DUMMY{SCN07{{
{{IFF{CH$UN{SCN24{{UNDERLINE
{{IFF{DUMMY{SCN07{{
{{IFF{CH$$A{SCN09{{SHIFTED A
{{IFF{CH$$B{SCN09{{SHIFTED B
{{IFF{CH$$C{SCN09{{SHIFTED C
{{IFF{CH$$D{SCN09{{SHIFTED D
{{IFF{CH$$E{SCN09{{SHIFTED E
{{IFF{CH$$F{SCN20{{SHIFTED F
{{IFF{CH$$G{SCN09{{SHIFTED G
{{IFF{CH$$H{SCN09{{SHIFTED H
{{IFF{CH$$I{SCN09{{SHIFTED I
{{IFF{CH$$J{SCN09{{SHIFTED J
{{IFF{CH$$K{SCN09{{SHIFTED K
{{IFF{CH$$L{SCN09{{SHIFTED L
{{IFF{CH$$M{SCN09{{SHIFTED M
{{IFF{CH$$N{SCN09{{SHIFTED N
{{IFF{CH$$O{SCN09{{SHIFTED O
{{IFF{CH$$P{SCN09{{SHIFTED P
{{IFF{CH$$Q{SCN09{{SHIFTED Q
{{IFF{CH$$R{SCN09{{SHIFTED R
{{IFF{CH$$S{SCN21{{SHIFTED S
{{IFF{CH$$T{SCN09{{SHIFTED T
{{IFF{CH$$U{SCN09{{SHIFTED U
{{IFF{CH$$V{SCN09{{SHIFTED V
{{IFF{CH$$W{SCN09{{SHIFTED W
{{IFF{CH$$X{SCN09{{SHIFTED X
{{IFF{CH$$Y{SCN09{{SHIFTED Y
{{IFF{CH$$${SCN09{{SHIFTED Z
{{IFF{DUMMY{SCN07{{
{{IFF{CH$BR{SCN43{{VERTICAL BAR
{{IFF{DUMMY{SCN07{{
{{IFF{CH$NT{SCN35{{NOT
{{IFF{DUMMY{SCN07{{
{{ESW{{{{END SWITCH ON CHARACTER
*
*      HERE FOR ILLEGAL CHARACTER (UNDERLINE MERGES)
*
{SCN07{BZE{R7{SCN10{{JUMP IF SCANNING NAME OR CONSTANT
{{ERB{230{SYNTAX{{ERROR. ILLEGAL CHARACTER
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      HERE FOR DIGITS 0-9
*
{SCN08{BZE{R7{SCN09{{KEEP SCANNING IF NAME/CONSTANT
{{ZER{R8{{{ELSE SET FLAG FOR SCANNING CONSTANT
*
*      HERE FOR LETTER. LOOP HERE WHEN SCANNING NAME/CONSTANT
*
{SCN09{BEQ{R6{SCNIL{SCN11{JUMP IF END OF IMAGE
{{ZER{R7{{{SET FLAG FOR SCANNING NAME/CONST
{{BRN{SCN06{{{MERGE BACK TO CONTINUE SCAN
*
*      COME HERE FOR DELIMITER ENDING NAME OR CONSTANT
*
{SCN10{DCV{R6{{{RESET OFFSET TO POINT TO DELIMITER
*
*      COME HERE AFTER FINISHING SCAN OF NAME OR CONSTANT
*
{SCN11{MOV{R6{SCNPT{{STORE UPDATED SCAN OFFSET
{{MOV{SCNSE{R7{{POINT TO START OF ELEMENT
{{SUB{R7{R6{{GET NUMBER OF CHARACTERS
{{MOV{R$CIM{R10{{POINT TO LINE IMAGE
{{BNZ{R8{SCN15{{JUMP IF NAME
*
*      HERE AFTER SCANNING OUT NUMERIC CONSTANT
*
{{JSR{SBSTR{{{GET STRING FOR CONSTANT
{{MOV{R9{DNAMP{{DELETE FROM STORAGE (NOT NEEDED)
{{JSR{GTNUM{{{CONVERT TO NUMERIC
{{PPM{SCN14{{{JUMP IF CONVERSION FAILURE
*
*      MERGE HERE TO EXIT WITH CONSTANT
*
{SCN12{MOV{#T$CON{R10{{SET RESULT TYPE OF CONSTANT
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      COMMON EXIT POINT (XR,XL) SET
*
{SCN13{MOV{SCNSA{R6{{RESTORE WA
{{MOV{SCNSB{R7{{RESTORE WB
{{MOV{SCNSC{R8{{RESTORE WC
{{MOV{R9{R$SCP{{SAVE XR IN CASE RESCAN
{{MOV{R10{SCNTP{{SAVE XL IN CASE RESCAN
{{ZER{SCNGO{{{RESET POSSIBLE GOTO FLAG
{{EXI{{{{RETURN TO SCANE CALLER
*
*      HERE IF CONVERSION ERROR ON NUMERIC ITEM
*
{SCN14{ERB{231{SYNTAX{{ERROR. INVALID NUMERIC ITEM
*
*      HERE AFTER SCANNING OUT VARIABLE NAME
*
{SCN15{JSR{SBSTR{{{BUILD STRING NAME OF VARIABLE
{{BNZ{SCNCC{SCN13{{RETURN IF CNCRD CALL
{{JSR{GTNVR{{{LOCATE/BUILD VRBLK
{{PPM{{{{DUMMY (UNUSED) ERROR RETURN
{{MOV{#T$VAR{R10{{SET TYPE AS VARIABLE
{{BRN{SCN13{{{BACK TO EXIT
*
*      HERE FOR SINGLE QUOTE (START OF STRING CONSTANT)
*
{SCN16{BZE{R7{SCN10{{TERMINATOR IF SCANNING NAME OR CNST
{{MOV{#CH$SQ{R7{{SET TERMINATOR AS SINGLE QUOTE
{{BRN{SCN18{{{MERGE
*
*      HERE FOR DOUBLE QUOTE (START OF STRING CONSTANT)
*
{SCN17{BZE{R7{SCN10{{TERMINATOR IF SCANNING NAME OR CNST
{{MOV{#CH$DQ{R7{{SET DOUBLE QUOTE TERMINATOR, MERGE
*
*      LOOP TO SCAN OUT STRING CONSTANT
*
{SCN18{BEQ{R6{SCNIL{SCN19{ERROR IF END OF IMAGE
{{LCH{R8{(R10)+{{ELSE LOAD NEXT CHARACTER
{{ICV{R6{{{BUMP OFFSET
{{BNE{R8{R7{SCN18{LOOP BACK IF NOT TERMINATOR
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      HERE AFTER SCANNING OUT STRING CONSTANT
*
{{MOV{SCNPT{R7{{POINT TO FIRST CHARACTER
{{MOV{R6{SCNPT{{SAVE OFFSET PAST FINAL QUOTE
{{DCV{R6{{{POINT BACK PAST LAST CHARACTER
{{SUB{R7{R6{{GET NUMBER OF CHARACTERS
{{MOV{R$CIM{R10{{POINT TO INPUT IMAGE
{{JSR{SBSTR{{{BUILD SUBSTRING VALUE
{{BRN{SCN12{{{BACK TO EXIT WITH CONSTANT RESULT
*
*      HERE IF NO MATCHING QUOTE FOUND
*
{SCN19{MOV{R6{SCNPT{{SET UPDATED SCAN POINTER
{{ERB{232{SYNTAX{{ERROR. UNMATCHED STRING QUOTE
*
*      HERE FOR F (POSSIBLE FAILURE GOTO)
*
{SCN20{MOV{#T$FGO{R9{{SET RETURN CODE FOR FAIL GOTO
{{BRN{SCN22{{{JUMP TO MERGE
*
*      HERE FOR S (POSSIBLE SUCCESS GOTO)
*
{SCN21{MOV{#T$SGO{R9{{SET SUCCESS GOTO AS RETURN CODE
*
*      SPECIAL GOTO CASES MERGE HERE
*
{SCN22{BZE{SCNGO{SCN09{{TREAT AS NORMAL LETTER IF NOT GOTO
*
*      MERGE HERE FOR SPECIAL CHARACTER EXIT
*
{SCN23{BZE{R7{SCN10{{JUMP IF END OF NAME/CONSTANT
{{MOV{R9{R10{{ELSE COPY CODE
{{BRN{SCN13{{{AND JUMP TO EXIT
*
*      HERE FOR UNDERLINE
*
{SCN24{BZE{R7{SCN09{{PART OF NAME IF SCANNING NAME
{{BRN{SCN07{{{ELSE ILLEGAL
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      HERE FOR LEFT PAREN
*
{SCN25{MOV{#T$LPR{R9{{SET LEFT PAREN RETURN CODE
{{BNZ{R7{SCN23{{RETURN LEFT PAREN UNLESS NAME
{{BZE{R8{SCN10{{DELIMITER IF SCANNING CONSTANT
*
*      HERE FOR LEFT PAREN AFTER NAME (FUNCTION CALL)
*
{{MOV{SCNSE{R7{{POINT TO START OF NAME
{{MOV{R6{SCNPT{{SET POINTER PAST LEFT PAREN
{{DCV{R6{{{POINT BACK PAST LAST CHAR OF NAME
{{SUB{R7{R6{{GET NAME LENGTH
{{MOV{R$CIM{R10{{POINT TO INPUT IMAGE
{{JSR{SBSTR{{{GET STRING NAME FOR FUNCTION
{{JSR{GTNVR{{{LOCATE/BUILD VRBLK
{{PPM{{{{DUMMY (UNUSED) ERROR RETURN
{{MOV{#T$FNC{R10{{SET CODE FOR FUNCTION CALL
{{BRN{SCN13{{{BACK TO EXIT
*
*      PROCESSING FOR SPECIAL CHARACTERS
*
{SCN26{MOV{#T$RPR{R9{{RIGHT PAREN, SET CODE
{{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
*
{SCN27{MOV{#T$RBR{R9{{RIGHT BRACKET, SET CODE
{{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
*
{SCN28{MOV{#T$LBR{R9{{LEFT BRACKET, SET CODE
{{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
*
{SCN29{MOV{#T$COL{R9{{COLON, SET CODE
{{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
*
{SCN30{MOV{#T$SMC{R9{{SEMI-COLON, SET CODE
{{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
*
{SCN31{MOV{#T$CMA{R9{{COMMA, SET CODE
{{BRN{SCN23{{{TAKE SPECIAL CHARACTER EXIT
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      HERE FOR OPERATORS. ON ENTRY, WC POINTS TO THE TABLE OF
*      OPERATOR DOPE VECTORS AND WB IS THE INCREMENT TO STEP
*      TO THE NEXT PAIR (BINARY/UNARY) OF DOPE VECTORS IN THE
*      LIST. ON REACHING SCN46, THE POINTER HAS BEEN ADJUSTED TO
*      POINT TO THE APPROPRIATE PAIR OF DOPE VECTORS.
*      THE FIRST THREE ENTRIES ARE SPECIAL SINCE THEY CAN OCCUR
*      AS PART OF A VARIABLE NAME (.) OR CONSTANT (.+-).
*
{SCN32{BZE{R7{SCN09{{DOT CAN BE PART OF NAME OR CONSTANT
{{ADD{R7{R8{{ELSE BUMP POINTER
*
{SCN33{BZE{R8{SCN09{{PLUS CAN BE PART OF CONSTANT
{{BZE{R7{SCN48{{PLUS CANNOT BE PART OF NAME
{{ADD{R7{R8{{ELSE BUMP POINTER
*
{SCN34{BZE{R8{SCN09{{MINUS CAN BE PART OF CONSTANT
{{BZE{R7{SCN48{{MINUS CANNOT BE PART OF NAME
{{ADD{R7{R8{{ELSE BUMP POINTER
*
{SCN35{ADD{R7{R8{{NOT
{SCN36{ADD{R7{R8{{DOLLAR
{SCN37{ADD{R7{R8{{EXCLAMATION
{SCN38{ADD{R7{R8{{PERCENT
{SCN39{ADD{R7{R8{{ASTERISK
{SCN40{ADD{R7{R8{{SLASH
{SCN41{ADD{R7{R8{{NUMBER SIGN
{SCN42{ADD{R7{R8{{AT SIGN
{SCN43{ADD{R7{R8{{VERTICAL BAR
{SCN44{ADD{R7{R8{{AMPERSAND
{SCN45{ADD{R7{R8{{QUESTION MARK
*
*      ALL OPERATORS COME HERE (EQUAL MERGES DIRECTLY)
*      (WC) POINTS TO THE BINARY/UNARY PAIR OF OPERATOR DVBLKS.
*
{SCN46{BZE{R7{SCN10{{OPERATOR TERMINATES NAME/CONSTANT
{{MOV{R8{R9{{ELSE COPY DV POINTER
{{LCH{R8{(R10){{LOAD NEXT CHARACTER
{{MOV{#T$BOP{R10{{SET BINARY OP IN CASE
{{BEQ{R6{SCNIL{SCN47{SHOULD BE BINARY IF IMAGE END
{{BEQ{R8{#CH$BL{SCN47{SHOULD BE BINARY IF FOLLOWED BY BLK
{{BEQ{R8{#CH$HT{SCN47{JUMP IF HORIZONTAL TAB
{{BEQ{R8{#CH$SM{SCN47{SEMICOLON CAN IMMEDIATELY FOLLOW =
*
*      HERE FOR UNARY OPERATOR
*
{{ADD{#4*DVBS${R9{{POINT TO DV FOR UNARY OP
{{MOV{#T$UOP{R10{{SET TYPE FOR UNARY OPERATOR
{{BLE{SCNTP{#T$UOK{SCN13{OK UNARY IF OK PRECEDING ELEMENT
{{EJC{{{{
*
*      SCANE (CONTINUED)
*
*      MERGE HERE TO REQUIRE PRECEDING BLANKS
*
{SCN47{BNZ{SCNBL{SCN13{{ALL OK IF PRECEDING BLANKS, EXIT
*
*      FAIL OPERATOR IN THIS POSITION
*
{SCN48{ERB{233{SYNTAX{{ERROR. INVALID USE OF OPERATOR
*
*      HERE FOR ASTERISK, COULD BE ** SUBSTITUTE FOR EXCLAMATION
*
{SCN49{BZE{R7{SCN10{{END OF NAME IF SCANNING NAME
{{BEQ{R6{SCNIL{SCN39{NOT ** IF * AT IMAGE END
{{MOV{R6{R9{{ELSE SAVE OFFSET PAST FIRST *
{{MOV{R6{SCNOF{{SAVE ANOTHER COPY
{{LCH{R6{(R10)+{{LOAD NEXT CHARACTER
{{BNE{R6{#CH$AS{SCN50{NOT ** IF NEXT CHAR NOT *
{{ICV{R9{{{ELSE STEP OFFSET PAST SECOND *
{{BEQ{R9{SCNIL{SCN51{OK EXCLAM IF END OF IMAGE
{{LCH{R6{(R10){{ELSE LOAD NEXT CHARACTER
{{BEQ{R6{#CH$BL{SCN51{EXCLAMATION IF BLANK
{{BEQ{R6{#CH$HT{SCN51{EXCLAMATION IF HORIZONTAL TAB
*
*      UNARY *
*
{SCN50{MOV{SCNOF{R6{{RECOVER STORED OFFSET
{{MOV{R$CIM{R10{{POINT TO LINE AGAIN
{{PLC{R10{R6{{POINT TO CURRENT CHAR
{{BRN{SCN39{{{MERGE WITH UNARY *
*
*      HERE FOR ** AS SUBSTITUTE FOR EXCLAMATION
*
{SCN51{MOV{R9{SCNPT{{SAVE SCAN POINTER PAST 2ND *
{{MOV{R9{R6{{COPY SCAN POINTER
{{BRN{SCN37{{{MERGE WITH EXCLAMATION
{{ENP{{{{END PROCEDURE SCANE
{{EJC{{{{
*
*      SCNGF -- SCAN GOTO FIELD
*
*      SCNGF IS CALLED FROM CMPIL TO SCAN AND ANALYZE A GOTO
*      FIELD INCLUDING THE SURROUNDING BRACKETS OR PARENTHESES.
*      FOR A NORMAL GOTO, THE RESULT RETURNED IS EITHER A VRBLK
*      POINTER FOR A SIMPLE LABEL OPERAND, OR A POINTER TO AN
*      EXPRESSION TREE WITH A SPECIAL OUTER UNARY OPERATOR
*      (O$GOC). FOR A DIRECT GOTO, THE RESULT RETURNED IS A
*      POINTER TO AN EXPRESSION TREE WITH THE SPECIAL OUTER
*      UNARY OPERATOR O$GOD.
*
*      JSR  SCNGF            CALL TO SCAN GOTO FIELD
*      (XR)                  RESULT (SEE ABOVE)
*      (XL,WA,WB,WC)         DESTROYED
*
{SCNGF{PRC{E{0{{ENTRY POINT
{{JSR{SCANE{{{SCAN INITIAL ELEMENT
{{BEQ{R10{#T$LPR{SCNG1{SKIP IF LEFT PAREN (NORMAL GOTO)
{{BEQ{R10{#T$LBR{SCNG2{SKIP IF LEFT BRACKET (DIRECT GOTO)
{{ERB{234{SYNTAX{{ERROR. GOTO FIELD INCORRECT
*
*      HERE FOR LEFT PAREN (NORMAL GOTO)
*
{SCNG1{MOV{#NUM01{R7{{SET EXPAN FLAG FOR NORMAL GOTO
{{JSR{EXPAN{{{ANALYZE GOTO FIELD
{{MOV{#OPDVN{R6{{POINT TO OPDV FOR COMPLEX GOTO
{{BLE{R9{STATB{SCNG3{JUMP IF NOT IN STATIC (SGD15)
{{BLO{R9{STATE{SCNG4{JUMP TO EXIT IF SIMPLE LABEL NAME
{{BRN{SCNG3{{{COMPLEX GOTO - MERGE
*
*      HERE FOR LEFT BRACKET (DIRECT GOTO)
*
{SCNG2{MOV{#NUM02{R7{{SET EXPAN FLAG FOR DIRECT GOTO
{{JSR{EXPAN{{{SCAN GOTO FIELD
{{MOV{#OPDVD{R6{{SET OPDV POINTER FOR DIRECT GOTO
{{EJC{{{{
*
*      SCNGF (CONTINUED)
*
*      MERGE HERE TO BUILD OUTER UNARY OPERATOR BLOCK
*
{SCNG3{MOV{R6{-(SP){{STACK OPERATOR DV POINTER
{{MOV{R9{-(SP){{STACK POINTER TO EXPRESSION TREE
{{JSR{EXPOP{{{POP OPERATOR OFF
{{MOV{(SP)+{R9{{RELOAD NEW EXPRESSION TREE POINTER
*
*      COMMON EXIT POINT
*
{SCNG4{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE SCNGF
{{EJC{{{{
*
*      SETVR -- SET VRGET,VRSTO FIELDS OF VRBLK
*
*      SETVR SETS THE PROPER VALUES IN THE VRGET AND VRSTO
*      FIELDS OF A VRBLK. IT IS CALLED WHENEVER TRBLKS ARE
*      ADDED OR SUBTRACTED (TRACE,STOPTR,INPUT,OUTPUT,DETACH)
*
*      (XR)                  POINTER TO VRBLK
*      JSR  SETVR            CALL TO SET FIELDS
*      (XL,WA)               DESTROYED
*
*      NOTE THAT SETVR IGNORES THE CALL IF XR DOES NOT POINT
*      INTO THE STATIC REGION (I.E. IS SOME OTHER NAME BASE)
*
{SETVR{PRC{E{0{{ENTRY POINT
{{BHI{R9{STATE{SETV1{EXIT IF NOT NATURAL VARIABLE
*
*      HERE IF WE HAVE A VRBLK
*
{{MOV{R9{R10{{COPY VRBLK POINTER
{{MOV{#B$VRL{4*VRGET(R9){{STORE NORMAL GET VALUE
{{BEQ{4*VRSTO(R9){#B$VRE{SETV1{SKIP IF PROTECTED VARIABLE
{{MOV{#B$VRS{4*VRSTO(R9){{STORE NORMAL STORE VALUE
{{MOV{4*VRVAL(R10){R10{{POINT TO NEXT ENTRY ON CHAIN
{{BNE{(R10){#B$TRT{SETV1{JUMP IF END OF TRBLK CHAIN
{{MOV{#B$VRA{4*VRGET(R9){{STORE TRAPPED ROUTINE ADDRESS
{{MOV{#B$VRV{4*VRSTO(R9){{SET TRAPPED ROUTINE ADDRESS
*
*      MERGE HERE TO EXIT TO CALLER
*
{SETV1{EXI{{{{RETURN TO SETVR CALLER
{{ENP{{{{END PROCEDURE SETVR
{{EJC{{{{
*
*      SORTA -- SORT ARRAY
*
*      ROUTINE TO SORT AN ARRAY OR TABLE ON SAME BASIS AS IN
*      SITBOL. A TABLE IS CONVERTED TO AN ARRAY, LEAVING TWO
*      DIMENSIONAL ARRAYS AND VECTORS AS CASES TO BE CONSIDERED.
*      WHOLE ROWS OF ARRAYS ARE PERMUTED ACCORDING TO THE
*      ORDERING OF THE KEYS THEY CONTAIN, AND THE STRIDE
*      REFERRED TO, IS THE THE LENGTH OF A ROW. IT IS ONE
*      FOR A VECTOR.
*      THE SORT USED IS HEAPSORT, FUNDAMENTALS OF DATA STRUCTURE
*      HOROWITZ AND SAHNI, PITMAN 1977, PAGE 347.
*      IT IS AN ORDER N*LOG(N) ALGORITHM. IN ORDER
*      TO MAKE IT STABLE, COMPARANDS MAY NOT COMPARE EQUAL. THIS
*      IS ACHIEVED BY SORTING A COPY ARRAY (REFERRED TO AS THE
*      SORT ARRAY) CONTAINING AT ITS HIGH ADDRESS END, BYTE
*      OFFSETS TO THE ROWS TO BE SORTED HELD IN THE ORIGINAL
*      ARRAY (REFERRED TO AS THE KEY ARRAY). SORTC, THE
*      COMPARISON ROUTINE, ACCESSES THE KEYS THROUGH THESE
*      OFFSETS AND IN THE CASE OF EQUALITY, RESOLVES IT BY
*      COMPARING THE OFFSETS THEMSELVES. THE SORT PERMUTES THE
*      OFFSETS WHICH ARE THEN USED IN A FINAL OPERATION TO COPY
*      THE ACTUAL ITEMS INTO THE NEW ARRAY IN SORTED ORDER.
*      REFERENCES TO ZEROTH ITEM ARE TO NOTIONAL ITEM
*      PRECEDING FIRST ACTUAL ITEM.
*      REVERSE SORTING FOR RSORT IS DONE BY HAVING THE LESS THAN
*      TEST FOR KEYS EFFECTIVELY BE REPLACED BY A
*      GREATER THAN TEST.
*
*      1(XS)                 FIRST ARG - ARRAY OR TABLE
*      0(XS)                 2ND ARG - INDEX OR PDTYPE NAME
*      (WA)                  0 , NON-ZERO FOR SORT , RSORT
*      JSR  SORTA            CALL TO SORT ARRAY
*      (XR)                  SORTED ARRAY
*      (XL,WA,WB,WC)         DESTROYED
{{EJC{{{{
*
*      SORTA (CONTINUED)
*
{SORTA{PRC{N{0{{ENTRY POINT
{{MOV{R6{SRTSR{{SORT/RSORT INDICATOR
{{MOV{#4*NUM01{SRTST{{DEFAULT STRIDE OF 1
{{ZER{SRTOF{{{DEFAULT ZERO OFFSET TO SORT KEY
{{MOV{#NULLS{SRTDF{{CLEAR DATATYPE FIELD NAME
{{MOV{(SP)+{R$SXR{{UNSTACK ARGUMENT 2
{{MOV{(SP)+{R9{{GET FIRST ARGUMENT
{{JSR{GTARR{{{CONVERT TO ARRAY
{{PPM{SRT16{{{FAIL
{{MOV{R9{-(SP){{STACK PTR TO RESULTING KEY ARRAY
{{MOV{R9{-(SP){{ANOTHER COPY FOR COPYB
{{JSR{COPYB{{{GET COPY ARRAY FOR SORTING INTO
{{PPM{{{{CANT FAIL
{{MOV{R9{-(SP){{STACK POINTER TO SORT ARRAY
{{MOV{R$SXR{R9{{GET SECOND ARG
{{MOV{4*1(SP){R10{{GET PTR TO KEY ARRAY
{{BNE{(R10){#B$VCT{SRT02{JUMP IF ARBLK
{{BEQ{R9{#NULLS{SRT01{JUMP IF NULL SECOND ARG
{{JSR{GTNVR{{{GET VRBLK PTR FOR IT
{{ERR{257{ERRONEOUS{{2ND ARG IN SORT/RSORT OF VECTOR
{{MOV{R9{SRTDF{{STORE DATATYPE FIELD NAME VRBLK
*
*      COMPUTE N AND OFFSET TO ITEM A(0) IN VECTOR CASE
*
{SRT01{MOV{#4*VCLEN{R8{{OFFSET TO A(0)
{{MOV{#4*VCVLS{R7{{OFFSET TO FIRST ITEM
{{MOV{4*VCLEN(R10){R6{{GET BLOCK LENGTH
{{SUB{#4*VCSI${R6{{GET NO. OF ENTRIES, N (IN BYTES)
{{BRN{SRT04{{{MERGE
*
*      HERE FOR ARRAY
*
{SRT02{LDI{4*ARDIM(R10){{{GET POSSIBLE DIMENSION
{{MFI{R6{{{CONVERT TO SHORT INTEGER
{{WTB{R6{{{FURTHER CONVERT TO BAUS
{{MOV{#4*ARVLS{R7{{OFFSET TO FIRST VALUE IF ONE
{{MOV{#4*ARPRO{R8{{OFFSET BEFORE VALUES IF ONE DIM.
{{BEQ{4*ARNDM(R10){#NUM01{SRT04{JUMP IN FACT IF ONE DIM.
{{BNE{4*ARNDM(R10){#NUM02{SRT16{FAIL UNLESS TWO DIMENS
{{LDI{4*ARLB2(R10){{{GET LOWER BOUND 2 AS DEFAULT
{{BEQ{R9{#NULLS{SRT03{JUMP IF DEFAULT SECOND ARG
{{JSR{GTINT{{{CONVERT TO INTEGER
{{PPM{SRT17{{{FAIL
{{LDI{4*ICVAL(R9){{{GET ACTUAL INTEGER VALUE
{{EJC{{{{
*
*      SORTA (CONTINUED)
*
*      HERE WITH SORT COLUMN INDEX IN IA IN ARRAY CASE
*
{SRT03{SBI{4*ARLB2(R10){{{SUBTRACT LOW BOUND
{{IOV{SRT17{{{FAIL IF OVERFLOW
{{ILT{SRT17{{{FAIL IF BELOW LOW BOUND
{{SBI{4*ARDM2(R10){{{CHECK AGAINST DIMENSION
{{IGE{SRT17{{{FAIL IF TOO LARGE
{{ADI{4*ARDM2(R10){{{RESTORE VALUE
{{MFI{R6{{{GET AS SMALL INTEGER
{{WTB{R6{{{OFFSET WITHIN ROW TO KEY
{{MOV{R6{SRTOF{{KEEP OFFSET
{{LDI{4*ARDM2(R10){{{SECOND DIMENSION IS ROW LENGTH
{{MFI{R6{{{CONVERT TO SHORT INTEGER
{{MOV{R6{R9{{COPY ROW LENGTH
{{WTB{R6{{{CONVERT TO BYTES
{{MOV{R6{SRTST{{STORE AS STRIDE
{{LDI{4*ARDIM(R10){{{GET NUMBER OF ROWS
{{MFI{R6{{{AS A SHORT INTEGER
{{WTB{R6{{{CONVERT N TO BAUS
{{MOV{4*ARLEN(R10){R8{{OFFSET PAST ARRAY END
{{SUB{R6{R8{{ADJUST, GIVING SPACE FOR N OFFSETS
{{DCA{R8{{{POINT TO A(0)
{{MOV{4*AROFS(R10){R7{{OFFSET TO WORD BEFORE FIRST ITEM
{{ICA{R7{{{OFFSET TO FIRST ITEM
*
*      SEPARATE PRE-PROCESSING FOR ARRAYS AND VECTORS DONE.
*      TO SIMPLIFY LATER KEY COMPARISONS, REMOVAL OF ANY TRBLK
*      TRAP BLOCKS FROM ENTRIES IN KEY ARRAY IS EFFECTED.
*
*      (XL) = 1(XS) = POINTER TO KEY ARRAY
*      (XS) = POINTER TO SORT ARRAY
*      WA = NUMBER OF ITEMS, N (CONVERTED TO BYTES).
*      WB = OFFSET TO FIRST ITEM OF ARRAYS.
*      WC = OFFSET TO A(0)
*
{SRT04{BLE{R6{#4*NUM01{SRT15{RETURN IF ONLY A SINGLE ITEM
{{MOV{R6{SRTSN{{STORE NUMBER OF ITEMS (IN BAUS)
{{MOV{R8{SRTSO{{STORE OFFSET TO A(0)
{{MOV{4*ARLEN(R10){R8{{LENGTH OF ARRAY OR VEC (=VCLEN)
{{ADD{R10{R8{{POINT PAST END OF ARRAY OR VECTOR
{{MOV{R7{SRTSF{{STORE OFFSET TO FIRST ROW
{{ADD{R7{R10{{POINT TO FIRST ITEM IN KEY ARRAY
*
*      LOOP THROUGH ARRAY
*
{SRT05{MOV{(R10){R9{{GET AN ENTRY
*
*      HUNT ALONG TRBLK CHAIN
*
{SRT06{BNE{(R9){#B$TRT{SRT07{JUMP OUT IF NOT TRBLK
{{MOV{4*TRVAL(R9){R9{{GET VALUE FIELD
{{BRN{SRT06{{{LOOP
{{EJC{{{{
*
*      SORTA (CONTINUED)
*
*      XR IS VALUE FROM END OF CHAIN
*
{SRT07{MOV{R9{(R10)+{{STORE AS ARRAY ENTRY
{{BLT{R10{R8{SRT05{LOOP IF NOT DONE
{{MOV{(SP){R10{{GET ADRS OF SORT ARRAY
{{MOV{SRTSF{R9{{INITIAL OFFSET TO FIRST KEY
{{MOV{SRTST{R7{{GET STRIDE
{{ADD{SRTSO{R10{{OFFSET TO A(0)
{{ICA{R10{{{POINT TO A(1)
{{MOV{SRTSN{R8{{GET N
{{BTW{R8{{{CONVERT FROM BYTES
{{MOV{R8{SRTNR{{STORE AS ROW COUNT
{{LCT{R8{R8{{LOOP COUNTER
*
*      STORE KEY OFFSETS AT TOP OF SORT ARRAY
*
{SRT08{MOV{R9{(R10)+{{STORE AN OFFSET
{{ADD{R7{R9{{BUMP OFFSET BY STRIDE
{{BCT{R8{SRT08{{LOOP THROUGH ROWS
*
*      PERFORM THE SORT ON OFFSETS IN SORT ARRAY.
*
*      (SRTSN)               NUMBER OF ITEMS TO SORT, N (BYTES)
*      (SRTSO)               OFFSET TO A(0)
*
{SRT09{MOV{SRTSN{R6{{GET N
{{MOV{SRTNR{R8{{GET NUMBER OF ROWS
{{RSH{R8{1{{I = N / 2 (WC=I, INDEX INTO ARRAY)
{{WTB{R8{{{CONVERT BACK TO BYTES
*
*      LOOP TO FORM INITIAL HEAP
*
{SRT10{JSR{SORTH{{{SORTH(I,N)
{{DCA{R8{{{I = I - 1
{{BNZ{R8{SRT10{{LOOP IF I GT 0
{{MOV{R6{R8{{I = N
*
*      SORTING LOOP. AT THIS POINT, A(1) IS THE LARGEST
*      ITEM, SINCE ALGORITHM INITIALISES IT AS, AND THEN MAINTAI
*      IT AS, ROOT OF TREE.
*
{SRT11{DCA{R8{{{I = I - 1 (N - 1 INITIALLY)
{{BZE{R8{SRT12{{JUMP IF DONE
{{MOV{(SP){R9{{GET SORT ARRAY ADDRESS
{{ADD{SRTSO{R9{{POINT TO A(0)
{{MOV{R9{R10{{A(0) ADDRESS
{{ADD{R8{R10{{A(I) ADDRESS
{{MOV{4*1(R10){R7{{COPY A(I+1)
{{MOV{4*1(R9){4*1(R10){{MOVE A(1) TO A(I+1)
{{MOV{R7{4*1(R9){{COMPLETE EXCHANGE OF A(1), A(I+1)
{{MOV{R8{R6{{N = I FOR SORTH
{{MOV{#4*NUM01{R8{{I = 1 FOR SORTH
{{JSR{SORTH{{{SORTH(1,N)
{{MOV{R6{R8{{RESTORE WC
{{BRN{SRT11{{{LOOP
{{EJC{{{{
*
*      SORTA (CONTINUED)
*
*      OFFSETS HAVE BEEN PERMUTED INTO REQUIRED ORDER BY SORT.
*      COPY ARRAY ELEMENTS OVER THEM.
*
{SRT12{MOV{(SP){R10{{BASE ADRS OF KEY ARRAY
{{MOV{R10{R8{{COPY IT
{{ADD{SRTSO{R8{{OFFSET OF A(0)
{{ADD{SRTSF{R10{{ADRS OF FIRST ROW OF SORT ARRAY
{{MOV{SRTST{R7{{GET STRIDE
{{BTW{R7{{{CONVERT TO WORDS
*
*      COPYING LOOP FOR SUCCESSIVE ITEMS. SORTED OFFSETS ARE
*      HELD AT END OF SORT ARRAY.
*
{SRT13{ICA{R8{{{ADRS OF NEXT OF SORTED OFFSETS
{{MOV{R8{R9{{COPY IT FOR ACCESS
{{MOV{(R9){R9{{GET OFFSET
{{ADD{4*1(SP){R9{{ADD KEY ARRAY BASE ADRS
{{LCT{R6{R7{{GET COUNT OF WORDS IN ROW
*
*      COPY A COMPLETE ROW
*
{SRT14{MOV{(R9)+{(R10)+{{MOVE A WORD
{{BCT{R6{SRT14{{LOOP
{{DCV{SRTNR{{{DECREMENT ROW COUNT
{{BNZ{SRTNR{SRT13{{REPEAT TILL ALL ROWS DONE
*
*      RETURN POINT
*
{SRT15{MOV{(SP)+{R9{{POP RESULT ARRAY PTR
{{ICA{SP{{{POP KEY ARRAY PTR
{{ZER{R$SXL{{{CLEAR JUNK
{{ZER{R$SXR{{{CLEAR JUNK
{{EXI{{{{RETURN
*
*      ERROR POINT
*
{SRT16{ERB{256{SORT/RSORT{{1ST ARG NOT SUITABLE ARRAY OR TABLE
{SRT17{ERB{258{SORT/RSORT{{2ND ARG OUT OF RANGE OR NON-INTEGER
{{ENP{{{{END PROCUDURE SORTA
{{EJC{{{{
*
*      SORTC --  COMPARE SORT KEYS
*
*      COMPARE TWO SORT KEYS GIVEN THEIR OFFSETS. IF
*      EQUAL, COMPARE KEY OFFSETS TO GIVE STABLE SORT.
*      NOTE THAT IF SRTSR IS NON-ZERO (REQUEST FOR REVERSE
*      SORT), THE QUOTED RETURNS ARE INVERTED.
*      FOR OBJECTS OF DIFFERING DATATYPES, THE ENTRY POINT
*      IDENTIFICATIONS ARE COMPARED.
*
*      (XL)                  BASE ADRS FOR KEYS
*      (WA)                  OFFSET TO KEY 1 ITEM
*      (WB)                  OFFSET TO KEY 2 ITEM
*      (SRTSR)               ZERO/NON-ZERO FOR SORT/RSORT
*      (SRTOF)               OFFSET WITHIN ROW TO COMPARANDS
*      JSR  SORTC            CALL TO COMPARE KEYS
*      PPM  LOC              KEY1 LESS THAN KEY2
*                            NORMAL RETURN, KEY1 GT THAN KEY2
*      (XL,XR,WA,WB)         DESTROYED
*
{SORTC{PRC{E{1{{ENTRY POINT
{{MOV{R6{SRTS1{{SAVE OFFSET 1
{{MOV{R7{SRTS2{{SAVE OFFSET 2
{{MOV{R8{SRTSC{{SAVE WC
{{ADD{SRTOF{R10{{ADD OFFSET TO COMPARAND FIELD
{{MOV{R10{R9{{COPY BASE + OFFSET
{{ADD{R6{R10{{ADD KEY1 OFFSET
{{ADD{R7{R9{{ADD KEY2 OFFSET
{{MOV{(R10){R10{{GET KEY1
{{MOV{(R9){R9{{GET KEY2
{{BNE{SRTDF{#NULLS{SRC11{JUMP IF DATATYPE FIELD NAME USED
{{EJC{{{{
*
*      SORTC (CONTINUED)
*
*      MERGE AFTER DEALING WITH FIELD NAME. TRY FOR STRINGS.
*
{SRC01{MOV{(R10){R8{{GET TYPE CODE
{{BNE{R8{(R9){SRC02{SKIP IF NOT SAME DATATYPE
{{BEQ{R8{#B$SCL{SRC09{JUMP IF BOTH STRINGS
*
*      NOW TRY FOR NUMERIC
*
{SRC02{MOV{R10{R$SXL{{KEEP ARG1
{{MOV{R9{R$SXR{{KEEP ARG2
{{MOV{R10{-(SP){{STACK
{{MOV{R9{-(SP){{ARGS
{{JSR{ACOMP{{{COMPARE OBJECTS
{{PPM{SRC10{{{NOT NUMERIC
{{PPM{SRC10{{{NOT NUMERIC
{{PPM{SRC03{{{KEY1 LESS
{{PPM{SRC08{{{KEYS EQUAL
{{PPM{SRC05{{{KEY1 GREATER
*
*      RETURN IF KEY1 SMALLER (SORT), GREATER (RSORT)
*
{SRC03{BNZ{SRTSR{SRC06{{JUMP IF RSORT
*
{SRC04{MOV{SRTSC{R8{{RESTORE WC
{{EXI{1{{{RETURN
*
*      RETURN IF KEY1 GREATER (SORT), SMALLER (RSORT)
*
{SRC05{BNZ{SRTSR{SRC04{{JUMP IF RSORT
*
{SRC06{MOV{SRTSC{R8{{RESTORE WC
{{EXI{{{{RETURN
*
*      KEYS ARE OF SAME DATATYPE
*
{SRC07{BLT{R10{R9{SRC03{ITEM FIRST CREATED IS LESS
{{BGT{R10{R9{SRC05{ADDRESSES RISE IN ORDER OF CREATION
*
*      DROP THROUGH OR MERGE FOR IDENTICAL OR EQUAL OBJECTS
*
{SRC08{BLT{SRTS1{SRTS2{SRC04{TEST OFFSETS OR KEY ADDRSS INSTEAD
{{BRN{SRC06{{{OFFSET 1 GREATER
{{EJC{{{{
*
*      SORTC (CONTINUED)
*
*      STRINGS
*
{SRC09{MOV{R10{-(SP){{STACK
{{MOV{R9{-(SP){{ARGS
{{JSR{LCOMP{{{COMPARE OBJECTS
{{PPM{{{{CANT
{{PPM{{{{FAIL
{{PPM{SRC03{{{KEY1 LESS
{{PPM{SRC08{{{KEYS EQUAL
{{PPM{SRC05{{{KEY1 GREATER
*
*      ARITHMETIC COMPARISON FAILED - RECOVER ARGS
*
{SRC10{MOV{R$SXL{R10{{GET ARG1
{{MOV{R$SXR{R9{{GET ARG2
{{MOV{(R10){R8{{GET TYPE OF KEY1
{{BEQ{R8{(R9){SRC07{JUMP IF KEYS OF SAME TYPE
{{MOV{R8{R10{{GET BLOCK TYPE WORD
{{MOV{(R9){R9{{GET BLOCK TYPE WORD
{{LEI{R10{{{ENTRY POINT ID FOR KEY1
{{LEI{R9{{{ENTRY POINT ID FOR KEY2
{{BGT{R10{R9{SRC05{JUMP IF KEY1 GT KEY2
{{BRN{SRC03{{{KEY1 LT KEY2
*
*      DATATYPE FIELD NAME USED
*
{SRC11{JSR{SORTF{{{CALL ROUTINE TO FIND FIELD 1
{{MOV{R10{-(SP){{STACK ITEM POINTER
{{MOV{R9{R10{{GET KEY2
{{JSR{SORTF{{{FIND FIELD 2
{{MOV{R10{R9{{PLACE AS KEY2
{{MOV{(SP)+{R10{{RECOVER KEY1
{{BRN{SRC01{{{MERGE
{{ENP{{{{PROCEDURE SORTC
{{EJC{{{{
*
*      SORTF -- FIND FIELD FOR SORTC
*
*      ROUTINE USED BY SORTC TO OBTAIN ITEM CORRESPONDING
*      TO A GIVEN FIELD NAME, IF THIS EXISTS, IN A PROGRAMMER
*      DEFINED OBJECT PASSED AS ARGUMENT.
*      IF SUCH A MATCH OCCURS, RECORD IS KEPT OF DATATYPE
*      NAME, FIELD NAME AND OFFSET TO FIELD IN ORDER TO
*      SHORT-CIRCUIT LATER SEARCHES ON SAME TYPE. NOTE THAT
*      DFBLKS ARE STORED IN STATIC AND HENCE CANNOT BE MOVED.
*
*      (SRTDF)               VRBLK POINTER OF FIELD NAME
*      (XL)                  POSSIBLE PDBLK POINTER
*      JSR  SORTF            CALL TO SEARCH FOR FIELD NAME
*      (XL)                  ITEM FOUND OR ORIGINAL PDBLK PTR
*      (WC)                  DESTROYED
*
{SORTF{PRC{E{0{{ENTRY POINT
{{BNE{(R10){#B$PDT{SRTF3{RETURN IF NOT PDBLK
{{MOV{R9{-(SP){{KEEP XR
{{MOV{SRTFD{R9{{GET POSSIBLE FORMER DFBLK PTR
{{BZE{R9{SRTF4{{JUMP IF NOT
{{BNE{R9{4*PDDFP(R10){SRTF4{JUMP IF NOT RIGHT DATATYPE
{{BNE{SRTDF{SRTFF{SRTF4{JUMP IF NOT RIGHT FIELD NAME
{{ADD{SRTFO{R10{{ADD OFFSET TO REQUIRED FIELD
*
*      HERE WITH XL POINTING TO FOUND FIELD
*
{SRTF1{MOV{(R10){R10{{GET ITEM FROM FIELD
*
*      RETURN POINT
*
{SRTF2{MOV{(SP)+{R9{{RESTORE XR
*
{SRTF3{EXI{{{{RETURN
{{EJC{{{{
*
*      SORTF (CONTINUED)
*
*      CONDUCT A SEARCH
*
{SRTF4{MOV{R10{R9{{COPY ORIGINAL POINTER
{{MOV{4*PDDFP(R9){R9{{POINT TO DFBLK
{{MOV{R9{SRTFD{{KEEP A COPY
{{MOV{4*FARGS(R9){R8{{GET NUMBER OF FIELDS
{{WTB{R8{{{CONVERT TO BYTES
{{ADD{4*DFLEN(R9){R9{{POINT PAST LAST FIELD
*
*      LOOP TO FIND NAME IN PDFBLK
*
{SRTF5{DCA{R8{{{COUNT DOWN
{{DCA{R9{{{POINT IN FRONT
{{BEQ{(R9){SRTDF{SRTF6{SKIP OUT IF FOUND
{{BNZ{R8{SRTF5{{LOOP
{{BRN{SRTF2{{{RETURN - NOT FOUND
*
*      FOUND
*
{SRTF6{MOV{(R9){SRTFF{{KEEP FIELD NAME PTR
{{ADD{#4*PDFLD{R8{{ADD OFFSET TO FIRST FIELD
{{MOV{R8{SRTFO{{STORE AS FIELD OFFSET
{{ADD{R8{R10{{POINT TO FIELD
{{BRN{SRTF1{{{RETURN
{{ENP{{{{PROCEDURE SORTF
{{EJC{{{{
*
*      SORTH -- HEAP ROUTINE FOR SORTA
*
*      THIS ROUTINE CONSTRUCTS A HEAP FROM ELEMENTS OF ARRAY, A.
*      IN THIS APPLICATION, THE ELEMENTS ARE OFFSETS TO KEYS IN
*      A KEY ARRAY.
*
*      (XS)                  POINTER TO SORT ARRAY BASE
*      1(XS)                 POINTER TO KEY ARRAY BASE
*      (WA)                  MAX ARRAY INDEX, N (IN BYTES)
*      (WC)                  OFFSET J IN A TO ROOT (IN *1 TO *N)
*      JSR  SORTH            CALL SORTH(J,N) TO MAKE HEAP
*      (XL,XR,WB)            DESTROYED
*
{SORTH{PRC{N{0{{ENTRY POINT
{{MOV{R6{SRTSN{{SAVE N
{{MOV{R8{SRTWC{{KEEP WC
{{MOV{(SP){R10{{SORT ARRAY BASE ADRS
{{ADD{SRTSO{R10{{ADD OFFSET TO A(0)
{{ADD{R8{R10{{POINT TO A(J)
{{MOV{(R10){SRTRT{{GET OFFSET TO ROOT
{{ADD{R8{R8{{DOUBLE J - CANT EXCEED N
*
*      LOOP TO MOVE DOWN TREE USING DOUBLED INDEX J
*
{SRH01{BGT{R8{SRTSN{SRH03{DONE IF J GT N
{{BEQ{R8{SRTSN{SRH02{SKIP IF J EQUALS N
{{MOV{(SP){R9{{SORT ARRAY BASE ADRS
{{MOV{4*1(SP){R10{{KEY ARRAY BASE ADRS
{{ADD{SRTSO{R9{{POINT TO A(0)
{{ADD{R8{R9{{ADRS OF A(J)
{{MOV{4*1(R9){R6{{GET A(J+1)
{{MOV{(R9){R7{{GET A(J)
*
*      COMPARE SONS. (WA) RIGHT SON, (WB) LEFT SON
*
{{JSR{SORTC{{{COMPARE KEYS - LT(A(J+1),A(J))
{{PPM{SRH02{{{A(J+1) LT A(J)
{{ICA{R8{{{POINT TO GREATER SON, A(J+1)
{{EJC{{{{
*
*      SORTH (CONTINUED)
*
*      COMPARE ROOT WITH GREATER SON
*
{SRH02{MOV{4*1(SP){R10{{KEY ARRAY BASE ADRS
{{MOV{(SP){R9{{GET SORT ARRAY ADDRESS
{{ADD{SRTSO{R9{{ADRS OF A(0)
{{MOV{R9{R7{{COPY THIS ADRS
{{ADD{R8{R9{{ADRS OF GREATER SON, A(J)
{{MOV{(R9){R6{{GET A(J)
{{MOV{R7{R9{{POINT BACK TO A(0)
{{MOV{SRTRT{R7{{GET ROOT
{{JSR{SORTC{{{COMPARE THEM - LT(A(J),ROOT)
{{PPM{SRH03{{{FATHER EXCEEDS SONS - DONE
{{MOV{(SP){R9{{GET SORT ARRAY ADRS
{{ADD{SRTSO{R9{{POINT TO A(0)
{{MOV{R9{R10{{COPY IT
{{MOV{R8{R6{{COPY J
{{BTW{R8{{{CONVERT TO WORDS
{{RSH{R8{1{{GET J/2
{{WTB{R8{{{CONVERT BACK TO BYTES
{{ADD{R6{R10{{POINT TO A(J)
{{ADD{R8{R9{{ADRS OF A(J/2)
{{MOV{(R10){(R9){{A(J/2) = A(J)
{{MOV{R6{R8{{RECOVER J
{{AOV{R8{R8{SRH03{J = J*2. DONE IF TOO BIG
{{BRN{SRH01{{{LOOP
*
*      FINISH BY COPYING ROOT OFFSET BACK INTO ARRAY
*
{SRH03{BTW{R8{{{CONVERT TO WORDS
{{RSH{R8{1{{J = J/2
{{WTB{R8{{{CONVERT BACK TO BYTES
{{MOV{(SP){R9{{SORT ARRAY ADRS
{{ADD{SRTSO{R9{{ADRS OF A(0)
{{ADD{R8{R9{{ADRS OF A(J/2)
{{MOV{SRTRT{(R9){{A(J/2) = ROOT
{{MOV{SRTSN{R6{{RESTORE WA
{{MOV{SRTWC{R8{{RESTORE WC
{{EXI{{{{RETURN
{{ENP{{{{END PROCEDURE SORTH
{{EJC{{{{
{{EJC{{{{
*
*      TFIND -- LOCATE TABLE ELEMENT
*
*      (XR)                  SUBSCRIPT VALUE FOR ELEMENT
*      (XL)                  POINTER TO TABLE
*      (WB)                  ZERO BY VALUE, NON-ZERO BY NAME
*      JSR  TFIND            CALL TO LOCATE ELEMENT
*      PPM  LOC              TRANSFER LOCATION IF ACCESS FAILS
*      (XR)                  ELEMENT VALUE (IF BY VALUE)
*      (XR)                  DESTROYED (IF BY NAME)
*      (XL,WA)               TEBLK NAME (IF BY NAME)
*      (XL,WA)               DESTROYED (IF BY VALUE)
*      (WC,RA)               DESTROYED
*
*      NOTE THAT IF A CALL BY VALUE SPECIFIES A NON-EXISTENT
*      SUBSCRIPT, NULL IS RETURNED WITHOUT BUILDING A NEW TEBLK.
*
{TFIND{PRC{E{1{{ENTRY POINT
{{MOV{R7{-(SP){{SAVE NAME/VALUE INDICATOR
{{MOV{R9{-(SP){{SAVE SUBSCRIPT VALUE
{{MOV{R10{-(SP){{SAVE TABLE POINTER
{{MOV{4*TBLEN(R10){R6{{LOAD LENGTH OF TBBLK
{{BTW{R6{{{CONVERT TO WORD COUNT
{{SUB{#TBBUK{R6{{GET NUMBER OF BUCKETS
{{MTI{R6{{{CONVERT TO INTEGER VALUE
{{STI{TFNSI{{{SAVE FOR LATER
{{MOV{(R9){R10{{LOAD FIRST WORD OF SUBSCRIPT
{{LEI{R10{{{LOAD BLOCK ENTRY ID (BL$XX)
{{BSW{R10{BL$$D{TFN00{SWITCH ON BLOCK TYPE
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{BL$IC{TFN02{{JUMP IF INTEGER
{{IFF{BL$NM{TFN04{{JUMP IF NAME
{{IFF{BL$P0{TFN03{{JUMP IF PATTERN
{{IFF{BL$P1{TFN03{{JUMP IF PATTERN
{{IFF{BL$P2{TFN03{{JUMP IF PATTERN
{{IFF{BL$RC{TFN02{{REAL
{{IFF{BL$SC{TFN05{{JUMP IF STRING
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{IFF{DUMMY{TFN00{{
{{ESW{{{{END SWITCH ON BLOCK TYPE
*
*      HERE FOR BLOCKS FOR WHICH WE USE THE SECOND WORD OF THE
*      BLOCK AS THE HASH SOURCE (SEE BLOCK FORMATS FOR DETAILS).
*
{TFN00{MOV{4*1(R9){R6{{LOAD SECOND WORD
*
*      MERGE HERE WITH ONE WORD HASH SOURCE IN WA
*
{TFN01{MTI{R6{{{CONVERT TO INTEGER
{{BRN{TFN06{{{JUMP TO MERGE
{{EJC{{{{
*
*      TFIND (CONTINUED)
*
*      HERE FOR INTEGER OR REAL
*
{TFN02{LDI{4*1(R9){{{LOAD VALUE AS HASH SOURCE
{{IGE{TFN06{{{OK IF POSITIVE OR ZERO
{{NGI{{{{MAKE POSITIVE
{{IOV{TFN06{{{CLEAR POSSIBLE OVERFLOW
{{BRN{TFN06{{{MERGE
*
*      FOR PATTERN, USE FIRST WORD (PCODE) AS SOURCE
*
{TFN03{MOV{(R9){R6{{LOAD FIRST WORD AS HASH SOURCE
{{BRN{TFN01{{{MERGE BACK
*
*      FOR NAME, USE OFFSET AS HASH SOURCE
*
{TFN04{MOV{4*NMOFS(R9){R6{{LOAD OFFSET AS HASH SOURCE
{{BRN{TFN01{{{MERGE BACK
*
*      HERE FOR STRING
*
{TFN05{JSR{HASHS{{{CALL ROUTINE TO COMPUTE HASH
*
*      MERGE HERE WITH HASH SOURCE IN (IA)
*
{TFN06{RMI{TFNSI{{{COMPUTE HASH INDEX BY REMAINDERING
{{MFI{R8{{{GET AS ONE WORD INTEGER
{{WTB{R8{{{CONVERT TO BYTE OFFSET
{{MOV{(SP){R10{{GET TABLE PTR AGAIN
{{ADD{R8{R10{{POINT TO PROPER BUCKET
{{MOV{4*TBBUK(R10){R9{{LOAD FIRST TEBLK POINTER
{{BEQ{R9{(SP){TFN10{JUMP IF NO TEBLKS ON CHAIN
*
*      LOOP THROUGH TEBLKS ON HASH CHAIN
*
{TFN07{MOV{R9{R7{{SAVE TEBLK POINTER
{{MOV{4*TESUB(R9){R9{{LOAD SUBSCRIPT VALUE
{{MOV{4*1(SP){R10{{LOAD INPUT ARGUMENT SUBSCRIPT VAL
{{JSR{IDENT{{{COMPARE THEM
{{PPM{TFN08{{{JUMP IF EQUAL (IDENT)
*
*      HERE IF NO MATCH WITH THAT TEBLK
*
{{MOV{R7{R10{{RESTORE TEBLK POINTER
{{MOV{4*TENXT(R10){R9{{POINT TO NEXT TEBLK ON CHAIN
{{BNE{R9{(SP){TFN07{JUMP IF THERE IS ONE
*
*      HERE IF NO MATCH WITH ANY TEBLK ON CHAIN
*
{{MOV{#4*TENXT{R8{{SET OFFSET TO LINK FIELD (XL BASE)
{{BRN{TFN11{{{JUMP TO MERGE
{{EJC{{{{
*
*      TFIND (CONTINUED)
*
*      HERE WE HAVE FOUND A MATCHING ELEMENT
*
{TFN08{MOV{R7{R10{{RESTORE TEBLK POINTER
{{MOV{#4*TEVAL{R6{{SET TEBLK NAME OFFSET
{{MOV{4*2(SP){R7{{RESTORE NAME/VALUE INDICATOR
{{BNZ{R7{TFN09{{JUMP IF CALLED BY NAME
{{JSR{ACESS{{{ELSE GET VALUE
{{PPM{TFN12{{{JUMP IF REFERENCE FAILS
{{ZER{R7{{{RESTORE NAME/VALUE INDICATOR
*
*      COMMON EXIT FOR ENTRY FOUND
*
{TFN09{ADD{#4*NUM03{SP{{POP STACK ENTRIES
{{EXI{{{{RETURN TO TFIND CALLER
*
*      HERE IF NO TEBLKS ON THE HASH CHAIN
*
{TFN10{ADD{#4*TBBUK{R8{{GET OFFSET TO BUCKET PTR
{{MOV{(SP){R10{{SET TBBLK PTR AS BASE
*
*      MERGE HERE WITH (XL,WC) BASE,OFFSET OF FINAL LINK
*
{TFN11{MOV{(SP){R9{{TBBLK POINTER
{{MOV{4*TBINV(R9){R9{{LOAD DEFAULT VALUE IN CASE
{{MOV{4*2(SP){R7{{LOAD NAME/VALUE INDICATOR
{{BZE{R7{TFN09{{EXIT WITH DEFAULT IF VALUE CALL
*
*      HERE WE MUST BUILD A NEW TEBLK
*
{{MOV{#4*TESI${R6{{SET SIZE OF TEBLK
{{JSR{ALLOC{{{ALLOCATE TEBLK
{{ADD{R8{R10{{POINT TO HASH LINK
{{MOV{R9{(R10){{LINK NEW TEBLK AT END OF CHAIN
{{MOV{#B$TET{(R9){{STORE TYPE WORD
{{MOV{#NULLS{4*TEVAL(R9){{SET NULL AS INITIAL VALUE
{{MOV{(SP)+{4*TENXT(R9){{SET TBBLK PTR TO MARK END OF CHAIN
{{MOV{(SP)+{4*TESUB(R9){{STORE SUBSCRIPT VALUE
{{ICA{SP{{{POP PAST NAME/VALUE INDICATOR
{{MOV{R9{R10{{COPY TEBLK POINTER (NAME BASE)
{{MOV{#4*TEVAL{R6{{SET OFFSET
{{EXI{{{{RETURN TO CALLER WITH NEW TEBLK
*
*      ACESS FAIL RETURN
*
{TFN12{EXI{1{{{ALTERNATIVE RETURN
{{ENP{{{{END PROCEDURE TFIND
{{EJC{{{{
*
*      TRACE -- SET/RESET A TRACE ASSOCIATION
*
*      THIS PROCEDURE IS SHARED BY TRACE AND STOPTR TO
*      EITHER INITIATE OR STOP A TRACE RESPECTIVELY.
*
*      (XL)                  TRBLK PTR (TRACE) OR ZERO (STOPTR)
*      1(XS)                 FIRST ARGUMENT (NAME)
*      0(XS)                 SECOND ARGUMENT (TRACE TYPE)
*      JSR  TRACE            CALL TO SET/RESET TRACE
*      PPM  LOC              TRANSFER LOC IF 1ST ARG IS BAD NAME
*      PPM  LOC              TRANSFER LOC IF 2ND ARG IS BAD TYPE
*      (XS)                  POPPED
*      (XL,XR,WA,WB,WC,IA)   DESTROYED
*
{TRACE{PRC{N{2{{ENTRY POINT
{{JSR{GTSTG{{{GET TRACE TYPE STRING
{{PPM{TRC15{{{JUMP IF NOT STRING
{{PLC{R9{{{ELSE POINT TO STRING
{{LCH{R6{(R9){{LOAD FIRST CHARACTER
{{FLC{R6{{{FOLD TO UPPER CASE
{{MOV{(SP){R9{{LOAD NAME ARGUMENT
{{MOV{R10{(SP){{STACK TRBLK PTR OR ZERO
{{MOV{#TRTAC{R8{{SET TRTYP FOR ACCESS TRACE
{{BEQ{R6{#CH$LA{TRC10{JUMP IF A (ACCESS)
{{MOV{#TRTVL{R8{{SET TRTYP FOR VALUE TRACE
{{BEQ{R6{#CH$LV{TRC10{JUMP IF V (VALUE)
{{BZE{R6{TRC10{{JUMP IF BLANK (VALUE)
*
*      HERE FOR L,K,F,C,R
*
{{BEQ{R6{#CH$LF{TRC01{JUMP IF F (FUNCTION)
{{BEQ{R6{#CH$LR{TRC01{JUMP IF R (RETURN)
{{BEQ{R6{#CH$LL{TRC03{JUMP IF L (LABEL)
{{BEQ{R6{#CH$LK{TRC06{JUMP IF K (KEYWORD)
{{BNE{R6{#CH$LC{TRC15{ELSE ERROR IF NOT C (CALL)
*
*      HERE FOR F,C,R
*
{TRC01{JSR{GTNVR{{{POINT TO VRBLK FOR NAME
{{PPM{TRC16{{{JUMP IF BAD NAME
{{ICA{SP{{{POP STACK
{{MOV{4*VRFNC(R9){R9{{POINT TO FUNCTION BLOCK
{{BNE{(R9){#B$PFC{TRC17{ERROR IF NOT PROGRAM FUNCTION
{{BEQ{R6{#CH$LR{TRC02{JUMP IF R (RETURN)
{{EJC{{{{
*
*      TRACE (CONTINUED)
*
*      HERE FOR F,C TO SET/RESET CALL TRACE
*
{{MOV{R10{4*PFCTR(R9){{SET/RESET CALL TRACE
{{BEQ{R6{#CH$LC{EXNUL{EXIT WITH NULL IF C (CALL)
*
*      HERE FOR F,R TO SET/RESET RETURN TRACE
*
{TRC02{MOV{R10{4*PFRTR(R9){{SET/RESET RETURN TRACE
{{EXI{{{{RETURN
*
*      HERE FOR L TO SET/RESET LABEL TRACE
*
{TRC03{JSR{GTNVR{{{POINT TO VRBLK
{{PPM{TRC16{{{JUMP IF BAD NAME
{{MOV{4*VRLBL(R9){R10{{LOAD LABEL POINTER
{{BNE{(R10){#B$TRT{TRC04{JUMP IF NO OLD TRACE
{{MOV{4*TRLBL(R10){R10{{ELSE DELETE OLD TRACE ASSOCIATION
*
*      HERE WITH OLD LABEL TRACE ASSOCIATION DELETED
*
{TRC04{BEQ{R10{#STNDL{TRC16{ERROR IF UNDEFINED LABEL
{{MOV{(SP)+{R7{{GET TRBLK PTR AGAIN
{{BZE{R7{TRC05{{JUMP IF STOPTR CASE
{{MOV{R7{4*VRLBL(R9){{ELSE SET NEW TRBLK POINTER
{{MOV{#B$VRT{4*VRTRA(R9){{SET LABEL TRACE ROUTINE ADDRESS
{{MOV{R7{R9{{COPY TRBLK POINTER
{{MOV{R10{4*TRLBL(R9){{STORE REAL LABEL IN TRBLK
{{EXI{{{{RETURN
*
*      HERE FOR STOPTR CASE FOR LABEL
*
{TRC05{MOV{R10{4*VRLBL(R9){{STORE LABEL PTR BACK IN VRBLK
{{MOV{#B$VRG{4*VRTRA(R9){{STORE NORMAL TRANSFER ADDRESS
{{EXI{{{{RETURN
{{EJC{{{{
*
*      TRACE (CONTINUED)
*
*      HERE FOR K (KEYWORD)
*
{TRC06{JSR{GTNVR{{{POINT TO VRBLK
{{PPM{TRC16{{{ERROR IF NOT NATURAL VAR
{{BNZ{4*VRLEN(R9){TRC16{{ERROR IF NOT SYSTEM VAR
{{ICA{SP{{{POP STACK
{{BZE{R10{TRC07{{JUMP IF STOPTR CASE
{{MOV{R9{4*TRKVR(R10){{STORE VRBLK PTR IN TRBLK FOR KTREX
*
*      MERGE HERE WITH TRBLK SET UP IN WB (OR ZERO)
*
{TRC07{MOV{4*VRSVP(R9){R9{{POINT TO SVBLK
{{BEQ{R9{#V$ERT{TRC08{JUMP IF ERRTYPE
{{BEQ{R9{#V$STC{TRC09{JUMP IF STCOUNT
{{BNE{R9{#V$FNC{TRC17{ELSE ERROR IF NOT FNCLEVEL
*
*      FNCLEVEL
*
{{MOV{R10{R$FNC{{SET/RESET FNCLEVEL TRACE
{{EXI{{{{RETURN
*
*      ERRTYPE
*
{TRC08{MOV{R10{R$ERT{{SET/RESET ERRTYPE TRACE
{{EXI{{{{RETURN
*
*      STCOUNT
*
{TRC09{MOV{R10{R$STC{{SET/RESET STCOUNT TRACE
{{EXI{{{{RETURN
{{EJC{{{{
*
*      TRACE (CONTINUED)
*
*      A,V MERGE HERE WITH TRTYP VALUE IN WC
*
{TRC10{JSR{GTVAR{{{LOCATE VARIABLE
{{PPM{TRC16{{{ERROR IF NOT APPROPRIATE NAME
{{MOV{(SP)+{R7{{GET NEW TRBLK PTR AGAIN
{{ADD{R10{R6{{POINT TO VARIABLE LOCATION
{{MOV{R6{R9{{COPY VARIABLE POINTER
*
*      LOOP TO SEARCH TRBLK CHAIN
*
{TRC11{MOV{(R9){R10{{POINT TO NEXT ENTRY
{{BNE{(R10){#B$TRT{TRC13{JUMP IF NOT TRBLK
{{BLT{R8{4*TRTYP(R10){TRC13{JUMP IF TOO FAR OUT ON CHAIN
{{BEQ{R8{4*TRTYP(R10){TRC12{JUMP IF THIS MATCHES OUR TYPE
{{ADD{#4*TRNXT{R10{{ELSE POINT TO LINK FIELD
{{MOV{R10{R9{{COPY POINTER
{{BRN{TRC11{{{AND LOOP BACK
*
*      HERE TO DELETE AN OLD TRBLK OF THE TYPE WE WERE GIVEN
*
{TRC12{MOV{4*TRNXT(R10){R10{{GET PTR TO NEXT BLOCK OR VALUE
{{MOV{R10{(R9){{STORE TO DELETE THIS TRBLK
*
*      HERE AFTER DELETING ANY OLD ASSOCIATION OF THIS TYPE
*
{TRC13{BZE{R7{TRC14{{JUMP IF STOPTR CASE
{{MOV{R7{(R9){{ELSE LINK NEW TRBLK IN
{{MOV{R7{R9{{COPY TRBLK POINTER
{{MOV{R10{4*TRNXT(R9){{STORE FORWARD POINTER
{{MOV{R8{4*TRTYP(R9){{STORE APPROPRIATE TRAP TYPE CODE
*
*      HERE TO MAKE SURE VRGET,VRSTO ARE SET PROPERLY
*
{TRC14{MOV{R6{R9{{RECALL POSSIBLE VRBLK POINTER
{{SUB{#4*VRVAL{R9{{POINT BACK TO VRBLK
{{JSR{SETVR{{{SET FIELDS IF VRBLK
{{EXI{{{{RETURN
*
*      HERE FOR BAD TRACE TYPE
*
{TRC15{EXI{2{{{TAKE BAD TRACE TYPE ERROR EXIT
*
*      POP STACK BEFORE FAILING
*
{TRC16{ICA{SP{{{POP STACK
*
*      HERE FOR BAD NAME ARGUMENT
*
{TRC17{EXI{1{{{TAKE BAD NAME ERROR EXIT
{{ENP{{{{END PROCEDURE TRACE
{{EJC{{{{
*
*      TRBLD -- BUILD TRBLK
*
*      TRBLK IS USED BY THE INPUT, OUTPUT AND TRACE FUNCTIONS
*      TO CONSTRUCT A TRBLK (TRAP BLOCK)
*
*      (XR)                  TRTAG OR TRTER
*      (XL)                  TRFNC OR TRFPT
*      (WB)                  TRTYP
*      JSR  TRBLD            CALL TO BUILD TRBLK
*      (XR)                  POINTER TO TRBLK
*      (WA)                  DESTROYED
*
{TRBLD{PRC{E{0{{ENTRY POINT
{{MOV{R9{-(SP){{STACK TRTAG (OR TRFNM)
{{MOV{#4*TRSI${R6{{SET SIZE OF TRBLK
{{JSR{ALLOC{{{ALLOCATE TRBLK
{{MOV{#B$TRT{(R9){{STORE FIRST WORD
{{MOV{R10{4*TRFNC(R9){{STORE TRFNC (OR TRFPT)
{{MOV{(SP)+{4*TRTAG(R9){{STORE TRTAG (OR TRFNM)
{{MOV{R7{4*TRTYP(R9){{STORE TYPE
{{MOV{#NULLS{4*TRVAL(R9){{FOR NOW, A NULL VALUE
{{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE TRBLD
{{EJC{{{{
*
*      TRIMR -- TRIM TRAILING BLANKS
*
*      TRIMR IS PASSED A POINTER TO AN SCBLK WHICH MUST BE THE
*      LAST BLOCK IN DYNAMIC STORAGE. TRAILING BLANKS ARE
*      TRIMMED OFF AND THE DYNAMIC STORAGE POINTER RESET TO
*      THE END OF THE (POSSIBLY) SHORTENED BLOCK.
*
*      (WB)                  NON-ZERO TO TRIM TRAILING BLANKS
*      (XR)                  POINTER TO STRING TO TRIM
*      JSR  TRIMR            CALL TO TRIM STRING
*      (XR)                  POINTER TO TRIMMED STRING
*      (XL,WA,WB,WC)         DESTROYED
*
*      THE CALL WITH WB ZERO STILL PERFORMS THE END ZERO PAD
*      AND DNAMP READJUSTMENT. IT IS USED FROM ACESS IF KVTRM=0.
*
{TRIMR{PRC{E{0{{ENTRY POINT
{{MOV{R9{R10{{COPY STRING POINTER
{{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
{{BZE{R6{TRIM2{{JUMP IF NULL INPUT
{{PLC{R10{R6{{ELSE POINT PAST LAST CHARACTER
{{BZE{R7{TRIM3{{JUMP IF NO TRIM
{{MOV{#CH$BL{R8{{LOAD BLANK CHARACTER
*
*      LOOP THROUGH CHARACTERS FROM RIGHT TO LEFT
*
{TRIM0{LCH{R7{-(R10){{LOAD NEXT CHARACTER
{{BEQ{R7{#CH$HT{TRIM1{JUMP IF HORIZONTAL TAB
{{BNE{R7{R8{TRIM3{JUMP IF NON-BLANK FOUND
{TRIM1{DCV{R6{{{ELSE DECREMENT CHARACTER COUNT
{{BNZ{R6{TRIM0{{LOOP BACK IF MORE TO CHECK
*
*      HERE IF RESULT IS NULL (NULL OR ALL-BLANK INPUT)
*
{TRIM2{MOV{R9{DNAMP{{WIPE OUT INPUT STRING BLOCK
{{MOV{#NULLS{R9{{LOAD NULL RESULT
{{BRN{TRIM5{{{MERGE TO EXIT
{{EJC{{{{
*
*      TRIMR (CONTINUED)
*
*      HERE WITH NON-BLANK FOUND (MERGE FOR NO TRIM)
*
{TRIM3{MOV{R6{4*SCLEN(R9){{SET NEW LENGTH
{{MOV{R9{R10{{COPY STRING POINTER
{{PSC{R10{R6{{READY FOR STORING BLANKS
{{CTB{R6{SCHAR{{GET LENGTH OF BLOCK IN BYTES
{{ADD{R9{R6{{POINT PAST NEW BLOCK
{{MOV{R6{DNAMP{{SET NEW TOP OF STORAGE POINTER
{{LCT{R6{#CFP$C{{GET COUNT OF CHARS IN WORD
{{ZER{R8{{{SET BLANK CHAR
*
*      LOOP TO ZERO PAD LAST WORD OF CHARACTERS
*
{TRIM4{SCH{R8{(R10)+{{STORE ZERO CHARACTER
{{BCT{R6{TRIM4{{LOOP BACK TILL ALL STORED
{{CSC{R10{{{COMPLETE STORE CHARACTERS
*
*      COMMON EXIT POINT
*
{TRIM5{ZER{R10{{{CLEAR GARBAGE XL POINTER
{{EXI{{{{RETURN TO CALLER
{{ENP{{{{END PROCEDURE TRIMR
{{EJC{{{{
*
*      TRXEQ -- EXECUTE FUNCTION TYPE TRACE
*
*      TRXEQ IS USED TO EXECUTE A TRACE WHEN A FOURTH ARGUMENT
*      HAS BEEN SUPPLIED. TRACE HAS ALREADY BEEN DECREMENTED.
*
*      (XR)                  POINTER TO TRBLK
*      (XL,WA)               NAME BASE,OFFSET FOR VARIABLE
*      JSR  TRXEQ            CALL TO EXECUTE TRACE
*      (WB,WC,RA)            DESTROYED
*
*      THE FOLLOWING STACK ENTRIES ARE MADE BEFORE PASSING
*      CONTROL TO THE TRACE FUNCTION USING THE CFUNC ROUTINE.
*
*                            TRXEQ RETURN POINT WORD(S)
*                            SAVED VALUE OF TRACE KEYWORD
*                            TRBLK POINTER
*                            NAME BASE
*                            NAME OFFSET
*                            SAVED VALUE OF R$COD
*                            SAVED CODE PTR (-R$COD)
*                            SAVED VALUE OF FLPTR
*      FLPTR --------------- ZERO (DUMMY FAIL OFFSET)
*                            NMBLK FOR VARIABLE NAME
*      XS ------------------ TRACE TAG
*
*      R$COD AND THE CODE PTR ARE SET TO DUMMY VALUES WHICH
*      CAUSE CONTROL TO RETURN TO THE TRXEQ PROCEDURE ON SUCCESS
*      OR FAILURE (TRXEQ IGNORES A FAILURE CONDITION).
*
{TRXEQ{PRC{R{0{{ENTRY POINT (RECURSIVE)
{{MOV{R$COD{R8{{LOAD CODE BLOCK POINTER
{{SCP{R7{{{GET CURRENT CODE POINTER
{{SUB{R8{R7{{MAKE CODE POINTER INTO OFFSET
{{MOV{KVTRA{-(SP){{STACK TRACE KEYWORD VALUE
{{MOV{R9{-(SP){{STACK TRBLK POINTER
{{MOV{R10{-(SP){{STACK NAME BASE
{{MOV{R6{-(SP){{STACK NAME OFFSET
{{MOV{R8{-(SP){{STACK CODE BLOCK POINTER
{{MOV{R7{-(SP){{STACK CODE POINTER OFFSET
{{MOV{FLPTR{-(SP){{STACK OLD FAILURE POINTER
{{ZER{-(SP){{{SET DUMMY FAIL OFFSET
{{MOV{SP{FLPTR{{SET NEW FAILURE POINTER
{{ZER{KVTRA{{{RESET TRACE KEYWORD TO ZERO
{{MOV{#TRXDC{R8{{LOAD NEW (DUMMY) CODE BLK POINTER
{{MOV{R8{R$COD{{SET AS CODE BLOCK POINTER
{{LCP{R8{{{AND NEW CODE POINTER
{{EJC{{{{
*
*      TRXEQ (CONTINUED)
*
*      NOW PREPARE ARGUMENTS FOR FUNCTION
*
{{MOV{R6{R7{{SAVE NAME OFFSET
{{MOV{#4*NMSI${R6{{LOAD NMBLK SIZE
{{JSR{ALLOC{{{ALLOCATE SPACE FOR NMBLK
{{MOV{#B$NML{(R9){{SET TYPE WORD
{{MOV{R10{4*NMBAS(R9){{STORE NAME BASE
{{MOV{R7{4*NMOFS(R9){{STORE NAME OFFSET
{{MOV{4*6(SP){R10{{RELOAD POINTER TO TRBLK
{{MOV{R9{-(SP){{STACK NMBLK POINTER (1ST ARGUMENT)
{{MOV{4*TRTAG(R10){-(SP){{STACK TRACE TAG (2ND ARGUMENT)
{{MOV{4*TRFNC(R10){R10{{LOAD TRACE FUNCTION POINTER
{{MOV{#NUM02{R6{{SET NUMBER OF ARGUMENTS TO TWO
{{BRN{CFUNC{{{JUMP TO CALL FUNCTION
*
*      SEE O$TXR FOR DETAILS OF RETURN TO THIS POINT
*
{TRXQ1{MOV{FLPTR{SP{{POINT BACK TO OUR STACK ENTRIES
{{ICA{SP{{{POP OFF GARBAGE FAIL OFFSET
{{MOV{(SP)+{FLPTR{{RESTORE OLD FAILURE POINTER
{{MOV{(SP)+{R7{{RELOAD CODE OFFSET
{{MOV{(SP)+{R8{{LOAD OLD CODE BASE POINTER
{{MOV{R8{R9{{COPY CDBLK POINTER
{{MOV{4*CDSTM(R9){KVSTN{{RESTORE STMNT NO
{{MOV{(SP)+{R6{{RELOAD NAME OFFSET
{{MOV{(SP)+{R10{{RELOAD NAME BASE
{{MOV{(SP)+{R9{{RELOAD TRBLK POINTER
{{MOV{(SP)+{KVTRA{{RESTORE TRACE KEYWORD VALUE
{{ADD{R8{R7{{RECOMPUTE ABSOLUTE CODE POINTER
{{LCP{R7{{{RESTORE CODE POINTER
{{MOV{R8{R$COD{{AND CODE BLOCK POINTER
{{EXI{{{{RETURN TO TRXEQ CALLER
{{ENP{{{{END PROCEDURE TRXEQ
{{EJC{{{{
*
*      XSCAN -- EXECUTION FUNCTION ARGUMENT SCAN
*
*      XSCAN SCANS OUT ONE TOKEN IN A PROTOTYPE ARGUMENT IN
*      ARRAY,CLEAR,DATA,DEFINE,LOAD FUNCTION CALLS. XSCAN
*      CALLS MUST BE PRECEDED BY A CALL TO THE INITIALIZATION
*      PROCEDURE XSCNI. THE FOLLOWING VARIABLES ARE USED.
*
*      R$XSC                 POINTER TO SCBLK FOR FUNCTION ARG
*      XSOFS                 OFFSET (NUM CHARS SCANNED SO FAR)
*
*      (WC)                  DELIMITER ONE (CH$XX)
*      (XL)                  DELIMITER TWO (CH$XX)
*      JSR  XSCAN            CALL TO SCAN NEXT ITEM
*      (XR)                  POINTER TO SCBLK FOR TOKEN SCANNED
*      (WA)                  COMPLETION CODE (SEE BELOW)
*      (WC,XL)               DESTROYED
*
*      THE SCAN STARTS FROM THE CURRENT POSITION AND CONTINUES
*      UNTIL ONE OF THE FOLLOWING THREE CONDITIONS OCCURS.
*
*      1)   DELIMITER ONE IS ENCOUNTERED  (WA SET TO 1)
*
*      2)   DELIMITER TWO ENCOUNTERED  (WA SET TO 2)
*
*      3)   END OF STRING ENCOUNTERED  (WA SET TO 0)
*
*      THE RESULT IS A STRING CONTAINING ALL CHARACTERS SCANNED
*      UP TO BUT NOT INCLUDING ANY DELIMITER CHARACTER.
*      THE POINTER IS LEFT POINTING PAST THE DELIMITER.
*
*      IF ONLY ONE DELIMITER IS TO BE DETECTED, DELIMITER ONE
*      AND DELIMITER TWO SHOULD BE SET TO THE SAME VALUE.
*
*      IN THE CASE WHERE THE END OF STRING IS ENCOUNTERED, THE
*      STRING INCLUDES ALL THE CHARACTERS TO THE END OF THE
*      STRING. NO FURTHER CALLS CAN BE MADE TO XSCAN UNTIL
*      XSCNI IS CALLED TO INITIALIZE A NEW ARGUMENT SCAN
{{EJC{{{{
*
*      XSCAN (CONTINUED)
*
{XSCAN{PRC{E{0{{ENTRY POINT
{{MOV{R7{XSCWB{{PRESERVE WB
{{MOV{R$XSC{R9{{POINT TO ARGUMENT STRING
{{MOV{4*SCLEN(R9){R6{{LOAD STRING LENGTH
{{MOV{XSOFS{R7{{LOAD CURRENT OFFSET
{{SUB{R7{R6{{GET NUMBER OF REMAINING CHARACTERS
{{BZE{R6{XSCN2{{JUMP IF NO CHARACTERS LEFT
{{PLC{R9{R7{{POINT TO CURRENT CHARACTER
*
*      LOOP TO SEARCH FOR DELIMITER
*
{XSCN1{LCH{R7{(R9)+{{LOAD NEXT CHARACTER
{{BEQ{R7{R8{XSCN3{JUMP IF DELIMITER ONE FOUND
{{BEQ{R7{R10{XSCN4{JUMP IF DELIMITER TWO FOUND
{{DCV{R6{{{DECREMENT COUNT OF CHARS LEFT
{{BNZ{R6{XSCN1{{LOOP BACK IF MORE CHARS TO GO
*
*      HERE FOR RUNOUT
*
{XSCN2{MOV{R$XSC{R10{{POINT TO STRING BLOCK
{{MOV{4*SCLEN(R10){R6{{GET STRING LENGTH
{{MOV{XSOFS{R7{{LOAD OFFSET
{{SUB{R7{R6{{GET SUBSTRING LENGTH
{{ZER{R$XSC{{{CLEAR STRING PTR FOR COLLECTOR
{{ZER{XSCRT{{{SET ZERO (RUNOUT) RETURN CODE
{{BRN{XSCN6{{{JUMP TO EXIT
{{EJC{{{{
*
*      XSCAN (CONTINUED)
*
*      HERE IF DELIMITER ONE FOUND
*
{XSCN3{MOV{#NUM01{XSCRT{{SET RETURN CODE
{{BRN{XSCN5{{{JUMP TO MERGE
*
*      HERE IF DELIMITER TWO FOUND
*
{XSCN4{MOV{#NUM02{XSCRT{{SET RETURN CODE
*
*      MERGE HERE AFTER DETECTING A DELIMITER
*
{XSCN5{MOV{R$XSC{R10{{RELOAD POINTER TO STRING
{{MOV{4*SCLEN(R10){R8{{GET ORIGINAL LENGTH OF STRING
{{SUB{R6{R8{{MINUS CHARS LEFT = CHARS SCANNED
{{MOV{R8{R6{{MOVE TO REG FOR SBSTR
{{MOV{XSOFS{R7{{SET OFFSET
{{SUB{R7{R6{{COMPUTE LENGTH FOR SBSTR
{{ICV{R8{{{ADJUST NEW CURSOR PAST DELIMITER
{{MOV{R8{XSOFS{{STORE NEW OFFSET
*
*      COMMON EXIT POINT
*
{XSCN6{ZER{R9{{{CLEAR GARBAGE CHARACTER PTR IN XR
{{JSR{SBSTR{{{BUILD SUB-STRING
{{MOV{XSCRT{R6{{LOAD RETURN CODE
{{MOV{XSCWB{R7{{RESTORE WB
{{EXI{{{{RETURN TO XSCAN CALLER
{{ENP{{{{END PROCEDURE XSCAN
{{EJC{{{{
*
*      XSCNI -- EXECUTION FUNCTION ARGUMENT SCAN
*
*      XSCNI INITIALIZES THE SCAN USED FOR PROTOTYPE ARGUMENTS
*      IN THE CLEAR, DEFINE, LOAD, DATA, ARRAY FUNCTIONS. SEE
*      XSCAN FOR THE PROCEDURE WHICH IS USED AFTER THIS CALL.
*
*      -(XS)                 ARGUMENT TO BE SCANNED (ON STACK)
*      JSR  XSCNI            CALL TO SCAN ARGUMENT
*      PPM  LOC              TRANSFER LOC IF ARG IS NOT STRING
*      PPM  LOC              TRANSFER LOC IF ARGUMENT IS NULL
*      (XS)                  POPPED
*      (XR,R$XSC)            ARGUMENT (SCBLK PTR)
*      (WA)                  ARGUMENT LENGTH
*      (IA,RA)               DESTROYED
*
{XSCNI{PRC{N{2{{ENTRY POINT
{{JSR{GTSTG{{{FETCH ARGUMENT AS STRING
{{PPM{XSCI1{{{JUMP IF NOT CONVERTIBLE
{{MOV{R9{R$XSC{{ELSE STORE SCBLK PTR FOR XSCAN
{{ZER{XSOFS{{{SET OFFSET TO ZERO
{{BZE{R6{XSCI2{{JUMP IF NULL STRING
{{EXI{{{{RETURN TO XSCNI CALLER
*
*      HERE IF ARGUMENT IS NOT A STRING
*
{XSCI1{EXI{1{{{TAKE NOT-STRING ERROR EXIT
*
*      HERE FOR NULL STRING
*
{XSCI2{EXI{2{{{TAKE NULL-STRING ERROR EXIT
{{ENP{{{{END PROCEDURE XSCNI
{{TTL{S{{{P I T B O L -- UTILITY ROUTINES
*
*      THE FOLLOWING SECTION CONTAINS UTILITY ROUTINES USED FOR
*      VARIOUS PURPOSES THROUGHOUT THE SYSTEM. THESE DIFFER
*      FROM THE PROCEDURES IN THE UTILITY PROCEDURES SECTION IN
*      THEY ARE NOT IN PROCEDURE FORM AND THEY DO NOT RETURN
*      TO THEIR CALLERS. THEY ARE ACCESSED WITH A BRANCH TYPE
*      INSTRUCTION AFTER SETTING THE REGISTERS TO APPROPRIATE
*      PARAMETER VALUES.
*
*      THE REGISTER VALUES REQUIRED FOR EACH ROUTINE ARE
*      DOCUMENTED AT THE START OF EACH ROUTINE. REGISTERS NOT
*      MENTIONED MAY CONTAIN ANY VALUES EXCEPT THAT XR,XL
*      CAN ONLY CONTAIN PROPER COLLECTABLE POINTERS.
*
*      SOME OF THESE ROUTINES WILL TOLERATE GARBAGE POINTERS
*      IN XL,XR ON ENTRY. THIS IS ALWAYS DOCUMENTED AND IN
*      EACH CASE, THE ROUTINE CLEARS THESE GARBAGE VALUES BEFORE
*      EXITING AFTER COMPLETING ITS TASK.
*
*      THE ROUTINES HAVE NAMES CONSISTING OF FIVE LETTERS
*      AND ARE ASSEMBLED IN ALPHABETICAL ORDER.
{{EJC{{{{
*      ARREF -- ARRAY REFERENCE
*
*      (XL)                  MAY BE NON-COLLECTABLE
*      (XR)                  NUMBER OF SUBSCRIPTS
*      (WB)                  SET ZERO/NONZERO FOR VALUE/NAME
*                            THE VALUE IN WB MUST BE COLLECTABLE
*      STACK                 SUBSCRIPTS AND ARRAY OPERAND
*      BRN  ARREF            JUMP TO CALL FUNCTION
*
*      ARREF CONTINUES BY EXECUTING THE NEXT CODE WORD WITH
*      THE RESULT NAME OR VALUE PLACED ON TOP OF THE STACK.
*      TO DEAL WITH THE PROBLEM OF ACCESSING SUBSCRIPTS IN THE
*      ORDER OF STACKING, XL IS USED AS A SUBSCRIPT POINTER
*      WORKING BELOW THE STACK POINTER.
*
{ARREF{RTN{{{{
{{MOV{R9{R6{{COPY NUMBER OF SUBSCRIPTS
{{MOV{SP{R10{{POINT TO STACK FRONT
{{WTB{R9{{{CONVERT TO BYTE OFFSET
{{ADD{R9{R10{{POINT TO ARRAY OPERAND ON STACK
{{ICA{R10{{{FINAL VALUE FOR STACK POPPING
{{MOV{R10{ARFXS{{KEEP FOR LATER
{{MOV{-(R10){R9{{LOAD ARRAY OPERAND POINTER
{{MOV{R9{R$ARF{{KEEP ARRAY POINTER
{{MOV{R10{R9{{SAVE POINTER TO SUBSCRIPTS
{{MOV{R$ARF{R10{{POINT XL TO POSSIBLE VCBLK OR TBBLK
{{MOV{(R10){R8{{LOAD FIRST WORD
{{BEQ{R8{#B$ART{ARF01{JUMP IF ARBLK
{{BEQ{R8{#B$VCT{ARF07{JUMP IF VCBLK
{{BEQ{R8{#B$TBT{ARF10{JUMP IF TBBLK
{{ERB{235{SUBSCRIPTED{{OPERAND IS NOT TABLE OR ARRAY
*
*      HERE FOR ARRAY (ARBLK)
*
{ARF01{BNE{R6{4*ARNDM(R10){ARF09{JUMP IF WRONG NUMBER OF DIMS
{{LDI{INTV0{{{GET INITIAL SUBSCRIPT OF ZERO
{{MOV{R9{R10{{POINT BEFORE SUBSCRIPTS
{{ZER{R6{{{INITIAL OFFSET TO BOUNDS
{{BRN{ARF03{{{JUMP INTO LOOP
*
*      LOOP TO COMPUTE SUBSCRIPTS BY MULTIPLICATIONS
*
{ARF02{MLI{4*ARDM2(R9){{{MULTIPLY TOTAL BY NEXT DIMENSION
*
*      MERGE HERE FIRST TIME
*
{ARF03{MOV{-(R10){R9{{LOAD NEXT SUBSCRIPT
{{STI{ARFSI{{{SAVE CURRENT SUBSCRIPT
{{LDI{4*ICVAL(R9){{{LOAD INTEGER VALUE IN CASE
{{BEQ{(R9){#B$ICL{ARF04{JUMP IF IT WAS AN INTEGER
{{EJC{{{{
*
*      ARREF (CONTINUED)
*
*
{{JSR{GTINT{{{CONVERT TO INTEGER
{{PPM{ARF12{{{JUMP IF NOT INTEGER
{{LDI{4*ICVAL(R9){{{IF OK, LOAD INTEGER VALUE
*
*      HERE WITH INTEGER SUBSCRIPT IN (IA)
*
{ARF04{MOV{R$ARF{R9{{POINT TO ARRAY
{{ADD{R6{R9{{OFFSET TO NEXT BOUNDS
{{SBI{4*ARLBD(R9){{{SUBTRACT LOW BOUND TO COMPARE
{{IOV{ARF13{{{OUT OF RANGE FAIL IF OVERFLOW
{{ILT{ARF13{{{OUT OF RANGE FAIL IF TOO SMALL
{{SBI{4*ARDIM(R9){{{SUBTRACT DIMENSION
{{IGE{ARF13{{{OUT OF RANGE FAIL IF TOO LARGE
{{ADI{4*ARDIM(R9){{{ELSE RESTORE SUBSCRIPT OFFSET
{{ADI{ARFSI{{{ADD TO CURRENT TOTAL
{{ADD{#4*ARDMS{R6{{POINT TO NEXT BOUNDS
{{BNE{R10{SP{ARF02{LOOP BACK IF MORE TO GO
*
*      HERE WITH INTEGER SUBSCRIPT COMPUTED
*
{{MFI{R6{{{GET AS ONE WORD INTEGER
{{WTB{R6{{{CONVERT TO OFFSET
{{MOV{R$ARF{R10{{POINT TO ARBLK
{{ADD{4*AROFS(R10){R6{{ADD OFFSET PAST BOUNDS
{{ICA{R6{{{ADJUST FOR ARPRO FIELD
{{BNZ{R7{ARF08{{EXIT WITH NAME IF NAME CALL
*
*      MERGE HERE TO GET VALUE FOR VALUE CALL
*
{ARF05{JSR{ACESS{{{GET VALUE
{{PPM{ARF13{{{FAIL IF ACESS FAILS
*
*      RETURN VALUE
*
{ARF06{MOV{ARFXS{SP{{POP STACK ENTRIES
{{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER
{{BRN{EXIXR{{{EXIT WITH VALUE IN XR
{{EJC{{{{
*
*      ARREF (CONTINUED)
*
*      HERE FOR VECTOR
*
{ARF07{BNE{R6{#NUM01{ARF09{ERROR IF MORE THAN 1 SUBSCRIPT
{{MOV{(SP){R9{{ELSE LOAD SUBSCRIPT
{{JSR{GTINT{{{CONVERT TO INTEGER
{{PPM{ARF12{{{ERROR IF NOT INTEGER
{{LDI{4*ICVAL(R9){{{ELSE LOAD INTEGER VALUE
{{SBI{INTV1{{{SUBTRACT FOR ONES OFFSET
{{MFI{R6{ARF13{{GET SUBSCRIPT AS ONE WORD
{{ADD{#VCVLS{R6{{ADD OFFSET FOR STANDARD FIELDS
{{WTB{R6{{{CONVERT OFFSET TO BYTES
{{BGE{R6{4*VCLEN(R10){ARF13{FAIL IF OUT OF RANGE SUBSCRIPT
{{BZE{R7{ARF05{{BACK TO GET VALUE IF VALUE CALL
*
*      RETURN NAME
*
{ARF08{MOV{ARFXS{SP{{POP STACK ENTRIES
{{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER
{{BRN{EXNAM{{{ELSE EXIT WITH NAME
*
*      HERE IF SUBSCRIPT COUNT IS WRONG
*
{ARF09{ERB{236{ARRAY{{REFERENCED WITH WRONG NUMBER OF SUBSCRIPTS
*
*      TABLE
*
{ARF10{BNE{R6{#NUM01{ARF11{ERROR IF MORE THAN 1 SUBSCRIPT
{{MOV{(SP){R9{{ELSE LOAD SUBSCRIPT
{{JSR{TFIND{{{CALL TABLE SEARCH ROUTINE
{{PPM{ARF13{{{FAIL IF FAILED
{{BNZ{R7{ARF08{{EXIT WITH NAME IF NAME CALL
{{BRN{ARF06{{{ELSE EXIT WITH VALUE
*
*      HERE FOR BAD TABLE REFERENCE
*
{ARF11{ERB{237{TABLE{{REFERENCED WITH MORE THAN ONE SUBSCRIPT
*
*      HERE FOR BAD SUBSCRIPT
*
{ARF12{ERB{238{ARRAY{{SUBSCRIPT IS NOT INTEGER
*
*      HERE TO SIGNAL FAILURE
*
{ARF13{ZER{R$ARF{{{FINISHED WITH ARRAY POINTER
{{BRN{EXFAL{{{FAIL
{{EJC{{{{
*
*      CFUNC -- CALL A FUNCTION
*
*      CFUNC IS USED TO CALL A SNOBOL LEVEL FUNCTION. IT IS
*      USED BY THE APPLY FUNCTION (S$APP), THE FUNCTION
*      TRACE ROUTINE (TRXEQ) AND THE MAIN FUNCTION CALL ENTRY
*      (O$FNC, O$FNS). IN THE LATTER CASES, CFUNC IS USED ONLY
*      IF THE NUMBER OF ARGUMENTS IS INCORRECT.
*
*      (XL)                  POINTER TO FUNCTION BLOCK
*      (WA)                  ACTUAL NUMBER OF ARGUMENTS
*      (XS)                  POINTS TO STACKED ARGUMENTS
*      BRN  CFUNC            JUMP TO CALL FUNCTION
*
*      CFUNC CONTINUES BY EXECUTING THE FUNCTION
*
{CFUNC{RTN{{{{
{{BLT{R6{4*FARGS(R10){CFNC1{JUMP IF TOO FEW ARGUMENTS
{{BEQ{R6{4*FARGS(R10){CFNC3{JUMP IF CORRECT NUMBER OF ARGS
*
*      HERE IF TOO MANY ARGUMENTS SUPPLIED, POP THEM OFF
*
{{MOV{R6{R7{{COPY ACTUAL NUMBER
{{SUB{4*FARGS(R10){R7{{GET NUMBER OF EXTRA ARGS
{{WTB{R7{{{CONVERT TO BYTES
{{ADD{R7{SP{{POP OFF UNWANTED ARGUMENTS
{{BRN{CFNC3{{{JUMP TO GO OFF TO FUNCTION
*
*      HERE IF TOO FEW ARGUMENTS
*
{CFNC1{MOV{4*FARGS(R10){R7{{LOAD REQUIRED NUMBER OF ARGUMENTS
{{BEQ{R7{#NINI9{CFNC3{JUMP IF CASE OF VAR NUM OF ARGS
{{SUB{R6{R7{{CALCULATE NUMBER MISSING
{{LCT{R7{R7{{SET COUNTER TO CONTROL LOOP
*
*      LOOP TO SUPPLY EXTRA NULL ARGUMENTS
*
{CFNC2{MOV{#NULLS{-(SP){{STACK A NULL ARGUMENT
{{BCT{R7{CFNC2{{LOOP TILL PROPER NUMBER STACKED
*
*      MERGE HERE TO JUMP TO FUNCTION
*
{CFNC3{BRI{(R10){{{JUMP THROUGH FCODE FIELD
{{EJC{{{{
*
*      EXFAL -- EXIT SIGNALLING SNOBOL FAILURE
*
*      (XL,XR)               MAY BE NON-COLLECTABLE
*      BRN  EXFAL            JUMP TO FAIL
*
*      EXFAL CONTINUES BY EXECUTING THE APPROPRIATE FAIL GOTO
*
{EXFAL{RTN{{{{
{{MOV{FLPTR{SP{{POP STACK
{{MOV{(SP){R9{{LOAD FAILURE OFFSET
{{ADD{R$COD{R9{{POINT TO FAILURE CODE LOCATION
{{LCP{R9{{{SET CODE POINTER
{{BRN{EXITS{{{DO NEXT CODE WORD
{{EJC{{{{
*
*      EXINT -- EXIT WITH INTEGER RESULT
*
*      (XL,XR)               MAY BE NONCOLLECTABLE
*      (IA)                  INTEGER VALUE
*      BRN  EXINT            JUMP TO EXIT WITH INTEGER
*
*      EXINT CONTINUES BY EXECUTING THE NEXT CODE WORD
*      WHICH IT DOES BY FALLING THROUGH TO EXIXR
*
{EXINT{RTN{{{{
{{JSR{ICBLD{{{BUILD ICBLK
{{EJC{{{{
*      EXIXR -- EXIT WITH RESULT IN (XR)
*
*      (XR)                  RESULT
*      (XL)                  MAY BE NON-COLLECTABLE
*      BRN  EXIXR            JUMP TO EXIT WITH RESULT IN (XR)
*
*      EXIXR CONTINUES BY EXECUTING THE NEXT CODE WORD
*      WHICH IT DOES BY FALLING THROUGH TO EXITS.
{EXIXR{RTN{{{{
*
{{MOV{R9{-(SP){{STACK RESULT
*
*
*      EXITS -- EXIT WITH RESULT IF ANY STACKED
*
*      (XR,XL)               MAY BE NON-COLLECTABLE
*
*      BRN  EXITS            ENTER EXITS ROUTINE
*
{EXITS{RTN{{{{
{{LCW{R9{{{LOAD NEXT CODE WORD
{{MOV{(R9){R10{{LOAD ENTRY ADDRESS
{{BRI{R10{{{JUMP TO EXECUTE NEXT CODE WORD
{{EJC{{{{
*
*      EXNAM -- EXIT WITH NAME IN (XL,WA)
*
*      (XL)                  NAME BASE
*      (WA)                  NAME OFFSET
*      (XR)                  MAY BE NON-COLLECTABLE
*      BRN  EXNAM            JUMP TO EXIT WITH NAME IN (XL,WA)
*
*      EXNAM CONTINUES BY EXECUTING THE NEXT CODE WORD
*
{EXNAM{RTN{{{{
{{MOV{R10{-(SP){{STACK NAME BASE
{{MOV{R6{-(SP){{STACK NAME OFFSET
{{BRN{EXITS{{{DO NEXT CODE WORD
{{EJC{{{{
*
*      EXNUL -- EXIT WITH NULL RESULT
*
*      (XL,XR)               MAY BE NON-COLLECTABLE
*      BRN  EXNUL            JUMP TO EXIT WITH NULL VALUE
*
*      EXNUL CONTINUES BY EXECUTING THE NEXT CODE WORD
*
{EXNUL{RTN{{{{
{{MOV{#NULLS{-(SP){{STACK NULL VALUE
{{BRN{EXITS{{{DO NEXT CODE WORD
{{EJC{{{{
*
*      EXREA -- EXIT WITH REAL RESULT
*
*      (XL,XR)               MAY BE NON-COLLECTABLE
*      (RA)                  REAL VALUE
*      BRN  EXREA            JUMP TO EXIT WITH REAL VALUE
*
*      EXREA CONTINUES BY EXECUTING THE NEXT CODE WORD
*
{EXREA{RTN{{{{
{{JSR{RCBLD{{{BUILD RCBLK
{{BRN{EXIXR{{{JUMP TO EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      EXSID -- EXIT SETTING ID FIELD
*
*      EXSID IS USED TO EXIT AFTER BUILDING ANY OF THE FOLLOWING
*      BLOCKS (ARBLK, TBBLK, PDBLK, VCBLK). IT SETS THE IDVAL.
*
*      (XR)                  PTR TO BLOCK WITH IDVAL FIELD
*      (XL)                  MAY BE NON-COLLECTABLE
*      BRN  EXSID            JUMP TO EXIT AFTER SETTING ID FIELD
*
*      EXSID CONTINUES BY EXECUTING THE NEXT CODE WORD
*
{EXSID{RTN{{{{
{{MOV{CURID{R6{{LOAD CURRENT ID VALUE
{{BNE{R6{#CFP$M{EXSI1{JUMP IF NO OVERFLOW
{{ZER{R6{{{ELSE RESET FOR WRAPAROUND
*
*      HERE WITH OLD IDVAL IN WA
*
{EXSI1{ICV{R6{{{BUMP ID VALUE
{{MOV{R6{CURID{{STORE FOR NEXT TIME
{{MOV{R6{4*IDVAL(R9){{STORE ID VALUE
{{BRN{EXIXR{{{EXIT WITH RESULT IN (XR)
{{EJC{{{{
*
*      EXVNM -- EXIT WITH NAME OF VARIABLE
*
*      EXVNM EXITS AFTER STACKING A VALUE WHICH IS A NMBLK
*      REFERENCING THE NAME OF A GIVEN NATURAL VARIABLE.
*
*      (XR)                  VRBLK POINTER
*      (XL)                  MAY BE NON-COLLECTABLE
*      BRN  EXVNM            EXIT WITH VRBLK POINTER IN XR
*
{EXVNM{RTN{{{{
{{MOV{R9{R10{{COPY NAME BASE POINTER
{{MOV{#4*NMSI${R6{{SET SIZE OF NMBLK
{{JSR{ALLOC{{{ALLOCATE NMBLK
{{MOV{#B$NML{(R9){{STORE TYPE WORD
{{MOV{R10{4*NMBAS(R9){{STORE NAME BASE
{{MOV{#4*VRVAL{4*NMOFS(R9){{STORE NAME OFFSET
{{BRN{EXIXR{{{EXIT WITH RESULT IN XR
{{EJC{{{{
*
*      FLPOP -- FAIL AND POP IN PATTERN MATCHING
*
*      FLPOP POPS THE NODE AND CURSOR ON THE STACK AND THEN
*      DROPS THROUGH INTO FAILP TO CAUSE PATTERN FAILURE
*
*      (XL,XR)               MAY BE NON-COLLECTABLE
*      BRN  FLPOP            JUMP TO FAIL AND POP STACK
*
{FLPOP{RTN{{{{
{{ADD{#4*NUM02{SP{{POP TWO ENTRIES OFF STACK
{{EJC{{{{
*
*      FAILP -- FAILURE IN MATCHING PATTERN NODE
*
*      FAILP IS USED AFTER FAILING TO MATCH A PATTERN NODE.
*      SEE PATTERN MATCH ROUTINES FOR DETAILS OF USE.
*
*      (XL,XR)               MAY BE NON-COLLECTABLE
*      BRN  FAILP            SIGNAL FAILURE TO MATCH
*
*      FAILP CONTINUES BY MATCHING AN ALTERNATIVE FROM THE STACK
*
{FAILP{RTN{{{{
{{MOV{(SP)+{R9{{LOAD ALTERNATIVE NODE POINTER
{{MOV{(SP)+{R7{{RESTORE OLD CURSOR
{{MOV{(R9){R10{{LOAD PCODE ENTRY POINTER
{{BRI{R10{{{JUMP TO EXECUTE CODE FOR NODE
{{EJC{{{{
*
*      INDIR -- COMPUTE INDIRECT REFERENCE
*
*      (WB)                  NONZERO/ZERO FOR BY NAME/VALUE
*      BRN  INDIR            JUMP TO GET INDIRECT REF ON STACK
*
*      INDIR CONTINUES BY EXECUTING THE NEXT CODE WORD
*
{INDIR{RTN{{{{
{{MOV{(SP)+{R9{{LOAD ARGUMENT
{{BEQ{(R9){#B$NML{INDR2{JUMP IF A NAME
{{JSR{GTNVR{{{ELSE CONVERT TO VARIABLE
{{ERR{239{INDIRECTION{{OPERAND IS NOT NAME
{{BZE{R7{INDR1{{SKIP IF BY VALUE
{{MOV{R9{-(SP){{ELSE STACK VRBLK PTR
{{MOV{#4*VRVAL{-(SP){{STACK NAME OFFSET
{{BRN{EXITS{{{EXIT WITH RESULT ON STACK
*
*      HERE TO GET VALUE OF NATURAL VARIABLE
*
{INDR1{BRI{(R9){{{JUMP THROUGH VRGET FIELD OF VRBLK
*
*      HERE IF OPERAND IS A NAME
*
{INDR2{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
{{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET
{{BNZ{R7{EXNAM{{EXIT IF CALLED BY NAME
{{JSR{ACESS{{{ELSE GET VALUE FIRST
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{BRN{EXIXR{{{ELSE RETURN WITH VALUE IN XR
{{EJC{{{{
*
*      MATCH -- INITIATE PATTERN MATCH
*
*      (WB)                  MATCH TYPE CODE
*      BRN  MATCH            JUMP TO INITIATE PATTERN MATCH
*
*      MATCH CONTINUES BY EXECUTING THE PATTERN MATCH. SEE
*      PATTERN MATCH ROUTINES (P$XXX) FOR FULL DETAILS.
*
{MATCH{RTN{{{{
{{MOV{(SP)+{R9{{LOAD PATTERN OPERAND
{{JSR{GTPAT{{{CONVERT TO PATTERN
{{ERR{240{PATTERN{{MATCH RIGHT OPERAND IS NOT PATTERN
{{MOV{R9{R10{{IF OK, SAVE PATTERN POINTER
{{BNZ{R7{MTCH1{{JUMP IF NOT MATCH BY NAME
{{MOV{(SP){R6{{ELSE LOAD NAME OFFSET
{{MOV{R10{-(SP){{SAVE PATTERN POINTER
{{MOV{4*2(SP){R10{{LOAD NAME BASE
{{JSR{ACESS{{{ACCESS SUBJECT VALUE
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{MOV{(SP){R10{{RESTORE PATTERN POINTER
{{MOV{R9{(SP){{STACK SUBJECT STRING VAL FOR MERGE
{{ZER{R7{{{RESTORE TYPE CODE
*
*      MERGE HERE WITH SUBJECT VALUE ON STACK
*
{MTCH1{MOV{(SP){R9{{LOAD SUBJECT VALUE
{{ZER{R$PMB{{{ASSUME NOT A BUFFER
{{BNE{(R9){#B$BCT{MTCHA{BRANCH IF NOT
{{ICA{SP{{{ELSE POP VALUE
{{MOV{R9{R$PMB{{SAVE POINTER
{{MOV{4*BCLEN(R9){R6{{GET DEFINED LENGTH
{{MOV{4*BCBUF(R9){R9{{POINT TO BFBLK
{{BRN{MTCHB{{{
*
*      HERE IF NOT BUFFER TO CONVERT TO STRING
*
{MTCHA{JSR{GTSTG{{{NOT BUFFER - CONVERT TO STRING
{{ERR{241{PATTERN{{MATCH LEFT OPERAND IS NOT STRING
*
*      MERGE WITH BUFFER OR STRING
*
{MTCHB{MOV{R9{R$PMS{{IF OK, STORE SUBJECT STRING POINTER
{{MOV{R6{PMSSL{{AND LENGTH
{{MOV{R7{-(SP){{STACK MATCH TYPE CODE
{{ZER{-(SP){{{STACK INITIAL CURSOR (ZERO)
{{ZER{R7{{{SET INITIAL CURSOR
{{MOV{SP{PMHBS{{SET HISTORY STACK BASE PTR
{{ZER{PMDFL{{{RESET PATTERN ASSIGNMENT FLAG
{{MOV{R10{R9{{SET INITIAL NODE POINTER
{{BNZ{KVANC{MTCH2{{JUMP IF ANCHORED
*
*      HERE FOR UNANCHORED
*
{{MOV{R9{-(SP){{STACK INITIAL NODE POINTER
{{MOV{#NDUNA{-(SP){{STACK POINTER TO ANCHOR MOVE NODE
{{BRI{(R9){{{START MATCH OF FIRST NODE
*
*      HERE IN ANCHORED MODE
*
{MTCH2{ZER{-(SP){{{DUMMY CURSOR VALUE
{{MOV{#NDABO{-(SP){{STACK POINTER TO ABORT NODE
{{BRI{(R9){{{START MATCH OF FIRST NODE
{{EJC{{{{
*
*      RETRN -- RETURN FROM FUNCTION
*
*      (WA)                  STRING POINTER FOR RETURN TYPE
*      BRN  RETRN            JUMP TO RETURN FROM (SNOBOL) FUNC
*
*      RETRN CONTINUES BY EXECUTING THE CODE AT THE RETURN POINT
*      THE STACK IS CLEANED OF ANY GARBAGE LEFT BY OTHER
*      ROUTINES WHICH MAY HAVE ALTERED FLPTR SINCE FUNCTION
*      ENTRY BY USING FLPRT, RESERVED FOR USE ONLY BY
*      FUNCTION CALL AND RETURN.
*
{RETRN{RTN{{{{
{{BNZ{KVFNC{RTN01{{JUMP IF NOT LEVEL ZERO
{{ERB{242{FUNCTION{{RETURN FROM LEVEL ZERO
*
*      HERE IF NOT LEVEL ZERO RETURN
*
{RTN01{MOV{FLPRT{SP{{POP STACK
{{ICA{SP{{{REMOVE FAILURE OFFSET
{{MOV{(SP)+{R9{{POP PFBLK POINTER
{{MOV{(SP)+{FLPTR{{POP FAILURE POINTER
{{MOV{(SP)+{FLPRT{{POP OLD FLPRT
{{MOV{(SP)+{R7{{POP CODE POINTER OFFSET
{{MOV{(SP)+{R8{{POP OLD CODE BLOCK POINTER
{{ADD{R8{R7{{MAKE OLD CODE POINTER ABSOLUTE
{{LCP{R7{{{RESTORE OLD CODE POINTER
{{MOV{R8{R$COD{{RESTORE OLD CODE BLOCK POINTER
{{DCV{KVFNC{{{DECREMENT FUNCTION LEVEL
{{MOV{KVTRA{R7{{LOAD TRACE
{{ADD{KVFTR{R7{{ADD FTRACE
{{BZE{R7{RTN06{{JUMP IF NO TRACING POSSIBLE
*
*      HERE IF THERE MAY BE A TRACE
*
{{MOV{R6{-(SP){{SAVE FUNCTION RETURN TYPE
{{MOV{R9{-(SP){{SAVE PFBLK POINTER
{{MOV{R6{KVRTN{{SET RTNTYPE FOR TRACE FUNCTION
{{MOV{R$FNC{R10{{LOAD FNCLEVEL TRBLK PTR (IF ANY)
{{JSR{KTREX{{{EXECUTE POSSIBLE FNCLEVEL TRACE
{{MOV{4*PFVBL(R9){R10{{LOAD VRBLK PTR (SGD13)
{{BZE{KVTRA{RTN02{{JUMP IF TRACE IS OFF
{{MOV{4*PFRTR(R9){R9{{ELSE LOAD RETURN TRACE TRBLK PTR
{{BZE{R9{RTN02{{JUMP IF NOT RETURN TRACED
{{DCV{KVTRA{{{ELSE DECREMENT TRACE COUNT
{{BZE{4*TRFNC(R9){RTN03{{JUMP IF PRINT TRACE
{{MOV{#4*VRVAL{R6{{ELSE SET NAME OFFSET
{{MOV{4*1(SP){KVRTN{{MAKE SURE RTNTYPE IS SET RIGHT
{{JSR{TRXEQ{{{EXECUTE FULL TRACE
{{EJC{{{{
*
*      RETRN (CONTINUED)
*
*      HERE TO TEST FOR FTRACE
*
{RTN02{BZE{KVFTR{RTN05{{JUMP IF FTRACE IS OFF
{{DCV{KVFTR{{{ELSE DECREMENT FTRACE
*
*      HERE FOR PRINT TRACE OF FUNCTION RETURN
*
{RTN03{JSR{PRTSN{{{PRINT STATEMENT NUMBER
{{MOV{4*1(SP){R9{{LOAD RETURN TYPE
{{JSR{PRTST{{{PRINT IT
{{MOV{#CH$BL{R6{{LOAD BLANK
{{JSR{PRTCH{{{PRINT IT
{{MOV{(SP){R10{{LOAD PFBLK PTR
{{MOV{4*PFVBL(R10){R10{{LOAD FUNCTION VRBLK PTR
{{MOV{#4*VRVAL{R6{{SET VRBLK NAME OFFSET
{{BNE{R9{#SCFRT{RTN04{JUMP IF NOT FRETURN CASE
*
*      FOR FRETURN, JUST PRINT FUNCTION NAME
*
{{JSR{PRTNM{{{PRINT NAME
{{JSR{PRTNL{{{TERMINATE PRINT LINE
{{BRN{RTN05{{{MERGE
*
*      HERE FOR RETURN OR NRETURN, PRINT FUNCTION NAME = VALUE
*
{RTN04{JSR{PRTNV{{{PRINT NAME = VALUE
*
*      HERE AFTER COMPLETING TRACE
*
{RTN05{MOV{(SP)+{R9{{POP PFBLK POINTER
{{MOV{(SP)+{R6{{POP RETURN TYPE STRING
*
*      MERGE HERE IF NO TRACE REQUIRED
*
{RTN06{MOV{R6{KVRTN{{SET RTNTYPE KEYWORD
{{MOV{4*PFVBL(R9){R10{{LOAD POINTER TO FN VRBLK
{{EJC{{{{
*      RETRN (CONTINUED)
*
*      GET VALUE OF FUNCTION
*
{RTN07{MOV{R10{RTNBP{{SAVE BLOCK POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD VALUE
{{BEQ{(R10){#B$TRT{RTN07{LOOP BACK IF TRAPPED
{{MOV{R10{RTNFV{{ELSE SAVE FUNCTION RESULT VALUE
{{MOV{(SP)+{RTNSV{{SAVE ORIGINAL FUNCTION VALUE
{{MOV{(SP)+{R10{{POP SAVED POINTER
{{BZE{R10{RTN7C{{NO ACTION IF NONE
{{BZE{KVPFL{RTN7C{{JUMP IF NO PROFILING
{{JSR{PRFLU{{{ELSE PROFILE LAST FUNC STMT
{{BEQ{KVPFL{#NUM02{RTN7A{BRANCH ON VALUE OF PROFILE KEYWD
*
*      HERE IF &PROFILE = 1. START TIME MUST BE FRIGGED TO
*      APPEAR EARLIER THAN IT ACTUALLY IS, BY AMOUNT USED BEFORE
*      THE CALL.
*
{{LDI{PFSTM{{{LOAD CURRENT TIME
{{SBI{4*ICVAL(R10){{{FRIG BY SUBTRACTING SAVED AMOUNT
{{BRN{RTN7B{{{AND MERGE
*
*      HERE IF &PROFILE = 2
*
{RTN7A{LDI{4*ICVAL(R10){{{LOAD SAVED TIME
*
*      BOTH PROFILE TYPES MERGE HERE
*
{RTN7B{STI{PFSTM{{{STORE BACK CORRECT START TIME
*
*      MERGE HERE IF NO PROFILING
*
{RTN7C{MOV{4*FARGS(R9){R7{{GET NUMBER OF ARGS
{{ADD{4*PFNLO(R9){R7{{ADD NUMBER OF LOCALS
{{BZE{R7{RTN10{{JUMP IF NO ARGS/LOCALS
{{LCT{R7{R7{{ELSE SET LOOP COUNTER
{{ADD{4*PFLEN(R9){R9{{AND POINT TO END OF PFBLK
*
*      LOOP TO RESTORE FUNCTIONS AND LOCALS
*
{RTN08{MOV{-(R9){R10{{LOAD NEXT VRBLK POINTER
*
*      LOOP TO FIND VALUE BLOCK
*
{RTN09{MOV{R10{R6{{SAVE BLOCK POINTER
{{MOV{4*VRVAL(R10){R10{{LOAD POINTER TO NEXT VALUE
{{BEQ{(R10){#B$TRT{RTN09{LOOP BACK IF TRAPPED
{{MOV{R6{R10{{ELSE RESTORE LAST BLOCK POINTER
{{MOV{(SP)+{4*VRVAL(R10){{RESTORE OLD VARIABLE VALUE
{{BCT{R7{RTN08{{LOOP TILL ALL PROCESSED
*
*      NOW RESTORE FUNCTION VALUE AND EXIT
*
{RTN10{MOV{RTNBP{R10{{RESTORE PTR TO LAST FUNCTION BLOCK
{{MOV{RTNSV{4*VRVAL(R10){{RESTORE OLD FUNCTION VALUE
{{MOV{RTNFV{R9{{RELOAD FUNCTION RESULT
{{MOV{R$COD{R10{{POINT TO NEW CODE BLOCK
{{MOV{KVSTN{KVLST{{SET LASTNO FROM STNO
{{MOV{4*CDSTM(R10){KVSTN{{RESET PROPER STNO VALUE
{{MOV{KVRTN{R6{{LOAD RETURN TYPE
{{BEQ{R6{#SCRTN{EXIXR{EXIT WITH RESULT IN XR IF RETURN
{{BEQ{R6{#SCFRT{EXFAL{FAIL IF FRETURN
{{EJC{{{{
*
*      RETRN (CONTINUED)
*
*      HERE FOR NRETURN
*
{{BEQ{(R9){#B$NML{RTN11{JUMP IF IS A NAME
{{JSR{GTNVR{{{ELSE TRY CONVERT TO VARIABLE NAME
{{ERR{243{FUNCTION{{RESULT IN NRETURN IS NOT NAME
{{MOV{R9{R10{{IF OK, COPY VRBLK (NAME BASE) PTR
{{MOV{#4*VRVAL{R6{{SET NAME OFFSET
{{BRN{RTN12{{{AND MERGE
*
*      HERE IF RETURNED RESULT IS A NAME
*
{RTN11{MOV{4*NMBAS(R9){R10{{LOAD NAME BASE
{{MOV{4*NMOFS(R9){R6{{LOAD NAME OFFSET
*
*      MERGE HERE WITH RETURNED NAME IN (XL,WA)
*
{RTN12{MOV{R10{R9{{PRESERVE XL
{{LCW{R7{{{LOAD NEXT WORD
{{MOV{R9{R10{{RESTORE XL
{{BEQ{R7{#OFNE${EXNAM{EXIT IF CALLED BY NAME
{{MOV{R7{-(SP){{ELSE SAVE CODE WORD
{{JSR{ACESS{{{GET VALUE
{{PPM{EXFAL{{{FAIL IF ACCESS FAILS
{{MOV{R9{R10{{IF OK, COPY RESULT
{{MOV{(SP){R9{{RELOAD NEXT CODE WORD
{{MOV{R10{(SP){{STORE RESULT ON STACK
{{MOV{(R9){R10{{LOAD ROUTINE ADDRESS
{{BRI{R10{{{JUMP TO EXECUTE NEXT CODE WORD
{{EJC{{{{
*
*      STCOV -- SIGNAL STATEMENT COUNTER OVERFLOW
*
*      BRN  STCOV            JUMP TO SIGNAL STATEMENT COUNT OFLO
*
*      PERMIT UP TO 10 MORE STATEMENTS TO BE OBEYED SO THAT
*      SETEXIT TRAP CAN REGAIN CONTROL.
*      STCOV CONTINUES BY ISSUING THE ERROR MESSAGE
*
{STCOV{RTN{{{{
{{ICV{ERRFT{{{FATAL ERROR
{{LDI{INTVT{{{GET 10
{{ADI{KVSTL{{{ADD TO FORMER LIMIT
{{STI{KVSTL{{{STORE AS NEW STLIMIT
{{LDI{INTVT{{{GET 10
{{STI{KVSTC{{{SET AS NEW COUNT
{{ERB{244{STATEMENT{{COUNT EXCEEDS VALUE OF STLIMIT KEYWORD
{{EJC{{{{
*
*      STMGO -- START EXECUTION OF NEW STATEMENT
*
*      (XR)                  POINTER TO CDBLK FOR NEW STATEMENT
*      BRN  STMGO            JUMP TO EXECUTE NEW STATEMENT
*
*      STMGO CONTINUES BY EXECUTING THE NEXT STATEMENT
*
{STMGO{RTN{{{{
{{MOV{R9{R$COD{{SET NEW CODE BLOCK POINTER
{{BZE{KVPFL{STGO1{{SKIP IF NO PROFILING
{{JSR{PRFLU{{{ELSE PROFILE THE STATEMENT
{STGO1{MOV{KVSTN{KVLST{{SET LASTNO
{{MOV{4*CDSTM(R9){KVSTN{{SET STNO
{{ADD{#4*CDCOD{R9{{POINT TO FIRST CODE WORD
{{LCP{R9{{{SET CODE POINTER
{{LDI{KVSTC{{{GET STMT COUNT
{{ILT{EXITS{{{OMIT COUNTING IF NEGATIVE
{{IEQ{STCOV{{{FAIL IF STLIMIT REACHED
{{SBI{INTV1{{{DECREMENT
{{STI{KVSTC{{{REPLACE IT
{{BZE{R$STC{EXITS{{EXIT IF NO STCOUNT TRACE
*
*      HERE FOR STCOUNT TRACE
*
{{ZER{R9{{{CLEAR GARBAGE VALUE IN XR
{{MOV{R$STC{R10{{LOAD POINTER TO STCOUNT TRBLK
{{JSR{KTREX{{{EXECUTE KEYWORD TRACE
{{BRN{EXITS{{{AND THEN EXIT FOR NEXT CODE WORD
{{EJC{{{{
*
*      STOPR -- TERMINATE RUN
*
*      (XR)                  POINTS TO ENDING MESSAGE
*      BRN STOPR             JUMP TO TERMINATE RUN
*
*      TERMINATE RUN AND PRINT STATISTICS.  ON ENTRY XR POINTS
*      TO ENDING MESSAGE OR IS ZERO IF MESSAGE  PRINTED ALREADY.
*
{STOPR{RTN{{{{
{{BZE{R9{STPRA{{SKIP IF SYSAX ALREADY CALLED (REG04)
{{JSR{SYSAX{{{CALL AFTER EXECUTION PROC
{STPRA{ADD{RSMEM{DNAME{{USE THE RESERVE MEMORY
{{BNE{R9{#ENDMS{STPR0{SKIP IF NOT NORMAL END MESSAGE
{{BNZ{EXSTS{STPR3{{SKIP IF EXEC STATS SUPPRESSED
{{ZER{ERICH{{{CLEAR ERRORS TO INT.CH. FLAG
*
*      LOOK TO SEE IF AN ENDING MESSAGE IS SUPPLIED
*
{STPR0{JSR{PRTPG{{{EJECT PRINTER
{{BZE{R9{STPR1{{SKIP IF NO MESSAGE
{{JSR{PRTST{{{PRINT MESSAGE
*
*      MERGE HERE IF NO MESSAGE TO PRINT
*
{STPR1{JSR{PRTIS{{{PRINT BLANK LINE
{{MTI{KVSTN{{{GET STATEMENT NUMBER
{{MOV{#STPM1{R9{{POINT TO MESSAGE /IN STATEMENT XXX/
{{JSR{PRTMX{{{PRINT IT
{{JSR{SYSTM{{{GET CURRENT TIME
{{SBI{TIMSX{{{MINUS START TIME = ELAPSED EXEC TIM
{{STI{STPTI{{{SAVE FOR LATER
{{MOV{#STPM3{R9{{POINT TO MSG /EXECUTION TIME MSEC /
{{JSR{PRTMX{{{PRINT IT
{{LDI{KVSTL{{{GET STATEMENT LIMIT
{{ILT{STPR2{{{SKIP IF NEGATIVE
{{SBI{KVSTC{{{MINUS COUNTER = COUNT
{{STI{STPSI{{{SAVE
{{MOV{#STPM2{R9{{POINT TO MESSAGE /STMTS EXECUTED/
{{JSR{PRTMX{{{PRINT IT
{{LDI{STPTI{{{RELOAD ELAPSED TIME
{{MLI{INTTH{{{*1000 (MICROSECS)
{{IOV{STPR2{{{JUMP IF WE CANNOT COMPUTE
{{DVI{STPSI{{{DIVIDE BY STATEMENT COUNT
{{IOV{STPR2{{{JUMP IF OVERFLOW
{{MOV{#STPM4{R9{{POINT TO MSG (MCSEC PER STATEMENT /
{{JSR{PRTMX{{{PRINT IT
{{EJC{{{{
*
*      STOPR (CONTINUED)
*
*      MERGE TO SKIP MESSAGE (OVERFLOW OR NEGATIVE STLIMIT)
*
{STPR2{MTI{GBCNT{{{LOAD COUNT OF COLLECTIONS
{{MOV{#STPM5{R9{{POINT TO MESSAGE /REGENERATIONS /
{{JSR{PRTMX{{{PRINT IT
{{JSR{PRTIS{{{ONE MORE BLANK FOR LUCK
*
*      CHECK IF DUMP REQUESTED
*
{STPR3{JSR{PRFLR{{{PRINT PROFILE IF WANTED
*
{{MOV{KVDMP{R9{{LOAD DUMP KEYWORD
{{JSR{DUMPR{{{EXECUTE DUMP IF REQUESTED
{{MOV{R$FCB{R10{{GET FCBLK CHAIN HEAD
{{MOV{KVABE{R6{{LOAD ABEND VALUE
{{MOV{KVCOD{R7{{LOAD CODE VALUE
{{JSR{SYSEJ{{{EXIT TO SYSTEM
{{EJC{{{{
*
*      SUCCP -- SIGNAL SUCCESSFUL MATCH OF A PATTERN NODE
*
*      SEE PATTERN MATCH ROUTINES FOR DETAILS
*
*      (XR)                  CURRENT NODE
*      (WB)                  CURRENT CURSOR
*      (XL)                  MAY BE NON-COLLECTABLE
*      BRN  SUCCP            SIGNAL SUCCESSFUL PATTERN MATCH
*
*      SUCCP CONTINUES BY MATCHING THE SUCCESSOR NODE
*
{SUCCP{RTN{{{{
{{MOV{4*PTHEN(R9){R9{{LOAD SUCCESSOR NODE
{{MOV{(R9){R10{{LOAD NODE CODE ENTRY ADDRESS
{{BRI{R10{{{JUMP TO MATCH SUCCESSOR NODE
{{EJC{{{{
*
*      SYSAB -- PRINT /ABNORMAL END/ AND TERMINATE
*
{SYSAB{RTN{{{{
{{MOV{#ENDAB{R9{{POINT TO MESSAGE
{{MOV{#NUM01{KVABE{{SET ABEND FLAG
{{JSR{PRTNL{{{SKIP TO NEW LINE
{{BRN{STOPR{{{JUMP TO PACK UP
{{EJC{{{{
*
*      SYSTU -- PRINT /TIME UP/ AND TERMINATE
*
{SYSTU{RTN{{{{
{{MOV{#ENDTU{R9{{POINT TO MESSAGE
{{MOV{STRTU{R6{{GET CHARS /TU/
{{MOV{R6{KVCOD{{PUT IN KVCOD
{{MOV{TIMUP{R6{{CHECK STATE OF TIMEUP SWITCH
{{MNZ{TIMUP{{{SET SWITCH
{{BNZ{R6{STOPR{{STOP RUN IF ALREADY SET
{{ERB{245{TRANSLATION/EXECUTION{{TIME EXPIRED
{{TTL{S{{{P I T B O L -- STACK OVERFLOW SECTION
*
*      CONTROL COMES HERE IF THE MAIN STACK OVERFLOWS
*
{{SEC{{{{START OF STACK OVERFLOW SECTION
*
{{ICV{ERRFT{{{FATAL ERROR
{{MOV{FLPTR{SP{{POP STACK TO AVOID MORE FAILS
{{BNZ{GBCFL{STAK1{{JUMP IF GARBAGE COLLECTING
{{ERB{246{STACK{{OVERFLOW
*
*      NO CHANCE OF RECOVERY IN MID GARBAGE COLLECTION
*
{STAK1{MOV{#ENDSO{R9{{POINT TO MESSAGE
{{ZER{KVDMP{{{MEMORY IS UNDUMPABLE
{{BRN{STOPR{{{GIVE UP
{{TTL{S{{{P I T B O L -- ERROR SECTION
*
*      THIS SECTION OF CODE IS ENTERED WHENEVER A PROCEDURE
*      RETURN VIA AN ERR PARAMETER OR AN ERB OPCODE IS OBEYED.
*
*      (WA)                  IS THE ERROR CODE
*
*      THE GLOBAL VARIABLE STAGE INDICATES THE POINT AT WHICH
*      THE ERROR OCCURED AS FOLLOWS.
*
*      STAGE=STGIC           ERROR DURING INITIAL COMPILE
*
*      STAGE=STGXC           ERROR DURING COMPILE AT EXECUTE
*                            TIME (CODE, CONVERT FUNCTION CALLS)
*
*      STAGE=STGEV           ERROR DURING COMPILATION OF
*                            EXPRESSION AT EXECUTION TIME
*                            (EVAL, CONVERT FUNCTION CALL).
*
*      STAGE=STGXT           ERROR AT EXECUTE TIME. COMPILER
*                            NOT ACTIVE.
*
*      STAGE=STGCE           ERROR DURING INITIAL COMPILE AFTER
*                            SCANNING OUT THE END LINE.
*
*      STAGE=STGXE           ERROR DURING COMPILE AT EXECUTE
*                            TIME AFTER SCANNING END LINE.
*
*      STAGE=STGEE           ERROR DURING EXPRESSION EVALUATION
*
{{SEC{{{{START OF ERROR SECTION
*
{ERROR{BEQ{R$CIM{#CMLAB{CMPLE{JUMP IF ERROR IN SCANNING LABEL
{{MOV{R6{KVERT{{SAVE ERROR CODE
{{ZER{SCNRS{{{RESET RESCAN SWITCH FOR SCANE
{{ZER{SCNGO{{{RESET GOTO SWITCH FOR SCANE
{{MOV{STAGE{R9{{LOAD CURRENT STAGE
{{BSW{R9{STGNO{{JUMP TO APPROPRIATE ERROR CIRCUIT
{{IFF{STGIC{ERR01{{INITIAL COMPILE
{{IFF{STGXC{ERR04{{EXECUTE TIME COMPILE
{{IFF{STGEV{ERR04{{EVAL COMPILING EXPR.
{{IFF{STGXT{ERR05{{EXECUTE TIME
{{IFF{STGCE{ERR01{{COMPILE - AFTER END
{{IFF{STGXE{ERR04{{XEQ COMPILE-PAST END
{{IFF{STGEE{ERR04{{EVAL EVALUATING EXPR
{{ESW{{{{END SWITCH ON ERROR TYPE
{{EJC{{{{
*
*      ERROR DURING INITIAL COMPILE
*
*      THE ERROR MESSAGE IS PRINTED AS PART OF THE COMPILER
*      OUTPUT. THIS PRINTOUT INCLUDES THE OFFENDING LINE (IF NOT
*      PRINTED ALREADY) AND AN ERROR FLAG UNDER THE APPROPRIATE
*      COLUMN AS INDICATED BY SCNSE UNLESS SCNSE IS SET TO ZERO.
*
*      AFTER PRINTING THE MESSAGE, THE GENERATED CODE IS
*      MODIFIED TO AN ERROR CALL AND CONTROL IS RETURNED TO
*      THE CMPIL PROCEDURE AFTER RESETTING THE STACK POINTER.
*
*      IF THE ERROR OCCURS AFTER THE END LINE, CONTROL RETURNS
*      IN A SLIGHTLY DIFFERENT MANNER TO ENSURE PROPER CLEANUP.
*
{ERR01{MOV{CMPXS{SP{{RESET STACK POINTER
{{SSL{CMPSS{{{RESTORE S-R STACK PTR FOR CMPIL
{{BNZ{ERRSP{ERR03{{JUMP IF ERROR SUPPRESS FLAG SET
{{MOV{ERICH{ERLST{{SET FLAG FOR LISTR
{{JSR{LISTR{{{LIST LINE
{{JSR{PRTIS{{{TERMINATE LISTING
{{ZER{ERLST{{{CLEAR LISTR FLAG
{{MOV{SCNSE{R6{{LOAD SCAN ELEMENT OFFSET
{{BZE{R6{ERR02{{SKIP IF NOT SET
{{LCT{R7{R6{{LOOP COUNTER
{{ICV{R6{{{INCREASE FOR CH$EX
{{JSR{ALOCS{{{STRING BLOCK FOR ERROR FLAG
{{MOV{R9{R6{{REMEMBER STRING PTR
{{PSC{R9{{{READY FOR CHARACTER STORING
{{MOV{R$CIM{R10{{POINT TO BAD STATEMENT
{{PLC{R10{{{READY TO GET CHARS
*
*      LOOP TO REPLACE ALL CHARS BUT TABS BY BLANKS
*
{ERRA1{LCH{R8{(R10)+{{GET NEXT CHAR
{{BEQ{R8{#CH$HT{ERRA2{SKIP IF TAB
{{MOV{#CH$BL{R8{{GET A BLANK
{{EJC{{{{
*
*      MERGE TO STORE BLANK OR TAB IN ERROR LINE
*
{ERRA2{SCH{R8{(R9)+{{STORE CHAR
{{BCT{R7{ERRA1{{LOOP
{{MOV{#CH$EX{R10{{EXCLAMATION MARK
{{SCH{R10{(R9){{STORE AT END OF ERROR LINE
{{CSC{R9{{{END OF SCH LOOP
{{MOV{#STNPD{PROFS{{ALLOW FOR STATEMENT NUMBER
{{MOV{R6{R9{{POINT TO ERROR LINE
{{JSR{PRTST{{{PRINT ERROR LINE
*
*      HERE AFTER PLACING ERROR FLAG AS REQUIRED
*
{ERR02{JSR{ERMSG{{{GENERATE FLAG AND ERROR MESSAGE
{{ADD{#NUM03{LSTLC{{BUMP PAGE CTR FOR BLANK, ERROR, BLK
{{ZER{R9{{{IN CASE OF FATAL ERROR
{{BHI{ERRFT{#NUM03{STOPR{PACK UP IF SEVERAL FATALS
*
*      COUNT ERROR, INHIBIT EXECUTION IF REQUIRED
*
{{ICV{CMERC{{{BUMP ERROR COUNT
{{ADD{CSWER{NOXEQ{{INHIBIT XEQ IF -NOERRORS
{{BNE{STAGE{#STGIC{CMP10{SPECIAL RETURN IF AFTER END LINE
{{EJC{{{{
*
*      LOOP TO SCAN TO END OF STATEMENT
*
{ERR03{MOV{R$CIM{R9{{POINT TO START OF IMAGE
{{PLC{R9{{{POINT TO FIRST CHAR
{{LCH{R9{(R9){{GET FIRST CHAR
{{BEQ{R9{#CH$MN{CMPCE{JUMP IF ERROR IN CONTROL CARD
{{ZER{SCNRS{{{CLEAR RESCAN FLAG
{{MNZ{ERRSP{{{SET ERROR SUPPRESS FLAG
{{JSR{SCANE{{{SCAN NEXT ELEMENT
{{BNE{R10{#T$SMC{ERR03{LOOP BACK IF NOT STATEMENT END
{{ZER{ERRSP{{{CLEAR ERROR SUPPRESS FLAG
*
*      GENERATE ERROR CALL IN CODE AND RETURN TO CMPIL
*
{{MOV{#4*CDCOD{CWCOF{{RESET OFFSET IN CCBLK
{{MOV{#OCER${R6{{LOAD COMPILE ERROR CALL
{{JSR{CDWRD{{{GENERATE IT
{{MOV{CWCOF{4*CMSOC(SP){{SET SUCCESS FILL IN OFFSET
{{MNZ{4*CMFFC(SP){{{SET FAILURE FILL IN FLAG
{{JSR{CDWRD{{{GENERATE SUCC. FILL IN WORD
{{BRN{CMPSE{{{MERGE TO GENERATE ERROR AS CDFAL
*
*      ERROR DURING EXECUTE TIME COMPILE OR EXPRESSION EVALUATIO
*
*      EXECUTE TIME COMPILATION IS INITIATED THROUGH GTCOD OR
*      GTEXP WHICH ARE CALLED BY COMPILE, CODE OR EVAL.
*      BEFORE CAUSING STATEMENT FAILURE THROUGH EXFAL IT IS
*      HELPFUL TO SET KEYWORD ERRTEXT AND FOR GENERALITY
*      THESE ERRORS MAY BE HANDLED BY THE SETEXIT MECHANISM.
*
{ERR04{ZER{R$CCB{{{FORGET GARBAGE CODE BLOCK
{{SSL{INISS{{{RESTORE MAIN PROG S-R STACK PTR
{{JSR{ERTEX{{{GET FAIL MESSAGE TEXT
{{DCA{SP{{{ENSURE STACK OK ON LOOP START
*
*      POP STACK UNTIL FIND FLPTR FOR MOST DEEPLY NESTED PROG.
*      DEFINED FUNCTION CALL OR CALL OF EVAL / CODE.
*
{ERRA4{ICA{SP{{{POP STACK
{{BEQ{SP{FLPRT{ERRC4{JUMP IF PROG DEFINED FN CALL FOUND
{{BNE{SP{GTCEF{ERRA4{LOOP IF NOT EVAL OR CODE CALL YET
{{MOV{#STGXT{STAGE{{RE-SET STAGE FOR EXECUTE
{{MOV{R$GTC{R$COD{{RECOVER CODE PTR
{{MOV{SP{FLPTR{{RESTORE FAIL POINTER
{{ZER{R$CIM{{{FORGET POSSIBLE IMAGE
*
*      TEST ERRLIMIT
*
{ERRB4{BNZ{KVERL{ERR07{{JUMP IF ERRLIMIT NON-ZERO
{{BRN{EXFAL{{{FAIL
*
*      RETURN FROM PROG. DEFINED FUNCTION IS OUTSTANDING
*
{ERRC4{MOV{FLPTR{SP{{RESTORE STACK FROM FLPTR
{{BRN{ERRB4{{{MERGE
{{EJC{{{{
*
*      ERROR AT EXECUTE TIME.
*
*      THE ACTION TAKEN ON AN ERROR IS AS FOLLOWS.
*
*      IF ERRLIMIT KEYWORD IS ZERO, AN ABORT IS SIGNALLED,
*      SEE CODING FOR SYSTEM LABEL ABORT AT L$ABO.
*
*      OTHERWISE, ERRLIMIT IS DECREMENTED AND AN ERRTYPE TRACE
*      GENERATED IF REQUIRED. CONTROL RETURNS EITHER VIA A JUMP
*      TO CONTINUE (TO TAKE THE FAILURE EXIT) OR A SPECIFIED
*      SETEXIT TRAP IS EXECUTED AND CONTROL PASSES TO THE TRAP.
*      IF 3 OR MORE FATAL ERRORS OCCUR AN ABORT IS SIGNALLED
*      REGARDLESS OF ERRLIMIT AND SETEXIT - LOOPING IS ALL TOO
*      PROBABLE OTHERWISE. FATAL ERRORS INCLUDE STACK OVERFLOW
*      AND EXCEEDING STLIMIT.
*
{ERR05{SSL{INISS{{{RESTORE MAIN PROG S-R STACK PTR
{{BNZ{DMVCH{ERR08{{JUMP IF IN MID-DUMP
*
*      MERGE HERE FROM ERR08
*
{ERR06{BZE{KVERL{LABO1{{ABORT IF ERRLIMIT IS ZERO
{{JSR{ERTEX{{{GET FAIL MESSAGE TEXT
*
*      MERGE FROM ERR04
*
{ERR07{BGE{ERRFT{#NUM03{LABO1{ABORT IF TOO MANY FATAL ERRORS
{{DCV{KVERL{{{DECREMENT ERRLIMIT
{{MOV{R$ERT{R10{{LOAD ERRTYPE TRACE POINTER
{{JSR{KTREX{{{GENERATE ERRTYPE TRACE IF REQUIRED
{{MOV{R$COD{R$CNT{{SET CDBLK PTR FOR CONTINUATION
{{MOV{FLPTR{R9{{SET PTR TO FAILURE OFFSET
{{MOV{(R9){STXOF{{SAVE FAILURE OFFSET FOR CONTINUE
{{MOV{R$SXC{R9{{LOAD SETEXIT CDBLK POINTER
{{BZE{R9{LCNT1{{CONTINUE IF NO SETEXIT TRAP
{{ZER{R$SXC{{{ELSE RESET TRAP
{{MOV{#NULLS{STXVR{{RESET SETEXIT ARG TO NULL
{{MOV{(R9){R10{{LOAD PTR TO CODE BLOCK ROUTINE
{{BRI{R10{{{EXECUTE FIRST TRAP STATEMENT
*
*      INTERRUPTED PARTLY THROUGH A DUMP WHILST STORE IS IN A
*      MESS SO DO A TIDY UP OPERATION. SEE DUMPR FOR DETAILS.
*
{ERR08{MOV{DMVCH{R9{{CHAIN HEAD FOR AFFECTED VRBLKS
{{BZE{R9{ERR06{{DONE IF ZERO
{{MOV{(R9){DMVCH{{SET NEXT LINK AS CHAIN HEAD
{{JSR{SETVR{{{RESTORE VRGET FIELD
{{BRN{ERR08{{{LOOP THROUGH CHAIN
{{TTL{S{{{P I T B O L -- HERE ENDETH THE CODE
*
*      END OF ASSEMBLY
*
{{END{{{{END MACRO-SPITBOL ASSEMBLY