*DECK GSTRING 
          IDENT  GSTRING
          TITLE  GSTRING - INSPECT, STRING, AND UNSTRING VERB MODULE
  
          MACHINE  ANY,I
          SST 
          COMMENT  STRING/UNSTRING/INSPECT
          SPACE  4
**        GSTRING -  INSPECT, STRING, AND UNSTRING VERBS
* 
*         CONTAINS: 
*                CGINSPE
*                CGTALLY
*                CGREPL 
*                CGSTRIN
*                CGSTRDE
*                CGSTROP
*                CGUNSTR
*                CGINTO 
*                CGOVERF
*                CGDELIM
  
*      COMDECKS 
  
  
  
  
 CONTROL  OPSYN  NIL
  
  
  
  
*      REGTABLE EQUATES 
  
  
 STREGA   EQU    REGA 
 STREGB   EQU    REGB 
 STREGC   EQU    REGC 
 STREGD   EQU    REGD 
 STREGE   EQU    REGE 
 STREGF   EQU    REGF 
 STREGG   EQU    REGG 
 STREGS   EQU    REGS 
 STREGT   EQU    REGT 
 SUBITM   EQU    REGY 
  
*      VIRTUAL REGISTER EQUATES 
  
 VREGA    EQU    VREG27 
 VREGB    EQU    VREG28 
 VREGC    EQU    VREG29 
 VREGD    EQU    VREG30 
 VREGE    EQU    VREG31 
 VREGF    EQU    VREG32 
 VREGL1   EQU    VREG25 
 VREGA1   EQU    VREG26 
 VREGPTR  EQU    VREGA1 
 VREGX    EQU    VREG4
 VREGW    EQU    VREG18 
  
*      FIXED TABLE EQUATES
  
 DELIM    EQU    T9 
 GPTRSV   EQU    PTRVAL 
 OVFLOLBL EQU    PARMADDR 
 PARMLABL EQU    T10
 SUBSTLEN EQU    T6 
 TPTRVAL  EQU    T5 
  
*      ERROR EQUATES
  
*      MISCELLANEOUS EQUATES
  
 HIFIGVAL EQU    2                     * HIGH VALUE RESULT FROM FIGVALOF
 LOFIGVAL EQU    1                     * LOW VALUES RESULT FROM FIGVALOF
  
          SPACE  4
 GSTRING  MODULE
  
*      LINKAGE FROM CALLING ROUTINES IN OTHER MODULES 
  
 CGINSPE  KNIL   CGINSPE
 CGTALLY  KNIL   CGTALLY
 CGREPLA  KNIL   CGREPLA
  
 CGSTRIN  KNIL   CGSTRIN
 CGSTRDE  KNIL   CGSTRDE
 CGSTROP  KNIL   CGSTROP
  
 CGUNSTR  KNIL   CGUNSTR
 CGINTO   KNIL   CGINTO 
 CGOVERF  KNIL   CGOVERF
 CGDELIM  KNIL   CGDELIM
  
 GLENGTH  KNIL   CGLENG 
 GMODDNAT KNIL   CPYDNAT
  
*      LINKAGE TO CALLED ROUTINES IN OTHER MODULES
  
 REGMOVE  EXECUTE  CGREGMV
          RETURN
 ADVANCE  EXECUTE  CGADV
          RETURN
 NEWDNAT  EXECUTE  CGPDNAT
          RETURN
 SETREG   EXECUTE  CGSETRG
          RETURN
  
 ADNAT    LINK   ADNAT
 CGADD    LINK   CGADD
 CONMULT  LINK   GCONMUL
 CGGOTO   LINK   CGGOTO 
 ENDRUN   LINK   CGENDRN
 MOVER    LINK   GMOVER 
 OVFLGEN  LINK   OVFLGEN
 SETBREG  LINK   CGSETB4
 SETXREG  LINK   CGSETXW
 SUBDNAT  LINK   SUBDNAT
 SUBLOAD  LINK   SUBLOAD
 SUBREF   LINK   SUBREF 
  
*      SYMBOLIC PARAMETER DEFINITIONS 
  
 LABELX   SETSY  (LOCAL$OF,PARMLABL)
 LABELY   SETSY  (LOCAL$OF,PARMADDR)
 SUBSADDR SETSY  (FWA$OF,REGB)
  
  
*CALL SUBTYPE 
          TITLE  GINSPECT - INSPECT VERB PROCESSOR
*      ***** BEWARE ***** BEWARE ***** BEWARE ***** BEWARE *****
*      THERE ARE MANY SCHEDULING PROBLEMS FOR THE GENERATED CODE FROM 
*      THESE PROCESSORS. FOR EXAMPLE, SUBSCRIPTING CODE MUST BE 
*      GENERATED FOR THE STRING DELIMITERS AND OPERANDS WHEN ENCOUNTERED
*      IN THE GTEXT, BUT THE PARAMETERS FOR THE OBJECT ROUTINE CALL FROM
*      THESE OPERANDS MUST OCCUR AFTER THE ROUTINE CALL,  WHICH ITSELF
*      MUST BE GENERATED AFTER ALL THE OPERANDS ARE ENCOUNTERED.
*      THEREFORE BE VERY CAREFUL IN MODIFYING THIS CODE, AND BE SURE TO 
*      CHECK OUT THE MODIFIED VERB PROCESSOR THOROUGHLY.
  
  
  
  
  
************************************************************************
************************************************************************
************************************************************************
* 
*      I N S P E C T    P R O C E S S O R 
* 
*      INCLUDING PROCESSORS (WITH SAMPLE GTEXT) 
* 
*         CGINSPE 
* 
*           STREGA  VERB (GINSPECM) 
*           STREGB  DATAREF                       : INSPECTED ITEM
*           STREGC  SUBVERB (COUNT)               : TALLY PACKET COUNT
*           STREGD  SUBVERB (COUNT)               : REPLACE PACKET COUNT
* 
*         CGTALLY 
* 
*           STREGA  VERB (GTALLY) 
*           STREGB  DATAREF                       : TALLY COUNT 
*           STREGC  SUBVERB (CHARS/ALL/LEADING)   : SEARCH SPECIFICATION
*           STREGD  DATAREF/LITREF/SUBVERB (NULL) : ITEM TO SEARCH FOR
*           STREGE  SUBVERB (NULL/BEFORE/AFTER)   : SEARCH BOUNDARIES 
*           STREGF  DATAREF/LITREF/SUBVERB (NULL) : BOUNDARY ITEM 
* 
*         THE GTALLY PACKETS ARE REPEATED THE NUMBER OF TIMES IN THE
*         TALLY COUNT IN THE GINSPECM PACKET. 
* 
*         CGREPLA 
* 
*           STREGA  VERB (GREPLACE) 
*           STREGB  SUBVERB (CHARS/ALL/LEAD/FIRST): SEARCH SPECIFICATION
*           STREGC  DATAREF/LITREF/SUBVERB (NULL) : ITEM TO SEARCH FOR
*           STREGD  DATAREF/LITREF                : ITEM TO REPLACE BY
*           STREGE  SUBVERB (NULL/BEFORE/AFTER)   : SEARCH BOUNDARIES 
*           STREGF  DATAREF/LITREF/SUBVERB (NULL) : BOUNDARY ITEM 
* 
*         THE GREPLACE PACKETS ARE REPEATED THE NUMBER OF TIMES IN THE
*         REPLACE COUNT IN THE GINSPECM PACKET. 
* 
*         GTALLY AND GREPLACE PACKETS ARE MUTUALLY EXCLUSIVE FOR A
*         GIVEN GINSPECM PACKET 
  
          EJECT 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGINSPE  EGO    1
          NOTE   CGINSPE
  
*      SAVE POINTER TO THIS INSPECT VERB FOR SUBROUTINE CALL AFTER
*      LAST GTALLY OR GREPLACE PACKET.
  
          MOVEZ  VERBPTR,STRINGSV      * POINT TO VERB
  
*      SAVE GTALLY OR GREPLACE VERB COUNT SO C.INSPT OR C.INSPR CALL
*      CAN BE GENERATED AFTER PROCESSING LAST VERB. 
*      ONLY ONE OF STREGC AND STREGD IS NON-ZERO--SET OPCOUNT TO IT.
  
          ADDZ   (GPTROF,STREGC),(GPTROF,STREGD),OPCOUNT
          MOVEZ  OPCOUNT,INSPCNT
  
*      CHECK TO MAKE CERTAIN THERE IS ENOUGH SPACE IN THE BEFORE/AFTER
*      USE BLOCK FOR THE PACKETS IN THIS INSPECT. 
  
          SUBZ   OPCOUNT,BEFORCNT,T1
          IFZ    (T1,LE,0),CGINSPE1    * BRANCH IF THERE IS ENOUGH SPAC 
  
*      IF THERE IS NO ALLOCATED SPACE, SET UP THE LABEL AT THE START OF 
*      THE BLOCK. 
  
          IFTHEN (BEFORCNT,EQ,0)
            GEN   USE$,((USETB$OF,USEBEFOR)) * BEFORE/AFTER USE BLOCK 
            MOVEZ  (LOCLAB,BEFORADD),BEFORADD 
            GEN   LABEL$,((LOCAL$OF,BEFORADD)) * BEFORE BSS 0 
            GEN   USE$,((USETB$OF,USECODE))    * USE CODE 
          ENDIFZ
  
          MOVEZ  OPCOUNT,BEFORCNT      * SET NEW BEFORE/AFTER LENGTH
          GEN    USE$,((USETB$OF,USEBEFOR)) * BEFORE/AFTER USE BLOCK
          GEN    BSS$,,T1 
          GEN    USE$,((USETB$OF,USECODE))       * USE CODE 
  
 CGINSPE1 LABEL 
  
          SPACE  4
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          MOVEZ  0,PARMADDR 
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT; DELIMITER, DELIMITER IN, COUNT IN, AND RESULT
*      FIELD IN THE UNSTRING STATEMENT; OR SEARCH IDENTIFIER IN THE 
*      INSPECT STATEMENT. 
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          MOVEZ  0,OPNDCNT
  
*      NUMEROP CONTAINS THE POINTER TO THE MOST RECENT TALLY ITEM 
  
          MOVEZ  0,NUMEROP
  
*      GENERATE PARAMETER SEQUENCE START COMMAND FOR SEQUENCE POOLING 
  
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    PLIST
          GEN    USE$,((USETB$OF,USECODE))
          IFZ    ((GPTROF,STREGD),NE,0),RETURN   REPLACING
          IFZ    ((GPTROF,STREGC),EQ,1),RETURN   SINGLE TALLY ITEM
          MOVEZ  (GSCODEOF,STREGB),T1 
          IFTHEN  ((RFLCPTYP,T1),EQ,SCALCR) 
            GEN   HOLDR,(RFLCPVAL,T1) 
          ENDIFZ
          IFTHEN  ((RFLENTYP,T1),EQ,SCALCR) 
            GEN    HOLDR,(RFLENVAL,T1)
          ENDIFZ
          MOVEZ  (SUBNUMOF,T1),T2 
          IFTHEN  ((SUBTYPOF,T2),EQ,SCALCR) 
            GEN    HOLDR,(SUBLOCOF,T2)
          ENDIFZ
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      WHEN THE LAST GTALLY OR GREPLACE PACKET HAS BEEN PROCESSED,
*      GENERATE THE C.INSPT OR C.INSPR OBJECT ROUTINE CALL
* 
*      GENERATED CODE FOR C.INSPTL TALLY SUBROUTINE BEFORE OBJECT 
*      ROUTINE CALL.
*      REGISTER X2 IS USED FOR ILLUSTRATION ONLY. 
* 
*         EQ     EXIT 
* ENTRY   BSS    0
*         SX2    1
*         ADD    X2+TALLY->TALLY
*         EQ     C.INSPTE 
* EXIT    BSS    0
* 
*      GENERATED CODE FOR OBJECT ROUTINE CALL 
*      (PARAMETERS SHOWN AFTER THE  RJ C.INSPT  ARE GENERATED ELSEWHERE)
* 
*       [ MOVE   LENGTH->X2          ] * IF VARIABLE-LENGTH SOURCE
*       [ MULTIPLY  X2*OCCNUMBER->X2 ] * IF VARIABLE-LENGTH SOURCE
*       [ SB7    X2+ROOTLENGTH       ] * IF VARIABLE-LENGTH SOURCE
* 
*       [ SB7    LENGTH              ] * IF FIXED-LENGTH SOURCE 
* 
*       [ SA1    SUBTEMP             ] * IF SUBSCRIPTED 
*       [ AX1    30                  ] * IF SUBSCRIPTED 
*       [ SB4    X1+BCP              ] * IF SUBSCRIPTED 
* 
*       [ SB4    BCP                 ] * IF NOT SUBSCRIPTED 
* 
*         SB3    SOURCE ADDR
*         SB5    PARAMLIST
*         SB6    LASTPARAM
*         RJ     C.INSPT  OR  C.INSPR 
* 
*       [ ADD    X2+TALLY1->TALLY1   ] * IF INSPECT TALLYING
* 
*         SB6    LASTPARAM             * UPDATED VALUE
*       [ RJ     C.INSPM             ] * IF MORE THAN ONE TALLY ITEM
*       [ ADD    X2+TALLY2->TALLY2   ]
* 
*         USE    PARAMETER
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES
*      NOTE THAT 60B IS ALSO THE STRING/UNSTRING IDENTIFIER DELIM PARAM 
*         00B = CHARS SEARCH SPECIFICATION (+ ITEM TO REPACE BY)
*         01B =     CHARS SEARCH SPEC (+ SIGNED LEFT NUMERIC REPL. ITEM)
*         02B =     CHARS SEARCH SPEC (+ SIGNED RIGHT NUMERIC REPL ITEM)
*         10B = ALL SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         11B =     ALL SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITEM) 
*         12B =     ALL SEARCH SPEC (+ SIGNED RIGHT NUMERIC SEARCH ITEM)
*         20B = LEADING SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         21B =     LEADING SEARCH SPEC (+ SIGNED LEFT NUMERIC ITEM)
*         22B =     LEADING SEARCH SPEC (+ SIGNED RIGHT NUMERIC ITEM) 
*         30B = FIRST SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         31B =     FIRST SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITM)
*         32B =     FIRST SEARCH SPEC (+ SIGNED RIGHT NUMERIC SRCH ITEM)
*         40B = ITEM TO REPLACE BY (+ OPERAND TO REPLACE BY)
*         41B =     ITEM TO REPLACE BY (+ SIGNED LEFT NUMERIC REPL ITEM)
*         42B =     ITEM TO REPLACE BY (+ SIGNED RIGHT NUMERIC REPL ITM)
*         50B = TALLYING SUBROUTINE ADDRESS (IF LONG INSPECT TALLYING)
*         51B = TALLY/REPLACE PARAMETER GROUP COUNT 
*         60B = BEFORE SEARCH BOUNDARY (+ BOUNDARY ITEM)
*         61B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND)
*         62B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BND)
*         70B = AFTER SEARCH BOUNDARY (+ BOUNDARY ITEM) 
*         71B =     AFTER SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND) 
*         72B =     AFTER SEARCH BOUNDARY (+ SIGNED RIGHT NUMERIC BOUND)
* 
*      TALLY PARAMETER GROUP IS CONSTRUCTED AS FOLLOWS
*      (THIS GROUP IS REPEATED FOR EACH ITEM TO BE SEARCHED FOR)
* 
*         SEARCH SPECIFICATION
*        [BOUNDARY     ]               * IF BEFORE/AFTER
* 
*      REPLACE PARAMETER GROUP IS CONSTRUCTED AS FOLLOWS
*      (THIS GROUP IS REPEATED FOR EACH ITEM TO BE SEARCHED FOR)
* 
*         SEARCH SPECIFICATION
*        [BOUNDARY     ]               * IF BEFORE/AFTER
*        [REPLACE ITEM ]               * IF NOT CHAR SPECIFICATION
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
          RETURN
  
  
          TITLE  GTALLYNG - INSPECT TALLYING VERB PROCESSOR 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGTALLY  EGO    1
          NOTE   CGTALLY
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      GENERATED CODE FOR INSPECT TALLYING
* 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION. 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY. 
* 
*         MOVE   LENGTH->X1            * GEN BY MOVER 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH 
*         SA2    PARAM
*         MX0    18 
*         LX0    54 
*         BX2    -X0*X2 
*         LX1    36 
*         BX7    X1+X2
*         SA7    PARAM
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION
*      AND A SUBSCRIPT. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE PARAMETER 
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES
*      NOTE THAT 60B IS ALSO THE STRING/UNSTRING IDENTIFIER DELIM PARAM 
*         00B = CHARS SEARCH SPECIFICATION
*         10B = ALL SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         11B =     ALL SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITEM) 
*         12B =     ALL SEARCH SPEC (+ SIGNED RIGHT NUMERIC SEARCH ITEM)
*         20B = LEADING SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         21B =     LEADING SEARCH SPEC (+ SIGNED LEFT NUMERIC ITEM)
*         22B =     LEADING SEARCH SPEC (+ SIGNED RIGHT NUMERIC ITEM) 
*         30B = FIRST SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         31B =     FIRST SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITM)
*         32B =     FIRST SEARCH SPEC (+ SIGNED RIGHT NUMERIC SRCH ITEM)
*         60B = BEFORE SEARCH BOUNDARY (+ BOUNDARY ITEM)
*         61B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND)
*         62B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BND)
*         70B = AFTER SEARCH BOUNDARY (+ BOUNDARY ITEM) 
*         71B =     AFTER SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND) 
*         72B =     AFTER SEARCH BOUNDARY (+ SIGNED RIGHT NUMERIC BOUND)
* 
*      TALLY PARAMETER GROUP IS CONSTRUCTED AS FOLLOWS
*      (THIS GROUP IS REPEATED FOR EACH ITEM TO BE SEARCHED FOR)
* 
*         SEARCH SPECIFICATION
*        [BOUNDARY     ]               * IF BEFORE/AFTER
* 
*      NOTE THAT OBJECT TIME ROUTINE C.INSPTL FOR LONG INSPECT TALLYING 
*      OPERATIONS KEEPS A TALLY COUNT ACCUMULATOR, AND SAVES THE TYPE 
*      50B TALLY SUBROUTINE ADDRESS EACH TIME A TYPE 50B PARAMETER
*      IS ENCOUNTERED IN THE PARAMETER STRING SCAN. WHEN A MATCH
*      BETWEEN THE SCAN ITEM AND INSPECT ITEM IS MADE, THE CURRENT
*      TALLY SUBROUTINE IS CALLED (IF ANY), AND THE SCAN THEN RESUMES 
*      AT THE BEGINNING OF THE PARAMETER LIST. THE TALLY SUBROUTINE 
*      RETURNS TO ENTRY POINT C.INSPTE IN OBJECT ROUTINE C.INSPTL.
*      IF THERE IS ONLY ONE SCAN ITEM, NO TYPE 50B PARAMETER IS 
*      GENERATED. ON EXIT, X2 CONTAINS ZERO, OR THE TALLY COUNT,
*      DEPENDING ON WHETHER TYPE 50B PARAMETERS WERE GENERATED OR NOT.
* 
*      NOTE THAT WHEN A LONG INSPECT CALL TO ROUTINE C.INSPTL OR
*      C.INSPRL IS GENERATED, THE LAST PARAMETER IS ALWAYS A TYPE 51B 
*     POINTER TO THE BEFORE/AFTER BOUNDARY AREA, WHICH HAS ONE WORD 
*      PER TALLYING OR REPLACING GTEXT PACKET FOR THE INSPECT STATEMENT.
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      PASS SPECIFICATION TO PARAMETER GENERATION SUBROUTINE
  
          IFTHEN  ((GSCODEOF,STREGC),EQ,GCHARS) 
            MOVEZ  00B,P1              * CHARS SEARCH SPECIFICATION 
  
