V10/cmd/spitbol/4.3/spitv43.cmt

       TTL  S P I T B O L -- COPYRIGHT NOTICE
*
*      COPYRIGHT (C) BY ROBERT B. K. DEWAR, 1983
*
*      THIS SOFTWARE IS THE PROPERTY OF
*           PROFESSOR ROBERT B. K. DEWAR
*           COURANT INSTITUTE OF MATHEMATICAL SCIENCES
*           251 MERCER STREET
*           NEW YORK,  NY 10012
*           U.S.A
*      TEL NO -  (212) 460 7497
*
       EJC
       TTL  S P I T B O L -- NOTES TO IMPLEMENTORS
*
*      M A C R O   S P I T B O L     V E R S I O N   4 . 2
*      ---------------------------------------------------
*
*      DATE OF RELEASE  -  01 NOV 1983
*
*      THIS PROGRAM IS MAINTAINED BY BOTH
*           DR. A. P. MCCANN
*           DEPARTMENT OF COMPUTER STUDIES
*           UNIVERSITY OF LEEDS
*           LEEDS LS2 9JT
*           ENGLAND.
*      TEL NO -  (0532) 431751
*
*      AND
*
*           DAVID SHIELDS
*           COURANT INSTITUTE OF MATHEMATICAL SCIENCES
*           251 MERCER STREET
*           NEW YORK, NY 10012
*           U.S.A.
*      TEL NO - (212) 460 7168
*
*      WHO WILL BE GLAD TO RECEIVE REPORTS OF FAULTS FOUND
*      BY USERS OR IMPLEMENTORS.
*
*      PERMISSION TO USE SPITBOL MAY BE NEGOTIATED WITH
*      ANY OF THE ABOVE NAMED.
*      SITES WHICH HAVE OBTAINED SUCH PERMISSION MAY NOT PASS ON
*      COPIES OF THE SPITBOL SYSTEM OR PARTS OF IT EXCEPT
*      BY AGREEMENT WITH DEWAR.
*
*
*      TO ASSIST IMPLEMENTORS A REVISION HISTORY BASED ON
*      VERSION 2.7 IS BEING MAINTAINED. IN ADDITION FILE
*      SBL.CHG (AVAILABLE WITH THE SOURCE FILE) INDICATES
*      DETAILED CHANGES MADE FROM ONE RELEASED VERSION TO
*      ANOTHER BY LISTING NEW AND CHANGED LINES IN THE CONTEXT
*      OF THE TEN SURROUNDING LINES.
       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 4.1 TO 4.2 (NOV 83)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B4.101  ERROR IN HANDLING OF STACK WHEN GTARR
*              GIVEN AN EMPTY TABLE ARG.
*      B4.102  OMITTED WTB IN ACESS. CAUSES ILLEGAL ON
*              ACCESSING PATTERN VALUED KEYWORDS.
*      B4.103  DID NOT REPORT ERROR FOR BLANKS IN
*              DEFINE PROTOTYPE. FIXED BY IGNORING LEADING
*              AND TRAILING BLANKS.
*      B4.104  FAILURE TO IGNORE SUPERFLUOUS COMMAS IN
*              ARGS, LOCALS OF DEFINE FUNCTION PROTOTYPE.
*      B4.105  CORRUPTION OF PROGRAM TIMER IF IA, WC OVERLAP
*      B4.106  REGISTERS NOT SET UP FOR SYSEJ CALLS.
*      B4.107  MISUSE OF MFI AT ERR02+8.
*      B4.108  MISUSE OF EXNUL IN TRACE PROCEDURE.
*      B4.109  NO STATEMENT FAILURE IF STOPTR APPLIED TO NON-
*              EXISTENT TRACE.
*      B4.110  LISTING FILE PAGE OVERFLOW FOR SOME ERRORS.
*      B4.111  INCORRECT TRAILING BLANK PADDING IN INSBF.
*      B4.112  ERROR ON INSERTING NULL INTO A BUFFER.
*      B4.113  GTNUM FAILED TO PRESERVE IA.
*
*      CHANGES
*      -------
*
*      C4.101  CONDITIONAL ASSEMBLY SYMBOLS IN THE /EQU  */
*              SECTION ARE REMOVED. USE DUMMIES IF NECESSARY.
*              VARIABLITY OF NUMBER OF EQUATES CAUSED TRANSLATOR
*              PROBLEMS FOR DIFFERENT VERSIONS FOR SIMILAR C/RS.
*      C4.102  POSSIBILITY OF IGNORING CASE OF IDENTIFIERS BY
*              USE OF -CASEIG, -NOCASEIG CTRL CARDS INTRODUCED.
*              CONDITIONAL ASSEMBLY SYMBOL .CSIG, SETS DEFAULT
*              FOR IGNORING CASE IF SET.
*      C4.103  DEFINITION OF .CPLC INDICATES SYSTEM PREFERENCE
*              FOR LOWER CASE SO THAT SYSTEM MESSAGES, DUMPS
*              ETC APPEAR IN LOWER CASE. IMPLEMENTORS DEFINING
*              THIS SYMBOL MUST TRANSLATE ARGS OF ERB, ERR, DTC,
*              WHICH ARE IN UPPER CASE, AS IF THEY WERE IN
*              LOWER CASE. ESSENTIAL THAT .CASL BE ALSO DEFINED.
*      C4.104  EJECT AT END OF COMPILATION DONE BEFORE CALL OF
*              SYSBX INSTEAD OF AFTER IT.
*      C4.105  BUFFER BLANKING FOR STANDARD PRINTER BUFFER NOW
*              USES MVW. DONE PARTLY TO ACCOMMODATE HONEYWELL
*              H66 AND PARTLY FOR EFFICIENCY.
*      C4.106  IF SORT, RSORT ARGUMENTS ARE EMPTY TABLES,
*              STATEMENT FAILURE OCCURS INSTEAD OF AN ERROR.
       EJC
*      C4.107  THE THREE SECTIONS OF EXECUTABLE CODE FOLLOWING
*              SEC OPCODES HAVE BEEN LABELLED AS RTN-S.
*              THE FEW WILD BRANCHES TO PLBLS (MAINLY FOR
*              RESUMPTION AFTER ERRORS) HAVE BEEN REPLACED BY A
*              NEW OPCODE
*                 JMG  GLABL
*              WHICH CAUSES A JUMP TO A GLOBAL LABEL (GLBL)
*              DECLARED AS SUCH BY APPEARING IN THE PROCEDURES
*              SECTION WITH THE OPCODE, GLB, AS IN
*              GLABL  GLB
*              IMPLEMENTORS WITH ADDRESSABILITY PROBLEMS WILL
*              FIND THIS ADVANTAGEOUS. OTHERS CAN IGNORE GLB AND
*              TRANSLATE JMG IDENTICALLY WITH BRN.
*      C4.108  ROUTINES SYSAB, SYSTU, FOR USE BY OSINT TO
*              CLOSE DOWNS SPITBOL CLEANLY IN EMERGENCY ARE
*              REMOVED AS BEING INSUFFICIENTLY GENERAL.
*      C4.109  SPITBOL PERFORMED AN EJECT EVEN WITH OPTIONS
*              SELECTED TO SUPPRESS OUTPUT TO STANDARD OUTPUT
*              FILE. THIS HAS BEEN RECTIFIED.
*      C4.110  SECOND OPERAND OF MINIMAL OPCODES LSX, RSX
*              REDEFINED TO BE X NOT (X) FOR CONSISTENCY.
*      C4.111  THE FOLLOWING FEATURES ARE REMOVED -
*              CTRL CARDS - DOUBLE DUMP ERRORS EXECUTE NOERRORS
*                 NOEXECUTE NOOPT NOPRINT OPTIMISE PRINT SINGLE.
*              FUNCTIONS - ARG FIELD ITEM LOCAL REWIND.
*              KEYWORD - ABEND.
       EJC
*      C4.112  ADDED FUNCTIONS ITC(N), CTI(S) WHICH CONVERT
*              INTEGER N TO NTH CHAR OF ALPHABET AND
*              CHARACTER S TO CORRESPONDING INTEGER.
*      C4.113  ADDED FUNCTION SET(FILETAG,RECNO,PAR3)
*              WHICH MAY BE USED TO EFFECT FILE RANDOM ACCESS.
*      C4.114  OPTIONAL MINIMAL OPCODES CLU, CUL TO CONVERT
*              FROM LOWER TO UPPER CASE OR VICE VERSA DESCRIBED.
*              MOST IMPLEMENTORS NEED NOT USE THEM.
*      C4.115  ALL ERROR CODES HAVE BEEN REASSIGNED TO BRING
*              THEM BELOW 256 AND TO SORT THEM IN THE SOURCE.
*              THIS REPRESENTS A DISCONTINUITY WHICH IT IS
*              HOPED WILL NOT BE REPEATED.
*      C4.116  DEFAULT INPUT RECORD LENGTH SET TO 160 INSTEAD
*              OF 72 CHARACTERS.
*      C4.117  OSINT INTERFACE MASSIVELY REDEFINED. SOME
*              SYS-- ROUTINES ARE REMOVED. THIS REPRESENTS AN
*              ISOLATED UPHEAVAL TO REALLY ADDRESS COMPLAINTS
*              FROM IMPLEMENTORS ON FILE HANDLING AND ERROR
*              REPORTING. NOTE THE DISAPPEARANCE OF THE FCBLK.
       EJC
*      C4.118  SECOND ARG OF INPUT(), OUTPUT() BECOMES A
*              FILETAG WHICH TYPICALLY IS A FILE NAME.
*      C4.119  FUNCTIONALITY OF ENDFILE() EXTENDED.
*              WHEN USED TO CLOSE A FILE, IT DOES NOT CAUSE
*              DETACHING OF ASSOCIATED VARIABLES.
*      C4.120  TERMINAL I/O IS PUT ON THE SAME FOOTING AS FILE
*              I/O. STANDARD INPUT AND OUTPUT CAN BE OBTAINED
*              FROM OR DIRECTED TO A TERMINAL.
*      C4.121  THE /COMMAND LINE/ USED TO EFFECT A SPITBOL RUN
*              IS MADE AVAILABLE TO THE PROGRAM VIA HOST(1).
*              THIS PERMITS USER TO CHECK AND TAKE ACTION ON
*              RUN OPTIONS.
*      C4.122  MINIMAL OPCODES BTC AND WTC TO CONVERT FROM BAUS
*              AND WORDS TO CHARACTERS INTRODUCED.
*
*      DOCUMENTATION REVISIONS
*      -----------------------
*
*      D4.101  RULES ABOUT NOT UPSETTING GARBAGE COLLECTOR IN
*              OSINT IMPLEMENTATION MADE CLEARER.
*      D4.102  MORE DETAIL ON CONDITIONAL ASSEMBLY GIVEN.
*      D4.103  SYSRD AND SYSRI DESCRIPTIONS MODIFIED. ANY
*              PADDING CHARS USED SHOULD BE BLANKS NOT ZEROES.
*      D4.104  MOTIVATION FOR CSC CLARIFIED.
*      D4.105  DESCRIPTION OF EXP CORRECTED.
*
*
*
*      VERSION 4.0 TO 4.1 (JUL 80)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B4.001  ERROR IN CONVERT(ARRAY,/TABLE/) - TFIND MESSED WB
*      B4.002  SORTH IS N-TYPE PROCEDURE.
*      B4.003  ERROR PROC COULD TRY LISTING ABSENT SOURCE LINE.
*      B4.004  REF TO UNDEFINED B$RCL IF .CNRA DEFINED.
*      B4.005  LEX COMPARISONS ON NULL STRINGS FIXED.
*
*      CHANGES
*      -------
*
*      C4.001  DEFINITION OF .CNLD OMITS MORE EXTERNAL FN CODE.
       EJC
*
*      VERSION 3.5 TO 3.6 (JUN 83)
*      ---------------------------
*
*      OVER THE PERIOD 1979 TO 1983 TWO SEPARATE MAINTENANCE
*      AND ENHANCEMENT ROUTES COEXISTED. WHAT IS RECORDED HERE
*      RELATING TO VERSION 3.6 RESULTS PRINCIPALLY FROM THE
*      EFFORTS OF DAVE SHIELDS, STEVE DUFF AND ROBERT
*      GOLDBERG, COORDINATED AT NYU.
*      THE OTHER EFFORT BY TONY MCCANN AT LEEDS TOOK PLACE AT
*      TWO DISCRETE TIMES DURING THE PERIOD, ULTIMATELY GIVING
*      THE CONSOLIDATED VERSION 4.2 WHICH INCORPORATES V3.6
*      CHANGES. NOTATION (C4.XXX) MEANS THAT C4.XXX ALSO
*      EFFECTED THIS CHANGE OR PROVIDES A SIMILAR FEATURE.
*      CODES USED TO IDENTIFY AUTHORS ARE (SGD) FOR DUFF,
*      (REG) FOR  GOLDBERG, AND (LDS) FOR SHIELDS.
*
*      BUGS FIXED
*      ----------
*
*      B3.601  (SGD) TO FIX MULTIPLE TRAP BLOCK ERROR IN ASIGN.
*      B3.602  (SGD) PATCH GTARR TO FIX NULL CONVERT (B4.101).
*      B3.603  (SGD) INSERTED MISSING WTB AFTER SYSMM CALLS.
*      B3.604  (SGD) USE STRING LENGTH IN HASHS.
*      B3.605  (SGD) 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).
*      B3.606  (SGD) FIXED EXIT(N) RESPECIFICATION CODE
*              TO PROPERLY OBSERVE HEADER SEMANTICS ON RETURN.
*      B3.607  (SGD) 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 (C4.109).
*              ALSO FIX TIMSX INITIALIZATION IN SAME CODE.
*      B3.608  (SGD) B$EFC CODE DID NOT CHECK FOR
*              UNCONVERTED RESULT RETURNING NULL STRING.
*      B3.609  (SGD) LOAD PFVBL FIELD IN RETRN FOR
*              RETURN TRACING. THIS WAS CAUSING BUG ON RETURN
*              TRACES THAT TRIED TO ACCESS THE VARIABLE NAME.
*      B3.610  (SGD) FIXED PROBLEM RELATING TO COMPILATION OF
*              GOTO FIELDS CONTAINING SMALL INTEGERS.
*      B3.611  (REG) PREVENT CLEAR() FROM CLOBBERING PROTECTED
*              VARIABLES AT LABEL SCLR5.
*      B3.612  (REG) FIXED GTEXP FROM ACCEPTING TRAILING
*              SEMICOLON OR COLON. THIS IS NOT A LEGAL WAY
*              TO END AN EXPRESSION.
       EJC
*      B3.613  (REG) 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, 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.
*      B3.614  (LDS) FIX MISUSE OF WC JUST AFTER ASG10.
*      B3.615  (LDS) ADD COMMENT POINTING OUT SUSPICIOUS CODE
*              AFTER TFN02. EXPLANATION NOW ADDED (APM).
*      B3.616  (LDS) FIX INCONSISTENT TYPE OF SORTH (B4.002).
*      B3.617  (LDS) INSERT MISSING CONDITIONAL TESTS ON CNBF.
*      B3.618  (LDS) FIX VIOLATIONS OF MINIMAL LANGUAGE WHICH
*              HAD SLIPPED PAST SOME TRANSLATORS.
       EJC
*      CHANGES
*      -------
*
*      C3.601  (SGD) ADDITION OF .CSCI AND SYSCI (INT TO STRING
*              SYSTEM ROUTINE OPTION)
*      C3.602  (REG) CHANGED INILN  AND INILS TO 258 (C4.116).
*      C3.603  (SGD) MERGED IN PROFILER PATCHES AND FIXED CODE
*      C3.604  (SGD) ADDED BUFFER TYPE AND SYMBOL .CNBF
*      C3.605  (SGD) ADDED CHAR FUNCTION.  CHAR(N) RETURNS NTH
*              CHAR OF HOST MACHINE CHAR SET (C4.112).
*      C3.606  (REG) ADDED CFP$U TO EASE TRANSLATION ON SMALLER
*              SYSTEMS
*      C3.607  (REG) ADDED LOWER CASE SUPPORT (C4.102/3).
*      C3.608  (REG) ADDED SET I/O FUNCTION - UNDER .CUST
*      C3.609  (REG) CONDITIONALIZED 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 (C4.104).
*      C3.610  (LDS) INTRODUCE .CTMD TO SUPPORT SYSTM THAT
*              REPORTS ELAPSED TIME IN DECISECONDS INSTEAD OF
*              MILLISECONDS.
*      C3.611  (LDS)  PROVIDE PLACE FOR .DEF OR .UND FOR EACH
*              CONDITIONAL  OPTION, SO THAT SETTINGS CAN BE
*              CHANGED WITHOUT CHANGING LINE NUMBERS.
*      C3.612  (LDS) OBEY (NEW) RESTRICTION THAT OPERAND IN
*              CONDITIONAL BRANCH INSTRUCTION CANNOT HAVE FORM
*              (X)+ IN ORDER TO SIMPLIFY TRANSLATIONS FOR WHICH
*              POSTINCREMENT NOT READILY AVAILABLE.
*      C3.613  (REG,LDS) ADD OP
*                    FLC WREG
*              THAT FOLDS CHAR IN WREG TO UPPER CASE (C4.114).
*      C3.614  (LDS) ADD OPTION .CS16 TO ALLOW INITIALIZATION OF
*              STATEMENT LIMIT VALUES TO 32767 FOR 16 BIT
*              MACHINES.
*      C3.615  (LDS) PERMIT RETURN POINT AND ENTRY POINT
*              ADDRESSES TO BE DISTINGUISHED BY THEIR PARITY
*              INSTEAD OF BY LYING WITHIN A CERTAIN RANGE
*              OF VALUES.  INTRODUCE CONDITIONAL SYMBOLS
*              .CRPP  RETURN POINTS HAVE ODD PARITY
*              .CEPP  ENTRY POINTS HAVE ODD PARITY
*      C3.616  (LDS) INTRODUCE NEW MINIMAL OPCODES TO BRANCH
*              ACCORDING TO PARITY,
*                BEV  OPN,PLBL  BRANCH IF ADDRESS EVEN
*                BOD  OPN,PLBL  BRANCH IF ADDRESS ODD
*              AN ADDRESS IS EVEN IF IT IS A MULTIPLE OF CFP$B.
*      C3.617  (SGD) OPCODE MCB (MOVE CHARS BACKWARDS) DEFINED.
*      C3.618  (SGD) FUNCTION FENCE DEFINED.
       EJC
*      VERSION 3.5 TO 4.0 (JUL 79)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B3.501  OMITTED BTW OPCODE IN IOPUT.
*      B3.502  ILLEGAL ON SORTING A = ARRAY(1).
*      B3.503  FAILURE TO SORT VECTOR WITH ORIGIN OTHER THAN 1.
*      B3.504  INCORRECT HANDLING OF VARIABLE ALPHABET.
*      B3.505  EVAL MISHANDLES DEFAULT VALUE OF TABLE ELEMENT.
*
*      CHANGES
*      -------
*
*      C3.501  PROFILE KEYWORD GIVES EXECUTION PROFILE.
*      C3.502  NUMERIC CONSTANTS STARTING WITH . + OR -
*              ARE FOLDED ON LEXICAL SCANNING.
*
*      DOCUMENTATION REVISIONS
*      -----------------------
*
*      D3.501  TERM BAU (BASIC ADDRESSING UNIT) INTRODUCED.
*      D3.502  ERROR IN REFERENCE TO IA,WC OVERLAP IN SEC 3.
       EJC
*      VERSION 3.4 TO 3.5 (FEB 79)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B3.401  PRTST SHOULD BE DECLARED AS AN R TYPE PROCEDURE.
*      B3.402  TIMING ERROR IF SPITBOL FAILS IN DUMP.
*      B3.403  ERROR IN HANDLING OMITTED ARGS OF OPERATORS.
*      B3.404  TOO MANY LINES PUT ON FIRST PAGE OF LISTING.
*      B3.405  LEADING UNARY OPERATOR IN EVAL ERRONEOUSLY NEEDED
*              PRECEDING BLANK.
*      B3.406  TAG IN DUMP OF ARRAY OR TABLE VALUES WAS OMITTED.
*      B3.407  EVAL UNABLE TO RETURN A DEFERRED EXPRESSION.
*      B3.408  ILLEGAL IF SETEXIT CODE BRANCHES TO RETURN, WITH
*              FURTHER COMPLICATIONS IF WITHIN CALL OF EVAL.
*      B3.409  ILLEGAL ON DETACHING INPUT, OUTPUT, TERMINAL.
*      B3.410  PRTNL SHOULD BE DECLARED AS AN R TYPE PROCEDURE.
*      B3.411  MISPLACED LCT AFTER SDF09.
*
*      CHANGES
*      -------
*
*      C3.401  -SEQU AND -NOSE CONTROL CARDS REMOVED.
*      C3.402  OPTION PROVIDED TO SUPPRESS SYSTEM IDENTIFICATION
*              ON LISTING.
*      C3.403  DESCRIPTION OF SYSBX SLIGHTLY REVISED.
*      C3.404  PERMISSIBLE TO MODIFY SCBLK LENGTH BEFORE TAKING
*              ERROR RETURNS FROM SYSIN, SYSRD, SYSRI.
*      C3.405  CONDITIONAL .CNLD MAY BE DEFINED TO OMIT LOAD().
*      C3.406  CONDITIONAL .CNEX MAY BE DEFINED TO OMIT EXIT().
*      C3.407  TABLE NOW ACCEPTS A THIRD ARGUMENT SPECIFYING
*              DEFAULT INITIAL LOOKUP VALUE.
*      C3.408  ROUTINES SORT, RSORT FOR SORTING ARRAYS, TABLES
*              INTRODUCED. SPECIFICATION IS AS IN SITBOL.
*              ROUTINES MAY BE OMITTED BY DEFINING .CNSR .
*      C3.409  ERROR IN CODE(), EVAL() CALL NOW CAUSES STATEMENT
*              FAILURE BUT ERRTEXT KEYWORD IS STILL SET.
*      C3.410  ARG TO CODE() MAY CONTAIN EMBEDDED CONTROL CARDS
*              AND COMMENT DELIMITED BY A SEMICOLON.
*
*      DOCUMENTATION REVISIONS
*      -----------------------
*
*      D3.401  PURPOSE OF RESTRICTION 2 IN MINIMAL SECTION -6-
*              (OPERATIONS ON CHAR VALUES), ERRONEOUSLY STATED
*              TO BE FOR CMC, RATHER THAN FOR CEQ, CNE.
*              DESCRIPTIONS OF ABOVE OPCODES REVISED.
*      D3.402  DESCRIPTION OF ENT CLARIFIED.
*      D3.403  DESCRIPTIONS OF SEVERAL OPCODES REVISED TO REMOVE
*              TECHNICALLY INVALID LITERALS E.G. =0 , *1.
*      D3.405  RESTRICTED USE OF LETTER Z IN MINIMAL CLARIFIED.
*      D3.406  DIVIDE BY ZERO EXPLICITLY MENTIONED IN RELATION
*              TO OVERFLOW SETTING.
       EJC
*      VERSION 3.3 TO 3.4 (OCT 78)
*      ---------------------------
*
*
*      BUGS FIXED
*      ----------
*
*      B3.301  ILLEGAL FOR ERRONEOUS EVAL() ARG.
*      B3.302  ADDRESS ARITHMETIC OVERFLOW IN ALLOC AND ALOCS.
*      B3.303  -EJECT AND -SPACE IGNORED -NOLIST OPTION.
*      B3.304  ERRONEOUS ARGUMENT SCAN IN LOAD().
*      B3.305  ERRONEOUS PLC ON UNINITIALISED R$CIM IN NEXTS.
*      B3.306  LDI USED INSTEAD OF MTI AFTER PRV07.
*      B3.307  MISUSE OF RMI AT ERRA2.
*      B3.308  MISUSE OF MTI IN HASHS.
*      B3.309  BUG IN -SEQU CARD SEQUENCE NUMBER CHECKING.
*      B3.310  STACK OVERFLOW ERROR MESSAGE NOT ALWAYS PRINTED.
*      B3.311  CORRUPT PROTOTYPE PRINT FOR TRACED ARRAYS.
*      B3.312  PATTERN FIRST ARG IN DUPL CAUSED ERROR.
*      B3.313  OMITTED CSC IN S$RPD, ERRONEOUS CSC IN CONVERT.
*      B3.314  MISPLACED BTW IN EXBLD.
*      B3.315  INCORRECT CODE IN HASHS.
*      B3.316  FAILURE OF LOAD TO SCAN INTEGER ARG.
*      B3.317  TABLE ACCESS WITH NEGATIVE INTEGER ARG. FAILED.
*      B3.318  ERROR IN RETURNING RESULT OF LOADED FUNCTION.
*      B3.319  =E$SRS USED AFTER INI01 INSTEAD OF *E$SRS.
*      B3.320  ERR USED INSTEAD OF ERB AFTER SYSTU
*      B3.321  LABEL COULD START WITH DISALLOWED CHARACTER.
*      B3.322  CONTINUE AFTER SETEXIT HAD BAD HEURISTIC.
       EJC
*
*
*      CHANGES
*      -------
*
*      C3.301  SYSAX AND .CSAX INTRODUCED - SEE SYSAX
*              IN PROCEDURES SECTION.
*      C3.302  VARIABLE MXLEN INTRODUCED. CONTAINS THE MAXIMUM
*              SIZE OF A SPITBOL OBJECT AND IS NOT CHANGEABLE
*              AFTER INITIALISATION. MAY BE DEFAULTED OR SET
*              EXPLICITLY BY SYSMX.
*      C3.303  SYSHS RETURNS REVISED - SEE SYSHS.
*      C3.304  NEW MINIMAL OPCODE AOV TO FIX B3.302.
*      C3.305  INHIBIT STLIMIT CHECK IF STLIMIT MADE NEGATIVE.
*      C3.306  CFP$M IS REQUIRED TO BE OF FORM 2**N - 1.
*      C3.307  DUPL MADE TO CONFORM TO SIL SNOBOL4 STANDARD.
*      C3.308  LCH AND SCH ACTIONS MORE CLOSELY DEFINED.
*      C3.309  BATCH INITIALISATION CODE OMITTED IF CONDITIONAL
*              ASSEMBLY SYMBOL .CNBT (NO BATCH) DEFINED.
*      C3.310  (WA) CONTAINS ARGUMENT COUNT IN SYSEX CALL.
*      C3.311  SYSFC  MAY REQUEST ALLOCATION OF STATIC FCBLK.
*      C3.312  IF IA,WC OVERLAP, RESTRICTION PUT ON DUMPING/
*              RESTORING THESE REGISTERS.
*      C3.313  NEW LISTING OPTION INTERMEDIATE BETWEEN COMPACT
*              AND EXTENDED PROVIDED (SEE SYSPP).
*      C3.314  REVISION OF SYSXI INTERFACE TO PERMIT OPTIONS FOR
*              LOAD MODULE STANDARD O/P FILE (SEE SYSXI,SYSPP).
*      C3.315  LAST ARG OF SUBSTR MAY BE OMITTED - TREATED
*              AS REMAINDER OF STRING.
       EJC
