         TITLE 'RADIX PARTITION TREE SERVICES. SEPTEMBER 1, 1973'       00008002
*********************************************************************** 00016002
*                                                                     * 00024002
*      R A D I X   P A R T I T I O N   T R E E   S E R V I C E S      * 00032002
*                                                                     * 00040002
*********************************************************************** 00048002
*                                                                     * 00056002
* THE COMPONENT RADIX PARTITION TREE SERVICES (RPTS) PROVIDES A SET   * 00064002
* OF MACRO-INSTRUCTIONS AND SUBROUTINES FOR SEARCHING, SORTING,       * 00072002
* SCANNING, AND DYNAMICALLY MAINTAINING INDEXED COLLECTIONS OF ITEMS. * 00080002
* EACH ITEM IN AN INDEXED COLLECTION IS TREATED AS HAVING A KEY, OR   * 00088002
* IDENTIFIER, AND ASSOCIATED DATA (OR AN ASSOCIATED ADDRESS).         * 00096002
* THE KEYS MAY OR MAY NOT BE UNIQUE AND/OR PART OF THE DATA.          * 00104002
* THE DATA MAY BE A CONTROL BLOCK, A QUEUE ELEMENT, ANOTHLR KEY, OR AN* 00112002
* ARBITRARY RECORD. FOR SIMPLICITY ALL OF THESE ARE CALLED RECORDS.   * 00120002
* A RADIX PARTITION TREE IS A PARTICULAR REPRESENTATION FOR MAINTAIN- * 00128002
* ING AN INDEXED COLLECTION, WHERE EACH KEY VALUE IS ASSOCIATED WITH  * 00136002
* THE ADDRESS OF A RECORD.                                            * 00144002
*                                                                     * 00152002
* THE BASIC OPERATIONS PROVIDED ARE SEARCHING, INSERTING, DELETEING,  * 00160002
* AND SCANNING. THE SEARCH OPERATION, WHEN GIVEN A KEY VALUE, SEARCHES* 00168002
* THE RADIX PARTITION TREE TO FIND THE ADDRESS OF THE RECORD ASSOCIATED 00176002
* WITH THE KEY.  THE INSERT  OPERATION  ADDS A KEY  VALUE  AND ITS    * 00184002
* ASSOCIATED RECORD ADDRESS TO THE RPT, SO THAT SUBSEQUENT SEARCHES   * 00192002
* WITH THE NEW KEY WILL FIND ITS ASSOCIATED RECORD ADDRESS.           * 00200002
* THE DELETE OPERATION REMOVES AN ASSOCIATION BETWEEN A KEY AND ITS   * 00208002
* ASSOCIATED RECORD ADDRESS FROM THE RPT.                             * 00216002
* THE SCANNING OPERATIONS RETRIEVE THE RECORD ADDRESSES IN ASCENDING  * 00224002
* OR DESCENDING ORDER OF THEIR ASSOCIATED KEYS.                       * 00232002
*                                                                     * 00240002
* AUXILIARY OPERATIONS ARE PROVIDED FOR INITIALLY DEFINING AN RPT,    * 00248002
* ALLOCATING AND RELEASING SSPACE FOR RECORDS, RELEASING THE SPACE FOR* 00256002
* RECORDS, RELEASING THE SPACE FOR AN ENTIRE RPT, AND INITIALIZING FOR* 00264002
* SCANNING IN ASCENDING OR DESCENDING ORDER.                          * 00272002
*                                                                     * 00280002
* THE MACRO-INSTRUCTIONS THAT PROVIDE THESE FUNCTIONS ARE:            * 00288002
*                                                                     * 00296002
* MACRO   FUNCTION                                                    * 00304002
* -----   --------                                                    * 00312002
* DEL     DELETE AN ASSOCIATION BETWEEN A KEY VALUE AND A RECORD      * 00320002
*         ADDRESS FROM THE RADIX PARTITION TREE.                      * 00328002
* FSPACE  FREE A RECORD SPACE BY RELEASING IT TO THE SYSTEM.          * 00336002
* FTREE    RELEASE ALL THE SPACE IN AN RPT TO THE SYSTEM.             * 00344002
* GSPACE  GET A RECORD SPACE IN MAIN STORAGE.                         * 00352002
* INS     INSERT AN ASSOCIATION BETWEEN A KEY VALUE AND A RECORD      * 00360002
*         ADDRESS TO THE RPT.                                         * 00368002
* ISCAN   INITIALIZE FOR SCANNING IN EITHER ASCENDING OR DESCENDING   * 00376002
*         ORDER.                                                      * 00384002
* SCANL   SCAN IN DESCENDING ORDER.                                   * 00392002
* SCANR   SCAN IN ASCENDING ORDER.                                    * 00400002
* SRCH    SEARCH FOR THE RECORD ADDRESS ASSOCIATED WITH A GIVEN KEY   * 00408002
*         VALUE.                                                      * 00416002
* STREE   SET UP THE RPT BY GETTING SPACE FOR IT AND FILLING IN       * 00424002
*         VARIOUS INTERNAL FIELDS. THE NEW RPT IS EMPTY, I. E. DOES   * 00432002
*         NOT HAVE ANY ASSOCIATION PAIRS REPRESENTED IN IT.           * 00440002
* TSORT   INTERNAL SORT OPERATION.                                    * 00448002
         EJECT                                                          00456002
* TO UNDERSTAND THE OPERATION OF THE VARIOUS ROUTINES, A DICTIONARY OF* 00464002
* TERMS IS PROVIDED. THE TERMS ARE DEFINED IN RELATION TO THE FIGURE  * 00472002
* ON THIS PAGE.                                                       * 00480002
*                                                                     * 00488002
*                             F I G U R E  0.                         * 00496002
*                                                                     * 00504002
*                                                                     * 00512002
*                                  ***                                * 00520002
*                               A * 5 *                               * 00528002
*                                  ***                                * 00536002
*                                 *   *                               * 00544002
*                                *     *                              * 00552002
*                               *       *                             * 00560002
*                              *         *                            * 00568002
*                             *           *                           * 00576002
*                            *             *                          * 00584002
*                           *               *                         * 00592002
*                          *                 *                        * 00600002
*                         *                   *                       * 00608002
*                        *                     *                      * 00616002
*                       *                       *                     * 00624002
*                      *                         *                    * 00632002
*                     *                           *                   * 00640002
*                    ***                         ***                  * 00648002
*                 B * 3 *                     C * 2 *                 * 00656002
*                    ***                         ***                  * 00664002
*                   *   *                       *   *                 * 00672002
*                  *     *                     *     *                * 00680002
*                 *       *                   *       *               * 00688002
*                *         *                 *         *              * 00696002
*               *           *               *           *             * 00704002
*              *             *             *             *            * 00712002
*             *               *           *               *           * 00720002
*            ***             ***         ***             ***          * 00728002
*         D * 7 *         E * 4 *     F * 1 *         G * 8 *         * 00736002
*            ***             ***         ***             ***          * 00744002
*                           *   *                                     * 00752002
*                          *     *                                    * 00760002
*                         *       *                                   * 00768002
*                        *         *                                  * 00776002
*                       *           *                                 * 00784002
*                      *             *                                * 00792002
*                     *               *                               * 00800002
*                    ***             ***                              * 00808002
*                 H * 9 *         I * 6 *                             * 00816002
*                    ***             ***                              * 00824002
*                                                                     * 00832002
*                                                                     * 00840002
*.....................................................................* 00848002
* ASCENDING PATH PROPERTY: A PROPERTY OF VALUES ASSOCIATED WITH THE   * 00856002
*        VERTICES IN A DIRECTED GRAPH IN WHICH ANY SEQUENCE OF VALUES * 00864002
*        ALONG A DIRECTED PATH IS IN NON-DECREASING ORDER.            * 00872002
*.....................................................................* 00880002
* BINARY COLLATING SEQUENCE: A COLLATING SEQUENCE DEFINED IN WHICH IF * 00888002
*        BYTES REPRESENTING THE CHARACTERS IN THE CHARACTER SET ARE   * 00896002
*        ARRANGED IN ASCENDING ORDER BY THEIR BINARY VALUES, THEN THE * 00904002
*        CHARACTERS REPRESENTED BY THE BYTES ARE IN LEXICOGRAPHICAL   * 00912002
*        ORDER.  IN ORDER FOR A RADIX PARTITION TREE TO PRESERVE THE  * 00920002
*        ORDER OF THE VALUES IN THE SET PARTITIONED, EACH VAULE MUST  * 00928002
*        BE A BINARY NUMBER (I. E. A STRING OF BYTES), AND THE COLLAT-* 00936002
*        ING SEQUENCE OF THE CORRESPONDING CHARACTER SET MUST BE A    * 00944002
*        BINARY COLLATING SEQUENCE.                                   * 00952002
*.....................................................................* 00960002
* DEGREE: THE THE TOTAL NUMBER OF EDGES AT A VERTEX, REGARDLESS OF    * 00968002
*        THEIR DIRECTION.  INDEGREE IS THE NUMBER OF INCOMING EDGES AT* 00976002
*        A VERTEX, AND OUTDEGREE IS THE NUMBER OF OUTGOING EDGES AT A * 00984002
*        VERTEX.                                                      * 00992002
*.....................................................................* 01000002
* EDGE: A CONNECTION BETWEEN A PAIR OF VERTICES IN A GRAPH, USUALLY   * 01008002
*        REPRESENTED BY A LINE WHEN DRAWN ON PAPER. IN A FORMAL SENSE,* 01016002
*        AN EDGE IS PAIR OF VERTICES. A DIRECTED EDGE IS AN EDGE THAT * 01024002
*        DEFINES A CONNECTION IN ONLY ONE DIRECTION. AN UNDIRECTED    * 01032002
*        EDGE IMPLIES A CONNECTION IN BOTH DIRECTIONS.                * 01040002
*        THUS A DIRECTED EDGE IS AN ORDERED PAIR OF VERTICES, AND AN  * 01048002
*        UNDIRECTED EDGE IS AN UNORDERED PAIR OF VERTICES.            * 01056002
*.....................................................................* 01064002
*        IN THE RPT PROGRAMS, THE VERTICES OF THE GRAPHS ARE MAIN     * 01072002
*        STORAGE ADDRESSES, AND THE EDGES ARE PAIRS OF ADDRESSES.     * 01080002
*        EDGES ARE REPRESENTED BY EDGE FIELDS, WHICH REPRESENT THE    * 01088002
*        TWO ADDRESSES IN THE PAIR OF ADDRESSES IN SOME FASHION.      * 01096002
*        AN INVERTIBLE EDGE IS ONE THAT IS REPRESENTED BY A SINGLE    * 01104002
*        FIELD, AND WHERE THE SINGLE FIELD ALLOWS EITHER OF THE TWO   * 01112002
*        ADDRESSES TO BE COMPUTED FROM THE OTHER ADDRESS, THE EDGE    * 01120002
*        FIELD, AND ONE OTHER ADDRESS.                                * 01128002
*        FOR EXAMPLE, SUPPOSE THE GRAPH CONTAINS THE TWO EDGES (A,B)  * 01136002
*        AND (B,C). THEN IF THE FIELD STORED AT LOCATION B IS FORMED  * 01144002
*        BY SUBTRACTING THE ADDRESS A FROM THE ADDRESS C, THEN WHEN   * 01152002
*        THE TWO ADDRESSES A AND B ARE KNOWN, THE ADDRESS CAN BE      * 01160002
*        COMPUTED BY ADDING THE FIELD AT B TO THE ADDRESS A.          * 01168002
*        ARITHMETICALLY, E(B)=C-A, WHICH MEANS THAT C=A+E(B), AND     * 01176002
*        A=C-E(B), WHERE E(B)=C-A.  THUS, GIVEN TWO CONSECUTIVE       * 01184002
*        ADDRESSES ALONG A PATH, THE NEXT VERTEX ALONG THE PATH CAN   * 01192002
*        BE COMPUTED.                                                 * 01200002
*.....................................................................* 01208002
         EJECT                                                          01216002
         MACRO                                                          01224002
&TAG     DEL   &TREE,&LV=,&T=,&TYPE=,&S=,&SP=,                         X01232002
               &FREE=,&RECL=                                            01240002
.********************************************************************** 01248002
.* THE DEL MACRO-INSTRUCTION IS USED TO DELETE A KEY-ADDRESS          * 01256002
.* ASSOCIATION PAIR FROM THE RADIX PARTITION TREE. THE MEANINGS OF THE* 01264002
.* PARAMETERS ARE AS FOLLOWS:                                         * 01272002
.********************************************************************** 01280002
.* TREE: THE TREE PARAMETER SPECIFIES THE ADDRESS OF THE RADIX        * 01288002
.*       PARTITION TREE, AS IT IS OBTAINED FROM USING THE STREE       * 01296002
.*       MACRO-INSTRUCTION. THE ADDRESS MAY EITHER BE IN MAIN STORAGE * 01304002
.*       OR IN A REGISTER. IF "LABEL" IS CODED FOR THE TREE PARAMETER,* 01312002
.*       THE ADDRESS IS IN A WORD IN MAIN STORAGE. IF "(TREE)" IS     * 01320002
.*       CODED, THE ADDRESS IS IN THE CORRESPONDING REGISTER.         * 01328002
.* LV:   LV MEANS "LENGTH VALUE", AND IS USED TO SPECIFY THE LENGTH OF* 01336002
.*       THE RECORD IF THE RECORD AREA IS TO BE RELEASED TO THE SYSTEM* 01344002
.*       VIA THE FSPACE MACRO-INSTRUCTION. IF THE LV PARAMETER IS NOT * 01352002
.*       CODED, THEN NO FSPACE OPERATION TAKES PLACE, BUT ONLY THE    * 01360002
.*       SPACE FOR THE RADIX PARTITION TREE ENTRY IS RELEASED.        * 01368002
.*       THE LV PARAMETER IS CODED EXACTLY THE SAME WAY AS IN THE     * 01376002
.*       FSPACE MACRO-INSTRUCTION. IF THE RECORD IS A VARIABLE LENGTH * 01384002
.*       RECORD WITH EITHER A ONE-BYTE OR HALFWORD COUNT AT THE FRONT * 01392002
.*       OF THE RECORD, THE LENGTH VALUE MAY BE CODED AS:             * 01400002
.*       LV=((15),1) FOR A ONE BYTE LENGTH;                           * 01408002
.*       LV=((15),2) FOR A HALFWORD LENGTH FIELD.                     * 01416002
.*       IF THE RECORD IS A FIXED LENGTH RECORD, THEN "LV=LENGTH"     * 01424002
.*       SHOULD BE CODED, WHERE "LENGTH" IS THE RECORD LENGTH.        * 01432002
.*                                                                    * 01440002
.* S,SP: THESE PARAMETERS ARE CODED EXACTLY THE SAME WAY AS IN THE    * 01448002
.*       FSPACE MACRO-INSTRUCTION; SEE THE DESCRIPTION OF FSPACE FOR  * 01456002
.*       DETAILS.                                                     * 01464002
.* FREE: THIS PARAMETER IS PRESENT ONLY FOR COMPATIBILITY WITH EARLIER* 01472002
.*       VERSIONS, AND SHOULD NOT BE USED.                            * 01480002
.* RECL: THIS PARAMETER IS PRESENT ONLY FOR COMPATIBILITY WITH EARLIER* 01488002
.*       VERSIONS, AND SHOULD NOT BE USED.                            * 01496002
.*       THE RETURN CODE IN REGISTER 15 IS THE ADDRESS THAT WAS       * 01504002
.*       ASSOCIATED WITH THE KEY BEFORE THE DELETE IF THE LENGTH VALUE* 01512002
.*       IS NOT CODED. THE CONDITION CODE SETTING DOES NOT ALWAYS     * 01520002
.*       AGREE WITH THE RETURN CODE IN THIS EVENT, SINCE THE CONDITION* 01528002
.*       CODE IS SET TO 01 (MINUS) WHEN THE DEL MACRO-INSTRUCTION     * 01536002
.*       DELETES THE LAST KEY-ADDRESS PAIR IN THE RPT. WHEN THE LV    * 01544002
.*       PARAMETER IS NOT CODED A BM INSTRUCTION WILL BRANCH WHEN THE * 01552002
.*       ADDRESS RETURNED IN REGISTER 15 IS THE LAST ADDRESS THAT WAS * 01560002
.*       IN THE RPT. A BNM INSTRUCTION WILL BRANCH WHEN THE ADDRESS   * 01568002
.*       RETURNED IN REGISTER 15 WAS NOT THE LAST ADDRESS IN THE RPT. * 01576002
.*       WHEN THE LENGTH VALUE IS CODED, THE CONDITION CODE SETTING IS* 01584002
.*       THE SAME AS ABOVE, BUT THE RETURN CODE IN REGISTER 15 IS SET * 01592002
.*       TO ZERO, SINCE THE FSPACE MACRO-INSTRUCTION SETS IT TO ZERO. * 01600002
.*       THE CONDITION CODE IS PRESERVED THROUGH THE FSPACE           * 01608002
.*       MACRO-INSTRUCTION, SO THAT IT IS THE SAME AS IT IS WHEN      * 01616002
.*       RETURNING FROM THE DEL SUBROUTINE IN THE MODULE IGARPT01.    * 01624002
.* AFTER THE DEL OPERATION, THE CURSOR IS SET BETWEEN THE TWO KEYS ON * 01632002
.* EITHER SIDE OF THE DELETED KEY, SO THAT IS A SCANL OR SCANR        * 01640002
.* MACRO-INSTRUCTION IS SUBSEQUENTLY EXECUTED THE CURSOR IS POSITIONED* 01648002
.* TO THE KEY LOWER OR HIGHER THAN THE DELETED KEY.                   * 01656002
.* THUS IT IS POSSIBLE TO PROCESS ALL THE ADDRESS IN THE RPT IN       * 01664002
.* ASCENDING ORDER, AND DELETE EACH PAIR AFTER IT HAS BEEN PROCESSED, * 01672002
.* BY USING ISCAN TO INITIALIZE THE CURSOR, AND THEN FOLLOWING EACH   * 01680002
.* SCANR BY A DEL, WHICH DELETES EACH ENTRY AFTER IT HAS BEEN         * 01688002
.* PROCESSED.                                                         * 01696002
.* A SAMPLE PROGRAM TO DO THIS IS AS FOLLOWS:                         * 01704002
.*       ISCAN TREE  SET THE CURSOR TO THE INITIAL STATE.             * 01712002
.* MORE: SCANR TREE,DONE=END  SET THE CURSOR TO THE NEXT.             * 01720002
.*       PROCESS THE RECORD AT THE ADDRESS IN REGISTER 15.            * 01728002
.*       DEL TREE,LV=80  DELETE THE CURSOR-SELECTED KEY-ADDRESS PAIR  * 01736002
.*                        FROM THE RADIX PARTITION TREE, AND RELEASE  * 01744002
.*                        THE 80-BYTE RECORD AREA TO THE SYSTEM VIA   * 01752002
.*                        THE FSPACE MACRO-INSTRUCTION.               * 01760002
.*       BNM MORE  BRANCH BACK TO SCAN MORE IF THERE IS STILL AT LEAST* 01768002
.*                        ONE ENTRY.                                  * 01776002
.********************************************************************** 01784002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *01792002
                         OF RPT ENTRY POINTS.                           01800002
         GBLC  &IGADEL   INDEX OF THE ADDRESS OF THE DELETE ROUTINE    *01808002
                         ADDRESS IN THE LIST OF ENTRY POINTS IN THE    *01816002
                         TREE HEADER.                                   01824002
         GBLC  &IGADDR   THE ADDRESS OF THE MODULE IGARPTXX.            01832002
         GBLC  &IGARPT#  THE TYPE OF THE RADIX PARTITION TREE FROM ONE *01840002
               OF THE PARAMETERS T OR TYPE.                             01848002
         LCLC  &R,&Q                                                    01856002
.*A000000                                                        Y02147 01864002
.********************************************************************** 01872002
         AIF   (K'&RECL EQ 0).NEW  SEE IF THE OLD PARAMETER RECL IS    *01880002
                         CODED INSTEAD OF LV.                           01888002
&TAG     DEL   &TREE,T=&T,TYPE=&TYPE,LV=&RECL,S=&S,SP=&SP               01896002
         AGO   .FIN                                                     01904002
.NEW     ANOP                                                           01912002
      RPTDSECT T=5,DS=NO                                                01920002
      RPTDSECT T=8,DS=NO                                                01928002
.********************************************************************** 01936002
&R       SETC  'R'                                                      01944002
         AIF   (K'&TREE EQ K'&TREE(1)+2 AND N'&TREE EQ 1).LW2           01952002
&R       SETC  ' '                                                      01960002
.LW2     AIF   ('&TREE' NE '(1)').LW3  SEE IF THE TREE ADDRESS IS      *01968002
                         ALREADY IN R1.                                 01976002
         AIF   (K'&TAG EQ 0).LW4  SEE IF THERE IS NO TAG.               01984002
&TAG     EQU   *                                                        01992002
         AGO   .LW4      SKIP THE LR INSTRUCTION.                       02000002
.LW3     ANOP                                                           02008002
&TAG     L&R   1,&TREE(1)                                               02016002
.LW4     ANOP                                                           02024002
         L     15,(&IGABLST+&IGADEL)(,1)  ADDRESS OF THE DELETE ROUTINE 02032002
         BALR  14,15           LINK TO THE DELETE ROUTINE.              02040002
         AIF   (K'&LV EQ 0).FIN  SEE IF A LENGTH VALUE IS GIVEN.        02048002
         AIF   ('&LV' EQ '0').FIN  SEE IF THE LENGTH IS ZERO.           02056002
        FSPACE R,A=(15),S=&S,SP=&SP,LV=&LV  FREE THE RECORD AREA.       02064002
         SPM   14        RESTORE CONDITION CODE.                        02072002
FIN&SYSNDX EQU *                                                        02080002
.FIN     ANOP                                                           02088002
         MEND                                                           02096002
         EJECT                                                          02104002
         MACRO                                                          02112002
&TAG    FSPACE &R,&LV=,&A=,&S=,&SP=                                     02120002
.* THIS MACRO RELEASES THE SPACE AT THE ADDRESS SPECIFIED BY THE      * 02128002
.* PARAMETER A TO THE SYSTEM, USING THE LOCAL STORAGE MANAGEMENT      * 02136002
.* ROUTINES IN THE MODULE IGARPT01.                                   * 02144002
.*                                                                    * 02152002
.*             LOCAL STORAGE ALLOCATION                               * 02160002
.*             ----- ------- ----------                               * 02168002
.*                                                                    * 02176002
.* THE GSPACE AND FSPACE MACRO-INSTRUCTIONS ARE THE INTERFACE TO THE  * 02184002
.* LOCAL STORAGE ALLOCATION FUNCTIONS IN THE RPTS COMPONENT OF THE    * 02192002
.* OPERATING SYSTEM.                                                  * 02200002
.*                                                                    * 02208002
.* THE GSPACE AND FSPACE MACRO-INSTRUCTIONS PROVIDE FUNCTIONS THAT ARE* 02216002
.* EQUIVALENT TO THE R-FORM OF THE GETMAIN AND FREEMAIN               * 02224002
.* MACRO-INSTRUCTIONS, BUT ARE SIGNIFICANTLY FASTER THAN GETMAIN AND  * 02232002
.* FREEMAIN. THE GSPACE MACRO-INSTRUCTION ALLOCATES SPACE, AND THE    * 02240002
.* FSPACE MACRO-INSTRUCTION RELEASES SPACE TO THE SYSTEM.             * 02248002
.*                                                                    * 02256002
.* AS THE NAME "LOCAL STORAGE ALLOCATION" IMPLIES, THE GSPACE AND     * 02264002
.* FSPACE MACRO-INSTRUCTIONS ALLOCATE AND RELEASE VIRTUAL STORAGE ON A* 02272002
.* LOCAL BASIS. THE GSPACE AND FSPACE MACRO-INSTRUCTIONS ALLOCATE AND * 02280002
.* RELEASE STORAGE IN A LOCAL COLLECTION OF STORAGE AREAS DEFINED BY A* 02288002
.* SPACE CONTROL AREA (SPCA). EACH SPCA IS IDENTIFIED BY ITS VIRTUAL  * 02296002
.* STORAGE ADDRESS, WHICH IS KEPT IN A WORD CALLED THE ADDRESS OF THE * 02304002
.* SPACE CONTROL AREA, OR THE SPACE CONTROL WORD (SPCW). THE SPCA     * 02312002
.* CONTAINS ENOUGH INFORMATION TO IDENTIFY THE AVAILABLE STORAGE AREAS* 02320002
.* IN THE COLLECTION OF AREAS DEFINED BY THE SPCA.                    * 02328002
.*                                                                    * 02336002
.* EVERY TIME THE GSPACE AND FSPACE MACRO-INSTRUCTIONS ARE EXECUTED,  * 02344002
.* THEY USE THE ADDRESS OF THE SPCA TO DETERMINE THE COLLECTION OF    * 02352002
.* STORAGE AREAS THAT PARTICIPATE IN THE ALLOCATION OR RELEASE OF AN  * 02360002
.* AREA OF STORAGE. THE S PARAMETER IN THE GSPACE AND FSPACE          * 02368002
.* MACRO-INSTRUCTIONS SPECIFIES THE ADDRESS OF THE SPCA TO BE USED.   * 02376002
.*                                                                    * 02384002
.* SINCE EVERY ALLOCATION OR RELEASE OF STORAGE USES AN SPCA, AN SPCA * 02392002
.* MUST BE ESTABLISHED BEFORE ANY ALLOCATION CAN BE DONE. THERE ARE   * 02400002
.* TWO WAYS OF ESTABLISHING AND USING AN SPCA; THE EXPLICIT MODE AND  * 02408002
.* THE IMPLICIT MODE.                                                 * 02416002
.*                                                                    * 02424002
.* IN THE EXPLICIT MODE, THE SPCA IS ESTABLISHED BY USING THE GSPACE  * 02432002
.* MACRO-INSTRUCTION WITH THE POSITIONAL PARAMETER CODED AS "S" OR    * 02440002
.* "SC", WHICH CREATES AN SPCA AND STORES THE ADDRESS OF THE SPCA IN  * 02448002
.* THE PLACE SPECIFIED BY THE S PARAMETER. THE THE S PARAMETER MUST BE* 02456002
.* CODED ON ALL SUBSEQUENT GSPACE AND FSPACE USES OF THE LOCAL        * 02464002
.* COLLECTION OF STORAGE DEFINED BY THE SPCA.                         * 02472002
.* THE FOLLOWING EXAMPLE ILLUSTRATES HOW A SPACE CONTROL AREA CAN BE  * 02480002
.* ESTABLISHED, USED, AND RELEASED USING THE EXPLICIT MODE:           * 02488002
.*                                                                    * 02496002
.*       GSPACE S,S=(9)  ESTABLISH AN SPCA AND SAVE ITS ADDRESS IN    * 02504002
.*                       REGISTER 9.                                  * 02512002
.*       GSPACE R,LV=200,S=(9)  ALLOCATE 200 BYTES USING THE SPCA.    * 02520002
.*       LR     3,1      SAVE THE ADDRESS OF THE AREA ALLOCATED.      * 02528002
.*       GSPACE R,LV=256,S=(9)  ALLOCATE 256 BYTES USING THE SPCA.    * 02536002
.*       LR     4,1      SAVE THE ADDRESS OF THE 256-BYTE AREA        * 02544002
.*                       ALLOCATED.                                   * 02552002
.*       FSPACE R,S=(9),LV=200,A=(3) RELEASE THE 200-BYTE AREA TO THE * 02560002
.*              SYSTEM.                                               * 02568002
.*       FSPACE S,S=(9)         RELEASE THE SPACE CONTROL AREA TO THE * 02576002
.*                       SYSTEM, AS WELL AS ALL STORAGE ASSOCIATED    * 02584002
.*                       WITH IT (IN THIS CASE THE 256-BYTE AREA IS   * 02592002
.*                       RELEASED ALONG WITH THE SPCA). NO FUTURE     * 02600002
.*                       EXECUTIONS OF GSPACE OR FSPACE ARE VALID     * 02608002
.*                       AFTER THE SPCA HAS BEEN RELEASED VIA THE     * 02616002
.*                       FSPACE MACRO-INSTRUCTION.                    * 02624002
.*                                                                    * 02632002
.* IN THE EXPLICT MODE THE SUBPOOL FOR THE STORAGE CAN BE SPECIFIED   * 02640002
.* WHEN THE SPCA IS ESTABLISHED BY CODING THE SP PARAMETER IN THE     * 02648002
.* GSPACE MACRO-INSTRUCTION. THUS IF "GSPACE S,S=(9),SP=23" HAD BEEN  * 02656002
.* CODED IN THE FIRST GSPACE IN THE EXAMPLE, SUBPOOL 23 WOULD BE USED * 02664002
.* FOR ALLOCATING THE SPCA, AND THE 200 AND 256-BYTE AREAS WOULD ALSO * 02672002
.* BE ALLOCATED USING SUBPOOL 23.                                     * 02680002
.* THE TWO GSPACE ALLOCATIONS FOR THE 200 BYTES AND THE 256 BYTES NEED* 02688002
.* NOT HAVE THE SP PARAMETER CODED, SINCE THE SPCA USED ALREADY       * 02696002
.* CONTAINS THE SUBPOOL TO BE USED. IF THE SP PARAMETER IS CODED IN   * 02704002
.* THE EXPLICIT MODE, IT IS IGNORED, AND THE SUBPOOL IN THE SPCA IS   * 02712002
.* USED.                                                              * 02720002
.*                                                                    * 02728002
.* IN THE IMPLICIT MODE, THERE IS ONE SPCA FOR EACH COLLECTION OF     * 02736002
.* STORAGE DEFINED, AND EACH COLLECTION OF STORAGE CORRESPONDS TO A   * 02744002
.* SUBPOOL BEING USED FOR ALLOCATION AND RELEASE OF SPACE. THE        * 02752002
.* COLLECTION OF SPCA'S IS LOCATED BY MEANS OF A WORD IN THE CURRENT  * 02760002
.* TASK CONTROL BLOCK (TCBRPT). THE SPCA FOR THE SUBPOOL SPECIFIED BY * 02768002
.* THE REQUEST IS FOUND BY EXAMINING THE TCB-ADDRESSED COLLECTION. IF * 02776002
.* THERE IS NO SPCA FOR THE REQUEST SUBPOOL, THEN ONE IS ESTABLISHED  * 02784002
.* AUTOMATICALLY AND ADDED TO THE TCB-ADDRESSED COLLECTION.           * 02792002
.* WHEN USING THE GSPACE AND FSPACE MACRO-INSTRUCTIONS IN THE IMPLICIT* 02800002
.* MODE THE S PARAMETER IS NEVER CODED. THE SP PARAMETER IS USED TO   * 02808002
.* LOCATE THE APPROPRIATE SPCA.                                       * 02816002
.*                                                                    * 02824002
.* THE EXAMPLE ABOVE, WITH THE S PARAMETER NOT CODED ON ANY           * 02832002
.* MACRO-INSTRUCTION, WOULD ESTABLISH AN SPCA FOR SUBPOOL ZERO,       * 02840002
.* ALLOCATE THE TWO AREAS USING IT, RELEASE THE 200-BYTE AREA, AND    * 02848002
.* THEN RELEASE THE SPCA FOR SUBPOOL ZERO ALONG WITH THE 256-BYTE     * 02856002
.* AREA.                                                              * 02864002
.*                                                                    * 02872002
.* IN THE IMPLICIT MODE, AN SPCA FOR SUBPOOL ZERO MUST ALWAYS EXIST   * 02880002
.* FOR CORRECT OPERATION OF THE LOCAL STORAGE ALLOCATION ROUTINES. THE* 02888002
.* SPCA FOR SUBPOOL ZERO IS ESTABLISHED BEFORE ANY SPCA FOR ANY OTHER * 02896002
.* SUBPOOL. THE FOLLOWING EXAMPLE ILLUSTRATES HOW TO USE THE LOCAL    * 02904002
.* STORAGE ALLOCATION FACILITY FOR SUBPOOL 127, AND THEN RELEASE THE  * 02912002
.* SPCA FOR SUBPOOL 127 FROM THE TCB-ADDRESSED COLLECTION:            * 02920002
.*                                                                    * 02928002
.*       GSPACE S,SP=127,LV=200  ALLOCATE 200 BYTES USING THE SPCA FOR* 02936002
.*                       SUBPOOL 127 (WHICH IS CREATED WITH THIS      * 02944002
.*                       REQUEST).                                    * 02952002
.*       LR     3,1     SAVE THE ADDRESS OF THE AREA ALLOCATED.       * 02960002
.*       GSPACE R,LV=256,SP=127  ALLOCATE 256 BYTES USING SUBPOOL 127.* 02968002
.*       FSPACE R,LV=200,SP=127,A=(3)  RELEASE THE 200-BYTE AREA.     * 02976002
.*       FSPACE S,SP=127  RELEASE THE SPCA FOR SUBPOOL 127, AND       * 02984002
.*                       RELEASE ALL STORAGE ALLOCATED USING IT.      * 02992002
.*                                                                    * 03000002
.* AT THIS POINT THERE IS STILL AN SPCA FOR SUBPOOL ZERO. IF NO       * 03008002
.* SUBSEQUENT ALLOCATION OR RELEASE IS DONE, AND THE TASK TERMINATES, * 03016002
.* THE STORAGE IS AUTOMATICALLY RELEASED AT TASK TERMINATION TIME.    * 03024002
.* THE SPCA FOR SUBPOOL ZERO CANNOT BE RELEASED EXCEPT AT TASK        * 03032002
.* TERMINATION TIME.                                                  * 03040002
.*                                                                    * 03048002
.* SINCE THE SPCA FOR THE SPECIFIED SUBPOOL MAY NOT BE IN THE         * 03056002
.* COLLECTION DEFINED BY THE TCB, THE FOLLOWING RETURN CODES ARE      * 03064002
.* PROVIDED:                                                          * 03072002
.*                                                                    * 03080002
.*                                                                    * 03088002
.*       CODE: MEANING:                                               * 03096002
.*       ----- --------                                               * 03104002
.*       ZERO: THE SPCA WAS SUCCESSFULLY RELEASED.                    * 03112002
.*       ZERO: THE SPCA WAS SUCCESSFULLY RELEASED.                    * 03120002
.*         -1: EITHER THE SPCA FOR THE SPECIFIED SUBPOOL COULD NOT BE * 03128002
.*             FOUND OR SUBPOOL ZERO IS SPECIFIED, AND THE SPCA FOR   * 03136002
.*             SUBPOOL ZERO CAN NOT BE RELEASED EXCEPT AT TASK        * 03144002
.*             TERMINATION TIME.                                      * 03152002
.*                                                                    * 03160002
.* ALL STORAGE ALLOCATED VIA THE GSPACE MACRO-INSTRUCTION IS ALLOCATED* 03168002
.* IN INCREMENTS OF 16 BYTES IN SIZE. THE LENGTH VALUE FOR THE REQUEST* 03176002
.* IS ROUNDED TO THE NEXT EXACT MULTIPLE OF 16 BYTES BEFORE THE       * 03184002
.* REQUEST IS PROCESSED.                                              * 03192002
.********************************************************************** 03200002
.*                                                                    * 03208002
.* THE VARIOUS PARAMETER MEANINGS ARE AS FOLLOWS:                     * 03216002
.*--------------------------------------------------------------------* 03224002
.* R     CODING "R" FOR THE R PARAMETER IMPLIES THE SAME FUNCTION AS  * 03232002
.*       THE R-FORM OF THE FREEMAIN MACRO-INSTRUCTION.                * 03240002
.*       IF "S" IS CODED FOR THE R-PARAMETER, THEN THE SPECIFIED SPACE* 03248002
.*       CONTROL AREA IS RELEASED VIA THE FREEMAIN MACRO-INSTRUCTION, * 03256002
.*       AND ALL THE SPACE ALLOCATED USING IT IS ALSO RELEASED.       * 03264002
.*       THE SPACE CONTROL AREA MAY BE SPECIFIED DIRECTLY BY CODING   * 03272002
.*       THE S PARAMETER, OR IMPLICITLY BY CODING THE SP PARAMETER.   * 03280002
.*                                                                    * 03288002
.*       NOTE THAT CODING THE SUBPOOL PARAMETER WILL ONLY RELEASE THE * 03296002
.*       SPACE FOR THE INDICATED SUBPOOL THAT HAS BEEN ALLOCATED VIA  * 03304002
.*       THE GSPACE MACRO-INSTRUCTION, AND DOES NOT ISSUE A FREEPOOL  * 03312002
.*       NOR DOES IT FREE THE SUBPOOL USING FREEMAIN. THEREFORE, IF   * 03320002
.*       ANY SPACE HAS BEEN ALLOCATED VIA THE GETMAIN MACRO-INSTRUCTION 03328002
.*       FOR THE SAME SUBPOOL, IT IS NOT RELEASED BY USING THE FSPACE * 03336002
.*       MACRO-INSTRUCTION. THE FSPACE MACRO-INSTRUCTION ONLY RELEASES* 03344002
.*       SPACE OBTAINED VIA THE GSPACE MACRO-INSTRUCTION.             * 03352002
.*                                                                    * 03360002
.*       THE RETURN CODES WHEN "S" IS CODED ARE AS FOLLOWS:           * 03368002
.* -1:   THE SPCIFIED SPACE CONTROL AREA COULD NOT BE FOUND.          * 03376002
.*  0:   THE SPECIFIED SPACE CONTROL AREA WAS SUCCESSFULLY RELEASED,  * 03384002
.*       AND ALL THE SPACE OBTAINED USING IT WAS ALSO RELEASED.       * 03392002
.*  1:   THE SPECIFIED SUBPOOL IS ZERO, THE SPACE CONTROL AREA IS NOT * 03400002
.*       EXPLICITLY CODED, AND THERE ARE SPACE CONTROL AREAS          * 03408002
.*       OTHER THAN FOR SUBPOOL ZERO PRESENT, WHICH PREVENTS RELEASING* 03416002
.*       THE SPACE CONTROL AREA FOR SUBPOOL ZERO.                     * 03424002
.*                                                                    * 03432002
.* NOTE: THE CONDITION CODE IS SET TO CORRESPOND TO THE RETURN CODE   * 03440002
.*       AS IF AN LTR 15,15 WAS THE LAST INSTRUCTION EXECUTED IN THE  * 03448002
.*       FSPACE MACRO-INSTRUCTION.                                    * 03456002
.*--------------------------------------------------------------------* 03464002
.* LV  - LV SPECIFIES THE LENGTH OF THE AREA TO BE RELEASED.          * 03472002
.*       THERE ARE FOUR BASIC WAYS TO CODE THE LV PARAMETER:          * 03480002
.* CASE  CODE FORM       MEANING                                      * 03488002
.* ----  ---- ----       -------                                      * 03496002
.*  0.   LV=NUMBER       NUMBER IS A DECIMAL NUMBER GIVING THE NUMBER * 03504002
.*                       OF BYTES TO BE RELEASED, OR IS AN ABSOLUTE   * 03512002
.*                       EXPRESSION, NOT SURROUNDED BY PARENTHESES,   * 03520002
.*                       THAT DETERMINES THE NUMBER OF BYTES TO BE    * 03528002
.*                       RELEASED.                                    * 03536002
.*  1.   LV=(GPR)        GPR IS AN ABSOLUTE EXPRESSION HAVING A VALUE * 03544002
.*                       FROM 1 TO 15, AND IS THE REGISTER CONTAINING * 03552002
.*                       THE NUMBER OF BYTES TO BE RELEASED.          * 03560002
.*  2.   LV=(ADDRESS,NUMBER)   ADDRESS IS THE MAIN STORAGE ADDRESS OF * 03568002
.*                       EITHER A 1-BYTE OR A HALFWORD FIELD THAT     * 03576002
.*                       CONTAINS THE LENGTH OF THE AREA.             * 03584002
.*                       LENGTH IS A 1 OR A 2, TO DETERMINE A 1-BYTE  * 03592002
.*                       OR HALFWORD FIELD RESPECTIVELY.              * 03600002
.*    IF LV=(ADDRESS,) IS CODED, THE LENGTH FIELD IS AN IMPLIED 1-BYTE* 03608002
.*                     FIELD.                                         * 03616002
.*  3.   LV=((ADR),LENGTH)     THIS CASE IS ESSENTIALLY THE SAME AS   * 03624002
.*                       THE PRECEDING CASE, EXCEPT THAT THE ADDRESS  * 03632002
.*                       OF THE LENGTH FIELD IS IN THE SPECIFIED GPR  * 03640002
.*                       ADR.                                         * 03648002
.*  4.   LV=   WHEN THE LENGTH VALUE IS NOT CODED, AND THE R PARAMETER* 03656002
.*             IS CODED AS "S", THEN THE SPACE CONTROL AREA SPECIFIED * 03664002
.*             BY THE S PARAMETER IS RELEASED TO THE SYSTEM, AND ALL  * 03672002
.*             THE SPACE OBTAINED VIA IT IS ALSO RELEASED.            * 03680002
.*             THE RELEASE OF THIS SPACE IS VIA FREEMAIN, SO THAT ANY * 03688002
.*             SUBSEQUENT REFERENCE TO ANY AREA ALLOCATED WITH THE    * 03696002
.*             SPACE CONTROL WORD IS INVALID, AS WELL AS ANY MORE USES* 03704002
.*             OF THE SPACE CONTROL ADDRESS WITH FSPACE OR GSPACE     * 03712002
.*             MACRO-INSTRUCTIONS.                                    * 03720002
.*  5.   IF THE R PARAMETER IS CODED AS "RF", AND THE LV IS EXPLICITLY* 03728002
.*             CODED AS A SELF-DEFINING TERM, THEN IF THE NUMERIC VALUE 03736002
.*             OF THE LENGTH IS 8, 12, OR 80, THE AREA IS RELEASED TO * 03744002
.*             FREE SPACE CHAIN OF FIXED LENGTH ENTRIES OF THE SAID   * 03752002
.*             LENGTH. THIS MEANS OF GETTING AND FREEING FIXED LENGTH * 03760002
.*             AREAS OF 8, 12, OR 80 BYTES IS VERY FAST.              * 03768002
.* A   - A SPECIFIES THE ADDRESS OF THE AREA OF STORAGE TO BE RELEASED. 03776002
.*    IF A=ADDRESS IS CODED, THEN "ADDRESS" MUST BE A SUITABLE OPERAND* 03784002
.*                 FOR A LOAD ADDRESS INSTRUCTION, AND IS THE ADDRESS * 03792002
.*                 OF THE FIRST BYTE OF THE AREA TO BE RELEASED.      * 03800002
.*    IF A=(GPR) IS CODED, THEN "GPR" MUST DESIGNATE A REGISTER THAT  * 03808002
.*               CONTAINS THE ADDRESS OF THE FIRST BYTE OF THE AREA TO* 03816002
.*               BE RELEASED.                                         * 03824002
.*--------------------------------------------------------------------* 03832002
.* REGISTERS 0,1,14, AND 15 ARE USED AS WORKING REGISTERS, AND ARE    * 03840002
.* NOT RESTORED TO THEIR ORIGINAL VALUES.                             * 03848002
.*--------------------------------------------------------------------* 03856002
.*       THE RETURN CODE SETTINGS ARE:                                * 03864002
.*       ZERO - THE AREA WAS RELEASED SUCCESSFULLY.                   * 03872002
.********************************************************************** 03880002
.* THE LENGTH VALUE IS PLACED IN GPR0, THE ADDRESS IS PLACED IN R1, AND 03888002
.* THE BOUNDARY ALIGNMENT VALUE IS PLACED IN R15. THEN THE FSPACE     * 03896002
.* SUBROUTINE IN THE MODULE IGARPT01 IS CALLED.                       * 03904002
         GBLC  &IGADDR   THE LOCATION CONTAINING THE ADDRESS OF THE     03912002
.*                       MODULE IGARPT01.                               03920002
         GBLC  &IGATCB   THE ADDTREE OF THE TCBRPT WORD.                03928002
         GBLC  &IGAFSP         BRANCH ENTRY OFFSET FOR FSPACE.          03936002
         GBLC  &IGAFSPS  OFFSET FOR THE BRANCH ENTRY TO THE FSPACE     *03944002
                         PROGRAM WHEN THE SPACE CONTROL ADDRESS IS     *03952002
                         CODED IN THE FSPACE MACRO-INSTRUCTION.         03960002
         GBLC  &IGAFS8,&IGAFS12,&IGAFS80  THESE ARE THE ENTRY POINTS TO*03968002
                         RELEASE FIXED LENGTH AREAS OF 8, 12, OR 80    *03976002
                         BYTES RESPECTIVELY USING AN SPCA.              03984002
         GBLC  &IGAFRSC  ENTRY POINT TO RELEASE A SPACE CONTROL AREA   *03992002
                         AND ITS ASSOCIATED SPACE TO THE SYSTEM.        04000002
         GBLC  &IGASPZ   THE SIZE OF THE SPACE CONTROL HEADER.          04008002
         LCLC  &C        JUST A TEMPORARY CHARACTER VECTOR.             04016002
         LCLA  &I        JUST A TEMPORARY ARITHMETIC VARIABLE USED FOR *04024002
                         SUNDRY PURPOSES.                               04032002
         LCLC  &O,&LKR                                                  04040002
&O       SETC  '0'                                                      04048002
&LKR     SETC  '14'                                                     04056002
.*A000000                                                        Y02147 04064002
.********************************************************************** 04072002
      RPTDSECT T=SPACE,DS=N  GET THE GLOBALS WITHOUT THE DSECT.         04080002
         AIF   (K'&TAG EQ 0).LJW0                                       04088002
&TAG     EQU   *                                                        04096002
.LJW0    ANOP                                                           04104002
         AIF   ('&R' EQ 'S').FRSPCTL  SEE IF THE REQUEST IS TO RELEASE *04112002
                         A SPACE CONTROL AREA.                          04120002
         AIF   ('&R' EQ 'RF').FIXED  SEE IF THE POSITIONAL PARAMETER   *04128002
                         INDICATES A RELEASE OF A FIXED LENGTH AREA.    04136002
.*       PUT THE LENGTH VALUE IN R0.                                  * 04144002
         AIF   (K'&LV NE 0).LVHERE  SEE IF THE LV IS CODED.             04152002
         MNOTE 12,'MISSING LENGTH VALUE, LV= MUST BE CODED.'            04160002
         AGO   .CHKA           GO CHECK THE ADDRESS.                    04168002
.LVHERE  AIF   ('&LV'(1,1) EQ '(').LV234  GO IF CASE 2, 3, OR 4.        04176002
         AIF   (NOT((K'&SP EQ 0)OR('&SP' EQ '0'))).SESPIL0             *04184002
                         SEE IF THE SUBPOOL IS SUBPOOL ZERO.            04192002
         LA    0,&LV     LV                                             04200002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          04208002
.SESPIL0 AIF   ('&SP'(1,1) EQ '(').SESPIL1  SEE IF THE SUBPOOL         *04216002
                         PARAMETER IS IN A REGISTER, AND GO IF IT IS.   04224002
         L     0,=AL1(&SP,&LV/X'10000',(&LV-X'10000'*(&LV/X'10000'))/X'*04232002
               100',&LV-X'100'*(&LV/X'100'))  LOAD THE SUBPOOL NUMBER  *04240002
               AND LENGTH VALUE IN THE REGISTER.                        04248002
         AGO   .CHKA                                                    04256002
.SESPIL1 LA    14,&LV    LENGTH VALUE.                                  04264002
         AIF   ('&SP' EQ '(0)').ERGIJ  SEE IF THE SUBPOOL IS ALREADY   *04272002
                         IN REGISTER ZERO.                              04280002
         LR    0,&SP(1)  SUBPOOL NUMBER.                                04288002
.ERGIJ   SLL   0,24      PUT THE SUBPOOL IN BYTE 0 OF GPR 0.            04296002
.********************************************************************** 04304002
.* THE FOLLOWING BXLE IS USED TO ADD THE SUBPOOL AND LENGTH TOGETHER  * 04312002
.* BECAUSE THE BXLE INSTRUCTION DOES NOT CHANGE THE CONDITION CODE.   * 04320002
.* THE DEL MACRO-INSTRUCTION DEPENDS ON THE FACT THAT THE FSPACE      * 04328002
.* MACRO-INSTRUCTION DOES NOT CHANGE THE CONDITION CODE BEFORE THE BAL* 04336002
.* TO THE FSPACE ROUTINE.                                             * 04344002
.********************************************************************** 04352002
.*                                                                    * 04360002
         BXLE  0,14,*+4  ADD IN THE SUBPOOL NUMBER.                     04368002
         AGO   .CHKA                                                    04376002
.LV234   AIF   (N'&LV EQ 1).LV2  SEE IF LV=(GPR) IS CODED.              04384002
         AIF   ('&LV'(2,1) EQ '(').LV4  SEE IF LV=((ADR),LNG) IS CODED. 04392002
         AIF   (K'&LV(2) EQ 0).LV3A    SEE IF LV=(ADR,) IS CODED.       04400002
.*       LV=(ADR,LNG) IS CODED.                                         04408002
         AIF   ('&LV(2)' EQ '1').LV3A  SEE IF LV=(ADR,1) IS CODED.      04416002
         AIF   ('&LV(2)' EQ '2').LV3B  SEE IF LV=(ADR,2) IS CODED.      04424002
         AIF   ('&LV(2)' EQ '4').LV3D  SEE IF "LV=(ADR,4)" IS CODED.    04432002
         MNOTE 12,'LV CODED WRONG, 1 OR 2 ONLY ALLOWED FOR LV LENGTH.'  04440002
         AGO   .CHKA           GO CHECK THE ADDRESS.                    04448002
.*  THE LENGTH OF THE LENGTH VALUE IS ONE.  .*                          04456002
.LV3A    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL2  GO IF THE      *04464002
                         SUBPOOL IS NOT SUBPOOL ZERO.                   04472002
         LA    0,0       GET THE LENGTH VALUE.                          04480002
.LV3AA   ANOP                                                           04488002
         IC    0,&LV(1)  FOR THE AREA TO BE RELEASED.                   04496002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          04504002
.SESPIL2 AIF   ('&SP'(1,1) EQ '(').SESPIL3  GO IF SP IS IN GPR.         04512002
         LA    0,&SP     SUBPOOL #.                                     04520002
         SLL   0,24      PUT IT IN BYTE 0 OF GPR 0.                     04528002
         AGO   .LV3AA    GO PUT IN THE LENGTH VALUE.                    04536002
.SESPIL3 AIF   ('&SP' EQ '(0)').LV3AAAA                                 04544002
         LR    0,&SP(1)  SUBPOOL #.                                     04552002
.LV3AAAA SLL   0,24      PUT THE SUBPOOL IN BYTE 0 OF GPR 0.            04560002
         AGO   .LV3AA                                                   04568002
.LV3B    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL4                 *04576002
                         SEE IF THE SUBPOOL IS ZERO, AND GO IF IT ISN'T.04584002
                                                                        04592002
         LH    0,&LV(1)  GET THE LENGTH VALUE.                          04600002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          04608002
.SESPIL4 AIF   ('&SP' EQ '(0)').SESPIL5  SEE IF IT IS IN GPR 0.         04616002
         AIF   ('&SP'(1,1) EQ '(').SESPIL6  SEE IF IT IS IN A GPR.      04624002
         LA    0,&SP     SUBPOOL #.                                     04632002
         AGO   .SESPIL5  GO GENERATE THE SHIFT INSTRUCTION.             04640002
.SESPIL6 LR    0,&SP(1)  SUBPOOL #.                                     04648002
.SESPIL5 SLL   0,24      PUT THE SUBPOOL # IN BYTE 0 OF GPR 0.          04656002
         LH    14,&LV(1)  GET THE LENGTH VALUE.                         04664002
         BXH   0,14,*+4  PRESERVE THE CONDITION CODE.                   04672002
         AGO   .CHKA                                                    04680002
.LV3D    ANOP                                                           04688002
         AIF   ((K'&SP NE 0)AND('&SP' NE '0')).LV3DNZ  SEE IF THE      *04696002
                         SUBPOOL IS SUBPOOL ZERO.                       04704002
         L     0,&LV(1)                        SUBPOOL AND LV.          04712002
         AGO   .CHKA                                                    04720002
.LV3DNZ  AIF   ('&SP'(1,1) EQ '(').LV3DSPR  SEE IF THE SUBPOOL NUMBER  *04728002
                         IS IN A REGISTER.                              04736002
         LA    0,&SP                           SUBPOOL #.               04744002
         SLL   0,24                                                     04752002
         L     14,&LV(1)                        LV.                     04760002
         BXH   0,14,*+X'04'  PRESERVE THE CONDITION CODE.               04768002
         AGO   .CHKA                                                    04776002
.LV3DSPR LR    0,&SP(1)                        SP #.                    04784002
         SLL   0,24                                                     04792002
         L     14,&LV(1)                        LV.                     04800002
         BXLE  0,14,*+X'04'  PRESERVE THE CONDITION CODE.               04808002
         AGO   .CHKA                                                    04816002
.*  LV=((ADR),LNG) IS CODED.  .*                                        04824002
.LV4     AIF   (K'&LV(2) EQ 0).LV4A  SEE IF LV=((ADR),) IS CODED.       04832002
         AIF   ('&LV(2)' EQ '1').LV4A  SEE IF LV=((ADR),1) IS CODED.    04840002
         AIF   ('&LV(2)' EQ '2').LV4B  SEE IF LV=((ADR),2) IS CODED.    04848002
         AIF   ('&LV(2)' EQ '4').LV4D  SEE IF "LV=((ADR),4)" IS CODED.  04856002
.*   LV=((ADR),EXPRESSION) IS CODED.  .*                                04864002
         MNOTE 12,'INVALID LENGTH OF LV OPERAND, LV=&LV.'               04872002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          04880002
.LV4A    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL7  GO IF SP^0.     04888002
         LA    0,0                                                      04896002
.LV4AA   ANOP                                                           04904002
         IC    0,0&LV(1)  GET THE LENGTH OF AREA.                       04912002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          04920002
.SESPIL7 AIF   ('&SP'(1,1) EQ '(').SESPIL8  GO IF SP IS IN A GPR.       04928002
         LA    0,&SP     SUBPOOL #.                                     04936002
.BEGRUDG SLL   0,24      PUT THE SUBPOOL # IN BYTE 0 OF GPR0.           04944002
         AGO   .LV4AA                                                   04952002
.SESPIL8 AIF   ('&SP' EQ '(0)').BEGRUDG  SEE IF THE SP# IS IN GPR 0.    04960002
         LR    0,&SP(1)  LOAD SUBPOOL # INTO GPR ZERO.                  04968002
         AGO   .BEGRUDG  GO SHIFT IT OVER INTO BYTE 0.                  04976002
.LV4B    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL9  GO IF SP# IS ^0 04984002
         LH    0,0&LV(1) LV=((ADR),1)                                   04992002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          05000002
.SESPIL9 AIF   ('&SP'(1,1) EQ '(').SESPILA  GO IF SP# IS IN A GPR.      05008002
         LA    0,&SP     SUBPOOL #.                                     05016002
         AGO   .SESPILB  GO SHIFT IT OVER INTO BYTE ZERO.               05024002
.SESPILA AIF   ('&SP' EQ '(0)').SESPILB  GO IF SP# IS ALREADY IN GPR 0. 05032002
         LR    0,&SP(1)  SUBPOOL #.                                     05040002
.SESPILB SLL   0,24      SHIFT IT OVER INTO BYTE ZERO.                  05048002
         LH    14,&LV(1)  LENGTH VALUE                                  05056002
         BXLE  0,14,*+4  KEEP THE CC.                                   05064002
         AGO   .CHKA                                                    05072002
.LV4D    ANOP                                                           05080002
         AIF   ((K'&SP NE 0)AND('&SP' NE '0')).LV4DNZ  SEE IF THE      *05088002
                         SUBPOOL IS SUBPOOL ZERO.                       05096002
         L     0,0&LV(1)                        SUBPOOL AND LV.         05104002
         AGO   .CHKA                                                    05112002
.LV4DNZ  AIF   ('&SP'(1,1) EQ '(').LV4DSPR  SEE IF THE SUBPOOL NUMBER  *05120002
                         IS IN A REGISTER.                              05128002
         LA    0,&SP                           SUBPOOL #.               05136002
         SLL   0,24                                                     05144002
         L     14,0&LV(1)                        LENGTH VALUE.          05152002
         BXLE  0,14,*+X'04'                                             05160002
         AGO   .CHKA                                                    05168002
.LV4DSPR LR    0,&SP(1)                        SP #.                    05176002
         SLL   0,24                                                     05184002
         AL    0,0&LV(1)                        LV.                     05192002
         AGO   .CHKA                                                    05200002
.LV2     AIF        (('&LV' EQ '(0)')AND((K'&SP EQ 0)OR('&SP' EQ '0')OR*05208002
               ('&SP' EQ '(0)'))).CHKA  GO IF THE SUBPOOL # AND LENGTH  05216002
.*             VALUE ARE ALREADY IN REGISTER 0, WHICH MEANS THAT      * 05224002
.*             "LV=(0)" IS CODED, AND THE SUBPOOL NUMBER DOESN'T HAVE * 05232002
.*             TO BE FILLED IN.                                       * 05240002
         AIF   (K'&SP NE 0).SESPILC  GO IF THE SUBPOOL # IS CODED.      05248002
         LR    0,&LV(1)  LV.                                            05256002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          05264002
.SESPILC AIF   ('&SP'(1,1) EQ '(').SESPILD  GO IF THE SP# IS IN A GPR.  05272002
         AIF   ('&LV' EQ '(0)').SESPILE  GO IF THE LENGTH IS IN R0.     05280002
         LA    0,&SP     SUBPOOL #.                                     05288002
         SLL   0,24      PUT THE SUBPOOL NUMBER IN BYTE 0.              05296002
         BXH   0,&LV(1),*+4  KEEP THE CC.                               05304002
         AGO   .CHKA                                                    05312002
.SESPILD AIF   ('&SP' EQ '(0)').SESPILF  GO IF SP# IS IN GPR 0.         05320002
         LR    0,&SP(1)  SUBPOOL#.                                      05328002
         AIF   ('&SP' EQ '&LV').CHKA  SEE IF THE SUBPOOL NUMBER AND THE*05336002
                         LENGTH VALUE ARE ALREADY IN THE SAME REGISTER. 05344002
.SESPILF SLL   0,24      PUT SP# IN BYTE 0 OF GPR ZERO.                 05352002
         BXH   0,&LV(1),*+4  PRESERVE THE CONDITION CODE.               05360002
         AGO   .CHKA                                                    05368002
.SESPILE LA    14,&SP    SUBPOOL NUMBER.                                05376002
         BXH   0,14,*+4                                                 05384002
         AGO   .CHKA                                                    05392002
.*********************************************************************. 05400002
.* THE LENGTH VALUE IS ALL ANALYZED AND LOADED, NOW GET THE ADDRESS.  * 05408002
.*********************************************************************. 05416002
.CHKA    AIF   (K'&A NE 0).AHERE   SEE IF A IS CODED.                   05424002
         MNOTE 12,'THE ADDRESS OF THE AREA IS MISSING; A= MUST BE HERE' 05432002
         AGO   .CHKB     GO CHECK THE BOUNDARY ALIGNMENT PARAMETER.     05440002
.AHERE   AIF   ('&A'(1,1) EQ '(').A1  SEE IF A=(ADR) IS CODED.          05448002
.*       A=ADDRESS IS CODED.                                            05456002
         LA    1,&A      AREA ADDRESS.                                  05464002
         AGO   .CHKB     GO CHECK THE BOUNDARY ALIGNMENT PARAMETER.     05472002
.*       A=(ADDRESS) IS CODED.                                          05480002
.A1      AIF   ('&A' EQ '(1)').CHKB  SEE IF A=(1) IS CODED.             05488002
         LR    1,&A(1)  AREA ADDRESS.                                   05496002
         AGO   .CHKB     GO CHECK THE BOUNDARY ALIGNMENT PARAMETER.     05504002
.*--------------------------------------------------------------------* 05512002
.CHKB    ANOP                                                           05520002
.*--------------------------------------------------------------------* 05528002
.* ALL THREE REGISTERS ARE SET UP, NOW LINK TO THE FSPACE SUBROUTINE. * 05536002
.*--------------------------------------------------------------------* 05544002
.LINK    ANOP                                                           05552002
         AIF   (K'&S EQ 0).LINKGEN  SEE IF THE SPACE ADDRESS IS CODED.  05560002
         AIF   ('&S'(1,1) EQ '(').LINKGPR  SEE IF THE SPACE ADDRESS IS *05568002
                         IN A GENERAL PURPOSE REGISTER.                 05576002
         L     15,&S  LOAD THE ADDRESS OF THE SPACE CONTROL AREA.       05584002
         L     14,0(,15)  LOAD THE ADDRESS OF IGARPT01.                 05592002
         AGO   .LINKTO   GO LINK TO THE FSPACE PROGRAM.                 05600002
.LINKGPR AIF   ('&S' EQ '(15)').LINKREG  SEE IF IT IS IN R15 ALREADY.   05608002
         LR    15,&S(1)  PUT THE ADDRESS OF THE SPACE CONTROL AREA IN  *05616002
               GENERAL REGISTER 15.                                     05624002
.LINKREG L     14,0(,15)  LOAD THE ADDRESS OF MODULE IGARPT01.          05632002
.LINKTO  ANOP                                                           05640002
         BAL   &LKR,&IGAFSPS.(,&LKR)  INDICATE SPCA PRESENT.            05648002
         AGO   .FIN                                                     05656002
.LINKGEN RPTDSECT GEN=(CVTRPT,15)  GET THE ADDRESS OF THE MODULE       *05664002
                         IGARPT01 IN REGISTER 15.                       05672002
         BAL   &LKR,&IGAFSP.(,15)  LINK TO FSPACE ROUTINE.              05680002
         AGO   .FIN                                                     05688002
.********************************************************************** 05696002
.* COME HERE WHEN "S" IS CODED IN THE R-PARAMETER.                    * 05704002
.********************************************************************** 05712002
.*                                                                    * 05720002
.FRSPCTL ANOP                                                           05728002
         AIF   (K'&S EQ 0).FSMT  SEE IF S IS CODED.                     05736002
         AIF   ('&S'(1,1) EQ '(').SFINGPR  SEE IF THE SPACE CONTROL    *05744002
                         AREA ADDRESS IS IN A GPR.                      05752002
         L     1,&S  SPACE CONTROL WORD.                                05760002
         AGO   .SISHERE  MERGE WITH THE COMMONE SEQUENCE AFTER THE     *05768002
                         SPACE CONTROL ADDRESS IS LOADED IN R1.         05776002
.SFINGPR AIF   ('&S' EQ '(1)').SISHERE  SEE IF IT IS ALREADY IN R1.     05784002
         LR    1,&S(1)   ADDRESS OF SPACE CONTROL AREA.                 05792002
         AGO   .SISHERE  MERGE IN WITH THE COMMON SEQUENCE.             05800002
.FSMT    LA    1,0       INDICATE NO SPACE CONTROL WORD.                05808002
.SISHERE AIF   (K'&SP EQ 0).FSIS0  SEE IF IT IS SUBPOOL ZERO.           05816002
         AIF   ('&SP' EQ '0').FSIS0  SEE IF IT IS SUBPOOL ZERO.         05824002
         LA    15,&SP    SUBPOOL #.                                     05832002
         SLL   15,24                                                    05840002
         LA    0,&IGASPZ                                                05848002
         BXH   0,15,*+4  KEEP THE CONDITION CODE.                       05856002
         AGO   .FLINK    GO LINK TO THE SUBROUTINE.                     05864002
.FSIS0   LA    0,&IGASPZ                                                05872002
.FLINK   AIF   (K'&S NE 0).FLINK0  SEE IF THE ADDRESS OF THE MODULE    *05880002
                         IGARPT01 IS AVAILABLE VIA THE SPACE CONTROL   *05888002
                         WORD.                                          05896002
      RPTDSECT GEN=(TCBRPT,15)  GET THE ADDRESS OF THE MODULE IGARPT01 *05904002
                         IN REGISTER 15.                                05912002
         AGO   .FLINK1   GO TO GENERATE THE ACTUAL LINK.                05920002
.FLINK0  L     15,&IGADDR.(,1)  ADDRESS OF IGARPT01.                    05928002
.FLINK1  BAL   14,&IGAFRSC.(,15)  LINK TO RELEASE SPACE CONTROL AREA.   05936002
         AIF   (K'&S EQ 0).FIN  SEE IF THE SPCA IS EXPLICITLY CODED.    05944002
         AIF   ('&S'(1,1) EQ '(').FLINK2  SEE IF THE SPCA ADDRESS IS IN*05952002
                         A GPR.                                         05960002
         ST    15,&S              RESET THE SPCA ADDRESS.               05968002
         AGO   .FIN                                                     05976002
.FLINK2  LR    &S(1),15              RESET THE SPCA ADDRESS.            05984002
         AGO   .FIN      GO DIRECTLY TO THE EXIT FOR THE FSPACE        *05992002
                         MACRO-INSTRUCTION.                             06000002
.********************************************************************** 06008002
.* COME HERE TO GENERATE THE LINKAGE TO RELEASE A FIXED LENGTH AREA   * 06016002
.* USING THE FIXEDHDR IN THE SPACE CONTROL AREA. ONLY AREAS OF LENGTH * 06024002
.* 8, 12, OR 80 CAN BE RELEASED IN THIS MANNER. ALSO THE SPACE CONTROL* 06032002
.* AREA ADDRESS MUST BE SPECIFIED BY CODING THE S PARAMETER IN ORDER  * 06040002
.* TO DO IT.                                                          * 06048002
.********************************************************************** 06056002
.FIXED   ANOP                                                           06064002
         AIF   ((K'&A NE 0)AND(K'&S NE 0)AND(K'&LV NE 0)).FIXEDOK      *06072002
                         SEE IF ALL THE NECESSARY PARAMETERS ARE CODED. 06080002
         AIF   (K'&A NE 0).FXAOK  SEE IF IT IS THE A PARAMETER THAT IS *06088002
                         NOT CODED.                                     06096002
         MNOTE 12,'ADDRESS OF AREA TO RELEASE IS MISSING -- A PARAMETER*06104002
               .'                                                       06112002
.FXAOK   ANOP                                                           06120002
         AIF   (K'&S NE 0).FXSOK  SEE IF THE S PARAMETER IS MISSING.    06128002
         MNOTE 12,'THE S PARAMETER MUST BE CODED FOR FSPACE RF,...'     06136002
.FXSOK   ANOP                                                           06144002
         AIF   (K'&LV NE 0).FXLVOK  SEE IF THE LENGTH VALUE PARAMETER  *06152002
                         IS MISSING.                                    06160002
         MNOTE 12,'LENGTH VALUE IS MISSING -- LV PARAMETER.'            06168002
.FXLVOK  ANOP                                                           06176002
         AGO   .FIN   EXIT BECAUSE THE IS NO HOPE OF CORRECT EXECUTION. 06184002
.********************************************************************** 06192002
.* CHECK THE LENGTH VALUE TO SEE IF IT IS 8, 12, OR 80.               * 06200002
.********************************************************************** 06208002
.FIXEDOK ANOP                                                           06216002
         AIF   (('&LV' EQ '8')OR('&LV' EQ '12')OR('&LV' EQ '80')OR('&LV*06224002
               ' EQ 'X''8''')OR('&LV' EQ 'X''C''')OR('&LV' EQ 'X''50'''*06232002
               )).FXLOK                                                 06240002
         MNOTE 12,'THE LENGTH VALUE MUST BE 8, 12, OR 80 TO USE THE RF *06248002
               FORM OF FSPACE.'                                         06256002
         AGO   .FIN                                                     06264002
.FXLOK   ANOP                                                           06272002
.********************************************************************** 06280002
.* PUT THE ADDRESS OF THE AREA TO BE RELEASED IN GPR 1.               * 06288002
.********************************************************************** 06296002
         AIF   ('&A'(1,1) EQ '(').FXAGPR  SEE IF THE ADDRESS IS IN A   *06304002
                         GENERAL REGISTER.                              06312002
         LA    1,&A      ADDRESS OF AREA TO BE RELEASED.                06320002
         AGO   .FXGOTA   MERGE WITH THE COMMON SEQUENCE.                06328002
.FXAGPR  AIF   ('&A' EQ '(1)').FXGOTA  SEE IF THE ADDRESS IS ALREADY IN*06336002
                         THE RIGHT REGISTER.                            06344002
         LR    1,&A(1)   AREA ADDRESS.                                  06352002
.FXGOTA  ANOP                                                           06360002
.********************************************************************** 06368002
.* GET THE ADDRESS OF THE SPCA IN REGISTER 15, AND GET THE ADDRESS OF * 06376002
.* THE MODULE IGARPT01 IN REGISTER 14 FOR THE LINKAGE.                * 06384002
.********************************************************************** 06392002
         AIF   ('&S'(1,1) EQ '(').FXSGPR  SEE IF THE SPACE CONTROL     *06400002
                         ADDRESS IS IN A GENERAL REGISTER.              06408002
         L     15,&S     SPCA ADDRESS.                                  06416002
         AGO   .FXGOTS   MERGE WITH THE COMMON PATH.                    06424002
.FXSGPR  AIF   ('&S' EQ '(15)').FXGOTS  SEE IF IT IS ALREADY IN THE    *06432002
                         RIGHT REGISTER.                                06440002
         LR    15,&S(1)  THE ADDRESS OF THE SPCA.                       06448002
.FXGOTS  ANOP                                                           06456002
         L     14,&IGADDR.(,15)  ADDRESS OF IGARPT01.                   06464002
.********************************************************************** 06472002
.* NOW CHECK THE LENGTH VALUE TO SEE WHICH ONE OF THE LENGTHS IS      * 06480002
.* INVOLVED; 8, 12, OR 80.                                            * 06488002
.********************************************************************** 06496002
         AIF   (('&LV' EQ '8')OR('&LV' EQ 'X''8''')).FXLV8  SEE IF IT  *06504002
                         IS 8 BYTES.                                    06512002
         AIF   (('&LV' EQ '80')OR('&LV' EQ 'X''50''')).FXLV80          *06520002
                         SEE IF IT IS AN 80-BYTE AREA.                  06528002
         BAL   14,&IGAFS12.(,14)  LINK TO RELEASE THE 12-BYTE AREA.     06536002
         AGO   .FIN      ALL DONE NOW, EXIT.                            06544002
.FXLV8   BAL   14,&IGAFS8.(,14)  LINK TO RELEASE THE 8-BYTE AREA.       06552002
         AGO   .FIN                                                     06560002
.FXLV80  BAL   14,&IGAFS80.(,14)  LINK TO RELEASE THE 80-BYTE AREA.     06568002
         AGO   .FIN                                                     06576002
.FIN     ANOP                                                           06584002
         MEND                                                           06592002
         EJECT                                                          06600002
         MACRO                                                          06608002
&TAG    FTREE  &TREE,&T=,&TYPE=,&S=,&SP=,&LV=                           06616002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *06624002
                         OF RPT ENTRY POINTS.                           06632002
         GBLC  &IGAFTRE                                                 06640002
         GBLC  &IGADDR         THE ADDRESS OF THE MODULE.               06648002
         GBLC  &IGAHVFC  THE OFFSET IN THE RPT HEADER TO THE ADDRESS OF*06656002
                         THE FIXEDHDR FOR THE INNER VERTEX SPACE CHAIN. 06664002
         GBLC  &IGARPT#  THIS HOLDS THE RADIX PARTITION TREE TYPE.      06672002
.*A000000                                                        Y02147 06680002
.* THE FTREE MACRO-INSTRUCTION DELETES ALL THE KEY-ADDRESS ASSOCIATION* 06688002
.* PAIRS FROM A RADIX PARTITION TREE.                                 * 06696002
.* IF THE LV PARAMETER IS CODED IT IS PASSED ON THE THE DEL           * 06704002
.* MACRO-INSTRUCTION TO BE USED FOR RELEASING THE RECORD AREAS TO THE * 06712002
.* SYSTEM, AS DESCRIBED IN THE DESCRIPTION OF THE DEL                 * 06720002
.* MACRO-INSTRUCTION.                                                 * 06728002
.* THE VARIOUS PARAMETERS ARE DESCRIBED BELOW:                        * 06736002
.* TREE: THIS SPECIFIES THE ADDRESS OF THE RADIX PARTITION TREE AS    * 06744002
.*       RECEIVED FROM THE STREE MACRO-INSTRUCTION WHEN THE TREE IS   * 06752002
.*       CONSTRUCTED. IF "LABEL" IS CODED, WHERE "LABEL" IS A LABEL OF* 06760002
.*       A WORD IN STORAGE, THEN THE ADDRESS IS LOADED FROM THE       * 06768002
.*       DESIGNATED WORD. IF "(GPR)" IS CODED, THEN THE ADDRESS IS    * 06776002
.*       TAKEN FROM THE DESIGNATED GPR.                               * 06784002
.* T:    THIS SPECIFIES THE RADIX PARTITION TREE TYPE, IF IT IS NOT   * 06792002
.*       CODED THE DEFAULT TYPE IS 8.                                 * 06800002
.* S:    S IS THE SPACE CONTROL ADDRESS, AS DESCRIBED IN THE GSPACE   * 06808002
.*       MACRO-INSTRUCTION.                                           * 06816002
.* SP:   SEE THE DESCRIPTION OF THE FSPACE MACRO-INSTRUCTION.         * 06824002
.* LV:   SEE THE DESCRIPTION OF THE LV PARAMETER IN THE DEL           * 06832002
.*       MACRO-INSTRUCTION DESCRIPTION.                               * 06840002
.********************************************************************** 06848002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 06856002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 06864002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 06872002
.* TYPE CHECKING SECTION.                                             * 06880002
.********************************************************************** 06888002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    06896002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *06904002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     06912002
.********************************************************************** 06920002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 06928002
.* AND IF THEY ARE NOT THEN USE T.                                    * 06936002
.********************************************************************** 06944002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*06952002
                         T.                                             06960002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       06968002
.RPT#TCK ANOP                                                           06976002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              06984002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *06992002
                         PARTITION TREE TYPE.                           07000002
.********************************************************************** 07008002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 07016002
.********************************************************************** 07024002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *07032002
                         RPT.                                           07040002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *07048002
                         THE TYPE PARAMETER.                            07056002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      07064002
.RPT#8   ANOP                                                           07072002
&IGARPT# SETC  '8'       SET THE RPT TYPE TO 8.                         07080002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*07088002
               Q '4')).RPT#FIN                                          07096002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    07104002
&IGARPT# SETC  '8'       TAKE THE DEFAULT TYPE 8 RPT.                   07112002
.RPT#FIN ANOP                                                           07120002
      RPTDSECT T=&IGARPT#,DS=YES                                        07128002
         AIF   ('&IGARPT#' EQ '8').TYPE8  SEE IF IT IS A TYPE 8 RPT.    07136002
         AIF   (K'&TREE EQ K'&TREE(1)+2).LW0                            07144002
&TAG     L     1,&TREE                                                  07152002
         AGO   .LW1                                                     07160002
.LW0     AIF   ('&TREE' EQ '(1)').IFBR                                  07168002
&TAG     LR    1,&TREE(1)                                               07176002
         AGO   .LW1                                                     07184002
.IFBR    AIF   (K'&TAG EQ 0).LW1                                        07192002
&TAG     EQU   *                                                        07200002
.LW1     ANOP                                                           07208002
SRCH&SYSNDX SRCH (1),TYPE=5,SARG=((0))                                  07216002
         LTR   15,15                                                    07224002
         BC    4,OVER&SYSNDX                                            07232002
         DEL   (1),TYPE=5,FREE=NO                                       07240002
         BC    15,SRCH&SYSNDX                                           07248002
OVER&SYSNDX    EQU       *                                              07256002
         USING IGARPTH5,1                                               07264002
         L     2,IGAHVFC5                                               07272002
         IC    0,IGASP5                                                 07280002
         SLL   0,24                                                     07288002
         AL    0,=AL4(IGATYP5S)                                         07296002
     FREEMAIN R,LV=(0),A=(1)                                            07304002
         N     0,=XL4'FF000000'                                         07312002
         AL    0,=F'8'                                                  07320002
FREE&SYSNDX LTR 1,2                                                     07328002
         BC    8,DONE&SYSNDX                                            07336002
         L     2,0(2)                                                   07344002
     FREEMAIN R,LV=(0),A=(1)                                            07352002
         BC    15,FREE&SYSNDX                                           07360002
DONE&SYSNDX EQU *                                                       07368002
         DROP 1                                                         07376002
         MEXIT                                                          07384002
.NOT5    ANOP                                                           07392002
.TYPE8   ANOP                                                           07400002
&TAG     ISCAN &TREE                                                    07408002
LW&SYSNDX SCANL &TREE                                                   07416002
         BM    LJW&SYSNDX                                               07424002
         DEL   &TREE,T=&IGARPT#,S=&S,SP=&SP,LV=&LV                      07432002
         BNM   LW&SYSNDX  GO BACK IF IT WAS NOT THE LAST ONE.           07440002
         USING IGARPTH,0                                                07448002
         AIF   ('&TREE'(1,1) EQ '(').FTRGPR  SEE IF THE TREE ADDRESS IS*07456002
                         IN A GPR.                                      07464002
         L     1,&TREE                 ADDRESS OF RPT.                  07472002
         AGO   .FTRMERG  MERGE IN WITH THE COMMON SEQUENCE.             07480002
.FTRGPR  LR    1,&TREE(1)                        ADDRESS OF TREE.       07488002
.FTRMERG L     15,&IGAHVFC             INNVER VERTEX ALLOCATION BLOCK.  07496002
         L     15,4(,15)               SUBPOOL # FOR TREE HEADER.       07504002
         N     15,=XL4'00FFFFFF'                                        07512002
         LA    0,IGATYP8S                                               07520002
         ALR   0,15                                                     07528002
LJW&SYSNDX FSPACE R,A=(1),LV=(0),S=&S            FREE HEADER.           07536002
         DROP  0                                                        07544002
.END     ANOP                                                           07552002
         MEND                                                           07560002
         EJECT                                                          07568002
         MACRO                                                          07576002
&TAG    GSPACE &R,&LV=,&S=,&SP=                                         07584002
.* THIS MACRO ALLOCATES AN AREA OF MAIN STORAGE OF THE SIZE INDICATED * 07592002
.* BY THE LV PARAMETER, USING THE LOCAL STORAGE MANAGEMENT ROUTINES IN* 07600002
.* THE MODULE IGARPT01.                                               * 07608002
.*                                                                    * 07616002
.*             LOCAL STORAGE ALLOCATION                               * 07624002
.*             ----- ------- ----------                               * 07632002
.*                                                                    * 07640002
.* THE GSPACE AND FSPACE MACRO-INSTRUCTIONS ARE THE INTERFACE TO THE  * 07648002
.* LOCAL STORAGE ALLOCATION FUNCTIONS IN THE RPTS COMPONENT OF THE    * 07656002
.* OPERATING SYSTEM.                                                  * 07664002
.*                                                                    * 07672002
.* THE GSPACE AND FSPACE MACRO-INSTRUCTIONS PROVIDE FUNCTIONS THAT ARE* 07680002
.* EQUIVALENT TO THE R-FORM OF THE GETMAIN AND FREEMAIN               * 07688002
.* MACRO-INSTRUCTIONS, BUT ARE SIGNIFICANTLY FASTER THAN GETMAIN AND  * 07696002
.* FREEMAIN. THE GSPACE MACRO-INSTRUCTION ALLOCATES SPACE, AND THE    * 07704002
.* FSPACE MACRO-INSTRUCTION RELEASES SPACE TO THE SYSTEM.             * 07712002
.*                                                                    * 07720002
.* AS THE NAME "LOCAL STORAGE ALLOCATION" IMPLIES, THE GSPACE AND     * 07728002
.* FSPACE MACRO-INSTRUCTIONS ALLOCATE AND RELEASE VIRTUAL STORAGE ON A* 07736002
.* LOCAL BASIS. THE GSPACE AND FSPACE MACRO-INSTRUCTIONS ALLOCATE AND * 07744002
.* RELEASE STORAGE IN A LOCAL COLLECTION OF STORAGE AREAS DEFINED BY A* 07752002
.* SPACE CONTROL AREA (SPCA). EACH SPCA IS IDENTIFIED BY ITS VIRTUAL  * 07760002
.* STORAGE ADDRESS, WHICH IS KEPT IN A WORD CALLED THE ADDRESS OF THE * 07768002
.* SPACE CONTROL AREA, OR THE SPACE CONTROL WORD (SPCW). THE SPCA     * 07776002
.* CONTAINS ENOUGH INFORMATION TO IDENTIFY THE AVAILABLE STORAGE AREAS* 07784002
.* IN THE COLLECTION OF AREAS DEFINED BY THE SPCA.                    * 07792002
.*                                                                    * 07800002
.* EVERY TIME THE GSPACE AND FSPACE MACRO-INSTRUCTIONS ARE EXECUTED,  * 07808002
.* THEY USE THE ADDRESS OF THE SPCA TO DETERMINE THE COLLECTION OF    * 07816002
.* STORAGE AREAS THAT PARTICIPATE IN THE ALLOCATION OR RELEASE OF AN  * 07824002
.* AREA OF STORAGE. THE S PARAMETER IN THE GSPACE AND FSPACE          * 07832002
.* MACRO-INSTRUCTIONS SPECIFIES THE ADDRESS OF THE SPCA TO BE USED.   * 07840002
.*                                                                    * 07848002
.* SINCE EVERY ALLOCATION OR RELEASE OF STORAGE USES AN SPCA, AN SPCA * 07856002
.* MUST BE ESTABLISHED BEFORE ANY ALLOCATION CAN BE DONE. THERE ARE   * 07864002
.* TWO WAYS OF ESTABLISHING AND USING AN SPCA; THE EXPLICIT MODE AND  * 07872002
.* THE IMPLICIT MODE.                                                 * 07880002
.*                                                                    * 07888002
.* IN THE EXPLICIT MODE, THE SPCA IS ESTABLISHED BY USING THE GSPACE  * 07896002
.* MACRO-INSTRUCTION WITH THE POSITIONAL PARAMETER CODED AS "S" OR    * 07904002
.* "SC", WHICH CREATES AN SPCA AND STORES THE ADDRESS OF THE SPCA IN  * 07912002
.* THE PLACE SPECIFIED BY THE S PARAMETER. THE THE S PARAMETER MUST BE* 07920002
.* CODED ON ALL SUBSEQUENT GSPACE AND FSPACE USES OF THE LOCAL        * 07928002
.* COLLECTION OF STORAGE DEFINED BY THE SPCA.                         * 07936002
.* THE FOLLOWING EXAMPLE ILLUSTRATES HOW A SPACE CONTROL AREA CAN BE  * 07944002
.* ESTABLISHED, USED, AND RELEASED USING THE EXPLICIT MODE:           * 07952002
.*                                                                    * 07960002
.*       GSPACE S,S=(9)  ESTABLISH AN SPCA AND SAVE ITS ADDRESS IN    * 07968002
.*                       REGISTER 9.                                  * 07976002
.*       GSPACE R,LV=200,S=(9)  ALLOCATE 200 BYTES USING THE SPCA.    * 07984002
.*       LR     3,1      SAVE THE ADDRESS OF THE AREA ALLOCATED.      * 07992002
.*       GSPACE R,LV=256,S=(9)  ALLOCATE 256 BYTES USING THE SPCA.    * 08000002
.*       LR     4,1      SAVE THE ADDRESS OF THE 256-BYTE AREA        * 08008002
.*                       ALLOCATED.                                   * 08016002
.*       FSPACE R,S=(9),LV=200,A=(3) RELEASE THE 200-BYTE AREA TO THE * 08024002
.*              SYSTEM.                                               * 08032002
.*       FSPACE S,S=(9)         RELEASE THE SPACE CONTROL AREA TO THE * 08040002
.*                       SYSTEM, AS WELL AS ALL STORAGE ASSOCIATED    * 08048002
.*                       WITH IT (IN THIS CASE THE 256-BYTE AREA IS   * 08056002
.*                       RELEASED ALONG WITH THE SPCA). NO FUTURE     * 08064002
.*                       EXECUTIONS OF GSPACE OR FSPACE ARE VALID     * 08072002
.*                       AFTER THE SPCA HAS BEEN RELEASED VIA THE     * 08080002
.*                       FSPACE MACRO-INSTRUCTION.                    * 08088002
.*                                                                    * 08096002
.* IN THE EXPLICT MODE THE SUBPOOL FOR THE STORAGE CAN BE SPECIFIED   * 08104002
.* WHEN THE SPCA IS ESTABLISHED BY CODING THE SP PARAMETER IN THE     * 08112002
.* GSPACE MACRO-INSTRUCTION. THUS IF "GSPACE S,S=(9),SP=23" HAD BEEN  * 08120002
.* CODED IN THE FIRST GSPACE IN THE EXAMPLE, SUBPOOL 23 WOULD BE USED * 08128002
.* FOR ALLOCATING THE SPCA, AND THE 200 AND 256-BYTE AREAS WOULD ALSO * 08136002
.* BE ALLOCATED USING SUBPOOL 23.                                     * 08144002
.* THE TWO GSPACE ALLOCATIONS FOR THE 200 BYTES AND THE 256 BYTES NEED* 08152002
.* NOT HAVE THE SP PARAMETER CODED, SINCE THE SPCA USED ALREADY       * 08160002
.* CONTAINS THE SUBPOOL TO BE USED. IF THE SP PARAMETER IS CODED IN   * 08168002
.* THE EXPLICIT MODE, IT IS IGNORED, AND THE SUBPOOL IN THE SPCA IS   * 08176002
.* USED.                                                              * 08184002
.*                                                                    * 08192002
.* IN THE IMPLICIT MODE, THERE IS ONE SPCA FOR EACH COLLECTION OF     * 08200002
.* STORAGE DEFINED, AND EACH COLLECTION OF STORAGE CORRESPONDS TO A   * 08208002
.* SUBPOOL BEING USED FOR ALLOCATION AND RELEASE OF SPACE. THE        * 08216002
.* COLLECTION OF SPCA'S IS LOCATED BY MEANS OF A WORD IN THE CURRENT  * 08224002
.* TASK CONTROL BLOCK (TCBRPT). THE SPCA FOR THE SUBPOOL SPECIFIED BY * 08232002
.* THE REQUEST IS FOUND BY EXAMINING THE TCB-ADDRESSED COLLECTION. IF * 08240002
.* THERE IS NO SPCA FOR THE REQUEST SUBPOOL, THEN ONE IS ESTABLISHED  * 08248002
.* AUTOMATICALLY AND ADDED TO THE TCB-ADDRESSED COLLECTION.           * 08256002
.* WHEN USING THE GSPACE AND FSPACE MACRO-INSTRUCTIONS IN THE IMPLICIT* 08264002
.* MODE THE S PARAMETER IS NEVER CODED. THE SP PARAMETER IS USED TO   * 08272002
.* LOCATE THE APPROPRIATE SPCA.                                       * 08280002
.*                                                                    * 08288002
.* THE EXAMPLE ABOVE, WITH THE S PARAMETER NOT CODED ON ANY           * 08296002
.* MACRO-INSTRUCTION, WOULD ESTABLISH AN SPCA FOR SUBPOOL ZERO,       * 08304002
.* ALLOCATE THE TWO AREAS USING IT, RELEASE THE 200-BYTE AREA, AND    * 08312002
.* THEN RELEASE THE SPCA FOR SUBPOOL ZERO ALONG WITH THE 256-BYTE     * 08320002
.* AREA.                                                              * 08328002
.*                                                                    * 08336002
.* IN THE IMPLICIT MODE, AN SPCA FOR SUBPOOL ZERO MUST ALWAYS EXIST   * 08344002
.* FOR CORRECT OPERATION OF THE LOCAL STORAGE ALLOCATION ROUTINES. THE* 08352002
.* SPCA FOR SUBPOOL ZERO IS ESTABLISHED BEFORE ANY SPCA FOR ANY OTHER * 08360002
.* SUBPOOL. THE FOLLOWING EXAMPLE ILLUSTRATES HOW TO USE THE LOCAL    * 08368002
.* STORAGE ALLOCATION FACILITY FOR SUBPOOL 127, AND THEN RELEASE THE  * 08376002
.* SPCA FOR SUBPOOL 127 FROM THE TCB-ADDRESSED COLLECTION:            * 08384002
.*                                                                    * 08392002
.*       GSPACE S,SP=127,LV=200  ALLOCATE 200 BYTES USING THE SPCA FOR* 08400002
.*                       SUBPOOL 127 (WHICH IS CREATED WITH THIS      * 08408002
.*                       REQUEST).                                    * 08416002
.*       LR     3,1     SAVE THE ADDRESS OF THE AREA ALLOCATED.       * 08424002
.*       GSPACE R,LV=256,SP=127  ALLOCATE 256 BYTES USING SUBPOOL 127.* 08432002
.*       FSPACE R,LV=200,SP=127,A=(3)  RELEASE THE 200-BYTE AREA.     * 08440002
.*       FSPACE S,SP=127  RELEASE THE SPCA FOR SUBPOOL 127, AND       * 08448002
.*                       RELEASE ALL STORAGE ALLOCATED USING IT.      * 08456002
.*                                                                    * 08464002
.* AT THIS POINT THERE IS STILL AN SPCA FOR SUBPOOL ZERO. IF NO       * 08472002
.* SUBSEQUENT ALLOCATION OR RELEASE IS DONE, AND THE TASK TERMINATES, * 08480002
.* THE STORAGE IS AUTOMATICALLY RELEASED AT TASK TERMINATION TIME.    * 08488002
.* THE SPCA FOR SUBPOOL ZERO CANNOT BE RELEASED EXCEPT AT TASK        * 08496002
.* TERMINATION TIME.                                                  * 08504002
.*                                                                    * 08512002
.* SINCE THE SPCA FOR THE SPECIFIED SUBPOOL MAY NOT BE IN THE         * 08520002
.* COLLECTION DEFINED BY THE TCB, THE FOLLOWING RETURN CODES ARE      * 08528002
.* PROVIDED:                                                          * 08536002
.*                                                                    * 08544002
.*                                                                    * 08552002
.*       CODE: MEANING:                                               * 08560002
.*       ----- --------                                               * 08568002
.*       ZERO: THE SPCA WAS SUCCESSFULLY RELEASED.                    * 08576002
.*       ZERO: THE SPCA WAS SUCCESSFULLY RELEASED.                    * 08584002
.*         -1: EITHER THE SPCA FOR THE SPECIFIED SUBPOOL COULD NOT BE * 08592002
.*             FOUND OR SUBPOOL ZERO IS SPECIFIED, AND THE SPCA FOR   * 08600002
.*             SUBPOOL ZERO CAN NOT BE RELEASED EXCEPT AT TASK        * 08608002
.*             TERMINATION TIME.                                      * 08616002
.*                                                                    * 08624002
.* ALL STORAGE ALLOCATED VIA THE GSPACE MACRO-INSTRUCTION IS ALLOCATED* 08632002
.* IN INCREMENTS OF 16 BYTES IN SIZE. THE LENGTH VALUE FOR THE REQUEST* 08640002
.* IS ROUNDED TO THE NEXT EXACT MULTIPLE OF 16 BYTES BEFORE THE       * 08648002
.* REQUEST IS PROCESSED.                                              * 08656002
.********************************************************************** 08664002
.*                                                                    * 08672002
.* THE VARIOUS PARAMETER MEANINGS ARE AS FOLLOWS:                     * 08680002
.*--------------------------------------------------------------------* 08688002
.*  R  - THE R PARAMETER IS USED TO INDICATE A CONDITIONAL OR AN      * 08696002
.*       UNCONDITIONAL REQUEST.                                       * 08704002
.*                                                                    * 08712002
.*       IF "R" IS CODED THE REQUEST IS UNCONDITIONAL.                * 08720002
.*       IF "RC"IS CODED THE REQUEST IS CONDITIONAL.                  * 08728002
.*       THE ADDRESS OF THE SPACE ALLOCATED IS RETURNED IN R1.        * 08736002
.*       THE RETURN CODE IN REGISTER 15 IS SET TO ZERO IF THE REQUEST * 08744002
.*       WAS SATISFIED, OR TO 4 IF THE REQUEST WAS NOT SATISFIED.     * 08752002
.*                                                                    * 08760002
.*       THE ADDRESS OF THE SPACE OBTAINED IS RETURNED IN REGISTER 1. * 08768002
.*       IF "S" IS CODED, THEN A SPACE CONTROL AREA IS ESTABLISHED FOR* 08776002
.*       SUBSEQUENT USE WITH THE GSPACE AND FSPACE MACRO-INSTRUCTIONS.* 08784002
.*                                                                    * 08792002
.*       WHEN THE SPACE CONTROL OPTION IS USED, YOU SHOULD BE SURE    * 08800002
.*       THAT ALL SUBSEQUENT REFERENCES TO THE SPACE ARE BY MEANS OF  * 08808002
.*       THE ADDRESS OF THE SPACE CONTROL AREA THAT IS RETURNED BY THE* 08816002
.*       GSPACE MACRO-INSTRUCTION.                                    * 08824002
.*                                                                    * 08832002
.*       IN PARTICULAR, THE STREE MACRO-INSTRUCTION MUST HAVE THE S   * 08840002
.*       PARAMETER CODED IF THE GSPACE MACRO-INSTRUCTION IS USED TO   * 08848002
.*       ESTABLISH THE SPACE CONTROL AREA.                            * 08856002
.*       NOTE THAT THE STREE MACRO-INSTRUCTION IS NOT PART OF THE     * 08864002
.*       GSPACE/FSPACE PAIR, AND IS ONLY MENTIONED HERE BECAUSE IT HAS* 08872002
.*       A PARAMETER S THAT CAN BE USED TO SPECIFY A SPACE CONTROL    * 08880002
.*       AREA OBTAINED VIA THE GSPACE MACRO-INSTRUCTION.              * 08888002
.*                                                                    * 08896002
.*       IF "SC" IS CODED AND THE LV PARAMETER IS CODED, AFTER THE    * 08904002
.*       SPACE CONTROL AREA IS ESTABLISHED AN AREA OF THE INDICATED   * 08912002
.*       LENGTH IS ALLOCATED USING THE NEW SPACE CONTROL AREA, AND    * 08920002
.*       THIS ALLOCATION IS CONDITIONAL. IF "S" IS CODED AND THE LV   * 08928002
.*       PARAMETER IS CODED, THE REQUEST FOR THE AREA OF THE SPECIFIED* 08936002
.*       LENGTH IS UNCONDITIONAL.                                     * 08944002
.*                                                                    * 08952002
.*       THE ALLOCATION OF THE SPACE CONTROL AREA IS ALWAYS AN        * 08960002
.*       UNCONDITIONAL REQUEST (I.E. AN UNCONDITIONAL GETMAIN IS      * 08968002
.*       USED).                                                       * 08976002
.*                                                                    * 08984002
.*       IF THE S PARAMETER IS CODED, IT MAY DESIGNATE EITHER A GPR OR* 08992002
.*       A MAIN STORAGE LOCATION; THE CONVENTION USED IS THAT         * 09000002
.*       SURROUNDING THE OPERAND WITH PARENTHESES DESIGNATES A GPR    * 09008002
.*       THAT CONTAINS THE ADDRESS OF THE SPACE CONTROL AREA.         * 09016002
.*       IF "S" OR "SC" IS CODED AND THE S PARAMETER IS CODED, THE    * 09024002
.*       ADDRESS OF THE NEW SPACE CONTROL AREA IS STORED INTO THE     * 09032002
.*       DESIGNATED GPR OR MAIN STORAGE LOCATION.                     * 09040002
.*                                                                    * 09048002
.*--------------------------------------------------------------------* 09056002
.* LV    LV SPECIFIES THE LENGTH OF THE AREA TO BE ALLOCATED.         * 09064002
.*       THERE ARE FOUR BASIC WAYS TO CODE THE LV PARAMETER:          * 09072002
.* CASE  CODE FORM       MEANING                                      * 09080002
.* ----  ---- ----       -------                                      * 09088002
.*  0.   LV=NUMBER       NUMBER IS A DECIMAL NUMBER GIVING THE NUMBER * 09096002
.*                       OF BYTES TO BE RELEASED, OR IS AN ABSOLUTE   * 09104002
.*                       EXPRESSION, NOT SURROUNDED BY PARENTHESES,   * 09112002
.*                       THAT DETERMINES THE NUMBER OF BYTES TO BE    * 09120002
.*                       RELEASED.                                    * 09128002
.*  1.   LV=(GPR)        GPR IS AN ABSOLUTE EXPRESSION HAVING A VALUE * 09136002
.*                       FROM 1 TO 15, AND IS THE REGISTER CONTAINING * 09144002
.*                       THE NUMBER OF BYTES TO BE RELEASED.          * 09152002
.*  2.   LV=(ADDRESS,NUMBER)   ADDRESS IS THE MAIN STORAGE ADDRESS OF * 09160002
.*                       EITHER A 1-BYTE OR A HALFWORD FIELD THAT     * 09168002
.*                       CONTAINS THE LENGTH OF THE AREA.             * 09176002
.*                       LENGTH IS A 1 OR A 2, TO DETERMINE A 1-BYTE  * 09184002
.*                       OR HALFWORD FIELD RESPECTIVELY.              * 09192002
.*    IF LV=(ADDRESS,) IS CODED, THE LENGTH FIELD IS AN IMPLIED 1-BYTE* 09200002
.*                     FIELD.                                         * 09208002
.*  3.   LV=((ADR),LENGTH)     THIS CASE IS ESSENTIALLY THE SAME AS   * 09216002
.*                       THE PRECEDING CASE, EXCEPT THAT THE ADDRESS  * 09224002
.*                       OF THE LENGTH FIELD IS IN THE SPECIFIED GPR  * 09232002
.*                       ADR.                                         * 09240002
.*--------------------------------------------------------------------* 09248002
.* THE LENGTH VALUE AND SUBPOOL ARE PLACED IN REGISTER ZERO, AND THEN * 09256002
.* THE APPROPRIATE ROUTINE IN THE MODULE IGARPT01 IS CALLED.          * 09264002
         GBLC  &IGADDR   THE LOCATION CONTAINING THE ADDRESS OF THE     09272002
.*                       MODULE IGARPT01.                               09280002
         GBLC  &IGATCB   THE ADDTREE OF THE TCBRPT WORD.                09288002
         GBLC  &IGAGSP   BRANCH ENTRY OFFSET FOR VARIABLE LENGTH       *09296002
                         ENTRIES WHEN THE SPACE CONTROL ADDRESS IS NOT *09304002
                         CODED.                                         09312002
         GBLC  &IGAGS8,&IGAGS12,&IGAGS80  THESE ARE THE ENTRY POINTS TO*09320002
                         ALLOCATE AN AREA OF 8, 12, OR 80 BYTES        *09328002
                         RESPECTIVELY USING THE FIXEDHDR IN AN SPCA.    09336002
         GBLC  &IGAGSPF  BRANCH ENTRY OFFSET FOR FIXED LENGTH ENTRIES  *09344002
                         USING A FIXEDHDR FROM THE GSPACE MACRO OR FROM*09352002
                         INSIDE THE MODULE IGARPT01.                    09360002
         GBLC  &IGAGSPS  BRANCH ENTRY OFFSET FOR VARIABLE LENGTH SPACE *09368002
                         ALLOCATION WHEN THE SPACE CONTROL ADDRESS IS  *09376002
                         CODED IN THE GSPACE MACRO.                     09384002
         GBLC  &IGASPZ   THE SIZE OF THE SPACE CONTROL AREA.            09392002
         GBLC  &IGAISP   BRANCH ENTRY OFFSET FOR THE SPACE CONTROL     *09400002
                         INITIALIZATION ROUTINE IN IGARPT01.            09408002
         GBLB  &IGALONE  ON FOR UNIT TEST THE PROGRAM ON A STANDALONE  *09416002
                         BASIS.                                         09424002
         LCLC  &C        JUST A TEMPORARY CHARACTER VECTOR.             09432002
         LCLA  &Z        A TEMPORARY ARITHMETIC VARIABLE.               09440002
         LCLC  &O,&LKR                                                  09448002
&O       SETC  '0'                                                      09456002
&LKR     SETC  '14'                                                     09464002
.*A000000                                                        Y02147 09472002
.********************************************************************** 09480002
         AIF   (('&R' EQ 'S')OR('&R' EQ 'SC')).SPACE SEE IF THE SPACE  *09488002
               CONTROL AREA IS TO BE SET UP BEFORE SATISFYING THE      *09496002
               REQUEST.                                                 09504002
      RPTDSECT T=SPACE,DS=N  GET THE GLOBALS WITHOUT THE DSECT.         09512002
         AIF   (K'&TAG EQ 0).LJW0                                       09520002
&TAG     EQU   *                                                        09528002
.LJW0    ANOP                                                           09536002
         AIF   (('&R' EQ 'RF')OR('&R' EQ 'RCF')).FIXED  SEE IF THE     *09544002
                         REQUEST FORM IS FOR AN AREA FROM A FIXED      *09552002
                         LENGTH FREE SPACE CHAIN.                       09560002
.********************************************************************** 09568002
.*       PUT THE LENGTH VALUE IN R0.                                  * 09576002
.********************************************************************** 09584002
         AIF   (K'&LV NE 0).LVHERE  SEE IF THE LV IS CODED.             09592002
         MNOTE 12,'MISSING LENGTH VALUE, LV= MUST BE CODED.'            09600002
         AGO   .CHKA           GO CHECK THE ADDRESS.                    09608002
.LVHERE  AIF   ('&LV'(1,1) EQ '(').LV234  GO IF CASE 2, 3, OR 4.        09616002
         AIF   (NOT((K'&SP EQ 0)OR('&SP' EQ '0'))).SESPIL0             *09624002
                         SEE IF THE SUBPOOL IS SUBPOOL ZERO.            09632002
         LA    0,&LV     LV                                             09640002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          09648002
.SESPIL0 AIF   ('&SP'(1,1) EQ '(').SESPIL1  SEE IF THE SUBPOOL         *09656002
                         PARAMETER IS IN A REGISTER, AND GO IF IT IS.   09664002
         L     0,=AL1(&SP,&LV/X'10000',(&LV-X'10000'*(&LV/X'10000'))/X'*09672002
               100',&LV-X'100'*(&LV/X'100'))  LOAD THE SUBPOOL NUMBER  *09680002
               AND LENGTH VALUE IN THE REGISTER.                        09688002
         AGO   .CHKA                                                    09696002
.SESPIL1 LA    14,&LV    LENGTH VALUE.                                  09704002
         AIF   ('&SP' EQ '(0)').ERGIJ  SEE IF THE SUBPOOL IS ALREADY   *09712002
                         IN REGISTER ZERO.                              09720002
         LR    0,&SP(1)  SUBPOOL NUMBER.                                09728002
.ERGIJ   SLL   0,24      PUT THE SUBPOOL IN BYTE 0 OF GPR 0.            09736002
         ALR   0,14      ADD IN THE LENGTH VALUE.                       09744002
         AGO   .CHKA                                                    09752002
.LV234   AIF   (N'&LV EQ 1).LV2  SEE IF LV=(GPR) IS CODED.              09760002
         AIF   ('&LV'(2,1) EQ '(').LV4  SEE IF LV=((ADR),LNG) IS CODED. 09768002
         AIF   (K'&LV(2) EQ 0).LV3A    SEE IF LV=(ADR,) IS CODED.       09776002
.********************************************************************** 09784002
.*       LV=(ADR,LNG) IS CODED.                                         09792002
.********************************************************************** 09800002
         AIF   ('&LV(2)' EQ '1').LV3A  SEE IF LV=(ADR,1) IS CODED.      09808002
         AIF   ('&LV(2)' EQ '2').LV3B  SEE IF LV=(ADR,2) IS CODED.      09816002
         AIF   ('&LV(2)' EQ '4').LV3D  SEE IF "LV=(ADR,4)" IS CODED.    09824002
         MNOTE 12,'LV CODED WRONG, 1 OR 2 ONLY ALLOWED FOR LV LENGTH.'  09832002
         AGO   .CHKA           GO CHECK THE ADDRESS.                    09840002
.********************************************************************** 09848002
.*  THE LENGTH OF THE LENGTH VALUE IS ONE.  .*                          09856002
.********************************************************************** 09864002
.LV3A    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL2  GO IF THE      *09872002
                         SUBPOOL IS NOT SUBPOOL ZERO.                   09880002
         SLR   0,0       GET THE LENGTH VALUE.                          09888002
.LV3AA   ANOP                                                           09896002
         IC    0,&LV(1)  FOR THE AREA TO BE RELEASED.                   09904002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          09912002
.SESPIL2 AIF   ('&SP'(1,1) EQ '(').SESPIL3  GO IF SP IS IN GPR.         09920002
         LA    0,&SP     SUBPOOL #.                                     09928002
         SLL   0,24      PUT IT IN BYTE 0 OF GPR 0.                     09936002
         AGO   .LV3AA    GO PUT IN THE LENGTH VALUE.                    09944002
.SESPIL3 AIF   ('&SP' EQ '(0)').LV3AAAA                                 09952002
         LR    0,&SP(1)  SUBPOOL #.                                     09960002
.LV3AAAA SLL   0,24      PUT THE SUBPOOL IN BYTE 0 OF GPR 0.            09968002
         AGO   .LV3AA                                                   09976002
.LV3B    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL4                 *09984002
                         SEE IF THE SUBPOOL IS ZERO, AND GO IF IT ISN'T.09992002
                                                                        10000002
         LH    0,&LV(1)  GET THE LENGTH VALUE.                          10008002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          10016002
.SESPIL4 AIF   ('&SP' EQ '(0)').SESPIL5  SEE IF IT IS IN GPR 0.         10024002
         AIF   ('&SP'(1,1) EQ '(').SESPIL6  SEE IF IT IS IN A GPR.      10032002
         LA    0,&SP     SUBPOOL #.                                     10040002
         AGO   .SESPIL5  GO GENERATE THE SHIFT INSTRUCTION.             10048002
.SESPIL6 LR    0,&SP(1)  SUBPOOL #.                                     10056002
.SESPIL5 SLL   0,24      PUT THE SUBPOOL # IN BYTE 0 OF GPR 0.          10064002
         AH    0,&LV(1)  ADD IN THE LENGTH VALUE.                       10072002
         AGO   .CHKA                                                    10080002
.LV3D    ANOP                                                           10088002
         AIF   ((K'&SP NE 0)AND('&SP' NE '0')).LV3DNZ  SEE IF THE      *10096002
                         SUBPOOL IS SUBPOOL ZERO.                       10104002
         L     0,&LV(1)                        SUBPOOL AND LV.          10112002
         AGO   .CHKA                                                    10120002
.LV3DNZ  AIF   ('&SP'(1,1) EQ '(').LV3DSPR  SEE IF THE SUBPOOL NUMBER  *10128002
                         IS IN A REGISTER.                              10136002
         LA    0,&SP                           SUBPOOL #.               10144002
         SLL   0,24                                                     10152002
         AL    0,&LV(1)                        LV.                      10160002
         AGO   .CHKA                                                    10168002
.LV3DSPR LR    0,&SP(1)                        SP #.                    10176002
         SLL   0,24                                                     10184002
         AL    0,&LV(1)                        LV.                      10192002
         AGO   .CHKA                                                    10200002
.********************************************************************** 10208002
.*  LV=((ADR),LNG) IS CODED.  .*                                        10216002
.********************************************************************** 10224002
.LV4     AIF   (K'&LV(2) EQ 0).LV4A  SEE IF LV=((ADR),) IS CODED.       10232002
         AIF   ('&LV(2)' EQ '1').LV4A  SEE IF LV=((ADR),1) IS CODED.    10240002
         AIF   ('&LV(2)' EQ '2').LV4B  SEE IF LV=((ADR),2) IS CODED.    10248002
         AIF   ('&LV(2)' EQ '4').LV4D  SEE IF "LV=((ADR),4)" IS CODED.  10256002
.********************************************************************** 10264002
.*   LV=((ADR),EXPRESSION) IS CODED.  .*                                10272002
.********************************************************************** 10280002
         MNOTE 12,'INVALID LENGTH OF LV OPERAND, LV=&LV.'               10288002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          10296002
.LV4A    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL7  GO IF SP^0.     10304002
         SLR   0,0       LV=((ADR),1)                                   10312002
.LV4AA   ANOP                                                           10320002
         IC    0,0&LV(1)  GET THE LENGTH OF AREA.                       10328002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          10336002
.SESPIL7 AIF   ('&SP'(1,1) EQ '(').SESPIL8  GO IF SP IS IN A GPR.       10344002
         LA    0,&SP     SUBPOOL #.                                     10352002
.BEGRUDG SLL   0,24      PUT THE SUBPOOL # IN BYTE 0 OF GPR0.           10360002
         AGO   .LV4AA                                                   10368002
.SESPIL8 AIF   ('&SP' EQ '(0)').BEGRUDG  SEE IF THE SP# IS IN GPR 0.    10376002
         LR    0,&SP(1)  LOAD SUBPOOL # INTO GPR ZERO.                  10384002
         AGO   .BEGRUDG  GO SHIFT IT OVER INTO BYTE 0.                  10392002
.LV4B    AIF   ((K'&SP NE 0)AND('&SP' NE '0')).SESPIL9  GO IF SP# IS ^0 10400002
         LH    0,0&LV(1) LV=((ADR),1)                                   10408002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          10416002
.SESPIL9 AIF   ('&SP'(1,1) EQ '(').SESPILA  GO IF SP# IS IN A GPR.      10424002
         LA    0,&SP     SUBPOOL #.                                     10432002
         AGO   .SESPILB  GO SHIFT IT OVER INTO BYTE ZERO.               10440002
.SESPILA AIF   ('&SP' EQ '(0)').SESPILB  GO IF SP# IS ALREADY IN GPR 0. 10448002
         LR    0,&SP(1)  SUBPOOL #.                                     10456002
.SESPILB SLL   0,24      SHIFT IT OVER INTO BYTE ZERO.                  10464002
         AH    0,0&LV(1) ADD IN THE LENGTH VALUE.                       10472002
         AGO   .CHKA                                                    10480002
.LV4D    ANOP                                                           10488002
         AIF   ((K'&SP NE 0)AND('&SP' NE '0')).LV4DNZ  SEE IF THE      *10496002
                         SUBPOOL IS SUBPOOL ZERO.                       10504002
         L     0,0&LV(1)                        SUBPOOL AND LV.         10512002
         AGO   .CHKA                                                    10520002
.LV4DNZ  AIF   ('&SP'(1,1) EQ '(').LV4DSPR  SEE IF THE SUBPOOL NUMBER  *10528002
                         IS IN A REGISTER.                              10536002
         LA    0,&SP                           SP #.                    10544002
         SLL   0,24                                                     10552002
         AL    0,0&LV(1)                        LV.                     10560002
         AGO   .CHKA                                                    10568002
.LV4DSPR LR    0,&SP(1)                        SP #.                    10576002
         SLL   0,24                                                     10584002
         AL    0,0&LV(1)                        LV.                     10592002
         AGO   .CHKA                                                    10600002
.LV2     AIF        (('&LV' EQ '(0)')AND((K'&SP EQ 0)OR('&SP' EQ '0')OR*10608002
               ('&SP' EQ '(0)'))).CHKA  GO IF THE SUBPOOL # AND LENGTH  10616002
.*             VALUE ARE ALREADY IN REGISTER 0. THIS MEANS "LV=(0)"   * 10624002
.*             IS CODED AND THE SUBPOOL DOESN'T HAVE TO BE FILLED IN. * 10632002
         AIF   (K'&SP NE 0).SESPILC  GO IF THE SUBPOOL # IS CODED.      10640002
         LR    0,&LV(1)  LV.                                            10648002
         AGO   .CHKA     GO CHECK THE ADDRESS.                          10656002
.SESPILC AIF   ('&SP'(1,1) EQ '(').SESPILD  GO IF THE SP# IS IN A GPR.  10664002
         AIF   ('&LV' EQ '(0)').SESPILE  GO IF THE LENGTH IS IN R0.     10672002
         AL    0,&SP     SUBPOOL #.                                     10680002
         SLL   0,24      PUT THE SUBPOOL NUMBER IN BYTE 0.              10688002
         ALR   0,&LV(1)  ADD   IN THE LENGTH VALUE.                     10696002
         AGO   .CHKA                                                    10704002
.SESPILD AIF   ('&SP' EQ '(0)').SESPILF  GO IF SP# IS IN GPR 0.         10712002
         LR    0,&SP(1)  SUBPOOL#.                                      10720002
         AIF   ('&SP' EQ '&LV').CHKA  SEE IF THE SUBPOOL NUMBER AND THE*10728002
                         LENGTH VALUE ARE IN THE SAME REGISTER.         10736002
.SESPILF SLL   0,24      PUT SP# IN BYTE 0 OF GPR ZERO.                 10744002
         ALR   0,&LV(1)  ADD   IN THE LENGTH VALUE.                     10752002
         AGO   .CHKA                                                    10760002
.SESPILE AL    0,=AL1(&SP,X'00',B'0',0)  ADD IN THE SUBPOOL #.          10768002
.CHKA    ANOP                                                           10776002
.*--------------------------------------------------------------------* 10784002
.* THE LENGTH VALUE AND SUBPOOL ARE IN REGISTER ZERO, NOW LINK TO THE * 10792002
.* MODULE IGARPT01.                                                   * 10800002
.*--------------------------------------------------------------------* 10808002
         AIF   (K'&S EQ 0).LINKGEN  SEE IF THE SPACE ADDRESS IS CODED.  10816002
         AIF   ('&S'(1,1) EQ '(').LINKGPR  SEE IF THE SPACE ADDRESS IS *10824002
                         IN A GENERAL PURPOSE REGISTER.                 10832002
         L     1,&S      SPACE CONTROL WORD.                            10840002
         AGO   .LINKREG  GO LINK TO THE VARIABLE LENGTH GSPACE ROUTINE *10848002
                         IN IGARPT01.                                   10856002
.LINKGPR AIF   ('&S' EQ '(1)').LINKREG  SEE IF IT IS IN R1 ALREADY.     10864002
         LR    1,&S(1)                                     SPCA.        10872002
.LINKREG L     15,&IGADDR.(,1)  ADDRESS OF IGARPT01.                    10880002
         AIF   (K'&R EQ 0).LINKSR0  SEE IF THE R PARAMETER WAS OMITTED. 10888002
         AIF   ('&R' EQ 'R').LINKSU  GO IF IT IS AN UNCONDITIONAL      *10896002
                         GSPACE.                                        10904002
         AIF   ('&R' EQ 'RC').LINKSC  GO IF IT IS A CONDITIONAL GSPACE *10912002
                         REQUEST.                                       10920002
         MNOTE 12,'INVALID CONDITIONAL/UNCONDITIONAL SPECIFICATION.'    10928002
.LINKSU  LA    &LKR,&IGAGSPS.(,15)  GSPACE ENTRY POINT ADDRESS.         10936002
         BALR  &LKR,&LKR  INDICATE UNCONDITIONAL GSPACE.                10944002
         AGO   .FIN      ALL DONE WITH THE GSPACE, NOW EXIT.            10952002
.LINKSR0 MNOTE 0,'UNCONDITIONAL GSPACE ASSUMED.'                        10960002
         AGO   .LINKSU   GO LINK TO THE GSPACE UNCONDITIONALLY.         10968002
.LINKSC  ANOP                                                           10976002
         BAL   &LKR,&IGAGSPS.(,15)  INDICATE CONDITIONAL GSPACE.        10984002
         AGO   .FIN      ALL DONE, NOW EXIT.                            10992002
.LINKGEN ANOP                                                           11000002
      RPTDSECT GEN=(CVTRPT,15)  GET THE ADDRESS OF THE MODULE IGARPT01 *11008002
                         IN REGISTER 15.                                11016002
.LINKTO  ANOP                                                           11024002
         AIF   (K'&R EQ 0).LINKR0  SEE IF THE R PARAMETER IS NOT CODED. 11032002
         AIF   ('&R' EQ 'RC').LINKC  SEE IF IT IS CODED AS A           *11040002
                         CONDITIONAL GSPACE REQUEST.                    11048002
         AIF   ('&R' EQ 'R').LINKU  SEE IF IT IS CODED AS AN           *11056002
                         UNCONDITIONAL GSPACE REQUEST.                  11064002
         MNOTE 12,'INVALID REQUEST MODE, UNCONDITIONAL ASSUMED.'        11072002
.LINKU   LA    &LKR,&IGAGSP.(,15)                                       11080002
         BALR  &LKR,&LKR  INDICATE UNCONDITIONAL GSPACE.                11088002
         AGO   .FIN      ALL DONE, NOW EXIT FROM THE GSPACE            *11096002
                         MACRO-INSTRUCTION.                             11104002
.LINKR0  MNOTE 0,'UNCONDITIONAL GSPACE ASSUMED.'                        11112002
         AGO   .LINKU    GO TO THE UNCONDITIONAL LINKAGE.               11120002
.LINKC   BAL   &LKR,&IGAGSP.(,15)  INDICATE CONDITIONAL GSPACE.         11128002
         AGO   .FIN      ALL DONE NOW, EXIT.                            11136002
.********************************************************************** 11144002
.* COME HERE TO SET UP A SPACE CONTROL AREA.                          * 11152002
.********************************************************************** 11160002
.SPACE   ANOP                                                           11168002
.CHECKS  ANOP                                                           11176002
      RPTDSECT T=SPACE,DS=NO                                            11184002
         AIF   (&IGALONE).LOAD  SEE IF THE MODULE MUST BE LOADED VIA   *11192002
                         THE LOAD MACRO-INSTRUCTION.                    11200002
         AIF   (K'&TAG EQ 0).NOTAG  SEE IF THERE IS A LABEL.            11208002
&TAG     EQU   *                                                        11216002
.NOTAG   ANOP                                                           11224002
      RPTDSECT GEN=(CVTRPT,(15))  GET THE ADDRESS OF IGARPT01.          11232002
         AGO   .MERGE    MERGE WITH THE COMMON PATH.                    11240002
.LOAD    ANOP                                                           11248002
&TAG     LOAD  EP=IGARPT01  LOAD THE MODULE.                            11256002
         LR    14,0      GET THE ADDRESS OF THE MODULE IGARPT01 IN THE *11264002
                         REGISTER.                                      11272002
.MERGE   AIF   (K'&SP EQ 0).SPZERO  SEE IF THE SUBPOOL IS ZERO BY VIRTUE11280002
               OF NOT EVEN BEING CODED FOR THE ISPACE MACRO.            11288002
         AIF   ('&SP' EQ '0').SPZERO  SEE IF THERE IS NO OTHER SUBPOOL *11296002
                         SPECIFIED FOR THE SPACE CONTROL AREA.          11304002
         AIF   (K'&LV NE 0).LONGSPC  SEE IF THE LENGTH VALUE IS CODED.  11312002
         L     0,=AL1(&SP,0,(&IGASPZ/X'100'),(&IGASPZ-X'100'*(&IGASPZ/X*11320002
               '100')))  SPCA SP AND LV.                                11328002
         AGO   .LINK     GO LINK TO THE SUBROUTINE.                     11336002
.LONGSPC AIF   ('&LV'(1,1) EQ '(').LONGPR  SEE IF IT IS IN A GPR.       11344002
         L     0,=AL1(&SP,0,(&LV/X'100'),(&LV-X'100'*(&LV/X'100')))     11352002
         AGO   .LINK     GO LINK TO &IGAISP.                            11360002
.LONGPR  LR    0,&LV(1)                LENGTH VALUE FOR THE SPCA.       11368002
         AL    0,=AL1(&SP,0,0,0)                 SUBPOOL #.             11376002
         AGO   .LINK                                                    11384002
.SPZERO  AIF   (K'&LV NE 0).LENGTH  SEE IF THE LENGTH VALUE IS CODED.   11392002
         LA    0,&IGASPZ                         LENGTH FOR THE SPCA.   11400002
         AGO   .LINK     GO LINK TO &IGAISP.                            11408002
.LENGTH  AIF   ('&LV'(1,1) EQ '(').GPRLONG  SEE IF THE LENGTH IS IN A  *11416002
                         REGISTER.                                      11424002
         LA    0,&LV                   GET THE LENGTH FOR THE SPCA.     11432002
         AGO   .LINK                                                    11440002
.GPRLONG LR    0,&LV(1)        LENGTH FOR THE SPCA.                     11448002
.LINK    ANOP                                                           11456002
*---------------------------------------------------------------------* 11464002
.LINKBAL BAL   14,&IGAISP.(,14)  LINK TO &IGAISP IN IGARPT01.           11472002
         AIF   (K'&S EQ 0).FINSCTL  SEE IF REGISTER 1 SHOULD HAVE THE  *11480002
                         ADDRESS IN IT.                                 11488002
.SNOTMT  AIF   ('&S'(1,1) EQ '(').GPR  SEE IF THE SPACE WORD IS TO BE  *11496002
                         LEFT IN A GPR.                                 11504002
         ST    1,&S      STORE THE ADDRESS OF THE SPACE CONTROL AREA.   11512002
         AGO   .FIN                                                     11520002
.GPR     AIF   ('&S' EQ '(1)').FINSCTL SEE IF THE ADDRESS IS ALREADY IN*11528002
                         THE RIGHT REGISTER.                            11536002
         LR    &S(1),1   TRANSFER THE SPACE CONTROL ADDRESS TO THE     *11544002
                         OTHER REGISTER.                                11552002
.FINSCTL ANOP                                                           11560002
.END     ANOP                                                           11568002
         AGO   .FIN                                                     11576002
.********************************************************************** 11584002
.* COME HERE TO ALLOCATE AN AREA OF 8, 12, OR 80 BYTES USING THE      * 11592002
.* FIXEDHDR IN A SPACE CONTROL AREA.                                  * 11600002
.********************************************************************** 11608002
.FIXED   ANOP                                                           11616002
         AIF   ((K'&S NE 0)AND(K'&LV NE 0)).FIXEDOK  SEE IF ALL THE    *11624002
                         NECESSARY PARAMETERS ARE CODED.                11632002
         AIF   (K'&S NE 0).FXSOK  SEE IF THE S PARAMETER IS MISSING.    11640002
         MNOTE 12,'THE S PARAMETER MUST BE CODED FOR FSPACE RF,...'     11648002
.FXSOK   ANOP                                                           11656002
         AIF   (K'&LV NE 0).FXLVOK  SEE IF THE LENGTH VALUE PARAMETER  *11664002
                         IS MISSING.                                    11672002
         MNOTE 12,'LENGTH VALUE IS MISSING -- LV PARAMETER.'            11680002
.FXLVOK  ANOP                                                           11688002
         AGO   .FIN   EXIT BECAUSE THE IS NO HOPE OF CORRECT EXECUTION. 11696002
.********************************************************************** 11704002
.* CHECK THE LENGTH VALUE TO SEE IF IT IS 8, 12, OR 80.               * 11712002
.********************************************************************** 11720002
.FIXEDOK ANOP                                                           11728002
         AIF   (('&LV' EQ '8')OR('&LV' EQ '12')OR('&LV' EQ '80')OR('&LV*11736002
               ' EQ 'X''8''')OR('&LV' EQ 'X''C''')OR('&LV' EQ 'X''50'''*11744002
               )).FXLOK                                                 11752002
         MNOTE 12,'THE LENGTH VALUE MUST BE 8, 12, OR 80 TO USE THE RF *11760002
               FORM OF GSPACE.'                                         11768002
         AGO   .FIN                                                     11776002
.FXLOK   ANOP                                                           11784002
.********************************************************************** 11792002
.* GET THE ADDRESS OF THE SPCA IN REGISTER 1, AND GET THE ADDRESS OF  * 11800002
.* THE MODULE IGARPT01 IN REGISTER 14 FOR THE LINKAGE.                * 11808002
.********************************************************************** 11816002
         AIF   ('&S'(1,1) EQ '(').FXSGPR  SEE IF THE SPACE CONTROL     *11824002
                         ADDRESS IS IN A GENERAL REGISTER.              11832002
         L     1,&S      SPCA ADDRESS.                                  11840002
         AGO   .FXGOTS   MERGE WITH THE COMMON PATH.                    11848002
.FXSGPR  AIF   ('&S' EQ '(1)').FXGOTS  SEE IF IT IS ALREADY IN THE     *11856002
                         RIGHT REGISTER.                                11864002
         LR    1,&S(1)   THE ADDRESS OF THE SPCA.                       11872002
.FXGOTS  ANOP                                                           11880002
         L     14,&IGADDR.(,1)  ADDRESS OF IGARPT01.                    11888002
.********************************************************************** 11896002
.* NOW CHECK THE LENGTH VALUE TO SEE WHICH ONE OF THE LENGTHS IS      * 11904002
.* INVOLVED; 8, 12, OR 80.                                            * 11912002
.********************************************************************** 11920002
         AIF   (('&LV' EQ '8')OR('&LV' EQ 'X''8''')).FXLV8  SEE IF IT  *11928002
                         IS 8 BYTES.                                    11936002
         AIF   (('&LV' EQ '80')OR('&LV' EQ 'X''50''')).FXLV80          *11944002
                         SEE IF IT IS AN 80-BYTE AREA.                  11952002
         AIF   ('&R' EQ 'RCF').FXL12C  SEE IF IT IS A CONDITIONAL      *11960002
                         REQUEST.                                       11968002
         LA    14,&IGAGS12.(,14)  GET THE ENTRY POINT ADDRESS.          11976002
         BALR  14,14     INDICATE UNCONDITIONAL GSPACE.                 11984002
         AGO   .FIN      ALL DONE, NOW EXIT FROM THE GSPACE            *11992002
                         MACRO-INSTRUCTION.                             12000002
.FXL12C  BAL   14,&IGAGS12.(,14)  LINK TO ALLOCATE THE 12-BYTE AREA.    12008002
         AGO   .FIN      ALL DONE NOW, EXIT.                            12016002
.FXLV8   AIF   ('&R' EQ 'RCF').FXL8C  SEE IF IT IS A CONDITIONAL       *12024002
                         REQUEST.                                       12032002
         LA    14,&IGAGS8.(,14)  GET THE ENTRY POINT ADDRESS.           12040002
         BALR  14,14     INDICATE UNCONDITIONAL GSPACE.                 12048002
         AGO   .FIN      ALL DONE, NOW EXIT.                            12056002
.FXL8C   BAL   14,&IGAGS8.(,14)  LINK TO ALLOCATE THE 8-BYTE AREA.      12064002
         AGO   .FIN                                                     12072002
.FXLV80  AIF   ('&R' EQ 'RCF').FXL80C  SEE IF THE REQUEST IS A         *12080002
                         CONDITIONAL REQUEST.                           12088002
         LA    14,&IGAGS80.(,14)  GET THE ENTRY ADDRESS FOR AN         *12096002
                         UNCONDITIONAL REQUEST.                         12104002
         BALR  14,14     INDICATE UNCONDITIONAL REQUEST.                12112002
         AGO   .FIN      ALL DONE, NOW EXIT.                            12120002
.FXL80C  BAL   14,&IGAGS80.(,14)  LINK TO ALLOCATE THE 80-BYTE AREA.    12128002
         AGO   .FIN                                                     12136002
.FIN     ANOP                                                           12144002
         MEND                                                           12152002
         EJECT                                                          12160002
         MACRO                                                          12168002
&TAG     INS   &TREE,&A=,&R=,&#=,&T=,&C=,&SP=,&S=,&INSARG=,&MOVE=,     *12176002
               &RECL=,&TYPE=                                            12184002
.********************************************************************** 12192002
.* THE INS MACRO-INSTRUCTION ASSOCIATES A KEY WITH A RECORD ADDRESS BY* 12200002
.* CHANGING THE RADIX PARTITION TREE OF ASSOCIATIONS.                 * 12208002
.*                                                                    * 12216002
.* THE ADDRESS USED IS OBTAINED IN EITHER ONE OF TWO WAYS:            * 12224002
.*                                                                    * 12232002
.* 0:    IF THE A-PARAMETER IS CODED AND THE R-PARAMETER IS NOT CODED,* 12240002
.*       THE ADDRESS IS AS SPECIFIED BY THE A-PARAMETER.              * 12248002
.*                                                                    * 12256002
.* 1:    IF BOTH THE A AND R PARAMETERS ARE CODED, SPACE IS ALLOCATED * 12264002
.*       FOR THE RECORD VIA THE GSPACE MACRO-INSTRUCTION, THE RECORD  * 12272002
.*       IS MOVED TO THE AREA ALLOCATED, AND THE ADDRESS OF THE       * 12280002
.*       ALLOCATED AREA IS USED. BY CODING THE R-PARAMETER THE RECORD * 12288002
.*       IS DEFINED SO IT CAN BE COLLECTED AT THE ALLOCATED AREA.     * 12296002
.*       IN EITHER CASE, AFTER THE INS MACRO HAS BEEN SUCCESSFULLY    * 12304002
.*       EXECUTED THE ADDRESS USED FOR THE ASSOCIATION IS RETURNED IN * 12312002
.*       REGISTER 15 AS THE RETURN CODE. IF THE INSERT IS NOT         * 12320002
.*       SUCCESSFUL FOR SOME REASON, THE RETURN CODE IN REGISTER 15 IS* 12328002
.*       NEGATIVE.                                                    * 12336002
.*                                                                    * 12344002
.* THE DESCRIPTIONS OF THE PARAMETERS FOR THE INS MACRO ARE AS        * 12352002
.* FOLLOWS:                                                           * 12360002
.*                                                                    * 12368002
.* TREE: THIS SPECIFIES THE ADDRESS OF THE RADIX PARTITION TREE USED  * 12376002
.*       TO STORE THE KEY-ADDRESS ASSOCIATIONS. IT MAY BE CODED TO    * 12384002
.*       SPECIFY EITHER A MAIN STORAGE LOCATION CONTAINING THE ADDRESS* 12392002
.*       OF THE RPT OR IN PARENTHESES TO INDICATE A GENERAL REGISTER  * 12400002
.*       CONTAINING THE ADDRESS OF THE RPT. IF "(1)" IS CODED, NO LOAD* 12408002
.*       REGISTER INSTRUCTION IS GENERATED BY THE INS MACRO, AS THE   * 12416002
.*       ADDRESS IS ALREADY IN THE APPROPRIATE PARAMETER LIST         * 12424002
.*       REGISTER.                                                    * 12432002
.*       THE TREE PARAMETER MAY BE OMITTED, IN WHICH CASE THE ADDRESS * 12440002
.*       OF THE RPT IS ASSUMED IN GPR 1.                              * 12448002
.*                                                                    * 12456002
.* A:    THE A-PARAMETER SPECIFIES THE ADDRESS OF THE RECORD          * 12464002
.*       CONTAINING THE KEY TO BE USED FOR THE ASSOCIATION. THE RECORD* 12472002
.*       ADDRESS MAY BE EITHER A MAIN STORAGE LOCATION OR MAY BE IN A * 12480002
.*       REGISTER, INDICATED BY ENCLOSING THE REGISTER NAME OR # IN   * 12488002
.*       PARENTHESES. FOR EXAMPLE, IF "A=LABEL" IS CODED, "LABEL" IS  * 12496002
.*       TAKEN AS THE SYMBOLIC NAME OF THE MAIN STORAGE LOCATION      * 12504002
.*       CONTAINING THE RECORD. THE A PARAMETER MAY BE USED IN        * 12512002
.*       CONJUNCTION WITH THE R PARAMETER TO SPECIFY A SCATTERED      * 12520002
.*       RECORD TO BE COLLECTED INTO A SPACE PROVIDED VIA THE GSPACE  * 12528002
.*       MACRO-INSTRUCTION.                                           * 12536002
.*                                                                    * 12544002
.* R:    THE R-PARAMETER IS USED TO SPECIFY THE RECORD WHEN IT IS     * 12552002
.*       DESIRED THAT THE INS MACRO ALLOCATE AN AREA TO HOLD THE      * 12560002
.*       RECORD VIA THE GSPACE MACRO AND MOVE THE RECORD TO THE AREA  * 12568002
.*       ALLOCATED BEFORE INSERTING THE ASSOCIATION IN THE RPT.       * 12576002
.*       THERE ARE TWO MODES FOR CODING THE R PARAMETER; THE FIRST WAY* 12584002
.*       IS IN CONJUNCTION WITH THE A PARAMETER, AND THE SECOND IS    * 12592002
.*       WITHOUT CODING THE A PARAMETER. IF BOTH THE A AND R          * 12600002
.*       PARAMETERS ARE CODED, THEN THE A PARAMETER PROVIDES THE      * 12608002
.*       ADDRESS OF A BASE AREA FROM WHICH TO COLLECT THE RECORD, AND * 12616002
.*       THE R-PARAMETER SPECIFIES THE RECORD IN THE BASE AREA BY     * 12624002
.*       PAIRS OF DISPLACEMENTS AND LENGTHS, ENCLOSED IN PARENTHESES. * 12632002
.*       THE DISPLACEMENT-LENGTH PAIRS ARE CODED AS ((D,L),(D,L),...  * 12640002
.*       ,(D,L)), WHERE EACH DISPLACEMENT AND LENGTH IS ENCLOSED IN   * 12648002
.*       PARENTHESES, AND THE ORDER THE PAIRS APPEAR IN THE LIST IS   * 12656002
.*       THE ORDER IN WHICH THE RECORD IS COLLECTED.                  * 12664002
.*       EACH DISPLACEMENT AND LENGTH MUST BE A SELF-DEFINING DECIMAL * 12672002
.*       NUMBER.                                                      * 12680002
.*       FOR EXAMPLE, CODING "A=(8),R=((10,3),(6,9))" CAUSES THE      * 12688002
.*       RECORD TO BE COLLECTED FROM THE TWO FIELDS AT OFFSETS 10 AND * 12696002
.*       6 RESPECTIVELY FROM THE BASE ADDRESS IN GPR 8. NOTE THAT NO  * 12704002
.*       CHECK IS MADE FOR OVERLAPPING FIELDS.                        * 12712002
.*       IF THERE IS ONLY ONE DISPLACEMENT-LENGTH PAIR, IT MAY BE     * 12720002
.*       CODED WITH ONLY ONE SET OF ENCLOSING PARENTHESES INSTEAD OF  * 12728002
.*       TWO.                                                         * 12736002
.*                                                                    * 12744002
.*       IF THE R PARAMETER IS CODED AND THE A PARAMETER IS NOT CODED,* 12752002
.*       THE ELEMENTS IN THE LIST FOR THE R PARAMETER MAY BE CODED AS * 12760002
.*       ADDRESS-LENGTH PAIRS. IN THIS CASE, EACH ADDRESS MAY EITHER  * 12768002
.*       BE A MAIN STORAGE LOCATION, OR IN A REGISTER. EACH ADDRESS   * 12776002
.*       MUST BE A RELOCATABLE EXPRESSION IF IT NOT IN A REGISTER.    * 12784002
.*       INSTEAD OF THE ADDRESS-LENGTH PAIR, A LABEL MAY BE CODED, AS * 12792002
.*       LONG AS THE LABEL HAS A LENGTH ATTRIBUTE THAT CAN BE USED TO * 12800002
.*       OBTAIN THE LENGTH OF THE CORRESPONDING FIELD.                * 12808002
.*                                                                    * 12816002
.* T:    THE T-PARAMETER IS USED TO SPECIFY THE RADIX PARTITION TREE  * 12824002
.*       TYPE FOR THE INSERTION. THE T-PARAMETER MUST BE CODED AS A   * 12832002
.*       SINGLE SELF-DEFINING DECMIAL NUMBER WITHOUT LEADING ZEROS.   * 12840002
.*       IF THE T-PARAMETER IS NOT CODED, THE TYPE WILL BE OBTAINED   * 12848002
.*       FROM THE GLOBAL VARIABLE &IGATYPE (IF IT IS A VALID RPT      * 12856002
.*       TYPE). IF IT IS NOT A VALID TREE TYPE, A TYPE 8 IS SUPPLIED, * 12864002
.*       AND THE GLOBAL VARIABLE &IGATYPE IS SET TO 8.                * 12872002
.*                                                                    * 12880002
.*       THE PARAMETERS INSARG, MOVE, RECL, AND TYPE SHOULD NOT BE    * 12888002
.*       USED, AS THEY ARE ONLY PRESENT FOR COMPATIBILITY WITH EARLIER* 12896002
.*       VERSIONS OF THE INSERT MACRO.                                * 12904002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *12912002
                         OF RPT ENTRY POINTS.                           12920002
         GBLC  &IGAINS                                                  12928002
         GBLC  &IGARPT#  THE RADIX PARTITION TREE TYPE FROM EITHER THE *12936002
                         T OR TYPE PARAMETER.                           12944002
         GBLA  &IGARECL  THE LENGTH OF THE RECORD TO BE INSERTED BY THE*12952002
                         INSERT MACRO-INSTRUCTION.                      12960002
         GBLA  &IGALEFT(256)  LEFT INVERTIBLE SUBTRACTION EDGES FOR THE*12968002
                         BINARY PARSE TREE.                             12976002
         GBLA  &IGARGHT(256)  RIGHT INVERTIBLE SUBTRACTION EDGES FOR   *12984002
                         THE BINARY PARSE TREE.                         12992002
         GBLA  &IGAX     PENULTIMATE VERTEX ON PATH TO CURRENT ATOM    *13000002
                         WHEN SCANNING.                                 13008002
         GBLA  &IGAZ     LAST INNER VERTEX ON PATH TO ATOM.             13016002
         GBLA  &IGAPATH(16)  PATH VECTOR FOR THE SCANNING OPERATIONS ON*13024002
                         THE PARSE TREE.                                13032002
         GBLA  &IGALEVL  NUMBER OF NESTED LEVELS OF PARENTHESES FOR    *13040002
                         CURRENT ATOM.                                  13048002
         GBLB  &IGAOKAY  ON IF THE PARSE IN RPTDSECT DID NOT FIND ANY  *13056002
                SYNTAX ERRORS IN THE R PARAMETER LIST.                  13064002
         LCLA  &I        A LOCAL VARIABLE FOR KEEPING TRACK OF THE     *13072002
                         CURRENT ENTRY BEING SCANNED IN THE R PARAMETER*13080002
                         LIST.                                          13088002
         LCLA  &LNG      THE LENGTH OF THE CURRENT DISPLACEMENT-LENGTH *13096002
                         PAIR.                                          13104002
         LCLA  &TMPA     USED TO REMEMBER &IGAPATH(&IGALEVL-1).         13112002
         LCLC  &RC       USED TO SET THE REQUEST MODE FOR THE GSPACE   *13120002
                         MACRO TO CONDIRIONAL OR UNCONDITIONAL.         13128002
         LCLC  &X        JUST A LOCAL CHARACTER VECTOR FOR COLLECTING  *13136002
                         OPERANDS.                                      13144002
         LCLB  &REQUEST  ON IF THE GSPACE REQUEST IS A CONDITIONAL     *13152002
                         REQUEST.                                       13160002
         LCLB  &R1SAVED  ON IF REGISTER 1 IS SAVED THROUGH THE GSPACE  *13168002
                         OPERATION.                                     13176002
         LCLB  &FINEQU   ON IF THE EQUATE "FIN&SYSNDX EQU *" MUST BE   *13184002
                         GENERATED AT THE END OF THE MACRO EXECUTION.   13192002
         LCLB  &ERROR    THIS BIT IS TURNED ON WHENEVER AN MNOTE OF    *13200002
                         SUFFICIENT SEVERITY IS GENERATED.              13208002
         LCLA  &DSP      THIS IS USED FOR COLLECTING THE DISPLACEMENT  *13216002
                         AS A NUMBER.                                   13224002
         LCLC  &FIELD    THIS IS USED TO HOLD THE FIELD OF AN (F,L)    *13232002
                         PAIR WHILE GETTING THE L.                      13240002
         LCLB  &XFER     ON TO GENERATE THE MOVES WHEN IT IS THE RIGHT *13248002
               ITERATION THROUGH THE LOOP.                              13256002
.*A000000                                                        Y02147 13264002
.********************************************************************** 13272002
.* CHECK TO SEE WHETHER ANY OF THE OLD PARAMETERS ARE CODED, AND IF   * 13280002
.* THEY ARE THEN MAP THEM TO THE NEW PARAMETERS VIA MACRO RECURSION.  * 13288002
.********************************************************************** 13296002
.*                                                                    * 13304002
         AIF   ((K'&INSARG EQ 0)AND(K'&MOVE EQ 0)AND(K'&RECL EQ 0)).NEW*13312002
                         GO IF NONE OF THE OLD PARAMETERS ARE CODED.    13320002
         AIF   (K'&RECL EQ 0).NORECL  SEE IF THE RECORD LENGTH IS NOT  *13328002
                         CODED.                                         13336002
&TAG     INS   &TREE,A=&INSARG,T=&T,TYPE=&TYPE,R=(0,&RECL),C=1          13344002
         AGO   .FIN      ALL DONE, NOW EXIT.                            13352002
.NORECL  ANOP                                                           13360002
&TAG     INS   &TREE,A=&INSARG,T=&T,TYPE=&TYPE,C=1                      13368002
         AGO   .FIN  ALL DONE NOW, EXIT FROM THE INS MACRO-INSTRUCTION. 13376002
.********************************************************************** 13384002
.* ALL FINISHED WITH COMPATIBILITY PROCESSING WITH THE OLD FORMATS,   * 13392002
.* NOW REALLY DO IT.                                                  * 13400002
.********************************************************************** 13408002
.NEW     ANOP                                                           13416002
.********************************************************************** 13424002
.* CHECK TO SEE IF THE LABEL FIELD IS CODED AND GENERATE THE          * 13432002
.* APPROPRIATE EQUATE IF IT IS.                                       * 13440002
.********************************************************************** 13448002
         AIF   (K'&TAG EQ 0).NOTAG  GO AROUND THE EQUATE IF THE TAG IS *13456002
                         NOT PRESENT.                                   13464002
&TAG     EQU   *         PROVIDE THE LABEL.                             13472002
.NOTAG   ANOP                                                           13480002
.********************************************************************** 13488002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 13496002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 13504002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 13512002
.* TYPE CHECKING SECTION.                                             * 13520002
.********************************************************************** 13528002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    13536002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *13544002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     13552002
.********************************************************************** 13560002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 13568002
.* AND IF THEY ARE NOT THEN USE T.                                    * 13576002
.********************************************************************** 13584002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*13592002
                         T.                                             13600002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       13608002
.RPT#TCK ANOP                                                           13616002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              13624002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *13632002
                         PARTITION TREE TYPE.                           13640002
.********************************************************************** 13648002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 13656002
.********************************************************************** 13664002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *13672002
                         RPT.                                           13680002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *13688002
                         THE TYPE PARAMETER.                            13696002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      13704002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*13712002
               Q '4')).RPT#FIN                                          13720002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    13728002
.RPT#8   ANOP                                                           13736002
&IGARPT# SETC  '8'       SET RPT TYPE TO THE DEFAULT.                   13744002
.RPT#FIN ANOP                                                           13752002
      RPTDSECT T=5,DS=NO                                                13760002
      RPTDSECT T=8,DS=NO                                                13768002
.********************************************************************** 13776002
.* INSERT INTO A TYPE 8 RADIX PARTITION TREE. FIRST CHECK TO SEE      * 13784002
.* WHETHER THE AREA TO HOLD THE NEW RECORD MUST BE ALLOCATED VIA THE  * 13792002
.* GSPACE MACRO-INSTRUCTION. IF THE R-PARAMETER IS CODED THEN THE AREA* 13800002
.* MUST BE ALLOCATED. IF THE AREA DOES NOT HAVE TO BE ALLOCATED GO    * 13808002
.* DIRECTLY TO .CHKA.                                                 * 13816002
.********************************************************************** 13824002
         AIF   (K'&R EQ 0).CHKA  SEE IF THERE IS NO RECORD SPECIFIED.   13832002
.********************************************************************** 13840002
.* CHECK TO SEE WHETHER THE TREE ADDRESS IS IN GPR 1 AND MUST BE      * 13848002
.* PRESERVED THROUGH THE GSPACE OPERATION.                            * 13856002
.********************************************************************** 13864002
         AIF   (K'&TREE EQ 0).TREEMT  GO IF THE TREE PARAMETER IS NOT  *13872002
                         CODED.                                         13880002
         AIF   ('&TREE'(1,1) NE '(').TREEOK  SEE IF IT IS NOT IN A     *13888002
                         REGISTER.                                      13896002
         AIF   ('&TREE' EQ '(1)').TREEMT  SEE IF IT IS SPECIFICALLY    *13904002
                         SPECIFIED IN REGISTER 1.                       13912002
         AGO   .TREEOK   IT IS APPARENTLY NOT IN REGISTER 1, ASSUME IT *13920002
                         IS OK.                                         13928002
.TREEMT  ST    1,((4*1)+20-64*((2+1)/16))(,13)  SAVE R1.                13936002
&R1SAVED SETB  (1)       SET THE BIT ON TO INDICATE R1 WAS STORED      *13944002
                         THROUGH THE GSPACE OPERATION.                  13952002
.TREEOK  ANOP                                                           13960002
.********************************************************************** 13968002
.* DETERMINE THE LENGTH OF THE AREA NEEDED FOR THE RECORD BY ADDING UP* 13976002
.* ALL THE INDIVIDUAL LENGTHS IN THE DISPLACEMENT-LENGTH PAIRS IN THE * 13984002
.* R-PARAMETER.                                                       * 13992002
.********************************************************************** 14000002
.* THE R PARAMETER HAS BEEN CHECKED AT THIS POINT, AND IS NOT THE     * 14008002
.* EMPTY STRING.                                                      * 14016002
.* THE FOLLOWING LOOP IS DONE TWICE; THE FIRST TIME THROUGH IT ONLY   * 14024002
.* CHECKS ALL THE R-PARAMETER ELEMENTS FOR VALIDITY AND ADDS UP ALL   * 14032002
.* THE FIELD LENGTHS FOR THE GSPACE, AND THE SECOND TIME THROUGH IT   * 14040002
.* GENERATES ALL THE MVC'S TO MOVE THE RECORD TO THE AREA ALLOCATED.  * 14048002
.* IF THE FIRST TIME THROUGH FINDS ERRORS, THEN THERE IS NO SECOND    * 14056002
.* TIME.                                                              * 14064002
.********************************************************************** 14072002
.LOOPAIR ANOP                                                           14080002
&IGARECL SETA  0         INITIALIZE THE RECORD LENGTH TO ZERO.          14088002
         AIF   (N'&R EQ 2).RHAS2  SEE IF THERE ARE EXACTLY TWO ELEMENTS*14096002
                         IN R ON PARENTHESIS LEVEL ONE.                 14104002
         AIF   (N'&R NE 1).RMIXED  SEE IF THERE ARE MORE THAN TWO      *14112002
                         ELEMENTS, FOR IF SO THE LIST CONSISTS OF A    *14120002
                         SERIES OF FIELD NAMES OR (D,L) PAIRS.          14128002
.********************************************************************** 14136002
.* R HAS ONLY ONE ELEMENT ON LEVEL 1. FIND OUT WHICH OF THE FOLLOWING * 14144002
.* CASES APPLIES, AND TAKE THE INDICATED ACTION:                      * 14152002
.* IN THE FOLLOWING DISCUSSION, )F" MEANS A FIELD NAME, "D" MEANS     * 14160002
.* DISPLACEMENT, "L" MEANS LENGTH, AND "X" MEANS ANY STRING. THE D AND* 14168002
.* L FIELDS MUST BE SELF-DEFINING TERMS,.                             * 14176002
.* IF:   THEN:                                                        * 14184002
.* R=F   ENTER THE ROUTINE AT .RMIXED TO PROCESS A LIST OF PAIRS OF   * 14192002
.*       F'S AND (D,L) PAIRS, SINCE THIS CASE WILL BE TREATED AS A    * 14200002
.*       SINGLE FIELD NAME BY THAT ROUTINE.                           * 14208002
.* R=(F) THIS IS AN ERROR, BECAUSE OF THE POSSIBLE FUTURE USE OF THIS * 14216002
.*       FORM TO INDICATE THE ADDRESS OF A LIST OF DISPLACEMENT-LENGTH* 14224002
.*       PAIRS IN A REGISTER.                                         * 14232002
.* R=L   L IS THE LENGTH OF THE RECORD TO BE INSERTED. THE A PARMAETER* 14240002
.*       MUST BE CODED FOR THIS TO BE VALID, BECAUSE OTHERWISE THERE  * 14248002
.*       IS NO WAY TO FIND OUT WHERE THE RECORD IS THAT IS TO BE      * 14256002
.*       INSERTED.                                                    * 14264002
.* R=(L) THIS IS AN ERROR, BECAUSE OF THE POSSIBILITY THAT IN THE     * 14272002
.*       FUTURE I WILL WANT TO PUT THE ADDRESS OF A LIST OF           * 14280002
.*       DISPLACEMENT-LENGTH PAIRS IN A REGISTER.                     * 14288002
.* R=((X)) ENTER THE .RMIXED ROUTINE, SINCE IT LOOKS LIKE A LIST OF   * 14296002
.*       DISPLACEMENT-LENGTH PAIRS WITH ONLY ONE PAIR.                * 14304002
.*       ANYTHING ELSE IS INVALID, AND PRODUCES THE MNOTE 12,'INVALID * 14312002
.*       R-PARAMETER.'                                                * 14320002
.********************************************************************** 14328002
         AIF   ('&R'(1,1) NE '(').RNOTLP  SEE IF THERE ARE NO          *14336002
                         PARENTHESES AROUND THE OPERAND.                14344002
         AIF   ('&R'(1,2) EQ '((').RMIXED  SEE IF THIS IS THE CASE     *14352002
                         R=((X)).                                       14360002
         MNOTE 12,'A REGISTER CANNOT BE SPECIFIED FOR THE LIST OF DISPL*14368002
               ACEMENT-LENGTH PAIRS.'                                   14376002
&ERROR   SETB  1         SET THE ERROR FLAG ON.                         14384002
         AGO   .RFIN     END THIS PART.                                 14392002
.********************************************************************** 14400002
.* THIS MUST BE ONE OF THE TWO CASES R=F OR R=L.                      * 14408002
.********************************************************************** 14416002
.RNOTLP  ANOP                                                           14424002
         AIF   (((T'&R(1) NE 'M')AND(T'&R(1) NE 'N')AND(T'&R(1) NE 'O')*14432002
               AND(T'&R(1) NE 'T')AND(T'&R(1) NE 'W')AND(T'&R(1) NE '$'*14440002
               )AND(T'&R(1) NE 'U'))).RMIXED                            14448002
.* THIS MUST BE THE CASE WHERE "R=L" IS CODED.                        * 14456002
         AIF   (T'&R(1) NE 'N').R1NOTN  SEE IF IT IS A SELF-DEFINING   *14464002
                         FIELD.                                         14472002
.********************************************************************** 14480002
.* R=L IS CODED, AND L IS A SELF-DEFINING TERM. USE L FOR THE RECORD  * 14488002
.* LENGTH, BUT FIRST CHECK TO SEE IF THE A PARAMETER IS CODED. IF THE * 14496002
.* A PARAMETER IS NOT CODED IT IS AN ERROR.                           * 14504002
.********************************************************************** 14512002
&IGARECL SETA  (&R(1))   GET THE RECORD LENGTH FROM THE L OF THE R     *14520002
                         PARAMETER.                                     14528002
         AIF   (K'&A EQ 0).R1AMT  SEE IF THE A PARAMETER HAS BEEN LEFT *14536002
                         OUT.                                           14544002
         AIF   (&IGARECL GT 256).R1LERR  FOR THE NONCE ONLY TAKE FIELDS*14552002
                         THAT ARE LESS THAN 257 BYTES LONG.             14560002
         AIF   (NOT &XFER).RFIN  SEE IF THIS IS THE MVC GENERATION     *14568002
                         LOOP, OR JUST THE VALIDATION AND ADDING UP    *14576002
                         FIELD LENGTHS LOOP.                            14584002
.* GENERATE THE MOVE OF THE RECORD TO THE AREA ALLOCATED VIA GSPACE.  * 14592002
         AIF   ('&A'(1,1) EQ '(').R1AGPR  SEE IF THE ADDRESS IS IN A   *14600002
                         GPR.                                           14608002
         MVC   0(&IGARECL,1),&A  MOVE THE RECORD.                       14616002
         AGO   .RFIN     ALL DONE NOW.                                  14624002
.R1AGPR  MVC   0(&IGARECL,1),0&A  MOVE THE RECORD.                      14632002
         AGO   .RFIN     GO TO THE END OF THE R PARAMETER PROCESSING.   14640002
.********************************************************************** 14648002
.* FOLLOWING ARE THE MISCELLANEOUS ERROR MNOTES FROM THE SINGLE       * 14656002
.* ELEMENT CASE OF THE R PARAMETER.                                   * 14664002
.********************************************************************** 14672002
.R1LERR  MNOTE 12,'THE LENGTH OF EACH FIELD DEFINED BY R CANNOT EXCEED *14680002
               256 BYTES.'                                              14688002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON SO THE MVC'S DON'T GET  *14696002
                         GENERATED.                                     14704002
         AGO   .RFIN                                                    14712002
.R1AMT   MNOTE 12,'THE A PARAMETER MUST BE CODED WITH R AS CODED.'      14720002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         14728002
         AGO   .RFIN                                                    14736002
.R1NOTN  MNOTE 12,'THE LENGTH MUST BE A SELF-DEFINING TERM FOR THE R PA*14744002
               RAMETER.'                                                14752002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         14760002
         AGO   .RFIN                                                    14768002
.********************************************************************** 14776002
.* THE R PARAMETER HAS EXACTLY TWO ELEMENTS IN IT ON LEVEL 1. SEE IF  * 14784002
.* EITHER OF THESE TWO ELEMENTS STARTS WITH A LEFT PARENTHESIS, WHICH * 14792002
.* MEANS ONE OF THE CASES R=(X,(X)), R=((X),X), OR R=((X),(X)). IF IT * 14800002
.* IS ONE OF THESE CASES ENTER THE MIXED ROUTINE AT .RMIXED.          * 14808002
.* IF IT IS NOT ONE OF THOSE THREE CASES, THEN IT MUST BE ONE OF THE  * 14816002
.* CASES R=(F,F), R=(F,L), OR R=(D,L). NOTE THAT THE CASE R=(D,L) CAN * 14824002
.* BE CODED AS R=(,L).                                                * 14832002
.********************************************************************** 14840002
.RHAS2   AIF   (K'&R(2) NE 0).R2NOTMT  SEE IF THE SECOND ELEMENT IS THE*14848002
                         EMPTY STRING. THIS IS NO GOOD.                 14856002
         MNOTE 12,'THE SECOND ELEMENT OF A DISPLACEMENT-LENGTH PAIR MUS*14864002
               T BE CODED.'                                             14872002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         14880002
         AGO   .FIN      FORGET IT, CAN'T DO ANYTHING WITH AN EMPTY    *14888002
                         STRING FOR THE LENGTH.                         14896002
.R2DMT   ANOP                                                           14904002
&DSP     SETA  (0)       SET THE DISPLACEMENT TO ZERO, SINCE IT IS     *14912002
                         CODED AS THE EMPTY STRING.                     14920002
         AGO   .R2MERGE  MERGE WITH THE CASE WHERE THE DISPLACEMENT IS *14928002
                         NOT THE EMPTY STRING.                          14936002
.R2NOTMT AIF   (K'&R(1) EQ 0).R2DMT  SEE IF THE DISPLACEMENT IS THE    *14944002
                         EMPTY STRING.                                  14952002
         AIF   (('&R(1)'(1,1) EQ '(')OR('&R(2)'(1,1) EQ '(')).RMIXED   *14960002
                         LOOK FOR ONE OF THE CASES R=(X,(X)), R=((X),  *14968002
                         X), OR R=((X),(X)).                            14976002
         AIF   (((T'&R(2) NE 'M')AND(T'&R(2) NE 'N')AND(T'&R(2) NE 'O')*14984002
               AND(T'&R(2) NE 'T')AND(T'&R(2) NE 'W')AND(T'&R(2) NE '$'*14992002
               )AND(T'&R(2) NE 'U'))).RMIXED                            15000002
.* THE SECOND ELEMENT IS NOT A FIELD NAME, SO IT MUST EITHER BE ONE OF* 15008002
.* THE TWO CASES R=(F,L) OR R=(D,L), OR IT IS AN ERROR.               * 15016002
         AIF   ((T'&R(1) NE 'M')AND(T'&R(1) NE 'N')AND(T'&R(1) NE 'O')A*15024002
               ND(T'&R(1) NE 'T')AND(T'&R(1) NE 'W')AND(T'&R(1) NE '$')*15032002
               AND(T'&R(1) NE 'U')).R2F1                                15040002
         AIF   (T'&R(1) NE 'N').R2DTYPE  SEE IF THE FIRST ONE IS A     *15048002
                         VALID DISPLACEMENT.                            15056002
&DSP     SETA  (&R(1))   PICK UP THE DISPLACEMENT.                      15064002
.R2MERGE ANOP                                                           15072002
         AIF   (T'&R(2) EQ 'N').R2TSELF  SEE IF THE LENGTH IS A        *15080002
                         SELF-DEFINING FIELD.                           15088002
&I       SETA  (K'&R(2))  CHECK THE FIELD TO SEE IF IT ALL NUMERIC.     15096002
.R2LTKLP AIF   (('&R(2)'(&I,1) LT '0')OR('&R(2)'(&I,1) GT '9')).R2LTYPE*15104002
                         SEE IF IT IS NOT ONE OF THE DIGITS 0-9.        15112002
&I       SETA  (&I-1)    STEP DOWN TO THE NEXT CHARACTER.               15120002
         AIF   (&I GT 0).R2LTKLP  SEE IF ALL THE CHARACTERS HAVE BEEN  *15128002
                         CHECKED.                                       15136002
.R2TSELF ANOP                                                           15144002
&IGARECL SETA  (&R(2))   GET THE LENGTH AS A NUMBER.                    15152002
         AIF   (&IGARECL GT 256).R1LERR  SEE IF THE LENGTH IS MORE THAN*15160002
                         256 BYTES.                                     15168002
         AIF   (&DSP GT 4095).R2DERR  SEE IF THE DISPLACEMENT IS       *15176002
                         GREATER THAN 4095.                             15184002
         AIF   (K'&A EQ 0).R1AMT  SEE IF THE A PARAMETER IS LEFT OUT;  *15192002
                         THAT IS BAD.                                   15200002
         AIF   (NOT &XFER).RFIN  SEE IF THIS IS THE MVC GENERATING LOOP*15208002
                         OR NOT.                                        15216002
.********************************************************************** 15224002
.* GENERATE THE MOVE OF THE RECORD TO THE AREA ALLOCATED FOR IT VIA   * 15232002
.* THE GSPACE MACRO-INSTRUCTION.                                      * 15240002
.********************************************************************** 15248002
         AIF   ('&A'(1,1) EQ '(').R2AGPR  SEE IF THE ADDRESS IS IN A   *15256002
                         GPR.                                           15264002
         MVC   0(&IGARECL,1),&DSP+&A  MOVE THE RECORD.                  15272002
         AGO   .RFIN                                                    15280002
.R2AGPR  MVC   0(&IGARECL,1),&DSP&A  MOVE THE RECORD IN.                15288002
         AGO   .RFIN                                                    15296002
.********************************************************************** 15304002
.* IT IS AN (F,L) PAIR, NOW SEE IF THE SECOND ELEMENT IS A VALID L.   * 15312002
.********************************************************************** 15320002
.R2F1    AIF   (T'&R(2) NE 'N').R2LTYPE  SEE IF THE SECOND ELEMENT IS A*15328002
                         SELF-DEFINING TERM.                            15336002
&IGARECL SETA  (&R(2))   GET THE LENGTH OF THE (F,L) PAIR.              15344002
         AIF   (&IGARECL GT 256).R1LERR  SEE IF THE LENGTH OF THE FIELD*15352002
                         IS MORE THAN 256.                              15360002
         AIF   (NOT &XFER).RFIN  SEE IF THIS IS THE MOVE GENERATION    *15368002
                         LOOP.                                          15376002
         MVC   0(&IGARECL,1),&R(1)  MOVE THE RECORD.                    15384002
         AIF   (K'&A EQ 0).RFIN  SEE IF THE A PARAMETER IS CODED.       15392002
         MNOTE 4,'THE A PARAMETER IS REDUNDANT.'                        15400002
         AGO   .RFIN     ALL DONE NOW, GO CHECK FOR THE MOVE GENERATION*15408002
                         ITERATION.                                     15416002
.********************************************************************** 15424002
.* THE FOLLOWING ARE THE SUNDRY MNOTES FOR THE TWO ELEMENT CASE FOR   * 15432002
.* THE R PARAMETER.                                                   * 15440002
.********************************************************************** 15448002
.R2DERR  MNOTE 12,'DISPLACEMENT IN R PARAMETER CANNOT EXCEED 4095.'     15456002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         15464002
         AGO   .RFIN                                                    15472002
.R2DTYPE MNOTE 12,'THE DISPLACEMENT IN R MUST BE A SELF-DEFINING TERM.' 15480002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON TO PREVENT THE MVC      *15488002
                         GENERATION.                                    15496002
         AGO   .RFIN                                                    15504002
.R2LTYPE MNOTE 12,'THE LENGTH IN R MUST BE A SELF-DEFINING TERM.'       15512002
&ERROR   SETB  1         SET THE ERROR FLAG ON.                         15520002
         AGO   .RFIN                                                    15528002
.********************************************************************** 15536002
.* THE R PARAMETER CONSISTS OF A LIST OF MIXED PAIRS OF FIELDS AND    * 15544002
.* DISPLACEMENT-LENGTH PAIRS. PICK OUT ALL THESE AND CHECK THEM FOR   * 15552002
.* VALIDITY, WHILE ADDING UP ALL THE LENGTHS OF THE INDIVIDUAL FIELDS * 15560002
.* FOR THE GSPACE MACRO-INSTRUCTION LATER. GENERATE THE MVC'S IF THIS * 15568002
.* IS THE SECOND TIME THROUGH THE LOOP.                               * 15576002
.********************************************************************** 15584002
.********************************************************************** 15592002
.* THIS IS THE SECTION TO PROCESS A MIXED LIST OF FIELD NAMES AND (D  * 15600002
.* ,L) PAIRS. PARSE THE OPERAND USING THE PARSE IN THE RPTDSECT       * 15608002
.* MACRO-INSTRUCTION, AND CHECK THE VARIABLE &IGAOKAY TO SEE IF THERE * 15616002
.* ARE NO SYNTAX ERRORS IN THE R PARAMETER.                           * 15624002
.********************************************************************** 15632002
.RMIXED  ANOP                                                           15640002
      RPTDSECT SCAN=PARSE,LIST=&R  PARSE THE OPERAND.                   15648002
         AIF   (&IGAOKAY).RMXOK  SEE IF THE PARSE DETECTED BAD SYNTAX.  15656002
         MNOTE 12,'INVALID SYNTAX IN THE R PARAMETER.'                  15664002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         15672002
         AGO   .RFIN     CAN'T DO ANYTHING WITH THIS.                   15680002
.********************************************************************** 15688002
.* THE SYNTAX APPEARS TO BE OK, NOW START SCANNING OUT THE ATOMS ONE  * 15696002
.* AT A TIME, ANALYZING EACH ONE INDIVIDUALLY IN CONTEXT WITH THE ONES* 15704002
.* ON EITHER SIDE OF IT.                                              * 15712002
.********************************************************************** 15720002
.RMXOK RPTDSECT SCAN=ISCAN  INITIALIZE FOR SUBSEQUENT SCANNING OF      *15728002
                         ATOMS.                                         15736002
.RMXMOR RPTDSECT SCAN=NEXT  GET THE CURSOR POSITIONED AT THE NEXT ATOM. 15744002
.RMXCHK  AIF   (&IGAX EQ 0).RFIN  SEE IF THERE ARE ANY MORE TO DO.      15752002
         AIF   (&IGALEVL EQ 2).RMXLVL2  SEE IF THIS ATOM IS ON LEVEL 2. 15760002
         AIF   (&IGALEVL LE 1).RMXL01  SEE IF THIS ATOM IS ON LEVEL 0  *15768002
                         OR 1.                                          15776002
.********************************************************************** 15784002
.* THE CURRENT ATOM HAS TOO MANY LEVELS OF PARENTHESES AROUND IT, GIVE* 15792002
.* THE ERROR MESSAGE AND GO LOOK FOR THE NEX THING THAT CHANGES LEVEL * 15800002
.* 1 IN THE PATH VECTOR.                                              * 15808002
.********************************************************************** 15816002
&I       SETA  &IGAPATH(1)+1  SET &I TO THE CURRENT OPERAND NUMBER.     15824002
         MNOTE 12,'TOO MANY () LEVELS IN OPERAND &I OF R.'              15832002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         15840002
.********************************************************************** 15848002
.* AN ERROR HAS BEEN DETECTED AND FLAGGED IN THE CURRENT OPERAND. SCAN* 15856002
.* OVER TO THE NEXT ATOM THAT IS NOT PART OF THE CURRENT ENTRY ON     * 15864002
.* LEVEL 1 IN THE PARAMETER.                                          * 15872002
.********************************************************************** 15880002
.SYNC    ANOP                                                           15888002
&I       SETA  &IGAPATH(1)  SET &I TO THE INDEX OF THE OPERAND ON LEVEL*15896002
                         1.                                             15904002
      RPTDSECT SCAN=NEXT  SET THE CURSOR TO THE NEXT ONE.               15912002
         AIF   (&IGAX EQ 0).RFIN  SEE IF THERE AREN'T ANY MORE.         15920002
         AIF   (&I EQ &IGAPATH(1)).SYNC  SEE IF IT IS STILL ON THE SAME*15928002
                         ONE.                                           15936002
         AGO   .RMXCHK   FINALLY GOT THE NEXT ATOM, NOW GO CHECK IT FOR*15944002
                         VALIDITY.                                      15952002
.********************************************************************** 15960002
.* THE CURRENT ATOM IS ON LEVEL 0 OR 1. THEREFORE IT SHOULD BE A VALID* 15968002
.* FIELD NAME; SEE IF IT IS.                                          * 15976002
.********************************************************************** 15984002
.RMXL01  ANOP                                                           15992002
.RMX01   ANOP                                                           16000002
&I       SETA  (1+&IGAPATH(1))  SET &I TO THE 1-ORIGIN INDEX OF THE    *16008002
                         FIELD NAME ON LEVEL 1.                         16016002
         AIF   ((T'&R(&I) NE 'M')AND(T'&R(&I) NE 'N')AND(T'&R(&I) NE 'O*16024002
               ')AND(T'&R(&I) NE 'T')AND(T'&R(&I) NE 'W')AND(T'&R(&I) N*16032002
               E '$')AND(T'&R(&I) NE 'U')).RMX01OK                      16040002
         MNOTE 12,'OPERAND &I OF R DOES NOT HAVE THE PROPER TYPE ATTRIB*16048002
               UTE.'                                                    16056002
&ERROR   SETB  (1)       SET THE ERROR FLAG.                            16064002
         AGO   .SYNC     GO POSITION THE CURSOR TO THE NEXT ONE.        16072002
.********************************************************************** 16080002
.* THE CURRENT ATOM LOOKS LIKE A VALIID FIELD NAME, GET ITS LENGTH    * 16088002
.* ATTRIBUTE AND SEE IF IT ACCEPTABLE.                                * 16096002
.********************************************************************** 16104002
.RMX01OK ANOP                                                           16112002
&LNG     SETA  (L'&R(&I))  CAPTURE IT AS A NUMBER.                      16120002
         AIF   (&LNG LE 256).RMX0LOK  SEE IF IT EXCEEDS 256.            16128002
         MNOTE 12,'THE LENGTH OF FIELD &I OF R EXCEEDS 256 BYTES.'      16136002
&ERROR   SETB  (1)       SET TEH ERROR FLAG.                            16144002
         AGO   .SYNC     GO LOOK AT THE NEXT ONE.                       16152002
.RMX0LOK ANOP                                                           16160002
.********************************************************************** 16168002
.* NOW SEE IF THIS IS THE MOVE GENERATION ITERATION.                  * 16176002
.********************************************************************** 16184002
         AIF   (NOT &XFER).RX0M  GO IF THIS ISN'T THE MOVE GENERATION  *16192002
                         ITERATION.                                     16200002
         MVC   &IGARECL.(&LNG,1),&R(&I)  MOVE THE FIELD.                16208002
.RX0M    ANOP                                                           16216002
&IGARECL SETA  (&IGARECL+&LNG)  EKE THE CUMMULATIVE RECORD LENGTH.      16224002
         AGO   .RMXMOR   GO LOKK FOR THE NEXT ONE.                      16232002
.********************************************************************** 16240002
.* THE CURRENT ATOM IS ON LEVEL 2. IT MUST THEREFORE BE THE FIRST     * 16248002
.* ELEMENT IN ONE OF THE CASES (F,L) OR (D,L).                        * 16256002
.* FIND OUT WHETHER THE CURRENT ATOM IS AN F OR A D.                  * 16264002
.********************************************************************** 16272002
.RMXLVL2 ANOP                                                           16280002
&X       SETC  '0'       SET THIS FOR THE CASE WHERE THE DISPLACEMENT  *16288002
                         IS AN EMPTY STRING.                            16296002
         AIF   (&IGAZ EQ 0).RMGDSP  GO IF IT IS AN EMPTY STRING, WHICH *16304002
                         MEANS A DISPLACEMENT OF 0.                     16312002
.********************************************************************** 16320002
.* SEE IF ALL THE CHARACTERS IN THE CURRENT ATOM ARE DIGITS 0 THROUGH * 16328002
.* 9, WHICH WOULD MAKE IT A SELF-DEFINING DECIMAL TERM.               * 16336002
.********************************************************************** 16344002
&I       SETA  0         INITIALIZE THE INDEX OF THE CURRENT CHARACTER *16352002
                         IN THE ATOM.                                   16360002
.RMCONT  AIF   (('&R'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&R'(&IGALEFT(&IG*16368002
               AZ)+&I,1) GT '9')).RMNOTD                                16376002
&I       SETA  (&I+1)    EKE THE INDEX.                                 16384002
         AIF   (&I LT &IGARGHT(&IGAZ)).RMCONT  KEEP GOING UNTIL ALL    *16392002
                         DIGITS HAVE BEEN EXAMINED.                     16400002
         AIF   (&IGARGHT(&IGAZ) GT 4).RMXBADD  SEE IF THE DISPLACEMENT *16408002
                         HAS TOO MANY BYTES IN IT.                      16416002
&X       SETC  '&R'(&IGALEFT(&IGAZ),&I)  GET THE DISPLACEMENT AS A     *16424002
                         NUMBER.                                        16432002
.RMGDSP  ANOP                                                           16440002
&DSP     SETA  (&X)      GET THE NUMBER NOW.                            16448002
         AIF   (&DSP GT 4095).RMXDBAD  SEE IF THE DISPLACEMENT IS TOO  *16456002
                         BIG.                                           16464002
.********************************************************************** 16472002
.* THE CURRENT ATOM IS A VALID DISPLACEMENT OF A (D,L) PAIR, AND ITS  * 16480002
.* ARITHMETIC VALUE IS IN THE APPROPRIATE RANGE OF VALUES FOR A       * 16488002
.* DISPLACEMENT. ITS VALUE HAS BEEN CAPTURED IN &DSP. NOW LOOK FOR THE* 16496002
.* CORRESPONDING L OF THE PAIR.                                       * 16504002
.********************************************************************** 16512002
&I       SETA  (&IGAPATH(1))  SAVE THE CURRENT ATOM LEVEL 1 INDEX.      16520002
      RPTDSECT SCAN=NEXT  POSITION THE CURSOR TO THE NEXT ATOM.         16528002
         AIF   (&IGAX EQ 0).RMXNOLL  SEE IF THERE ISN'T ANY L FOR IT   *16536002
                         BECAUSE THERE AREN'T ANY MORE ATOMS.           16544002
         AIF   (&IGAPATH(1) NE &I).RMXNOL  SEE IF THE NEXT ATOM IS PART*16552002
                         OF A DIFFERENT ELEMENT ON LEVEL 1.             16560002
         AIF   (&IGALEVL NE 2).RMXPRN  SEE IF THERE ARE TOO MANY LEVELS*16568002
                         OF PARENTHESES.                                16576002
         AIF   (&IGAZ EQ 0).RMXLBAD  SEE IF THE L ATOM IS THE EMPTY    *16584002
                         STRING.                                        16592002
.********************************************************************** 16600002
.* THERE IS A NEXT ATOM IN THE SAME PAIR, NOW CHECK IT TO SEE IF IT IS* 16608002
.* A SELF-DEFINING DECIMAL TERM.                                      * 16616002
.********************************************************************** 16624002
&I       SETA  0  INITIALIZE THE INDEX OF THE CURRENT BYTE IN THE ATOM. 16632002
.RMCNT1  AIF   (('&R'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&R'(&IGALEFT(&IG*16640002
               AZ)+&I,1) GT '9')).RMXBADL                               16648002
&I       SETA  (&I+1)    EKE THE INDEX TO THE NEXT BYTE.                16656002
         AIF   (&I LT &IGARGHT(&IGAZ)).RMCNT1  KEEP LOOKING UNTIL ALL  *16664002
                         THE BYTES ARE EXAMINED.                        16672002
         AIF   (&IGARGHT(&IGAZ) GT 4).RMXLERR  SEE IF THE LENGTH IS    *16680002
                         MORE THAN 4 CHARACTERS.                        16688002
&X       SETC  '&R'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))  GET THE LENGTH.   16696002
&LNG     SETA  (&X)      TURN IT INTO A NUMBER.                         16704002
         AIF   (&LNG GT 256).RMXLERR  SEE IF IT IS TOO BIG TO DO WITH  *16712002
                         AN MVC.                                        16720002
.********************************************************************** 16728002
.* THE DISPLACEMENT OF THE DISPLACEMENT-LENGTH PAIR IS AT &DSP, AND   * 16736002
.* THE LENGTH IS AT &LNG. CHECK THE A PARAMETER TO SEE IF IT IS CODED,* 16744002
.* BECAUSE IF IT ISN'T CODED THERE IS NO WAY TO FIND OUT WHERE THE    * 16752002
.* RECORD REALLY IS.                                                  * 16760002
.********************************************************************** 16768002
         AIF   (K'&A EQ 0).RMXAMT  SEE IF IT ISN'T THERE.               16776002
.* NOW GENERATE THE MOVE OF THE FIELD IF THIS IS THE MOVE GENERATION  * 16784002
.* ITERATION.                                                         * 16792002
         AIF   (NOT &XFER).RMOVED  SEE IF IT ISN'T THE MOVE GENERATION *16800002
                         ITERATION.                                     16808002
&X       SETC  ''        SET IT UP FOR THE ADDRESS IN A REGISTER.       16816002
         AIF   ('&A'(1,1) EQ '(').RMAGPR  GO IF THE ADDRESS IS IN A    *16824002
                         REGISTER.                                      16832002
&X       SETC  '+'       SET IT UP FOR THE CASE EHERE THE ADDRESS IS   *16840002
                         SUPPLIED IN THE FORM OF A LABEL.               16848002
.RMAGPR  MVC   &IGARECL.(&LNG,1),&DSP&X&A  MOVE SUBFIELD.               16856002
.RMOVED  ANOP                                                           16864002
&IGARECL SETA  (&IGARECL+&LNG)  EKE THE CUMMULATIVE RECORD LENGTH.      16872002
.********************************************************************** 16880002
.* NOW SET THE CURSOR TO THE NEXT ATOM, AND SEE IF THE FIRST ELEMENT  * 16888002
.* IS PART OF THE SAME ELEMENT ON LEVEL 1 AS THE LAST (D,L) PAIR.     * 16896002
.********************************************************************** 16904002
&I       SETA  &IGAPATH(1)  PRESERVE THE CURRENT LEVEL 0 INDEX.         16912002
      RPTDSECT SCAN=NEXT  POSITION THE CURSOR TO THE NEXT ATOM.         16920002
         AIF   (&IGAX EQ 0).RFIN  GO IF THERE ISN'T ANY NEXT ATOM.      16928002
         AIF   (&I EQ &IGAPATH(1)).RMXSAME  SEE IF THE LEVEL 1 ELEMENT *16936002
                         IN THE PATH VECTOR DIDN'T CHANGE.              16944002
         AGO   .RMXCHK   GO CHECK THE NEXT ATOM, IT ISN'T PART OF THE  *16952002
                         LAST TWO.                                      16960002
.********************************************************************** 16968002
.* THE FOLLOWING ARE SUNDRY MNOTES FROM THE PROCESSING OF A LIST OF   * 16976002
.* MIXED PAIRS WHERE THE PAIRS ARE OF THE FORM (D,L).                 * 16984002
.********************************************************************** 16992002
.RMXSAME ANOP                                                           17000002
&I       SETA  (&IGAPATH(1)+1)  SET &I TO THE CURRENT OPERAND #.        17008002
         MNOTE 12,'TOO MANY ELEMENTS IN SUBLIST OPERAND &I IN R.'       17016002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         17024002
         AGO   .SYNC     GO LOOK FOR THE NEXT ONE.                      17032002
.RMXAMT  ANOP                                                           17040002
&I       SETA  (1+&IGAPATH(1))  GET THE CURRENT OPERAND NUMBER.         17048002
         MNOTE 12,'THE A PARAMETER MUST BE CODED TO USE A (D,L) PAIR FO*17056002
               R R(&I).'                                                17064002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         17072002
         AGO   .SYNC     GO LOOK FOR THE NEXT ONE.                      17080002
.RMXLERR ANOP                                                           17088002
&I       SETA  (&IGAPATH(1)+1)  GET THE CURRENT OPERAND NUMBER.         17096002
         MNOTE 12,'THE LENGTH OF THE FIELD DEFINED BY R(&I) EXCEEDS 256*17104002
                BYTES.'                                                 17112002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         17120002
         AGO   .SYNC     GO LOOK AT THE NEXT ONE.                       17128002
.RMXBADL ANOP                                                           17136002
&I       SETA  (1+&IGAPATH(1))                                          17144002
         MNOTE 12,'THE LENGTH FOR R(&I) MUST BE A SELF-DEFINING DECIMAL*17152002
                NUMBER.'                                                17160002
&ERROR   SETB  (1)                                                      17168002
         AGO   .SYNC                                                    17176002
.RMXLBAD ANOP                                                           17184002
&I       SETA  (1+&IGAPATH(1))                                          17192002
         MNOTE 12,'THE LENGTH FOR R(&I) CANNOT BE THE EMPTY STRING.'    17200002
&ERROR   SETB  (1)                                                      17208002
         AGO   .SYNC                                                    17216002
.RMXNOL  ANOP                                                           17224002
&I       SETA  (1+&IGAPATH(1))                                          17232002
         MNOTE 12,'LENGTH OF (D,L) PAIR MISSING IN R(&I).'              17240002
&ERROR   SETB  (1)                                                      17248002
         AGO   .RMXCHK   GO CHECK THE CURRENT ATOM FOR VALIDITY.        17256002
.RMXNOLL ANOP                                                           17264002
         MNOTE 12,'LENGTH OF LAST (D,L) PAIR IN R IS MISSING.'          17272002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         17280002
         AGO   .RFIN                                                    17288002
.RMXPRN  ANOP                                                           17296002
&I       SETA  (&IGAPATH(1)+1)                                          17304002
         MNOTE 12,'TOO MANY () LEVELS IN R(&I).'                        17312002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         17320002
         AGO   .SYNC                                                    17328002
.RMXBADD ANOP                                                           17336002
&I       SETA  (1+&IGAPATH(1))                                          17344002
         MNOTE 12,'DISPLACEMENT IN R(&I) EXCEEDS 4 DIGITS.'             17352002
&ERROR   SETB  (1)                                                      17360002
         AGO   .SYNC                                                    17368002
.RMXDBAD ANOP                                                           17376002
&I       SETA  (1+&IGAPATH(1))                                          17384002
         MNOTE 12,'DISPLACEMENT IN R(&I) EXCEEDS 4095.'                 17392002
&ERROR   SETB  (1)                                                      17400002
         AGO   .SYNC                                                    17408002
.********************************************************************** 17416002
.* THE CURRENT ATOM IS AN F OF A (F,L) PAIR.                          * 17424002
.********************************************************************** 17432002
.RMNOTD  AIF   (&IGARGHT(&IGAZ) LE 8).RMXBIGF  SEE IF THE STRING IS    *17440002
                         BIGGER THAN 8 CHARACTERS.                      17448002
&I       SETA  (1+&IGAPATH(1))                                          17456002
         MNOTE 12,'FIELD NAME IN R(&I) IS BIGGER THAN 8 CHARACTERS.'    17464002
&ERROR   SETB  (1)                                                      17472002
         AGO   .SYNC                                                    17480002
.RMXBIGF ANOP                                                           17488002
&FIELD   SETC  '&R'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))  GET THE FIELD    *17496002
                         NAME.                                          17504002
.* NOW TRY TO GET THE L OF THE (F,L) PAIR.                            * 17512002
&I       SETA  (&IGAPATH(1))  PRESERVE THE CURRENT LEVEL 1 INDEX.       17520002
      RPTDSECT SCAN=NEXT  POSITION THE CURSOR TO THE NEXT ATOM.         17528002
         AIF   (&IGAX EQ 0).RFLNOL  SEE IF THERE IS NO LENGTH BECAUSE  *17536002
                         THERE ISN'T ANY NEXT ATOM.                     17544002
         AIF   (&IGAPATH(1) NE &I).RFNOL  SEE IF THE NEXT ATOM IS NOT  *17552002
                         PART OF THE SAME PAIR.                         17560002
         AIF   (&IGALEVL NE 2).RFNOLL  SEE IF THE NEXT ATOM HAS TOO    *17568002
                         MANY () LEVELS.                                17576002
         AIF   (&IGAZ EQ 0).RFLMT  SEE IF THE LENGTH ATOM IS THE EMPTY *17584002
                         STRING.                                        17592002
.********************************************************************** 17600002
.* THE CURRENT ATOM IS INDEED THE SECOND ELEMENT OF A (F,X) PAIR. NOW * 17608002
.* LET'S SEE IF X IS A VALID L.                                       * 17616002
.********************************************************************** 17624002
         AIF   (&IGARGHT(&IGAZ) GT 3).RFLLBAD  SEE IF THE LENGTH ATOM  *17632002
                         IS MORE THAN 3 DIGITS.                         17640002
&I       SETA  0         INITIALIZE THE INDEX OF THE CURRENT BYTE.      17648002
.RMXCNT2 AIF   (('&R'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&R'(&IGALEFT(&IG*17656002
               AZ)+&I,1) GT '9')).RFLBAD                                17664002
&I       SETA  (&I+1)    STEP OVER TO THE NEXT DIGIT.                   17672002
         AIF   (&I LT &IGARGHT(&IGAZ)).RMXCNT2  KEEP GOING UNTIL ALL   *17680002
                         THE DIGITS HAVE BEEN SCANNED.                  17688002
&X       SETC  '&R'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))  EXTRACT THE      *17696002
                         LENGTH.                                        17704002
&LNG     SETA  (&X)      CONVERT IT TO A NUMBER.                        17712002
         AIF   (&LNG GT 256).RFBADL  SEE IF THE LENGTH EXCEEDS 256     *17720002
                         BYTES.                                         17728002
.********************************************************************** 17736002
.* IT LOOKS LIKE A VALID (F,L) PAIR; GENERATE THE MOVE IF THIS IS THE * 17744002
.* MOVE GENERATION ITERATION.                                         * 17752002
.********************************************************************** 17760002
         AIF   (NOT &XFER).RMOVED  GO IF IT IS NOT THE MOVE ITERATION.  17768002
         MVC   &IGARECL.(&LNG,1),&FIELD  MOVE SUBFIELD.                 17776002
         AGO   .RMOVED   MERGE WITH THE COMMON PATH.                    17784002
.********************************************************************** 17792002
.* THE FOLLOWING ARE SUNDRY MNOTES FOR THE (F,L) CASE IN A MIXED LIST.* 17800002
.********************************************************************** 17808002
.RFBADL  ANOP                                                           17816002
&I       SETA  (&IGAPATH(1)+1)                                          17824002
         MNOTE 12,'LENGTH IN OPERAND &I OF R EXCEEDS 256 BYTES.'        17832002
&ERROR   SETB  (1)                                                      17840002
         AGO   .SYNC                                                    17848002
.RFLBAD  ANOP                                                           17856002
&I       SETA  (1+&IGAPATH(1))                                          17864002
         MNOTE 12,'THE LENGTH IN OPERAND R(&I) IS NOT A SELF-DEFINING D*17872002
               ECIMAL NUMBER.'                                          17880002
&ERROR   SETB  (1)                                                      17888002
         AGO   .SYNC                                                    17896002
.RFLLBAD ANOP                                                           17904002
&I       SETA  (1+&IGAPATH(1))                                          17912002
         MNOTE 12,'LENGTH IN OPERAND R(&I) IS MORE THAN 3 DIGITS.'      17920002
&ERROR   SETB  (1)                                                      17928002
         AGO   .SYNC                                                    17936002
.RFLMT   ANOP                                                           17944002
&I       SETA  (1+&IGAPATH(1))                                          17952002
         MNOTE 12,'LENGTH IN OPERAND &I OF R CANNOT BE THE EMPTY STRING*17960002
               .'                                                       17968002
&ERROR   SETB  (1)                                                      17976002
         AGO   .SYNC                                                    17984002
.RFNOL   ANOP                                                           17992002
         MNOTE 12,'LENGTH OF (F,L) PAIR IN OPERAND &I OF R IS MISSING.' 18000002
&ERROR   SETB  (1)                                                      18008002
         AGO   .RMXCHK                                                  18016002
.RFNOLL  ANOP                                                           18024002
&I       SETA  (1+&IGAPATH(1))                                          18032002
         MNOTE 12,'TOO MANY () LEVELS IN R(&I).'                        18040002
         AGO   .SYNC                                                    18048002
.RFLNOL  MNOTE 12,'LENGTH OF LAST (FIELD,LENGTH) PAIR IN R IS MISSING.' 18056002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON TO PREVENT THE MOVES.    18064002
         AGO   .RFIN                                                    18072002
.********************************************************************** 18080002
.RFIN    ANOP                                                           18088002
         AIF   ((&XFER)OR(&ERROR)).MV#FIN  SEE IF THE MOVE GENERATION  *18096002
                         LOOP MUST BE DONE THIS TIME.                   18104002
&XFER    SETB  (1)       SET IT ON SO THE MOVES ONLY GET GENERATED ONCE 18112002
&RC      SETC  'C'                                                      18120002
         AIF   (K'&C EQ 0).GSPACE  SEE IF THE CONDITIONAL PARAMETER HAS*18128002
                         BEEN LEFT OUT.                                 18136002
         AIF  ((('&C' EQ 'C')OR('&C'(1,1) EQ 'Y')OR('&C'(1,1) EQ '1')))*18144002
               .GSPACE   SEE IF IT IS A CONDITIONAL REQUEST.            18152002
&RC      SETC  ''        IT IS AN UNCONDITIONAL REQUEST.                18160002
.GSPACE  ANOP                                                           18168002
        GSPACE R&RC,LV=&IGARECL,S=&S,SP=&SP  GET SPACE TO PUT RECORD.   18176002
         AIF   ('&RC' NE 'C').SKIPBNZ  SEE IF THE REQUEST IS COND.      18184002
         BNZ   SETR&SYSNDX BR IF ALLOCATION FAILED.                     18192002
.SKIPBNZ AGO   .LOOPAIR  GO GENERATE THE MOVE OF THE RECORD.            18200002
.MV#FIN  ANOP                                                           18208002
         LR    15,1      PUT THE RECORD ADDRESS IN R15.                 18216002
         AIF   (NOT &R1SAVED).R1ISOK  SEE IF R1 WAS SAVED THROUGH THE  *18224002
                         GSPACE OPERATION.                              18232002
         L     1,((4*1)+20-64*((2+1)/16))(,13)  RESTORE R1.             18240002
.R1ISOK  AGO   .CHK#     NOW GO CHECK THE # PARAMETER.                  18248002
.********************************************************************** 18256002
.* THERE IS NO NEED TO ALLOCATE A SPACE FOR THE RECORD VIA THE GSPACE * 18264002
.* MACRO-INSTRUCTION. GET THE ADDRESS OF THE RECORD IN REGISTER 15.   * 18272002
.********************************************************************** 18280002
.CHKA    AIF   (K'&A EQ 0).ASARG  SEE IF THE ADDRESS IS OMITTED; IF IT *18288002
                         IS GET IT OUT OF THE SEARCH ARGUMENT.          18296002
         AIF   ('&A'(1,1) EQ '(').AGPR  SEE IF THE ADDRESS IS IN A GPR. 18304002
         LA    15,&A     ADDRESS OF THE RECORD TO INSERT.               18312002
         AGO   .CHKAEND  GO TO THE END OF CHECKING THE A PARAMETER.     18320002
.AGPR    AIF   ('&A' EQ '(15)').CHKAEND  SEE IF IT IS ALREADY IN R15.   18328002
         LR    15,&A(1)  INSERT ADDRESS.                                18336002
         AGO   .CHKAEND  ALL DONE NOW EXIT FROM CHECKING THE A         *18344002
                         PARAMETER.                                     18352002
.ASARG   ANOP                                                           18360002
         MNOTE 12,'EITHER A OR R MUST BE CODED TO SPECIFY THE INS.ARG.' 18368002
.CHKAEND ANOP                                                           18376002
.********************************************************************** 18384002
.* CHECK THE # PARAMETER TO SEE IF A DIFFERENT ADDRESS THAN THE ONE   * 18392002
.* FURNISHED BY THE A PARAMETER IS TO BEBUSED BY THE INSERT ROUTINE.  * 18400002
.********************************************************************** 18408002
.CHK#    AIF   (K'&# EQ 0).#ZORRO  SEE IF THE # PARAMETER IS CODED.     18416002
         AIF   ('&#'(1,1) EQ '(').#GPR  SEE IF THE # PARAMETER IS IN A *18424002
                         GPR.                                           18432002
         L     0,&#      LOAD IN THE ERSATZ ADDRESS.                    18440002
         AGO   .#FIN     ALL DONE WITH THE ERSATZ ADDRESS.              18448002
.#GPR    DC    ((30-&#(1))/16)AL1(X'18',&#(1))  LOAD THE ERSATZ ADDRESS*18456002
                         IN GPR 0 UNLESS IT IS ALREADY IN GPR 0.        18464002
         AGO   .#FIN     ALL DONE WITH THE ERSATZ ADDRESS.              18472002
.#ZORRO  LR    0,15  # NOT CODED.                                       18480002
.#FIN    ANOP                                                           18488002
.********************************************************************** 18496002
.* SEE IF THE REQUEST IS CONDITIONAL OR UNCONDITIONAL, AND CALL THE   * 18504002
.* APPROPRIATE ROUTINE IN THE MODULE IGARPT01.                        * 18512002
.********************************************************************** 18520002
         AIF   (K'&TREE EQ 0).INGPR1  SEE IF THE TREE ADDRESS IS       *18528002
                         SPECIFIED.                                     18536002
         AIF   ('&TREE'(1,1) EQ '(').RPTGPR  SEE IF THE TREE ADDRESS IS*18544002
                         IN A GPR.                                      18552002
         L     1,&TREE   LOAD THE ADDRESS OF THE RPT.                   18560002
         AGO   .R1LOAD   SKIP AROUND THE GPR CASE.                      18568002
.RPTGPR  LR    1,&TREE(1)  GET THE RPT ADDRESS.                         18576002
.R1LOAD  ANOP                                                           18584002
.INGPR1  ANOP                                                           18592002
         L     14,(&IGABLST+&IGAINS)(,1)  ADDRESS OF INSERT ROUTINE.    18600002
.********************************************************************** 18608002
.* NOW GENERATE THE LINKAGE TO THE INSERT ROUTINE IN THE MODULE       * 18616002
.* IGARPT01.                                                          * 18624002
.********************************************************************** 18632002
&REQUEST SETB  (1)       SET THE REQUEST MODE TO CONDITIONAL.           18640002
         AIF   (K'&C EQ 0).LINKC  SEE IF IT IS A CONDITIONAL REQUEST.   18648002
         AIF (('&C'(1,1) EQ 'Y')OR('&C' EQ '1')OR('&C' EQ 'C')).LINKC  *18656002
                         SEE IF IT IS A CONDITIONAL REQUEST.            18664002
&REQUEST SETB  (0)       SET THE REQUEST MODE TO UNCONDITIONAL.         18672002
         BALR  14,14     INDICATE UNCONDITIONAL TYPE 8 INSERT.          18680002
         AGO   .LINKFIN  ALL DONE WITH THE LINKAGE.                     18688002
.LINKC   BAL   14,0(,14)  INDICATE CONDITIONAL INSERT.                  18696002
.LINKFIN ANOP                                                           18704002
         AIF   (K'&R EQ 0).FIN  SEE IF THE AREA WAS ALLOCATED VIA THE  *18712002
                         GSPACE MACRO-INSTRUCTION.                      18720002
         AIF   (NOT &REQUEST).FIN  SEE IF IT WAS AN UNCONDITIONAL      *18728002
                         REQUEST.                                       18736002
&FINEQU  SETB  (1)       SET THE BIT ON TO GENERATE THE EQUATE AT THE  *18744002
                         END OF THE MACRO EXECUTION.                    18752002
         BC    10,FIN&SYSNDX  BRANCH IF THE INSERT WAS SUCCESSFUL.      18760002
         L     1,X'10'(,13)  PUT THE ADDRESS IN R1 TO FREE IT UP.       18768002
        FSPACE LV=&IGARECL,A=(1),SP=&SP,S=&S                            18776002
SETR&SYSNDX LA 15,1      SET THE RETURN CODE NEGATIVE.                  18784002
         LNR   15,15     SET THE CONDITION CODE ALSO.                   18792002
.FIN     AIF   (NOT &FINEQU).END  SEE IF THE EQUATE MUST BE GENERATED.  18800002
FIN&SYSNDX EQU *         LABEL FOR THE BRANCH TO BRANCH TO.             18808002
.END     ANOP                                                           18816002
         MEND                                                           18824002
         EJECT                                                          18832002
         MACRO                                                          18840002
&TAG     ISCAN &TREE,&T=,&TYPE=                                         18848002
.*A000000                                                        Y02147 18856002
.********************************************************************** 18864002
.* THE ISCAN MACRO-INSTRUCTION SETS THE RPT CURSOR AT 12 O'CLOCK.     * 18872002
.* EVERY RADIX PARTITION TREE HAS A CURSOR AS PART OF THE CONTROL     * 18880002
.* INFORMATION THAT IS MAINTAINED BY THE OPERATIONS PROVIDED. THERE   * 18888002
.* ARE 6 BASIC CURSOR STATES. A CURSOR IS BEST VISUALIZED AS A        * 18896002
.* POSITION ON A CIRCLE (SUCH AS A CLOCK). THE POSITION THAT SELECTS  * 18904002
.* THE KEY-ADDRESS PAIR WITH THE LOWEST KEY IS AT 8 O'CLOCK. THE      * 18912002
.* POSITION THAT SELECTS THE KEY-ADDRESS PAIR WITH THE HIGHEST KEY IS * 18920002
.* AT 4 O'CLOCK. THE KEY-ADDRESS PAIRS ARE IN ASCENDING ORDER FROM    * 18928002
.* LEFT TO RIGHT ACROSS THE BOTTOM OF THE CIRCLE, STARTING WITH THE 8 * 18936002
.* O'CLOCK POSITION AND ENDING WITH THE 4 O'CLOCK POSITION.           * 18944002
.* THE CURSOR STATES AND THE OPERATIONS THAT SET THEM ARE LISTED      * 18952002
.* BELOW:                                                             * 18960002
.* 0:    THIS STATE IS THE EMPTY, OR NULL STATE, WHERE THERE ARE NO   * 18968002
.*       KEY-ADDRESS ASSOCIATION PAIRS IN THE RPT.                    * 18976002
.* 1:    THIS STATE IS THE ONE WHERE THE CURSOR IS IN THE 9 O'CLOCK   * 18984002
.*       POSITION. THIS STATE CAN ONLY ARISE WHEN THERE IS AT LEAST 1 * 18992002
.*       KEY-ADDRESS ASSOCIATION PAIR IN THE RPT. THE CURSOR IS       * 19000002
.*       POSITIONED BEFORE THE KEY-ADDRESS PAIR WITH THE LOWEST KEY.  * 19008002
.*       THIS STATE CAN ARISE BY REPEATEDLY EXECUTING THE SCANL       * 19016002
.*       OPERATION, UNTIL THE CURSOR GOES PAST THE LEFT END OF THE    * 19024002
.*       RANGE OF KEYS PRESENT IN THE RPT. IT CAN ALSO ARISE BY USING * 19032002
.*       THE DEL MACRO-INSTRUCTION, WHEN THE KEY-ADDRESS PAIR DELETED * 19040002
.*       IS THE ONE WITH THE LOWEST KEY. THERE ARE NO OTHER WAYS IT   * 19048002
.*       CAN ARISE.                                                   * 19056002
.* 2:    THIS STATE REPRESENTS THE CURSOR POSITION AT 3 O'CLOCK, AND  * 19064002
.*       IS SIMILAR TO THE 9 O'CLOCK STATE, BUT THE CURSOR IS         * 19072002
.*       POSITIONED AFTER THE KEY-ADDRESS PAIR WITH THE HIGHEST KEY.  * 19080002
.*       THIS STATE CAN ONLY ARISE IF THE RPT HAS AT LEAST ONE        * 19088002
.*       KEY-ADDRESS ASSOCIATION PAIR PRESENT, AND CAN ONLY COME ABOUT* 19096002
.*       AS A RESULT OF DELETING THE KEY-ADDRESS PAIR WITH THE HIGHEST* 19104002
.*       KEY, OR BY REPEATED EXECUTIONS OF THE SCANR                  * 19112002
.*       MACRO-INSTRUCTION, UNTIL THE CURSOR GOES PAST THE RIGHTMOST  * 19120002
.*       KEY-ADDRESS PAIR.                                            * 19128002
.* 3:    IN THIS STATE THE CURSOR IS POSITIONED AT A SINGLE           * 19136002
.*       KEY-ADDRESS PAIR. THIS STATE CAN NOT ARISE UNLESS THERE IS AT* 19144002
.*       LEAST ONE KEY-ADDRESS ASSOCIATION PAIR PRESENT IN THE RPT.   * 19152002
.*       THIS STATE CAN ARISE AS A RESULT OF EXECUTING THE INS        * 19160002
.*       MACRO-INSTRUCTION, BY EXECUTING THE SRCH MACRO-INSTRUCTION,  * 19168002
.*       OR BY EXECUTING EITHER THE SCANL OR SCANR MACRO-INSTRUCTIONS.* 19176002
.*       THE SRCH MACRO-INSTRUCTION ALWAYS SETS THE CURSOR IN THIS    * 19184002
.*       STATE IF THERE IS AT LEAST ONE KEY-ADDRESS PAIR IN THE RPT.  * 19192002
.*       IF THERE ARE NO PAIRS PRESENT, THE SRCH MACRO-INSTRUCTION    * 19200002
.*       SETS THE CURSOR TO THE EMPTY, OR NULL, STATE.                * 19208002
.*       THE INS MACRO-INSTRUCTION ALWAYS SETS THE CURSOR TO THIS     * 19216002
.*       STATE.                                                       * 19224002
.*       THE SCANL AND SCANR MACRO-INSTRUCTIONS ALWAYS SET THE CURSOR * 19232002
.*       TO THIS STATE UNLESS THE CURSOR WAS PREVIOUSLY POSITIONED IN * 19240002
.*       THE 8 O'CLOCK OR 4 O'CLOCK POSITION. WHEN THE CURSOR IS IN   * 19248002
.*       THE 4 O'CLOCK POSITION AND THE SCANR MACRO-INSTRUCTION IS    * 19256002
.*       EXECUTED, THE CURSOR STATE IS STATE 2. WHEN THE CURSOR IS IN * 19264002
.*       THE 8 O'CLOCK POSITION AND THE SCANL MACRO-INSTRUCTION IS    * 19272002
.*       EXECUTED, THE CURSOR IS POSITIONED IN STATE 1.               * 19280002
.* 4:    IN THIS STATE THE CURSOR IS POSITIONED BETWEEN TWO           * 19288002
.*       KEY-ADDRESS PAIRS. THIS STATE CAN ONLY ARISE WHEN THERE ARE  * 19296002
.*       AT LEAST TWO KEY-ADDRESS PAIRS PRESENT IN THE RPT. THE ONLY  * 19304002
.*       OPERATION THAT SETS THE CURSOR TO THIS STATE IS THE DEL      * 19312002
.*       OPERATION. THE CURSOR IS SET TO THIS STATE SO THAT IF A SCANR* 19320002
.*       OR SCANL OPERATION IS THEN EXECUTED THE CURSOR IS SET AT THE * 19328002
.*       KEY-ADDRESS PAIR ON THE RIGHT OF LEFT, RESPECTIVELY, OF THE  * 19336002
.*       KEY-ADDRESS PAIR THAT WAS DELETED.                           * 19344002
.* 5:    IN THIS STATE THE CURSOR IS IN THE 12 O'CLOCK POSITION. THE  * 19352002
.*       ISCAN MACRO-INSTRUCTION IS THE ONLY ONE THAT SETS THE CURSOR * 19360002
.*       IN THIS STATE. WHEN THE SCANR MACRO-INSTRUCTION IS EXECUTED  * 19368002
.*       WITH THE CURSOR IN THIS STATE, THEN THE CURSOR IS SET TO     * 19376002
.*       STATE 3, POSITIONED AT THE KEY-ADDRESS PAIR WITH THE LOWEST  * 19384002
.*       KEY. WHEN THE SCANL OPERATION IS EXECUTED WITH THE CURSOR IN * 19392002
.*       THIS STATE, THE CURSOR IS SET TO STATE 3, POSITIONED AT THE  * 19400002
.*       KEY-ADDRESS PAIR WITH THE HIGHEST KEY. IN THIS WAY THE ISCAN * 19408002
.*       MACRO-INSTRUCTION INITIALIZES THE CURSOR FOR SUBSEQUENT      * 19416002
.*       SCANNING, REGARDLESS OF WHETHER THE SUBSEQUENT SCANNING IS   * 19424002
.*       LEFT TO RIGHT OR RIGHT TO LEFT.                              * 19432002
.********************************************************************** 19440002
         GBLC  &IGARPT#  GLOBAL VARIABLE FOR RECORDING THE RPT TYPE    *19448002
                         FROM THE T OR TYPE PARAMETER.                  19456002
         GBLC  &IGAEOPV  OFFSET TO THE PATH CODE IN THE RPT HEADER.     19464002
.********************************************************************** 19472002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 19480002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 19488002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 19496002
.* TYPE CHECKING SECTION.                                             * 19504002
.********************************************************************** 19512002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    19520002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *19528002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     19536002
.********************************************************************** 19544002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 19552002
.* AND IF THEY ARE NOT THEN USE T.                                    * 19560002
.********************************************************************** 19568002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*19576002
                         T.                                             19584002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       19592002
.RPT#TCK ANOP                                                           19600002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              19608002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *19616002
                         PARTITION TREE TYPE.                           19624002
.********************************************************************** 19632002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 19640002
.********************************************************************** 19648002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *19656002
                         RPT.                                           19664002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *19672002
                         THE TYPE PARAMETER.                            19680002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      19688002
.RPT#8   ANOP                                                           19696002
&IGARPT# SETC  '8'       SET THE RPT TYPE TO 8.                         19704002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*19712002
               Q '4')).RPT#FIN                                          19720002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    19728002
.RPT#FIN ANOP                                                           19736002
      RPTDSECT T=8,DS=NO                                                19744002
.********************************************************************** 19752002
         AIF   ('&IGARPT#' EQ '8').ISCANOK  CHECK THE APPLICABILITY OF *19760002
               THE ISCAN OPERATION TO THE RPT OF THE SPECIFIED TYPE.    19768002
         MNOTE 12,'ISCAN IS INVALID FOR RPT TYPE &IGARPT#.'             19776002
.ISCANOK ANOP                                                           19784002
         AIF   (K'&TREE EQ K'&TREE(1)+2).LW1                            19792002
&TAG     L     1,&TREE                                                  19800002
.LW0     ANOP                                                           19808002
         OI    &IGAEOPV.(1),B'0110' INITIALIZE FOR SCANNING OPERATIONS. 19816002
         AGO   .FIN                                                     19824002
.LW1     AIF  ((K'&TAG NE 0)AND('&TREE' EQ '(1)')).LW2                  19832002
&TAG     LR    1,&TREE                                                  19840002
         AGO   .LW0                                                     19848002
.LW2     ANOP                                                           19856002
&TAG     EQU   *                                                        19864002
         AGO   .LW0                                                     19872002
.FIN     ANOP                                                           19880002
         MEND                                                           19888002
         EJECT                                                          19896002
         MACRO                                                          19904002
&TAG  RPTDSECT &T=,&TYPE=,&LIST=,&SCAN=,&GEN=,&DS=NO                    19912002
         GBLC  &IGAHVFC  THE OFFSET IN THE RPT HEADER TO THE ADDRESS OF*19920002
                         THE FIXEDHDR FOR THE INNER VERTEX SPACE CHAIN. 19928002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *19936002
                         OF RPT ENTRY POINTS.                           19944002
         GBLC  &IGAGKW   THE OFFSET IN THE IGARPT01 MODULE TO THE      *19952002
                         ROUTINE TO GET A WORK AREA FOR COLLECTING     *19960002
                         KEYS.                                          19968002
         GBLC  &IGABFIN  THE SIZE OF THE RESERVED LIST OF ENTRY POINT  *19976002
                         ADDRESSES IN THE TREE HEADER.                  19984002
         GBLC  &IGASCH8  THE OFFSET IN THE RPT MODULE FOR THE TYPE 8   *19992002
                         SEARCH ROUTINE.                                20000002
         GBLC  &IGADEL8  THE OFFSET IN THE IGARPT01 MODULE TO THE TYPE *20008002
                         8 RPT DELETE ROUTINE.                          20016002
         GBLC  &IGAINS8  THE OFFSET IN THE MODULE IGARPT01 TO THE      *20024002
                         ROUTINE TO INSERT IN A TYPE 8 RPT.             20032002
         GBLC  &IGALSCN  THE OFFSET TO THE ROUTINE TO SCAN LEFT IN THE *20040002
                         MODULE IGARPT01.                               20048002
         GBLC  &IGARSCN  THE OFFSET TO THE ROUTINE TO SCAN RIGHT IN THE*20056002
                         MODULE IGARPT01.                               20064002
         GBLC  &IGASPV   THE OFFSET TO THE PARTIAL ORDER SEARCH ROUTINE*20072002
                         IN THE MODULE IGARPT01.                        20080002
         GBLC  &IGAPVG   THE OFFSET TO THE ROUTINE TO GET THE PARTIAL  *20088002
                         ORDER VALUE FOR THE CURRENT SINK IN THE MODULE*20096002
                         IGARPT01.                                      20104002
         GBLC  &IGAPVAJ   THE OFFSET TO THE ROUTINE TO ADJUST THE      *20112002
                         PARTIAL ORDER VALUE FOR THE CURRENT SINK IN   *20120002
                         THE IGARPT01 MODULE.                           20128002
         GBLC  &IGADSP8  THE OFFSET TO THE ROUTINE TO DISPLAY A TYPE 8 *20136002
                         RPT IN THE MODULE IGARPT01.                    20144002
         GBLC  &IGASRCH,&IGAINS,&IGADEL,&IGAFTRE                        20152002
         GBLC  &IGAKEYW  THE INDEX OF THE ADDRESS OF THE ROUTINE TO GET*20160002
                         A WORK AREA FOR COLLECTING KEYS FOR SEARCH.    20168002
         GBLC  &IGASCNL,&IGASCNR,&IGAFSP                                20176002
         GBLC  &IGAFSPS  OFFSET FOR THE BRANCH ENTRY TO THE FSPACE     *20184002
                         PROGRAM WHEN THE SPACE CONTROL ADDRESS IS     *20192002
                         CODED IN THE FSPACE MACRO-INSTRUCTION.         20200002
         GBLC  &IGAFSPF  BRANCH ENTRY OFFSET FOR FSPACE WITH A FIXED   *20208002
                         LENGTH ENTRY USING A FIXEDHDR.                 20216002
         GBLC  &IGAFS8,&IGAFS12,&IGAFS80  THE ENTRY POINTS TO RELEASE  *20224002
               ENTRIES OF THE RESPECTIVE LENGTHS USING THE FIXEDHDR IN *20232002
               A SPACE CONTROL AREA.                                    20240002
         GBLC  &IGASTRE,&IGAGSP                                         20248002
         GBLC  &IGAINS5,&IGADEL5                                        20256002
         GBLC  &IGAEOPV  THE OFFSET TO THE PATH CODE BYTE IN THE TYPE 8*20264002
                         RPT HEADER FOR THE PATH TO THE SINK CURRENTLY *20272002
                         SELECTED BY THE CURSOR.                        20280002
         GBLC  &IGACNT5  THE OFFSET TO THE USE COUNTER IN THE TYPE 5   *20288002
                         RPT HEADER.                                    20296002
         GBLC  &IGAMSK5  THE OFFSET TO THE TABLE OF MASKS FOR TYPE 5   *20304002
                         RPT.                                           20312002
         GBLC  &IGATOP5  THE OFFSET TO THE RPT SOURCE IN THE TYPE 5 RPT*20320002
                         HEADER.                                        20328002
         GBLC  &IGAMAX   THE OFFSET TO THE WORD CONTAINING THE MAXIMUM *20336002
                         PARTIAL ORDER VALUE.                           20344002
         GBLC  &IGADJPV    ENTRY OFFSET FOR PARTIAL ORDER ADJUSTMENT.   20352002
         GBLC  &IGAPVS     ENTRY POINT FOR PARTIAL ORDER SEARCH.        20360002
         GBLC  &IGAGPV     ENTRY OFFSET FOR GETTING PARTIAL ORDER VALUE 20368002
         GBLC  &IGAISP   BRANCH ENTRY OFFSET FOR SPACE CONTROL SETUP.   20376002
         GBLC  &IGAFRSC  BRANCH ENTRY OFFSET TO THE ROUTINE TO RELEASE *20384002
                         A SPACE CONTROL AREA AND ALL OF ITS RELATED   *20392002
                         SPACE VIA THE FREEMAIN MACRO-INSTRUCTION.      20400002
         GBLC  &IGAGSPF  BRANCH ENTRY OFFSET FOR FIXED LENGTH ENTRIES  *20408002
                         USING A FIXEDHDR FROM THE GSPACE MACRO OR FROM*20416002
                         INSIDE THE MODULE IGARPT01.                    20424002
         GBLC  &IGAGSPS  BRANCH ENTRY OFFSET FOR VARIABLE LENGTH SPACE *20432002
                         ALLOCATION WHEN THE SPACE CONTROL ADDRESS IS  *20440002
                         CODED IN THE GSPACE MACRO-INSTRUCTION.         20448002
         GBLC  &IGAGS8,&IGAGS12,&IGAGS80  THE BRANCH ENTRY OFFSETS FOR *20456002
                         THE ROUTINES TO ALLOCATE SPACE FOR THE        *20464002
                         RESPECTIVE FIXED LENGTHS IN A SPACE CONTROL A. 20472002
         GBLC  &IGACON   THE OFFSET TO THE CONTANT AREA.                20480002
         GBLC  &IGANAME    THE NAME OF THE PROGRAM.                     20488002
         GBLC  &IGADSP         BRANCH ENTRY FOR DSPRPT.                 20496002
         GBLC  &IGAISCN  THE INDEX OF THE ADDRESS OF THE ROUTINE TO USE*20504002
                         IN THE MODULE IGARPT01 TO INITIALIZE FOR      *20512002
                         SUBSEQUENT SCANNING OPERATIONS FOR SOME RPT'S. 20520002
         GBLC  &IGADDR   THE OFFSET TO THE ADDRESS OF THE MODULE       *20528002
                        IGARPT01 FROM THE BEGINNING OF THE TREE HEADER. 20536002
         GBLA  &IGALEFT(256)  GLOBAL INDEXED VARIABLE FOR LEFT EDGES    20544002
.*                             IN THE BINARY PARSE TREE.                20552002
         GBLA  &IGARGHT(256)   GLOBAL VECTOR FOR RIGHT EDGES.           20560002
         GBLB  &IGARL(256)     GLOBAL VECTOR FOR RIGHT/LEFT FLAGS.      20568002
         GBLB  &IGAIS(256)     GLOBAL VECTOR FOR INNER/SINK STATUS.     20576002
         GBLA  &IGAPATH(16)  PATH VECTOR TO ATOMIC ELEMENT IN PARSE.    20584002
         GBLA  &IGALEVL      PATH LENGTH TO ATOM IN PARSE TREE.         20592002
         GBLB  &IGAOKAY  GLOBAL FOR INDICATING VALID SYNTAX.            20600002
         GBLB  &IGAPGM   FOR USE IN IGARPTXX MODULES ONLY.              20608002
         GBLB  &IGALOAD  1 IF PGM IS LOADED VIA LOAD MACRO.             20616002
         GBLB  &IGAXTRN  1 IF THE EXTRN HAS BEEN GENERATED.             20624002
         GBLB  &IGALONE  ON FOR STAND-ALONE OPERATION OF THE RPTS      *20632002
               COMPONENT FOR UNIT TESTING.                              20640002
         GBLB  &IGAFTCH  ON TO FAKE OUT THE CVTRPT AND TCBRPT LOADS    *20648002
                         WHEN THE RPTS COMPONENT IS BEING UNIT TESTED.  20656002
         GBLC  &IGARPT#  RADIX PARTITION TREE TYPE.                     20664002
         GBLB  &RPTVNUM(16)    INDEXED GLOBAL LOGICAL VECTOR FOR C      20672002
.*                             CONTROLLING THE GENERATION OF DSECTS.    20680002
         GBLB  &IGASPDS  THIS BIT IS ON IF THE SPACE CONTROL DSECT HAS *20688002
                         ALREADY BEEN GENERATED.                        20696002
         GBLC  &IGASA0   OFFSET TO THE FIRST SAVE AREA.                 20704002
         GBLC  &IGASA1   OFFSET TO THE SECOND SAVE AREA IN THE SPACE   *20712002
                         CONTROL AREA.                                  20720002
         GBLC  &IGAS8    THE OFFSET TO THE 8-BYTE FREE SPACE CHAIN.     20728002
         GBLC  &IGAS12   THE OFFSET TO THE 12-BYTE FREE SPACE CHAIN.    20736002
         GBLC  &IGAS80   THE OFFSET TO THE 80-BYTE FREE SPACE CHAIN.    20744002
         GBLC  &IGASPZ   LENGTH OF THE SPACE CONTROL AREA.              20752002
         GBLA  &IGAMINP  THE MINIMUM SIZE NEEDED FOR A TYPE 8 TREE.     20760002
         GBLA  &IGAMINS  THE MINIMUM REFILL SIZE NEEDED FOR A TYPE 8.   20768002
         GBLA  &IGAX     TRIPLE FOR LEFT LIST SCAN OF THE BINARY PARSE  20776002
         GBLA  &IGAY     TREE THAT RESULTS FROM EXECUTING RPTDSECT WITH 20784002
         GBLA  &IGAZ     THE LIST PARAMETER CODED.                      20792002
         LCLA  &N        A LOCAL TEMPORARY INDEX FOR SUBSCRIPTING       20800002
.*                       INDEXED VARIABLES.                             20808002
.*A000000                                                        Y02147 20816002
.********************************************************************** 20824002
         LCLA  &X        STRING SCANNER.                                20832002
         LCLA  &Y        LIMIT OF NUMBER OF ELEMENTS.                   20840002
         LCLC  &CHAR     CURRENT LIST CHARACTER.                        20848002
         LCLA  &P        PREDECESSOR OF CURRENT VERTEX IN PARSE TREE.   20856002
         LCLA  &C        CURRENT VERTEX IN PARESE TREE.                 20864002
         LCLA  &S        SUCCESSOR OF CURRENT VERTEX IN PARSE TREE.     20872002
         LCLA  &NX       INDEX OF NEXT AVAILABLE VERTEX.                20880002
&IGAXTRN SETB  (0)   TURN OFF THE EXTRN SYMBOL IN STREE.                20888002
         AIF   (K'&GEN NE 0).GEN  GO IF THE GEN PARAMETER IS CODED.     20896002
         AIF   (K'&T EQ 0).OLDT  SEE IF THE NEW TYPE IS CODED.          20904002
&TAG  RPTDSECT TYPE=&T,LIST=&LIST,SCAN=&SCAN,DS=&DS,GEN=&GEN            20912002
         AGO   .FIN                                                     20920002
.OLDT    ANOP                                                           20928002
         AIF   (K'&TAG EQ 0).NOTAG  SEE IF THERE IS A LABEL ON IT.      20936002
&TAG     EQU   *                                                        20944002
.NOTAG   ANOP                                                           20952002
         AIF   ((K'&SCAN NE 0) OR (K'&TYPE NE 0)).GOOD  CHK 4 AT LEAST  20960002
.*                                                   1 OPERAND.         20968002
         MNOTE 12,'NO KEYWORDS CODED FOR RPTDSECT; &SCAN CODED.'        20976002
         MEXIT                                                          20984002
.GOOD    ANOP                                                           20992002
&IGARPT# SETC  '&TYPE'   SET THE RPT #.                                 21000002
         AIF   (K'&TYPE NE 0).VERSION  CHECK FOR RPT TYPE.              21008002
         AIF   (('&SCAN' EQ 'NEXT')OR('&SCAN' EQ 'ISCAN')).ITSCAN       21016002
         AIF   ('&SCAN' EQ 'PARSE').PARSE          CHECK FOR PARSE REQ. 21024002
         MNOTE 12,'SCAN PARAMTER INCORRECT IN RPTDSECT; &SCAN CODED.'   21032002
         MEXIT                                                          21040002
.PARSE   ANOP                                                           21048002
.*--------------------------------------------------------------------* 21056002
.*       PARSE THE LIST INTO A BINARY PARSE TREE.                     * 21064002
.*--------------------------------------------------------------------* 21072002
&X       SETA  (1)       SET &X TO THE INDEX OF THE FIRST CHARACTER IN  21080002
.*                       THE STRING TO BE PARSED.                       21088002
&Y       SETA  (1+K'&LIST)     SET &Y TO THE INDEX OF THE FIRST         21096002
.*                             CHARACTER POSITION AFTER THE LAST        21104002
.*                             CHARACTER IN THE STRING TO BE PARSED.    21112002
&P       SETA  1         SET &P TO THE SOURCE OF THE PARSE TREE.        21120002
&C       SETA  1         SET &C TO THE SOURCE OF THE PARSE TREE.        21128002
&NX      SETA  1         SET &NX TO ONE LESS THAN THE NEXT AVAILABLE    21136002
.*                       VERTEX.                                        21144002
&IGARL(&C)     SETB      (0)   SET THE SOURCE TO A LEFT SUCCESSOR.      21152002
&IGAIS(&C)     SETB      (1)   SET THE SOURCE AS AN INNER VERTEX.       21160002
.********************************************************************** 21168002
.*       IS THERE A LEFT EDGE FROM THE CURRENT VERTEX?                * 21176002
.********************************************************************** 21184002
.ISLEFT  ANOP                                                           21192002
         AIF   (&X EQ &Y).LEOS GO IF THE END OF STRING REACHED.         21200002
&CHAR    SETC  '&LIST'(&X,1)   EXTRACT THE CURRENT CHARACTER.           21208002
&X       SETA  (&X+1)          EKE THE INDEX TO THE NEXT CHARACTER.     21216002
         AIF   ('&CHAR' EQ '(').LLPAREN  AGO IF LEFT PAREN FOUND.       21224002
         AIF   ('&CHAR' EQ ')').LRPAREN  AGO IF RIGHT PAREN FOUND.      21232002
         AIF   ('&CHAR' EQ ',').LCOMMA   AGO IF COMMA FOUND.            21240002
.*--------------------------------------------------------------------* 21248002
.* THE LEFT EDGE GOES TO AN ATOMIC SYMBOL, COLLECT THE SYMBOL AND PUT * 21256002
.* THE LEFT EDGE OF THE CURRENT VERTEX GOING TO IT.                   * 21264002
.*--------------------------------------------------------------------* 21272002
&NX      SETA  (1+&NX)   ESTABLISH PLACE TO PUT THE DEFINITION OF ATOM. 21280002
&IGALEFT(&NX) SETA (&X-1)      INDEX OF FIRST CHARACTER OF ATOM.        21288002
.COLLECT ANOP                                                           21296002
         AIF   (&X EQ &Y).STORE2       SEE IF EOS AFTER ATOM.           21304002
&CHAR    SETC  '&LIST'(&X,1)   PICK OUT THE NEXT CHARACTER.             21312002
&X       SETA  (&X+1)    EKE INDEX TO NEXT CHARACTER.                   21320002
         AIF   ('&CHAR' EQ '(').STORE  AGO IF ATOM ALL COLLECTED.       21328002
         AIF   ('&CHAR' EQ ')').STORE  AGO IF ATOM ALL COLLECTED.       21336002
         AIF   ('&CHAR' NE ',').COLLECT  AGO IF ATOM NOT YET COLLECTED. 21344002
.STORE   ANOP                                                           21352002
&IGARGHT(&NX) SETA (&X-(1+&IGALEFT(&NX)))  COMPUTE LENGTH OF ATOM.      21360002
&IGALEFT(&C) SETA (&NX-&P)  FILL IN LEFT EDGE TO ATOM.                  21368002
&IGARL(&NX) SETB (0)     FLAG AS LEFT SUCCESSOR.                        21376002
&IGAIS(&NX)  SETB (0)    FLAG AS A SINK.                                21384002
         AGO   .RIGHTIN        INTERROGATE CHARACTER.                   21392002
.STORE2  ANOP                                                           21400002
&IGARGHT(&NX) SETA (&X-(&IGALEFT(&NX)))  COMPUTE LENGTH OF ATOM.        21408002
&IGALEFT(&C) SETA (&NX-&P)     FILL IN LEFT EDGE TO ATOM.               21416002
&IGARL(&NX) SETB (0)     FLAG ATOMIC VERTEX AS LEFT SUCCESSOR.          21424002
&IGAIS(&NX) SETB (0)     FLAG ATOMIC VERTEX AS A SINK.                  21432002
         AGO   .REOS     GO TO RIGHT EOS SEQUENCE.                      21440002
.*--------------------------------------------------------------------* 21448002
.* THE LEFT EDGE GOES TO AN EMPTY LIST, SINCE THE CURRENT CHARACTER   * 21456002
.* IS A COMMA.                                                        * 21464002
.*--------------------------------------------------------------------* 21472002
.LCOMMA  ANOP                                                           21480002
&IGALEFT(&C) SETA (0-&P)  SET THE LEFT EDGE EMPTY.                      21488002
         AGO   .MAKRGHT        GO ESTABLISH A RIGHT SUCCESSOR.          21496002
.*--------------------------------------------------------------------* 21504002
.* THERE IS A LIST FOR THE LEFT SUCCESSOR, BECAUSE THE CURRENT        * 21512002
.* CHARACTER IS A LEFT PARENTHESIS.                                   * 21520002
.*--------------------------------------------------------------------* 21528002
.LLPAREN ANOP                                                           21536002
&NX      SETA  (&NX+1)   ESTABLISH A LEFT SUCCESSOR INNER VERTEX.       21544002
&IGARL(&NX) SETB (0)  MAKE NEW INNER VERTEX A LEFT SUCCESSOR.           21552002
&IGAIS(&NX) SETB (1)  MAKE NEW VERTEX AN INNER VERTEX.                  21560002
&IGALEFT(&C) SETA (&NX-&P)     FILL IN LEFT SUBTRACTION INVERTIBLE EDGE 21568002
.*                             TO THE NEW LEFT INNER VERTEX.            21576002
&P       SETA  (&C)      TRACE THE EDGE TO THE NEW LEFT INNER VERTEX.   21584002
&C       SETA  (&NX)     XX                                             21592002
         AGO   .ISLEFT   GO BACK TO LOOK FOR A LEFT EDGE.               21600002
.*--------------------------------------------------------------------* 21608002
.* THERE IS NO LEFT EDGE, BECAUSE THE CURRENT CHARACTER IS A RIGHT    * 21616002
.* PARENTHESIS. NOW THE BACKPATH MUST BE TRACED TO THE MATCHING LEFT  * 21624002
.* PARENTHESIS.                                                       * 21632002
.*--------------------------------------------------------------------* 21640002
.LRPAREN ANOP                                                           21648002
&IGALEFT(&C) SETA (0-&P)  SET LEFT INVERTIBLE SUBTRACTION EDGE EMPTY.   21656002
.RRPAREN ANOP                                                           21664002
&IGARGHT(&C) SETA (0-&P)  ESTABLISH A NULL RIGHT EDGE TOO.              21672002
.*--------------------------------------------------------------------* 21680002
.* TRACE THE BACKPATH TO FIND THE FIRST LEFT SUCCESSOR ON THE WAY TO  * 21688002
.* THE SOURCE. THAT VERTEX SHOULD BE THE PREDECESSOR OF THE FIRST     * 21696002
.* VERTEX IN THE SUBLIST THAT STARTED WITH THE LEFT PARENTHESIS THAT  * 21704002
.* MATCHED THE CUURENT RIGHT PARENTHESIS.                             * 21712002
.*--------------------------------------------------------------------* 21720002
         AIF   (NOT &IGARL(&C)).RPISBAK  GO IF &C IS A LEFT SUCCESSOR.  21728002
.RPBACK  ANOP                                                           21736002
&S       SETA  (&C)      CYCLE THE THREE VERTICES UP THE BACKPATH.      21744002
&C       SETA  (&P)      XX                                             21752002
&P       SETA  (&S-&IGARGHT(&C))  TRACE THE RIGHT EDGE BACKWARD.        21760002
         AIF   (&IGARL(&C)).RPBACK     TRACE UNTIL IT FINDS A LEFT SIDE 21768002
.*--------------------------------------------------------------------* 21776002
.RPISBAK ANOP                                                           21784002
         AIF   (&C EQ 1).ERROR  SEE IF THE SOURCE WAS REACHED; I. E.    21792002
.*                              NO MATCHING LEFT PARENTHESIS.           21800002
&S       SETA  (&C)      TRACE THE EDGE BACK TO THE PREDECESSOR OF      21808002
&C       SETA  (&P)      THE FIRST LEFT SUCCESSOR FOUND ON THE          21816002
&P       SETA  (&S-&IGALEFT(&C))  BACKPATH.                             21824002
         AGO   .ISRIGHT                                                 21832002
.*--------------------------------------------------------------------* 21840002
.* THERE IS NO LEFT OR RIGHT EDGE, BECAUSE THE END OF THE STRING      * 21848002
.* HAS BEEN ENCOUNTERED.                                              * 21856002
.*--------------------------------------------------------------------* 21864002
.LEOS    ANOP                                                           21872002
&IGALEFT(&C) SETA (0-&P)  SET LEFT INVERTIBLE EDGE NULL.                21880002
.REOS    ANOP                                                           21888002
&IGARGHT(&C) SETA (0-&P)  SET RIGHT INVERTIBLE EDGE NULL.               21896002
         AIF   (NOT &IGARL(&C)).EOSBAK  CONTINUE UNTIL THE FIRST LEFT.  21904002
.EOSBACK ANOP                                                           21912002
&S       SETA  (&C)      TRACE THE BACKPATH TO THE FIRST LEFT           21920002
&C       SETA  (&P)            SUCCESSOR.                               21928002
&P       SETA  (&S-&IGARGHT(&C))                                        21936002
         AIF   (&IGARL(&C)).EOSBACK    CHECK FOR A RIGHT SUCCESSOR.     21944002
.EOSBAK  ANOP                                                           21952002
         AIF   (&C NE 1).ERROR                                          21960002
&IGAOKAY SETB  (1)       INDICATE VALID SYNTAX.                         21968002
         MEXIT                                                          21976002
.********************************************************************** 21984002
.* IS THERE A RIGHT EDGE?                                             * 21992002
.********************************************************************** 22000002
.ISRIGHT ANOP                                                           22008002
         AIF   (&X EQ &Y).REOS  GO IF END OF STRING REACHED.            22016002
&CHAR    SETC  '&LIST'(&X,1)   GET CURRENT CHARACTER.                   22024002
&X       SETA  (&X+1)    EKE TO NEXT CHARACTER.                         22032002
.RIGHTIN ANOP                                                           22040002
         AIF   ('&CHAR' EQ ',').MAKRGHT                                 22048002
         AIF   ('&CHAR' EQ ')').RRPAREN                                 22056002
         AGO   .ERROR                                                   22064002
.*--------------------------------------------------------------------* 22072002
.* THERE IS A RIGHT EDGE, THE CURRENT CHARACTER IS A COMMA.           * 22080002
.*--------------------------------------------------------------------* 22088002
.MAKRGHT ANOP                                                           22096002
&NX      SETA  (&NX+1)   GET A PLACE FOR THE NEW RIGHT SUCCESSOR.       22104002
&IGARL(&NX) SETB (1)     INDICATE RIGHT SUCCESSOR.                      22112002
&IGARGHT(&C) SETA (&NX-&P)  STORE RIGHT INVERTIBLE EDGE.                22120002
&IGAIS(&NX) SETB (1)     INDICATE AN INNER VERTEX.                      22128002
&P       SETA  (&C)      TRACE OVER TO THE NEW RIGHT SUCCESSOR.         22136002
&C       SETA  (&NX)     XX                                             22144002
         AGO   .ISLEFT                                                  22152002
.*--------------------------------------------------------------------* 22160002
.ERROR   ANOP                                                           22168002
&IGAOKAY SETB  (0)       INDICATE INVALID SYSNTAX.                      22176002
         MEXIT                                                          22184002
.********************************************************************** 22192002
.ITSCAN  AIF   ('&SCAN' NE 'ISCAN').TRYNEXT  GO IF NOT 1ST INITIALIZE.  22200002
.* INITIALIZE FOR LEFT LIST SCANNING.                                 * 22208002
.*--------------------------------------------------------------------* 22216002
&IGAX    SETA  (1)       SET IT TO THE SOURCE.                          22224002
&IGAY    SETA  (0)       SIGNAL THAT ISCAN HAS BEEN DONE.               22232002
&IGAZ    SETA  (0)       DON'T CAUSE ANY CONFUSION.                     22240002
&IGALEVL SETA  (0)                                                      22248002
         MEXIT                                                          22256002
.*--------------------------------------------------------------------* 22264002
.*  COME HERE FOR THE REAL SCANNING, AFTER THE ISCAN.                 * 22272002
.*--------------------------------------------------------------------* 22280002
.TRYNEXT AIF   ('&SCAN' EQ 'NEXT').DONEXT                               22288002
         MNOTE 12,'INVALID SCAN, NEXT OR ISCAN EXPECTED.'               22296002
&IGAZ    SETA  0         MAYBE IT WILL WORK ANYWAY.                     22304002
         MEXIT                                                          22312002
.DONEXT  AIF   (&IGAY NE 0).NOT1ST  CHECK FOR FIRST TIME.               22320002
.*--------------------------------------------------------------------* 22328002
.*  FIRST TIME INTO TREE FOR LEFT LIST SCAN.                          * 22336002
.*--------------------------------------------------------------------* 22344002
&IGAY    SETA  (1)       SET IT TO THE SOURCE.                          22352002
         AGO   .CHKLEFT  GO LOOK AT THE LEFT SUBTREE.                   22360002
.TREF    ANOP                                                           22368002
&IGAPATH(&IGALEVL) SETA (&IGAPATH(&IGALEVL)+1)  EKE PATH VECTOR ELEMENT 22376002
         AGO   .TEDGF                           ON THE SAME LEVEL.      22384002
.TLEF    ANOP                                                           22392002
&IGALEVL SETA  (1+&IGALEVL)  MAKE PATH VECTOR LONGER TO ATOM.           22400002
&IGAPATH(&IGALEVL) SETA (0)  SET PATH VECTOR ELEMENT TO ZERO.           22408002
.TEDGF   ANOP                                                           22416002
&IGAX    SETA  (&IGAY)   CYCLE THE THREE DOWN THE PATH.                 22424002
&IGAY    SETA  (&IGAZ)   XX                                             22432002
.CHKLEFT ANOP                                                           22440002
&IGAZ    SETA  (&IGAX+&IGALEFT(&IGAY))  TRACE LEFT EDGE (IF THERE IS 1) 22448002
         AIF   (&IGAZ NE 0).TRYLEFT    SEE IF THERE WAS A LEFT EDGE.    22456002
         MEXIT                                                          22464002
.TRYLEFT AIF   (&IGAIS(&IGAZ)).TLEF    SEE IF THE SINK WAS REACHED.     22472002
         AIF   (&IGARGHT(&IGAZ) NE 0).FINZ  SEE IF MT SINK.             22480002
&IGAZ    SETA  (0)       PRETEND EMPTY CHARACTER STRINGS AREN'T THERE.  22488002
.FINZ    MEXIT                                                          22496002
.*--------------------------------------------------------------------* 22504002
.*   INSPECT THE RIGHT SUBTREE.                                       * 22512002
.*--------------------------------------------------------------------* 22520002
.CHKRGHT ANOP                                                           22528002
.NOT1ST  ANOP                                                           22536002
&IGAZ    SETA  (&IGAX+&IGARGHT(&IGAY))  GET RIGHT SUCCESSOR (IF ANY).   22544002
         AIF   (&IGAZ NE 0).TREF       GO IF THERE IS ONE.              22552002
.CHKTOP  AIF   (&IGAY EQ 1).SOURCE     SEE IF SOURCE REACHED FROM RIGHT 22560002
         AIF   (&IGARL(&IGAY)).TREB  GO IF Y IS RIGHT SUCCESSOR.        22568002
&IGAZ    SETA  (&IGAY)   TRACE THE LEFT EDGE BACKWARD.                  22576002
&IGAY    SETA  (&IGAX)   BACKPATH TRACE.                                22584002
&IGAX    SETA  (&IGAZ-&IGALEFT(&IGAY))  BACKTRACE LEFT EDGE.            22592002
&IGALEVL SETA  (&IGALEVL-1)  GO BACK TO NEXT LOWER LEVEL.               22600002
         AGO   .CHKRGHT                                                 22608002
.TREB    ANOP                                                           22616002
&IGAPATH(&IGALEVL) SETA (&IGAPATH(&IGALEVL)-1)  DECREASE ELEMENT IN PV. 22624002
&IGAZ    SETA  (&IGAY)   BACKAPTH TRACE VIA THE RIGHT EDGE.             22632002
&IGAY    SETA  (&IGAX)   XX                                             22640002
&IGAX    SETA  (&IGAZ-&IGARGHT(&IGAY))  TRACE LEFT INVERTIBLE EDGE BACK 22648002
         AGO   .CHKTOP                                                  22656002
.SOURCE  ANOP                                                           22664002
&IGAX    SETA  (0)  SET THE EOP TRIPLE ACCORDINGLY.                     22672002
&IGAY    SETA  (0)  XX                                                  22680002
&IGAZ    SETA  (0)       THE WHOLE TREE HAS BEEN PROCESSED.             22688002
         MEXIT                                                          22696002
.********************************************************************** 22704002
.VERSION ANOP                                                           22712002
&IGABLST SETC  'X''20'''  SET THE OFFSET INTO THE TREE HEADER FOR THE  *22720002
                         LIST OF ENTRY POINTTS.                         22728002
         AIF   (K'&GEN NE 0).GEN  SEE IF THE GEN PARAMETER IS CODED.    22736002
         AIF   ('&IGARPT#' EQ 'SPACE').SPACNTL  SHOULD THE SPACE CONTROL22744002
                         DSECT BE GENERATED?                            22752002
&N       SETA  (&IGARPT#)  CONVERT THE TREE TYPE TO A #.                22760002
         AIF   (&RPTVNUM(&N)).FIN  IF IT'S ALREADY DONE, SKIP IT.       22768002
         AIF   (('&DS' EQ 'NO')OR('&DS' EQ '0')).LETIT  SEE IF THIS IS *22776002
                         NOT REALLY A REQUEST TO GENERATE THE DSECT.    22784002
&RPTVNUM(&N) SETB (1)          SET IT ON SO IT DOESN'T DO IT AGAIN.     22792002
.LETIT   ANOP                                                           22800002
         AIF   (&N EQ 8).RPTV8                                          22808002
         AIF   (&N EQ 5).RPTV5                                          22816002
         MNOTE 12,'INVALID TREE TYPE SPECIFIED.'                        22824002
         AGO   .FIN                                                     22832002
.RPTV5   ANOP                                                           22840002
&IGADDR  SETC  'X''00'''  THE OFFSET TO THE ADDRESS OF THE MODULE      *22848002
                         IGARPT01 FROM THE BEGINNING OF THE TREE HEADER.22856002
                                                                        22864002
&IGATOP5 SETC  'X''04'''  THE OFFSET TO THE SOURCE OF THE TYPE 5 RPT IN*22872002
                         THE TYPE 5 TREE HEADER.                        22880002
&IGACNT5 SETC  'X''0C'''  THE OFFSET TO THE USE COUNTER IN THE TYPE 5  *22888002
                         RPT HEADER.                                    22896002
&IGAMSK5 SETC  'X''80'''  OFFSET TO THE TABLE OF MASKS IN THE TYPE 5   *22904002
                         RPT HEADER.                                    22912002
         AIF   (('&DS'(1,1) EQ 'N')OR('&DS'(1,1) EQ '0')).RPT5END      *22920002
                         SEE IF THE DSECT IS NOT SUPPOSED TO BE        *22928002
                         GENERATED THIS TIME.                           22936002
IGARPTH5 DSECT 0         DSECT FOR SRCH5, INS5, DEL5.                   22944002
IGADDR5  DC    F'0'  THE ADDRESS OF IGARPT01.                           22952002
IGATOP5  DC    F'0'      SOURCE OF BINARY TREE.                         22960002
IGAHVFC5 DC    F'0'      HEAD OF INNER VERTEX FREE CHAIN.               22968002
IGACNT5  DC    F'0'      COUNTER FOR READ-ONLY VALIDATION.              22976002
IGAKEYI5 DC    H'0'      INDEX OF KEY IN RECORD.                        22984002
IGAKEYL5 DC    XL1'00'   THE NUMBER OF BYTES IN THE KEY.                22992002
IGASP5   DC    XL1'00'   THE SUBPOOL NUMBER FOR GETMAINS.               23000002
IGA5MARK EQU   *  THE BYTE JUST PAST THE LAST THING BEFORE THE B-LIST.  23008002
         DC    (&IGAMSK5-(IGA5MARK-IGARPTH5))XL1'00'  LEAVE ROOM.       23016002
IGAMASKS DC    128XL1'FF'  THIS IS FILLED IN BY STREE, TYPE=5.          23024002
IGAMASKZ EQU   *                                                        23032002
         CNOP  0,8       MAKE IT ON A DOUBLE WORD BOUNDARY.             23040002
IGAFIN5  EQU   *         FIRST BYTE PAST HEADER.                        23048002
IGATYP5S EQU   IGAFIN5-IGARPTH5  TREEHDR SIZE FOR TYPE 5 TREE.          23056002
&SYSECT CSECT                                                           23064002
IGAZERO  EQU   0         JUST A ZERO.                                   23072002
IGABASE5 EQU   1         THE ADDRESS OF THE TREEHDR.                    23080002
IGAP5    EQU   2         REGISTER CONTAINING ANTEPENULTIMATE VERTEX.    23088002
IGAC5    EQU   3         REGISTER CONTAINING THE PENULTIMATE VERTEX.    23096002
IGAS5    EQU   15        REGISTER CONTAINING THE SINK ADDRESS.          23104002
IGACREG5 EQU   14        REGISTER TO HOLD THE COUNTER DURING THE SEARCH 23112002
IGASARG5 EQU   0         REGISTER CONTAINING THE SEARCH ARGUMENT.       23120002
.RPT5END ANOP                                                           23128002
.RPTV8   ANOP                                                           23136002
&IGADDR  SETC  'X''00'''  THE OFFSET TO THE ADDRESS OF THE MODULE      *23144002
                         IGARPT01 FROM THE BEGINNING OF THE TREE HEADER.23152002
                                                                        23160002
&IGAHVFC SETC  'X''14'''  OFFSET TO THE IV FREE SPACE BLOCK ADDRESS.    23168002
&IGANAME SETC  'IGARPT01'  THE NAME OF THE MODULE.                      23176002
&IGASRCH SETC  'X''0'''                                                 23184002
&IGAINS  SETC  'X''04'''  SET THE INDEX OF THE ENTRY POINT TO INSERT A *23192002
                         KEY-ADDRESS PAIR IN THE RPT.                   23200002
&IGADEL  SETC  'X''08'''  SET THE INDEX OF THE DELETE ENTRY POINT.      23208002
&IGADSP  SETC  'X''0C'''  SET THE INDEX OF THE ENTRY POINT TO DISPLAY  *23216002
                         THE TREE.                                      23224002
&IGAKEYW SETC  'X''10'''  INDEX OF THE ENTRY POINT WORD FOR OBTAINING  *23232002
                         THE ADDRESS OF THE KEY WORK AREA.              23240002
&IGAISCN SETC  'X''14'''  INDEX OF THE ENTRY POINT WORD TO INITIALIZE  *23248002
                         FOR SCANNING.                                  23256002
&IGASCNL SETC  'X''18'''  ENTRY POINT FOR SCANNING LEFT.                23264002
&IGASCNR SETC  'X''1C'''  ENTRY POINT FOR SCANNING RIGHT.               23272002
&IGAPVS  SETC  'X''20'''  INDEX OF ENTRY POINT FOR PARTIAL ORDER VALUE *23280002
                         SEARCH.                                        23288002
&IGAGPV  SETC  'X''24'''  INDEX OF ENTRY POINT ADDRESS FOR GETTING THE *23296002
                         PARTIAL ORDER VALUE FOR THE CURRENT SINK.      23304002
&IGADJPV SETC  'X''28'''  ENTRY POINT ADDRESS FOR ADJUSTING THE PARTIAL*23312002
                         ORDER VALUE FOR THE CURRENT SINK.              23320002
&IGABFIN SETC  'X''40'''  THE SIZE OF THE LIST OF ENTRY POINT WORDS IN *23328002
                         THE RPT HEADER.                                23336002
&IGASCH8 SETC  'X''0'''  THE OFFSET INTO THE IGARPT01 MODULE FOR THE   *23344002
                         TYPE 8 RPT SEARCH ROUTINE.                     23352002
&IGADEL8 SETC  'X''180'''  THE OFFSET TO THE TYPE 8 RPT DELETE ROUTINE *23360002
                         IN THE IGARPT01 MODULE.                        23368002
&IGADEL5 SETC  'X''2A0'''                                               23376002
&IGAINS5 SETC  'X''300'''  BRANCH ENTRY OFFSET FOR INSERT INTO A TYPE 5*23384002
                         RPT.                                           23392002
&IGAINS8 SETC  'X''450'''  THE OFFSET TO THE TYPE 8 INSERT ROUTINE IN  *23400002
                         THE IGARPT01 MODULE.                           23408002
&IGALSCN SETC  'X''4B0'''  THE OFFSET TO THE ROUTINE TO SCAN LEFT IN   *23416002
                         THE IGARPT01 MODULE.                           23424002
&IGARSCN SETC  'X''4D0'''  THE OFFSET TO THE ROUTINE TO SCAN RIGHT IN  *23432002
                         THE IGARPT01 MODULE.                           23440002
&IGAISP  SETC  'X''640'''                                               23448002
&IGAFRSC SETC  'X''680'''                                               23456002
&IGAGSPS SETC  'X''780'''  LOCATION OF THE GSPACE ROUTINE FOR VARIABLE *23464002
                         LENGTH AREAS WHEN THE SPCA IS PROVIDED.        23472002
&IGAGSP  SETC  'X''790'''                                               23480002
&IGAGS8  SETC  'X''900'''                                               23488002
&IGAGS12 SETC  'X''920'''                                               23496002
&IGAGS80 SETC  'X''940'''                                               23504002
&IGAGSPF SETC  'X''960'''                                               23512002
&IGAFSP  SETC  'X''9E0'''                                               23520002
&IGAFSPS SETC  'X''A40'''  ENTRY LOCATION FOR VARIABLE LENGTH          *23528002
                         FSPACE WITH THE SPCA CODED.                    23536002
&IGAFS8  SETC  'X''BC0'''  BRANCH ENTRY OFFSET FOR FIXED LENGTH FSPACE *23544002
                         FOR 8 BYTES.                                   23552002
&IGAFS12 SETC  'X''BE0'''  BRANCH ENTRY OFFSET FOR FIXED LENGTH FSPACE *23560002
                         FOR 12 BYTES.                                  23568002
&IGAFS80 SETC  'X''C00'''  ENTRY POINT FOR FSPACE FOR FIXED LENGTH 80  *23576002
                         BYTES.                                         23584002
&IGAFSPF SETC  'X''C20'''  ENTRY POINT FOR FSPACE WITH A FIXEDHDR.      23592002
&IGASPV  SETC  'X''C40'''  THE OFFSET TO THE PARTIAL ORDER SEARCH      *23600002
                         ROUTINE IN THE MODULE IGARPT01.                23608002
&IGAPVG  SETC  'X''D20'''  THE OFFSET TO THE ROUTINE TO GET THE PARTIAL*23616002
                         ORDER VALUE FOR THE CURRENT SINK.              23624002
&IGAPVAJ  SETC 'X''DA0'''  THE OFFSET TO THE ROUTINE TO ADJUST THE     *23632002
                         PARTIAL ORDER VALUE FOR THE CURRENT SINK.      23640002
&IGADSP8 SETC  'X''ED8'''  THE OFFSET TO THE ROUTINE TO DISPLAY A TYPE *23648002
                         8 RPT.                                         23656002
&IGASTRE SETC  'X''EE8'''  ENTRY POINT TO SET UP A RADIX PARTITION     *23664002
                         TREE.                                          23672002
&IGACON  SETC  'X''F00'''                                               23680002
&IGAGKW  SETC  'X''F90'''  OFFSET TO ROUTINE TO GET A KEY WORK AREA.    23688002
&IGAEOPV SETC  'X''04'''  THE OFFSET TO THE PATH CODE BYTE IN THE TYPE *23696002
                         8 RPT HEADER.                                  23704002
&IGAMAX  SETC  'X''24'''  THE OFFSET TO THE WORD CONTAINING THE MAXIMUM*23712002
                         PARTIAL ORDER VALUE.                           23720002
         AIF   ('&IGARPT#' NE '8').FIN  SEE IF THIS IS NOT EVEN REALLY *23728002
               A TYPE 8 RADIX PARTITION TREE.                           23736002
         AIF   ('&DS'(1,1) EQ 'N').FIN  SEE IF THE DSECT SHOULD BE     *23744002
                         GENERATED THIS TIME.                           23752002
         AIF   ('&DS'(1,1) EQ '0').FIN  SEE IF IT ISN'T THIS TIME.      23760002
IGARPTH  DSECT 0  PARAMETER LIST FOR TREE ROUTINES.                     23768002
IGADDR   DC    XL4'00'  THIS IS THE BASE ADDRESS OF THE PROGRAM.        23776002
IGAPT    DC    F'0'  THE ADDRESS OF THE TREE SOURCE DOUBLE WORD.        23784002
         ORG   IGAPT                                                    23792002
IGAPATH  DC    XL1'00'  THE PATH CODE BYTE.                             23800002
         DC    AL3(0)  ADDRESS OF THE SOURCE OF THE TREE.               23808002
IGANTPEN DC    XL4'00'   ADDRESS OF ANTEPENULTIMATE VERTEX ON PATH.     23816002
IGAPENLT DC    F'0'      ADDRESS OF PENULTIMATE VERTEX ON PATH.         23824002
IGAFARG  DC    F'0'  THE ADDRESS OF THE KEY OF THE RECORD FOUND BY SRCH 23832002
IGAHVFC  DC    F'0'  THE ADDRESS OF THE INNER SPACE FIXEDHDR.           23840002
IGAKEYL  DC    H'0'  THE LENGTH OF A KEY IN BYTES.                      23848002
IGAKEYI  DC    H'0'  THE 0-ORIGIN INDEX OF THE FIRST BYTE OF THE KEY    23856002
*                    IN THE RECORD.                                     23864002
IGAMAP   DC    F'0'      THE ADDRESS OF THE SUBROUTINE TO MAP AN       *23872002
                         ASSOCIATED # TO AN ADDRESS OF AN AREA         *23880002
                         CONTAINING THE CORRESPONDING KEY.              23888002
IGA9FILL DC    F'0'      THE REFILL SUBPOOL AND LENGTH FOR TYPE 9      *23896002
                         VARIABLE LENGTH SPACE ALLOCATION TREES.        23904002
         CNOP  0,4   IGAMAX IS ON A 4-BYTE BOUNDARY.                    23912002
IGAMAX   DC    F'0'   MAXIMUM VALUE FOR PARTIALLY ORDERED TREES.        23920002
IGAVALUE DC    F'0'  THE PARTIAL ORDER VALUE FOR SEMILATTICE CONDITION. 23928002
IGAWORK  DC    F'0'  WORK AREA FOR TYPE 9 RPT POV.                      23936002
IGAPOV   EQU   8  INDEX OF PARTIAL ORDER VALUE IN INNER VERTEX.         23944002
         ORG   IGARPTH+&IGABLST  PUT THE LIST OF THE ENTRY POINTS FOR  *23952002
                         THE VARIOUS OPERATIONS IN THE RIGHT PLACE.     23960002
IGASRCH  DC    F'0'      THE ADDRESS OF THE SEARCH ROUTINE FOR THIS    *23968002
                         TYPE RPT.                                      23976002
IGAINS   DC    F'0'      THE ADDRESS OF THE INSERT ROUTINE FOR THE RPT. 23984002
IGADEL   DC    F'0'      THE ADDRESS OF THE DELETE ROUTINE FOR THE RPT. 23992002
IGADSP   DC    F'0'      THE ADDRESS OF THE ROUTINE TO DISPLAY THE RPT. 24000002
IGAKEYW  DC    F'0'      EITHER THE ADDRESS OF THE WORK AREA TO COLLECT*24008002
                         KEYS OR THE ADDRESS OF THE ROUTINE TO SET ONE *24016002
                         UP.                                            24024002
IGAISCN  DC    F'0'  THE ADDRESS TO LINK TO TO INITIALIZE FOR SCANNING. 24032002
IGASCNL  DC    F'0'      THE ADDRESS OF THE SCAN LEFT ROUTINE.          24040002
IGASCNR  DC    F'0'      THE ADDRESS OF THE SCAN RIGHT ROUTINE.         24048002
IGAPVS   DC    F'0'      THE ADDRESS OF THE PARTIAL ORDER VALUE SEARCH *24056002
                         ROUTINE.                                       24064002
IGAGPV   DC    F'0'      THE ADDRESS OF THE ROUTINE TO OBTAIN THE      *24072002
                         PARTIAL ORDER VALUE FOR THE CURRENT SINK.      24080002
IGADJPV  DC    F'0'      THE ADDRESS OF THE ROUTINE TO ADJUST THE      *24088002
                         PARTIAL ORDER VALUE FOR THE CURRENT SINK.      24096002
IGABFIN  EQU   *                                                        24104002
         DC    (X'40'+IGABFIN-IGARPTH)XL1'00'  FILL OUT THE REST OF THE*24112002
                         RPT ENTRY POINT AREA.                          24120002
IGAFIN8  EQU   *  BYTE PAST TREE HEADER FOR TYPE 8 AND 9 RPT.           24128002
IGATYP8S EQU   IGAFIN8-IGARPTH  TREE HEADER SIZE FOR TYPE 8 AND 9 RPT.  24136002
IGANEBIT EQU   B'00010000'  FLAG BIT TO INDICATE SUBTREE CONTAINS       24144002
*                           UNEQUAL KEYS.                               24152002
IGASTBIT EQU   B'00001000'  SUBTREE OF KNOWN ORDER SELECTION BIT.       24160002
IGARLBIT EQU   B'00000100'  RIGHT/LEFT SUCCESSOR FLAG BIT.              24168002
IGAT0BIT EQU   B'00000010'  LEFT INNER VERTEX FLAG BIT.                 24176002
IGAT1BIT EQU   B'00000001'  INNER VERTEX RIGHT EDGE FLAG BIT.           24184002
&SYSECT  CSECT                                                          24192002
         AIF   (NOT &IGAPGM).NOSHORT  SKIP THE SHORT LABELS IF NOT RPT. 24200002
         RASS  (APT,IGAPT,PATH,IGAPATH,FARG,IGAFARG)                    24208002
         RASS  (HVFC,IGAHVFC,KEYL,IGAKEYL)                              24216002
         RASS  (OFFSET,IGAKEYI,AP,IGANTPEN,AC,IGAPENLT)                 24224002
         RASS  (TREEHDR,IGARPTH,KEYWORK,IGAWORK,VALUE,IGAPOV)           24232002
         RASS  (TREEFIN,IGAFIN8,TREESZ,IGATYP8S)                        24240002
         RASS  (NE,IGANEBIT,IGAQBIT,IGASTBIT,Q,IGAQBIT,RL,IGARLBIT)     24248002
         RASS  (T0,IGAT0BIT,T1,IGAT1BIT,KEYI,IGAKEYI)                   24256002
.NOSHORT ANOP                                                           24264002
         AGO   .FIN      ALL DONE, NOW EXIT FROM RPTDSECT.              24272002
.SPACNTL AIF   (&IGASPDS OR ('&DS'(1,1) EQ 'N')).NOSPDS  SEE IF THE    *24280002
                         DSECT SHOULD BE GENERATED, OR JUST THE GLOBAL *24288002
                         VARIABLE SYMBOLS.                              24296002
&IGASPDS SETB  (1)     SET THE BIT SO THAT IT ONLY GETS GENERATED ONCE. 24304002
IGASPCTL DSECT 0         SPACE CONTROL DSECT FOR THE FSPACE AND GSPACE *24312002
                         MACRO-INSTRUCTIONS.                            24320002
IGARPT9  DC    12F'0'    THE TREE HEADER FOR THE TYPE 9 SPACE CONTROL  *24328002
                         FITS IN THESE 12 WORDS.                        24336002
IGASPEDG DC    F'0' THIS IS THE HEAD OF THE DEFINITION WORD CHAIN FOR * 24344002
*              SPACE CONTROL AREAS FOR SUBPOOLS OTHER THAN SUBPOOL    * 24352002
*              ZERO. THIS IS ONLY THE HEAD OF THE CHAIN FOR THE SPACE * 24360002
*              CONTROL AREA FOR SUBPOOL ZERO, HOWEVER; IN THE SPACE   * 24368002
*              CONTROL AREA FOR THE OTHER SUBPOOLS IT IS THE ADDRESS  * 24376002
*              OF THE SPACE CONTROL AREA FOR SUBPOOL ZERO.            * 24384002
IGAROUND DC    XL4'FFFFFFF0'  THIS IS THE MASK TO USE FOR ROUNDING     *24392002
                         REQUEST LENGTHS TO KEEP THE AREA ALLOCATED ON *24400002
                         THE PROPER ADDRESSING BOUNDARY.                24408002
IGABLOCK DC    F'0'      THIS IS THE HEAD OF THE BLOCK CHAIN OF BLOCK  *24416002
                         DEFINITION WORDS THAT DEFINE THE SPACE        *24424002
                         OBTAINED IN GSPACE FOR REFILLS.                24432002
IGASPLNG DC    XL4'00000000'  THE SUBPOOL NUMBER AND LENGTH OF THE SPACE24440002
                         CONTROL AREA.                                  24448002
IGASA0   DC    18F'0'    THIS IS THE INNER SPACE SAVE AREA.             24456002
IGASA1   DC    18F'0'    THIS IS THE OUTER SPACE SAVE AREA.             24464002
IGAS8    DC    4F'0'     THE FIXED LENGTH HEADER FOR THE FREE SPACE    *24472002
                         CHAIN OF 8-BYTE ENTRIES.                       24480002
IGAS12   DC    4F'0'     THE FIXEDHDR FOR THE 12-BYTE ENTRY FREE SPACE *24488002
                         CHAIN.                                         24496002
IGAS80   DC    4F'0'     THE FIXEDHDR FOR THE 80-BYTE FREE SPACE CHAIN. 24504002
IGASPC   DSECT 0                                                        24512002
IGANXSP  DC    F'0'  THE EDGE TO THE NEXT ONE.                          24520002
IGASPADR DC    F'0'  THE ADDRESS OF THE SPACE CONTROL AREA. THE SUBPOOL*24528002
                         NUMBER FOR THIS ONE IS IN THE LEFT BYTE OF THE*24536002
                         ADDRESS.                                       24544002
IGASPFIN EQU   B'10000000'  THIS BIT IS ON FOR THE LAST EDGE IN THE    *24552002
                         SPACE CONTROL AREA SUBPOOL CHAIN.              24560002
&SYSECT  CSECT                                                          24568002
.NOSPDS  ANOP                                                           24576002
&IGASA0  SETC  'X''40'''  THE OFFSET TO THE FIRST SAVE AREA IN THE SPACE24584002
                         CONTROL AREA.                                  24592002
&IGASA1  SETC  'X''88'''  THE OFFSET TO THE SECOND SAVE AREA IN THE    *24600002
                         SPACE CONTROL AREA.                            24608002
&IGAS8   SETC  'X''D0'''  SET THE OFFSET FROM THE BEGINNING OF THE     *24616002
                         SPACE CONTROL AREA TO THE FIXEDHDR FOR 8-BYTE *24624002
                         ENTRIES.                                       24632002
&IGAS12  SETC  'X''E0'''  SET THE OFFSET TO THE FIXEDHDR FOR 12-BYTE   *24640002
                         ENTRIES.                                       24648002
&IGAS80  SETC  'X''F0'''  SET THE OFFSET TO THE FIXEDHDR FOR 80-BYTE   *24656002
                         ENTRIES.                                       24664002
&IGASPZ  SETC  'X''100'''  SET THE LENGTH OF THE SPACE CONTROL AREA.    24672002
         AGO   .RPTV8  ALMOST ALL DONE, EXCEPT FOR THE GLOBAL VARIABLES*24680002
               FOR THE TYPE 8 AND 9 RADIX PARTITION TREES.              24688002
.********************************************************************** 24696002
.* COME HERE TO GENERATE MISCELLANEOUS GENERATA.                      * 24704002
.********************************************************************** 24712002
.GEN     AIF   ('&GEN(1)' EQ 'CVTRPT').LOADCVT  SEE IF THE SEQUENCE TO *24720002
                         LOAD THE CVTRPT WORD SHOULD BE GENERATED.      24728002
         AIF   ('&GEN(1)' EQ 'TCBRPT').LOADTCB  SEE IF THE SEQUENCE TO *24736002
                         LOAD THE TCBRPT WORD SHOULD BE GENERATED.      24744002
         AIF   ('&GEN(1)' EQ 'TCBRPTA').TCBADDR  SEE IF THE SEQUENCE TO*24752002
                         GET THE ADDRESS OF THE TCBRPT WORD SHOULD BE  *24760002
                         GENERATED.                                     24768002
         MNOTE 12,'INVALID GEN PARAMETER.'                              24776002
         AGO   .FIN      FORGET IT, CAN'T DO ANYTHING WITH THIS.        24784002
.********************************************************************** 24792002
.* GENERATE THE CODE TO LOAD THE ADDRESS OF THE MODULE IGARPT01 FROM  * 24800002
.* THE CVTRPT WORD INTO THE REGISTER SPECIFIED BY THE SECOND ELEMENT  * 24808002
.* IN THE GEN PARAMTER.                                               * 24816002
.********************************************************************** 24824002
.LOADCVT ANOP                                                           24832002
         AIF   (&IGAPGM).IGACVTL  SEE IF THIS IS THE IGARPT01 MODULE.   24840002
         AIF   (NOT(&IGALONE)).NOTLONE  SEE IF THIS IS REALLY IT.       24848002
&TAG     L     &GEN(2),=AL4(IGAFETCH)  ADDRESS OF THE FAKE TCBRPT WORD. 24856002
         BAL   &GEN(2),(X'10'+X'40'*(&GEN(2)-14))(,&GEN(2))  LINK TO   *24864002
                         REPLACE THIS INSTRUCTION WITH A LOAD OF THE   *24872002
                         ADDRESS OF IGARPT01.                           24880002
         AGO   .GENFIN   ALL DONE GENERATING IT NOW.                    24888002
.IGACVTL L     &GEN(2),ADDRESS  LOAD THE ADDRESS OF THE BEGINNING OF   *24896002
                         THE MODULE IGARPT01.                           24904002
         AGO   .GENFIN   ALL DONE NOW.                                  24912002
.NOTLONE ANOP                                                           24920002
&TAG     L     &GEN(2),X'10'  CVT PTR.                                  24928002
         USING CVT,&GEN(2)                                              24936002
         L     &GEN(2),CVTRPT  ADDRESS OF IGARPT01.                     24944002
         DROP  &GEN(2)                                                  24952002
         AGO   .GENFIN                                                  24960002
.********************************************************************** 24968002
.* GENERATE THE CODE TO LOAD THE TCBRPT WORD INTO THE REGISTER        * 24976002
.* SPECIFIED BY THE SECOND ELEMENT IN THE GEN PARAMETER.              * 24984002
.********************************************************************** 24992002
.LOADTCB ANOP                                                           25000002
         AIF   (NOT &IGALONE).LTCBWRD  SEE IF THIS IS UNIT TEST.        25008002
         AIF   (&IGAPGM).IGATCBL  SEE IF THIS IS THE PROGRAM IGARPT01.  25016002
         MNOTE 12,'CAN''T GET THE TBCRPT STUFF.'                        25024002
         AGO   .GENFIN   ALL DONE GENERATING IT NOW.                    25032002
.IGATCBL ANOP                                                           25040002
&TAG     BALR  &GEN(2),0                                                25048002
         AGO   .GENFIN                                                  25056002
         USING *,&GEN(2)                                                25064002
         L     &GEN(2),=AL4(IGATCB)                                     25072002
         DROP  &GEN(2)                                                  25080002
         AIF   ('&GEN(1)' EQ 'TCBRPTA').GENFIN                          25088002
         L     &GEN(2),0(,&GEN(2))                                      25096002
         AGO   .GENFIN   ALL DONE NOW.                                  25104002
.LTCBWRD ANOP                                                           25112002
&TAG     L     &GEN(2),X'10'  ADDRESS OF CVT.                           25120002
         AGO   .GENFIN                                                  25128002
         L     &GEN(2),0(&GEN(2))    ADDRESS OF TCB CHAIN.              25136002
         L     &GEN(2),X'04'(,&GEN(2))  CURRENT TCB ADDRESS.            25144002
         USING TCB,&GEN(2)                                              25152002
&CHAR    SETC  'A'       PREPARE FOR A LOAD ADDRESS INSTRUCTION.        25160002
         AIF   ('&GEN(1)' EQ 'TCBRPTA').NOWLOAD  SEE IF IT IS THE      *25168002
                         ADDRESS OF THE TCBRPT WORD, OR THE ACTUAL     *25176002
                         CONTENTS OF THE TCBRPT WORD.                   25184002
&CHAR    SETC  ''        IT IS THE ACTUAL CONTENTS OF THE WORD.         25192002
.NOWLOAD L&CHAR &GEN(2),TCBRPT  LOAD IGA'S WORD.                        25200002
         DROP  &GEN(2)                                                  25208002
         AGO   .GENFIN   ALL DONE NOW.                                  25216002
.********************************************************************** 25224002
.* GENERATE THE ADDRESS OF THE TCBRPT WORD IN THE REGISTER SPECIFIED  * 25232002
.* BY THE SECOND ELEMENT OF THE GEN PARAMETER.                        * 25240002
.********************************************************************** 25248002
.TCBADDR ANOP                                                           25256002
         AIF   (NOT &IGALONE).LTCBWRD  SEE IF THIS IS THE REAL THING,  *25264002
                         AND NOT JUST UNIT TEST.                        25272002
         AIF   (&IGAPGM).IGATCBL  SEE IF THIS IS THE MODULE IGARPT01.   25280002
         MNOTE 12,'CAN''T GET THE ADDRESS OF THE TCBRPT WORD.'          25288002
         AGO   .GENFIN   ALL DONE GENERATING IT NOW.                    25296002
.GENFIN  AIF   ((NOT &IGALONE)OR &IGAFTCH).FIN  SEE IF THE IGAFETCH    *25304002
                         CSECT IS NEEDED.                               25312002
         AIF   (&IGAPGM).FIN  DON'T GENERATE IT IN THE IGARPT01 MODULE. 25320002
&IGAFTCH SETB  (1)       DON'T GENERATE IT MORE THAN ONCE.              25328002
IGAFETCH CSECT                                                          25336002
IGACVT   DC    F'0'      THIS WILL BE THE ADDRESS OF THE MODULE        *25344002
                         IGARPT01 AFTER IT IS LOADED.                   25352002
&X       SETA  (14)      START BY GENERATING THE CODE FOR REGISTER 14.  25360002
.GOAGAIN ANOP                                                           25368002
         ORG   IGAFETCH+X'10'+(X'40'*(&X-14))  ORIGIN TO THE CORRECT   *25376002
                         OFFSET FOR THE BRANCH ENTRY.                   25384002
&Y       SETA  8                                                        25392002
.BCTRCTR BCTR  &X,0                                                     25400002
&Y       SETA  (&Y-1)                                                   25408002
         AIF (&Y GT 0).BCTRCTR GENERATE 8 BCTR INSTRUCTIONS TO BACK UP *25416002
                         THE LINKAGE ADDRESS TO THE LOAD INSTRUCTION.   25424002
         ST    2,4(,&X)  SAVE REGISTER 2 ON TOP OF THE BAL INSTRUCTION. 25432002
         BALR  2,0       ESTABLISH ADDRESSABILITY.                      25440002
         USING *,2                                                      25448002
         STM   0,1,IGASAVE0  SAVE REGISTERS 0 AND 1.                    25456002
         BAL   2,IGAGCVT  GO CHECK TO SEE IF THE MODULE IS LOADED.      25464002
         DROP  2                                                        25472002
         BALR  1,0       GET BACK ADDRESSABILITY.                       25480002
         USING *,1                                                      25488002
         AIF   (&X EQ 14).XIS14  SEE IF &X IS FOURTEEN.                 25496002
         L     0,IGA15AL1  LOAD THE INSTRUCTION "L 15,0(,15)".          25504002
         AGO   .XDONE    SKIP AROUND THE CASE FOR &X = 14.              25512002
.XIS14   L     0,IGA14AL1  LOAD THE INSTRUCTION "L 14,0(,14)".          25520002
.XDONE   ANOP                                                           25528002
         L     2,4(,&X)  RESTORE REGISTER 2.                            25536002
         ST    0,4(,&X)  OVERLAY THE BAL INSTRUCTION WITH A LOAD OF THE*25544002
                         ADDRESS OF IGARPT01.                           25552002
         LM    0,1,IGASAVE0  RESTORE REGISTERS ZERO AND ONE.            25560002
         BR    &X        RETUTN TO THE LOAD OF THE ADDRESS OF IGAFETCH. 25568002
         DROP  1                                                        25576002
&X       SETA  (&X+1)    EKE THE REGISTER.                              25584002
         AIF   (&X EQ 15).GOAGAIN  REPEAT IT FOR REGISTER 15.           25592002
         ORG   IGAFETCH+X'40'*2  ORIGIN TO THE RIGHT PLACE FOR THE     *25600002
                         SUBROUTINE TO LOAD THE MODULE.                 25608002
*********************************************************************** 25616002
* FETCH THE CONTENTS OF THE CVTRPT WORD, WHICH IS JUST THE ADDRESS OF * 25624002
* THE MODULE IGARPT01. DO THIS BY LOOKING TO SEE IF THE MODULE HAS    * 25632002
* BEEN LOADED ALREADY, AND IF IT HASN'T THEN LOAD IT FIRST.           * 25640002
*********************************************************************** 25648002
IGAGCVT  SLR   0,0                                                      25656002
         BALR  1,0                                                      25664002
         USING *,1                                                      25672002
IGASL0   SL    1,IGASL0A                                                25680002
         DROP  1                                                        25688002
         USING IGAFETCH,1                                               25696002
         CL    0,IGACVT  SEE IF THE MODULE IS ALREADY LOADED.           25704002
         BCR   8,2       RETURN IF IT IS ALREADY LOADED.                25712002
         LOAD  EP=IGARPT01  LOAD THE MODULE.                            25720002
         DROP  1                                                        25728002
         BALR  1,0                                                      25736002
         USING *,1                                                      25744002
IGASL1   SL    1,IGASL1A                                                25752002
         DROP  1                                                        25760002
         USING IGAFETCH,1                                               25768002
         ST    0,IGACVT  STORE THE ADDRESS OF THE LOADED MODULE.        25776002
         DROP  1                                                        25784002
         BR    2                                                        25792002
         CNOP  0,8                                                      25800002
IGASAVE0 DC    XL8'FFFFFFFFFFFFFFFF'                                    25808002
IGASL0A  DC    AL4(IGASL0-IGAFETCH)                                     25816002
IGASL1A  DC    AL4(IGASL1-IGAFETCH)                                     25824002
IGA14AL1 L     14,0(,14)                                                25832002
IGA15AL1 L     15,0(,15)                                                25840002
&SYSECT  CSECT                                                          25848002
.FIN     ANOP                                                           25856002
         MEND                                                           25864002
         EJECT                                                          25872002
         MACRO                                                          25880002
&TAG     SCANL &TREE,&MORE=,&DONE=,&T=,&TYPE=                           25888002
.*A000000                                                        Y02147 25896002
.********************************************************************** 25904002
.* THE SCANL MACRO-INSTRUCTION IS USED FOR MOVING THE CURSOR TO A     * 25912002
.* KEY-ADDRESS PAIR WITH A NEXT LOWER KEY. SEE THE DESCRIPTION OF THE * 25920002
.* CURSOR STATES IN THE ISCAN MACRO-INSTRUCTION DESCRIPTION FOR A     * 25928002
.* DISCUSSION OF THE CURSOR STATES. IF THE CURSOR IS POSITIONED       * 25936002
.* BETWEEN TWO PAIRS BY THE DEL OPERATION, THEN THE SCANL OPERATION   * 25944002
.* SETS THE CURSOR TO THE PAIR ON THE LEFT, I. E. IN THE DESCENDING   * 25952002
.* COLLATING SEQUENCE DIRECTION. THE ADDRESS RETURNED IN REGISTER 15  * 25960002
.* IS THE ADDRESS ASSOCIATED WITH THE KEY ON THE LEFT OF THE KEY THAT * 25968002
.* WAS DELETED. THE CONDITION CODE IS SET TO CORRESPOND TO THE RETURN * 25976002
.* CODE, SO THAT IF THE RPT HAS PAIRS PRESENT THE CONDITION CODE IS   * 25984002
.* NON-NEGATIVE WHEN THE CURSOR IS LEFT IN STATE 3, OR IS NEGATIVE IF * 25992002
.* THE CURSOR IS LEFT IN STATE 0, 1, OR 2.                            * 26000002
.*                                                                    * 26008002
.* IF THE CURSOR IS IN STATE 3, POSITIONED AT A KEY-ADDRESS PAIR, THEN* 26016002
.* THE SCANL OPERATION POSITIONS THE CURSOR AT THE PAIR ON THE LEFT OF* 26024002
.* THE ONE SELECTED. IF THERE IS NO PAIR ON THE LEFT OF THE ONE       * 26032002
.* SELECTED, THEN THE CURSOR IS SET TO STATE 1. IF THE CURSOR IS IN   * 26040002
.* STATE 1, AND THE SCANL OPERATION IS EXECUTED, THEN THE CURSOR IS   * 26048002
.* LEFT IN STATE 1. WHENEVER THE CURSOR IS LEFT IN STATE 1 BY THE     * 26056002
.* SCANL OPERATION, THE RETURN CODE IN REGISTER 15 IS SET TO -1, AND  * 26064002
.* THE CONDITION CODE IS SET TO CORRESPOND TO IT (CC=01).             * 26072002
         GBLC  &IGASCNL                                                 26080002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *26088002
                         OF RPT ENTRY POINTS.                           26096002
         GBLC  &IGARPT#  THIS HOLDS THE RPT TYPE.                       26104002
.********************************************************************** 26112002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 26120002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 26128002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 26136002
.* TYPE CHECKING SECTION.                                             * 26144002
.********************************************************************** 26152002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    26160002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *26168002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     26176002
.********************************************************************** 26184002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 26192002
.* AND IF THEY ARE NOT THEN USE T.                                    * 26200002
.********************************************************************** 26208002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*26216002
                         T.                                             26224002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       26232002
.RPT#TCK ANOP                                                           26240002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              26248002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *26256002
                         PARTITION TREE TYPE.                           26264002
.********************************************************************** 26272002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 26280002
.********************************************************************** 26288002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *26296002
                         RPT.                                           26304002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *26312002
                         THE TYPE PARAMETER.                            26320002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      26328002
.RPT#8   ANOP                                                           26336002
&IGARPT# SETC  '8'       SET THE RPT TYPE TO 8.                         26344002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*26352002
               Q '4')).RPT#FIN                                          26360002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    26368002
&IGARPT# SETC  '8'       TAKE THE DEFAULT TYPE 8 RPT.                   26376002
.RPT#FIN ANOP                                                           26384002
       RPTDSECT T=&IGARPT#,DS=NO                                        26392002
         AIF   (K'&TREE EQ K'&TREE(1)+2).LW1                            26400002
&TAG     L     1,&TREE                                                  26408002
.LW0     ANOP                                                           26416002
         L     15,(&IGABLST+&IGASCNL)(,1)  ADDRESS OF SCANL ROUTINE.    26424002
         BALR  14,15     LINK TO SCAN LEFT IN IGARPT01.                 26432002
         AGO   .FIN                                                     26440002
.LW1     ANOP                                                           26448002
&TAG     LR    1,&TREE                                                  26456002
         AGO   .LW0                                                     26464002
.FIN     ANOP                                                           26472002
         AIF   (K'&MORE NE 0).LW3                                       26480002
         AIF   (K'&DONE EQ 0).END                                       26488002
         BC    4,&DONE                                                  26496002
         AGO   .END                                                     26504002
.LW3     AIF   (K'&DONE NE 0).LW4                                       26512002
         BC    10,&MORE                                                 26520002
         AGO   .END                                                     26528002
.LW4     ANOP                                                           26536002
         BC    10,&MORE                                                 26544002
         BC    4,&DONE                                                  26552002
.END     ANOP                                                           26560002
.EOS     ANOP                                                           26568002
         MEND                                                           26576002
         EJECT                                                          26584002
         MACRO                                                          26592002
&TAG     SCANR &TREE,&MORE=,&DONE=,&T=,&TYPE=                           26600002
.********************************************************************** 26608002
.* THE SCANR MACRO-INSTRUCTION IS USED TO POSITION THE CURSOR TO A    * 26616002
.* NEXT PAIR TO THE RIGHT OF THE CURRENT CURSOR POSITION. THE         * 26624002
.* OPERATION IS IDENTICAL TO THE SCANL OPERATION, EXCEPT THAT STATE 2 * 26632002
.* IS USED INSTEAD OF STATE 1, AND WHEREVER THE WORDS "LEFT" AND      * 26640002
.* "RIGHT" APPEAR IN THE SCANL DESCRIPTION, REPLACE THEM WITH THE     * 26648002
.* WORDS "RIGHT" AND "LEFT" RESPECTIVELY.                             * 26656002
         GBLC  &IGASCNR                                                 26664002
         GBLC  &IGARPT#  THIS HOLDS THE RPT TYPE.                       26672002
.*A000000                                                        Y02147 26680002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *26688002
                         OF ENTRY POINTS FOR THE ROUTINES IN THE       *26696002
                         IGARPT01 MODULE.                               26704002
.********************************************************************** 26712002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 26720002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 26728002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 26736002
.* TYPE CHECKING SECTION.                                             * 26744002
.********************************************************************** 26752002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    26760002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *26768002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     26776002
.********************************************************************** 26784002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 26792002
.* AND IF THEY ARE NOT THEN USE T.                                    * 26800002
.********************************************************************** 26808002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*26816002
                         T.                                             26824002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       26832002
.RPT#TCK ANOP                                                           26840002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              26848002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *26856002
                         PARTITION TREE TYPE.                           26864002
.********************************************************************** 26872002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 26880002
.********************************************************************** 26888002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *26896002
                         RPT.                                           26904002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *26912002
                         THE TYPE PARAMETER.                            26920002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      26928002
.RPT#8   ANOP                                                           26936002
&IGARPT# SETC  '8'       SET THE RPT TYPE TO 8.                         26944002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*26952002
               Q '4')).RPT#FIN                                          26960002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    26968002
&IGARPT# SETC  '8'       TAKE THE DEFAULT TYPE 8 RPT.                   26976002
.RPT#FIN ANOP                                                           26984002
       RPTDSECT T=&IGARPT#,DS=NO                                        26992002
.********************************************************************** 27000002
         AIF   (K'&TREE EQ K'&TREE(1)+2).LW1                            27008002
&TAG     L     1,&TREE                                                  27016002
.LW0     ANOP                                                           27024002
         L     15,(&IGABLST+&IGASCNR)(,1)  ADDRESS OF SCANR ROUTINE.    27032002
         BALR  14,15     LINK TO SCAN RIGHT IN IGARPT01.                27040002
         AGO   .FIN                                                     27048002
.LW1     ANOP                                                           27056002
&TAG     LR    1,&TREE                                                  27064002
         AGO   .LW0                                                     27072002
.FIN     ANOP                                                           27080002
         AIF   (K'&MORE NE 0).LW3                                       27088002
         AIF   (K'&DONE EQ 0).END                                       27096002
         BC    4,&DONE                                                  27104002
         AGO   .END                                                     27112002
.LW3     AIF   (K'&DONE NE 0).LW4                                       27120002
         BC    10,&MORE                                                 27128002
         AGO   .END                                                     27136002
.LW4     ANOP                                                           27144002
         BC    10,&MORE                                                 27152002
         BC    4,&DONE                                                  27160002
.END     ANOP                                                           27168002
.EOS     ANOP                                                           27176002
         MEND                                                           27184002
         EJECT                                                          27192002
         MACRO                                                          27200002
&TAG     SRCH  &TREE,&A=,&K=,&Y=,&N=,&NULL=,&T=,&REL=,                 X27208002
               &SARG=,&EQUAL=,&UNEQUAL=,&TYPE=,&KEYL=                   27216002
.*A000000                                                        Y02147 27224002
.*  THE MEANINGS OF THE PARAMETERS FOR THE SRCH MACRO-INSTRUCTION ARE * 27232002
.*  AS FOLLOWS:                                                       * 27240002
.*--------------------------------------------------------------------* 27248002
.*  &TREE  IS THE ADDRESS OF THE RADIX PARTITION TREE.                * 27256002
.*         IF "TREE" IS CODED, WHERE "TREE" IS A SUITABLE OPERAND FOR * 27264002
.*         A LOAD ADDRESS INSTRUCTION, THE THE MAIN STORAGE LOCATION  * 27272002
.*         SO SPECIFIED IS PRESUMED TO CONTAIN THE ADDRESS OF THE RPT * 27280002
.*         AS RETURNED BY THE STREE MACRO-INSTRUCTION.                * 27288002
.*                                                                    * 27296002
.*         IF "(GPR)" IS CODED, THEN THE INDICATED REGISTER HAS THE   * 27304002
.*         ADDRESS OF THE RPT IN IT.                                  * 27312002
.*                                                                    * 27320002
.*         THE TREE ADDRESS IS LOADED INTO REGISTER 1 BY THE SRCH     * 27328002
.*         MACRO, SO THAT IF "(1)" IS CODED NO LOAD OR LR IS          * 27336002
.*         GENERATED.                                                 * 27344002
.*                                                                    * 27352002
.*         IF THE PARAMETER IS NOT CODED, THE MNOTE "TREE PARAMETER   * 27360002
.*         MISSING, ASSUMED IN R1." IS GENERATED WITH SEVERITY O, AND * 27368002
.*         THE ADDRESS OF THE RPT IS ASSUMED TO BE IN REGISTER 1.     * 27376002
.*--------------------------------------------------------------------* 27384002
.*  &T     IS THE TYPE OF THE RPT. SEE THE DESCRIPTION OF THE STREE   * 27392002
.*         MACRO INSTRUCTION FOR THE COMPLETE LIST OF OPERATIONS      * 27400002
.*         AVAILABLE WITH THE DIFFERENT TYPES OF TREES.               * 27408002
.*                                                                    * 27416002
.*        THE ONLY ALLOWED WAYS TO CODE THE T-PARAMETER ARE:          * 27424002
.*        T=5 FOR TYPE 5 RPT.                                         * 27432002
.*        T=8 FOR TYPE 8 RPT.                                         * 27440002
.*        IF THE T-PARAMETER IS NOT CODED A DEFAULT OF T=8 IS SUPPLIED* 27448002
.*--------------------------------------------------------------------* 27456002
.*  &A    SPECIFIES THE ADDRESS OF THE RECORD OR CONTROL BLOCK        * 27464002
.*        CONTAINING THE KEY TO BE USED IN THE SEARCH.                * 27472002
.*        THE A-PARAMETER, TOGETHER WITH THE K-PARAMETER, DEFINES     * 27480002
.*        THE SEARCH KEY.                                             * 27488002
.*                                                                    * 27496002
.*        IF "A=ADDRESS" IS CODED, WHERE "ADDRESS" IS A MAIN STORAGE  * 27504002
.*        LOCATION, THEN THE ADDRESS OF THE FIRST BYTE OF THE RECORD  * 27512002
.*        IS FORMED WITH A LOAD ADDRESS INSTRUCTION.                  * 27520002
.*                                                                    * 27528002
.*        IF "A=(GPR)" IS CODED, THEN THE ADDRESS OF THE FIRST BYTE   * 27536002
.*        OF THE RECORD IS IN THE SPECIFIED REGISTER.                 * 27544002
.*                                                                    * 27552002
.*--------------------------------------------------------------------* 27560002
.*  &K     SPECIFIES THE SEARCH KEY, WHEN TAKEN IN COMBINATION WITH   * 27568002
.*         THE A-PARAMETER. AT LEAST ONE OF THESE TWO PARAMETERS MUST * 27576002
.*         ALWAYS BE CODED, OR THE MNOTE "A OR K MUST BE CODED." IS   * 27584002
.*         GENERATED, WITH A SEVERITY CODE OF 12.                     * 27592002
.*                                                                    * 27600002
.*         THE FOLLOWING COMBINATIONS ARE VALID:                      * 27608002
.*         --- --------- ------------ --- ------                      * 27616002
.*                                                                    * 27624002
.*         "K=(DISPLACEMENT,LENGTH)", WHERE "DISPLACEMENT" IS EITHER  * 27632002
.*         A RELOCATABLE EXPRESSION OR A SELF-DEFINING ABSOLUTE       * 27640002
.*         DECIMAL NUMBER SPECIFYING EITHER THE ADDRESS OF BYTE ZERO  * 27648002
.*         OF THE KEY OR THE DISPLACEMENT FROM THE ADDRESS SPECIFIED  * 27656002
.*         BY THE A-PARAMETER TO THE FIRST BYTE OF THE KEY.           * 27664002
.*         "LENGTH" IS AN ABSOLUTE EXPRESSION GIVING THE LENGTH OF    * 27672002
.*         THE KEY. FOR TYPE 5 RPT, "LENGTH" IS A DECIMAL NUMBER.     * 27680002
.*                                                                    * 27688002
.*         FOR TYPE 5 RPT, THE KEY LENGTH CANNOT BE GREATER THAN 16.  * 27696002
.*         FOR TYPE 8 RPT, THE KEY LENGTH CANNOT BE GREATER THAN 256. * 27704002
.*                                                                    * 27712002
.*         IF THE A-PARAMETER IS CODED, THE ADDRESS OF THE FIRST      * 27720002
.*         BYTE OF THE KEY IS FORMED BY ADDING THE DISPLACEMENT TO THE* 27728002
.*         ADDRESS FROM THE A-PARAMETER. THE DISPLACEMENT MUST NOT    * 27736002
.*         EXCEED 4095.                                               * 27744002
.*                                                                    * 27752002
.*         IF THE A-PARAMETER IS CODED AND THE K-PARAMETER IS NOT     * 27760002
.*         CODED, THE THE K-PARAMETER IS ASSUMED TO BE THE SAME AS THE* 27768002
.*         K-PARAMETER THAT WAS CODED IN THE STREE MACRO WHEN THE RPT * 27776002
.*         WAS CREATED.                                               * 27784002
.*--------------------------------------------------------------------* 27792002
.*  &Y     IS THE ADDRESS TO BRANCH TO IF THE SEARCH KEY IS EQUAL TO  * 27800002
.*         THE KEY FOUND BY THE SEARCH.                               * 27808002
.*         IF  "Y=(GPR)" IS CODED, THEN THE ADDRESS TO BRANCH TO IF   * 27816002
.*         THEY ARE EQUAL IS IN THE SPECIFIED GPR.                    * 27824002
.*         IF THE  Y-PARAMETER IS NOT CODED, THEN EXECUTION CONTINUES * 27832002
.*         WITH THE NEXT INSTRUCTION AFTER THE SRCH MACRO.            * 27840002
.*--------------------------------------------------------------------* 27848002
.*  &N     IS THE ADDRESS TO BRANCH TO IF THE SEARCH KEY IS NOT EQUAL * 27856002
.*         TO THE KEY FOUND BY THE SEARCH. IT IS CODED THE SAME WAY   * 27864002
.*         THE  Y-PARAMETER IS CODED.                                 * 27872002
.*         NOTE THAT IF THE RPT HAS NO ENTRIES IN IT THE SEARCH KEY   * 27880002
.*         IS CONSIDERED NOT EQUAL.                                   * 27888002
.*--------------------------------------------------------------------* 27896002
.*  &NULL  IS THE ADDRESS TO BRANCH TO IF THERE ARE NO SINKS IN THE   * 27904002
.*         RPT. IT IS CODED IN THE SAME WAY AS THE N AND Y            * 27912002
.*         PARAMETERS. IF BOTH THE NULL AND N  PARAMETERS ARE CODED   * 27920002
.*         AND THE RPT IS EMPTY A BRANCH TO THE NULL ADDRESS IS TAKEN.* 27928002
.*                                                                    * 27936002
.*--------------------------------------------------------------------* 27944002
.*  &REL   IS A QUALIFIER SPECIFYING THE RELATIONSHIP BETWEEN THE     * 27952002
.*         SEARCH KEY AND THE KEY TO BE FOUND.                        * 27960002
.*                                                                    * 27968002
.*         THE REL PARAMETER IS CODED AS FOLLOWS:                     * 27976002
.*                                                                    * 27984002
.*             **  **     **               **   **  **                * 27992002
.*            **  **       **             **  LT **  **               * 28000002
.*           **   **  MAX  **             **  LE **   **              * 28008002
.*           **   **       **             **  EQ **   **              * 28016002
.*   REL=    **  **   MIN   **       ,,  **   --  **  **              * 28024002
.*           **   **  ---  **         ,,  **  GE **   **              * 28032002
.*           **   **       **         ,,  **  GT **   **              * 28040002
.*            **  **  POV  **        ,,   ** POV **  **               * 28048002
.*             **  **     **        ,,     **   **  **                * 28056002
.*                                 ,,                                 * 28064002
.*                                                                    * 28072002
.*         THUS "REL=(MAX,LE)" IMPLIES A SEARCH FOR THE LARGEST KEY   * 28080002
.*         THAT IS LESS THAN OR EQUAL TO THE SEARCH KEY.              * 28088002
.*                                                                    * 28096002
.*         WHEN THE REL PARAMETER IS CODED THE KEY LENGTH MUST BE     * 28104002
.*         CODED EXPLICTLY IN THE K PARAMETER.                        * 28112002
.*--------------------------------------------------------------------* 28120002
.*         WHEN "REL=(MAX/MIN,POV)" IS CODED, A SEARCH IS MADE TO FIND* 28128002
.*         THE LARGEST OR SMALLEST PARTIAL ORDER VALUE.               * 28136002
.*         WHEN "REL=(POV,GE)" IS CODED A SEARCH TO FIND A PARTIAL    * 28144002
.*         ORDER VALUE THAT IS GREATER THAN OR EQUAL TO THE SEARCH    * 28152002
.*         KEY, BUT IS THE SMALLEST THAT CAN BE SO DETERMINED         * 28160002
.*         EFFICIENTLY (NOT NECESSARILY THE SMALLEST POSSIBLE).       * 28168002
.*--------------------------------------------------------------------* 28176002
.*         ONLY THE FOLLOWING COMBINATIONS ARE VALID:                 * 28184002
.*                                                                    * 28192002
.*         REL=(MAX,LT/LE/EQ/POV)                                     * 28200002
.*         REL=(MIN,EQ/GE/GT/POV)                                     * 28208002
.*         REL=(POV,GE) MEANS FIND MIN POV>=KEY.                      * 28216002
.*--------------------------------------------------------------------* 28224002
.*         REL=(POV,EQ) MEANS FIND POV FOR THE SINK ADDRESSED BY THE  * 28232002
.*         CURRENT SETTING OF THE CURSOR.                             * 28240002
.*--------------------------------------------------------------------* 28248002
.*  &SARG      THESE ARE ONLY PRESENT FOR COMPATIBILITY WITH EARLIER  * 28256002
.*  &EQUAL     VERSIONS, AND SHOULD NOT BE USED.                      * 28264002
.*  &UNEQUAL                                                          * 28272002
.*  &TYPE                                                             * 28280002
.*  &KEYL                                                             * 28288002
         GBLC  &IGABLST  THE BEGINNING OF THE LIST OF ENTRY POINTS FOR *28296002
                         THE RPT OPERATIONS.                            28304002
         GBLC  &IGASRCH                                                 28312002
         GBLC  &IGADDR   THE ADDRESS OF THE MODULE IGARPTXX.            28320002
         GBLC  &IGARPT#  THE RADIX PARTITION TREE TYPE.                 28328002
         GBLA  &IGAPATH(16)  PATH VECTOR IN BIG PARSE TREE.             28336002
         GBLA  &IGALEVL      PATH LENGTH TO ATOM IN PARSE TREE.         28344002
         GBLA  &IGALEFT(256)  LEFT EDGE FIELDS IN PARSE TREE.           28352002
         GBLA  &IGARGHT(256)  RIGHT EDGE FIELDS IN PARSE TREE.          28360002
         GBLA  &IGAX  EOP TRIPLE FOR THE BINARY PARSE TREE WITH         28368002
         GBLA  &IGAY  SUBTRACTION INVERTIBLE EDGES GENERATED BY         28376002
         GBLA  &IGAZ  THE MACRO-INSTRUCTION RPTDSECT.                   28384002
         GBLA  &IGAKEYL  THE LENGTH OF THE SEARCH KEY.                  28392002
         GBLC  &IGAGPV  BRANCH ENTRY OFFSET TO GET THE PARTIAL ORDER    28400002
.*                      VALUE FOR THE CURSOR-SELECTED SINK (TYPE 9 RPT) 28408002
         GBLC  &IGAPVS  BRANCH ENTRY OFFSET TO THE ROUTINE IN IGARPT01  28416002
.*                      TO SEARCH FOR A PARTIAL ORDER VALUE THAT IS     28424002
.*                      GREATER THAN OR EQUAL TO THE SEARCH KEY.        28432002
         GBLC  &IGAEOPV  THE OFFSET TO THE PATH CODE BYTE IN THE TYPE 8*28440002
                         RPT HEADER FOR THE PATH TO THE SINK CURRENTLY *28448002
                         SELECTED BY THE CURSOR.                        28456002
         GBLC  &IGACNT5  THE OFFSET TO THE USE COUNTER IN THE TYPE 5   *28464002
                         RPT HEADER.                                    28472002
         GBLC  &IGAMSK5  THE OFFSET TO THE TABLE OF MASKS FOR TYPE 5   *28480002
                         RPT.                                           28488002
         GBLC  &IGATOP5  THE OFFSET TO THE RPT SOURCE IN THE TYPE 5 RPT*28496002
                         HEADER.                                        28504002
         GBLC  &IGAMAX   THE OFFSET TO THE WORD CONTAINING THE MAXIMUM *28512002
                         PARTIAL ORDER VALUE.                           28520002
         GBLC  &IGAKEYW  THE OFFSET TO THE WORD CONTAINING THE ADDRESS *28528002
                         OF THE WORK AREA FOR COLLECTING KEYS.          28536002
         GBLB  &IGAOKAY  ON IF THE PARSE IN RPTDSECT DID NOT FIND ANY  *28544002
                SYNTAX ERRORS IN THE R PARAMETER LIST.                  28552002
         LCLA  &I        A LOCAL VARIABLE FOR KEEPING TRACK OF THE     *28560002
                         CURRENT ENTRY BEING SCANNED IN THE R PARAMETER*28568002
                         LIST.                                          28576002
         LCLA  &LNG      THE LENGTH OF THE CURRENT DISPLACEMENT-LENGTH *28584002
                         PAIR.                                          28592002
         LCLC  &X        JUST A LOCAL CHARACTER VECTOR FOR COLLECTING  *28600002
                         OPERANDS.                                      28608002
         LCLB  &FINEQU   ON IF THE EQUATE "FIN&SYSNDX EQU *" MUST BE   *28616002
                         GENERATED AT THE END OF THE MACRO EXECUTION.   28624002
         LCLB  &ERROR    THIS BIT IS TURNED ON WHENEVER AN MNOTE OF    *28632002
                         SUFFICIENT SEVERITY IS GENERATED.              28640002
         LCLB  &KLMNOTE  ON WHEN THE KEY LENGTH EXCEEDS 256 BYTES.      28648002
         LCLA  &DSP      THIS IS USED FOR COLLECTING THE DISPLACEMENT  *28656002
                         AS A NUMBER.                                   28664002
         LCLC  &FIELD    THIS IS USED TO HOLD THE FIELD OF AN (F,L)    *28672002
                         PAIR WHILE GETTING THE L.                      28680002
         LCLB  &XFER     ON TO GENERATE THE MOVES WHEN IT IS THE RIGHT *28688002
               ITERATION THROUGH THE LOOP.                              28696002
         LCLA  &KL             KEY LENGTH ARITHMETIC VARIABLE.          28704002
         LCLA  &TMPA     A LOCAL ARITHMETIC TEMPORARY.                  28712002
         LCLB  &WORKEY   ON IF THE KEY IS COLLECTED AT IGAWORK.         28720002
         LCLB  &USING    THIS BIT IS TURNED ON WHEN A USING WITH       *28728002
                         REGISTER R1 IS GENERATED.                      28736002
         LCLB  &FIN      ON IF THE FIN&SYSNDX EQU * IS TO BE GENERATED *28744002
                         AT THE END.                                    28752002
         LCLC  &P,&C,&S,&GOLEFT,&ITSMOP,&ITSEOP,&TREEHDR,&ARG,&EKER     28760002
         LCLC  &EKE,&TOOBAD,&FOUR,&O                                    28768002
         LCLC  &R1       GENERAL REGISTER 1.                            28776002
         LCLC  &TMP      A TEMPORARY LOCAL CHARACTER VECTOR.            28784002
         LCLC  &TMP0     A LOCAL TEMPORARY CHARACTER VARIABLE.          28792002
         LCLC  &TMP1     A TEMPORARY LOCAL CHARACTER VECTOR.            28800002
         AIF   ((K'&SARG EQ 0)AND(K'&EQUAL EQ 0)AND(K'&UNEQUAL EQ 0)AND*28808002
               (K'&KEYL EQ 0)).NEW                                      28816002
         AIF   (K'&KEYL EQ 0).OLDKLZ  SEE IF THE OLD KEY LENGTH IS NOT *28824002
                         GIVEN.                                         28832002
&TAG     SRCH  &TREE,A=&SARG,Y=&EQUAL,N=&UNEQUAL,T=&T,TYPE=&TYPE,K=(0, *28840002
               &KEYL),NULL=&NULL,REL=&REL                               28848002
         AGO   .END                                                     28856002
.OLDKLZ  ANOP                                                           28864002
         AIF   (K'&SARG LE 2).OLDONE  SEE IF THE SEARCH ARGUMENT IS NOT*28872002
                         OF THE FORM "D(GPR)".                          28880002
         AIF   (NOT(('&SARG'(1,1) LE '9')AND('&SARG'(1,1) GE '0'))).OLD*28888002
               ONE       SEE IF IT NOT OF THE FORM "D(GPR)".            28896002
.********************************************************************** 28904002
.* THE OLD SEARCH ARGUMENT IS SPECIFIED AS "D(GPR)", TRANSLATE THIS   * 28912002
.* INTO A GOOD NEW FORMAT VIA THE MACRO RECURSION FACILITY.           * 28920002
.********************************************************************** 28928002
         AIF   ('&SARG'(K'&SARG,1) NE ')').OLDONE  HOWEVER, FIRST CHECK*28936002
                         IT FOR VALIDITY.                               28944002
&I       SETA  (1)       LOOK FOR THE LEFT PARENTHESIS.                 28952002
.OLDLOOP ANOP                                                           28960002
&I       SETA  (&I+1)    EKE THE INDEX TO THE NEXT CHARACTER.           28968002
         AIF   (&I GT (K'&SARG)).OLDONE  SEE IF THERE ISN'T ANY LEFT   *28976002
                         PARENTHESIS.                                   28984002
         AIF   ('&SARG'(&I,1) NE '(').OLDLOOP  SEE IF IT IS STILL      *28992002
                         GOING.                                         29000002
&TMP0    SETC  '&SARG'(1,&I-1)  PICK UP THE DISPLACEMENT FIELD.         29008002
&TMP1    SETC  '&SARG'(&I,K'&SARG-(&I+1))  GET THE GPR WITH ITS        *29016002
                         SURROUNDING PARENTHESES.                       29024002
&TAG     SRCH  &TREE,A=&TMP1,K=(&TMP0,),Y=&EQUAL,N=&UNEQUAL,T=&T,      *29032002
               TYPE=&TYPE,NULL=&NULL,REL=&REL                           29040002
         AGO   .END      ALL DONE NOW.                                  29048002
.OLDONE  ANOP                                                           29056002
&TAG     SRCH  &TREE,A=&SARG,Y=&EQUAL,N=&UNEQUAL,T=&T,TYPE=&TYPE,      *29064002
               NULL=&NULL,REL=&REL                                      29072002
         AGO   .END      ALL DONE NOW.                                  29080002
.NEW     ANOP                                                           29088002
.********************************************************************** 29096002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 29104002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 29112002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 29120002
.* TYPE CHECKING SECTION.                                             * 29128002
.********************************************************************** 29136002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    29144002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *29152002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     29160002
.********************************************************************** 29168002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 29176002
.* AND IF THEY ARE NOT THEN USE T.                                    * 29184002
.********************************************************************** 29192002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*29200002
                         T.                                             29208002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       29216002
.RPT#TCK ANOP                                                           29224002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              29232002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *29240002
                         PARTITION TREE TYPE.                           29248002
.********************************************************************** 29256002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 29264002
.********************************************************************** 29272002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *29280002
                         RPT.                                           29288002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *29296002
                         THE TYPE PARAMETER.                            29304002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      29312002
.RPT#8   ANOP                                                           29320002
&IGARPT# SETC  '8'       SET THE RPT TYPE TO 8.                         29328002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*29336002
               Q '4')).RPT#FIN                                          29344002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    29352002
&IGARPT# SETC  '8'       TAKE THE DEFAULT TYPE 8 RPT.                   29360002
.RPT#FIN ANOP                                                           29368002
      RPTDSECT T=&IGARPT#,DS=0  DON'T GENERATE THE BIG DSECT.           29376002
.********************************************************************** 29384002
         AIF   (K'&TREE NE 0).CHKGPR  SEE IF THE TREE ADDRESS IS CODED. 29392002
         MNOTE 0,'TREE PARAMETER MISSING, ASSUMED IN R1.'               29400002
         AGO   .CHKTAG  GO CHECK THE LABEL TO SEE IF EQU * NEEDED.      29408002
.CHKGPR  ANOP                                                           29416002
         AIF   (K'&TREE EQ K'&TREE(1)+2 AND N'&TREE EQ 1).LW1           29424002
&TAG     L     1,&TREE   LOAD ADDRESS OF PARAMETER LIST.                29432002
         AGO   .LW2                                                     29440002
.LW1     ANOP                                                           29448002
         AIF   ('&TREE' NE '(1)').LW1F  SEE IF THE TREE ADDR IS IN GPR1 29456002
.CHKTAG  ANOP                                                           29464002
         AIF   (K'&TAG EQ 0).LW1B  SINCE THERE IS NO LR, DOES IT HAVE   29472002
.*                                 TO GENERATE THE LABEL EQU * ?        29480002
&TAG     EQU   *                                                        29488002
.LW1B    AGO   .LW2      DONE WITH LABEL AND TREE.                      29496002
.LW1F    ANOP                                                           29504002
&TAG     LR    1,&TREE(1)                                               29512002
.********************************************************************** 29520002
.* THE TREE ADDRESS IS NOW IN REGISTER 1.                             * 29528002
.********************************************************************** 29536002
.LW2     AIF   ((K'&A NE 0)OR(K'&K NE 0)).LW3  MAKE SURE THAT EITHER    29544002
.*             THE A OR K PARAMETER IS CODED.                           29552002
         MNOTE 12,'A OR K MUST BE CODED.'                               29560002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         29568002
.LW3     ANOP                                                           29576002
&R1      SETC  '1'  REGISTER 1 FOR USING STATEMENT.                     29584002
.*--------------------------------------------------------------------* 29592002
.*  BRANCH OUT TO THE VARIOUS SEARCHES HERE.                          * 29600002
         AIF   ('&IGARPT#' EQ '8').SRCH8  SEE IF THIS IS A TYPE 8 RPT.  29608002
         AIF   ('&IGARPT#' EQ '5').SRCH5  SEE IF THIS IS A TYPE 5 RPT.  29616002
         MNOTE 12,'INVALID RPT TYPE, NO TYPE &IGARPT#.'                 29624002
         MEXIT                                                          29632002
.*--------------------------------------------------------------------* 29640002
.* SRCH8, USING THE SUBROUTINE IN IGARPT01.                           * 29648002
.*                                                                    * 29656002
.*       FOR SRCH8:                                                   * 29664002
.* 0. LEFT AND RIGHT INVERTIBLE EDGES, 3 BYTES LONG, EITHER OF THE    * 29672002
.*    SUBTRACTION OR EXCLUSIVE-OR TYPE.                               * 29680002
.* 1. NO SUCCESSOR PAIRING.                                           * 29688002
.* 2. MAXIMUM OF A 256-BYTE KEY IS SUPPORTED.                         * 29696002
.* 3. THE FLAG BITS ARE STORED WITH THE PREDECESSOR VERTEX.           * 29704002
.* 4. SCANNING FUNCTIONS ARE SUPPORTED WITH INVERTIBLE EDGES.         * 29712002
.*--------------------------------------------------------------------* 29720002
.SRCH8   ANOP                                                           29728002
.********************************************************************** 29736002
.* CHECK THE REL PARAMETER TO SEE IF A PARTIAL ORDER VALUE IS         * 29744002
.* INVOLVED.                                                          * 29752002
.********************************************************************** 29760002
         AIF   (K'&REL NE 0).NOTPOV  SEE IF THE REL PARAMETER IS NOT   *29768002
                         CODED.                                         29776002
         AIF   (N'&REL NE 1).TWOREL  SEE IF THERE ARE TWO ELEMENTS IN  *29784002
                         THE REL PARAMETER.                             29792002
         AIF   ('&REL(1)' EQ 'POV').POVGET  SEE IS THE SEARCH IS JUST  *29800002
                         TO GET THE POV FROM THE CURRENT CURSOR        *29808002
                         SETTING, OR USING THE KEY (IF THERE IS ONE).   29816002
         AGO   .NOTPOV   IT IS NOT A PARTIAL ORDER VALUE SEARCH.        29824002
.TWOREL  ANOP                                                           29832002
         AIF   (('&REL(1)' EQ 'POV')OR('&REL(2)' EQ 'POV')).ITSAPOV    *29840002
                         SEE IF A PARTIAL ORDER VALUE IS INVOLVED.      29848002
.NOTPOV  ANOP                                                           29856002
.********************************************************************** 29864002
.* GENERATE THE ADDRESS OF THE SEARCH ARGUMENT IN REGISTER ZERO FOR   * 29872002
.* THE SEARCH SUBROUTINE IN THE MODULE IGARPT01.                      * 29880002
.* IF THE K PARAMETER IS NOT CODED JUST GO DIRECTLY TO .CHKA AND USE  * 29888002
.* THE ADDRESS SPECIFIED BY THE A PARAMETER.                          * 29896002
.* IF THE K PARAMETER IS CODED AND DEFINES A KEY CONSISTING OF MORE   * 29904002
.* THAN ONE FIELD, COLLECT IT AT IGAWORK IN THE TREE HEADER. THEN PUT * 29912002
.* THE ADDRESS OF IGAWORK IN REGISTER 0 FOR THE SEARCH.               * 29920002
.********************************************************************** 29928002
         AIF   (K'&K EQ 0).CHKA  SEE IF THERE IS NO SEARCH KEY         *29936002
                         SPECIFIED.                                     29944002
.********************************************************************** 29952002
.* THE K PARAMETER HAS BEEN CHECKED AT THIS POINT, AND IS NOT THE     * 29960002
.* EMPTY STRING.                                                      * 29968002
.********************************************************************** 29976002
.LOOPAIR ANOP                                                           29984002
&XFER    SETB  (1)       FOR THE SRCH MACRO ALWAYS GENERATE THE MOVES  *29992002
                         ON THE SINGLE PASS THROUGH THIS PART.          30000002
&IGAKEYL SETA  0         INITIALIZE THE RECORD LENGTH TO ZERO.          30008002
         AIF   (N'&K EQ 2).KHAS2  SEE IF THERE ARE EXACTLY TWO ELEMENTS*30016002
                         IN K ON PARENTHESIS LEVEL ONE.                 30024002
         AIF   (N'&K NE 1).KMIXED  SEE IF THERE ARE MORE THAN TWO      *30032002
                         ELEMENTS, FOR IF SO THE LIST CONSISTS OF A    *30040002
                         SERIES OF FIELD NAMES OR (D,L) PAIRS.          30048002
.********************************************************************** 30056002
.* K HAS ONLY ONE ELEMENT ON LEVEL 1. FIND OUT WHICH OF THE FOLLOWING * 30064002
.* CASES APPLIES, AND TAKE THE INDICATED ACTION:                      * 30072002
.* IN THE FOLLOWING DISCUSSION, )F" MEANS A FIELD NAME, "D" MEANS     * 30080002
.* DISPLACEMENT, "L" MEANS LENGTH, AND "X" MEANS ANY STRING. THE D AND* 30088002
.* L FIELDS MUST BE SELF-DEFINING TERMS,.                             * 30096002
.* IF:   THEN:                                                        * 30104002
.* K=F   ENTER THE ROUTINE AT .KMIXED TO PROCESS A LIST OF PAIRS OF   * 30112002
.*       F'S AND (D,L) PAIRS, SINCE THIS CASE WILL BE TREATED AS A    * 30120002
.*       SINGLE FIELD NAME BY THAT ROUTINE.                           * 30128002
.* K=(F) THIS IS AN ERROR, BECAUSE OF THE POSSIBLE FUTURE USE OF THIS * 30136002
.*       FORM TO INDICATE THE ADDRESS OF A LIST OF DISPLACEMENT-LENGTH* 30144002
.*       PAIRS IN A REGISTER.                                         * 30152002
.* K=L   L IS THE LENGTH OF THE RECORD TO BE INSERTED. THE A PARMAETER* 30160002
.*       MUST BE CODED FOR THIS TO BE VALID, BECAUSE OTHERWISE THERE  * 30168002
.*       IS NO WAY TO FIND OUT WHERE THE RECORD IS THAT IS TO BE      * 30176002
.*       INSERTED.                                                    * 30184002
.* K=(L) THIS IS AN ERROR, BECAUSE OF THE POSSIBILITY THAT IN THE     * 30192002
.*       FUTURE I WILL WANT TO PUT THE ADDRESS OF A LIST OF           * 30200002
.*       DISPLACEMENT-LENGTH PAIRS IN A REGISTER.                     * 30208002
.* K=((X)) ENTER THE .KMIXED ROUTINE, SINCE IT LOOKS LIKE A LIST OF   * 30216002
.*       DISPLACEMENT-LENGTH PAIRS WITH ONLY ONE PAIR.                * 30224002
.*       ANYTHING ELSE IS INVALID, AND PRODUCES THE MNOTE 12,'INVALID * 30232002
.*       R-PARAMETER.'                                                * 30240002
.********************************************************************** 30248002
         AIF   ('&K'(1,1) NE '(').KNOTLP  SEE IF THERE ARE NO          *30256002
                         PARENTHESES AROUND THE OPERAND.                30264002
         AIF   ('&K'(1,2) EQ '((').KMIXED  SEE IF THIS IS THE CASE     *30272002
                         K=((X)).                                       30280002
         MNOTE 12,'A REGISTER CANNOT BE SPECIFIED FOR THE LIST OF DISPL*30288002
               ACEMENT-LENGTH PAIRS.'                                   30296002
&ERROR   SETB  1         SET THE ERROR FLAG ON.                         30304002
         AGO   .KFIN     END THIS PART.                                 30312002
.********************************************************************** 30320002
.* THIS MUST BE ONE OF THE TWO CASES K=F OR K=L.                      * 30328002
.********************************************************************** 30336002
.KNOTLP  ANOP                                                           30344002
         AIF   (((T'&K(1) NE 'M')AND(T'&K(1) NE 'N')AND(T'&K(1) NE 'O')*30352002
               AND(T'&K(1) NE 'T')AND(T'&K(1) NE 'W')AND(T'&K(1) NE '$'*30360002
               )AND(T'&K(1) NE 'U'))).KMIXED                            30368002
.* THIS MUST BE THE CASE WHERE "R=L" IS CODED.                        * 30376002
         AIF   (T'&K(1) NE 'N').K1NOTN  SEE IF IT IS A SELF-DEFINING   *30384002
                         FIELD.                                         30392002
.********************************************************************** 30400002
.* K=L IS CODED, AND L IS A SELF-DEFINING TERM. USE L FOR THE RECORD  * 30408002
.* LENGTH, BUT FIRST CHECK TO SEE IF THE A PARAMETER IS CODED. IF THE * 30416002
.* A PARAMETER IS NOT CODED IT IS AN ERROR.                           * 30424002
.********************************************************************** 30432002
&IGAKEYL SETA  (&K(1))   GET THE RECORD LENGTH FROM THE L OF THE K     *30440002
                         PARAMETER.                                     30448002
         AIF   (K'&A EQ 0).K1AMT  SEE IF THE A PARAMETER HAS BEEN LEFT *30456002
                         OUT.                                           30464002
         AIF   (&IGAKEYL GT 256).K1LERR  FOR THE NONCE ONLY TAKE FIELDS*30472002
                         THAT ARE LESS THAN 257 BYTES LONG.             30480002
         AIF   (NOT &XFER).KFIN  SEE IF THIS IS THE MVC GENERATION     *30488002
                         LOOP, OR JUST THE VALIDATION AND ADDING UP    *30496002
                         FIELD LENGTHS LOOP.                            30504002
         AIF   ('&A'(1,1) EQ '(').K1AGPR  SEE IF THE ADDRESS IS IN A   *30512002
                         GPR.                                           30520002
         LA    0,&A      ADDRESS OF SEARCH KEY.                         30528002
         AGO   .KFIN     ALL DONE NOW.                                  30536002
.K1AGPR  AIF   ('&A' EQ '(0)').KFIN  SEE IF THE SEARCH KEY ADDRESS IS  *30544002
                         ALREADY IN REGISTER 0.                         30552002
         LR    0,&A(1)   ADDRESS OF SEARCH KEY.                         30560002
         AGO   .KFIN     GO TO THE END OF THE K PARAMETER PROCESSING.   30568002
.********************************************************************** 30576002
.* FOLLOWING ARE THE MISCELLANEOUS ERROR MNOTES FROM THE SINGLE       * 30584002
.* ELEMENT CASE OF THE K PARAMETER.                                   * 30592002
.********************************************************************** 30600002
.K2LERR  ANOP                                                           30608002
.K1LERR  MNOTE 12,'THE LENGTH OF EACH FIELD DEFINED BY K CANNOT EXCEED *30616002
               256 BYTES.'                                              30624002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON SO THE MVC'S DON'T GET  *30632002
                         GENERATED.                                     30640002
         AGO   .KFIN                                                    30648002
.K1AMT   MNOTE 12,'THE A PARAMETER MUST BE CODED WITH K AS CODED.'      30656002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         30664002
         AGO   .KFIN                                                    30672002
.K1NOTN  MNOTE 12,'THE LENGTH MUST BE A SELF-DEFINING TERM FOR THE K PA*30680002
               RAMETER.'                                                30688002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         30696002
         AGO   .KFIN                                                    30704002
.********************************************************************** 30712002
.* THE K PARAMETER HAS EXACTLY TWO ELEMENTS IN IT ON LEVEL 1. SEE IF  * 30720002
.* EITHER OF THESE TWO ELEMENTS STARTS WITH A LEFT PARENTHESIS, WHICH * 30728002
.* MEANS ONE OF THE CASES K=(X,(X)), K=((X),X), OR K=((X),(X)). IF IT * 30736002
.* IS ONE OF THESE CASES ENTER THE MIXED ROUTINE AT .KMIXED.          * 30744002
.* IF IT IS NOT ONE OF THOSE THREE CASES, THEN IT MUST BE ONE OF THE  * 30752002
.* CASES K=(F,F), K=(F,L), OR K=(D,L). NOTE THAT THE CASE K=(D,L) CAN * 30760002
.* BE CODED AS K=(,L).                                                * 30768002
.********************************************************************** 30776002
.KHAS2   AIF   (K'&K(2) NE 0).K2NOTMT  SEE IF THE SECOND ELEMENT IS THE*30784002
                         EMPTY STRING. THIS IS NO GOOD.                 30792002
         MNOTE 12,'THE SECOND ELEMENT OF A DISPLACEMENT-LENGTH PAIR MUS*30800002
               T BE CODED.'                                             30808002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         30816002
         AGO   .FIN      FORGET IT, CAN'T DO ANYTHING WITH AN EMPTY    *30824002
                         STRING FOR THE LENGTH.                         30832002
.K2DMT   ANOP                                                           30840002
&DSP     SETA  (0)       SET THE DISPLACEMENT TO ZERO, SINCE IT IS     *30848002
                         CODED AS THE EMPTY STRING.                     30856002
         AGO   .K2MERGE  MERGE WITH THE CASE WHERE THE DISPLACEMENT IS *30864002
                         NOT THE EMPTY STRING.                          30872002
.K2NOTMT AIF   (K'&K(1) EQ 0).K2DMT  SEE IF THE DISPLACEMENT IS THE    *30880002
                         EMPTY STRING.                                  30888002
         AIF   (('&K(1)'(1,1) EQ '(')OR('&K(2)'(1,1) EQ '(')).KMIXED   *30896002
                         LOOK FOR ONE OF THE CASES K=(X,(X)), K=((X),  *30904002
                         X), OR K=((X),(X)).                            30912002
         AIF   (((T'&K(2) NE 'M')AND(T'&K(2) NE 'N')AND(T'&K(2) NE 'O')*30920002
               AND(T'&K(2) NE 'T')AND(T'&K(2) NE 'W')AND(T'&K(2) NE '$'*30928002
               )AND(T'&K(2) NE 'U'))).KMIXED                            30936002
.* THE SECOND ELEMENT IS NOT A FIELD NAME, SO IT MUST EITHER BE ONE OF* 30944002
.* THE TWO CASES K=(F,L) OR K=(D,L), OR IT IS AN ERROR.               * 30952002
&IGAKEYL SETA  0         ALLOW THE CASE WHERE THE LENGTH IS LEFT OUT   *30960002
                         WHEN THERE IS ONLY ONE DISPLACEMENT.           30968002
         AIF    (K'&K EQ 0).MERGEK2  SEE IF THE LENGTH IS ELIDED.       30976002
         AIF   ((T'&K(1) NE 'M')AND(T'&K(1) NE 'N')AND(T'&K(1) NE 'O')A*30984002
               ND(T'&K(1) NE 'T')AND(T'&K(1) NE 'W')AND(T'&K(1) NE '$')*30992002
               AND(T'&K(1) NE 'U')).K2F1                                31000002
         AIF   (T'&K(1) EQ 'N').K2D  SEE IF THE DISPLACEMENT IS A SELF-*31008002
               DEFINING TERM.                                           31016002
&I       SETA  (K'&K(1)) THE DISPLACEMENT IS NOT A SELF-DEFINING TERM,  31024002
.K2DCHK  AIF   (('&K(1)'(&I,1) LT '0')OR('&K(1)'(&I,1) GT '9')).K2DTYPE 31032002
&I       SETA  (&I+1)    SEE IF IT IS A DECIMAL NUMBER ANYWAY.          31040002
         AIF   (&I GT 0).K2DCHK  THIS IS NECESSARY BECAUSE OF THE WAY  *31048002
               ASSEMBLER F DOES NOT RECORD THE CORRECT TYPE ATTRIBUTE  *31056002
               OF OPERANDS PASSED IN A SUBLIST VIA MACRO-RECURSION.     31064002
         AIF   (K'&K(1) GT 4).K2DERR  SEE IF IT HAS TOO MANY DIGITS.    31072002
.K2D     ANOP                                                           31080002
&DSP     SETA  (&K(1))   PICK UP THE DISPLACEMENT.                      31088002
.K2MERGE ANOP                                                           31096002
         AIF   (T'&K(2) EQ 'N').K2L  SEE IF IT IS A SELF-DEFINING TERM. 31104002
&I       SETA  (K'&K(2))  SET THE INDEX TO IT'S INITIAL VALUE.          31112002
         AIF   (K'&K(2) EQ 0).K2LERR SEE IF IT IS THE EMPTY STRING.     31120002
.K2LCHK  AIF   (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).K2LTYPE 31128002
&I       SETA  (&I-1)    DECREASE THE INDEX TO THE NEXT CHARACTER.      31136002
         AIF   (&I GT 0).K2LCHK  SEE IF THERE ARE MORE TO CHECK.        31144002
         AIF   (K'&K(2) GT 4).K2LERR  SEE IF IT HAS TOO MANY DIGITS.    31152002
.K2L     ANOP                                                           31160002
&IGAKEYL SETA  (&K(2))   GET THE LENGTH AS A NUMBER.                    31168002
.MERGEK2 ANOP                                                           31176002
         AIF   (&IGAKEYL GT 256).K1LERR  SEE IF THE LENGTH IS MORE THAN*31184002
                         256 BYTES.                                     31192002
         AIF   (&DSP GT 4095).K2DERR  SEE IF THE DISPLACEMENT IS       *31200002
                         GREATER THAN 4095.                             31208002
         AIF   (K'&A EQ 0).K1AMT  SEE IF THE A PARAMETER IS LEFT OUT;  *31216002
                         THAT IS BAD.                                   31224002
         AIF   (NOT &XFER).KFIN  SEE IF THIS IS THE MVC GENERATING LOOP*31232002
                         OR NOT.                                        31240002
.********************************************************************** 31248002
.* THERE IS ONLY ONE FIELD SPECIFIED FOR THE KEY; PUT ITS ADDRESS IN  * 31256002
.* REGISTER 0 FOR THE SEARCH SUBROUTINE IN IGARPT01.                  * 31264002
.********************************************************************** 31272002
         AIF   ('&A'(1,1) EQ '(').K2AGPR  SEE IF THE ADDRESS IS IN A   *31280002
                         GPR.                                           31288002
         AIF   (&DSP EQ 0).K2SZDSP  SEE IF THE DISPLACEMENT IS ZERO.    31296002
         LA    0,&DSP+&A  ADDRESS OF SEARCH KEY.                        31304002
         AGO   .KFIN                                                    31312002
.K2SZDSP LA    0,&A      ADDRESS OF SEARCH KEY.                         31320002
         AGO   .KFIN     ALL DONE WITH THE A AND K NOW.                 31328002
.K2AGPR  AIF   (&DSP EQ 0).K2RZDSP  SEE IF THE DISPLACEMENT IS ZERO.    31336002
         LA    0,&DSP&A  ADDRESS OF SEARCH KEY.                         31344002
         AGO   .KFIN                                                    31352002
.K2RZDSP AIF   ('&A' EQ '(0)').KFIN  SEE IF THE ADDRESS IS ALREADY IN  *31360002
                         REGISTER 0.                                    31368002
         LR    0,&A(1)   ADDRESS OF SEARCH KEY.                         31376002
         AGO   .KFIN     ALL DONE GETTING THE ADDRESS OF THE SEARCH KEY*31384002
                         IN REGISTER 0.                                 31392002
.********************************************************************** 31400002
.* IT IS AN (F,L) PAIR, NOW SEE IF THE SECOND ELEMENT IS A VALID L.   * 31408002
.********************************************************************** 31416002
.K2F1    AIF   (T'&K(2) EQ 'N').K2F  SEE IF IT IS A SELF-DEFINING TERM. 31424002
&I       SETA  (K'&K(2))  SET THE INDEX TO IT'S INITIAL VALUE.          31432002
.K2FCHK  AIF   (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).K2LTYPE 31440002
&I       SETA  (&I+1)    EKE THE INDEX TO THE NEXT CHARACTER.           31448002
         AIF   (&I GT 0).K2FCHK  SEE IF THERE ARE MORE TO CHECK.        31456002
         AIF   (K'&K(2) GT 4).K2LERR  SEE IF IT HAS TOO MANY DIGITS.    31464002
.K2F     ANOP                                                           31472002
&IGAKEYL SETA  (&K(2))   GET THE LENGTH OF THE (F,L) PAIR.              31480002
         AIF   (&IGAKEYL GT 256).K1LERR  SEE IF THE LENGTH OF THE FIELD*31488002
                         IS MORE THAN 256.                              31496002
         AIF   (NOT &XFER).KFIN  SEE IF THIS IS THE MOVE GENERATION    *31504002
                         LOOP.                                          31512002
         AIF   (K'&A EQ 0).AISNT  SEE IF A ISN'T.                       31520002
         MNOTE 4,'THE A PARAMETER IS REDUNDANT.'                        31528002
.AISNT   LA    0,&K(1)   ADDRESS OF SEARCH KEY.                         31536002
         AGO   .KFIN     ALL DONE NOW, GO CHECK FOR THE MOVE GENERATION*31544002
                         ITERATION.                                     31552002
.********************************************************************** 31560002
.* THE FOLLOWING ARE THE SUNDRY MNOTES FOR THE TWO ELEMENT CASE FOR   * 31568002
.* THE K PARAMETER.                                                   * 31576002
.********************************************************************** 31584002
.K2DERR  MNOTE 12,'DISPLACEMENT IN K PARAMETER CANNOT EXCEED 4095.'     31592002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         31600002
         AGO   .KFIN                                                    31608002
.K2DTYPE MNOTE 12,'THE DISPLACEMENT IN K MUST BE A SELF-DEFINING TERM.' 31616002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON TO PREVENT THE MVC      *31624002
                         GENERATION.                                    31632002
         AGO   .KFIN                                                    31640002
.K2LTYPE MNOTE 12,'THE LENGTH IN K MUST BE A SELF-DEFINING TERM.'       31648002
&ERROR   SETB  1         SET THE ERROR FLAG ON.                         31656002
         AGO   .KFIN                                                    31664002
.********************************************************************** 31672002
.* THE K PARAMETER CONSISTS OF A LIST OF MIXED PAIRS OF FIELDS AND    * 31680002
.* DISPLACEMENT-LENGTH PAIRS. PICK OUT ALL THESE AND CHECK THEM FOR   * 31688002
.* VALIDITY, WHILE ADDING UP ALL THE LENGTHS OF THE INDIVIDUAL FIELDS * 31696002
.* FOR THE MOVES TO IGAWORK, AND (POSSIBLY) FOR USE IN THE REL        * 31704002
.* PARAMETER LATER.                                                   * 31712002
.********************************************************************** 31720002
.* THIS IS THE SECTION TO PROCESS A MIXED LIST OF FIELD NAMES AND (D  * 31728002
.* ,L) PAIRS. PARSE THE OPERAND USING THE PARSE IN THE RPTDSECT       * 31736002
.* MACRO-INSTRUCTION, AND CHECK THE VARIABLE &IGAOKAY TO SEE IF THERE * 31744002
.* ARE NO SYNTAX ERRORS IN THE K PARAMETER.                           * 31752002
.********************************************************************** 31760002
.KMIXED  ANOP                                                           31768002
      RPTDSECT SCAN=PARSE,LIST=&K  PARSE THE OPERAND.                   31776002
         AIF   (&IGAOKAY).KMXOK  SEE IF THE PARSE DETECTED BAD SYNTAX.  31784002
         MNOTE 12,'INVALID SYNTAX IN THE K PARAMETER.'                  31792002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         31800002
         AGO   .KFIN     CAN'T DO ANYTHING WITH THIS.                   31808002
.********************************************************************** 31816002
.* THE SYNTAX APPEARS TO BE OK, NOW START SCANNING OUT THE ATOMS ONE  * 31824002
.* AT A TIME, ANALYZING EACH ONE INDIVIDUALLY IN CONTEXT WITH THE ONES* 31832002
.* ON EITHER SIDE OF IT.                                              * 31840002
.********************************************************************** 31848002
.KMXOK RPTDSECT SCAN=ISCAN  INITIALIZE FOR SUBSEQUENT SCANNING OF      *31856002
                         ATOMS.                                         31864002
         L     15,(&IGAKEYW+&IGABLST)(,1)   ADDR OF W.A. TO COLLECT THE 31872002
         BALR  14,0      SEARCH KEY OR THE ADDRESS OF A ROUTINE IN THE  31880002
         LTR   0,15      MODULE IGARPT01 TO GET AN AREA TO USE FOR      31888002
&WORKEY  SETB  (1)       ON TO INDICATE THAT THE KEY HAS BEEN COLLECTED*31896002
                         AT IGAWORK.                                    31904002
         BCR   4,15      COLLECTING THE SEARCH KEY.                     31912002
.KMXMOR RPTDSECT SCAN=NEXT  GET THE CURSOR POSITIONED AT THE NEXT ATOM. 31920002
.KMXCHK  AIF   (&IGAX EQ 0).KFIN  SEE IF THERE ARE ANY MORE TO DO.      31928002
         AIF   (&IGALEVL EQ 2).KMXLVL2  SEE IF THIS ATOM IS ON LEVEL 2. 31936002
         AIF   (&IGALEVL LE 1).KMXL01  SEE IF THIS ATOM IS ON LEVEL 0  *31944002
                         OR 1.                                          31952002
.********************************************************************** 31960002
.* THE CURRENT ATOM HAS TOO MANY LEVELS OF PARENTHESES AROUND IT, GIVE* 31968002
.* THE ERROR MESSAGE AND GO LOOK FOR THE NEX THING THAT CHANGES LEVEL * 31976002
.* 1 IN THE PATH VECTOR.                                              * 31984002
.********************************************************************** 31992002
&I       SETA  &IGAPATH(1)+1  SET &I TO THE CURRENT OPERAND NUMBER.     32000002
         MNOTE 12,'TOO MANY () LEVELS IN OPERAND &I OF R.'              32008002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         32016002
.********************************************************************** 32024002
.* AN ERROR HAS BEEN DETECTED AND FLAGGED IN THE CURRENT OPERAND. SCAN* 32032002
.* OVER TO THE NEXT ATOM THAT IS NOT PART OF THE CURRENT ENTRY ON     * 32040002
.* LEVEL 1 IN THE PARAMETER.                                          * 32048002
.********************************************************************** 32056002
.SYNC    ANOP                                                           32064002
&I       SETA  &IGAPATH(1)  SET &I TO THE INDEX OF THE OPERAND ON LEVEL*32072002
                         1.                                             32080002
      RPTDSECT SCAN=NEXT  SET THE CURSOR TO THE NEXT ONE.               32088002
         AIF   (&IGAX EQ 0).KFIN  SEE IF THERE AREN'T ANY MORE.         32096002
         AIF   (&I EQ &IGAPATH(1)).SYNC  SEE IF IT IS STILL ON THE SAME*32104002
                         ONE.                                           32112002
         AGO   .KMXCHK   FINALLY GOT THE NEXT ATOM, NOW GO CHECK IT FOR*32120002
                         VALIDITY.                                      32128002
.********************************************************************** 32136002
.* THE CURRENT ATOM IS ON LEVEL 0 OR 1. THEREFORE IT SHOULD BE A VALID* 32144002
.* FIELD NAME; SEE IF IT IS.                                          * 32152002
.********************************************************************** 32160002
.KMXL01  ANOP                                                           32168002
.KMX01   ANOP                                                           32176002
&I       SETA  (1+&IGAPATH(1))  SET &I TO THE 1-ORIGIN INDEX OF THE    *32184002
                         FIELD NAME ON LEVEL 1.                         32192002
         AIF   ((T'&K(&I) NE 'M')AND(T'&K(&I) NE 'N')AND(T'&K(&I) NE 'O*32200002
               ')AND(T'&K(&I) NE 'T')AND(T'&K(&I) NE 'W')AND(T'&K(&I) N*32208002
               E '$')AND(T'&K(&I) NE 'U')).KMX01OK                      32216002
         MNOTE 12,'OPERAND &I OF K DOES NOT HAVE THE PROPER TYPE ATTRIB*32224002
               UTE.'                                                    32232002
&ERROR   SETB  (1)       SET THE ERROR FLAG.                            32240002
         AGO   .SYNC     GO POSITION THE CURSOR TO THE NEXT ONE.        32248002
.********************************************************************** 32256002
.* THE CURRENT ATOM LOOKS LIKE A VALIID FIELD NAME, GET ITS LENGTH    * 32264002
.* ATTRIBUTE AND SEE IF IT ACCEPTABLE.                                * 32272002
.********************************************************************** 32280002
.KMX01OK ANOP                                                           32288002
&LNG     SETA  (L'&K(&I))  CAPTURE IT AS A NUMBER.                      32296002
         AIF   (&LNG LE 256).KMX0LOK  SEE IF IT EXCEEDS 256.            32304002
         MNOTE 12,'THE LENGTH OF FIELD &I OF K EXCEEDS 256 BYTES.'      32312002
&ERROR   SETB  (1)       SET TEH ERROR FLAG.                            32320002
         AGO   .SYNC     GO LOOK AT THE NEXT ONE.                       32328002
.KMX0LOK ANOP                                                           32336002
.********************************************************************** 32344002
.* NOW SEE IF THIS IS THE MOVE GENERATION ITERATION.                  * 32352002
.********************************************************************** 32360002
         AIF   (NOT &XFER).KX0M  GO IF THIS ISN'T THE MOVE GENERATION  *32368002
                         ITERATION.                                     32376002
         MVC   &IGAKEYL.(&LNG,15),&K(&I)         MOVE SUBKEY.           32384002
.KX0M    ANOP                                                           32392002
&IGAKEYL SETA  (&IGAKEYL+&LNG)  EKE THE CUMMULATIVE RECORD LENGTH.      32400002
         AIF   (&IGAKEYL LE 256).KMXMOR  SEE IF THE KEYL LENGTH IS     *32408002
                         STILL LESS THAN 257.                           32416002
         AIF   (&KLMNOTE).KMXMOR  SEE IF THE MNOTE HAS ALREADY BEEN    *32424002
                         GENERATED.                                     32432002
&KLMNOTE SETB  (1)       SET THE BIT ON SO THE MNOTE ONLY GETS         *32440002
                         GENERATED ONCE.                                32448002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         32456002
         MNOTE 12,'KEY LENGTH EXCEEDS 256 BYTES.'                       32464002
         AGO   .KMXMOR   GO LOKK FOR THE NEXT ONE.                      32472002
.********************************************************************** 32480002
.* THE CURRENT ATOM IS ON LEVEL 2. IT MUST THEREFORE BE THE FIRST     * 32488002
.* ELEMENT IN ONE OF THE CASES (F,L) OR (D,L).                        * 32496002
.* FIND OUT WHETHER THE CURRENT ATOM IS AN F OR A D.                  * 32504002
.********************************************************************** 32512002
.KMXLVL2 ANOP                                                           32520002
&X       SETC  '0'       SET THIS FOR THE CASE WHERE THE DISPLACEMENT  *32528002
                         IS AN EMPTY STRING.                            32536002
         AIF   (&IGAZ EQ 0).KMGDSP  GO IF IT IS AN EMPTY STRING, WHICH *32544002
                         MEANS A DISPLACEMENT OF 0.                     32552002
.********************************************************************** 32560002
.* SEE IF ALL THE CHARACTERS IN THE CURRENT ATOM ARE DIGITS 0 THROUGH * 32568002
.* 9, WHICH WOULD MAKE IT A SELF-DEFINING DECIMAL TERM.               * 32576002
.********************************************************************** 32584002
&I       SETA  0         INITIALIZE THE INDEX OF THE CURRENT CHARACTER *32592002
                         IN THE ATOM.                                   32600002
.KMCONT  AIF   (('&K'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&K'(&IGALEFT(&IG*32608002
               AZ)+&I,1) GT '9')).KMNOTD                                32616002
&I       SETA  (&I+1)    EKE THE INDEX.                                 32624002
         AIF   (&I LT &IGARGHT(&IGAZ)).KMCONT  KEEP GOING UNTIL ALL    *32632002
                         DIGITS HAVE BEEN EXAMINED.                     32640002
         AIF   (&IGARGHT(&IGAZ) GT 4).KMXBADD  SEE IF THE DISPLACEMENT *32648002
                         HAS TOO MANY BYTES IN IT.                      32656002
&X       SETC  '&K'(&IGALEFT(&IGAZ),&I)  GET THE DISPLACEMENT AS A     *32664002
                         NUMBER.                                        32672002
.KMGDSP  ANOP                                                           32680002
&DSP     SETA  (&X)      GET THE NUMBER NOW.                            32688002
         AIF   (&DSP GT 4095).KMXDBAD  SEE IF THE DISPLACEMENT IS TOO  *32696002
                         BIG.                                           32704002
.********************************************************************** 32712002
.* THE CURRENT ATOM IS A VALID DISPLACEMENT OF A (D,L) PAIR, AND ITS  * 32720002
.* ARITHMETIC VALUE IS IN THE APPROPRIATE RANGE OF VALUES FOR A       * 32728002
.* DISPLACEMENT. ITS VALUE HAS BEEN CAPTURED IN &DSP. NOW LOOK FOR THE* 32736002
.* CORRESPONDING L OF THE PAIR.                                       * 32744002
.********************************************************************** 32752002
&I       SETA  (&IGAPATH(1))  SAVE THE CURRENT ATOM LEVEL 1 INDEX.      32760002
      RPTDSECT SCAN=NEXT  POSITION THE CURSOR TO THE NEXT ATOM.         32768002
         AIF   (&IGAX EQ 0).KMXNOLL  SEE IF THERE ISN'T ANY L FOR IT   *32776002
                         BECAUSE THERE AREN'T ANY MORE ATOMS.           32784002
         AIF   (&IGAPATH(1) NE &I).KMXNOL  SEE IF THE NEXT ATOM IS PART*32792002
                         OF A DIFFERENT ELEMENT ON LEVEL 1.             32800002
         AIF   (&IGALEVL NE 2).KMXPRN  SEE IF THERE ARE TOO MANY LEVELS*32808002
                         OF PARENTHESES.                                32816002
         AIF   (&IGAZ EQ 0).KMXLBAD  SEE IF THE L ATOM IS THE EMPTY    *32824002
                         STRING.                                        32832002
.********************************************************************** 32840002
.* THERE IS A NEXT ATOM IN THE SAME PAIR, NOW CHECK IT TO SEE IF IT IS* 32848002
.* A SELF-DEFINING DECIMAL TERM.                                      * 32856002
.********************************************************************** 32864002
&I       SETA  0  INITIALIZE THE INDEX OF THE CURRENT BYTE IN THE ATOM. 32872002
.KMCNT1  AIF   (('&K'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&K'(&IGALEFT(&IG*32880002
               AZ)+&I,1) GT '9')).KMXBADL                               32888002
&I       SETA  (&I+1)    EKE THE INDEX TO THE NEXT BYTE.                32896002
         AIF   (&I LT &IGARGHT(&IGAZ)).KMCNT1  KEEP LOOKING UNTIL ALL  *32904002
                         THE BYTES ARE EXAMINED.                        32912002
         AIF   (&IGARGHT(&IGAZ) GT 4).KMXLERR  SEE IF THE LENGTH IS    *32920002
                         MORE THAN 4 CHARACTERS.                        32928002
&X       SETC  '&K'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))  GET THE LENGTH.   32936002
&LNG     SETA  (&X)      TURN IT INTO A NUMBER.                         32944002
         AIF   (&LNG GT 256).KMXLERR  SEE IF IT IS TOO BIG TO DO WITH  *32952002
                         AN MVC.                                        32960002
.********************************************************************** 32968002
.* THE DISPLACEMENT OF THE DISPLACEMENT-LENGTH PAIR IS AT &DSP, AND   * 32976002
.* THE LENGTH IS AT &LNG. CHECK THE A PARAMETER TO SEE IF IT IS CODED,* 32984002
.* BECAUSE IF IT ISN'T CODED THERE IS NO WAY TO FIND OUT WHERE THE    * 32992002
.* RECORD REALLY IS.                                                  * 33000002
.********************************************************************** 33008002
         AIF   (K'&A EQ 0).KMXAMT  SEE IF IT ISN'T THERE.               33016002
.* NOW GENERATE THE MOVE OF THE FIELD IF THIS IS THE MOVE GENERATION  * 33024002
.* ITERATION.                                                         * 33032002
         AIF   (NOT &XFER).KMOVED  SEE IF IT ISN'T THE MOVE GENERATION *33040002
                         ITERATION.                                     33048002
&X       SETC  ''        SET IT UP FOR THE ADDRESS IN A REGISTER.       33056002
         AIF   ('&A'(1,1) EQ '(').KMAGPR  GO IF THE ADDRESS IS IN A    *33064002
                         REGISTER.                                      33072002
&X       SETC  '+'       SET IT UP FOR THE CASE EHERE THE ADDRESS IS   *33080002
                         SUPPLIED IN THE FORM OF A LABEL.               33088002
.KMAGPR  MVC   &IGAKEYL.(&LNG,15),&DSP&X&A            MOVE SUBKEY.      33096002
.KMOVED  ANOP                                                           33104002
&IGAKEYL SETA  (&IGAKEYL+&LNG)  EKE THE CUMMULATIVE RECORD LENGTH.      33112002
         AIF   (&IGAKEYL LE 256).STILLOK  SEE IF THE CUMMULATIVE KEY   *33120002
                         LENGTH HAS GONE OVER 256 BYTES.                33128002
         AIF   (&KLMNOTE).STILLOK  SEE IF THE MNOTE HAS ALREADY BEEN   *33136002
                         GENERATED.                                     33144002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         33152002
&KLMNOTE SETB  (1)   SET IT ON SO THE MNOTE HAS ALREADY BEEN GENERATED. 33160002
         MNOTE 12,'KEY LENGTH IS TOO BIG   256 BYTES IS MAX.'           33168002
.STILLOK ANOP                                                           33176002
.********************************************************************** 33184002
.* NOW SET THE CURSOR TO THE NEXT ATOM, AND SEE IF THE FIRST ELEMENT  * 33192002
.* IS PART OF THE SAME ELEMENT ON LEVEL 1 AS THE LAST (D,L) PAIR.     * 33200002
.********************************************************************** 33208002
&I       SETA  &IGAPATH(1)  PRESERVE THE CURRENT LEVEL 0 INDEX.         33216002
      RPTDSECT SCAN=NEXT  POSITION THE CURSOR TO THE NEXT ATOM.         33224002
         AIF   (&IGAX EQ 0).KFIN  GO IF THERE ISN'T ANY NEXT ATOM.      33232002
         AIF   (&I EQ &IGAPATH(1)).KMXSAME  SEE IF THE LEVEL 1 ELEMENT *33240002
                         IN THE PATH VECTOR DIDN'T CHANGE.              33248002
         AGO   .KMXCHK   GO CHECK THE NEXT ATOM, IT ISN'T PART OF THE  *33256002
                         LAST TWO.                                      33264002
.********************************************************************** 33272002
.* THE FOLLOWING ARE SUNDRY MNOTES FROM THE PROCESSING OF A LIST OF   * 33280002
.* MIXED PAIRS WHERE THE PAIRS ARE OF THE FORM (D,L).                 * 33288002
.********************************************************************** 33296002
.KMXSAME ANOP                                                           33304002
&I       SETA  (&IGAPATH(1)+1)  SET &I TO THE CURRENT OPERAND #.        33312002
         MNOTE 12,'TOO MANY ELEMENTS IN SUBLIST OPERAND &I IN R.'       33320002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         33328002
         AGO   .SYNC     GO LOOK FOR THE NEXT ONE.                      33336002
.KMXAMT  ANOP                                                           33344002
&I       SETA  (1+&IGAPATH(1))  GET THE CURRENT OPERAND NUMBER.         33352002
         MNOTE 12,'THE A PARAMETER MUST BE CODED TO USE A (D,L) PAIR FO*33360002
               R K(&I).'                                                33368002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         33376002
         AGO   .SYNC     GO LOOK FOR THE NEXT ONE.                      33384002
.KMXLERR ANOP                                                           33392002
&I       SETA  (&IGAPATH(1)+1)  GET THE CURRENT OPERAND NUMBER.         33400002
         MNOTE 12,'THE LENGTH OF THE FIELD DEFINED BY K(&I) EXCEEDS 256*33408002
                BYTES.'                                                 33416002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         33424002
         AGO   .SYNC     GO LOOK AT THE NEXT ONE.                       33432002
.KMXBADL ANOP                                                           33440002
&I       SETA  (1+&IGAPATH(1))                                          33448002
         MNOTE 12,'THE LENGTH FOR K(&I) MUST BE A SELF-DEFINING DECIMAL*33456002
                NUMBER.'                                                33464002
&ERROR   SETB  (1)                                                      33472002
         AGO   .SYNC                                                    33480002
.KMXLBAD ANOP                                                           33488002
&I       SETA  (1+&IGAPATH(1))                                          33496002
         MNOTE 12,'THE LENGTH FOR K(&I) CANNOT BE THE EMPTY STRING.'    33504002
&ERROR   SETB  (1)                                                      33512002
         AGO   .SYNC                                                    33520002
.KMXNOL  ANOP                                                           33528002
&I       SETA  (1+&IGAPATH(1))                                          33536002
         MNOTE 12,'LENGTH OF (D,L) PAIR MISSING IN K(&I).'              33544002
&ERROR   SETB  (1)                                                      33552002
         AGO   .KMXCHK   GO CHECK THE CURRENT ATOM FOR VALIDITY.        33560002
.KMXNOLL ANOP                                                           33568002
         MNOTE 12,'LENGTH OF LAST (D,L) PAIR IN K IS MISSING.'          33576002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         33584002
         AGO   .KFIN                                                    33592002
.KMXPRN  ANOP                                                           33600002
&I       SETA  (&IGAPATH(1)+1)                                          33608002
         MNOTE 12,'TOO MANY () LEVELS IN K(&I).'                        33616002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         33624002
         AGO   .SYNC                                                    33632002
.KMXBADD ANOP                                                           33640002
&I       SETA  (1+&IGAPATH(1))                                          33648002
         MNOTE 12,'DISPLACEMENT IN K(&I) EXCEEDS 4 DIGITS.'             33656002
&ERROR   SETB  (1)                                                      33664002
         AGO   .SYNC                                                    33672002
.KMXDBAD ANOP                                                           33680002
&I       SETA  (1+&IGAPATH(1))                                          33688002
         MNOTE 12,'DISPLACEMENT IN K(&I) EXCEEDS 4095.'                 33696002
&ERROR   SETB  (1)                                                      33704002
         AGO   .SYNC                                                    33712002
.********************************************************************** 33720002
.* THE CURRENT ATOM IS AN F OF A (F,L) PAIR.                          * 33728002
.********************************************************************** 33736002
.KMNOTD  AIF   (&IGARGHT(&IGAZ) LE 8).KMXBIGF  SEE IF THE STRING IS    *33744002
                         BIGGER THAN 8 CHARACTERS.                      33752002
&I       SETA  (1+&IGAPATH(1))                                          33760002
         MNOTE 12,'FIELD NAME IN K(&I) IS BIGGER THAN 8 CHARACTERS.'    33768002
&ERROR   SETB  (1)                                                      33776002
         AGO   .SYNC                                                    33784002
.KMXBIGF ANOP                                                           33792002
&FIELD   SETC  '&K'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))  GET THE FIELD    *33800002
                         NAME.                                          33808002
.* NOW TRY TO GET THE L OF THE (F,L) PAIR.                            * 33816002
&I       SETA  (&IGAPATH(1))  PRESERVE THE CURRENT LEVEL 1 INDEX.       33824002
      RPTDSECT SCAN=NEXT  POSITION THE CURSOR TO THE NEXT ATOM.         33832002
         AIF   (&IGAX EQ 0).KFLNOL  SEE IF THERE IS NO LENGTH BECAUSE  *33840002
                         THERE ISN'T ANY NEXT ATOM.                     33848002
         AIF   (&IGAPATH(1) NE &I).KFNOL  SEE IF THE NEXT ATOM IS NOT  *33856002
                         PART OF THE SAME PAIR.                         33864002
         AIF   (&IGALEVL NE 2).KFNOLL  SEE IF THE NEXT ATOM HAS TOO    *33872002
                         MANY () LEVELS.                                33880002
         AIF   (&IGAZ EQ 0).KFLMT  SEE IF THE LENGTH ATOM IS THE EMPTY *33888002
                         STRING.                                        33896002
.********************************************************************** 33904002
.* THE CURRENT ATOM IS INDEED THE SECOND ELEMENT OF A (F,X) PAIR. NOW * 33912002
.* LET'S SEE IF X IS A VALID L.                                       * 33920002
.********************************************************************** 33928002
         AIF   (&IGARGHT(&IGAZ) GT 3).KFLLBAD  SEE IF THE LENGTH ATOM  *33936002
                         IS MORE THAN 3 DIGITS.                         33944002
&I       SETA  0         INITIALIZE THE INDEX OF THE CURRENT BYTE.      33952002
.KMXCNT2 AIF   (('&K'(&IGALEFT(&IGAZ)+&I,1) LT '0')OR('&K'(&IGALEFT(&IG*33960002
               AZ)+&I,1) GT '9')).KFLBAD                                33968002
&I       SETA  (&I+1)    STEP OVER TO THE NEXT DIGIT.                   33976002
         AIF   (&I LT &IGARGHT(&IGAZ)).KMXCNT2  KEEP GOING UNTIL ALL   *33984002
                         THE DIGITS HAVE BEEN SCANNED.                  33992002
&X       SETC  '&K'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))  EXTRACT THE      *34000002
                         LENGTH.                                        34008002
&LNG     SETA  (&X)      CONVERT IT TO A NUMBER.                        34016002
         AIF   (&LNG GT 256).KFBADL  SEE IF THE LENGTH EXCEEDS 256     *34024002
                         BYTES.                                         34032002
.********************************************************************** 34040002
.* IT LOOKS LIKE A VALID (F,L) PAIR; GENERATE THE MOVE IF THIS IS THE * 34048002
.* MOVE GENERATION ITERATION.                                         * 34056002
.********************************************************************** 34064002
         AIF   (NOT &XFER).KMOVED  GO IF IT IS NOT THE MOVE ITERATION.  34072002
         MVC   &IGAKEYL.(&LNG,15),&FIELD         MOVE SUBKEY.           34080002
         AGO   .KMOVED   MERGE WITH THE COMMON PATH.                    34088002
.********************************************************************** 34096002
.* THE FOLLOWING ARE SUNDRY MNOTES FOR THE (F,L) CASE IN A MIXED LIST.* 34104002
.********************************************************************** 34112002
.KFBADL  ANOP                                                           34120002
&I       SETA  (&IGAPATH(1)+1)                                          34128002
         MNOTE 12,'LENGTH IN OPERAND &I OF K EXCEEDS 256 BYTES.'        34136002
&ERROR   SETB  (1)                                                      34144002
         AGO   .SYNC                                                    34152002
.KFLBAD  ANOP                                                           34160002
&I       SETA  (1+&IGAPATH(1))                                          34168002
         MNOTE 12,'THE LENGTH IN OPERAND K(&I) IS NOT A SELF-DEFINING D*34176002
               ECIMAL NUMBER.'                                          34184002
&ERROR   SETB  (1)                                                      34192002
         AGO   .SYNC                                                    34200002
.KFLLBAD ANOP                                                           34208002
&I       SETA  (1+&IGAPATH(1))                                          34216002
         MNOTE 12,'LENGTH IN OPERAND K(&I) IS MORE THAN 3 DIGITS.'      34224002
&ERROR   SETB  (1)                                                      34232002
         AGO   .SYNC                                                    34240002
.KFLMT   ANOP                                                           34248002
&I       SETA  (1+&IGAPATH(1))                                          34256002
         MNOTE 12,'LENGTH IN OPERAND &I OF K CANNOT BE THE EMPTY STRING*34264002
               .'                                                       34272002
&ERROR   SETB  (1)                                                      34280002
         AGO   .SYNC                                                    34288002
.KFNOL   ANOP                                                           34296002
         MNOTE 12,'LENGTH OF (F,L) PAIR IN OPERAND &I OF K IS MISSING.' 34304002
&ERROR   SETB  (1)                                                      34312002
         AGO   .KMXCHK                                                  34320002
.KFNOLL  ANOP                                                           34328002
&I       SETA  (1+&IGAPATH(1))                                          34336002
         MNOTE 12,'TOO MANY () LEVELS IN K(&I).'                        34344002
         AGO   .SYNC                                                    34352002
.KFLNOL  MNOTE 12,'LENGTH OF LAST (FIELD,LENGTH) PAIR IN K IS MISSING.' 34360002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON TO PREVENT THE MOVES.    34368002
         AGO   .KFIN                                                    34376002
.********************************************************************** 34384002
.KFIN    ANOP                                                           34392002
         AGO   .LINK     GO LINK TO THE SRCH8 SUBROUTINE.               34400002
.********************************************************************** 34408002
.* THERE IS NO NEED TO COLLECT THE SEARCH KEY AT IGAWORK, BECAUSE THE * 34416002
.* THE K PARAMETER IS NOT CODED, AND THERE IS ONLY ONE FIELD.         * 34424002
.********************************************************************** 34432002
.CHKA    AIF   (K'&A EQ 0).ASARG  SEE IF THE ADDRESS IS OMITTED; IF IT *34440002
                         IS GET IT OUT OF THE SEARCH ARGUMENT.          34448002
         AIF   ('&A'(1,1) EQ '(').AGPR  SEE IF THE ADDRESS IS IN A GPR. 34456002
         LA    0,&A  ADDRESS OF SEARCH KEY.                             34464002
         AGO   .CHKAEND  GO TO THE END OF CHECKING THE A PARAMETER.     34472002
.AGPR    AIF   ('&A' EQ '(0)').CHKAEND  SEE IF IT IS ALREADY IN R0.     34480002
         LR    0,&A(1)   ADDRESS OF SEARCH KEY.                         34488002
         AGO   .CHKAEND  ALL DONE NOW EXIT FROM CHECKING THE A         *34496002
                         PARAMETER.                                     34504002
.ASARG   ANOP                                                           34512002
.CHKAEND ANOP                                                           34520002
.********************************************************************** 34528002
.* THE ADDRESS OF THE SEARCH KEY IS IN REGISTER 0, NOW LINK TO THE    * 34536002
.* SEARCH SUBROUTINE IN IGARPT01 FOR TYPE 8 RADIX PARTITION TREES.    * 34544002
.********************************************************************** 34552002
.LINK    ANOP                                                           34560002
         L     15,(&IGABLST+&IGASRCH)(,1)  ADDRESS OF SEARCH ROUTINE.   34568002
         BALR  14,15     LINK TO THE APPROPRIATE SEARCH ROUTINE.        34576002
.********************************************************************** 34584002
.* CHECK THE REL PARAMETER FOR ANY ADDITIONAL ACTIONS THAT MUST BE DONE 34592002
.********************************************************************** 34600002
         AIF   (K'&REL EQ 0).FIN0  SEE IF THE REL PARAMETER IS CODED.   34608002
         MNOTE 12,'NONCE ERROR, REL NOT YET AVAILABLE.'                 34616002
         AGO   .FIN0     SKIP THE REST.                                 34624002
.********************************************************************** 34632002
.*   CHECK THE REL PARAMETER FOR A PARTIAL ORDER VALUE SEARCH.        * 34640002
.********************************************************************** 34648002
.ITSAPOV ANOP                                                           34656002
         AIF   (('&REL(1)' EQ 'POV')AND('&REL(2)' EQ 'GE')).POVSRCH     34664002
         AIF   (('&REL(1)' EQ 'MAX')AND('&REL(2)' EQ 'POV')).MAXPOV     34672002
.BADREL  MNOTE 12,'INVALID REL PARAMETER.'                              34680002
         AGO   .FIN0  GO TO THE END OF THE SRCH MACRO.                  34688002
.MAXPOV  AIF   (K'&NULL EQ 0).LOADMAX  SEE IF THE NULL IS CODED.        34696002
         TM    &IGAEOPV.(1),B'1001'  SEE IF THE TREE IS EMPTY.          34704002
         AIF   ('&NULL'(1,1) EQ '(').MXPVGPR                            34712002
         BC    8,&NULL  BRANCH IF THE TREE IS EMPTY.                    34720002
         AGO   .LOADMAX                                                 34728002
.MXPVGPR BCR   8,&NULL(1)  BRANCH IF THE RPT IS EMPTY.                  34736002
.LOADMAX L     0,&IGAMAX.(,1)   LOAD THE MAXIMUM PARTIAL ORDER VALUE.   34744002
         L     15,(&IGABLST+&IGAPVS)(,1)  ADDRESS OF POV SEARCH.        34752002
         BALR  14,15     SET CURSOR TO SINK WITH MAX POV.               34760002
         AGO   .FIN0  GO TO THE END OF THE SEARCH.                      34768002
.********************************************************************** 34776002
.* SEARCH FOR A PARTIAL ORDER VALUE THAT IS GREATER THAN OR EQUAL TO  * 34784002
.* THE SEARCH ARGUMENT, BUT AS SMALL A VALUE AS CAN EFFICIENTLY BE    * 34792002
.* FOUND.                                                             * 34800002
.********************************************************************** 34808002
.POVSRCH AIF   ((K'&A EQ 0)AND(K'&K NE 0)).PVS01                        34816002
         AIF   ((K'&A NE 0)AND(K'&K EQ 0)).PVS10                        34824002
         AIF   ((K'&A EQ 0)AND(K'&K EQ 0)).PVS00                        34832002
         AIF   ('&A'(1,1) EQ '(').PVS11R                                34840002
         L     0,&A(1)+&K(1)  LOAD PARTIAL ORDER SEARCH KEY.            34848002
.PVS11RR L     15,(&IGABLST+&IGAPVS)(,1)  ADDRESS OF POV SEARCH.        34856002
         BALR  14,15     LINK TO POV SEARCH ROUTINE.                    34864002
.PVSTEST AIF   (K'&NULL EQ 0).PVNNULL  SEE IF THE NULL IS CODED.        34872002
&TMP     SETC  ''  SET IT TO THE EMPTY VECTOR.                          34880002
         AIF   ('&NULL'(1,1) NE '(').PVSNGPR  AGO IF NULL NOT A GPR.    34888002
&TMP     SETC  'R'  SET IT TO GENERATE A BCR.                           34896002
.PVSNGPR TM    &IGAEOPV.(1),B'1001'  SEE IF THE TREE IS EMPTY.          34904002
         BC&TMP 8,&NULL(1)  BRANCH IF IT IS EMPTY.                      34912002
.PVNNULL AIF   ((K'&Y EQ 0)AND(K'&N EQ 0)).FIN0  SEE IF EITHER Y OR N.  34920002
         LTR   15,15  TEST THE RETURN CODE.                             34928002
         AIF   (K'&Y EQ 0).PVNOY  SEE IF THE Y PARAMETER NOT CODED.     34936002
&TMP     SETC  ''  SET IT UP TO GENERATE A BC.                          34944002
         AIF   ('&Y'(1,1) NE '(').PVYBC  GO IF A BC IS GENERATED.       34952002
&TMP     SETC  'R'  SET IT UP TO GENERATE A BCR.                        34960002
.PVYBC   BC&TMP 10,&Y(1)  BRANCH IF THE SEARCH FOUND ONE.               34968002
.PVNOY   AIF   (K'&N EQ 0).FIN0  GO IF N IS NOT CODED.                  34976002
&TMP     SETC  ''                                                       34984002
         AIF   ('&N'(1,1) NE '(').PVNBC  GO IF IT'S NOT IN A GPR.       34992002
&TMP     SETC  'R'  GET SET TO GENERATE A BCR.                          35000002
.PVNBC   AIF   (K'&Y NE 0).PVNBCC  GO IF THE LTR IS ALREADY THERE.      35008002
         LTR   15,15  TEST THE RETURN CODE.                             35016002
.PVNBCC  BC&TMP 4,&N(1)  BRANCH IF THERE IS NO QUALIFYING VALUE.        35024002
         AGO   .FIN0  THE SRCH MACRO IS FINISHED.                       35032002
.PVS11R  L     0,&K(1)(,&A(1))  LOAD THE PARTIAL ORDER SEARCH KEY.      35040002
         AGO   .PVS11RR  GO DO THE SEARCH.                              35048002
.PVS00   MNOTE 12,'PARTIAL ORDER SEARCH KEY NOT SPECIFIED.'             35056002
         AGO   .FIN0  FORGET, CAN'T DO ANYTHING.                        35064002
.PVS10   AIF   ('&A' EQ '((0))').PVS11RR SEE IF IT'S ALREADY LOADED.    35072002
&TMP     SETC  ''                                                       35080002
         AIF   ('&A'(1,1) NE '(').PVS10M                                35088002
&TMP     SETC  'R'                                                      35096002
.PVS10M  L&TMP 0,&A(1)  LOAD THE PARTIAL ORDER SEARCH KEY.              35104002
         AGO   .PVS11RR  GO DO THE SEARCH.                              35112002
.PVS01   ANOP                                                           35120002
&TMP     SETC  'R'  PREPARE TO GENEATE A LOAD REGISTER INSTRUCTION.     35128002
         AIF   ('&K(1)'(1,1) EQ '(').PVS01R                             35136002
&TMP     SETC  ''                                                       35144002
.PVS01R  L&TMP 0,&K(1)  LOAD THE PARTIAL ORDER SEARCH KEY.              35152002
         AGO   .PVS11RR  GO DO THE SEARCH.                              35160002
.********************************************************************** 35168002
.* PARTIAL ORDER VALUE SEARCH. IF A SEARCH KEY IS SPECIFIED SET THE   * 35176002
.* CURSOR USING THE SEARCH KEY. IN ORDER FOR THE SEARCH TO BE         * 35184002
.* SUCCESSFUL THERE MUST BE AN EXACT MATCH BETWEEN THE SEARCH KEY AND * 35192002
.* ONE ALREADY IN THE TREE.                                           * 35200002
.********************************************************************** 35208002
.POVGET  ANOP                                                           35216002
         AIF   ((K'&A EQ 0)AND(K'&K EQ 0)).GETPOV                       35224002
         SRCH  (1),A=&A,K=&K,T=&IGARPT#  SET THE CURSOR.                35232002
.GETPOV  L     15,(&IGABLST+&IGAGPV)(,1)  ADDRESS OF GET POV.           35240002
         BALR  14,15     LINK TO GET POV FOR CURRENT SINK.              35248002
         AGO   .PVSTEST   GO TEST FOR EXITING BRANCHES, ETC..           35256002
.*--------------------------------------------------------------------* 35264002
.FIN0    ANOP                                                           35272002
         AIF   (NOT(&FIN)).SRCH8ZZ  SEE IF THE FIN&SYSNDX EQU * SHOULD *35280002
                         BE GENERATED.                                  35288002
FIN&SYSNDX EQU *                                                        35296002
.SRCH8ZZ ANOP                                                           35304002
         AIF   (NOT &USING).FIN  SEE IF A USING FOR R1 HAS BEEN        *35312002
                         GENERATED; IF SO GENERATE THE CORRESPONDING   *35320002
                         DROP.                                          35328002
         AGO   .FIN      SKIP AROUND SRCH5.                             35336002
.********************************************************************** 35344002
.*   R E A D     O N L Y     S E A R C H  ------- S R C H 5.          * 35352002
.********************************************************************** 35360002
.*       FOR SRCH5:                                                   * 35368002
.* 0. ABSOLUTE 3-BYTE EDGE FIELDS WITH SUCCESSOR PAIRING.             * 35376002
.* 1. BIT 0 OF EACH WORD IS A ZERO FOR SINK WORDS AND A ONE FOR INNER * 35384002
.*    VERTICES.                                                       * 35392002
.* 2. BITS 1-7 OF EACH INNER VERTEX ARE THE BIT INDEX, THUS ALLOWING  * 35400002
.*    A MAXIMUM KEY OF 16 BYTES.                                      * 35408002
.* 3. NO SCAN FUNCTIONS ARE AVAILABLE WITH SRCH5.                     * 35416002
.* 4. SRCH5 IS READ-ONLY, IN THE SENSE THAT IT DOES NOT STORE INTO    * 35424002
.*    ANY MEMORY LOCATIONS, BUT USES REGISTERS 0, 1, 2, 3, 14, AND 15 * 35432002
.*    AS WORKING REGISTERS.                                           * 35440002
.*    SRCH5 CHECKS A USE COUNT AFTER TERMINATION TO SEE IF AN INSERT  * 35448002
.*    OR DELETE CHANGE THE TREE DURING THE TIME THE SEARCH WAS IN     * 35456002
.*    PROGRESS. THIS IS TO ALLOW THE VALIDITY OF SEARCHES PROCEEDING  * 35464002
.*    WHILE AN INSERT OR DELETE IS IN PROGRESS IN AN MP SITUATION.    * 35472002
.*--------------------------------------------------------------------* 35480002
.SRCH5   ANOP                                                           35488002
&GOLEFT  SETC  'LOOP'.'&SYSNDX'     GENERATE THE LABELS FOR THE         35496002
&ITSMOP  SETC  'MOP'.'&SYSNDX'   READ-ONLY SEARCH LOOP.                 35504002
&ITSEOP  SETC  'EOP'.'&SYSNDX'   XX                                     35512002
&TOOBAD  SETC  'MORE'.'&SYSNDX'                                         35520002
&O       SETC  '0'   JUST A ZERO DISPLACEMENT.                          35528002
&EKE     SETC  '4'   DISPLACEMENT TO THE USE COUNTER.                   35536002
&FOUR    SETC  '4'    A CONSTANT DISPLACEMENT 4.                        35544002
&ARG     SETC  '0'  REGISTER TO HOLD THE SEARCH ARGUMENT.               35552002
&TREEHDR SETC  '1'  USE REGISTER 1 FOR THE TREEHDR ADDRESS.             35560002
&P       SETC  '2'   USE REGISTER 2 FOR THE PREDECESSOR.                35568002
&C       SETC  '3'   USE REGISTER 3 FOR THE PENULTIMATE VERTEX.         35576002
&EKER    SETC  '14'  REGISTER TO HOLD THE COUNTER DURING THE            35584002
.*                   READ-ONLY SEARCH.                                  35592002
&S       SETC  '15'     USE REGISTER 15 TO HOLD THE SINK WORD.          35600002
&USING   SETB  (1)       SET THE BIT ON TO INDICATE THAT A USING HAS   *35608002
                         BEEN GENERATED FOR R1.                         35616002
.********************************************************************** 35624002
.* THE FOLLOWING TABLE SHOWS THE VARIOUS COMBINATIONS AND             * 35632002
.* INTERPRETATIONS OF THE OPERANDS FOR SRCH WITH TYPE 5 TREES:        * 35640002
.********************************************************************** 35648002
.* A:    A=LABEL OR A=(GPR) MAY BE CODED.                             * 35656002
.* K:    K=, K=FIELDNAME, K=(FIELDNAME,LENGTH), OR K=(D,L) MAY BE     * 35664002
.*       CODED. IF "K=FIELDNAME" OR "K=(FIELDNAME,LENGTH)" IS CODED,  * 35672002
.*       THEN THE A PARAMETER DOES NOT HAVE TO BE CODED. IF A IS ALSO * 35680002
.*       CODED AN MNOTE WILL BE GENERATED.                            * 35688002
.*       THE MAXIMUM SIZE KEY THAT CAN BE ACCOMODATED FOR TYPE 5 TREES* 35696002
.*       IS 16 BYTES. THERE CAN ONLY BE ONE (D,L) PAIR FOR TYPE 5     * 35704002
.*       TREES, UNLIKE TYPE 8 TREES, WHERE THERE CAN BE AN ARBITRARY  * 35712002
.*       NUMBER.                                                      * 35720002
.*--------------------------------------------------------------------* 35728002
.* CHECK FOR THE VARIOUS ALLOWABLE COMBINATIONS OF THE KEYL AND SARG. * 35736002
.*--------------------------------------------------------------------* 35744002
.********************************************************************** 35752002
.* THE FOLLOWING ARE THE ONLY WAYS TO CODE THE A AND K PARAMETERS FOR * 35760002
.* TYPE 5 RADIX PARTITION TREES:                                      * 35768002
.* F MEANS A FIELD NAME WITH A LENGTH ATTRIBUTE.                      * 35776002
.* L MEANS A LENGTH, WHICH MUST BE A SELF-DEFINING TERM.              * 35784002
.* D MEANS A DISPLACEMENT, WHICH MUST EITHER BE THE EMPTY STRING OR A * 35792002
.*   SELF-DEFINING TERM.                                              * 35800002
.* GPR IS A GENERAL REGISTER NAME OR NUMBER.                          * 35808002
.* X MEANS ANY STRING OF CHARACTERS.                                  * 35816002
.*                                                                    * 35824002
.* COMBINATION:          MEANING:                                     * 35832002
.* ------------          --------                                     * 35840002
.* A=F,K=                F IS A LABEL, AND THE LENGTH OF THE KEY IS   * 35848002
.*                       THE SAME AS THE LENGTH OF F.                 * 35856002
.* A=F,K=L               F IS THE SEARCH KEY, AND L IS THE SEARCH KEY * 35864002
.*                       LENGTH (IT MUST BE A SELF-DEFINING TERM).    * 35872002
.* A=F,K=(,L)            SAME AS ABOVE.                               * 35880002
.* A=F,K=(D,L)           THE SEARCH KEY IS AT DISPLACEMENT D FROM THE * 35888002
.*                       BEGINNING OF THE FIELD F, AND IS L BYTES LONG. 35896002
.* A=(GPR),K=L           THE ADDRESS OF THE FIRST BYTE OF THE SEARCH  * 35904002
.*                       KEY IS IN THE INDICATED REGISTER, AND THE KEY* 35912002
.*                       IS L BYTES LONG.                             * 35920002
.* A=(GPR),K=(,L)        SAME AS ABOVE.                               * 35928002
.* A=(GPR),K=(D,L)       THE ADDRESS OF THE KEY IS FORMED BY ADDING   * 35936002
.*                       THE ADDRESS IN THE INDICATED REGISTER TO THE * 35944002
.*                       DISPLACEMENT D, AND THE KEY IS L BYTES LONG. * 35952002
.* A=,K=F                F IS THE SEARCH KEY, AND ITS LENGTH IS THE   * 35960002
.*                       SAME AS THE LENGTH OF F.                     * 35968002
.* A=,K=(F,L)            F IS THE SEARCH KEY, AND L IS ITS LENGTH.    * 35976002
.********************************************************************** 35984002
.*--------------------------------------------------------------------* 35992002
.********************************************************************** 36000002
.* IN THE FOLLOWING, THE SEARCH IS DONE FOR KEYS WITH 4 BYTES OR LESS.* 36008002
.* THE KEY IS PLACED IN REGISTER 0 JUST BEFORE THE MAIN SEARCH LOOP.  * 36016002
.* THE KEY IS RIGHT ALIGNED IN REGISTER ZERO, WITH ZEROS FILLED IN ON * 36024002
.* THE LEFT.                                                          * 36032002
.********************************************************************** 36040002
         AIF   (&ERROR).FIN5  SEE IF ANY ERRORS HAVE BEEN DISCOVERED   *36048002
                         PRIOR TO THIS PART.                            36056002
         AIF   ((K'&A EQ 0)AND(K'&K EQ 0)).FIN5  SEE IF NEITHER A NOR K*36064002
                         IS CODED.                                      36072002
         AIF   (K'&K NE 0).S5KNOTZ  SEE IF K IS CODED.                  36080002
.********************************************************************** 36088002
.* ONLY THE A PARAMETER IS CODED, SO IT MUST BE A FIELD NAME WITH A   * 36096002
.* LENGTH ATTRIBUTE IN ORDER TO BE VALID.                             * 36104002
.********************************************************************** 36112002
         AIF   (K'&A LE 4).NOTPP  SEE IF THE A PARAMETER IS CODED AS   *36120002
                         "A=((GPR))". IF IT IS, THEN THE SEARCH KEY IS *36128002
                         ALREADY LOADED INTO THE INDICATED REGISTER.    36136002
         AIF   ('&A'(1,2) NE '((').NOTPP  IF IT IS IN A REGISTER, THEN *36144002
                         IT MUST BE RIGHT ALIGNED, WITH THE LEFT FILL  *36152002
                         BITS BEING ZERO.                               36160002
         AIF   ('&A' EQ '((0))').SRCH5Z  SEE IF IT IS EVEN ALREADY IN  *36168002
                         REGISTER 0.                                    36176002
         LR    0,&A(1)   SEARCH KEY.                                    36184002
         AGO   .SRCH5Z   GOT THE SEARCH KEY IN REGISTER 0, NOW GO      *36192002
                         GENERATE THE SEARCH.                           36200002
.NOTPP   ANOP                                                           36208002
         AIF   ('&A'(1,1) EQ '(').AGRNOK  SEE IF THE A PARAMETER IS    *36216002
                         INCORRECTLY SPECIFIED IN A REGISTER.           36224002
         AIF   ((T'&A EQ 'M')OR(T'&A EQ 'N')OR(T'&A EQ 'O')OR (T'&A EQ *36232002
               'T')OR(T'&A EQ 'W')OR(T'&A EQ '$')OR(T'&A EQ 'U')).ANOTF*36240002
                         SEE IF A IS NOT A FIELD NAME.                  36248002
&IGAKEYL SETA  (L'&A)    GET THE SEARCH KEY LENGTH.                     36256002
         AIF   (K'&A GT 8).ATOOBIG SEE IF THE FIELD NAME IS BIGGER     *36264002
                         THAN 8 CHARACTERS.                             36272002
&FIELD   SETC  '&A'      GET THE FIELD NAME.                            36280002
.S5LCHK  AIF   (&IGAKEYL GT 4).AFLGT4  SEE IF THE KEY LENGTH IS MORE   *36288002
                         THAN FOUR BYTES.                               36296002
         AIF   (&IGAKEYL GE 3).AFL34  SEE IF THE KEY LENGTH IS BIGGER  *36304002
                         THAN TWO BYTES.                                36312002
         AIF   (&IGAKEYL EQ 2).AFL2  SEE IF THE KEY LENGTH IS EXACTLY  *36320002
                         TWO BYTES.                                     36328002
         AIF   (&IGAKEYL NE 1).NULLKEY  SEE IF THE KEY LENGTH IS ZERO.  36336002
.AFL1    SLR   0,0       THE SEARCH KEY                                 36344002
         IC    0,&FIELD  IS ONE BYTE LONG.                              36352002
         AGO   .SRCH5Z   NOW GO GENERATE THE SRCH5 IN LINE.             36360002
.AFL2    LH    0,&FIELD  SEARCH KEY IS                                  36368002
         N     0,=XL4'0000FFFF'  TWO BYTES LONG.                        36376002
         AGO   .SRCH5Z   NOW GO GENERATE THE SEARCH IN LINE.            36384002
.AFL3    L     00,&FIELD  3-BYTE SEARCH KEY.                            36392002
         SRL   0,8  GET IT RIGHT ALIGNED.                               36400002
         AGO   .SRCH5Z   GO GENERATE THE SEARCH LOOP.                   36408002
.AFL34   AIF   (&IGAKEYL EQ 3).AFL3  SEE IF THE SEARCH KEY LENGTH IS   *36416002
                         EXACTLY THREE BYTES.                           36424002
         L     0,&FIELD  4-BYTE SEARCH KEY.                             36432002
         AGO   .SRCH5Z   GO FINISH UP NOW.                              36440002
.AFLGT4  AGO   .S5NONCE  CAN'T HAVE TYPE 5 KEYS BIGGER THAN 5 YET.      36448002
.********************************************************************** 36456002
.* THE K PARAMETER IS CODED, SEE IF THE A PARAMETER IS CODED TOO.     * 36464002
.********************************************************************** 36472002
.S5KNOTZ ANOP                                                           36480002
         AIF   (K'&A NE 0).S5BOTH  SEE IF BOTH THE A AND K PARAMETERS  *36488002
                         ARE CODED.                                     36496002
.********************************************************************** 36504002
.* ONLY THE K PARAMETER IS CODED. IT MUST BE ONE OF THE CASES K=F OR  * 36512002
.* K=(F,L). ANYTHING ELSE MUST BE WRONG.                              * 36520002
.********************************************************************** 36528002
         AIF   (N'&K GT 2).LOTSAK  SEE IF THERE ARE TOO MANY OPERANDS.  36536002
         AIF   (N'&K EQ 2).S5K2  SEE IF THERE ARE EXACTLY 2.            36544002
         AIF   ('&K'(1,1) EQ '(').S5K1P  SEE IF IT LOOKS LIKE A GPR.    36552002
         AIF   ((T'&K(1) EQ 'M')OR(T'&K(1) EQ 'N')OR(T'&K(1) EQ 'O')OR(*36560002
               T'&K(1) EQ 'T')OR(T'&K(1) EQ 'W')OR(T'&K(1) EQ '$')OR(T'*36568002
               &K(1) EQ 'U')).KINVF  SEE IF K IS A GOOD FIELD NAME.     36576002
         AIF   (K'&K GT 8).KBIGTAG  SEE IF THE FIELD NAME HAS TOO MANY *36584002
                         CHARACTERS IN IT TO BE A VALID NAME.           36592002
&FIELD   SETC  '&K'      SET FIELD TO THE FIELD NAME.                   36600002
         AGO   .S5LCHK   MERGE IN WITH THE OTHER LENGTH CHECK.          36608002
.********************************************************************** 36616002
.* THE K PARAMETER IS CODED AND THE A PARAMETER IS NOT CODED, AND THE * 36624002
.* K PARAMETER HAS EXACTLY TWO ELEMENTS IN IT. SEE IF K IS OF THE FORM* 36632002
.* (F,L). IF IT ISN'T IT IS AN ERROR.                                 * 36640002
.********************************************************************** 36648002
.S5K2    ANOP                                                           36656002
         AIF   (T'&K(2) EQ 'N').S5K2N  SEE IF THE LENGTH IS A SELF-    *36664002
                         DEFINING TERM.                                 36672002
&I       SETA  (K'&K(2))  SET THE INDEX TO IT'S INITIAL VALUE.          36680002
.K5LCHK  AIF   (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).S5LERR  36688002
&I       SETA  (&I-1)    DECREASE THE INDEX TO THE NEXT CHARACTER.      36696002
         AIF   (&I GT 0).K5LCHK  SEE IF THERE ARE MORE TO CHECK.        36704002
         AIF   (K'&K(2) GT 4).S5LERR  SEE IF IT HAS TOO MANY DIGITS.    36712002
.S5K2N   ANOP                                                           36720002
&IGAKEYL SETA  (&K(2))   GET THE LENGTH AS A NUMBER.                    36728002
         AIF   (K'&K(1) GT 8).KBIGTAG  SEE IF IT HAS TOO MANY          *36736002
                         CHARACTERS IN IT TO BE A VALID NAME.           36744002
&FIELD   SETC  '&K(1)'   GET THE FIELD NAME.                            36752002
         AGO   .S5LCHK   MERGE IN WITH THE OTHER SEQUENCE.              36760002
.********************************************************************** 36768002
.* BOTH THE A AND K PARAMETERS ARE CODED.                             * 36776002
.********************************************************************** 36784002
.S5BOTH  ANOP                                                           36792002
         AIF   ('&A'(1,1) EQ '(').S5BAISG  SEE IF THE A PARAMETER      *36800002
                         SPECIFIES A GENERAL REGISTER.                  36808002
         AIF   (N'&K GT 2).LOTSAK  SEE IF THERE ARE TOO MANY.           36816002
         AIF   (N'&K EQ 2).S5AK2  SEE IF THERE ARE EXACTLY 2.           36824002
         AIF   ('&K'(1,1) EQ '(').S5K1P  SEE IF IT LOOKS LIKE THE      *36832002
                         DISPLACEMENT-LENGTH PAIR IS IN A GPR.          36840002
.********************************************************************** 36848002
.* THIS MUST BE THE CASE WHERE A=F,K=L.                               * 36856002
.********************************************************************** 36864002
         AIF   (T'&K EQ 'N').AFKL5OK  SEE IF THE LENGTH IS A           *36872002
                         SELF-DEFINING TERM.                            36880002
&I       SETA  (1)       SET THE INDEX TO ITS INITIAL VALUE.            36888002
.AFKL5CK AIF   (('&K'(&I,1) LE '0')OR('&K'(&I,1) GT '9')).S5LERR       *36896002
                         CHECK THE LENGTH TO SEE IF IT IS REALLY A     *36904002
                         NUMBER.                                        36912002
&I       SETA  (&I+1)    EKE THE INDEX OF THE NEXT CHARACTER TO BE     *36920002
                         INSPECTED.                                     36928002
         AIF   (&I LT K'&K).AFKL5CK  KEEP ON LOOKING UNTIL ALL THE     *36936002
                         CHARACTERS HAVE BEEN INSPECTED.                36944002
.AFKL5OK ANOP                                                           36952002
&IGAKEYL SETA  (&K)      CAPTURE THE KEY LENGTH AS A NUMBER.            36960002
         AIF   (&IGAKEYL EQ 1).AFKL51  SEE IF THE KEY LENGTH IS ONE    *36968002
                         BYTE.                                          36976002
         AIF   (&IGAKEYL EQ 2).AFKL52  SEE IF THE KEY LENGTH IS TWO    *36984002
                         BYTES.                                         36992002
         AIF   (&IGAKEYL EQ 3).AFKL53  SEE IF THE KEY LENGTH IS 3      *37000002
                         BYTES.                                         37008002
         AIF   (&IGAKEYL NE 4).S5NONCE  SEE IF THE KEY LENGTH IS FOUR  *37016002
                         BYTES.                                         37024002
         L     0,&A                     SEARCH ARGUMENT.                37032002
         AGO   .SRCH5Z   GO DO THE ACTUAL SEARCH.                       37040002
.AFKL51  SLR   0,0     KEY LENGTH IS ONE BYTE.                          37048002
         IC    0,&A                 1-BYTE SEARCH KEY.                  37056002
         AGO   .SRCH5Z   GO GENERATE THE ACTUAL SEARCH CODE.            37064002
.AFKL52  LH    0,&A              HALFWORD SEARCH KEY.                   37072002
         AGO   .SRCH5Z   GO GENERATE THE SEARCH CODE.                   37080002
.AFKL53  L     0,&A                  LOAD 3-BYTE SEARCH KEY.            37088002
         SRL   0,8       SHIFT IT OVER.                                 37096002
         AGO   .SRCH5Z   GO GENERATE THE REAL SEARCH.                   37104002
.AFKL54  L     0,&A                   LOAD FULL-WORD SEARCH KEY.        37112002
         AGO   .SRCH5Z   GO GENERATE THE REAL SEARCH CODE.              37120002
.********************************************************************** 37128002
.* THIS MUST BE THE CASE WHERE A=F,K=(D,L).                           * 37136002
.********************************************************************** 37144002
.S5AK2   AIF   (T'&K(2) EQ 'N').S5K2N1 SEE IF THE LENGTH IS A SELF-    *37152002
               DEFINING TERM.                                           37160002
         AIF   (K'&K(2) EQ 0).S5LERR  SEE IF IT IS THE EMPTY STRING.    37168002
&I       SETA  (K'&K(2))  SET THE INDEX TO IT'S INITIAL VALUE.          37176002
.K5LCHK1 AIF   (('&K(2)'(&I,1) LT '0')OR('&K(2)'(&I,1) GT '9')).S5LERR  37184002
&I       SETA  (&I-1)    DECREASE THE INDEX TO THE NEXT CHARACTER.      37192002
         AIF   (&I GT 0).K5LCHK1 SEE IF THERE ARE MORE TO CHECK.        37200002
         AIF   (K'&K(2) GT 4).S5LERR  SEE IF IT HAS TOO MANY DIGITS.    37208002
.S5K2N1  ANOP                                                           37216002
&IGAKEYL SETA  (&K(2))   GET THE KEY LENGTH AS A NUMBER.                37224002
&DSP     SETA  0         SET THE DISPLACEMENT TO ITS DEFAULT VALUE.     37232002
         AIF   (K'&K(1) EQ 0).S5AK2D  SEE IF THE DISPLACEMENT FIELD IS *37240002
                         ELIDED.                                        37248002
         AIF   ('&K(1)' EQ '0').S5AK2D  SEE IF IT IS ZERO.              37256002
         AIF   (T'&K(1) EQ 'N').PICK5D  SEE IF THE DISPLACEMENT IS A   *37264002
                         SELF-DEFINING TERM.                            37272002
&I       SETA  (K'&K(1))  SET THE INDEX TO IT'S INITIAL VALUE.          37280002
.CHECK5D AIF   (('&K(1)'(&I,1) LT '0')OR('&K(1)'(&I,1) GT '9')).S5DERR  37288002
&I       SETA  (&I-1)    DECREASE THE INDEX TO THE NEXT CHARACTER.      37296002
         AIF   (&I GT 0).CHECK5D  SEE IF IT GOT TO THE END.             37304002
         AIF   (K'&K(1) GT 4).S5DLONG  SEE IF IT HAS TOO MANY DIGITS.   37312002
.PICK5D  ANOP                                                           37320002
&DSP     SETA  (&K(1))   GET THE DISPLACEMENT AS A NUMBER.              37328002
.S5AK2D  ANOP                                                           37336002
.S5DLCHK ANOP                                                           37344002
         AIF   (&IGAKEYL GT 4).S5DL5  SEE IF THE KEY LENGTH IS MORE    *37352002
                         THAN 4 BYTES.                                  37360002
         AIF   (&IGAKEYL EQ 4).S5DL4  SEE IF THE KEY LENGTH IS 4 BYTES. 37368002
         AIF   (&IGAKEYL EQ 3).S5DL3  SEE IF THE KEY LENGTH IS 3 BYTES. 37376002
         AIF   (&IGAKEYL EQ 2).S5DL2  SEE IF THE KEY LENGTH IS 2 BYTES. 37384002
         AIF   (&IGAKEYL NE 1).NULLKEY  SEE IF THE KEY LENGTH IS ZERO.  37392002
.S5DL1   SLR   0,0       SEARCH KEY IS                                  37400002
         AIF   (&DSP EQ 0).S5DL1Z  SEE IF THE DISPLACEMENT IS ZERO.     37408002
         IC    0,&A                    ONE BYTE LONG.                   37416002
         AGO   .S5DL1ZZ  SKIP AROUND THE OTHER INSERT CHARACTER        *37424002
                         INSTRUCTION.                                   37432002
.S5DL1Z  IC    0,&DSP+&A        ONE BYTE LONG.                          37440002
.S5DL1ZZ ANOP                                                           37448002
         AGO   .SRCH5Z   GO DO THE IN LINE SEARCH.                      37456002
.S5DL2   AIF   (&DSP EQ 0).S5DL2Z  SEE IF THE DISPLACEMENT IS ZERO.     37464002
         LH    0,&DSP+&A          HALFWORD                              37472002
         AGO   .S5DL2ZZ  SKIP AROUND THE OTHER LOAD HALFWORD           *37480002
                         INSTRUCTION.                                   37488002
.S5DL2Z  LH    0,&A           HALFWORD                                  37496002
.S5DL2ZZ ANOP                                                           37504002
         N     0,=XL4'0000FFFF'  SEARCH KEY.                            37512002
         AGO   .SRCH5Z   GO WRAP IT UP.                                 37520002
.S5DL3   AIF   (&DSP EQ 0).S5DL3Z  SEE IF THE DISPLACEMENT IS ZERO.     37528002
         L     0,&DSP+&A           THREE-BYTE SEARCH KEY.               37536002
         AGO   .S5DL3ZZ  SKIP THE OTHER LOAD INSTRUCTION.               37544002
.S5DL3Z  L     0,&A                 THREE-BYTE SEARCH KEY.              37552002
.S5DL3ZZ ANOP                                                           37560002
         SRL   0,8       GET IT RIGHT ALIGNED.                          37568002
         AGO   .SRCH5Z   GO DO THE IN-LINE SEARCH.                      37576002
.S5DL4   AIF   (&DSP EQ 0).S5DL4Z  SEE IF THE DISPLACEMENT IS ZERO.     37584002
         L     0,&DSP+&A           4-BYTE KEY.                          37592002
         AGO   .S5DL4ZZ  SKIP THE OTHER LOAD INSTRUCTION.               37600002
.S5DL4Z  L     0 &A                  4-BYTE KEY.                        37608002
.S5DL4ZZ ANOP                                                           37616002
         AGO   .SRCH5Z   GO FINISH IT UP.                               37624002
.S5DL5   AGO   .S5NONCE  THIS IS ONLY FOR THE NONCE.                    37632002
.********************************************************************** 37640002
.* BOTH THE A AND K PARAMETERS ARE CODED, AND A SPECIFIES A GPR.      * 37648002
.* THEREFORE IT MUST BE THE CASE WHERE A=(GPR),K=(D,L). NOTE THAT THE * 37656002
.* DISPLACEMENT CAN BE THE EMPTY STRING.                              * 37664002
.* ALSO THE CASE OF A=(GPR),K=L GOES ALONG WITH THESE.                * 37672002
.********************************************************************** 37680002
.S5BAISG ANOP                                                           37688002
         AIF   (N'&K GT 2).LOTSAK  SEE IF K HAS TOO MANY OPERANDS.      37696002
         AIF   (N'&K EQ 2).S5AGK2  SEE IF K HAS EXACTLY 2 OPERANDS.     37704002
         AIF   ('&K'(1,1) EQ '(').S5K1P  SEE IF IT LOOKS LIKE A GPR.    37712002
         AIF   (T'&K NE 'N').S5LERR  SEE IF IT'S A SELF-DEFINING TERM.  37720002
.********************************************************************** 37728002
.* IT IS A=(GPR),K=L.                                                 * 37736002
.********************************************************************** 37744002
&IGAKEYL SETA  (&K)      GET THE KEY LENGTH AS A NUMBER.                37752002
&DSP     SETA  0         SET THE DISPLACEMENT TO ITS DEFAULT VALUE.     37760002
.S5GLCHK AIF   (&IGAKEYL GT 4).S5GL5  SEE IF THE KEY LENGTH EXCEEDS 4.  37768002
         AIF   (&IGAKEYL EQ 4).S5GL4  SEE IF IT IS EXACTLY 4 BYTES.     37776002
         AIF   (&IGAKEYL EQ 3).S5GL3  SEE IF IT IS EXACTLY 3 BYTES.     37784002
         AIF   (&IGAKEYL EQ 2).S5GL2  SEE IF IT IS EXACTLY 2 BYTES.     37792002
         AIF   (&IGAKEYL NE 1).S5LERR  SEE IF IT IS ZERO.               37800002
.S5GL1   SLR   0,0       1-BYTE KEY.                                    37808002
         IC    0,&DSP&A                                                 37816002
         AGO   .SRCH5Z   GO FINISH UP.                                  37824002
.S5GL2   LH    0,&DSP&A  2-BYTE KEY.                                    37832002
         N     0,=XL4'0000FFFF'                                         37840002
         AGO   .SRCH5Z                                                  37848002
.S5GL3   L     0,&DSP&A  3-BYTE KEY.                                    37856002
         SRL   0,8                                                      37864002
         AGO   .SRCH5Z                                                  37872002
.S5GL4   L     0,&DSP&A  4-BYTE KEY.                                    37880002
         AGO   .SRCH5Z   GO FINISH IT UP.                               37888002
.S5GL5   AGO   .S5NONCE                                                 37896002
.********************************************************************** 37904002
.* IT IS A=(GPR),K=(D,L).                                             * 37912002
.********************************************************************** 37920002
.S5AGK2  ANOP                                                           37928002
         AIF   (T'&K(2) NE 'N').S5LERR   SEE IF IT'S NOT SELF-DEFINING. 37936002
&DSP     SETA  0         SET D TO THE DEFAULT VALUE.                    37944002
&IGAKEYL SETA  (&K(2))   GET THE KEY LENGTH AS A NUMBER.                37952002
         AIF   (K'&K(1) EQ 0).S5GLCHK  SEE IF THE DISPLACEMENT IS THE  *37960002
                         EMPTY STRING.                                  37968002
         AIF   (T'&K(1) NE 'N').S5DERR   SEE IF IT'S NOT SELF-DEFINING. 37976002
&DSP     SETA  (&K(1))   GET THE DISPLACEMENT AS A NUMBER.              37984002
         AGO   .S5GLCHK  MERGE WITH THE COMMON PATH.                    37992002
.SRCH5Z  AIF   (&ERROR).FIN5  DON'T GENERATE THE SEARCH IF ERRORS HAVE *38000002
                         BEEN DETECTED ALREADY.                         38008002
&TOOBAD  L     &EKER,&IGACNT5.(,&TREEHDR)  LOAD THE USE COUNTER.        38016002
         LA    &P,&IGATOP5.(,&TREEHDR)  ADDRESS OF RPT SOURCE.          38024002
         LR    &C,&P     XX                                             38032002
         L     &S,&O.(&O,&C)                                            38040002
         CL    &S,&IGAMSK5.(,&TREEHDR)  SEE IF THERE ARE ZERO SINKS.    38048002
         BC    7,&GOLEFT+4                                              38056002
         BC    15,&ITSEOP                                               38064002
&GOLEFT L     &S,&O.(&O,&C)   LOAD THE SINK WORD OR THE NEXT INNER      38072002
         LTR   &S,&S          VERTEX AND TEST FOR THE END OF THE PATH.  38080002
         BC    10,&ITSEOP     BRANCH IF THE SINK WORD WAS LOADED.       38088002
&ITSMOP LR    &P,&C           CYCLE THE REGISTERS SO THAT THESE TWO     38096002
         LR    &C,&S          ARE ALWAYS CONSECUTIVE VERTICES.          38104002
         SRL   &S,24          GET THE BIT INDEX FIELD IN THE LOW ORDER. 38112002
         L     &S,(&IGAMSK5-X'80')(&TREEHDR,&S)  LOAD MASK TO TEST BIT. 38120002
         NR    &S,&ARG          TEST THE BIT.                           38128002
         BC    8,&GOLEFT    BRANCH IF IT IS A ZERO TO THE LEFT PATH.    38136002
         L     &S,&FOUR.(&O,&C)  ENTER THE RIGHT SUBTREE BY LOADING     38144002
         LA    &C,&FOUR.(&O,&C)  THE PAIRED RIGHT SUCCESSOR AND         38152002
         LTR   &S,&S   MAKE THE CURRENT VERTEX ADDRESS IT.              38160002
         BC    4,&ITSMOP   BRANCH IF THE NEW VERTEX IS AN INNER VERTEX. 38168002
&ITSEOP  CL    &EKER,&IGACNT5.(,&TREEHDR)  CHECK THE COUNTER TO SEE IF  38176002
         BC    7,&TOOBAD   THE READ-ONLY SEARCH MUST BE DONE AGAIN.     38184002
         AGO   .FIN5                                                    38192002
.AGRNOK  MNOTE 12,'SEARCH KEY LENGTH CANNOT BE DETERMINED WITH A IN A  *38200002
               GPR AND NO K.'                                           38208002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         38216002
         AGO   .FIN5     FINISH UP AND GET OUT.                         38224002
.ANOTF   MNOTE 12,'THE FIELD DEFINED BY A HAS NOT A VALID LENGTH ATTRIB*38232002
               UTE.'                                                    38240002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         38248002
         AGO   .FIN5     GET OUT NOW.                                   38256002
.ATOOBIG MNOTE 12,'FIELD NAME IN A PARAMETER IS TOO MANY CHARACTERS.'   38264002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         38272002
         AGO   .FIN5     EXIT.                                          38280002
.NULLKEY MNOTE 12,'LENGTH OF SEARCH KEY DEFINED IS ZERO.'               38288002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         38296002
         AGO   .FIN5     EXIT AFTER CLEANING UP.                        38304002
.S5NONCE MNOTE 12,'NONCE ERROR, ONLY KEYS UP TO 4 BYTES ARE SUPPORTED.' 38312002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         38320002
         AGO   .FIN5     FORGET IT FOR THE NONCE.                       38328002
.LOTSAK  MNOTE 12,'TOO MANY OPERANDS IN THE K PARAMETER LIST.'          38336002
&ERROR   SETB  (1)       SET THE ERROR FLAG ON.                         38344002
         AGO   .FIN5                                                    38352002
.S5K1P   MNOTE 12,'THE DISPLACEMENT-LENGTH PAIR MAY NOT BE IN A GPR.'   38360002
&ERROR   SETB  (1)                                                      38368002
         AGO   .FIN5                                                    38376002
.KINVF   MNOTE 12,'FIELD IN K PARAMETER HAS INVALID LENGTH ATTRIBUTE.'  38384002
&ERROR   SETB  (1)                                                      38392002
         AGO   .FIN5                                                    38400002
.KBIGTAG MNOTE 12,'TOO MANY CHARACTERS IN FIELD NAME; ONLY 8 ALLOWED.'  38408002
&ERROR   SETB  (1)                                                      38416002
         AGO   .FIN5                                                    38424002
.S5LERR  MNOTE 12,'LENGTH IS NOT A SELF-DEFINING TERM IN K PARAMETER.'  38432002
&ERROR   SETB  (1)                                                      38440002
         AGO   .FIN5                                                    38448002
.S5DERR  MNOTE 12,'THE DISPLACEMENT IN THE K PARAMETER IS NOT A SELF-DE*38456002
               FINING TERM.'                                            38464002
&ERROR   SETB  (1)                                                      38472002
         AGO   .FIN5                                                    38480002
.S5DLONG MNOTE 12,'K PARAMETER DISPLACEMENT HAS TOO MANY DIGITS.'       38488002
&ERROR   SETB  (1)                                                      38496002
.FIN5    ANOP                                                           38504002
         AIF   (NOT &USING).FIN  SEE IF THE DROP SHOULD BE GENERATED.   38512002
.*--------------------------------------------------------------------* 38520002
.*      T H E    E N D    O F    M A C R O    S R C H.                * 38528002
.*--------------------------------------------------------------------* 38536002
.FIN     ANOP                                                           38544002
.END     ANOP                                                           38552002
         MEND                                                           38560002
         EJECT                                                          38568002
         MACRO                                                          38576002
&TAG     STREE &TREE,&TSP=,&T=,&TYPE=,&FIX=NO,&K=,&IVS=,&S=,&MAP=,&C=, *38584002
               &TSPACE=,&RSPACE=,&RSP=,&KEYL=,&OFFSET=,&RECL=           38592002
.********************************************************************** 38600002
.* THE STREE MACRO-INSTRUCTION IS USED TO CREATE A RADIX PARTITION    * 38608002
.* TREE FOR SUBSEQUENT USE. THE STREE SUBROUTINE IN THE MODULE        * 38616002
.* IGARPT01 OBTAINS SPACE FOR THE RPT, AND STORES THE INFORMATION     * 38624002
.* SUPPLIED IN A CONTROL BLOCK FOR THE RPT. THE ADDRESS OF THIS       * 38632002
.* CONTROL BLOCK IS RETURNED IN REGISTER 1, AND IS (OPTIONALLY) STORED* 38640002
.* IN THE MAIN STORAGE LOCATION SPECIFIED BY THE TREE PARAMETER.      * 38648002
.*                                                                    * 38656002
.* THE ADDRESS RETURNED BY THE STREE MACRO-INSTRUCTION MUST BE USED   * 38664002
.* FOR ALL SUBSEQUENT OPERATIONS WITH IT USING THE OTHER RPT          * 38672002
.* MACRO-INSTRUCTIONS, SUCH AS SRCH, DEL, INS, SCANL, SCANR, FTREE,   * 38680002
.* ETC. THE ADDRESS CAN BE STORED EITHER IN A MAIN STORAGE LOCATION   * 38688002
.* VIA THE TREE PARAMETER, OR MAY BE PUT IN A REGISTER BY CODING      * 38696002
.* "(GPR)" FOR THE TREE PARAMETER, WHERE "GPR" IS THE REGISTER NAME OR* 38704002
.* NUMBER.                                                            * 38712002
.*                                                                    * 38720002
.* THE SPACE FOR THE RPT CAN BE OBTAINED VIA THE GSPACE               * 38728002
.* MACRO-INSTRUCTION USING A PREVIOUSLY ESTABLISHED SPACE CONTROL     * 38736002
.* AREA, OR MAY BE OBTAINED IMPLICITLY VIA THE GSPACE                 * 38744002
.* MACRO-INSTRUCTION USING THE APPROPRIATE SPACE CONTROL AREA FROM THE* 38752002
.* TCB (SEE THE DESCRIPTION OF THE GSPACE MACRO-INSTRUCTION FOR THE   * 38760002
.* USE OF SPACE CONTROL AREAS).                                       * 38768002
.*                                                                    * 38776002
.* THERE ARE DIFFERENT TYPES OF RADIX PARTITION TREES, WHICH ARE      * 38784002
.* DIFFERENTIATED FROM ONE ANOTHER BY CODING THE T PARAMETER ON ALL   * 38792002
.* THE MACRO-INSTRUCTIONS THAT DEAL WITH RPTS. THERE ARE LIMITATIONS  * 38800002
.* ON THE OPERATIONS THAT MAY BE INVOKED WITH THE DIFFERENT RPT TYPES,* 38808002
.* DEPENDING ON THE RPT TYPE.                                         * 38816002
.*                                                                    * 38824002
.* THE ALLOCATION OF SPACE, AS DESCRIBED ABOVE, APPLIES TO TYPE 8     * 38832002
.* RADIX PARTITION TREES. THE GSPACE MACRO-INSTRUCTION IS ALWAYS USED * 38840002
.* TO ALLOCATE THE SPACE FOR A TYPE 8 RPT.                            * 38848002
.* THE SPACE FOR THE RPT CAN BE OBTAINED EITHER CONDITIONALLY OR      * 38856002
.* UNCONDITIONALLY, DEPENDING ON THE C PARAMETER. IF "C=C" IS CODED,  * 38864002
.* THEN THE ALLOCATION IS VIA A CONDITIONAL GSPACE OPERATION, WHICH   * 38872002
.* HAS A RETURN CODE FOR THE STREE MACRO-INSTRUCTION OF -1 IF THE     * 38880002
.* SPACE COULD NOT BE ALLOCATED, OR HAS A RETURN CODE IN REGISTER 15  * 38888002
.* WHICH IS THE ADDRESS OF THE RPT'S CONTROL BLOCK (CALLED THE TREE   * 38896002
.* HEADER, OR THE ADDRESS OF THE RPT).                                * 38904002
.* FOR TYPE 5 RADIX PARTITION TREE, THE SPACE IS ALWAYS OBTAINED VIA  * 38912002
.* THE GETMAIN MACRO-INSTRUCTION, AND A CONDITIONAL GETMAIN IS ALWAYS * 38920002
.* USED, UNLESS THE C PARAMETER IS CODED "C=U".                       * 38928002
.*                                                                    * 38936002
.********************************************************************** 38944002
.* WITH TYPE 8 RADIX PARTITION TREES, THE FOLLOWING OPERATIONS ARE    * 38952002
.* EFFECTIVE:                                                         * 38960002
.*                                                                    * 38968002
.* SRCH: SEARCH FOR A GIVEN KEY.                                      * 38976002
.* INS:  INSERT A NEW KEY-ADDRESS ASSOCIATION PAIR.                   * 38984002
.* DEL:  DELETE A KEY-ADDRESS ASSOCIATION PAIR SELECTED BY THE CURRENT* 38992002
.*       SETTING OF THE CURSOR (SEE THE DESCRIPTION OF THE CURSOR     * 39000002
.*       UNDER THE ISCAN MACRO-INSTRUCTION DESCRIPTION).              * 39008002
.* ISCAN:INITIALIZE THE CURSOR FOR SUBSEQUENT SCANNING OPERATIONS.    * 39016002
.* SCANL:SCAN LEFT TO THE NEXT KEY IN DESCENDING ORDER.               * 39024002
.* SCANR:SCAN RIGHT TO THE NEXT KEY IN ASCENDING ORDER.               * 39032002
.* FTREE:RELEASE ALL THE SPACE FOR THE RPT TO THE SYSTEM VIA THE      * 39040002
.*       FSPACE MACRO-INSTRUCTION.                                    * 39048002
.*                                                                    * 39056002
.* THE MAXIMUM KEY LENGTH THAT CAN BE SUPPORTED WITH TYPE 8 RADIX     * 39064002
.* PARTITION TREES IS 256 BYTES.                                      * 39072002
.********************************************************************** 39080002
.*                                                                    * 39088002
.* WITH TYPE 5 RADIX PARTITION TREES, THE FOLLOWING OPERATIONS ARE    * 39096002
.* VALID:                                                             * 39104002
.*                                                                    * 39112002
.* SRCH: SEARCH FOR A GIVEN KEY AND SET THE CURSOR TO THE             * 39120002
.*       CORRESPONDING KEY-ADDRESS PAIR.                              * 39128002
.* INS:  INSERT A NEW KEY-ADDRESS PAIR.                               * 39136002
.* DEL:  DELETE A KEY-ADDRESS PAIR BASED ON THE CURRENT SETTING OF THE* 39144002
.*       CURSOR.                                                      * 39152002
.* FTREE:FREE THE SPACE FOR THE TREE BY RELEASING IT TO THE SYSTEM VIA* 39160002
.*       THE FREEMAIN MACRO-INSTRUCTION.                              * 39168002
.*       NO OTHER OPERATIONS ARE VALID FOR TYPE 5 TREES.              * 39176002
.*                                                                    * 39184002
.*       THE MAXIMUM SIZE KEY PERMITTED WITH TYPE 5 TREES IS 16 BYTES.* 39192002
.*       THE KEY MUST ALWAYS BE PRESENTED AS A SINGLE FIELD FOR THE   * 39200002
.*       SRCH AND INS MACRO-INSTRUCTIONS, UNLIKE TYPE 8 TREES, WHERE  * 39208002
.*       THE KEY IS PERMITTED TO BE COMPOSED OF A NUMBER OF SCATTERED * 39216002
.*       FIELDS.                                                      * 39224002
.*                                                                    * 39232002
.* THE MAIN REASON FOR HAVING TYPE 5 RADIX PARTITION TREES IS TO ALLOW* 39240002
.* SEARCHES TO PROCEED IN A MULTIPROCESSING SITUATION SIMULTANEOUSLY  * 39248002
.* WITH AN INSERT OR DELETE IN PROGRESS. THIS IS ACCOMPLISHED WITHOUT * 39256002
.* NEEDING TO LOCK THE RPT HEADER.                                    * 39264002
.********************************************************************** 39272002
.* THE MEANING AND USE OF THE VARIOUS PARAMETERS FOR THE STREE        * 39280002
.* MACRO-INSTRUCTION ARE AS FOLLOWS:                                  * 39288002
.*                                                                    * 39296002
.* TREE: THIS PARAMETER SPECIFIES WHERE TO PUT THE ADDRESS OF THE     * 39304002
.*       RADIX PARTITION TREE AFTER IT HAS BEEN ESTABLISHED. IT MAY   * 39312002
.*       SPECIFY EITHER A MAIN STORAGE LOCATION OR A GENERAL REGISTER.* 39320002
.*                                                                    * 39328002
.* TSP:  THIS PARAMETER SPECIFIES THE SUBPOOL TO BE USED FOR          * 39336002
.*       ALLOCATING SPACE FOR THR RPT, BOTH INITIALLY AND LATER WHEN  * 39344002
.*       SPACE IS NEEDED FOR INSERTIONS.                              * 39352002
.*                                                                    * 39360002
.* T:    THIS SPECIFIES THE RPT TYPE. IT MAY BE 5 OR 8. IF IT IS      * 39368002
.*       ELIDED, THE RPT TYPE IS 8.                                   * 39376002
.*                                                                    * 39384002
.* FIX:  THIS PARAMETER SPECIFIES WHETHER A PGFIX OPERATION MUST BE   * 39392002
.*       PERFORMED ON THE PAGES CONTAINING THE IGARPT01 MODULE. IF    * 39400002
.*       "FIX=YES" IS CODED, THEN THE PGFIX OPERATION IS GENERATED AS * 39408002
.*       PART OF THE STREE MACRO EXPANSION.                           * 39416002
.*                                                                    * 39424002
.* K:    THIS SPECIFIES THE DISPLACEMENT AND LENGTH OF THE KEY, AS A  * 39432002
.*       DISPLACEMENT-LENGTH PAIR. IT IS CODED AS "K=(D,L)", WHERE D  * 39440002
.*       IS THE DISPLACEMENT FROM THE START OF ANY ADDRESS ASSOCIATED * 39448002
.*       WITH A KEY AND THE FIRST BYTE OF THE KEY. THE DISPLACEMENT   * 39456002
.*       MAY NOT EXCEED 4095 BYTES.                                   * 39464002
.*       L IS THE LENGTH OF THE KEYS, IN BYTES. IF VARIABLE LENGTH    * 39472002
.*       KEYS ARE USED, THEY ARE TREATED AS IF THEY ARE ALL THE SAME  * 39480002
.*       LENGTH, I. E. L BYTES LONG. AS LONG AS THE SET OF KEYS DO NOT* 39488002
.*       CONTAIN TWO BYTE STRINGS SUCH THAT ONE IS A PROPER SUBSTRING * 39496002
.*       OF THE OTHER ONE, THIS WILL NOT CAUSE A PROBLEM, SINCE THE   * 39504002
.*       COMPARISONS DO NOT EXTEND PAST THE POINT OF INEQUALITY OF ANY* 39512002
.*       TWO KEYS.                                                    * 39520002
.*                                                                    * 39528002
.* S:    THIS SPECIFIES THE ADDRESS OF THE SPACE CONTROL AREA IF A    * 39536002
.*       SPACE CONTROL AREA IS EXPLICITLY USED TO ALLOCATE AND RELEASE* 39544002
.*       THE STORAGE FOR THE RPT. THE SPACE CONTROL ADDRESS IS THE    * 39552002
.*       WORD THAT IS RETURNED FROM THE GSPACE MACRO-INSTRUCTION WHEN * 39560002
.*       "GSPACE S,..ETC. " IS CODED. SEE THE DESCRIPTION OF THE      * 39568002
.*       GSPACE MACRO-INSTRUCTION FOR A MORE COMPLETE DISCUSSION OF   * 39576002
.*       THE USE OF THE SPACE CONTROL WORD.                           * 39584002
.*                                                                    * 39592002
.* C:    THIS IS USED TO SPECIFY A CONDITIONAL OR UNCONDITIONAL       * 39600002
.*       ATTEMPT TO ALLOCATE THE SPACE FOR THE RPT INITIALLY. IF "C=C"* 39608002
.*       IS CODED, THE REQUEST IS A CONDITIONAL REQUEST. IF "C=U" IS  * 39616002
.*       CODED THE REQUEST IS UNCONDITIONAL. IF THE C PARAMETER IS NOT* 39624002
.*       CODED, THE REQUEST IS CONDITIONAL.                           * 39632002
.*                                                                    * 39640002
.* MAP:  THIS PARAMETER IS USED WHEN THE ADDRESSES ASSOCIATED WITH    * 39648002
.*       KEYS IN THE RPT ARE NOT ADDRESSES OF AREAS CONTAINING THE    * 39656002
.*       CORRESPONDING KEYS. THIS PARAMETER SPECIFIES THE ADDRESS OF A* 39664002
.*       SUBROUTINE TO BE EXECUTED WHEN THE RPT MODULE (IGARPT01) MUST* 39672002
.*       ACCESS A KEY USING ONE OF THE ADDRESSES FROM A KEY-ADDRESS   * 39680002
.*       PAIR. THE ADDRESS SPECIFIED BY THE MAP PARAMETER IS STORED IN* 39688002
.*       THE TREE HEADER, AND WHENEVER THE IGARPT01 MODULE MUST ACCESS* 39696002
.*       A KEY FROM ONE OF THE ADDRESSES THE ADDRESS ASSOCIATED WITH  * 39704002
.*       THE KEY IS PLACED IN REGISTER 1, AND A LINK IS MADE TO THE   * 39712002
.*       SUBROUTINE SPECIFIED BY THE MAP PARAMETER. UPON ENTRY TO THIS* 39720002
.*       ROUTINE A REGISTER SAVE AREA IS AVAILABLE USING THE ADDRESS  * 39728002
.*       IN REGISTER 13. THE MAPPING SUBROUTINE MAY STORE IT'S        * 39736002
.*       REGISTERS IN THE SAVE AREA PROVIDED. THE MAPPING SUBROUTINE  * 39744002
.*       MUST RESTORE ALL REGISTERS EXCEPT 0, 14, AND 15 TO THEIR     * 39752002
.*       CONTENTS UPON ENTRY.                                         * 39760002
.*                                                                    * 39768002
.*       THE MAPPING SUBROUTINE MUST COMPUTE THE ADDRESS OF THE       * 39776002
.*       CORRESPONDING KEY FROM THE ADDRESS FURNISHED IN REGISTER 1,  * 39784002
.*       AND LEAVE IT IN REGISTER 0 UPON RETURN TO THE IGARPT01       * 39792002
.*       MODULE. IF THE K PARAMETER HAS BEEN CODED "K=(D,L)" IN THE   * 39800002
.*       STREE MACRO-INSTRUCTION, THEN THE ADDRESS LEFT IN REGISTER 0 * 39808002
.*       MUST BE EQUAL TO THE ADDRESS OF THE CORRECT KEY MINUS THE    * 39816002
.*       DISPLACEMENT D, SINCE THE IGARPT01 MODULE WILL ADD THE       * 39824002
.*       DISPLACEMENT D TO THE ADDRESS IN REGISTER 0 TO FORM THE      * 39832002
.*       ADDRESS OF THE FIRST BYTE OF THE KEY.                        * 39840002
.*                                                                    * 39848002
.*       A TYPICAL USE OF THIS FEATURE WOULD BE TO STORE RECORDS ON A * 39856002
.*       DISK USING A BDAM ORGANIZATION, WHERE THE ADDRESSES          * 39864002
.*       ASSOCIATED WITH THE KEYS ARE THE BDAM BLOCK NUMBERS OF THE   * 39872002
.*       CORRESPONDING RECORDS. THEN THE MAPPING SUBROUTINE TAKES THE * 39880002
.*       BDAM BLOCK NUMBER IN REGISTER 1, READS THE CORRESPONDIN BDAM * 39888002
.*       BLOCK, AND PUTS THE MAIN STORAGE ADDRESS OF THE REOCRD READ  * 39896002
.*       IN REGISTER 0 PRIOR TO RETURNING TO THE IGARPT01 MODULE. IN  * 39904002
.*       THIS WAY THE ADDRESSES ASSOCIATED WITH THE KEYS IN THE RPT   * 39912002
.*       CAN BE COMPLETELY ARBITRARY, TO BE RESOLVED WHEN NEEDED BY   * 39920002
.*       THE MAPPING SUBROUTINE.                                      * 39928002
.*                                                                    * 39936002
.*       THE ADDRESS OF THE MAPPING SUBROUTIE CAN BE IN A REGISTER BY * 39944002
.*       CODING "MAP=(GPR)", WHERE "GPR" IS THE NAME OR NUMBER OF THE * 39952002
.*       REGISTER CONTAINING THE ADDRESS OF THE MAPPING SUBROUTINE. IF* 39960002
.*       "MAP=LABEL" IS CODED, THE ADDRESS OF THE MAPPING SUBROUTINE  * 39968002
.*       IS AT THE LOCATION "LABEL". A BRANCH TO THE SPECIFIED LABEL  * 39976002
.*       SHOULD RESULT IN EXECUTION OF THE MAPPING SUBROUTINE. THE    * 39984002
.*       ADDRESS IS FORMED BY EXECUTINNG A LOAD-ADDRESS INSTRUCTION   * 39992002
.*       WITH THE SPECIFIED LABEL.                                    * 40000002
.*                                                                    * 40008002
.*       IF THE MAP PARAMETER IS NOT CODED THERE IS NO ATTEMPT MADE TO* 40016002
.*       EXECUTE A MAPPING SUBROUTINE BY THE IGARPT01 MODULE. IN THIS * 40024002
.*       CASE EVERY ADDRESS ASSOCIATED WITH A KEY MUST BE THE MAIN    * 40032002
.*       STORAGE ADDRESS OF AN AREA CONTAINING THE KEY.               * 40040002
.*                                                                    * 40048002
.*       THE PARAMETERS IVS, TYPE, TSPACE, RSPACE, RSP, KEYL, OFFSET, * 40056002
.*       AND RECL ARE ONLY PRESENT FOR COMPATIBILITY WITH EARLIER     * 40064002
.*       VERSIONS OF THE STREE MACRO-INSTRUCTION, AND SHOULD NOT BE   * 40072002
.*       USED, AS THEY ARE NOT SUPPORTED IN ANY CONTEXT OTHER THAN THE* 40080002
.*       ONE THEY WERE USED IN ORIGINALLY.                            * 40088002
         GBLA  &IGALEFT(256)   LEFT EDGES FOR BINARY TREE PARSE.        40096002
         GBLA  &IGARGHT(256)   RIGHT EDGES FOR BINARY TREE PARSE.       40104002
         GBLB  &IGARL(256)     LEFT/RIGHT FLAG BITS FOR BINARY PARSE.   40112002
         GBLB  &IGAIS(256)     INNER/SINK BIT FLAGS FOR PARSE TREE.     40120002
         GBLB  &IGAOKAY        1 IF PARSE DISCOVERED BAD SYNTAX.        40128002
         GBLA  &IGAX     TRIPLE FOR SCANNING OPERATION.                 40136002
         GBLA  &IGAY     XX                                             40144002
         GBLA  &IGAZ     XX                                             40152002
         GBLC  &IGASTRE                                                 40160002
         GBLB  &IGALONE  ON TO RUN THE RPT PROGRAMS STANDALONE.         40168002
         GBLC  &IGARPT#  THE RADIX PARTITION TREE TYPE.                 40176002
         GBLB  &IGAPGM  ON IF THIS IS IGARPT01.                         40184002
         LCLC  &X        LOCAL CHARACTER STRING.                        40192002
         LCLA  &N        LOCAL VARIABLE.                                40200002
         LCLA  &I        LOCAL INDEX VARIABLE.                          40208002
         LCLA  &J        LOCAL VARIABLE.                                40216002
.*A000000                                                        Y02147 40224002
.********************************************************************** 40232002
.* CHECK TO SEE IF ANY OF THE OLD PARAMETERS OF THE STREE MACRO ARE   * 40240002
.* SPECIFIED, AND IF THEY ARE TRANSLATE THEM TO THE NEW PARAMETERS VIA* 40248002
.* THE MACRO RECURSION TECHNIQUE.                                     * 40256002
.********************************************************************** 40264002
         AIF   ((K'&KEYL EQ 0)AND(K'&OFFSET EQ 0)).NEW  SEE IF THEY ARE*40272002
                         BOTH NOT SPECIFIED.                            40280002
&TAG     STREE &TREE,TSP=&TSP,T=&T,TYPE=&TYPE,FIX=&FIX,IVS=&IVS,S=&S,  *40288002
               MAP=&MAP,K=(&OFFSET,&KEYL)                               40296002
         AGO   .FIN      ALL DONE WITH THE MAPPING FROM THE OLD TO THE *40304002
                         NEW FORMATS, NOW EXIT FROM THE STREE MACRO.    40312002
.NEW     ANOP                                                           40320002
.********************************************************************** 40328002
.* CHECK THE TYPE AND T PARAMETERS TO SEE IF A VALID RPT TYPE IS      * 40336002
.* SPECIFIED. IF NEITHER IS SPECIFIED, ASSUME IT IS TYPE 8 RPT. THE   * 40344002
.* TYPE IS PUT INTO THE GLOBAL VARIABLE &IGARPT# AT THE END OF THE    * 40352002
.* TYPE CHECKING SECTION.                                             * 40360002
.********************************************************************** 40368002
.RPT#    AIF   (K'&T EQ 0).RPT#TMT  SEE IF THE T PARAMETER IS CODED.    40376002
         AIF   (K'&TYPE EQ 0).RPT#TCK  USE THE T PARAMETER IF IT IS    *40384002
                         CODED AND THE TYPE PARAMETER IS NOT CODED.     40392002
.********************************************************************** 40400002
.* BOTH THE T AND TYPE PARAMETERS ARE CODED; SEE IF THEY ARE THE SAME,* 40408002
.* AND IF THEY ARE NOT THEN USE T.                                    * 40416002
.********************************************************************** 40424002
         AIF   ('&T' EQ '&TYPE').RPT#TCK  IF THEY ARE THE SAME THEN USE*40432002
                         T.                                             40440002
         MNOTE 4,'TYPE CONFLICT, ONLY T OR TYPE SHOULD BE CODED.'       40448002
.RPT#TCK ANOP                                                           40456002
&IGARPT# SETC  '&T'      GET THE RPT TYPE.                              40464002
         AGO   .RPT#CHK  GO TO CHECK THE VALIDITY OF THE RADIX         *40472002
                         PARTITION TREE TYPE.                           40480002
.********************************************************************** 40488002
.* THE T PARAMETER IS NOT CODED, SEE IF THE TYPE PARAMETER IS CODED.  * 40496002
.********************************************************************** 40504002
.RPT#TMT AIF   (K'&TYPE EQ 0).RPT#8  IF BOTH ARE LEFT OUT USE TYPE 8   *40512002
                         RPT.                                           40520002
&IGARPT# SETC  '&TYPE'   SET THE TYPE TO THE TYPE THAT IS SPECIFIED BY *40528002
                         THE TYPE PARAMETER.                            40536002
         AGO   .RPT#CHK  GO CHECK IT FOR VALIDITY.                      40544002
.RPT#8   ANOP                                                           40552002
&IGARPT# SETC  '8'       SET THE RPT TYPE TO 8.                         40560002
.RPT#CHK AIF   (('&IGARPT#' EQ '8')OR('&IGARPT#' EQ '5')OR('&IGARPT#' E*40568002
               Q '4')).RPT#FIN                                          40576002
         MNOTE 4,'INVALID RPT TYPE, TYPE 8 ASSUMED.'                    40584002
&IGARPT# SETC  '8'       USE TYPE 8 RPT.                                40592002
.RPT#FIN ANOP                                                           40600002
      RPTDSECT T=&IGARPT#,DS=NO                                         40608002
.********************************************************************** 40616002
.* GET THE ADDRESS OF THE MODULE IGARPT01 IN REGISTER 14 FOR THE LINK * 40624002
.* TO THE APPROPRIATE ROUTINE TO SET UP THE RPT.                      * 40632002
.********************************************************************** 40640002
         AIF   (K'&S NE 0).USE@S  SEE IF THE SPACE CONTROL ADDRESS IS  *40648002
                         CODED; BECAUSE IF IT IS THE ADDRESS CAN BE    *40656002
                         LOADED DIRECTLY FROM IT.                       40664002
         AIF   (&IGALONE).LOAD  IF THIS IS THE STAND-ALONE CASE USE THE*40672002
               LOAD MACRO TO LOAD THE MODULE IGARPT01.                  40680002
&TAG   RPTDSECT GEN=(CVTRPT,14)  GET THE ADDRESS FROM THE CVT.          40688002
         AGO   .LOADED   THE ADDRESS IS IN GPR 14.                      40696002
.LOAD    LOAD  EP=IGARPT01  LOAD THE MODULE.                            40704002
         LR    14,0                                                     40712002
         AGO   .LOADED   ALL DONE GETTING THE ADDRESS IN R14.           40720002
.USE@S   AIF   ('&S'(1,1) EQ '(').USESGPR  SEE IF THE SPACE CONTROL    *40728002
               ADDRESS IS IN A GENERAL PURPOSE REGISTER.                40736002
         L     15,&S     LOAD THE ADDRESS OF THE SPACE CONTROL AREA.    40744002
         L     14,0(,15) ADDRESS OF IGARPT01.                           40752002
         AGO   .LOADED   ALL LOADED NOW.                                40760002
.USESGPR AIF   ('&S' EQ '(15').LOAD14  SEE IF IT IS ALREADY IN R15.     40768002
         LR    15,&S(1)  SPACE CONTROL ADDRESS.                         40776002
.LOAD14  L     14,0(,15)  ADDRESS OF IGARPT01.                          40784002
.LOADED  ANOP                                                           40792002
.********************************************************************** 40800002
.* CHECK TO SEE IF A PGFIX OPERATION MUST BE DONE ON THE RPT MODULE.  * 40808002
.********************************************************************** 40816002
         AIF   (K'&FIX EQ 0).NOFIX  GO AROUND THE PGFIX IF IT IS NOT   *40824002
               CODED IN THE STREE MACRO-INSTRUCTION.                    40832002
         AIF   (('&FIX'(1,1) NE 'Y')AND('&FIX'(1,1) NE '1')).NOFIX      40840002
         STM   14,3,12(13) SAVE REGS.                                   40848002
         LR    2,14                                                     40856002
         LA    3,(3*X'C')(13) ECB ADDRESS.                              40864002
         MVI   0(3),X'00'                                               40872002
         PGFIX R,A=(2),ECB=(3)                                          40880002
         WAIT  ECB=(3)                                                  40888002
         LM    14,12,12(13)  RESTORE REGISTERS.                         40896002
.NOFIX   ANOP                                                           40904002
.********************************************************************** 40912002
.* NOW PUT THE STREE PARAMETERS IN REGISTERS 0, 1, AND 15, AND LINK TO* 40920002
.* THE MODULE IGARPT01 TO SET UP THE RADIX PARTITION TREE OF THE      * 40928002
.* INDICATED TYPE.                                                    * 40936002
.* THE REGISTER CONTENTS UPON LINKING TO THE MODULE IGARPT01 ARE:     * 40944002
.* R0    KEYI, TYPE, AND KEY LENGTH. THE KEY INDEX IS A HALFWORD      * 40952002
.*       OFFSET, THE TREE TYPE IS A 7-BIT #, AND THE KEY LENGTH IS A  * 40960002
.*       9-BIT #.                                                     * 40968002
.* R1    THE ADDRESS OF THE MAPPING SUBROUTINE (IF THERE IS A MAPPING * 40976002
.*       SUBROUTINE).                                                 * 40984002
.* 14    THE ADDRESS OF THE MODULE IGARPT01.                          * 40992002
.* R15   TSP,S - THE TREE SUBPOOL AND THE ADDRESS OF THE SPACE CONTROL* 41000002
.*       AREA (IF THERE IS ONE).                                      * 41008002
.********************************************************************** 41016002
         AIF   (K'&TSP EQ 0).SPZERO  SEE IF THE SUBPOOL IS NOT CODED.   41024002
         AIF   ('&TSP' EQ '0').SPZERO  SEE IF SUBPOOL ZERO IS          *41032002
                         EXPLICITLY CODED.                              41040002
         AIF   (K'&S EQ 0).SELIDED  SEE IF THE SPACE CONTROL ADDRESS IS*41048002
                         NOT CODED.                                     41056002
         AIF   ('&S'(1,1) EQ '(').SINGPR  SEE IF THE SPACE CONTROL     *41064002
                         ADDRESS IS IN A GPR.                           41072002
         LA    15,0(,15)                                                41080002
.S15AL   AL    15,=AL1(&TSP,0,0,0)  RPT SUBPOOL.                        41088002
         AGO   .GOT15    GOT REGISTER 15 SET UP NOW.                    41096002
.SINGPR  LA    15,0(,&S(1))  SPACE CONTROL ADDRESS.                     41104002
         AGO   .S15AL    NOW GO ADD IN THE SUBPOOL NUMBER.              41112002
.SELIDED LA    15,&TSP   RPT SUBPOOL.                                   41120002
         SLL   15,24                                                    41128002
         AGO   .GOT15    GOT REGISTER 15 ALL SET UP NOW.                41136002
.SPZERO  AIF   (K'&S EQ 0).NOSORSP  SEE IF THERE IS NEITHER A SPACE    *41144002
                         CONTROL ADDRESS NOR A SUBPOOL CODED.           41152002
         LA    15,0(,15)                                                41160002
         AGO   .GOT15    ALL DONE SETTING UP REGISTER 15 NOW.           41168002
.NOSORSP SLR   15,15     SUBPOOL ZERO.                                  41176002
.GOT15   ANOP                                                           41184002
.********************************************************************** 41192002
.* NOW PUT THE KEY INDEX, THE RPT TYPE #, AND THE KEY LENGTH IN       * 41200002
.* REGISTER 0.                                                        * 41208002
.********************************************************************** 41216002
         AIF   (K'&K NE 0).KNOTMT  SEE IF THE K PARAMETER IS CODED.     41224002
.KMNOTE  MNOTE 12,'"K=(DISPLACEMENT,KEY LENGTH)" MUST BE CODED.'        41232002
         AGO   .FIN      CAN'T DO ANY MORE WITH THIS, EXIT.             41240002
.KNOTMT  AIF   (N'&K EQ 2).KHAS2  SEE IF THERE ARE EXACTLY 2 OPERANDS  *41248002
                         IN THE K PARAMETER.                            41256002
         AIF   (N'&K NE 1).KMNOTE  SEE IF THERE IS JUST ONE.            41264002
&X       SETC  '&K(1)'(1,1)  GET THE FIRST CHARACTER OF THE FIRST      *41272002
                         ELEMENT IN THE K PARAMETER.                    41280002
         AIF   ((('&X' EQ '0')OR('&X' EQ '1')OR('&X' EQ '2')OR('&X' EQ *41288002
               '3')OR('&X' EQ '4')OR('&X' EQ '5')OR('&X' EQ '6')OR('&X'*41296002
                EQ '7')OR('&X' EQ '8')OR('&X' EQ '9'))).K1#             41304002
         LA    0,&K                                                     41312002
         LH    1,*-2     OFFSET TO KEY + BASE REGISTER.                 41320002
         N     1,=XL4'00000FFF'  ELIMINATE BASE REGISTER.               41328002
         SLL   1,7                                                      41336002
         LA    0,&IGARPT#.(,1)  RPT TYPE.                               41344002
&X       SETC  'L'''                                                    41352002
         LA    1,&X&K                                                   41360002
         SLL   0,16                                                     41368002
         ALR   0,1                                                      41376002
         AGO   .GETMAP   GO SEE IF THE MAP IS CODED.                    41384002
.K1#     L     0,=AL4(B'1000000000'*&IGARPT#+&K)  RPT# &KL.             41392002
         MNOTE 0,'DISPLACEMENT TO KEY ASSUMED ZERO.'                    41400002
         AGO   .GETMAP   ALL DONE WITH K NOW.                           41408002
.KHAS2   ANOP                                                           41416002
         AIF   (K'&K(1) EQ 0).KDSP0  CHECK FOR A ZERO DISPLACEMENT.     41424002
         AIF   ('&K(1)' EQ '0').KDSP0  SEE IF THE ZERO DISPLACEMENT IS *41432002
                         EXPLICITLY CODED.                              41440002
         LA    1,&K(1)   DISPLACEMENT TO THE KEY.                       41448002
         SLL   1,7                                                      41456002
         LA    0,&IGARPT#.(,1)  RPT TYPE.                               41464002
         AGO   .GOTKDSP  ALL FINISHED SETTING UP DISPLACEMENT AND RPT  *41472002
                         TYPE NOW.                                      41480002
.KDSP0   LA    0,&IGARPT#  RPT TYPE.                                    41488002
.GOTKDSP SLL   0,9                                                      41496002
         LA    1,&K(2)   KEY LENGTH IN BYTES.                           41504002
         ALR   0,1                                                      41512002
.GETMAP  ANOP                                                           41520002
         AIF   (K'&MAP EQ 0).NOMAP  SEE IF THE ADDRESS OF THE MAPPING  *41528002
                         SUBROUTINE IS SPECIFIED.                       41536002
         AIF   ('&MAP' EQ '0').NOMAP  SEE IF IT IS EXPLICITLY CODED AS *41544002
                         ZERO.                                          41552002
         AIF   ('&MAP'(1,1) EQ '(').MAPGPR  SEE IF THE ADDRESS OF THE  *41560002
                         MAPPING SUBROUTINE IS IN A GENERAL REGISTER.   41568002
         L     1,=AL4(&MAP)  ADDRESS OF MAPPING SUBROUTINE.             41576002
         AGO   .GOTMAP   ALL FINISHED SETTING UP REGISTER 1 NOW.        41584002
.MAPGPR  LR    1,&MAP(1)  ADDRESS OF MAPPING SUBROUTINE.                41592002
         AGO   .GOTMAP   ALL DONE WITH R1 NOW.                          41600002
.NOMAP   SLR   1,1       INDICATE NO MAPPING SUBROUTINE PRESENT.        41608002
.GOTMAP  ANOP                                                           41616002
.********************************************************************** 41624002
.* CHECK THE INNER VERTEX SIZE FOR 8 OR 12 BYTES, AND SET BIT 0 OF    * 41632002
.* REGISTER R1 TO 0 IF IT IS 8 BYTES, OR TO 1 IF IT IS 12 BYTES. IF IT* 41640002
.* IS NEITHER 8 NOR 12 BYTES GENERATE THE MNOTE.                      * 41648002
.********************************************************************** 41656002
         AIF   ('&IGARPT#' NE '8').SKIPIVS  SEE IF THIS IS A TYPE 8    *41664002
                         RPT.                                           41672002
         AIF   (K'&IVS EQ 0).IVSIS8  THE DEFAULT INNER VERTEX SIZE IS 8*41680002
                         BYTES.                                         41688002
         AIF   ('&IVS' EQ '8').IVSIS8  SEE IF THE INNER VERTEX SIZE IS *41696002
                         8 BYTES.                                       41704002
         AIF   ('&IVS' EQ '12').IVSIS12  SEE IF THE INNER VERTEX SIZE  *41712002
                         IS 12 BYTES.                                   41720002
         MNOTE 12,'INVALID INNER VERTEX SIZE, CAN ONLY BE 8 OR 12.'     41728002
         AGO   .IVSFIN   GO ON AND CHECK OTHER THINGS.                  41736002
.IVSIS8  LA    1,0(,1)   SET BIT 0 TO 0 FOR IVS=8.                      41744002
         AGO   .IVSFIN   ALL DONE SETTING UP R1 NOW.                    41752002
.IVSIS12 O     1,=XL4'80000000'  INDICATE IVS=12.                       41760002
.IVSFIN  ANOP                                                           41768002
.SKIPIVS ANOP                                                           41776002
.********************************************************************** 41784002
.* LINK TO THE STREE SUBROUTINE IN THE MODULE IGARPT01. IF THE C      * 41792002
.* PARAMETER IS CODED "C=Y", "C=1", OR "C=" THEN A BAL IS GENERATED TO* 41800002
.* INDICATE CONDITIONAL GSPACE/GETMAIN OPERATIONS. IF "C=N" OR "C=0"  * 41808002
.* IS CODED THE REQUEST IS UNCONDITIONAL, AND A BALR IS GENERATED FOR * 41816002
.* THE LINK TO THE STREE ROUTINE IN THE MODULE IGARPT01.              * 41824002
.********************************************************************** 41832002
         AIF   (K'&C EQ 0).LINKC  SEE IF THE C PARAMETER IS NOT CODED.  41840002
         AIF   ('&C' EQ 'C').LINKC  SEE IF IT A CONDITIONAL REQUEST.    41848002
         AIF   (('&C'(1,1) NE 'Y')AND('&C' NE '1')).LINKU  SEE IF THE  *41856002
                         REQUEST IS UNCONDITIONAL.                      41864002
.LINKC   BAL   14,&IGASTRE.(,14)  INDICATE CONDITIONAL GSPACE/GETMAIN.  41872002
         AGO   .TREE     ALL DONE NOW, EXCEPT FOR THE REGISTER TO      *41880002
                         CONTAIN THE TREE ADDRESS.                      41888002
.LINKU   LA    14,&IGASTRE.(,14)                                        41896002
         BALR  14,14     INDICATE UNCONDITIONAL GSPACE/GETMAIN.         41904002
.TREE    ANOP                                                           41912002
         AIF   (K'&TREE EQ 0).STR5R1   GO IF IT'S TO BE LEFT IN R1.     41920002
         AIF   ('&TREE'(1,1) NE '(').STR5L   GO IF IT'S NOT A REGISTER. 41928002
         AIF   ('&TREE' EQ '(1)').STR5R1  GO IF IT'S ALREADY THERE.     41936002
         LR    &TREE(1),1      SAVE THE TREE ADDRESS.                   41944002
         AGO   .STR5R1         MERGE.                                   41952002
.STR5L   ST    1,&TREE(1)  STORE THE TREE ADDRESS.                      41960002
.STR5R1  ANOP                                                           41968002
         AIF   ('&IGARPT#' NE '5').END  SEE IF THIS IS A TYPE 5 TREE.   41976002
      RPTDSECT T=5,DS=YES  GENERATE THE DSECT FOR TYPE 5 TREES.         41984002
.END     ANOP                                                           41992002
.FIN     ANOP                                                           42000002
         MEND                                                           42008002
         EJECT                                                          42016002
         MACRO                                                          42024002
&TAG     TSORT &TREE,&OFFSET=0,&KEYL=256                                42032002
.*A000000                                                        Y02147 42040002
.********************************************************************** 42048002
      RPTDSECT                                                          42056002
LJW&SYSNDX EQU 1                                                        42064002
         USING IGARPTH,LJW&SYSNDX  BASE REGISTER FOR DSECT.             42072002
         AIF   (K'&TREE EQ K'&TREE(1)+2).LW0                            42080002
&TAG     L     1,&TREE                                                  42088002
         AGO   .LW1                                                     42096002
.LW0     ANOP                                                           42104002
&TAG     LR    1,&TREE(1)                                               42112002
.LW1     ANOP                                                           42120002
         AIF   (K'&OFFSET EQ K'&OFFSET(1)+2).LW2                        42128002
         LA    0,&OFFSET       OFFSET TO KEY IN RECORD.                 42136002
         STH   0,OFFSET                                                 42144002
         AGO   .LW3                                                     42152002
.LW2     ANOP                                                           42160002
         STH   &OFFSET(1),OFFSET                                        42168002
.LW3     ANOP                                                           42176002
         AIF   ('&KEYL'(1,1) EQ '(').LW4                                42184002
         LA    0,&KEYL                                                  42192002
         STH   0,KEYL                                                   42200002
         AGO   .LW5                                                     42208002
.LW4     STH   &KEYL(1),KEYL                                            42216002
.LW5     ANOP                                                           42224002
         DROP  LJW&SYSNDX                                               42232002
         ISCAN (1)                                                      42240002
SCAN&SYSNDX SCANL (1)                                                   42248002
         LTR   15,15                                                    42256002
         BC    8,END&SYSNDX                                             42264002
DEL&SYSNDX DEL (1),FREE=NO                                              42272002
         O     15,=XL4'80000000'                                        42280002
        FSPACE (1),A=(15)                                               42288002
         SCANL (1)                                                      42296002
         LTR   15,15                                                    42304002
         BC    7,DEL&SYSNDX                                             42312002
GSP&SYSNDX GSPACE (1)                                                   42320002
         LTR   15,15                                                    42328002
         BC    10,FIN&SYSNDX                                            42336002
LWR&SYSNDX EQU 1                                                        42344002
         USING IGARPTH,LWR&SYSNDX                                       42352002
         AH    15,OFFSET                                                42360002
         DROP  LWR&SYSNDX                                               42368002
         SRCH  (1),SARG=(15)                                            42376002
         INS   (1),MOVE=NO                                              42384002
         BC    15,GSP&SYSNDX                                            42392002
FIN&SYSNDX EQU *                                                        42400002
        FSPACE (1),A=(15)                                               42408002
END&SYSNDX EQU *                                                        42416002
         MEND                                                           42424002
         EJECT                                                          42432002
         MACRO                                                          42440002
&TAG     FOP   &R                                                       42448002
&TAG     CLI   0(&R),C' '      SEEEE IF THE FIRST COLUMN IS BLANK?.     42456002
         BC    8,LA1&SYSNDX    BRANCH IF THERE ISN'T ANY LABEL.         42464002
LA0&SYSNDX LA  &R,1(&R)        ADD ONE TO THE ADDRESS IN THE REGISTER.  42472002
         CLI   0(&R),C' '      SEE IF THE LABEL IS PASSED BY TO MORE.   42480002
         BC    7,LA0&SYSNDX    BRANCH AS LONG AS THE LABEL ISN'T PASSED 42488002
LA1&SYSNDX LA  &R,1(&R)  NOW KEEP LOOKING UNTIL THE OP CODE FIELD IS    42496002
         CLI   0(&R),C' '      FOUND BY FINDING NOT A BLANK.            42504002
         BC    8,LA1&SYSNDX    XX                                       42512002
         MEND                                                           42520002
         MACRO                                                          42528002
&TAG     DSPRPT &TREE                                                   42536002
         GBLB  &DSPRPT  IF THE GLOBAL ON DO IT;                         42544002
         GBLC  &IGADSP         BRANCH ENTRY OFFSET FOR DSPRPT.          42552002
         LCLC  &R                                                       42560002
         AIF   (K'&TAG EQ 0).NOLAB                                      42568002
&TAG     EQU   *                                                        42576002
.NOLAB   AIF   (NOT &DSPRPT).FIN  DO IT NOT IF IT NOT ON.               42584002
       RPTDSECT TYPE=8                                                  42592002
&R       SETC  ''                                                       42600002
         AIF   ('&TREE'(1,1) NE '(').LOADIT                             42608002
         AIF   ('&TREE' EQ '(1)').DONTLOD                               42616002
&R       SETC  'R'                                                      42624002
.LOADIT  L&R   1,&TREE(1)                                               42632002
.DONTLOD ANOP                                                           42640002
         L     15,0(0,1)       LOAD THE ADDRESS OF IGARPT01.            42648002
         BAL   14,&IGADSP.(0,15)  LINK TO DSPRPT.                       42656002
.FIN     ANOP                                                           42664002
         MEND                                                           42672002
         MACRO                                                          42680002
         RASS  &A                                                       42688002
         LCLA  &I                                                       42696002
         LCLA  &J                                                       42704002
         LCLA  &N                                                       42712002
.********************************************************************** 42720002
&N       SETA  (N'&A)                                                   42728002
&I       SETA  (1)                                                      42736002
.LW0     ANOP                                                           42744002
&J       SETA  (1+&I)                                                   42752002
         AIF   (&J GT &N).END                                           42760002
&A(&I)   EQU  &A(&J)                                                    42768002
&I       SETA  (&I+2)                                                   42776002
         AGO   .LW0                                                     42784002
.END     ANOP                                                           42792002
         MEND                                                           42800002
         MACRO                                                          42808002
&TAG     BIT   &I=,&A=,&B=,&J=,&N=                                      42816002
.*--------------------------------------------------------------------* 42824002
.* THIS MACRO COMPUTES THE INDEX OF THE BIT OF INEQUALITY BETWEEN THE * 42832002
.* TWO BYTES ADDRESSED BY THE ADDRESSES IN REGISTERS &A AND &B.       * 42840002
.* &J AND &N ARE TWO WORKING REGISTERS; UPON EXECUTION OF THIS MACRO  * 42848002
.* THEY  BOTH  MUST CONTAIN ZEROS IN THE LEFT THREE BYTES.            * 42856002
.* &I IS A REGISTER THAT WAS PREVIOUSLY SET TO THE NEGATIVE OF THE    * 42864002
.* ADDRESS OF THE FIRST BYTE OF THE A-FIELD.                          * 42872002
.* THE RESULTING BIT INDEX IS LEFT IN REGISTER &I.                    * 42880002
.*--------------------------------------------------------------------* 42888002
&TAG     IC    &J,O(O,&A)  FETCH THE TWO BYTES OF INEQUALITY FROM THE   42896002
         IC    &N,O(O,&B)  TWO OPERANDS.                                42904002
         ALR   &I,&A     COMPUTE THE INDEX OF THE BYTE OF INEQUALITY.   42912002
         SLL   &I,THREE  TRANSFORM THE BYTE INDEX INTO A BIT INDEX.     42920002
         XR    &N,&J     GET THE EXCLUSIVE-OR RESULT OF THE TWO BYTES.  42928002
BIT&SYSNDX LA  &J,X'FF'(O,&N)  SUBTRACT ONE FROM THE 8-BIT #.           42936002
         NR    &N,&J     MAKE THE RIGHTMOST BIT A ZERO.                 42944002
         BC    7,BIT&SYSNDX KEEP DOING THIS UNTIL THERE IS ONLY ONE BIT 42952002
*                        LEFT.                                          42960002
         IC    &N,INSBIT-X'FF'(&J)  GET THE INDEX OF THE BIT OF         42968002
*                        INEQUALITY FROM THE TABLE.                     42976002
         ALR   &I,&N     ADD THE BIT INDEX INTO THE SHIFTED BYTE TO     42984002
*                        FORM THE COMPLETE BIT INDEX.                   42992002
         MEND                                                           43000002
         MACRO                                                          43008002
&TAG     ICALL &SUBR                                                    43016002
.********************************************************************** 43024002
         AIF   ('&SUBR'(1,1) EQ '(').NOPAREN     SEE IF THERE ARE      *43032002
                         ALREADY PARENTHESES AROUND THE ADDRESS.        43040002
&TAG     L     15,=AL4(&SUBR)                                           43048002
         AGO   .LINK                                                    43056002
.NOPAREN L     15,=AL4&SUBR                                             43064002
.LINK    ANOP                                                           43072002
         BALR  14,15                                                    43080002
         MEND                                                           43088002
         MACRO                                                          43096002
&TAG     CHXN  &N=,&W=,&A=                                              43104002
.* CONVERT THE NUMBER IN DOUBLE-DIGIT PRINTABLE FORM STARTING AT THE  * 43112002
.* ADDRESS IN REGISTER &A TO A BINARY NUMBER IN REGISTER &N.          * 43120002
.* REGISTER &W IS JUST A WORKING REGISTER.                            * 43128002
.* STOP WHEN A CHARACTER IS FOUND THAT IS NEITHER IN THE RANGE X'C0'  * 43136002
.* TO X'C5' NOR IN THE RANGE X'F0'-X'F9'.                             * 43144002
.* THE ADDRESS IN REGISTER A IS LEFT AT THE FIRST NON-DIGIT.          * 43152002
&TAG     SLR   &N,&N         ZERO OUT THE NUMBER.                       43160002
         BCTR  &A,0      SUBTRACT ONE FOR A TRAILING LOOP DECISION.     43168002
         LR    &W,&N   ZERO OUT THE WORKING REGISTER.                   43176002
SLL&SYSNDX SLL &N,4  SHIF LEFT 4, THUS MULTIPLYING BY SIXTEEN.          43184002
         ALR   &N,&W  ADD IN THE NEXT DIGIT.                            43192002
         IC    &W,1(0,&A)  PICK UP THE NEXT DIGIT.                      43200002
         CLI   0(&A),C'0'  TEST IT FOR A ZERO TO NINE.                  43208002
         BC    10,NUM&SYSNDX                                            43216002
         LA    &W,(X'FA'-C'A')(0,&W)  IT'S LESS, MUST BE A LETTER.      43224002
NUM&SYSNDX SL  &W,=AL4(C'0')  MAKE IT A 0-ORIGIN NUMBER.                43232002
         CL    &W,=F'15'  SEE IF IT REALLY IS A DIGIT.                  43240002
         LA    &A,1(0,&A)  EKE THE ADDRESS.                             43248002
         BC    12,SLL&SYSNDX  CONTINUE THE LOOP IF IT'S A DIGIT.        43256002
         MEND                                                           43264002
         MACRO                                                          43272002
&TAG     GOING &A                                                       43280002
.********************************************************************** 43288002
&TAG     BALR  15,0            ESTABLISH ADDRESSABILITY.                43296002
         USING *,15                                                     43304002
BAS&SYSNDX EQU *                                                        43312002
         STM   14,12,12(13)    SAVE ALL THE REGISTERS.                  43320002
         LA    15,SAV&SYSNDX                                            43328002
         DROP  15                                                       43336002
         ST    15,8(0,13)                                               43344002
         ST    13,4(0,15)                                               43352002
         LR    13,15                                                    43360002
         LA    &A,SAV&SYSNDX+2-BAS&SYSNDX  ADJUST THE BASE SO THAT IT   43368002
         LCR   &A,&A  AGREES WITH THE ADDRESS IN                        43376002
         ALR   &A,15  REGISTER 15 ON ENTRY TO THE SUBROUTINE.           43384002
         USING BAS&SYSNDX-2,&A     XX                                   43392002
         BC    15,FIN&SYSNDX                                            43400002
SAV&SYSNDX DS 18F                                                       43408002
FIN&SYSNDX EQU *                                                        43416002
         MEND                                                           43424002
         MACRO                                                          43432002
&TAG     BACK                                                           43440002
.********************************************************************** 43448002
&TAG     L     13,4(13)                                                 43456002
         L     14,12(13)                                                43464002
         LM    0,12,20(13)                                              43472002
         SLR   15,15     SET THE RETURN CODE TO ZERO.                   43480002
         BCR   15,14                                                    43488002
         MEND                                                           43496002
         MACRO                                                          43504002
&TAG     FBI   &I=,&A=,&B=,&LV=,&WRK=,&ERROR=                           43512002
.********************************************************************** 43520002
.* THIS MACRO FINDS THE INDEX OF THE BYTE OF INEQUALITY BETWEEN THE   * 43528002
.* TWO FIELDS SPECIFIED IN REGISTERS &A AND &B,                       * 43536002
.*                                                                    * 43544002
.* &LV IS THE REGISTER CONTAINING THE LENGTH OF THE TWO FIELDS IN BYTES 43552002
.* IF IT SPECIFIES A REGISTER, OR IT IS THE LENGTH OF THE TWO FIELDS. * 43560002
.* E. G. IF LV=(4) IS CODED, THE LENGTH IIS TAKEN FROM REGISTER 4,    * 43568002
.* BUT IF LV=15 IS CODED, THE FIELDS ARE OF LENGTH 15.                * 43576002
.* A MAXIMUM OF 256 CAN BE CODED FOR THE LENGTH VALUE.                * 43584002
.* &I IS THE REGISTER TO LEAVE THE RESULTING BIT-INDEX IN.            * 43592002
.* &WRK IS A WORKING REGISTER, AND MUST BE SPECIFIED.                 * 43600002
.* &ERROR IS A BRANCH ADDRESS FOR THE ERROR CONDITION OF LENGTH ZERO. * 43608002
.*                                                                    * 43616002
.*       NOTE: NONE OF THE REGISTERS CAN BE REGISTER 0 EXCEPT &I.     * 43624002
.*       IMPORTANT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   * 43632002
.********************************************************************** 43640002
         GBLB  &IGAVS2,&IGADIAG                                         43648002
         LCLC  &J,&N,&O,&K1,&K2,&K3,&K4                                 43656002
&O       SETC  '0'       JUST A ZERO.                                   43664002
&K1      SETC  '1'       JUST A ONE.                                    43672002
&K2      SETC  '2'       JUST A TWO.                                    43680002
&K3      SETC  '3'       JUST A THREE.                                  43688002
&K4      SETC  '4'       JUST A FOUR.                                   43696002
&N       SETC  '&WRK(1)'       THE 0-ORIGIN INDEX OF THE LAST BYTE OF   43704002
.*                             THE REMAINING PART OF THE KEY.           43712002
&J       SETC  '&LV(1)'        THE CURRENT MIDDLE OF WHAT'S LEFT INDEX. 43720002
         AIF   (K'&TAG EQ 0).SKIP                                       43728002
&TAG     EQU   *                                                        43736002
.SKIP    ANOP                                                           43744002
         AIF   (K'&ERROR EQ 0).SKIP2   SEE IF THE ERROR CHECK SHOULD    43752002
         LTR   &J,&J     CHECK FOR A ZERO LENGTH VALUE.                 43760002
         BC    8,&ERROR        BRANCH IF THERE IS ZERO LENGTH.          43768002
.SKIP2   ANOP                                                           43776002
         LCR   &I,&A(1)  SAVE THE NEGATIVE OF ONE OF THE ADDRESSES.     43784002
         AIF   ((&IGAVS2 AND (NOT &IGADIAG))).USECLCL                   43792002
         BCTR  &J,&O     SUBTRACT ONE FOR 0-ORIGIN INDEXING.            43800002
LOOP&SYSNDX LTR &N,&J          TEST FOR THE END OF THE LOOP.            43808002
         JMP   8,BYTE&SYSNDX  BRANCH IF THE LAST ITERATION IS DONE.     43816002
SRL&SYSNDX SRL &J,&K1          DIVIDE BY TWO BY SHIFTING.               43824002
         EX    &J,CLC&SYSNDX  COMPARE HALF OF THE KEY.                  43832002
         JMP   7,LOOP&SYSNDX  JUMP IF THE BYTE OF INEQUALITY IS IN      43840002
*                              THE FIRST HALF OF THE REMAINING PART.    43848002
         LA    &J,&K1.(&O,&J)  ADD ONE TO MAKE UP FOR 0-ORIGIN.         43856002
         SLR   &N,&J     SUBTRACT THE NUMBER OF BYTES ELIMINATED.       43864002
         ALR   &A,&J           EKE THE TWO ADDRESSES OF THE TWO         43872002
         ALR   &B,&J     FIELDS BEING COMPARED.                         43880002
         LTR   &J,&N     CHECK FOR THE LAST ITERATION.                  43888002
         JMP   7,SRL&SYSNDX    JUMP IF BINARY SEARCH NOT YET DONE.      43896002
BYTE&SYSNDX EQU *  COME HERE WHEN THE BYTE IS FOUND.                    43904002
CLC&SYSNDX CLC &O.(&O,&A),&O.(&B)  COMPARE THE BYTE OF INEQUALITY,      43912002
*                        AND LEAVE THE CONDITION CODE SET.              43920002
         AIF   (NOT (&IGAVS2 AND &IGADIAG)).FIN                         43928002
         BC    7,NOT&SYSNDX    THESE THREE INSTRUCTIONS ARE TO GENERATE 43936002
         LA    &A,ONE(O,&A)  AN EXACT DUPLICATE OF THE RESULTS OF THE   43944002
         LA    &B,ONE(O,&B)  CLCL INSTRUCTION FOR TESTING.              43952002
NOT&SYSNDX EQU *                                                        43960002
         AGO   .FIN                                                     43968002
.USECLCL LR    &N,&J  PUT THE LENGTH IN THE OTHER LENGTH REGISTER FOR   43976002
         DC    AL2(X'0F00'+(16*&A)+&B)  THE CLCL INSTRUCTION.           43984002
.FIN     ANOP                                                           43992002
         MEND                                                           44000002
         EJECT                                                          44008002
         MACRO                                                          44016002
&TABLE   TABLE &A                                                       44024002
.********************************************************************** 44032002
.* THIS MACRO GENERATES A 256 BYTE TABLE, AND FILLS IN THE BYTES AT   * 44040002
.* THE LOCATIONS SPECIFIED BY THE FIRST MEMBERS OF EACH PAIR OF       * 44048002
.* ELEMENTS IN THE LIST WITH ONE-BYTE AL1 CONSTANTS SPECIFIED BY THE  * 44056002
.* CORRESPONDING SECOND MEMBERS OF EACH PAIR IN THE LIST.             * 44064002
.* THE REST OF THE BYTES ARE SET TO ZEROS.                            * 44072002
.********************************************************************** 44080002
         LCLA  &I,&N                                                    44088002
         LCLC  &C                                                       44096002
&TABLE   DC    256XL1'00'                                               44104002
&C       SETC  'X''FF'''                                                44112002
&N       SETA  N'&A                                                     44120002
&I       SETA  (1)                                                      44128002
.LOOP    ORG   *+&A(&I)-1-&C                                            44136002
         DC    AL1(&A(&I+1))                                            44144002
&C       SETC  '&A(&I)'                                                 44152002
&I       SETA  (&I+2)                                                   44160002
         AIF   (&I LT &N).LOOP                                          44168002
         ORG   *-1-&C+X'100'                                            44176002
         MEND                                                           44184002
         MACRO                                                          44192002
&TAG     JMP   &CC,&JUMP                                                44200002
         GBLB  &IGASPIE  TURN ON FOR SPIE BRANCH TRACE.                 44208002
         AIF   ('&JUMP'(1,1) NE '(').RX  SEE IF IT IS AN RX BRANCH.     44216002
         AIF   (&IGASPIE).CNTRSPY  GO IF IT'S AN RR JUMP.               44224002
&TAG     BCR   &CC,&JUMP(1)                                             44232002
         AGO   .NOSPY                                                   44240002
.CNTRSPY ANOP                                                           44248002
&TAG     DC    AL2(X'0D00'+(16*&CC)+&JUMP(1))                           44256002
         AGO   .NOSPY                                                   44264002
.NOSPY   AGO   .FIN                                                     44272002
.RX      ANOP                                                           44280002
&TAG     BC &CC,&JUMP                                                   44288002
         AIF   (NOT &IGASPIE).USPY     GO IF NO BRANCH TRACE.           44296002
         ORG   *-4       OVERLAY THE OP CODE WITH X'4D'                 44304002
         DC    XL1'4D'                                                  44312002
         ORG   *+3                                                      44320002
.USPY    ANOP                                                           44328002
.FIN     ANOP                                                           44336002
         MEND                                                           44344002
         MACRO                                                          44352002
&TAG     JM    &JUMP                                                    44360002
&TAG     JMP   4,&JUMP                                                  44368002
         MEND                                                           44376002
         MACRO                                                          44384002
&TAG     JNZ   &JUMP                                                    44392002
&TAG     JMP   7,&JUMP                                                  44400002
         MEND                                                           44408002
         MACRO                                                          44416002
&TAG     JZ    &JUMP                                                    44424002
&TAG     JMP   8,&JUMP                                                  44432002
         MEND                                                           44440002
         MACRO                                                          44448002
&TAG     SHOWHEX &TO=,&FROM=,&N=                                        44456002
         GBLB  &IGADSHX  ON AFTER THE CSECT TO DISPLAY HEX HAS BEEN    *44464002
                         GENERATED ONCE.                                44472002
.********************************************************************** 44480002
&TAG     LA    1,&TO     DESTINATION ADDRESS.                           44488002
         LA    2,&FROM   SOURCE ADDRESS.                                44496002
         LA    3,&N      NUMBER OF SOURCE BYTES.                        44504002
         L     15,=AL4(IGADSPHX)                                        44512002
         BALR  14,15     CALL THE CONVERSION SUBROUTINE.                44520002
         AIF   (&IGADSHX).END  SEE IF THE CSECT HAS ALREADY BEEN DONE.  44528002
&IGADSHX SETB  (1)       SET IT ON TO INDICATE THAT THE CSECT TO DISPLAY44536002
                         HEX HAS ALREADY BEEN GENERATED.                44544002
IGADSPHX CSECT                                                          44552002
         USING *,15                                                     44560002
* R1 IS THE DESTINATION ADDRESS.                                      * 44568002
* R2 IS THE SOURCE ADDRESS.                                           * 44576002
* R3 IS THE LENGTH OF THE SOURCE FIELD IN BYTES.                      * 44584002
         ALR   3,3       DOUBLE THE FIELD LENGTH.                       44592002
         BCTR  3,0                                                      44600002
         EX    3,IGADSPMV      MOVE IN THE PATTERN.                     44608002
         EX    3,IGADSPTR      MOVE FIELD TO OUTPUT AREA (TWICE).       44616002
         EX    3,IGADSPNC      KNOCK OFF THE REDUNDANT BITS.            44624002
         EX    3,IGADSPCV      CONVERT TO EBCDIC REPRESENTATION.        44632002
         BR    14        IT'S ALL OVER NOW.                             44640002
IGADSPMV MVC   0(0,1),IGAX0011  MOVE IN THE PATTERN.                    44648002
IGADSPTR TR    0(0,1),0(2)     THIS TRANSLATE IS REALLY A MOVE.         44656002
IGADSPNC NC    0(0,1),IGADSPF0  KNOCK OFF THE REDUNDANT BITS.           44664002
IGADSPCV TR    0(0,1),IGADSPTB  CONVERT TO EBCDIC REPRESENTATION.       44672002
IGADSPTB DC    CL16'0123456789ABCDEF'                                   44680002
         DC    15CL15'123456789ABCDEF'                                  44688002
IGAX0011 DC    256AL1((*-IGAX0011)/2)  X'0001010202...' ETC..           44696002
IGADSPF0 DC    128XL2'F00F'                                             44704002
         DROP  15                                                       44712002
&SYSECT  CSECT                                                          44720002
.END     ANOP                                                           44728002
         MEND                                                           44736002
         EJECT                                                          44744002
         MACRO                                                          44752002
&TAG     NTR   &RASS=,&BR=12,&SAVE=(14,12),&S=,&LV=80,&R1=,&R0=,&SP=,  *44760002
               &I=NO,&MODE=                                             44768002
.*--------------------------------------------------------------------* 44776002
.* THIS MACRO SAVES THE REGISTERS FROM THE &SAVE PARAMETER IN THE     * 44784002
.* SAVE AREA ADDRESSED BY REGISTER 13, ESTABLISHES ADDRESSABILITY IN  * 44792002
.* THE REGISTER SPECIFIED BY &BR, AND GETS SPACE FOR ANOTHER SAVE AREA* 44800002
.* THE ISPACE MACRO IS THEN EXECUTED, AND THE SPACE ADDRESS IS STORED * 44808002
.* INTO THE MAIN STORAGE LOCATION OR REGISTER SPECIFIED BY THE &S     * 44816002
.* PARAMETER.                                                         * 44824002
.* MODULE IGARPT01 IS GENERATED, WHICH CONTAINS THE GSPACE SUBROUTINES. 44832002
.* THE SUBPOOL CAN BE SPECIFIED BY CODING THE &SP PARAMETER.          * 44840002
.* AN 80 BYTE SAVE AREA IS OBTAINED VIA GSPACE, AND IS CHAINED BACK   * 44848002
.* TO THE OLD SAVE AREA.                                              * 44856002
.* THE GLOBAL VARIABLE &IGALONE IS ON WHEN THE PROGRAM IS BEING UNIT  * 44864002
.* TESTED.                                                            * 44872002
.* IF THE R1 PARAMETER IS CODED, THE CONTENTS OF REGISTER R1 ARE MOVED* 44880002
.* TO THE SPECIFIED LOCATION BEFORE REGISTER R1 IS USED FOR THE GSPACE. 44888002
.*--------------------------------------------------------------------* 44896002
          GBLB  &IGALONE  ON TO UNIT TEST THE PROGRAM (I. E.STANDALONE) 44904002
         GBLB  &IGADSEK        ON IF THE TCB DSECT HAS BEEN GENERATED.  44912002
         GBLB  &IGARASS  ON IF THE REGISTER AND OTHER EQUATES ARE DONE. 44920002
         LCLA  &O                                                       44928002
         LCLC  &S1,&S2   THIS IS FOR THE TWO REGISTERS IN THE SAVE LIST 44936002
.*                       IN THE &SAVE PARAMETER.                      * 44944002
.*--------------------------------------------------------------------* 44952002
         AIF   (K'&RASS EQ 0).DIDRASS  SEE IF THE RASS PARAMETER IS    *44960002
                         CODED.                                         44968002
         AIF   (('&RASS'(1,1) NE 'Y')AND('&RASS'(1,1) NE '1')).DIDRASS *44976002
                         SEE IF IT IS EITHER ALREADY DONE OR IT IS     *44984002
                         CODED "NO".                                    44992002
         AIF   (&IGARASS).DIDRASS  GO IF RASS IS ALREADY DONE.          45000002
&IGARASS SETB  (1)  TURN IT ON SO THAT IT IS TURNED OFF.                45008002
R0       EQU   0         GPR 0 EQUATE.                                  45016002
R1       EQU   1         R1 EQU.                                        45024002
R2       EQU   2                                                        45032002
R3       EQU   3         R3 EQU.                                        45040002
R4       EQU   4         R4 EQU.                                        45048002
R5       EQU   5         R5 EQU                                         45056002
R6       EQU   6         R6 EQU.                                        45064002
R7       EQU   7         R7 EQU.                                        45072002
R8       EQU   8         R8                                             45080002
R9       EQU   9         R9 EQU.                                        45088002
R10      EQU   10        R10   EQUATE.                                  45096002
RA       EQU   10        R10 EQU.                                       45104002
R11      EQU   11        R11 EQU.                                       45112002
RB       EQU   11        R11 EQU.                                       45120002
R12      EQU   12        R12 EQU.                                       45128002
RC       EQU   12        R12 EQU.                                       45136002
R13      EQU   13        R13 EQU.                                       45144002
RD       EQU   13        R13 EQU.                                       45152002
R14      EQU   14        R14 EQU.                                       45160002
RE       EQU   14        R14 EQU.                                       45168002
LKR      EQU   14        LINKAGE REGISTER.                              45176002
R15      EQU   15        R15 EQU.                                       45184002
RF       EQU   15        R15 EQU.                                       45192002
ZERO     EQU   0         MISCELLANEOUS CONSTANTS EVERY PROGRAM NEEDS.   45200002
ONE      EQU   1         XX                                             45208002
TWO      EQU   2         XX                                             45216002
THREE    EQU   3         XX                                             45224002
FOUR     EQU   4         XX                                             45232002
FIVE     EQU   5         XX                                             45240002
SIX      EQU   6         XX                                             45248002
SEVEN    EQU   7         XX                                             45256002
EIGHT    EQU   8         XX                                             45264002
NINE     EQU   9         XX                                             45272002
TEN      EQU   10        XX                                             45280002
ELEVEN   EQU   11        XX                                             45288002
TWELVE   EQU   12        XX                                             45296002
THIRTEEN EQU   13        XX                                             45304002
FOURTEEN EQU   14        XX                                             45312002
FIFTEEN  EQU   15                                                       45320002
SIXTEEN  EQU   16        XX                                             45328002
TWENTY   EQU   20        XX                                             45336002
.DIDRASS ANOP                                                           45344002
.*--------------------------------------------------------------------* 45352002
&S1      SETC  '&SAVE(1)'(1,K'&SAVE(1))  GET THE FIRST REGISTER OF THE *45360002
                         GROUP OF REGISTERS TO BE SAVED.                45368002
&S2      SETC  '&SAVE(2)'(1,K'&SAVE(2))  GET THE SECOND REGISTER OF THE*45376002
                         GROUP TO BE SAVED.                             45384002
&O       SETA  0    SET THE NUMBER OF BYTES GENERATED THUS FAR TO ZERO. 45392002
         AIF   (K'&SAVE EQ 0).NOSAVE  SEE IF THERE ARE ANY REGISTERS TO*45400002
                         BE SAVED THIS TIME.                            45408002
&O       SETA  4         FOUR BYTES GENERATED THUS FAR FOR THE STM     *45416002
                         INSTRUCTION.                                   45424002
&TAG     STM   &S1,&S2,((4*&S1)+20-64*((2+&S1)/16))(13)  SAVE REGS.     45432002
.NOSAVE  AIF   ((&O EQ 4)OR(K'&TAG EQ 0)).SKIP0  SEE IF THE TAG IS     *45440002
                         CODED AND THE STM WAS NOT GENERATED.           45448002
&TAG     EQU   *         PROVIDE A REFERENCE POINT FOR BRANCHES, ETC..  45456002
.SKIP0   ANOP                                                           45464002
         AIF   (N'&BR EQ 2).TWO  SEE IF THIS IS THE ENTRY POINT.        45472002
         BALR  &BR,0     ESTABLISH A BASE REGISTER.                     45480002
&O       SETA  (&O+2)  ADD THE LENGTH OF THE BALR INSTRUCTION.          45488002
         AIF   (K'&TAG EQ 0).NOLABEL  SEE IF THE LABEL IS THERE.        45496002
         USING &TAG,&BR  THE BASE REGISTER ADDRESSES THE LABEL.         45504002
         LCR   &BR(1),&BR(1)  CAUSE THE ADDRESS TO AGREE WITH           45512002
         LA    &BR(1),&O.(,&BR(1))  THE LABEL ON THE NTR MACRO.         45520002
         LCR   &BR(1),&BR(1)  DO THIS WITHOUT USING ANY OTHER GPRS.     45528002
         AGO   .JOIN     JOIN THE COMMON PATH.                          45536002
.NOLABEL USING *,&BR     ESTABLISH ADDRESSABILITY.                      45544002
         AGO   .JOIN     JOIN THE COMMON PATH.                          45552002
.TWO     AIF   ('&BR(1)' EQ '&BR(2)').TWOTOO       SEE IF THE SAME.     45560002
&O       SETA  (&O-4)                                                   45568002
         LR    &BR(1),&BR(2)  LOAD THE BASE REGISTER.                   45576002
.TWOTOO  AIF   (K'&TAG EQ 0).NOTAG                                      45584002
         USING &TAG,&BR(1)     ESTABLISH ADDRESSABILITY.                45592002
         AGO   .JOIN                                                    45600002
.NOTAG   USING *-&O,&BR(1)  PROVIDE ADDRESSABILITY.                     45608002
.JOIN    ANOP                                                           45616002
         AIF   (K'&R1 EQ 0).NOR1NOW                                     45624002
         AIF   ('&R1'(1,1) EQ '(').R1REG           SEE IF IT'S A REG.   45632002
         ST    1,&R1     SAVE THE PARAMETER LIST REGISTER CONTENTS.     45640002
         AGO   .NOR1NOW                                                 45648002
.R1REG   LR    &R1(1),1  SAVE THE PARAMETER LIST REGISTER.              45656002
.NOR1NOW ANOP                                                           45664002
.* THE STM AND THE USING ARE ALL FINISHED, NOW GET THE SAVE AREA.     * 45672002
         AIF   (('&I'(1,1) EQ 'Y')OR('&I'(1,1) EQ '1')).INIT           *45680002
                         SEE IF THE INITIALIZATION PARAMETER IS CODED  *45688002
                         SO AS TO INVOKE THE ISPACE MACRO-INSTRUCTION.  45696002
         AIF   ((K'&LV EQ 0)OR('&LV' EQ '0')).END  SEE IF THERE IS A   *45704002
                         ZERO LENGTH VALUE.                             45712002
         AIF   ('&MODE' EQ 'GETMAIN').GETMAIN  SEE IF THE MODE IS      *45720002
               GETMAIN INSTEAD OF GSPACE.                               45728002
        GSPACE R,S=&S,LV=&LV,SP=&SP  GET THE SPACE.                     45736002
         AGO   .SKIPIT                                                  45744002
.GETMAIN GETMAIN R,LV=&LV,SP=&SP  GET THE SAVE AREA VIA GETMAIN.        45752002
         AGO   .SKIPIT   ALL DONE GETTING THE SAVE AREA NOW.            45760002
.INIT   GSPACE S,S=&S,SP=&SP,LV=&LV                                     45768002
.SKIPIT  ANOP                                                           45776002
         ST    1,8(0,13)  STORE THE FORWARD CHAIN.                      45784002
         ST    13,4(0,1)  STORE THE BACK CHAIN FIELD.                   45792002
         LR    13,1      ADDRESS OF NEW SAVE AREA.                      45800002
.END     ANOP                                                           45808002
.FIN     ANOP                                                           45816002
         MEND                                                           45824002
         EJECT                                                          45832002
         MACRO                                                          45840002
&TAG     LEAF  &SAVE=(14,12),&RC=0,&SP=,&S=,&LV=80,&R0=,&R1=,&MODE=     45848002
.*--------------------------------------------------------------------* 45856002
.* THIS MACRO RELEASES THE SAVE AREA ADDRESSED BY REGISTER 13 TO THE  * 45864002
.* SYSTEM VIA THE FSPACE MACRO, AFTER SAVING THE BACK CHAIN WORD.     * 45872002
.* THE REGISTERS SPECIFIED BY THE S PARAMETER ARE THEN RESTORED USING * 45880002
.* THE SAVE AREA RECOVERED VIA THE BACK CHAIN WORD.                   * 45888002
.* THE RETURN CODE IS THEN SET USING THE RC PARAMETER. IF THE RC      * 45896002
.* PARAMETER SPECIFIES THE RETURN CODE IN A REGISTER (INDICATED BY    * 45904002
.* CODING THE REGISTER NAME OR NUMBER IN PARENTHESES), THEN THAT GPR  * 45912002
.* IS SAVED IN THE FORWARD CHAIN WORD OF THE SAVE AREA ACCESSED VIA   * 45920002
.* THE BACK CHAIN BEFORE THE REGISTERS ARE RESTORED. THEN THE VALUE   * 45928002
.* IS PLACED IN REGISTER 15. IF THE RETURN CODE IS NOT IN A REGISTER, * 45936002
.* THEN IT MUST BE A SUITABLE VALUE FOR THE OPERAND OF A LOAD ADDRESS * 45944002
.* INSTRUCTION.  FOR EXAMPLE, CODING THE LEAF MACRO AS:               * 45952002
.*       LEAF  SAVE=(6,8),RC=0  WILL RESULT IN REGISTERS 6-8 BEING    * 45960002
.* RESTORED AFTER THE SAVE AREA IS RELEASED. THEN THE RETURN CODE IS  * 45968002
.* IS SET TO ZERO, AND THE RETURN IS EXECUTED VIA BR 14.              * 45976002
.*--------------------------------------------------------------------* 45984002
.* LV=#  MEANS LR 1,13;  L 13,4(,13);  FSPACE;  LM;  BR 14.           * 45992002
.* LV=0  MEANS L 13,4(,13);  LM;  BR 14.                              * 46000002
.* LV=-0 MEANS L 13,4(,13);  LM;  L 13,4(,13);  BR 14                 * 46008002
.* LV=   MEANS LM;  BR 14.                                            * 46016002
         GBLB  &IGALONE  THIS IS ON FOR THE UNIT TEST OF FSPACE.        46024002
         GBLA  &IGAX     THE PENULTIMATE VERTEX ON THE PATH TO THE ATOM*46032002
                         IN THE BINARY PARSE TREE.                      46040002
         GBLA  &IGAZ     THE VERTEX ON THE END OF THE PATH TO THE ATOM. 46048002
         GBLA  &IGALEFT(256)  SUBTRACTION INVERTIBLE LEFT EDGES IN THE *46056002
                         BINARY PARSE TREE.                             46064002
         GBLA  &IGARGHT(256)  SUBTRACTION INVERTIBLE RIGHT EDGES IN THE*46072002
                         BINARY PARSE TREE.                             46080002
         GBLA  &IGALEVL  THE NUMBER OF PARENTHESES SURROUNDING THE     *46088002
                         CURRENT ATOM.                                  46096002
         GBLA  &IGAPATH(16)  THE PATH VECTOR TO THE ATOM IN THE PARSE  *46104002
                         TREE.                                          46112002
         LCLC  &S1,&S2,&SA                                              46120002
         LCLA  &Z,&TMPA  LOCAL VARIABLES TO CORRESPOND TO THOSE ABOVE.  46128002
         LCLC  &X        JUST A LOCAL CHARACTER VARIABLE.               46136002
&SA      SETC  '13'      USE THIS LOCAL NAME FOR REGISTER 13.           46144002
&X       SETC  '+20-64*'  USE THIS TO AVOID EXPRESSIONS THAT ARE TOO   *46152002
                         LONG.                                          46160002
         AIF   (K'&TAG EQ 0).NOTAG  SEE IF THE TAG IS CODED.            46168002
&TAG     EQU   *                                                        46176002
.NOTAG   AIF   (K'&LV EQ 0).CHKRC  SEE IF THE LENGTH VALUE IS THE EMPTY*46184002
                         STRING.                                        46192002
         AIF   ('&LV' EQ '0').LV0  SEE IF IT IS CODED AS "LV=0"         46200002
         AIF   ('&LV' EQ '-0').LV0  SEE IF THERE ARE TWO LEVELS OF SAVE*46208002
                         AREAS IN THE SAVE AREA STACK.                  46216002
.* LV=#BYTES IS CODED.                                                * 46224002
         AIF   (K'&R0 EQ 0).R0DONE  SEE IF R0 SHOULD BE SAVED THROUGH  *46232002
                         THE FSPACE.                                    46240002
         LR    &R0,0     SAVE R0 SO IT DOESN'T GET LOST DURING THE     *46248002
                         FSPACE MACRO-INSTRUCTION.                      46256002
.R0DONE  AIF   (K'&R1 EQ 0).R1DONE  SEE IF R1 SHOULD BE SAVED THROUGH  *46264002
                         THE FSPACE MACRO-INSTRUCTION.                  46272002
         LR    &R1,1     SAVE R1 SO THE FSPACE MACRO DOESN'T SMASH IT'S*46280002
                         CONTENTS.                                      46288002
.R1DONE  LR    1,13      ADDRESS OF SAVE AREA TO BE RELEASED.           46296002
         L     13,4(,13)  TRACE BACK TO PREVIOUS LEVEL SAVE AREA.       46304002
         AIF   ('&MODE' EQ 'FREEMAIN').FMAIN  SEE IF THE MODE IS TO USE*46312002
                         FREEMAIN TO FREE THE SAVE AREA.                46320002
        FSPACE R,LV=&LV,S=&S,SP=&SP,A=(1)  RELEASE THE SAVE AREA.       46328002
         AGO   .CHKR0    GO CHECK THE R0 PARAMETER NOW.                 46336002
.FMAIN FREEMAIN R,LV=&LV,SP=&SP,A=(1)  RELEASE THE SAVE AREA.           46344002
.CHKR0   ANOP                                                           46352002
         AIF   (K'&R0 EQ 0).DIDR0  SEE IF R0 HAS TO BE RESTORED.        46360002
         LR    0,&R0     RESTORE R0.                                    46368002
.DIDR0   AIF   (K'&R1 EQ 0).DIDR1  SEE IF R1 MUST BE RESTORED.          46376002
         LR    1,&R1     RESTORE R1.                                    46384002
.DIDR1   AGO   .CHKRC    GO CHECK THE RETURN CODE.                      46392002
.LV0     L     13,4(,13)  TRACE BACK TO PREVIOUS LEVEL SAVE AREA.       46400002
.CHKRC   AIF   (K'&RC EQ 0).LOAD#  SEE IF THE RETURN CODE IS CODED.     46408002
         AIF   ('&RC'(1,1) NE '(').LOAD#  SEE IF THE RETURN CODE IS    *46416002
                         CODED AS A NUMBER INSTEAD OF IN A REGISTER.    46424002
         LTR   15,&RC(1)  SET THE RETURN CODE AND SET THE CONDITION    *46432002
                         CODE.                                          46440002
.********************************************************************** 46448002
.* PARSE THE SAVE PARAMETER AND GENERATE ALL THE LOAD OR LOAD-MULTIPLE* 46456002
.* INSTRUCTIONS TO RESTORE ALL THE INDICATED REGISTERS.               * 46464002
.********************************************************************** 46472002
.LOAD#   AIF   (K'&SAVE EQ 0).L#FIN  SEE IF THERE ARE NO REGISTERS TO  *46480002
                         BE RESTORED.                                   46488002
      RPTDSECT LIST=&SAVE,SCAN=PARSE  PARSE THE SAVE PARAMETER.         46496002
      RPTDSECT SCAN=ISCAN                                               46504002
      RPTDSECT SCAN=NEXT  GET THE NEXT ATOM IN THE SAVE LIST.           46512002
         AIF   (&IGALEVL EQ 0).L#0  SEE IF THE SAVE PARAMETER ONLY HAS *46520002
                         ONE ELEMENT, NOT ENCLOSED IN PARENTHESES.      46528002
         AIF   (&IGALEVL EQ 1).L#1A  SEE IF THERE IS ONE LEVEL OF      *46536002
                         PARENTHESES, I.E. THE REGISTER IS ONLY A      *46544002
                         SINGLE REGISTER.                               46552002
         AIF   (&IGALEVL EQ 2).L#2  SEE IF THERE IS A PAIR OF REGISTERS*46560002
                         ENCLOSED IN PARENTHESES.                       46568002
         MNOTE 12,'TOO MANY NESTED LEVELS OF PARENTHESES-- SAVE PARAM.' 46576002
         AGO   .FIN                                                     46584002
.L#0     ANOP                                                           46592002
&S1      SETC  '&SAVE'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))                *46600002
                         GET THE REGISTER TO BE RESTORED.               46608002
         L     &S1,((4*&S1)+20-64*((2+&S1)/16))(,13) RESTORE THE GPR.   46616002
         AGO   .L#FIN    ALL DONE WITH THE RESTORING OF THE REGISTERS.  46624002
.L#1     ANOP                                                           46632002
&S1      SETC  '&SAVE'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))                *46640002
                         GET THE REGISTER TO BE RESTORED.               46648002
         L     &S1,((4*&S1)+20-64*((2+&S1)/16))(,13) RESTORE THE GPR.   46656002
         AGO   .L#MOR    GO LOOK FOR THE NEXT ELEMENT IN THE LIST.      46664002
.L#1A    AIF   (N'&SAVE EQ 1).L#0  SEE IF THERE IS EXACTLY ONE ELEMENT *46672002
                         IN THE LIST.                                   46680002
         AIF   ((N'&SAVE NE 2)OR('&SAVE(2)'(1,1) EQ '(')).L#1          *46688002
                         SEE IF IT IS JUST A SINGLE RANGE OR IF IT IS A*46696002
                         SINGLE REGISTER FOLLOWED BY A RANGE.           46704002
.L#1B    LM    &SAVE(1),&SAVE(2),((4*&SAVE(1))+20-64*((2+&SAVE(1))/16))*46712002
               (13)      RESTORE THE REGISTERS.                         46720002
         AGO   .L#FIN    ALL FINISHED, GO TO THE COMMON EXIT POINT FROM*46728002
                         THE MACRO SUBROUTINE.                          46736002
.L#2     ANOP                                                           46744002
&Z       SETA  &IGAZ     XX                                             46752002
&TMPA    SETA  &IGAPATH(&IGALEVL-1)  SAVE THE PATH VECTOR ELEMENT.      46760002
      RPTDSECT SCAN=NEXT  SET THE CURSOR TO THE NEXT ATOM IN THE LIST.  46768002
         AIF   (&IGALEVL NE 2).L#2A  SEE IF THE NEXT ATOM IS NOT IN THE*46776002
                         SAME SUBLIST.                                  46784002
         AIF   (&IGAPATH(&IGALEVL-1) NE &TMPA).L#2A  CHECK FURTHER FOR *46792002
                         THE NEXT ATOM BEING IN THE SAME SUBLIST.       46800002
&S1      SETC  '&SAVE'(&IGALEFT(&Z),&IGARGHT(&Z))                      *46808002
                         GET THE FIRST REGISTER OF THE GROUP TO BE     *46816002
                         RESTORED.                                      46824002
&S2      SETC  '&SAVE'(&IGALEFT(&IGAZ),&IGARGHT(&IGAZ))                *46832002
               GET THE SECOND REGISTER OF THE GROUP TO BE RESTORED.     46840002
         LM    &S1,&S2,((4*&S1)+20-64*((2+&S1)/16))(13)  RESTORE GPRS.  46848002
.********************************************************************** 46856002
.* SCAN FOR THE NEXT ATOM IN THE LIST AFTER THE LAST PAIR; THE NEXT   * 46864002
.* ATOM MAY EITHER BE A SINGLE ATOM OF PARENTHESIS LEVEL 1, OR IT MAY * 46872002
.* BE OF PARENTHESIS LEVEL 2. IF IT IS PARENTHESIS LEVEL 2, CHECK TO  * 46880002
.* SEE IF IT HAS A PAIRED ELEMENT TO INDICATE A RANGE OF REGISTERS TO * 46888002
.* BE RESTORED.                                                       * 46896002
.********************************************************************** 46904002
.L#MOR RPTDSECT SCAN=NEXT  GET THE CURSOR POSITIONED AT THE NEXT ATOM  *46912002
                         IN THE LIST.                                   46920002
.L#CHK   AIF   (&IGAX EQ 0).L#FIN  SEE IF THERE ARE ANY MORE ELEMENTS  *46928002
                         IN THE LIST.                                   46936002
         AIF   (&IGALEVL EQ 2).L#2  SEE IF THE NEXT ATOM IS ON LEVEL 2. 46944002
         AIF   (&IGALEVL EQ 1).L#1  SEE IF IT IS ON LEVEL 1; IF IT     *46952002
                         ISN'T ON LEVEL 1 THERE IS AN ERROR.            46960002
         MNOTE 12,'TOO MANY NESTED PARENTHESIS LEVELS IN SAVE PARAM.'   46968002
         AGO   .L#FIN    ALL DONE, WIG OUT NOW.                         46976002
.L#2A    ANOP                                                           46984002
&S1      SETC  '&SAVE'(&IGALEFT(&Z),&IGARGHT(&Z))                      *46992002
                         GET THE REGISTER TO BE RESTORED.               47000002
         L     &S1,((4*&S1)+20-64*((2+&S1)/16))(,13) RESTORE THE GPR.   47008002
         AGO   .L#CHK    NOW SEE WHAT THE NEXT ATOM IS.                 47016002
.L#FIN   ANOP                                                           47024002
.*       N O W   F I G U R E   O U T   W H A T   T O   D O   N E X T  * 47032002
         AIF   ('&LV' NE '-0').SKIP0  SEE IF THE SAVE AREAS WERE NESTED*47040002
                         TWO LEVELS DEEP.                               47048002
         L     13,4(,13) TRACE THE SAVE AREA CHAIN BACKPATH ONE EDGE.   47056002
.SKIP0   ANOP                                                           47064002
         AIF   (K'&RC EQ 0).SKIP3  SEE IF THE RETURN CODE WAS CODED.    47072002
         AIF   ('&RC'(1,1) EQ '(').SKIP3  SEE IF THE RETURN CODE WAS   *47080002
                         ALREADY PUT INTO REGISTER 15.                  47088002
.SKIP2   AIF   ('&RC' EQ '0').SKIP2B  SEE IF THE RETURN CODE SHOULD BE *47096002
                         SET TO ZERO.                                   47104002
         AIF   ('&RC'(1,1) EQ '-').SKIP2A  SEE IF THE RETURN CODE IS   *47112002
                         NEGATIVE.                                      47120002
         LA    15,&RC    SET THE RETURN CODE.                           47128002
         LTR   15,15     SET THE CONDITION CODE FOR THE RETURN CODE.    47136002
         AGO   .SKIP3    ALL DONE, NOW GO GENERATE THE BR 14.           47144002
.SKIP2A  ANOP                                                           47152002
         LA    15,0-(0&RC)  LOAD THE RETURN CODE IN 15.                 47160002
         LNR   15,15  SET THE RETURN CODE MINUS AND THE CONDITION CODE. 47168002
         AGO   .SKIP3    NOW GO GENERATE THE BR 14.                     47176002
.SKIP2B  SR    15,15     SET THE RETURN CODE TO ZERO.                   47184002
.SKIP3   ANOP                                                           47192002
         JMP   15,(14)   RETURN.                                        47200002
.FIN     ANOP                                                           47208002
         MEND                                                           47216002
         MACRO                                                          47224002
&TAG     BT00  &V,&JUMP                                                 47232002
.********************************************************************** 47240002
&TAG     TM    FLAGS(&V),T0                                             47248002
         JMP   8,&JUMP   JUMP IF T0 IS OFF.                             47256002
         MEND                                                           47264002
         MACRO                                                          47272002
&TAG     BT01  &V,&JUMP                                                 47280002
.********************************************************************** 47288002
&TAG     TM    FLAGS(&V),T0                                             47296002
         JMP   1,&JUMP   JUMP IF LEFT SUCCESSOR IS INNER.               47304002
         MEND                                                           47312002
         MACRO                                                          47320002
&TAG     BT10  &V,&JUMP                                                 47328002
.********************************************************************** 47336002
&TAG     TM    FLAGS(&V),T1                                             47344002
         JMP   8,&JUMP   JUMP IF THE RIGHT SUCCESSOR IS A SINK.         47352002
         MEND                                                           47360002
         MACRO                                                          47368002
&TAG     BT11  &V,&JUMP                                                 47376002
.********************************************************************** 47384002
&TAG     TM    FLAGS(&V),T1                                             47392002
         JMP   1,&JUMP   JUMP IF RIGHT SUCCESSOR IS AN INNER VERTEX.    47400002
         MEND                                                           47408002
         MACRO                                                          47416002
&TAG     BNET00 &V,&JUMP                                                47424002
&TAG     TM    FLAGS(&V),IGANEBIT+IGAT0BIT  SEE IF IT IS END.           47432002
         JMP   B'1110',&JUMP                                            47440002
         MEND                                                           47448002
         MACRO                                                          47456002
&TAG    BNET01 &V,&JUMP                                                 47464002
&TAG     TM    FLAGS(&V),IGANEBIT+IGAT0BIT                              47472002
         JMP   B'0001',&JUMP                                            47480002
         MEND                                                           47488002
         MACRO                                                          47496002
&TAG    BNET10 &V,&JUMP                                                 47504002
&TAG     TM    FLAGS(&V),IGANEBIT+IGAT1BIT                              47512002
         JMP   B'1110',&JUMP                                            47520002
         MEND                                                           47528002
         MACRO                                                          47536002
&TAG    BNET11 &V,&JUMP                                                 47544002
&TAG     TM    FLAGS(&V),IGANEBIT+IGAT1BIT                              47552002
         JMP   B'0001',&JUMP                                            47560002
         MEND                                                           47568002
         MACRO                                                          47576002
&TAG     SXIT  &A,&B,&P,&STM=NO                                         47584002
         LCLC  &XQ                                                      47592002
         LCLC  &Q                                                       47600002
         LCLC  &Z                                                       47608002
         LCLC  &O                                                       47616002
.********************************************************************** 47624002
&XQ      SETC  'X'''                                                    47632002
&Q       SETC  ''''                                                     47640002
&O       SETC  '1'                                                      47648002
&Z       SETC  '0'                                                      47656002
&TAG     MVI   PATH,&P                                                  47664002
         LA    &A,0(0,&A)                                               47672002
         LA    &B,0(0,&B)                                               47680002
         AIF   ('&STM' EQ 'NO').LW0                                     47688002
         STM   &A,&B,AP                                                 47696002
         AGO   .LW1                                                     47704002
.LW0     ST    &A,AP                                                    47712002
         ST    &B,AC                                                    47720002
.LW1     AIF   ('&P'(K'&P,1) EQ '&Z').LW2                               47728002
         G1ES  &A,&B,&A                                                 47736002
         AGO   .LW3                                                     47744002
.LW2     G0ES  &A,&B,&A                                                 47752002
.LW3     ANOP                                                           47760002
         LR    R15,&A  GET THE SINK ADDRESS TO RETURN IN REGISTER 15.   47768002
         AH    &A,OFFSET                                                47776002
         ST    &A,FARG                                                  47784002
         SNAPR                                                          47792002
         LM    FIRSTR,LASTR,20(13)                                      47800002
         BCR   15,LKR    RETURN.                                        47808002
*********************************************************************** 47816002
         MEND                                                           47824002
         MACRO                                                          47832002
&TAG     TEDGF &EDG,&A,&B                                               47840002
         GBLB  &PAIRING                                                 47848002
         GBLB  &SUB                                                     47856002
         GBLB  &EXOR                                                    47864002
         LCLC  &OPRN                                                    47872002
         LCLC  &RP                                                      47880002
         LCLC  &LPZC                                                    47888002
         LCLC  &CMA                                                     47896002
.********************************************************************** 47904002
         AIF   (K'&TAG EQ 0).SKIP                                       47912002
&TAG     EQU   *                                                        47920002
.SKIP    ANOP                                                           47928002
&RP      SETC  ')'                                                      47936002
&LPZC    SETC  '(0,'                                                    47944002
&CMA     SETC  ','                                                      47952002
&OPRN    SETC  '&A'.'&CMA'.'&EDG'.'&LPZC'.'&B'.'&RP'                    47960002
         AIF   (&EXOR).LWX                                              47968002
         AIF   (&SUB).LWS                                               47976002
         MNOTE 12,'ERROR, NO EDGE REPRESENTATION SPECIFIED.'            47984002
         AGO   .END                                                     47992002
.LWX     X     &A,&EDG.(O,&B)                                           48000002
         AGO   .END                                                     48008002
.LWS     AL    &A,&EDG.(O,&B)                                           48016002
         AGO   .END                                                     48024002
.END     ANOP                                                           48032002
         MEND                                                           48040002
         MACRO                                                          48048002
&TAG     TLE   &A,&B                                                    48056002
         LCLC  &LFC                                                     48064002
.********************************************************************** 48072002
&LFC     SETC  'LEF'                                                    48080002
&TAG     TEDGF &LFC,&A,&B                                               48088002
         MEND                                                           48096002
         MACRO                                                          48104002
&TAG     TRE   &A,&B                                                    48112002
         LCLC  &LFC                                                     48120002
.********************************************************************** 48128002
&LFC     SETC  'RGHT'                                                   48136002
&TAG     TEDGF &LFC,&A,&B                                               48144002
         MEND                                                           48152002
         MACRO                                                          48160002
&TAG     TLEF  &P,&C,&S,&CYCLE=NO                                       48168002
.********************************************************************** 48176002
         AIF   ('&C' EQ '&P').LW2                                       48184002
         AIF   ('&C' EQ '&S').LW2                                       48192002
         AIF   ('&P' NE '&S').LW0                                       48200002
&TAG     TLE   &S,&C                                                    48208002
         AIF   ('&CYCLE' EQ 'NO').END                                   48216002
         MNOTE 12,'MEANINGLESS TO CYCLE TWO REGISTERS.'                 48224002
         AGO   .END                                                     48232002
.LW0     ANOP                                                           48240002
&TAG     LR    &S,&P                                                    48248002
         TLE   &S,&C                                                    48256002
         AIF   ('&CYCLE' EQ 'NO').LW1                                   48264002
         LR    &P,&C                                                    48272002
         LR    &C,&S                                                    48280002
.LW1     AGO   .END                                                     48288002
.LW2     MNOTE 12,'DUPLICATE REGISTER WITH CURRENT VERTEX'              48296002
.END     ANOP                                                           48304002
         MEND                                                           48312002
         MACRO                                                          48320002
&TAG     TREF  &P,&C,&S,&CYCLE=NO                                       48328002
.********************************************************************** 48336002
         AIF   ('&C' EQ '&P').LW2                                       48344002
         AIF   ('&C' EQ '&S').LW2                                       48352002
         AIF   ('&P' NE '&S').LW0                                       48360002
&TAG     TRE   &S,&C                                                    48368002
         AIF   ('&CYCLE' EQ 'NO').END                                   48376002
         MNOTE 12,'MEANINGLESS TO CYCLE TWO REGISTERS.'                 48384002
         AGO   .END                                                     48392002
.LW0     ANOP                                                           48400002
&TAG     LR    &S,&P                                                    48408002
         TRE   &S,&C                                                    48416002
         AIF   ('&CYCLE' EQ 'NO').LW1                                   48424002
         LR    &P,&C                                                    48432002
         LR    &C,&S                                                    48440002
.LW1     AGO   .END                                                     48448002
.LW2     MNOTE 12,'DUPLICATE REGISTER WITH CURRENT VERTEX'              48456002
.END     ANOP                                                           48464002
         MEND                                                           48472002
         MACRO                                                          48480002
&TAG     TEDGB &EDG,&P,&C,&S,&CYCLE=NO                                  48488002
         GBLB  &PAIRING                                                 48496002
         GBLB  &SUB                                                     48504002
         GBLB  &EXOR                                                    48512002
         LCLC  &OPRN                                                    48520002
         LCLC  &RP                                                      48528002
         LCLC  &LPZC                                                    48536002
         LCLC  &CMA                                                     48544002
.********************************************************************** 48552002
         AIF   (K'&TAG EQ 0).SKIP                                       48560002
&TAG     EQU   *                                                        48568002
.SKIP    ANOP                                                           48576002
&RP      SETC  ')'                                                      48584002
&LPZC    SETC  '(0,'                                                    48592002
&CMA     SETC  ','                                                      48600002
&OPRN    SETC  '&P'.'&CMA'.'&EDG'.'&LPZC'.'&C'.'&RP'                    48608002
         AIF   ('&CYCLE' EQ 'NO').ORK                                   48616002
         LR    &S,&C                                                    48624002
         LR    &C,&P                                                    48632002
.ORK     ANOP                                                           48640002
         AIF   (&SUB).LWS                                               48648002
         AIF   (&EXOR).LWX                                              48656002
         MNOTE 12,'NO EDGE REPRESENTATION, ERROR.'                      48664002
         AGO   .END                                                     48672002
.LWX     AIF   ('&P' EQ '&S').LWX0                                      48680002
         LR    &P,&S                                                    48688002
         X     &P,&EDG.(O,&C)                                           48696002
         AGO   .END                                                     48704002
.LWX0    ANOP                                                           48712002
         X     &P,&EDG.(O,&C)                                           48720002
         AGO   .END                                                     48728002
.LWS     AIF   ('&P' EQ '&S').LWS0                                      48736002
         LR    &P,&S                                                    48744002
.LWS0    SL    &P,&EDG.(O,&C)                                           48752002
         AGO   .END                                                     48760002
.END     ANOP                                                           48768002
         MEND                                                           48776002
         MACRO                                                          48784002
&TAG     TLEB  &P,&C,&S,&CYCLE=NO                                       48792002
         LCLC  &CMA                                                     48800002
         LCLC  &LFC                                                     48808002
.********************************************************************** 48816002
&CMA     SETC  ','                                                      48824002
&LFC     SETC  'LEF'                                                    48832002
&TAG     TEDGB &LFC,&P,&C,&S,CYCLE=&CYCLE                               48840002
         MEND                                                           48848002
         MACRO                                                          48856002
&TAG     TREB  &P,&C,&S,&CYCLE=NO                                       48864002
         LCLC  &CMA                                                     48872002
         LCLC  &LFC                                                     48880002
.********************************************************************** 48888002
&CMA     SETC  ','                                                      48896002
&LFC     SETC  'RGHT'                                                   48904002
&TAG     TEDGB &LFC,&P,&C,&S,CYCLE=&CYCLE                               48912002
         MEND                                                           48920002
         MACRO                                                          48928002
&TAG     TRBP  &P,&C,&S,&RL=,&TOP=,&CLEAR=NO                            48936002
         GBLB  &PAIRING,&ABS,&SUB,&EXOR,&ESS,&EDG2,&EDG3                48944002
         LCLC  &X,&R                                                    48952002
.*--------------------------------------------------------------------* 48960002
.* THIS MACRO CYCLES THE THREE REGISTERS &P, &C, AND &S, SO THAT      * 48968002
.* &P AND &C ARE ALWAYS TWO CONSECUTIVE VERTICES ON THE PATH. ONLY &P * 48976002
.* AND &C ARE VALID, &S IS USED AS A WORKING REGISTER.                * 48984002
.* THIS MACRO TRACES ONE EDGE UP THE BACKPATH; &C IS THE CURRENT        48992002
.* VERTEX, &S IS A WORKING REGISTER, AND &P IS THE PREDECESSOR OF &C. * 49000002
.* &S IS REPLACED BY &C, SO AS TO SAVE THE CURRENT VERTEX FOR         * 49008002
.* COMPUTING THE PREDECESSOR WITH THE INVERTIBLE EDGE, THEN &C IS     * 49016002
.* REPLACED BY &P, AND THEN THE NEW &P IS COMPUTED BY USING THE NEW   * 49024002
.* CONTENTS OF &S AS THE SUCCESSOR OF THE NEW VERTEX &C.              * 49032002
.* THUS THE EDGE FIELD USED TO FOR THE PREDECESSOR COMES FROM THE NEW * 49040002
.* VERTEX &C, AFTER &C HAS BEEN REPLACED BY THE ORIGINAL &P.          * 49048002
.* -------------------------------------------------------------------* 49056002
.* &RL IS EITHER A REGISTER CONTAINING THE VALUE 4, OR IS AN ADDRESS  * 49064002
.* OF A MAIN STORAGE LOCATION HAVING A FULL WORD CONSTANT 4.          * 49072002
.* IF &RL IS A REGISTER, IT MUST BE ENCLOSED IN PARENTHESIS, I. E.    * 49080002
.* IT MUST BE CODED AS RL=(REGISTER) IN WRITING THE MACRO.            * 49088002
.* NOTE THAT THE REGISTER RL MUST BE LOADED PRIOR TO EXECUTING TRBP.  * 49096002
.* IF RL IS OMITTED, THE LITERAL "=XL4'00000004'" IS USED.            * 49104002
.* &TOP IS THE PLACE TO BRANCH TO IF THE BACKPATH TRACE REACHES THE   * 49112002
.* TOP OF PATH CONDITION. IF TOP=^JUMP IS CODED, IT WILL BRANCH TO    * 49120002
.*  LOCATION "JUMP" IF THE TOP OF THE PATH HAS NOT BEEN REACHED.      * 49128002
.*--------------------------------------------------------------------* 49136002
         AIF   (K'&RL NE 0).RLNOTMT  AGO IF THE RL KEYWORD IS CODED.    49144002
&X       SETC  '=XL4''00000004'''  SUPPLY THE LITERAL AND DO IT AGAIN.  49152002
&TAG     TRBP  &P,&C,&S,RL=&X,TOP=&TOP,CLEAR=&CLEAR                     49160002
         AGO   .FIN          FINISH UP.                                 49168002
.RLNOTMT ANOP                                                           49176002
&TAG     LR    &S,&C         LOAD REGISTER WITH CURRENT VERTEX.         49184002
         LR    &C,&P         CAUSE THE PREDECESSOR TO BECOME CURRENT.   49192002
         IC    &P,FLAGS(O,&S)  GET THE FLAG BYTE.                       49200002
&R       SETC  'R'                                                      49208002
         AIF   ('&RL'(1,1) EQ '(').RRLR  GO IF &RL IS A REGISTER.       49216002
&R       SETC  ''     OTHERWISE SET &R TO THE EMPTY VECTOR.             49224002
.RRLR    N&R   &P,&RL(1)  AND X'04' WITH THE FLAG BYTE, TO PRODUCE      49232002
*                       THE INDEX OF THE LEFT OR RIGHT EDGE FIELD.      49240002
         AIF   (&EXOR).XOR   AGO IF EXCLUSIVE-OR INVERTIBLE EDGES.      49248002
         AIF   (&SUB).SUB    AGO IF SUBTRACTION INVERTIBLE EDGES.       49256002
         MNOTE 12,'INVALID EDGE REPRESENTATIONS.'                       49264002
         AGO   .FIN          THAT WRAPS IT UP.                          49272002
.XOR     L     &P,O(&P,&C)  LOAD THE LEFT OR RIGHT EXCLUSIVE-OR EDGE.   49280002
         XR    &P,&S        TRACE THE EDGE BACKWORD.                    49288002
         AGO   .CCLEAR    GO SEE IF IT HAS TO CLEAR THE LEFT BYTE.      49296002
.SUB     SL    &S,O(&P,&C)  TRACE THE SUBTRACTION EDGE BACKWORD.        49304002
         LR    &P,&S   COMPLETE THE EDGE CYCLING PROCESS.               49312002
.* NOW THE EDGE HAS BEEN TRACED BACKWORD. SEE IF THE CLEAR IS NEEDED.   49320002
.CCLEAR  AIF  (('&CLEAR' EQ 'NO') AND (K'&TOP EQ 0)).CLEARNO            49328002
         LA    &P,O(O,&P)    CLEAR THE HIGH ORDER BYTE.                 49336002
.CLEARNO ANOP                                                           49344002
.* NOW SEE IF THE PAIR SHOULD BE CHECKED TO SEE IF THEY ARE THE TOP.  * 49352002
.CHKTOP  AIF   (K'&TOP EQ 0).SKIPTOP  SKIP IT IF THERE IS NO CHECK.     49360002
         CLR   &P,&C   SEE IF THE TOP-OF-PATH CONDITION EXISTS.         49368002
         AIF   ('&TOP'(1,1) EQ '^').NOTTOP  BRANCH IF NOT THE TOP JUMPS 49376002
         AIF   ('&TOP'(1,1) EQ '(').TOPBCR  BRANCH IF THE ADR IS IN REG 49384002
         BC    8,&TOP  BRANCH IF THE TOP OF THE PATH HAS BEEN REACHED.  49392002
         AGO   .END                                                     49400002
.TOPBCR  BCR   8,&TOP(1)  BRANCH IT THE TOP OF THE PATH IS REACHED.     49408002
         AGO   .END  GO ON TO THE END.                                  49416002
.NOTTOP  ANOP                                                           49424002
&X       SETC  '&TOP'(2,K'&TOP-1)                                       49432002
         AIF   ('&X'(1,1) EQ '(').BCRNOT  GO IF THE NOT TOP B.A. IS RR. 49440002
         BC    7,&X  BRANCH IF TOP NOT REACHED.                         49448002
         AGO   .END  ALL DONE HERE, GO ON TO THE NEXT THING.            49456002
.BCRNOT  ANOP                                                           49464002
&X       SETC  '&TOP'(3,K'&TOP-3)  GET ONLY THE REGISTER NAME.          49472002
         BCR   7,&X  BRANCH IF THE TOP HAS NOT YET BEEN REACHED.        49480002
.SKIPTOP ANOP                                                           49488002
.END     ANOP                                                           49496002
.FIN     ANOP                                                           49504002
.*--------------------------------------------------------------------* 49512002
         MEND                                                           49520002
         MACRO                                                          49528002
&TAG   SQRLBPT &RL=,&TMP=0,&PATH=PATH,&MASK=                            49536002
         LCLC  &R                                                       49544002
.* THIS MACRO PERFORMS THE NECESSARY SETUP FOR THE BACKPATH TRACE TO  * 49552002
.* THE INNER VERTEX ON THE BACKPATH FROM THE SINK DETERMINED BY &P, &C* 49560002
.* AND THE PATH BYTE SUCH THAT THE SEMILATTICE VALUE AT THE INNER     * 49568002
.* VERTEX IS THE VALUE ASSOCIATED WITH THE DESIGNATED SINK.           * 49576002
.*--------------------------------------------------------------------* 49584002
.* &RL IS A TEMPORARY REGISTER TO HOLD THE CONSTANT X'04', USED FOR   * 49592002
.* SELECTING LEFT OR RIGHT EDGE FIELDS BY ANDING IT WITH THE RL BIT   * 49600002
.* AND INDEXING TO THE CORRECT EDGE FIELD FOR TRACING THE BACKPATH.   * 49608002
.* IF &RL IS LEFT OUT, IT MUST BE LEFT OUT IN THE OTHER MACROS TOO.   * 49616002
.* &TMP IS A WORKING REGISTER TO HOLD THE WORD CONTAINING THE RL BIT  * 49624002
.* FROM THE SUCCESSOR OF THE CURRENT VERTEX &C WHILE BACK TRACING.    * 49632002
.* &TMP IS USED TO LINE UP THE RL BIT WITH THE Q-BIT IN C'S FLAG      * 49640002
.* FIELD, AND TO COMPARE THESE TWO BITS VIA THE BQEQRL MACRO.         * 49648002
.* &PATH IS THE WORD CONTAINING THE PATH BYTE IN IT'S LEFT BYTE.      * 49656002
.* &MASK IS A WORKING REGISTER USED TO HOLD THE CONSTANT X'08000000'  * 49664002
.* THAT IS NEEDED FOR MASKING OUT ALL THE BITS EXCEPT THE Q-BIT.      * 49672002
.* &MASK IS ALSO SPECIFIED IN THE BQEQRL MACRO.                       * 49680002
.*--------------------------------------------------------------------* 49688002
.* THIS MACRO LEAVES THE REGISTERS ALL SET UP TO EXECUTE THE MACRO    * 49696002
.* BQEQRL NEXT. NOTE THAT THIS MACRO SHOULD NOT BE USED UNLESS THERE  * 49704002
.* ARE AT LEAST TWO SINKS IN THE TREE AND THE REGISTERS P AND C HAVE  * 49712002
.* THEIR HIGH ORDER BYTES BOTH ZERO.                                  * 49720002
.*--------------------------------------------------------------------* 49728002
         AIF   (K'&TAG EQ 0).SKIPTAG                                    49736002
&TAG     EQU   *                                                        49744002
.SKIPTAG ANOP                                                           49752002
         AIF   (K'&RL EQ 0).SKIP0  GO IF &RL IS NOT CODED.              49760002
         LA    &RL(1),RL  SET THE RL MASK FOR ANDING RL BITS.           49768002
.SKIP0   ANOP                                                           49776002
&R       SETC  ''   SET &R TO THE EMPTY VECTOR.                         49784002
         AIF   ('&PATH'(1,1) NE '(').SKIP2  GO IF PATH IS NOT IN GPR.   49792002
&R       SETC  'R'  SET TO "R" FOR LR INSTRUCTION.                      49800002
.SKIP2   L&R &TMP(1),&PATH(1)  LOAD PATH IN REGISTER.                   49808002
         SLL   &TMP,RL/2  CAUSE THE LOW ORDER BIT OF PATH TO LINE UP.   49816002
.FIN     ANOP                                                           49824002
         MEND                                                           49832002
         MACRO                                                          49840002
&TAG     BQEQRL &TMP,&C,&MASK=,&JUMP=                                   49848002
         LCLC  &R,&CC                                                   49856002
         LCLA  &K        CHARACTER COUNT.                               49864002
.* THIS MACRO COMPARES THE RL-BIT IN REGISTER &TMP WITH THE Q-BIT IN  * 49872002
.* THE FLAG FIELD AT THE VERTEX &C, AND BRANCHES ON THE RESULT IF     * 49880002
.* &JUMP IS SPECIFIED. IF &JUMP IS NOT CODED, THEN THE CONDITION CODE * 49888002
.* IS SET TO 00 IF THEY ARE EQUAL.                                    * 49896002
.* &MASK SPECIFIES EITHER A MAIN STORAGE LOCATION CONTAINING THE MASK * 49904002
.* X'08000000' OR A REGISTER CONTAINING IT. IF &MASK IS NOT CODED A   * 49912002
.* REFERENCE TO THE APPROPRIATE LITERAL IS GENERATED.                 * 49920002
         AIF   (K'&MASK NE 0).SKIP0  GO IF &MASK IS CODED.              49928002
&R       SETC  '=XL4''0800000000'''                                     49936002
&TAG     BQEQRL &TMP,&C,MASK=&R,JUMP=&JUMP                              49944002
         AGO   .FIN                                                     49952002
.SKIP0   ANOP                                                           49960002
&TAG     ALR   &TMP,&TMP  CAUSE THE RL BIT TO LINE UP WITH Q-BIT.       49968002
         X     &TMP,FLAGS(O,&C)  COMPARE BY EXCLUSIVE-ORING.            49976002
.*--------------------------------------------------------------------* 49984002
&R       SETC  ''  SET &R TO THE EMPTY VECTOR IF &MASK IS NOT A REG.    49992002
         AIF   ('&MASK'(1,1) NE '(').SKIP1  GO IF &MASK NOT A GPR.      50000002
&R       SETC  'R'  SET &R TO AN R FOR AN NR INSTRUCTION.               50008002
.SKIP1   N&R &TMP,&MASK(1)  ZERO OUT ALL OTHER BIT POSITIONS.           50016002
         AIF   (K'&JUMP EQ 0).FIN  FINISHED IF &JUMP NOT CODED.         50024002
&CC      SETC  '8'  PREPARE TO BRANCH IF THEY ARE EQUAL.                50032002
&R       SETC  '&JUMP'  GET THE BRANCH ADDRESS.                         50040002
&K       SETA  (K'&JUMP)                                                50048002
         AIF   ('&JUMP'(1,1) NE '^').SKIP2  GO IF NOT NOT JUMP.         50056002
&CC      SETC  '7'  PREPARE TO BRANCH IF THEY ARE NOT EQUAL.            50064002
&R       SETC  '&JUMP'(2,K'&JUMP-1)  DISCARD THE ^ SIGN.                50072002
&K       SETA  (&K-1)                                                   50080002
.SKIP2   AIF   ('&R'(1,1) EQ '(').SKIP3  GO IF &JUMP IS IN A GPR.       50088002
         BC    &CC,&R  BRANCH ON THE RESULT OF THE COMPARE.             50096002
         AGO   .FIN                                                     50104002
.SKIP3   ANOP                                                           50112002
&R       SETC  '&R'(2,&K-2)    DISCARD THE PARENTHESIS.                 50120002
         BCR   &CC,&R  BRANCH ON THE RESULT OF THE COMPARE.             50128002
.FIN     ANOP                                                           50136002
         MEND                                                           50144002
         MACRO                                                          50152002
&TAG     LTRBP &P,&C,&S,&RL=,&TMP=0                                     50160002
.* THIS MACRO ENABLES CONTINUATION AFTER THE BQEQRL MACRO TO LOAD THE * 50168002
.* WORD CONTAINING THE FLAG BYTE FIELD FROM VERTEX &C INTO &TMP, AND  * 50176002
.* TRACE THE BACKPATH ONE EDGE VIA BP.                                * 50184002
&TAG     L     &TMP,FLAGS(O,&C)  LOAD THE WORD WITH THE RL BIT IN IT.   50192002
         TRBP  &P,&C,&S,RL=&RL,CLEAR=YES                                50200002
         MEND                                                           50208002
         MACRO                                                          50216002
&TAG     BQ0   &V,&JUMP                                                 50224002
&TAG     TM    FLAGS(&V),IGAQBIT  TEST THE Q-BIT, AND                   50232002
         BC    8,&JUMP       BRANCH IF IT IS A ZERO.                    50240002
         MEND                                                           50248002
         MACRO                                                          50256002
&TAG     BQ1   &V,&JUMP                                                 50264002
&TAG     TM    FLAGS(&V),IGAQBIT  TEST THE Q-BIT,                       50272002
         BC    1,&JUMP   AND BRANCH IF IT IS A ONE.                     50280002
         MEND                                                           50288002
         MACRO                                                          50296002
&TAG     COLLECT                                                        50304002
         GBLB  &EXOR                                                    50312002
         GBLB  &SUB                                                     50320002
         GBLB  &PAIRING                                                 50328002
.********************************************************************** 50336002
&TAG     DS    0H                                                       50344002
         AIF   (&PAIRING).LW0                                           50352002
FLAGS    EQU   4                                                        50360002
         AGO   .LW1                                                     50368002
.LW0     ANOP                                                           50376002
FLAGS    EQU   1                                                        50384002
IVTM     TM    *+1,B'1111011'  TEST THE EVEN OR ODDNESS OF THE ADDRESS. 50392002
.LW1     ANOP                                                           50400002
         MEND                                                           50408002
         MACRO                                                          50416002
&TAG     BIV0  &V,&JUMP                                                 50424002
         GBLB  &PAIRING                                                 50432002
         GBLB  &SUB                                                     50440002
         GBLB  &EXOR                                                    50448002
.********************************************************************** 50456002
         AIF   (&PAIRING).LW0                                           50464002
&TAG     TM    FLAGS(&V),RL                                             50472002
         BC    8,&JUMP                                                  50480002
         AGO   .LW1                                                     50488002
.LW0     ANOP                                                           50496002
&TAG     EX    &V,IVTM   TM *+1,B'11111011'                             50504002
         BC    1,&JUMP                                                  50512002
.LW1     ANOP                                                           50520002
         MEND                                                           50528002
         MACRO                                                          50536002
&TAG     BIV1  &V,&JUMP                                                 50544002
         GBLB  &EXOR                                                    50552002
         GBLB  &SUB                                                     50560002
         GBLB  &PAIRING                                                 50568002
.********************************************************************** 50576002
         AIF   (&PAIRING).LW0                                           50584002
&TAG     TM    FLAGS(&V),RL                                             50592002
         BC    1,&JUMP                                                  50600002
         AGO   .LW1                                                     50608002
.LW0     ANOP                                                           50616002
&TAG     EX    &V,IVTM   TM *+1,B'11111011'                             50624002
         BC    14,&JUMP                                                 50632002
.LW1     ANOP                                                           50640002
         MEND                                                           50648002
         MACRO                                                          50656002
&TAG     G0ES  &P,&C,&S                                                 50664002
         GBLB  &EXOR                                                    50672002
         GBLB  &SUB                                                     50680002
         GBLB  &PAIRING                                                 50688002
         GBLB  &SEI                                                     50696002
.********************************************************************** 50704002
         AIF   (K'&TAG EQ 0).SKIP                                       50712002
&TAG     EQU   *                                                        50720002
.SKIP    ANOP                                                           50728002
         AIF   (&SEI).LW0                                               50736002
         L     &S,LEF(0,&C)                                             50744002
         LA    &S,0(0,&S)                                               50752002
         AGO   .END                                                     50760002
.LW0     AIF   (&EXOR).LWX                                              50768002
         AIF   (&SUB).LWS                                               50776002
         MNOTE 12,'NO EDGE REPRESENTATION SPECIFIED.'                   50784002
         AGO   .END                                                     50792002
.LWX     AIF   ('&P' EQ '&S').LWX0                                      50800002
         LR    &S,&P                                                    50808002
.LWX0    X     &S,LEF(0,&C)                                             50816002
         LA    &S,0(0,&S)                                               50824002
         AGO   .END                                                     50832002
.LWS     AIF  ('&P' EQ '&S').LWS0                                       50840002
         LR    &S,&P                                                    50848002
.LWS0    AL    &S,LEF(0,&C)                                             50856002
         LA    &S,0(0,&S)                                               50864002
         AGO   .END                                                     50872002
.END     ANOP                                                           50880002
         MEND                                                           50888002
         MACRO                                                          50896002
&TAG     G1ES  &P,&C,&S                                                 50904002
         GBLB  &SUB                                                     50912002
         GBLB  &SEI                                                     50920002
         GBLB  &PAIRING                                                 50928002
         GBLB  &EXOR                                                    50936002
.********************************************************************** 50944002
         AIF   (K'&TAG EQ 0).SKIP                                       50952002
&TAG     EQU   *                                                        50960002
.SKIP    ANOP                                                           50968002
         AIF   (&SEI).LW0                                               50976002
         L     &S,RGHT(0,&C)                                            50984002
         LA    &S,0(0,&S)                                               50992002
         AGO   .END                                                     51000002
.LW0     AIF   (&EXOR).LWX                                              51008002
         AIF   (&SUB).LWS                                               51016002
         MNOTE 12,'NO EDGE REPRESENTATION SPECIFIED.'                   51024002
         AGO   .END                                                     51032002
.LWX     AIF   ('&P' EQ '&S').LWX0                                      51040002
         LR    &S,&P                                                    51048002
.LWX0    X     &S,RGHT(0,&C)                                            51056002
         LA    &S,0(0,&S)                                               51064002
         AGO   .END                                                     51072002
.LWS     AIF  ('&P' EQ '&S').LWS0                                       51080002
         LR    &S,&P                                                    51088002
.LWS0    AL    &S,RGHT(0,&C)                                            51096002
         LA    &S,0(0,&S)                                               51104002
         AGO   .END                                                     51112002
.END     ANOP                                                           51120002
         MEND                                                           51128002
         MACRO                                                          51136002
         SCNRFIN                                                        51144002
.********************************************************************** 51152002
         LM    A,B,GPR2        RESTORE THE REGISTERS.                   51160002
         BCR   15,LKR    RETURN                                         51168002
         MEND                                                           51176002
         MACRO                                                          51184002
&TAG     TSTBT &A,&ZERO=,&ONE=                                          51192002
         GBLB  &BIGMASK                                                 51200002
.********************************************************************** 51208002
&TAG     IC    ZX,BYTEI(0,&A)                                           51216002
         IC    TMP,0(ZX,ADR)  GET THE VALUE OF THE ARGUMENT BYTE.       51224002
         IC    ZX,FLAGS(0,&A)                                           51232002
         AIF   (&BIGMASK).BIGMASK  IF BIG TABLE IS USED SKIP THE SRL.   51240002
         SRL   ZX,5            SHIFT RIGHT FOR A 3-BIT INDEX.           51248002
.BIGMASK ANOP                                                           51256002
         IC    ZX,MSKTBL(ZX)  GET THE MASK TO TEST THE BIT BY ANDING.   51264002
         NR    TMP,ZX      TEST THE BIT IN THE SEARCH ARGUMENT.         51272002
         AIF   (K'&ONE EQ 0).LW0                                        51280002
         BC    7,&ONE                                                   51288002
.LW0     AIF   (K'&ZERO EQ 0).LW1                                       51296002
         BC    8,&ZERO                                                  51304002
.LW1     ANOP                                                           51312002
.END     ANOP                                                           51320002
         MEND                                                           51328002
         MACRO                                                          51336002
         SNAPR                                                          51344002
         GBLB  &SNAPXT                                                  51352002
         GBLB  &TEST                                                    51360002
.********************************************************************** 51368002
         AIF   (NOT(&TEST)).FIN                                         51376002
         AIF   (&SNAPXT).LW0                                            51384002
&SNAPXT  SETB  (1)                                                      51392002
.LW0     ANOP                                                           51400002
SNAP&SYSNDX EQU *                                                       51408002
         STM   14,15,SNS&SYSNDX                                         51416002
         CNOP  2,4                                                      51424002
         ICALL SNAP                                                     51432002
         DC    AL4(&SYSNDX)                                             51440002
SNS&SYSNDX DC CL8'SAVE1415'                                             51448002
         L     14,SNS&SYSNDX                                            51456002
.FIN     ANOP                                                           51464002
         MEND                                                           51472002
         MACRO                                                          51480002
&TAG     GSNAP                                                          51488002
.********************************************************************** 51496002
         MEND                                                           51504002
         MACRO                                                          51512002
&TAG     SNIP                                                           51520002
         GBLB  &SNIP,&SNARF                                             51528002
         LCLA  &A,&B                                                    51536002
         AIF   (NOT(&SNIP)).FIN                                         51544002
SNAP&SYSNDX EQU *  PROVIDE A REFERENCE NUMBER FOR THE SNAPS.            51552002
         AIF   (&SNARF).LW1                                             51560002
&SNARF   SETB  (1)                                                      51568002
.LW1     ANOP                                                           51576002
&TAG     STM   14,15,SNS&SYSNDX                                         51584002
         CNOP  0,4                                                      51592002
         L     15,=AL4(SNAPPY)                                          51600002
         BALR  14,15                                                    51608002
&A       SETA  (&SYSNDX)                                                51616002
&B       SETA  (&A-10*(&A/10)+16*((&A/10)-10*(&A/100)))                 51624002
&B       SETA  (&B+256*((&A/100)-10*(&A/1000)))                         51632002
         DC    AL2(&B)                                                  51640002
SNS&SYSNDX DC CL8'SAVE1415'                                             51648002
         DC    XL4'98EFE002'                                            51656002
.FIN     ANOP                                                           51664002
         MEND                                                           51672002
         MACRO                                                          51680002
&TAG  GODOWNTO &A                                                       51688002
         GBLC  &IGANAME  THE NAME OF THE MODULE.                        51696002
DOWN&SYSNDX EQU *-&IGANAME  OFFSET FROM THE START OF THE MODULE.        51704002
         AIF   ('&A' NE 'SPACE').SKIP  SEE IF THIS IS JUST TO LEAVE    *51712002
                         SOME LEBENSRAUM.                               51720002
UP&SYSNDX EQU  (X'20'*((DOWN&SYSNDX+X'1F')/X'20')-DOWN&SYSNDX)          51728002
         DC    (UP&SYSNDX+16-16*((2*(UP&SYSNDX/X'10'))/(1+(UP&SYSNDX/X'*51736002
               10'))))XL1'FF'                                           51744002
         AIF   (K'&TAG EQ 0).FIN  SEE IF THERE IS A LABEL ON THE       *51752002
                         MACRO-INSTRUCTION.                             51760002
&TAG     EQU   *         PROVIDE A LABEL FOR REFERENCE.                 51768002
         AGO   .FIN      NOW EXIT, IT IS ALL DONE.                      51776002
.SKIP    ANOP                                                           51784002
.********************************************************************** 51792002
.* THE FOLLOWING DC STATEMENT GENERATESA BIT PATTERN OF ALL ONES TO   * 51800002
.* FILL UP THE SPACE BETWEEN THE CURRENT SETTING OF THE LOCATION      * 51808002
.* COUNTER AND THE OFFSET &A INTO THE MODULE. THE EXPRESSION          * 51816002
.* "(&A-DOWN&SYSNDX)" PROVIDES THE NUMBER OF BYTES TO BE FILLED WITH  * 51824002
.* ONES, BUT IF THE CURRENT LOCATION COUNTER ALREADY EXCEEDS THE      * 51832002
.* OFFSET &A THEN THE VALUE OF THE EXPRESSION IS NEGATIVE, WHICH      * 51840002
.* CAUSES THE ASSEMBLER PROGRAM TO ABNORMALLY TERMIATE WITH A SYSTEM  * 51848002
.* COMPLETION CODE OF B37 BY RUNNING OUT OF DISK WORK SPACE.          * 51856002
.*                                                                    * 51864002
.* THEREFORE, TO PREVENT THIS CONDITION, AN ADJUSTMENT IS MADE TO THE * 51872002
.* DUPLICATION FACTOR EXPRESSION TO MAKE IT ZERO IF THE CONDITION     * 51880002
.* ARISES. THE ADJUSTMENT FOLLOWS FROM THE FOLLOWING REASONING:       * 51888002
.*                                                                    * 51896002
.*   (0) LET X=(&A-DOWN&SYSNX), SO THAT X IS THE NUMBER OF BYTES TO   * 51904002
.*       FILL WITH ONES.                                              * 51912002
.*   (1) LET Y BE ANY POSITIVE CONSTANT SO THAT THE ABSOLUTE VALUE OF * 51920002
.*       X IS LESS THAN Y.                                            * 51928002
.*   (2) THEN THE VALUE OF THE EXPRESSION "((X+Y)/Y)" IS 1 IF X IS NOT* 51936002
.*       NEGATIVE, OR IS 0 IF X IS NEGATIVE, AND THE VALUE OF THE     * 51944002
.*       EXPRESSION "((Y-(X+1))/Y)" IS 0 IF X IS NOT NEGATIVE, OR 1 IF* 51952002
.*       X IS NEGATIVE.                                               * 51960002
.*                                                                    * 51968002
.* THUS BY MULTIPLYING X BY THE EXPRESSION "((X+Y)/Y)", IF X IS       * 51976002
.* NEGATIVE THE RESULT IS ZERO, OTHERWISE THE RESULT IS EQUAL TO X.   * 51984002
.* SIMILARLY, BY MULTIPLYING SOME CONSTANT Z BY THE EXPRESSION        * 51992002
.* "((Y-(X+1))/Y)", THE RESULT IS ZERO IF X IS NON-NEGATIVE, OR THE   * 52000002
.* RESULT IS EQUAL TO Z IF X IS NEGATIVE.                             * 52008002
.*                                                                    * 52016002
.* BY PUTTING THE EXPRESSION "(X*((X+Y)/Y))" IN THE DUPLICATION FACTOR* 52024002
.* OF THE DC STATEMENT, IF X IS NEGATIVE THE DUPLICATION FACTOR IS    * 52032002
.* ZERO, WHICH RESERVES NO SPACE AND DOES NOT CAUSE AN ASSEMLER ERROR.* 52040002
.* THIS CORRECTS THE PROBLEM OF THE ASSEMBLER PROGRAM ABENDING, BUT IT* 52048002
.* DOESN'T FLAG THE STATEMENT AS AN ERROR IN THE LISTING. TO FLAG THE * 52056002
.* STATEMENT AS AN ERROR, THE EXPRESSION "((X+Y)/Y)" IS SUBSTITUTED   * 52064002
.* FOR THE "1" OF THE "AL1" IN THE STATEMENT, SO THAT IF X IS NOT     * 52072002
.* NEGATIVE THE VALUE IS 1, BUT IF X IS NEGATIVE THE VALUE IS 0, AND  * 52080002
.* "AL0" IS INVALID FOR THE DC STATEMENT, FLAGGINF THE STATEMENT AS AN* 52088002
.* ERROR IN THE LISTING.                                              * 52096002
.*                                                                    * 52104002
.* THIS IS JUST ONE WAY TO CIRCUMVENT THE ARBITRARY LIMITATIONS OF THE* 52112002
.* ASSEMBLER LANGUAGE.                                                * 52120002
.********************************************************************** 52128002
         DC    ((((&A-DOWN&SYSNDX)+X'1000')/X'1000')*(&A-DOWN&SYSNDX))A*52136002
               L(((&A-DOWN&SYSNDX)+X'1000')/X'1000')(X'FF')             52144002
         AIF   (K'&TAG EQ 0).FIN       SEE IF THE LABEL IS NOT CODED.   52152002
&TAG     EQU   *                                                        52160002
.FIN     ANOP                                                           52168002
         MEND                                                           52176002
         EJECT                                                          52184002
         GBLC  &IGABLST  THE OFFSET INTO THE TREE HEADER FOR THE LIST  *52192002
                         OF RPT ENTRY POINTS.                           52200002
         GBLC  &IGABFIN  THE SIZE OF THE RESERVED LIST OF ENTRY POINT  *52208002
                         ADDRESSES IN THE TREE HEADER.                  52216002
         GBLC  &IGASCH8  THE OFFSET IN THE RPT MODULE FOR THE TYPE 8   *52224002
                         SEARCH ROUTINE.                                52232002
         GBLC  &IGAGKW   THE OFFSET IN THE IGARPT01 MODULE TO THE      *52240002
                         ROUTINE TO GET A WORK AREA FOR COLLECTING     *52248002
                         KEYS.                                          52256002
         GBLC  &IGADEL8  THE OFFSET IN THE IGARPT01 MODULE TO THE TYPE *52264002
                         8 RPT DELETE ROUTINE.                          52272002
         GBLC  &IGAINS8  THE OFFSET IN THE MODULE IGARPT01 TO THE      *52280002
                         ROUTINE TO INSERT IN A TYPE 8 RPT.             52288002
         GBLC  &IGALSCN  THE OFFSET TO THE ROUTINE TO SCAN LEFT IN THE *52296002
                         MODULE IGARPT01.                               52304002
         GBLC  &IGARSCN  THE OFFSET TO THE ROUTINE TO SCAN RIGHT IN THE*52312002
                         MODULE IGARPT01.                               52320002
         GBLC  &IGASPV   THE OFFSET TO THE PARTIAL ORDER SEARCH ROUTINE*52328002
                         IN THE MODULE IGARPT01.                        52336002
         GBLC  &IGAPVG   THE OFFSET TO THE ROUTINE TO GET THE PARTIAL  *52344002
                         ORDER VALUE FOR THE CURRENT SINK IN THE MODULE*52352002
                         IGARPT01.                                      52360002
         GBLC  &IGAPVAJ   THE OFFSET TO THE ROUTINE TO ADJUST THE      *52368002
                         PARTIAL ORDER VALUE FOR THE CURRENT SINK IN   *52376002
                         THE IGARPT01 MODULE.                           52384002
         GBLC  &IGADSP8  THE OFFSET TO THE ROUTINE TO DISPLAY A TYPE 8 *52392002
                         RPT IN THE MODULE IGARPT01.                    52400002
         GBLC  &IGASRCH  THE BRANCH ENTRY OFFSET FOR SEARCH OF A TYPE 8*52408002
                         RPT IN THE MODULE IGARPT01.                    52416002
         GBLC  &IGAKEYW  THE INDEX OF THE ADDRESS OF THE ROUTINE TO GET*52424002
                         A WORK AREA FOR COLLECTING KEYS FOR SEARCH.    52432002
         GBLC  &IGAINS   THE BRANCH ENTRY OFFSET FOR INSERTION INTO A  *52440002
                         TYPE 8 RPT.                                    52448002
         GBLC  &IGADEL   THE BRANCH ENTRY OFFSET FOR A DELETION        *52456002
                         OPERATION FOR A TYPE 8 RPT.                    52464002
         GBLC  &IGAFTRE  THE BRANCH ENTRY OFFSET FOR FTREE.             52472002
         GBLC  &IGASCNL  BRANCH ENTRY OFFSET FOR THE SCAN LEFT         *52480002
                         OPERATION FOR TYPE 8 RPT.                      52488002
         GBLC  &IGASCNR  BRANCH ENTRY OFFSET FOR THE SCAN RIGHT        *52496002
                         OPERATION FOR TYPE 8 RPT.                      52504002
         GBLC  &IGASTRE,&IGAINS5,&IGADEL5                               52512002
         GBLC  &IGADJPV        ENTRY OFFSET FOR ADJUSTING THE PARTIAL   52520002
**                             ORDER VALUE ASSOCIATED WITH A SINK.      52528002
         GBLC  &IGAPVS         BRANCH ENTRY OFFSET TO FIND A SINK WITH  52536002
**                             A PARTIAL ORDER VALUE THAT IS NOT LESS   52544002
**                             THAN THE VALUE IN REQL (GPR 0).          52552002
**                             THE EOP STATE IS SET TO THE SINK SO      52560002
**                             DETERMINED, AND THE VALUE IS STORED IN   52568002
**                             THE TREEHDR AT IGAVALUE.                 52576002
**                             THE SINK WORD IS RETURNED IN GPR 15 AS   52584002
**                             THE RETURN CODE, UNLESS THERE DOES NOT   52592002
**                             EXIST A SINK WITH A POV LARGER THAN OR   52600002
**                             EQUAL TO THE VALUE IN GPR 0. IN THIS     52608002
**                             CASE A NEGATIVE NUMBER IS RETURNED IN    52616002
**                             GPR 15.                                  52624002
         GBLC  &IGAGPV         BRANCH ENTRY OFFSET TO GET THE PARTIAL   52632002
**                             ORDER VALUE ASSOCIATED WITH THE SINK     52640002
**                             CURRENTLY SELECTED BY THE EOP STATE.     52648002
**                             THE VALUE IS RETURNED IN GPR 0.          52656002
         GBLC  &IGANAME        THE NAME OF THE RPT PROGRAM.             52664002
         GBLC  &IGADSP         BRANCH ENTRY OFFSET FOR DSPRPT.          52672002
         GBLC  &IGAISP   BRANCH ENTRY OFFSET TO SET UP A SPACE CONTROL  52680002
*                        AREA FOR AN ARBITRARY SUBPOOL.                 52688002
         GBLC  &IGAFRSC  BRANCH ENTRY OFFSET TO THE ROUTINE TO RELEASE *52696002
                         A SPACE CONTROL AREA AND ALL OF ITS RELATED   *52704002
                         SPACE VIA THE FREEMAIN MACRO-INSTRUCTION.      52712002
         GBLC  &IGASPZ   THE SIZE OF THE SPACE CONTROL AREA.            52720002
         GBLC  &IGASA0   THE OFFSET TO THE SAVE AREA IN THE SPACE      *52728002
                         CONTROL AREA.                                  52736002
         GBLC  &IGASA1   OFFSET TO THE SECOND SAVE AREA IN THE SPACE   *52744002
                         CONTROL AREA.                                  52752002
         GBLC  &IGAFSP   THIS IS THE BRANCH ENTRY OFFSET FOR THE       *52760002
                         VARIABLE LENGTH FSPACE WHEN THE SPACE CONTROL *52768002
                         ADDRESS IS NOT CODED IN THE FSPACE MACRO.      52776002
         GBLC  &IGAFSPS  BRANCH ENTRY OFFSET FOR VARIABLE LENGTH FSPACE*52784002
                         WHEN THE SPACE CONTROL ADDRESS IS CODED IN THE*52792002
                         FSPACE MACRO.                                  52800002
         GBLC  &IGAFS8,&IGAFS12,&IGAFS80  THE ENTRY POINTS TO RELEASE  *52808002
               ENTRIES OF THE RESPECTIVE LENGTHS USING THE FIXEDHDR IN *52816002
               A SPACE CONTROL AREA.                                    52824002
         GBLC  &IGAFSPF  THE BRANCH ENTRY OFFSET TO RELEASE A FIXED    *52832002
                         LENGTH ENTRY USING A FIXEDHDR.                 52840002
         GBLC  &IGAGSP   BRANCH ENTRY OFFSET FOR THE VARIABLE LENGTH   *52848002
                         GSPACE WHEN THE SPACE CONTROL ADDRESS IS NOT  *52856002
                         CODED IN THE GSPACE MACRO-INSTRUCTION.         52864002
         GBLC  &IGAGSPS  BRANCH ENTRY OFFSET FOR VARIABLE LENGTH SPACE *52872002
                         ALLOCATION WHEN THE SPACE CONTROL ADDRESS IS  *52880002
                         CODED IN THE GSPACE MACRO-INSTRUCTION.         52888002
         GBLC  &IGAGS8,&IGAGS12,&IGAGS80  THE BRANCH ENTRY OFFSETS FOR *52896002
                         THE ROUTINES TO ALLOCATE SPACE FOR THE        *52904002
                         RESPECTIVE FIXED LENGTHS IN A SPACE CONTROL A. 52912002
         GBLC  &IGAGSPF  BRANCH ENTRY OFFSET FOR FIXED LENGTH ENTRIES  *52920002
                         USING A FIXEDHDR FROM THE GSPACE MACRO OR FROM*52928002
                         INSIDE THE MODULE IGARPT01.                    52936002
         GBLC  &IGAS8    THE OFFSET FROM THE FIRST BYTE OF THE SPACE   *52944002
                         CONTROL AREA TO THE FIXEDHDR FOR              *52952002
                         8-BYTE ENTRIES.                                52960002
         GBLC  &IGAS12   THE OFFSET FROM THE FIRST BYTE OF THE SPACE   *52968002
                         CONTROL AREA TO THE FIXEDHDR FOR              *52976002
                         12-BYTE ENTRIES.                               52984002
         GBLC  &IGAS80   THE OFFSET FROM THE FIRST BYTE OF THE SPACE   *52992002
                         CONTROL AREA TO THE FIXEDHDR FOR              *53000002
                         80-BYTE ENTRIES.                               53008002
         GBLC  &IGACON   THE OFFSET TO THE CONTANT AREA.                53016002
         GBLC  &IGADDR   THIS IS THE OFFSET PAST THE BEGINNING OF THE  *53024002
                         TREEHDR TO FIND THE ADDRESS OF THE MODULE     *53032002
                         IGARPT01.                                      53040002
         GBLB  &IGALONE  ON FOR DIAGNOSTIC CHECKOUT FOR STANDALONE UNIT*53048002
                         TESTING.                                       53056002
         GBLB  &SNIP                                                    53064002
         GBLB  &TEST                                                    53072002
         GBLB  &EXOR                                                    53080002
         GBLB  &PAIRING                                                 53088002
         GBLB  &EDGE3                                                   53096002
         GBLB  &EDGE2                                                   53104002
         GBLB  &SEI                                                     53112002
         GBLB  &ESS                                                     53120002
         GBLB  &IGAVS2,&IGADIAG                                         53128002
         GBLB  &SUB                                                     53136002
         GBLB  &NOCBIT                                                  53144002
         GBLB  &CBIT  ONE IF THE C0 AND C1 FLAGS ARE FLAGS FOR THE      53152002
*                     LEFT AND RIGHT SUBTREES, ZERO IF NOT.             53160002
         GBLB  &BIGMASK  SET THIS TO ONE IF THERE IS ENOUGH SPACE FOR   53168002
         GBLB  &SNAP                                                    53176002
         GBLB  &IGASPIE        ON FOR SPIE BRANCH TRACE.                53184002
         GBLB  &IGAPGM  THIS IS SO THAT RPTDSECT GENERATES THE SHORTS.  53192002
         LCLC  &X        JUST A TEMPORARY VARIABLE FOR GENERATING      *53200002
               EXTREMELY COMPLICATED EXPRESSIONS WITH TOO LONG LABELS.  53208002
         LCLC  &Y,&Z     HERE ARE TWO MORE OF THE SAME KIND OF LOCAL   *53216002
                         TEMPORARIES.                                   53224002
         LCLB  &CEDG                                                    53232002
         LCLC  &PROGRAM                                                 53240002
*A000000-999998                                                  Y02147 53248002
IGARPT01 CSECT                                                          53256002
&PROGRAM SETC  'IGARPT01'                                               53264002
&TEST    SETB  (0)                                                      53272002
&CEDG    SETB  (0)                                                      53280002
&EXOR    SETB  (1)                                                      53288002
&SUB     SETB  (0)                                                      53296002
&PAIRING SETB  (0)                                                      53304002
&EDGE3   SETB  (1)                                                      53312002
&EDGE2   SETB  (0)                                                      53320002
&SEI     SETB  (1)                                                      53328002
&ESS     SETB  (0)                                                      53336002
&CBIT    SETB  (0)  DON'T COPY C-BITS.                                  53344002
&NOCBIT  SETB  (0)                                                      53352002
&BIGMASK SETB  (0)  USE THE LITTLE MASK TABLE FOR NOW.                  53360002
&SNIP    SETB  (0)                                                      53368002
         EJECT                                                          53376002
*********************************************************************** 53384002
* THE FOLLOWING ARE THE INTERPRETATIONS OF THE VALUES OF THE PATH BYTE: 53392002
P0000    EQU 0   A PATH BYTE CONTAINING FOUR LOW ORDER ZERO BITS MEANS* 53400002
*                THAT THERE ARE ZERO SINKS IN THE TREE.               * 53408002
P0001    EQU 1   0001 MEANS THERE IS ONE SINK, AND THE CURRENT PATH   * 53416002
*                SETTING ENDS WITH IT AS THE LAST VERTEX ON IT.       * 53424002
P0010    EQU 2   THIS IS AN UNUSED SETTING.                           * 53432002
P0011    EQU 3   THERE IS ONE SINK, AND THE CURRENT PATH IS AN        * 53440002
*                IMAGINARY PATH, SO THAT THE FIRST SINK TO THE RIGHT  * 53448002
*                OF THE IMAGINARY SINK IS THE SINGLE SINK PRESENT.    * 53456002
*                THERE ARE SEVERAL WAYS THIS PATH CODE CAN ARISE.     * 53464002
*                ONE WAY IS FOR A DELETE TO DELETE THE INNER VERTEX IN* 53472002
*                A TREE WITH EXACTLY TWO SINKS, WHERE THE SINK        * 53480002
*                REMAINING IS THE RIGHT SUCCESSOR OF THE MORIBUND     * 53488002
*                INNER VERTEX. THIS IS DONE SO THAT A SCANR AFTER A   * 53496002
*                DELETE WILL FIND THE FIRST SINK THAT WAS TO THE RIGHT* 53504002
*                OF THE DELETED SINK.                                 * 53512002
*                                                                     * 53520002
P0100    EQU 4   THIS CODE IS NOT USED.                               * 53528002
*                                                                     * 53536002
P0101    EQU   5   THERE IS EXACTLY ONE SINK AND THE IMAGINARY PATH   * 53544002
*                  GOES TO THE RIGHT OF IT.                           * 53552002
*                                                                     * 53560002
P0110    EQU   6   THERE ARE ZERO SINKS AND ISCAN HAS BEEN EXECUTED.  * 53568002
*                                                                     * 53576002
P0111    EQU   7   THERE IS EXACTLY ONE SINK AND ISCAN HAS BEEN DONE. * 53584002
*---------------------------------------------------------------------* 53592002
* NOTE THAT IN ALL OF THE ABOVE CASES IF BOTH THE FIRST AND LAST BITS * 53600002
* OF THE FOUR-BIT CODE ARE ZERO THEN THERE ARE ZERO SINK; IF THE      * 53608002
* FIRST BIT IS A ZERO AND THE LAST BIT IS ONE THEN THERE IS EXACTLY   * 53616002
* ONE SINK; AND IF THE TWO MIDDLE BITS ARE BOTH ONE THEN ISCAN HAS    * 53624002
* BEEN EXECUTED. THIS ALLOWS INITIALIZATION FOR SCANNING IN EITHER    * 53632002
* DIRECTION TO BE ACCOMPLISHED BY ORING B'00000110' TO THE PATH BYTE. * 53640002
         EJECT                                                          53648002
*********************************************************************** 53656002
* IN ALL OF THE FOLLOWING CASES THE NUMBER OF SINKS IS AT LEAST TWO,  * 53664002
* WHICH IS REPRESENTED BY THE FIRST BIT BEING A ONE. SIMILARLY, IN    * 53672002
* THE FOLLOWING CODES THE EXECUTION OF ISCAN IS REPRESENTED BY BOTH   * 53680002
* THE MIDDLE TWO BITS BEING ONES.                                     * 53688002
*                                                                     * 53696002
* IN ALL OF THE FOLLOWING CASES IF THE LAST BIT IS ZERO THE SINK AT   * 53704002
* THE END OF CURRENT PATH IS A LEFT SUCCESSOR, AND IF THE LAST BIT    * 53712002
* IS ONE THEN THE SINK AT THE END OF THE CURRENT PATH IS A RIGHT      * 53720002
* SUCCESSOR.                                                          * 53728002
*                                                                     * 53736002
* IN THE FOLLOWING DIAGRAMS P, C, AND S ARE THE VERTICES ON THE CURRENT 53744002
* PATH SETTING, AND X IS THE INNER VERTEX DELETED BY THE DELETE ROUTINE 53752002
* WHEREAS Z IS THE SINK THAT WAS DELETED. THE TREES SHOWN WITH X AND Z  53760002
* SHOW THE GRAPH BEFORE THE DELETE OCCURRED. THE REAL EDGES IN THE    * 53768002
* TREE ARE DEPICTED WITH  BARS  , WHILE THE FORMER EDGES ARE SHOWN    * 53776002
* WITH  PERIODS.  SINCE THE EDGES SHOWN WITH  PERIODS  ARE NO LONGER  * 53784002
* PRESENT, BUT THEIR FORMER REALITY LINGERS IN THE PATH CODE, THESE   * 53792002
* EDGES ARE REFERRED TO AS "CAT'S EDGES" IN THE COMMENTS.             * 53800002
* SIMILARLY, THE VERTEX Z IS OF SUCH IMAGINARY NATURE, AS WELL AS X.  * 53808002
* R IS THE VERTEX THAT SHARES THE SAME PREDECESSOR WITH S.            * 53816002
* IN THE FOLLING CODES IF THE VERTEX Z IS A LEFT SUCCESSOR OF X THEN  * 53824002
* THEN THE PENULTIMATE BIT IS ZERO, BUT IF Z IS A RIGHT SUCCESSOR     * 53832002
* THEN THE PENULTIMATE BIT OF THE PATH CODE IS A ONE.                 * 53840002
*        P1000   *   P1001      *     P1010   *   P1011      *          53848002
*                *              *             *              *          53856002
*          P     *     P        *       P     *     P        *          53864002
*          |     *     |        *       |     *     |        *          53872002
*    Z..X--C--R  *  R--C--X--S  * S--X--C--R  *  R--C--X..Z  *          53880002
*       |        *        .     *    .        *        |     *          53888002
*       |        *        .     *    .        *        |     *          53896002
*       S        *        Z     *    Z        *        S     *          53904002
*                *              *             *              *          53912002
*********************************************************************** 53920002
         RASS  (P1000,B'1000',P1001,B'1001',P1010,B'1010',P1011,X'B')   53928002
*********************************************************************** 53936002
*                *           *                                          53944002
*        P1100   *   P1101   *                                          53952002
*                *           *                                          53960002
*          P     *     P     *                                          53968002
*          |     *     |     *                                          53976002
*       S--C--R  *  R--C--S  *                                          53984002
*                *           *                                          53992002
         RASS   (P1100,B'1100',P1101,B'1101')                           54000002
*********************************************************************** 54008002
*    THE CODES P1110 AND P1111 MEAN THAT ISCAN HAS BEEN EXECUTED.       54016002
         RASS   (P1110,B'1110',P1111,B'1111')                           54024002
*********************************************************************** 54032002
LEF      EQU   0                                                        54040002
RGHT     EQU   4                                                        54048002
         RASS  (R0,0,R1,1,R2,2,R3,3,R4,4,R5,5,R6,6,R7,7,R8,8)           54056002
         RASS  (R9,9,R10,10,R11,11,R12,12,R13,13,R14,14,R15,15)         54064002
         RASS (TMP7,0,TMP8,1,LNG,11,E0,0,E1,1,I,2,NEW,3,P,4,VX,P,C,5,  X54072002
               VY,C)                                                    54080002
         RASS  (O,0,ALT,7,TAX,2,PAX,3)                                  54088002
         RASS  (PR,2,CR,3,SR,4)                                         54096002
         RASS  (S,6,FOR,6,RRL,7,SAR,8,TMP1,8,TMP2,8,TMP3,8,TMP4,8)      54104002
         RASS  (TMP5,8,TMP0,9,BIT,9,FAR,10,TMP6,10,VZ,11,PLA,12)        54112002
BYTEI    EQU   0   INDEX IN INNER VERTEX TO BYTE INDEX.                 54120002
         RASS  (ONE,1,TWO,2,THREE,3,FOUR,4,FIVE,5,SIX,6,SEVEN,7,       X54128002
               EIGHT,8,NINE,9,TEN,10,ELEVEN,11,TWELVE,12,THIRTEEN,13,  X54136002
               FOURTEEN,14,FIFTEEN,15,SIXTEEN,16)                       54144002
         RASS  (EIGHTY,X'50')                                           54152002
TWENTY4  EQU   24        JUST XXIV.                                     54160002
SAVEDSEK DSECT 0                REGISTER SAVE AREA DSECT.               54168002
SPACEWRD DC    F'0'  THIS IS THE TREE ADDRESS IF THE GSPCE/FSPACE       54176002
*                    STORAGE MANAGEMENT OPTION IS CHOSEN.               54184002
BACKEDGE DC    F'0'  EDGE FIELD FOR THE BACK CHAIN SAVE AREA.           54192002
BACKWARD EQU   BACKEDGE  USE THE SAME WORD FOR BOTH LABELS.             54200002
BACKWORD EQU   BACKWARD  USE ALL THREE LABELS FOR THE SAME THING.       54208002
FORWARD  DC    F'0'      EDGE FIELD FOR THE FORWARD EDGE IN THE REGISTER54216002
                         SAVE AREA CHAIN.                               54224002
GPR14    DC    F'0'  SAVE AREA FOR THE LINKAGE REGISTER, GPR14.         54232002
GPR15    DC    F'0'  SAVE AREA FOR GPR15.                               54240002
GPR0     DC    F'0'  SAVE AREA FOR GPR0.                                54248002
GPR1     DC    F'0'  SAVE AREA FOR GPR1.                                54256002
GPR2     DC    F'0'  SAVE AREA FOR GPR2.                                54264002
GPR3     DC    F'0'  SAVE AREA FOR GPR3.                                54272002
GPR4     DC    F'0'  SAVE AREA FOR GPR4.                                54280002
GPR5     DC    F'0'  SAVE AREA FOR GPR5.                                54288002
GPR6     DC    F'0'  SAVE AREA FOR GPR6.                                54296002
GPR7     DC    F'0'  SAVE AREA FOR GPR7.                                54304002
GPR8     DC    F'0'  SAVE AREA FOR GPR8.                                54312002
GPR9     DC    F'0'  SAVE AREA FOR GPR9.                                54320002
GPR10    DC    F'0'  SAVE AREA FOR GPR10.                               54328002
GPR11    DC    F'0'  SAVE AREA FOR GPR11.                               54336002
GPR12    DC    F'0'  SAVE AREA FOR GPR12.                               54344002
GPR13    DC    F'0'  SAVE AREA FOR GPR13.                               54352002
IGAIARG  EQU   GPR0  THIS IS THE NEW SINK ADDRESS FOR INSERT.           54360002
INSARG   EQU   IGAIARG                                                  54368002
SAVEFIN  EQU   *         THE END OF THE SAVE AREA.                      54376002
&PROGRAM CSECT                                                          54384002
         EJECT                                                          54392002
&IGAPGM  SETB  (1)       GET THE SHORT LABELS.                          54400002
      RPTDSECT T=5,DS=YES                                               54408002
DEADSINK EQU   IGAMASKS  DEAD SINK CONSTANT FOR TYPE 5 TREES, 80000000. 54416002
      RPTDSECT T=8,DS=YES                                               54424002
      RPTDSECT T=SPACE,DS=YES                                           54432002
         EJECT                                                          54440002
      GODOWNTO &IGASCH8                                                 54448002
IGASRCH8 EQU   *                                                        54456002
SRCH8    EQU   *                                                        54464002
*******************************************************************     54472002
*    S U B R O U T I N E  S R C H 8                               *     54480002
*******************************************************************     54488002
*                                                                       54496002
*                                                                     * 54504002
* UPON ENTRY TO THE SEARCH ROUTINE FOR TYPE 8 RADIX PARTITION TREES,  * 54512002
* THE REGISTERS HAVE THE FOLLOWING CONTENTS:                          * 54520002
*  R0:   THE ADDRESS OF THE RECORD OR AREA CONTAINING THE SEARCH KEY. * 54528002
*        THE ADDRESS OF THE SEARCH KEY IS FORMED BY ADDING THE        * 54536002
*        HALFWORD AT IGAKEYI IN THE RPT HEADER TO THE CONTENTS OF     * 54544002
*        REGISTER 0. THE KEY INDEX AT IGAKEYI IS OBTAINED FROM THE    * 54552002
*        STREE MACRO-INSTRUCTION AT THE TIME THE RPT IS FORMED, BY    * 54560002
*        MEANS OF THE K PARAMETER.                                    * 54568002
*                                                                     * 54576002
*  R1:   REGISTER 1 CONTAINS THE ADDRESS OF THE TREEHDR, AS IT IS     * 54584002
*        RETURNED TO THE USER PROGRAM FROM THE STREE                  * 54592002
*        MACRO-INSTRUCTION.                                           * 54600002
*                                                                     * 54608002
*  R13:  REGISTER 13 MUST ADDRESS A SAVE AREA THAT CAN BE USED FOR    * 54616002
*        STORING THE REGISTERS WHILE EXECUTING THE SEARCH.            * 54624002
*                                                                     * 54632002
*  LKR:REGISTER 14 CONTAINS THE RETURN ADDRESS FROM THE CALLING       * 54640002
*        PROGRAM.                                                     * 54648002
*                                                                     * 54656002
*  R15:  REGISTER 15 CONTAINS THE ADDRESS OF THE BEGINNING OF THE     * 54664002
*        MODULE IGARPT01.                                             * 54672002
*                                                                     * 54680002
*        THE RETURN CODE IS SET IN GPR 15:                              54688002
*        NON-NEGATIVE:   R15 CONTAINS THE ADDRESS ASSOCIATED WITH THE * 54696002
*                        KEY FOUND BY THE SEARCH.                     * 54704002
*        NEGATIVE:       THE RPT IS EMPTY, I. E. IT DOES NOT CONTAIN  * 54712002
*                        ANY KEY-ADDRESS ASSOCIATIONS.                * 54720002
*        IN BOTH CASES THE CONDITION CODE IS EITHER SET TO 01 IF THE  * 54728002
*        RPT IS EMPTY, OR TO 00 (ZERO) IF THE SEARCH FOUND A SINK IN  * 54736002
*        A SUBTREE OF EQUALS, OR TO 11 IF THE ONE IT FOUND IS NOT IN  * 54744002
*        A SUBTREE OF EQUALS.                                         * 54752002
*                                                                       54760002
FIRSTR   EQU   0   THIS IS THE FIRST REGISTER THAT MUST BE SAVED.       54768002
SARG     EQU   0         THIS REGISTER CONTAINS THE ADDRESS OF THE     *54776002
                         SEARCH KEY UPON ENTRY TO THE SEARCH ROUTINE.   54784002
LASTR    EQU   5  THIS IS THE LAST REGISTER THAT MUST BE SAVED.         54792002
TMP      EQU   0  THIS IS A WORKING REGISTER.                           54800002
BASE     EQU   1  THIS IS THE BASE REGISTER FOR THE PARAMETER LIST.     54808002
A        EQU   2  THIS IS THE ADDRESS OF A VERTEX.                      54816002
B        EQU   3  THIS IS ALSO A VERTEX ADDRESS.                        54824002
ADR      EQU   4  THIS IS THE ADDRESS OF THE SEARCH ARGUMENT.           54832002
ZX       EQU   5  THIS IS A WORKING REGISTER TO TEST THE BITS.          54840002
LKR      EQU   14        LINKAGE REGISTER FOR SUBROUTINES.              54848002
         USING SRCH8,15  USE THE SAME BASE REGISTER THAT IS SET UP.     54856002
         USING TREEHDR,BASE  THIS IS THE BASE OF THE DSECT ENTRY.       54864002
         TM    PATH,P1000      START THE SEARCH WITH SRCH8A IF THERE    54872002
         BC    1,SRCH8A        ARE AT LEAST TWO SINKS.                  54880002
         NI    PATH,P1001      THERE IS EITHER ONE OR ZERO SINKS.       54888002
         BC    7,SRCHFOR1  BRANCH IF THERE IS EXACTLY ONE SINK.         54896002
         LEAF  SAVE=,LV=,RC=-1                                          54904002
*********************************************************************** 54912002
*   SEARCH SUBROUTINE.                                                * 54920002
*********************************************************************** 54928002
SRCH8A   EQU   *                                                        54936002
         STM   FIRSTR,LASTR,((X'04'*FIRSTR)+X'14'-X'40'*((X'02'+FIRSTR)-54944002
               /X'10'))(13)  SAVE THE REGISTERS.                        54952002
         SLR   ZX,ZX           ZERO OUT REGISTER FOR IC INSTRUCTION.    54960002
         AH    SARG,IGAKEYI  COMPUTE THE ADDRESS OF THE SEARCH KEY.     54968002
         LR    ADR,SARG  PUT THE ADDRESS OF THE SEARCH KEY IN ADR.      54976002
         L     A,APT  INITIALIZE A TO THE ADDRESS OF THE SOURCE.        54984002
         LR    B,A    SET B TO THE SAME INITIAL VALUE AS A.             54992002
         TSTBT A,ONE=SRCH8D    BRANCH IF ONE EDGE IS TAKEN.             55000002
SRCH8B   BT00  A,SRCH8J        BRANCH IF T0 IS ZERO.                    55008002
         TLE   B,A       TRACE PATH TO LEFT SUCCESSOR OF A.             55016002
         TSTBT B,ONE=SRCH8G    TEST BIT AND BRANCH IF ONE.              55024002
SRCH8C   BT00  B,SRCH8K        BRANCH IF B'S LEFT SUCCESSOR IS A SINK.  55032002
         TLE   A,B       TRACE THE PATH TO B'S SUCCESSOR.               55040002
         TSTBT A,ZERO=SRCH8B   BRANCH TO TAKE THE LEFT EDGE.            55048002
SRCH8D  BNET10 A,SRCH8H                                                 55056002
SRCH8E   TRE   B,A       TRACE EDGE TO A'S RIGHT SUCCESSOR.             55064002
SRCH8F   TSTBT B,ZERO=SRCH8C   BRANCH TO TAKE THE LEFT EDGE.            55072002
SRCH8G  BNET10 B,SRCH8I                                                 55080002
         TRE   A,B       TRACE RIGHT EDGE TO B'S RIGHT SUCCESSOR.       55088002
         TSTBT A,ZERO=SRCH8B   BRANCH TO TAKE THE LEFT EDGE.            55096002
        BNET11 A,SRCH8E                                                 55104002
SRCH8H   LR    TMP,A  EXCHANGE THE CONTENTS OF REGISTERS A AND B SO     55112002
         LR    A,B    THAT REGISTERS A AND B CONTAIN CONSECUTIVE        55120002
         LR    B,TMP  VERTICES DOWN THE PATH TO THE SINK FOUND.         55128002
*********************************************************************** 55136002
* THE SITUATION AT THIS POINT IS SUMMARIZED IN THE FOLLOWING TABLE,   * 55144002
* WHICH RELATES THE POSSIBLE COMBINATIONS OF THE THREE BITS IGANEBIT, * 55152002
* T0, AND T1 AT THE VERTEX B TO THE CONDITION CODE SETTINGS, AND THE  * 55160002
* INDICATED ACTIONS ARE PERFORMED:                                    * 55168002
* IGANEBIT: T0: T1: CONDITION  MEANING AND ACTION:                    * 55176002
* --------- --- --- CODE:      -------------------                    * 55184002
*                   ---------                                         * 55192002
*    0       0   0  00         B IS IN A SUBTREE OF EQUAL KEYS, AND   * 55200002
*                              THEREFORE THE SEARCH SHOULD PROCEED    * 55208002
*                              DOWN THE PATH INTO THE LEFT SUCCESSOR  * 55216002
*                              OF VERTEX B. BY GOING TO SRCH8C BIT T0 * 55224002
*                              IS TESTED TO SEPARATE THIS CASE FROM   * 55232002
*                              THE 0 1 0 CASE DOWN BELOW.             * 55240002
*    0       0   1  01         GO TO SRCH8J TO GET A'S LEFT SUCCESSOR * 55248002
*                              FOR THE SINK ADDRESS FOUND BY SEARCH.  * 55256002
*                              THIS IS DONE BY LETTING THE TEST FOR   * 55264002
*                              BIT T0 BEING A ZERO BE PERFORMED AT    * 55272002
*                              SRCH8C.                                * 55280002
*    0       1   0  00         SEE THE DESCRIPTION OF THE FIRST CASE  * 55288002
*                              ABOVE.                                 * 55296002
*    0       1   1  01         ALSO SEE THE FIRST CASE ABOVE.         * 55304002
*    1       0   0  01         GET B'S RIGHT SUCCESSOR FOR THE SINK.  * 55312002
*    1       0   1  XX         THIS CASE IS NOT POSSIBLE.             * 55320002
*    1       1   0  01         GET B'S RIGHT SUCCESSOR FOR THE SINK.  * 55328002
*    1       1   1  XX         THIS CASE IS NOT POSSIBLE.             * 55336002
*                                                                     * 55344002
SRCH8I   TM    FLAGS(A),IGANEBIT  SEE IF B IS THE SOURCE OF A SUBTREE  *55352002
                         OF EQUAL KEYS.                                 55360002
         BZ    SRCH8C    BRANCH IF IT IS ANY OF THE ABOVE FOUR CASES. * 55368002
         MVI   IGAPATH,P1101   SET THE PATH CODE TO INDICATE A RIGHT   *55376002
                         SINK SUCCESSOR.                                55384002
         LA    A,O(,A)   CLEAR THE HIGH ORDER BYTE.                     55392002
         LA    B,O(,B)   CLEAR THE HIGH ORDER BYTE.                     55400002
         STM   A,B,IGANTPEN  STORE THE LAST TWO INNER VERTICES ON THE  *55408002
                         PATH TO THE SINK.                              55416002
         X     A,RGHT(,B)  GET THE RIGHT SINK SUCCESSOR OF B.           55424002
         LA    R15,O(,A)  CLEAR THE HIGH ORDER BYTE.                    55432002
         ST    R15,IGAFARG  STORE THE ADDRESS ASSOCIATED WITH THE KEY  *55440002
               FOUND BY SEARCH.                                         55448002
         TM    *+1,B'11111111'  SET THE CONDITION CODE TO 11.           55456002
         LM    FIRSTR,LASTR,((X'04'*FIRSTR)+X'14'-X'40'*((X'02'+FIRSTR)-55464002
               /X'10'))(13)  RESTORE THE REGISTERS.                     55472002
         BR    LKR       RETURN.                                        55480002
SRCH8J   LR    TMP,A  EXCHANGE THE CONTENTS OF REGISTERS A AND B SO     55488002
         LR    A,B    THAT REGISTERS A AND B CONTAIN CONSECUTIVE        55496002
         LR    B,TMP  VERTICES DOWN THE PATH TO THE SINK FOUND.         55504002
SRCH8K   MVI   IGAPATH,P1100  SET THE PATH CODE TO INDICATE A LEFT SINK*55512002
                         SUCCESSOR.                                     55520002
         LA    A,0(,A)   CLEAR THE HIGH ORDER BYTES IN THE TWO          55528002
         LA    B,O(,B)   ADDRESS DOWN THE PATH.                         55536002
         STM   A,B,IGANTPEN  STORE THE ANTEPENULTIMATE AND THE         *55544002
                         PENULTIMATE VERTICES ON THE PATH TO THE SINK.  55552002
         X     A,LEF(,B)  GET THE LEFT SUCCESSOR OF VERTEX B.           55560002
         LA    R15,O(,A)  CLEAR THE HIGH ORDER BYTE.                    55568002
         ST    R15,IGAFARG  STORE THE ADDRESS ASSOCIATED WITH THE KEY  *55576002
               THAT IS NOW AT THE CURRENT CURSOR SETTING.               55584002
         TM    FLAGS(B),IGANEBIT  SET THE CONDITION CODE TO ZERO IF THE*55592002
                         SINK THAT SEARCH FOUND IS IN A SUBTREE OF     *55600002
                         EQUAL KEYS.                                    55608002
         LM    FIRSTR,LASTR,((X'04'*FIRSTR)+X'14'-X'40'*((X'02'+FIRSTR)-55616002
               /X'10'))(13)  RESTORE THE REGISTERS.                     55624002
         BR    14        EXIT.                                          55632002
SRCHFOR1 L     R15,APT       THERE IS EXACLTY ONE SINK, RETURN IT.      55640002
         LA    R15,O(O,R15)  CLEAR THE HIGH ORDER BYTE.                 55648002
         ST    R15,FARG      SAVE THE ADDRESS OF THE KEY FOUND.         55656002
         TM    *+1,B'11111111'  SET THE CONDITION CODE TO 11.           55664002
         BCR   15,LKR        RETURN WITH THE PROPER RETURN CODE.        55672002
         DROP  R15                                                      55680002
         DROP  BASE                                                     55688002
         EJECT                                                          55696002
*********************************************************************** 55704002
* DELETE THE SINK S WHEN THERE ARE MORE THAN TWO SINKS STILL IN THE   * 55712002
* TREE.                                                               * 55720002
*********************************************************************** 55728002
* THERE ARE THREE MAJOR CASES:                                        * 55736002
*---------------------------------------------------------------------- 55744002
* A. THE INNER VERTEX THAT WILL BE DELETED IS CURRENTLY THE SOURCE;   * 55752002
* B. THE INNER VERTEX C TO BE DELETED IS NOT THE SOURCE, AND THE      * 55760002
*    VERTEX PAIRED WITH THE SINK S BEING DELETED IS A SINK;           * 55768002
* C. THE INNER VERTEX TO BE DELETED IS NOT THE SOURCE, AND THE VERTEX * 55776002
*    PAIRED WITH THE SINK S TO BE DELETED IS AN INNER VERTEX.         * 55784002
*.....................................................................* 55792002
*  FOR CASE (A) THE FOLLWOING STEPS MUST BE DONE:                     * 55800002
* 0. SET ALT TO TO THE INNER VERTEX PAIRED WITH S.                    * 55808002
* 1. SET PATH TO 1000 IF S IS A LEFT SUCCESSOR, OR TO 1011 IF S IS A  * 55816002
*    RIGHT SUCCESSOR.                                                 * 55824002
* 2. SET APT, AP, AND AC TO ALT.                                      * 55832002
* 3. SET RL AT ALT TO ZERO, SINCE ALT WILL BE THE NEW SOURCE.         * 55840002
* 4. ADJUST THE EDGES AT ALT IF THEY HAVE TO BE ADJUSTED.             * 55848002
* 5. RETURN THE SPACE FREED BY THE DELETION TO THE FREE SPACE CHAINS. * 55856002
*    THIS IS ACCOMPLISHED BY BRANCHING TO DEL8FREE.                   * 55864002
*...................................................................... 55872002
*   FOR CASE B, THE FOLLOWING STEPS MUST BE DONE:                     * 55880002
* 0. SET ALT TO THE VERTEX PAIRED WITH THE SINK S BEING DELETED.      * 55888002
* 1. SET PATH TO 10QR, WHERE Q=0 IF S IS A LEFT SUCCESSOR, Q=1 IF S   * 55896002
*    IS A RIGHT SUCCESSOR, R=0 IF C IS A LEFT SUCCESSOR, AND R=1 IF C * 55904002
*    A RIGHT SUCCESSOR.                                               * 55912002
* 2. SET AC TO P.                                                     * 55920002
* 3. SET AP TO P'S PREDECESSOR.                                       * 55928002
* 4. REMOVE THE EDGE (P,C) FROM THE GRAPH AND PUT IN THE EDGE (P,ALT).* 55936002
* 5. COPY THE APPROPRIATE C-BIT FROM C TO P FOR ALT.                  * 55944002
* 6. SET THE TR BIT AT P TO ZERO, BECAUSE THE NEW SUCCESSOR OF P, WZ, * 55952002
*    ON SIDE R OF P, WILL BE A SINK.                                  * 55960002
*...................................................................... 55968002
*   FOR CASE C, THE FOLLOWING STEPS MUST BE DONE:                     * 55976002
*                                                                     * 55984002
* 0. SET ALT TO THE VERTEX PAIRED WITH THE SINK S TO BE DELETED.      * 55992002
* 1. SET PATH TO 1000 IF S IS A LEFT SUCCESSOR, OR TO 1011 IF S IS A  * 56000002
*    RIGHT SUCCESSOR.                                                 * 56008002
* 2. SET AC TO ALT.                                                   * 56016002
* 3. REMOVE THE EDGE (P,C) FROM THE GRAPH AND PUT IN THE EDGE (P,ALT).* 56024002
* 4. COPY THE C-BIT FOR ALT FROM C TO P.                              * 56032002
* 5. COPY THE RL BIT FROM C TO ALT.                                   * 56040002
* 6. ADJUST THE EDGES AT ALT IF NECESSARY.                            * 56048002
* 7. RETURN THE SPACE MADE AVAILABLE BY GOING TO DEL8FREE.            * 56056002
*                                                                     * 56064002
*********************************************************************** 56072002
* ENTRY POINT FOR THE DEL MACRO-INSTRUCTION.                          * 56080002
*********************************************************************** 56088002
      GODOWNTO &IGADEL8  SKIP DOWN TO THE LOCATION FOR THE TYPE 8      *56096002
                         DELETION ROUTINE.                              56104002
DEL8     EQU   *   ENTRY POINT FOR A DELETION.                          56112002
         USING DEL8,R15  USE THE BASE REGISTER THAT THE DEL            *56120002
                         MACRO-INSTRUCTION PROVIDES.                    56128002
         USING TREEHDR,R1                                               56136002
         TM    PATH,P1000      SEE IF THERE ARE AT LEAST TWO SINKS,     56144002
         JMP   1,ATLEAST2      JUMP IF THERE ARE AT LEAST 2.            56152002
         L     R15,APT       RETURN THE ADDRESS SO IT CAN BE FREED.     56160002
         XC    APT,APT       ZERO OUT THE ADDRESS OF THE RADIX          56168002
*                            PARTITION TREE. USE XC TO DO THIS BECAUSE  56176002
*                            THERE AREN'T ANY REGISTERS AVAILABLE TO    56184002
*                            USE THE SLR-ST SEQUENCE.                   56192002
         LA    R15,O(O,R15)    CLEAR THE LEFT BYTE.                     56200002
         TM    IGADDR,B'11111111'  SET THE CONDITION CODE TO 01, TO    *56208002
                         INDICATE THAT THERE ARE NO MORE ENTRIES LEFT  *56216002
                         IN THE TREE.  A BM INSTRUCTION TAKES WITH IT.  56224002
         BCR   15,LKR          ZERO AND RETURN.                         56232002
         DROP  R1                                                       56240002
ATLEAST2 EQU   *  COME HERE FOR DELETE WHEN THERE ARE AT LEAST 2 SINKS. 56248002
         RASS  (WX,3,WY,4,WZ,8,DW0,6,WZ0,6,DW1,6,DW2,6,DW3,7,SNK,9,    X56256002
               RC,10,RS,11,PXC,12)                                      56264002
         STM   R2,R12,((4*R2)+20-64*((2+R2)/16))(R13)  SAVE THE GPRS.   56272002
         USING TREEHDR,R1      ADDRESS OF TREEHDR IS IN R1.             56280002
         LM    P,C,AP    LOAD UP THE REGISTERS WITH THE LAST TWO        56288002
*                        INNER VERTICES ON THE PATH TO THE SINK         56296002
*                        TO BE DELETED.                                 56304002
         LA    RS,RL     (S4) SET UP RS TO HAVE A FOUR IF THE SINK TO   56312002
*                             BE DELETED IS A RIGHT SUCCESSOR.          56320002
         IC    RC,FLAGS(O,C)   (S8) SET RC TO THE VALUE OF THE RL FLAG  56328002
         NR    RC,RS           (S8) AT VERTEX C, I.E. SET RC TO A ZERO  56336002
*                                   IF C IS A LEFT SUCCESSOR OR TO FOUR 56344002
*                                   IF C IS A RIGHT SUCCESSOR.          56352002
         LM    WZ,SNK,O(C)     (S4,S5) PREPARE TO COMPUTE THE           56360002
*                              SUCCESSORS OF THE VERTEX C, WHICH IS     56368002
*                              PREDECESSOR OF THE SINK TO DELETE.       56376002
         TM    PATH,P0001      (S4) SET THE CONDITION CODE TO ONE IF    56384002
*                              THE VERTEX TO DELETE IS A RIGHT          56392002
*                              SUCCESSOR.                               56400002
         LA    WY,O(O,P)       (S4) CLEAR THE HIGH ORDER BYTE SO IT CAN 56408002
*                              BE USED FOR ADJUSTING EDGES.             56416002
         L     HDB,HVFC  (S6) PUT THE FIXEDHDR ADDRESS IN               56424002
*                        HDB SO THE DOUBLE WORD AT C CAN BE FREED.      56432002
         LA    WX,O(O,C)       (S8) WX WILL EVENTUALLY HAVE THE         56440002
*                              PREDECESSOR OF THE ANTEPENULTIMATE       56448002
*                              VERTEX ON THE PATH TO THE SINK.          56456002
         USING FIXEDHDR,HDB    (S6) ESTABLISH ADDRESSABILITY TO THE     56464002
*                              BLOCK CONTAINING THE HEAD OF THE FREE    56472002
*                              SPACE CHAIN.                             56480002
         L     PXC,HEADFREE    (S6) GET THE CURRENT ADDRESS OF THE      56488002
*                              FIRST DOUBLE WORD ON THE FREE SPACE      56496002
*                              CHAIN.                                   56504002
         JMP   1,SISRIGHT      (S4) JUMP IF S IS A RIGHT SUCCESSOR,     56512002
*                              SO THAT RS, WZ, AND SNK ARE SET UP       56520002
*                              CORRECTLY IF THE JUMP TAKES.             56528002
         LR    DW0,WZ    (S4,S5) S IS A LEFT SUCCESSOR, EXCHANGE THE    56536002
         LR    WZ,SNK    (S4,S5) TWO VERTICES WZ AND SNK, SO THAT       56544002
         LR    SNK,DW0   (S4,S5) SNK IS THE LEFT SUCCESSOR AND WZ IS    56552002
*                        THE RIGHT SUCCESSOR OF C.                      56560002
         SLR   RS,RS     (S4) SET RS TO A ZERO, BECAUSE S IS A LEFT     56568002
*                        SUCCESSOR.                                     56576002
SISRIGHT EQU   *         JUMP HERE IF S IS A RIGHT SUCCESSOR.           56584002
         ST    PXC,O(O,WX)     (S6) STORE THE ADDRESS OF THE REST OF    56592002
*                              THE FREE SPACE CHAIN IN THE FIRST WORD   56600002
*                              OF THE NEWLY AVAILABLE DOUBLE WORD.      56608002
*        NOTE THAT THE SECOND WORD OF THE DOUBLE WORD IS NOT CHANGED  * 56616002
*        BY THIS STORE, AND THE FLAG BYTE THAT IT CONTAINS IS TESTED  * 56624002
*        LATER IN THE DEL8 CODE SEQUENCE.                             * 56632002
         XR    WZ,WY     (S4) COMPUTE THE VERTEX PAIRED WITH THE        56640002
*                        SINK TO BE DELETED.                            56648002
         XR    SNK,WY    (S5) COMPUTE THE SINK ADDRESS THAT IS TO BE    56656002
*                        DELETED.                                       56664002
         ST    WX,HEADFREE     (S6) STORE THE ADDRESS OF THE RELEASED   56672002
         DROP  HDB             DOUBLE WORD AS THE NEW HEAD OF THE       56680002
*                              FREE SPACE CHAIN.                        56688002
         LR    PXC,WX    (S7) COMPARE THE PENULTIMATE AND               56696002
         XR    PXC,WY    (S7) ANTEPENULTIMATE VERTICES ON THE PATH TO   56704002
*                        THE SINK BY EXCLUSIVE-ORING TO FIND OUT IF     56712002
*                        THEY ARE EQUAL. IF THEY ARE EQUAL THE TOP OF   56720002
*                        THE RPT IS AFFECTED BY THE DELETE.             56728002
*                        THE EXCLUSIVE-ORED RESULT IS ALSO USEFUL       56736002
*                        LATER IF IT IS A MOP DELETE.                   56744002
         LA    WZ,O(O,WZ)      (S14) CLEAR THE HIGH ORDER BYTE SO IT    56752002
*                              CAN BE USED FOR EDGE ADJUSTMENT.         56760002
         JMP   8,DEL8TOP (S7) JUMP IF THE TOP IS AFFECTED.              56768002
         X     WX,O(RC,WY)     (S8) COMPUTE THE PREDECESSOR OF THE      56776002
*                        ANTEPENULTIMATE VERTEX ON THE PATH TO THE      56784002
*                        SINK TO BE DELETED.                            56792002
*        NOTE THAT THE LEFT BYTE OF THE WORD NOW IN WX IS THE SAME    * 56800002
*        AS THE LEFT BYTE IN THE WORD AT O(RC,WY).                    * 56808002
*        THIS IS VERY GOOD, BECAUSE THE EDGE FIELD IS ADJUSTED BY     * 56816002
*        STORING THE WHOLE WORD WITHOUT CHANGING THE BYTE.            * 56824002
         LR    WZ0,WZ    (S9) COMPUTE THE EXCLUSIVE-OR EDGE FIELD FROM  56832002
*                        THE TWO ADDRESSES TOGETHER.                    56840002
         XR    WZ0,WX    (S9) WY TO ITS NEW SUCCESSOR BY                56848002
         ST    WZ0,O(RC,WY)  (S9) EXCLUSIVE-ORING THE TWO ADDRESSES     56856002
*                              TOGETHER.                                56864002
         LA    WX,O(O,WX)      (S12) CLEAR THE LEFT BYTE FOR USE LATER. 56872002
         TM    FLAGS(C),T0+T1  (S10) SEE IF THE VERTEX WZ IS AN INNER   56880002
         JMP   7,DEL8MOP       (S10) VERTEX, AND JUMP IF SO.            56888002
DEL8EOP  STM   WX,WY,AP  (S12,S13) STORE THE TWO PATH VERTICES.         56896002
         L     DW1,FLAGS(O,WY) (S13) PREPARE TO SET THE T-BIT FOR WZ    56904002
*                              AT ITS PREDECESSOR TO ZERO.              56912002
         LA    RS,(FOUR*P1000)(RS,RS)  (S11) SET THE PATH BYTE          56920002
         ALR   RS,RC     (S11)  TO 1,0,RS,RC TO REPRESENT THE           56928002
         SRL   RS,TWO    (S11) CAT'S EDGE TO THE DELETED SINK FOR       56936002
         STC   RS,PATH   (S11) SUBSEQUENT SCANL OR SCANR OPERATIONS.    56944002
         AL    DW1,SETTZERO(RC)  (S13) SET THE T-BIT FOR WZ TO ZERO IN  56952002
         ST    DW1,FLAGS(O,WY)  (S13) ITS PREDECESSOR'S FLAG BYTE.      56960002
         LA    R15,O(O,SNK)    (S5) GET THE RETURN CODE, I.E. THE       56968002
*                              SINK ADDRESS DELETED.                    56976002
         LM    R2,R12,((4*R2)+20-64*((2+R2)/16))(R13)  (S13)            56984002
         LTR   R15,R15   SET THE CONDITION CODE FOR THE RETURN.         56992002
         JMP   15,(LKR)        XX                                       57000002
DEL8MOP  EQU   *         (S14) COME HERE WHEN THE VERTEX PAIRED WITH    57008002
*                        THE SINK TO BE DELETED IS AN INNER VERTEX,     57016002
*                        SO THAT THE DELETE IS A MOP DELETE.            57024002
         ST    WZ,AC     (S14) STORE THE NEW PENULTIMATE PATH VERTEX.   57032002
         LM    DW2,DW3,O(WZ)   (S15,16) ADJUST THE EDGES OF THE INNER   57040002
*                              (S15) VERTEX PAIRED WITH THE SINK TO     57048002
*                              BE DELETED.                              57056002
         ALR   RC,RS     (S15) SET THE RL BIT AT WZ TO BE THE SAME      57064002
         X     DW3,RLTAB0(RC)  (S15) AS THE RL BIT IN THE DELETED       57072002
*                              INNER VERTEX C.                          57080002
*        THIS IS ACCOMPLISHED BY REALIZING THAT RS IS A ZERO OR FOUR  * 57088002
*        WHEN WZ IS A RIGHT OR LEFT SUCCESSOR OF C RESPECTIVELY, AND  * 57096002
*        THAT RC IS A ZERO OR FOUR WHEN C IS A LEFT OR RIGHT VERTEX   * 57104002
*        RESPECTIVELY. THIS MEANS THAT IF RS AND RC ARE EQUAL THEN    * 57112002
*        THE RL BIT CURRENTLY IN WZ MUST BE COMPLEMENTED, BUT IF RS   * 57120002
*        AND RC ARE NOT EQUAL THE RL BIT AT WZ CAN BE LEFT ALONE,     * 57128002
*        BECAUSE IT IS ALREADY SET CORRECTLY.                         * 57136002
*        THUS BY ADDING RC AND RS A RESULT OF ZERO OR EIGHT IS        * 57144002
*        OBTAINED IF THEY ARE EQUAL, OR A RESULT OF FOUR IS OBTAINED  * 57152002
*        IF THEY ARE NOT EQUAL. THEN BY USING THIS VALUE OF 0, 4, OR 8* 57160002
*        TO INDEX INTO A TABLE THAT HAS A ONE IN THE RL BIT POSITION  * 57168002
*        IN THE FIRST AND THIRD WORDS, AND WITH THE MIDDLE WORD ALL   * 57176002
*        ZEROS, EXCLUSIVE-ORING THE SELECTED WORD WILL EITHER LEAVE   * 57184002
*        THE RL BIT ALONE OR COMPLEMENT IT APPROPRIATELY.             * 57192002
         XR    DW2,PXC   (S16) ADJUST WZ'S EDGE FIELDS BY REMOVING      57200002
         XR    DW3,PXC   (S16) THE DELETED INNER VERTEX AND PUTTING     57208002
*                        IN THE NEW PREDECESSOR OF WZ.                  57216002
         STM   DW2,DW3,O(WZ)   (S15,S16) STORE BACK THE ADJUSTED FIELDS 57224002
*                              FOR WZ.                                  57232002
         IC    RS,RSTAB0(RS)  (S17) SET THE PATH CODE BYTE TO 10,RS,RS. 57240002
DEL8PATH STC   RS,PATH   (S17) STORE THE NEW PATH BYTE.                 57248002
         LA    R15,O(O,SNK)    (S5) SET THE RETURN CODE TO THE SINK     57256002
*                              THAT WAS DELETED.                        57264002
         LM    R2,R12,((4*R2)+20-64*((2+R2)/16))(R13)  (S18)            57272002
         LTR   R15,R15   SET THE CONDITION CODE FOR THE RETURN.         57280002
         JMP   15,(LKR)        (S18) COULD HAVE BEEN CHANGED.           57288002
DEL8TOP  ST    WZ,APT    (S19) STORE THE NEW SOURCE OF THE RPT.         57296002
         SLR   RC,RC     (S20) SET RC TO ZERO SO THAT THE RL BIT AT     57304002
*                        WZ WILL BE SET TO ZERO, SINCE IT IS THE NEW    57312002
*                        SOURCE OF THE RPT.                             57320002
         XR    WX,WZ     (S22) CAUSE THE EDGE ADJUSTMENT FOR STEP 16    57328002
         XR    PXC,WX    (S22) TO PUT WZ IN ITS EDGE FIELDS AS ITS OWN  57336002
*                        PREDECESSOR, WHICH IS THE CONVENTION FOR THE   57344002
*                        SOURCE VERTEX OF THE RPT.                      57352002
         ST    C,AP      (S22) STORE THE NEW ANTEPENULTIMATE VERTEX.    57360002
         TM    FLAGS(C),T0+T1  (S21) SEE IF WZ IS AN INNER VERTEX,      57368002
         JMP   7,DEL8MOP  (S23) BECAUSE IF IT IS NOT AN INNER VERTEX    57376002
*                              THE DELETE IS DELETING ONE OF THE ONLY   57384002
*                              TWO SINKS LEFT IN THE RPT.               57392002
         IC    RS,RSTAB1(RS)   (S24) SET THE PATH BYTE TO 0011 OR 0101, 57400002
*                             FOR RS BEING A ZERO OR FOUR RESPECTIVELY. 57408002
         STC   RS,PATH   (S24) STORE THE NEW PATH CODE.                 57416002
         LA    R15,O(O,SNK)    S5) RETURN THE ADDRESS OF THE SINK.      57424002
         LM    R2,R12,((4*R2)+20-64*((2+R2)/16))(R13)  (S25)            57432002
         LTR   R15,R15   SET THE CONDITION CODE FOR THE RETURN.         57440002
         JMP   15,(LKR)        (S25) RETURN.                            57448002
         DROP  R1                                                       57456002
         DROP  R15                                                      57464002
         EJECT                                                          57472002
*********************************************************************** 57480002
*   D E L E T E    R O U T I N E    F O R    T Y P E    5    R A D I X* 57488002
*    P A R T I T I O N    T R E E S    .                              * 57496002
*********************************************************************** 57504002
     GODOWNTO  &IGADEL5  SKIP DOWN TO THE ENTRY POINT FOR THE TYPE 5   *57512002
                         DELETE.                                        57520002
EVEN5    EQU   R4        AN EVEN/ODD PAIR OF WORK REGISTERS             57528002
ODD5     EQU   R5        FOR USE IN DEL5.                               57536002
IGADEL5  EQU   *         COME HERE TO DELETE FROM A TYPE 5 TREE.        57544002
         USING IGARPTH5,R1                                              57552002
         USING IGADEL5,R15  USE THE BASE REGISTER THAT THE DEL         *57560002
                         MACRO-INSTRUCTION PROVIDES.                    57568002
         USING SAVEDSEK,R13                                             57576002
         STM   EVEN5,ODD5,GPR0+4*EVEN5  SAVE THE TWO REGISTERS.         57584002
         L     ODD5,O(O,IGAC5)  LOAD THE OLD SINK WORD FOR THE RETURN   57592002
*                               CODE IN GPR 15 LATER.                   57600002
         CLR   IGAP5,IGAC5     SEE IF THERE IS ONLY ONE SINK BEFORE     57608002
         JMP   7,AROUND5       THE DELETE, JUMPING IF NOT.              57616002
         MVC   IGATOP5,DEADSINK  MOVE IN THE EMPTY TREE FLAG.           57624002
         BC    15,DOWN5  BRANCH TO THE EXIT, THAT WAS SHORT.            57632002
AROUND5  LA    EVEN5,FOURCON   GET A CONSTANT 4.                        57640002
         XR    IGAC5,EVEN5     GET THE VERTEX PAIRED WITH THE SINK      57648002
*                              THAT IS TO BE DELETED.                   57656002
         MVC   O(4,IGAP5),O(IGAC5)  DELETE THE SINK.                    57664002
         OR    IGAC5,EVEN5     GENERATE THE VERTEX WHICH IS THE LEFT    57672002
         XR    IGAC5,EVEN5     SUCCESSOR OF THE PREDECESSOR OF THE SINK 57680002
*                              TO BE DELETED.                           57688002
         L     EVEN5,IGACNT5   SUBTRACT ONE FROM THE USE COUNT SO THE   57696002
         BCTR  EVEN5,O         VALIDITY OF SIMULTANEOUS READ-ONLY       57704002
         ST    EVEN5,IGACNT5   SEARCHES IS MAINTAINED.                  57712002
         L     EVEN5,IGAHVFC5  PUT THE DOUBLE WORD MADE AVAILABLE BY    57720002
         STM   EVEN5,ODD5,O(IGAC5)  THE DELETION ON THE FREE SPACE      57728002
*                              CHAIN, AND MAKE SURE THAT BIT 0 OF       57736002
*                              BOTH WORDS ON THE FREE SPACE CHAIN ARE   57744002
*                              ZERO TO AVOID THE INFINITE SEARCH LOOP   57752002
*                              THAT COULD OCCUR SOMETIME DURING THE     57760002
*                              NEXT THOUSAND YEARS.                     57768002
         ST    IGAC5,IGAHVFC5  STORE THE NEW HEAD OF THE CHAIN.         57776002
DOWN5    LTR   R15,ODD5  PUT THE SINK WORD IN R15 FOR THE RETURN CODE.  57784002
         LM    EVEN5,ODD5,GPR0+4*EVEN5  RESTORE THE TWO REGISTERS.      57792002
         JMP   15,(LKR)  RETURN.                                        57800002
         DROP  R1                                                       57808002
         DROP  R13                                                      57816002
         DROP  R15                                                      57824002
         EJECT                                                          57832002
*********************************************************************** 57840002
* I N S E R T    I N T O    A    R A D I X    P A R T I T I O N       * 57848002
*   T R E E    O F    T Y P E    5.                                   * 57856002
*********************************************************************** 57864002
      GODOWNTO &IGAINS5  SKIP DOWN TO THE BRANCH ENTRY POINT FOR THE   *57872002
                         INSERTION INTO A RADIX PARTITION TREE OF TYPE *57880002
                         5.                                             57888002
     RPTDSECT  TYPE=5                                                   57896002
         RASS  (P5,IGAP5,C5,IGAC5,FAR5,4,SAR5,10,NSNK5,6,FSNK5,7)       57904002
         RASS  (FSNK5B,5,I5,8,NEW5,9,S5,10,INS5TMP,11)                  57912002
         RASS  (LNG5,5)                                                 57920002
BASE5    EQU   R12       BASE REGISTER FOR INS5.                        57928002
IGAINS5  EQU   *         ENTRY POINT FOR INSERT INTO A TYPE 5 TREE.     57936002
         NTR   BR=BASE5,SAVE=(LKR,R12),LV=0                             57944002
         USING IGARPTH5,R1     TREE HEADER ADDRESS IS IN R1.            57952002
         USING SAVEDSEK,R13                                             57960002
         CLC   IGATOP5,DEADSINK  SEE IF THE TREE IS EMPTY.              57968002
         LR    NSNK5,R0  SAVE THE NEW SINK WORD FOR LATER, BECAUSE THIS 57976002
*                        REGISTER COULD BE TRANSMOGRIFIED BY GETMAIN.   57984002
         JMP   8,INS5ZERO      BRANCH IF IT IS THE EMPTY TREE.          57992002
*********************************************************************** 58000002
*  CHECK THE FREE SPACE CHAIN TO SEE IF THERE IS ANOTHER 8 BYTES ON IT* 58008002
* TO USE FOR THE INSERTION. IF THERE IS, PUT THE ADDRESS OF THE 8 BYTE* 58016002
* AREA IN NEW5. IF THERE ISN'T ENOUGH SPACE, THEN GO TO INS5GET TO TRY* 58024002
* TO GET SOME MORE SPACE USING THE GETMAIN MACRO-INSTRUCTION.         * 58032002
*********************************************************************** 58040002
         L     NEW5,IGAHVFC5   HEAD OF THE FREE SPACE CHAIN.            58048002
         LTR   NEW5,NEW5       SEE IF THE CHAIN IS EMPTY.               58056002
         JMP   8,INS5GET       GET MORE SPACE IF IT IS.                 58064002
         MVC   IGAHVFC5,O(NEW5)  OTHERWISE DECAPITATE THE CHAIN.        58072002
INS5GOT  EQU   *         GOT THE SPACE FOR THE NEW VERTEX.              58080002
         L     FAR5,O(O,C5)    LOAD THE SINK ADDRESS AT EOP.            58088002
         LH    SAR5,IGAKEYI5   GET INDEX OF KEY IN RECORD.              58096002
         LR    FSNK5,FAR5      GET THE ADDRESS OF THE EOP SINK.         58104002
         ALR   FAR5,SAR5       GENERATE THE ADDRESS OF THE KEY.         58112002
         ALR   SAR5,R15  GET THE ADDRESS OF THE KEY TO BE INSERTED.     58120002
*---------------------------------------------------------------------* 58136002
*  FIND THE NEW BIT INDEX FOR THE NEW INNER VERTEX.                   * 58144002
*---------------------------------------------------------------------* 58152002
INS5BIT  EQU   *                                                        58160002
         SLR   LNG5,LNG5       GET ZERO IN THE HIGH ORDER PART.         58168002
         IC    LNG5,IGAKEYL5   GET THE KEY LENGTH IN BYTES.             58176002
         FBI   I=I5,A=SAR5,B=FAR5,LV=(LNG5),WRK=INS5TMP  GET BIT INDEX. 58184002
         STM   NSNK5,FSNK5,O(NEW5)  STORE THE TWO AND MAYBE THEY WILL   58192002
*                              ALREADY THEN BE IN THE RIGHT PLACE.      58200002
*                              AT LEAST 50% OF THE TIME THEY WILL BE.   58208002
         LR    P5,C5    SET THE ANTEPENULTIMATE VERTEX ON THE NEW PATH. 58216002
         LR    C5,NEW5   SET THE LAST INNER VERTEX ON THE NEW INSERT    58224002
*                        PATH TO BE THE NEW INNER VERTEX.               58232002
         JMP   4,REVERSE       JUMP IF THEY ARE OKAY NOW.               58240002
*---------------------------------------------------------------------* 58248002
* OOPS, IT STORED THEM IN THE WRONG ORDER, THE NEW SINK IS GREATER    * 58256002
* THAN THE OLD SINK, SO IT SHOULD BE AT 4(NEW5) AND THE OLD SINK      * 58264002
* SHOULD BE AT 0(NEW5), SO STORE THEM IN THE OTHER ORDER.             * 58272002
*---------------------------------------------------------------------* 58280002
         LR    FSNK5B,FSNK5    MOVE IT TO THE REGISTER ON THE LEFT OF   58288002
         STM   FSNK5B,NSNK5,O(NEW5)  THE NEW SINK SO THEY CAN BE STORED 58296002
*                              IN THE CORRECT ORDER.                    58304002
         LA    C5,4(O,NEW5)    PUT THE ADDRESS OF THE EOP WORD IN C5.   58312002
         SLR   LNG5,LNG5       ZERO IT OUT FOR THE IC INSTRUCTION.      58320002
REVERSE  BIT   I=I5,A=SAR5,B=FAR5,J=LNG5,N=INS5TMP                      58328002
*                        COMPENSATE FOR RIGHT ALIGNED KEYS              58336002
         IC    INS5TMP,IGAKEYL5  THAT ARE LESS THAN FOUR BYTES LONG,    58344002
         IC    INS5TMP,INS5BITS(INS5TMP)  FIX FOR RIGHT ALIGNED KEYS.   58352002
         ALR   I5,INS5TMP      ADD IN THE ALIGNMENT AND INNER VERTEX    58360002
         SLL   I5,2            FLAG BIT.                                58368002
         SLL   NEW5,8          VERTEX AND CATENATE THE NEW BIT INDEX    58376002
         SRDL  I5,8            AND FLAG BIT TO THE INNER VERTEX EDGE.   58384002
INSCOUNT L     R15,IGACNT5     SUBTRACT ONE FROM THE INSERT/DELETE      58392002
         BCTR  R15,O           COUNTER TO MAINTAIN THE VALIDITY OF      58400002
         ST    R15,IGACNT5     SIMULTANEOUS SEARCHES.                   58408002
         ST    NEW5,O(O,P5)    STORE THE EDGE TO THE NEW VERTEX AT EOP. 58416002
         LTR   R15,NSNK5       PUT THE NEW SINK WORD IN GPR 15 AND ALSO 58424002
         LR    R0,NSNK5        PUT IT IN GPR 0.                         58432002
         LM    R4,R12,((4*R4)+20-64*((2+R4)/16))(R13)  RESTORE ONLY THE*58440002
                         REGISTERS IT USED.                             58448002
         JMP   15,(LKR)  JUMP BACK TO THE CALLING PROGRAM.              58456002
*********************************************************************** 58464002
* ZERO SINKS IN A TYPE 5 TREE BEFORE THE INSERT.                      * 58472002
*********************************************************************** 58480002
INS5ZERO EQU   *         COME HERE FOR ZERO SINKS.                      58488002
         LR    NEW5,R0   THIS IS A VERY SHORT EXCEPTION SEQUENCE.       58496002
         JMP   15,INSCOUNT     THAT'S IT.                               58504002
*********************************************************************** 58512002
* RAN OUT OF INNER VERTEX SPACE FOR A TYPE 5 TREE, GET MORE.          * 58520002
*********************************************************************** 58528002
INS5GET  EQU   *                                                        58536002
         LA    R0,EIGHT  PUT THE LENGTH VALUE FOR THE CONDITIONAL      *58544002
                         GETMAIN IN REGISTER ZERO,                      58552002
         IC    R15,IGASP5      AND PUT THE SUBPOOL NUMBER IN REGISTER  *58560002
                         FIFTEEN.                                       58568002
         LTR   LKR,LKR         SEE IF IT A CONDITIONAL OR AN           *58576002
                               UNCONDITIONAL REQUEST.                   58584002
         JMP   4,INS5COND      BRANCH IF IT IS A CONDITIONAL REQUEST.   58592002
         SLL   R15,TWENTY4  PUT THE SUBPOOL NUMBER IN THE LEFT BYTE OF  58600002
         ALR   R0,R15    REGISTER ZERO FOR THE UNCONDITIONAL GETMAIN.   58608002
      GETMAIN  R,LV=(0)                                                 58616002
         LR    NEW5,R1   GET THE NEW INNER VERTEX.                      58624002
         LM    R15,R1,((4*R15)+20-64*((2+R15)/16))(R13)  RESTORE THE   *58632002
                         REGISTERS THAT GETMAIN INVALIDATED.            58640002
         L     R1,((4*R1)+20-64*((2+R1)/16))(,R13)  RESTORE R1 TO THE  *58648002
                         ADDRESS OF THE TREE HEADER.                    58656002
         B     INS5GOT   CONTINUE, NOW THAT IT GOT THE SPACE FOR THE   *58664002
                         NEW INNER VERTEX.                              58672002
*********************************************************************** 58680002
*                                                                     * 58688002
* USE A CONDITIONAL GETMAIN TO GET THE ADDITIONAL SPACE FOR THE       * 58696002
* INSERTION.                                                          * 58704002
*********************************************************************** 58712002
*                                                                     * 58720002
INS5COND LA    R1,((4*R2)+20-64*((2+R2)/16))(,R13)  GET THE ADDRESS OF *58728002
                         A TWELVE BYTE WORK AREA FOR THE GETMAIN.       58736002
       GETMAIN EC,A=(1),LV=(0),SP=(15),MF=(E,(1))  CONDITIONAL GETMAIN. 58744002
         L     NEW5,((4*R2)+20-64*((2+R2)/16))(,R13)  GET THE ADDRESS  *58752002
                         OF THE 8-BYTE AREA ALLOCATED (IF THE GETMAIN  *58760002
                         WAS SUCCESSFUL).                               58768002
         STM   R2,R4,((4*R2)+20-64*((2+R2)/16))(R13)  SAVE THE         *58776002
                         REGISTERS AGAIN, BECAUSE GETMAIN USED THEIR   *58784002
                         SAVE AREA.                                     58792002
         LTR   R15,R15   TEST THE RETURN CODE FROM THE CONDITIONAL     *58800002
                         GETMAIN.                                       58808002
         LM    R15,R1,((4*R15)+20-64*((2+R15)/16))(R13)  RESTORE THE   *58816002
                         REGISTERS THAT GETMAIN SMASHED.                58824002
         BZ    INS5GOT   BRANCH IF IT IS OKAY.                          58832002
         LEAF  LV=,SAVE=(LKR,R12),RC=-1  IT DIDN'T WORK.                58840002
         DROP  R1                                                       58848002
         DROP  R13                                                      58856002
         DROP  BASE5                                                    58864002
         EJECT                                                          58872002
*********************************************************************** 58880002
      GODOWNTO &IGAINS8  SKIP DOWN TO THE LOCATION FOR THE TYPE 8 RPT  *58888002
                         INSERTION ROUTINE.                             58896002
*********************************************************************** 58904002
* UPON ENTRY TO THE TYPE 8 INSERT, THE REGISTERS HAVE THE FOLLOWING:  * 58912002
* R0:    THE ACTUAL SINK ADDRESS TO BE INSERTED IN THE RPT.           * 58920002
* R1:    THE ADDRESS OF THE RADIX PARTITION TREE.                     * 58928002
* R13:   THE ADDRESS OF A VALID SAVE AREA TO BE USED BY INSERT.       * 58936002
* LKR:   THE RETURN ADDRESS.                                          * 58944002
*        BIT 0 OF LKR IS A 0 IF THE INSERT IS AN UNCONDITIONAL INSERT,* 58952002
*        OR IT IS A ONE IF THE INSERT IS A CONDITIONAL INSERT.        * 58960002
* R15:   THE ADDRESS OF THE RECORD CONTAINING THE INSERT KEY.         * 58968002
*********************************************************************** 58976002
INS8     NTR   BR=R15,SAVE=(LKR,R12),LV=0                               58984002
         LR    PLA,R1          ADDRESS OF THE TREE HEADER.              58992002
         USING TREEHDR,PLA                                              59000002
         L     HDB,HVFC      LOAD THE ADDRESS OF THE FIXEDHDR FOR THE   59008002
         USING FIXEDHDR,HDB  INNER SPACE.                               59016002
         L     NEW,HEADFREE  LOAD THE HEAD OF THE FREE SPACE CHAIN.     59024002
         TM    PATH,P1000      SEE IF THERE ARE AT LEAST TWO SINKS.     59032002
         JMP   8,INS801        BRANCH IF THERE ARE ZERO OR ONE.         59040002
*********************************************************************** 59048002
*     INSERTION SUBROUTINE.                                           * 59056002
*********************************************************************** 59064002
         LTR   NEW,NEW   SEE IF THERE IS ENOUGH SPACE FOR THE INSERT.   59072002
         JMP   (X'F'-4),JUMPOVER  JUMP IF THERE IS ENOUGH SPACE.        59080002
INS8FULL EQU   *         COME HERE WHEN THE SPACE CHAIN IS EMPTY.       59088002
         N     LKR,X800  ZERO OUT BITS 1-31 OF LKR.                     59096002
         AL    LKR,INS8ACON    GET THE RETURN ADDRESS FROM THE ROUTINE *59104002
                         TO GET MORE SPACE OF THE FREE SPACE CHAIN.     59112002
         DROP  R15                                                      59120002
         USING INS8LOAD,LKR    THE ADDRESS IN R15 IS NOT BIG ENOUGH TO *59128002
                         REACH THE BRANCH TARGET, SO USE ONE THAT IS   *59136002
                         BIG ENOUGH.                                    59144002
         JMP   15,NEEDMORE  GO GET MORE SPACE ON THE CHAIN.             59152002
         DROP  LKR                                                      59160002
         CNOP  0,4                                                      59168002
INS8ACON DC    AL4(INS8LOAD)  THIS IS THE RETURN ADDRESS FROM NEEDMORE. 59176002
INS8LOAD EQU   *         COME BACK HERE FROM NEEDMORE.                  59184002
         L     LKR,((4*LKR)+20-64*((2+LKR)/16))(,R13)  RESTORE LKR.     59192002
         BALR  R15,O     RE-ESTABLISH ADDRESSABILITY.                   59200002
INS8ADR8 EQU   *                                                        59208002
         USING INS8ADR8,R15                                             59216002
         LCR   R15,R15   PUT THE ADDRESS BACK AT THE INS8 LABEL.        59224002
         LA    R15,(INS8ADR8-INS8)(,R15)  SUBTRACT THE DIFFERENCE BY    59232002
         LCR   R15,R15   FIRST ADDING IT TO THE COMPLEMENT AND THEN    *59240002
                         COMPLEMENTING IT BACK AGAIN.                   59248002
         DROP  R15                                                      59256002
         USING INS8,R15                                                 59264002
         L     NEW,HEADFREE  LOAD THE ADDRESS OF THE FIRST CHAIN ENTRY. 59272002
         LTR   NEW,NEW   SEE IF IT WAS ABLE TO GET ANY MORE SPACE ON    59280002
         JMP   10,JUMPOVER  THE FREE SPACE CHAIN.                       59288002
INS8LEAF LEAF  SAVE=(R0,R12),RC=-1,LV=                                  59296002
         DROP  R15                                                      59304002
         DROP  PLA                                                      59312002
         DROP  HDB                                                      59320002
         EJECT                                                          59328002
*********************************************************************** 59336002
*    ENTRY POINT FOR SCANNING LEFT.                                   * 59344002
*********************************************************************** 59352002
      GODOWNTO &IGALSCN                                                 59360002
*********************************************************************** 59368002
         USING TREEHDR,R1                                               59376002
         USING (&IGANAME+&IGALSCN),R15  USE THE BASE REGISTER THAT THE *59384002
                         SCANL MACRO-INSTRUCTION SETS UP.               59392002
         STM   PR,SR,PRPAST(R13)   SAVE THE REGISTERS.                  59400002
         SLR   SR,SR               USE THE PATH AS AN INDEX TO BRANCH   59408002
         IC    SR,PATH             DIRECTLY TO THE RIGHT PLACE.         59416002
         IC    SR,SCANLTAB(SR)     XX                                   59424002
         LM    PR,CR,AP  SET UP THE FIRST TWO ON THE PATH.              59432002
         JMP   15,SCANLORG(SR)  JUMP INTO THE CORRECT SEQUENCE.         59440002
         DROP  R15                                                      59448002
         DROP  R1                                                       59456002
*********************************************************************** 59464002
*   ENTRY POINT FOR SCANNING RIGHT.                                   * 59472002
*********************************************************************** 59480002
      GODOWNTO &IGARSCN                                                 59488002
         USING TREEHDR,R1                                               59496002
         USING (&IGANAME+&IGARSCN),R15  USE THE BASE REGISTER THAT THE *59504002
                         SCANR MACRO-INSTRUCTION PROVIDES.              59512002
PRPAST   EQU   28                                                       59520002
         STM   PR,SR,PRPAST(R13)  SAVE THE REGISTERS.                   59528002
         SLR   R4,R4              USE THE PATH AS AN INDEX TO ENTER     59536002
         IC    R4,PATH            THE EXACT PLACE IN THE SUBROUTINE     59544002
         IC    R4,SCANRTAB(R4)    TO CONTINUE THE SCAN.                 59552002
         LM    PR,CR,AP           SET UP PR'AND CR INITIALLY.           59560002
         JMP   15,SCANRORG(SR)  JUMP INTO THE CORRECT SEQUENCE.         59568002
         DROP  R15                                                      59576002
         DROP  R1                                                       59584002
*********************************************************************** 59592002
*        SUBROUTINE FOR SCANNING LEFT.                                  59600002
*********************************************************************** 59608002
SCANLORG EQU   *                                                        59616002
*********************************************************************** 59624002
         USING (&IGANAME+&IGALSCN),R15  REVERT TO THE BASE REGISTER FOR*59632002
                         THE SCANL ROUTINE.                             59640002
         USING TREEHDR,R1                                               59648002
PASTLEFT EQU   *  PASSED THE SINGLE SINK ON THE LEFT.                   59656002
         MVI   PATH,P0011          SET PATH TO LEFT OF SINGLE SINK.     59664002
         BC    15,NULLIN           MERGE WITH IDENTICAL EXIT SEQUENCE.  59672002
*********************************************************************** 59680002
SCLTREB  TREB  PR,CR,SR,CYCLE=YES  TRACE BACKPATH UP RIGHT EDGE         59688002
SCLBT00  BT00  CR,PATHTOC          BRANCH IF C'S LEFT IS A SINK.        59696002
         TLEF  PR,CR,SR,CYCLE=YES  TRACE PATH DOWN LEFT EDGE.           59704002
         BT10  CR,SCLG1ES      BRANCH IF THE RIGHT SIDE IS A SINK.      59712002
SCLTREF  TREF  PR,CR,SR,CYCLE=YES  TRACE THE PATH DOWN THE RIGHT EDGE.  59720002
SCLBT11  BT11  CR,SCLTREF      BRANCH IF C'S RIGHT SUCCESSOR IS INNER.  59728002
SCLG1ES  STM   PR,CR,AP  STORE THE ANTEPENULTIMATE AND PENULTIMATE     *59736002
                         VERTICES ON THE CURRENT PATH.                  59744002
         X     PR,RGHT(,CR)  GET THE RIGHT SINK SUCCESSOR OF CR.        59752002
         LA    R15,O(,PR)  CLEAR THE LEFT BYTE OF THE SINK.             59760002
         LM    PR,SR,PRPAST(R13)   RESTORE THE REGISTERS.               59768002
         MVI   PATH,P1101          SET PATH TO RIGHT SINK.              59776002
         LTR   R15,R15   SET THE CONDITION CODE TO CORRESPOND TO THE   *59784002
                         RETURN CODE.                                   59792002
         BCR   15,LKR              EXIT.                                59800002
*********************************************************************** 59808002
SCLTLEB  TLEB  PR,CR,SR,CYCLE=YES  TRACE BACKPATH UP LEFT EDGE.         59816002
SCLBIV1  BIV1  CR,SCLTREB          BRANCH IF C IS A RIGHT SUCCESSOR.    59824002
         LA    PR,0(0,PR)          CLEAR THE HIGH                       59832002
         LA    CR,0(0,CR)          ORDER BYTES.                         59840002
         CLR   PR,CR               CONTINUE THE SCAN                    59848002
         BC    7,SCLTLEB           IF THE SOURCE NOT REACHED.           59856002
         MVI   PATH,P1000          SET PATH TO PAST LEFT END.           59864002
         STM   PR,CR,AP            STORE VERTICES.                      59872002
         BC    15,NULLIN           MERGE WITH IDENTICAL SEQUENCE.       59880002
SCANLGO  EQU   *         COME HERE AFTER ISCAN HAS BEEN EXECUTED TO     59888002
         L     PR,APT    START THE SCAN LEFT WITH THE RIGHT             59896002
         LR    CR,PR     SUBTREE 3F THE SOURCE OF THE TREE.             59904002
         BC    15,SCLBT11      GO INVESTIGATE THE RIGHT SUBTREE.        59912002
         DROP  R15                                                      59920002
*********************************************************************** 59928002
*  SUBROUTINE FOR SCANNING RIGHT TO NEXT SINK. THE SETTINGS OF THE      59936002
*  PATH CODE ON ENTRY AND THE POSSIBLE RESULTING SETTINGS ARE SHOWN     59944002
*  IN THE FOLLOWING INCIDENCE MATRIX:                                   59952002
*                                                                       59960002
*           0 1 2 3|4 5 6 7|8 9 A B|C D E F|                            59968002
*         0 X      |       |       |       |                            59976002
*         1        |  X    |       |       |                            59984002
*         2        |       |       |       |                            59992002
*       I 3   X    |       |       |       |                            60000002
*       N 4        |       |       |       |                            60008002
*       P 5        |  X    |       |       |                            60016002
*       U 6 X      |       |       |       |                            60024002
*       T 7   X    |       |       |       |                            60032002
*         8        |       |       |X      |                            60040002
*       C 9        |       |       |X X    |                            60048002
*       O A        |       |       |X X    |                            60056002
*       D B        |       |      X|X X    |                            60064002
*       E C        |       |       |X X    |                            60072002
*         D        |       |      X|X X    |                            60080002
*         E        |       |       |X      |                            60088002
*         F        |       |       |X      |                            60096002
*********************************************************************** 60104002
SCANRORG EQU   *-TWO  PROVIDE A X'02' FOR THE FIRST BYTE SCANRTAB.    * 60112002
*********************************************************************** 60120002
         USING (&IGANAME+&IGARSCN),R15  REVERT TO THE BASE REGISTER FOR*60128002
                         THE SCANR ROUTINE.                             60136002
NULLPATH EQU   *  THERE ARE ZERO SINKS IN THE TREE.                     60144002
         MVI   PATH,P0000  SET THE PATH TO THE NULL CASE.               60152002
NULLIN   LM    PR,SR,PRPAST(R13)  RESTORE THE REGISTERS.                60160002
         LA    R15,ONE   SET THE RETURN CODE TO MINUS ONE, AND          60168002
         LNR   R15,R15   SET THE CONDITION CODE TO CORRESPOND TO IT.    60176002
         BR    LKR       EXIT.                                          60184002
*********************************************************************** 60192002
PLEFOFIT EQU   *  THERE IS ONE SINK AND THE CAT'S SINK IS TO ITS LEFT.  60200002
         L     R15,APT   GET THE SINGLE SINK FOR THE RETURN CODE.       60208002
         MVI   PATH,P0001         ADDRESS THE SINGLE SINK.              60216002
         LM    PR,SR,PRPAST(R13)  RESTORE THE REGISTERS.                60224002
         LA    R15,O(O,R15)  CLEAR THE HIGH ORDER BYTE.                 60232002
         LTR   R15,R15   SET THE CONDITION CODE TO CORRESPOND TO THE   *60240002
                         RETURN CODE.                                   60248002
         BCR   15,LKR             EXIT.                                 60256002
*********************************************************************** 60264002
PASTRGHT EQU   *  PASSED THE SINGLE SINK ON THE RIGHT.                  60272002
         MVI   PATH,P0101         SET PATH PAST IT.                     60280002
         BC    15,NULLIN          MERGE WITH AN IDENTICAL EXIT.         60288002
*********************************************************************** 60296002
SCRTLEB  TLEB  PR,CR,SR,CYCLE=YES  TRACE BACKPATH UP LEFT EDGE.         60304002
SCRTRYT1 BT11  CR,SCRTREF          BRANCH IF C'S RIGHT IS INNER.        60312002
PATHOD   STM   PR,CR,AP  STORE THE ANTEPENULTIMATE AND THE PENULTIMATE *60320002
                         VERTICES ON THE PATH TO THE SINK SELECTED BY  *60328002
                         THE CURSOR.                                    60336002
         X     PR,RGHT(,CR)  GET THE RIGHT SINK SUCCESSOR OF CR.        60344002
         LA    R15,O(,PR)  CLEAR THE LEFT BYTE.                         60352002
         LTR   R15,R15   SET THE CONDITION CODE TO CORRESPOND TO THE   *60360002
                         RETURN CODE.                                   60368002
         LM    PR,SR,PRPAST(R13)   RESTORE THE REGISTERS.               60376002
         MVI   PATH,P1101          SET PATH NON-NULL RIGHT SINK.        60384002
         BCR   15,LKR              RETURN.                              60392002
SCRTREF  TREF  PR,CR,SR,CYCLE=YES  TRACE RIGHT EDGE DOWN THE PATH.      60400002
         BT00  CR,PATHTOC      BRANCH IF LEFT SUCCESSOR IS A SINK.      60408002
SCRTLEF  TLEF  PR,CR,SR,CYCLE=YES  TRACE LEFT EDGE FORWARD.             60416002
SCRBT01  BT01  CR,SCRTLEF      BRANCH IF C'S LEFT SUCCESSOR IS INNER.   60424002
PATHTOC  EQU   *  COME HERE TO SET THE PATH CODE TO 1100 UPON EXIT.     60432002
         STM   PR,CR,AP            STORE THE ANTEPENULTIMATE AND        60440002
*                                  THE PENULTIMATE VERTICES ON PATH.    60448002
         X     PR,LEF(,CR)  GET THE LEFT SINK SUCCESSOR OF CR.          60456002
         LA    R15,O(,PR)  CLEAR THE LEFT BYTE.                         60464002
         LTR   R15,R15   SET THE CONDITION CODE TO CORRESPOND TO THE   *60472002
                         RETURN CODE.                                   60480002
         LM    PR,SR,PRPAST(R13)   RESTORE THE REGISTERS.               60488002
         MVI   PATH,P1100          SET PATH TO LEFT SINK, N AT LEAST 2. 60496002
         JMP   15,(LKR)        RETURN.                                  60504002
*********************************************************************** 60512002
SCRTREB  TREB  PR,CR,SR,CYCLE=YES  TRACE BACKPATH WITH RIGHT EDGE.      60520002
SCRBIV1  BIV1  CR,SCRTREB          TRACE IT MORE IF CR IS RIGHT.        60528002
         LA    PR,0(0,PR)          CLEAR THE HIGH ORDER BYTES SO        60536002
         LA    CR,0(0,CR)          AS TO CHECK FOR EQUAL ADDRESSES.     60544002
         CLR   PR,CR               HAS THE SOURCE BEEN REACHED FROM ITS 60552002
         BC    7,SCRTLEB           RIGHT SUCCESSOR. IF SO IT IS DONE.   60560002
         MVI   PATH,P1011          SCANR WENT PAST END.                 60568002
         STM   PR,CR,AP            STORE PATH VERTICES.                 60576002
         BC    15,NULLIN           MERGE WITH OTHER EXIT SEQUENCE.      60584002
SCANRGO  EQU   *         COME HERE TO SET P AND C TO THE SOURCE ON THE  60592002
         L     PR,APT    FIRST EXECUTION AFTER ISCAN HAS BEEN EXECUTED. 60600002
         LR    CR,PR     THUS THE SOURCE IS THE START FOR THE SCAN.     60608002
         BC    15,SCRBT01      GO SCAN FOR THE LEFT SUBTREE.            60616002
*********************************************************************** 60624002
         DROP  R1                                                       60632002
         DROP  R15                                                      60640002
         EJECT                                                          60648002
*********************************************************************** 60656002
* COME HERE TO ESTABLISH A SPACE CONTROL AREA FOR AN ARBITRARY SUBPOOL* 60664002
* AND RETURN THE ADDRESS IN REGISTER 1. UPON ENTRY TO IGASPAC THE GPRS* 60672002
* ARE AS FOLLOWS:                                                     * 60680002
*        R0    SUBPOOL AND LENGTH OF THE SPACE CONTROL AREA.          * 60688002
*        R1:   IGNORED.                                               * 60696002
*        LKR   RETURN ADDRESS.                                        * 60704002
*        R15:            THE POWER OF TWO TO BE USED IN COMPUTING THE * 60712002
*                        MASK FOR ROUNDING THE REQUEST LENGTH. THE    * 60720002
*                        POWER CAN BE ANY INTEGER IN THE RANGE FROM 0 * 60728002
*                        TO 15 INCLUSIV (ALTHOUGH ANY INTEGER ABOVE 8 * 60736002
*                        IS HIGHLY UNUSUAL).                          * 60744002
*                        THE DEFAULT VALUE FOR THIS POWER SUPPLIED BY * 60752002
*                        THE GSPACE MACRO-INSTRUCTION IS 4, SO THAT   * 60760002
*                        ALL REQUESTS ARE ON 16-BYTE BOUNDARIES.      * 60768002
*********************************************************************** 60776002
      GODOWNTO &IGAISP   SKIP DOWN TO THE ENTRY POINT FOR THE ROUTINE  *60784002
                         TO SET UP A SPACE CONTROL AREA.                60792002
         BALR  R15,O     ESTABLISH ADDRESSABILITY.                      60800002
         USING *,R15                                                    60808002
      GETMAIN  R,LV=(0)  ASSUME THE SUBPOOL AND LENGTH ARE IN R0.       60816002
         DROP  R15       GETMAIN SMASHES R15.                           60824002
         USING IGASPCTL,R1     GOT THE AREA, NOW USE IT.                60832002
         STM   LKR,R12,IGASA0+FOUR*THREE  SAVE THE REGISTERS.           60840002
         BALR  R15,O     RE-ESTABLISH ADDRESSABILITY.                   60848002
         USING *,R15     ALSO USE IT.                                   60856002
         L     R2,X800   GET X'80000000' IN R2 TO FLAG THE FIRST BIT OF*60864002
                         THE LAST EDGE FIELD ON THE SPACE CONTROL AREA *60872002
                         SUBPOOL CHAIN.                                 60880002
         ALR   R2,R1     SET THE ADDRESS IN IT.                         60888002
         ICALL SETSPACE                                                 60896002
         L     LKR,IGASA0+FOUR*THREE  RESTORE THE LINKAGE REGISTER.     60904002
         LM    R2,R12,IGASA0+FOUR*(THREE+FOUR)  ONLY PUT BACK THE      *60912002
                         REGISTERS THAT ARE CHANGED AND IMPORTANT.      60920002
         BR    LKR       RETURN                                         60928002
         DROP  R15                                                      60936002
         DROP  R1                                                       60944002
         EJECT                                                          60952002
*********************************************************************** 60960002
* GSPACE FOR VARIABLE LENGTH RECORDS.                                 * 60968002
*********************************************************************** 60976002
         RASS  (W0,R3,W1,R4,W2,R5,W3,R6,W4,R7,W5,R8,W6,R9,W7,R10)       60984002
*********************************************************************** 60992002
* THIS IS THE ENTRY POINT FOR GSPACE FOR VARIABLE LENGTH ENTRIES WHEN * 61000002
* THE SPACE CONTROL ADDRESS IS CODED ON THE GSPACE MACRO-INSTRUCTION. * 61008002
* UPON ENTRY THE REGISTERS HAVE THE FOLLOWING CONTENTS:               * 61016002
*  R0:   SUBPOOL AND LENGTH OF THE REQUEST.                           * 61024002
*  R1:   THE ADDRESS OF THE SPACE CONTROL AREA.                       * 61032002
* LKR:   THE RETURN ADDRESS. BIT 0 OF LKR IS A ONE IF THE REQUEST IS  * 61040002
*        A CONDITIONAL REQUEST, OR IS A ZERO IF THE REQUEST IS AN     * 61048002
*        UNCONDITIONAL REQUEST.                                       * 61056002
* R15:   THE ADDRESS OF THE BASE OF THE MODULE IGARPT01.              * 61064002
*********************************************************************** 61072002
     GODOWNTO  &IGAGSPS  SKIP DOWN TO THE ENTRY POINT.                  61080002
         LTR   R1,R1     CHECK THE SPACE CONTROL ADDRESS TO SEE IF IT  *61088002
                         IS REALLY THERE.                               61096002
         BALR  R15,O                                                    61104002
         USING *,R15                                                    61112002
         BNZ   GSPACVAR  BRANCH IF IT REALLY IS THERE.                  61120002
         B     GETSPACE  OTHERWISE TREAT IT AS IF IT ISN'T THERE.       61128002
         DROP  R15                                                      61136002
*********************************************************************** 61144002
* THIS IS THE ENTRY POINT FOR VARIABLE LENGTH GSPACE REQUESTS WHEN THE* 61152002
* SPACE CONTROL WORD IS NOT CODED ON THE GSPACE MACRO-INSTRUCTION.    * 61160002
* USE THE TCBRPT WORD TO FIND THE RIGHT ONE.                          * 61168002
* UPON ENTRY TO THIS SECTION THE REGISTERS HAVE THE FOLLOWING         * 61176002
* CONTENTS:                                                           * 61184002
* R0     THE LENGTH AND SUBPOOL FOR THE REQUEST.                      * 61192002
* R1     IS THE REGISTER THAT WILL CONTAIN THE ADDRESS OF THE SPACE   * 61200002
*        OBTAINED.                                                    * 61208002
* THE FIRST SECTION CHECKS TO SEE IF THE TCBRPT WORD IS FILLED IN, AND* 61216002
* INITIALIZES THE SPACE CONTROL AREA IF IT IS NOT.                    * 61224002
*********************************************************************** 61232002
      GODOWNTO &IGAGSP  SKIP DOWN TO THE ENTRY POINT.                   61240002
GETSPACE EQU   *         PROVIDE AN ENTRY POINT FROM THE GSPACE        *61248002
                         MACRO-INSTRUCTION.                             61256002
      RPTDSECT GEN=(TCBRPTA,(1))  GENERATE THE ADDRESS OF THE TCBRPT   *61264002
                         WORD.                                          61272002
         SLR   R15,R15   GET SET TO CHECK TO SEE IF THE TCBRPT WORD IS *61280002
                         FILLED IN ALREADY.                             61288002
         CL    R15,O(O,R1)  CHECK THE TCBRPT WORD FOR ALL ZEROS, SAVING*61296002
                         THE RESULT IN THE CONDITION CODE.              61304002
         BALR  R15,O     ESTABLISH ADDRESSABILITY FOR THE REST OF THE  *61312002
                         PROGRAM.                                       61320002
         USING *,R15     NOW USE IT.                                    61328002
GSPACEB  JMP   8,FIRST1  JUMP IF THE TCBRPT WORD HAS NOT ALREADY BEEN  *61336002
                         FILLED IN.                                     61344002
         L     R1,O(,R1)  LOAD THE CONTENTS OF THE TCBRPT WORD, WHICH  *61352002
                         IS THE ADDRESS OF THE SPACE CONTROL AREA.      61360002
*********************************************************************** 61368002
* CHECK THE SUBPOOL # IN THE SPACE CONTROL AREA TO SEE IF THE SUBPOOL * 61376002
* FOR THE REQUEST MATCHES IT. IF IT DOES EVERYTHING IS OKAY AND THE   * 61384002
* PROGRAM JUMPS TO GSPACVAR. IF THE SUBPOOLS DON'T MATCH, THEN LOOK   * 61392002
* DOWN THE CHAIN TO TRY TO FIND THE RIGHT ONE. IF ALL THAT ALSO FAILS,* 61400002
* THEN A NEW SPACE CONTROL AREA MUST BE ESTABLISHED FOR THE NEW SP#.  * 61408002
*********************************************************************** 61416002
CHKSP#G  EQU   *                                                        61424002
* IT IS RATHER AWKWARD THAT ONLY REGISTERS 1 AND 15 CAN BE USED AT THIS 61432002
* POINT.                                                              * 61440002
         CL    R0,=XL4'01000000'  SEE IF THE REQUEST IS FOR SUBPOOL 0.  61448002
         BL    GSPACVAR  BRANCH IF IT IS.                               61456002
         USING IGASPCTL,R1                                              61464002
         LA    R1,IGASPEDG  GET THE ADDRESS OF THE ADDRESS OF THE NEXT *61472002
                         8-BYTE ENTRY DEFINING A SPACE CONTROL AREA IF *61480002
                         THERE IS ONE.                                  61488002
         DROP  R1                                                       61496002
         DROP  R15                                                      61504002
         BALR  R15,O     ESTABLISH ADDRESSABILITY AGAIN.                61512002
GSP#LOOP EQU   *                                                        61520002
         USING GSP#LOOP,R15  USE THE STARTING ADDRESS OF THE LOOP AS   *61528002
                         IT'S OWN BASE REGISTER SO THAT THE CONDITIONAL*61536002
                         BRANCH TO CONTINUE THE LOOP CAN BE A BCR.      61544002
         USING IGASPC,R1  USE THE DSECT FOR THE SUBPOOL # CHAIN.        61552002
         TM    IGANXSP,IGASPFIN  SEE IF THIS IS THE LAST ONE ON THE    *61560002
                         CHAIN.                                         61568002
         JMP   1,GSP#GONE JUMP IF IT IS THE LAST ONE, MEANING THE SPACE*61576002
                         CONTROL AREA FOR THE REQUEST SUBPOOL ISN'T    *61584002
                         THERE.                                         61592002
         L     R1,IGANXSP      GET THE NEXT EDGE FIELD TO THE NEXT ONE. 61600002
         L     R15,IGASPADR  ADDRESS OF THE SPACE CONTROL AREA, WITH   *61608002
               IT'S SUBPOOL NUMBER IN THE LEFT BYTE.                    61616002
         DROP  R15                                                      61624002
         XR    R15,R0    COMPARE BY EXCLUSIVE-ORING.                    61632002
         SRA   R15,24    SET THE CONDITION CODE.                        61640002
         BALR  R15,O     ESTABLISH ADDRESSABILITY AGAIN.                61648002
         USING *,R15                                                    61656002
         L     R15,=AL4(GSP#LOOP)  LOAD BACK THE ADDRESS OF THE START  *61664002
               OF THE LOOP.                                             61672002
         DROP  R15                                                      61680002
         USING GSP#LOOP,R15  USE IT AGAIN.                              61688002
         JMP   7,(R15)   CONTINUE THE LOOP IF THE SUBPOOL NUMBERS DON'T*61696002
               MATCH.                                                   61704002
*        D O N E   F O U N D   I T . ********************************** 61712002
         L     R1,IGASPADR  ADDRESS OF THE SPACE CONTROL AREA.          61720002
         DROP  R1                                                       61728002
         DROP  R15                                                      61736002
         EJECT                                                          61744002
*********************************************************************** 61752002
* THIS IS THE COMMON GSPACE ALLOCATION ROUTINE FOR VARIABLE LENGTH    * 61760002
* REQUEST SIZES. AT THIS POINT REGISTER R1 HAS THE ADDRESS OF THE     * 61768002
* APPROPRIATE SPACE CONTROL AREA IN IT.                               * 61776002
*********************************************************************** 61784002
GSPACVAR EQU   *         COME HERE FOR VARIABLE LENGTH RECORDS.         61792002
         BALR  R15,O                                                    61800002
         USING *,R15                                                    61808002
         L     R15,ADDRESS                                              61816002
         DROP  R15                                                      61824002
         USING &PROGRAM,R15  USE THE REAL BASE REGISTER NOW.            61832002
*---------------------------------------------------------------------* 61840002
         USING SAVEDSEK-&IGASA0,R1  ESTABLISH ADDRESSABILITY TO THE    *61848002
                         FIRST SAVE AREA IN THE SPACE CONTROL AREA.     61856002
         STM   LKR,R12,GPR14   SAVE THE REGISTERS IN THE INNER TREE     61864002
         ST    R13,BACKEDGE    SAVE AREA, SAVE R13 IN THE BACKEDGE IN   61872002
         L     R13,FORWARD  THE OUTER SAVE AREA AND TRACE THE           61880002
         DROP  R1        EDGE TO THE INNER SAVE AREA.                   61888002
         USING SAVEDSEK,R13  R13 NOW HAS THE ADDRESS OF THE INNER SAVE *61896002
                         AREA.                                          61904002
* --------------------------------------------------------------------* 61912002
         USING IGASPCTL,R1  USE THE IGAROUND MASK TO ROUND THE REQUEST *61920002
                         TO THE PROPER BOUNDARY.                        61928002
         SL    REQL,IGAROUND  FIRST ADD IN THE APPROPRIATE POWER OF TWO*61936002
                         BY SUBTRACTING ITS COMPLEMENT.                 61944002
         BCTR  REQL,O    NOW SUBTRACT ONE FOR A NET PLUS OF ONE LESS   *61952002
                         THAN THE APPROPRIATE POWER OF TWO.             61960002
         N     REQL,IGAROUND  NOW KNOCK OFF THE LOWER ORDER BITS THAN  *61968002
                         ARE IMPORTANT.                                 61976002
         DROP  R1                                                       61984002
         JMP   8,RCODE0  NOW JUMP IMMEDIATELY TO THE EXIT IF THE       *61992002
                         ROUNDED REQUEST IS ZERO.                       62000002
*---------------------------------------------------------------------* 62008002
         USING TREEHDR,R1  NOW USE THE TREE HEADER.                     62016002
         LR    W1,REQL         SAVE THE REQUEST LENGTH FOR LATER.       62024002
         ICALL POVSRCH   EXECUTE THE SEARCH FOR A SINK WITH A POV       62032002
*                              LARGE ENOUGH TO SATISFY THE REQUEST.     62040002
         LTR   W0,R15    SAVE THE ADDRESS OF THE FREE SPACE SO OBTAINED 62048002
         L     R15,IGADDR      AND TEST IT TO SEE IF THERE IS ONE       62056002
         JMP   4,NOTENUF       LARGE ENOUGH.                            62064002
*---------------------------------------------------------------------* 62072002
         L     W2,IGAVALUE     COMPUTE THE LENGTH THAT THE AREA WILL    62080002
         SLR   W2,REQL         HAVE AFTER THE ALLOCATION HAS BEEN MADE. 62088002
         LA    W3,O(W0,W2)     COMPUTE THE ADDRESS OF THE AREA TO BE    62096002
*                              ALLOCATED BY ADDING THE RESIDUAL LENGTH  62104002
*                              TO THE ADDRESS OF THE BEGINNING OF THE   62112002
*                              FREE AREA.                               62120002
         LR    REQL,W2         ADJUST THE POV FOR THE FREE AREA         62128002
         ICALL (&IGANAME+&IGAPVAJ)  REMAINING TO MAKE IT THE RESIDUAL  *62136002
                         LENGTH.                                        62144002
         L     R15,IGADDR  RESTORE THE BASE REGISTER FOR THIS SECTION.  62152002
*---------------------------------------------------------------------* 62160002
         LTR   REQL,REQL       NOW SEE IF THE RESIDUAL LENGTH IS ZERO,  62168002
         JMP   7,NOTEXACT      BECAUSE IF IT IS THE SINK GETS DELETED.  62176002
         ICALL DEL8      DELETE THE SINK.                               62184002
*---------------------------------------------------------------------* 62192002
NOTEXACT EQU   *                                                        62200002
         LR    R1,W3     PUT THE ADDRESS OF THE ALLOCATED AREA IN R1.   62208002
VAROUT   EQU   *  MERGE WITH A COMMON PATH HERE.                        62216002
         LR    REQL,W1   PUT THE LENGTH OF THE ALLOCATED AREA IN R0.    62224002
         LEAF  SAVE=(LKR,(R2,R12)),LV=-0,RC=0  SET THE RETURN CODE TO  *62232002
                         ZERO TO SIGNAL A SUCCESSFUL ALLOCATION.        62240002
*********************************************************************** 62248002
* THERE IS NO FREE AREA LARGE ENOUGH TO SATISFY THE REQUEST, GET MORE.* 62256002
*********************************************************************** 62264002
NOTENUF  EQU   *                                                        62272002
         L     W4,IGA9FILL     LOAD THE SUBPOOL # AND REFILL SIZE FOR  *62280002
               THE TYPE 9 VARIABLE LENGTH SPACE ALLOCATION TREE.        62288002
         LA    W5,O(O,W4)      CHECK THE SIZE OF THE REQUEST TO SEE IF  62296002
         CLR   W5,W1           IT IS LESS THAN OR EQUAL TO THE REFILL   62304002
         JMP   10,REFISOK      LENGTH; BRANCH IF IT IS.                 62312002
         SLR   W4,W5     IT'S NOT, MAKE THE REFILL SIZE LARGER.         62320002
         LA    W5,X'FFF'(,W1)  ROUND THE REQUEST SIZE UP TO THE NEXT   *62328002
                         EXACT MULTIPLE OF A PAGE (4096 BYTES).         62336002
         N     W5,=XL4'FFFFF000'  KNOCK OFF THE REDUNDANT LOW ORDER    *62344002
                         BITS.                                          62352002
         ALR   W4,W5           GETMAIN DOES THIS ANYWAY, WHY WASTE THE  62360002
*                              SPACE?                                   62368002
         ST    W4,IGA9FILL     STORE THE ADJUSTED REFILL SIZE.          62376002
*---------------------------------------------------------------------* 62384002
REFISOK  EQU   *                                                        62392002
         L     HDB,HVFC        NOW CHECK TO SEE IF THERE IS A SPACE TO  62400002
*                              STORE THE BLOCK DEFINITION WORD FOR IT.  62408002
         USING FIXEDHDR,HDB    THE SPACE FOR THE BLOCK DEFINITION WORD  62416002
         L     W6,HEADFREE     IS TAKEN FROM THE INNER VERTEX FREE      62424002
         LTR   W6,W6           SPACE CHAIN.                             62432002
         JMP   2,NOGETINR      JUMP IF IT'S THERE.                      62440002
         STM   R15,R10,GPR15   CHAIN EMPTY, GET MORE.                   62448002
         L     LKR,=AL4(NEEDMORE)  ADDRESS OF THE NEEDMORE ROUTINE.     62456002
         BALR  LKR,LKR  GET MORE.                                       62464002
         LM    R15,R10,GPR15   ON TO THE INNER SPACE CHAIN.             62472002
         L     W6,HEADFREE     GET THE NEW CHAIN HEAD.                  62480002
*---------------------------------------------------------------------* 62488002
NOGETINR EQU   *                                                        62496002
         MVC   HEADFREE,O(W6)  DECAPTITATE THE CHAIN.                   62504002
         USING BLOCKHDR,W6     SET UP THE BLOCK DEFINITION WORD.        62512002
         L     R0,IGA9FILL     SUBPOOLAND REFILL SIZE.                  62520002
       GETMAIN R,LV=(0)        GET THE ADDITIONAL SPACE.                62528002
         STM   R0,R1,BSPL      STORE THE BLOCK DEFINITION.              62536002
         MVC   BEDGE,BLOKHEAD  PUT THE NEW BLOCK ON THE BLOCK CHAIN.    62544002
         ST    W6,BLOKHEAD     XX                                       62552002
         DROP  W6                                                       62560002
         DROP  HDB                                                      62568002
*  NOW COMPUTE THE RESIDUAL LENGTH.                                   * 62576002
         LR    W7,R1           ADDRESS OF THE AREA OBTAINED.            62584002
         L     R1,((4*R1)+20-64*((2+R1)/16))(,R13)  PUT THE ADDRESS OF *62592002
                         THE TYPE 9 SPACE CONTROL RPT BACK IN R1.       62600002
         L     R15,IGADDR      RESTORE THE PROGRAM BASE REGISTER.       62608002
         SR    W5,W1           COMPUTE THE RESIDUAL LENGTH.             62616002
         JMP   8,THATSIT       JUMP IF THE RESIDUAL SIZE IS ZERO.       62624002
* THE RESIDUAL LENGTH IS NOT ZERO, INSERT THE NEW SINK WITH IT POV.   * 62632002
         ST    W7,IGAVALUE  USE THIS AS A TEMPORARY WORK AREA FOR THE  *62640002
                         NEW KEY, WHICH IS THE SAME AS THE ADDRESS OF  *62648002
                         THE AREA.                                      62656002
         LA    R0,IGAVALUE  ADDRESS OF SEARCH KEY.                      62664002
         BAL   LKR,SRCH8       SEARCH FOR THE INSERTION POINT.          62672002
         ST    R15,KEYWORK     STORE THE SINK ADDRESS FOUND.            62680002
         DROP  R15                                                      62688002
         L     LKR,IGADDR  RESTORE THE ADDRESS OF THE MODULE.           62696002
         USING &IGANAME,LKR                                             62704002
         LA    R0,KEYWORK      ADDRESS OF THE FOUND KEY.                62712002
         ST    R0,FARG         STORE IT THERE FOR INSERT.               62720002
         L     R0,IGAVALUE  LOAD THE ACTUAL SINK WORD TO BE INSERTED.   62728002
         LA    R15,IGAVALUE  GET THE ADDRESS OF THE KEY TO BE INSERTED. 62736002
         BAL   LKR,INS8        INSERT THE NEW AREA.                     62744002
         DROP  LKR       USE THE REVISED ADDRESS IN THE LINKAGE         62752002
         USING *,LKR     REGISTER FOR THE NEW BASE REGISTER ADDRESS.    62760002
         LR    REQL,W5         GET THE RESIDUAL LENGTH TO STORE IN THE  62768002
         ICALL (&IGANAME+&IGAPVAJ)  TREE FOR ITS NEW PARTIAL ORDER     *62776002
                         VALUE.                                         62784002
         DROP  LKR                                                      62792002
         USING &IGANAME,R15                                             62800002
         L     R15,IGADDR  RESTORE THE BASE REGISTER FOR THIS SECTION.  62808002
THATSIT  EQU   *         THAT'S IT, ALL DONE NOW EXCEPT FOR CLEANUP.    62816002
         LA    R1,O(W5,W7)  GET THE ADDRESS OF THE AREA ALLOCATED TO   *62824002
                         THE USER PROGRAM.                              62832002
         JMP   15,VAROUT       MERGE WITH THE COMMON EXIT PATH.         62840002
         DROP  R15                                                      62848002
*********************************************************************** 62856002
* HERE IS AN AGORONOMIC ROUTINE TO SET THE RETURN CODE TO ZERO,       * 62864002
* RESTORE ALL THE REGISTERS, AND RETURN, AFTER TRACING THE SAVE AREA  * 62872002
* CHAIN BACK ONE LEVEL FROM THE INNER TO THE OUTER SAVE AREA.         * 62880002
RCODE0   EQU   *        COME HERE FROM THE ENTRY TO THE GSPACE ROUTINE. 62888002
         L     R13,BACKWORD  TRACE BACK TO THE PREVIOUS LEVEL SAVE     *62896002
                         AREA.                                          62904002
         XC    GPR15,GPR15  SET THE RETURN CODE TO ZERO.                62912002
LMBR14   LM    LKR,R12,GPR14  RESTORE ALL THE REGISTERS.                62920002
         L     R13,BACKWORD  RESTORE R13 TO IT'S ORIGINAL VALUE.        62928002
         BR    LKR       NOW RETURN.                                    62936002
         DROP  R1                                                       62944002
         DROP  R13                                                      62952002
          EJECT                                                         62960002
*********************************************************************** 62968002
* THIS IS THE ROUTINE TO ALLOCATE AN 8-BYTE FIXED LENGTH AREA USING   * 62976002
* THE FIXEDHDR FOR 8-BYTE ENTRIES IN THE SPACE CONTROL AREA.          * 62984002
* UPON ENTRY THE REGISTERS HAVE THE FOLLOWING CONTENTS:               * 62992002
*  R1:   THE ADDRESS OF THE SPACE CONTROL AREA.                       * 63000002
* LKR:   THE RETURN ADDRESS. BIT 0 OF LKR IS A 1 IF THE REQUEST IS    * 63008002
*        CONDITIONAL, OR IS A 0 IF THE REQUEST IS AN UNCONDITIONAL    * 63016002
*        REQUEST.                                                     * 63024002
*********************************************************************** 63032002
      GODOWNTO &IGAGS8                                                  63040002
         USING  FIXEDHDR-&IGAS8,R1  USE THE SPACE CONTROL AREA.         63048002
          L    R15,HEADFREE  LOAD THE CURRENT HEAD OF THE FREE SPACE   *63056002
                         CHAIN.                                         63064002
         L     R0,O(,R15)  GET THE NEXT ADDRESS ON THE CHAIN (IF THERE *63072002
                         IS ONE).                                       63080002
         ST    R0,HEADFREE  STORE THE NEW HEAD OF THE CHAIN.            63088002
         LA    R1,O(,R15)  CLEAR THE HIGH ORDER BYTE SO AS TO TEST THE  63096002
         SR    R15,R1    HIGH ORDER BIT IN THE ADDRESS OBTAINED TO SEE  63104002
         JMP   8,(LKR)   IF THE ALLOCATION IS SUCCESSFUL.               63112002
         LA    R0,&IGAS8  THE ALLOCATION FAILED, NOW USE THE COMMON    *63120002
                         ROUTINE TO REFILL THE FIXEDHDR.                63128002
         BALR  R15,O     ESTABLISH ADDRESSABILITY.                      63136002
         USING *,R15                                                    63144002
         B     IGACOMNG  BRANCH TO THE COMMON ROUTINE FOR REFILLING.    63152002
         DROP  R15                                                      63160002
         DROP  R1                                                       63168002
         EJECT                                                          63176002
*********************************************************************** 63184002
* THIS IS THE ROUTINE TO ALLOCATE A 12-BYTE FIXED LENGTH AREA USING   * 63192002
* THE FIXEDHDR FOR 12-BYTE ENTRIES IN THE SPACE CONTROL AREA.         * 63200002
* UPON ENTRY THE REGISTERS HAVE THE FOLLOWING CONTENTS:               * 63208002
*  R1:   THE ADDRESS OF THE SPACE CONTROL AREA.                       * 63216002
* LKR:   THE RETURN ADDRESS. BIT 0 OF LKR IS A 1 IF THE REQUEST IS    * 63224002
*        CONDITIONAL, OR IS A 0 IF THE REQUEST IS AN UNCONDITIONAL    * 63232002
*        REQUEST.                                                     * 63240002
*********************************************************************** 63248002
       GODOWNTO &IGAGS12                                                63256002
         USING  FIXEDHDR-&IGAS12,R1 USE THE SPACE CONTROL AREA.         63264002
          L    R15,HEADFREE  LOAD THE CURRENT HEAD OF THE FREE SPACE   *63272002
                         CHAIN.                                         63280002
         L     R0,O(,R15)  GET THE NEXT ADDRESS ON THE CHAIN (IF THERE *63288002
                         IS ONE).                                       63296002
         ST    R0,HEADFREE  STORE THE NEW HEAD OF THE CHAIN.            63304002
         LA    R1,O(,R15)  CLEAR THE HIGH ORDER BYTE SO AS TO TEST THE  63312002
         SR    R15,R1    HIGH ORDER BIT IN THE ADDRESS OBTAINED TO SEE  63320002
         JMP   8,(LKR)   IF THE ALLOCATION IS SUCCESSFUL.               63328002
         LA    R0,&IGAS12 THE ALLOCATION FAILED, NOW USE THE COMMON    *63336002
                         ROUTINE TO REFILL THE FIXEDHDR.                63344002
         BALR  R15,O     ESTABLISH ADDRESSABILITY.                      63352002
         USING *,R15                                                    63360002
         B     IGACOMNG  BRANCH TO THE COMMON ROUTINE FOR REFILLING.    63368002
         DROP  R15                                                      63376002
         DROP  R1                                                       63384002
          EJECT                                                         63392002
*********************************************************************** 63400002
* THIS IS THE ROUTINE TO ALLOCATE AN 80-BYTE FIXED LENGTH AREA USING  * 63408002
* THE FIXEDHDR FOR 80-BYTE ENTRIES IN THE SPACE CONTROL AREA.         * 63416002
* UPON ENTRY THE REGISTERS HAVE THE FOLLOWING CONTENTS:               * 63424002
*  R1:   THE ADDRESS OF THE SPACE CONTROL AREA.                       * 63432002
* LKR:   THE RETURN ADDRESS. BIT 0 OF LKR IS A 1 IF THE REQUEST IS    * 63440002
*        CONDITIONAL, OR IS A 0 IF THE REQUEST IS AN UNCONDITIONAL    * 63448002
*        REQUEST.                                                     * 63456002
*********************************************************************** 63464002
       GODOWNTO &IGAGS80                                                63472002
         USING  FIXEDHDR-&IGAS80,R1 USE THE SPACE CONTROL AREA.         63480002
          L    R15,HEADFREE  LOAD THE CURRENT HEAD OF THE FREE SPACE   *63488002
                         CHAIN.                                         63496002
         L     R0,O(,R15)  GET THE NEXT ADDRESS ON THE CHAIN (IF THERE *63504002
                         IS ONE).                                       63512002
         ST    R0,HEADFREE  STORE THE NEW HEAD OF THE CHAIN.            63520002
         LA    R1,O(,R15)  CLEAR THE HIGH ORDER BYTE SO AS TO TEST THE  63528002
         SR    R15,R1    HIGH ORDER BIT IN THE ADDRESS OBTAINED TO SEE  63536002
         JMP   8,(LKR)   IF THE ALLOCATION IS SUCCESSFUL.               63544002
         LA    R0,&IGAS80 THE ALLOCATION FAILED, NOW USE THE COMMON    *63552002
                         ROUTINE TO REFILL THE FIXEDHDR.                63560002
DPFGS80  EQU   (((16*((*+15-&IGANAME)/16))-(*+6-&IGANAME))/2)           63568002
         DC    (DPFGS80)XL2'0700'  PUT IN NOPR'S UP TO THE SIX BYTES IN*63576002
                         FRONT OF THE ROUTINE FOR ANY FIXEDHDR.         63584002
         DROP  R1                                                       63592002
*********************************************************************** 63600002
* COME HERE FROM THE GSPACE MACRO-INSTRUCTION TO GET A FIXED LENGTH   * 63608002
* ENTRY USING A FIXEDHDR. THE REGISTERS CONTAIN THE FOLLOWING UPON    * 63616002
* ENTRY:                                                              * 63624002
*   R0   IGNORED.                                                     * 63632002
*   R½:  THE ADDRESS OF THE FIXEDHDR TO BE USED FOR ALLOCATING THE    * 63640002
*        SPACE.                                                       * 63648002
*   LKR  THE RETURN ADDRESS.                                          * 63656002
* IF LKR HAS BEEN SET WITH A BALR, THEN THE REQUEST IS A CONDITIONAL  * 63664002
* REQUEST, BUT IF LKR HAS BEEN SET WITH A BAL THE REQUEST IS AN       * 63672002
* UNCONDITIONAL REQUEST. IF THE REQUEST IS SATISFIED, THE RETURN CODE * 63680002
* IS SET TO ZERO, AND THE CONDITION CODE IS SET TO GREATER THAN ZERO. * 63688002
* IF THE REQUEST IS NOT SATISFIED, THE RETURN CODE IS SET TO FOUR, AND* 63696002
* THE CONDITION CODE IS SET TO NEGATIVE.                              * 63704002
*********************************************************************** 63712002
       GODOWNTO &IGAGSPF                                                63720002
         ORG   *-6                                                      63728002
IGACOMNG ALR   R1,R0     GET THE ADDRESS OF THE FIXEDHDR.               63736002
         LA    R15,O(,R1)  PUT THE ADDRESS OF THE FIXEDHDR IN R15.      63744002
IGAGSPAC EQU   *                                                        63752002
         USING FIXEDHDR,R1                                              63760002
LOADNEXT L     R15,HEADFREE  LOAD THE CURRENT HEAD OF THE FREE SPACE   *63768002
                         CHAIN.                                         63776002
         L     R0,O(,R15)  GET THE ADDRESS OF THE NEXT AREA ON THE FREE*63784002
                         SPACE CHAIN.                                   63792002
         ST    R0,HEADFREE  STORE THE NEW HEAD OF THE FREE SPACE CHAIN *63800002
                         IF THE ALLOCATION WAS SUCCESSFUL.              63808002
         LA    R1,O(,R15)  CLEAR THE HIGH ORDER BYTE IN ORDER TO TEST  *63816002
                         THE ALLOCATION TO SEE IF IT WAS SUCCESSFUL.    63824002
         SR    R15,R1    SUBTRACT THE ADDRESS, SO THAT THE RESULT IS   *63832002
                         ZERO IF THE HIGH ORDER BIT IN THE ADDRESS FROM*63840002
                         THE CHAIN WAS ZERO.                            63848002
         BCR   8,LKR     RETURN TO THE CALLING ROUTINE IF THE          *63856002
                         ALLOCATION WAS SUCCESSFUL.                     63864002
         DROP  R1                                                       63872002
*********************************************************************** 63880002
* TOO BAD, THIS IS ONE OF THOSE RARE CASES WHERE THERE ISN'T ANY MORE * 63888002
* SPACE LEFT ON THE CHAIN. NOW THE ROUTINE TO GET MORE SPACE HAS TO BE* 63896002
* EXECUTED.                                                           * 63904002
*********************************************************************** 63912002
*                                                                     * 63920002
* NOW RE-ESTABLISH THE ADDRESS OF THE SPACE CONTROL AREA BY LOOKING   * 63928002
* FOR THE FIXEDHDR FOR 80-BYTE ENTRIEW, THEN SUBTRACTING THE          * 63936002
* DIFFERENCE BETWEEN THE FIXEDHDR FOR 80-BYTE ENTRIES AND THE         * 63944002
* BEGINNING OF THE SPACE CONTROL AREA.                                * 63952002
         LR    R0,R1     SAVE THE ADDRESS OF THE FIXEDHDR.              63960002
         BALR  R15,O     RE-ESTABLISH ADDRESSABILITY.                   63968002
         USING *,R15                                                    63976002
GFIXDUSE EQU   *                                                        63984002
         JMP   15,FIXEDCLI  GO CHECK FOR THE 80-BYTE FIXEDHDR.          63992002
         DROP  R15                                                      64000002
*********************************************************************** 64008002
         USING GFIXDUSE,R15    NOW USE THE BASE REGISTER THAT WAS SET  *64016002
                               UP TO USE FOR IT.                        64024002
         USING FIXEDHDR,R1                                              64032002
FIXEDLA  LA    R1,SIXTEEN(O,R1)  ADD SIXTEEN TO THE ADDRESS.            64040002
FIXEDCLI CLI   FIXDRECL+THREE,EIGHTY  SEE IF THE LENGTH IS 83.          64048002
         JMP   4,FIXEDLA  CONTINUE THE LOOP IF IT IS NOT.               64056002
         SL    R1,=AL4(&IGAS80)  SUBTRACT THE FUDGE FACTOR TO GET THE  *64064002
                         ADDRESS OF THE SPACE CONTROL AREA.             64072002
         DROP  R1                                                       64080002
         STM   LKR,R12,(&IGASA0+((4*LKR)+20-64*((2+LKR)/16)))(R1)      *64088002
                         SAVE THE REGISTERS IN SAVE AREA 0 IN THE SPACE*64096002
                         CONTROL AREA.                                  64104002
         ST    R13,(&IGASA0+FOUR)(,R1)  STORE THE SAVE AREA BACK CHAIN *64112002
                         ADDRESS.                                       64120002
         LA    R13,&IGASA0.(,R1)  GET THE ADDRESS OF THE CURRENT (I. E.*64128002
                         LAST USED) SAVE AREA.                          64136002
         N     LKR,X800  KNOCK OFF ALL BUT THE FIRST BIT IN THE LKR, IT*64144002
                         IS A ONE IF THE REQUEST IS AN UNCONDITIONAL   *64152002
                         GSPACE.                                        64160002
         AL    LKR,COMEBACK  GET THE RETURN ADDRESS FROM THE ROUTINE TO*64168002
                         GET MORE SPACE ON THE FREE SPACE CHAIN.        64176002
         LR    HDB,R0    SET UP THE FIXEDHDR ADDRESS FOR THE ROUTINE TO*64184002
                         GET MORE SPACE.                                64192002
         B     NEEDMORE  GO GET SOME MORE SPACE FOR THE FIXED LENGTH   *64200002
                         CHAIN.                                         64208002
         CNOP  0,4                                                      64216002
COMEBACK DC    AL4(COMEBACK+X'04')                                      64224002
         USING SAVEDSEK,R13  USE THE NEW SAVE AREA ADDRESS TO BACK UP  *64232002
                         TO THE USER'S SAVE AREA (IF HE HAS ONE).       64240002
         LM    LKR,R12,GPR14  RESTORE THE REGISTERS.                    64248002
         L     R13,BACKWARD  TRACE THE EDGE BACK TO THE PREVIOUS SAVE  *64256002
                         AREA.                                          64264002
         DROP  R13                                                      64272002
         LR    R1,R0     GET THE ADDRESS OF THE FIXEDHDR BACK.          64280002
         USING FIXEDHDR,R1                                              64288002
         L     R0,HEADFREE  GET THE NEW HEAD OF THE FREE SPACE CHAIN.   64296002
         LTR   R0,R0     SEE IF THE ALLOCATION WAS SUCCESSFUL.          64304002
         L     R15,ADDRESS  RESTORE THE PROGRAM BASE REGISTER.          64312002
         DROP  R15                                                      64320002
         USING &PROGRAM,R15  USE THE REAL BASE AGAIN.                   64328002
         JMP   2,LOADNEXT  JUMP IF THE ALLOCATION WAS SUCCESSFUL.       64336002
         LA    R15,FOUR  THE ALLOCATION WAS UNSUCCESSFUL, SET THE      *64344002
                         RETURN CODE TO FOUR.                           64352002
         SLR   R1,R1   PUT A ZERO IN R1, SO THE ADDRESS IS NOT USEABLE. 64360002
         BCTR  R1,O      SUBTRACT ONE, SO THAT THE ADDRESS IS NEGATIVE *64368002
                         ONE WHEN IT IS RETURNED.                       64376002
         LTR   R0,R1     SET THE CONDITION CODE NEGATIVE TO SIGNAL THE *64384002
                         ALLOCATION FAILED.                             64392002
         JMP   15,(LKR)  RETURN TO THE GSPACE MACRO.                    64400002
         DROP  R15       NO MORE NEED FOR THIS ONE NOW.                 64408002
         DROP  R1              DROP THE TREE BASE REGISTER.             64416002
*********************************************************************** 64424002
* ENTRY POINT FOR VARIABLE LENGTH FSPACE REQUESTS WHEN THE SPACE      * 64432002
* CONTROL ADDRESS IS NOT EXPLICITLY CODED ON THE FSPACE               * 64440002
* MACRO-INSTRUCTION HEADER.                                           * 64448002
*********************************************************************** 64456002
*                                                                     * 64464002
      GODOWNTO &IGAFSP                                                  64472002
*********************************************************************** 64480002
* THE REGISTER CONTENTS UPON ENTRY ARE AS FOLLOWS:                    * 64488002
*                                                                     * 64496002
*  R0:   SUBPOOL AND REQUEST LENGTH.                                  * 64504002
*  R1:   THE ADDRESS OF THE AREA TO BE RELEASED.                      * 64512002
*  LKR:  THE RETURN ADDRESS FROM THE CALLING PROGRAM.                 * 64520002
*  R15:  THE CONTENTS OF REGISTER 15 ARE IGNORED.                     * 64528002
*********************************************************************** 64536002
         LA    R15,O(,R1)  SEE IF THE ADDRESS OF THE AREA TO BE        *64544002
                         RELEASED IS ZERO.                              64552002
         LTR   R15,R15   XX                                             64560002
         BCR   8,LKR     EXIT WITH THE RETURN CODE ZERO IF THE ADDRESS *64568002
                         OF THE AREA TO RELEASE IS ZERO.                64576002
      RPTDSECT GEN=(TCBRPTA,15)  GET SET TO FIND THE APPROPRIATE SPCA  *64584002
                         IN THE TCB-ADDRESSED COLLECTION.               64592002
         L     R15,O(,R15)  GET THE CONTENTS OF THE TCBRPT WORD.        64600002
         BCTR  R15,O     SUBTRACT ONE SO THAT IF IT IS ZERO THE RESULT *64608002
                         IS NEGATIVE.                                   64616002
         LTR   R15,R15   SEE IF THE TCBRPT WORD IS FILLED IN.           64624002
         BCR   4,LKR     RETURN WITH RETURN CODE -1 IF THE WORD IS NOT *64632002
                         FILLED IN.                                     64640002
*********************************************************************** 64648002
* THE TCBRPT WORD HAS BEEN INITIALIZED, USE SAVE AREA 0 IN THE SPCA TO* 64656002
* SAVE THE REGISTERS.                                                 * 64664002
*********************************************************************** 64672002
         STM   LKR,R12,(ONE+&IGASA0+((X'04'*LKR)+X'14'-X'40'*((2+LKR)/1*64680002
               6)))(R15)  SAVE THE REGISTERS.                           64688002
         ST    R13,(FIVE+&IGASA0)(,R15)  STORE THE BACKWARD EDGE FIELD *64696002
                         FOR THE SAVE AREA CHAIN.                       64704002
         LA    R13,(ONE+&IGASA1)(,R15)  GET THE ADDRESS OF THE SAVE    *64712002
                         AREA TO USE IN FSPACE.                         64720002
         LR    F2,R1     SAVE THE ADDRESS OF THE AREA TO BE RELEASED.   64728002
         LA    F1,ONE(,R15)  GET THE ADDRESS OF THE SPCA FOR SUBPOOL   *64736002
                         ZERO.                                          64744002
         L     R15,&IGADDR.(,F1)  GET THE ADDRESS OF THE BASE OF THE   *64752002
                         MODULE.                                        64760002
         USING &IGANAME,R15  USE THE BASE OF THE MODULE FOR            *64768002
                         ADDRESSABILITY.                                64776002
         CL    R0,=XL4'01000000'  SEE IF THE REQUEST SUBPOOL IS ZERO.   64784002
         BL    FSPACVAR  BRANCH IF THE REQUEST IS FOR SUBPOOL ZERO.     64792002
         LR    F3,R0     GET THE REQUEST SUBPOOL #                      64800002
         SRL   F3,24     AND PUT IT IN THE RIGHT BYTE OF THE REGISTER.  64808002
         SLR   F4,F4     MAKE THE LEFT THREE BYTES ZERO FOR THE        *64816002
                         SUBSEQUENT INSERT CHARACTER INSTRUCTION.       64824002
         USING IGASPCTL,F1  F1 HAS THE SPCA ADDRESS IN IT.              64832002
         L     F5,IGASPEDG  LOAD THE EDGE FIELD TO THE FIRST 8-BYTE    *64840002
                         ENTRY ON THE SPCA CHAIN.                       64848002
         DROP  F1        FROM NOW ON F1 IS SET TO THE ADDRESS OF EACH  *64856002
                         CURRENT SPCA AS THE SEARCH FOR THE RIGHT      *64864002
                         SUBPOOL PROGRESSES.                            64872002
ZFSPLOOP LTR   F5,F5  CHECK FOR THE LAST DOUBLE WORD ON THE SPCA CHAIN. 64880002
         BM    NULLEXIT  EXIT WITH A RETURN CODE -1 IF THE SPCA FOR THE*64888002
                         SUBPOOL CAN NOT BE FOUND.                      64896002
         USING IGASPC,F5  USE F5 FOR THE BASE OF THE 8-BYTE ENTRY.      64904002
         IC    F4,IGASPADR  GET THE SUBPOOL # FOR THE CURRENT SPCA.     64912002
         L     F1,IGASPADR  GET THE ADDRESS OF THE CURRENT SPCA.        64920002
         CLR   F3,F4     SEE IF THE REQUEST SUBPOOL IS EQUAL TO THE    *64928002
                         SPCA SUBPOOL.                                  64936002
         BE    FSPACVAR  BRANCH IF THE RIGHT SPCA HAS BEEN FOUND.       64944002
         B     ZFSPLOOP  CONTINUE IF THE SPCA HAS NOT YET BEEN FOUND.   64952002
         DROP  F5                                                       64960002
         DROP  R15                                                      64968002
*********************************************************************** 64976002
* ENTRY POINT FOR VARIABLE LENGTH ENTRIES FROM THE FSPACE MACRO WHEN  * 64984002
* THE SPACE CONTROL ADDRESS IS CODED IN THE FSPACE MACRO.             * 64992002
*********************************************************************** 65000002
      GODOWNTO &IGAFSPS                                                 65008002
         USING SAVEDSEK-&IGASA0,R15  USE THE SAVE AREA IN THE CONTROL  *65016002
                         AREA.                                          65024002
         STM   LKR,R12,GPR14   SAVE THE REGISTERS.                      65032002
         ST    R13,BACKWORD    FILL IN THE BACK CHAIN EDGE FOR THE SAVE*65040002
                         AREA CHAIN.                                    65048002
         DROP  R15                                                      65056002
         USING IGASPCTL,R15    ADDRESS THE SPACE CONTROL AREA.          65064002
         LA    R13,IGASA1  ESTABLISH THE SAVE AREA FOR THE VARIABLE    *65072002
                         LENGTH SPACE ALLOCATION ROUTINES.              65080002
         DROP  R15                                                      65088002
         LA    R1,0(,R1) CLEAR LEFT BYTE                                65096002
         LTR   F2,R1     TEST THE ADDRESS TO BE RELEASED.               65104002
         LR    F1,R15    ADDRESS OF THE SPACE CONTROL AREA.             65112002
         L     R15,O(,R15)     GET THE ADDRESS OF IGARPT01.             65120002
         USING &PROGRAM,R15                                             65128002
         JMP   8,NULLEXIT  EXIT IMMEDIATELY IF THE ADDRESS IS ZERO.     65136002
         DROP  R15                                                      65144002
         EJECT                                                          65152002
*********************************************************************** 65160002
* FSPACE SUBROUTINE FOR VARIABLE LENGTH AREAS                         * 65168002
*                                                                     * 65176002
* THE REGISTER CONTENTS UPON ENTRY TO THIS SECTION ARE AS FOLLOWS:    * 65184002
*                                                                     * 65192002
*  R0:   THE LENGTH OF THE AREA TO BE RELEASED.                       * 65200002
*  R1:   THE ADDRESS OF THE SPACE CONTROL AREA.                       * 65208002
*  F2:   THE ADDRESS OF THE AREA TO BE RELEASED.                      * 65216002
*  R13:  THE ADDRESS OF SAVE AREA 1 IN THE SPCA.                      * 65224002
*  R15:  THE BASE REGISTER FOR THIS SECTION, CONTAINING THE ADDRESS OF* 65232002
*        THE BASE OF THE MODULE.                                      * 65240002
*********************************************************************** 65248002
FSPACVAR EQU   *                                                        65256002
         RASS  (F0,R0,F1,R1,F2,R2,F3,R3,F4,R4,F5,R5,F6,R6,F7,R7)        65264002
         RASS  (F8,R8,F9,R9,F10,R10,F11,R11,F12,R12,F15,R15)            65272002
         USING &PROGRAM,F15    PROGRAM BASE REGISTER.                   65280002
         USING SAVEDSEK,R13    OUTER SAVE AREA.                         65288002
         USING IGASPCTL,R1  NOW ROUND THE REQUEST UP TO A MULTIPLE OF  *65296002
                         THE APPROPRIATE POWER OF TWO.                  65304002
         SL    REQL,IGAROUND  ADD THE APPROPRIATE POWER OF TWO TO THE  *65312002
                         REQUEST LENGTH BY SUBTRACTING ITS COMPLEMENT.  65320002
         BCTR  REQL,O    NOW SUBTRACT ONE FOR A NET PLUS OF ONE LESS   *65328002
                         THAN THE POWER OF TWO.                         65336002
         N     REQL,IGAROUND  NOW KNOCK OFF THE REDUNDANT LOW ORDER    *65344002
                         BITS.                                          65352002
         DROP  R1                                                       65360002
         USING TREEHDR,F1                                               65368002
         LR    F3,REQL         LENGTH OF THE AREA TO FREE UP.           65376002
         LA    F4,O(F2,F3)     ADD THE LENGTH TO THE ADDRESS TO GET THE 65384002
         ST    F4,IGAWORK  ADDRESS OF THE BYTE JUST PAST THE AREA       65392002
*                              TO BE FREED.                             65400002
         LA    F0,IGAWORK  GET THE ADDRESS FOR THE SEARCH.              65408002
         BAL   LKR,SRCH8       SEARCH FOR THE ADDRESS JUST PAST IT.     65416002
         ST    F2,IGAWORK  STORE THE NEW ADDRESS BACK IN.               65424002
         LTR   F5,F15    GET THE ADDRESS FOUND BY SEARCH.               65432002
         L     F15,IGADDR      SEE IF THE TREE IS EMPTY.                65440002
         JMP   4,FRINS         JUMP TO INSERT IT IF THE TREE IS EMPTY.  65448002
         CLR   F4,F5           SEE IF THE AREA JUST TO THE RIGHT OF THE 65456002
         JMP   8,FREQUAL       AREA TO BE FREED IS ALSO FREE.           65464002
         BC    4,FRSCANL       BRANCH IF IT FOUND SOME AREA TO THE      65472002
*                              RIGHT OF THE AREA TO BE FREED.           65480002
*---------------------------------------------------------------------* 65488002
LMFRLOOP EQU   *         LOOP TO FIND AREA TO NEW'S LEFT.               65496002
         LM    F6,F9,APT  CAPTURE THE CURRENT CURSOR SETTING TOGETHER  *65504002
                         WITH P AND C.                                  65512002
         ICALL (&IGANAME+&IGARSCN)  SCAN OVER TO FIND THE AREA JUST TO *65520002
                         THE                                            65528002
         ST    R15,FARG        LEFT OF THE AREA TO FREE.                65536002
         L     R15,IGADDR      RESTORE THE PROGRAM BASE REGISTER.       65544002
         JMP   4,FOUNDIT       JUMP IF IT WENT OFF THE RIGHT END.       65552002
         CL    F2,FARG         SEE IF F4 IS STILL TO THE RIGHT OF FARG. 65560002
         BC    2,LMFRLOOP      BRANCH IF SCANR DID'T PASS IT YET.       65568002
FOUNDIT  EQU   *  COME HERE WHEN SCANR HAS GONE PAST THE LARGEST AREA   65576002
*                 AREA THAT DOES NOT EXCEED THE AREA TO BE FREED.       65584002
         STM   F6,F9,APT       RESTORE THE PATH TO LAST TIME.           65592002
         ICALL (&IGANAME+&IGAPVG)  GET THE SINK'S POV ON THIS PATH.     65600002
         L     R15,IGADDR  RESTORE THE BASE REGISTER.                   65608002
FRAFTPOV EQU   *         THIS IS AFTER THE POV HAS BEEN FOUND IN REQL.  65616002
         LR    F10,REQL        SEE IF THE AREA JUST TO THE LEFT OF THE  65624002
         ALR   F10,F9          THE NEW AREA IS ADJACENT TO IT.          65632002
         CLR   F2,F10    XX                                             65640002
         JMP   7,FSRCHINS      JUMP IF THE NEW AREA DOES NOT.           65648002
*                              COMBINE WITH THE AREA ON ITS LEFT.       65656002
         ALR   F0,F3           THE NEW AREA COMBINES WITH THE AREA ON   65664002
         ICALL (&IGANAME+&IGAPVAJ)  ITS LEFT, ADJUST THE POV OF THE    *65672002
                         AREA ON                                        65680002
*                              THE LEFT TO BE THE SUM OF THE TWO        65688002
*                              LENGTHS.                                 65696002
VARFEXIT EQU   *         ALL DONE, NOW BACK OUT.                        65704002
         L     R13,BACKEDGE    GO BACK TO THE INNER TREE.               65712002
         LM    LKR,R12,GPR14   RESTORE THE REGISTER FROM THE INNER      65720002
         L     R13,BACKEDGE    SAVE AREA, RESTORE R13 TO ITS ORIGINAL   65728002
         SR    R15,R15   SET RETURN CODE TO ZERO AND SET                65736002
         JMP   15,(LKR)  CONDITION CODE TO AGREE WITH THE RETURN CODE.  65744002
NULLEXIT LEAF  RC=-1,LV=-0 ADDRESS IS ZERO. NOTHING TO RELEASE          65752002
*********************************************************************** 65760002
* THE NEW AREA BEING FREED DOESN'T COMBINE WITH THE AREA ON ITS LEFT, * 65768002
* INSERT IT AS A NEW SINK IN THE OUTER TREE AND PUT IN ITS POV.       * 65776002
*********************************************************************** 65784002
FSRCHINS EQU   *         SEARCH AND INSERT NEW AREA.                    65792002
FRINS    EQU   *  COME HERE.                                            65800002
         LA    F0,IGAWORK  GET THE ADDRESS FOR THE SEARCH.              65808002
         BAL   LKR,SRCH8       SEARCH FOR THE INSERTION POINT.          65816002
         ST    F15,IGAVALUE  STORE THE ADDRESS RETRIEVED BY SEARCH.     65824002
         LA    F15,IGAVALUE  GET THE ADDRESS OF THE FOUND KEY FOR THE  *65832002
               INSERT ROUTINE.                                          65840002
         ST    F15,IGAFARG  STORE THE ADDRESS OF THE FOUND KEY.         65848002
         L     LKR,IGADDR  LOAD THE ADDRESS OF THE BASE OF THE MODULE.  65856002
         DROP  R15                                                      65864002
         USING &IGANAME,LKR  USE THE LKR TO ADDRESS THINGS.             65872002
         LR    R0,F2     GET THE ADDRESS TO ASSOCIATE WITH THE KEY.     65880002
         LA    R15,IGAWORK  GET THE ADDRESS OF THE KEY (WHICH IS ALSO  *65888002
                         AN ADDRESS).                                   65896002
         LA    LKR,INS8  GET THE ADDRESS OFN  OF THE TYPE 8 RPT INSERT *65904002
                         SUBROUTINE.                                    65912002
         BALR  LKR,LKR   LINK TO THE INSERT ROUTINE.                    65920002
         DROP  LKR       NOW GO BACK TO THE OTHER BASE REGISTER.        65928002
         L     F15,IGADDR      RESTORE THE PROGRAM BASE REGISTER.       65936002
         USING &IGANAME,R15                                             65944002
         LR    REQL,F3         GET THE LENGTH OF THE NEW AREA.          65952002
         LA    LKR,VARFEXIT    ADJUST THE SINK'S POV SO AS TO           65960002
         L     R15,=AL4(&IGANAME+&IGAPVAJ)  MAINTAIN THE PARTIAL ORDER *65968002
                         CONDITION.                                     65976002
         BCR   15,R15    LINK TO ADJUST THE PARTIAL ORDER VALUE.        65984002
*********************************************************************** 65992002
FRSCANL  EQU   *         SCAN LEFT TO THE AREA JUST TO THE LEFT OF THE  66000002
*                        AREA TO BE FREED.                              66008002
         ICALL (&IGANAME+&IGALSCN)  SCAN LEFT.                          66016002
         ST    R15,FARG        SAVE THE ADDRESS ACCESSED BY SCANL.      66024002
         LTR   F9,R15          SEE IF IT WENT OFF THE END.              66032002
         L     F15,IGADDR      RESTORE THE PROGRAM BASE.                66040002
         JMP   4,FRINS         JUMP IF IT WENT OFF THE LEFT END.        66048002
*                              LEFT END.                                66056002
         CLR   F2,F9           SEE IF THE NEW AREA IS STILL LESS THAN   66064002
         BC    4,FRSCANL  THE ONE THE SCAN FOUND.                       66072002
         LA    LKR,FRAFTPOV    THE NEW AREA IS GREATER THAN THE ONE     66080002
         L     R15,=AL4(&IGANAME+&IGAPVG)  FOUND BY THE SCANL.          66088002
*                              SEE IF THE NEW AREA COMBINES WITH IT.    66096002
*********************************************************************** 66104002
FREQUAL  EQU   *         NEW AREA COMBINES WITH THE ONE ON ITS RIGHT.   66112002
         ICALL (&IGANAME+&IGAPVG)  GET THE PARTIAL ORDER VALUE FOR THE *66120002
                         ONE ON THE RIGHT.                              66128002
         DROP  R15                                                      66136002
         USING *,LKR     USE THE LINKAGE REGISTER AS A TEMPORARY BASE  *66144002
                         REGISTER.                                      66152002
         ALR   F3,REQL         AND ADD THE TWO LENGTH TOGETHER.         66160002
         LM    F6,F8,APT       RESTORE THE PATH TO THE ONE ON THE       66168002
*                              LEFT OF THE NEW AREA, AND SEE IF THE     66176002
         ICALL (&IGANAME+&IGALSCN)  THREE AREAS CAN BE COMBINED.        66184002
         DROP  LKR                                                      66192002
         USING *,LKR     NOW USE THIS AS A TEMPORARY BASE REGISTER     *66200002
                         ADDRESS.                                       66208002
         LTR   F9,R15          SEE IF THERE IS ONE ON IT'S LEFT.        66216002
         JMP   4,VARFADJ       JUMP IF THE NEW ONE COMBINES WITH THE    66224002
*                              WITH THE ONE ON ITS RIGHT.               66232002
         ICALL (&IGANAME+&IGAPVG) GET THE LENGTH OF THE ONE ON ITS LEFT 66240002
         DROP  LKR                                                      66248002
         USING *,LKR     USE A NEW TEMPORARY BASE REGISTER.             66256002
         LR    F10,REQL        ADD THE LENGTH OF THE ONE ON THE LEFT TO 66264002
         ALR   F10,F9          THE ADDRESS OF THE ONE ON THE LEFT TO    66272002
         CLR   F10,F2          FORM THE ADDRESS OF THE AREA JUST TO THE 66280002
         BC    7,VARFADJ       RIGHT OF THE ONE ON THE LEFT OF THE NEW  66288002
*                              ONE, AND COMPARE THIS ADDRESS TO THE     66296002
*                              ADDRESS OF THE NEW ONE.                  66304002
*                              IF THESE ADDRESSES ARE EQUAL, THEN ALL   66312002
*                              THREE AREAS COMBINE INTO ONE, BUT IF     66320002
*                              THESE ADDRESSES ARE NOT EQUAL THEN       66328002
*                              THE NEW ONE ONLY COMBINES WITH THE ONE   66336002
*                              ON ITS RIGHT.                            66344002
*---------------------------------------------------------------------* 66352002
* THE NEW ONE COMBINES WITH THE AREAS ON BOTH SIDES OF IT TO MAKE     * 66360002
* ONE BIG AREA. DELETE THE ONE ON THE RIGHT AND ADJUST THE LENGTH OF  * 66368002
* THE ONE ON THE LEFT TO BE THE SUM OF ALL THREE LENGTHS.             * 66376002
*---------------------------------------------------------------------* 66384002
         ALR   F0,F3     GET THE SUM OF ALL THREE LENGTHS.              66392002
         ICALL (&IGANAME+&IGAPVAJ)  ADJUST THE LENGTH OF THE ONE ON THE*66400002
                         LEFT OF THE AREA TO BE RELEASED.               66408002
         DROP  LKR                                                      66416002
         USING *,LKR     USE THE LINKAGE REGISTER AS A TEMPORARY BASE  *66424002
                         REGISTER.                                      66432002
         STM   F6,F8,APT       RESTORE THE PATH TO THE ONE ON THE RIGHT 66440002
         SLR   REQL,REQL       AND ADJUST ITS POV TO BE ZERO, IN        66448002
         ICALL (&IGANAME+&IGAPVAJ)  PREPARATION FOR DELETING IT.        66456002
         DROP  LKR                                                      66464002
         USING *,LKR     NOW USE THIS AS A TEMPORARY BASE ADDRESS.      66472002
         L     R15,=AL4(&IGANAME+&IGADEL8)  GET THE ADDRESS OF THE TYPE*66480002
                         8 DELETION ROUTINE.                            66488002
         DROP  LKR                                                      66496002
         USING (&IGANAME+&IGADEL8),R15  USE THIS REGISTER.              66504002
         LA    LKR,VARFEXIT    AFTER IT IS DELETED IT IS ESSENTIALLY    66512002
         BCR   15,R15    FINISHED, EXCEPT FOR CLEANUP AND EXIT.         66520002
         DROP  R15                                                      66528002
*********************************************************************** 66536002
* THE NEW AREA ONLY COMBINES WITH THE AREA IMMEDIATELY TO ITS RIGHT.  * 66544002
* RESTORE THE PATH TO THE ONE ON ITS RIGHT. IF THE ONE ON THE RIGHT IS* 66552002
* A RIGHT SINK, THEN IT IS ONLY NECESSARY TO ADJUST THE POV AND REPLACE 66560002
* IT WITH THE NEW ADDRESS.                                            * 66568002
*   HOWEVER, IF THE ONE ON THE RIGHT IS NOT A RIGHT SINK, THEN IT MUST* 66576002
* BE DELETED AND THE NEW ONE INSERTED WITH ITS NEW POV.               * 66584002
*********************************************************************** 66592002
VARFADJ  EQU   *         ADJUST THE POV OF THE ONE ON THE RIGHT         66600002
         BALR  R15,O     ESTABLISH A NEW BASE REGISTER.                 66608002
         USING *,R15     USE THE NEW BASE REGISTER.                     66616002
         STM   F6,F8,APT       RESTORE THE PATH TO THE ONE ON THE RIGHT 66624002
         SLR   REQL,REQL       GET ZERO TO ADJUST THE POV TO ZERO       66632002
         ICALL (&IGANAME+&IGAPVAJ)  JUST BEFORE DELETING IT FROM THE   *66640002
                         TREE.                                          66648002
         DROP  R15                                                      66656002
         USING *,LKR     USE YET ANOTHER BASE REGISTER.                 66664002
         ICALL (&IGANAME+&IGADEL8)  DELETE THE ONE ON THE RIGHT OF THE *66672002
                         AREA TO BE RELEASED.                           66680002
         DROP  LKR                                                      66688002
         USING &IGANAME,R15                                             66696002
         L     F15,IGADDR      RESTORE THE PROGRAM BASE REGISTER.       66704002
         JMP   15,FSRCHINS     GO INSERT THE NEW ONE.                   66712002
         DROP  F1                                                       66720002
         DROP  R13                                                      66728002
         DROP  R15                                                      66736002
*********************************************************************** 66744002
* COME HERE TO RELEASE AN 8-BYTE AREA USING THE FREE SPACE CHAIN FROM * 66752002
* THE FIXEDHDR IN THE SPACE CONTROL AREA.                             * 66760002
*                                                                     * 66768002
* UPON ENTRY THE REGISTERS HAVE THE FOLLOWING CONTENTS:               * 66776002
*                                                                     * 66784002
* R1:    THE ADDRESS OF THE AREA TO BE RELEASED.                      * 66792002
* LKR:   THE RETURN ADDRESS FROM THE CALLING PROGRAM.                 * 66800002
* R15:   THE ADDRESS OF THE SPACE CONTROL AREA CONTAINING THE FIXEDHDR. 66808002
*********************************************************************** 66816002
      GODOWNTO &IGAFS8                                                  66824002
         USING FIXEDHDR-&IGAS8,R15                                      66832002
         LA    R1,O(,R1)  CLEAR THE HIGH ORDER BYTE OF THE ADDRESS OF  *66840002
                         THE AREA TO BE RELEASED.                       66848002
         LTR   R1,R1     SEE IF THERE IS AN ADDRESS OF AN AREA TO BE   *66856002
                         RELEASED.                                      66864002
         BCR   8,LKR     DO NOTHING IF THE ADDRESS IS ZERO.             66872002
         L     R0,HEADFREE  LOAD THE HEAD OF THE FREE SPACE CHAIN.      66880002
         ST    R0,O(,R1)  STORE THE OLD HEAD OF THE FREE SPACE CHAIN   *66888002
                         IN THE FIRST WORD OF THE NEW AREA.             66896002
         ST    R1,HEADFREE  STORE THE NEW HEAD OF THE FREE SPACE CHAIN. 66904002
         JMP   15,(LKR)  EXIT.                                          66912002
         DROP  R15                                                      66920002
*********************************************************************** 66928002
* COME HERE TO RELEASE A 12-BYTE AREA USING THE FIXEDHDR IN THE SPACE * 66936002
* CONTROL AREA. UPON ENTRY TO THIS SUBROUTINE THE REGISTERS CONTAIN   * 66944002
* THE FOLLOWING:                                                      * 66952002
*                                                                     * 66960002
*  R1:   THE ADDRESS OF THE AREA TO BE RELEASED.                      * 66968002
*  LKR:  THE RETURN ADDRESS FROM THE BRANCH AND LINK IN THE CALLING   * 66976002
*        PROGRAM.                                                     * 66984002
*  R15:  THE ADDRESS OF THE SPACE CONTROL AREA CONTAINING THE FIXEDHDR* 66992002
*        TO BE USED.                                                  * 67000002
* IF THE ADDRESS OF THE AREA BEING RELEASED IS ZERO THE OPERATION IS  * 67008002
* AN EFFECTIVE NOP.                                                   * 67016002
*********************************************************************** 67024002
*                                                                     * 67032002
      GODOWNTO &IGAFS12                                                 67040002
         USING FIXEDHDR-&IGAS12,R15  USE THE 12-BYTE FIXEDHDR.          67048002
         LA    R1,O(,R1)  CLEAR THE HIGH ORDER BYTE IN THE ADDRESS OF  *67056002
                         THE AREA TO BE RELEASED.                       67064002
         LTR   R1,R1     SEE IF THE ADDRESS IS ZERO.                    67072002
         BCR   8,LKR     RETURN IF THE ADDRESS IS ZERO.                 67080002
         L     R0,HEADFREE  GET THE CURRENT HEAD OF THE FREE SPACE     *67088002
                         CHAIN.                                         67096002
         ST    R0,O(,R1)  CATENATE THE CHAIN TO THE NEW AREA, THUS     *67104002
                         MAKING IT THE NEW HEAD.                        67112002
         ST    R1,HEADFREE  STORE THE NEW HEAD OF THE FREE SPACE CHAIN. 67120002
         JMP   15,(LKR)  RETURN TO THE CALLING PROGRAM.                 67128002
         DROP  R15                                                      67136002
*********************************************************************** 67144002
      GODOWNTO &IGAFS80                                                 67152002
* COME HERE TO RELEASE AN 80-BYTE AREA USING THE FIXEDHDR IN THE SPACE* 67160002
* CONTROL AREA. UPON ENTRY TO THIS SUBROUTINE THE REGISTERS CONTAIN   * 67168002
* THE FOLLOWING:                                                      * 67176002
*                                                                     * 67184002
*  R1:   THE ADDRESS OF THE AREA TO BE RELEASED.                      * 67192002
*  LKR:  THE RETURN ADDRESS FROM THE BRANCH AND LINK IN THE CALLING   * 67200002
*        PROGRAM.                                                     * 67208002
*  R15:  THE ADDRESS OF THE SPACE CONTROL AREA CONTAINING THE FIXEDHDR* 67216002
*        TO BE USED.                                                  * 67224002
*                                                                     * 67232002
* IF THE ADDRESS OF THE AREA BEING RELEASED IS ZERO THE OPERATION IS  * 67240002
* AN EFFECTIVE NOP.                                                   * 67248002
*********************************************************************** 67256002
         USING FIXEDHDR-&IGAS80,R15  USE THE 80-BYTE FIXEDHDR.          67264002
         LA    R1,O(,R1)  CLEAR THE HIGH ORDER BYTE IN THE ADDRESS OF  *67272002
                         THE AREA TO BE RELEASED.                       67280002
         LTR   R1,R1     SEE IF THE ADDRESS IS ZERO.                    67288002
         BCR   8,LKR     RETURN IF THE ADDRESS IS ZERO.                 67296002
         L     R0,HEADFREE  GET THE CURRENT HEAD OF THE FREE SPACE     *67304002
                         CHAIN.                                         67312002
         ST    R0,O(,R1)  CATENATE THE CHAIN TO THE NEW AREA, THUS     *67320002
                         MAKING IT THE NEW HEAD.                        67328002
         ST    R1,HEADFREE  STORE THE NEW HEAD OF THE FREE SPACE CHAIN. 67336002
         JMP   15,(LKR)  RETURN TO THE CALLING PROGRAM.                 67344002
         DROP  R15                                                      67352002
*********************************************************************** 67360002
* ENTRY POINT TO FREE UP ONE RECORD SPACE TO THE RECORD FREE SPACE    * 67368002
* CHAIN. COME HERE FOR FIXED RECORDS ONLY, VARIABLE LENGTHS DON'T WORK. 67376002
* COME HERE FROM THE FSPACE MACRO-INSTRUCTION TO FREE UP A FIXED      * 67384002
* LENGTH AREA. UPON ENTRY THE REGISTERS CONTAIN THE FOLLOWING:        * 67392002
*   R1   THE ADDRESS OF THE AREA TO BE RELEASED.                      * 67400002
*   LKR  THE RETURN ADDRESS.                                          * 67408002
*   R15  THE ADDRESS OF THE FIXEDHDR FOR THE FIXED LENGTH FREE SPACE  * 67416002
*        CHAIN.                                                       * 67424002
*********************************************************************** 67432002
      GODOWNTO &IGAFSPF                                                 67440002
IGAFSPAC EQU   *   COME HERE TO FREE UP A RECORD SPACE.                 67448002
         LA    R1,O(,R1) CLEAR THE HIGH ORDER BYTE OF THE ADDRESS.      67456002
         LTR   R1,R1     SEE IF THERE IS ANYTHING TO FREE UP.           67464002
         JMP   12,(LKR)        RETURN IMMEDIATELY IF NOT.               67472002
         USING FIXEDHDR,R15                                             67480002
         L     R0,HEADFREE  GET THE CURRENT HEAD OF THE CHAIN.          67488002
         ST    R0,O(O,R1)  STORE THE CURRENT HEAD AT THE AREA BEING    *67496002
                         RELEASED,THUS CHAINING THE CURRENT CHAIN ON AS*67504002
                         THE TAIL OF THE NEW HEAD.                      67512002
         ST    R1,HEADFREE  STORE THE NEW HEAD.                         67520002
         JMP   15,(LKR)  RETURN TO THE FSPACE MACRO-INSTRUCTION.        67528002
         DROP  R15                                                      67536002
         AGO   .FINFFSP  SKIP AROUND THIS CODE THAT IS UNUSED FOR THE  *67544002
                         NONCE.                                         67552002
         USING FIXEDHDR,HDB    USE THE FIXEDHDR.                        67560002
         L     R3,BLOKHEAD     SET UP FOR THE CHECK LOOP.               67568002
         USING BLOCKHDR,R3     R3 ADDRESSES THE BLOCKHDR.               67576002
BADLOOP  LM    R3,R5,O(R3)     LOAD IN THE EDGE, SP/LENGTH, AND LIMIT.  67584002
         LA    R4,O(O,R4)      SEE IF THE ADDRESS IN GPR 15 IS IN THE   67592002
         LCR   R5,R5           BLOCK DEFINED BY THIS BLOCKHDR.          67600002
         ALR   R5,R15          THIS TECHNIQUE IS IDENTICAL TO THE ONE   67608002
         CLR   R5,R4           USED IN THE APL INTERPRETER FOR CHECKING 67616002
*                              SUBSCRIPTS TO SEE IF THEY ARE IN THE     67624002
*                              RANGE OF THE INDEX SET FOR THE ARRAY,    67632002
*                              WHICH WAS IMPLEMENTED BY L. J. WOODRUM   67640002
*                              IN 1966.                                 67648002
         BC    4,GOODEND       THIS BLOCK.                              67656002
         LTR   R3,R3           IT ISN'T, CHECK FOR THE END OF THE       67664002
         BC    7,BADLOOP       BLOCK CHAIN, AND CONTINUE IF NOT END.    67672002
         DC    XL2'0D00'       ABEND IF IT'S NOT IN THE BLOCK CHAIN.    67680002
GOODEND  EQU   *  COME HERE WHEN IT HAS BEEN FOUND IN THE BLOCK CHAIN.  67688002
         MVC   O(4,R15),HEADFREE  MOVE OLD CHAIN HEAD TO NEW VERTEX.    67696002
         ST    R15,HEADFREE  STORE THE NEW HEAD OF THE CHAIN.           67704002
         LM    LKR,R5,TREESAVE+GPR14-SAVEDSEK  RESTORE THE REGISTERS.   67712002
RCODE0   EQU   *  COME HRE TO RETURN WITH A RETURN CODE OF ZERO.        67720002
         SLR   R15,R15       DON'T GIVE BACK ADDRESSABILITY TO THIS.    67728002
         BCTR  R15,LKR     SET THE RETURN CODE TO MINUS ONE.            67736002
         DROP  R1                                                       67744002
         DROP  HDB                                                      67752002
         DROP  R3                                                       67760002
.FINFFSP ANOP                                                           67768002
         EJECT                                                          67776002
*********************************************************************** 67784002
* SUBROUTINE TO SEARCH FOR A SINK THAT HAS AN ASSOCIATED PARTIAL ORDER* 67792002
* VALUE THAT IS GREATER THAN OR EQUAL TO THE PARTIAL RODER VALUE      * 67800002
* SEARCH ARGUMENT IN REGISTER REQL. THE BASIC ALGORITHM IS CHECK THE  * 67808002
* PARTIAL ORDER VALUE AGAINST THE POV AT EACH INNER VERTEX DOWN THE   * 67816002
* PATH TO SEE IF THE REQL IS SMALLER OR EQUAL TO IT. IF REQL IS LESS  * 67824002
* THAN THE POV OR EQUAL TO IT, THEN THE SUBTREE OF KNOWN ORDER CONTAINS 67832002
* A SINK WITH A (POSSIBLY) SMALLER POV THAN THE ONE THAT WAS DETERMINED 67840002
* PREVIOUSLY. IN THIS CASE, THE SEARCH PROCEEDS INTO THE SUBTREE OF   * 67848002
* KNOWN ORDER, AND SAVES THE POV AT THE INNER VERTEX FOR LATER.     *   67856002
* IF THE POV AT THE INNER VERTEX IS SMALLER THAN REQL, THEN THE SUBTREE 67864002
* OF KNOWN ORDER CANNOT CONTAIN A POV THAT IS NOT SMALLER THAN REQL,  * 67872002
* SINCE THE MAXIMUM VALUE FROM THE SUBTREE OF KNOWN ORDER IS ALREADY  * 67880002
* SMALLER THAN REQL. IN THIS CASE THE SEARCH PATH ENTERS THE SUBTREE  * 67888002
* OF UNKNOWN ORDER, WHERE IT IS CERTAIN TO FIND AT LEAST ONE SINK WITH* 67896002
* A VALUE NOT SMALLER THAN REQL.                                      * 67904002
*---------------------------------------------------------------------* 67912002
* UPON ENTRY TO THIS SUBROUTINE THE REGISTERS ARE AS FOLLOWS:         * 67920002
*                                                                     * 67928002
REQL     EQU   R0    THE PARTIAL ORDER VALUE SEARCH ARGUMENT.         * 67936002
*              R1    THE ADDRESS OF THE TREEHDR FOR THE RADIX PARTITION 67944002
*                    TREE.                                            * 67952002
*       R13:             R13 MUST HAVE A VALID SAVE AREA ADDRESS IN IT* 67960002
*                        TO SAVE THE REGISTERS.                       * 67968002
*              R15:THE ADDRESS OF THE POVSRCH ROUTINE.                * 67976002
*              LKR   THE ADDRESS TO RETURN TO.                        * 67984002
*---------------------------------------------------------------------* 67992002
* AT THE END OF THE SEARCH, THE POV FOR THE SINK FOUND IS STORED AT   * 68000002
* IGAVALUE IN THE TREEHDR, AND THE SINK ADDRESS IS RETURNED IN GPR 15.* 68008002
* THE ANTEPENULTIMATE AND PENULTIMATE VERTICES ON THE PATH TO THE SINK* 68016002
* ARE RECORDED IN IGANTPEN AND IGAPENLT RESPECTIVELY.                 * 68024002
* IF NO PARTIAL ORDER EXISTS IN THE RPT THAT IS GREATER THAN OR EQUAL * 68032002
* TO THE REQL, THEN A ZERO IS RETURNED IN GPR 15.                     * 68040002
*********************************************************************** 68048002
SINKPOV  EQU   R2    THE SMALLEST ELIGIBLE PARTIAL ORDER VALUE THUS FAR 68056002
      GODOWNTO &IGASPV                                                  68064002
         USING (&IGANAME+&IGASPV),R15                                   68072002
         USING TREEHDR,R1                                               68080002
POVSRCH  STM   R0,R9,((4*R0)+20-64*((2+R0)/16))(R13)  SAVE ONLY THOSE  *68088002
                         REGISTERS THAT THE PARTIAL ORDER VALUE SEARCH *68096002
                         USES.                                          68104002
         CL    REQL,IGAMAX     SEE IF THERE IS A VALUE LARGE ENOUGH     68112002
*                              TO SATISFY THE REQUEST.                  68120002
         BC    2,POVSNOPE      BRANCH IF THERE IS NOT ONE BIG ENOUGH.   68128002
         L     SINKPOV,IGAMAX  SET SINKPOV TO THE MAXIMUM VALUE.        68136002
         L     P,APT     INITIALIZE THE TWO VERTICES TO THE SOURCE      68144002
         LA    P,O(O,P)  OF THE RADIX PARTITION TREE.                   68152002
         LR    C,P       XX                                             68160002
         TM    PATH,P1000      SEE IF THERE ARE AT LEAST TWO SINKS.     68168002
         BC    1,POVSLOOP      BRANCH TO ENTER THE SEARCH LOOP IF       68176002
*                              THERE ARE AT LEAST TWO SINKS.            68184002
         NI    PATH,P0001      NOW MAKE SURE THERE IS AT LEAST ONE SINK 68192002
         BC    7,ONESIT        TO LOOK AT, BRANCHING IF THE ONE'S IT.   68200002
POVSNOPE SLR   C,C             RETURN A ZERO SINK ADDRESS.              68208002
         BCTR  C,O             SET THE RETURN CODE TO MINUS ONE.        68216002
         SLR   SINKPOV,SINKPOV SET THE VALUE TO ZERO FOR THERE BEING NO 68224002
*                              VALUE LARGE ENOUGH.                      68232002
ONESIT   EQU   *         COME HERE WHEN THE SINGLE SINK WORKS.          68240002
         ST   SINKPOV,IGAVALUE  STORE THE SINK VALUE FOUND.             68248002
         LTR   R15,C     RETURN THE ADDRESS OF THE SINK FOUND, AND SET *68256002
                         THE CONDITION CODE TO CORRESPOND TO THE RETURN*68264002
                         CODE.                                          68272002
         STM   P,C,IGANTPEN    STORE THE TWO VERTICES ON THE PATH.      68280002
         LM    R0,R9,((4*R0)+20-64*((2+R0)/16))(R13)  RESTORE THE      *68288002
                         REGISTERS IT USED.                             68296002
         JMP   15,(LKR)  RETURN.                                        68304002
*********************************************************************** 68312002
POVSTLEF TLEF  P,C,S,CYCLE=YES  TRACE THE EDGE INTO THE LEFT SUBTREE.   68320002
POVSLOOP EQU   *         ENTER THE POV SEARCH LOOP HERE.                68328002
         CL    REQL,VALUE(O,C)  IF THE SEARCH ARGUMENT POV IS LESS THAN 68336002
         BC    12,ENTKNOWN      OR EQUAL TO THE MAXIMAL POV OF THE      68344002
*                               SUBTREE OF KNOWN ORDER, THEN GO TO      68352002
*                               ENTER THE SUBTREE OF KNOWN ORDER.       68360002
ENTUNKWN EQU   *               ENTER SUBTREE OF UNKNOWN ORDER.          68368002
         BQ1   C,ENTRLEFT  GO IF LEFT SUBTREE IS OF UNKNOWN ORDER.      68376002
ENTRIGHT EQU   *         ENTER THE RIGHT SUBTREE.                       68384002
         BT11  C,POVSTREF      GO TRACE THE RIGHT EDGE IF NOT EOP.      68392002
         STM   P,C,IGANTPEN    STORE THE LAST TWO VERTICES ON THE PATH. 68400002
         MVI   PATH,P1101      SIGNAL RIGHT SINK WITH AT LEAST 2 SINKS. 68408002
         ST    SINKPOV,IGAVALUE        STORE THE VALUE FOUND.           68416002
         X     P,RGHT(O,C)  GET THE RIGHT SINK SUCCESSOR OF VERTEX C.   68424002
         LA    P,O(O,P)  CLEAR THE LEFT BYTE OF THE SINK WORD.          68432002
         LTR   R15,P     SET THE RETURN CODE AND SET THE CONDITION CODE*68440002
                         TO CORRESPOND TO THE RETURN CODE.              68448002
         LM    R0,R9,((4*R0)+20-64*((2+R0)/16))(R13)  RESTORE THE      *68456002
                         REGISTERS IT USED.                             68464002
         JMP   15,(LKR)        AND RETURN.                              68472002
*********************************************************************** 68480002
POVSTREF TREF  P,C,S,CYCLE=YES  TRACE THE EDGE INTO THE RIGHT SUBTREE.  68488002
         CL    REQL,VALUE(O,C)  IF THE SEARCH ARGUMENT POV IS GREATER   68496002
         BC    2,ENTUNKWN       THAN THE MAXIMAL POV OF THE SUBTREE OF  68504002
*                               KNOWN ORDER, THEN BRANCH TO ENTER THE   68512002
*                               SUBTREE OF UNKNOWN ORDER.               68520002
ENTKNOWN EQU   *         ENTER THE SUBTREE OF KNOWN ORDER, THE REQL IS  68528002
*                        NOT GREATER THAN THE VALUE AT THE INNER VERTEX 68536002
*                        C. THERE IS A SINK IN THE SUBTREE WITH AN OK   68544002
*                        VALUE.                                         68552002
         L     SINKPOV,VALUE(O,C)  GET THE VALUE AND ENTER THE SUBTREE. 68560002
         BQ1   C,ENTRIGHT  GO IF THE RIGHT SUBTREE IS OF KNOWN ORDER.   68568002
ENTRLEFT EQU   *         ENTER THE LEFT SUBTREE.                        68576002
         BT01  C,POVSTLEF      ENTER LEFT SUBTREE IF IT'S THERE.        68584002
         STM   P,C,IGANTPEN    STORE THE LAST TWO VERTICES ON THE PATH. 68592002
         MVI   PATH,P1100      SIGNAL LEFT SINK WITH AT LEAST 2 SINKS.  68600002
         ST    SINKPOV,IGAVALUE        STORE THE VALUE FOUND.           68608002
         X     P,LEF(O,C)  GET THE LEFT SINK SUCCESSOR OF VERTEX C.     68616002
         LA    P,O(,P)   CLEAR THE LEFT BYTE OF THE SINK WORD.          68624002
         LTR   R15,P     SET THE RETURN CODE AND SET THE CONDITION CODE*68632002
                         TO CORRESPOND TO THE RETURN CODE.              68640002
         LM    R0,R9,((4*R0)+20-64*((2+R0)/16))(R13)  RESTORE ALL THOSE*68648002
                         REGISTERS.                                     68656002
         JMP   15,(LKR)        AND RETURN.                              68664002
         DROP  R1                                                       68672002
         DROP  R15                                                      68680002
         EJECT                                                          68688002
*********************************************************************** 68696002
* THIS IS YET ANOTHER HOLE-FINDING BACKPATH TRACE TO FIND THE PARTIAL * 68704002
* ORDER VALUE ASSOCIATED WITH A SINK, BUT NOT TO MAKE ANY CHANGES TO  * 68712002
* THE VALUES ON THE PATH.                                             * 68720002
*********************************************************************** 68728002
      GODOWNTO &IGAPVG                                                  68736002
         USING (&IGANAME+&IGAPVG),R15                                   68744002
         USING TREEHDR,R1                                               68752002
GETPOV   EQU   *  COME HERE TO GET THE SINK'S POV.                      68760002
         STM   R2,R9,((X'04'*R2)+20-64*((X'02'+R2)/X'10'))(R13)  SAVE  *68768002
               THE REGISTERS THIS ROUTINE USES.                         68776002
         LM    P,C,AP          LOAD P AND C FOR THE BACKPATH TRACE.     68784002
         LA    P,O(O,P)        CLEAR THE HIGH ORDER BYTE.               68792002
         LA    C,O(O,C)        CLEAR THE HIGH ORDER BYTE.               68800002
         TM    PATH,P1000      BRANCH IF THERE ARE LESS THAN TWO        68808002
         JMP   8,LOADMAX       SINKS IN THE RPT.                        68816002
         LA    R3,RL           USED TO TRACE ONE EDGE IN THE BACKPATH.  68824002
         L     R8,QBITMASK     USED TO COMPARE THE RL BIT TO THE        68832002
*                                 Q BIT.                                68840002
         L     R0,APT          FIRST LET'S SEE IF THE SINK'S POV IS     68848002
         SLL   R0,((Q/4)+(Q/8))  ALREADY AT IT'S PREDECESSOR C.         68856002
         X     R0,FLAGS(O,C)   COMPARE THE Q BIT AT C TO THE EVEN/ODD   68864002
         NR    R0,R8           BIT IN THE PATH VECTOR BYTE.             68872002
         JMP   7,UPTOHOLE      JUMP IF IT'S NOT AT C.                   68880002
* THE POV IS RIGHT AT THE SINK'S PREDECESSOR C. *                       68888002
GOTHOLE  EQU   *   COME WHEN IT GOT THE HOLE.                           68896002
         L     R0,VALUE(O,C)   LOAD THE SINK'S PARTIAL ORDER VALUE.     68904002
         LM    R2,R9,((X'04'*R2)+20-64*((X'02'+R2)/X'10'))(R13) RESTORE*68912002
               THE REGISTERS THIS ROUTINE USES.                         68920002
         JMP   15,(LKR)        RETURN.                                  68928002
*********************************************************************** 68936002
* THE HOLE IS FARTHER UP THE BACKPATH, TRACE THE BACKPATH UNTIL IT IS * 68944002
* FOUND.                                                              * 68952002
*********************************************************************** 68960002
HOLEUP   EQU   *  COME HERE TO KEEP LOOKING FOR THE HOLE.               68968002
         L     R0,FLAGS(O,C)   GET THE RL BIT AT C.                     68976002
         ALR   R0,R0     MAKE THE RL BIT FROM C LINE UP WITH THE Q-BIT  68984002
*                        AT VERTEX P.                                   68992002
         X     R0,FLAGS(O,P)   COMPARE THE RL BIT FROM C TO THE Q-BIT   69000002
         NR    R0,R8           AT P BY EXCLUSIVE-ORING.                 69008002
         LR    S,C       CYCLE PART OF THE REGISTERS FOR THE BACKPATH   69016002
         LR    C,P       TRACE, AS IT MIGHT NOT HAVE TO TRACE FARTHER.  69024002
         JMP   8,GOTHOLE       JUMP ON THE RL(C)=Q(P).                  69032002
         IC    P,FLAGS(O,S)    GET THE RL-BIT FROM THE CURRENT VERTEX   69040002
         NR    P,R3            TO USE AS AN INDEX FOR SELECTING THE     69048002
         L     P,O(P,C)        LEFT OR THE RIGHT EDGE FIELD AT THE      69056002
         XR    P,S             PREDECESSOR OF THE CURRENT VERTEX FOR    69064002
         LA    P,O(O,P)        TRACING ONE EDGE IN THE BACKPATH.        69072002
UPTOHOLE EQU   *  ENTRY POINT FOR THE SECOND HOLE-FINDING BACKPATH      69080002
*                 TRACE LOOP.                                           69088002
         CLR   P,C             SEE IF THE SOURCE HAS BEEN REACHED.      69096002
         JMP   7,HOLEUP        CONTINUE THE BACKPATH TRACE IF NOT.      69104002
*---------------------------------------------------------------------* 69112002
LOADMAX  EQU   *         COME HERE TO GET THE MAXIMUM VALUE.            69120002
         L     R0,IGAMAX       THE POV WAS OUTSIDE THE TREE.            69128002
         LM    R2,R9,((X'04'*R2)+20-64*((X'02'+R2)/X'10'))(R13) RESTORE*69136002
               THE REGISTERS THIS ROUTINE USES.                         69144002
         JMP   15,(LKR)        RETURN.                                  69152002
         DROP  R1                                                       69160002
         DROP  R15                                                      69168002
         EJECT                                                          69176002
*********************************************************************** 69184002
*  P A R T I A L   O R D E R   A D J U S T M E N T   R O U T I N E    * 69192002
*  F O R   P A R T I A L   O R D E R   V A L U E S   I N              * 69200002
*  T Y P E   8   R A D I X   P A R T I T I O N   T R E E S            * 69208002
*---------------------------------------------------------------------* 69216002
*                   F U N C T I O N:                                  * 69224002
*                   - - - - - - - -                                   * 69232002
*  GIVEN A NEW PARTIAL ORDER VALUE IN REGISTER REQL, AND THAT P AND C * 69240002
* ARE THE PREDESSORS OF THE SINK IN QUESTION, REPLACE THE PARTIAL     * 69248002
* ORDER VALUE CURRENTLY ASSOCIATED WITH THE SINK WITH THE VALUE IN    * 69256002
* REQL.                                                               * 69264002
*********************************************************************** 69272002
      GODOWNTO &IGAPVAJ                                                 69280002
         USING (&IGANAME+&IGAPVAJ),R15                                  69288002
V        EQU  R2                                                        69296002
H        EQU   R9                                                       69304002
MKR      EQU   R3  REGISTER TO HOLD THE MASK X'08000000' WHEN COMPARING 69312002
*                  RL BITS TO Q-BITS.                                   69320002
IGADJPOV EQU   *                                                        69328002
         USING TREEHDR,R1                                               69336002
INCSMV   EQU   *  INCORPORATE SEMILATTICE VALUE.                        69352002
     STM R0,R9,((R0*X'04')+X'14'-X'40'*((2+R0)/X'10'))(R13)  SAVE GPRS. 69360002
         LR    V,REQL          GET THE NEW VALUE IN A SAFER PLACE.      69368002
         LM    P,C,AP  LOAD P AND C FOR THE BACKPATH TRACE.             69376002
         LA    P,O(O,P)  CLEAR THE HIGH ORDER BYTE.                     69384002
         LA    C,O(O,C)  CLEAR THE HIGH ORDER BYTE.                     69392002
         TM    PATH,P1000      SEE IF THERE IS ONLY ONE SINK.           69400002
         JMP   8,INCSMVST      BRANCH IF THERE IS.                      69408002
         LA    R3,RL           USE THIS FOR TRACING THE BACKPATH.       69416002
         L     R8,=XL4'08000000'  USE THIS TO SEE IF RL(C)=Q(P).        69424002
*********************************************************************** 69432002
* SEE IF THE HOLE IS ALREADY AT C, OR IF THE HOLE IS FARTHER UP THE   * 69440002
* BACKPATH. IF THE HOLE IS AT C, THEN THE PATIAL ORDER MAINTENANCE    * 69448002
* BACKPATH TRACE IS ENTERED RIGHT AWAY, BUT IF THE HOLE IS NOT AT C   * 69456002
* THEN THE HOLE MUST BE FOUND BY THE HOLE-FINDING BACKPATH TRACE.     * 69464002
* THE HOLE-FINDING BACKPATH TRACE THEN ENTERS THE PARTIAL ORDER       * 69472002
* MAINTENANCE BACKPATH TRACE TO COMPLETE THE OPERATION.               * 69480002
*********************************************************************** 69488002
         L     R0,APT    LOAD THE PATH BYTE IN THE WORKING REGISTER     69496002
         SLL   R0,((Q/4)+(Q/8))  TO COMPARE IT TO THE Q-BIT AT C.       69504002
         X     R0,FLAGS(O,C)   IF THE TWO ARE EQUAL, THEN THE HOLE IS   69512002
         NR    R0,R8           AT C, AND THE PARTIAL ORDER MAINTENANCE  69520002
         JMP   7,FINDHOLE      BACKPATH TRACE IS ENTERED.               69528002
         LR    H,C         SET THE HOLE AT THE VERTEX C.                69536002
         CLR   P,C         SEE IF IT IS ALREADY AT THE SOURCE.          69544002
         JMP   8,ATTHETOP  JUMP IF IT IS AT THE SOURCE.                 69552002
         CL    V,VALUE(O,P)  SEE IF THE VALUE IS BIGGER THAN P'S VALUE. 69560002
         JMP   2,BIGGER        JUMP IF SO.                              69568002
HOLEIN1  ST    V,VALUE(O,H)  FILL THE HOLE WITH THIS TTASTY TIDBIT.     69576002
      LM R0,R9,((R0*X'04')+X'14'-X'40'*((2+R0)/X'10'))(R13)  RESTORE.   69584002
         JMP   15,(LKR)        AND RETURN.                              69592002
HOLECHK  CL    V,VALUE(O,P)  SEE IF THE VALUE IN V IS BIGGER THAN       69600002
         JMP   12,HOLEIN1  THE PREDECESSOR'S EDGE; GO IF NOT.           69608002
BIGGER   L     R0,FLAGS(O,C)  IT WAS BIGGER THAN THE PREDECESSOR'S,     69616002
*                             NOW SEE IF THE PREDECESSOR'S VALUE CAME   69624002
*                             FROM THE SAME SUBTREE THAT C IS IN BY     69632002
*                             COMPARING THE RL BIT AT C WITH THE Q-BIT  69640002
*                             AT P.                                     69648002
       BQEQRL  R0,P,MASK=(R8),JUMP=^CIRCLE                              69656002
         XI    FLAGS(H),IGAQBIT  FLIP THE SUBTREE SELECTOR BIT TO THE   69664002
*                                OTHER SUBTREE.                         69672002
         MVC   VALUE(4,H),VALUE(P)  FILL THE HOLE WITH THE              69680002
*                                   PRFEDECESSOR'S VALUE.               69688002
ROUNDTHE LR    H,P       THE HOLE FLOWS UP THE BACKPATH.                69696002
CIRCLE   TRBP  P,C,S,RL=(R3),CLEAR=YES,TOP=^HOLECHK                     69704002
ATTHETOP CL    V,IGAMAX    SEE IF IT'S BIGGER THAN THE BIGGEST.         69712002
         BC    12,HOLEIN1  BRANCH IF IT ISN'T TO FILL THE HOLE.         69720002
         XI    FLAGS(H),IGAQBIT  MAKE THE HOLEY BIT SELECT THE OTHER    69728002
*                                SUBTREE.                               69736002
         MVC   VALUE(4,H),IGAMAX  THE NEXT-TO-BIGGEST FILLS THE HOLE.   69744002
INCSMVST ST    V,IGAMAX           PUT THE NEW ONE IN THE BIGGEST SPOT.  69752002
      LM R0,R9,((R0*X'04')+X'14'-X'40'*((2+R0)/X'10'))(R13)  RESTORE.   69760002
         JMP   15,(LKR)  RETURN.                                        69768002
*********************************************************************** 69776002
* HOLE-FINDING BACKPATH TRACE TO INCORPORATE THE PARTIAL ORDER VALUE  * 69784002
* IN THE PATH FROM THE HOLE TO THE SINK.                              * 69792002
*********************************************************************** 69800002
HOLELOOP EQU   *         COME HERE TO CLOSE THE HOLE LOOP.              69808002
         L     R0,FLAGS(O,C)   GET THE RL BIT AT C.                     69816002
         BQEQRL R0,P,MASK=(R8),JUMP=ROUNDTHE                            69824002
         TRBP  P,C,S,RL=(R3),CLEAR=YES                                  69832002
FINDHOLE EQU   *         ENTER THE HOLE LOOP HERE.                      69840002
         L     H,VALUE(O,C)    GET TEH VALUE AT C.                      69848002
         CLR   V,H             SEE IF THE VALUE V IS BIGGER.            69856002
         BC    10,HIGHHOLE     BRANCH IF THE V IS BIGGER.               69864002
         ST    V,VALUE(O,C)    THE V IS SMALLER, EXCHANGE THE TWO       69872002
         LR    V,H             VALUES AND SWITCH THE DIRECTION OF THE   69880002
         XI    FLAGS(C),Q      SUBTREE OF KNOWN ORDER SELECTION BIT.    69888002
*---------------------------------------------------------------------* 69896002
HIGHHOLE EQU   *         THE VALUE V IS BIGGER IF IT BRANCHES HERE.     69904002
         CLR   P,C             CHECK TO SEE IF TEH SOURCE IS REACHED.   69912002
         BC    7,HOLELOOP      BRANCH IF THE SOURCE NOT REACHED.        69920002
         ST    V,IGAMAX  STORE THE MAXIMUM VALUE.                       69928002
      LM R0,R9,((R0*X'04')+X'14'-X'40'*((2+R0)/X'10'))(R13)  RESTORE.   69936002
         JMP   15,(LKR)  RETURN.                                        69944002
*********************************************************************** 69952002
         DROP  R15                                                      69960002
         DROP  R1                                                       69968002
*********************************************************************** 69976002
         AGO   .SKIPDPV        DO NOT INCLUDE DELETE POV FOR NOW.       69984002
*********************************************************************** 69992002
* ROUTINE TO REMOVE THE PARTIAL ORDER VALUE ASSOCIATED WITH A SINK    * 70000002
* FROM THE VALUES STORE AT THE INNER VERTICES OF THE RADIX PARTITION  * 70008002
* TREE. THIS ROUTINE IS EXECUTED JUST PRIOR TO DELETING THE SINK FROM * 70016002
* THE RPT. THIS ROUTINE IS THE EXACT INVERSE OPERATION TO THE ROUTINE * 70024002
* THAT INCORPORATES THE PARTIAL ORDER VALUE FOR A NEW SINK IN THE RPT.* 70032002
*********************************************************************** 70040002
         USING TREEHDR,R1                                               70048002
         USING &PROGRAM,R15                                             70056002
IGADPOV  EQU   *                                                        70064002
         STM   R0,R9,GPR0  SAVE THE REGISTERS.                          70072002
         LA    V,O           PUT ZERO IN IGAMAX WHEN THERE IS ONLY ONE  70080002
*                            SINK NOW AND THERE AREN'T GOING TO BE ANY. 70088002
         LM    P,C,AP        LOAD THE ANTEPENULTIMATE AND PENULTIMATE   70096002
*                            VERTICES ON THE PATH TO THE SINK.          70104002
         TM    PATH,P1000    SEE IF THERE IS ONLY ONE SINK,             70112002
         BC    8,FLIPTOP     AND GO TRADE IGAMAX FOR V IF THERE IS.     70120002
         TM    PATH,P0001    SEE IF THE SINK IS A RIGHT SUCCESSOR,      70128002
         BC    1,ITSRIGHT    AND BRANCH IF IT IS.                       70136002
         TM    FLAGS(C),Q    SEE IF THE PARTIAL ORDER VALUE IS ALREADY  70144002
         BC    8,ALLDONE     STORED AT THE PREDECESSOR OF THE SINK.     70152002
*                            IF IT IS, IT IS ONLY NECESSARY TO COPY     70160002
*                            THE POV FROM VERTEX C TO IGAVALUE.         70168002
NOTYET   EQU   *             IT HASN'T YET COME TO THE SINK'S POV.      70176002
         LA    P,O(O,P)      CLEAR THE HIGH ORDER BYTES IN THE TWO      70184002
         LA    C,O(O,C)      REGISTERS FOR THE TOP CHECK.               70192002
         NI    FLAGS(C),255-Q  THIS CAUSES THIS ROUTINE TO BE AN EXACT  70200002
*                              INVERSE TO THE OTHER ONE.                70208002
         L     V,VALUE(O,C)  GET THE VALUE THAT CAME FROM THE SUBTREE   70216002
*                            THAT IS PAIRED WITH THE SINK.              70224002
         LA    RRL,RL        USE THIS FOR A MASK TO MAKE AN INDEX TO    70232002
*                            GET THE CORRECT EDGE FIELDS WITH.          70240002
         L     MKR,=XL4'08000000'  GET THE MASK TO USE FOR COMPARING    70248002
*                                  THE RL BIT WITH THE Q BIT.           70256002
         CLR   P,C           SEE IF IT IS ALREADY AT THE SOURCE; IF IT  70264002
         BC    8,FLIPTOP     IT THE ONLY THING IT HAS TO DO IS TO       70272002
*                            EXCHANGE IGAMAX WITH V.                    70280002
*********************************************************************** 70288002
* IT'S NOT AT THE SOURCE ALREADY, CHECK TO SEE IF THE RL BIT AT C IS  * 70296002
* EQUAL TO THE Q BIT AT P. IF THEY ARE EQUAL, THEN THE POV AT P IS THE* 70304002
* ONE THAT IS ASSOCIATED WITH THE SINK, AND IT CAN STOP NOW.          * 70312002
*---------------------------------------------------------------------* 70320002
GRABCSRL L     TMP,FLAGS(O,C)  GET THE FLAG BYTE WITH C'S RL BIT IN IT. 70328002
       BQEQRL  TMP,P,MASK=(MKR),JUMP=STOPPOV                            70336002
*********************************************************************** 70344002
* THE PARTIAL ORDER VALUE AT P DIDN'T COME FROM THE SUBTREE WHOSE     * 70352002
* SOURCE IS C, HENCE THE POV AT P ISN'T THE ONE FOR THE SINK.         * 70360002
* THEREFORE, COMPARE V WITH THE POV AT P, AND IF V<POV(P) EXCHANGE V  * 70368002
* WITH THE POV AT P AND COMPLEMENT THE Q BIT, THEREBY INDICATING THAT * 70376002
* POV LEFT AT P CAME FROM C'S SUBTREE.                                * 70384002
*********************************************************************** 70392002
         CL    V,VALUE(O,P)    COMPARE V TO P'S POV.                    70400002
         BC    10,DONTFLIP   IF V IS GREATER OR EQUAL THE EXCHANGE      70408002
*                            DOESN'T HAVE TO BE DONE.                   70416002
*********************************************************************** 70424002
*              V<POV(P), EXCHANGE THE TWO AND FLIP THE Q BIT.         * 70432002
*********************************************************************** 70440002
         L     TMP,VALUE(O,P)  GET P'S POV.                             70448002
         ST    V,VALUE(O,P)    P'S POV GETS V.                          70456002
         LR    V,TMP           V GETS P'S OLD POV.                      70464002
         XI    FLAGS(P),Q      FLIP P'S SUBTREE OF KNOWN ORDER BIT.     70472002
*********************************************************************** 70480002
* TRACE THE BACKPATH ONE EDGE AND GO BACK TO GET C'S RL BIT AGAIN IF  * 70488002
* IT DOESN'T GET TO THE TOP OF THE BACKPATH.                          * 70496002
*********************************************************************** 70504002
DONTFLIP TRBP  P,C,S,RL=(RRL),TOP=^GRABCSRL                             70512002
*********************************************************************** 70520002
* IT CAME RIGHT OUT OF THE SOURCE, THE SINK'S POV MUST BE IN IGAMAX.  * 70528002
* SO IGAMAX HAS TO BE PUT INTO IGAVALUE, AND V GETS STORED IN IGAMAX. * 70536002
*********************************************************************** 70544002
FLIPTOP  MVC   IGAVALUE,IGAMAX  MOVE THE PREVIOUS MAXIMUM VALUE OUT.    70552002
         ST    V,IGAMAX         STORE THE NEW MAXIMUM VALUE THERE.      70560002
         LM    R0,R9,GPR0  RESTORE THE REGISTERS                        70568002
         BCR   15,LKR      AND RETURN.                                  70576002
*********************************************************************** 70584002
* THE SINK'S POV IS AT VERTEX P. REPLACE THE VALUE AT P WITH V, AND   * 70592002
* PUT THE SINK'S VALUE AT IGAVALUE.                                   * 70600002
*********************************************************************** 70608002
STOPPOV  MVC   IGAVALUE,VALUE(P)  MOVE THE SINK'S POV FROM P.           70616002
         ST    V,VALUE(O,P)  STORE THE NEW MAXIMUM FOR P'S SUBTREE.     70624002
         LM    R0,R9,GPR0  RESTORE THE REGISTERS.                       70632002
         BCR   15,LKR      RETURN.                                      70640002
*********************************************************************** 70648002
ITSRIGHT TM    FLAGS(C),Q      SEE IF THE SINK'S POV IS RIGHT THERE AT  70656002
         BC    8,NOTYET    IT'S PREDECESSOR.                            70664002
ALLDONE  MVC   IGAVALUE,VALUE(C)  MOVE THE SINK'S VALUE OUT.            70672002
         LM    R0,R9,GPR0  RESTORE THE REGISTERS                        70680002
         BCR   15,LKR      AND RETURN.                                  70688002
         DROP  R1                                                       70696002
.SKIPDPV ANOP                                                           70704002
         LTORG *                                                        70712002
      GODOWNTO &IGADSP8                                                 70720002
         AIF   (NOT &SNAP).SNAPSKP  SEE IF THE DISPLAY ROUTINE SHOULD  *70728002
                         BE INCLUDED THIS TIME.                         70736002
DSPENTRY BALR  R15,O     ESTABLISH ADDRESSABILITY.                      70744002
         USING *,R15                                                    70752002
         JMP   15,DSPRPT                                                70760002
         DROP  R15                                                      70768002
.SNAPSKP ANOP                                                           70776002
       GODOWNTO &IGASTRE                                                70784002
GOSTREE  NTR   BR=R10,SAVE=(LKR,R12),LV=0                               70792002
         B     SETUP8                                                   70800002
         DROP  R10                                                      70808002
         EJECT                                                          70816002
      GODOWNTO &IGACON  SKIP DOWN TO THE CONSTANT SECTION.              70824002
INSBIT   EQU   *          THIS IS THE BEGINNING OF A 129 BYTE TABLE     70832002
*                        THAT IS USED FOR COMPUTING THE INDEX OF THE    70840002
*                        BIT OF INEQUALITY BETWEEN TWO OPERANDS.        70848002
*                        THIS TABLE IS COMPOSED OF 8 BYTES, LOCATED AT  70856002
*                        POSITIONS 0, 1, 4, 8, 16, 32, 64, AND 128,     70864002
*                        AND CONTAINS THE CONSTANT X'0007060504030201'  70872002
*                        IN THESE BYTE POSITIONS.                       70880002
*                        THIS TABLE IS USED BY FIRST CONVERTING THE     70888002
*                        BYTES OF INEQUALITY INTO A MASK THAT           70896002
*                        SELECTS THE FIRST BIT OF INEQUALITY IN THE     70904002
*                        IN THE TWO BYTES, AND THEN INDEXING AN IC      70912002
*                        INSTRUCTION USING INSBIT.                      70920002
         DC    XL3'000706'     THIS IS THE FIRST 3 BYTES OF INSBIT.     70928002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  70936002
         DC    XL1'05'         THIS IS POSITION 04 OF INSBIT.           70944002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  70952002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  70960002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  70968002
         DC    XL1'04'         POSITION 08 IN INSBIT.                   70976002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  70984002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  70992002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  71000002
*---------------------------------------------------------------------* 71008002
X800     DC    XL4'80000000'    AN AGORONOMIC CONSTANT.                 71016002
RSTAB1   DC    AL1(P0011)      THIS IS USED TO SET THE PATH CODE IN     71024002
*                              THE DELETE OPERATION, AND IS ALSO THE    71032002
*                              BYTE IN POSITION X'10' OF THE TABLE      71040002
*                              INSBIT.                                  71048002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  71056002
TBTAB1   EQU   *-2       THIS IS AN 8 BYTE TABLE, THAT CONTAINS TWO     71064002
         DC    AL2(T1)   FULL WORDS, WHERE THE FIRST TWO BYTES OF EACH  71072002
*                        WORD ARE NOT USED (I. E. CAN BE ANYTHING),     71080002
*                        AND THE SECOND HALFWORD OF EACH FULL WORD      71088002
*                        CONTAINS THE TWO BYTE HALFWORD VALUES FOR      71096002
*                        T1 AND T0 RESPECTIVELY.                        71104002
*                        THESE ARE USED TO SET THE APPROPRIATE T-BIT TO 71112002
*                        ONE IN THE NEW INNER VERTEX FOR TOP AND MOP    71120002
*                        INSERTS.                                       71128002
         DC    AL1(P0101)      THIS IS PART OF RSTAB1.                  71136002
         DC    XL1'FF'         THIS IS AN UNUSED BYTE.                  71144002
TBTAB0   EQU   *-2       THIS CONTINUES THE TABLE TBTAB1, AND STARTS    71152002
*                        AN 8 BYTE TABLE WHERE THE TWO LOW ORDER BYTES  71160002
*                        IN THE TWO FULL ARE T0 AND T1 RESPECTIVELY.    71168002
*---------------------------------------------------------------------* 71176002
         DC    AL2(T0)   THIS IS THE LAST ENTRY IN TBTAB1 AND THE       71184002
*                        FIRST LOW ORDER BYTE IN THE FIRST WORD OF      71192002
*                        TBTAB0.                                        71200002
NEWPATH  DC    AL1(P1100)      THIS BYTE AND THE BYTE AT NEWPATH+4 ARE  71208002
*                              USED TO SET THE PATH BYTE CODE AFTER     71216002
*                              AN INSERTION OPERATION.                  71224002
RSTAB0   DC    AL1(P1000)      THIS BYTE AND THE BYTE AT RSTAB+4 ARE    71232002
*                              USED TO SET THE PATH CODE IN DEL8.       71240002
         DC    XL1'FF'   THIS IS AN UNUSED BYTE.                        71248002
         DC    AL1(T1)         THIS COMPLETES THE TBTAB0 TABLE.         71256002
         DC    AL1(P1101)     THIS IS THE BYTE ASSOCIATED WITH NEWPATH. 71264002
         DC    AL1(P1011)      THIS IS THE BYTE AT RSTAB0+4.            71272002
INSFFEQ  EQU   *-TWO     THIS IS USED IN THE INSERT ROUTINE WHEN THE    71280002
   DC  AL2(X'FFE0'+Q)    NEW KEY IS EQUAL TO A KEY ALREADY IN THE RPT   71288002
*                        TO SET THE BIT INDEX FOR THE NEW INNER VERTEX  71296002
*                        TO ALL ONES, AND TO SET THE Q-BIT TO 1.        71304002
*---------------------------------------------------------------------* 71312002
*********************************************************************** 71320002
SCANRTAB EQU   *                                                        71328002
         DC    AL1(NULLPATH-SCANRORG)  P0000.                           71336002
         DC    AL1(PASTRGHT-SCANRORG)  P0001.                           71344002
         DC    AL1(NULLPATH-SCANRORG)  P0010.                           71352002
         DC    AL1(PLEFOFIT-SCANRORG)  P0011.                           71360002
         DC    AL1(NULLPATH-SCANRORG)  P0100.                           71368002
         DC    AL1(PASTRGHT-SCANRORG)  P0101.                           71376002
         DC    AL1(NULLPATH-SCANRORG)  P0110.                           71384002
         DC    AL1(PLEFOFIT-SCANRORG)  P0111.                           71392002
         DC    AL1(SCRBT01-SCANRORG)   P1000.                           71400002
         DC    AL1(SCRTRYT1-SCANRORG)  P1001.                           71408002
         DC    AL1(SCRTRYT1-SCANRORG)  P1010.                           71416002
         DC    AL1(SCRBIV1-SCANRORG)   P1011.                           71424002
         DC    AL1(SCRTRYT1-SCANRORG)  P1100.                           71432002
         DC    AL1(SCRBIV1-SCANRORG)   P1101.                           71440002
         DC    AL1(SCANRGO-SCANRORG)   P1110.                           71448002
         DC    AL1(SCANRGO-SCANRORG)   P1111.                           71456002
*********************************************************************** 71464002
SCANLTAB EQU   *                                                        71472002
         DC    AL1(NULLPATH-SCANLORG)  P0000.                           71480002
         DC    AL1(PASTLEFT-SCANLORG)  P0001.                           71488002
         DC    AL1(NULLPATH-SCANLORG)  P0010.                           71496002
         DC    AL1(PASTLEFT-SCANLORG)  P0011. GRINNIG VERTEX ON LEFT.   71504002
         DC    AL1(NULLPATH-SCANLORG)  P0100.                           71512002
         DC    AL1(PLEFOFIT-SCANLORG)  P0101.                           71520002
         DC    AL1(NULLPATH-SCANLORG)  P0110.                           71528002
         DC    AL1(PLEFOFIT-SCANLORG)  P0111.                           71536002
         DC    AL1(SCLBIV1-SCANLORG)   P1000.                           71544002
         DC    AL1(SCLBT00-SCANLORG)   P1001.                           71552002
         DC    AL1(SCLBT00-SCANLORG)   P1010.                           71560002
         DC    AL1(SCLBT11-SCANLORG)   P1101.                           71568002
         DC    AL1(SCLBIV1-SCANLORG)   P1100.                           71576002
         DC    AL1(SCLBT00-SCANLORG)   P1101.                           71584002
         DC    AL1(SCANLGO-SCANLORG)   P1110.                           71592002
         DC    AL1(SCANLGO-SCANLORG)   P1111.                           71600002
P0001ZZZ DC    AL1(P0001,0,0,0)  USED AS A MASK FOR SELECTING THE       71608002
*********************************************************************** 71616002
*                                                                     * 71624002
*              LOW ORDER BIT IN THE PATH CODE BYTE.                     71632002
*---------------------------------------------------------------------* 71640002
RLTAB0   DC    AL1(RL,0,0,0,0,0,0,0,RL,0,0,0)  THIS TABLE IS USED TO  * 71648002
*              SET THE RL BIT CORRECTLY IN THE DISPLACED INNER VERTEX * 71656002
*              IN AN INSERTION OPERATION.                             * 71664002
*              THE FIRST BYTE OF RLTAB0 IS ALSO THE BYTE IN POSITION  * 71672002
*              X'40' OF THE TABLE INSBIT.                             * 71680002
*---------------------------------------------------------------------* 71688002
MASKS    DC    XL8'8040201008040201'  THIS IS A TABLE USED TO SELECT  * 71696002
*        THE BIT IN THE SEARCH ARGUMENT BYTE WHILE DOING A SEARCH.    * 71704002
*---------------------------------------------------------------------* 71712002
SETTZERO DC    AL1(X'100'-T0,0,0,0,X'100'-T1,0,0,0)  TABLE TO USE     * 71720002
*              WHEN SETTING T0 OR T1 TO ZERO IN THE DEL8 ROUTINE.     * 71728002
QBITMASK DC    AL1(Q,0,0,0)    THIS IS USED TO COMPARE THE Q-BIT TO     71736002
*              THE RL-BIT IN THE BACKPATH TRACE THAT ADJUSTS PARTIAL    71744002
*              ORDER VALUES.                                            71752002
X08Z     EQU   QBITMASK  X08000000                                      71760002
ADDRESS  DC    AL4(&PROGRAM)   ADDRESS OF THE PROGRAM FOR RESTORING   * 71768002
*                              THE BASE REGISTER.                     * 71776002
X10      DC    XL4'00000010'   JUST SIXTEEN IN IT'S OWN BASE.           71784002
TWOTO8   DC    XL4'00000100'   THE NUMBER TWO HUNDRED FIFTY SIX.        71792002
X0100    EQU   TWOTO8                                                   71800002
UNUSED1  DC    CL16'MORE UNUSED BITS'                                   71808002
IGATCB   EQU   UNUSED1                                                  71816002
*---------------------------------------------------------------------* 71824002
INS5BITS DC    XL16'00383028202020202020202020202020'                   71832002
*        THIS IS USED IN THE INS5 ROUTINE TO COMPUTE THE SHIFTED BIT  * 71840002
*        INDEX FOR THE NEW INNER VERTEX.                              * 71848002
*        THE FIRST BYTE OF THIS TABLE IS ALSO THE BYTE IN POSITION    * 71856002
*        X'80' OF THE TABLE INSBIT.                                   * 71864002
*---------------------------------------------------------------------* 71872002
      GODOWNTO &IGAGKW                                                  71880002
         DC    16XL1'FF'  THE ROUTINE TO GET A KEY WORK AREA GOES HERE. 71888002
         AIF   (&BIGMASK).BIGMASK  IF ON USE THE 256 BYTE MASK TABLE.   71896002
MSKTBL   EQU   MASKS     USE THE LITTLE MASK TABLE, NOT ENOUGH FOR BIG. 71904002
         AGO   .MASKEND   SKIP AROUND THE BIG MASK TABLE.               71912002
.BIGMASK ANOP                                                           71920002
MSKTBL   DC    32XL1'80'                                                71928002
         DC    32XL1'40'                                                71936002
         DC    32XL1'20'                                                71944002
         DC    32XL1'10'                                                71952002
         DC    32XL1'08'                                                71960002
         DC    32XL1'04'                                                71968002
         DC    32XL1'02'                                                71976002
         DC    32XL1'01'                                                71984002
.MASKEND ANOP                                                           71992002
         EJECT                                                          72000002
*********************************************************************** 72008002
* THIS IS THE CONTINUATION OF THE INSERT ROUTINE FOR TYPE 8 RADIX     * 72016002
* PARTITION TREES.                                                    * 72024002
*********************************************************************** 72032002
JUMPOVER EQU   *   COME HERE FOR INSERT WHEN THERE ARE AT LEAST TWO     72040002
*                  SINKS AND THERE IS A SPACE FOR THE NEW INNER VERTEX. 72048002
         USING INS8,R15                                                 72056002
         USING IGARPTH,PLA                                              72064002
         USING SAVEDSEK,R13                                             72072002
         USING FIXEDHDR,HDB                                             72080002
         MVC   HEADFREE,O(NEW)  DECAPITATE THE CHAIN.                   72088002
         DROP  HDB                                                      72096002
         LM    P,C,AP  GET THE FIRST TWO VERTICES ON THE PATH.          72104002
INSONEIN EQU   *         ENTRY POINT IN THE SEQUENCE FOR INSERTS INTO   72112002
*                        A TREE WITH JUST 1 SINK BEFORE THE INSERTION.  72120002
         MVI   IGAIARG,X'00'   MAKE SURE THE LEFT BYTE OF THE INSERT    72128002
*                              ADDRESS IS ZERO.                         72136002
         LA    FOR,FOURCON     PUT A CONSTANT 4 IN FOR FOR USE AS A     72144002
*                              MASK IN SELECTING RIGHT/LEFT FLAGS.      72152002
         LR    RRL,FOR         SET RRL TO FOUR IF THE SINK FOUND BY     72160002
         LA    P,0(0,P)  CLEAR THE HIGH ORDER BYTES.                    72168002
         LA    C,0(0,C)                                                 72176002
         TM    PATH,P0001      THE SEARCH IS A RIGHT SUCCESSOR, OR SET  72184002
         JMP   1,ALLRIGHT      RRL TO A ZERO IF THE SINK FOUND BY THE   72192002
         SLR   RRL,RRL         SEARCH IS A LEFT SUCCESSOR.              72200002
ALLRIGHT EQU   *         ---------------------------------------------- 72208002
* REGISTERS (FOR,NEW,P,C,RRL,PLA,R15) ARE PROPAGATED FORWARD.           72216002
         L     FAR,IGAFARG     ADDRESS OF KEY FOUND BY THE SEARCH.      72224002
         LH    SAR,IGAKEYI  GET THE INDEX OF THE FIRST BYTE OF THE KEY *72232002
               IN THE RECORD.                                           72240002
         ALR   FAR,SAR   COMPUTE THE ADDRESS OF THE FIRST BYTE OF THE  *72248002
               KEY FOUND BY THE SEARCH SUBROUTINE.                      72256002
         AL    SAR,((4*R15)+20-64*((2+R15)/16))(,R13)                  *72264002
               COMPUTE THE ADDRESS OF THE KEY TO BE INSERTED.           72272002
         LH    LNG,IGAKEYL     THE LENGTH OF THE KEYS.                  72280002
         FBI   I=I,A=SAR,B=FAR,LV=(LNG),WRK=TMP0   FIND BIT INDEX.      72288002
         LR    BIT,FOR   SET BIT TO A FOUR IF THE NEW KEY IS GREATER    72296002
         LR    TMP8,FOR  ZERO OUT THE LEFT 3 BYTES FOR THE IC.          72304002
         JMP   2,GETBIT  THAN THE FOUND KEY, OR SET IT TO ZERO IF THE   72312002
         BC    8,INSEQUAL  NEW KEY IS LESS THAN THE FOUND KEY.          72320002
         SLR   BIT,BIT   SET IT TO ZERO, THE NEW SINK IS A LEFT SINK.   72328002
GETBIT   EQU   *         (I,BIT,FOR,RRL,NEW,P,C,PLA,R15) FORWARD.       72336002
         BIT   I=I,A=SAR,B=FAR,J=LNG,N=TMP8                             72344002
         SLL   I,FIVE    SHIFT IT OVER TO MAKE ROOM FOR THE Q AND NE   *72352002
                         BITS.                                          72360002
         ALR   I,BIT     SET THE Q-BIT TO A ONE IF THE NEW SINK IS A    72368002
         LA    I,NE(I,BIT)     RIGHT SUCCESSOR, OR TO ZERO IF THE NEW   72376002
*                              SINK IS A LEFT SUCCESSOR, AND SET THE NE 72384002
*                              BIT ON TO SIGNIFY THE NEW INNER VERTEX   72392002
*                              IS THE SOURCE OF A SUBTREE WITH AT       72400002
*                              LEAST TWO UNEQUAL KEYS IN IT.            72408002
         SLL   I,SIXTEEN  ALIGN THE BIT INDEX AT BIT 0 IN THE GPR SO    72416002
*                        THAT IT CAN BE MADE A SIGNED HALFWORD BY       72424002
*                        SHIFTING IT BACK LATER.                        72432002
         LH    TMP1,BYTEI(O,C)  PUT THE BYTE INDEX IN BITS 0-23.        72440002
         SRA   I,16      CAUSE THE BIT INDEX AND FLAG FIELD TO BE A     72448002
*                        A SIGNED HALFWORD SO THE CLR INSTRUCTION CAN   72456002
*                        BE USED.                                       72464002
         IC    TMP1,FLAGS(O,C)  GET THE INDEX OF THE BIT IN THE BYTE.   72472002
         CLR   I,TMP1          SEE IF THE NEW BIT INDEX IS GREATER THAN 72480002
         JMP   4,GETRRL        THE BIT INDEX AT THE END OF THE PATH.    72488002
*********************************************************************** 72496002
* THE INSERT IS AT THE END OF THE PATH, EOP INSERT.                   * 72504002
*********************************************************************** 72512002
EOPINS8  EQU   *         JUST A LABEL, NO BRANCHES TO IT.               72520002
         AL    TMP1,TBTAB0(RRL)  SET THE T0 OR T1 BIT TO A ONE FOR THE  72528002
*                              VERTEX THAT WILL BECOME THE PREDECESSOR  72536002
*                              OF THE NEW INNER VERTEX.                 72544002
         LR    VZ,P      GET THE ALTERNATE SUCCESSOR OF THE PREDECESSOR 72552002
         LR    VX,C      SET VX TO THE ANTEPENULTIMATE VERTEX ON THE    72560002
         X     VZ,O(RRL,VX)    OF THE NEW SINK.                         72568002
*                        PATH TO THE NEW SINK.                          72576002
         LR    VY,NEW    SET VY TO THE PENULTIMATE VERTEX ON THE PATH   72584002
*                        TO THE NEW SINK.                               72592002
         STM   VX,VY,IGANTPEN  STORE THE TWO IN THE TREE HDR.           72600002
         LA    VZ,O(O,VZ)      CLEAR THE HIGH ORDER BYTE IN VZ.         72608002
         STC   TMP1,FLAGS(O,VX)   STORE THE ADJUSTED FLAG BYTE BACK.    72616002
*********************************************************************** 72624002
* HERE THE EXECUTION PATHS FOR EOP, MOP, AND TOP INSERTS ALL JOIN     * 72632002
* TOGETHER TO BECOME UNITED INTO ONE.                                 * 72640002
*********************************************************************** 72648002
INS8JOIN EQU   *         MERGE POINT FOR ALL THREE.                     72656002
         L     TMP2,O(VX,RRL)  GET THE EDGE FIELD OF THE PREDECESSOR    72664002
*                              OF THE NEW INNER VERTEX.                 72672002
         ALR   I,RRL     SET THE RL BIT IN THE NEW INNER VERTEX TO BE   72680002
*                        A ZERO IF THE DISPLACED VERTEX IS A LEFT SINK, 72688002
*                        OR TO A ONE IF THE DISPLACED SINK IS A RIGHT   72696002
*                        SUCCESSOR, SINCE THE NEW INNER VERTEX IS A     72704002
*                        LEFT OR RIGHT INNER VERTEX ACCORDING TO THE    72712002
*                        LEFT/RIGHT STATUS OF THE SINK IT DISPLACES.    72720002
         XR    TMP2,VZ   REMOVE VZ FROM THE EDGE FIELD FROM VX TO THE   72728002
         XR    TMP2,VY   NEW INNER VERTEX AND PUT IN VY.                72736002
         ST    TMP2,O(VX,RRL)  STORE THE EDGE FILED BACK.               72744002
INS8ONE  EQU   *         ENTRY POINT INTO THE COMMON SEQUENCE FOR       72752002
*                        AN INSERTION TO A TREE WITH ONLY ONE SINK.     72760002
         IC    TMP3,NEWPATH(BIT)  GET THE NEW PATH BYTE CODE.           72768002
         STC   TMP3,PATH       STORE THE NEW PATH CODE.                 72776002
         L     R15,INSARG      SINK ADDRESS FOR NEW SINK.               72784002
         XR    VZ,VX     FORM THE INVERTIBLE EDGE FOR THE NEW INNER     72792002
*                        VERTEX INCLUDING IT'S PREDECESSOR AND IT'S     72800002
*                        SUCCESSOR VZ.                                  72808002
         XR    VX,R15    FORM THE EDGE FIELD FOR THE NEW INNER VERTEX   72816002
*                        TO THE NEW SINK.                               72824002
         ST    VX,O(BIT,NEW)   STORE THE EDGE FIELD FROM THE NEW INNER  72832002
*                              VERTEX TO THE NEW SINK.                  72840002
*                        INNER VERTEX TO VZ.                            72848002
         XR    BIT,FOR   GET THE INDEX OF THE EDGE FIELD FROM THE NEW   72856002
         ST    VZ,O(BIT,NEW)   STORE THE EDGE FIELD FROM THE NEW        72864002
*                              INNER VERTEX TO VZ.                      72872002
         STC   I,FLAGS(O,NEW)  STORE THE FLAG FIELD FOR THE NEW INNER   72880002
*                              VERTEX.                                  72888002
         SRL   I,8       GET THE BYTE INDEX IN THE LAST 8 BITS.         72896002
         STC   I,BYTEI(O,NEW)  STORE THE BYTE INDEX FOR THE NEW INNER   72904002
*                              VERTEX.                                  72912002
         LM    R0,R12,GPR0     RESTORE ALL THE REGISTERS.               72920002
         LTR   R15,R15   SET THE CONDITION CODE TO AGREE WITH THE      *72928002
                         RETURN CODE.                                   72936002
         JMP   15,(LKR)        RETURN.                                  72944002
*********************************************************************** 72952002
* THIS IS THE BACKPATH TRACE TO FIND THE INSERTION POINT FOR THE NEW  * 72960002
* INNER VERTEX WHEN THE INSERTION IS NOT EOP.                         * 72968002
*********************************************************************** 72976002
BPTINS8  EQU   *         LOOP CLOSURE.                                  72984002
         LR    TMP4,C    TRACE ONE EDGE IN THE BACKPATH                 72992002
         X     TMP4,O(RRL,P)   SO THAT P AND C ARE CONSECUTIVE          73000002
         LR    C,P             VERTICES ON THE PATH.                    73008002
         LA    P,O(O,TMP4)     CLEAR THE HIGH BYTE FOR TOP TEST.        73016002
*---------------------------------------------------------------------* 73024002
GETRRL   IC    RRL,FLAGS(O,C)  SET RRL TO A ZERO IF RL(C)=0, OR TO      73032002
         NR    RRL,FOR   FOUR IF RL(C)=1.                               73040002
*---------------------------------------------------------------------* 73048002
         CLR   P,C       CHECK FOR THE TOP REACHED.                     73056002
         JMP   8,TOPINS8  BRANCH IF THE INSERT IS TOP.                  73064002
*---------------------------------------------------------------------* 73072002
         LH    TMP4,BYTEI(O,P)  THE TOP WAS NOT REACHED, COMPARE THE    73080002
         IC    TMP4,FLAGS(O,P)  NEW BIT INDEX TO THE BIT INDEX OF THE   73088002
         CLR   I,TMP4           THE NEXT INNER VERTEX UP THE BACKPATH   73096002
         JMP   4,BPTINS8       TO KEEP LOOKING UNTIL THE INSERTION      73104002
*                               POINT IS FOUND.                         73112002
*        THE VERTEX FOUND BY THE BACKPATH TRACE IS EITHER THE TOP, OR * 73120002
* IS THE FIRST INNER VERTEX ON THE FORWARD PATH WHOSE BIT INDEX IS    * 73128002
* GREATER THAN THE NEW BIT INDEX. THIS VERTEX IS THE VERTEX THAT IS   * 73136002
* DISPLACED BY THE INSERTION.                                         * 73144002
*********************************************************************** 73152002
* THE INSERT IS IN THE MIDDLE OF THE PATH, SO THAT THE DISPLACED VERTEX 73160002
* IS AN INNER VERTEX, AND IS NOT THE SOURCE.                          * 73168002
*********************************************************************** 73176002
MOPINS8  EQU   *         JUST A LABEL, NOT BRANCHED TO.                 73184002
         LR    VZ,C      SET VZ TO THE INNER VERTEX SUCCESSOR OF THE    73192002
*                        NEW INNER VERTEX.                              73200002
MOPEQ8   EQU   *  COME HERE TO JOIN MOP FROM CASE 2-MOP OF PROCESSING * 73208002
*                 PROCESSING EQUAL KEYS.                              * 73216002
* THE FOLLOWING LR IS A VIRTUAL LR BECAUSE P AND VX ARE THE SAME COLOR. 73224002
******** LR    VX,P      GET THE ANTEPENULTIMATE AND                    73232002
         LR    VY,NEW    PENULTIMATE VERTICES ON THE PATH TO THE NEW    73240002
         STM   VX,VY,IGANTPEN  SINK, AND STORE THEM IN THE TREE HDR.    73248002
*********************************************************************** 73256002
JOINMOP8 EQU   *         TOP AND MOP INSERTS JOIN HERE.                 73264002
*********************************************************************** 73272002
         LM    E0,E1,O(VZ)  ADJUST EDGE FIELDS OF THE DISPLACED INNER   73280002
         LA    TMP5,O(RRL,BIT)  VERTEX, AND SET THE RL BIT FOR THE      73288002
         X    E1,RLTAB0(TMP5)  INNER VERTEX, BUT SET IT TO A ONE IF IT  73296002
         LR    TMP6,VX         DISPLACED INNER VERTEX TO A ZERO IF IT   73304002
         XR    TMP6,VY         BECOMES A LEFT SUCCESSOR OF THE NEW      73312002
*                              BECOMES A RIGHT SUCCESSOR OF THE NEW     73320002
*                              INNER VERTEX.                            73328002
         AL    I,TBTAB1(BIT)   SET THE T0 OR T1 BIT AT THE NEW INNER    73336002
*                              VERTEX TO REFLECT THE INNER VERTEX       73344002
*                              STATUS OF VZ.                            73352002
         XR    E0,TMP6   FINISH UP ADJUSTING THE EDGE FIELDS OF THE     73360002
         XR    E1,TMP6   DISPLACED INNER VERTEX.                        73368002
         STM   E0,E1,O(VZ)     STORE THE FIELDS BACK FOR VZ.            73376002
         JMP   15,INS8JOIN     NOW MERGE WITH THE COMMON PATH.          73384002
*********************************************************************** 73392002
* THE INSERT IS AT THE TOP OF THE PATH, SO THAT THE SOURCE WILL BE    * 73400002
* THE DISPLACED INNER VERTEX.                                         * 73408002
*********************************************************************** 73416002
TOPINS8  EQU   *         BRANCH HERE FOR TOP INSERTION.                 73424002
         TM    PATH,P1000      TEST THE PATH BYTE TO SEE IF THIS IS THE 73432002
*                              CASE WHERE THERE IS ONLY ONE SINK BEFORE 73440002
*                              THE INSERTION.                           73448002
         L     VZ,APT    PUT THE OLD SINK IN VZ IN CASE THIS IS THE    *73456002
                         TIME WHEN THERE IS ONLY ONE SINK IN THE RPT   *73464002
                         PRIOR TO THE INSERTION.                        73472002
         ST    NEW,APT   STORE THE ADDRESS OF THE NEW SOURCE OF THE     73480002
*                        RADIX PARTITION TREE.                          73488002
         LR    TMP7,P          NEED THIS BECAUSE VX AND P ARE THE SAME  73496002
*                              COLOR.                                   73504002
         LR    VX,NEW    THE NEW SOURCE IS IT'S OWN PREDECESSOR.        73512002
         MVC   IGANTPEN(8),APT  MOVE THE SAME ADDRESS IN ALL 3 PLACES.  73520002
         JMP   8,INS8ONE       JUMP ON THE RESULT OF THE TEST OF THE    73528002
*                              PATH BYTE MADE UPON ENTRY TO THE TOP.    73536002
         LR    VY,TMP7   THIS IS ONLY TO FAKE IT.                       73544002
         LR    VZ,TMP7   SET THE ALTERNATE SUCCESSOR OF THE NEW INNER   73552002
*                        VERTEX TO THE OLD SOURCE.                      73560002
         JMP   15,JOINMOP8     NOW MERGE WITH THE COMMON PATH.          73568002
FOURCON  EQU   4         JUST A FOUR.                                   73576002
         CNOP  0,8                                                      73584002
INS801   EQU   *                                                        73592002
         TM    PATH,P0001      NOW SEE IF THERE IS ONLY ONE SINK,       73600002
         JMP   1,INS81   AND JUMP IF THERE IS.                          73608002
         LR    S,R0            STORE THE INSERT ARGUMENT ADDRESS        73616002
         LA    S,0(0,S)        AT ALL FOUR PLACES.                      73624002
         LR    C,S       XX                                             73632002
         LR    P,S       XX                                             73640002
         STM   P,S,APT   STORE THE NEW SOURCE AND P AND C.              73648002
         MVI   PATH,P0001      SET PATH CODE TO ONE SINK.               73656002
         L     R15,GPR15  RESTORE R15.                                  73664002
         LEAF  SAVE=(R2,R12),LV=,RC=(R15)                               73672002
INS81    EQU   *                                                        73680002
         USING FIXEDHDR,HDB                                             73688002
         LTR   NEW,NEW       SEE IF THERE IS A PLACE FOR THE NEW INNER. 73696002
         BC    2,INS81OK     BRANCH IF THERE IS.                        73704002
         LTR   LKR,LKR   LINK TO THE ROUTINE AT NEEDMORE TO GET MORE   *73712002
                         SPACE ON THE FREE SPACE CHAIN, BUT SET UP THE *73720002
                         LINKAGE REGISTER CORRECTLY.                    73728002
         LA    LKR,INS81LD  BIT 0 OF LKR IS A ONE IF THE REQUEST IS A  *73736002
                         CONDITIONAL REQUEST, AND BIT 0 IS A ZERO IF   *73744002
                         THE REQUEST IS AN UNCONDITIONAL REQUEST.       73752002
         DROP  R15                                                      73760002
         USING INS81LD,LKR  USE THIS ADDRESS TO MAKE THE LINKAGE,      *73768002
                         BECAUSE THE ADDRESS IN REGISTER 15 IS NOT BIG *73776002
                         ENOUGH TO REACH THE BRANCH TARGET WITHIN 4K.   73784002
         JMP   10,NEEDMORE     JUMP IF THE REQUEST IS UNCONDITIONAL.    73792002
         BAL   LKR,NEEDMORE    OTHERWISE LINK TO IT IN THE NORMAL WAY.  73800002
         DROP  LKR       NOW GO BACK TO THE OTHER USING.                73808002
         USING INS8,R15                                                 73816002
INS81LD  EQU   *         RETURN FROM NEEDMORE.                          73824002
         L     LKR,GPR14       RESTORE THE LINKAGE REGISTER.            73832002
         L     NEW,HEADFREE  LOAD THE NEW ADDRESS TO PUT THE INNER.     73840002
         LTR   NEW,NEW   SEE IF IT WAS ABLE TO GET ANY MORE SPACE.      73848002
         JMP   4,INS8LEAF  JUMP IF THERE ISN'T ENOUGH SPACE TO DO THE  *73856002
                         INSERT.                                        73864002
INS81OK  MVC   HEADFREE,O(NEW)  DECAPITATE THE CHAIN.                   73872002
         DROP  HDB                                                      73880002
         L     VZ,APT    GET THE SINGLE SINK ADDRESS.                   73888002
         LR    P,NEW           SET UP THE NEW INNER VERTEX TO BE THE    73896002
         LR    C,NEW           FIRST TWO VERTICES ON THE PATH TRIPLE.   73904002
         MVI   BYTEI(NEW),(X'FF'-NE)  CAUSE THE BACKPATH TRACE LOOP TO  73912002
         LA    VZ,O(O,VZ)      CLEAR THE HIGH ORDER BYTE.               73920002
         MVI   BYTEI(NEW),X'FF'  THINK THE INSERT IS AT THE TOP.        73928002
         JMP   15,INSONEIN  JUMP INTO THE SEQUENCE TO FIND THE UNEQUAL  73936002
*                          BIT POSITION BETWEEN THE NEW KEY AND THE OLD 73944002
         EJECT                                                          73952002
*********************************************************************** 73960002
* COME HERE WHEN THE NEW KEY IS EQUAL TO THE KEY ALREADY IN THE RPT   * 73968002
* ON AN INSERT. THIS SPECIAL PROCESSING FOR EQUAL KEYS IS TO INSURE   * 73976002
* THAT THE TEMPORAL ORDER OF INSERTION OF EQUAL KEYS IS PRESERVED, SO * 73984002
* THAT IF THEY ARE RETRIEVED VIA THE SCANR MACRO THEY ARE RETRIEVED IN* 73992002
* THE SAME ORDER THAT THEY WERE INSERTED.                             * 74000002
*                                                                     * 74008002
* THE FLAG BIT IGANEBIT IS A ONE FOR EACH VERTEX THAT IS THE SOURCE   * 74016002
* OF A SUBTREE WHERE THERE ARE AT LEAST TWO UNEQUAL KEYS, AND THE     * 74024002
* FLAG BIT IGANEBIT IS A ZERO FOR EACH VERTEX THAT IS THE SOURCE OF A * 74032002
* SUBTREE CONTAINING ONLY DUPLICATE KEYS.                             * 74040002
* THE SEARCH OPERATION ALWAYS POSITIONS THE CURSOR TO THE FIRST OF A  * 74048002
* GROUP OF EQUAL KEYS WHEN A SEARCH IS DONE WITH ONE OF THEM.         * 74056002
*---------------------------------------------------------------------* 74064002
* THERE ARE THREE BASIC CASES FOR THE SPECIAL PROCESSING FOR EQUALS:  * 74072002
* CASE 0: THERE IS ONLY ONE SINK PRESENT, AND THE NEW KEY IS EQUAL TO * 74080002
*         THE KEY ALREADY THERE; THE FLAG BIT IGANEBIT IS SET TO ZERO * 74088002
*         IN THE NEW INNER VERTEX, REGISTER BIT IS SET TO 4 TO SIGNAL * 74096002
*         THE NEW SINK IS A RIGHT SUCCESSOR, AND THEN THE REGULAR     * 74104002
*         PROCESSING FOR N=1 IS ENTERED.                              * 74112002
*                                                                     * 74120002
* CASE 1: THE NEW KEY IS EQUAL TO THE ONE ALREADY THERE AND THE VERTEX* 74128002
*         C ON THE PATH HAS THE FLAG BIT IGANEBIT =1, MEANING THAT    * 74136002
*         THERE WILL BE EXACTLY TWO EQUALS PRESENT AFTER THE INSERT.  * 74144002
*         REGISTER BIT IS SET TO 4, THE NE-BIT IS SET TO ZERO IN THE  * 74152002
*         NEW INNER VERTEX, AND THE NORMAL EOP PROCESSING IS ENTERED. * 74160002
*                                                                     * 74168002
* CASE 2: THE KEYS ARE EQUAL AND THE PENULTIMATE VERTEX ON THE PATH   * 74176002
*         TO THE SINK FOUND HAS THE NE-BIT OFF, MEANING IT IS THE     * 74184002
*         SOURCE OF A SUBTREE OF EQUALS ALREADY.                      * 74192002
*         IN THIS CASE THE BACKPATH IS TRACED TO THE VERTEX C SUCH THAT 74200002
*         THE NE-BIT AT C IS A ZERO AND THE NE-BIT AT IT'S PREDECESSOR* 74208002
*         P IS A ONE (IF IT HAS A PREDECESSOR).                       * 74216002
*         THEN THE INSERT IS MADE SO THAT THE NEW INNER VERTEX IS A   * 74224002
*         RIGHT SUCCESSOR OF C, AND THE FORMER RIGHT SUCCESSOR OF C   * 74232002
*         IS A LEFT SUCCESSOR OF THE NEW INNER VERTEX.                * 74240002
*         THE NE-BIT IS SET TO ZERO IN THE NEW INNER VERTEX.          * 74248002
*                                                                     * 74256002
* CASE 2 HAS THREE SUBCASES, 2-EOP, 2-MOP, AND 2-TOP.                 * 74264002
*         THESE CORRESPOND TO END-OF-PATH INSERTION, MIDDLE-OF-PATH   * 74272002
*         INSERTION, AND TOP-OF-PATH INSERTION, RESPECTIVELY.         * 74280002
*        THE 2-EOP CASE CAN ARISE WHEN THE RIGHT SUCCESSOR OF THE     * 74288002
*        VERTEX DETERMINED BY THE BACKPATH TRACE HAS A SINK FOR ITS   * 74296002
*        RIGHT SUCCESSOR, SO THAT THE NEW INNER VERTEX DISPLACES A SINK 74304002
*        CASE 2-MOP ARISES WHEN C HAS AN INNER VERTEX FOR A RIGHT     * 74312002
*        SUCCESSOR, SO THAT THE NEW INNER VERTEX DISPLACES AN INNER   * 74320002
*        VERTEX IN THE MIDDLE OF THE PATH.                            * 74328002
*        CASE 2-TOP IS MERGED WITH CASE 2-MOP, SO THAT THE INSERT FOR * 74336002
*        CASE 2 NEVER CAUSES THE NEW INNER VERTEX TO DISPLACE THE     * 74344002
*        ALREADY EXISTING SOURCE OF THE RPT.                          * 74352002
*********************************************************************** 74360002
INSEQUAL L     I,INSFFEQ       SET THE BIT INDEX FOR THE NEW INNER      74368002
*                              VERTEX TO ALL ONES, AND SET THE Q-BIT    74376002
*                              FOR THE NEW INNER VERTEX TO ONE.         74384002
         TM    FLAGS(C),NE     SEE IF THE VERTEX C IS SOURCE OF A       74392002
*                              SUBTREE WITH AT LEAST TWO UNEQUAL KEYS.  74400002
INSEQLBI IC    TMP1,FLAGS(O,C)  PUT THE BIT INDEX AND FLAG FIELDS IN    74408002
*                               THE REGISTER FOR USE IN THE EOP INSERT  74416002
*                               ROUTINE.                                74424002
* NOTE HOW CAREFULLY THE CONDITION CODE IS PRESERVED THROUGH THE IC   * 74432002
* INSTRUCTION, AND HOW THE BRANCH MASK IS PICKED SO THAT THE TWO PATHS, 74440002
* THIS PATH AND THE PATH FROM EQSBTREE, CAN USE THE SAME IC INSTRUCTION 74448002
* ON THE WAY TO THE EOP ROUTINE.                                      * 74456002
         JMP   7,EOPINS8       JUMP IF NOT ZEROS.                       74464002
* NOTE THAT THE ABOVE TEST MEANS THAT THE NE-BIT MUST BE ZERO IN THE  * 74472002
* DUMMY INNER VERTEX USED IN INSERT FOR THE CASE OF N=1.              * 74480002
         TM    PATH,P1000      SEE IF THIS IS CASE 0.                   74488002
         JMP   7,GETEQRRL      IF NOT, ENTER THE CASE 2 PROCESSING.     74496002
         JMP   15,GETRRL       CASE 0 MERGES WITH THE REGULAR TOP INS.  74504002
*********************************************************************** 74512002
* TRACE THE BACKPATH FOR CASE 2-TOP OR CASE 2-MOP. CONTINUE THE TRACE * 74520002
* UNTIL VERTEX P HAS THE NE-BIT ON OR UNTIL P=C, WHEN THE TOP IS      * 74528002
* REACHED.                                                            * 74536002
*********************************************************************** 74544002
INSEQBPT LR    TMP4,C    TRACE THE BACKPATH ONE EDGE.                   74552002
         X     TMP4,O(RRL,P)   SELECT THE LEFT OR RIGHT EDGE BY USING   74560002
         LR    C,P             BIT RL(C) AS AN INDEX.                   74568002
         LA    P,O(O,TMP4)     CLEAR THE BYTE TO CHECK FOR TOP.         74576002
GETEQRRL IC    RRL,FLAGS(O,C)  GET THE RL BIT FROM C FOR LATER.         74584002
         NR    RRL,FOR         MAKE IT INTO A ZERO OR FOUR.             74592002
         CLR   P,C       SEE IF THE TOP HAS BEEN REACHED,               74600002
         JMP   8,EQSBTREE      AND IF IT HAS LOOK AT THE RIGHT SIDE.    74608002
         TM    FLAGS(P),NE     SEE IF VERTEX C IS NOW THE SOURCE OF     74616002
         JMP   1,INSEQBPT      ENTIRE SUBTREE OF EQUAL KEYS.            74624002
* VERTEX C IS NOW THE SOURCE OF THE ENTIRE SUBTREE OF EQUAL KEYS.     * 74632002
EQSBTREE EQU   *         COME HERE FOR CASE 2-MOP OR 2-EOP.             74640002
*                        CASE 2-TOP MERGES IN WITH 2-MOP AT THIS PLACE. 74648002
         TM    FLAGS(C),(B'11100000'+T1)  SEE IF THE RIGHT SUCCESSOR    74656002
         JMP   4,INSEQLBI      OF C IS A SINK; IF IT IS THIS IS CASE    74664002
*                              2-EOP, AND THE FUNNY THING HAPPENS ON    74672002
*                              WAY TO THE EOP ROUTINE.                  74680002
* CASE 2-MOP, C'S RIGHT SUCCESSOR IS AN INNER VERTEX, AND THE NEW     * 74688002
* INNER VERTEX DISPLACES IT.                                          * 74696002
         TREF  P,C,TMP4,CYCLE=YES  TRACE EDGE INTO RIGHT SUBTREE.       74704002
         LR    RRL,FOR   SET RRL FOR THE NEW C.                         74712002
         LA    VZ,O(O,C) PREPARE TO JOIN MOP.                           74720002
         JMP   15,MOPEQ8 JOIN THE MOP INSERT ROUTINE.                   74728002
         DROP  R15                                                      74736002
         DROP  R13                                                      74744002
         DROP  PLA                                                      74752002
         EJECT                                                          74760002
*********************************************************************** 74768002
* THIS IS THE ROUTINE TO SET UP A RADIX PARTITION TREE FOR THE FIRST  * 74776002
* TIME.                                                               * 74784002
*********************************************************************** 74792002
* UPON ENTRY THE REGISTER CONTENTS ARE AS FOLLOWS:                    * 74800002
*                                                                     * 74808002
*        |0   15|16  22|23  31|                                       * 74816002
*  R0:   |------|------|------|                                       * 74824002
*        | KEYI | RPT# | KEYL |                                       * 74832002
*                                                                     * 74840002
*  R1:   MAPPING SUBROUTINE ADDRESS. BIT 0 OF R1 IS A ZERO IF THE     * 74848002
*        INNER VERTEX SIZE FOR THE RPT IS 8 BYTES, OR IS A ONE IF THE * 74856002
*        INNER VERTEX SIZE FOR THE RPT IS 12 BYTES.                   * 74864002
*                                                                     * 74872002
*  R10:  REGISTER 10 IS THE BASE REGISTER UPON ENTRY.                 * 74880002
*                                                                     * 74888002
*  LKR:  LKR CONTAINS THE RETURN ADDRESS. BIT 0 OF LKR IS A ONE IF THE* 74896002
*        REQUEST IS CONDITIONAL, OR IS A ZERO IF THE REQUEST IS       * 74904002
*        UNCONDITIONAL.                                               * 74912002
*                                                                     * 74920002
*        |0       7|8                    31|                          * 74928002
*  R15:  |---------|-----------------------|                          * 74936002
*        | RPT SP# | SPACE CONTROL ADDRESS |                          * 74944002
*                    (IF THERE IS ONE)                                * 74952002
*                                                                     * 74960002
* THE REGISTERS HAVE BEEN SAVED AND REGISTER 10 HAS BEEN SET TO THE   * 74968002
* ADDRESS "GOSTREE".                                                  * 74976002
*********************************************************************** 74984002
*                                                                     * 74992002
* AFTER GETTING SPACE FOR THE TREE HEADER, ALL THE FIELDS FROM IGAPT  * 75000002
* TO IGAWORK ARE FIRST CLEARED TO ZEROS. THEN THE FOLLOWING FIELDS ARE* 75008002
* SET TO THE INDICATED VALUES:                                        * 75016002
*                                                                     * 75024002
*  IGADDR: IGADDR IS SET TO THE ADDRESS OF THE MODULE IGARPT01, AND   * 75032002
*          THE LEFT BYTE IS SET TO THE RPT TYPE.                      * 75040002
*                                                                     * 75048002
*  IGAHVFC:IF THE SPACE CONTROL ADDRESS IS NOT ZERO, THEN IGAHVFC IS  * 75056002
*          SET TO THE ADDRESS OF THE 8 OR 12-BYTE FIXEDHDR IN THE     * 75064002
*          SPACE CONTROL AREA, DEPENDING ON WHETHER THE INNER VERTEX  * 75072002
*          SIZE IS 8 OR 12 BYTES RESPECTIVELY. IF THE SPACE CONTROL   * 75080002
*          ADDRESS IS ZERO, THEN THE SPACE CONTROL SUBPOOL CHAIN FROM * 75088002
*          THE TCBRPT WORD IS SEARCHED TO FIND THE RIGHT SPACE CONTROL* 75096002
*          AREA FIRST.                                                * 75104002
*                                                                     * 75112002
*  IGAKEYL:IGAKEYL IS SET TO THE KEY LENGTH, USING THE NUMBER IN BITS * 75120002
*          23-31 OF REGISTER 0.                                       * 75128002
*                                                                     * 75136002
*  IGAMAP: IGAMAP IS SET TO THE ADDRESS OF THE MAPPING SUBROUTINE,    * 75144002
*          FROM REGISTER 1.                                           * 75152002
*********************************************************************** 75160002
*                                                                     * 75168002
      GODOWNTO SPACE     LEAVE SOME ROOM HERE, AND ALIGN IT ON A       *75176002
                         16-BYTE BOUNDARY.                              75184002
SETUP8   EQU   *         COME HERE AFTER THE BRANCH ENTRY FROM THE     *75192002
                         STREE MACRO-INSTRUCTION.                       75200002
*********************************************************************** 75208002
         USING GOSTREE,R10  USE THE USING FROM THE ENTRY.               75216002
         USING SAVEDSEK,R13  USE THE SAVE AREA DSECT.                   75224002
         L     PLA,ADDRESS  GET THE ADDRESS OF THE BASE OF THE MODULE.  75232002
         DROP  R10                                                      75240002
         LA    R10,X'800'(,PLA)  GET AN ADDRESS CLOSE ENOUGH TO THIS   *75248002
                         CODE TO BE USED AS A BASE REGISTER, BUT NOT SO*75256002
                         CLOSE THAT THE CONSTANTS CAN'T BE USED.        75264002
         USING &PROGRAM+X'800',R10  NEED TO DO THIS TO USE THE CONSTANT*75272002
               DATA IN THE FIRST 4K OF THE MODULE.                      75280002
         USING TREEHDR,PLA  USE THE GOODOLE PLA.                        75288002
         LA    R9,0(,R15)  ADDRESS OF THE SPACE CONTROL WORD, IF THERE *75296002
               IS ONE.                                                  75304002
         LR    R3,R15    SAVE THE SUBPOOL # AND SPACE CONTROL ADDRESS  *75312002
                         FOR LATER.                                     75320002
         SRL   R3,TWENTY4  GET THE SUBPOOL # IN THE RIGHT BYTE.         75328002
         LR    R6,R0     KEYI,RPT#, AND KEYL.                           75336002
         SRDL  R6,NINE   GET KEYL IN LEFT NINE BITS OF R7, AND RPT # IN*75344002
                         RIGHT 7 BITS OF R6.                            75352002
         LA    R2,B'1111111'  MASK TO PICK OUT ONLY THE RPT#.           75360002
         NR    R2,R6     GET THE RPT# IN R2.                            75368002
         CL    R2,=F'5'  SEE IF THIS IS A TYPE 5 RPT.                   75376002
         JMP   8,SETUP5  JUMP IF IT IS A TYPE 5 RPT.                    75384002
         LA    R0,IGATYP8S  GET THE SIZE OF A TYPE 8 RPT HEADER FOR THE*75392002
                         GSPACE.                                        75400002
         ALR   R0,R15    ADD IN THE RPT SUBPOOL #.                      75408002
         SLR   R0,R9     SUBTRACT OUT THE SPACE CONTROL AREA ADDRESS.   75416002
         N     LKR,X800  KNOCK OFF ALL THE BITS EXCEPT BIT 0, WHICH IS *75424002
                         A ONE IF THE STREE IS A CONDITIONAL REQUEST.   75432002
         AL    LKR,=AL4(SETBACK)  ADD IN THE RETURN ADDRESS FROM GSPACE 75440002
         DROP  PLA                                                      75448002
         LA    R1,O(,R9)  GET THE ADDRESS OF THE SPACE CONTROL AREA IN *75456002
                         R1 IF THERE IS A SPACE CONTROL AREA.           75464002
         DROP  R10                                                      75472002
         USING &PROGRAM,PLA                                             75480002
         JMP   15,&PROGRAM+&IGAGSPS  BRANCH ENTRY FOR GSPACE.           75488002
         DROP  PLA                                                      75496002
         USING &PROGRAM+X'800',R10  GO BACK TO THE REAL ONE.            75504002
SETBACK  BNZ   MINUSRC   JUMP TO RETURN A NEGATIVE RETURN CODE IF THE  *75512002
               GSPACE DIDN'T WORK DUE TO LACK OF SPACE.                 75520002
         USING TREEHDR,R1                                               75528002
         ST    PLA,IGADDR  STORE THE ADDRESS OF IGARPT01.               75536002
         DROP  R1                                                       75544002
         USING TREEHDR,PLA  BACK TO THE TREE HEADER TOO.                75552002
         LR    PLA,R1    SAVE THE ADDRESS OF THE TREE HEADER.           75560002
         MVI   IGADDR,X'08'  FLAG IT AS A TYPE 8 RPT.                   75568002
         XC    IGAPT(IGAWORK-IGAPT),IGAPT  ZERO OUT ALL THE ENTRIES IN *75576002
               THE TREE HEADER EXCEPT IGADDR.                           75584002
         LTR   R9,R9     SEE IF THE SPACE CONTROL ADDRESS IS PRESENT.   75592002
         JNZ   GOTSTR#   JUMP IF IT IS PRESENT IN REGISTER 9 ALREADY.   75600002
      RPTDSECT GEN=(TCBRPT,R9)  GET THE ADDRESS OF THE SPACE CONTROL   *75608002
                         AREA FOR SUBPOOL ZERO.                         75616002
         USING FIXEDHDR-&IGAS8,R9  USE THE FIXEDHDR TO LOOK AT THE     *75624002
                         SUBPOOL # IN THE SPACE CONTROL AREA.           75632002
         SLR   R4,R4  ZERO OUT THE LEFT 3 BYTES FOR THE IC INSTRUCTION. 75640002
         CLR   R3,R4     SEE IF THE REQUEST SUBPOOL IS THE SAME AS THE *75648002
                         SUBPOOL # IN THE SACPE CONTROL AREA.           75656002
         JMP   8,GOTSTR#  JUMP IF IT IS, FOR THEN R9 HAS THE ADDRESS OF*75664002
                         THE APPROPRIATE SPACE CONTROL AREA IN IT.      75672002
         DROP  R9                                                       75680002
         USING IGASPCTL,R9  GET SET TO TRACE THE SPACE CONTROL AREA    *75688002
                         SUBPOOL CHAIN.                                 75696002
         LA    R9,IGASPEDG  GET THE ADDRESS OF THE HEAD OF THE CHAIN.   75704002
         DROP  R9                                                       75712002
         USING IGASPC,R9  USE THE CHAIN DSECT.                          75720002
STREE#SP L     R9,IGANXSP  LOAD THE ADDRESS OF THE NEXT 8-BYTE SPACE   *75728002
                         CONTROL AREA DEFINITION WORD.                  75736002
         LTR   R9,R9     THE REQUEST SUBPOOL SHOULD BE PRESENT, SINCE  *75744002
                         IT HAD TO BE USED TO ALLOCATE THE TREE HEADER *75752002
                         PREVIOUSLY.                                    75760002
         JM    =XL2'FFFF'  HANG UP QUICKLY IF SOMETHING IS FOULED UP.   75768002
         IC    R4,IGASPADR  GET THE SUBPOOL IN REGISTER R4.             75776002
         CLR   R3,R4     SEE IF THEY ARE THE SAME.                      75784002
         JMP   7,STREE#SP  JUMP IF THE RIGHT ONE IS NOT YET FOUND.      75792002
         L     R9,IGASPADR  FOUND THE RIGHT ONE, LOAD THE ADDRESS OF   *75800002
                         THE CORRESPONDING SPACE CONTROL AREA.          75808002
         DROP  R9                                                       75816002
GOTSTR#  EQU   *         COME HERE WHEN THE RIGHT SPACE CONTROL AREA   *75824002
                         HAS BEEN FOUND.                                75832002
         LA    R8,&IGAS8.(,R9)  GET THE ADDRESS OF THE FIXEDHDR FOR    *75840002
                         8-BYTE ENTRIES FOR THE SPACE ALLOCATION FOR   *75848002
                         INNER VERTEX ENTRIES.                          75856002
         LM    R0,R1,((4*0)+20-64*((2+0)/16))(13)  RESTORE R0 AND R1.   75864002
         LTR   R1,R1     SEE IF THE INNER VERTEX SIZE IS 8 BYTES.       75872002
         JMP   10,IVSIS8  JUMP IF THE INNER VERTEX SIZE IS 8 BYTES.     75880002
         LA    R8,SIXTEEN(,R8)  ADD SIXTEEN TO THE FIXEDHDR ADDRESS,   *75888002
                         CAUSING IT TO BE THE ADDRESS OF THE 12-BYTE   *75896002
                         FIXEDHDR.                                      75904002
IVSIS8   EQU   *         NOW THE FIXEDHDR ADDRESS IS ALL SET UP.        75912002
         ST    R8,IGAHVFC  STORE THE ADDRESS OF THE FIXEDHDR IN THE    *75920002
                         INNER VERTEX FREE SPACE WORD.                  75928002
         LA    R1,O(,R1)  CLEAR THE LEFT BYTE.                          75936002
         ST    R1,IGAMAP  STORE THE ADDRESS OF THE MAPPING SUBROUTINE  *75944002
                         (IF THERE IS ONE).                             75952002
         LA    R1,B'111111111'  MASK TO PICK OUT THE LAST 9 BITS OF R0,*75960002
                         WHICH IS THE KEY LENGTH.                       75968002
         NR    R1,R0     GET THE KEY LENGTH.                            75976002
         STH   R1,IGAKEYL  STORE THE LENGTH OF THE KEY.                 75984002
         SRDL  R0,16     GET THE INDEX OF THE FIRST BYTE OF THE KEY IN *75992002
                         THE RECORD.                                    76000002
         STH   R0,IGAKEYI  STORE THE INDEX OF THE FIRST BYTE OF THE KEY*76008002
                         IN THE RECORD.                                 76016002
&X       SETC  '&IGANAME'  THE NAME IS TOO BIG TO WRITE THE STATEMENT, *76024002
                         SO USE THE LITTLE CHARACTER VARIABLE.          76032002
         MVC   &IGABLST.(X'28',PLA),=AL4(&X+&IGASCH8,&X+&IGAINS8,&X+&IG*76040002
               ADEL8,&X+&IGADSP8,&X+&IGAGKW,0,&X+&IGALSCN,&X+&IGARSCN,&*76048002
               X+&IGASPV,&X+&IGAPVG,&X+&IGAPVAJ)                        76056002
         MVI   IGAKEYW,(B'11111111'-B'01111111')  FLAG THE WORD AS THE *76064002
                         ADDRESS OF THE ROUTINE TO GET A WORK AREA FOR *76072002
                         COLLECTING KEYS.                               76080002
         LM    LKR,R11,GPR14  RESTORE THE REGISTERS.                    76088002
         LR    R1,PLA    PUT THE ADDRESS OF THE TYPE 8 RPT IN REGISTER *76096002
                         ONE.                                           76104002
         L     PLA,GPR12  RESTORE THE LINKAGE REGISTER.                 76112002
         LTR   R15,R1    RETURN THE ADDRESS IN R15 ALSO, AND SET THE   *76120002
                         CONDITION CODE TO REFLECT THE RETURN CODE.     76128002
         JMP   15,(LKR)  RETURN.                                        76136002
*********************************************************************** 76144002
* SET UP THE TYPE 5 RADIX PARTITION TREE.                             * 76152002
*********************************************************************** 76160002
*                                                                     * 76168002
      GODOWNTO SPACE     LEAVE A LITTLE ROOM AND ALIGN IT ON A 16-BYTE *76176002
                         BOUNDARY.                                      76184002
SETUP5   EQU   *         COME HERE FROM THE CHECK FOR TYPE 5 STREE.     76192002
         LA    R0,IGATYP5S  THE SIZE OF THE TYPE 5 RPT HEADER.          76200002
         LTR   LKR,LKR   SEE IF THE STREE REQUEST IS CONDITIONAL OR IS  76208002
         BC    4,STR5COND  AN UNCONDITIONAL REQUEST, AND BRANCH IF IT  *76216002
                         A CONDITIONAL REQUEST.                         76224002
*********************************************************************** 76232002
* USE AN UNCONDITIONAL GETMAIN TO ALLOCATE THE SPACE FOR THE TYPE 5   * 76240002
* RPT HEADER, BECAUSE THE STREE MACRO-INSTRUCTION WAS CODED FOR AN    * 76248002
* UNCONDITIONAL REQUEST.                                              * 76256002
*********************************************************************** 76264002
         ALR   R0,R15    ADD IN THE SUBPOOL #.                          76272002
         SLR   R0,R9     SUBTRACT OUT THE OTHER TWENTY FOUR BITS FROM  *76280002
                         REGISTER 15.                                   76288002
       GETMAIN R,LV=(0)  UNCONDITIONAL GETMAIN.                         76296002
         BC    15,SETUP5A      GO SET UP THE TYPE 5 RPT HEADER.         76304002
*********************************************************************** 76312002
* USE A CONDITIONAL GETMAIN TO ALLOCATE THE SPACE FOR THE TYPE 5 RPT  * 76320002
* HEADER, BECAUSE THE STREE MACRO-INSTRUCTION WAS NOT CODED TO SELECT * 76328002
* AN UNCONDITIONAL REQUEST.                                           * 76336002
*********************************************************************** 76344002
STR5COND EQU   *  COME HERE TO USE THE CONDITIONAL GETMAIN.             76352002
         LA    R1,EIGHT(,R13)  ADDRESS OF THE WORK AREA FOR THE        *76360002
                         CONDITIONAL GETMAIN.                           76368002
         SRL   R15,TWENTY4  GET THE SUBPOOL NUMBER RIGHT ALIGNED IN THE*76376002
                         REGISTER.                                      76384002
       GETMAIN EC,A=(1),LV=(0),SP=(15),MF=(E,(1))  CONDITIONAL GETMAIN. 76392002
         ST    LKR,TWELVE(,R13)  STORE BACK THE LINKAGE REGISTER.       76400002
         LTR   R15,R15   TEST THE RETURN CODE FROM THE CONDITIONAL     *76408002
                         GETMAIN.                                       76416002
         BZ    SETUP5A   BRANCH IF THE GETMAIN WAS SUCCESSFUL.          76424002
MINUSRC  LEAF  LV=,RC=-1,SAVE=(LKR,(R0,R12))                            76432002
         DROP  PLA                                                      76440002
SETUP5A  EQU   *         COME HERE FOR THE SETTING UP OF THE TYPE 5    *76448002
                         TREEHEADER AFTER THE SUCCESSFUL GETMAIN.       76456002
         L     R1,EIGHT(,R13)  GET THE ADDRESS OF THE TREE HEADER.      76464002
         USING IGARPTH5,R1  USE THE TYPE 5 RPT HEADER.                  76472002
         LA    R15,FOUR  GET A MINUS FOUR IN REGISTER 15                76480002
         LCR   R15,R15   FOR THE BXH INSTRUCTION.                       76488002
         LA    LKR,IGAMASKZ-(IGATOP5+FOUR)  SET UP                      76496002
         LA    R0,ONE    TO FILL IN THE TYPE 5 RPT HEADER.              76504002
STORE5   ST    R0,IGATOP5(LKR)  STORE THE NEXT MASK FOR SRCH5.          76512002
         ALR   R0,R0     GET THE NEXT MASK BY DOUBLING.                 76520002
         BXH   LKR,R15,STORE5  FILL IN THE WHOLE MASK TABLE WITH THIS  *76528002
                         LOOP.                                          76536002
         L     R15,IGAMASKS  GET THE DEAD SINK CONSTANT, I. E.         *76544002
                         X'80000000'.                                   76552002
         ST    R15,IGATOP5  INDICATE ZERO SINKS IN THE TYPE 5 RPT.      76560002
         SRL   R6,SEVEN  GET THE KEY INDEX RIGHT ALIGNED IN REGISTER   *76568002
                         SIX.                                           76576002
         STH   R6,IGAKEYI5  STORE THE INDEX TO THE FIRST BYTE OF THE   *76584002
                         KEY IN THE RECORD.                             76592002
         SRL   R7,23     GET THE KEY LENGTH RIGHT ALIGNED.              76600002
         STC   R7,IGAKEYL5  STORE THE KEY LENGTH IN THE TYPE 5 RPT     *76608002
                         HEADER (NOTE THAT THE TYPE 5 KEY LENGTH CANNOT*76616002
                         EXCEED 16 BYTES).                              76624002
         STC   R3,IGASP5  STORE THE SUBPOOL #.                          76632002
         MVC   (IGARPTH5+&IGABLST)(X'14'),=AL4(0,&IGANAME+&IGAINS5,&IGA*76640002
               NAME+&IGADEL5,0,&IGANAME+&IGAGKW)                        76648002
         L     R10,ADDRESS  THE ADDRESS OF IGARPT01.                    76656002
         ST    R10,IGADDR5  STORE THE ADDRESS OF THE MODULE IGARPT01.   76664002
         DROP  R10                                                      76672002
         MVI   IGADDR5,X'05'  FLAG IT AS A TYPE 5 RPT.                  76680002
         LEAF  LV=,RC=(1),SAVE=(LKR,(R2,R12))                           76688002
         DROP  R1                                                       76696002
         DROP  R13                                                      76704002
         LTORG *                                                        76712002
         EJECT                                                          76720002
*********************************************************************** 76728002
* THIS IS THE SUBROUTINE FOR GETTING MORE INNER SPACE AND CHAINING IT * 76736002
* ON A FREE SPACE CHAIN. UPON ENTRY TO THE ROUTINE THE REGISTERS ARE  * 76744002
* AS INDICATED IN THE FOLLOWING COMMENTS:                             * 76752002
*                                                                     * 76760002
HDB      EQU   R2  THE ADDRESS OF THE FIXEDHDR DSECT FOR THE SPACE,   * 76768002
*                  IF THERE IS ONE. INITIALLY, HDB IS ZERO, AND A     * 76776002
*                  FIXEDHDR IS CONSTRUCTED THAT IS USED TO REFERENCE  * 76784002
*                  THE SPACE THEREAFTER. AFTER THE FIRST TIME, HDB    * 76792002
*                  HAS IN IT THE ADDRESS OF THE FIXEDHDR, WHICH IS THE* 76800002
*                  WORD CALLED HEADFREE IN THE FIXED DSECT. BIT ZERO  * 76808002
*                  IS A ONE IN THIS ADDRESS, SO THAT THE ADDRESS OF   * 76816002
*                  THE HEAD OF THE FREE SPACE CHAIN CAN BE STORED IN  * 76824002
*                  THE EDGE FIELD OF THE LAST VERTEX ON THE FREE SPACE* 76832002
*                  CHAIN. THEN WHEN A MOVE TO DECAPITATE THE CHAIN    * 76840002
*                  IS DONE, THE WORD AT HEADFREE IS MOVED TO IT'S OWN * 76848002
*                  LOCATION, THEREBY RESULTING IN AN EFFECTIVE NOP.   * 76856002
*                  THEN THE TEST FOR A SUCCESSFUL DECAPITATION FINDS  * 76864002
*                  THAT BIT ZERO IS ON, AND IT EXECUTES THIS ROUTINE  * 76872002
*                  TO GET MORE SPACE.                                 * 76880002
*                                                                     * 76888002
SPL      EQU   R3  THIS IS THE SUBPOOL AND LENGTH VALUE FOR GETMAIN.  * 76896002
XVL      EQU   R4  INNER VERTEX LENGTH; THE LENGTH OF EACH ENTRY ON   * 76904002
*                  THE FREE SPACE CHAIN.                              * 76912002
XTR      EQU   R5  THE AMOUNT OF SPACE TO LEAVE WHEN INITIALLY        * 76920002
*                  ALLOCATING SPACE, FOR SUCH THINGS AS THE TREEHDR.  * 76928002
*                  THIS IS ONLY GIVEN WHEN THIS IS THE INITIAL        * 76936002
*                  ALLOCATION, I. E. WHEN HDB=0. THEREAFTER THE       * 76944002
*                  FOLLOWING ARE THE CONTENTS:                        * 76952002
BBAS     EQU   R5  THE ADDRESS OF THE FIRST BLOCK ON THE BLOCK CHAIN, * 76960002
*                  WHOSE FORMAT IS GIVEN IN THE DSECT BLOCKHDR.       * 76968002
RFL      EQU   R6  WHEN THIS IS THE FIRST ALLOCATION, THEN THIS IS THE* 76976002
*                  SUBPOOL AND LENGTH VALUE TO USE FOR SUBSEQUENT     * 76984002
*                  GETMAINS. THIS WORD IS PUT INTO SPL AFTER THE FIRST* 76992002
*                  ALLOCATION OF SPACE.                               * 77000002
*                                                                     * 77008002
* LKR IS THE LINKAGE REGISTER, AND R15 IS THE PROGRAM BASE REGISTER.  * 77016002
* PRIOR TO ENTERING THIS ROUTINE ALL REGISTERS HAVE BEEN SAVED, SO    * 77024002
* THAT NO SAVING OF REGISTERS MUST BE DONE. ALL REGISTERS FROM 0 TO 10* 77032002
* ARE AVILABLE FOR USE IN THIS ROUTINE.                               * 77040002
*********************************************************************** 77048002
BLOCKHDR DSECT 0  THIS IS THE DSECT FOR A TYPICAL ENTRY ON THE BLOCK  * 77056002
*                 CHAIN. THE BLOCK CHAIN KEEPS TRACK OF THE SPACE     * 77064002
*                 OBTAINED BY GETMAIN, SO THAT WHEN THE MACRO FTREE   * 77072002
*                 IS EXECUTED ALL THIS SPACE CAN BE RETURNED TO THE   * 77080002
*                 SYSTEM BY EXECUTING FREEMAINS FOR THE SAME SIZE     * 77088002
*                 THAT WAS REQUESTED ORIGINALLY.                      * 77096002
BEDGE    DC    F'0'  THIS IS THE EDGE FIELD CONTAINING THE ADDRESS OF * 77104002
*                    NEXT VERTEX ON THE BLOCK CHAIN. IF THIS IS THE   * 77112002
*                    LAST VERTEX THEN THIS FIELD IS ZERO.             * 77120002
BSPL     DC    F'0'  SUBPOOL AND LENGTH VALUE FROM THE GETMAIN THAT   * 77128002
*                    GOT THIS BLOCK.                                  * 77136002
BADR     DC    F'0'  THIS IS THE ADDRESS THAT WAS RETURNED FROM GETMAIN 77144002
BLOKBACK DC    F'0'  THE ADDRESS OF THE FIXED SPACE HEADER THAT HAS   * 77152002
*                    THIS BLOCK IN IT'S BLOCK CHAIN.                  * 77160002
BWORK    EQU   BLOKBACK  A WORK AREA THAT ENDS UP BY SETTING BLOKBACK.* 77168002
FIXBLNG  EQU   16  THE LENGTH OF THE BLOCK CHAIN ENTRY.                 77176002
FIXEDHDR DSECT 0  DSECT FOR THE FIXED LENGTH IN-PLACE FREE SPACE CHAIN. 77184002
HEADFREE DC    F'0'  THE HEAD OF THE FREE SPACE CHAIN.                  77192002
FXREFILL DC    F'0'  REFILL SUBPOOL AND ITEM LENGTH.                    77200002
FIXDRECL DC    F'0'  THE LENGTH OF EACH ITEM IN THE FREE SPACE CHAIN.   77208002
BLOKHEAD DC    F'0'  THE HEAD OF THE BLOCK CHAIN.                       77216002
FIXEDLNG EQU   32  LENGTH OF FIXEDHDR+BLOCKHDR                          77224002
&PROGRAM CSECT                                                          77232002
      GODOWNTO SPACE     LEAVE A LITTLE ROOM.                           77240002
*********************************************************************** 77248002
NEEDMORE EQU   *         ENTRY POINT IF 3 WORDS MUST BE LOADED.         77256002
         USING FIXEDHDR,HDB                                             77264002
         LM    HDB,BBAS,HEADFREE  LOAD THE WHOLE FIXEDHDR.              77272002
         DROP  HDB                                                      77280002
GTMORINR EQU   *  ENTRY POINT IF THE REGISTERS HAVE BEEN LOADED WITH    77288002
*                 THE FOUR WORDS IN THE FIXEDHDR.                       77296002
         LR    R0,SPL  SUBPOOL AND LENGTH VALUE FOR GETMAIN.            77304002
         LTR   LKR,LKR   SEE IF THIS IS A CONDITIONAL OR AN            *77312002
                         UNCONDITIONAL REQUEST.                         77320002
         BALR  R15,O     ESTABLISH ADDRESSABILITY.                      77328002
         USING *,R15                                                    77336002
         JMP   4,GFCOND  BRANCH IF IT IS A CONDITIONAL REQUEST.         77344002
      GETMAIN  R,LV=(0)  GET SPACE FOR A BLOCK OF INNER SPACE.          77352002
         DROP  R15  IN DOING SO IT LOST THE ADDRESSABILITY IN R15.      77360002
         BALR  R15,O  SO THAT ADDRESSABILITY HAS TO BE RECOVERED.       77368002
         USING *,R15  NATURALLY WE WANT TO USE THE NEW ADDRESSABILITY.  77376002
         JMP   15,TOTHERE  SKIP AROUND THE CONDITIONAL CASE.            77384002
         DROP  R15                                                      77392002
GFCOND   LA    R1,O(,HDB)  GET THE ADDRESS OF THE WORK AREA FOR THE    *77400002
                         GETMAIN USING THE LIST FORM AND EXECUTE.       77408002
         LR    R15,R0    PUT THE LENGTH VALUE IN REGISTER 15 AND        77416002
         LA    R15,O(,R15)  CLEAR THE LEFT BYTE.                        77424002
         SRL   R0,TWENTY4  GET THE SUBPOOL NUMBER RIGHT ALIGNED IN THE *77432002
                         REGISTER.                                      77440002
       GETMAIN EC,A=(1),LV=(15),SP=(0),MF=(E,(1))  CONDITIONAL GETMAIN. 77448002
         LTR   R15,R15   TEST THE RETURN CODE TO SEE IF THE CONDITIONAL*77456002
                         GETMAIN WORKED.                                77464002
         L     R1,O(O,R1)  GET THE ADDRESS OF THE SPACE OBTAINED VIA   *77472002
                         GETMAIN.                                       77480002
         STM   HDB,BBAS,O(HDB)  PUT BACK THE THINGS THE LIST COVERED   *77488002
                         UP.                                            77496002
         JMP   7,(LKR)   RETURN IF THE ALLOCATION DID NOT SUCCEED.      77504002
TOTHERE  BALR  R15,O     ESTABLISH NEW ADDRESSABILITY.                  77512002
         USING *,R15                                                    77520002
*********************************************************************** 77528002
* NOW THE SIXTEEN BYTE BLOCK DEFINITION ENTRY IS TAKEN FROM THE FRONT * 77536002
* OF THE SPACE JUST OBTAINED.                                         * 77544002
         SNIP                                                           77552002
         USING BLOCKHDR,R1  USING TO STORE THE RIGHT STUFF.             77560002
         STM   R0,R1,BSPL  STORE THE TWO DEFINING WORDS FOR THE BLOCK.  77568002
*---------------------------------------------------------------------* 77576002
         LTR   HDB,HDB         TEST HDB TO SEE IF IS ZERO , BRANCHING   77584002
         BC    4,SUBSQUNT      IF IT IS NOT THE FIRST ALLOCATION.       77592002
         SNIP                                                           77600002
*---------------------------------------------------------------------* 77608002
*  IT IS THE FIRST ALLOCATION.                                        * 77616002
         ST    HDB,BEDGE  ZERO OUT THE EDGE BECAUSE THIS IS THE LAST    77624002
*                         BLOCK ON THE BLOCK CHAIN.                     77632002
         LR    SPL,RFL    NOW THE SUBPOOL AND LENGTH VALUE FOR          77640002
*                         GETMAINS IS SET, SINCE THE INITIAL VALUE HAS  77648002
*                         BEEN USED AND RECORDED IN THE BLOCK CHAIN.    77656002
XTRB     EQU   R6  THIS REGISTER HAS THE ADDRESS OF THE EXTRA SPACE     77664002
*                  REQUIRED IF IT IS THE FIRST TIME.                    77672002
         LA    XTRB,FIXEDLNG(O,R1)  COMPUTE THE ADDRESS OF THE EXTRA.   77680002
XCUR     EQU   R7  ADDRESS OF THE FIRST BYTE OF THE SPACE TO BE CHAINED 77688002
*                  TOGETHER. IT IS INCREMENTED DURING THE BXLE LOOP.    77696002
         LA    XCUR,FIXEDLNG(XTR,R1)  COMPUTE THE ADDRESS.              77704002
         LR    BBAS,R1  SET THE ADDRESS OF THE BLOCK CHAIN HEAD.        77712002
         DROP  R1                                                       77720002
         USING BLOCKHDR,BBAS  USE THIS ADDRESS FROM NOW ON.             77728002
         LA    HDB,FIXBLNG(O,R1)  GET THE ADDRESS OF THE SPACE HEADER.  77736002
         AL    HDB,=XL4'80000000'  SET THE LEFT BIT ON TO SIGNAL THE    77744002
*                                  END OF THE FREE SPACE CHAIN.         77752002
         BC 15,FSPMERGE  NOW JOIN WITH THE OTHER PATH FROM NOT THE      77760002
*                        FIRST TIME.                                    77768002
         DROP  BBAS  DROP IT UNTIL THE OTHER PATH MERGES WITH THIS ONE. 77776002
*---------------------------------------------------------------------* 77784002
SUBSQUNT EQU   *  BRANCH POINT FOR NOT THE FIRST TIME.                  77792002
         USING BLOCKHDR,R1  ALLOCATE THE BLOCK CHAIN ENTRY FROM THE     77800002
         ST    BBAS,BEDGE   FRONT OF THE SPACE, CHAINING THE NEW        77808002
         LR    BBAS,R1      ENTRY ON THE FRONT OF THE CHAIN.            77816002
         DROP  R1                                                       77824002
         LA    XCUR,FIXBLNG(O,R1)  COMPUTE THE ADDRESS OF THE FIRST     77832002
*                                  BYTE OF THE SPACE TO CHAIN TOGETHER. 77840002
*---------------------------------------------------------------------* 77848002
FSPMERGE EQU   *  HERE IS WHERE RHE SEQUENCES COME TOGETHER.            77856002
         SNIP                                                           77864002
         USING FIXEDHDR,HDB  HDB IS NOW GUARANTEED TO HAVE THE ADDRESS  77872002
*                            OF THE FIXEDHDR.                           77880002
         STM   HDB,BBAS,HEADFREE  IT STORES THE WHOLLLE THING.          77888002
XINC     EQU  XVL  THE INCREMENT FOR THE BXLE IS THE SAME AS THE LENGTH 77896002
*                  OF EACH ENTRY ON THE FREE SPACE CHAIN.               77904002
XLIM     EQU   R5  THIS IS THE LIMIT FOR THE BXLE; NOTE HOW TRICKY THIE 77912002
*                  LIMIT IS TO COMPUTE.                                 77920002
XPRED    EQU   R8  PREDECESSOR OF THE VERTEX XCUR DURING THE BXLE LOOP. 77928002
XNEG     EQU   R3  COMPLEMENT OF ITEM LENGTH FOR SUBTRACTING.           77936002
XBBAS    EQU   R9              USE THIS REGISTER INSTEAD OF BBAS,       77944002
         LR    XBBAS,BBAS      BECAUSE BBAS AND XLIM ARE THE SAME       77952002
         USING BLOCKHDR,XBBAS  COLOR. HTE COLORING IS NOT QUITE PERFECT 77960002
         LCR   XNEG,XINC  PUT THE COMPLEMENT OF ITEM LENGTH IN XNEG.    77968002
         ALR   R1,R0     COMPUTE THE ADDRESS OF THE FIRST BYTE PAST THE 77976002
*                        SPACE OBTAINED BY THE GETMAIN.                 77984002
         LA    XLIM,O(XNEG,R1)  SUBTRACT ONE ITEM LENGTH AND CLEAR THE  77992002
*                               HIGH ORDER BYTE FOR THE BXLE LIMIT.     78000002
         ST    XCUR,HEADFREE   STORE THE HEAD OF THE CHAIN IT IS MAKING 78008002
*                              IN THE HEAD OF THE CHAIN IN FIXEDHDR.    78016002
*                              IT IS STORED DOWN HERE INSTEAD OF UP     78024002
*                              THERE BECAUSE IT GIVES THE MEMORY TIME   78032002
*                              TO REST, SO IT IS READY TO STORE AGAIN.  78040002
         LR    XPRED,XCUR      GET SET TO START THE BIG LOOP.           78048002
         SNIP                                                           78056002
         BXH   XCUR,XINC,BXLEND  THERE MIGHT BE ONLY ROOM FOR ONE.      78064002
         LA    R0,3  SEE IF THE FAST LOOP CAN BE USED, BY CHECKING THE  78072002
         NR    R0,XCUR  THE ITEM LENGTH TO SEE IF IT IS A MULTIPLE OF 4 78080002
         BC    8,FASTLOOP  BRANCH IF THE FAST LOOP CAN BE USED.         78088002
         SNIP                                                           78096002
BXLOOP   ST    XCUR,BWORK  STORE THE CURRENT ADDRESS TO STORE IT INTO   78104002
         MVC   O(4,XPRED),BWORK THE EDGE FIELD OF IT'S PREDECESSOR.     78112002
         LR    XPRED,XCUR       GET THE CURRENT ONE FOR NEXT TIME'S     78120002
*                               PREDECESSOR.                            78128002
         BXLE  XCUR,XINC,BXLOOP  LOOP CLOSURE.                          78136002
BXLEND   ST    HDB,BWORK  STORE THE EDGE FIELD FOR THE LAST VERTEX,     78144002
         MVC   O(4,XPRED),BWORK  WHICH HAS THE LEFT BIT ON AND GOES TO  78152002
*                                THE FIXED SPACE HEADER.                78160002
         LR    R1,XTRB  PUT THE ADDRESS OF THE EXTRA SPACE (IF ANY) IN  78168002
*                       REGISTER ONE FOR CONVENIENT REMEMBERING WHERE   78176002
*                       IT IS IN OTHER PLACES.                          78184002
         SNIP                                                           78192002
         BCR   15,LKR  HAVING FINISHED THIS LONG NARRATIVE, RETURN.     78200002
         CNOP  0,8   IT GOES MUCH FASTER WHEN IT IS ON A DOUBLE-WORD    78208002
*                    BOUNDARY.                                          78216002
FASTLOOP ST    XCUR,O(XNEG,XCUR)  BY USING THE NEGATIVE INDEX IT WORKS. 78224002
         BXLE  XCUR,XINC,FASTLOOP  LOOP CLOSURE.                        78232002
         SNIP                                                           78240002
         ST    HDB,O(XNEG,XCUR)  STORE THE LAST EDGE FIELD.             78248002
         ST    HDB,BWORK  STORE THE EDGE TO THE FIXEDHDR.               78256002
         LR    R1,XTRB  LOAD THE ADDRESS OF THE EXTRA SPACE.            78264002
         SNIP                                                           78272002
&SNIP    SETB  (0)  TURN OFF THE SNIP TRACE.                            78280002
         BCR   15,LKR  AND RETURN.                                      78288002
         DROP  XBBAS    DON'T NEED THIS ANY MORE.                       78296002
         DROP  HDB   USINGS ANY MORE.                                   78304002
         DROP  R15                                                      78312002
*---------------------------------------------------------------------* 78320002
* UPON RETURN, R1 HAS THE ADDRESS OF THE EXTRA SPACE, AND             * 78328002
* HDB, REGISTER 2, HAS THE ADDRESS OF THE FIXEDHDR.                   * 78336002
*********************************************************************** 78344002
         EJECT                                                          78352002
*********************************************************************** 78360002
* MISCELLANEOUS ROUTINES TO TAKE CARE OF THE BOUNDARY CONDITIONS FOR  * 78368002
* GSPACE, FOR EXAMPLE, THE TCBRPT WORD IS ZERO, OR THE REQUEST        * 78376002
* SUBPOOL IS NOT IN THE SPACE CONTROL SUBPOOL CHAIN, ETC..            * 78384002
*********************************************************************** 78392002
*                                                                     * 78400002
*********************************************************************** 78408002
* THE SPACE CONTROL AREA FOR THE REQUEST SUBPOOL HAS NOT YET BEEN SET * 78416002
* UP ON THE SPACE CONTROL AREA CHAIN ORIGINATING FROM THE TCBRPT WORD.* 78424002
* GO BACK TO THE SPACE CONTROL AREA FOR SUBPOOL ZERO, WHICH HAS TWO   * 78432002
* SAVE AREAS IN IT, AND SAVE THE REGISTERS IN IGASA1. THEN GET A SPACE* 78440002
* CONTROL AREA FOR THE NEW SUBPOOL AND CHAIN IT ON THE END OF THE     * 78448002
* EXISTING CHAIN.                                                     * 78456002
* THE LAST WORD IN THE CHAIN HAS THE ADDRESS OF THE SPACE CONTROL AREA* 78464002
* FOR SUBPOOL ZERO IN IT FOR EASE OF GETTING BACK THERE.              * 78472002
*********************************************************************** 78480002
      GODOWNTO SPACE                                                    78488002
GSP#GONE EQU   *  COME HERE WHEN THE SUBPOOL IS NOT THERE.              78496002
         L     R15,O(,R1)  LOAD THE ADDRESS OF THE SPACE CONTROL AREA  *78504002
                         FOR SUBPOOL ZERO.                              78512002
         USING IGASPCTL,R15                                             78520002
         STM   LKR,R12,(IGASA1+((4*LKR)+20-64*((2+LKR)/16)))  SAVE THE *78528002
                         REGISTERS IN SAVE AREA 1.                      78536002
         DROP  R15                                                      78544002
         LR    R2,R15    THE ADDRESS OF THE SPACE CONTROL AREA FOR     *78552002
                         SUBPOOL ZERO.                                  78560002
         USING IGASPCTL,R2                                              78568002
         LR    R4,R1     ADDRESS OF THE LAST 8-BYTE ENTRY ON THE SPACE *78576002
                         CONTROL AREA CHAIN.                            78584002
         LR    R1,R2     THE ADDRESS OF THE SPACE CONTROL AREA FOR     *78592002
                         SUBPOOL ZERO.                                  78600002
         BALR R12,O      ESTABLISH A BASE REGISTER FOR THIS SECTION.    78608002
NEWSPCTL EQU   *  USE THIS LABEL IN THE USING STATEMENTS.               78616002
         USING NEWSPCTL,R12                                             78624002
         L     LKR,=AL4(&IGANAME+&IGAGS8)  LOAD THE ADDRESS OF THE     *78632002
                         POINT TO GET 8 BYTES USING THE FIXEDHDR IN THE*78640002
                         SPACE CONTROL AREA FOR SUBPOOL ZERO.           78648002
         BALR  LKR,LKR   GET THE 8 BYTES.                               78656002
         LR    R8,R1     SAVE THE ADDRESS OF THE NEW 8-BYTE AREA.       78664002
         LA    R3,FOUR   SET THE BOUNDARY ALIGNMENT TO ALLOCATE SPACE  *78672002
                         ON 16-BYTE BOUNDARIES.                         78680002
         L     R6,IGASA1+((4*R0)+20-64*((2+R0)/16))  LOAD THE SUBPOOL  *78688002
                         AND REQUEST LENGTH.                            78696002
         LA    R0,&IGASPZ  THE SIZE OF A SPACE CONTROL AREA.            78704002
         ALR   R0,R6     ADD IN THE SUBPOOL FOR THE NEW SPACE CONTROL  *78712002
                         AREA.                                          78720002
         LA    R7,O(,R6)  CLEAR THE SUBPOOL BYTE.                       78728002
         SLR   R0,R7     SUBTRACT OUT THE REQUEST LENGTH.               78736002
       GETMAIN R,LV=(0)  GET THE SPACE FOR THE NEW SPACE CONTROL AREA.  78744002
         ICALL SETSPACE  SET UP THE NEW SPACE CONTROL AREA.             78752002
         SLR   R6,R7     MAKE THE SUBPOOL BYTE BE ALL BY ITSELF.        78760002
         ALR   R6,R1     ADD IN THE ADDRESS OF THE NEW SPACE CONTROL   *78768002
                         AREA FOR THE 8-BYTE ENTRY.                     78776002
         LR    R5,R2     GET THE ADDRESS OF THE SPACE CONTROL AREA FOR *78784002
                         SUBPOOL ZERO (NOTE THAT BIT 0 OF THE ADDRESS  *78792002
                         WORD IS A ONE).                                78800002
         STM   R5,R6,O(R8)  STORE THE NEW 8-BYTE ENTRY.                 78808002
         ST    R8,O(,R4)  STORE THE EDGE FIELD TO THE NEW 8-BYTE ENTRY. 78816002
         L     LKR,IGASA1+((4*LKR)+20-64*((2+LKR)/16))  RESTORE LKR.    78824002
         L     R15,=AL4(&IGANAME)  RESTORE THE ADDRESS OF THE BEGINNING*78832002
                         OF THE IGARPT01 MODULE.                        78840002
         LM    R0,R12,(IGASA1+((4*R0)+20-64*((2+R0)/16)))  RESTORE THE *78848002
                         REST OF THE REGISTERS.                         78856002
         DROP  R12                                                      78864002
         B     &IGAGSP.(,R15)  RE-ENTER THE ROUTINE AS IF NOTHING HAD  *78872002
                         HAPPENED.                                      78880002
         DROP  R2                                                       78888002
      GODOWNTO SPACE                                                    78896002
*********************************************************************** 78904002
* COME HERE TO SET UP THE SPACE CONTROL AREA FOR THE FIRST TIME.      * 78912002
*********************************************************************** 78920002
FIRST1   EQU   *   COME HERE FROM GSPACEB WHEN THE TCBRPT WORD IS ZERO. 78928002
         USING GSPACEB,R15  USE THE PREVIOUSLY ESTABLISHED             *78936002
                         ADDRESSABILITY.                                78944002
         AL    REQL,TWOTO8  ADD IN ENOUGH TO GET AT LEAST 256 BYTES FOR*78952002
                         A TEMPORARY WORK ARE.                          78960002
       GETMAIN R,LV=(0)  GET THE WORK AREA.                             78968002
         DROP  R15       GETMAIN CHANGES R15, SO IT NO LONGER HAS THE  *78976002
                         ADDRESS IN IT.                                 78984002
         BALR  R15,O     GET ANOTHER ADDRESS IN R15.                    78992002
         USING *,R15     AND USE IT FOR ADDRESSABILITY.                 79000002
         USING SAVEDSEK,R1  SAVE THE REGISTERS FROM THE CALLING PROGRAM 79008002
         STM   R13,R12,FORWARD  IN THE WORKAREA.                        79016002
         LR    R9,R1     GET THE ADDRESS OF THE TEMPORARY WORK AREA.    79024002
         DROP  R1  NOW USE R1 FOR THE ADDRESS OF THE TCBRPT WORD AGAIN. 79032002
         USING SAVEDSEK,R9  USE R9 FOR THE ADDRESS OF THE TEMPORARY    *79040002
                         WORK AREA.                                     79048002
      RPTDSECT GEN=(TCBRPTA,(R3))  GET THE ADDRESS OF THE TCBRPT WORD.  79056002
         LA    R1,SAVEFIN  GENERATE THE ADDRESS OF THE LIST IN THE WORK*79064002
                         AREA FOR GETMAIN.                              79072002
         DROP  R15                                                      79080002
         LA    0,&IGASPZ  GET THE LENGTH IN THE REGISTER SO IT WON'T   *79088002
                         GENERATE AN ADDRESSABILITY ERROR.              79096002
       GETMAIN EU,A=(1),LV=(0),SP=0,MF=(E,(1))  THE GETMAIN STORES THE *79104002
                         ADDRESS OF THE SPACE CONTROL AREA IN TCBRPT.   79112002
*********************************************************************** 79120002
* NOW SET UP REGISTERS 0, 1, 2, AND 3 FOR THE SETSPACE ROUTINE, WHICH * 79128002
* INITIALIZES THE SPACE CONTROL AREA. THIS TIME THE SUBPOOL IS ZERO,  * 79136002
* BECAUSE IF THERE ISN'T A SPACE CONTROL AREA FOR SUBPOOL ZERO IT IS  * 79144002
* VERY DIFFICULT TO MAINTAIN THE SPACE CONTROL SUBPOOL CHAIN.         * 79152002
*********************************************************************** 79160002
         BALR  R15,O     ESTABLISH ADDRESSABILITY.                      79168002
         USING *,R15                                                    79176002
         LM    R0,R1,O(R1)  LOAD THE LENGTH VALUE AND THE ADDRESS OF   *79184002
                         THE SPACE CONTROL AREA INTO REGISTERS R0 AND  *79192002
                         R1 RESPECTIVELY.                               79200002
         L     R2,=XL4'80000000'  MAKE BIT 0 OF R2 A ONE TO SET THE    *79208002
                         END-OF-CHAIN FLAG BIT IN SETSPACE.             79216002
         ALR   R2,R1     ADD IN THE ADDRESS OF THE SPACE CONTROL AREA  *79224002
                         FOR SUBPOOL ZERO.                              79232002
         ICALL SETSPACE  NOTE THAT SETSPACE BETTER NOT CHANGE REGISTER *79240002
                         9, OR TROUBLE WILL DEVELOP.                    79248002
         DROP  R15                                                      79256002
* NOW FREE UP THE WORK AREA, AFTER TRANSFERRING THE REGISTER CONTENTS * 79264002
* TO THE NEWLY ESTABLISHED SPACE CONTROL AREA.                        * 79272002
         ST    R1,GPR15  STORE THE ADDRESS OF THE SPACE CONTROL AREA   *79280002
                         FOR SUBPOOL ZERO.                              79288002
         LM    R13,R12,FORWARD  RESTORE THE REGISTERS ALMOST THE WAY   *79296002
                         THEY WERE BEFORE.                              79304002
         DROP  R9                                                       79312002
         STM   LKR,R12,(&IGASA0+((4*LKR)+20-64*((2+LKR)/16)))(R15)     *79320002
                         SAVE THE REGISTERS IN SAVE AREA 0 IN THE SPACE*79328002
                         CONTROL AREA.                                  79336002
         LR    LKR,R15   SAVE R15 FOR LATER.                            79344002
      FREEMAIN R,LV=(0),A=(1)                                           79352002
         LR    R1,LKR    NOW GET THE ADDRESS OF THE SPACE CONTROL AREA *79360002
                         FOR SUBPOOL ZERO IN R1.                        79368002
         L     LKR,(&IGASA0+((4*LKR)+20-64*((2+LKR)/16)))(,R1)         *79376002
                         RESTORE THE LINKAGE REGISTER FROM SAVE AREA 0 *79384002
                         IN THE SPACE CONTROL AREA.                     79392002
         BALR  R15,O     ESTABLISH ADDRESSABILITY.                      79400002
         USING *,R15                                                    79408002
         L     R15,=AL4(GSPACEB)  USE GSPACEB FOR THE BASE REGISTER.    79416002
         DROP  R15                                                      79424002
         USING GSPACEB,R15                                              79432002
         SL    REQL,X0100  SUBTRACT OUT THE X'100' THAT WAS ADDED TO   *79440002
                         THE REQUEST LENGTH TO GET A WORK AREA LARGE   *79448002
                         FOR A REGISTER SAVE AREA.                      79456002
         JMP   15,CHKSP#G  GO CHECK THE REQUEST SUBPOOL AGAINST ZERO.   79464002
         DROP  R15                                                      79472002
         EJECT                                                          79480002
*********************************************************************** 79488002
* ROUTINE TO SET UP THE SPACE CONTROL AREA. UPON ENTRY TO SETSPACE THE* 79496002
* REGISTERS HAVE THE FOLLOWING CONTENTS:                              * 79504002
*        R0    THE SUBPOOL # FOR THE AREA AND IT'S LENGTH.            * 79512002
*        R1    THE ADDRESS OF THE AREA TO BE SET UP.                  * 79520002
*        R2    THE ADDRESS OF THE SPACE CONTROL AREA FOR SUBPOOL ZERO,* 79528002
*              OR THE ZERO FOR THE INITIAL ALLOCATION.                * 79536002
*        R3    THE POWER OF TWO TO USE FOR ROUNDING REQUESTS BEFORE   * 79544002
*              THEY ARE SERVED. FOR EXAMPLE, IF R3 CONTAINS A 4 A     * 79552002
*              SIXTEEN-BYTE BOUNDARY IS IMPLIED. THIS NUMBER IS       * 79560002
*              TRANSLATED TO THE COMPLEMENT OF TWO RAISED TO THE POWER* 79568002
*              IN R3, AND THEN STORED IN IGAROUND IN THE SPACE CONTROL* 79576002
*              AREA.                                                  * 79584002
*        R15   THE ADDRESS OF SETSPACE.                               * 79592002
*        LKR   THE RETURN ADDRESS.                                    * 79600002
*********************************************************************** 79608002
      GODOWNTO SPACE                                                    79616002
SETSPACE EQU   *         ENTER HERE.                                    79624002
         USING SETSPACE,R15                                             79632002
         USING IGASPCTL,R1  ESTABLISH ADDRESSABILITY TO THE AREA.       79640002
         XC    IGASPCTL(X'40'),IGASPCTL  ZERO OUT THE FIRST PART OF THE*79648002
                         SPACE CONTROL AREA.                            79656002
         ST    R0,IGASPLNG  STORE THE SUBPOOL AND LENGTH OF THE SPCA.   79664002
         LA    R3,B'00010000'  GET THE POWER OF TWO TO BE USED FOR     *79672002
                         ROUNDING REQUEST LENGTHS.                      79680002
         LCR   R3,R3     TAKE THE COMPLEMENT.                           79688002
         STM   R2,R3,IGASPEDG  STORE THE EDGE FIELD FOR THE SUBPOOL    *79696002
                         CHAIN AND THE MASK FOR IGAROUND.               79704002
         LA    R4,IGASA0  CHAIN THE SAVE AREAS IN A MEANINGFUL WAY.     79712002
         LA    R5,IGASA1  XX                                            79720002
         ST    R5,(FORWARD-SAVEDSEK+IGASA0)  STORE THE FORWARD CHAIN   *79728002
                         EDGE FIELD IN THE FIRST SAVE AREA.             79736002
         ST    R4,(IGASA1+BACKWARD-SAVEDSEK)  STORE THE BAKPATH CHAIN  *79744002
                         EDGE FIELD.                                    79752002
         LA    R6,IGAS8  GET THE ADDRESS OF THE 8-BYTE FIXEDHDR.        79760002
         AL    R6,=XL4'80000000'  TURN ON THE HIGH ORDER BIT FOR GSPACE*79768002
                         SO THE REQUEST IS A CONDITIONAL REQUEST.       79776002
         USING FIXEDHDR,R6                                              79784002
         MVC  HEADFREE(SIXTEEN),=XL16'00000000000001000000000800000000' 79792002
         LR    R7,R0     PUT THE SUBPOOL # IN THE FXREFILL FIELD.       79800002
         SRL   R7,24     ALIGN IT FIRST.                                79808002
         STC   R7,FXREFILL     STORE IT INTO THE REFILL SUBPOOL FIELD.  79816002
         MVC   FXREFILL+X'10'(X'20'),FXREFILL  PROPAGATE THE SIXTEEN   *79824002
                         BYTES INTO THE OTHER TWO FIXEDHDR AREAS.       79832002
         ST    R6,HEADFREE     FILL IN THE HEAD OF THE FREE SPACE CHAIN 79840002
         AL    R6,=XL4'00000010'  STEP DOWN TO THE 12-BYTE FIXEDHDR.    79848002
         MVI   FIXDRECL+3,TWELVE  PUT IN THE LENGTH.                    79856002
         MVI   FXREFILL+TWO,SIXTEEN  MAKE THE REFILL SIZE 4K.           79864002
         DROP  R1        NOW FILL IN THE HEAD OF THE VERTEX FREE SPACE *79872002
                         CHAIN FOR THE TYPE 9 RADIX PARTITION TREE.     79880002
         USING IGARPTH,R1      XX                                       79888002
         ST    R6,IGAHVFC      STORE THE HEAD OF THE CHAIN.             79896002
         STC   R7,IGA9FILL  STORE THE SUBPOOL NUMBER FOR THE SPACE     *79904002
                         CONTROL AREA.                                  79912002
         MVI   IGA9FILL+TWO,SIXTEEN  MAKE THE REFILL SIZE 4K.           79920002
         DROP  R1        GO BACK TO THE OTHER USING NOW,                79928002
         USING IGASPCTL,R1  AND FILL IN THE OTHER FIXEDHDR.             79936002
         ST    R6,HEADFREE     STORE THE HEAD OF THE CHAIN.             79944002
         AL    R6,=XL4'00000010'  STEP DOWN TO THE 80-BYTE FIXEDHDR.    79952002
         ST    R6,HEADFREE     STORE THE EMPTY HEAD.                    79960002
         MVI   FIXDRECL+3,EIGHTY       FILL IN THE INTERNAL LENGTH.     79968002
         MVI   FXREFILL+TWO,EIGHT  MAKE THE REFILL SIZE EQUAL TO       *79976002
                         X'0800'.                                       79984002
GRJBGGL EQU ((SETSPACE-&PROGRAM)-(X'100'*((SETSPACE-&PROGRAM)/X'100'))) 79992002
FIGLFUJ  EQU   ((X'100'-GRJBGGL)*((GRJBGGL*2)/(GRJBGGL+1)))             80000002
         AL   R15,=AL1(X'08',X'FF',X'100'-((SETSPACE-&PROGRAM)/X'100')+-80008002
               0-((GRJBGGL*2)/(GRJBGGL+1)),FIGLFUJ)                     80016002
* FILL IN THE NINE FOR THE TYPE 9 RPT FLAG BYTE AND FILL IN THE       * 80024002
* ADDRESS OF THE BASE OF THE MODULE IGARPT01.                         * 80032002
         DROP  R1                                                       80040002
         USING IGARPTH,R1                                               80048002
         ST    R15,IGADDR      STORE IN THE ADDRESS.                    80056002
         MVI   IGAKEYL+ONE,THREE  FILL IN THE LENGTH OF THE KEY.        80064002
         MVI   IGAKEYI+ONE,ONE  SET THE KEY INDEX TO ONE.               80072002
         BR    LKR       RETURN TO FROM WHENCE IT CAME.                 80080002
         DROP  R1                                                       80088002
         DROP  R6                                                       80096002
         DROP  R15                                                      80104002
      GODOWNTO SPACE                                                    80112002
*********************************************************************** 80120002
     COLLECT                                                            80128002
         LTORG *                                                        80136002
         EJECT                                                          80144002
         AIF   (NOT &SNAP).SKPSNAP                                      80152002
*********************************************************************** 80160002
* THE FOLLOWING SUBROUTINE PRODUCES A FORMATTED DISPLAY OF A TYPE 8 OR* 80168002
* TYPE 9 RADIX PARTITION TREE. THE DISPLAY IS WRITTEN ON THE DATA SET * 80176002
* NAMED SNAPOUT. THE DD CARD FOR SNAPOUT SHOULD HAVE LRECL=121 CODED, * 80184002
* AND THE BLKSIZE CAN BE SET TO 121 TO GET THE LAST LINE OF FORMATTED * 80192002
* DISPLAY BEFORE THE ONE THAT HANGS UP THE DISPLAY ROUTINE IF THERE   * 80200002
* ARE PROBLEMS WITH THE TREE.                                         * 80208002
*********************************************************************** 80216002
&IGASPIE SETB  (0)  TURN THE JUMP TRACE OFF.                            80224002
X        EQU   8                                                        80232002
Y        EQU   9                                                        80240002
Z        EQU   10                                                       80248002
DSPRPT   NTR   RASS=0,BR=R11,LV=80,R1=(R5),MODE=GETMAIN                 80256002
         LR    R1,R5                                                    80264002
DSPMORE  EQU   *                                                        80272002
         LR    R5,R1                                                    80280002
         L     0,CONTRSPY                                               80288002
         CL    0,CNT                                                    80296002
         BC    2,DSPBACK                                                80304002
         USING IGARPTH,R5                                               80312002
SNAPOPEN BC    0,DSPKIPS       BRANCH IF SNAPOUT IS ALREADY OPEN.       80320002
         OPEN  (OUTDCB,(OUTPUT))                                        80328002
         OI    SNAPOPEN+1,X'F0'  SET IT OPEN FROM NOW ON.               80336002
DSPKIPS  EQU   *                                                        80344002
*********************************************************************** 80352002
*  DISPLAY THE BLOCK CHAIN OF SPACE OBTAINED VIA GETMAIN.             * 80360002
*********************************************************************** 80368002
TRYTREE EQU *                                                           80376002
*********************************************************************** 80384002
*    DISPLAY THE CONTENTS OF THE TREE HEADER.                         * 80392002
*********************************************************************** 80400002
         L     R2,=AL4(HDRDSP)                                          80408002
         PUT   OUTDCB,0(0,R2)                                           80416002
       SHOWHEX TO=HADDR,FROM=IGADDR,N=4                                 80424002
DSPHEX   EQU   IGADSPHX                                                 80432002
         SHOWHEX TO=HAPT,FROM=APT,N=4                                   80440002
     SHOWHEX   TO=HP,FROM=AP,N=4                                        80448002
       SHOWHEX TO=HC,FROM=AC,N=4                                        80456002
         SHOWHEX FROM=FARG,TO=HFARG,N=4                                 80464002
       SHOWHEX TO=HHVFC,FROM=IGAHVFC,N=4                                80472002
       SHOWHEX TO=HKEYL,FROM=IGAKEYL,N=2                                80480002
         SHOWHEX TO=HOFF,FROM=OFFSET,N=2                                80488002
         SHOWHEX TO=HHVFC,FROM=HVFC,N=4                                 80496002
       SHOWHEX TO=HMAX,FROM=IGAMAX,N=4                                  80504002
       SHOWHEX TO=HVALUE,FROM=IGAVALUE,N=4                              80512002
         PUT   OUTDCB,HDRCON                                            80520002
         IC    R1,PATH   DISPLAY THE BITS IN THE PATH BYTE.             80528002
         N     R1,=XL4'0000000F'                                        80536002
         SLL   R1,2      MULTIPLY BY FOUR.                              80544002
         AL    R1,=AL4(HEX)                                             80552002
         MVC   HPATH+2(4),0(R1)                                         80560002
*********************************************************************** 80568002
*  DISPLAY THE FIXEDHDR FOR THE INNER VERTEX SPACE AND THE BLOCK CHAIN* 80576002
*********************************************************************** 80584002
         L     X,IGAHVFC       ADDRESS OF FIXEDHXR.                     80592002
         USING FIXEDHDR,X                                               80600002
       SHOWHEX TO=HHDFREE,FROM=HEADFREE,N=4                             80608002
       SHOWHEX FROM=FXREFILL,TO=HFXR,N=4                                80616002
       SHOWHEX TO=HFXDRCL,FROM=FIXDRECL,N=4                             80624002
       SHOWHEX TO=HBLKHD,FROM=BLOKHEAD,N=4                              80632002
         PUT   OUTDCB,HFIXD0   DISPLAY THE FIXEDHDR.                    80640002
         PUT   OUTDCB,HBLOK00          BLOCK CHAIN TRACE MESSAGE.       80648002
         L     X,BLOKHEAD      GET THE ADDRESS OF THE FIRST BLOCKHDR.   80656002
         DROP  X                                                        80664002
         USING BLOCKHDR,X                                               80672002
         BC    15,HBLOKN       GO TEST FOR THE END OF THE CHAIN.        80680002
HBLOKLUP EQU   *                                                        80688002
       SHOWHEX TO=HBEDGE,FROM=BEDGE,N=4                                 80696002
       SHOWHEX TO=HBSPL,FROM=BSPL,N=4                                   80704002
       SHOWHEX TO=HBADR,FROM=BADR,N=4                                   80712002
         PUT   OUTDCB,HBLOKHED   WRITE OUT THE BLOCK CHAIN ELEMENT.     80720002
         L     X,BEDGE   LOAD NEXT EDGE IN THE BLOCK CHAIN.             80728002
HBLOKN   EQU   *                                                        80736002
         LTR   X,X                                                      80744002
         BC    7,HBLOKLUP                                               80752002
         DROP  X                                                        80760002
         TM    PATH,P1000      SEE IF THERE ARE LESS THAN TWO SINKS.    80768002
         BC    8,DSPRPTZ       BRANCH IF SO.                            80776002
         L     X,APT     SET X, Y, AND Z TO THE SOURCE OF               80784002
         LR    Y,X       THE RADIX PARTITION TREE.                      80792002
         L     R2,=AL4(DSPRPT0)                                         80800002
         PUT   OUTDCB,0(0,R2)                                           80808002
         L     R2,=AL4(DSPRPT1)                                         80816002
         PUT   OUTDCB,0(0,R2)                                           80824002
*********************************************************************** 80832002
* DISPLAY THE INNER VERTEX Y, TOGETHER WITH IT'S PREDECESSOR, AND     * 80840002
* LEFT AND RIGHT SUCCESSORS, IN ABSOLUTE ADDRESSES. ALSO DISPLAY ALL  * 80848002
* OF THE FLAG FIELDS.                                                 * 80856002
* THE DISPLAY ONLY ASSUMES THAT X AND Y ARE VALID, SINCE IT           * 80864002
* GENERATES THE SUCCESSOR VERTICES BEFORE THE DISPLAY.                * 80872002
*********************************************************************** 80880002
DSPRA    EQU   *                                                        80888002
         ST    Y,DTMP                                                   80896002
         LA    R1,VERTEX                                                80904002
         LA    R2,DTMP+1                                                80912002
         LA    R3,3                                                     80920002
         ICALL DSPHEX                                                   80928002
*---------------------------------------------------------------------- 80936002
         LA    R1,DBYTE                                                 80944002
 LA      R2,BYTEI(Y)     BYTE INDEX.                                    80952002
         LA    R3,1                                                     80960002
         ICALL DSPHEX                                                   80968002
*---------------------------------------------------------------------- 80976002
         IC    R3,FLAGS(Y)                                              80984002
         SRL   R3,5                                                     80992002
         SLL   R3,2                                                     81000002
         AL    R3,=AL4(DSPTAB)                                          81008002
         MVC   DBIT(3),0(R3)                                            81016002
*---------------------------------------------------------------------- 81024002
         MVI   DRL,C'0'                                                 81032002
         BIV0  Y,DSPGONE                                                81040002
         MVI   DRL,C'1'                                                 81048002
DSPGONE  EQU   *                                                        81056002
*---------------------------------------------------------------------- 81064002
         MVI   DC0,C'0'                                                 81072002
         TM    FLAGS(Y),IGANEBIT  TEST THE BIT TO SEE IF UNEQUALS THERE 81080002
         BC    8,DSPGO2                                                 81088002
         MVI   DC0,C'1'                                                 81096002
DSPGO2   EQU   *                                                        81104002
*---------------------------------------------------------------------- 81112002
         MVI   DC1,C'1'                                                 81120002
         TM    FLAGS(Y),IGAQBIT                                         81128002
         BC    1,DSPGO3                                                 81136002
         MVI   DC1,C'0'                                                 81144002
DSPGO3   EQU   *                                                        81152002
*---------------------------------------------------------------------- 81160002
         MVI   DT0,C'0'                                                 81168002
         BT00  Y,DSPGO4                                                 81176002
         MVI   DT0,C'1'                                                 81184002
DSPGO4   EQU   *                                                        81192002
*---------------------------------------------------------------------- 81200002
         MVI   DT1,C'0'                                                 81208002
         BT10  Y,DSPGO5                                                 81216002
         MVI   DT1,C'1'                                                 81224002
DSPGO5   EQU   *                                                        81232002
*---------------------------------------------------------------------- 81240002
       SHOWHEX N=4,TO=LATTICEV,FROM=VALUE(Y)                            81248002
*---------------------------------------------------------------------* 81256002
 ST      X,DTMP                                                         81264002
         LA    R1,DANTE                                                 81272002
         LA    R2,DTMP+1                                                81280002
 LA      R3,3                                                           81288002
         ICALL DSPHEX                                                   81296002
*---------------------------------------------------------------------- 81304002
         BT01  Y,DSPINT                                                 81312002
 G0ES    X,Y,Z                                                          81320002
         MVC   LSINK(8),0(Z)   DISPLAY LEFT SINK CONTENTS.              81328002
 BC      15,DSPCOM                                                      81336002
DSPINT   TLEF  X,Y,Z                                                    81344002
         MVC   LSINK(8),=CL8' '        BLANK OUT LEFT SINK CONTESTS.    81352002
DSPCOM   ST    Z,DTMP                                                   81360002
         LA    R1,DLEFT                                                 81368002
         LA    R3,3                                                     81376002
         ICALL DSPHEX                                                   81384002
*---------------------------------------------------------------------- 81392002
         BT11  Y,DSPORG                                                 81400002
         G1ES  X,Y,Z                                                    81408002
         MVC   RSINK(8),0(Z)   DISPLAY RIGHT CONTENTS.                  81416002
         BC    15,DSPTOR                                                81424002
DSPORG   TREF  X,Y,Z                                                    81432002
         MVC   RSINK(8),=CL8' '        BLANK OUT RIGHT SINK CONTENTS.   81440002
DSPTOR   EQU   *                                                        81448002
 ST      Z,DTMP                                                         81456002
         LA    R1,DRIGHT                                                81464002
         LA    R3,3                                                     81472002
         ICALL DSPHEX                                                   81480002
*---------------------------------------------------------------------- 81488002
         LR    R2,Y                                                     81496002
         LA    R1,CONTENTS     DISPLAY THE ACTUAL CONTENTS AT VERTEX.   81504002
    LA  R3,8                                                            81512002
         ICALL  DSPHEX                                                  81520002
*---------------------------------------------------------------------- 81528002
         PUT   OUTDCB,DSPRPT2                                           81536002
*********************************************************************** 81544002
*  RESUME THE LEFT LIST SCAN.    ************************************** 81552002
*********************************************************************** 81560002
         BT00  Y,DSPRB   BRANCH IF Y'S LEFT SUCCESSOR IS A SINK.        81568002
         TLEF  X,Y,Z,CYCLE=YES                                          81576002
         BC    15,DSPRA                                                 81584002
DSPRB    BT10  Y,DSPRC   BRANCH IF Y HAS NOT AN INNER RIGHT SUCCESSOR.  81592002
         TREF  X,Y,Z,CYCLE=YES                                          81600002
         BC    15,DSPRA                                                 81608002
DSPRC    BIV0  Y,DSPRD   BRANCH IF Y IS A LEFT SUCCESSOR.               81616002
         TREB  X,Y,Z,CYCLE=YES                                          81624002
         BC    15,DSPRC                                                 81632002
DSPRD    EQU   *                                                        81640002
*********************************************************************** 81648002
* CHECK TO SEE IF THE SOURCE HAS BEEN REACHED FROM A RIGHT SUCCESSOR, * 81656002
* FOR WHEN THIS HAPPENS THE SCAN IS COMPLETELY FINISHED.              * 81664002
*********************************************************************** 81672002
         LA    X,0(0,X)  CLEAR THE LEFT BYTE TO CHECK.                  81680002
         LA    Y,0(0,Y)        LIKEWISE.                                81688002
         CLR   X,Y       CHECK FOR THE SOURCE DONE.                     81696002
         BC    8,DSPRPT9       END IS SO.                               81704002
         TLEB  X,Y,Z,CYCLE=YES                                          81712002
         BC    15,DSPRB                                                 81720002
DSPRPTZ  EQU   *                                                        81728002
         TM    PATH,P0001      SEE IF THERE IS AT LEAST ONE SINK.       81736002
         BC    1,DSPRPT4       DISPLAY IT IF THERE IS.                  81744002
         MVC   OUT(10),=CL10'EMPTY TREE'                                81752002
         BC    15,DSPRPT8                                               81760002
DSPRPT4  MVC   OUT(10),=CL10'ONE SINK.'                                 81768002
       SHOWHEX TO=OUT+12,FROM=0(R5),N=12                                81776002
         L     Z,APT     DISPLAY THE CONTENTS.                          81784002
         MVC   RSINK(8),0(Z)   MOVE THE CONTENTS OUT.                   81792002
DSPRPT8  PUT   OUTDCB,OUT0     DISPLY THE MESSAGE.                      81800002
         MVC   OUT(120),=CL120' '      BLANK OUT THE PRINT AREA.        81808002
DSPRPT9  EQU   *                                                        81816002
DSPBACK  EQU   *                                                        81824002
         AGO   .FICKLE                                                  81832002
*********************************************************************** 81840002
* TEST THE RECORD FREE SPACE CHAIN FOR VALIDITY.                      * 81848002
*********************************************************************** 81856002
         CLI   IGADDR,X'08'    ONLY DO THIS FOR TYPE 8 TREES.           81864002
         JMP   7,FECKLESS      BRANCH IF IT ISN'T A TYPE 8 RPT.         81872002
         TM    IGARECL,X'80'   SEE IF THE RECORD LENGTH IS VARIABLE.    81880002
         JMP   1,FECKLESS      BRANCH IF IT IS.                         81888002
         L     R1,HRFC   LOAD THE ADDRESS OF THE FIXEDHDR.              81896002
         LTR   R1,R1     SEE IF THERE IS A RECORD SPACE CHAIN.          81904002
         JMP   10,FECKLESS     BRANCH IF THERE ISN'T.                   81912002
         USING FIXEDHDR,R1                                              81920002
         L     R15,HEADFREE    GET THE HEAD OF THE BLOCK CHAIN.         81928002
         LR    R0,R15    SAVE THE PREDECESSOR OF EACH ONE.              81936002
         LTR   R15,R15   SEE IF THIS IS THE EMPTY CHAIN.                81944002
         JMP   2,KEEPITUP      BRANCH IF IT ISN'T THE EMPTY CHAIN.      81952002
         CL    R15,HRFC  CHECK THE TAIL.                                81960002
         JMP   8,FECKLESS      BRANCH IF IT IS OK.                      81968002
         DC    XL2'0D00' INVALID CHAIN, CAUSE THE PROGRAM INTERRUPT.    81976002
KEEPITUP EQU   *         KEEP IT UP.                                    81984002
         L     R2,BLOKHEAD     LOAD THE ADDRESS OF THE HEAD OF THE      81992002
*                              BLOCK CHAIN FROM THE FIXEDHDR.           82000002
         USING BLOCKHDR,R2                                              82008002
KEEPDOWN LM    R2,R4,O(R2)     LOAD THE WHOLE BLOCKHDR.                 82016002
         LA    R3,O(R3,R4)     GET THE ADDRESS OF THE LAST              82024002
         BCTR  R4,O            BYTE IN THE BLOCK.                       82032002
         SLR   R3,R15    NOW TEST TO SEE IF THE ADDRESS IN REGISTER 15  82040002
         SLR   R4,R15    IS GREATER THAN OR EQUAL TO THE ADDRESS IN R3  82048002
         XR    R3,R4     AND IS LESS THAN THE ADDRESS OF THE SPACE      82056002
         LTR   R3,R3     JUST PAST THE BLOCK DEFINED.                   82064002
         JMP   4,DOWNHERE      BRANCH IF IT IS WITHIN LIMITS.           82072002
         LTR   R2,R2     IT ISN'T IN THAT BLOCK, TRY THE NEXT BLOCK.    82080002
         JMP   7,KEEPDOWN      (IF THERE IS A NEXT BLOCK)               82088002
         DC    XL2'0D00' HERE IS THE PROGRAM INTERRUPT FOR INVALID      82096002
*                        RECORD FREE SPACE CHAIN.                       82104002
DOWNHERE LR    R0,R15    IT WAS IN THE BLOCK, NOW LET'S GET THE NEXT    82112002
         L     R15,O(O,R15)    FREE SPACE CHAIN ADDRESS AND CHECK IT.   82120002
         LTR   R15,R15   SEE IF IT IS THE END OF THE CHAIN.             82128002
         JMP   2,KEEPITUP      THERE IS A NEXT ONE, CHECK IT.           82136002
         CL    R15,HRFC        THERE IS NO NEXT ONE, CHECK TO SEE IF    82144002
         JMP   8,FECKLESS      THE TAIL IS CORRECT.                     82152002
         DC    XL2'0D00'       IT ISN'T, HERE IS ITS PROGRAM INTERRUPT. 82160002
         DROP  R2                                                       82168002
         DROP  R2                                                       82176002
.FICKLE  ANOP                                                           82184002
FECKLESS EQU   *         COME HERE ALL YOU FEARLESS READERS.            82192002
         LEAF  MODE=FREEMAIN                                            82200002
         DROP  R11                                                      82208002
         DROP  R5                                                       82216002
DSPRPT2  DC    CL1' '                                                   82224002
VERTEX   DC    CL6' '                                                   82232002
         DC    CL2' '                                                   82240002
DBYTE    DC    CL2' '                                                   82248002
         DC    CL2' '                                                   82256002
DBIT     DC    CL3' '                                                   82264002
         DC    CL2' '                                                   82272002
DC0      DC    CL1' '    THE E-BIT.                                     82280002
         DC    CL2' '                                                   82288002
DC1      DC    CL1' '    THE Q-BIT.                                     82296002
         DC    CL2' '                                                   82304002
DRL      DC    CL1' '    THE RL BIT.                                    82312002
         DC    CL2' '                                                   82320002
DT0      DC    CL1' '                                                   82328002
         DC    CL2' '                                                   82336002
DT1      DC    CL1' '                                                   82344002
         DC    CL3' '                                                   82352002
DANTE    DC    CL6' '                                                   82360002
         DC    CL5' '                                                   82368002
DLEFT    DC    CL6' '                                                   82376002
         DC    CL4' '                                                   82384002
DRIGHT   DC    CL6' '                                                   82392002
         DC    CL2'  '                                                  82400002
CONTENTS DC    CL8'XXXXXXXX'  THE ACTUAL CONTENTS OF WORD Y.            82408002
         DC    CL8'XXXXXXXX'  LEAVE ROOM FOR THE CONTENTS DISPLAY.      82416002
         DC    CL1' '                                                   82424002
LATTICEV DC    CL8' '  THE SEMILATTICE VALUE.                           82432002
         DC    CL1' '                                                   82440002
LSINK    DC    CL16' ' THE CONTENTS OF THE LEFT SINK.                   82448002
         DC    CL1' '                                                   82456002
RSINK    DC    CL16' ' THE CONTENTS OF THE RIGHT SINK.                  82464002
         DC    CL70' '                                                  82472002
         CNOP  0,4                                                      82480002
DTMP     DC    XL4'0'                                                   82488002
HDRCON   DC    CL1' '                                                   82496002
HADDR    DC    CL9' '                                                   82504002
HAPT     DC    CL9' '                                                   82512002
HP       DC    CL9' '                                                   82520002
HC       DC    CL9' '                                                   82528002
HFARG    DC    CL9' '                                                   82536002
HSARG    DC    CL9' '                                                   82544002
HINSARG  DC    CL9' '                                                   82552002
HHVFC    DC    CL9' '                                                   82560002
HHRFC    DC    CL9' '                                                   82568002
HRECL    DC    CL9' '                                                   82576002
HKEYL    DC    CL5' '                                                   82584002
HOFF     DC    CL5' '                                                   82592002
HMAX     DC    CL9' '                                                   82600002
HVALUE   DC    CL9' '                                                   82608002
         DC    CL1' '                                                   82616002
HTSP     DC    CL9' '                                                   82624002
HRSP     DC    CL9' '                                                   82632002
         DC    CL10' '                                                  82640002
HDRDSP1  DC    CL1'0'                                                   82648002
HPATH    DC    CL4' '                                                   82656002
         DC    CL80' '                                                  82664002
HFIXD0   DC    CL1'0'                                                   82672002
         DC    CL26'FIXEDHDR FOR INNER SPACE. '                         82680002
         DC    CL9'HEADFREE='                                           82688002
HHDFREE  DC    CL8' '                                                   82696002
         DC    CL11', FXREFILL='                                        82704002
HFXR     DC    CL8' '                                                   82712002
         DC    CL11', FIXDRECL='                                        82720002
HFXDRCL  DC    CL8' '                                                   82728002
         DC    CL11', BLOKHEAD='                                        82736002
HBLKHD   DC    CL8' '                                                   82744002
         DC    CL40' '                                                  82752002
HBLOK00  DC    CL20'0BLOCK CHAIN TRACE.'                                82760002
         DC    CL101' '                                                 82768002
HBLOKHED DC    CL7'0BEDGE='                                             82776002
HBEDGE   DC    CL8' '                                                   82784002
         DC    CL7', BSPL='                                             82792002
HBSPL    DC    CL8' '                                                   82800002
         DC    CL7', BADR='                                             82808002
HBADR    DC    CL8' '                                                   82816002
         DC    CL80' '                                                  82824002
CNT      DC    F'0'                                                     82832002
NUM      DC    F'256'    NUMBER OF BRANCHES TO STACK.                   82840002
CONTRSPY DC    XL4'00000000'  NUMBER OF BRANCHES BEFORE ACTIVIATING     82848002
*                             THE RPT DISPLAY ROUTINES.                 82856002
         CNOP  0,4                                                      82864002
HEAD     DC    XL4'00'                                                  82872002
         CNOP  0,4                                                      82880002
OUTDCB   DCB   DSORG=PS,MACRF=(PM),BLKSIZE=121,LRECL=121,              X82888002
               RECFM=FB,EODAD=ERROR,DDNAME=SNAPOUT                      82896002
SNAPOUT  EQU   OUTDCB                                                   82904002
         LTORG *                                                        82912002
OUT0     DC    CL1'0'                                                   82920002
OUT      DC    CL121' '                                                 82928002
SAVE1    DC    18F'0'                                                   82936002
SAVE2    DC    18F'0'                                                   82944002
ERROR    EQU   *                                                        82952002
DSPRPT0  DC    CL1'0'                                                   82960002
         DC    CL7'VERTEX '                                             82968002
         DC    CL9'  INDEX  '                                           82976002
         DC    CL15' NE Q RL T0 T1 '                                    82984002
         DC    CL12'PREDECESSOR '                                       82992002
         DC    CL9'  LEFT   '                                           83000002
         DC    CL9'  RIGHT  '                                           83008002
         DC    CL6' '                                                   83016002
        DC CL10' CONTENTS '                                             83024002
         DC    CL10'  LATTICE'                                          83032002
         DC    CL60' '                                                  83040002
DSPRPT1  DC    CL1' '                                                   83048002
         DC    CL7' '                                                   83056002
         DC    CL9'BYTE BIT '                                           83064002
         DC    CL15' '                                                  83072002
         DC    CL12' '                                                  83080002
         DC    CL9'SUCCESSOR'                                           83088002
         DC    CL10' SUCCESSOR'                                         83096002
         DC    CL16' '                                                  83104002
         DC  CL10'   VALUE  '                                           83112002
         DC    CL59' '                                                  83120002
HDRDSP   DC    CL1'0'    DOUBLE SPACE.                                  83128002
         DC    CL9' ADDRESS '                                           83136002
         DC    CL9' SOURCE '                                            83144002
         DC    CL9'   AP    '                                           83152002
         DC    CL9'   AC    '                                           83160002
         DC    CL9'  FARG   '                                           83168002
         DC    CL9'  SARG   '                                           83176002
         DC    CL9' INSARG  '                                           83184002
         DC    CL9'  HVFC   '                                           83192002
         DC    CL9'  HRFC   '                                           83200002
         DC    CL9'  RECL   '                                           83208002
         DC    CL5'KEYL '                                               83216002
         DC    CL5'KEYI '                                               83224002
         DC    CL9'IGAMAX  '                                            83232002
         DC    CL9'IGAVALUE '                                           83240002
         DC    CL5' '  SLOP.                                            83248002
         DC    CL9'RECSPACE '                                           83256002
         DC    CL9'  HVFC   '                                           83264002
         DC    CL10' '                                                  83272002
HEX      DC    CL32'00000001001000110100010101100111'                   83280002
         DC    CL32'10001001101010111100110111101111'                   83288002
DSPTAB   DC    CL32'000 001 010 011 100 101 110 111'                    83296002
.SKPSNAP ANOP                                                           83304002
         AGO   .NOT24                                                   83312002
.NOT24   ANOP                                                           94696002
         END                                                            94704002