*      SET UP SUBVERB REGT FOR REGB TO POINT TO 
  
            MOVEZ  (EQUALS,GSUBVERB),(GCODEOF,REGT4)
            MOVEZ  (EQUALS,REGT4),STREGB
  
*      GENERATE PARAMETER WITH TYPE OF CHARACTERS 
  
            CALLZ  PARAMGEN 
          ELSEZ 
  
            IFZ  ((GSCODEOF,STREGC),NE,GALL),CGTALLY1 
              MOVEZ  10B,P1            * ALL SEARCH SPECIFICATION 
              BRANCH  CGTALLY2
 CGTALLY1   LABEL 
              MOVEZ  20B,P1            * LEADING SEARCH SPECIFICATION 
 CGTALLY2   LABEL 
  
*      GENERATE PARAMETER WITH TYPE OF ALL OR LEADING AND SEARCH ITEM 
*      AS DATA ITEM 
  
            MOVEZ  STREGD,STREGB
            CALLZ  SETNUMER 
            CALLZ  PARAMGEN 
          ENDIFZ
  
*      GENERATE SEARCH BOUNDARY PARAMETER, IF ANY 
  
          IFTHEN  ((GSCODEOF,STREGE),NE,GNULL)
            MOVEZ  STREGF,STREGB
            IFZ  ((GSCODEOF,STREGE),NE,GBEFORE),CGTALLY3
              MOVEZ  60B,P1            * BEFORE SEARCH BOUNDARY 
              BRANCH  CGTALLY4
 CGTALLY3   LABEL 
              MOVEZ  70B,P1            * AFTER SEARCH BOUNDARY
 CGTALLY4   LABEL 
  
              CALLZ  SETNUMER 
              CALLZ  PARAMGEN 
          ENDIFZ
  
          SPACE  4
*      IF THIS IS THE LAST INSPECT TALLYING PACKET, GENERATE THE
*      OBJECT ROUTINE CALL
  
          MOVEZ  (EQUALS,REG2),STREGB 
          SUBZ   OPCOUNT,1,OPCOUNT
          IFTHEN (OPCOUNT,NE,0) 
            ANDIF  ((REGPTROF,STREGB),EQ,(ABSVALOF,NUMEROP))
              RETURN
          ENDIFZ
  
*      THIS IS NOT THE LAST INSPECT TALLYING PACKET.
*      IF THIS TALLY ITEM IS DIFFERENT FROM THE LAST ONE, AND NOT THE 
*      FIRST ONE, GENERATE THE TALLY PARAMETER AND SUBROUTINE TO ADD
*      1 TO THE CURRENT TALLY ITEM. ON THE FIRST TALLY ITEM, SET THE
*      NUMEROP FLAG TO MINUS THE TALLY ITEM DNAT NUMBER.
  
          IFTHEN ((GCODEOF,STREGD),NE,GSUBVERB) 
            ANDIF  ((BYTLENOF,STREGD),GT,10)
              MOVEZ  1,T1 
          ELSEZ 
              MOVEZ  0,T1 
          ENDIFZ
          IFTHEN ((GCODEOF,STREGF),NE,GSUBVERB) 
            ANDIF  ((BYTLENOF,STREGF),GT,10)
              MOVEZ  1,T2 
          ELSEZ 
              MOVEZ  0,T2 
          ENDIFZ
          ORZ    T1,T2,T1 
          IFTHEN (OPCOUNT,EQ,0) 
            ANDIF  (T1,EQ,0)
            ANDIF  (NUMEROP,EQ,0) 
              BRANCH CGTALLY5 
          ENDIFZ
  
          IFZ    (NUMEROP,EQ,(REGPTROF,STREGB)),CGTALLY6
          MOVEZ  (REGPTROF,STREGB),NUMEROP
  
*      GENERATE THE TALLY PARAMETER.
  
          MOVEZ  50B,P1                * P1 = PARAMETER TYPE = 50B
          MOVEZ  (LOCLAB,P2),P2        * P2 = LABEL NUMBER OF SUBR
  
*      GENERATE  VFD  6/51B,36/0,18/ENTRY 
  
          CALLZ  PARAMADD 
  
*      GENERATE THE TALLY SUBROUTINE. 
  
          MOVEZ  (LOCLAB,PARMLABL),PARMLABL 
          GEN    EQ$,,,((LOCAL$OF,PARMLABL))     *       EQ  EXIT 
          GEN    LABEL$,((LOCAL$OF,P2))          * ENTRY BSS 0
  
          GEN    SXBPK,(VREGOF,VREGE),,1         *       SX2 1
  
*      SET UP COMP1 REGISTER WITH 1 TO ADD TO TALLY ITEM. 
  
          MOVEZ  (EQUALS,REGT4),REGT
          CALLZ  ADNAT
          MOVEZ  COMP1,(TYPEOF,REGT)
          MOVEZ  5,(NUMLENOF,REGT)
          MOVEZ  0,(POINTOF,REGT) 
          MOVEZ  REGT,REGB
          MOVEZ  VREGE,(TREGOF,REGT)
  
*      SET UP TALLY DNAT FROM NUMEROP IN REGC AND REGD
  
          MOVEZ  0,P1 
          MOVEZ  REGC,P2
          CALLZ  REGMOVE
          MOVEZ  (EQUALS,GDATAREF),(GCODEOF,REGC) 
          MOVEZ  (ABSVALOF,NUMEROP),(GPTROF,REGC) 
          MOVEZ  REGC,REGD
  
*      SET UP ADD VERB IN REGA
  
          MOVEZ  (EQUALS,GVERB),(GCODEOF,STREGA)
          MOVEZ  (EQUALS,GADD),(GSCODEOF,STREGA)
  
*      CALL ADD PROCESSOR 
          PUSH   PARMLABL 
  
          CALLZ  CGADD                 * ADD X2+TALLY->TALLY
          CALLZ  SUBDNAT
          MOVEZ  (EQUALS,REG3),REGC 
          POP    PARMLABL 
  
          GEN    EQ$,,((EXT$OF,C.INSTE))
          GEN    LABEL$,((LOCAL$OF,PARMLABL))    * EXIT  BSS 0
  
          IFZ    (OPCOUNT,NE,0),RETURN
          BRANCH CGTALLY6 
  
 CGTALLY5 LABEL 
  
          SPACE  4
  
*      ONLY ONE TALLY PACKET, AND ALL DATA ITEMS ARE 10 CHARS OR LESS.
*      FAST INSPECT TALLY SUBROUTINE CAN BE USED. 
*      GENERATE THE SUBROUTINE CALL FOR C.INSPT.
  
          CALLZ  INSPOBJ               * GENERATE PARAMETERS FOR SUBR.
          GENOBJ  N=C.INSPF,I=(VREGA,VREGA1,VREGB,VREGC,VREGL1),O=((VREG
,OF,VREGE)) 
          BRANCH  CGTALLY7
  
*      MORE  THAN ONE TALLY PACKET, OR AT LEAST ONE LONG DATA ITEM. 
*      SLOW INSPECT TALLY SUBROUTINE MUST BE USED.
*      GENERATE THE BEFORE/AFTER PARAMETER FOR C.INSPTL.
  
 CGTALLY6 LABEL 
          MOVEZ  51B,P1                * P1 = BEFORE/AFTER PARAM TYPE 
          MOVEZ  BEFORADD,P2           * P2 = LOCAL LABEL FOR BEFORE
          CALLZ  PARAMADD 
  
*      GENERATE THE OBJECT ROUTINE CALL 
          GEN    SXBPK,(VREGOF,VREGE),,INSPCNT
  
          CALLZ  INSPOBJ               * GENERATE PARAMETERS FOR SUBR.
          MOVEZ  (GSCODEOF,STREGB),T1 
          IFTHEN  ((RFLCPTYP,T1),EQ,SCALCR) 
            GEN    RFREE,(RFLCPVAL,T1)
          ENDIFZ
          IFTHEN ((RFLENTYP,T1),EQ,SCALCR)
           GEN   RFREE,(RFLENVAL,T1)
          ENDIFZ
          MOVEZ  (SUBNUMOF,T1),T2 
          IFTHEN ((SUBTYPOF,T2),EQ,SCALCR)
            GEN    RFREE,(SUBLOCOF,T2)
          ENDIFZ
          GENOBJ N=C.INSPS,I=(VREGE,VREGA,VREGA1,VREGB,VREGC,VREGL1)
          BRANCH CGTALLY8 
  
*      IF THERE IS ONLY ONE SCAN ITEM, THE ADD OF REGISTER X2, WHICH
*      CONTAINS THE COUNT OF TALLY MATCHES IN THE INSPECT ITEM, TO THE
*      TALLY ITEM IS DONE VIA ADD CODE GENERATED HERE.
  
 CGTALLY7 LABEL 
  
          PUSH   STRNGPTR,VERBPTR 
          MOVEZ  VERBPTR,STRNGPTR 
          CALLZ  ADVANCE
          POP    STRNGPTR,VERBPTR 
          MOVEZ  REGB,REGC
          MOVEZ  REGB,REGD
  
*      SET UP COMP1 REGISTER WITH TALLY VALUE FROM OBJECT ROUTINE 
  
          MOVEZ  (EQUALS,REGT4),REGT
          CALLZ  ADNAT
          MOVEZ  COMP1,(TYPEOF,REGT)
          MOVEZ  5,(NUMLENOF,REGT)
          MOVEZ  0,(POINTOF,REGT) 
          MOVEZ  REGT,REGB
          MOVEZ  VREGE,(TREGOF,REGT)
  
*      SET UP TALLY DNAT FROM NUMEROP IN REGC AND REGD
  
  
*      SET UP ADD VERB IN REGA
  
          MOVEZ  (EQUALS,GVERB),(GCODEOF,STREGA)
          MOVEZ  (EQUALS,GADD),(GSCODEOF,STREGA)
  
*      CALL ADD PROCESSOR 
  
          CALLZ  CGADD                 * ADD X2+TALLY->TALLY
          CALLZ  SUBDNAT
          MOVEZ  (EQUALS,REG3),REGC 
  
*      GENERATE PARAMETER SEQUENCE END COMMAND FOR SEQUENCE POOLING 
  
 CGTALLY8 LABEL 
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    ENDPL
          GEN    USE$,((USETB$OF,USECODE))
          RETURN
  
  
          TITLE  GREPLACE - INSPECT REPLACING VERB PROCESSOR
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGREPLA  EGO    1
          NOTE   CGREPLA
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      GENERATED CODE FOR INSPECT REPLACING 
* 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION. 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY. 
* 
*         MOVE   LENGTH->X1            * GEN BY MOVER 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH 
*         SA2    PARAM
*         MX0    18 
*         LX0    54 
*         BX2    -X0*X2 
*         LX1    36 
*         BX7    X1+X2
*         SA7    PARAM
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION
*      AND A SUBSCRIPT. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE PARAMETER 
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES
*      NOTE THAT 60B IS ALSO THE STRING/UNSTRING IDENTIFIER DELIM PARAM 
*         00B = CHARS SEARCH SPECIFICATION (+ ITEM TO REPACE BY)
*         01B =     CHARS SEARCH SPEC (+ SIGNED LEFT NUMERIC REPL. ITEM)
*         02B =     CHARS SEARCH SPEC (+ SIGNED RIGHT NUMERIC REPL ITEM)
*         10B = ALL SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         11B =     ALL SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITEM) 
*         12B =     ALL SEARCH SPEC (+ SIGNED RIGHT NUMERIC SEARCH ITEM)
*         20B = LEADING SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         21B =     LEADING SEARCH SPEC (+ SIGNED LEFT NUMERIC ITEM)
*         22B =     LEADING SEARCH SPEC (+ SIGNED RIGHT NUMERIC ITEM) 
*         30B = FIRST SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         31B =     FIRST SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITM)
*         32B =     FIRST SEARCH SPEC (+ SIGNED RIGHT NUMERIC SRCH ITEM)
*         40B = ITEM TO REPLACE BY (+ OPERAND TO REPLACE BY)
*         41B =     ITEM TO REPLACE BY (+ SIGNED LEFT NUMERIC REPL ITEM)
*         42B =     ITEM TO REPLACE BY (+ SIGNED RIGHT NUMERIC REPL ITM)
*         60B = BEFORE SEARCH BOUNDARY (+ BOUNDARY ITEM)
*         61B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND)
*         62B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BND)
*         70B = AFTER SEARCH BOUNDARY (+ BOUNDARY ITEM) 
*         71B =     AFTER SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND) 
*         72B =     AFTER SEARCH BOUNDARY (+ SIGNED RIGHT NUMERIC BOUND)
* 
*      REPLACE PARAMETER GROUP IS CONSTRUCTED AS FOLLOWS
*      (THIS GROUP IS REPEATED FOR EACH ITEM TO BE SEARCHED FOR)
* 
*         SEARCH SPECIFICATION
*        [BOUNDARY     ]               * IF BEFORE/AFTER
*        [REPLACE ITEM ]               * IF NOT CHAR SPECIFICATION
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      PASS SPECIFICATION TO PARAMETER GENERATION SUBROUTINE
  
          IFTHEN  ((GSCODEOF,STREGB),EQ,GCHARS) 
            MOVEZ  00B,P1              * CHARS SEARCH SPECIFICATION 
  