*      VERSION 3.2 TO 3.3 (JAN 78)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B3.201  ARRAY REFERENCE AND EXTERNAL FUNCTION LOAD
*              ROUTINES ILLEGALLY ACCESSED INFORMATION
*              BEYOND THE STACK FRONT.
*              SIMILAR FAULT IN UNANCHORED PATTERN MATCHING.
*      B3.202  DUMP(1) PRODUCED DUMP(2) TYPE OUTPUT.
*      B3.203  WTB CONVERSION OMITTED IN CODE FOLLOWING
*              INI01, INI02, EXBLD.
*      B3.204  INCORRECT FAIL RETURN FROM TFIND IN ARREF.
*      B3.205  ENDFILE DID NOT DETACH I/O ASSOCIATED VARIABLES.
*      B3.206  -SPACE WITH OMITTED ARG. FAILED
*      B3.207  LOOPED IF DUMP KEYWORD NON-ZERO AFTER STACK
*              OVERFLOW IN GARBAGE COLLECT FAILURE.
*      B3.208  FAILURE IN READING NUMBERS WITH TRAILING BLANKS.
*
*      CHANGES
*      -------
*
*      THE EXTENSIVE CHANGES MADE HERE MOSTLY RESULT FROM A
*      SNOBOL4 IMPLEMENTORS MEETING HELD AT NEW YORK UNIVERSITY
*      IN AUGUST 1977. THEY ARE AIMED AT
*           (1) HAVING SPITBOL CONFORM TO CERTAIN SNOBOL4
*           LANGUAGE STANDARDS  AND
*           (2) PRODUCING A STABLE DEFINITION OF MINIMAL BY
*           CARRYING OUT A FEW ESSENTIAL REVISIONS IN THE LIGHT
*           OF EXPERIENCE IN ITS USE.
*
*      CHANGES TO SPITBOL
*      ------------------
*
*      C3.201  DEFAULT VALUES FOR KEYWORDS TRIM AND ANCHOR ARE
*              ZERO. ON SYSTEMS WHERE RECORDS ARE CUSTOMARILY
*              HANDLED WITHOUT TRALING BLANKS, THERE IS NO
*              OBLIGATION TO SUPPLY SUCH BLANKS.
*      C3.202  DEFAULT VALUE OF -INXX CONTROL CARD IS -IN72.
       EJC
*      C3.203  THE SECOND ARGUMENT OF INPUT AND OUTPUT IS
*              PERMITTED TO BE AN INTEGER AS IN SNOBOL4.
*              IN ADDITION INPUT(), OUTPUT() NOW GIVE A SNOBOL4
*              STATEMENT FAILURE IF SYSIO USES THE FILE NOT
*              FOUND RETURN.
*              THE THIRD ARGUMENT HAS A RECOMMENDED FORMAT AND
*              TO OVERRIDE ITS DEFAULT DELIMITER (,) A
*              CONDITIONAL ASSEMBLY SYMBOL, .CIOD, IS USED.
*              INTERFACES TO SYSEF,SYSEJ,SYFC,SYSIO,SYSRW
*              ARE REVISED.
*              WC MAY NOW BE USED TO RETURN FROM SYSIO, A MAX
*              RECORD LENGTH.
*      C3.204  NEW CONFIGURATION PARAMETER CFP$F (SCBLK OFFSET)
*              IS INTRODUCED. CFP$U IS REMOVED.
*      C3.205  IMPLEMENTATION AND VERSION IDENTIFICATION IS
*              REQUIRED - SEE SYSID.
*      C3.206  ROUTINE SYSMX RETURNS THE MAXIMUM LENGTH OF
*              SPITBOL OBJECTS (STRINGS ARRAYS ETC).  THIS
*              INFORMATION IS NOT NOW NEEDED AT TIME OF ENTRY TO
*              SPITBOL AND HENCE WC SHOULD BE ZERO ON ENTRY.
*      C3.207  A CONDITIONAL PARAMETER .CNRA PERMITS ASSEMBLY
*              OF A MORE COMPACT VERSION WITH NO REAL
*              ARITHMETIC CODE.
*      C3.208  TERMINAL IS A NEW PRE-ASSOCIATED VARIABLE
*              CAPABLE OF PERFORMING INPUT AND OUTPUT TO AN
*              ONLINE TERMINAL.
*              SYSRI IS A NEW ROUTINE USED IN THE IMPLEMENTATION
*              OF THIS. SEE ALSO SYSPP.
*      C3.209  THE ENVIRONMENT PARAMETERS E$--- ARE NOW
*              PROVIDED BY THE MINIMAL TRANSLATOR USING THE
*              REVISED   EQU  *   FORMAT (SEE C3.229 AND START
*              OF SPITBOL DEFINITIONS SECTION - SOME REORDERING
*              OF SYMBOLS HAS OCCURRED).
*      C3.210  THE INTERFACE OF SYSXI HAS BEEN SLIGHTLY REVISED.
*              UNAVAILABILITY OF I/O CHANNELS AFTER EXIT(1),
*              EXIT(-1) IS DOCUMENTED TOGETHER WITH ADDITIONAL
*              ERROR RETURN USAGE FOR SYSIN,SYSOU,SYSPR,SYSRD.
*      C3.211  SPITBOL ERROR CODES HAVE BEEN FROZEN - SEE C3.230
*      C3.212  THE UTILITY ROUTINES ARREF ETC. ARE NOW
*              INTRODUCED BY RTN STATEMENTS.
*      C3.213  SYSRL (RECORD LENGTH FOR STD INPUT FILE) IS
*              REMOVED. SINCE IMPLEMENTATION OF A GENERAL -INXXX
*              CONTROL CARD AND AN ABILITY TO SPECIFY MAX RECORD
*              LENGTH USING THE THIRD ARGUMENT OF INPUT, SYSRL
*              HAS BECOME REDUNDANT.
*      C3.214  SYSEJ AND SYSXI ARE NOW PASSED A CHAIN LINKING
*              ALL FCBLKS IN USE.
*      C3.215  A SPECIAL ENDING CODE IN SYSEJ IS USED WHEN
*              ATTEMPTS TO USE STANDARD OUTPUT CHANNEL FAIL.
*      C3.216  RESTRICTION C3.233 OBSERVED SO SIMPLIFYING
*              OPTIMISED TRANSLATION OF ENT WITH OMITTED VAL.
       EJC
*
*      CHANGES TO MINIMAL
*      ------------------
*
*      C3.220  MINIMAL OPCODES DEC, DIM, INC, AND BMP
*              ARE WITHDRAWN AND REPLACED BY THE MORE CONSISTENT
*              SET DCA, DCV, ICA, ICV.
*      C3.221  CHS HAS BEEN REPLACED BY THE MORE GENERALLY
*              USEFUL ZGB (STILL LIKELY TO BE A NO-OP FOR MOST
*              IMPLEMENTATIONS HOWEVER).
*      C3.222  THE SET OF CHARACTER COMPARISONS HAS BEEN
*              REDUCED TO CEQ AND CNE TO EASE IMPLEMENTATION
*              PROBLEMS.
*      C3.223  OPCODE IRZ IS REMOVED AND DVI, RMI ORDERS ARE
*              REDEFINED TO CONFORM TO MORE COMMON USAGE.
*      C3.224  NEW OPCODES SSL AND SSS ARE DEFINED. THEIR USE
*              PERMITS RETURN LINKS FOR N TYPE PROCEDURES TO BE
*              PLACED ON A LOCAL STACK IF DESIRED.
*      C3.225  OPCODE MNZ COMPLEMENTS ZER. IT MOVES A NON-ZERO
*              FLAG TO ITS DESTINATION.
*      C3.226  FOR SOME MACHINES IT IS PREFERABLE FOR THE STACK
*              TO BUILD UP RATHER THAN DOWN. TO PERMIT THIS
*              WITHOUT NEED FOR MASSIVE CHANGES IN MINIMAL AND
*              RECODING OF EXISTING PROGRAMS, A SCHEME HAS BEEN
*              DEVISED IN WHICH AN ADDITIONAL REGISTER NAME, XT,
*              IS USED AS A SYNONYM FOR XL WHEN THIS REGISTER
*              IS INVOLVED IN STACK MANIPULATION- SEE SECTION 4.
*      C3.227  SECTION 0 OF A MINIMAL PROGRAM IS RENAMED THE
*              PROCEDURE SECTION. IT NOW CONTAINS, IN ADDITION
*              TO EXP, SPECIFICATIONS OF INTERNAL PROCEDURES
*              AND ROUTINES BY MEANS OF THE INP AND INR OPCODES.
*      C3.228  THE LITERAL OPERAND FORMATS =INT AND *INT HAVE
*              BEEN WITHDRAWN. =DLBL AND *DLBL MUST BE USED IN
*              THEIR STEAD.
*      C3.229  THE FORMAT
*              LABEL  EQU  *NN
*              USED TO SPECIFY VALUES SUPPLIED BY THE MINIMAL
*              TRANSLATOR FOR CHAR. CODES ETC. IS REPLACED BY
*              LABEL  EQU  *
*              WHERE THE ORDER IN WHICH THE DEFINITIONS ARE
*              SUPPLIED BY THE TRANSLATOR SHOULD MATCH THE
*              ORDER OF OCCURRENCE IN THE DEFINITIONS SECTION.
*      C3.230  THE FORMAT OF ERR,ERB OPCODES IS CHANGED TO
*              REQUIRE A NUMERIC OPERAND.
*      C3.231  THE RTN OPCODE IS USED TO INTRODUCE ROUTINES
*              (WHICH ARE QUITE DISTINCT FROM PROCEDURES).
*      C3.232  CONDITIONAL ASSEMBLY DIRECTIVES MAY BE NESTED.
*      C3.233  MINOR RESTRICTION PLACED ON THE OMISSION OF
*              VAL WITH THE ENT OPCODE.
       EJC
*      VERSION 3.1 TO 3.2 (AUG 77)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B3.101  ASTONISHING THIS WAS UNNOTICED FOR THREE YEARS.
*              BAD CODE FOR SNOBOL4 INTEGER DIVIDE, /, GAVE
*              WRONG RESULT FOR OPERANDS OF OPPOSITE SIGNS.
*              IMPLEMENTATIONS HAVE EITHER WRONGLY TRANSLATED
*              DVI AND GOT CORRECT RESULT OR CORRECTLY
*              TRANSLATED DVI AND GOT WRONG RESULT - LEEDS HAD
*              ONE OF EACH. SEE ALSO C3.106.
*              TEST PROGRAM NO. 1 NOW EXTENDED TO CHECK /
*              MORE THOROUGHLY.
*      B3.102  GARBAGE COLLECTION BUG IN SCANE
*
*      CHANGES
*      -------
*
*      C3.101  OPTION TO USE ADDITIONAL CHARACTERS CH$HT,CH$VT
*              (HORIZONTAL AND VERTICAL TAB) WITH SAME SYNTACTIC
*              SIGNIFICANCE AS CH$BL (BLANK).
*      C3.102  OPTION TO USE A SET OF SHIFTED CASE ALPHABETIC
*              CHARACTERS CH$$A ... CH$$$.
*      C3.103  CONDITIONAL ASSEMBLY FEATURES ARE INTRODUCED INTO
*              MINIMAL ON ACCOUNT OF THE ABOVE.
*              SEE MINIMAL DOCUMENTATION SECTION FOR DETAILS
*              OF ABOVE CHANGES.
*      C3.104  LCH AND SCH MAY USE AN X REGISTER FIRST
*              OPERAND AS ALTERNATIVE TO A W REGISTER.
*      C3.105  SPITBOL STATEMENT NUMBERS IN THE LISTING MAY
*              OPTIONALLY BE PADDED TO 6 OR 8 CHARS INSTEAD OF 5
*              BY DEFINING CONDITIONAL ASSEMBLY SYMBOLS
*              .CSN6 OR .CSN8 .
*      C3.106  TO FIX BUG 3.101. AT MODERATE COST,
*              OPCODE IRZ (BRANCH IF INTEGER DIVIDE REMAINDER
*              ZERO) INTRODUCED.
*      C3.107  TO HANDLE POSSIBLE MACHINE DEPENDENCY IN STRING
*              HASHING, CHS (COMPLETE HASHING OF STRING) OPCODE
*              IS INTRODUCED. PROBABLY A NO-OP ON MOST MACHINES
*              - NOT ON THE DEC10.
*      C3.108  PROCEDURES PATIN,TFIND,TRACE HAVE BEEN
*              MODIFIED TO CONFORM TO THE MINIMAL STANDARD
*              CALL AND RETURN REGIME.
*      C3.109  SYSFC INTERFACE REVISED SLIGHTLY TO PERMIT
*              OSINT TO RETURN A POINTER TO A PRIVATELY
*              ALLOCATED FCBLK WHICH SPITBOL WILL RETURN ON
*              SUBSEQUENT I/O - SEE SYSFC DOC.
*      C3.110  TO REMOVE INCONSISTENCIES IN CALLING SEQUENCES,
*              ALL SYS ROUTINES HAVING ACCESS TO A POSSIBLE
*              FCBLK HAVE FCBLK PTR OR ZERO IN REG. WA ON ENTRY.
*              CHANGE AFFECTS SYSEF, SYSEN, SYSIL, SYSIN,
*              SYSOU, SYSRW.
*      C3.111  SYSPP BIT ALLOCATED TO PROVIDE
*               -NOEXEC OPTION ON ENTRY TO SPITBOL.
       EJC
*
*      DOCUMENTATION REVISIONS
*      -----------------------
*
*      D3.101  NEED TO PRESERVE REGISTERS IN SYSPI, SYSPR,
*              SYSRD CALLS WAS OVERSTATED.
       EJC
*      VERSION 3.0 TO 3.1 (MAR 77)
*      ---------------------------
*
*      BUGS FIXED
*      ----------
*
*      B3.001  REPLACE() COULD FAIL DURING PRE-EVALUATION.
*              SPITBOL NOW SIGNALS AN ERROR FOR NULL OR
*              UNEQUALLY LONG 2ND AND 3RD ARGUMENTS.
*      B3.002  NEGATIVE SECOND ARGUMENTS TO DUPL, LPAD, RPAD
*              CAUSED SPITBOL TO SIGNAL AN ERROR. NOW CAUSES
*              RETURN OF NULL STRING OR FIRST ARG RESPECTIVELY.
*      B3.003  BRN-S USED INSTEAD OF PPM-S IN S$SUB.
*      B3.004  ERR USED INSTEAD OF ERB AFTER CMP30.
*      B3.005  B$PFC, S$CNV, S$DEF, ARITH AND ARREF KEPT
*              INFORMATION ILLEGALLY ABOVE THE STACK TOP.
*      B3.006  PRE-EVALUATION OF CONSTANT PARTS OF
*              COMPLEX GOTOS WAS ERRONEOUS.
*      B3.007  INCORRECT HANDLING OF LABELS COMPILED BY CODE().
*      B3.008  THE SINGLE USE OF TRC (IN S$RPL) WAS NOT IN
*              ACCORD WITH ITS DEFINITION. SOME TRANSLATIONS OF
*              TRC MAY NEED REVISION NOW THAT THE USE
*              HAS BEEN BROUGHT INTO LINE WITH DEFINITION.
*
*      CHANGES
*      -------
*
*      A DEBATE ON A FEW WEAKNESSES IN MINIMAL DESIGN HAS
*      BEEN RESOLVED BY INTRODUCING 4 NEW OPCODES.
*
*      C3.001  NEW MINIMAL OPCODES BMP AND DIM INTRODUCED
*              TO AUGMENT INC AND DEC WHICH ARE APPLICABLE
*              ONLY TO ADDRESSES.
*      C3.002  THE OPCODE SZC (STORE ZERO CHARACTERS) HAD
*              A RESTRICTED APPLICABILITY. IT HAS BEEN
*              REPLACED BY THE MORE GENERAL ZER (ZEROISE).
*      C3.003  FCBLKS MAY BE OPTIONALLY ALLOCATED AS XRBLK-S OR
*              XNBLK-S  - SEE SYSFC FOR VITAL INFORMATION.
*      C3.004  CONTROL CARD PROCESSING HAS BEEN RECODED.
*              -INXXX ALLOWS SPECIFICATION OF STANDARD INPUT
*              FILE RECORD LENGTHS OTHER THAN 72 OR 80, SEE ALSO
*              SYSRL. -SEQU IS IGNORED UNLESS -IN80 IS IN EFFECT
*      C3.005  TO ENABLE EFFICIENT BUFFERING OF CHARS ON
*              MACHINES WITHOUT CHAR. HANDLING ORDERS, THE
*              CSC (COMPLETE STORE CHARACTERS) INSTRUCTION
*              IS INTRODUCED. CURRENT IMPLEMENTATIONS CAN
*              TRANSLATE IT AS A NO-OP IF IT IS OF NO BENEFIT.
*      C3.006  INTEGERS 0,1,2 ARE TREATED SPECIALLY.
*              ICBLKS IN STATIC ARE USED INSTEAD OF
*              ALLOCATING SPACE IN DYNAMIC.
       EJC
*
*      VERSION 2.7 (JUNE 76) TO 3.0 (JAN 77)
*      -------------------------------------
*
*      BUGS FIXED
*      ----------
*
*      B2.701  GOES ILLEGAL IF TIMED OUT DURING PROCESSING OF
*              DUMP() CALL.
*      B2.702  GOES ILLEGAL IF SPITBOL ERROR DETECTED IN ARGS OF
*              CODE() OR EVAL(). BUG FIXED SO THAT USER NOW GETS
*              A SPITBOL ERROR REPORT (TRAPPABLE BY SETEXIT)
*              BEFORE STATEMENT FAILURE.
*      B2.703  GOES ILLEGAL IN SOME CIRCUMSTANCES WHEN
*              MULTIPLE COMPILATION ERRORS OCCUR IN A STATEMENT
*      B2.704  GOES ILLEGAL IF GARBAGE COLLECTOR RUNS OUT OF
*              STACK SPACE.
*      B2.705  CONTROL CARD PROCESSING INCORRECT FOR CDC 6400.
*      B2.706  INCORRECT HANDLING OF MULTIPLE OCCURRENCES OF
*              CHARS IN REPLACE 2ND AND 3RD ARGS.
*      B2.707  STACK OVERFLOW IN PRE-EVALUATION OF REPLACE IN
*              CDC 6400 VERSION.
*      B2.708  AN EXPLICIT CALL OF SYSMW WAS CODED IN S$DAT
*              INSTEAD OF THE MVW OPCODE.
*      B2.709  CALL OF GARBAGE COLLECTOR WHILST DUMPING
*              CAUSED HAVOC.
*      B2.710  SIZE RESTRICTION ON SPITBOL OBJECTS (SIZE MUST BE
*              NUMERICALLY LESS THAN LOWEST DYNAMIC ADDRESS)
*              WAS NOT ENFORCED, WITH POTENTIAL FOR CATASTROPHE.
*      B2.711  DEFERRED EXPRESSIONS INVOLVING ALTERNATION OR
*              NEGATION WERE INCORRECTLY TRANSLATED.
*      B2.712  LISTING OF A COMPILATION ERROR AT THE END OF A
*              LONG LINE COULD CAUSE COMPILER TO GO ILLEGAL.
*      B2.713  INCORRECT -NOFAIL CODE WITH SUCCESS GOTO.
       EJC
*
*
*      CHANGES
*      -------
*
*      (IT IS NOT ANTICIPATED THAT MAJOR REVISIONS ON THIS
*      SCALE WILL BE FREQUENT).
*
*      C2.701  DEFAULT VALUE OF ANCHOR KEYWORD IS SET TO 1. THIS
*              CONFLICTS WITH SNOBOL4 PRACTICE BUT IS A
*              PREFERABLE DEFAULT FOR MOST APPLICATIONS.
*      C2.702  IF ERRTYPE IS OUT OF RANGE THE STRING IN KEYWORD
*              ERRTEXT IS PRINTED AS THE ERROR MESSAGE.
*      C2.703  IF STLIMIT IS EXCEEDED, UP TO 10 MORE STATEMENTS
*              MAY BE OBEYED TO PERMIT SETEXIT TRAP TO GAIN
*              CONTROL.
*      C2.704  THE CONCEPT OF AN INTERACTIVE CHANNEL IS
*              INTRODUCED FOR IMPLEMENTATIONS WHERE AN ONLINE
*              TERMINAL MAY BE USED FOR SPITBOL. THE STANDARD
*              PRINT FILE MAY BE SPECIFIED AS INTERACTIVE IN
*              WHICH CASE SHORTER TITLE LINES ARE OUTPUT.
*              ALTERNATIVELY COPIES OF COMPILATION AND
*              EXECUTION ERRORS ONLY MAY BE SENT TO THIS CHANNEL
*      C2.705  PRINTING OF COMPILATION STATISTICS MAY BE
*              SUPPRESSED.
*      C2.706  PRINTING OF EXECUTION STATISTICS MAY BE
*              SUPPRESSED.
*      C2.707  EXTENDED OR COMPACT LISTING FORMAT MAY BE
*              SELECTED.
*      C2.708  AN INITIAL -NOLIST OPTION MAY BE SPECIFIED
*              BEFORE COMPILATION STARTS.
*      C2.709  TO SPECIFY CHOICES IMPLIED BY C2.704 TO C2.708
*              SYSPP INTERFACE IS REVISED AND SYSPI IS DEFINED.
*      C2.710  COMPILATION AND EXECUTION TIME STATISTICS
*              MESSAGES HAVE BEEN SHORTENED.
*      C2.711  THE EXIT FUNCTION AS IN SITBOL IS INTRODUCED
*              TO PERMIT SAVING LOAD MODULES - SEE SYSXI, S$EXT.
*      C2.712  DIAGNOSTIC ROUTINES SYSGB AND SYSGD HAVE BEEN
*              REMOVED. THEY WERE USEFUL IN THE EARLY DEBUGGING
*              DAYS BUT HAVE FALLEN INTO DISUSE NOW.
*      C2.713  SZC MAY HAVE AN OPERAND OF TYPE OPN INSTEAD OF
*              TYPE OPW
*      C2.714  INPUT/OUTPUT ASSOCIATION INTERFACE HAS BEEN
*              REVISED. SYSIF,SYSOF HAVE BEEN CONSOLIDATED INTO
*              THE NEW SYSTEM ROUTINE , SYSIO , AND THE
*              SPECIFICATION OF SYSFC HAS BEEN SLIGHTLY CHANGED.
*      C2.715  CONFIGURATION PARAMETER MXLEN HAS BEEN WITHDRAWN
*              AND THE MAXIMUM SIZE OF A SPITBOL OBJECT WHICH
*              WAS FORMERLY FIXED AT SPITBOL COMPILE TIME BY
*              REFERENCE TO IT MAY NOW BE SPECIFIED AS A RUN
*              TIME OPTION BY PLACING A VALUE IN WC BEFORE ENTRY
*              TO SPITBOL. (SEE COMMENT ON DYNAMIC AREA IN
*              BASIC INFORMATION SECTION).
*      C2.716  A FUNCTION, HOST, IS INTRODUCED WHICH YIELDS
*              INFORMATION ABOUT THE HOST MACHINE - SEE SYSHS
*              AND S$HST.
       EJC
*
*      DOCUMENTATION REVISIONS
*      -----------------------
*
*      D2.701  THE DESCRIPTION OF MVC HAS BEEN REVISED TO
*              REFLECT THE FACT THAT SOME SPITBOL CODE SEQUENCES
*              RELY ON ON MVC NOT DESTROYING WB. MINOR CHANGES
*              HAVE BEEN MADE TO MWB AND MVW DESCRIPTIONS TO
*              EMPHASISE SIMILARITIES IN THE IMPLICIT LOOPS OF
*              THESE ORDERS.
*      D2.702  DESCRIPTIONS OF DVI AND RMI HAVE BEEN CLARIFIED.
*      D2.703  IMPLEMENTATION OF RSX,LSX,CEQ,CGE,CGT,CHI,CLO,CLT
*              IS OPTIONAL AT PRESENT SINCE THEY ARE CURRENTLY
*              UNUSED. THEIR USE IN LATER VERSIONS IS NOT
*              EXCLUDED.
*      D2.704  IMPOSSIBILITY OF USING STACK FOR RETURN LINKS OF
*              N TYPE PROCEDURES IS EMPHASISED.
*      D2.705  NOTATION (XL),(WC) ETC IN LANGUAGE DESCRIPTION IS
*              CLARIFIED.
*      D2.706  DOCUMENTATION OF SYSFC, SYSIO HAS BEEN IMPROVED.
*      D2.707  OPCODE DESCRIPTIONS ARE CROSS REFERENCED FROM
*              THE ALPHABETICAL OPCODE LIST.
*      D2.708  GENERAL DESCRIPTION OF COMPILER HAS BEEN MOVED TO
*              THE START OF THE COMPILER PROPER.
*      D2.709  DEFINITIONS OF ENVIRONMENT PARAMETERS HAVE BEEN
*              PUT NEAR THE FRONT OF THE DEFINITIONS SECTION.
       TTL  MINIMAL -- MACHINE INDEPENDENT MACRO ASSEMBLY LANG.
       EJC
*      THE FOLLOWING SECTIONS DESCRIBE THE IMPLEMENTATION
*      LANGUAGE ORIGINALLY DEVELOPED FOR SPITBOL BUT NOW MORE
*      WIDELY USED. MINIMAL IS AN ASSEMBLY LANGUAGE FOR AN
*      IDEALISED MACHINE WHICH IS NOW DESCRIBED.
*
*      SECTION 1 - CONFIGURATION PARAMETERS
*
*      THERE ARE SEVERAL PARAMETERS WHICH MAY VARY WITH THE
*      TARGET MACHINE. THE MACRO-PROGRAM IS INDEPENDENT OF THE
*      ACTUAL DEFINITIONS OF THESE PARAMETERS.
*      THE DEFINITIONS OF THESE PARAMETERS ARE SUPPLIED BY
*      THE TRANSLATION PROGRAM TO MATCH THE TARGET MACHINE.
*
*      CFP$A                 NUMBER OF DISTINCT CHARACTERS IN
*                            INTERNAL ALPHABET IN THE RANGE
*                            64 LE CFP$A LE MXLEN.
*
*      CFP$B                 NUMBER OF BAUS IN A WORD WHERE A
*                            BAU IS THE AMOUNT OF STORAGE
*                            ADDRESSED BY THE LEAST SIGNIFICANT
*                            ADDRESS BIT (SEE NEXT SECTION).
*
*      CFP$C                 NUMBER OF CHARACTERS WHICH CAN
*                            BE STORED IN A SINGLE WORD.
*
*      CFP$F                 BAU OFFSET FROM START OF A STRING
*                            BLOCK TO THE FIRST CHARACTER.
*                            DEPENDS BOTH ON TARGET MACHINE AND
*                            STRING DATA STRUCTURE. SEE PLC,PSC.
*
*      CFP$I                 NUMBER OF WORDS IN A SIGNED
*                            INTEGER CONSTANT
*
*      CFP$M                 THE LARGEST POSITIVE INTEGER
*                            OF FORM 2**N - 1 WHICH CAN BE
*                            STORED IN A SINGLE WORD. N WILL
*                            OFTEN BE CFP$N BUT NEED NOT BE.
*
*
*      CFP$N                 NUMBER OF BITS WHICH CAN BE STORED
*                            IN A ONE WORD BIT STRING.
*
*      CFP$R                 NUMBER OF WORDS IN A REAL CONSTANT
*
*      CFP$S                 NUMBER OF SIGNIFICANT DIGITS TO
*                            BE OUTPUT IN CONVERSION OF A REAL
*                            QUANTITY. THE INTEGER CONSISTING OF
*                            THIS NUMBER OF 9S MUST NOT BE TOO
*                            LARGE TO FIT IN THE INTEGER ACCUM.
*
*      CFP$U                 UPPER BOUND ON NUMBER OF CHARS IN
*                            THE SUBSET USED IN BSW SWITCHES IN
*                            RANGE 64 LE CFP$U LE CFP$A. TYPICAL
*                            FOR ASCII IS CFP$U, 128  CFP$A, 256
*
*      CFP$X                 NUMBER OF DIGITS IN REAL EXPONENT
       EJC
*
*      SECTION 2 - MEMORY
*
*      MEMORY IS ORGANIZED INTO WORDS WHICH EACH CONTAIN CFP$B
*      BAUS. THE REASONING BEHIND THIS IS THAT MINIMAL PROGRAMS
*      SHOULD RUN EITHER ON MACHINES HAVING BYTE ADDRESSING
*      OR THOSE HAVING WORD ADDRESSING SCHEMES. MINIMAL MOV
*      INSTRUCTIONS ALWAYS OPERATE ON WORD SIZED OPERANDS OR,
*      IN THE CASE OF THE CHARACTER OPCODES, ON CHARACTER
*      SIZED OPERANDS. NOWHERE IN MINIMAL ARE BYTE SIZED
*      OPERANDS PERMITTED. HOWEVER SINCE ADDRESSING ON BYTE
*      MACHINES MUST BE CATERED FOR, THE CONCEPT OF BASIC
*      ADDRESSABLE UNIT, HENCEFORTH REFERRED TO AS BAU, IS USED
*      A BAU IS THAT COLLECTION OF MEMORY BITS WHICH
*      CORRESPONDS TO A CHANGE OF UNITY IN THE LEAST SIGNIFICANT
*      BIT OF AN ADDRESS. ON A BYTE MACHINE, A BAU WILL
*      CORRESPOND TO A BYTE AND ON A WORD MACHINE TO A WORD.
*      BY CONVENTION ADDRESSES ARE HELD IN BAU FORM (SINCE A
*      BAU IS A BASIC ADDRESSING UNIT). HOWEVER SOME OF THE
*      OPERAND FORMATS PERMIT ADDRESSING WITH WORD
*      OFFSETS PAST A BAU ADDRESS IN A REGISTER. SINCE
*      MEMORY ACCESSING IS IN TERMS OF WORDS, CARE IS NEEDED
*      FOR EXAMPLE WHEN WORD COUNTS ARE COMPUTED FROM ADDRESSES
*      AS A BAU DOES NOT NECESSARILY COINCIDE WITH A WORD. ON
*      THE OTHER HAND, THE BLOCK MOVE ORDER, MVW, REQUIRES A
*      COUNT IN BAUS. THE DEFINITIONS OF THE MINIMAL OPCODES
*      SHOULD BE READ WITH CAREFUL ATTENTION TO THEIR ADDRESSING
*      IMPLICATIONS.
*      FOR WORD MACHINES CFP$B, WHICH IS A CONFIGURATION
*      PARAMETER, WILL BE ONE IN WHICH CASE WORDS AND BAUS ARE
*      IDENTICAL. TO EACH WORD CORRESPONDS AN ADDRESS IN BAUS,
*      A NON-NEGATIVE QUANTITY WHICH IS A MULTIPLE OF CFP$B.
*      DATA IS ORGANIZED INTO WORDS AS FOLLOWS.
*
*      1)   A SIGNED INTEGER VALUE OCCUPIES CFP$I CONSECUTIVE
*           WORDS (CFP$I IS A CONFIGURATION PARAMETER).
*           THE RANGE MAY INCLUDE MORE NEGATIVE NUMBERS THAN
*           POSITIVE (E.G. THE TWOS COMPLEMENT REPRESENTATION).
*
*      2)   A SIGNED REAL VALUE OCCUPIES CFP$R CONSECUTIVE
*           WORDS. (CFP$R IS A CONFIGURATION PARAMETER).
*
*      3)   CFP$C CHARACTERS MAY BE STORED IN A SINGLE WORD
*           (CFP$C IS A CONFIGURATION PARAMETER).
*
*      4)   A BIT STRING CONTAINING CFP$N BITS CAN BE STORED IN
*           A SINGLE WORD (CFP$N IS A CONFIGURATION PARAMETER).
       EJC
*
*      5)   A WORD CAN CONTAIN A NON-NEGATIVE INTEGER VALUE IN
*           THE RANGE (0 LE N LE CFP$M). THESE INTEGER VALUES
*           MAY REPRESENT ADDRESSES OF OTHER WORDS AND SOME OF
*           THE INSTRUCTIONS USE THIS FACT TO PROVIDE INDEXING
*           AND INDIRECTION FACILITIES.
*
*      6)   PROGRAM INSTRUCTIONS OCCUPY WORDS IN AN UNDEFINED
*           MANNER. DEPENDING ON THE ACTUAL IMPLEMENTATION,
*           INSTRUCTIONS MAY OCCUPY SEVERAL WORDS, OR PART OF
*           A WORD, OR EVEN BE SPLIT OVER WORD BOUNDARIES.
*
*      THE FOLLOWING REGIONS OF MEMORY ARE AVAILABLE TO THE
*      PROGRAM. EACH REGION CONSISTS OF A SERIES OF WORDS WITH
*      CONSECUTIVE ADDRESSES.
*
*      1)   CONSTANT SECTION           ASSEMBLED CONSTANTS
*      2)   WORKING STORAGE SECTION    ASSEMBLED WORK AREAS
*      3)   PROGRAM SECTION            ASSEMBLED INSTRUCTIONS
*      4)   STACK AREA                 ALLOCATED STACK AREA
*      5)   DATA AREA                  ALLOCATED DATA AREA
*
*      SECTION 3 - REGISTERS
*
*      THERE ARE THREE INDEX REGISTERS CALLED XR,XL,XS. IN
*      ADDITION XL MAY SOMETIMES BE REFERRED TO BY THE ALIAS
*      OF XT - SEE SECTION 4. ANY OF THE ABOVE
*      REGISTERS MAY HOLD A POSITIVE INTEGER IN THE RANGE
*      (0 LE N LE CFP$M). WHEN THE INDEX REGISTER IS USED FOR
*      INDEXING PURPOSES, THIS MUST BE AN APPROPRIATE ADDRESS
*      IN BAUS.
*      XS IS SPECIAL IN THAT IT IS USED TO POINT TO THE TOP
*      ITEM OF A STACK IN MEMORY. THE STACK MAY BUILD UP OR
*      DOWN IN MEMORY.SINCE IT IS REQUIRED THAT XS POINTS TO THE
*      STACK TOP BUT ACCESS TO ITEMS BELOW THE TOP IS PERMITTED,
*      REGISTERS XS AND XT MAY BE USED WITH SUITABLE OFFSETS
*      TO INDEX STACKED ITEMS. ONLY XS AND XT MAY BE USED FOR
*      THIS PURPOSE SINCE THE DIRECTION OF THE OFFSET IS
*      TARGET MACHINE DEPENDENT. XT IS A SYNONYM FOR XL
*      WHICH THEREFORE CANNOT BE USED IN CODE SEQUENCES
*      REFERENCING XT.
*      THE STACK IS USED FOR S-R LINKAGE AND TEMPORARY
*      DATA STORAGE FOR WHICH THE STACK ARRANGEMENT IS SUITABLE.
*      XR,XL CAN ALSO CONTAIN A CHARACTER POINTER IN CONJUNCTION
*      WITH THE CHARACTER INSTRUCTIONS (SEE DESCRIPTION OF PLC).
       EJC
*
*      THERE ARE THREE WORK REGISTERS CALLED WA,WB,WC WHICH
*      CAN CONTAIN ANY DATA ITEM WHICH CAN BE STORED IN A
*      SINGLE MEMORY WORD. IN FACT, THE WORK REGISTERS ARE JUST
*      LIKE MEMORY LOCATIONS EXCEPT THAT THEY HAVE NO ADDRESSES
*      AND ARE REFERENCED IN A SPECIAL WAY BY THE INSTRUCTIONS.
*      NOTE THAT REGISTERS WA,WB HAVE SPECIAL USES IN CONNECTION
*      WITH THE CVD, CVM, MVC, MVW, MWB, CMC, TRC INSTRUCTIONS.
*      REGISTER WC MAY OVERLAP THE INTEGER ACCUMULATOR (IA) IN
*      SOME IMPLEMENTATIONS. THUS ANY OPERATION CHANGING THE
*      VALUE IN WC LEAVES (IA) UNDEFINED AND VICE VERSA
*      EXCEPT AS NOTED IN THE FOLLOWING RESTRICTION ON SIMPLE
*      DUMP/RESTORE OPERATIONS.
*
*          RESTRICTION
*          -----------
*
*      IF IA AND WC OVERLAP THEN
*          STI  IASAV
*          LDI  IASAV
*      DOES NOT CHANGE WC, AND
*          MOV  WC,WCSAV
*          MOV  WCSAV,WC
*      DOES NOT CHANGE IA.
*
*
*
*      THERE IS AN INTEGER ACCUMULATOR (IA) WHICH IS CAPABLE OF
*      HOLDING A SIGNED INTEGER VALUE (CFP$I WORDS LONG).
*      REGISTER WC MAY OVERLAP THE INTEGER ACCUMULATOR (IA) IN
*      SOME IMPLEMENTATIONS. THUS ANY OPERATION CHANGING THE
*      VALUE IN WC LEAVES (IA) UNDEFINED AND VICE VERSA
*      EXCEPT AS NOTED IN THE ABOVE RESTRICTION ON SIMPLE
*      DUMP/RESTORE OPERATIONS.
*
*
*
*      THERE IS A SINGLE REAL ACCUMULATOR (RA) WHICH CAN HOLD
*      ANY REAL VALUE AND IS COMPLETELY SEPARATE FROM ANY OF
*      THE OTHER REGISTERS OR PROGRAM ACCESSIBLE LOCATIONS.
*
*
*
*      THE CODE POINTER REGISTER (CP) IS A SPECIAL INDEX
*      REGISTER FOR USE IN IMPLEMENTATIONS OF INTERPRETORS.
*      IT IS USED TO CONTAIN A PSEUDO-CODE POINTER AND CAN
*      ONLY BE AFFECTED BY ICP, LCP, SCP AND LCW INSTRUCTIONS.
       EJC
*      SECTION 4 - THE STACK
*
*      THE FOLLOWING NOTES ARE TO GUIDE BOTH IMPLEMENTORS OF
*      SYSTEMS WRITTEN IN MINIMAL AND MINIMAL PROGRAMMERS IN
*      DEALING WITH STACK MANIPULATION. IMPLEMENTATION OF A
*      DOWNWARDS BUILDING STACK IS EASIEST AND IN GENERAL IS
*      TO BE PREFERRED, IN WHICH CASE IT IS MERELY NECESSARY TO
*      CONSIDER XT AS AN ALTERNATIVE NAME FOR XL.
*
*      THE MINIMAL VIRTUAL MACHINE INCLUDES A STACK AND HAS
*      OPERAND FORMATS -(XS) AND (XS)+ FOR PUSHING AND POPPING
*      ITEMS WITH AN IMPLICATION THAT THE STACK BUILDS DOWN IN
*      MEMORY (A D-STACK). HOWEVER ON SOME TARGET MACHINES IT IS
*      BETTER FOR THE STACK TO BUILD UP (A U-STACK).
*      A STACK ADDRESSED ONLY BY PUSH AND POP OPERATIONS CAN
*      BUILD IN EITHER DIRECTION WITH NO COMPLICATION BUT
*      SUCH A PURE SCHEME OF STACK ACCESS PROVES RESTRICTIVE.
*      HENCE IT IS PERMITTED TO ACCESS BURIED ITEMS USING AN
*      INTEGER OFFSET PAST THE INDEX REGISTER POINTING TO THE
*      STACK TOP. ON TARGET MACHINES THIS OFFSET WILL BE
*      POSITIVE/NEGATIVE FOR D-STACKS/U-STACKS AND THIS MUST
*      BE ALLOWED FOR IN THE TRANSLATION.
*      A FURTHER RESTRICTION IS THAT AT NO TIME MAY AN ITEM BE
*      PLACED ABOVE THE STACK TOP. FOR SOME OPERATIONS THIS
*      MAKES IT CONVENIENT TO ADVANCE THE STACK POINTER AND THEN
*      ADDRESS ITEMS BELOW IT USING A SECOND INDEX REGISTER.
*      THE PROBLEM OF SIGNED OFFSETS PAST SUCH A REGISTER THEN
*      ARISES. TO DISTINGUISH STACK OFFSETS, WHICH IN SOME
*      IMPLEMENTATIONS MAY BE NEGATIVE, FROM NON-STACK OFFSETS
*      WHICH ARE INVARIABLY POSITIVE, XT, AN ALIAS OR
*      SYNONYM FOR XL IS USED. FOR A U-STACK IMPLEMENTATION, THE
*      MINIMAL TRANSLATOR SHOULD NEGATE THE SIGN OF OFFSETS
*      APPLIED TO BOTH (XS) AND (XT).
*      PROGRAMMERS SHOULD NOTE THAT SINCE XT IS NOT A
*      SEPARATE REGISTER, XL SHOULD NOT BE USED IN CODE WHERE
*      XT IS REFERENCED. OTHER MODIFICATIONS NEEDED IN U-STACK
*      TRANSLATIONS ARE IN THE ADD, SUB, ICA, DCA OPCODES
*      APPLIED TO XS, XT. FOR EXAMPLE
*
*      MINIMAL           D-STACK TRANS.  U-STACK TRANS.
*
*      MOV  WA,-(XS)     SBI  XS,1       ADI  XS,1
*                        STO  WA,(XS)    STO  WA,(XS)
*      MOV  (XT)+,WC     LOD  WC,(XL)    LOD  WC,(XL)
*                        ADI  XL,1       SBI  XL,1
*      ADD  =SEVEN,XS    ADI  XS,7       SBI  XS,7
*      MOV  2(XT),WA     LOD  WA,2(XL)   LOD  WA,-2(XL)
*      ICA  XS           ADI  XS,1       SBI  XS,1
*
*      NOTE THAT FORMS SUCH AS
*      MOV  -(XS),WA
*      ADD  WA,(XS)+
*      ARE ILLEGAL, SINCE THEY ASSUME INFORMATION STORAGE
*      ABOVE THE STACK TOP.
       EJC
*      SECTION 5 - INTERNAL CHARACTER SET
*
*      THE INTERNAL CHARACTER SET IS REPRESENTED BY A SET OF
*      CONTIGUOUS CODES FROM 0 TO CFP$A-1. THE CODES FOR THE
*      DIGITS 0-9 MUST BE CONTIGUOUS AND IN SEQUENCE. OTHER
*      THAN THIS, THERE ARE NO RESTRAINTS.
*
*      THE FOLLOWING SYMBOLS ARE AUTOMATICALLY DEFINED TO HAVE
*      THE VALUE OF THE CORRESPONDING INTERNAL CHARACTER CODE.
*
*      CH$LA                 LETTER A
*      CH$LB                 LETTER B
*      .                     .
*      CH$L$                 LETTER Z
*
*      CH$D0                 DIGIT 0
*      .                     .
*      CH$D9                 DIGIT 9
*
*      CH$AM                 AMPERSAND
*      CH$AS                 ASTERISK
*      CH$AT                 AT
*      CH$BB                 LEFT BRACKET
*      CH$BL                 BLANK
*      CH$BR                 VERTICAL BAR
*      CH$CL                 COLON
*      CH$CM                 COMMA
*      CH$DL                 DOLLAR SIGN
*      CH$DT                 DOT (PERIOD)
*      CH$DQ                 DOUBLE QUOTE
*      CH$EQ                 EQUAL SIGN
*      CH$EX                 EXCLAMATION MARK
*      CH$MN                 MINUS
*      CH$NM                 NUMBER SIGN
*      CH$NT                 NOT
*      CH$PC                 PERCENT
*      CH$PL                 PLUS
*      CH$PP                 LEFT PAREN
*      CH$RB                 RIGHT BRACKET
*      CH$RP                 RIGHT PAREN
*      CH$QU                 QUESTION MARK
*      CH$SL                 SLASH
*      CH$SM                 SEMI-COLON
*      CH$SQ                 SINGLE QUOTE
*      CH$UN                 UNDERLINE
       EJC
*
*      THE FOLLOWING OPTIONAL SYMBOLS ARE INCORPORATED
*      BY DEFINING THE CONDITIONAL ASSEMBLY SYMBOL NAMED.
*
*      26 SHIFTED LETTERS INCORPORATED BY DEFINING .CASL
*
*      CH$$A                 SHIFTED A
*      CH$$B                 SHIFTED B
*      .                     .
*      CH$$$                 SHIFTED Z
*
*      CH$HT                 HORIZONTAL TAB - DEFINE .CAHT
*      CH$VT                 VERTICAL TAB   - DEFINE .CAVT
*
*      CASE OF SPITBOL SOURCE FILES
*
*      ORIGINALLY, SNOBOL4 AND SPITBOL CATERED FOR THE ERA OF
*      CARD PUNCH WITH FIXED LENGTH RECORDS IN UPPER CASE ONLY.
*      MORE RECENT SYSTEMS HAVE READY USE OF LOWER CASE CHARS
*      IN THE ASCII OR EBCDIC SET AND WITH SOME SYSTEMS (NOTABLY
*      UNIX), USE OF UPPER CASE CHARS IS NOT IDIOMATIC. BY
*      SUITABLE CHOICE OF CONDITIONAL ASSEMBLY OPTIONS, A
*      SYSTEM CAN BE TAILORED TO SUIT THE PREVAILING STYLE
*      OF THE TARGET MACHINE. ADDITIONALLY SOME USER CONTROL IS
*      AVAILABLE BY USE OF CONTROL CARDS SO THAT CASE MAY BE
*      CONSIDERED SIGNIFICANT OR NOT AS DESIRED.
*      THE SPITBOL SOURCE ASSUMES THAT LOWER CASE LETTERS ARE
*      RELATED TO UPPER BY THE ADDITION OF A CONSTANT OFFSET.
*      IF THIS IS NOT SO, DEFINE TRANSLATIONS FOR CLU, CUL
*      OPCODES AND DEFINE CONDITIONAL ASSEMBLY SYMBOL .CSCV .
       EJC
*
*      SECTION 6 - CONDITIONAL ASSEMBLY FEATURES
*
*      SOME FEATURES OF THE INTERPRETER ARE APPLICABLE TO ONLY
*      CERTAIN TARGET MACHINES. THEY MAY BE INCORPORATED OR
*      OMITTED BY USE OF CONDITIONAL ASSEMBLY. THE FULL
*      FORM OF A CONDITION IS -
*      .IF    CONDITIONAL ASSEMBLY SYMBOL    (CAS)
*      .THEN
*             MINIMAL STATEMENTS1   (MS1)
*      .ELSE
*             MINIMAL STATEMENTS2   (MS2)
*      .FI
*      THE FOLLOWING RULES APPLY
*      1.   THE DIRECTIVES .IF, .THEN, .ELSE, .FI MUST
*           START IN COLUMN 1.
*      2.   THE CONDITIONAL ASSEMBLY SYMBOL MUST START WITH A
*           DOT IN COLUMN 8 FOLLOWED BY 4 LETTERS OR DIGITS E.G.
*              .CA$1
*      3.   .THEN IS REDUNDANT AND MAY BE OMITTED IF WISHED.
*      4.   MS1, MS2 ARE ARBITRARY SEQUENCES OF MINIMAL
*           STATEMENTS EITHER OF WHICH MAY BE NULL OR MAY
*           CONTAIN FURTHER CONDITIONS.
*      5.   IF MS2 IS OMITTED, .ELSE MAY ALSO BE OMITTED.
*      6.   .FI IS REQUIRED.
*      7.   CONDITIONS MAY BE NESTED TO A DEPTH DETERMINED
*           BY THE TRANSLATOR (NOT LESS THAN 20, SAY).
*
*      SELECTION OF THE ALTERNATIVES MS1, MS2 IS BY MEANS OF THE
*      DEFINE AND UNDEFINE DIRECTIVES OF FORM -
*      .DEF   CAS
*      .UNDEF CAS
*      WHICH OBEY RULES 1. AND 2. ABOVE AND MAY OCCUR AT ANY
*      POINT IN A MINIMAL PROGRAM, INCLUDING WITHIN A CONDITION.
*      MULTIPLY DEFINING A SYMBOL IS AN ERROR.
*      UNDEFINING A SYMBOL WHICH IS NOT DEFINED IS NOT AN ERROR.
*
*      THE EFFECT IS THAT IF A SYMBOL IS CURRENTLY DEFINED,
*      THEN IN ANY CONDITION DEPENDING ON IT, MS1 WILL BE
*      PROCESSED AND MS2 OMITTED. CONVERSELY IF IT IS UNDEFINED,
*      MS1 WILL BE OMITTED AND MS2 PROCESSED.
*      NESTING OF CONDITIONS IS SUCH THAT CONDITIONS
*      IN A SECTION NOT SELECTED FOR PROCESSING MUST NOT BE
*      EVALUATED. NESTED CONDITIONS MUST REMEMBER THEIR
*      ENVIRONMENT WHILST BEING PROCESSED. EFFECTIVELY THIS
*      IMPLIES USE OF A SCHEME BASED ON A STACK WITH .IF, .FI
*      MATCHING BY THE CONDITION PROCESSOR OF THE TRANSLATOR.
       EJC
*
*      SECTION 7 - OPERAND FORMATS
*
*      THE FOLLOWING SECTION DESCRIBES THE VARIOUS POSSIBILITIES
*      FOR OPERANDS OF INSTRUCTIONS AND ASSEMBLY OPERATIONS.
*
*      01   INT              UNSIGNED INTEGER LE CFP$M
*      02   DLBL             SYMBOL DEFINED IN DEFINITIONS SEC
*      03   WLBL             LABEL IN WORKING STORAGE SECTION
*      04   CLBL             LABEL IN CONSTANT SECTION
*      05   ELBL             PROGRAM SECTION ENTRY LABEL
*      06   PLBL             PROGRAM SECTION LABEL (NON-ENTRY)
*      07   X                ONE OF THE THREE INDEX REGISTERS
*      08   W                ONE OF THE THREE WORK REGISTERS
*      09   (X)              LOCATION INDEXED BY X
*      10   (X)+             LIKE (X) BUT POST INCREMENT X
*      11   -(X)             LIKE (X) BUT PREDECREMENT X
*      12   INT(X)           LOCATION INT WORDS BEYOND ADDR IN X
*      13   DLBL(X)          LOCATION DLBL WORDS PAST ADDR IN X
*      14   CLBL(X)          LOCATION (X) BAUS BEYOND CLBL
*      15   WLBL(X)          LOCATION (X) BAUS BEYOND WLBL
*      16   INTEGER          SIGNED INTEGER (DIC)
*      17   REAL             SIGNED REAL (DRC)
*      18   =DLBL            LOCATION CONTAINING DAC DLBL
*      19   *DLBL            LOCATION CONTAINING DAC CFP$B*DLBL
*      20   =WLBL            LOCATION CONTAINING DAC WLBL
*      21   =CLBL            LOCATION CONTAINING DAC CLBL
*      22   =ELBL            LOCATION CONTAINING DAC ELBL
*      23   PNAM             PROCEDURE LABEL (ON PRC INSTRUC)
*      24   EQOP             OPERAND FOR EQU INSTRUCTION
*      25   PTYP             PROCEDURE TYPE (SEE PRC)
*      26   TEXT             ARBITRARY TEXT (ERB,ERR,TTL)
*      27   DTEXT            DELIMITED TEXT STRING (DTC/DDC)
*      28   RNAM             ROUTINE NAME (ON AN RTN INSTRN)
*      29   GLBL             GLOBAL LABEL (SEE GLB)
*
*      THE NUMBERS IN THE ABOVE LIST ARE USED IN SUBSEQUENT
*      DESCRIPTION AND IN SOME OF THE MINIMAL TRANSLATORS.
       EJC
*
*      OPERAND FORMATS (CONTINUED)
*
*      THE FOLLOWING SPECIAL SYMBOLS REFER TO A COLLECTION OF
*      THE LISTED POSSIBILITIES
*
*      VAL  01,02                      PREDEFINED VALUE
*
*           VAL IS USED TO REFER TO A PREDEFINED ONE WORD
*           INTEGER VALUE IN THE RANGE 0 LE N LE CFP$M.
*
*      REG  07,08                      REGISTER
*
*           REG IS USED TO DESCRIBE AN OPERAND WHICH CAN BE
*           ANY OF THE REGISTERS (XL,XR,XS,XT,WA,WB,WC). SUCH
*           AN OPERAND CAN HOLD A ONE WORD INTEGER (ADDRESS).
*
*      OPC  09,10,11                   CHARACTER
*
*           OPC IS USED TO DESIGNATE A SPECIFIC CHARACTER
*           OPERAND FOR USE IN THE LCH AND SCH INSTRUCTIONS.
*           THE INDEX REGISTER REFERENCED MUST BE EITHER XR OR
*           XL (NOT XS,XT). SEE SECTION ON CHARACTER OPERATIONS.
*
*      OPS  03,04,09,12,13,14,15       MEMORY REFERENCE
*
*           OPS IS USED TO DESCRIBE AN OPERAND WHICH IS IN
*           MEMORY. THE OPERAND MAY BE ONE OR MORE WORDS LONG
*           DEPENDING ON THE DATA TYPE. IN THE CASE OF MULTIWORD
*           OPERANDS, THE ADDRESS GIVEN IS THE FIRST WORD.
*
*      OPW  AS FOR OPS + 08,10,11      FULL WORD
*
*           OPW IS USED TO REFER TO AN OPERAND WHOSE CAPACITY IS
*           THAT OF A FULL MEMORY WORD. OPW INCLUDES ALL THE
*           POSSIBILITIES FOR OPS (THE REFERENCED WORD IS USED)
*           PLUS THE USE OF ONE OF THE THREE WORK REGISTERS
*           (WA,WB,WC). IN ADDITION, THE FORMATS (X)+ AND -(X)
*           ALLOW INDEXED OPERATIONS IN WHICH THE INDEX REGISTER
*           IS POPPED BY ONE WORD AFTER THE REFERENCE (X)+,
*           OR PUSHED BY ONE WORD BEFORE THE REFERENCE -(X)
*           THESE LATTER TWO FORMATS PROVIDE A FACILITY FOR
*           MANIPULATION OF STACKS. THE FORMAT DOES NOT IMPLY
*           A PARTICULAR DIRECTION IN WHICH STACKS MUST BUILD -
*           IT IS USED FOR COMPACTNESS. NOTE THAT THERE IS A
*           RESTRICTION WHICH DISALLOWS AN INSTRUCTION TO USE
*           AN INDEX REGISTER IN ONE OF THESE FORMATS
*           IN SOME OTHER MANNER IN THE SAME INSTRUCTION.
*           E.G.   MOV  XL,(XL)+   IS ILLEGAL.
*           THE FORMATS -(X) AND (X)+ MAY ALSO BE USED IN
*           PRE-DECREMENTATION, POST-INCREMENTATION TO ACCESS
*           THE ADJACENT CHARACTER OF A STRING.
       EJC