*      GENERATE PARAMETER WITH TYPE OF CHARACTERS AND REPLACE ITEM AS 
*      DATA ITEM
  
            MOVEZ  STREGD,STREGB
            CALLZ  SETNUMER 
            CALLZ  PARAMGEN 
          ELSEZ 
  
            IFZ  ((GSCODEOF,STREGB),NE,GALL),CGREPL1
            MOVEZ  10B,P1              * ALL SEARCH SPECIFICATION 
              BRANCH  CGREPL3 
 CGREPL1    LABEL 
            IFZ  ((GSCODEOF,STREGB),NE,GLEADING),CGREPL2
            MOVEZ  20B,P1              * LEADING SEARCH SPECIFICATION 
              BRANCH  CGREPL3 
 CGREPL2    LABEL 
            MOVEZ  30B,P1              * FIRST SEARCH SPECIFICATION 
 CGREPL3    LABEL 
  
*      GENERATE PARAMETER WTTH TYPE OF ALL, LEADING, OR FIRST AND SEARCH
*      ITEM AS THE DATA ITEM
  
            MOVEZ  STREGC,STREGB
            CALLZ  SETNUMER 
            CALLZ  PARAMGEN 
  
          ENDIFZ
  
*      GENERATE SEARCH BOUNDARY PARAMETER, IF ANY 
  
          IFTHEN  ((GSCODEOF,STREGE),NE,GNULL)
            IFZ  ((GSCODEOF,STREGE),NE,GBEFORE),CGREPL4 
            MOVEZ  60B,P1              * BEFORE SEARCH BOUNDARY 
              BRANCH  CGREPL5 
 CGREPL4    LABEL 
              MOVEZ  70B,P1            * AFTER SEARCH BOUNDARY
 CGREPL5    LABEL 
  
            MOVEZ  STREGF,STREGB
            CALLZ  SETNUMER 
            CALLZ  PARAMGEN 
          ENDIFZ
  
*      GENERATE REPLACE ITEM PARAMETER
          MOVEZ  (EQUALS,REG2),STREGB 
          IFTHEN ((GSCODEOF,STREGB),NE,GCHARS)
            MOVEZ  STREGD,STREGB
            MOVEZ  40B,P1 
            CALLZ  SETNUMER 
            CALLZ  PARAMGEN 
          ENDIFZ
  
*      IF THIS IS THE LAST INSPECT REPLACING PACKET, GENERATE THE 
*      C.INSPR OR C.INSPRL OBJECT ROUTINE CALL. 
          SUBZ   OPCOUNT,1,OPCOUNT
          IFZ    (OPCOUNT,NE,0),RETURN
  
*      IS THERE ONLY ONE REPLACE PACKET, WITH ALL DATA ITEMS 10 CHARS 
*      OR LESS. 
  
          IFTHEN ((GCODEOF,STREGC),NE,GSUBVERB) 
            ANDIF  ((BYTLENOF,STREGC),GT,10)
              MOVEZ  1,T1 
          ELSEZ 
              MOVEZ  0,T1 
          ENDIFZ
          IFTHEN ((GCODEOF,STREGF),NE,GSUBVERB) 
            ANDIF  ((BYTLENOF,STREGF),GT,10)
              MOVEZ  1,T2 
          ELSEZ 
              MOVEZ  0,T2 
          ENDIFZ
          ORZ    T1,T2,T1 
          IFZ    (T1,NE,0),CGREPL6
  
          IFZ    (INSPCNT,NE,1),CGREPL6 
  
*      ONLY ONE REPLACE PACKET, AND ALL DATA ITEMS ARE 10 CHARS OR LESS.
*      FAST INSPECT REPLACING SUBROUTINE CAN BE USED. 
*      GENERATE THE SUBROUTINE CALL FOR C.INSPR.
  
          CALLZ  INSPOBJ               * GENERATE PARAMETERS FOR SUBR.
          GENOBJ N=C.INSRF,I=(VREGA,VREGA1,VREGB,VREGC,VREGL1)
          BRANCH  CGREPL7 
  
*      MORE THAN ONE REPLACE PACKET, OR AT LEAST ONE LONG DATA ITEM.
*      SLOW INSPECT REPLACING SUBROUTINE MUST BE USED.
*      GENERATE THE BEFORE/AFTER PARAMETER FOR C.INSPRL.
  
 CGREPL6  LABEL 
          MOVEZ  51B,P1                * P1 = BEFORE/AFTER PARAMETER TYP
          MOVEZ  BEFORADD,P2           * P2 = LOCAL LABEL FOR BEFORE
          CALLZ  PARAMADD 
          GEN    SXBPK,(VREGOF,VREGE),,INSPCNT
  
*      GENERATE THE OBJECT ROUTINE CALL 
  
          CALLZ  INSPOBJ               * GENERATE PARAMETERS FOR ROUTINE
          GENOBJ N=C.INSRS,I=(VREGE,VREGA,VREGA1,VREGB,VREGC,VREGL1)
  
 CGREPL7  LABEL 
* 
*     IF INCLUDED SIGN, MOVE INSPECT ITEM BACK
* 
          IFZ    ((TYPEOF,STREGB),NE,COMP),CGREPL8         NON-NUMERIC
          IFZ    ((SIGNOF,STREGB),EQ,0),CGREPL8            UNSIGNED 
          IFZ    ((SCHAROF,STREGB),NE,0),CGREPL8           SIGN SEPARATE       -
          MOVEZ  (EQUALS,REGT4),REGT
          CALLZ  ADNAT
          IFTHEN ((NUMLENOF,STREGB),GE,10)
            GEN    SLRBPK,(VREGOF,VREGA),,((EXT$OF,C.BUFF)) 
            GEN    SLRAPB,(VREGOF,VREGB),VREGA,VREGB1 
            GEN    SLRAPB,(VREGOF,VREGC),VREGB,VREGB1 
            GEN    LXOR,(VREGOF,VREGA),VREGA,VREGC
            GEN    LXOR,(VREGOF,VREGB),VREGB,VREGC
          ELSEZ 
            GEN    SLRBPK,(VREGOF,VREGA),,((EXT$OF,C.BUFF)) 
            GEN    SLRAPB,(VREGOF,VREGC),VREGA,VREGB1 
            GEN    LXOR,(VREGOF,VREGA),VREGA,VREGC
          ENDIFZ
          MOVEZ  VREGA,(TREGOF,REGT)
          MOVEZ  (NUMLENOF,STREGB),(NUMLENOF,REGT)
          MOVEZ  COMP,(TYPEOF,REGT) 
          MOVEZ  1,(SIGNOF,REGT)
          MOVEZ  (POINTOF,STREGB),(POINTOF,REGT)
          MOVEZ  STREGB,REGC
          MOVEZ  REGT,REGB
          CALLZ  MOVER
 CGREPL8  LABEL 
  
*      GENERATE PARAMETER SEQUENCE END COMMAND FOR SEQUENCE POOLING 
  
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    ENDPL
          GEN    USE$,((USETB$OF,USECODE))
          RETURN
  
  
          TITLE  GSTRING -  STRING VERB PROCESSOR 
************************************************************************
************************************************************************
************************************************************************
* 
*      S T R I N G    P R O C E S S O R 
* 
*      INCLUDING PROCESSORS (WITH SAMPLE GTEXT) 
*      (CGLABEL IS IN GBRANCH MODULE) 
* 
*         CGSTRIN 
* 
*           STREGA  VERB (GSTRING)
*           STREGB  DATAREF                       : RECEIVING ITEM
*           STREGC  DATAREF/SUBVERB (NULL)        : POINTER ITEM
*           STREGD  SUBVERB (COUNT)               #GSTROP COUNT 
*           STREGE  LABELREF/SUBVERB (NULL)       #OVERFLOW LABEL 
* 
*         CGSTRDE 
* 
*           STREGA  VERB (GSTRDEL)
*           STREGB  DATAREF/LITREF/SUBVERB (SIZE) : DELIMITER ITEM
* 
*         CGSTROP 
* 
*           STREGA  VERB (GSTROP) 
*           STREGB  DATAREF/LITREF                : SOURCE ITEM 
* 
*         THE GSTRDEL AND GSTROP VERBS ARE REPEATED IN THE ORDER IN 
*         WHICH THEY APPEAR IN THE SOURCE 
* 
* 
*         (IF OVERFLOW) 
* 
*         CGSTOVR 
* 
*           STREGA  VERB (GSTOVRFL) 
*           STREGB  LABELREF                      : NEXT SENTENCE 
* 
*         CGLABEL 
*           STREGA  VERB (GLABEL)                 : OVERFLOW LABEL
* 
*                   (OVERFLOW VERBS)
* 
*         CGLABEL 
*           STREGA  VERB (GLABEL)                 : NEXT SENTENCE 
* 
* 
*         (IF NO OVERFLOW)
* 
*         CGLABEL 
*           STREGA  VERB (GLABEL)                 : OVERFLOW LABEL
          EJECT 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGSTRIN  EGO    1
  
*      SAVE POINTER TO THIS STRING VERB FOR SUBROUTINE CALL AFTER 
*      LAST SOURCE OPERAND
  
          ADDZ   VERBPTR,1,STRINGSV    * POINT TO FIRST ATOM AFTER VERB 
          MOVEZ  1,PTRVAL              * INIT DEFAULT POINTER FOR OPTIM 
  
*      SAVE CGSTROP VERB COUNT SO C.STRNG CALL CAN BE GENERATED AFTER 
*      PROCESSING LAST CGSTROP OPERAND
  
          MOVEZ  (GPTROF,STREGD),OPCOUNT
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          MOVEZ  0,PARMADDR 
          MOVEZ  0,SKIPFLAG  NORMAL MODE
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT; DELIMITER, DELIMITER IN, COUNT IN, AND RESULT
*      FIELD IN THE UNSTRING STATEMENT; OR SEARCH IDENTIFIER IN THE 
*      INSPECT STATEMENT. 
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          MOVEZ  0,OPNDCNT
  
  
*      USE OPTIMIZATION WITH IN-LINE MOVES IF STRING IS DELIMITED BY
*      SIZE AND THERE IS NO POINTER.
  
          MOVEZ  0,FIRSTOP
          IFZ    ((GCODEOF,STREGC),NE,GSUBVERB),CGSTR1
            MOVEZ  1,FIRSTOP
 CGSTR1   LABEL 
          IFTHEN  ((GSCODEOF,STREGB),NE,0)
            MOVEZ  0,FIRSTOP
          ENDIFZ
          IFTHEN ((GSCODEOF,STREGD),NE,0)   REFERENCE MODIFICATION
            MOVEZ    0,FIRSTOP
          ENDIFZ
  
*      GENERATE PARAMETER SEQUENCE START COMMAND FOR SEQUENCE POOLING 
  
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    PLIST
          GEN    USE$,((USETB$OF,USECODE))
  
          RETURN
  
  
          TITLE  GSTDELIM - STRING DELIMITED VERB PROCESSOR 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGSTRDE  EGO    1
          NOTE   CGSTRDE
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      GENERATED CODE FOR STRING DELIMITER -
* 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION. 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY. 
* 
*         MOVE   LENGTH->X1            * GEN BY MOVER 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH 
*         SA2    PARAM
*         MX0    18 
*         LX0    54 
*         BX2    -X0*X2 
*         LX1    36 
*         BX7    X1+X2
*         SA7    PARAM
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION
*      AND A SUBSCRIPT. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE    PARAMETER
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES -
*      NOTE THAT IDENTIFIER DELIMITERS HAVE TYPES OF 40B AND ABOVE, 
*      OTHER OPERANDS ARE 37B AND BELOW, SO OBJECT ROUTINES CAN USE 
*      PL AND NG INSTRUCTIONS TO CHECK FOR DELIMITERS TO SEARCH FOR.
*         20B = SIZE DELIMITER
*         60B = IDENTIFIER DELIMITER (ALSO INSPECT BEFORE DELIMITER)
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      CANCEL OPTIMIZATION IF STRING IS NOT DELIMITED BY SIZE 
  
          IFTHEN ((GCODEOF,STREGB),NE,GSUBVERB) 
            MOVEZ  0,FIRSTOP
          ENDIFZ
  
*      IGNORE FURTHER DELIMITER PROCESSING IF OPTIMIZATION IS POSSIBLE
  
          IFZ    FIRSTOP,RETURN 
  
*      PASS DELIMITER TYPE TO PARAMETER GENERATION SUBROUTINE 
  
          IFTHEN  ((GCODEOF,STREGB),EQ,GSUBVERB)
            MOVEZ  20B,P1              * SIZE DELIMITER TYPE
          ELSEZ 
            MOVEZ  60B,P1              * IDENTIFIER DELIMITER TYPE
          ENDIFZ
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE DELIMITER. 
  
          CALLZ  PARAMGEN 
  
          RETURN
  
  
          TITLE  GSTOPER - STRING OPERATOR VERB PROCESSOR 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGSTROP  EGO    1
          NOTE   CGSTROP
          IFZ    (SKIPFLAG,NE,0),RETURN  SOURCE EXHAUSTED 
  
*      FETCH SAVED GSTRING OPERANDS, PUT INTO REGD TO REGF. 
*      THE GSTRING CODE IS GENERATED HERE BECAUSE OF CODE SCHEDULING
*      PROBLEMS.
  
          SUBZ   OPCOUNT,1,OPCOUNT
          MOVEZ  (EQUALS,REG4),BEGINREG 
          MOVEZ  STRNGPTR,T1           * SAVE CURRENT VERB STRING POSIT.
          MOVEZ  STRINGSV,STRNGPTR
          CALLZ  SETREG 
          MOVEZ  T1,STRNGPTR
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      CHECK FOR STRING OPTIMIZATION CODE.
*      IF THE STRING STATEMENT FIRST DELIMITER IS SIZE, 
*      AND THERE IS NO POINTER CLAUSE,
*      THE BOOKKEEPING CAN BE DONE AT COMPILE TIME, AND THE MOVE
*      PROCESSOR USED (UP TO THE FIRST NON-SIZE DELIMITERS).
*      THE DELIMITER CLAUSE FALLS INTO THE CRACKS WHEN THIS CODE IS 
*      GENERATED. 
*      THE MOVE SOURCE IS THE GSTROP OPERAND, AND THE DESTINATION IS
*      A PART OF THE GSTRING RESULT FIELD, WITH A REWORKED DNAT.
*      OVERFLOW CHECKING IS ALSO DONE.
* 
*      THE GENERATED CODE CONSISTS OF A SERIES OF PSEUDO-MOVE STATEMENTS
*      OF THE FORM
*          MOVE  OP1-L1,REC-L1
*          MOVE  OP2-L2,REC-L2
*           ... 
*      WHERE L1, L2 ARE THE LENGTH OF EACH CGSTROP OPERAND
*      AND THE POINTER IS INCREMENTED BY THIS LENGTH FOR EACH MOVE
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
          NOTZ   (FIRSTOP,EQ,1),STROP3
  
*      SET UP RECEIVING FIELD SUBSTRING LENGTH. 
*      INCREMENT POINTER BY THIS LENGTH, BUT SAVE OLD VALUE.
  
          MOVEZ  (BYTLENOF,STREGB),SUBSTLEN 
          MOVEZ  PTRVAL,TPTRVAL                  * SAVE POINTER.
          ADDZ   SUBSTLEN,PTRVAL,PTRVAL          * INCREMENT PTR BY LEN.
          SUBZ   TPTRVAL,1,TPTRVAL
          SUBZ   PTRVAL,1,T1
          IFTHEN (T1,GT,(BYTLENOF,STREGD))       IF OVERFLOW, MOVE
            SUBZ  (BYTLENOF,STREGD),TPTRVAL,SUBSTLEN * ONLY TO END OF 
          ENDIFZ                                 * RECEIVING FIELD. 
  