*
*      OPERAND FORMATS (CONTINUED)
*
*      OPN  AS FOR OPW + 07            ONE WORD INTEGER
*
*           OPN IS USED TO REPRESENT AN OPERAND LOCATION WHICH
*           CAN CONTAIN A ONE WORD INTEGER (E.G. AN ADDRESS).
*           THIS INCLUDES ALL THE POSSIBILITIES FOR OPW PLUS
*           THE USE OF ONE OF THE INDEX REGISTERS (XL,XR,XT,
*           XS). THE RANGE OF INTEGER VALUES IS 0 LE N LE CFP$M.
*
*      OPV  AS FOR OPN + 18-22         ONE WORD INTEGER VALUE
*
*           OPV IS USED FOR AN OPERAND WHICH CAN YIELD A ONE
*           WORD INTEGER VALUE (E.G. AN ADDRESS). IT INCLUDES
*           ALL THE POSSIBILITIES FOR OPN (THE CURRENT VALUE OF
*           THE LOCATION IS USED) PLUS THE USE OF LITERALS. NOTE
*           THAT ALTHOUGH THE LITERAL FORMATS ARE DESCRIBED IN
*           TERMS OF A REFERENCE TO A LOCATION CONTAINING AN
*           ADDRESS CONSTANT, THIS LOCATION MAY NOT ACTUALLY
*           EXIST IN SOME IMPLEMENTATIONS SINCE ONLY THE VALUE
*           IS REQUIRED. A RESTRICTION IS PLACED ON LITERALS
*           WHICH MAY CONSIST ONLY OF DEFINED SYMBOLS AND
*           CERTAIN LABELS. CONSEQUENTLY SMALL INTEGERS TO BE
*           USED AS LITERALS MUST BE PRE-DEFINED, A DISCIPLINE
*           AIDING PROGRAM MAINTENANCE AND REVISION.
*
*      ADDR 01,02,03,04,05             ADDRESS
*
*           ADDR IS USED TO DESCRIBE AN EXPLICIT ADDRESS VALUE
*           (ONE WORD INTEGER VALUE) FOR USE WITH DAC.
*
*      PGLB 06,29            LABEL OR GLOBAL LABEL
*
*           ****************************************************
*           *   IN THE FOLLOWING DESCRIPTIONS THE USAGE --     *
*           *      (XL),(XR), ... ,(IA)                        *
*           *   IN THE DESCRIPTIVE TEXT SIGNIFIES THE          +
*           *   CONTENTS OF THE STATED REGISTER.               *
*           ****************************************************
       EJC
*
*      SECTION 8 - LIST OF INSTRUCTION MNEMONICS
*
*      THE FOLLOWING LIST INCLUDES ALL INSTRUCTION AND
*      ASSEMBLY OPERATION MNEMONICS IN ALPHABETICAL ORDER.
*      THE MNEMONICS ARE PRECEDED BY A NUMBER IDENTIFYING
*      THE FOLLOWING SECTION WHERE THE INSTRUCTION IS DESCRIBED.
*      A STAR (*) IS APPENDED TO THE MNEMONIC IF THE LAST
*      OPERAND MAY OPTIONALLY BE OMITTED.
*      SEE SECTION -15- FOR DETAILS OF STATEMENT FORMAT AND
*      COMMENT CONVENTIONS.
*
*       2.1  ADD  OPV,OPN      ADD ADDRESS
*       4.2  ADI  OPS          ADD INTEGER
*       5.3  ADR  OPS          ADD REAL
*       7.1  ANB  OPW,W        AND BIT STRING
*       2.17 AOV  OPV,OPN,PLBL ADD ADDRESS, FAIL IF OVERFLOW
*       2.16 BCT  W,PLBL       BRANCH AND COUNT
*       2.5  BEQ  OPN,OPV,PLBL BRANCH IF ADDRESS EQUAL
*       2.8  BGE  OPN,OPV,PLBL BRANCH IF ADDRESS GREATER OR EQUL
*       2.7  BGT  OPN,OPV,PLBL BRANCH IF ADDRESS GREATER
*       2.12 BHI  OPN,OPV,PLBL BRANCH IF ADDRESS HIGH
*       2.10 BLE  OPN,OPV,PLBL BRANCH IF ADDRESS LESS OR EQUAL
*       2.11 BLO  OPN,OPV,PLBL BRANCH IF ADDRESS LOW
*       2.9  BLT  OPN,OPV,PLBL BRANCH IF ADDRESS LESS THAN
*       2.6  BNE  OPN,OPV,PLBL BRANCH IF ADDRESS NOT EQUAL
*       2.13 BNZ  OPN,PLBL     BRANCH IF ADDRESS NON-ZERO
*       1.2  BRN  PLBL         BRANCH UNCONDITIONAL
*       1.7  BRI  OPN          BRANCH INDIRECT
*       1.3  BSW* X,VAL,PLBL   BRANCH ON SWITCH VALUE
*       8.9  BTC  W            CONVERT BAUS TO CHAR COUNT
*       8.2  BTW  REG          CONVERT BAUS TO WORDS
*       2.14 BZE  OPN,PLBL     BRANCH IF ADDRESS ZERO
*       6.6  CEQ  OPW,OPW,PLBL BRANCH IF CHARACTERS EQUAL
*      10.1  CHK               CHECK STACK OVERFLOW
*       6.10 CLU  W            CONVERT LOWER TO UPPER CASE
*       7.4  CMB  W            COMPLEMENT BIT STRING
*       6.8  CMC  PLBL,PLBL    COMPARE CHARACTER STRINGS
*       6.7  CNE  OPW,OPW,PLBL BRANCH IF CHARACTERS NOT EQUAL
*       6.5  CSC  X            COMPLETE STORE CHARACTERS
*       8.8  CTB  W,VAL        CONVERT CHARACTER COUNT TO BAUS
*       8.7  CTW  W,VAL        CONVERT CHARACTER COUNT TO WORDS
*       6.11 CUL  W            CONVERT UPPER TO LOWER CASE
*       8.12 CVD               CONVERT BY DIVISION
*       8.11 CVM  PLBL         CONVERT BY MULTIPLICATION
*      11.1  DAC  ADDR         DEFINE ADDRESS CONSTANT
*      11.5  DBC  VAL          DEFINE BIT STRING CONSTANT
*       2.4  DCA  OPN          DECREMENT ADDRESS BY ONE WORD
*       1.17 DCV  OPN          DECREMENT VALUE BY ONE
*      11.6  DDC  DTEXT        DEFINE DISPLAY CONSTANT
*      11.2  DIC  INTEGER      DEFINE INTEGER CONSTANT
       EJC
*
*      ALPHABETICAL LIST OF MNEMONICS (CONTINUED)
*
*      11.3  DRC  REAL         DEFINE REAL CONSTANT
*      11.4  DTC  DTEXT        DEFINE TEXT (CHARACTER) CONSTANT
*       4.5  DVI  OPS          DIVIDE INTEGER
*       5.6  DVR  OPS          DIVIDE REAL
*      13.1  EJC               EJECT ASSEMBLY LISTING
*      14.2  END               END OF ASSEMBLY
*       1.13 ENP               DEFINE END OF PROCEDURE
*       1.6  ENT* VAL          DEFINE ENTRY POINT
*      12.1  EQU  EQOP         DEFINE SYMBOLIC VALUE
*       1.15 ERB  INT,TEXT     ASSEMBLE ERROR CODE AND BRANCH
*       1.14 ERR  INT,TEXT     ASSEMBLE ERROR CODE
*       1.5  ESW               END OF SWITCH LIST FOR BSW
*       1.12 EXI* INT          EXIT FROM PROCEDURE
*      12.2  EXP  PTYP,INT     DEFINE EXTERNAL PROCEDURE
*       2.3  ICA  OPN          INCREMENT ADDRESS BY ONE WORD
*      12.5  GLB               DEFINE GLOBAL LABEL
*       3.4  ICP               INCREMENT CODE POINTER
*       1.16 ICV  OPN          INCREMENT VALUE BY ONE
*       4.11 IEQ  PLBL         JUMP IF INTEGER ZERO
*       1.4  IFF  VAL,PLBL     SPECIFY BRANCH FOR BSW
*       4.12 IGE  PLBL         JUMP IF INTEGER NON-NEGATIVE
*       4.13 IGT  PLBL         JUMP IF INTEGER POSITIVE
*       4.14 ILE  PLBL         JUMP IF INTEGER NEGATIVE OR ZERO
*       4.15 ILT  PLBL         JUMP IF INTEGER NEGATIVE
*       4.16 INE  PLBL         JUMP IF INTEGER NON-ZERO
*       4.9  INO  PLBL         JUMP IF NO INTEGER OVERFLOW
*      12.3  INP  PTYP,INT     INTERNAL PROCEDURE
*      12.4  INR               INTERNAL ROUTINE
*       4.10 IOV  PLBL         JUMP IF INTEGER OVERFLOW
*       8.5  ITR               CONVERT INTEGER TO REAL
*       1.23 JMG  GLBL         JUMP TO GLOBAL LABEL
*       1.9  JSR  PNAM         CALL PROCEDURE
*       6.3  LCH  REG,OPC      LOAD CHARACTER
*       3.1  LCP  REG        LOAD CODE POINTER REGISTER
*       2.15 LCT  W,OPV        LOAD COUNTER FOR LOOP
*       3.3  LCW  REG          LOAD NEXT CODE WORD
*       4.1  LDI  OPS          LOAD INTEGER
*       5.1  LDR  OPS          LOAD REAL
*       1.8  LEI  X            LOAD ENTRY POINT ID
*       7.6  LSH  W,VAL        LEFT SHIFT BIT STRING
*       7.8  LSX  W,X          LEFT SHIFT INDEXED
*       9.2  MCB               MOVE CHARACTERS BACKWARDS
*       8.4  MFI* OPN,PLBL     CONVERT (IA) TO ADDRESS VALUE
*       4.3  MLI  OPS          MULTIPLY INTEGER
*       5.5  MLR  OPS          MULTIPLY REAL
*       1.19 MNZ  OPN          MOVE NON-ZERO
*       1.1  MOV  OPV,OPN      MOVE
*       8.3  MTI  OPN          MOVE ADDRESS VALUE TO (IA)
*       9.1  MVC               MOVE CHARACTERS
*       9.3  MVW               MOVE WORDS
*       9.4  MWB               MOVE WORDS BACKWARDS
*       4.8  NGI               NEGATE INTEGER
       EJC
*
*      ALPHABETICAL LIST OF MNEMONICS (CONTINUED)
*
*       5.9  NGR               NEGATE REAL
*       7.9  NZB  W,PLBL       JUMP IF NOT ALL ZERO BITS
*       7.2  ORB  OPW,W        OR BIT STRINGS
*       6.1  PLC* X,OPV        PREPARE TO LOAD CHARACTERS
*       1.10 PPM* PLBL         PROVIDE PROCEDURE EXIT PARAMETER
*       1.11 PRC  PTYP,VAL     DEFINE START OF PROCEDURE
*       6.2  PSC* X,OPV        PREPARE TO STORE CHARACTERS
*       5.10 REQ  PLBL         JUMP IF REAL ZERO
*       5.11 RGE  PLBL         JUMP IF REAL POSITIVE OR ZERO
*       5.12 RGT  PLBL         JUMP IF REAL POSITIVE
*       5.13 RLE  PLBL         JUMP IF REAL NEGATIVE OR ZERO
*       5.14 RLT  PLBL         JUMP IF REAL NEGATIVE
*       4.6  RMI  OPS          REMAINDER INTEGER
*       5.15 RNE  PLBL         JUMP IF REAL NON-ZERO
*       5.8  RNO  PLBL         JUMP IF NO REAL OVERFLOW
*       5.7  ROV  PLBL         JUMP IF REAL OVERFLOW
*       7.5  RSH  W,VAL        RIGHT SHIFT BIT STRING
*       7.7  RSX  W,X          RIGHT SHIFT INDEXED
*       8.6  RTI* PLBL         CONVERT REAL TO INTEGER
*       1.22 RTN               DEFINE START OF ROUTINE
*       4.4  SBI  OPS          SUBTRACT INTEGER
*       5.4  SBR  OPS          SUBTRACT REALS
*       6.4  SCH  REG,OPC      STORE CHARACTER
*       3.2  SCP  REG          STORE CODE POINTER
*      14.1  SEC               DEFINE START OF ASSEMBLY SECTION
*       1.20 SSL  OPW          SUBROUTINE STACK LOAD
*       1.21 SSS  OPW          SUBROUTINE STACK STORE
*       4.7  STI  OPS          STORE INTEGER
*       5.2  STR  OPS          STORE REAL
*       2.2  SUB  OPV,OPN      SUBTRACT ADDRESS
*       6.9  TRC               TRANSLATE CHARACTER STRING
*      13.2  TTL  TEXT         SUPPLY ASSEMBLY TITLE
*       8.1  WTB  REG          CONVERT WORDS TO BAUS
*       8.10 WTC  W            CONVERT WORDS TO CHAR COUNT
*       7.3  XOB  OPW,W        EXCLUSIVE OR BIT STRINGS
*       1.18 ZER  OPN          ZEROISE INTEGER LOCATION
*       7.11 ZGB  OPN          ZEROISE GARBAGE BITS
*       7.10 ZRB  W,PLBL       JUMP IF ALL ZERO BITS
       EJC
*
*      SECTION 9 - MINIMAL INSTRUCTIONS
*
*      THE FOLLOWING DESCRIPTIONS ASSUME THE DEFINITIONS -
*
*      ZEROE  EQU  0
*      UNITY  EQU  1
*
*      -1-  BASIC INSTRUCTION SET
*
*      1.1  MOV  OPV,OPN     MOVE ONE WORD VALUE
*
*           MOV CAUSES THE VALUE OF OPERAND OPV TO BE SET AS
*           THE NEW CONTENTS OF OPERAND LOCATION OPN. IN THE
*           CASE WHERE OPN IS NOT AN INDEX REGISTER, ANY VALUE
*           WHICH CAN NORMALLY OCCUPY A MEMORY WORD (INCLUDING
*           A PART OF A MULTIWORD REAL OR INTEGER VALUE)
*           CAN BE TRANSFERRED USING MOV. IF THE TARGET LOCATION
*           OPN IS AN INDEX REGISTER, THEN OPV MUST SPECIFY AN
*           APPROPRIATE ONE WORD VALUE OR OPERAND CONTAINING
*           SUCH AN APPROPRIATE VALUE.
*
*      1.2  BRN  PLBL        UNCONDITIONAL BRANCH
*
*           BRN CAUSES CONTROL TO BE PASSED TO THE INDICATED
*           LABEL IN THE PROGRAM SECTION.
*
*      1.3  BSW  X,VAL,PLBL  BRANCH ON SWITCH VALUE
*      1.4  IFF  VAL,PLBL    PROVIDE BRANCH FOR SWITCH
*           IFF  VAL,PLBL     ...
*           ...
*           ...
*      1.5  ESW              END OF BRANCH SWITCH TABLE
*
*           BSW,IFF,ESW PROVIDE A CAPABILITY FOR A SWITCHED
*           BRANCH SIMILAR TO A FORTRAN COMPUTED GOTO. THE
*           VAL ON THE BSW INSTRUCTION IS THE MAXIMUM NUMBER
*           OF BRANCHES. THE VALUE IN X RANGES FROM ZERO UP TO
*           BUT NOT INCLUDING THIS MAXIMUM. EACH IFF PROVIDES A
*           BRANCH. VAL MUST BE LESS THAN THAT GIVEN ON THE BSW
*           AND CONTROL GOES TO PLBL IF THE VALUE IN X MATCHES.
*           IF THE VALUE IN X DOES NOT CORRESPOND TO ANY OF THE
*           IFF ENTRIES, THEN CONTROL PASSES TO THE PLBL ON THE
*           BSW. THIS PLBL OPERAND MAY BE OMITTED IF THERE ARE
*           NO VALUES MISSING FROM THE LIST.
*
*           IFF AND ESW MAY ONLY BE USED IN THIS CONTEXT.
*           EXECUTION OF BSW MAY DESTROY THE CONTENTS OF X.
*           THE IFF ENTRIES MAY BE IN ANY ORDER AND SINCE
*           A TRANSLATOR MAY THUS NEED TO STORE AND SORT THEM,
*           THE COMMENT FIELD IS RESTRICTED IN LENGTH (SEC 11).
       EJC
*
*      -1-  BASIC INSTRUCTIONS (CONTINUED)
*
*      1.6  ENT  VAL         DEFINE PROGRAM ENTRY POINT
*
*           THE SYMBOL APPEARING IN THE LABEL FIELD IS DEFINED
*           TO BE A PROGRAM ENTRY POINT (ELBL) WHICH CAN LATER
*           BE USED IN CONJUNCTION WITH THE BRI INSTRUCTION,
*           WHICH PROVIDES THE ONLY MEANS OF ENTERING THE
*           CODE. IT IS ILLEGAL TO FALL INTO CODE
*           IDENTIFIED BY AN ENTRY POINT. THE
*           ENTRY SYMBOL IS ASSIGNED AN ADDRESS WHICH NEED NOT
*           BE A MULTIPLE OF CFP$B BUT WHICH MUST BE IN THE
*           RANGE 0 LE CFP$M AND THE ADDRESS MUST NOT LIE WITHIN
*           THE ADDRESS RANGE OF THE ALLOCATED DATA AREA.
*           FURTHERMORE, ADDRESSES OF SUCCESSIVE ENTRY POINTS
*           MUST BE ASSIGNED IN SOME ASCENDING SEQUENCE SO
*           THAT THE ADDRESS COMPARISON INSTRUCTIONS CAN BE
*           USED TO TEST THE ORDER IN WHICH TWO ENTRY POINTS
*           OCCUR. THE SYMBOL VAL GIVES AN IDENTIFYING VALUE
*           TO THE ENTRY POINT WHICH CAN BE ACCESSED WITH THE
*           LEI INSTRUCTION.
*           NOTE - SUBJECT TO THE RESTRICTION BELOW, VAL MAY
*           BE OMITTED IF NO SUCH IDENTIFICATION IS NEEDED I.E.
*           IF NO LEI REFERENCES THE ENTRY POINT. FOR THIS
*           CASE, A TRANSLATION OPTIMISATION IS POSSIBLE IN
*           WHICH NO MEMORY NEED BE RESERVED FOR A NULL
*           IDENTIFICATION WHICH IS NEVER TO BE REFERENCED, BUT
*           ONLY PROVIDED THIS IS DONE SO AS NOT TO INTERFERE
*           WITH THE STRICTLY ASCENDING SEQUENCE OF ENTRY POINT
*           ADDRESSES. TO SIMPLIFY THIS OPTIMISATION FOR ALL
*           IMPLEMENTORS, THE FOLLOWING RESTRICTION IS OBSERVED
*                VAL MAY ONLY BE OMITTED IF THE ENTRY POINT IS
*                SEPARATED FROM A FOLLOWING ENTRY POINT BY A
*                NON-NULL MINIMAL CODE SEQUENCE.
*           ENTRY POINT ADDRESSES ARE ACCESSIBLE ONLY BY USE OF
*           LITERALS (=ELBL, SECTION 7) OR DAC CONSTANTS
*           (SECTION 8-11.1).
*
*      1.7  BRI  OPN         BRANCH INDIRECT
*
*           OPN CONTAINS THE ADDRESS OF A PROGRAM ENTRY POINT
*           (SEE ENT). CONTROL IS PASSED TO THE EXECUTABLE
*           CODE STARTING AT THE ENTRY POINT ADDRESS. OPN IS
*           LEFT UNCHANGED.
*
*      1.8  LEI  X           LOAD ENTRY POINT IDENTIFICATION
*
*           X CONTAINS THE ADDRESS OF AN ENTRY POINT FOR WHICH
*           AN IDENTIFYING VALUE WAS GIVEN ON THE THE ENT LINE.
*           LEI REPLACES THE CONTENTS OF X BY THIS VALUE.
       EJC
*
*      -1-  BASIC INSTRUCTIONS (CONTINUED)
*
*      1.9  JSR  PNAM        CALL PROCEDURE PNAM
*      1.10 PPM  PLBL        PROVIDE EXIT PARAMETER
*           PPM  PLBL         ...
*           ...
*           PPM  PLBL         ...
*
*           JSR CAUSES CONTROL TO BE PASSED TO THE NAMED
*           PROCEDURE. PNAM IS THE LABEL ON A PRC STATEMENT
*           ELSEWHERE IN THE PROGRAM SECTION (SEE PRC)
*           OR HAS BEEN DEFINED USING AN EXP INSTRUCTION.
*           THE PPM EXIT PARAMETERS FOLLOWING THE CALL GIVE
*           NAMES OF PROGRAM LOCATIONS (PLBL-S) TO WHICH
*           ALTERNATIVE EXI RETURNS OF THE CALLED PROCEDURE MAY
*           PASS CONTROL. THEY MAY OPTIONALLY BE REPLACED BY
*           ERROR RETURNS (SEE ERR). THE NUMBER OF EXIT
*           PARAMETERS FOLLOWING A JSR MUST EQUAL THE INT IN THE
*           PROCEDURE DEFINITION. THE OPERAND OF PPM MAY BE
*           OMITTED IF THE CORRESPONDING EXI RETURN IS CERTAIN
*           NOT TO BE TAKEN.
*
*      1.11 PRC  PTYP,INT    DEFINE START OF PROCEDURE
*
*           THE SYMBOL APPEARING IN THE LABEL FIELD IS DEFINED
*           AS THE NAME OF A PROCEDURE (PNAM) FOR USE WITH JSR.
*           A PROCEDURE IS A CONTIGUOUS SECTION OF INSTRUCTIONS
*           TO WHICH CONTROL MAY BE PASSED WITH A JSR
*           INSTRUCTION. THIS IS THE ONLY WAY IN WHICH THE
*           INSTRUCTIONS IN A PROCEDURE MAY BE EXECUTED. IT IS
*           NOT PERMITTED TO FALL INTO A PROCEDURE.
*           ALL PROCEDURES SHOULD BE NAMED IN SECTION 0
*           INP  STATEMENTS.
*
*           INT IS THE NUMBER OF EXIT PARAMETERS (PPM-S) TO
*           BE USED IN JSR CALLS.
*
*           THERE ARE THREE POSSIBILITIES FOR PTYP, EACH
*           CONSISTING OF A SINGLE LETTER AS FOLLOWS.
*
*           R                RECURSIVE
*
*           THE RETURN POINT (ONE OR MORE WORDS) IS STORED ON
*           THE STACK AS THOUGH ONE OR MORE MOV ..,-(XS)
*           INSTRUCTIONS WERE EXECUTED.
       EJC
*
*      -1-  BASIC INSTRUCTIONS (CONTINUED)
*
*           N                NON-RECURSIVE
*
*           THE RETURN POINT IS TO BE STORED EITHER
*           (1) IN A LOCAL STORAGE WORD ASSOCIATED
*           WITH THE PROCEDURE AND NOT DIRECTLY
*           AVAILABLE TO THE PROGRAM IN ANY OTHER MANNER OR
*           (2) ON A SUBROUTINE LINK STACK QUITE DISTINCT FROM
*           THE MINIMAL STACK ADDRESSED BY XS.
*           IT IS AN ERROR TO USE THE STACK FOR N-LINKS, SINCE
*           PROCEDURE PARAMETERS OR RESULTS MAY BE PASSED VIA
*           THE STACK.
*           IF METHOD (2) IS USED FOR LINKS, ERROR EXITS
*           (ERB,ERR) FROM A PROCEDURE WILL NECESSITATE LINK
*           STACK RESETTING. THE SSL AND SSS ORDERS PROVIDED
*           FOR THIS MAY BE REGARDED AS NO-OPS FOR
*           IMPLEMENTATIONS USING METHOD (1).
*
*           E                EITHER
*
*           THE RETURN POINT MAY BE STORED IN EITHER MANNER
*           ACCORDING TO EFFICIENCY REQUIREMENTS OF THE ACTUAL
*           PHYSICAL MACHINE USED FOR THE IMPLEMENTATION. NOTE
*           THAT PROGRAMMING OF E TYPE PROCEDURES MUST BE
*           INDEPENDENT OF THE ACTUAL IMPLEMENTATION.
*
*           THE ACTUAL FORM OF THE RETURN POINT IS UNDEFINED.
*           HOWEVER, EACH WORD STORED ON THE STACK FOR AN
*           R-TYPE CALL MUST MEET THE FOLLOWING REQUIREMENTS.
*
*           1)               IT CAN BE HANDLED AS AN ADDRESS
*                            AND PLACED IN AN INDEX REGISTER.
*
*           2)               WHEN USED AS AN OPERAND IN AN
*                            ADDRESS COMPARISON INSTRUCTION, IT
*                            MUST NOT APPEAR TO LIE WITHIN
*                            THE ALLOCATED DATA AREA.
*
*           3)               IT IS NOT REQUIRED TO APPEAR
*                            TO LIE WITHIN THE PROGRAM SECTION.
       EJC
*
*      -1-  BASIC INSTRUCTIONS (CONTINUED)
*
*      1.12 EXI  INT         EXIT FROM PROCEDURE
*
*           THE PPM AND ERR PARAMETERS FOLLOWING A JSR ARE
*           NUMBERED STARTING FROM 1.  EXI  INT CAUSES CONTROL
*           TO BE RETURNED TO THE INT-TH SUCH PARAM. EXI 1 GIVES
*           CONTROL TO THE PLBL OF THE FIRST PPM AFTER THE JSR.
*           IF INT IS OMITTED, CONTROL IS PASSED BACK PAST THE
*           LAST EXIT PARAMETER (OR PAST THE JSR IF THERE ARE
*           NONE). FOR R AND E TYPE PROCEDURES, THE
*           STACK POINTER XS MUST BE SET TO ITS APPROPRIATE
*           ENTRY VALUE BEFORE EXECUTING AN EXI INSTRUCTION.
*           IN THIS CASE, EXI REMOVES RETURN POINTS FROM THE
*           STACK IF ANY ARE STORED THERE SO THAT THE STACK
*           POINTER IS RESTORED TO ITS CALLING VALUE.
*
*      1.13 ENP              DEFINE END OF PROCEDURE BODY
*
*           ENP DELIMITS A PROCEDURE BODY AND MAY NOT ACTUALLY
*           BE EXECUTED, HENCE IT MUST HAVE NO LABEL.
*
*      1.14 ERR  INT,TEXT    PROVIDE ERROR RETURN
*
*           ERR MAY REPLACE AN EXIT PARAMETER (PPM) IN
*           ANY PROCEDURE CALL. THE INT ARGUMENT IS A UNIQUE
*           ERROR CODE IN 0 TO 899.
*           THE TEXT SUPPLIED AS THE OTHER OPERAND IS
*           ARBITRARY TEXT IN THE FORTRAN CHARACTER SET AND
*           MAY BE USED IN CONSTRUCTING A FILE OF ERROR
*           MESSAGES FOR DOCUMENTING PURPOSES OR FOR BUILDING
*           A DIRECT ACCESS OR OTHER FILE OF MESSAGES TO BE
*           USED BY THE ERROR HANDLING CODE.
*           IN THE EVENT THAT AN EXI ATTEMPTS
*           TO RETURN CONTROL VIA AN EXIT PARAMETER TO
*           AN ERR, CONTROL IS INSTEAD PASSED TO THE FIRST
*           INSTRUCTION IN THE ERROR SECTION (WHICH FOLLOWS THE
*           PROGRAM SECTION) WITH THE ERROR CODE IN WA.
*
*      1.15 ERB  INT,TEXT    ERROR BRANCH
*
*           THIS INSTRUCTION RESEMBLES ERR EXCEPT THAT IT MAY
*           OCCUR AT ANY POINT WHERE A BRANCH IS PERMITTED.
*           IT EFFECTS A TRANSFER OF CONTROL TO THE ERROR
*           SECTION WITH THE ERROR CODE IN WA.
*
*      1.16 ICV  OPN         INCREMENT VALUE BY ONE
*
*           ICV INCREMENTS THE VALUE OF THE OPERAND BY UNITY.
*           IT IS EQUIVALENT TO   ADD  =UNITY,OPN
*
*      1.17 DCV  OPN         DECREMENT VALUE BY ONE
*
*           DCV DECREMENTS THE VALUE OF THE OPERAND BY UNITY.
*           IT IS EQUIVALENT TO   SUB  =UNITY,OPN
       EJC