*      SET UP RECEIVING FIELD SUBSTRING DNAT. 
*      USE ORIGINAL DNAT, AND MODIFY WORD OFFSET, CHAR POSITION, LENGTH,
*      AND TYPE. PUT MODIFIED DNAT IN REGC. 
  
          MOVEZ  STREGC,STREGT         * COPY THE RESULT DNAT TO MODIFY 
          MOVEZ  STREGD,STREGS
          CALLZ  GMODDNAT 
  
          ADDZ   (BCPOF,REGT),TPTRVAL,T2 * OLDOFF + (BCP + PTR - 1)/10
          QUOTZ  T2,10,T3              *T3 = (BCP+PTR-1)/10 
          ADDZ   (WRDOFFOF,REGT),T3,(WRDOFFOF,REGT) 
  
          MULTZ  T3,10,T4              * SET UP NEW CHAR POSITION = 
          SUBZ   T2,T4,(BCPOF,REGT)    * (BCP + PTR - 1) MOD 10 
  
          MOVEZ  SUBSTLEN,(BYTLENOF,REGT) * SET UP NEW LENGTH 
  
          MOVEZ  STREGB,STREGS         * COPY THE SOURCE DNAT TO MODIFY 
          MOVEZ  (EQUALS,REGT4),STREGT
          CALLZ  GMODDNAT 
          MOVEZ  STREGT,STREGB
  
          MOVEZ  ALPHNUM,(TYPEOF,STREGC) * SET OPERAND TYPES TO ALPHANUM
          MOVEZ  ALPHNUM,(TYPEOF,STREGB)
          MOVEZ  WSSECTN,(LEVELOF,STREGB) 
          MOVEZ  WSSECTN,(LEVELOF,STREGC) 
          MOVEZ  0,(SYNCHOF,STREGC) 
  
*      GENERATE MOVE - GSTROP OPERAND TO GSTRING RESULT SUBSTRING 
  
          NOTE   STROP0 
          CALLZ  MOVER
          NOTE   STROP1 
  
*      SKIP TO OVERFLOW VERB PACKET IF OVERFLOW OCCURRED
*      (PTRVAL GT RESULT LENGTH + 1)
  
          ADDZ   (BYTLENOF,STREGD),1,T1 
          NOTZ   (PTRVAL,GT,T1),STROP5
  
          MOVEZ  2,SKIPFLAG  OVERFLOW 
          RETURN
  
*      SKIP TO SEPARATOR IF END OF STATEMENT AND NO OVERFLOW
*      NEXT VERB TO BE PROCESSED IS SEPARATOR VERB
  
 STROP5   LABEL 
          IFZ    (OPCOUNT,NE,0),RETURN
  
          MOVEZ  1,SKIPFLAG  SOURCE EXHAUSTED 
          RETURN
  
          EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      OPTIMIZATION IS NOT POSSIBLE.
*      GENERATE STRING OPERATOR CODE. 
*      IF THIS IS THE LAST OPERATOR, GENERATE THE GSTRING OBJECT
*      ROUTINE CALL.
* 
*      GENERATED CODE FOR STRING OPERATOR - 
* 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION. 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY. 
* 
*         MOVE   LENGTH->X1            * GEN BY MOVER 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH 
*         SA2    PARAM
*         MX0    18 
*         LX0    54 
*         BX2    -X0*X2 
*         LX1    36 
*         BX7    X1+X2
*         SA7    PARAM
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION
*      AND A SUBSCRIPT. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE    PARAMETER
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES -
*         00B = OPERAND 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 STROP3   LABEL 
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      PASS DELIMITER TYPE TO PARAMETER GENERATION SUBROUTINE 
  
          MOVEZ  00B,P1                * OPERAND TYPE 
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE OPERAND. 
  
          CALLZ  PARAMGEN 
  
          EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      IF THIS IS THE LAST OPERATOR, GENERATE THE GSTRING OBJECT
*      ROUTINE CALL.
* 
*      GENERATED CODE FOR GSTRING OBJECT ROUTINE CALL TO ROUTINE C.STRNG
*      (PARAMETERS SHOWN AFTER THE RJ C.STRNG ARE GENERATED ELSEWHERE). 
* 
*       [ SA1    SUBTEMP             ] * IF SUBSCRIPTED 
*       [ AX1    30                  ] * IF SUBSCRIPTED 
*       [ SB4    X1+BCP              ] * IF SUBSCRIPTED 
* 
*       [ SB4    BCP                 ] * IF NOT SUBSCRIPTED 
* 
*       [ SX1    1 (USUALLY)         ] * IF NO POINTER SPECIFIED
* 
*       [ MOVE   POINTER->X1         ] * IF POINTER SPECIFIED 
* 
*         SX3    RESULTLENGTH 
* 
*         SB3    RESULT ADDR
*         SB5    PARAMLIST
*         SB6    LASTPARAM
*         SB7    OVERFLOWADDR (PRELIMINARY CHECK ONLY)
*         RJ     C.STRNG
*           RETURNS POINTER IN X1 AND SAVES RESULT LENGTH IN B7 
* 
*         USE    PARAMETER
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
*           REPEATED FOR EACH DELIMITER AND SOURCE OPERAND
* 
*       [ MOVE   X1->POINTER         ] * IF POINTER SPECIFIED 
* 
*       [ SB3    X1                  ] * IF OVERFLOW
*       [ GE     B7,B3,NEXTSENT      ] * IF OVERFLOW
* 
*      TYPE HAS THE FOLLOWING VALUES -
*      NOTE THAT IDENTIFIER DELIMITERS HAVE TYPES OF 40B AND ABOVE, 
*      OTHER OPERANDS ARE 37B AND BELOW, SO OBJECT ROUTINES CAN USE 
*      PL AND NG INSTRUCTIONS TO CHECK FOR DELIMITERS TO SEARCH FOR.
*         00B = OPERAND 
*         20B = SIZE DELIMITER
*         60B = IDENTIFIER DELIMITER (ALSO INSPECT BEFORE DELIMITER)
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      CHECK CGSTROP VERB COUNT FOR LAST ONE IN THIS STATEMENT
  
          IFZ    (OPCOUNT,NE,0),RETURN
          MOVEZ  STREGD,SUBITM
  
*      GENERATE THIS CODE IF RESULT IS SUBSCRIPTED
  
          IFTHEN ((GCODEOF,STREGD),EQ,GDATAREF) 
          ANDIF  (GSCODEOF,STREGD)
            MOVEZ  (GSCODEOF,STREGD),SENDSUBS 
            NOTE  STROP41 
            MOVEZ  SENDSUBS,P1
            CALLZ  SUBLOAD
            MOVEZ  P1,VREGA 
            GEN  SHR,VREGA,30                                 * AX1 30
            GEN  SBXPK,(VREGOF,VREGA1),VREGA,(BCPOF,STREGD)   * SB4 X1+B
          ELSEZ 
  
*      GENERATE THIS CODE IF RESULT IS NOT SUBSCRIPTED
  
            MOVEZ  (BCPOF,STREGD),P1
            CALLZ  SETBREG                                    * SB4 BCP 
            MOVEZ  VREGX,VREGA1 
          ENDIFZ
  
*      GENERATE THIS CODE IF NO POINTER IS SPECIFIED
  
          IFTHEN  ((GCODEOF,STREGE),EQ,GSUBVERB)
            MOVEZ  PTRVAL,P1
            CALLZ  SETXREG                                    * SX1 1 
            MOVEZ  VREGW,VREGD
          ELSEZ 
  
*      GENERATE THIS CODE IF A POINTER IS SPECIFIED 
  
            MOVEZ  STREGE,REGB         * SET UP POINTER ITEM IN REGB
  
            MOVEZ  (EQUALS,REGT4),REGT * SET UP COMP1 REGISTER IN REGC
            CALLZ  ADNAT
            MOVEZ  COMP1,(TYPEOF,REGT)
            MOVEZ  (NUMLENOF,REGB),(NUMLENOF,REGT)
            MOVEZ  0,(POINTOF,REGT) 
            MOVEZ  REGT,REGC
  
            CALLZ  MOVER               * GENERATE MOVE POINTER TO X1
            MOVEZ  (TREGOF,REGC),VREGD
          ENDIFZ
  
*      FINISH C.STRNG CALL GENERATED CODE 
  
          MOVEZ  (BYTLENOF,STREGD),P1 
          CALLZ  SETXREG                                     * SX3 LENGT
          MOVEZ  VREGW,VREGL1 
          NOTE   STROP42
          GEN    SBBPK,(VREGOF,VREGA),,((FWA$OF,STREGD))     * SB3 RESLT
  
*      FIXED ITEM PARMADDR IS SET TO 0 IN THE STRING, UNSTRING, AND 
*      INSPECT PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          GEN    SBBPK,(VREGOF,VREGB),,((LOCAL$OF,PARMADDR)) * SB5 PARAM
  
*      FIXED ITEM OPNDCNT IS SET TO 0 IN THE STRING, UNSTRING, AND
*      INSPECT PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT; DELIMITER, DELIMITER IN, COUNT IN, AND RESULT
*      FIELD IN THE UNSTRING STATEMENT; OR SEARCH IDENTIFIER IN THE 
*      INSPECT STATEMENT. 
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          SUBZ   OPNDCNT,1,T1 
          GEN    SBBPK,(VREGOF,VREGC),,((LOCAL$OF,PARMADDR),T1) 
                                                             * SB6 PARND
          NOTE   STROP43
  
          GENOBJ N=C.STRIN,I=(VREGA,VREGA1,VREGB,VREGC,VREGD,VREGL1),O=(
,(VREGOF,VREGL1),(VREGOF,VREGD))
  
*      GENERATE THIS CODE IF A POINTER IS SPECIFIED 
*      THE COMP1 REG X1 TO BE SET UP IN REGB IS MOSTLY ALREADY SET UP 
*      FROM THE POINTER-TO-REGISTER MOVE BEFORE THE OBJECT ROUTINE CALL.
*      ONLY A SMALL AMOUNT OF RESTORATION NEED BE DONE HERE.
  
          IFTHEN  ((GCODEOF,STREGE),NE,GSUBVERB)
            MOVEZ  (EQUALS,REGT4),REGB * SET UP COMP1 REG X1 IN REGB
            MOVEZ  VREGD,(TREGOF,REGB)
  
            MOVEZ  STREGE,REGC         * SET UP POINTER ITEM IN REGC
  
            CALLZ  MOVER               * GENERATE MOVE X1 TO POINTER
            CALLZ  SUBDNAT
          ENDIFZ
  
*      GENERATE PARAMETER SEQUENCE END COMMAND FOR SEQUENCE POOLING 
  
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    ENDPL
          GEN    USE$,((USETB$OF,USECODE))
  
          RETURN
  
  
          TITLE  GUNSTRIN - UNSTRING VERB PROCESSOR 
************************************************************************
************************************************************************
************************************************************************
* 
*      U N S T R I N G    P R O C E S S O R 
* 
*      INCLUDING PROCESSORS (WITH SAMPLE GTEXT) 
*      (CGLABEL IS IN GBRANCH MODULE) 
* 
*         CGUNSTR 
* 
*           STREGA  VERB (GUNSTRNG) 
*           STREGB  DATAREF                       : SOURCE ITEM 
*           STREGC  DATAREF/SUBVERB (NULL)        : POINTER ITEM
*           STREGD  DATAREF/SUBVERB (NULL)        * TALLYING ITEM 
*           STREGE  SUBVERB (COUNT)               : GINTO COUNT 
*           STREGF  LABELREF/SUBVERB (NULL)       : OVERFLOW LABEL
* 
*         (IF DELIMITERS) 
* 
*         CGLABEL 
*           STREGA  VERB (GLABEL)                 : START OF DELIMITERS 
* 
*         CGDELIM 
* 
*           STREGA  VERB (GDELIMBY) 
*           STREGB  SUBVERB (NULL)/SUBVERB (ALL)  : ALL 
*           STREGC  DATAREF/LITREF                : DELIMITER 
* 
*         CGINTO
* 
*           STREGA  VERB (GINTO)
*           STREGB  DATAREF                       : RECEIVING ITEM
*           STREGC  DATAREF/SUBVERB (NULL)        : DELIMITER IN ITEM 
*           STREGD  DATAREF/SUBVERB (NULL)        : COUNT IN ITEM 
*           STREGE  LABELREF/SUBVERB (NULL)       : START OF DELIMITERS 
* 
*         THE GDELIMBY AND GINTO VERBS ARE REPEATED IN THE ORDER IN 
*         WHICH THEY APPEAR IN THE SOURCE 
* 
* 
*         (IF OVERFLOW) 
* 
*         CGOVERF 
* 
*           STREGA  VERB
*           STREGB  LABELREF                      : NEXT SENTENCE 
* 
*         CGLABEL 
*           STREGA  VERB (GLABEL)                 : OVERFLOW LABEL
* 
*                   (OVERFLOW VERBS)
* 
*         CGLABEL 
*          STREGA  VERB (GLABEL)                  : NEXT SENTENCE 
* 
* 
*         (IF NO OVERFLOW)
* 
*         CGLABEL 
*           STREGA  VERB (GLABEL)                 : OVERFLOW LABEL
          EJECT 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGUNSTR  EGO    1
          NOTE   CGUNSTR
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      GENERATED CODE FOR POINTER AND TALLYING PARAMETERS 
* 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION. 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY. 
* 
*         MOVE   LENGTH->X1            * GEN BY MOVER 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH 
*         SA2    PARAM
*         MX0    18 
*         LX0    54 
*         BX2    -X0*X2 
*         LX1    36 
*         BX7    X1+X2
*         SA7    PARAM
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION
*      AND A SUBSCRIPT. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE    PARAMETER
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES -
*         30B = POINTER PARAMETER (FIRST UNSTRING PARAMETER, IF PRESENT)
*         31B = TALLYING PARAMETER (FOLLOWS POINTER PARAM, IF PRESENT)
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      SAVE POINTER TO THIS UNSTRING VERB FOR SUBROUTINE CALL AFTER 
*      LAST SOURCE OPERAND
  
          MOVEZ  VERBPTR,STRINGSV      * POINT TO VERB ATOM 
          MOVEZ  1,PTRVAL              * INIT DEFAULT POINTER FOR OPTIM 
  
*      SAVE GINTO VERB COUNT SO C.UNSTR CALL CAN GE GENERATED AFTER 
*      PROCESSING LAST GINTO OPERAND
  
          MOVEZ  (GPTROF,STREGE),OPCOUNT
          MOVEZ  0,SKIPFLAG  NORMAL MODE
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          MOVEZ  0,PARMADDR 
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT; DELIMITER, DELIMITER IN, COUNT IN, AND RESULT
*      FIELD IN THE UNSTRING STATEMENT; OR SEARCH IDENTIFIER IN THE 
*      INSPECT STATEMENT. 
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          MOVEZ  0,OPNDCNT
  
  
*      USE OPTIMIZATION WITH IN-LINE MOVES IF UNSTRING IS DELIMITED BY
*      SIZE AND THERE IS NO POINTER.
  
          MOVEZ  0,FIRSTOP
          IFZ    ((GCODEOF,STREGC),NE,GSUBVERB),CGUNSTR1
            MOVEZ  1,FIRSTOP
 CGUNSTR1 LABEL 
          MOVEZ  1,FSTUNST   FAST UNSTRING INITIALLY POSSIBLE 
  
          IFTHEN  ((GSCODEOF,STREGB),NE,0)       SUBSCRIPTED
            MOVEZ  0,FIRSTOP
          ENDIFZ
          IFTHEN ((TYPEOF,STREGB),EQ,VARGROUP)
            MOVEZ  0,FIRSTOP
          ENDIFZ
          IFTHEN ((GSCODEOF,STREGE),NE,0)   REFERENCE MODIFICATION
            MOVEZ  0,FIRSTOP
            MOVEZ  0,FSTUNST
          ENDIFZ
*      GENERATE PARAMETER SEQUENCE START COMMAND FOR SEQUENCE POOLING 
  
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    PLIST
          GEN    USE$,((USETB$OF,USECODE))
  
*      GENERATE POINTER PARAMETER, IF ANY 
  
          IFTHEN  ((GCODEOF,STREGC),EQ,GDATAREF)
            MOVEZ  STREGC,STREGB
            CALLZ  TYPEGEN
            ADDZ   P1,30B,P1
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE POINTER. 
  
            CALLZ  PARAMGEN 
          ENDIFZ
  