*
*      BASIC INSTRUCTIONS (CONTINUED)
*
*      1.18 ZER  OPN         ZEROISE OPN
*
*           ZER IS EQUIVALENT TO  MOV  =ZEROE,OPN
*
*      1.19 MNZ  OPN         MOVE NON-ZERO TO OPN
*
*           ANY NON-ZERO COLLECTABLE VALUE MAY USED, FOR WHICH
*           THE OPCODES BNZ/BZE WILL BRANCH/FAIL TO BRANCH.
*
*      1.20 SSL  OPW         SUBROUTINE STACK LOAD
*
*      1.21 SSS  OPW         SUBROUTINE STACK STORE
*
*           THIS PAIR OF OPERATIONS IS PROVIDED TO MAKE POSSIBLE
*           THE USE OF A LOCAL STACK TO HOLD SUBROUTINE (S-R)
*           RETURN LINKS FOR N-TYPE PROCEDURES. SSS STORES THE
*           S-R STACK POINTER IN OPW AND SSL LOADS THE S-R
*           STACK POINTER FROM OPW. BY USING SSS IN THE MAIN
*           PROGRAM OR ON ENTRY TO A PROCEDURE WHICH SHOULD
*           REGAIN CONTROL ON OCCURRENCE OF AN ERR OR ERB AND BY
*           USE OF SSL IN THE ERROR PROCESSING SECTIONS THE
*           S-R STACK POINTER CAN BE RESTORED GIVING A LINK
*           STACK CLEANED UP READY FOR RESUMED EXECUTION.
*           THE FORM OF THE LINK STACK POINTER IS UNDEFINED IN
*           MINIMAL (IT IS LIKELY TO BE A PRIVATE REGISTER
*           KNOWN TO THE TRANSLATOR) AND THE ONLY REQUIREMENT
*           IS THAT IT SHOULD FIT INTO A SINGLE FULL WORD.
*           SSL AND SSS ARE NO-OPS IF A PRIVATE LINK STACK IS
*           NOT USED.
*
*      1.22 RTN              DEFINE START OF ROUTINE
*
*           A ROUTINE IS A CODE CHUNK USED FOR SIMILAR PURPOSES
*           TO A PROCEDURE. HOWEVER IT IS ENTERED BY ANY TYPE OF
*           CONDITIONAL OR UNCONDITIONAL BRANCH (NOT BY JSR). ON
*           TERMINATION IT PASSES CONTROL BY A BRANCH (OFTEN
*           BRI THROUGH A CODE WORD) OR EVEN PERMITS CONTROL
*           TO DROP THROUGH TO ANOTHER ROUTINE. NO RETURN LINK
*           EXISTS AND THE END OF A ROUTINE IS NOT MARKED BY
*           AN EXPLICIT OPCODE (COMPARE ENP).
*           ALL ROUTINES SHOULD BE NAMED IN SECTION 0
*           INR  STATEMENTS.
*
*      1.23 JMG  GLBL        JUMP GLOBAL (I.E. NON LOCAL)
*
*           PLBL-S ARE INTENDED FOR LOCAL BRANCHING WITHIN
*           PROCEDURES AND ROUTINES. OCCASIONALLY (EG ERROR
*           RECOVERY) IT MAY BE PERMISSIBLE TO HAVE NON LOCAL
*           BRANCHES. THE DESTINATION OF THIS INSTRUCTION IS A
*           LABEL NOTED AS BEING GLOBAL BY APPEARING IN THE
*           PROCEDURES SECTION LABELLING A GLB OPCODE.
       EJC
*
*      -2-  OPERATIONS ON ONE WORD INTEGER VALUES (ADDRESSES)
*
*      2.1  ADD  OPV,OPN     ADDS OPV TO THE VALUE IN OPN AND
*                            STORES THE RESULT IN OPN. UNDEFINED
*                            IF THE RESULT EXCEEDS CFP$M.
*
*      2.2  SUB  OPV,OPN     SUBTRACTS OPV FROM OPN. STORES THE
*                            RESULT IN OPN. UNDEFINED IF THE
*                            RESULT IS NEGATIVE.
*
*      2.3  ICA  OPN         INCREMENT ADDRESS IN OPN
*                            EQUIVALENT TO ADD *UNITY,OPN
*
*      2.4  DCA  OPN         DECREMENT ADDRESS IN OPN
*                            EQUIVALENT TO SUB *UNITY,OPN
*
*      2.5  BEQ  OPN,OPV,PLBL BRANCH TO PLBL IF OPN EQ OPV
*      2.6  BNE  OPN,OPV,PLBL BRANCH TO PLBL IF OPN NE OPV
*      2.7  BGT  OPN,OPV,PLBL BRANCH TO PLBL IF OPN GT OPV
*      2.8  BGE  OPN,OPV,PLBL BRANCH TO PLBL IF OPN GE OPV
*      2.9  BLT  OPN,OPV,PLBL BRANCH TO PLBL IF OPN LT OPV
*      2.10 BLE  OPN,OPV,PLBL BRANCH TO PLBL IF OPN LE OPV
*      2.11 BLO  OPN,OPV,PLBL EQUIVALENT TO BLT OR BLE
*      2.12 BHI  OPN,OPV,PLBL EQUIVALENT TO BGT OR BGE
*
*           THE ABOVE INSTRUCTIONS COMPARE TWO ADDRESS
*           VALUES AS UNSIGNED INTEGER VALUES.
*           THE BLO AND BHI INSTRUCTIONS ARE USED IN CASES WHERE
*           THE EQUAL CONDITION EITHER DOES NOT OCCUR OR CAN
*           RESULT EITHER IN A BRANCH OR NO BRANCH. THIS AVOIDS
*           INEFFICIENT TRANSLATIONS IN SOME IMPLEMENTATIONS.
*
*      2.13 BNZ  OPN,PLBL    EQUIVALENT TO BNE OPN,=ZEROE,PLBL
*
*      2.14 BZE  OPN,PLBL    EQUIVALENT TO BEQ OPN,=ZEROE,PLBL
*
*
*      2.15 LCT  W,OPV       LOAD COUNTER FOR BCT
*
*           LCT LOADS A COUNTER VALUE FOR USE WITH THE BCT
*           INSTRUCTION. THE VALUE IN OPV IS THE NUMBER OF LOOPS
*           TO BE EXECUTED. THE VALUE IN W AFTER THIS OPERATION
*           IS AN UNDEFINED ONE WORD INTEGER QUANTITY.
*
*      2.16 BCT  W,PLBL      BRANCH AND COUNT
*
*           BCT USES THE COUNTER VALUE IN W TO BRANCH THE
*           REQUIRED NUMBER OF TIMES AND THEN FINALLY TO FALL
*           THROUGH TO THE NEXT INSTRUCTION. BCT CAN ONLY BE
*           USED FOLLOWING AN APPROPRIATE LCT INSTRUCTION.
*           THE VALUE IN W AFTER EXECUTION OF BCT IS UNDEFINED.
*
*      2.17 AOV  OPV,OPN,PLBL ADD WITH OVERFLOW TEST
*
*           ADDS OPV TO THE VALUE IN OPN AND STORES RESULT IN
*           OPN. BRANCHES TO PLBL IF RESULT EXCEEDS CFP$M
*           WITH RESULT IN OPN UNDEFINED. CF. ADD.
       EJC
*
*      -3-  OPERATIONS ON THE CODE POINTER REGISTER (CP)
*
*           THE CODE POINTER REGISTER PROVIDES A PSUEDO
*           INSTRUCTION COUNTER FOR USE IN AN INTERPRETOR. IT
*           MAY BE IMPLEMENTED AS A REAL REGISTER OR AS A
*           MEMORY LOCATION, BUT IN EITHER CASE IT IS SEPARATE
*           FROM ANY OTHER REGISTER. THE VALUE IN THE CODE
*           POINTER REGISTER IS ALWAYS A WORD ADDRESS (I.E.
*           A ONE WORD INTEGER WHICH IS A MULTIPLE OF CFP$B).
*
*      3.1  LCP  REG         LOAD CODE POINTER REGISTER
*                            THIS INSTRUCTION CAUSES THE CODE
*                            POINTER REGISTER TO BE SET FROM
*                            THE VALUE IN REG WHICH IS UNCHANGED
*
*      3.2  SCP  REG         STORE CODE POINTER REGISTER
*                            THIS INSTRUCTION LOADS THE CURRENT
*                            VALUE IN THE CODE POINTER REGISTER
*                            INTO REG. (CP) IS UNCHANGED.
*
*      3.3  LCW  REG         LOAD NEXT CODE WORD
*                            THIS INSTRUCTION CAUSES THE WORD
*                            POINTED TO BY CP TO BE LOADED INTO
*                            THE INDICATED REG. THE VALUE IN CP
*                            IS THEN INCREMENTED BY ONE WORD.
*                            EXECUTION OF LCW MAY DESTROY XL.
*
*      3.4  ICP              INCREMENT CP BY ONE WORD
*
*           ON MACHINES WITH MORE THAN THREE INDEX REGISTERS,
*           CP CAN BE TREATED SIMPLY AS AN INDEX REGISTER.
*           IN THIS CASE, THE FOLLOWING EQUIVALENCES APPLY.
*
*           LCP REG IS LIKE MOV REG,CP
*           SCP REG IS LIKE MOV CP,REG
*           LCW REG IS LIKE MOV (CP)+,REG
*           ICP     IS LIKE ICA CP
*
*           SINCE LCW IS ALLOWED TO DESTROY XL, THE FOLLOWING
*           IMPLEMENTATION USING A WORK LOCATION CP$$$ CAN
*           ALSO BE USED.
*
*           LCP  REG         MOV  REG,CP$$$
*
*           SCP  REG         MOV  CP$$$,REG
*
*           LCW  REG         MOV  CP$$$,XL
*                            MOV  (XL)+,REG
*                            MOV  XL,CP$$$
*
*           ICP              ICA  CP$$$
       EJC
*
*      -4-  OPERATIONS ON SIGNED INTEGER VALUES
*
*      4.1  LDI  OPS         LOAD INTEGER ACCUMULATOR FROM OPS
*      4.2  ADI  OPS         ADD OPS TO INTEGER ACCUMULATOR
*      4.3  MLI  OPS         MULTIPLY INTEGER ACCUMULATOR BY OPS
*      4.4  SBI  OPS         SUBTRACT OPS FROM INT ACCUMULATOR
*      4.5  DVI  OPS         DIVIDE INTEGER ACCUMULATOR BY OPS
*      4.6  RMI  OPS         SET INT ACCUM TO MOD(INTACC,OPS)
*      4.7  STI  OPS         STORE INTEGER ACCUMULATOR AT OPS
*      4.8  NGI              NEGATE THE VALUE IN THE INTEGER
*                            ACCUMULATOR (CHANGE ITS SIGN)
*
*           THE EQUATION SATISFIED BY OPERANDS AND RESULTS OF
*           DVI AND RMI IS
*                  DIV = QOT * OPS + REM          WHERE
*           DIV = DIVIDEND IN INTEGER ACCUMULATOR
*           QOT = QUOTIENT LEFT IN IA BY DIV
*           OPS = THE DIVISOR
*           REM = REMAINDER LEFT IN IA BY RMI
*           THE SIGN OF THE RESULT OF DVI IS + IF (IA) AND (OPS)
*           HAVE THE SAME SIGN AND IS - IF THEY HAVE OPPOSITE
*           SIGNS. THE SIGN OF (IA) IS ALWAYS USED AS THE SIGN
*           OF THE RESULT OF REM.
*           ASSUMING IN EACH CASE THAT IA CONTAINS THE NUMBER
*           SPECIFIED IN PARENTHESES AND THAT SEVEN AND MSEVN
*           HOLD +7 AND -7 RESP. THE ALGORITHM IS ILLUSTRATED
*           BELOW.
*           (IA = 13)
*           DVI  SEVEN       IA = 1
*           RMI  SEVEN       IA = 6
*           DVI  MSEVN       IA = -1
*           RMI  MSEVN       IA = 6
*           (IA = -13)
*           DVI  SEVEN       IA = -1
*           RMI  SEVEN       IA = -6
*           DVI  MSEVN       IA = 1
*           RMI  MSEVN       IA = -6
       EJC
*
*           THE ABOVE INSTRUCTIONS OPERATE ON A FULL RANGE OF
*           SIGNED INTEGER VALUES. WITH THE EXCEPTION OF LDI AND
*           STI, THESE INSTRUCTIONS MAY CAUSE INTEGER OVERFLOW
*           BY ATTEMPTING TO PRODUCE AN UNDEFINED OR OUT OF
*           RANGE RESULT IN WHICH CASE INTEGER OVERFLOW IS SET,
*           THE RESULT IN (IA) IS UNDEFINED AND THE FOLLOWING
*           INSTRUCTION MUST BE IOV OR INO.
*           PARTICULAR CARE MAY BE NEEDED ON TARGET MACHINES
*           HAVING DISTINCT OVERFLOW AND DIVIDE BY ZERO
*           CONDITIONS.
*
*      4.9  INO  PLBL        JUMP TO PLBL IF NO INTEGER OVERFLOW
*      4.10 IOV  PLBL        JUMP TO PLBL IF INTEGER OVERFLOW
*
*           THESE INSTRUCTIONS CAN ONLY OCCUR IMMEDIATELY
*           FOLLOWING AN INSTRUCTION WHICH CAN CAUSE INTEGER
*           OVERFLOW (ADI, SBI, MLI, DVI, RMI, NGI) AND
*           TEST THE RESULT OF THE PRECEDING INSTRUCTION.
*           IOV AND INO MAY NOT HAVE LABELS.
*
*      4.11 IEQ  PLBL        JUMP TO PLBL IF (IA) EQ 0
*      4.12 IGE  PLBL        JUMP TO PLBL IF (IA) GE 0
*      4.13 IGT  PLBL        JUMP TO PLBL IF (IA) GT 0
*      4.14 ILE  PLBL        JUMP TO PLBL IF (IA) LE 0
*      4.15 ILT  PLBL        JUMP TO PLBL IF (IA) LT 0
*      4.16 INE  PLBL        JUMP TO PLBL IF (IA) NE 0
*
*           THE ABOVE CONDITIONAL JUMP INSTRUCTIONS DO
*           NOT CHANGE THE CONTENTS OF THE ACCUMULATOR.
*           ON A ONES COMPLEMENT MACHINE, IT IS PERMISSIBLE TO
*           PRODUCE NEGATIVE ZERO IN IA PROVIDED THESE
*           INSTRUCTIONS OPERATE CORRECTLY WITH SUCH A VALUE.
       EJC
*
*      -5-  OPERATIONS ON REAL VALUES
*
*      5.1  LDR  OPS         LOAD REAL ACCUMULATOR FROM OPS
*      5.2  STR  OPS         STORE REAL ACCUMULATOR AT OPS
*      5.3  ADR  OPS         ADD OPS TO REAL ACCUMULATOR
*      5.4  SBR  OPS         SUBTRACT OPS FROM REAL ACCUMULATOR
*      5.5  MLR  OPS         MULTIPLY REAL ACCUMULATOR BY OPS
*      5.6  DVR  OPS         DIVIDE REAL ACCUMULATOR BY OPS
*
*           IF THE RESULT OF ANY OF THE ABOVE OPERATIONS CAUSES
*           UNDERFLOW, THE RESULT YIELDED IS 0.0.
*
*           IF THE RESULT OF ANY OF THE ABOVE OPERATIONS IS
*           UNDEFINED OR OUT OF RANGE, REAL OVERFLOW IS SET,
*           THE CONTENTS OF (RA) ARE UNDEFINED AND THE FOLLOWING
*           INSTRUCTION MUST BE EITHER ROV OR RNO.
*           PARTICULAR CARE MAY BE NEEDED ON TARGET MACHINES
*           HAVING DISTINCT OVERFLOW AND DIVIDE BY ZERO
*           CONDITIONS.
*
*      5.7  ROV  PLBL        JUMP TO PLBL IF REAL OVERFLOW
*      5.8  RNO  PLBL        JUMP TO PLBL IF NO REAL OVERFLOW
*
*           THESE INSTRUCTIONS CAN ONLY OCCUR IMMEDIATELY
*           FOLLOWING AN INSTRUCTION WHICH CAN CAUSE REAL
*           OVERFLOW (ADR,SBR,MLR,DVR).
*
*      5.9  NGR              NEGATE REAL ACCUM (CHANGE SIGN)
*
*      5.10 REQ  PLBL        JUMP TO PLBL IF (RA) EQ 0.0
*      5.11 RGE  PLBL        JUMP TO PLBL IF (RA) GE 0.0
*      5.12 RGT  PLBL        JUMP TO PLBL IF (RA) GT 0.0
*      5.13 RLE  PLBL        JUMP TO PLBL IF (RA) LE 0.0
*      5.14 RLT  PLBL        JUMP TO PLBL IF (RA) LT 0.0
*      5.15 RNE  PLBL        JUMP TO PLBL IF (RA) NE 0.0
*
*           THE ABOVE CONDITIONAL INSTRUCTIONS DO NOT AFFECT
*           THE VALUE STORED IN THE REAL ACCUMULATOR.
*           ON A ONES COMPLEMENT MACHINE, IT IS PERMISSIBLE TO
*           PRODUCE NEGATIVE ZERO IN RA PROVIDED THESE
*           INSTRUCTIONS OPERATE CORRECTLY WITH SUCH A VALUE.
       EJC
*
*      -6-  OPERATIONS ON CHARACTER VALUES
*
*           CHARACTER OPERATIONS EMPLOY THE CONCEPT OF A
*           CHARACTER POINTER WHICH USES EITHER
*           INDEX REGISTER XR OR XL (NOT XS).
*
*           A CHARACTER POINTER POINTS TO A SPECIFIC CHARACTER
*           IN A STRING OF CHARACTERS STORED CFP$C CHARS TO A
*           WORD. THE ONLY OPERATIONS PERMITTED ON A CHARACTER
*           POINTER ARE LCH AND SCH. IN PARTICULAR, A CHARACTER
*           POINTER MAY NOT EVEN BE MOVED WITH MOV.
*
*              RESTRICTION 1.
*              --------------
*           IT IS IMPORTANT WHEN CODING IN MINIMAL TO ENSURE
*           THAT NO ACTION OCCURRING BETWEEN THE INITIAL USE OF
*           PLC OR PSC AND THE EVENTUAL CLEARING OF XL OR XR ON
*           COMPLETION OF CHARACTER OPERATIONS CAN INITIATE A
*           GARBAGE COLLECTION. THE LATTER OF COURSE COULD CAUSE
*           THE ADDRESSED CHARACTERS TO BE MOVED LEAVING THE
*           CHARACTER POINTERS POINTING TO RUBBISH.
*
*              RESTRICTION 2.
*              --------------
*           A FURTHER RESTRICTION TO BE OBSERVED IN CODE
*           HANDLING CHARACTER STRINGS, IS THAT STRINGS BUILT
*           DYNAMICALLY SHOULD BE RIGHT PADDED WITH ZERO
*           CHARACTERS TO A FULL WORD BOUNDARY TO PERMIT EASY
*           HASHING AND USE OF CEQ OR CNE IN TESTING STRINGS
*           FOR EQUALITY.
*
*      6.1  PLC  X,OPV       PREPARE CH PTR FOR LCH,CMC,MVC,TRC
*
*      6.2  PSC  X,OPV       PREPARE CHAR. PTR FOR SCH,MVC.
*
*           OPV CAN BE OMITTED IF IT IS ZERO.
*           THE CHAR. INITIALLY ADDRESSED IS DETERMINED BY THE
*           WORD ADDRESS IN X AND THE INTEGER OFFSET OPV.
*           THERE IS AN AUTOMATIC IMPLIED OFFSET OF CFP$F BAUS.
*           CFP$F IS USED TO FORMALLY INTRODUCE INTO MINIMAL A
*           VALUE NEEDED IN TRANSLATING THESE OPCODES WHICH,
*           SINCE MINIMAL ITSELF DOES NOT PRESCRIBE A STRING
*           STRUCTURE IN DETAIL, DEPENDS ON THE CHOICE OF A DATA
*           STRUCTURE FOR STRINGS IN THE MINIMAL PROGRAM.
*           E.G. IF CFP$B = CFP$C = 3, CFP$F = 6, NUM01 = 1, XL
*           POINTS TO A SERIES OF 4 WORDS, ABC/DEF/GHI/JKL, THEN
*               PLC  XL,=NUM01
*           POINTS TO H.
       EJC
*
*      -6- OPERATIONS ON CHARACTER VALUES (CONTINUED)
*
*      6.3  LCH  REG,OPC     LOAD CHARACTER INTO REG
*
*      6.4  SCH  REG,OPC     STORE CHARACTER FROM REG
*
*           THESE OPERATIONS ARE DEFINED SUCH THAT THE CHARACTER
*           IS RIGHT JUSTIFIED IN REGISTER REG WITH ZERO BITS TO
*           THE LEFT. AFTER LCH FOR EXAMPLE, IT IS LEGITIMATE
*           TO REGARD REG AS CONTAINING THE ORDINAL INTEGER
*           CORRESPONDING TO THE CHARACTER.
*
*           OPC IS ONE OF THE FOLLOWING THREE POSSIBILITIES.
*
*           (X)              THE CHARACTER POINTED TO BY THE
*                            CHARACTER POINTER IN X. THE
*                            CHARACTER POINTER IS NOT CHANGED.
*
*           (X)+             SAME CHARACTER AS (X) BUT THE
*                            CHARACTER POINTER IS INCREMENTED
*                            TO POINT TO THE NEXT CHARACTER
*                            FOLLOWING EXECUTION.
*
*           -(X)             THE CHARACTER POINTER IS DECRE-
*                            MENTED BEFORE ACCESSING THE
*                            CHARACTER SO THAT THE PREVIOUS
*                            CHARACTER IS REFERENCED.
*
*      6.5  CSC  X           COMPLETE STORE CHARACTERS
*
*           THIS INSTRUCTION MARKS COMPLETION OF A
*           PSC,SCH,SCH,...,SCH SEQUENCE INITIATED BY
*           A  PSC  X INSTRUCTION. NO MORE SCH INSTRUCTIONS
*           USING  X  SHOULD BE OBEYED UNTIL ANOTHER PSC IS
*           OBEYED. IT IS PROVIDED SOLELY AS AN EFFICIENCY AID
*           ON MACHINES WITHOUT CHARACTER ORDERS SINCE IT
*           PERMITS USE OF REGISTER BUFFERING OF CHARS IN SCH
*           SEQUENCES. WHERE CSC IS NOT A NO-OP, IT MUST OBSERVE
*           RESTRICTION 2. (E.G. IN SPITBOL, ALOCS ZEROISES THE
*           LAST WORD OF A STRING FRAME PRIOR TO SCH SEQUENCE
*           BEING STARTED SO CSC MUST NOT NULLIFY THIS ACTION.)
*
*           THE FOLLOWING INSTRUCTIONS ARE USED TO COMPARE
*           TWO WORDS CONTAINING CFP$C CHARACTERS.
*           COMPARISONS DISTINCT FROM BEQ,BNE ARE PROVIDED AS
*           ON SOME TARGET MACHINES, THE POSSIBILITY OF THE SIGN
*           BIT BEING SET MAY REQUIRE SPECIAL ACTION.
*           NOTE THAT RESTRICTION 2 ABOVE, EASES USE OF THESE
*           ORDERS IN TESTING COMPLETE STRINGS FOR EQUALITY,
*           SINCE WHOLE WORD TESTS ARE POSSIBLE.
*
*      6.6  CEQ  OPW,OPW,PLBL JUMP TO PLBL IF OPW EQ OPW
*      6.7  CNE  OPW,OPW,PLBL JUMP TO PLBL IF OPW NE OPW
       EJC
*
*      -6- OPERATIONS ON CHARACTER VALUES (CONTINUED)
*
*      6.8  CMC  PLBL,PLBL   COMPARE CHARACTERS
*
*           CMC IS USED TO COMPARE TWO CHARACTER STRINGS. BEFORE
*           EXECUTING CMC, REGISTERS ARE SET UP AS FOLLOWS.
*           (XL)             CHARACTER PTR FOR FIRST STRING
*           (XR)             CHARACTER POINTER FOR SECOND STRING
*           (WA)             CHARACTER COUNT (MUST BE .GT. ZERO)
*           XL AND XR SHOULD HAVE BEEN PREPARED BY PLC.
*           CONTROL PASSES TO FIRST PLBL IF THE FIRST STRING
*           IS LEXICALLY LESS THAN THE SECOND STRING, AND TO
*           THE SECOND PLBL IF THE FIRST STRING IS LEXICALLY
*           GREATER. CONTROL PASSES TO THE FOLLOWING INSTRUCTION
*           IF THE STRINGS ARE IDENTICAL. AFTER EXECUTING THIS
*           INSTRUCTION, THE VALUES OF XR AND XL ARE SET TO ZERO
*           AND THE VALUE IN (WA) IS UNDEFINED.
*           ARGUMENTS TO CMC MAY BE COMPLETE OR PARTIAL
*           STRINGS, SO MAKING OPTIMISATION TO USE WHOLE WORD
*           COMPARISONS DIFFICULT (DEPENDENT IN GENERAL ON
*           SHIFTS AND MASKING).
*
*      6.9  TRC              TRANSLATE CHARACTERS
*
*           TRC IS USED TO TRANSLATE A CHARACTER STRING USING A
*           SUPPLIED TRANSLATION TABLE. BEFORE EXECUTING TRC THE
*           REGISTERS ARE SET AS FOLLOWS.
*           (XL)             CHAR PTR TO STRING TO BE TRANSLATED
*           (XR)             CHAR PTR TO TRANSLATE TABLE
*           (WA)             LENGTH OF STRING TO BE TRANSLATED
*           XL AND XR SHOULD HAVE BEEN PREPARED BY PLC.
*           THE TRANSLATE TABLE CONSISTS OF CFP$A CONTIGUOUS
*           CHARACTERS GIVING THE TRANSLATIONS OF THE CFP$A
*           CHARACTERS IN THE ALPHABET. ON COMPLETION, (XR) AND
*           (XL) ARE SET TO ZERO AND (WA) IS UNDEFINED.
*
*      6.10 CLU  W           CONVERT LOWER TO UPPER CASE
*      6.11 CUL  W           CONVERT UPPER TO LOWER CASE
*
*      THIS PAIR MAY BE USED FOR CASE CONVERSION OF CHARACTERS
*      IN W, WHERE THE CHARACTER SET SUPPORTS BOTH CASES. THEY
*      ARE NOT NEEDED IF THERE IS A SIMPLE RELATION BETWEEN THE
*      CASES AS IN ASCII AND EBCDIC. IN THE CASE OF SPITBOL THIS
*      ASSUMPTION IS MADE BY DEFAULT (SEE SYMBOL DFA$A) BUT THE
*      CODE INCLUDES AN OPTION SELECTABLE BY CONDITIONAL
*      ASSEMBLY ON .CSCV TO USE THESE OPCODES INSTEAD IF NEEDED
*      OR PREFERRED.
       EJC
*
*      -7-  OPERATIONS ON BIT STRING VALUES
*
*      7.1  ANB  OPW,W       AND BIT STRING VALUES
*      7.2  ORB  OPW,W       OR BIT STRING VALUES
*      7.3  XOB  OPW,W       EXCLUSIVE OR BIT STRING VALUES
*
*           IN THE ABOVE OPERATIONS, THE LOGICAL CONNECTIVE IS
*           APPLIED SEPARATELY TO EACH OF THE CFP$N BITS.
*           THE RESULT IS STORED IN THE SECOND OPERAND LOCATION.
*
*      7.4  CMB  W           COMPLEMENT ALL BITS IN OPW
*
*      7.5  RSH  W,VAL       RIGHT SHIFT BY VAL BITS
*      7.6  LSH  W,VAL       LEFT SHIFT BY VAL BITS
*      7.7  RSX  W,X         RIGHT SHIFT W NUMBER OF BITS IN X
*      7.8  LSX  W,X         LEFT SHIFT W NUMBER OF BITS IN X
*
*           THE ABOVE SHIFTS ARE LOGICAL SHIFTS IN WHICH BITS
*           SHIFTED OUT ARE LOST AND ZERO BITS SUPPLIED AS
*           REQUIRED. THE SHIFT COUNT IS IN THE RANGE 0-CFP$N.
*
*      7.9  NZB  W,PLBL      JUMP TO PLBL IF W IS NOT
*                            ALL ZERO BITS.
*
*      7.10 ZRB  W,PLBL      JUMP TO PLBL IF W IS ALL ZERO BITS
*
*      7.11 ZGB  OPN         ZEROISE GARBAGE BITS
*
*           OPN CONTAINS A BIT STRING REPRESENTING A WORD
*           OF CHARACTERS FROM A STRING OR SOME FUNCTION
*           FORMED FROM SUCH CHARACTERS (E.G. AS A RESULT OF
*           HASHING). ON A MACHINE WHERE THE WORD SIZE IS NOT A
*           MULTIPLE OF THE CHARACTER SIZE, SOME BITS IN REG MAY
*           BE UNDEFINED. THIS OPCODE REPLACES SUCH BITS BY THE
*           ZERO BIT. ZGB IS A NO-OP IF THE WORD SIZE IS A
*           MULTIPLE OF THE CHARACTER SIZE.
       EJC
*
*      -8-  CONVERSION INSTRUCTIONS
*
*           THE FOLLOWING INSTRUCTIONS PROVIDE FOR CONVERSION
*           BETWEEN LENGTHS IN BAUS AND LENGTHS IN WORDS.
*
*      8.1  WTB  REG         CONVERT REG FROM WORDS TO BAUS.
*                            THAT IS, MULTIPLY BY CFP$B. THIS IS
*                            A NO-OP IF CFP$B IS ONE.
*
*      8.2  BTW  REG         CONVERT REG FROM BAUS TO WORDS
*                            BY DIVIDING REG BY CFP$B DISCARDING
*                            THE FRACTION. NO-OP IF CFP$B IS ONE
*
*           THE FOLLOWING INSTRUCTIONS PROVIDE FOR CONVERSION
*           OF ONE WORD INTEGER VALUES (ADDRESSES) TO AND
*           FROM THE FULL SIGNED INTEGER FORMAT.
*
*      8.3  MTI  OPN         THE VALUE OF OPN (AN ADDRESS)
*                            IS MOVED AS A POSITIVE INTEGER
*                            TO THE INTEGER ACCUMULATOR.
*
*      8.4  MFI  OPN,PLBL    THE VALUE CURRENTLY STORED IN THE
*                            INTEGER ACCUMULATOR IS MOVED
*                            TO OPN AS AN ADDRESS IF IT IS IN
*                            THE RANGE 0 TO CFP$M INCLUSIVE.
*                            IF THE ACCUMULATOR VALUE IS
*                            OUTSIDE THIS RANGE, THEN THE RESULT
*                            IN OPN IS UNDEFINED AND CONTROL IS
*                            PASSED TO PLBL. MFI DESTROYS THE
*                            VALUE OF (IA) WHETHER OR NOT
*                            INTEGER OVERFLOW IS SIGNALLED.
*                            PLBL MAY BE OMITTED IF OVERFLOW
*                            IS IMPOSSIBLE.
*
*           THE FOLLOWING INSTRUCTIONS PROVIDE FOR CONVERSION
*           BETWEEN REAL VALUES AND INTEGER VALUES.
*
*      8.5  ITR              CONVERT INTEGER VALUE IN INTEGER
*                            ACCUMULATOR TO REAL AND STORE IN
*                            REAL ACCUMULATOR (MAY LOSE
*                            PRECISION IN SOME CASES)
*
*      8.6  RTI  PLBL        CONVERT THE REAL VALUE IN RA TO
*                            AN INTEGER AND PLACE RESULT IN IA.
*                            CONVERSION IS BY TRUNCATION OF THE
*                            FRACTION - NO ROUNDING OCCURS.
*                            JUMP TO PLBL IF OUT OF RANGE. (RA)
*                            IS NOT CHANGED IN EITHER CASE.
*                            PLBL MAY BE OMITTED IF OVERFLOW
*                            IS IMPOSSIBLE.
       EJC
*
*      -8-  CONVERSION INSTRUCTIONS (CONTINUED)
*
*           THE FOLLOWING INSTRUCTIONS PROVIDE FOR COMPUTING
*           THE LENGTH OF STORAGE REQUIRED FOR A TEXT STRING.
*
*      8.7  CTW  W,VAL       THIS INSTRUCTION COMPUTES THE SUM
*                            (NUMBER OF WORDS REQUIRED TO STORE
*                            W CHARACTERS) + (VAL). THE SUM
*                            IS STORED IN W.
*                            FOR EXAMPLE, IF CFP$C IS 5, AND WA
*                            CONTAINS 32, THEN CTW WA,2
*                            GIVES A RESULT OF 9 IN WA.
*
*      8.8  CTB  W,VAL       CTB IS EXACTLY LIKE CTW EXCEPT THAT
*                            THE RESULT IS IN BAUS. IT HAS THE
*                            SAME EFFECT AS CTW W,VAL  WTB W
*
*      8.9  BTC  W           COMPUTE THE NUMBER OF CHARACTERS
*                            WHICH CAN BE STORED IN (W) BAUS,
*                            PLACING THE RESULT IN W.
*
*      8.10 WTC  W           COMPUTE THE NUMBER OF CHARACTERS
*                            WHICH CAN BE STORED IN (W) WORDS,
*                            PLACING THE RESULT IN W.
*
*           THE FOLLOWING INSTRUCTIONS PROVIDE FOR CONVERSION
*           FROM INTEGERS TO AND FROM NUMERIC DIGIT CHARACTERS
*           FOR USE IN NUMERIC CONVERSION ROUTINES. THEY EMPLOY
*           NEGATIVE INTEGER VALUES TO ALLOW FOR PROPER
*           CONVERSION OF NUMBERS WHICH CANNOT BE COMPLEMENTED.
*
*      8.11 CVM  PLBL        CONVERT BY MULTIPLICATION
*
*           THE INTEGER ACCUMULATOR, WHICH IS ZERO OR NEGATIVE,
*           IS MULTIPLIED BY 10. WB CONTAINS THE CHARACTER
*           CODE FOR A DIGIT. THE VALUE OF THIS DIGIT IS THEN
*           SUBTRACTED FROM THE RESULT. IF THE RESULT IS OUT OF
*           RANGE, THEN CONTROL IS PASSED TO PLBL WITH THE
*           RESULT IN (IA) UNDEFINED. EXECUTION OF CVM LEAVES
*           THE RESULT IN (WB) UNDEFINED.
*
*      8.12 CVD              CONVERT BY DIVISION
*
*           THE INTEGER ACCUMULATOR, WHICH IS ZERO OR NEGATIVE,
*           IS DIVIDED BY 10. THE QUOTIENT (ZERO OR NEGATIVE)
*           IS REPLACED IN THE ACCUMULATOR. THE REMAINDER IS
*           CONVERTED TO THE CHARACTER CODE OF A DIGIT AND
*           PLACED IN WA. FOR EXAMPLE, AN OPERAND OF -523 GIVES
*           A QUOTIENT OF -52 AND A REMAINDER IN WA OF CH$D3.
       EJC
*
*      -9-  BLOCK MOVE INSTRUCTIONS
*
*      THE FOLLOWING INSTRUCTIONS ARE USED FOR TRANSFERRING
*      DATA FROM ONE AREA OF MEMORY TO ANOTHER IN BLOCKS.
*      THEY CAN BE IMPLEMENTED WITH THE INDICATED SERIES OF
*      OTHER MACRO-INSTRUCTIONS, BUT MORE EFFICIENT IMPLE-
*      MENTATIONS WILL BE POSSSIBLE ON MOST MACHINES.
*      BEFORE OBEYING ANY OF THESE ORDERS WA, XL, XR SHOULD HAVE
*      BEEN SET UP (USING PLC, PSC FOR THE CHARACTER MOVES). THE
*      FINAL VALUE OF WA IS UNDEFINED.
*
*      9.1  MVC              MOVE CHARACTERS
*
*           MVC IS EQUIVALENT TO THE SEQUENCE
*
*                  MOV  WB,DUMPB
*                  LCT  WA,WA
*           LOOPC  LCH  WB,(XL)+
*                  SCH  WB,(XR)+
*                  BCT  WA,LOOPC
*                  CSC  XR
*                  MOV  DUMPB,WB
*
*           THE CHARACTER POINTERS ARE BUMPED AS INDICATED
*           AND THE FINAL VALUE OF WA IS UNDEFINED.
*
*      9.2  MCB              MOVE CHARACTERS BACKWARDS
*
*           MCB IS EQUIVALENT TO THE SEQUENCE
*
*                  MOV  WB,DUMPB
*                  LCT  WA,WA
*           LOOPC  LCH  WB,-(XL)
*                  SCH  WB,-(XR)
*                  BCT  WA,LOOPC
*                  CSC  XR
*                  MOV  DUMPB,WB
*
*           THE CHARACTER POINTERS ARE BUMPED AS INDICATED
*           AND THE FINAL VALUE OF WA IS UNDEFINED.
       EJC
*
*      9.3  MVW              MOVE WORDS
*
*           MVW IS EQUIVALENT TO THE SEQUENCE
*
*           LOOPW  MOV  (XL)+,(XR)+
*                  DCA  WA               WA = BAUS TO MOVE
*                  BNZ  WA,LOOPW
*
*           NOTE THAT THIS IMPLIES THAT THE VALUE IN WA IS THE
*           LENGTH IN BAUS WHICH IS A MULTIPLE OF CFP$B.
*           THE INITIAL ADDRESSES IN XR,XL ARE WORD ADDRESSES.
*           AS INDICATED, THE FINAL XR,XL VALUES POINT PAST THE
*           NEW AND OLD REGIONS OF MEMORY RESPECTIVELY.
*           THE FINAL VALUE OF WA IS UNDEFINED.
*
*      9.4  MWB              MOVE WORDS BACKWARDS
*
*           MWB IS EQUIVALENT TO THE SEQUENCE
*
*           LOOPB  MOV  -(XL),-(XR)
*                  DCA  WA               WA = BAUS TO MOVE
*                  BNZ  WA,LOOPB
*
*           THERE IS A REQUIREMENT THAT THE INITIAL VALUE IN XL
*           BE AT LEAST 256 LESS THAN THE VALUE IN XR. THIS
*           ALLOWS AN IMPLEMENTATION IN WHICH CHUNKS OF 256
*           BAUS ARE MOVED FORWARD (IBM 360, ICL 1900).
*           THE FINAL VALUE OF WA IS UNDEFINED.
       EJC
*
*      -10- OPERATIONS CONNECTED WITH THE STACK
*
*      THE STACK IS AN AREA IN MEMORY WHICH IS DEDICATED FOR USE
*      IN CONJUNCTION WITH THE STACK POINTER REGISTER (XS). AS
*      PREVIOUSLY DESCRIBED, IT IS USED BY THE JSR AND EXI
*      INSTRUCTIONS AND MAY BE USED FOR STORAGE OF ANY OTHER
*      DATA AS REQUIRED.
*
*      THE STACK BUILDS EITHER WAY IN MEMORY AND AN IMPORTANT
*      RESTRICTION IS THAT THE VALUE IN (XS) MUST BE THE ADDRESS
*      OF THE STACK FRONT AT ALL TIMES SINCE
*      SOME IMPLEMENTATIONS MAY RANDOMLY DESTROY STACK LOCATIONS
*      BEYOND (XS).
*
*      THE STARTING STACK BASE ADDRESS IS PASSED
*      IN (XS) AT THE START OF EXECUTION. DURING EXECUTION IT
*      IS NECESSARY TO MAKE SURE THAT THE STACK DOES NOT
*      OVERFLOW. THIS IS ACHIEVED BY EXECUTING THE FOLLOWING
*      INSTRUCTION PERIODICALLY.
*
*      10.1 CHK              CHECK STACK OVERFLOW
*
*      AFTER SUCCESSFULLY EXECUTING CHK, IT IS PERMISSIBLE TO
*      USE UP TO 100 ADDITIONAL WORDS BEFORE ISSUING ANOTHER CHK
*      THUS CHK NEED NOT BE ISSUED EVERY TIME THE STACK IS
*      EXPANDED. IN SOME IMPLEMENTATIONS, THE CHECKING MAY BE
*      AUTOMATIC AND CHK WILL HAVE NO EFFECT. FOLLOWING THE
*      ABOVE RULE MAKES SURE THAT THE PROGRAM WILL OPERATE
*      CORRECTLY IN IMPLEMENTATIONS WITH NO AUTOMATIC CHECK.
*
*      IF STACK OVERFLOW OCCURS (DETECTED EITHER AUTOMATICALLY
*      OR BY A CHK INSTRUCTION), THEN CONTROL IS PASSED TO THE
*      STACK OVERFLOW SECTION (SEE PROGRAM FORM). NOTE THAT THIS
*      TRANSFER MAY TAKE PLACE FOLLOWING ANY INSTRUCTION WHICH
*      STORES DATA AT A NEW LOCATION ON THE STACK.
*      AFTER STACK OVERFLOW, STACK IS ARBITRARILY POPPED
*      TO GIVE SOME SPACE IN WHICH THE ERROR PROCEDURE MAY
*      OPERATE. OTHERWISE A LOOP OF STACK OVERFLOWS MAY OCCUR.
       EJC
*
*      -11- DATA GENERATION INSTRUCTIONS
*
*      THE FOLLOWING INSTRUCTIONS ARE USED TO GENERATE CONSTANT
*      VALUES IN THE CONSTANT SECTION AND ALSO TO ASSEMBLE
*      INITIAL VALUES IN THE WORKING STORAGE SECTION. THEY
*      MAY NOT APPEAR EXCEPT IN THESE TWO SECTIONS.
*
*      11.1 DAC  ADDR        ASSEMBLE ADDRESS CONSTANT.
*                            GENERATES ONE WORD CONTAINING THE
*                            SPECIFIED ONE WORD INTEGER
*                            VALUE (ADDRESS).
*
*      11.2 DIC  INTEGER     GENERATES AN INTEGER VALUE WHICH
*                            OCCUPIES CFP$I CONSECUTIVE WORDS.
*                            THE OPERAND IS A DIGIT STRING WITH
*                            A REQUIRED LEADING SIGN.
*
*      11.3 DRC  REAL        ASSEMBLES A REAL CONSTANT WHICH
*                            OCCUPIES CFP$R CONSECUTIVE WORDS.
*                            THE OPERAND FORM MUST OBEY THE
*                            RULES FOR A FORTRAN REAL CONSTANT
*                            WITH THE EXTRA REQUIREMENT THAT A
*                            LEADING SIGN BE PRESENT.
*
*      11.4 DTC  DTEXT       DEFINE TEXT CONSTANT. DTEXT
*                            IS STARTED AND ENDED WITH ANY
*                            CHARACTER NOT CONTAINED IN THE
*                            CHARACTERS TO BE ASSEMBLED. THE
*                            CONSTANT OCCUPIES CONSECUTIVE WORDS
*                            AS DICTATED BY THE CONFIGURATION
*                            PARAMETER CFP$C. ANY UNUSED CHARS
*                            IN THE LAST WORD ARE RIGHT FILLED
*                            WITH ZEROS (I.E. THE CHARACTER
*                            WHOSE INTERNAL CODE IS ZERO).
*                            THE STRING CONTAINS A SEQUENCE OF
*                            LETTERS, DIGITS, BLANKS AND ANY OF
*                            THE FOLLOWING SPECIAL CHARACTERS.
*                            =,$.(*)/+-
*                            NO OTHER CHARACTERS
*                            MAY BE USED IN A DTEXT OPERAND.
*
*      11.5 DBC  VAL         ASSEMBLE BIT STRING CONSTANT. THE
*                            OPERAND IS A POSITIVE INTEGER
*                            VALUE WHICH IS INTERPRETED IN
*                            BINARY, RIGHT JUSTIFIED AND LEFT
*                            FILLED WITH ZERO BITS. THUS 5 WOULD
*                            IMPLY THE BIT STRING VALUE 00..101.
*
*      11.6 DDC  DTEXT       DEFINE DISPLAY CONSTANT.  IDENTICAL
*                            TO DTC (SEE ABOVE), HOWEVER ON
*                            SYSTEMS SUPPORTING LOWER CASE,
*                            THE TRANSLATION IS FREE TO MIX
*                            CASES IN A MANNER APPROPRIATE
*                            TO THE TARGET SYSTEM.
       EJC
*
*      -12- SYMBOL DEFINITION INSTRUCTIONS
*
*      THE FOLLOWING INSTRUCTION IS USED TO DEFINE SYMBOLS
*      IN THE DEFINITIONS SECTION. IT MAY NOT BE USED ELSEWHERE.
*
*      12.1 EQU  EQOP        DEFINE SYMBOL
*
*           THE SYMBOL WHICH APPEARS IN THE LABEL FIELD IS
*           DEFINED TO HAVE THE ABSOLUTE VALUE GIVEN
*           BY THE EQOP OPERAND. A GIVEN SYMBOL MAY BE DEFINED
*           ONLY ONCE IN THIS MANNER, AND ANY SYMBOLS OCCURING
*           IN EQOP MUST BE PREVIOUSLY DEFINED.
*
*           THE FOLLOWING ARE THE POSSIBILITIES FOR EQOP
*
*           VAL              THE INDICATED VALUE IS USED
*
*           VAL+VAL          THE SUM OF THE TWO VALUES IS USED.
*                            THIS SUM MUST NOT EXCEED CFP$M
*
*           VAL-VAL          THE DIFFERENCE BETWEEN THE TWO
*                            VALUES (MUST BE POSITIVE) IS USED.
*
*           *                THIS FORMAT DEFINES THE LABEL BY
*                            USING A VALUE SUPPLIED BY THE
*                            MINIMAL TRANSLATOR. VALUES ARE
*                            REQUIRED FOR THE
*           CFP$X            (CONFIGURATION PARAMETERS)
*           E$XXX            (ENVIRONMENT PARAMETERS)
*           CH$XX            (CHARACTER CODES).
*                            IN ORDER FOR A TRANSLATOR TO
*                            HANDLE THIS FORMAT CORRECTLY THE
*                            DEFINITIONS SECTION MUST BE
*                            CONSULTED FOR DETAILS OF REQUIRED
*                            SYMBOLS AS LISTED AT THE FRONT OF
*                            THE SECTION.
       EJC
*
*      SYMBOL DEFINITION INSTRUCTIONS (CONTINUED)
*
*      THE FOLLOWING INSTRUCTIONS MAY BE USED TO DEFINE SYMBOLS
*      IN THE PROCEDURE SECTION. THEY MAY NOT BE USED IN
*      ANY OTHER PART OF THE PROGRAM.
*
*      12.2 EXP  PTYP,INT    DEFINE EXTERNAL PROCEDURE
*
*           EXP DEFINES THE SYMBOL IN THE LABEL FIELD AS A PLBL
*           NAMING AN EXTERNAL PROCEDURE WHICH CAN BE
*           REFERENCED IN A SUBSEQUENT JSR INSTRUCTION. THE
*           CODING FOR THE PROCEDURE IS EXTERNAL TO THE
*           CODING OF THE SOURCE PROGRAM IN THIS LANGUAGE.
*           THE CODE FOR EXTERNAL PROCEDURES MAY BE
*           REFERRED TO COLLECTIVELY AS THE OPERATING SYSTEM
*           INTERFACE, OR MORE BRIEFLY, OSINT, AND WILL
*           FREQUENTLY BE A SEPARATELY COMPILED SEGMENT OF CODE
*           LOADED WITH SPITBOL TO PRODUCE A COMPLETE SYSTEM.
*
*           PTYP SPECIFIES THE PROCEDURE TYPE AND INT DESIGNATES
*           THE NUMBER OF EXIT PARAMETERS.
*
*      12.3 INP  PTYP,INT    DEFINE INTERNAL PROCEDURE
*
*           INP DEFINES THE SYMBOL IN THE LABEL FIELD AS A PLBL
*           NAMING AN INTERNAL PROCEDURE AND GIVES
*           ITS TYPE AND NUMBER OF EXIT PARAMETERS. THE LABEL
*           CAN BE REFERENCED IN JSR INSTRUCTIONS AND
*           IT MUST APPEAR LABELLING A PRC INSTRUCTION IN THE
*           PROGRAM SECTION.
*
*      12.4 INR              DEFINE INTERNAL ROUTINE
*
*           INR DEFINES THE SYMBOL IN THE LABEL FIELD AS A RLBL
*           NAMING AN INTERNAL ROUTINE. THE
*           LABEL MAY BE REFERENCED IN ANY TYPE OF BRANCH ORDER
*           AND IT MUST APPEAR LABELLING A RTN INSTRUCTION IN
*           THE PROGRAM SECTION.
*
*      12.5 GLB  DEFINE GLOBAL SYMBOL
*
*           GLB DEFINES THE SYMBOL IN THE LABEL FIELD AS A GLBL
*           NAMING THE DESTINATION OF A JMG (JUMP GLOBAL) ORDER.
*           THE SYMBOL MAY ALSO BE THE DESTINATION OF LOCAL
*           BRANCHES OF ALL TYPES.
*           THE LABEL MUST APPEAR IN THE PROCEDURE SECTION
*           LABELLING AN INSTRUCTION.
       EJC
*
*      -13- ASSEMBLY LISTING LAYOUT INSTRUCTIONS
*
*      13.1 EJC              EJECT TO NEXT PAGE
*
*      13.2 TTL  TEXT        SET NEW ASSEMBLY TITLE
*
*           TTL IMPLIES AN IMMEDIATE EJECT OF THE
*           ASSEMBLY LISTING TO PRINT THE NEW TITLE.
*
*           THE USE OF TTL AND EJC CARDS IS SUCH THAT THE
*           PROGRAM WILL LIST NEATLY IF THE PRINTER PRINTS
*           AS MANY AS 58 LINES PER PAGE. IN THE EVENT THAT
*           THE PRINTER DEPTH IS LESS THAN THIS, OR IF THE
*           LISTING CONTAINS INTERSPERSED LINES (SUCH AS ACTUAL
*           GENERATED CODE), THEN THE FORMAT MAY BE UPSET.
*
*           LINES STARTING WITH AN ASTERISK ARE COMMENT LINES
*           WHICH CAUSE NO CODE TO BE GENERATED AND MAY OCCUR
*           FREELY ANYWHERE IN THE PROGRAM. THE FORMAT FOR
*           COMMENT LINES IS GIVEN IN SECTION -15-.
       EJC
*
*      -14- PROGRAM FORM
*
*           THE PROGRAM CONSISTS OF SEPARATE SECTIONS SEPARATED
*           BY SEC OPERATIONS. THE SECTIONS MUST APPEAR IN THE
*           FOLLOWING SPECIFIED ORDER.
*
*      14.1 SEC              START OF PROCEDURE SECTION
*
*           (PROCEDURE SECTION)
*
*           SEC               START OF DEFINITIONS SECTION
*
*           (DEFINITIONS SECTION)
*
*           SEC               START OF CONSTANT STORAGE SECTION
*
*           (CONSTANT STORAGE SECTION)
*
*           SEC               START OF WORKING STORAGE SECTION
*
*           (WORKING STORAGE SECTION)
*
*           SEC               START OF PROGRAM SECTION
*
*           (PROGRAM SECTION)
*
*           SEC               START OF STACK OVERFLOW SECTION
*
*           (STACK OVERFLOW SECTION)
*
*           SEC               START OF ERROR SECTION
*
*           (ERROR SECTION)
*
*      14.2 END              END OF ASSEMBLY
       EJC
*
*      SECTION 10 - PROGRAM FORM
*
*      PROCEDURE SECTION
*
*           THE PROCEDURE SECTION CONTAINS ALL THE EXP
*           INSTRUCTIONS FOR EXTERNALLY AVAILABLE PROCEDURES
*           AND INP,INR OPCODES FOR INTERNAL PROCEDURES,ROUTINES
*           SO THAT A SINGLE PASS MINIMAL TRANSLATOR HAS ADVANCE
*           KNOWLEDGE OF PROCEDURE TYPES WHEN TRANSLATING CALLS.
*
*      DEFINITIONS SECTION
*
*           THE DEFINITIONS SECTION CONTAINS EQU INSTRUCTIONS
*           WHICH DEFINE SYMBOLS REFERENCED LATER ON IN THE
*           PROGRAM, CONSTANT AND WORK SECTIONS.
*
*      CONSTANT STORAGE SECTION
*
*           THE CONSTANT STORAGE SECTION CONSISTS ENTIRELY
*           OF CONSTANTS ASSEMBLED WITH THE DAC,DDC,DIC,DRC
*           DTC,DBC ASSEMBLY OPERATIONS. THESE CONSTANTS CAN
*           BE FREELY REFERENCED BY THE PROGRAM INSTRUCTIONS.
*
*      WORKING STORAGE SECTION
*
*           THE WORKING STORAGE SECTION CONSISTS ENTIRELY OF
*           DAC,DDC,DIC,DRC,DBC,DTC INSTRUCTIONS TO DEFINE A
*           FIXED LENGTH WORK AREA. THE WORK LOCATIONS IN THIS
*           AREA CAN BE DIRECTLY REFERENCED IN PROGRAM
*           INSTRUCTIONS. THE AREA IS INITIALIZED IN ACCORDANCE
*           WITH THE VALUES ASSEMBLED IN THE INSTRUCTIONS.
*
*      PROGRAM SECTION
*
*           THE PROGRAM SECTION CONTAINS PROGRAM INSTRUCTIONS
*           AND ASSOCIATED OPERATIONS (SUCH AS PRC, ENP, ENT).
*           CONTROL IS PASSED TO THE FIRST INSTRUCTION IN THIS
*           SECTION WHEN EXECUTION IS INITIATED.
*
*      STACK OVERFLOW SECTION
*
*           THE STACK OVERFLOW SECTION CONTAINS INSTRUCTIONS
*           LIKE THE PROGRAM SECTION. CONTROL IS PASSED TO THE
*           FIRST INSTRUCTION IN THIS SECTION FOLLOWING THE
*           OCCURRENCE OF STACK OVERFLOW, SEE CHK INSTRUCTION.
*
*      ERROR SECTION
*
*           THE ERROR SECTION CONTAINS INSTRUCTIONS LIKE THE
*           PROGRAM SECTION. CONTROL IS PASSED TO THE FIRST
*           INSTRUCTION IN THIS SECTION WHEN A PROCEDURE EXIT
*           CORRESPONDS TO AN ERROR PARAMETER (SEE ERR)
*           OR WHEN AN ERB OPCODE IS OBEYED. THE ERROR CODE
*           MUST CLEAN UP THE MAIN STACK AND CATER FOR THE
*           POSSIBILITY THAT A SUBROUTINE STACK MAY NEED CLEAN
*           UP.
       EJC