*      GENERATE TALLYING PARAMETER, IF ANY. 
  
          IFTHEN  ((GCODEOF,STREGD),EQ,GDATAREF)
            MOVEZ  STREGD,STREGB
            CALLZ  TYPEGEN
            ADDZ   P1,40B,P1
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE TALLYING ITEM. 
  
            CALLZ  PARAMGEN 
          ENDIFZ
  
          RETURN
  
  
          TITLE  GDELIMBY - UNSTRING DELIMITED BY VERB PROCESSOR
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGDELIM  EGO    1
          NOTE   CGDELIM
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      GENERATED CODE FOR UNSTRING DELIMITER -
* 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION. 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY. 
* 
*         MOVE   LENGTH->X1            * GEN BY MOVER 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH 
*         SA2    PARAM
*         MX0    18 
*         LX0    54 
*         BX2    -X0*X2 
*         LX1    36 
*         BX7    X1+X2
*         SA7    PARAM
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION
*      AND A SUBSCRIPT. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE    PARAMETER
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES -
*      NOTE THAT IDENTIFIER DELIMITERS HAVE TYPES OF 40B AND ABOVE, 
*      OTHER OPERANDS ARE 37B AND BELOW, SO OBJECT ROUTINES CAN USE 
*      PL AND NG INSTRUCTIONS TO CHECK FOR DELIMITERS TO SEARCH FOR.
*         60B = IDENTIFIER DELIMITER (ALSO INSPECT BEFORE DELIMITER)
*         61B = ALL IDENTIFIER DELIMITER
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
          MOVEZ  0,FIRSTOP
          IFTHEN  ((BYTLENOF,STREGC),NE,1)  SIZE NOT 1
          ANDIF  ((GCODEOF,STREGC)),EQ,GDATAREF)
            MOVEZ  0,FSTUNST
          ENDIFZ
          IFTHEN ((BYTLENOF,STREGC),NE,1)  SIZE NOT 1 
          ANDIF  ((GCODEOF,STREGC),EQ,GLITREF) LITERAL
          ANDIF  ((FIGVALOF,STREGC),EQ,0)   NOT FIGCON
            MOVEZ  0,FSTUNST
          ENDIFZ
  
*      PASS DELIMITER TYPE TO PARAMETER GENERATION SUBROUTINE 
  
          IFTHEN  ((GSCODEOF,STREGB),NE,GALL) 
            MOVEZ  60B,P1              * IDENTIFIER DELIMITER TYPE
          ELSEZ 
            MOVEZ  61B,P1              * ALL IDENTIFIER DELIMITER TYPE
          MOVEZ  0,FSTUNST
          ENDIFZ
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE DELIMITER. 
  
          MOVEZ  STREGC,STREGB
          CALLZ  PARAMGEN 
  
          RETURN
          TITLE  GINTO - UNSTRING INTO VERB PROCESSOR 
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGINTO   EGO    1
          NOTE   CGINTO 
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      CHECK FOR UNSTRING OPTIMIZATION CODE.
*      IF THE UNSTRING STATEMENT FIRST DELIMITER IS SIZE, 
*      AND THERE IS NO POINTER CLAUSE,
*      THE BOOKKEEPING CAN BE DONE AT COMPILE TIME, AND THE MOVE
*      PROCESSOR USED (UP TO THE FIRST NON-SIZE DELIMITERS).
*      THE DELIMITER CLAUSE FALLS INTO THE CRACKS WHEN THIS CODE IS 
*      GENERATED. 
*      THE MOVE SOURCE IS A PART OF THE GUNSTRNG OPERAND, WITH A
*      REWORKED DNAT, AND THE DESTINATION IS THE GINTO RESULT FIELD.
*      OVERFLOW CHECKING IS ALSO DONE.
* 
*      THE GENERATED CODE CONSISTS OF A SERIES OF PSEUDO-MOVE STATEMENTS
*      OF THE FORM
*          MOVE  OP1-L1,REC-L1
*          MOVE  OP2-L2,REC-L2
*           ... 
*      WHERE L1, L2 ARE THE LENGTH OF EACH GINTO OPERAND
*      AND THE POINTER IS INCREMENTED BY THIS LENGTH FOR EACH MOVE
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
          IFZ    (SKIPFLAG,NE,0),RETURN   SOURCE FIELD EXHAUSTED
          NOTZ   (FIRSTOP,EQ,1),INTO3 
  
*      SAVE GINTO RESULT OPERAND IN REGT4 
  
          MOVEZ  STREGB,P1
          MOVEZ  (EQUALS,REGT4),P2
          CALLZ  REGMOVE
  
*      GET GUNSTRNG OPERANDS AS THOUGH THEY WERE A SOURCE VERB
  
          MOVEZ  STRNGPTR,T1           * SAVE CURRENT VERB STRING POSITN
          MOVEZ  VERBPTR,T2 
          MOVEZ  STRINGSV,STRNGPTR     * SET VERB STRING TO GUNSTRNG VRB
          CALLZ  ADVANCE
          MOVEZ  T1,STRNGPTR           * RESTORE CURRENT VERB STRING POS
          MOVEZ  T2,VERBPTR 
  
*      SET UP SOURCE FIELD SUBSTRING LENGTH.
*      INCREMENT POINTER BY THIS LENGTH, BUT SAVE OLD VALUE.
  
          MOVEZ  (BYTLENOF,REGT4),SUBSTLEN
          IFTHEN ((TYPEOF,REGT4),EQ,COMP) 
          ANDIF  ((SCHAROF,REGT4),NE,0) 
            SUBZ   SUBSTLEN,1,SUBSTLEN
          ENDIFZ
          MOVEZ  PTRVAL,TPTRVAL                  * SAVE POINTER.
          ADDZ   SUBSTLEN,PTRVAL,PTRVAL          * INCREMENT PTR BY LEN.
          SUBZ   TPTRVAL,1,TPTRVAL
          SUBZ   PTRVAL,1,T1
          IFTHEN (T1,GT,(BYTLENOF,STREGB))       IF OVERFLOW, MOVE
            SUBZ  (BYTLENOF,STREGB),TPTRVAL,SUBSTLEN * ONLY SOURCE
          ENDIFZ                                 * CHARS LEFT 
  
*      SET UP SOURCE FIELD SUBSTRING DNAT.
*      USE ORIGINAL DNAT, AND MODIFY WORD OFFSET, CHAR POSITION, LENGTH,
*      AND TYPE. PUT MODIFIED DNAT IN REGC. 
  
          MOVEZ  STREGB,STREGS         * MOVE RECEIVING DNAT TO REGC
          MOVEZ  STREGC,STREGT
          CALLZ  GMODDNAT 
  
          ADDZ   (BCPOF,REGT),TPTRVAL,T2 * OLDOFF + (BCP + PTR - 1)/10
          QUOTZ  T2,10,T3              *T3 = (BCP+PTR-1)/10 
          ADDZ   (WRDOFFOF,REGT),T3,(WRDOFFOF,REGT) 
  
          MULTZ  T3,10,T4              * SET UP NEW CHAR POSITION = 
          SUBZ   T2,T4,(BCPOF,REGT)    * (BCP + PTR - 1) MOD 10 
  
          MOVEZ  SUBSTLEN,(BYTLENOF,REGT) * SET UP NEW LENGTH 
  
          MOVEZ  ALPHNUM,(TYPEOF,REGT) * SET OPERAND TYPES TO ALPHANUMER
  
  
*      SET UP MOVE CALL OPERANDS
  
          PUSH   STREGB 
          MOVEZ  STREGC,REGB           * MODIFIED RESULT DNAT AS SOURCE 
          MOVEZ  (EQUALS,REGT4),REGC   * SAVED INTO OPERAND AS MOVE DEST
  
*      GENERATE MOVE - GUNSTR SOURCE SUBSTRING TO GINTO RESULT OPERAND. 
  
          CALLZ  MOVER
          NOTE   INTO41 
  
*      SKIP TO SEPARATOR IF OUT OF SOURCE DATA
  
          POP    STREGB 
          SUBZ   OPCOUNT,1,OPCOUNT
          SUBZ   PTRVAL,1,T1
          IFZ    (T1,LT,(BYTLENOF,STREGB)),INTO5
  
*      INCREMENT TALLY ITEM IF ANY
  
          CALLZ  TALLYHO                         * SX1 TALLYINCREMENT 
                                                 * ADD X1+TALLY->TALLY
  
          MOVEZ  1,SKIPFLAG  SOURCE EXHAUSTED 
          RETURN
  
*      SKIP TO OVERFLOW LABEL IF OVERFLOW OCCURRED
  
 INTO5    LABEL 
          IFZ    (OPCOUNT,GT,0),RETURN
  
*      INCREMENT TALLY ITEM IF ANY
          CALLZ  TALLYHO                         * SX1 TALLYINCREMENT 
                                                 * ADD X1+TALLY->TALLY
          MOVEZ  2,SKIPFLAG  OVERFLOW 
          RETURN
  
          EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      OPTIMIZATION IS NOT POSSIBLE.
*      GENERATE UNSTRING OPERATOR CODE. 
*      IF THIS IS THE LAST OPERATOR, GENERATE THE UNSTRING OBJECT 
*      ROUTINE CALL.
* 
*      GENERATED CODE FOR UNSTRING OPERATOR - 
* 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
* 
*         SA1    SUBTEMP
*         AX1    30 
*         SX1    X1+BCP 
*         SA2    PARAM
*         MX0    42 
*         BX2    X0*X2
*         BX7    X2+X1
*         SA7    PARAM
* 
*      THIS CODE IS ALWAYS GENERATED. 
* 
*         USE    PARAMETER
*[PARAM   EQU    *     ]               * IF SUBSCRIPTED 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
* 
*      TYPE HAS THE FOLLOWING VALUES -
*      NOTE THAT IDENTIFIER DELIMITERS HAVE TYPES OF 40B AND ABOVE, 
*      OTHER OPERANDS ARE 37B AND BELOW, SO OBJECT ROUTINES CAN USE 
*      PL AND NG INSTRUCTIONS TO CHECK FOR DELIMITERS TO SEARCH FOR.
*         00B = ALPHANUMERIC OPERAND
*         01B = JUSTIFIED RIGHT ALPHANUMERIC OPERAND
*         02B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC OPERAND
*         03B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC OPERAND 
*         04B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC OPERAND
*         05B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC OPERAND
*         06B = UNSIGNED DISPLAY NUMERIC OPERAND
*         07B = BINARY NUMERIC OPERAND
*         10B = DELIMITER IN IDENTIFIER 
*         11B = JUSTIFIED RIGHT DELIMITER IN IDENTIFIER 
*         12B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC COUNT IN IDENT 
*         13B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC COUNT IN IDENT
*         14B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC COUNT IN IDENT 
*         15B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC COUNT IN ID
*         16B = UNSIGNED DISPLAY NUMERIC COUNT IN IDENTIFIER
*         17B = BINARY NUMERIC COUNT IN IDENTIFIER
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 INTO3    LABEL 
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      PASS RESULT OPERAND TYPE TO PARAMETER GENERATION SUBROUTINE
  
          CALLZ  TYPEGEN
          IFTHEN (P1,GT,1)   NUMERIC OPERAND
            MOVEZ  0,FSTUNST
          ENDIFZ
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE OPERAND. 
  
          CALLZ  PARAMGEN 
  
          SPACE  3
*      PASS DELIMITER IN TYPE TO PARAMETER GENERATION SUBROUTINE
  
          MOVEZ  STREGC,STREGB
          IFTHEN  ((GCODEOF,STREGB),NE,GSUBVERB)
            MOVEZ  0,FSTUNST
            CALLZ  TYPEGEN
            ADDZ  P1,10B,P1 
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE OPERAND. 
  
*      CHANGE INTO FLAG FOR PARAMGEN TO ALLOW LENGTH CALCULATION CODE.
  
            MOVEZ  GSTROP,(GSCODEOF,STREGA) 
            CALLZ  PARAMGEN 
          ENDIFZ
  
          SPACE  3
*      PASS COUNT IN TYPE TO PARAMETER GENERATION SUBROUTINE
  
          MOVEZ  STREGD,STREGB
          IFTHEN  ((GCODEOF,STREGB),NE,GSUBVERB)
          MOVEZ  0,FSTUNST
            CALLZ  TYPEGEN
            ADDZ  P1,10B,P1 
  
*      GENERATE SUBSCRIPTING CODE, LENGTH CALCULATION CODE FOR
*      VARIABLE-LENGTH GROUP ITEMS, A LOCAL LABEL TO STORE THE
*      CALCULATIONS INTO, AND THE PARAMETER WORD FOR THE OPERAND. 
  
            CALLZ  PARAMGEN 
          ENDIFZ
  
          IFTHEN ((GPTROF,STREGE),EQ,0) 
            MOVEZ  0,FSTUNST           NO DELIMITERS
          ENDIFZ
  
*      RESTORE REGB TO POINT TO REG2
  
          MOVEZ  REG2,STREGB
          EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      IF THIS IS THE LAST OPERATOR, GENERATE THE UNSTRING OBJECT 
*      ROUTINE CALL.
* 
*      GENERATED CODE FOR UNSTRING OBJECT ROUTINE CALL TO ROUTINE 
*      C.UNSTR
*      (PARAMETERS SHOWN AFTER THE RJ C.UNSTR ARE GENERATED ELSEWHERE). 
* 
*       [ MOVE   LENGTH->X2          ] * IF VARIABLE-LENGTH SOURCE
*       [ MULTIPLY  X2*OCCNUMBER->X2 ] * IF VARIABLE-LENGTH SOURCE
*       [ SX3    X2+ROOTLENGTH       ] * IF VARIABLE-LENGTH SOURCE
* 
*       [ SX3    LENGTH              ] * IF FIXED-LENGTH SOURCE 
* 
*       [ SA1    SUBTEMP             ] * IF SUBSCRIPTED 
*       [ AX1    30                  ] * IF SUBSCRIPTED 
*       [ SB4    X1+BCP              ] * IF SUBSCRIPTED 
* 
*       [ SB4    BCP                 ] * IF NOT SUBSCRIPTED 
* 
*       [ SX1    1 (USUALLY)         ] * IF NO POINTER SPECIFIED
* 
*       [ MOVE   POINTER->X1         ] * IF POINTER SPECIFIED 
* 
*       [ MX2    0 (USUALLY)         ] * IF NO TALLY SPECIFIED
* 
*       [ MOVE   TALLY->X2           ] * IF TALLY SPECIFIED 
* 
*         SB3    SOURCE ADDR
*         SB5    PARAMLIST
*         SB6    LASTPARAM
*         SB7    OVERFLOWADDR (PRELIMINARY CHECK ONLY)
*         RJ     C.UNSTR
*           RETURNS POINTER IN X1 AND SAVES SOURCE LENGTH IN B7 
* 
*         USE    PARAMETER
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP
*         USE    CODE 
*           REPEATED FOR EACH DELIMITER, DELIMITER IN, COUNT IN, AND
*           RESULT OPERAND
* 
*      THE PARAMETERS ARE GENERATED IN THE FOLLOWING ORDER
*       [ POINTER                    ] * IF POINTER 
*       [ TALLYING                   ] * IF TALLYING
*       [ FIRST DELIMITER            ] * IF DELIMITED BY
*       [ SECOND DELIMITER           ]
*         . . . 
*         FIRST RESULT
*       [ FIRST DELIMITER IN         ] * IF DELIMITER IN
*       [ FIRST COUNT IN             ] * IF COUNT IN
*         SECOND RESULT 
*       [ SECOND DELIMITER IN        ] * IF DELIMITER IN
*       [ SECOND COUNT IN            ] * IF COUNT IN
*         . . . 
* 
*       [ SB3    X1                  ] * IF OVERFLOW
*       [ LT     B7,B3,NEXTSENT      ] * IF OVERFLOW
* 
*      TYPE HAS THE FOLLOWING VALUES -
*      NOTE THAT IDENTIFIER DELIMITERS HAVE TYPES OF 40B AND ABOVE, 
*      OTHER OPERANDS ARE 37B AND BELOW, SO OBJECT ROUTINES CAN USE 
*      PL AND NG INSTRUCTIONS TO CHECK FOR DELIMITERS TO SEARCH FOR.
*         00B = ALPHANUMERIC OPERAND
*         01B = JUSTIFIED RIGHT ALPHANUMERIC OPERAND
*         02B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC OPERAND
*         03B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC OPERAND 
*         04B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC OPERAND
*         05B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC OPERAND
*         06B = UNSIGNED DISPLAY NUMERIC OPERAND
*         07B = BINARY NUMERIC OPERAND
*         10B = DELIMITER IN IDENTIFIER 
*         11B = JUSTIFIED RIGHT DELIMITER IN IDENTIFIER 
*         12B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC COUNT IN IDENT 
*         13B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC COUNT IN IDENT
*         14B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC COUNT IN IDENT 
*         15B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC COUNT IN ID
*         16B = UNSIGNED DISPLAY NUMERIC COUNT IN IDENTIFIER
*         17B = BINARY NUMERIC COUNT IN IDENTIFIER
*         30B = POINTER PARAMETER (FIRST UNSTRING PARAMETER, IF PRESENT)
*         31B = TALLYING PARAMETER (FOLLOWS POINTER PARAM, IF PRESENT)
*         60B = IDENTIFIER DELIMITER (ALSO INSPECT BEFORE DELIMITER)
*         61B = ALL IDENTIFIER DELIMITER
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      CHECK GINTO VERB COUNT FOR LAST ONE IN THIS STATEMENT
  
          SUBZ   OPCOUNT,1,OPCOUNT
          IFZ    (OPCOUNT,GT,0),RETURN
  