*      OSINT
*
*           THOUGH NOT PART OF THE MINIMAL SOURCE, IT IS USEFUL
*           TO REFER TO THE COLLECTION OF INITIALISATION AND
*           EXP ROUTINES AS OSINT (OPERATING SYSTEM INTERFACE).
*           ERRORS OCCURRING WITHIN OSINT PROCEDURES ARE
*           USUALLY HANDLED BY MAKING AN ERROR RETURN. IF THIS
*           IS NOT FEASIBLE OR APPROPRIATE, OSINT MAY USE THE
*           MINIMAL ERROR SECTION TO REPORT ERRORS DIRECTLY BY
*           BRANCHING TO IT WITH A SUITABLE NUMERIC ERROR
*           CODE IN WA.
       EJC
*
*      SECTION 11 - STATEMENT FORMAT
*
*      ALL LABELS ARE EXACTLY FIVE CHARACTERS LONG AND START
*      WITH THREE LETTERS (ABCDEFGHIJKLMNOPQRSTUVWXY$) FOLLOWED
*      BY TWO LETTERS OR DIGITS.
*      THE LETTER Z MAY NOT BE USED IN MINIMAL SYMBOLS BUT $ IS
*      PERMITTED.
*      FOR IMPLEMENTATIONS WHERE $ MAY NOT APPEAR IN THE
*      TARGET CODE , A SIMPLE SUBSTITUTION OF Z FOR $
*      MAY THUS BE MADE WITHOUT RISK OF PRODUCING NON-UNIQUE
*      SYMBOLS.
*      THE LETTER Z IS HOWEVER PERMITTED IN OPCODE MNEMONICS AND
*      IN COMMENTS.
*
*      MINIMAL STATEMENTS ARE IN A FIXED FORMAT AS FOLLOWS.
*
*      COLS 1-5              LABEL IF ANY (ELSE BLANK)
*
*      COLS 6-7              ALWAYS BLANK
*
*      COLS 8-10             OPERATION MNEMONIC
*
*      COLS 11-12            BLANKS
*
*      COLS 13-28            OPERAND FIELD, TERMINATED BY A
*                            BLANK. MAY OCCASIONALLY
*                            EXTEND PAST COLUMN 28.
*
*      COLS 30-64            COMMENT. ALWAYS SEPARATED FROM THE
*                            OPERAND FIELD BY AT LEAST ONE BLANK
*                            MAY OCCASIONALLY START AFTER COLUMN
*                            30 IF THE OPERAND EXTENDS PAST 28.
*                            A SPECIAL EXCEPTION OCCURS FOR THE
*                            IFF INSTRUCTION, WHOSE COMMENT MAY
*                            BE ONLY 20 CHARACTERS LONG (30-49).
*
*      COLS 65 ON            UNUSED
*
*
*      COMMENT LINES HAVE THE FOLLOWING FORMAT
*
*      COL 1                 ASTERISK
*
*      COLS 2-7              BLANK
*
*      COLS 8-64             ARBITRARY TEXT, RESTRICTED TO THE
*                            FORTRAN CHARACTER SET.
*
*
*      THE FORTRAN CHARACTER SET IS A-Z 0-9 =,$.(*)-/+
       EJC
*
*      SECTION 12 - PROGRAM EXECUTION
*
*      EXECUTION OF THE PROGRAM BEGINS WITH THE FIRST
*      INSTRUCTION IN THE PROGRAM SECTION.
*
*      IN ADDITION TO THE FIXED LENGTH MEMORY REGIONS DEFINED
*      BY THE ASSEMBLY, THERE ARE TWO DYNAMICALLY ALLOCATED
*      MEMORY REGIONS AS FOLLOWS.
*
*      DATA AREA             THIS IS AN AREA AVAILABLE TO THE
*                            PROGRAM FOR GENERAL STORAGE OF DATA
*                            ANY DATA VALUE MAY BE STORED IN
*                            THIS AREA EXCEPT INSTRUCTIONS.
*                            IN SOME IMPLEMENTATIONS, IT MAY BE
*                            POSSIBLE TO INCREASE THE SIZE OF
*                            THIS AREA DYNAMICALLY BY ADDING
*                            WORDS AT THE TOP END WITH A CALL
*                            TO A SYSTEM PROCEDURE.
*
*      STACK AREA            THIS REGION OF MEMORY HOLDS
*                            THE STACK USED FOR SUBROUTINE CALLS
*                            AND OTHER STORAGE OF ONE WORD
*                            INTEGER VALUES (ADDRESSES). THIS
*                            IS THE STACK ASSOCIATED WITH
*                            INDEX REGISTER XS.
*
*      THE LOCATIONS AND SIZES OF THESE AREAS ARE SPECIFIED
*      BY THE VALUES IN THE REGISTERS AT THE START OF PROGRAM
*      EXECUTION AS FOLLOWS.
*
*      (XS)                  ADDRESS ONE PAST THE STACK BASE.
*                            E.G. IF XS IS 23456, A D-STACK WILL
*                            OCCUPY WORDS 23455,23454,...
*                            WHEREAS A U-STACK WILL OCCUPY
*                            23457,23458,...
*
*      (XR)                  ADDRESS OF THE FIRST WORD
*                            IN THE DATA AREA
*
*      (XL)                  ADDRESS OF THE LAST WORD IN THE
*                            DATA AREA.
*
*      (WA,WB,WC,IA,RA,CP)   AS DEFINED BY THE PROGRAM
*
*      THERE IS NO EXPLICIT WAY TO TERMINATE THE EXECUTION OF A
*      PROGRAM. THIS FUNCTION IS PERFORMED BY AN APPROPRIATE
*      SYSTEM PROCEDURE REFERENCED WITH THE SYSEJ INSTRUCTION.
       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 IMPLEMENTATION IS DISCUSSED IN DEWAR AND MCCANN,
*      MACRO SPITBOL - A SNOBOL4 COMPILER, SOFTWARE PRACTICE AND
*      EXPERIENCE, 7, 95-113, 1977.
*      THE LANGUAGE IS AS IMPLEMENTED BY THE BTL TRANSLATOR
*      (GRISWOLD, POAGE AND POLONSKY, PRENTICE HALL, 1971)
*      WITH THE FOLLOWING PRINCIPAL 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 BAU 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 BAUS. 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.
*      SOME OF THE RULES ARE SUBTLE SO IT IS PREFERABLE FOR
*      OSINT TO MANAGE ITS OWN MEMORY NEEDS. SPITBOL PROCS
*      OBEY RULES TO ENSURE THAT NO ACTION CAN CAUSE A GARBAGE
*      COLLECTION EXCEPT AT SUCH TIMES AS CONTENTS OF XL, XR
*      AND THE STACK ARE +CLEAN+ (SEE COMMENT BEFORE UTILITY
*      PROCEDURES AND IN GBCOL FOR MORE DETAIL). NOTE
*      THAT CALLS OF ALOST MAY CAUSE GARBAGE COLLECTION (SHIFT
*      OF MEMORY TO FREE SPACE). SPITBOL PROCS WHICH CALL
*      SYSTEM ROUTINES ASSUME THAT THEY CANNOT PRECIPITATE
*      COLLECTION AND THIS MUST BE RESPECTED.
       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.
*
*      ENTRY VALUES
*
*      IN ADDITION TO THE ENTRY VALUES OF XS, XL, XR AS DEFINED
*      FOR MINIMAL, THE PROGRAM-SPECIFIC ENTRY REGISTERS MUST
*      BE SET AS FOLLOWS
*
*      (WA)                  INITIAL VALUE FOR CODE KEYWORD
*
*      (WB,WC,IA,RA,CP)      ZERO
*
       TTL  S P I T B O L -- PROCEDURES SECTION
       EJC
*
*      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.
*      A MODEL MINIMAL EXP PSEUDO-OP FOR EACH PROCEDURE IS
*      INCLUDED IN THE DESCRIPTION. MACHINE PROCESSABLE VERSIONS
*      OF THESE ARE COLLECTED AT THE END OF THE SECTION,
*      FOLLOWING THE SEC OPCODE.
*      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 BLOCKS.
*
*      SCBLK FORMAT IS OUTLINED HERE, SINCE STRINGS ARE OFTEN
*      PASSED AS PARAMETERS TO OSINT OR MAY BE RETURNED BY
*      OSINT. AN SCBLK CONTAINS 2 HEADER WORDS, THE FIRST OF
*      WHICH CONTAINS A VALUE ONLY OF INTEREST TO SPITBOL.
*      IT IS NOT NECESSARY TO SET THIS FIELD IN RETURNED
*      SCBLKS.
*      THE SECOND WORD CONTAINS THE NUMBER OF CHARACTERS IN THE
*      STRING AND SHOULD BE CORRECTLY SET IN RETURNED SCBLKS.
*      THE REMAINING WORDS CONTAIN THE CHARACTERS OF THE STRING,
*      PACKED CFP$C PER WORD, WITH THE LAST WORD PADDED OUT IF
*      NECESSARY WITH BLANK CHARACTERS.
       EJC
*
*      OSINT FAILURE (FLOSI) AND ERROR (EROSI) RETURNS
*      ----- ------- ------- --- ----- ------- -------
*
*      WHERE IT MAKES SENSE, OSINT CALLS MAY BE ABLE TO
*      RETURN IN SUCH A WAY AS TO CAUSE SPITBOL STATEMENT
*      FAILURE SO THAT THE USER CAN REGAIN CONTROL FOR SOME
*      CONDITIONS AND ATTEMPT RECOVERY OR A RE-TRY.
*      THESE CASES ARE IDENTIFIED BY INCLUDING
*          PPM FLOSI
*      IN THE LIST OF RETURNS.
*      THE CONDITIONS ON REGISTER PRESERVATION WHEN A FLOSI
*      RETURN IS TAKEN ARE AS FOLLOWS.
*      ANY REGISTER APPEARING IN THE LIST FOLLOWING THE MODEL
*      CALL AS BEING DESTROYED ON A NORMAL RETURN, NEED NOT BE
*      PRESERVED. ADDITIONALLY ANY REGISTER CONTAINING ENTRY
*      PARAMETERS NEED NOT BE PRESERVED ON A FLOSI RETURN.
*      OTHER REGISTERS, NOT EXPLICITLY REFERENCED, MUST BE
*      PRESERVED.
*
*      SOME OSINT CALLS ARE PERMITTED TO RETURN AN ERROR
*      CODE AND/OR MESSAGE. THIS ALLOWS REPORTING OF ERROR
*      CONDITIONS DETECTED BY THE OSINT ROUTINE IN TERMS
*      RELEVANT TO THE IMPLEMENTATION. SUCH RETURNS WILL RESULT
*      IN EXECUTION TERMINATION (UNLESS AN ERROR TRAP IS
*      OPERATIVE). IN THE DOCUMENTATION OF THE SYS-- ROUTINES
*      THEY APPEAR AS
*          PPM  EROSI
*      RETURNS AND THE CONVENTIONS USED ARE AS FOLLOWS -
*      TAKE THE SPECIFIED RETURN WITH
*          (WA)  SET TO 0 AS A DEFAULT ERROR CODE
*      OR  (WA)  SET TO ANY PRIVATE CODE IN 300 TO 999.
*          (XL)  SET TO 0 IN WHICH CASE SPITBOL WILL MAKE A
*                LATER SYSEM CALL TO OBTAIN THE ERROR TEXT
*                USING THE ERROR CODE PASSED IN WA.
*      OR  (WA)  SET TO ANY PRIVATE CODE IN 300 TO 999.
*          (XL)  POINTING TO AN SCBLK CONTAINING THE TEXT OF AN
*                ERROR MESSAGE AND WITH ITS LENGTH FIELD SET.
*                THIS WILL BE COPIED ON RETURN TO SPITBOL AND
*                USED IN THE USUAL ERROR PROCESSING.
*                IN THIS CASE, NO SYSEM CALL WILL FOLLOW.
*
*      THE REMARKS REGARDING REGISTER PRESERVATION UNDER THE
*      FLOSI DESCRIPTION APPLY ALSO TO AN EROSI RETURN EXCEPT
*      THAT PRESCRIBED VALUES FOR WA, XL MUST BE SET UP.
*
       EJC
*
*      SYSAX -- AFTER EXECUTION
*
*      SYSAX  EXP  E,0       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
*
*      SYSBX -- BEFORE EXECUTION
*
*      SYSBX  EXP  E,0       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
*
*      SYSCI -- CONVERT INTEGER
*
*      SYSCI  EXP  E,0       DEFINE EXTERNAL ENTRY POINT
*
*      SYSCI IS AN OPTIONAL OSINT ROUTINE THAT CAUSES SPITBOL TO
*      CALL SYSCI TO CONVERT INTEGER VALUES TO STRINGS, RATHER
*      THAN USING THE SPITBOL INTERNAL CONVERSION CODE. THIS
*      CODE MAY BE LESS EFFICIENT ON MACHINES WITH HARDWARE
*      CONVERSION INSTRUCTIONS AND IN SUCH CASES, IT MAY BE AN
*      ADVANTAGE TO INCLUDE SYSCI.  THE SYMBOL .CSCI MUST BE
*      DEFINED IF THIS ROUTINE IS TO BE USED.
*
*      THE RULES FOR CONVERTING INTEGERS TO STRINGS ARE THAT
*      POSITIVE VALUES ARE REPRESENTED WITHOUT ANY SIGN, AND
*      THERE ARE NEVER ANY LEADING BLANKS OR ZEROS, EXCEPT IN
*      THE CASE OF ZERO ITSELF WHICH IS REPRESENTED AS A SINGLE
*      ZERO DIGIT.  NEGATIVE NUMBERS ARE REPRESENTED WITH A
*      PRECEDING MINUS SIGN.  THERE ARE NEVER ANY TRAILING
*      BLANKS, AND CONVERSION CANNOT FAIL.
*
*      (IA)                  VALUE TO BE CONVERTED
*      JSR  SYSCI            CALL TO CONVERT INTEGER VALUE
*      (XL)                  POINTER TO PSEUDO-SCBLK WITH STRING
*
*      SYSDT -- GET CURRENT DATE
*
*      SYSDT  EXP  E,0       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
*
*      SYSEC -- END -COPY INCLUSION
*
*      SYSEC  PRC  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      (WA)               IOTAG FROM MATCHING SYSSC
*      JSR  SYSEC         CALL TO END -COPY
*      PPM                DUMMY FAIL EXIT (DO NOT USE)
*      PPM  EROSI         ERROR EXIT
*      (WA,WB,WC)         DESTRUCTABLE
*
*      THE CALL TO SYSEC SIGNALS THE OSINT THAT INPUT IS
*      TO BE CLOSED OUT FROM THE CURRENT SYSRD -COPY FILE
*      AND INPUT RESTORED FROM THE NEXT OUTER LEVEL.  WA
*      IS THE IOTAG RETURNED FROM THE MATCHING SYSSC CALL.
*      NOTE THAT SYSEC MAY BE CALLED EITHER AS A
*      CONSEQUENCE OF FLOSI EXIT FROM SYSRD, OR PREMATURELY
*      IN THE EVENT OF A CODE() COMPILATION ERROR CONTAINING
*      A -COPY, OR "END" LABEL ENCOUNTERED DURING INITIAL
*      COMPILATION.  A MISSING FLOSI EXIT FOR SYSEC IS INCLUDED
*      FOR STRUCTURAL CONFORMANCE, BUT MUST NEVER BE TAKEN.
       EJC
*
*      SYSSC -- START -COPY INCLUSION FOR SYSRD
*
*      SYSSC  PRC  E,2    DEFINE EXTERNAL ENTRY POINT
*
*      (XR)               FILETAG SCBLK FOR -COPY
*      JSR  SYSSC         CALL TO NEST -COPY INPUT
*      PPM                DUMMY FAIL EXIT (DO NOT USE)
*      PPM  EROSI         ERROR EXIT
*      (WA)               IOTAG TO BE PRESENTED TO SYSEC
*      (WB,WC)            DESTRUCTABLE
*
*      SYSSC IS CALLED BY SPITBOL WHEN A -COPY CONTROL
*      CARD IS ENCOUNTERED, EITHER AT COMPILE TIME IN
*      THE INPUT STREAM OR AT EXECUTION TIME IN A
*      CALL TO CODE.  THE INTENDED SEMANTICS ARE THAT
*      FURTHER INPUT FROM THE CURRENT STANDARD INPUT
*      FILE BE SUSPENDED AND THAT SUBSEQENT CALLS
*      TO SYSRD RETURN LINES FROM THE NEW FILE
*      IDENTIFIED BY THE SCBLK PTR GIVEN TO SYSSC IN XR.
*      THIS NEW FILE IS CLOSED AND SUSPENDED INPUT
*      RESUMED BY THE OSINT WHEN SYSEC IS CALLED.
*
*      FAILURE TO FIND A -COPY FILE MUST BE VIEWED
*      AS AN EROSI.  THE DUMMY PPM IS INCLUDED ONLY FOR
*      STRUCTURAL COMPATIBILITY WITH OTHER FLOSI/EROSI
*      OSINT ROUTINE DEFINITIONS.  THE IOTAG RETURNED
*      WILL BE SAVED AND PRESENTED TO SYSEC
*      WHEN SPITBOL WISHES THIS LEVEL OF -COPY TERMINATED.
*      IT MUST BE NON-COLLECTABLE.
*
*      IN GENERAL, SPITBOL SUPPORTS ARBITRARY NESTING
*      OF SYSSC/SYSEC IN THE NATURAL MANNER.  IT IS
*      RECOGNISED THAT THE IMPLEMENTATION MAY NEED TO
*      LIMIT THE DEGREE OF NESTING.  HOWEVER
*      IMPLEMENTORS ARE MOST STRONGLY ENCOURAGED TO
*      PROVIDE AT LEAST A SINGLE LEVEL OF -COPY TO GIVE
*      A DEGREE OF MODULARITY TO A LANGUAGE WHICH
*      DEFINITELY NEEDS IT.
       EJC
*
*      SYSEF -- EJECT FILE
*
*      SYSEF  EXP  E,2       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).
*      THE FAILURE RETURN SHOULD BE USED IF THE FILE DOES NOT
*      PERMIT EJECTS.
*      THE ERROR RETURN SHOULD BE USED FOR OTHER UNSPECIFIED
*      FAILURE EVENTS.
*      SEE SYSIO FOR ACCOUNT OF FILETAG, IOTAG.
*
*      (XL)                  FILETAG (PTR TO SCBLK FOR ARG)
*      (WA)                  IOTAG FROM INITIAL SYSIO CALL
*      (WC)                  VALUE/0 FOR INTEGER/STRING FILETAG
*      JSR  SYSEF            CALL TO EJECT FILE
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (XL,WA,WC)            DESTROYED
*
*      SYSEJ -- END OF JOB
*
*      SYSEJ  EXP  E,0       DEFINE EXTERNAL ENTRY POINT
*
*      SYSEJ IS CALLED ONCE AT THE END OF EXECUTION TO
*      TERMINATE THE RUN.
*      RUN STATISTICS, ENDING MESSAGES ETC WILL HAVE BEEN
*      PROVIDED ALREADY BY SPITBOL BEFORE THIS CALL IS MADE.
*
*      (WA)                  VALUE OF CODE KEYWORD
*      JSR  SYSEJ            CALL TO END JOB
*                            DOES NOT RETURN TO CALLER
*
       EJC
*
*      SYSEM -- GET ERROR MESSAGE TEXT
*
*      SYSEM  EXP  E,0       DEFINE EXTERNAL ENTRY POINT
*
*      SYSEM IS USED TO OBTAIN THE TEXT OF ERR, ERB CALLS IN THE
*      SOURCE PROGRAM OR OF OSINT ERROR MESSAGES.
*      THE ERROR CODE IS EITHER THAT GIVEN IN THE ERR, ERB
*      ORDER OR IS THAT RETURNED VIA THE EROSI MECHANISM OF
*      AN EARLIER OSINT CALL.
*      SYSEM SHOULD RETURN A NULL STRING (LENGTH ZERO) IF IT
*      DOES NOT SUPPORT THIS FEATURE OR NO MESSAGE CORRESPONDS
*      TO THE PRESENTED CODE.
*      IN THIS CASE, SPITBOL WILL PRINT THE STRING, IF ANY,
*      STORED IN THE ERRTEXT KEYWORD.
*
*      (WA)                  ERROR CODE NUMBER
*      JSR  SYSEM            CALL TO GET TEXT
*      (XR)                  POINTER TO 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.
       EJC
*
*      SYSEN -- ENDFILE
*
*      SYSEN  EXP  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      SYSEN IS USED TO IMPLEMENT THE SNOBOL4 FUNCTION ENDFILE.
*      THE FILE SHOULD NORMALLY BE CLOSED BY THIS CALL (UNLESS
*      THE CALL IS INTENDED TO ACCESS, VIA THE SECOND ARGUMENT,
*      SOME SPECIAL HOST FEATURE WHICH DOES NOT IMPLY CLOSURE).
*      ANY INTERNAL BUFFERS, TABLE ENTRIES OR MARKERS RELATING
*      TO THE FILE MAY BE FREED IF FILE CLOSURE OCCURS.
*      THE SECOND ARGUMENT IS USED TO REQUEST FEATURES SUCH AS
*      FILE DELETION, RENAMING, REPROTECTION, REWINDING ETC AS
*      APPROPRIATE TO THE HOST OPERATING SYSTEM. ITS FORMAT IS
*      HOST SPECIFIC AND IT IS THE RESPONSIBILITY OF SYSEN TO
*      PARSE IT.
*      (WA) IS USED AS A CLOSURE FLAG ON RETURN. IF THE VALUE
*      IS NON-ZERO, SUBSEQUENT INPUT/OUTPUT SYS-- CALLS
*      INVOKED THROUGH ACCESS TO THE ASSOCIATED VARIABLE WILL
*      OCCUR AS THOUGH THERE HAD BEEN NO SYSEN CALL.
*      IF IT IS SET TO ZERO SPITBOL WILL CAUSE STATEMENT FAILURE
*      FOR SUBSEQUENT ATTEMPTS TO INVOKE INPUT/OUTPUT ACTIVITY
*      THROUGH THE ASSOCIATED VARIABLE (CF A READ MADE AFTER
*      PHYSICAL END OF FILE IS REACHED). THIS WILL BE DONE
*      WITHOUT ANY FURTHER INVOCATION OF SYS-- ROUTINES.
*      SEE SYSIO FOR ACCOUNT OF FILETAG, IOTAG.
*
*      (XL)                  FILETAG (PTR TO SCBLK FOR 1ST ARG)
*      (XR)                  SCBLK PTR FOR 2ND ARG (0 IF NONE)
*      (WA)                  IOTAG FROM INITIAL SYSIO CALL
*      (WC)                  VALUE/0 FOR INTEGER/STRING FILETAG
*      JSR  SYSEN            CALL TO ENDFILE
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WA)                  CLOSURE FLAG (SEE ABOVE)
*      (XL,XR,WC)            DESTROYED
*
*      THE FAILURE RETURN SHOULD BE USED IF THE FILE DOES NOT
*      PERMIT ENDFILE (E.G. STANDARD INPUT AND OUTPUT FILES)
*      OR IF IT IS CLOSED ALREADY OR FOR APPROPRIATE CONDITIONS
*      WHERE A NON-NULL SECOND ARGUMENT WAS SUPPLIED.
*      THE ERROR RETURN SHOULD BE USED FOR OTHER UNSPECIFIED
*      FAILURE EVENTS.
       EJC
*
*      SYSEP -- EJECT PRINTER PAGE
*
*      SYSEP  EXP  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      SYSEP IS CALLED TO PERFORM A PAGE EJECT ON THE STANDARD
*      PRINTER OUTPUT FILE (CORRESPONDING TO SYSPR OUTPUT).
*      IF THE STANDARD PRINTER FILE DOES NOT SUPPORT PAGE EJECTS
*      THEN THIS ROUTINE SHOULD USE THE FAILURE RETURN.
*      IF SYSPP OPTIONS ARE SET TO MAKE THE TERMINAL THE
*      STANDARD OUTPUT FILE, EITHER ENSURE THAT PAGE SIZE IS
*      SET TO AVOID EJECTS OR CODE THIS ROUTINE TO HANDLE
*      POTENTIAL EJECTS TO TERMINAL.
*
*      JSR  SYSEP            CALL TO EJECT PRINTER OUTPUT
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
       EJC
*
*      SYSEX -- CALL EXTERNAL FUNCTION
*
*      SYSEX  EXP  E,1       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
*
*      SYSHS -- GIVE ACCESS TO HOST COMPUTER FEATURES ON
*
*      SYSHS  EXP  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      PROVIDES MEANS FOR IMPLEMENTING SPECIAL FEATURES
*      DIFFERENT HOST COMPUTERS. THE ONLY DEFINED ENTRIES ARE
*      (1) 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.
*      (2) FIRST ARGUMENT IS 1 (AS AN INTEGER OR STRING) TO GET,
*      AS A STRING, THE JCL COMMAND LINE FOR THE SPITBOL RUN.
*      ALL ENTRY PARAMETERS ARE CONVERTED TO STRINGS BEFORE THE
*      CALL IS MADE.
*      THE RESULT RETURNED FROM ANY CALL IS A STRING IN THE FORM
*      OF AN SCBLK WITH A POINTER TO IT IN XL. A NULL STRING
*      MAY BE RETURNED BY POINTING TO AN SCBLK WITH LENGTH
*      FIELD ZERO.
*      SPITBOL COPIES THE STRING ON RETURN AND SUPPLIES THE
*      CORRECT VALUE FOR THE FIRST WORD.
*      RETURNS ARE PROVIDED TO PERMIT STATEMENT FAILURE OR
*      THE REPORTING OF ERRORS.
*
*      (WA)                  ARGUMENT 1 SCBLK
*      (XL)                  ARGUMENT 2 SCBLK
*      (XR)                  ARGUMENT 3 SCBLK
*      (WB)                  0 IF ALL ARGS ARE NULL ELSE NONZERO
*      JSR  SYSHS            CALL TO GET HOST INFORMATION
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (XL)                  PTR TO SCBLK RESULT OF CALL
*      (XR,WA,WB)            DESTROYED
*
*      SYSID -- RETURN SYSTEM IDENTIFICATION
*
*      SYSID  EXP  E,0       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.
*
*      JSR  SYSID            CALL FOR SYSTEM IDENTIFICATION
*      (XR)                  SCBLK PTR FOR ADDITION TO HEADER
*      (XL)                  SCBLK PTR FOR SECOND HEADER
       EJC