*      FETCH SAVED GUNSTRNG OPERANDS, PUT INTO REGA THROUGH REGG. 
*      THE GUNSTRNG CODE IS GENERATED HERE BECAUSE OF CODE SCHEDULING 
*      PROBLEMS.
  
          MOVEZ  STRNGPTR,T1           * SAVE CURRENT VERB STRING POSITN
          MOVEZ  VERBPTR,T2 
          MOVEZ  STRINGSV,STRNGPTR     * SET VERB STRING TO GUNSTRNG VRB
          CALLZ  ADVANCE
          MOVEZ  T1,STRNGPTR           * RESTORE CURRENT VERB STRING POS
          MOVEZ  T2,VERBPTR 
  
*      GENERATE THIS CODE IF SOURCE IS A VARIABLE-LENGTH GROUP ITEM 
  
          MOVEZ  STREGB,SUBITM
          IFTHEN  ((GCODEOF,STREGB),EQ,GDATAREF)
          ANDIF   ((TYPEOF,STREGB),EQ,VARGROUP) 
            CALLZ  GLENCALC                      * MOVE LENGTH->X2
                                                 * MULT X2*OCCNUM->X2 
            NOTE  UNSTRX1 
            GEN    SXXPK,(VREGOF,VREGL1),VREGB,(ROOTLNOF,SUBITM)
          ELSEZ                                  * SX3  X2+ROOTLENGTH 
  
*      GENERATE THIS CODE IF SOURCE IS A FIXED LENGTH ITEM
  
            MOVEZ  (BYTLENOF,SUBITM),P1 
            CALLZ  SETXREG                       * SX3  LENGTH
            MOVEZ  VREGW,VREGL1 
          ENDIFZ
  
*      GENERATE THIS CODE IF SOURCE IS SUBSCRIPTED
  
          IFTHEN ((GCODEOF,STREGB),EQ,GDATAREF) 
          ANDIF  (GSCODEOF,STREGB)
            MOVEZ  (GSCODEOF,STREGB),SENDSUBS 
            NOTE  UNSTRX2 
            MOVEZ  SENDSUBS,P1
            CALLZ  SUBLOAD
            MOVEZ  P1,VREGA 
            GEN  SHR,VREGA,30                                 * AX1 30
            GEN  SBXPK,(VREGOF,VREGA1),VREGA,(BCPOF,STREGB)   * SB4 X1+B
          ELSEZ 
  
*      GENERATE THIS CODE IF SOURCE IS NOT SUBSCRIPTED
  
            MOVEZ  (BCPOF,STREGB),P1
            CALLZ  SETBREG                                   * SB4 BCP
            MOVEZ  VREGX,VREGA1 
          ENDIFZ
  
*      GENERATE THIS CODE IF NO POINTER IS SPECIFIED
  
          IFTHEN  ((GCODEOF,STREGC),EQ,GSUBVERB)
            MOVEZ  PTRVAL,P1
            CALLZ  SETXREG                                   * SX1 1
            MOVEZ  VREGW,VREGD
          ELSEZ 
  
*      GENERATE THIS CODE IF A POINTER IS SPECIFIED 
  
            MOVEZ  STREGC,REGB         * SET UP POINTER ITEM IN REGB
  
            MOVEZ  (EQUALS,REGT4),REGT * SET UP COMP1 REGISTER IN REGC
            CALLZ  ADNAT
            MOVEZ  COMP1,(TYPEOF,REGT)
            MOVEZ  (NUMLENOF,REGB),(NUMLENOF,REGT)
            MOVEZ  (SIGNOF,REGB),(SIGNOF,REGT)
            MOVEZ  0,(POINTOF,REGT) 
            MOVEZ  REGT,REGC
  
            CALLZ  MOVER               * GENERATE MOVE POINTER TO X1
            MOVEZ  (TREGOF,REGC),VREGD
            MOVEZ  (EQUALS,REG2),STREGB          * RESTORE ORIGINAL REGT
            MOVEZ  (EQUALS,REG3),STREGC 
            CALLZ  SUBDNAT
          ENDIFZ
  
*      GENERATE THIS CODE IF TALLYING IS NOT SPECIFIED
  
          IFTHEN  ((GCODEOF,STREGD),EQ,GSUBVERB)
            NOTE  UNSTRX3 
            GEN  MASK,(VREGOF,VREGE),0                       * MX2 0
          ELSEZ 
  
*      GENERATE THIS CODE IF TALLYING IS SPECIFIED
  
            MOVEZ  STREGD,REGB         * SET UP TALLYING ITEM IN REGB 
  
            MOVEZ  (EQUALS,REGT4),REGT * SET UP COMP1 REGISTER IN REGC
            CALLZ  ADNAT
            MOVEZ  COMP1,(TYPEOF,REGT)
            MOVEZ  (NUMLENOF,REGB),(NUMLENOF,REGT)
            MOVEZ  (SIGNOF,REGB),(SIGNOF,REGT)
            MOVEZ  0,(POINTOF,REGT) 
            MOVEZ  REGT,REGC
            CALLZ  MOVER               * GENERATE MOVE TALLYING TO X2 
            MOVEZ  (TREGOF,REGC),VREGE
            MOVEZ  (EQUALS,REG2),STREGB          * RESTORE ORIGINAL REGT
            MOVEZ  (EQUALS,REG3),STREGC 
            CALLZ  SUBDNAT
          ENDIFZ
  
*      FINISH C.UNSTR CALL GENERATED CODE 
  
          NOTE   UNSTRX4
          GEN    SBBPK,(VREGOF,VREGA),,((FWA$OF,STREGB))     * SB3 RESLT
  
*      FIXED ITEM PARMADDR IS SET TO 0 IN THE STRING, UNSTRING, AND 
*      INSPECT PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          GEN    SBBPK,(VREGOF,VREGB),,((LOCAL$OF,PARMADDR)) * SB5 PARAM
  
*      FIXED ITEM OPNDCNT IS SET TO 0 IN THE STRING, UNSTRING, AND
*      INSPECT PROCESSORS.
*      PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT, DELIMITER AND RESULT FIELD IN THE UNSTRING 
*      STATEMENT, OR SEARCH IDENTIFIER IN THE INSPECT STATEMENT.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
*      THE VALUE IN B6 IS THE CURRENT LAST PARAMETER ADDRESS. 
*      IF THE UNSTRING OBJECT ROUTINE IS CALLED SEVERAL TIMES FOR THE 
*      SAME STATEMENT, B6 IS UPDATED FOR EACH CALL. 
  
          SUBZ   OPNDCNT,1,T1 
          GEN    SBBPK,(VREGOF,VREGC),,((LOCAL$OF,PARMADDR),T1) 
                                                             * SB6 PARND
          NOTE   UNSTRX5
  
*      SAVE OVERFLOW LABEL FOR OVERFLOW PROCESSING
  
          MOVEZ  (GPTROF,STREGF),OVFLOLBL 
  
          IFTHEN (FSTUNST,EQ,0) 
          GENOBJ N=C.UNSTS,I=(VREGA,VREGA1,VREGB,VREGC,VREGD,VREGE,VREGL
,1),O=((VREGOF,VREGL1)) 
          ELSEZ 
*         CALL FAST UNSTRING IF ALL DELIMITERS SIZE ONE, NO DELIMITER-IN
*    AND NO COUNT-IN OR NUMERIC OPERAND 
            GENOBJ N=C.UNSTF,I=(VREGA,VREGA1,VREGB,VREGC,VREGD,VREGE,VRE
,GL1),O=((VREGOF,VREGL1)) 
          ENDIFZ
  
  
*      GENERATE PARAMETER SEQUENCE END COMMAND FOR SEQUENCE POOLING 
  
          GEN    USE$,((USETB$OF,USEPARAM)) 
          GEN    ENDPL
          GEN    USE$,((USETB$OF,USECODE))
  
          RETURN
  
  
          TITLE  GOVERFLO - UNSTRING OVERFLOW VERB PROCESSOR
************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 CGOVERF  EGO    1
          NOTE   CGOVERF
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
*      O V E R F L O W    P R O C E S S O R 
*      FOR STRING, UNSTRING, AND CALL 
* 
*         STRING OVERFLOW GTEXT 
* 
*           STREGA  VERB (GOVERFLO) 
*           STREGB  LABELREF (FALSE/TRUE)         : NEXT SENTENCE / 
                                                  : GO TO PROCEDURE 
*           STREGC  SUBVERB (GSTROVER)            : STRING OVERFLOW 
* 
*         UNSTRING OVERFLOW GTEXT 
* 
*           STREGA  VERB (GOVERFLO) 
*           STREGB  LABELREF (FALSE/TRUE)         : NEXT SENTENCE / 
                                                  : GO TO PROCEDURE 
*           STREGC  SUBVERB (GUNSOVER)            : UNSTRING OVERFLOW 
* 
*         CALL OVERFLOW GTEXT 
* 
*           STREGA  VERB (GOVERFLO) 
*           STREGB  LABELREF (FALSE/TRUE)         : NEXT SENTENCE / 
                                                  : GO TO PROCEDURE 
*           STREGC  SUBVERB (NULL)                : CALL OVERFLOW 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
*      BRANCH TO APPROPRIATE PROCESSOR
  
          GOTOCASE  (GSCODEOF,STREGC) 
            CASE    GSTROVER,STRNOVER  * STRING OVERFLOW
            CASE     GUNSOVER,UNSTOVER  * UNSTRING OVERFLOW 
            CASE   GNULL,CALLOVER 
          ENDCASE 
  
          ERROR  5401                  * ILLEGAL OVERFLOW VERB
          RETURN
  
          SPACE  4
 STRNOVER LABEL 
          IFTHEN (SKIPFLAG,EQ,2)   OVERFLOW 
            IFZ    ((GSCODEOF,STREGB),EQ,GFALSE),RETURN 
            GEN    EQ$,,,((FWA$OF,STREGB))
            RETURN
          ENDIFZ
          IFTHEN (SKIPFLAG,EQ,1)   NO OVERFLOW
            IFZ    ((GSCODEOF,STREGB),EQ,GTRUE),RETURN
            GEN    EQ$,,,((FWA$OF,STREGB))
            RETURN
            ENDIFZ
          IFTHEN ((GSCODEOF,STREGB),EQ,GFALSE)
            GEN  EQ$,VREGL1,,((FWA$OF,STREGB))
          ELSEZ 
            GEN  NE$,VREGL1,,((FWA$OF,STREGB))
          ENDIFZ
          RETURN
  
          SPACE  4
*      GENERATE THIS CODE IF UNSTRING OVERFLOW SPECIFIED
  
  
 UNSTOVER LABEL 
  
          IFTHEN (SKIPFLAG,EQ,2)   OVERFLOW 
            IFZ    ((GSCODEOF,STREGB),EQ,GFALSE),RETURN 
            GEN    EQ$,,,((FWA$OF,STREGB))
            RETURN
          ENDIFZ
          IFTHEN (SKIPFLAG,EQ,1)   NO OVERFLOW
            IFZ    ((GSCODEOF,STREGB),EQ,GTRUE),RETURN
            GEN    EQ$,,,((FWA$OF,STREGB))
            RETURN
            ENDIFZ
          IFTHEN ((GSCODEOF,STREGB),EQ,GFALSE)
            GEN    EQ$,VREGL1,,((FWA$OF,STREGB))
          ELSEZ 
            GEN    NE$,VREGL1,,((FWA$OF,STREGB))
          ENDIFZ
  
          RETURN
  
          SPACE  4
*      GENERATE THIS CODE IF CALL OVERFLOW SPECIFIED
  
 CALLOVER LABEL 
          CALLZ  OVFLGEN     (PROCESSOR IN GBRANCH WITH CALL) 
  
          RETURN
  
 GSTRING  EJECT 
          TITLE  STRING, UNSTRING, AND INSPECT SUBROUTINES
 GLENGTH EJECT
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** NAME - GLENCALC SUBROUTINE                                         * 
*                                                                     * 
** PURPOSE -                                                          * 
*      GENERATE CODE TO COMPUTE THE VARIABLE LENGTH OF A GROUP ITEM   * 
*      WITH A SUBORDINATE OCCURS DEPENDING, AND LEAVE THE RESULT IN   * 
*      AN X REGISTER                                                  * 
*                                                                     * 
** CODE GENERATED -  (REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY)      * 
*         MOVE   LENGTH->X2            * GEN BY MOVER                 * 
*         MULTIPLY  X2*OCCNUMBER->X2   * GEN BY CONMULT               * 
*                                                                     * 
** INPUT PARAMETERS -                                                 * 
*      SUBITM - DNAT ENTRY NUMBER OF GROUP ITEM                       * 
*                                                                     * 
** OUTPUT -                                                           * 
*      VREGB - X REGISTER WITH VARIABLE LENGTH (NOT INCL. ROOT LENGTH)* 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 GLENCALC LABEL 
          NOTE   GLENCALC 
          PUSH   REGB,REGC
  
*      LOAD OCCURRENCE COUNT OF SUBORDINATE OCCURS ITEM IN COMP1 FORMAT 
  
          MOVEZ  (EQUALS,REGT4),REGB   * SET UP OCCURS ITEM IN REGB 
          MOVEZ  0,P1 
          MOVEZ  REGB,P2
          CALLZ  REGMOVE
          MOVEZ  (EQUALS,GDATAREF),(GCODEOF,REGB) 
          MOVEZ  (DEPNAMOF,SUBITM),(GPTROF,REGB)
  
          MOVEZ  (EQUALS,REGT5),REGT   * SET UP COMP1 REGISTER IN REGC
          CALLZ  ADNAT
          MOVEZ  COMP1,(TYPEOF,REGT)
          MOVEZ  (NUMLENOF,REGB),(NUMLENOF,REGT)
          MOVEZ  0,(POINTOF,REGT) 
          MOVEZ  REGT,REGC
  
          CALLZ  MOVER                 * MOVE OCCURS COUNT TO REGISTER
          MOVEZ  (TREGOF,REGC),VREGA
          CALLZ  SUBDNAT
  
*      COMPUTE  OCCURS COUNT * OCCURRENCE LENGTH TO GET VARIABLE LENGTH 
  
          MOVEZ  (SUBOCCLN,SUBITM),P1 
          MOVEZ  VREGA,P2 
          CALLZ  CONMULT
          MOVEZ  P3,VREGB 
          POP    REGB,REGC
          RETURN
 GLENCALC EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** NAME - GLENGTH SUBROUTINE                                          * 
*                                                                     * 
** PURPOSE -                                                          * 
*      GENERATE CODE TO COMPUTE THE LENGTH OF A GROUP ITEM WITH A     * 
*      SUBORDINATE OCCURS DEPENDING, AND LEAVE THE RESULT IN AN X     * 
*      REGISTER                                                       * 
*                                                                     * 
** CODE GENERATED -  (REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY)      * 
*         MOVE   LENGTH->X2            * GEN BY MOVER                 * 
*         MULTIPLY  X2*OCCNUMBER->X2   * GEN BY CONMULT               * 
*         SX2    X2+ROOTLENGTH                                        * 
*                                                                     * 
** INPUT PARAMETERS -                                                 * 
*      SUBITM - DNAT ENTRY NUMBER OF GROUP ITEM                       * 
*                                                                     * 
** OUTPUT -                                                           * 
*      VREGC - X REGISTER WITH LENGTH                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 GLENGTH  EGO    4
          NOTE   GLENGTH
  
*      LOAD OCCURRENCE COUNT OF SUBORDINATE OCCURS ITEM IN COMP1 FORMAT 
*      COMPUTE  OCCURS COUNT * OCCURRENCE LENGTH TO GET VARIABLE LENGTH 
  
          CALLZ  GLENCALC 
  
*      GENERATE  SX2  X2+ROOTLENGTH 
*      X2 REFERS TO WHICHEVER X REGISTER THE ASSEMBLER ASSIGNS
  
          GEN    SXXPK,(VREGOF,VREGC),VREGB,(ROOTLNOF,SUBITM) 
          RETURN
 GMODDNAT EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                      *