*
*      SYSIL -- GET INPUT RECORD LENGTH
*
*      SYSIL  EXP  E,0       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)                  IOTAG FROM INITIAL SYSIO CALL
*      JSR  SYSIL            CALL TO GET RECORD LENGTH
*      (WA)                  LENGTH
*
*      NO HARM IS DONE IF THE VALUE RETURNED IS TOO LONG SINCE
*      UNUSED SPACE WILL BE RECLAIMED AFTER THE SYSIN CALL.
*      SYSIL MUST NEVER REQUEST A NULL (ZERO LENGTH) BUFFER.
*
*      SYSIN -- READ INPUT RECORD
*
*      SYSIN  EXP  E,2       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 BLANKS.
*      IT IS ALSO PERMISSIBLE TO TAKE EITHER OF THE ALTERNATIVE
*      RETURNS AFTER SCBLK LENGTH HAS BEEN MODIFIED.
*      THE FLOSI RETURN SHOULD BE TAKEN WHEN PHYSICAL END OF
*      FILE OCCURS.
*      SYSIN SHOULD BE PREPARED TO MAKE REPEATED ENDFILE RETURNS
*      BUT IN THE INTERESTS OF EFFICIENCY, IMPLEMENTORS
*      MAY CHOOSE TO LIMIT THE NUMBER OF SUCH RETURNS.
*      SEE SYSIO FOR ACCOUNT OF IOTAG.
*
*      (XR)                  POINTER TO BUFFER (SCBLK PTR)
*      (WA)                  IOTAG FROM INITIAL SYSIO CALL
*      (WC)                  LENGTH OF BUFFER IN CHARACTERS
*      JSR  SYSIN            CALL TO READ RECORD
*      PPM  FLOSI            STATEMENT FAILURE RETURN (ENDFILE)
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WA,WC)               DESTROYED
       EJC
*
*      SYSIO -- INPUT/OUTPUT FILE ASSOCIATION
*
*      SYSIO  EXP  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      SYSIO IS CALLED IN RESPONSE TO A SPITBOL INPUT() OR
*      OUTPUT() CALL.
*      THE FIRST ARGUMENT TO SUCH A CALL IS THE NAME OF A
*      SPITBOL VARIABLE WHICH IS NOT PASSED TO THIS ROUTINE.
*      THE SECOND ARGUMENT OF THE CALL WILL BE REFERRED TO FOR
*      CONVENIENCE AS THE FILETAG. IT IDENTIFIES IN SOME WAY
*      APPROPRIATE TO THE HOST, THE NAME OF THE FILE TO BE
*      OPENED. SPITBOL RECOGNISES THREE FORMS OF FILETAG,
*      (1) A NON-NUMERIC STRING IN WHICH CASE WC ON ENTRY WILL
*          CONTAIN ZERO
*      (2) AN INTEGER VALUE OR A STRING REPRESENTING AN INTEGER,
*          IN WHICH CASE WC ON ENTRY HOLDS THIS NUMERIC VALUE.
*      IN BOTH CASES, XL WILL CONTAIN A POINTER TO AN SCBLK
*      GIVING THE FILETAG AS A STRING ON ENTRY TO SYSIO.
*      (3) ONE OF THE NAMES, .INPUT, .OUTPUT, .TERMINAL
*          FOR ASSOCIATING THE FIRST ARGUMENT NAME TO THE
*          RELEVANT STANDARD FILE IN WHICH CASE SYSIO IS
*          NOT CALLED.
*      THE THIRD ARGUMENT OF THE CALL WILL BE CALLED THE
*      FILEPROPS. IT IS AN OPTIONAL STRING WHICH DETAILS FILE
*      PROPERTIES OR CHARACTERISTICS RELEVANT TO THE HOST
*      OPERATING SYSTEM. IT MAY INCLUDE INFORMATION ON RECORD
*      SIZE, RECORD TYPE, PAPER FEED CONTROL CHARACTERS, ACCESS
*      MODE, CHARACTER SET ETC. SUCH INFORMATION IS VERY HOST
*      DEPENDENT SO THE FORMAT IS NOT PRESCRIBED.
*      SYSIO MUST PARSE THE FILEPROPS ARGUMENT IF THE FEATURE
*      IS SUPPORTED.
*
*      SYSIO SHOULD ATTEMPT TO OPEN THE FILE AS REQUESTED, AND
*      SHOULD MAKE THE NORMAL RETURN IF SUCCESSFUL.
*      THE FLOSI RETURN SHOULD BE TAKEN FOR FILE NOT FOUND ON
*      INPUT() CALL, OR FOR AN OUTPUT() CALL FAILURE ON ACCOUNT
*      OF WRITE PROTECTION VIOLATION OR SIMILAR EVENTS.
*      THIS ALLOWS THE USER TO ATTEMPT RECOVERY.
*      THIS RETURN MAY BE RELEVANT FOR VARIOUS HOST
*      SPECIFIC EVENTS AT THE DISCRETION OF THE IMPLEMENTOR.
*      THE EROSI RETURN SHOULD BE USED TO REPORT THE NATURE OF
*      OTHER ERRORS.
*      IT IS THE TASK OF SYSIO TO FIND AND ADMINISTER ANY
*      BUFFER SPACE, TABLE ENTRIES OR OTHER INFORMATION NEEDED
*      FOR FILE INPUT/OUTPUT. SUCH SPACE MUST BE FOUND OUTSIDE
*      THE AREA ALLOCATED TO SPITBOL FOR STATIC AND DYNAMIC
*      STORE (UNLESS THE IMPLEMENTOR HAS INTIMATE KNOWLEDGE OF
*      THE INNER WORKINGS OF SPITBOL).
*      CORRELATION BETWEEN THE SYSIO CALL WHICH OPENS A FILE AND
*      THE SYS-- CALLS USED TO READ, WRITE AND MANIPULATE IT IS
*      BASED ON A ONE WORD VALUE REFERRED TO AS THE IOTAG.
*      THIS MUST BE PUT IN WA BEFORE MAKING A SUCCESSFUL RETURN
*      FROM SYSIO. ITS FORMAT IS ENTIRELY AT THE DISCRETION OF
*      IMPLEMENTORS WITH THE RESTRICTIONS (A) THAT IT MUST NOT
*      BE POSSIBLE FOR IT TO BE INTERPRETED AS AN ADDRESS IN
*      DYNAMIC MEMORY, SINCE THIS WILL CAUSE GARBAGE COLLECTION
*      ERRORS AND (B) IT MUST BE NON-ZERO.
       EJC
*
*      SYSIO (CONTINUED)
*
*      DEPENDING ON THE HOST, IT MAY OR MAY NOT BE FEASIBLE
*      TO OPEN NEW FILES CONNECTED TO, AND OR CHANGE THE
*      PROPERTIES OF THE STANDARD INPUT AND OUTPUT FILES.
*      IOTAG IS PASSED AS A PARAMETER IN ALL SYS-- CALLS
*      RELATING TO ANY FILE EXCEPT THOSE FOR THE STANDARD
*      INPUT/OUTPUT FILES WHERE ANY REQUIRED IOTAG FIELD IS
*      ALWAYS PASSED AS ZERO. NOTE THAT SPITBOL ASSUMES SYSRD
*      AND SYSPR STANDARD FILES ARE ALREADY OPEN WHEN OSINT
*      FIRST PASSES CONTROL TO IT - NO CALLS OF SYSIO ARE MADE
*      FOR INITIAL OPENING OF THESE FILES.
*      THE FOLLOWING CONVENTIONS ARE ADOPTED.
*      (1)  IN ANY CALL, FILETAG ARG IS ALWAYS PRESENT.
*           IN ANY CALL, FILEPROPS MAY OR MAY NOT BE PRESENT.
*      (2)  IF ANY EARLIER SYSIO CALL HAS BEEN MADE WITH A
*           PARTICULAR FILETAG THEN THE RELEVANT IOTAG IS PASSED
*           IN AS A PARAMETER.
*      (3)  SPITBOL DOES NOT PRECLUDE ATTEMPTS TO OPEN A
*           FILE IDENTIFIED BY A PARTICULAR FILETAG FOR BOTH
*           INPUT AND OUTPUT BY SUCCESSIVE SYSIO CALLS. IT IS
*           FOR SYSIO TO ACCEPT OR REJECT SUCH CALLS, ALL OF
*           WHICH, SUBSEQUENT TO THE FIRST, WILL PASS THE
*           IOTAG AS A PARAMETER.
*      (4)  PARAMETER WB HOLDS VALUES AS FOLLOWS -
*           0  INPUT CALL FOR STANDARD INPUT (SYSRD) FILE
*           1  INPUT CALL FOR ANY OTHER FILE
*           2  OUTPUT CALL FOR STANDARD OUTPUT (SYSPR) FILE
*           3  OUTPUT CALL FOR ANY OTHER FILE.
*
*      (XL)                  FILETAG SCBLK POINTER
*      (XR)                  FILEPROPS SCBLK POINTER OR ZERO
*      (WA)                  IOTAG FROM PRIOR CALL OR ZERO
*      (WB)                  0,1,2,3 FOR ASSOCIATION TYPE
*      (WC)                  POSSIBLY INT VALUE OF FILETAG OR 0
*      JSR  SYSIO            CALL TO ASSOCIATE FILE
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WA)                  IOTAG
*      (XL,XR,WB,WC)         DESTROYED
       EJC
*      THIS INTERFACE MAY BE SUMMARIZED BY THE FOLLOWING TABLE.
*      IT IS ASSUMED THAT THERE IS EXPLICIT OR IMPLICIT
*      NUMBERING OF FILE PARAMETERS APPEARING IN THE COMMAND
*      LINE USED TO INITIATE A SPITBOL RUN. IF WC CONTAINS A
*      NUMERIC ARG, /JCL $WC/ IMPLIES THE MATCHING FILE
*      PARAMETER FROM THE COMMAND LINE.
*
*      ---------------------------------------------------------
*      I               WA == 0 (FIRST CALL)                    I
*      ---------------------------------------------------------
*      I  WC == 0 (ALPHA FILETAG)  I WC /= 0 (NUMERIC FILETAG) I
*      I---------------------------I---------------------------I
*      I  XR == 0    I  XR /= 0    I  XR == 0    I  XR /= 0    I
*      I-------------I-------------I-------------I-------------I
*      I             I             I             I             I
*      I OPEN FILE,  I OPEN FILE   I OPEN FILE   I OPEN FILE   I
*      I RETURN IOTAGI WITH PROPS, I  JCL $WC,   I  JCL $WC    I
*      I             I RETURN IOTAGI RETURN IOTAGI  WITH PROPS,I
*      I             I             I             I RETURN IOTAGI
*      I             I             I             I             I
*      ---------------------------------------------------------
*
*      ---------------------------------------------------------
*      I             WA /= 0 (SUBSEQUENT CALL)                 I
*      ---------------------------------------------------------
*      I  WC == 0 (ALPHA FILETAG)  I WC /= 0 (NUMERIC FILETAG) I
*      I---------------------------I---------------------------I
*      I   XR == 0   I   XR /= 0   I   XR == 0   I   XR /= 0   I
*      I-------------I-------------I-------------I-------------I
*      I             I             I             I             I
*      I CLOSE FILE, I MODIFY FILE I CLOSE FILE  I MODIFY FILE I
*      IRE-OPEN FILE,I  PROPS,     I  JCL $WC,   I  JCL $WC    I
*      IRETURN IOTAG I             IRE-OPEN FILE,I  PROPS,     I
*      I             I             IRETURN IOTAG I             I
*      I             I          (*)I             I             I
*      ---------------------------------------------------------
*
*      INPUT ASSOCIATION FOR WB == 1
*      OUTPUT ASSOCIATION FOR WB == 3
*
*      IF WB == 0 OR WB == 2, THEN THE FILETAG IS .INPUT OR
*      .OUTPUT RESPECTIVELY.
*      OPTION (*) IS THE ONLY VALID OPTION IN GENERAL FOR
*      THESE CASES BUT OTHERS ARE NOT EXCLUDED IF AN
*      IMPLEMENTOR SEES SOME USE FOR THEM.
       EJC
*
*      SYSLD -- LOAD EXTERNAL FUNCTION
*
*      SYSLD  EXP  E,2       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).
*      THE FLOSI RETURN MAY BE TAKEN ON FAILURE TO FIND THE
*      FUNCTION AND THE EROSI RETURN TO REPORT ERRORS.
*
*      (XR)                  POINTER TO FUNCTION NAME (SCBLK)
*      (XL)                  POINTER TO LIBRARY NAME (SCBLK)
*      JSR  SYSLD            CALL TO LOAD FUNCTION
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (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.
*
*      SYSMM -- GET MORE MEMORY
*
*      SYSMM  EXP  E,0       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  E,0       DEFINE EXTERNAL ENTRY POINT
*
*      BECAUSE OF THE METHOD OF GARBAGE COLLECTION, NO SPITBOL
*      OBJECT IS ALLOWED TO OCCUPY MORE BAUS 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  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      SYSOU IS USED TO WRITE A RECORD TO A FILE PREVIOUSLY
*      ASSOCIATED WITH A SYSIO CALL.
*      THE FLOSI RETURN IS TAKEN IF ANY MAXIMUM CAPACITY OF THE
*      FILE IS EXCEEDED.
*      SYSOU SHOULD BE PREPARED TO MAKE REPEATED FLOSI RETURNS
*      BUT IN THE INTERESTS OF EFFICIENCY, IMPLEMENTORS
*      MAY CHOOSE TO LIMIT THE NUMBER OF SUCH RETURNS.
*      SEE SYSIO FOR ACCOUNT OF IOTAG.
*
*      (XR)                  RECORD TO BE WRITTEN (SCBLK)
*      (WA)                  IOTAG FROM INITIAL SYSIO CALL
*      (WC)                  NUMBER OF CHARACTERS TO WRITE
*      JSR  SYSOU            CALL TO OUTPUT RECORD
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WA,WC)               DESTROYED
*
*      SYSPI -- PRINT ON INTERACTIVE TERMINAL
*
*      SYSPI  EXP  E,2       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 TERMINAL.
*      SYSPI IS ALSO USED FOR SENDING OUTPUT TO THE TERMINAL
*      THROUGH THE SPECIAL VARIABLE NAME, TERMINAL.
*      THE LINE LENGTH WILL NOT EXCEED THAT HELD IN XL ON
*      RETURN FROM SYSPP CALL AND MAY BE ZERO IN WHICH CASE A
*      BLANK LINE IS TO BE PRINTED.
*      IT IS POSSIBLE TO DIRECT STANDARD LISTING AND OTHER
*      OUTPUT TO THIS ROUTINE BY SELECTING OPTIONS IN SYSPP.
*
*      (XR)                  PTR TO LINE BUFFER (SCBLK)
*      (WA)                  LINE LENGTH
*      (WC)                  NUMBER OF CHARACTERS TO WRITE
*      JSR  SYSPI            CALL TO PRINT LINE
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WA,WC)               DESTROYED
       EJC
*
*      SYSPP -- OBTAIN PRINT PARAMETERS
*
*      SYSPP -- OBTAIN PRINT PARAMETERS
*
*      SYSPP  EXP  E,0       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 VALUES RETURNED IN XL, WA MAY BE LESS THAN OR EQUAL
*      TO THOSE RETURNED IN INITIAL CALL BUT MAY NOT BE
*      GREATER SINCE BUFFERS HAVE BEEN SET UP IN THE CORE IMAGE.
*      OSINT MUST ENSURE THAT NON-CONFLICTING OPTIONS ARE
*      SELECTED.
*      THE INFORMATION RETURNED IS -
*      1.   LINE LENGTH IN CHARS FOR OUTPUT TO TERMINAL. IF ZERO
*           IS RETURNED IT IS ASSUMED THERE IS NO ONLINE TERML.
*           IF A TERMINAL IS AVAILABLE ERROR MESSAGES WILL BE
*           SENT TO IT AS WELL AS TO THE LISTING FILE.
*      2.   LINE LENGTH IN CHARS FOR STANDARD PRINT FILE.
*           IF ZERO IS RETURNED IT IS ASSUMED THERE IS NO
*           STANDARD PRINT FILE.
*           IN THIS CASE SPITBOL MAY REDUCE LISTING OVERHEADS.
*           IF THIS OPTION IS SELECTED, SPECIFICATION OF OTHER
*           OPTIONS RELATING TO FILE CHARACTERISTICS IS
*           REDUNDANT (UNLESS THE OPTION TO SELECT TERMINAL
*           AS STANDARD OUTPUT FILE IS TAKEN).
*           IT IS NOT ADVISABLE TO RETURN BOTH XL AND WA AS ZERO
*           SINCE ERRORS CANNOT THEN BE REPORTED.
*      3.   NO OF LINES/PAGE. 0 IS PREFERABLE FOR A NON-PAGED
*           DEVICE (E.G. ONLINE TERMINAL) IN WHICH CASE LISTING
*           PAGE THROWS ARE SUPPRESSED.
*      4.   STANDARD INPUT MAY BE READ FROM THE TERMINAL,
*           IN WHICH CASE SYSRI WILL BE CALLED INSTEAD OF SYSRD.
*      5.   STANDARD OUTPUT MAY BE SENT TO TERMINAL, IN WHICH
*           CASE SYSPI WILL BE CALLED INSTEAD OF SYSPR.
*      6.   AN INITIAL -NOLIST OPTION WHICH SUPPRESSES LISTING
*           UNLESS THE PROGRAM CONTAINS AN EXPLICIT -LIST.
*      7.   OPTION TO SUPPRESS LISTING OF COMPILATION STATS.
*      8.   OPTION TO SUPPRESS LISTING OF EXECUTION STATS.
*           THESE OPTIONS ARE USEFUL FOR ESTABLISHED PROGRAMS.
*      9.   OPTION TO SUPPRESS EXECUTION AS THOUGH A
*           -NOEXECUTE CARD WERE SUPPLIED.
       EJC
*
*      SYSPP (CONTINUED)
*
*      10.  BY DEFAULT, IF AN ONLINE TERMINAL IS AVAILABLE,
*           ERROR MESSAGE COPIES ARE SENT TO IT AS WELL AS TO
*           THE REGULAR OUTPUT FILE. THIS OPTION SUPPRESSES THE
*           DEFAULT.
*      11.  OPTION TO SUPPRESS SYSID LISTING HEADER.
*      12.  TWO BITS ARE ALLOCATED TO SELECT LISTING OPTION.
*            /00/ SIGNIFIES COMPACT LISTING SUITABLE FOR TERML.
*           A FEW LINE FEEDS PRECEDE THE PRINTING OF EACH
*           OF -- LISTING, COMPILATION STATISTICS, EXECUTION
*           OUTPUT, EXECUTION STATISTICS, DUMP OUTPUT.
*            /01/ SIGNIFIES  STANDARD LISTING OPTION IN WHICH
*           SOURCE LISTINGS INCLUDE SOME PAGE EJECTS BUT
*           NOT PRECEDING ALL ITEMS LISTED ABOVE.
*            /10/ MEANS AN EXTENDED LISTING WITH FULL SET OF
*           PAGE EJECTS.
*            /11/ IS REDUNDANT AND ACHIEVES SAME EFFECT AS /10/.
*
*      JSR  SYSPP            CALL TO GET PRINT PARAMETERS
*      (XL)              1.  TERMINAL LINE LENGTH
*      (WA)              2.  PRINT LINE LENGTH IN CHARS
*      (WB)              3.  NUMBER OF LINES/PAGE
*      (WC)                  BITS VALUE ...JIHGFEDCBA WHERE
*                        4.  A = 1 STD INPUT FROM TERMINAL
*                        5.  B = 1 STD OUTPUT TO TERMINAL
*                        6.  C = 1 TO SUPPRESS LISTING
*                        7.  D = 1 TO SUPPRESS COMPILN. STATS
*                        8.  E = 1 TO SUPPRESS EXECN. STATS
*                        9.  F = 1 TO SUPPRESS EXECUTION
*                        10. G = 1 TO SUPPRESS ERRORS TO TERML
*                        11. H = 1 TO SUPPRESS SYSID HEADER
*                        12. JI= 00, 01, 10 FOR LISTING OPTIONS
       EJC
*
*      SYSPR -- PRINT LINE ON STANDARD OUTPUT FILE
*
*      SYSPR  EXP  E,2       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
*      (WC)                  NUMBER OF CHARACTERS TO WRITE
*      JSR  SYSPR            CALL TO PRINT LINE
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WA,WC)               DESTROYED
*
*      THE BUFFER POINTED TO IS THE LENGTH OBTAINED FROM THE
*      SYSPP CALL AND IS FILLED OUT WITH TRAILING BLANKS. THE
*      VALUE IN WC IS THE ACTUAL LINE LENGTH WHICH MAY BE LESS
*      THAN THE MAXIMUM LINE LENGTH POSSIBLE.
*      NULL LINES (WC = 0) ARE POSSIBLE IN WHICH CASE A BLANK
*      LINE IS TO BE PRINTED.
*      IT IS POSSIBLE TO OPT FOR HAVING STANDARD OUTPUT DIRECTED
*      TO USE SYSPI INSTEAD OF SYSPR BY MAKING A PARTICULAR
*      REPLY IN SYSPP, IN WHICH CASE THIS ROUTINE IS NOT USED.
*
*      THE FLOSI RETURN IS USED WITH SYSTEMS WHICH LIMIT THE
*      AMOUNT OF PRINTED OUTPUT TO SIGNAL THAT THE LIMIT HAS
*      BEEN REACHED. 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 SUCH CALLS ARE UNACCEPTABLE, SYSPR MUST TAKE
*      APPROPRIATE ACTION (E.G. IGNORE THE CALL, TAKE THE EROSI
*      RETURN, CLOSE THE OUTPUT FILE, TERMINATE EXECUTION WITH
*      A DIAGNOSTIC).
       EJC
*
*      SYSRD -- READ RECORD FROM STANDARD INPUT FILE
*
*      SYSRD  EXP  E,2       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.
*      IT CORRESPONDS TO XXX IN THE MOST RECENT -INXXX CARD
*      (DEFAULT 160).
*      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 BLANKS.
*      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE RETURNS
*      AFTER SUCH AN ADJUSTMENT HAS BEEN MADE.
*      SYSRD SHOULD BE PREPARED TO MAKE REPEATED ENDFILE RETURNS
*      BUT IN THE INTERESTS OF EFFICIENCY, IMPLEMENTORS
*      MAY CHOOSE TO LIMIT THE NUMBER OF SUCH RETURNS.
*      IT IS POSSIBLE TO OPT FOR READING STANDARD INPUT
*      FROM SYSRI INSTEAD OF SYSRD BY MAKING A PARTICULAR
*      REPLY IN SYSPP, IN WHICH CASE THIS ROUTINE IS NOT USED.
*
*      (XR)                  POINTER TO BUFFER (SCBLK PTR)
*      (WC)                  LENGTH OF BUFFER IN CHARACTERS
*      JSR  SYSRD            CALL TO READ LINE
*      PPM  FLOSI            STATEMENT FAILURE RETURN (ENDFILE)
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WC)                  DESTROYED
*
*      SYSRI -- READ RECORD FROM INTERACTIVE TERMINAL
*
*      SYSRI  EXP  E,2       DEFINE EXTERNAL ENTRY POINT
*
*      READS A RECORD FROM AN ONLINE TERMINAL.
*      THE BUFFER PROVIDED IS OF LENGTH EQUAL TO THE VALUE
*      RETURNED IN XL BY SYSPP. SYSRI SHOULD REPLACE THE
*      COUNT IN THE SECOND WORD OF THE SCBLK BY THE ACTUAL
*      CHARACTER COUNT UNLESS THE BUFFER IS RIGHT
*      PADDED WITH BLANKS.
*      IT IS ALSO PERMISSIBLE TO TAKE THE ALTERNATIVE
*      RETURNS AFTER ADJUSTING THE COUNT.
*      THE END OF FILE FLOSI RETURN MAY BE USED IF THIS MAKES
*      SENSE ON THE TARGET MACHINE (E.G. IF THERE IS AN
*      EOF CHARACTER.)
*
*      (XR)                  PTR TO CHAR BUFFER (SCBLK PTR)
*      (WC)                  LENGTH OF BUFFER IN CHARACTERS
*      JSR  SYSRI            CALL TO READ LINE FROM TERMINAL
*      PPM  FLOSI            STATEMENT FAILURE RETURN (ENDFILE)
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (WC)                  DESTROYED
       EJC
*
*      SYSST -- SET FILE POINTER
*
*      SYSST  EXP  E,2       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)                  IOTAG FROM INITIAL SYSIO CALL
*      (WB)                  2ND ARGUMENT
*      (WC)                  3RD ARGUMENT
*      JSR  SYSST            CALL TO SET FILE POINTER
*      PPM  FLOSI            FAIL RETURN
*      PPM  EROSI            ERROR RETURN
*      (WA,WB,WC)            DESTROYED
       EJC
*
*      SYSTM -- GET EXECUTION TIME SO FAR
*
*      SYSTM  EXP  E,0       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.
*      BY DEFINING .CTMD, THE DEFAULT UNITS CAN BE REPLACED BY
*      DECISECONDS.
*      WHERE POSSIBLE, THE VALUE SHOULD RELATE TO PROCESSOR
*      RATHER THAN CLOCK-ON-THE-WALL TIMING VALUES.
*
*      JSR  SYSTM            CALL TO GET TIMER VALUE
*      (IA)                  TIME SO FAR IN MILLISECONDS
*
*      SYSTT -- TRACE TOGGLE
*
*      SYSTT  EXP  E,0       DEFINE EXTERNAL ENTRY POINT
*
*      CALLED BY SPITBOL FUNCTION TRACE() WITH NO ARGS TO
*      TOGGLE A SYSTEM TRACE SWITCH.  THIS PERMITS TRACING OF
*      LABELS IN SPITBOL CODE TO BE TURNED ON OR OFF AND IS
*      INTENDED AS AN AID TO IMPLEMENTORS, NOT REGULAR USERS.
*
*      JSR  SYSTT            CALL TO TOGGLE TRACE SWITCH
*
*      SYSUL -- UNLOAD EXTERNAL FUNCTION
*
*      SYSUL  EXP  E,0       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  E,2       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. NO RETURN FROM
*      SYSXI OCCURS IN THIS CASE. 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 FILES INCLUDING
*      THE STANDARD ONES ARE AVAILABLE 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.
       EJC
*
*      SYSXI (CONTINUED)
*
*      IF THE REQUESTED SYSXI FEATURE IS NOT PROVIDED, THEN
*      THE FLOSI RETURN SHOULD BE TAKEN.
*
*      (XL)                  ZERO OR SCBLK PTR
*      (XR)                  PTR TO V.V SCBLK
*      (IA)                  SIGNED INTEGER ARGUMENT
*      (WA)                  VALUE OF CODE KEYWORD
*      JSR  SYSXI            CALL TO EXIT
*      PPM  FLOSI            STATEMENT FAILURE RETURN
*      PPM  EROSI            (WA,XL) 0/CODE, 0/ERROR - SEE ABOVE
*      (REGISTERS)           SHOULD BE PRESERVED OVER CALL
*
*      LOADING AND RUNNING THE LOAD MODULE OR RETURNING FROM
*      JCL COMMAND LEVEL CAUSES EXECUTION TO RESUME AS THOUGH
*      THE NORMAL RETURN HAD BEEN TAKEN FROM THE CALL.
*      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.
*