** NAME - GMODDNAT SUBROUTINE                                         * 
*                                                                      *
** PURPOSE -                                                           *
*      CREATE A COPY OF A DNAT FOR MODIFICATION                        *
*                                                                      *
** INPUT -                                                             *
*      STREGS = POINTER TO OLD REGT WITH DNAT TO BE CHANGED            *
*      STREGT = POINTER TO NEW REGT                                    *
*                                                                      *
** OUTPUT -                                                            *
*      STREGT = POINTER TO NEW REGT WITH MODIFIABLE DNAT               *
*                                                                      *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 GMODDNAT EGO    4
  
*      SET UP REGT REGTABLE ENTRY WITH COPY OF INPUT REG
  
          MOVEZ  STREGS,P1
          MOVEZ  STREGT,P2
          CALLZ  REGMOVE
  
*      GET NEW DNAT 
  
*                            CREATE A PERMANENT DNAT ENTRY
          CALLZ  NEWDNAT                         T1 = NEW DNAT INDEX
          MOVEZ  T1,(REGPTROF,STREGT) 
  
*      COPY OLD DNAT TO NEW DNAT
  
          MOVEZ  (DNATOF,STREGS),(DNATOF,STREGT)
          RETURN
 INSPOBJ  EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
** NAME - INSPOBJ SUBROUTINE
* 
** PURPOSE -
*      GENERATE OBJECT ROUTINE CALL SEQUENCE FOR C.INSPR AND C.INSPT
* 
** INPUT -
*      STRINGSV = POINTER TO GINSPECM PACKET
*      OPCOUNT = GTALLY OR GREPLACE PACKET COUNTER
*      PARMADDR = LOCAL LABEL NUMBER OF PARAMETER AREA
* 
*      WHEN THE LAST GTALLY OR GREPLACE PACKET HAS BEEN PROCESSED,
*      GENERATE THE C.INSPT OR C.INSPR OBJECT ROUTINE CALL
* 
*      GENERATED CODE FOR OBJECT ROUTINE CALL 
*      (ONLY CODE GENERATED BY THIS ROUTINE IS SHOWN HERE)
* 
*       [ MOVE   LENGTH->X2          ] * IF VARIABLE-LENGTH SOURCE
*       [ MULTIPLY  X2*OCCNUMBER->X2 ] * IF VARIABLE-LENGTH SOURCE
*       [ SB7    X2+ROOTLENGTH       ] * IF VARIABLE-LENGTH SOURCE
* 
*       [ SB7    LENGTH              ] * IF FIXED-LENGTH SOURCE 
* 
*       [ SA1    SUBTEMP             ] * IF SUBSCRIPTED 
*       [ AX1    30                  ] * IF SUBSCRIPTED 
*       [ SB4    X1+BCP              ] * IF SUBSCRIPTED 
* 
*       [ SB4    BCP                 ] * IF NOT SUBSCRIPTED 
* 
*         SB3    RESULT ADDR
*         SB5    PARAMLIST
*         SB6    LASTPARAM
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 INSPOBJ  EGO    4
          NOTE   INSPOBJ
  
*      FETCH SAVED GINSPECM OPERANDS, PUT INTO REGA THROUGH REGG. 
*      THE C.INSPT OR C.INSPR CODE IS GENERATED HERE BECAUSE OF CODE
*      SCHEDULING PROBLEMS. 
  
          MOVEZ  STRNGPTR,T1           * SAVE CURRENT VERB STRING POSITN
          MOVEZ  VERBPTR,T2 
          MOVEZ  STRINGSV,STRNGPTR     * SET VERB STRING TO GINSPT VERB 
          CALLZ  ADVANCE
          MOVEZ  T1,STRNGPTR           * RESTORE CURRENT VERB STRING POS
          MOVEZ  T2,VERBPTR 
  
*      GENERATE THIS CODE IF SOURCE IS A VARIABLE-LENGTH GROUP ITEM 
  
          MOVEZ  (EQUALS,REG2),STREGB 
          MOVEZ  STREGB,SUBITM
          IFTHEN  ((GCODEOF,STREGB),EQ,GDATAREF)
          ANDIF   ((TYPEOF,STREGB),EQ,VARGROUP) 
            CALLZ  GLENCALC                      * MOVE LENGTH->X2
                                                 * MULT X2*OCCNUM->X2 
            NOTE  INSPOBJ1
            GEN    SBXPK,(VREGOF,VREGL1),VREGB,(ROOTLNOF,SUBITM)
            MOVEZ  (BCPOF,STREGB),P1
            CALLZ  SETBREG
            MOVEZ  VREGX,VREGA1                            * SB4 BCP
            GEN    SBBPK,(VREGOF,VREGA),,((FWA$OF,STREGB)) * SB3 INSP 
            BRANCH INSP10 
          ENDIFZ
  
          IFZ    ((TYPEOF,STREGB),NE,COMP),INSP05     NON-NUMERIC 
          IFZ    ((SIGNOF,STREGB),EQ,0),INSP05        UNSIGNED
          IFZ    ((SCHAROF,STREGB),NE,0),INSP05       SIGN SEPARATE 
* 
*     SIGN INCLUDED, MOVE ITEM TO UNSIGNED FIELD, SAVING SIGN 
*         IN CASE VERB IS REPLACING 
* 
          MOVEZ  (EQUALS,REGT4),REGT
          CALLZ  ADNAT
          MOVEZ  COMP,(TYPEOF,REGT) 
          MOVEZ  1,(SIGNOF,REGT)
          MOVEZ  (NUMLENOF,STREGB),(NUMLENOF,REGT)
          MOVEZ  (POINTOF,STREGB),(POINTOF,REGT)
          PUSH   REGC 
          MOVEZ  REGT,REGC
          CALLZ  MOVER
          IFTHEN ((NUMLENOF,STREGB),GE,10)
            MOVEZ  (TREGOF,REGC),VREGA
            MOVEZ  (TREGP1OF,REGC),VREGB
            GEN    XMIT,(VREGOF,VREGC),VREGA
            GEN    SHR,VREGC,59 
            GEN    LXOR,(VREGOF,VREGA),VREGA,VREGC
            GEN    LXOR,(VREGOF,VREGB),VREGB,VREGC
            GEN    SSRBPK,VREGA,,((EXT$OF,C.BUFF))
            GEN    SSRAPB,VREGB,VREGA,VREGB1
            GEN    SSRAPB,VREGC,VREGB,VREGB1
            SUBZ   20,(NUMLENOF,STREGB),P1
          ELSEZ 
            MOVEZ  (TREGOF,REGC),VREGA
            GEN    XMIT,(VREGOF,VREGC),VREGA
            GEN    SHR,VREGC,59 
            GEN    LXOR,(VREGOF,VREGA),VREGA,VREGC
            GEN    SSRBPK,VREGA,,((EXT$OF,C.BUFF))
            GEN    SSRAPB,VREGC,VREGA,VREGB1
            SUBZ   10,(NUMLENOF,STREGB),P1
          ENDIFZ
          POP    REGC 
          CALLZ  SETBREG                                   * SB4 BCP
          MOVEZ  VREGX,VREGA1 
          MOVEZ  (NUMLENOF,STREGB),P1 
          CALLZ  SETBREG
          MOVEZ  VREGX,VREGL1                              * SB7 LENGTH 
          GEN    SBBPK,(VREGOF,VREGA),,((EXT$OF,C.BUFF))   * SB3 ADDR 
          BRANCH INSP10 
          SPACE  3
 INSP05   LABEL 
          IFTHEN ((TYPEOF,STREGB),EQ,COMP)
            MOVEZ  (NUMLENOF,STREGB),P1 
          ELSEZ 
            MOVEZ  (BYTLENOF,STREGB),P1 
          ENDIFZ
  
*      GENERATE THIS CODE IF SOURCE IS SUBSCRIPTED
  
          IFTHEN ((GCODEOF,STREGB),EQ,GDATAREF) 
          ANDIF  (GSCODEOF,STREGB)
          MOVEZ  STREGB,P2
          CALLZ  SUBREF 
          GEN    SBXPB,(VREGOF,VREGA1),P3 
          GEN    SBXPB,(VREGOF,VREGL1),P4 
          ELSEZ 
  
*      GENERATE THIS CODE IF SOURCE IS NOT SUBSCRIPTED
  
            CALLZ  SETBREG
            MOVEZ  VREGX,VREGL1 
            MOVEZ  (BCPOF,STREGB),P1
            CALLZ  SETBREG                                   * SB4 BCP
            MOVEZ  VREGX,VREGA1 
          ENDIFZ
          IFTHEN ((TYPEOF,STREGB),EQ,COMP)
          ANDIF  ((SIGNOF,STREGB),NE,0)          MUST BE SEPARATE 
          ANDIF  ((LDSIGNOF,STREGB),NE,0) 
            GEN    SBBPB,(VREGOF,VREGA1),VREGA1,VREGB1    * SB4 B4+B1 
          ENDIFZ
  
*      FINISH C.INSPT OR C.INSPR GENERATED CODE 
  
          NOTE   INSPOBJ3 
          GEN    SBBPK,(VREGOF,VREGA),,((FWA$OF,STREGB))     * SB3 RESLT
  
*      FIXED ITEM PARMADDR IS SET TO 0 IN THE STRING, UNSTRING, AND 
*      INSPECT PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
 INSP10   LABEL 
          GEN    SBBPK,(VREGOF,VREGB),,((LOCAL$OF,PARMADDR)) * SB5 PARAM
  
*      FIXED ITEM OPNDCNT IS SET TO 0 IN THE STRING, UNSTRING, AND
*      INSPECT PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT, DELIMITER AND RESULT FIELD IN THE UNSTRING 
*      STATEMENT, OR SEARCH IDENTIFIER IN THE INSPECT STATEMENT.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
*      THE VALUE IN B6 IS THE CURRENT LAST PARAMETER ADDRESS. 
*      IF THE INSPECT OBJECT ROUTINE IS CALLED SEVERAL TIMES FOR THE
*      SAME STATEMENT, B6 IS UPDATED FOR EACH CALL. 
  
          SUBZ   OPNDCNT,1,T1 
          GEN    SBBPK,(VREGOF,VREGC),,((LOCAL$OF,PARMADDR),T1) 
                                                             * SB6 PARND
  
          RETURN
  
 PARAMADD EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
** NAME - PARAMADD SUBROUTINE 
* 
** PURPOSE -
*      GENERATE A PARAMETER CONTAINING A LABEL ADDRESS IN A USE BLOCK 
* 
** CODE GENERATED - 
* 
*         USE    PARAMETER
*         VFD    6/TYPE,36/0,18/ADDR
*         USE    CODE 
* 
** PARAMETERS - 
*      P1 IS THE PARAMETER TYPE 
*      P2 IS THE LABEL NUMBER 
* 
** SAVES -
*      P2 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 PARAMADD EGO    4
          NOTE   PARAMADD 
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT; DELIMITER, DELIMITER IN, COUNT IN, AND RESULT
*      FIELD IN THE UNSTRING STATEMENT; OR SEARCH IDENTIFIER IN THE 
*      INSPECT STATEMENT. 
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          ADDZ   OPNDCNT,1,OPNDCNT
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
          GEN    USE$,((USETB$OF,USEPARAM))      * USE PARAMETER
          GENVFD (6,P1),(36,0),(18,((LOCAL$OF,P2))) 
          GEN    USE$,((USETB$OF,USECODE))       * USE CODE 
  
          RETURN
 PARAMGEN EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** NAME - PARAMGEN SUBROUTINE                                         * 
*                                                                     * 
** PURPOSE -                                                          * 
*      GENERATE CODE TO ADD A SUBSCRIPT TO THE BCP OF AN ITEM IN REGB,* 
*      A LOCAL LABEL TO STORE THE TYPE+SUBSCRIPT PARAMETER INTO,      * 
*      AND THE TYPE+BCP PARAMETER WORD FOR THE REGB OPERAND           * 
*      ALL OBJECT ROUTINE PATAMETERS IN THE PARAM BLOCK USED BY THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES, ARE GENERATED 
*      BY THIS ROUTINE, EXCEPT PARAMETERS FOR IN-LINE ADDRESSES 
*      GENERATED BY PARAMADD. 
*                                                                     * 
** CODE GENERATED-                                                    * 
*                                                                     * 
*      THIS CODE IS GENERATED IF THE ITEM HAS A LENGTH CALCULATION.   * 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY.                     * 
*                                                                     * 
*         MOVE   LENGTH->X1            * GEN BY MOVER                 * 
*         MULTIPLY  X1*OCCNUMBER->X1   * GEN BY CONMULT               * 
*         SX1    X1+ROOTLENGTH         * GEN BY GLENGTH               * 
*         SA2    PARAM                                                * 
*         MX0    18                                                   * 
*         LX0    54                                                   * 
*         BX2    -X0*X2                                               * 
*         LX1    36                                                   * 
*         BX7    X1+X2                                                * 
*         SA7    PARAM                                                * 
*                                                                     * 
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED.             * 
*      NOTE THAT THE SAME ITEM CANNOT HAVE BOTH A LENGTH CALCULATION  * 
*      AND A SUBSCRIPT.                                               * 
*                                                                     * 
*         SA1    SUBTEMP                                              * 
*         AX1    30                                                   * 
*         SX1    X1+BCP                                               * 
*         SA2    PARAM                                                * 
*         MX0    42                                                   * 
*         BX2    X0*X2                                                * 
*         BX7    X2+X1                                                * 
*         SA7    PARAM                                                * 
*                                                                     * 
*      THIS CODE IS ALWAYS GENERATED.                                 * 
*                                                                     * 
*         USE    PARAMETER                                            * 
*[PARAM   EQU    *     ]               * IF SUBSCR OR LENGTH CALC     * 
*         VFD    6/TYPE,18/LENGTH,18/ADDR,18/BCP                      * 
*         USE    CODE                                                 * 
*                                                                     * 
*      TYPE HAS THE FOLLOWING VALUES -                                * 
*      NOTE THAT IDENTIFIER DELIMITERS HAVE TYPES OF 40B AND ABOVE, 
*      OTHER OPERANDS ARE 37B AND BELOW, SO OBJECT ROUTINES CAN USE 
*      PL AND NG INSTRUCTIONS TO CHECK FOR DELIMITERS TO SEARCH FOR.
*         00B = ALPHANUMERIC OPERAND                                  * 
*         01B = JUSTIFIED RIGHT ALPHANUMERIC OPERAND                  * 
*         02B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC OPERAND        * 
*         03B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC OPERAND       * 
*         04B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC OPERAND        * 
*         05B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC OPERAND      * 
*         06B = UNSIGNED DISPLAY NUMERIC OPERAND                      * 
*         07B = BINARY NUMERIC OPERAND                                * 
*         10B = DELIMITER IN IDENTIFIER                               * 
*         11B = JUSTIFIED RIGHT DELIMITER IN IDENTIFIER               * 
*         12B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC COUNT IN IDENT * 
*         13B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC COUNT IN IDENT* 
*         14B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC COUNT IN IDENT * 
*         15B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC COUNT IN ID  * 
*         16B = UNSIGNED DISPLAY NUMERIC COUNT IN IDENTIFIER          * 
*         17B = BINARY NUMERIC COUNT IN IDENTIFIER                    * 
*         20B = SIZE DELIMITER                                        * 
*         30B = POINTER PARAMETER (FIRST UNSTRING PARAMETER, IF PRESENT)
*         31B = TALLYING PARAMETER (FOLLOWS POINTER PARAM, IF PRESENT)
*         60B = IDENTIFIER DELIMITER (ALSO INSPECT BEFORE DELIMITER)
*         61B = ALL IDENTIFIER DELIMITER
*                                                                      *
*      INSPECT TYPE HAS THE FOLLOWING VALUES                           *
*      NOTE THAT 60B IS ALSO THE STRING/UNSTRING IDENTIFIER DELIM PARAM 
*         00B = CHARS SEARCH SPECIFICATION (+ ITEM TO REPACE BY)
*         01B =     CHARS SEARCH SPEC (+ SIGNED LEFT NUMERIC REPL. ITEM)
*         02B =     CHARS SEARCH SPEC (+ SIGNED RIGHT NUMERIC REPL ITEM)
*         10B = ALL SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         11B =     ALL SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITEM) 
*         12B =     ALL SEARCH SPEC (+ SIGNED RIGHT NUMERIC SEARCH ITEM)
*         20B = LEADING SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         21B =     LEADING SEARCH SPEC (+ SIGNED LEFT NUMERIC ITEM)
*         22B =     LEADING SEARCH SPEC (+ SIGNED RIGHT NUMERIC ITEM) 
*         30B = FIRST SEARCH SPECIFICATION (+ ITEM TO SEARCH FOR) 
*         31B =     FIRST SEARCH SPEC (+ SIGNED LEFT NUMERIC SEARCH ITM)
*         32B =     FIRST SEARCH SPEC (+ SIGNED RIGHT NUMERIC SRCH ITEM)
*         40B = ITEM TO REPLACE BY (+ OPERAND TO REPLACE BY)
*         41B =     ITEM TO REPLACE BY (+ SIGNED LEFT NUMERIC REPL ITEM)
*         42B =     ITEM TO REPLACE BY (+ SIGNED RIGHT NUMERIC REPL ITM)
*         50B = TALLYING SUBROUTINE ADDRESS (IF LONG INSPECT TALLYING)
*         51B = TALLY/REPLACE PARAMETER GROUP COUNT 
*         60B = BEFORE SEARCH BOUNDARY (+ BOUNDARY ITEM)
*         61B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND)
*         62B =     BEFORE SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BND)
*         70B = AFTER SEARCH BOUNDARY (+ BOUNDARY ITEM) 
*         71B =     AFTER SEARCH BOUNDARY (+ SIGNED LEFT NUMERIC BOUND) 
*         72B =     AFTER SEARCH BOUNDARY (+ SIGNED RIGHT NUMERIC BOUND)
*                                                                     * 
** PARAMETERS -                                                       * 
*      REG1 HAS THE VERB GTEXT ATOM--IF GINTO, NO LENGTH CALC IS DONE * 
*      REG2 HAS THE DELIMITER OR OPERAND GTEXT ATOM                   * 
*      P1 IS THE PARAMETER TYPE                                       * 
*      OPNDCNT IS A COUNT OF OPERANDS IN THE OBJECT ROUTINE PARAM     * 
*        STRING                                                       * 
*                                                                     * 
** OUTPUT -                                                           * 
*      PARMADDR IS THE LABEL NUMBER OF THE FIRST OPERAND IN THE       * 
*        OBJECT ROUTINE PARAMETER STRING, SET THE FIRST TIME PARAMGEN * 
*        IS CALLED FOR EACH STRING, UNSTRING, AND INSPECT STATEMENT.  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 PARAMGEN EGO    4
          NOTE   PARAMGEN 
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS INCREMENTED BY 1 FOR EACH DELIMITER AND SOURCE FIELD IN THE
*      STRING STATEMENT; DELIMITER, DELIMITER IN, COUNT IN, AND RESULT
*      FIELD IN THE UNSTRING STATEMENT; OR SEARCH IDENTIFIER IN THE 
*      INSPECT STATEMENT. 
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          ADDZ   OPNDCNT,1,OPNDCNT
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
          MOVEZ  P1,TYPESAVE
          MOVEZ  0,PARMLABL 
  
*      THIS CODE IS GENERATED IF THERE IS A LENGTH CALCULATION
*      (NO LENGTH CALCULATION IF VERB IS GINTO).
  
          IFTHEN  ((GCODEOF,STREGB),EQ,GDATAREF)
          ANDIF   ((GSCODEOF,STREGB),NE,GINTO)
          ANDIF   ((TYPEOF,STREGB),EQ,VARGROUP) 
          ANDIF  ((GSCODEOF,STREGB),EQ,0) 
            MOVEZ  STREGB,SUBITM                 * MOVE LENGTH->X1
            CALLZ  GLENGTH                       * MULT X1*OCCLEN->X1 
            MOVEZ  (LOCLAB,PARMLABL),PARMLABL    * SX1  X1+ROOTLENGTH 
            NOTE  PARAMG1 
            GEN    SLRBPK,(VREGOF,VREGD),,LABELX * SA2  PARAM 
            GEN    MASK,(VREGOF,VREGE),18        * MX0  18
            GEN    SHL,VREGE,54                  * LX0  54
            GEN    LIMP,(VREGOF,VREGD),VREGD,VREGE * BX2 -X0*X2 
            GEN    SHL,VREGC,36                  * LX1 36 
            GEN    LOR,(VREGOF,VREGF),VREGC,VREGD * BX7 X1+X2 
            GEN    SSRBPK,VREGF,,LABELX          * SA7  PARAM 
            MOVEZ  SUBITM,STREGB
            BRANCH PARAMS3
          ENDIFZ
  
*      THIS CODE IS GENERATED IF THE ITEM IS SUBSCRIPTED. 
  
          IFTHEN  ((GCODEOF,STREGB),EQ,GDATAREF)
          ANDIF   (GSCODEOF,STREGB) 
            MOVEZ  STREGB,P2
            CALLZ  SUBREF 
            MOVEZ  P3,VREGB 
            MOVEZ  (LOCLAB,PARMLABL),PARMLABL 
            GEN  SLRBPK,(VREGOF,VREGD),,LABELX               * SA2 PARAM
            GEN  MASK,(VREGOF,VREGE),42                      * MX0 42 
            GEN    SHL,VREGE,18 
            GEN    SHL,VREGB,18 
            GEN  LAND,(VREGOF,VREGD),VREGD,VREGE             * BX2 X0*X2
            GEN    LOR,(VREGOF,VREGF),VREGD,VREGB 
            GEN    MASK,(VREGOF,VREGE),18 
            GEN    SHL,VREGE,54 
            GEN    LIMP,(VREGOF,VREGD),VREGF,VREGE
            GEN    SHL,P4,36
            GEN    LOR,(VREGOF,VREGF),P4,VREGD
            GEN  SSRBPK,VREGF,,LABELX                        * SA7 PARAM
          ENDIFZ
  
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*      GENERATE THIS CODE ALWAYS
  
 PARAMS3  LABEL 
          NOTE   PARAMS3
          GEN    USE$,((USETB$OF,USEPARAM))      * USE PARAMETER
  
*      THIS FIXED ITEM IS SET TO 0 IN THE STRING, UNSTRING, AND INSPECT 
*      PROCESSORS.
*      IT IS RESET TO A LABEL NUMBER THE FIRST TIME A DELIMITER IS
*      ENCOUNTERED, AND A LOCAL LABEL IS GENERATED JUST INSIDE THE
*      USE BLOCK BEFORE THE FIRST PARAMETER IN THE STRING.
*      IT IS REFERENCED IN THE GENERATED CALLING SEQUENCE FOR THE 
*      STRING, UNSTRING, AND INSPECT OBJECT ROUTINES. 
  
          IFTHEN  (PARMADDR,EQ,0) 
            MOVEZ  (LOCLAB,PARMADDR),PARMADDR 
            GEN    LABEL$,LABELY
          ENDIFZ
  
          IFTHEN PARMLABL 
            GEN  LABEL$,LABELX                   * PARAM BSS 0  IF SUBSC
          ENDIFZ
  
*      CHECK FOR REFERENCE TO HIGH VALUES OR LOW VALUES 
  
          IFZ    ((MAJMSCOF,STREGB),NE,LITMSEC),PARAMS4 
          IFZ    ((FIGVALOF,STREGB),EQ,0),PARAMS4 
          IFTHEN  ((FIGVALOF,STREGB),EQ,HIFIGVAL) 
  
            GENVFD (6,TYPESAVE),(18,1),(18,0),(18,((EXT$OF,C.HIVAL))) 
          ELSEZ 
  
            GENVFD (6,TYPESAVE),(18,1),(18,0),(18,((EXT$OF,C.LOVAL))) 
          ENDIFZ
          BRANCH  PARAMS5 
  
 PARAMS4  LABEL 
  
*      GENERATE  VFD  6/TYPE,54/0   IF SIZE DELIMITER 
  
          IFTHEN  ((GCODEOF,STREGB),EQ,GSUBVERB)
            GENVFD  (6,TYPESAVE),(54,0) 
          ELSEZ 
  
            GENVFD (6,TYPESAVE),(18,(BYTLENOF,STREGB)),(18,(BCPOF,STREGB
,)),(18,SUBSADDR) 
          ENDIFZ
  
 PARAMS5  LABEL 
          GEN    USE$,((USETB$OF,USECODE))       * USE CODE 
  
          RETURN
 SETNUMER EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
* 
** NAME - SETNUMER SUBROUTINE 
* 
** PURPOSE -
*      PROCESS NUMERIC OPERANDS FOR INSPECT TALLYING. OPERAND MUST BE 
*      DISPLAY. 
* 
** DOES - 
*      IF OPERAND IS UNSIGNED OR NOT NUMERIC, RETURN
*      IF OPERAND IS SIGNED OVERPUNCHED, CHANGE PARAMETER TYPE
*      IF OPERAND IS SIGNED SEPARATE CHARACTER, CHANGE LENGTH 
* 
** INPUT PARAMETERS - 
*      STREGB - NUMERIC OPERAND 
*      P1 - PARAMETER TYPE TO POSSIBLY MODIFY 
* 
** OUTPUT PARAMETERS -
*      STREGB - POSSIBLY MODIFIED DNAT
*      P1 - POSSIBLY MODIFIED PARAMETER TYPE
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 SETNUMER EGO    4
  
*      FIND TYPE OF OPERAND--RETURN IF NOT SIGNED NUMERIC 
  
          IFZ    ((TYPEOF,STREGB),NE,COMP),RETURN 
          NOTZ   (SIGNOF,STREGB),RETURN 
  
          IFZ    (SCHAROF,STREGB),SETNUM1 
          IFTHEN  (LDSIGNOF,STREGB) 
  
*      ITEM IS SIGNED LEFT OVERPUNCHED--CHANGE PARAMETER
  
            ADDZ  1,P1,P1 
          ELSEZ 
  
*      ITEM IS SIGNED RIGHT OVERPUNCHED--CHANGE PARAMETER 
  
            ADDZ  2,P1,P1 
          ENDIFZ
          RETURN
  
 SETNUM1  LABEL 
  
*      SET UP MODIFIABLE DNAT FOR SIGNED SEPARATE CHARACTER ITEM
  
          PUSH   P1 
          MOVEZ  STREGB,STREGS
          MOVEZ  (EQUALS,REGT4),STREGT
          CALLZ  GMODDNAT 
          MOVEZ  STREGT,STREGB
          POP    P1 
  
*      IF THE ITEM IS SIGNED RIGHT, ONLY THE LENGTH NEED BE DECREMENTED 
*      BY ONE CHARACTER. IF IT IS SIGNED LEFT, THE ADDRESS MUST ALSO BE 
*      INCREASED BY ONE CHARACTER.
  
          SUBZ   (BYTLENOF,STREGB),1,(BYTLENOF,STREGB)
          NOTZ   (LDSIGNOF,STREGB),RETURN 
  
          ADDZ   (BCPOF,STREGB),1,T1
          IFTHEN  (T1,GT,9) 
            SUBZ  T1,10,T1
            ADDZ  (WRDOFFOF,STREGB),1,(WRDOFFOF,STREGB) 
          ENDIFZ
          MOVEZ  T1,(BCPOF,STREGB)
  
          RETURN
 TALLYHO  EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** NAME - TALLYHO SUBROUTINE                                          * 
*                                                                     * 
** PURPOSE -                                                          * 
*      GENERATE CODE TO INCREMENT UNSTRING TALLYING ITEM              * 
*                                                                     * 
** CODE GENERATED -                                                   * 
*                                                                     * 
*      THIS CODE IS GENERATED IF THE TALLYING OPTION IS PRESENT.      * 
*      REGISTERS SHOWN ARE FOR ILLUSTRATION ONLY.                     * 
*                                                                     * 
*         SX1    INTOSUSED                                            * 
*         ADD    X1+TALLY->TALLY                                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 TALLYHO  LABEL 
          NOTE   TALLYHO
  
*      CHECK IF TALLYING OPTION IS PRESENT
  
          IFZ    ((GCODEOF,STREGD),EQ,GSUBVERB),RETURN
  
*      SET UP COMP1 REGISTER WITH COUNT OF INTO ITEMS USED
  
          MOVEZ  (EQUALS,REGT4),REGT
          CALLZ  ADNAT
          MOVEZ  COMP1,(TYPEOF,REGT)
          MOVEZ  5,(NUMLENOF,REGT)
          MOVEZ  0,(POINTOF,REGT) 
          MOVEZ  REGT,REGB
  
          SUBZ   (GPTROF,STREGE),OPCOUNT,T1 
          GEN    SXBPK,(VREGOF,VREGA),,T1        * SX1 INTOS
          MOVEZ  VREGA,(TREGOF,REGT)
  
*      SET UP ADD STATEMENT 
  
          MOVEZ  STREGD,STREGC
          MOVEZ  (EQUALS,GVERB),(GCODEOF,STREGA)
          MOVEZ  (EQUALS,GADD),(GSCODEOF,STREGA)
          CALLZ  CGADD                           * ADD X1+TALLY->TALLY
          CALLZ  SUBDNAT
          RETURN
 TYPEGEN  EJECT 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** NAME - TYPEGEN SUBROUTINE                                          * 
*                                                                     * 
** PURPOSE -                                                          * 
*      DETERMINE A TYPE CODE FOR THE OPERAND AND RETURN IT            * 
*                                                                     * 
** TYPES GENERATED -                                                  * 
*         00B = ALPHANUMERIC OPERAND                                  * 
*         01B = JUSTIFIED RIGHT ALPHANUMERIC OPERAND                  * 
*         02B = SIGNED LEFT CHARACTER DISPLAY NUMBERIC OPERAND        * 
*         03B = SIGNED LEFT OVERPUNCHED DISPLAY NUMERIC OPERAND       * 
*         04B = SIGNED RIGHT CHARACTER DISPLAY NUMERIC OPERAND        * 
*         05B = SIGNED RIGHT OVERPUNCHED DISPLAY NUMERIC OPERAND      * 
*         06B = UNSIGNED DISPLAY NUMERIC OPERAND                      * 
*         07B = BINARY NUMERIC OPERAND                                * 
*                                                                     * 
** INPUT -                                                            * 
*      REG2 = OPERAND TO BE TYPED                                     * 
*                                                                     * 
** OUTPUT -                                                           * 
*      P1 = TYPE VALUE                                                * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
  
 TYPEGEN  LABEL 
  
          GOTOCASE  (TYPEOF,STREGB)    * BRANCH ON TYPE OF OPERAND
            CASE    COMP1,TYPE7 
            CASE    COMP4,TYPE7 
            CASE    COMP,TYPE6
            CASE    ALPHABET,TYPE1
            CASE    ALPHNUM,TYPE1 
            CASE    GROUP,TYPE0 
            CASE    VARGROUP,TYPE0
            CASE    ALPHEDIT,TYPE0
            CASE    ALPNUMED,TYPE0
            CASE    NUMEDIT,TYPE0 
          ENDCASE 
  
          ERROR  8602                  * NOT A LEGAL OPERAND TYPE 
          RETURN
  
 TYPE7    LABEL 
            MOVEZ  7B,P1               * BINARY NUMERIC OPERAND 
            RETURN
  
 TYPE6    LABEL 
          IFZ    (SIGNOF,STREGB),TYPE5
            MOVEZ  6B,P1               * UNSIGNED DISPLAY NUMERIC OP
            RETURN
  
 TYPE5    LABEL 
          IFZ    (LDSIGNOF,STREGB),TYPE3
          IFZ    (SCHAROF,STREGB),TYPE4 
            MOVEZ  5B,P1               * SIGNED RIGHT OVER DISPLAY OP 
            RETURN
  
 TYPE4    LABEL 
            MOVEZ  4B,P1               * SIGNED RIGHT CHAR DISPLAY OP 
            RETURN
  
 TYPE3    LABEL 
          IFZ    (SCHAROF,STREGB),TYPE2 
            MOVEZ  3B,P1               * SIGNED LEFT OVER DISPLAY OP
            RETURN
  
 TYPE2    LABEL 
            MOVEZ  2B,P1               * SIGNED LEFT CHAR DISPLAY OP
            RETURN
 TYPE1    LABEL 
          NOTZ   (JUSTOF,STREGB),TYPE0
            MOVEZ  01B,P1              * JUSTIFIED RIGHT ALPHNUM OPERAND
            RETURN
  
 TYPE0    LABEL 
            MOVEZ  00B,P1              * ALPHANUMERIC OPERAND 
          RETURN
  
          SPACE  4
          END 
