*DECK,NRODMIP 
*CALL COMUSETXT 
USETEXT AAMMIPB ; 
PROC NRO$MIP; 
      BEGIN 
                                                                         UPDTDMP
                                                                         UPDTDMP
     XREF BEGIN                                                          UPDTDMP
                                                                         UPDTDMP
                                                                         UPDTDMP
          PROC CONS$AA ; # SHOULD BE CONS$AA #                           UPDTDMP
          PROC KRAK$MP ;                                                 UPDTDMP
          PROC UPLV$MP ;                                                 UPDTDMP
          PROC MUVW$AA ; # SHOULD BE MUVW$AA #                           UPDTDMP
          PROC DNLV$MP ;                                                 UPDTDMP
          PROC UNFX$AA ; # SHOULD BE UNFX$AA #                           UPDTDMP
          PROC MOVC$AA ; # SHOULD BE MOVC$AA #                           UPDTDMP
          PROC CPCH$AA ; # SHOULD BE CPCH$AA #                           UPDTDMP
          PROC MOVW$AA ; # SHOULD BE MOVW$AA #                           UPDTDMP
          PROC RPOS$MP ;                                                 UPDTDMP
          PROC RPGT$AA ; # SHOULD BE RPGT$AA #                           UPDTDMP
          PROC GOKY$MP ;                                                 UPDTDMP
          PROC SEBL$AA ; # SHOULD BE SEBL$AA #                           UPDTDMP
          PROC NUBL$AA ; # SHOULD BE NUBL$AA #                           UPDTDMP
          PROC CURR$AA ; # SHOULD BE CURR$AA #                           UPDTDMP
          PROC GOFI$AA ; # SHOULD BE GOFI$AA #                           UPDTDMP
          PROC SKPF$AA ; # SHOULD BE SKPF$AA #                           UPDTDMP
          PROC RCKN$AA ; # SHOULD BE RCKN$AA #                           UPDTDMP
          PROC RPPT$AA ; # SHOULD BE RPPT$AA #                           UPDTDMP
          PROC PTRP$IS ; # SHOULD BE PTRP$IS #                           UPDTDMP
          PROC XXUR$AA ; # SHOULD BE XXUR$AA #                           UPDTDMP
          PROC DLTE$IS ; # SHOULD BE DLTE$IS #                           UPDTDMP
          PROC STMD$AA ; # SHOULD BE STMD$AA #                           UPDTDMP
          FUNC SPAR$MP B;                                                GBK0204
          FUNC NULK$MP ;                                                 GAG1103
          FUNC LWAD$AA; # SHOULD BE LWAD$AA #                            UPDTDMP
          PROC LEVL$MP ;                                                 UPDTDMP
          PROC WKKY$IS ; # SHOULD BE WKKY$IS #                           UPDTDMP
          PROC TROW$AA ; # SHOULD BE TROW$AA #                           UPDTDMP
          PROC ALTR$AA ;                                                 UPDTDMP
          PROC TRN1$IS;                                                  UPDTDMP
          PROC FIXX$AA;                                                  UPDTDMP
          FUNC SPRD$AA ;
          PROC DUPK$AA ;
          END                                                            UPDTDMP
                                                                         UPDTDMP
     XDEF BEGIN                                                          UPDTDMP
          PROC PTRP$MP ;                                                 UPDTDMP
          PROC NUSK$MP ;                                                 UPDTDMP
          PROC PUT$MP ;                                                  UPDTDMP
          PROC REPL$MP ;                                                 UPDTDMP
          PROC DLT$MP;                                                   JJJ0724
          END                                                            UPDTDMP
                                                                         UPDTDMP
          DEF VARIANCE(L) #B<L,1>MPWRD3[0]#;
                                                                         UPDTDMP
          ITEM I , Q , X , NFHOLD , ZETA , JJ ; #SCRATCH VARIABLES#      RPN0127
          ITEM PUTCOUNT , DELCOUNT ; #COUNTS OF ALTKEYS PUT/DELETED#     UPDTDMP
          ITEM NULLKEY ;
CONTROL EJECT;                                                           JJJ0209
     FUNC FNFWRD2 ; BEGIN                                                UPDTDMP
 #                                                                       UPDTDMP
* *   FNFWRD2 - 3RD WORD OF DAUGHTER SUBFILE HEADER          PAGE 1      UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC FNFWRD2                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     WHEN INSERTING A NEW SUB-FILE HEADER INTO A RECORD, SOME OF THE    UPDTDMP
*     FIELDS CAN BE SET BY COPYING FROM THE FINF AT THE PROPER LEVEL,    UPDTDMP
*     AS FOUND IN THE FIAT.                                              UPDTDMP
*     THIS FUNCTION FETCHES THE THIRD WORD FROM THAT FINF.               UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     CURLEV = 1 OR 2, THE LEVEL OF THE CURRENT RECORD. NOT 3.           UPDTDMP
*                                                                        UPDTDMP
*     P<MPAT$AA> POINTS TO THE MIP SECTION OF THE FIAT, BUT WE DO        UPDTDMP
*       NOT CARE ABOUT P<FINF$AA>, WHICH IN FACT WILL POINT INTO THE     UPDTDMP
*       FSTT OF THE DATA FILE IF CURLEV=1, OR ELSE WILL                  UPDTDMP
*       = MPATFIN[CURLEV-1].                                             UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE FUNCTION RETURNED, IN X6, IS AS DESCRIBED ABOVE.               UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          FNFWRD2 = FIWRD2[ -P<FINF$AA> + MPATFIN[CURLEV] ] ;            UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC BIGDEL ( STAGE ) ; BEGIN ITEM STAGE ;                         002200
 #                                                                       UPDTDMP
* *   BIGDEL - THE MIP SIDE OF DELETING A DATA FILE RECORD    PAGE 1     UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC BIGDEL                                                             UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO DELETE FROM A MIP FILE EVERYTHING THAT CORRESPONDS TO A CERTAIN UPDTDMP
*     DATA RECORD. USUALLY THIS IS A RECORD IN THE CORRESPONDING DATA    UPDTDMP
*     FILE, BEING DELETED OR REPLACED. IN CASE OF A PUT THAT HAS TO      UPDTDMP
*     BE ABANDONED PART-WAY THROUGH, THE DATA RECORD IS A NEW ONE, NOT   UPDTDMP
*     YET IN THE DATA FILE, THAT WAS TO HAVE BEEN ADDED BUT PLANS HAVE   UPDTDMP
*     CHANGED.                                                           UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     STAGE IS THE ONE INCOMING PARAMETER, PASSED IN THE STANDARD WAY.   CY211
*     THIS IS -1 IF ALL ALTERNATE KEY TYPES ARE TO BE HANDLED, OR        CY211
*     0 IF ONLY UNIQUE ALTERNATE KEY TYPES ARE TO BE HANDLED (I.E.       CY211
*     THOSE FOR WHICH ANY GIVEN VALUE MAY APPEAR ONLY ONCE IN THE        CY211
*     DATA FILE), OR 1 IF ONLY NON-UNIQUE ALTERNATE KEY TYPES ARE TO     CY211
*     BE HANDLED (I.E. THOSE FOR WHICH A GIVEN VALUE MAY APPEAR MORE     CY211
*     THAN ONCE IN THE DATA FILE.)                                       CY211
*     FOR THE REASONS FOR THIS, SEE THE DISCUSSION IN ((CALLED ROUTINES) CY211
*     COMMENTS TO PROC DLT$MP.                                           CY211
*                                                                        CY211
*     PUTCOUNT IS GREATER THAN 0. IT WILL BE REDUCED BY 1 FOR EVERY      CY211
*     DELETION FROM THE MIP FILE, AND IF IT REACHES 0, BIGDEL WILL       CY211
*     TERMINATE. FOR AN ORDINARY ACTION, PUTCOUNT COMES IN               CY211
*     =1000000, EFFECTIVELY INFINITE. WHEN BIGDEL IS CALLED TO           CY211
*     UNDO A SERIES OF PUTS THAT HAD TO BE ABANDONED IN THE MIDDLE,      CY211
*     BECAUSE OF ILLEGAL DUPLICATE ALTERNATE KEY VALUES, PUTCOUNT        CY211
*     WILL = JUST THE NUMBER OF PUTS THAT WERE DONE AND NOW HAVE         CY211
*     TO BE UNDONE.                                                      CY211
*                                                                        CY211
*     MRQFWA IS THE FWA OF THE RECORD, NEW OR OLD, WHOSE ALT KEY         CY211
*       VALUES ARE BEING REMOVED FROM THE MIP FILE. USUALLY AN           CY211
*       OLD RECORD, BUT A NEW ONE WHEN WE ARE UNDOING A PUT THAT         CY211
*       HAS FOUNDERED.                                                   CY211
*       NEW OR OLD, THE PRIMARY KEY IS FOR THE TIME BEING IN             CY211
*       UNCOLLATED FORM, EVEN IF EMBEDDED AND SYMBOLIC.                  CY211
*     MRQLNG IS ITS LENGTH IN CHARACTERS.                                CY211
*     THESE TWO VARIABLES DO NOT APPEAR HERE, BUT WHEN DELMIP            CY211
*       IS CALLED, IT WILL NEED THEM.                                    CY211
*                                                                        CY211
*                                                                        UPDTDMP
*     THE MIP FILE IS CURRENT, STMD$AA(16) HAVING BEEN DONE MORE         UPDTDMP
*     RECENTLY THAN STMD$AA(0).                                          UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     PUTCOUNT HAS BEEN DECREASED BY THE NUMBER OF ACTUAL PRIMARY KEY    CY211
*       VALUES DELETED FROM THE MIP FILE (EACH ONE REPRESENTING THE      CY211
*       ASSOCIATION BETWEEN ITSELF AND AN ALT KEY VALUE, WHICH MAY       CY211
*       OR MAY NOT HAVE BEEN DELETED AS WELL.) PUTCOUNT IS NOW           CY211
*       POSITIVE OR ZERO.                                                CY211
*     DELCOUNT HAS BEEN INCREASED BY THE SAME AMOUNT.                    CY211
*     IF ANY KEY VALUE HAS BEEN EXCLUDED BY SPARSE KEY CONTROL, 
*       NULLKEY HAS BEEN SET TO 1. THIS IS SO THAT IF A REPLACE 
*       IS IN PROGRESS, REPL$MP WILL CALL BIGPUT EVEN IF
*       DELCOUNT HAS REMAINED 0.
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     NEXSECKEY - TO EXTRACT EACH ALTERNATE KEY VALUE AND SAVE IT        UPDTDMP
*       IN ARRAY SECKEY.                                                 UPDTDMP
*     LEVL$MP - TO MANEUVER US IN THE MIP FILE.                          UPDTDMP
*     GOFI$AA - TO POSITION AT THE FIRST RECORD OF A SUBFILE IN          UPDTDMP
*       THE MIP FILE.                                                    UPDTDMP
*     KRAK$MP - TO CRACK AN ALTERNATE KEY DEFINITION.                    UPDTDMP
*     DELMIP - TO DELETE A PRIMEKEY/ALTKEY PAIR FROM THE MIP FILE.       UPDTDMP
*     SKPF$AA - TO STEP THROUGH THE LIST OF ALTERNATE KEY DEFINITIONS    UPDTDMP
*       IN THE LEVEL-1 SUBFILE.                                          UPDTDMP
*     SPAR$MP - TO DECIDE IF THIS ALT KEY IS NOT TO BE TAKEN FROM        GAG1103
*       THIS RECORD BECAUSE OF ITS SPARSE KEY CONTROL CHARACTER.         GAG1103
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     AKC IS A REPEATING GROUP COUNT, SET BY KRAK$MP.                    UPDTDMP
*     COND IS A RESULT RETURNED BY NEXSECKEY -- WHEN IT IS 0, WE CAN     UPDTDMP
*       OMIT AN ACTION RATHER THAN REPLACING AN ALTERNATE KEY VALUE      UPDTDMP
*       BY ITSELF IN THE MIP FILE. OR IF THIS IS AN ((UNDO)) SITUATION,  UPDTDMP
*       COND COMES UP 0 AT THE SAME POINT IT DID DURING THE PUTS, AND    UPDTDMP
*       WE KNOW THAT AT SUCH POINTS THERE IS NOTHING TO UNDO.            UPDTDMP
*     QMF IS USED BY SUBROUTINE DELMIP TO RETURN A RESULT, EITHER        CY211
*       1 IF A DELETION WAS MADE FROM THE MIP FILE, OR 0 IF NOT.         CY211
*       (THE 0 CASE WOULD BE FOR A DATA RECORD WITH REPEATING            CY211
*       GROUPS IN WHICH THE SAME ALTERNATE KEY VALUE APPEARED MORE       CY211
*       THAN ONCE. MEETING IT ONCE WOULD CAUSE A DELETION. MEETING       CY211
*       IT A SECOND TIME WOULD NOT CAUSE A DELETION, BECAUSE IT WAS      CY211
*       AREADY GONE.)                                                    CY211
*     NULLKEY IS INITIALIZED 0 DURING A REPLACE. NEXSECKEY AND
*       BIGDEL SET IT 1 WHEN A KEY VALUE IS EXCLUDED FROM 
*       CONSIDERATION BY NULL- OR SPARSE-KEY RULES. THIS MEANS
*       THAT EVEN IF NO VALUES FROM THE OLD RECORD ARE DELETED
*       BY BIGDEL, BIGPUT WILL STILL BE CALLED AFTERWARDS.
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          LEVL$MP ( 1 ) ;                                                UPDTDMP
          GOSTARTFILE ;                                                  UPDTDMP
          ASLONGAS QEI EQ 0                                              UPDTDMP
            DO BEGIN                                                     UPDTDMP
              IF SUBFLAG NQ 0                                            UPDTDMP
                THEN BEGIN                                               UPDTDMP
                  MPAKD[0] = W[RECFWA] ;                                 UPDTDMP
                  MPWRD1[0] = W[RECFWA + 1] ;                            CY211
                  IF SPAR$MP
                    THEN BEGIN
                      NULLKEY = 1;
                      GOTO BIGDELK; 
                    END 
                  KRAK$MP ( 1 ) ;                                        UPDTDMP
                  IF ( STAGE EQ 0 AND AKS NQ FO"UNIQUE" )               002400
                    OR ( STAGE GR 0 AND AKS EQ FO"UNIQUE" )             002500
                      THEN GOTO BIGDELK ;                               002600
                  LEVL$MP ( 2 ) ;                                        UPDTDMP
                  ASLONGAS AKC NQ 0                                      UPDTDMP
                    DO BEGIN                                             UPDTDMP
                      NEXSECKEY ;                                        UPDTDMP
                      IF COND NQ 0                                       GAG1103
                        THEN BEGIN                                       UPDTDMP
                          DELMIP ;                                       UPDTDMP
                          DELCOUNT = DELCOUNT + QMF ;                    UPDTDMP
                          PUTCOUNT = PUTCOUNT - QMF ;                    UPDTDMP
                          IF PUTCOUNT EQ 0                               JJJ0413
                          THEN                                           JJJ0413
                            BEGIN                                        JJJ0413
                            LEVL$MP (1);  #MAKE SURE SFH IS OK#          JJJ0413
                            RETURN;                                      JJJ0413
                                                                         JJJ0413
                            END                                          JJJ0413
                        END                                              UPDTDMP
                    END                                                  UPDTDMP
                END                                                      UPDTDMP
              LEVL$MP ( 1 ) ;                                            UPDTDMP
     BIGDELK:                                                           002800
              SKPF$AA ;                                                  UPDTDMP
            END                                                          UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC BIGPUT ( STAGE ) ; BEGIN ITEM STAGE ;                         001400
 #                                                                       UPDTDMP
* *   BIGPUT - THE MIP SIDE OF ADDING A RECORD TO DATA FILE    PAGE 1    UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC BIGPUT                                                             UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     DURING A PUT OR REPLACE OF A RECORD IN THE DATA FILE, TO ADD       UPDTDMP
*     TO THE CORRESPONDING MIP FILE SOME OR ALL OF WHAT IS REQUIRED      CY211
*     BY THE NEW DATA RECORD.                                            CY211
*     OR PUTTING BACK SOME OR ALL OF WHAT WAS REQUIRED BY THE OLD        CY211
*     DATA RECORD, IN CASE OF A REPLACE THAT HAS TURNED SOUR AND         CY211
*     HAD TO BE UNDONE.                                                  CY211
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     P<PTRE$AA> AND P<FSTT$AA> SHOW US CURRENTLY AIMED AT A MIP FILE.   UPDTDMP
*     STAGE IS THE ONE INCOMING PARAMETER, PASSED IN THE STANDARD WAY.   CY211
*       IT IS -1 IF ALL ALTERNATE KEY SPECIES ARE TO BE HANDLED,         CY211
*       OR 0 IF ONLY UNIQUE ONES (I.E. THOSE OF WHICH A GIVEN VALUE      CY211
*       MAY OCCUR ONLY ONCE IN A DATA FILE), OR 1 IF ONLY NON-UNIQUE     CY211
*       ONES ( I.E. THOSE OF WHICH A GIVEN VALUE MAY OCCUR ANY           CY211
*       NUMBER OF TIMES IN A DATA FILE.) FOR THE REASONS BEHIND          CY211
*       THE USE OF THIS PARAMETER, SEE THE COMMENTS IN ((CALLED          CY211
*       ROUTINES)) IN THE REMARKS ON PROC DLT$MP.                        CY211
*                                                                        CY211
*     MRQFWA IS THE FWA OF THE DATA RECORD IN WHICH THE ALTERNATE        CY211
*       KEY VALUES ARE TO BE FOUND. NORMALLY A NEW RECORD, BUT IT        CY211
*       COULD ALSO BE AN EXISTING RECORD, WHEN WE ARE UNDOING A          CY211
*       REPLACE THAT HAS GONE SOUR. IF AN EXISTING RECORD, THE           CY211
*       PRIMARY KEY IS, FOR THE TIME BEING, DECOLLATED IN PLACE          CY211
*       IF IT IS AN EMBEDDED SYMBOLIC KEY.                               CY211
*     MRQLNG IS THE LENGTH OF THAT RECORD IN CHARACTERS.                 CY211
*     THESE TWO VARIABLES DO NOT APPEAR IN BIGPUT, BUT THEY ARE          CY211
*       NEEDED BY PTRP$MP WHEN BIGPUT CALLS IT.                          CY211
*                                                                        CY211
*     DELCOUNT IS GREATER THAN 0. IT WILL BE REDUCED BY 1 FOR            CY211
*       EVERY ADDITION, AND IF IT REACHES 0 BIGPUT WILL EXIT.            CY211
*       USUALLY IT IS 1000000,I.E. INFINITE, WHEN BIGPUT IS CALLED       CY211
*       BUT WHEN BIGPUT IS CALLED AS PART OF THE UNDOING OF A REPLACE    CY211
*       DELCOUNT WILL CONTAIN ONLY THE NUMBER OF ACTUAL DELETES THAT     CY211
*       WERE MADE SO FAR IN THE REPLACE.                                 CY211
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*                                                                        UPDTDMP
*     RHO IS 0 UNLESS WE HAVE RUN INTO AN ALTERNATE KEY VALUE THE        UPDTDMP
*       SAME AS ONE ALREADY RECORDED IN THE MIP FILE, OF A SPECIES       UPDTDMP
*       FOR WHICH DUPLICATES ARE FORBIDDEN IN THE KEY DEFINITION.        UPDTDMP
*                                                                        CY211
*     PUTCOUNT HAS BEEN INCREASED BY 1 FOR EVERY ACTUAL PUT OF A PRIMARY CY211
*       KEY VALUE.                                                       CY211
*     DELCOUNT HAS BEEN DECREASED BY 1 FOR EVERY ACTUAL PUT. IT WILL NOT CY211
*       HAVE BECOME NEGATIVE.                                            CY211
*                                                                        UPDTDMP
*     P<PTRE$AA> AND P<FSTT$AA> SHOW US STILL AIMED AT THE SAME MIP FILE UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NON-ZERO RHO ON EXIT INDICATES THAT SOME OUTER ROUTINE WILL HAVE   UPDTDMP
*     TO TAKE ERROR ACTION.                                              UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     NEXSECKEY - TO EXTRACT EACH ALTERNATE KEY VALUE AND SAVE IT IN     UPDTDMP
*       ARRAY SECKEY.                                                    UPDTDMP
*     LEVL$MP - TO MANEUVER US IN THE MIP FILE.                          UPDTDMP
*     GOFI$AA - TO POSITION AT THE FIRST RECORD OF A SUBFILE             UPDTDMP
*       IN THE MIP FILE                                                  UPDTDMP
*     KRAK$MP - TO CRACK AN ALTERNATE KEY DEFINITION. ALSO, THE FIRST    UPDTDMP
*       TIME, TO CALL STMD$AA(16) TO POINT US AT THE MIP FILE.           UPDTDMP
*     NUSK$MP - TO INITIALIZE THE HANGING OF A SUBFILE ON A LEVEL-1      UPDTDMP
*       RECORD (ALT KEY DEF) THAT HAD NONE HERETOFORE.                   UPDTDMP
*     PTRP$MP - TO PUT A NEW PRIMEKEY/ALTKEY PAIR INTO THE MIP FILE.     UPDTDMP
*     SKPF$AA - TO SKIP FORWARD AT LEVEL 1, FROM ONE KEY DEFINITION      UPDTDMP
*       TO THE NEXT.                                                     UPDTDMP
*     SPAR$MP - TO DECIDE IF THIS ALT KEY IS NOT TO BE TAKEN FROM        GAG1103
*       THIS RECORD BECAUSE OF ITS SPARSE KEY CONTROL CHARACTER.         GAG1103
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     AKC IS A REPEATING GROUP COUNT, SET BY KRAK$MP.                    UPDTDMP
*     COND IS A RESULT RETURNED BY NEXSECKEY -- WHEN IT IS 0, WE         UPDTDMP
*       CAN OMIT AN ACTION RATHER THAN REPLACING AN ALTERNATE KEY        UPDTDMP
*       VALUE BY ITSELF IN THE MIP FILE.                                 UPDTDMP
*     COND IS ALSO SET AS A RESULT VARIABLE BY PUTR$MP -- NORMALLY       UPDTDMP
*       TO 1 AFTER ADDING AN ALTERNATE KEY VALUE AND A PRIMARY KEY       UPDTDMP
*       VALUE, OR JUST THE LATTER, TO THE MIP FILE, BUT SOMETIMES TO     UPDTDMP
*       0 WHEN NOTHING IS ADDED BECAUSE THE COMBINATION OF THEM IS       UPDTDMP
*       ALREADY IN THE MIP FILE.                                         UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          RHO = 0 ;                                                      UPDTDMP
          LEVL$MP ( 1 ) ;                                                UPDTDMP
          GOSTARTFILE ;                                                  UPDTDMP
          ASLONGAS QEI EQ 0                                              UPDTDMP
            DO BEGIN                                                     UPDTDMP
              MPAKD[0] = W[RECFWA] ;                                     UPDTDMP
              MPWRD1[0] = W[ RECFWA+1 ] ;                                CIM0526
              IF SPAR$MP THEN GOTO BIGPUTK ;                             GAG1103
              KRAK$MP ( 1 ) ;                                            UPDTDMP
              IF ( STAGE EQ 0 AND AKS NQ FO"UNIQUE" )                   001600
                OR ( STAGE GR 0 AND AKS EQ FO"UNIQUE" )                 001700
                  THEN GOTO BIGPUTK ;                                   001800
              IF SUBFLAG EQ 0 THEN NUSK$MP ;                             UPDTDMP
              LEVL$MP ( 2 ) ;                                            UPDTDMP
              ASLONGAS AKC NQ 0                                          UPDTDMP
                DO BEGIN                                                 UPDTDMP
                  NEXSECKEY ;                                            UPDTDMP
                  IF COND NQ 0                                           GAG1103
                    THEN BEGIN                                           UPDTDMP
                      PTRP$MP ;                                          UPDTDMP
                      IF RHO NQ 0 THEN RETURN ;                          UPDTDMP
                      PUTCOUNT = PUTCOUNT + COND ;                       UPDTDMP
                      DELCOUNT = DELCOUNT - COND ;                       UPDTDMP
                      IF DELCOUNT EQ 0                                   JJJ0413
                      THEN                                               JJJ0413
                        BEGIN                                            JJJ0413
                        LEVL$MP (1);  #MAKE SURE SFH IS OK#              JJJ0413
                        RETURN;                                          JJJ0413
                                                                         JJJ0413
                        END                                              JJJ0413
                    END                                                  UPDTDMP
                END                                                      UPDTDMP
              LEVL$MP ( 1 ) ;                                            UPDTDMP
     BIGPUTK:                                                           002000
              SKPF$AA ;                                                  UPDTDMP
            END                                                          UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC DELMIP ; BEGIN                                                 UPDTDMP
 #                                                                       UPDTDMP
* *   DELMIP - REMOVE A KEY PAIR FROM MIP FILE                 PAGE 1    UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC DELMIP                                                             UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     GIVEN AN ALTERNATE KEY VALUE AND A PRIMARY KEY VALUE, TO REMOVE    UPDTDMP
*     FROM A MIP FILE WHATEVER REPRESENTS THEM AS OCCURING IN THE SAME   UPDTDMP
*     RECORD OF THE CORRESPONDING DATA FILE. IF THE ALTERNATE KEY VALUE  UPDTDMP
*     HAS ONLY ONE PRIMARY KEY VALUE WITH IT, THIS MEANS REMOVING THE    UPDTDMP
*     ALTERNATE KEY VALUE FROM THE MIP FILE. OTHERWISE, IT MEANS         UPDTDMP
*     REMOVING THE PRIMARY KEY VALUE FROM THE LIST THAT HANGS FROM THE   UPDTDMP
*     ALTERNATE KEY VALUE.                                               UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     ARRAY PRIMKEY CONTAINS THE PRIMARY KEY VALUE.                      UPDTDMP
*     PKL IS ITS LENGTH IN CHARACTERS.                                   UPDTDMP
*     KEYLNGW IS THE NUMBER OF WORDS NECESSARY TO CONTAIN IT.            UPDTDMP
*     PKT IS ITS TYPE.                                                   UPDTDMP
*                                                                        UPDTDMP
*     ARRAY SECKEY CONTAINS THE ALTERNATE KEY VALUE.                     UPDTDMP
*                                                                        UPDTDMP
*     WE ARE POSITIONED IN THE MIP FILE, SOMEWHERE IN THE LEVEL-2        UPDTDMP
*     SUBFILE THAT LISTS VALUES OF THE CURRENT SPECIES OF                UPDTDMP
*     ALTERNATE KEY.                                                     UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE FUNCTION HAS BEEN ACCOMPLISHED.                                UPDTDMP
*                                                                        UPDTDMP
*     QMF = 1 IF A KEY PAIR HAS BEEN DERECORDED, OR 0 IF NOT. FOR THE    UPDTDMP
*       ZERO CASE, SEE BELOW UNDER ((ERRORS)).                           UPDTDMP
*                                                                        UPDTDMP
*     VARIANCE(2) HAS BEEN SET IF WE DELETED A LEVEL-2 RECORD. THIS 
*       WILL BE A SIGNAL TO CHANGE THE PARENT LEVEL-1 SUBFILE HEADER     UPDTDMP
*       BEFORE FORMALLY DEPARTING FROM THE PARENT LEVEL-1 RECORD.        UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE. OBSERVE THAT WE MAY FAIL TO FIND THE PRIMARY KEY VALUE,      UPDTDMP
*       OR EVEN, PERHAPS, THE ALTERNATE KEY VALUE. BUT THIS IS NOT       UPDTDMP
*       COUNTED AS AN ERROR, THOUGH INDEED IT MIGHT INDICATE ONE         UPDTDMP
*       SOMETIMES, BECAUSE UNDER CERTAIN CIRCUMSTANCES IT IS ALL         UPDTDMP
*       RIGHT. THE CIRCUMSTANCES WOULD BE WHEN THE ALTERNATE KEY         UPDTDMP
*       DEFINITION ALLOWS REPEATING GROUPS, AND THIS DATA RECORD HAS     UPDTDMP
*       TWO IDENTICAL VALUES OF THIS ALTERNATE KEY, IN TWO REPEATING     UPDTDMP
*       GROUPS, AND WE HAVE ALREADY HANDLED THE FIRST ONE AND ARE        UPDTDMP
*       NOW DEALING WITH THE SECOND. AS TWO SUCH OCCURRENCES ARE         UPDTDMP
*       RECORDED ONLY ONCE IN A MIP FILE, WE HAVE NO WAY OF              UPDTDMP
*       DEALING WITH THIS SITUATION MORE ACCURATELY, WITHOUT A           UPDTDMP
*       DISPROPORTIONATE AMOUNT OF EXTRA WORK. OBSERVE THAT HERE WE      UPDTDMP
*       ARE NOT INTRODUCING A CHANCE OF A NEW SORT OF ERROR --           UPDTDMP
*       MERELY NEGLECTING ONE OPPORTUNITY FOR DETECTING AN EXISTING      UPDTDMP
*       SORT OF ERROR.                                                   UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     WKKY$IS - TO SEEK A MATCH FOR A KEY IN AN I-S SUBFILE AT LEVEL 1.  UPDTDMP
*     CPCH$AA - TO COMPARE THE GIVEN PRIMARY KEY WITH THE ONE IN         UPDTDMP
*       THE LEVEL-2 RECORD THAT CONTAINS THE GIVEN ALTERNATE KEY VALUE.  UPDTDMP
*     DLTE$IS - TO DELETE A RECORD, AT LEVEL 2 OR LEVEL 3.               UPDTDMP
*     DNLV$MP - TO MOVE FROM A LEVEL-2 RECORD TO THE FIRST RECORD IN ITS UPDTDMP
*       DEPENDENT SUBFILE, WHETHER IN A SUBBLOCK OR NOT.                 UPDTDMP
*     UPLV$MP - TO MOVE BACK TO THE PARENT LEVEL-2 RECORD                UPDTDMP
*       IF WE WERE IN A SUBBLOCK AT LEVEL 3.                             UPDTDMP
*     MOVW$AA - TO SAVE A COPY OF THE FIRST RECORD OF A LEVEL-3 SUBFILE  UPDTDMP
*       WHEN THE PRIMARY KEY VALUE IN THE LEVEL-2 RECORD IS THE ONE      UPDTDMP
*       THAT HAS TO BE DELETED, AND THE FIRST ONE IN THE LEVEL-3         UPDTDMP
*       SUBFILE WILL HAVE TO REPLACE IT.                                 UPDTDMP
*     MOVC$AA - WHEN THE PRIMARY KEY VALUE IN THE LEVEL-2 RECORD IS THE  UPDTDMP
*       ONE TO BE DELETED, AND WE REPLACE IT WITH THE FIRST VALUE        UPDTDMP
*       IN THE DEPENDENT SUBFILE, WHETHER THIS IS A SUBBLOCK OR NOT,     UPDTDMP
*       MOVC$AA FILLS THE NEW VALUE INTO THE LEVEL-2 RECORD.             UPDTDMP
*     ELIMSUB - WHEN THE NUMBER OF PRIMARY KEY VALUES THAT GO WITH       UPDTDMP
*       AN ALTERNATE KEY VALUE IS REDUCED FROM 2 TO 1, WE NO LONGER      UPDTDMP
*       NEED THE DEPENDENT SUBFILE, AND CALL ELIMSUB TO REMOVE IT        UPDTDMP
*       FROM THE LEVEL-2 RECORD. IF THE SUBFILE WAS NOT A SUBBLOCK,      UPDTDMP
*       THE BLOCK THAT CONTAINED ITS LAST REMAINING RECORD HAS ALREADY   UPDTDMP
*       BEEN SENT TO THE EMPTY CHAIN BY DLTE$IS WHEN WE DELETED THAT     UPDTDMP
*       RECORD. IF IT WAS A SUBBLOCK, WE DONT CALL DLTE$IS FIRST, BUT    UPDTDMP
*       LET ELIMSUB REMOVE THE SUBBLOCK AS PART OF THE SUBFILE HEADER.   UPDTDMP
*     LWADJ - TO MOVE EVERYTHING STARTING AT SOME POINT IN THE CURRENT   UPDTDMP
*       LEVEL-2 RECORD, ENDING AT THE END OF THE LAST RECORD IN THE      UPDTDMP
*       CURRENT LEVEL-2 BLOCK, ONE WAY OR THE OTHER IN THE LEVEL-2 BLOCK UPDTDMP
*       AND ADJUST THE RECORD POINTERS FOR THE CURRENT AND FOLLOWING     UPDTDMP
*       BLOCKS. HERE WE CALL IT IN ORDER TO SQUEEZE A RECORD OUT         UPDTDMP
*       OF A SUBBLOCK INSIDE THE CURRENT LEVEL-2 RECORD.                 UPDTDMP
*     ALTR$AA - TO DO THE FORMALITIES FOR A BLOCK THAT IS ABOUT TO       CY211
*       BE ALTERED BY A CALL TO LWADJ.                                   CY211
*     GOKY$MP - SEEK A MATCH FOR A KEY IN A LIST OF PRIMARY KEY VALUES,  UPDTDMP
*       WHICH MAY BE I-S OR FIFO, AND MAY BE A PROPER SUBFILE AT         UPDTDMP
*       LEVEL 3, OR A SUBBLOCK WITHIN A LEVEL-2 RECORD.                  UPDTDMP
*     LEVL$MP - TO RETURN FROM A LEVEL-3 SUBFILE, NOT A SUBBLOCK, TO     UPDTDMP
*       THE PARENT RECORD AT LEVEL 2, AFTER DELETING A RECORD FROM THE   UPDTDMP
*       LEVEL-3 SUBFILE.                                                 UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     KEYFWA - USED TO SPECIFY THE KEY FWA TO WKKY$IS OR GOKY$MP.        UPDTDMP
*     QMF - A RESULT SET BY WKKY$IS OR GOKY$MP -- 1 FOR MATCH, 0 IF NOT. UPDTDMP
*       ALSO USED AS A RESULT BY DELMIP -- SEE ((EXIT CONDITIONS))       UPDTDMP
*       ABOVE.                                                           UPDTDMP
*     COND - RESULT SET BY CPCH$AA -- 0 IF MATCH, ELSE NOT.              UPDTDMP
*     OMEGA - SIGNIFICANT WHEN CURLEV=2. THEN IF OMEGA=0, WE ARE         UPDTDMP
*       PURELY POSITIONED IN THE LEVEL-2 SUBFILE. BUT IF OMEGA IS NOT    UPDTDMP
*       0, IT IS THE FWA OF A SUBBLOCK WITHIN THE CURRENT LEVEL-2        UPDTDMP
*       RECORD, AND QQ IS THE FWA OF THE CURRENT RECORD IN THE SUBBLOCK. UPDTDMP
*       THIS IS SET UP BY DNLV$MP.                                       UPDTDMP
*     RECFWA - FWA OF THE CURRENT RECORD, BUT NOT IN A SUBBLOCK, SET BY  UPDTDMP
*       ANY ROUTINE THAT POSITIONS US AT A RECORD, BY KEY MATCHING OR    UPDTDMP
*       OTHERWISE.                                                       UPDTDMP
*     HOLD - AN ARRAY FOR BRIEF TEMPORARY STORAGE.                       UPDTDMP
*     QQ - SEE OMEGA ABOVE.                                              UPDTDMP
*     JJ - USED FOR SCRATCH.                                             UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          KEYFWA = LOC(SECKEY[0]) ;                                      UPDTDMP
          WKKY$IS ( 0 ) ;                                                UPDTDMP
          IF QMF EQ 0                                                    UPDTDMP
            THEN RETURN ;                                                UPDTDMP
            ELSE BEGIN                                                   UPDTDMP
              CPCH$AA(RECFWA,0,LOC(PRIMKEY[0]),0,PKL,PKT);               UPDTDMP
              IF COND EQ 0                                               UPDTDMP
                THEN BEGIN                                               UPDTDMP
                  IF SUBFLAG EQ 0                                        UPDTDMP
                    THEN BEGIN                                           UPDTDMP
                      DLTE$IS ;                                          UPDTDMP
                      VARIANCE(2) = 1;
                    END                                                  UPDTDMP
                    ELSE BEGIN                                           UPDTDMP
                      DNLV$MP ( 1 ) ;                                    AM2A089
                      IF OMEGA EQ 0                                      UPDTDMP
                        THEN BEGIN                                       UPDTDMP
                          MOVW$AA ( RECFWA , KEYLNGW , LOC(HOLD[0]) ) ;  UPDTDMP
                          DLTE$IS ;                                      UPDTDMP
                          VARIANCE(3) = 1;
                          LEVL$MP ( 2 ) ;                                UPDTDMP
                          ALTR$AA ; 
                          MOVC$AA ( LOC(HOLD[0]),0,RECFWA,0,PKL ) ;      UPDTDMP
                          IF SFHRC[0] EQ 0 THEN ELIMSUB ;                UPDTDMP
                        END                                              UPDTDMP
                        ELSE BEGIN #SUBBLOCK#                            UPDTDMP
                          QQ = OMEGA + 1 ;                               UPDTDMP
                          MOVC$AA ( QQ,0,RECFWA,0,PKL ) ;                UPDTDMP
                  BIGDELA:                                               UPDTDMP
                          JJ = SUBBLOCRC1 ;                              UPDTDMP
                          IF JJ EQ 1                                     UPDTDMP
                            THEN ELIMSUB ;                               UPDTDMP
                            ELSE BEGIN                                   UPDTDMP
                              ALTR$AA ; 
                              SUBBLOCRC2 = JJ - 1 ;                      UPDTDMP
                              SUBBLOCRC1 = JJ - 1 ;                      UPDTDMP
                              SFHLG[0] = SFHLG[0] + KEYLNGW ; #SFHLG<0#  UPDTDMP
                              LWADJ ( QQ+KEYLNGW , -KEYLNGW ) ;          UPDTDMP
                            END                                          UPDTDMP
                          UPLV$MP ;                                      UPDTDMP
                        END                                              UPDTDMP
                    END                                                  UPDTDMP
                END                                                      UPDTDMP
                ELSE BEGIN                                               UPDTDMP
                  QMF = 0 ; #NO DELETE#                                  UPDTDMP
                  IF SUBFLAG EQ 0 THEN RETURN ;                          UPDTDMP
                  DNLV$MP ( 0 ) ;                                        AM2A089
                  KEYFWA = LOC(PRIMKEY[0]) ;                             UPDTDMP
                  GOKY$MP ( 0 ) ;                                        UPDTDMP
                  IF QMF EQ 0                                            CY211
                  THEN                                                   CY211
                      BEGIN                                              CY211
                      UPLV$MP;                                           CY211
                      RETURN;                                            CY211
                                                                         CY211
                      END                                                CY211
                  IF OMEGA EQ 0                                          UPDTDMP
                  THEN                                                   CY211
                      BEGIN                                              CY211
                      DLTE$IS ;                                          CY211
                      VARIANCE(3) = 1;
                      LEVL$MP (2) ;                                      CY211
                      IF SFHRC[0] EQ 0                                   CY211
                      THEN                                               CY211
                          BEGIN                                          CY211
                          ELIMSUB ;                                      CY211
                          END                                            CY211
                      END                                                CY211
                  ELSE                                                   CY211
                      BEGIN                                              CY211
                      GOTO  BIGDELA;  #DELETE IN THE SUBLOCK#            CY211
                      END                                                CY211
                END                                                      UPDTDMP
            END                                                          UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
PROC DLT$MP;                                                             JJJ0724
      BEGIN                                                              AFB0528
                                                                         AFB0528
      ITEM QP , GOOGOO , CPFLAG , STAGE ;                               003000
                                                                         AFB0528
     ENTRY PROC REPL$MP ;                                                UPDTDMP
 #                                                                       UPDTDMP
* *   REPL$MP/DELT$MP/PUT$MP - THE MIP SIDE OF AN UPDATE    PAGE 1       UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC REPL$MP/DELT$MP/PUT$MP                                             UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO ALTER THE ASSOCIATED MIP FILE AS NECESSARY, BEFORE DOING        UPDTDMP
*     A REPLACE, DELETE, OR PUT IN A DATA FILE.                          UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     FTCOP[0] CONTAINS THE CURRENT FUNCTION CODE, OP"PUT", OP"DLT",     CY211
*       OR OP"RPL".                                                      CY211
*     FTWSA[0] AND FTRL[0] GIVEN THE FWA AND LENGTH OF THE NEW RECORD,   UPDTDMP
*       EXCEPT FOR A DELETE.                                             UPDTDMP
*     KEYFWA AND KEYOFF ARE THE FWA AND STARTING CHARACTER POSITION      CY211
*       OF THE NEW KEY, OR A COLLATED COPY OF IT IF IT IS SYMBOLIC.      CY211
*       THE NEW KEY IS THE KEY OF THE NEW RECORD, EMBEDDED OR NOT,       CY211
*       FOR A PUT OR REPLACE, OR THE IDENTIFYING KEY FOR A DELETE.       CY211
*     PKL IS THE LENGTH OF THIS KEY IN CHARACTERS, SINCE IT IS           CY211
*       THE LENGTH OF ANY PRIMARY KEY IN THE DATA FILE.                  CY211
*     RECFWA AND RECLWA ARE THE FWA AND LWA+1 OF THE OLD RECORD, IN      CY211
*       ITS BLOCK IMAGE. THIS IS THE RECORD IN THE DATA FILE THAT        CY211
*       IS ULTIMATELY TO BE REMOVED, BY A REPLACE OR DELETE.             CY211
*       FOR A PUT THESE ARE IRRELEVANT.                                  CY211
*     RECPTR CONTAINS A COPY OF THE RECORD POINTER FOR THE OLD           CY211
*       RECORD.                                                          CY211
*     OUTKEY IS 0 IF THE DATA FILE HAS EMBEDDED KEYS. OTHERWISE          CY211
*       IT IS THE NUMBER OF WORDS REQUIRED TO CONTAIN A KEY,             CY211
*       I.E. (PKL+9)/10.                                                 CY211
*     FSCOMPACT[0] IS 0 IF THERE IS NO COMPRESSION IN THIS FILE,         CY211
*       NON-ZERO IF THERE IS COMPRESSION.                                CY211
*     FAFP[0] = 100B (EOI) IF WE ARE POSITIONED AT EOI IN THE            CY211
*       DATA FILE, AND NOT OTHERWISE.                                    CY211
*     FAPOSKEY1[0] DEFINES WHAT SORT OF KEY WE ARE POSITIONED WITH       UPDTDMP
*       RESPECT TO, FOR GETNEXT OR SKIP OPERATIONS THAT MIGHT FOLLOW     UPDTDMP
*       SOON. THIS IS INTERESTING IF WE ARE DOING A DELETE OR            UPDTDMP
*       REPLACE OF THE RECORD AT WHICH WE ARE POSITIONED, AND THE        UPDTDMP
*       POSITIONING IS WITH RESPECT TO AN ALTERNATE KEY WITH MORE        UPDTDMP
*       THAN ONE PRIMARY KEY, THE PRIMARY KEYS BEING LISTED FIFO.        UPDTDMP
*       WE MUST STEP AHEAD IN THE FIFO SUBFILE BEFORE                    UPDTDMP
*       DELETING THE CURRENT RECORD, BECAUSE OTHERWISE WE PROBABLY LOSE  UPDTDMP
*       OUR POSITION IN THE SUBFILE.                                     UPDTDMP
*     FAPKY3ADR[0] POINTS TO AN AREA IN THE FIAT WHERE A PRIMARY         UPDTDMP
*       KEY VALUE IS STORED. THIS IS THE VALUE THAT A FUTURE GETNEXT     UPDTDMP
*       MIGHT NEED. HERE IT IS INTERESTING ONLY BECAUSE OF WHAT WE       UPDTDMP
*       SAID JUST ABOVE FOR FAPOSKEY1[0].                                UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     IF THIS OPERATION IS A DELETE, OR IF RHO=0, THE CHANGES TO THE MIP UPDTDMP
*     FILE HAVE ALL BEEN COMPLETED.                                      UPDTDMP
*                                                                        UPDTDMP
*     BUT IF THE OPERATION IS A PUT OR REPLACE, AND RHO IS NOT 0, THE    UPDTDMP
*     OPERATION IS FORBIDDEN BECAUSE OF DUPLICATION OF AN                UPDTDMP
*     UNDUPLICABLE ALTERNATE KEY VALUE, AND ANY CHANGES THAT WERE MADE   UPDTDMP
*     TO THE MIP FILE HAVE BEEN UNDONE.                                  UPDTDMP
*                                                                        UPDTDMP
*     STMD$AA(0) HAS BEEN CALLED, AND WE ARE LOOKING AT THE DATA FILE    UPDTDMP
*     RATHER THAN THE MIP FILE. FURTHERMORE, UNLESS IT IS EMPTY, WE      UPDTDMP
*     ARE AT THE CURRENT RECORD, WHICH IS IN CORE AND LOCATED BY THE     UPDTDMP
*     PTREE AS WELL AS BY RECFWA, RECLWA, AND RECLG.                     UPDTDMP
*                                                                        CY211
*     KEYFWA=(LOC(PRIMKEY[0]) AND KEYOFF=0. THEY POINT TO A COPY         CY211
*       OF THE NEW PRIMARY KEY VALUE, COLLATED IF SYMBOLIC.              CY211
*       THIS IS IN FACT THE SAME THING THEY POINTED TO ON ENTRY,         CY211
*       THOUGH IN A DIFFERENT PLACE.                                     CY211
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     RHO NON-ZERO ON EXIT, AS DESCRIBED ABOVE. THE ERROR MESSAGES       UPDTDMP
*     ETC. SHOULD BE HANDLED BY AN OUTER ROUTINE.                        UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     FIXX$AA - TO FREEZE THE BLOCK CONTAINING THE OLD RECORD OF         CY211
*       THE DATA FILE, BY REMOVING IT FROM THE KICKOUT CHAIN.            CY211
*       THE RECORD HAS TO STAND STILL IN MEMORY WHILE WE OPERATE         CY211
*       ON IT, AND OPERATIONS ON THE MIP FILE WOULD THREATEN IT          CY211
*       IF IT WERE NOT FROZEN.                                           CY211
*     TRN1$IS - TO DECOLLATE IN PLACE THE PRIMARY KEY IN THE OLD         CY211
*       RECORD, IF IT IS SYMBOLIC. THIS IS DONE IN CASE ANY              CY211
*       ALTERNATE KEY FIELDS OVERLAP IT. ALTERNATE KEY VALUES            CY211
*       HAVE TO BE EXTRACTED FROM THE RECORD IN THEIR NATURAL            CY211
*       FORM. LATER, TO RECOLLATE THE PRIMARY KEY, IN PLACE.             CY211
*       BOTH OPERATIONS ARE DONE BETWEEN THE TIME THE DATA BLOCK         CY211
*       IS FROZEN BY FIXX$AA AND THE TIME IT IS UNFROZEN BY              CY211
*       UNFX$AA.                                                         CY211
*     MOVC$AA - TO COPY THE NEW PRIMARY KEY VALUE INTO ARRAY             CY211
*       PRIMKEY. IT HAS PREVIOUSLY BEEN COLLATED, IF SYMBOLIC.           CY211
*     KRAK$MP - TO SET PKL AND PKT, AND TO CALL STMD$AA IF NECESSARY     UPDTDMP
*       TO POINT US AT THE MIP FILE.                                     UPDTDMP
*     BIGPUT - TO DO THE MIP WORK FOR A PUT IN THE DATA FILE.            UPDTDMP
*     BIGDEL - TO DO THE MIP WORK FOR A DELETE IN THE DATA FILE.         UPDTDMP
*                                                                        CY211
*     BIGPUT AND BIGDEL ARE CALLED WITH PARAMETER ((STAGE)) = -1,        CY211
*      0, OR +1 IN THE FOLLOWING WAYS --                                 CY211
*     1. ON A DELETE, BIGDEL(-1) IS CALLED. THIS CAUSES ALL              CY211
*     ALTERNATE KEYS, UNIQUE OR NOT, TO BE PROCESSED AS THEY             CY211
*     COME, BECAUSE THEORETICALLY THERE CAN BE NO TROUBLE.               CY211
*     PUTCOUNT=1000000, SO THAT BIGDEL WILL DELETE AS MANY AS            CY211
*     IT FINDS.                                                          CY211
*     2. ON A PUT, BIGPUT(-1) IS CALLED WITH DELCOUNT=1000000            CY211
*     AND PUTCOUNT=0. THIS MEANS THAT BOTH TYPES OF ALTERNATE KEY ARE TO CY211
*     BE HANDLED AS THEY COME. DELCOUNT IMPOSES NO LIMIT, AND PUTCOUNT   CY211
*     BECOMES A COUNT OF THE ACTUAL PUTS. NOW IF THERE IS TROUBLE,       CY211
*     BECAUSE OF A DUPLICATE VALUE IN A UNIQUE ALTERNATE KEY,            CY211
*     BIGPUT EXITS IMMEDIATELY WITH RHO=1. THEN BIGDEL(-1) IS CALLED.    CY211
*     THIS WILL DELETE BOTH KINDS OF ALTERNATE KEYS, BUT BECAUSE OF      CY211
*     THE VALUE IN PUTCOUNT, IT WILL DELETE JUST AS MANY AS WERE PUT     CY211
*     BY BIGPUT, WHOSE WORK HAS TO BE UNDONE. WE DEPEND ON BOTH          CY211
*     BIGDEL AND BIGPUT ENCOUNTERING THE ALT KEY VALUES IN THE           CY211
*     SAME SEQUENCE.                                                     CY211
*     3. A REPLACE INVOLVES BOTH DELETING AND PUTTING. IT WOULD BE       CY211
*     SIMPLER TO DO ALL THE PUTS FIRST, THEN ALL THE DELETES, BECAUSE    CY211
*     TROUBLE CAN ONLY ARISE ON PUTS, AND IT IS BETTER THAT NOTHING      CY211
*     SHOULD HAVE BEEN DELETED WHEN TROUBLE COMES -- IT MAY NOT BE       CY211
*     KNOWN WHERE SOMETHING CAME FROM, YET WE HAVE TO RESTORE IT.        CY211
*     ON THE OTHER HAND, DOING ALL THE DELETES FIRST IS ADVANTAGEOUS     CY211
*     IN KEEPING DOWN THE MAXIMUM SIZE OF THE MIP FILE, AND PERHAPS      CY211
*     AVOIDING TIME-CONSUMING BLOCK SPLITS.                              CY211
*     WE COMPROMISE BY DOING FIRST BIGDEL(0). THIS DELETES ALL THE       CY211
*     UNIQUE ALTERNATE KEYS. THEN BIGPUT(0), WHICH ADDS ALL THE NEW      CY211
*     UNIQUE ALTERNATE KEYS. THIS IS THE ONLY PLACE WHERE, IN            CY211
*     THEORY, TROUBLE CAN ARISE. IF IT DOES, WE FIRST CALL BIGDEL(0)     CY211
*     TO UNDO THE WORK OF BIGPUT(0), WITH THE VALUE OF PUTCOUNT          CY211
*     SET BY BIGPUT(0) TELLING BIGDEL(0) WHEN TO STOP. THEN WE HAVE      CY211
*     TO CALL BIGPUT(0) AGAIN TO UNDO THE WORK OF THE ORIGINAL           CY211
*     BIGDEL(0). HERE, NO PROBLEMS OF WHERE TO RESTORE AN ALTERNATE      CY211
*     KEY TO THE MIP FILE ARISE, BECAUSE THESE ARE UNIQUE KEYS.          CY211
*     BUT IF THERE IS NO TROUBLE, WE CONTINUE BY CALLING BIGDEL(1)       CY211
*     TO DELETE ALL THE NON-UNIQUE KEYS, AND THEN BIGPUT(1) TO ADD       CY211
*     IN ALL THE NEW NON-UNIQUE KEYS. AS THEY ARE NON-UNIQUE,            CY211
*     BIGPUT CANNOT RUN INTO TROUBLE, SO WE NEED NOT WORRY ABOUT         CY211
*     HOW TO UNDO THESE BIGDEL AND BIGPUT ACTIONS.                       CY211
*                                                                        CY211
*     CPCH$AA - TO COMPARE PRIMARY KEYS, AND THEN ALTERNATE KEYS,        UPDTDMP
*       WHEN WORRYING ABOUT WHETHER WE ARE ABOUT TO DELETE THE RECORD    UPDTDMP
*       THAT IS CURRENT IN THE GETNEXT SENSE, AND IS IDENTIFIED BY       UPDTDMP
*       A PRIMARY VALUE IN A FIFO SUBFILE. IF PRIMARY KEYS ARE NOT       UPDTDMP
*       THE SAME, OR IF ALTERNATE KEY VALUES ARE THE SAME AFTER ALL,     UPDTDMP
*       THEN WE NEED NOT WORRY FOR A REPLACE.                            UPDTDMP
*     RPOS$MP - IN THE TROUBLESOME CASE ABOUT DELETING THE CURRENT       UPDTDMP
*       RECORD, WE SET XFER = 1 AND CALL RPOS$MP IN ORDER TO STEP        UPDTDMP
*       AHEAD 1, TO A PRIMARY KEY RECORD THAT IS NOT GOING TO BE         UPDTDMP
*       DELETED, IN A FIFO SUBFILE.                                      UPDTDMP
*     UNFX$AA - TO UNFREEZE THE BLOCK THAT CONTAINS THE CURRENT          UPDTDMP
*       RECORD OF THE DATA FILE,                                         UPDTDMP
*       BY RETURNING IT TO THE KICKOUT CHAIN AND ZEROING FIXHOLD[3],     UPDTDMP
*       AFTER ALL THE MIP WORK IS DONE. THE BLOCK WAS FROZEN IN          UPDTDMP
*       THE QUMP$AA ROUTINE.                                             UPDTDMP
*     STMD$AA - TO RETURN ATTENTION TO THE DATA FILE, AFTER ALL THE      UPDTDMP
*       MIP WORK IS DONE.                                                UPDTDMP
*     CURR$AA - TO POSITION AT THE CURRENT RECORD IN THE DATA FILE.      UPDTDMP
*     DUPK$AA - TO ISSUE ERROR MESSAGES FOR DUP KEYS
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     ARRAYS PRIMKEY AND SECKEY, WHERE WE KEEP PRIMARY AND ALTERNATE     CY211
*     KEY VALUES.                                                        CY211
*                                                                        CY211
*     DELCOUNT AND PUTCOUNT CONCERN SUBROUTINES BIGDEL AND BIGPUT.       CY211
*     BIGDEL COUNTS UP ON DELCOUNT AND DOWN ON PUTCOUNT, WHILE           CY211
*     BIGPUT DOES THE OPPOSITE. THE ONE THAT IS BEING COUNTED            CY211
*     DOWN MAY ACT AS A BRAKE ON BIGPUT OR BIGDEL, WHILE THE ONE         CY211
*     THAT IS BEING COUNTED UP EXISTS IN CASE WE SHOULD WANT TO          CY211
*     PASS IT TO THE OTHER SUBROUTINE LATER AS A BRAKE.                  CY211
*                                                                        CY211
*     MPRECAF AND MPRECLN ARE SET TO THE FWA AND LENGTH IN               CY211
*     CHARACTERS OF THE OLD RECORD, IF ANY.                              CY211
*                                                                        CY211
*     MRQFWA AND MRQLNG ARE SET TO THE FWA AND LENGTH IN                 CY211
*     CHARACTERS OF WHICHEVER RECORD BIGPUT OR BIGDEL IS TO WORK         CY211
*     ON, JUST BEFORE CALLING BIGPUT OR BIGDEL.                          CY211
* 
*     NULLKEY IS SET TO 0 BEFORE THE NORMAL CALL TO BIGDEL. 
*     THIS IS ONLY SIGNIFICANT DURING A REPLACE. IF NULLKEY IS
*     NON-ZERO ON RETURN FROM THAT BIGDEL CALL,IT MEANS THAT
*     THERE WAS AT LEAST ONE PAIR OF CORRESPONDING OLD AND NEW
*     ALTERNATE KEY VALUES THAT WERE SEEN BY SUBROUTINE 
*     NEXSECKEY NOT TO BE THE SAME, SO THAT BIGPUT
*     WOULD HAVE TO BE CALLED AFTERWARDS, BUT NO DELETE 
*     WAS DONE, AND DELCOUNT WAS NOT STEPPED, BECAUSE THE 
*     OLD VALUE WAS NULL. 
*                                                                        UPDTDMP
*     RHO IS RETURNED ZERO BY BIGPUT IF ALL IS WELL, BUT NON             UPDTDMP
*     ZERO IF THE NEW RECORD DUPLICATES AN UNDUPLICABLE ALTERNATE KEY    UPDTDMP
*     VALUE.                                                             UPDTDMP
*                                                                        UPDTDMP
*     THIS VALUE OF RHO IS PASSED THROUGH TO THE CALLER OF REPL$MP/      UPDTDMP
*     DELT$MP/PUT$MP. IF BIGPUT WAS NOT CALLED, WHICH WOULD BE ONLY      UPDTDMP
*     FOR A DELETE, RHO IS NOT SET, BUT THE CALLER, (WHO CALLS THIS      UPDTDMP
*     ROUTINE UNDER THE NAME DELT$MP) DOES NOT CHECK RHO, BECAUSE        UPDTDMP
*     DUPLICATION TROUBLE COULD NOT HAVE ARISEN.                         UPDTDMP
*                                                                        UPDTDMP
*     COND IS A RESULT VARIABLE, SET BY CPCH$AA -- ZERO FOR MATCH,       UPDTDMP
*     ELSE NO MATCH.                                                     UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
CONTROL EJECT;                                                           JJJ0209
                                                                         JJJ0209
          IF FSCOMPACT[0] EQ 0
            THEN  CPFLAG = 0;                                            CY211
            ELSE CPFLAG = RPCMP ; 
          FIXX$AA ( P<BLOK$AA> , 3 ) ;                                   AFB0528
          MPRECAF = RECFWA + OUTKEY ;                                    UPDTDMP
          MPRECLN = ( RECLWA - MPRECAF ) * 10 - UCCFIELD ;               UPDTDMP
                  #LOOK OUT FOR UCCFIELD IF DECOMPRESSED#                UPDTDMP
          IF OUTKEY EQ 0 AND KTYPE EQ KT"SYMBOLIC"                       UPDTDMP
            THEN BEGIN                                                   UPDTDMP
                   #KEY DESCRIPTION IS FROM DATA FSTT#                   VBG0113
              BLCIP[0] = 1 ;
              TRN1$IS(MPRECAF+FSKEYLOC[0],FSKEYPOS[0],FSKEYSIZE[0],      VBG0113
                                             LOC(FSCODITAB[0]));         JJJ0111
              GOOGOO = MPRECAF ;
              GOTO UPDUK ;                                               UPDTDMP
            END                                                          UPDTDMP
            ELSE GOTO UPDUM ;                                            UPDTDMP
                                                                         UPDTDMP
     ENTRY PROC PUT$MP ;                                                 UPDTDMP
       UPDUM: GOOGOO = 0 ;                                               UPDTDMP
      UPDUK:                                                             JJJ0111
          RHO = 0 ; #CLEAR DUPLICATE KEY ERROR FLAG#
          KRAK$MP (1);                                                   JJJ0111
          MOVC$AA ( KEYFWA , KEYOFF , LOC(PRIMKEY[0]) , 0 , PKL ) ;      UPDTDMP
          QP = FTCOP[0] ;                                                UPDTDMP
          IF QP EQ OP"RPL"                                              003200
            THEN STAGE = 0 ;                                            003300
            ELSE STAGE = -1 ;                                           003400
     MIPUPD:                                                            003500
          IF QP EQ OP"PUT"                                              003600
            THEN BEGIN                                                  003700
              PUTCOUNT = 0 ;                                             UPDTDMP
              DELCOUNT = 1000000 ;                                       UPDTDMP
              MRQFWA = FTWSA[0] ;                                        UPDTDMP
              MRQLNG = FTRL[0] ;                                         UPDTDMP
              BIGPUT ( STAGE ) ;                                        003900
              IF RHO NQ 0                                                UPDTDMP
                THEN BEGIN # MUST UNDO #                                 UPDTDMP
                  IF PUTCOUNT NQ 0 THEN BIGDEL ( STAGE ) ;              004100
                  GOTO MIPUPA ;                                          UPDTDMP
                END                                                      UPDTDMP
            END                                                         004300
                                                                        004400
          IF QP NQ OP"PUT"                                              004500
            THEN BEGIN                                                  004600
              IF STAGE NQ 0 AND FAPOSKEY1[0] NQ 0 AND FAFP[0] NQ EOI    004700
                AND B<33,3>FAPOSKEY1[0] EQ FO"FIFO"                      UPDTDMP
                THEN BEGIN #WERE GOINGTO DELETE A FIFO RECORD#           UPDTDMP
                  CPCH$AA ( FAPKY3ADR[0],0,LOC(PRIMKEY[0]),0,PKL,PKT );  UPDTDMP
                  IF COND EQ 0                                           UPDTDMP
                    THEN BEGIN #DELETING CURRENT,MUST LOCATE NEXT#       UPDTDMP
                      IF QP NQ OP"DLT"                                   UPDTDMP
                        THEN BEGIN                                       UPDTDMP
          CPCH$AA(FTWSA[0]+FAPKRKW[0],FAPKRKP[0],MPRECAF+FAPKRKW[0],     UPDTDMP
                  FAPKRKP[0],FAPKRKL[0],KT"SYMBOLIC");
                          IF COND EQ 0 THEN GOTO MIPUPB ;                UPDTDMP
                        END                                              UPDTDMP
                      PREVOP = QP ; #FORCE RESPOS TO HARD WAY#           UPDTDMP
                      XFER = 1 ;                                         UPDTDMP
                      RPOS$MP ;                                          UPDTDMP
                    END                                                  UPDTDMP
                END                                                      UPDTDMP
      MIPUPB: PUTCOUNT = 1000000 ;                                       UPDTDMP
              DELCOUNT = 0 ;                                             UPDTDMP
              IF CPFLAG NQ 0 AND STAGE LQ 0                              CY211
              THEN                                                       CY211
                  BEGIN                                                  CY211
                  MPRECLN = SPRD$AA (MPRECAF , MPRECLN) ;                CY211
                  MPRECAF = CBUFAD ;
                  END                                                    CY211
              MRQFWA = MPRECAF ;                                         UPDTDMP
              MRQLNG = MPRECLN ;                                         UPDTDMP
              NULLKEY = 0 ; 
              BIGDEL ( STAGE ) ;                                        005100
            END                                                          UPDTDMP
                                                                         UPDTDMP
          IF QP EQ OP"RPL" AND
           ( DELCOUNT NQ 0 OR NULLKEY NQ 0 OR FTRL[0] NQ MPRECLN )
            THEN BEGIN                                                   UPDTDMP
              SIGMA = DELCOUNT ;                                         UPDTDMP
              DELCOUNT = 1000000 ;                                       UPDTDMP
              PUTCOUNT = 0 ;                                             UPDTDMP
              MRQFWA = FTWSA[0] ;                                        UPDTDMP
              MRQLNG = FTRL[0] ;                                         UPDTDMP
              BIGPUT ( STAGE ) ;                                        005300
              IF RHO NQ 0                                                UPDTDMP
                THEN BEGIN #MUST UNDO PUT AND PRIOR DELETE#              UPDTDMP
                  IF PUTCOUNT NQ 0 THEN BIGDEL ( STAGE ) ;              005500
                  IF SIGMA NQ 0                                          UPDTDMP
                    THEN BEGIN                                           UPDTDMP
                      DELCOUNT = SIGMA ;                                 UPDTDMP
                      PUTCOUNT = 0 ;                                     UPDTDMP
                      MRQFWA = MPRECAF ;                                 UPDTDMP
                      MRQLNG = MPRECLN ;                                 UPDTDMP
                      BIGPUT ( STAGE ) ;                                005700
                      RHO = 1 ; #THAT BIGPUT WDVE ZEROED IT#
                    END                                                  UPDTDMP
                  GOTO MIPUPA ;                                         005900
                END                                                      UPDTDMP
            END                                                          UPDTDMP
                                                                         UPDTDMP
     MIPUPC:                                                            006100
          IF STAGE EQ 0                                                 006200
            THEN BEGIN                                                  006300
              STAGE = 1 ;                                               006400
              GOTO MIPUPD ;                                             006500
            END                                                         006600
       MIPUPA: STMD$AA ( 0 ) ;                                           UPDTDMP
          IF GOOGOO NQ 0
            THEN BEGIN
              TRN1$IS ( GOOGOO+FSKEYLOC[0] , FSKEYPOS[0] ,
                  PKL , LOC(FSDICOTAB[0]) ) ; #RECOLLATE IN BLOCK#
              BLCIP[FIXHOLD[3]-P<BLOK$AA>] = 0 ;
            END 
          UNFX$AA ( 3 ) ;                                                UPDTDMP
          IF FSRECCNT[0] NQ 0 THEN CURR$AA ;                             UPDTDMP
          KEYFWA = LOC(PRIMKEY[0]);  #SET KEYFWA AND KEYOFF TO POINT#    JJJ0526
          KEYOFF = 0;                #TO PRIMARY KEY FOR LATER USE#      JJJ0526
          IF RHO NQ 0 THEN DUPK$AA ( EC503 ) ;
          END                                                            UPDTDMP
                                                                         UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC ELIMSUB ; BEGIN                                                UPDTDMP
 #                                                                       UPDTDMP
* *   ELIMSUB - REMOVE A SUBFILE HEADER OR SUBBLOCK           PAGE 1     UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC ELIMSUB                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO SHORTEN THE CURRENT RECORD BY SQUEEZING OUT A SUBFILE           UPDTDMP
*     HEADER, OR A WHOLE SUBBLOCK, WHICH IT CONTAINS, TO CLEAR THE       UPDTDMP
*     SUBFILE FLAG IN ITS RECORD POINTER, AND TO MAKE ANY OTHER          UPDTDMP
*     NECESSARY ADJUSTMENTS IN THE CURRENT BLOCK.                        UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS IN CORE, AND IS LOCATED IN THE NORMAL        UPDTDMP
*     WAY BY RECFWA, RECLWA, AND RECLG. IT CONTAINS A SUBFILE HEADER     UPDTDMP
*     OR A SUBBLOCK.                                                     UPDTDMP
*                                                                        UPDTDMP
*     HOWEVER, IF THIS IS A SUBFILE HEADER, AND POINTS TO A BLOCK        UPDTDMP
*     AS CONSTITUTING THE SUBFILE, THAT BLOCK MUST HAVE BEEN ALREADY     UPDTDMP
*     SENT TO THE EMPTY CHAIN.                                           UPDTDMP
*                                                                        UPDTDMP
*     RNO IS THE RECORD NUMBER OF THE CURRENT RECORD WITHIN ITS BLOCK.   UPDTDMP
*                                                                        UPDTDMP
*     ONE OR MORE RECORDS IN THE CURRENT BLOCK MAY BE DEAD -- IT DOESNT  UPDTDMP
*       MATTER.                                                          UPDTDMP
*                                                                        UPDTDMP
*     THE RECORD POINTER OF THE CURRENT RECORD IS IN BITS 0-29           UPDTDMP
*     OF THE VARIABLE RECPTR. THE SUBFILE FLAG BIT IS PRESUMABLY         UPDTDMP
*     1, BUT WE SHALL ZERO IT WITHOUT LOOKING AT IT.                     UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE FUNCTION HAS BEEN ACCOMPLISHED, AND THE SUBFILE FLAG BIT       UPDTDMP
*     IS 0, IN RECPTR AS WELL AS IN THE CURRENT BLOCK. OTHERWISE,        UPDTDMP
*     ALL IS AS BEFORE.                                                  UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE.                                                              UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     RPPT$AA - TO PUT THE ALTERED RECORD POINTER BACK INTO THE BLOCK.   UPDTDMP
*     LWADJ - TO SQUEEZE THE SUBFILE HEADER OR SUBBLOCK OUT OF THE       UPDTDMP
*       CURRENT BLOCK, AND ADJUST EVERYTHING ACCORDINGLY.                UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          ALTR$AA ; 
          SUBFLAG = 0 ;                                                  UPDTDMP
          RPPT$AA ( RNO ) ;                                              UPDTDMP
          LWADJ ( RECLWA , -ABS(SFHLG[0]) ) ;                            UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC ENCLAVE ( S ) ; BEGIN ITEM S ;                                 UPDTDMP
 #                                                                       UPDTDMP
* *   ENCLAVE - CREATE AN EMPTY SUBBLOCK                       PAGE 1    UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC ENCLAVE                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO ADD AT THE END OF THE CURRENT LEVEL-2 RECORD, A NEW EMPTY       UPDTDMP
*     SUBBLOCK INTO WHICH A LEVEL-3 RECORD CAN AFTERWARDS BE INSERTED.   UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THERE IS ONE PARAMETER, PASSED IN THE NORMAL SYMPL WAY. THIS       UPDTDMP
*     TELLS THE NUMBER OF WORDS BY WHICH THE CURRENT RECORD MUST BE      UPDTDMP
*     EXTENDED, TO MAKE ROOM FOR THE 3-WORD EMPTY SUBBLOCK. IN           UPDTDMP
*     PRACTICE THIS IS 3 WHEN WE EXPECTED TO MAKE A SUBBLOCK, BUT 0      UPDTDMP
*     IF WE THOUGHT (IN ROUTINE NEWRASP) THERE WAS NOT ROOM FOR A        UPDTDMP
*     SUBBLOCK, THEN FOUND THERE WASNT EVEN ROOM FOR THE 3-WORD          UPDTDMP
*     SUBFILE HEADER, SO SPLIT THE OUTER BLOCK, THEN FOUND THERE WAS     UPDTDMP
*     ROOM FOR A SUBBLOCK AFTER ALL. BY THAT TIME, THE PARENT RECORD     UPDTDMP
*     HAS ALREADY BEEN EXTENDED BY 3 WORDS.                              UPDTDMP
*                                                                        UPDTDMP
*     IF THE PARAMETER IS NOT 0, IT IS KNOWN THAT THERE IS ROOM IN THE   UPDTDMP
*     LEVEL-2 BLOCK FOR THE EXPANSION.                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS AT LEVEL 2, AND HAS NO DAUGHTER SUBFILE      UPDTDMP
*     AS YET.                                                            UPDTDMP
*     IT IS LOCATED IN THE ORDINARY WAY BY RECFWA, RECLWA AND RECLG.     UPDTDMP
*     RNO IS ITS NUMBER WITHIN THE BLOCK.                                UPDTDMP
*                                                                        UPDTDMP
*     THERE ARE NO DEAD RECORDS IN THE CURRENT BLOCK.                    UPDTDMP
*                                                                        UPDTDMP
*     KEYLNGW IS THE NUMBER OF WORDS NEEDED TO CONTAIN A PRIMARY KEY     UPDTDMP
*       OF THE DATA FILE, HENCE THE LENGTH OF A LEVEL-3 RECORD IN WORDS  UPDTDMP
*                                                                        UPDTDMP
*     PKL IS THE LENGTH OF A PRIMARY KEY OF THE DATA FILE, AND HENCE THE UPDTDMP
*       LENGTH OF A LEVEL-3 RECORD, IN CHARACTERS.                       UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD HAS BEEN EXTENDED IF NECESSARY, AND UNIFORMITY  UPDTDMP
*     OF RECORDS IN THE LEVEL-2 BLOCK HAS BEEN ENDED IF IT EXISTED       UPDTDMP
*     PREVIOUSLY.                                                        UPDTDMP
*                                                                        UPDTDMP
*     THE RECORD POINTER FOR THE RECORD HAS A 1 IN THE POSITION          UPDTDMP
*     INDICATING A DEPENDENT SUBFILE, AND THE LAST THREE WORDS OF THE    UPDTDMP
*     RECORD CONTAIN A WELL-FORMED SUBFILE CONSISTING OF A SUBBLOCK      UPDTDMP
*     OF 0 RECORDS - THE 3 WORDS ARE SUBBLOCK HEADER, RECORD POINTER     UPDTDMP
*     WORD, WHICH WILL SERVE FOR ALL RECORDS IN THE SUBBLOCK, SINCE      UPDTDMP
*     THEY WILL BE UNIFORM, AND ONE WORD THAT SERVES AS AN ABBREVIATED   UPDTDMP
*     SUBFILE HEADER AND LEADS INTO THE WHOLE THING.                     UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     XXUR$AA - TO GIVE INDIVIDUAL RECORD POINTERS TO ALL THE RECORDS    UPDTDMP
*       IN THE LEVEL-2 BLOCK, IF THEY WERE PREVIOUSLY UNIFORM.           UPDTDMP
*     LWADJ - TO EXPAND THE CURRENT RECORD BY THE REQUIRED NUMBER OF     UPDTDMP
*       WORDS, WHICH MAY BE 0, MOVING FOLLOWING RECORDS AND ADJUSTING    UPDTDMP
*       RECORD POINTERS AS NECESSARY.                                    UPDTDMP
*     FNFWRD2 - TO SUPPLY THE THIRD OF THE THREE NEW WORDS, ALMOST       UPDTDMP
*       READY TO USE.                                                    UPDTDMP
*     RPGT$AA - TO FETCH THE RECORD POINTER OF THE LEVEL-2 RECORD,       UPDTDMP
*       INTO BITS 0-29 OF VARIABLE RECPTR.                               UPDTDMP
*     RPPT$AA - TO REPLACE THE SAME IN THE LEVEL-2 BLOCK, AFTER SETTING  UPDTDMP
*       ITS SUBFILE FLAG.                                                UPDTDMP
*     ALTR$AA - TO DO THE FORMALITIES BEFORE ALTERING THE LEVEL-2 BLOCK  UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          ALTR$AA ;                                                      UPDTDMP
          IF UR NQ 0 THEN XXUR$AA ;                                      UPDTDMP
          LWADJ ( RECLWA , S ) ;                                         UPDTDMP
          W[RECLWA-3] = 2**59 ; #UR=1,REST=0#                            UPDTDMP
          W[RECLWA-2] = KEYLNGW + 2**26 * ( 10*KEYLNGW - PKL ); #RECPTR# UPDTDMP
          W[RECLWA-1] = FNFWRD2 ;                                        UPDTDMP
          SFHLG[0] = -SUFHLG ; #MEANS SUFHLG,MAKES SFHSB=1#              UPDTDMP
          RPGT$AA ( RNO ) ;                                              UPDTDMP
          SUBFLAG = 1 ;                                                  UPDTDMP
          RPPT$AA ( RNO ) ;                                              UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC LWADJ ( J , K ) ; BEGIN ITEM J , K ;                           UPDTDMP
 #                                                                       UPDTDMP
* *   LWADJ - STRETCH OR CRUSH THE CURRENT RECORD             PAGE 1     UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC LWADJ                                                              UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO ALTER THE LENGTH OF THE CURRENT LEVEL-2 RECORD, BY ADDING       UPDTDMP
*     OR DROPPING WORDS AT ITS END. THIS IS DONE IN CONNECTION WITH      UPDTDMP
*     ADDING OR REMOVING A SUBFILE HEADER OR SUBBLOCK, OR ADDING OR      UPDTDMP
*     DELETING A RECORD IN A SUBBLOCK. ANY RECORDS FOLLOWING THE         UPDTDMP
*     CURRENT ONE ARE DISPLACED, AND THE RECORD POINTERS OF THE          UPDTDMP
*     CURRENT RECORD AND ANY FOLLOWING ONES HAVE TO BE ADJUSTED.         UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THERE ARE TWO PARAMETERS, PASSED IN THE NORMAL SYMPL WAY.          UPDTDMP
*                                                                        UPDTDMP
*       (1) THE FWA OF THE REGION THAT IS TO BE PICKED UP BODILY         UPDTDMP
*         AND MOVED. THE LWA+1 OF THIS AREA IS THE LWA+1 OF THE          UPDTDMP
*         LAST RECORD IN THE BLOCK.                                      UPDTDMP
*                                                                        UPDTDMP
*         THIS PARAMETER WILL BE THE LWA+1 OF THE CURRENT LEVEL-2        UPDTDMP
*         RECORD WHEN IT IS A QUESTION OF INSERTING OR DELETING THE      UPDTDMP
*         WHOLE SUBFILE HEADER OR SUBBLOCK. IT IS SOME ADDRESS WITHIN    UPDTDMP
*         THE SUBBLOCK WHEN IT IS A QUESTION OF INSERTING OR DELETING    UPDTDMP
*         A LEVEL-3 RECORD IN THE SUBBLOCK.                              UPDTDMP
*                                                                        UPDTDMP
*       (2) THE DISTANCE IN WORDS TO MOVE THE REGION. IT IS USUALLY      UPDTDMP
*         LENGTH OF THE WHOLE SUB-BLOCK OR SUBFILE HEADER, OR THE        UPDTDMP
*         LENGTH OF A LEVEL-3 RECORD, OR MINUS ONE OF THOSE.             UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT LEVEL-2 RECORD IS IN CORE, AND LOCATED NORMALLY BY     UPDTDMP
*       RECFWA, RECLWA, AND RECLG.                                       UPDTDMP
*                                                                        UPDTDMP
*     IF THE SECOND PARAMETER IS POSITIVE, IT MUST HAVE BEEN             UPDTDMP
*       ASCERTAINED ALREADY THAT THERE IS ROOM IN THE LEVEL-2 BLOCK      UPDTDMP
*       FOR THE MOVE.                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE RECORDS IN THE LEVEL-2 BLOCK MUST ALL HAVE THEIR INDIVIDUAL    UPDTDMP
*       RECORD POINTERS, AND THE UNIFORM RECORD FLAG IN THE BLOCK        UPDTDMP
*       HEADER MUST BE 0.                                                UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE BLOCK HAS BEEN ALTERED AS DESCRIBED ABOVE UNDER ((FUNCTION)).  UPDTDMP
*                                                                        UPDTDMP
*     RECFWA IS UNCHANGED, BUT RECLWA AND RECLG HAVE BEEN INCREASED      UPDTDMP
*       BY THE SECOND PARAMETER.                                         UPDTDMP
*                                                                        UPDTDMP
*     P<SFH$AA> = RECLWA-3, SO THAT IF THE RECORD STILL CONTAINS A       CY211
*       SUBFILE HEADER AFTER THE OPERATION, THE FIELDS OF THAT HEADER    UPDTDMP
*       CAN BE ACCESSED USING SUBSCRIPT [0].                             UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     MUVW$AA - TO DO THE ACTUAL MOVING OF THE GROUP OF RECORDS.         UPDTDMP
*                                                                        UPDTDMP
*     LWAD$AA - TO FIND THE LWA+1 OF THE LAST RECORD IN THE BLOCK.       UPDTDMP
*                                                                        UPDTDMP
*     RPGT$AA - TO FETCH EVERY RECORD POINTER THAT HAS TO BE ALTERED,    UPDTDMP
*       INTO BITS 0-29 OF VARIABLE RECPTR.                               UPDTDMP
*                                                                        UPDTDMP
*     RPPT$AA - TO REPLACE EACH ONE, AFTER ALTERING IT.                  UPDTDMP
*                                                                        UPDTDMP
*     ALTR$AA - TO DO THE FORMALITIES BEFORE ALTERING THE LEVEL-2 BLOCK. UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     RECPTR - USED BY RPGT$AA AND RPPT$AA.                              UPDTDMP
*                                                                        UPDTDMP
*     I IS USED AS SCRATCH.                                              UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          P<SFH$MP> = RECLWA + K - 3 ;                                   AFB0203
          IF K EQ 0 THEN RETURN ;                                        UPDTDMP
          ALTR$AA ;                                                      UPDTDMP
          MUVW$AA ( J , LWAD$AA(RC)+BLOCFWA-J , K ) ;                    UPDTDMP
          FOR I = RC STEP -1 UNTIL RNO                                   UPDTDMP
            DO BEGIN                                                     UPDTDMP
              RPGT$AA ( I ) ;                                            UPDTDMP
              RECPTR = RECPTR + K ;                                      UPDTDMP
              RPPT$AA ( I ) ;                                            UPDTDMP
            END                                                          UPDTDMP
          RECLWA = RECLWA + K ;                                          UPDTDMP
          RECLNG = RECLNG + K ;                                          UPDTDMP
          EC = EC - 2 * K ;                                              UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC MAKESF3 ; BEGIN                                                UPDTDMP
 #                                                                       UPDTDMP
* *   MAKESF3 - CREATE AN EMPTY LEVEL-3 SUBFILE            PAGE 1        UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC MAKESF3                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO REPLACE A LEVEL-2 RECORD THAT DOES NOT HAVE A DEPENDENT         UPDTDMP
*     SUBFILE, WITH THE SAME RECORD LENGTHENED BY 3 EXTRA WORDS AT THE   UPDTDMP
*     END, THESE BEING EITHER A SUBFILE HEADER THAT POINTS TO A LEVEL-3  UPDTDMP
*     SUBFILE OF ONE BLOCK, BUT CONTAINING NO RECORD SO FAR, OR ELSE     UPDTDMP
*     A SUBFILE HEADER AND SUBBLOCK, THE THREE WORDS BEING THE SUBBLOCK  UPDTDMP
*     HEADER, THEN THE RECORD POINTER THAT WILL SERVE FOR ANY RECORDS    UPDTDMP
*     WE LATER INSERT, THEN THE SHORT SUBFILE HEADER. THE SUBBLOCK       UPDTDMP
*     OPTION IS TAKEN IF AND ONLY IF THERE IS ENOUGH ROOM IN THE LEVEL-2 UPDTDMP
*     BLOCK, AT ENTRY, TO ENABLE US TO INSERT THIS EMPTY SUBBLOCK AND    UPDTDMP
*     THEN LATER TO INSERT ONE PRIMARY KEY VALUE INTO IT AS A RECORD.    UPDTDMP
*     IF THERE IS NOT THAT MUCH ROOM, MAYBE THERE IS STILL ROOM FOR A    UPDTDMP
*     3-WORD SUBFILE HEADER THAT POINTS TO A BLOCK, OR MAYBE WE HAVE     UPDTDMP
*     TO SPLIT THE LEVEL-2 BLOCK AND THEN DECIDE THE WHOLE QUESTION      UPDTDMP
*     OVER AGAIN.                                                        UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS A LEVEL-2 RECORD AND OMEGA=0 SO THAT WE ARE  UPDTDMP
*     AT LEVEL 2 IN ALL SENSES. THE RECORD IS IN CORE, AND RECFWA,       UPDTDMP
*     RECLWA, AND RECLG DESCRIBE IT IN THE NORMAL WAY.                   UPDTDMP
*     THE CURRENT RECORD CONTAINS NO SUBFILE HEADER OR SUBBLOCK.         UPDTDMP
*                                                                        CY211
*     THERE ARE NO DEAD RECORDS IN THE CURRENT BLOCK.                    CY211
*                                                                        UPDTDMP
*     KEYLNGW IS THE NUMBER OF WORDS NEEDED TO CONTAIN A PRIMARY KEY     UPDTDMP
*     IN THE DATA FILE, AND HENCE THE LENGTH OF ANY LEVEL-3 RECORD IN    UPDTDMP
*     THE MIP FILE.                                                      UPDTDMP
*                                                                        UPDTDMP
*     AKS IS THE FILE ORGANIZATION WHICH THE NEW SUBFILE IS TO HAVE.     UPDTDMP
*     THIS WAS SET BY KRAK$MP THE LAST TIME A KEY DEFINITION, IN THE     UPDTDMP
*     SHAPE OF A LEVEL-1 RECORD IN THE MIP FILE, WAS CRACKED.            UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD AT LEVEL 2 IS STILL CURRENT, AND STILL IN       UPDTDMP
*     CORE, AND OMEGA = 0. THE RECORD COULD BE IN A DIFFERENT BLOCK,     UPDTDMP
*     BECAUSE OF A BLOCK SPLIT.                                          UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD NOW POSSESSES A SUBFILE OF 0 RECORDS            UPDTDMP
*     DEPENDENT ON IT, AS DESCRIBED ABOVE UNDER ((FUNCTION)).            UPDTDMP
*                                                                        UPDTDMP
*     P<SFH$AA> = RECLWA-3, ALLOWING US TO LOCATE FIELDS OF THE NEW      CY211
*       SUBFILE HEADER USING SUBSCRIPT [0].                              UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     RCKN$AA - TO DECIDE IF THERE IS ROOM IN THE LEVEL-2 BLOCK TO       UPDTDMP
*       ADD A SUB-BLOCK, WITH ONE RECORD, TO THE CURRENT RECORD.         UPDTDMP
*     ENCLAVE - TO PUT THE 3-WORD EMPTY SUBBLOCK INTO THE LEVEL-2        UPDTDMP
*       RECORD.                                                          UPDTDMP
*     NEWRASP - TO PUT A 3-WORD SUBFILE HEADER POINTING TO AN EMPTY      UPDTDMP
*       BLOCK INTO THE LEVEL-2 RECORD. BUT IF THIS REQUIRES A BLOCK      UPDTDMP
*       SPLIT, AND IF AFTER THE SPLIT IT TURNS OUT THERE IS ROOM TO      UPDTDMP
*       USE A SUBBLOCK AFTER ALL, NEWRASP CALLS ENCLAVE AFTER ALL.       UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     SPLTFLG CONTAINS THE RESULT SET BY RCKN$AA. ALL THAT MATTERS       UPDTDMP
*       HERE IS THAT IT IS 0 IF AND ONLY IF THE JOB CAN BE DONE          UPDTDMP
*       WITHOUT A BLOCK SPLIT.                                           UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          NFHOLD = NEWFWA ;                                              RPN0127
          NEWLNG = 10 * ( RECLNG + KEYLNGW + 3 ) ;                       UPDTDMP
          RCKN$AA ( 0 , 1 ) ; #0=REPLACE,1=SUBFLAG#                      UPDTDMP
          IF SPLTFLG EQ 0                                                UPDTDMP
            THEN ENCLAVE ( 3 ) ;                                         UPDTDMP
            ELSE NEWRASP ;                                               UPDTDMP
          SFHFO[0] = AKS ;                                               UPDTDMP
          NEWFWA = NFHOLD ;                                              RPN0127
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC MAYCON ; BEGIN                                                 UPDTDMP
 #                                                                       UPDTDMP
* *   MAYCON - CALL CONS$AA BEFORE FIDDLING WITH SUBBLOCK     PAGE 1     UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC MAYCON                                                             UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO CALL CONS$AA, IF THERE ARE ANY DEAD RECORDS IN THE CURRENT      UPDTDMP
*     LEVEL-2 BLOCK, IN ORDER TO CONSOLIDATE SPACE BEFORE INSERTING      UPDTDMP
*     OR EXPANDING A SUBBLOCK. IF WE ARE ALREADY POSITIONED IN THE       UPDTDMP
*     SUBBLOCK, THE VALUES OF OMEGA AND QQ ARE ADJUSTED TO LEAVE US      UPDTDMP
*     POSITIONED AT THE SAME RECORD AS BEFORE.                           UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD, LOCATED BY RECFWA, RECLWA, AND RECLG, IS       UPDTDMP
*     AT LEVEL 2 AND IS IN CORE.                                         UPDTDMP
*                                                                        UPDTDMP
*     IF OMEGA=0, THE CURRENT RECORD DOES NOT CONTAIN A SUBBLOCK.        UPDTDMP
*     OTHERWISE, OMEGA IS THE FWA OF THE SUBBLOCK, AND QQ IS THE FWA     UPDTDMP
*     OF THE RECORD WITHIN IT AT WHICH WE ARE POSITIONED, OR THE LWA+1   UPDTDMP
*     OF THE LAST RECORD, OR THE EQUIVALENT IF THERE ARE REALLY NO       UPDTDMP
*     RECORDS IN THE SUBBLOCK AS YET.                                    UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE SAME, BUT ANY DEAD RECORDS AT LEVEL 2 IN THIS BLOCK HAVE       UPDTDMP
*     BEEN SQUEEZED OUT. OMEGA AND QQ HAVE THE SAME MEANING AS BEFORE,   UPDTDMP
*     AND HAVE BEEN ADJUSTED IF NECESSARY.                               UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     CONS$AA - TO DO THE WORK AT LEVEL 2, IF ANY THERE ARE ANY DEAD     UPDTDMP
*       RECORDS IN THE BLOCK.                                            UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     ZETA IS USED AS SCRATCH.                                           UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          IF ANYDEAD NQ 0                                                UPDTDMP
            THEN BEGIN                                                   UPDTDMP
              ZETA = RECFWA ;                                            UPDTDMP
              CONS$AA ;                                                  UPDTDMP
              IF OMEGA NQ 0                                              UPDTDMP
                THEN BEGIN                                               UPDTDMP
                  ZETA = RECFWA - ZETA ;                                 UPDTDMP
                  OMEGA = OMEGA + ZETA ;                                 UPDTDMP
                  QQ = QQ + ZETA ;                                       UPDTDMP
                END                                                      UPDTDMP
            END                                                          UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC NEWRASP ; BEGIN                                                UPDTDMP
 #                                                                       UPDTDMP
* *   NEWRASP - PUT A SUBFILE HEADER INTO A RECORD           PAGE 1      UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC NEWRASP                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO INSERT A NEW SUBFILE HEADER, POINTING TO A SUBFILE OF ONE       UPDTDMP
*     EMPTY BLOCK, IN THE CURRENT RECORD. HOWEVER, IT MAY TURN OUT       UPDTDMP
*     THAT THIS CAUSES A BLOCK SPLIT, AND THAT IF WE ARE GOING INTO      UPDTDMP
*     LEVEL 3, THERE IS NOW ROOM TO USE A SUBBLOCK RATHER THAN A         UPDTDMP
*     SUBFILE IN A NEW BLOCK. SO WE CHECK FOR THIS, AND SWITCH TO        UPDTDMP
*     THE SUBBLOCK METHOD, AFTER EXTENDING THE LENGTH OF THE LEVEL-2     UPDTDMP
*     RECORD BY 3 WORDS (LENGTH OF A STANDARD SUBFILE HEADER) BUT        UPDTDMP
*     BEFORE GETTING AN EMPTY BLOCK FOR THE NEW SUBFILE.                 UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS IN CORE, AND IS LOCATED IN THE NORMAL WAY    UPDTDMP
*     BY RECFWA, RECLWA, AND RECLG. THE RECORD IS LESS THAN 53 WORDS     UPDTDMP
*     LONG (NECESSARILY TRUE IN A MIP FILE, FOR ANY RECORD THAT DOES     UPDTDMP
*     NOT HAVE A SUBBLOCK WITHIN IT ALREADY), SO THAT IT CAN BE SAVED    UPDTDMP
*     TEMPORARILY IN ARRAY HOLD. WE CALL NEWRASP A FEW TIMES             UPDTDMP
*     AT LEVEL 1. THEN AT LEVEL 2 WE CALL IT ONLY WHEN FACED WITH        UPDTDMP
*     THE NECESSITY OF SOME KIND OF BLOCK SPLIT, WHEN SAVING THE         UPDTDMP
*     RECORD IN A FIXED ARRAY IS VERY HANDY.                             UPDTDMP
*                                                                        UPDTDMP
*     THE RECORD POINTER OF THE CURRENT RECORD IS IN BITS 0-29 OF        UPDTDMP
*     VARIABLE RECPTR.                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT BLOCK MAY HAVE UNIFORM RECORDS OR NOT. ON EXIT,        UPDTDMP
*     IT WILL NOT.                                                       UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE PURPOSE GIVEN ABOVE UNDER ((FUNCTION)) HAS BEEN ACHIEVED.      UPDTDMP
*                                                                        UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     MOVW$AA - TO SAVE THE RECORD IN ARRAY HOLD.                        UPDTDMP
*     PTRP$IS - TO REPLACE THE RECORD BY ITSELF, ENLARGED WITH 3         UPDTDMP
*       EXTRA WORDS OF GARBAGE AT THE END, MAKING ROOM FOR THE           UPDTDMP
*       SUBFILE HEADER.                                                  UPDTDMP
*     CURR$AA - TO POSITION US ON THE RECORD IN ITS NEW POSITION,        UPDTDMP
*       AFTER A PROBABLE BLOCK SPLIT.                                    UPDTDMP
*     ENCLAVE - TO SET UP A SUBBLOCK INSTEAD OF A SUBFILE HEADER,        UPDTDMP
*       IF THAT APPEARS POSSIBLE AFTER A BLOCK SPLIT.                    UPDTDMP
*     NUBL$AA - TO GET AN EMPTY BLOCK FOR THE NEW SUBFILE.               UPDTDMP
*     NEWSUBF - TO FILL UP THE FIELDS OF THE NEW SUBFILE HEADER, AND     UPDTDMP
*       TO CALL UNFX$AA TO RETURN THE OLD AND NEW BLOCKS TO THE          UPDTDMP
*       KICKOUT CHAIN, AND CLEAR FIXHOLD[0] AND FIXHOLD[1].              UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     NEWFWA AND NEWLG TELL PTRP$IS THE FWA AND LENGTH IN CHARACTERS     UPDTDMP
*       OF A NEW RECORD, WHILE BARREN=1 TELLS PTRP$IS THAT THE NEW       UPDTDMP
*       RECORD WILL CONTAIN A SUBFILE HEADER.                            UPDTDMP
*                                                                        UPDTDMP
*     KEYLNGW IS NUMBER OF WORDS NEEDED TO CONTAIN A PRIMARY KEY OF      UPDTDMP
*       THE DATA FILE, AND HENCE THE LENGTH IN WORDS OF ANY LEVEL-3      UPDTDMP
*       RECORD IN THE MIP FILE.                                          UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          NEWFWA = LOC(HOLD[0]) ;                                        UPDTDMP
          MOVW$AA ( RECFWA , RECLNG , NEWFWA ) ;                         UPDTDMP
          BARREN = 1 ;                                                   UPDTDMP
          NEWLNG = 10 * ( RECLNG+3 ) - UCCFIELD ;                        UPDTDMP
          PTRP$IS ( 0 ) ; #REPLACE#                                      UPDTDMP
          VARIANCE(CURLEV) = 1; 
          CURR$AA ;                                                      UPDTDMP
          IF CURLEV EQ 2 AND EC GQ 10*KEYLNGW                            UPDTDMP
            THEN BEGIN #CALLED BY MAKESF3,ENCLAVE AFTER ALL#             UPDTDMP
              ENCLAVE ( 0 ) ;                                            UPDTDMP
              RETURN ;                                                   UPDTDMP
            END                                                          UPDTDMP
          NUBL$AA ( 1 ) ;                                                UPDTDMP
          NEWSUBF ( 0 ) ;                                                UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC NEWSUBF ( N ) ; BEGIN ITEM N ;                                 UPDTDMP
 #                                                                       UPDTDMP
* *   NEWSUBF - FILL DETAILS INTO A NEW SUBFILE HEADER    PAGE 1         UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC NEWSUBF                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     ONCE A 3-WORD SUBFILE HEADER HAS BEEN ADDED TO A RECORD, AND       UPDTDMP
*     A NEW BLOCK SET UP AS THE SUBFILE, TO FILL INTO THE SUBFILE        UPDTDMP
*     HEADER THE INITIAL VALUES OF ALL ITS FIELDS.                       UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THERE IS ONE PARAMETER, PASSED IN THE NORMAL SYMPL WAY.            UPDTDMP
*     THIS IS THE RECORD COUNT TO BE INSERTED IN THE SUBFILE HEADER.     UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD, THAT CONTAINS THE NEW SUBFILE HEADER, IS IN    UPDTDMP
*     CORE AND RECFWA, RECLWA, AND RECLG LOCATE IT IN THE NORMAL WAY.    UPDTDMP
*                                                                        UPDTDMP
*     THE BLOCK THAT CONTAINS THE CURRENT RECORD, AND THE BLOCK THAT     UPDTDMP
*     CONTAINS THE NEW SUBFILE, HAVE BEEN TAKEN OUT OF THE KICK-OUT      UPDTDMP
*     CHAIN, AND THEIR FWAS HAVE BEEN STORED IN FIXHOLD[0] AND           UPDTDMP
*     FIXHOLD[1].                                                        UPDTDMP
*                                                                        UPDTDMP
*     NEWBNUM IS THE STARTING PRU NUMBER OF THE NEW BLOCK.               UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     ALL THE FIELDS OF THE NEW SUBFILE HEADER HAVE BEEN FILLED IN.      UPDTDMP
*                                                                        UPDTDMP
*     THE TWO BLOCKS HAVE BEEN RETURNED TO THE KICK-OUT CHAIN, AND       UPDTDMP
*     FIXHOLD[0] AND FIXHOLD[1] HAVE BEEN ZEROED.                        UPDTDMP
*                                                                        UPDTDMP
*     P<BLOK$AA> AND BLOCLWA POINT TO THE BLOCK CONTAINING THE CURRENT   UPDTDMP
*     RECORD (THEY NEED NOT HAVE DONE SO ON ENTRY.)                      UPDTDMP
*                                                                        UPDTDMP
*     P<SFH$AA> = RECLWA-3, SO THAT THE FIELDS OF THE NEW SUBFILE        CY211
*     HEADER CAN BE ACCESSED USING SUBSCRIPT [0] .                       UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     TROW$AA - TO SET P<BLOK$AA> AND BLOCLWA TO POINT TO THE BLOCK      UPDTDMP
*       CONTAINING THE CURRENT RECORD.                                   UPDTDMP
*     UNFX$AA - TO RETURN THAT BLOCK AND THE NEW ONE TO THE KICK-OUT     UPDTDMP
*       CHAIN, AND CLEAR THE FIXHOLD WORDS THAT POINTED TO THEM WHILE    UPDTDMP
*       OUT OF THE CHAIN.                                                UPDTDMP
*     ALTR$AA - TO DO THE FORMALITIES BEFORE ALTERING THE CURRENT        UPDTDMP
*       BLOCK IMAGE.                                                     UPDTDMP
*     FNFWRD2 - TO FETCH THE 3RD WORD OF THE FINF DESCRIBING THE NEW     UPDTDMP
*       SUBFILE, FROM THE FIAT.                                          UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          TROW$AA ( 0 ) ;                                                UPDTDMP
          ALTR$AA ;                                                      AFB0121
          P<SFH$MP> = RECLWA - 3 ;                                       UPDTDMP
          SFHRC[0] = N ;                                                 UPDTDMP
          SFHLV[0] = 0 ;                                                 UPDTDMP
          SFHFB[0] = NEWBNUM ;                                           UPDTDMP
          SFHFDB[0] = NEWBNUM ;                                          UPDTDMP
          SFHLB[0] = NEWBNUM ;                                           UPDTDMP
          SFHWD0[2] = FNFWRD2 ;                                          UPDTDMP
          SFHLG[0] = SUFHLG ; #MAKES SFHSB= 0#                           UPDTDMP
          UNFX$AA ( 1 ) ;                                                UPDTDMP
          UNFX$AA ( 0 ) ;                                                UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;
     PROC NEXSECKEY ; BEGIN                                              UPDTDMP
 #                                                                       UPDTDMP
* *   NEXSECKEY - EXTRACT NEXT ALTERNATE KEY FROM RECORD       PAGE 1    UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC NEXSECKEY                                                          UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     AS PART OF A PUT, DELETE, OR REPLACE INVOLVING A MIPPED FILE, TO   UPDTDMP
*     EXTRACT FROM A GIVEN RECORD, WHICH MAY BE NEW OR OLD, THE NEXT     UPDTDMP
*     VALUE OF THE CURRENT SPECIES OF ALTERNATE KEY AND COPY IT TO       UPDTDMP
*     ARRAY SECKEY. ((NEXT VALUE)) IN THE SENSE OF REPEATING GROUPS --   UPDTDMP
*     IF THIS ALTERNATE KEY SPECIES IS NOT MIXED UP WITH REPEATING       UPDTDMP
*     GROUPS, THEN NEXSECKEY WILL BE CALLED FOR THE ONE AND ONLY         UPDTDMP
*     OCCURRENCE IN THE GIVEN RECORD.                                    UPDTDMP
*                                                                        UPDTDMP
*     ALSO, IF THE CURRENT OPERATION IS A REPLACE, AND IF THERE IS       UPDTDMP
*     KNOWN TO BE JUST ONE OCCURRENCE OF THIS ALTERNATE KEY IN THE OLD   UPDTDMP
*     RECORD AND ONE IN THE NEW RECORD, AND IF THE TWO KEYS ARE          UPDTDMP
*     IDENTICAL IN VALUE, SO THAT MIP NEED NOT DO ANYTHING ABOUT THIS    UPDTDMP
*     PARTICULAR ALTERNATE KEY SPECIES FOR THIS SUBSTITUTION,            UPDTDMP
*     NEXSECKEY SETS COND = 0.                                           GAG1103
*                                                                        GAG1103
*     IF MPSPNL IS SET IN THIS KEYDEF, AND THE NEW VALUE OF THE          GAG1103
*     KEY IS BLANK OR ZERO, COND IS SET = 0.                             GAG1103
*                                                                        GAG1103
*     OTHERWISE COND IS SET NON-ZERO.                                    GAG1103
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     MPRECAF IS THE FWA OF THE BODY OF THE OLD RECORD.                  CY211
*     FTWSA[0] IS THE FWA OF THE BODY OF THE NEW RECORD.                 UPDTDMP
*     MRQFWA IS THE FWA OF WHATEVER RECORD WE ARE REALLY TO EXTRACT      UPDTDMP
*       THE KEY VALUE FROM.                                              UPDTDMP
*     AKC IS THE COUNT OF REMAINING OCCURRENCES OF THE CURRENT SPECIES   UPDTDMP
*       OF ALTERNATE KEY. AT LEAST 1.                                    UPDTDMP
*     AKW AND AKP ARE THE DISTANCE IN WORDS AND CHARACTERS FROM THE      UPDTDMP
*       START OF EITHER RECORD BODY, TO THE START OF THE NEXT KEY        UPDTDMP
*       OCCURRENCE.                                                      UPDTDMP
*     AKL IS THE LENGTH IN CHARACTERS OF THIS KEY.                       UPDTDMP
*     MPAKG[0] (WHICH WOULD HAVE A VARIABLE OF ITS OWN, CALLED AKG,      UPDTDMP
*       AND BE BROKEN OUT INTO IT IF IT WERE MORE FREQUENTLY USED)       UPDTDMP
*       IS THE LENGTH OF A REPEATING GROUP. IF NO REPEATING GROUPS,      UPDTDMP
*       ITS VALUE DOESNT MATTER. THEN AKC MUST BE 1 ON ENTRY.            UPDTDMP
*     AKT IS THE KEY TYPE.                                               UPDTDMP
*     FSSCCLG, A FLAG IN THE MIP FILE FSTT, IS TRUE IF ALTERNATE
*       KEYS ARE SUBJECT TO SPARSE-KEY CONTROL. 
*     FSSCCWD AND FSSCCPO ARE THE WORD AND CHARACTER NUMBERS THAT 
*       GIVE THE POSITION OF THE SPARSE-KEY CONTROL CHARACTER 
*       WITHIN THE RECORD, IF FSSCCLG IS TRUE.
*     MPSPNL IS A BIT IN THE KEYDEF THAT IS 1 IF NULL VALUES             GAG1103
*       OF THIS ALT KEY ARE TO BE IGNORED.                               GAG1103
*                                                                        UPDTDMP
*     AKC, AKW, AKP, AKL, AKT WERE ALL INITIALIZED BY KRAK$MP.           UPDTDMP
*     BB WAS ALSO SET BY KRAK$MP, TO 1 IF THIS IS A REPLACE AND SO       UPDTDMP
*       FORTH (SEE THE SPECIAL CASE MENTIONED UNDER FUNCTION ABOVE),     UPDTDMP
*       OR OTHERWISE TO 0.                                               UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     COND = 0 OR 1, AS EXPLAINED ABOVE UNDER FUNCTION.                  UPDTDMP
*     AKC HAS BEEN REDUCED BY 1.                                         UPDTDMP
*     AKW AND AKP HAVE BEEN UPDATED BY ADDING ADDING MPAKG[0] TO AKP,    UPDTDMP
*       THEN CONVERTING AKP TO TENS AND UNITS, ADDING THE NUMBER OF      UPDTDMP
*       TENS TO AKW, AND LEAVING THE UNITS IN AKP. THUS THEY ARE READY   UPDTDMP
*       TO POINT TO THE NEXT OCCURRENCE, IF THERE IS ANOTHER REPEATING   UPDTDMP
*       GROUP.                                                           UPDTDMP
*     IF COND IS NOT 0, THE CURRENT ALTERNATE KEY VALUE HAS BEEN COPIED  UPDTDMP
*       INTO ARRAY SECKEY, COLLATED IF SYMBOLIC.                         CY211
*     IF COND IS 0 ONLY BECAUSE THE ALTKEY VALUE THAT WOULD 
*      HAVE BEEN COPIED INTO SECKEY IS NULL (SEE EXPLANATION OF 
*      TENTH PARAMETER OF RMKDEF STATEMENT), THEN NULLKEY HAS 
*      BEEN SET TO 1. THIS IS ONLY INTERESTING TO SUBROUTINE
*      DLT$MP -- SEE THE COMMENT ON NULLKEY THERE.
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        CY211
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     CPCH$AA - TO COMPARE CORRESPONDING KEY VALUES IN THE OLD AND       UPDTDMP
*       NEW RECORD.                                                      UPDTDMP
*     MOVC$AA - TO MOVE A VALUE TO ARRAY SECKEY, AS A CHARACTER STRING.  UPDTDMP
*     TRN1$IS - TO COLLATE THAT VALUE IN PLACE, IF IT IS SYMBOLIC.       CY211
*     NULK$MP - TO DECIDE IF AN ALT KEY VALUE IS NULL.                   GAG1103
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     X IS USED AS SCRATCH.                                              UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
  
          ITEM B1 U, B2 U, C1 U, C2 U;
  
          COND = 1 ;                                                     UPDTDMP
          AKC = AKC - 1 ;                                                UPDTDMP
          IF BB NQ 0                                                     UPDTDMP
            THEN BEGIN                                                   UPDTDMP
              IF FSSCCLG
                THEN BEGIN
                  C1 = C<FSSCCPO>W[MPRECAF+FSSCCWD];
                  C2 = C<FSSCCPO>W[FTWSA[0]+FSSCCWD]; 
                  B1 = 0; 
                  B2 = 0; 
                  IF C1 NQ 0 AND C1 LS 48 
                    THEN B1 = B<C1>MPWRD1;
                  IF C2 NQ 0 AND C2 LS 48 
                    THEN B2 = B<C2>MPWRD1;
                  IF B1 NQ B2 
                    THEN GOTO NSKA; 
                END 
              CPCH$AA ( MPRECAF+AKW,AKP,FTWSA[0]+AKW,AKP,AKL,AKT ) ;     UPDTDMP
              IF COND EQ 0 THEN RETURN ;                                 UPDTDMP
            END                                                          UPDTDMP
      NSKA: 
          IF MPSPNL                                                      GAG1103
            THEN BEGIN                                                   GAG1103
              COND = NULK$MP ;                                           GAG1103
              IF COND EQ 0
                THEN BEGIN
                  NULLKEY = 1 ; 
                  RETURN ;
                END 
            END                                                          GAG1103
          MOVC$AA ( MRQFWA+AKW , AKP , LOC(SECKEY[0]) , 0 , AKL ) ;      UPDTDMP
          IF AKT EQ KT"SYMBOLIC"                                         UPDTDMP
            THEN TRN1$IS ( LOC(SECKEY[0]) , 0 , AKL , LOC(FSDICOTAB) ) ; UPDTDMP
          X = AKP + MPAKG[0] ;                                           UPDTDMP
          AKW = AKW + TENTH(X) ;                                         UPDTDMP
          AKP = MOD10(X) ;                                               UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC NUSK$MP ; BEGIN                                                UPDTDMP
 #                                                                       UPDTDMP
* *   NUSK$MP - START A LEVEL-2 SUBFILE HEADER                PAGE 1     UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC NUSK$MP                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO ADD TO THE CURRENT LEVEL-1 RECORD IN A MIP FILE, WHICH          UPDTDMP
*     PREVIOUSLY HAD NO SUBFILE, A SUBFILE HEADER POINTING TO A          UPDTDMP
*     SUBFILE OF ONE EMPTY BLOCK.                                        UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS AT LEVEL 1 IN A MIP FILE, IS IN CORE,        UPDTDMP
*       AND IS LOCATED IN THE NORMAL WAY BY RECFWA, RECLWA, AND RECLG.   UPDTDMP
*       IT HAS NO SUBFILE.                                               UPDTDMP
*     BITS 0-29 OF VARIABLE RECPTR CONTAIN ITS RECORD POINTER.           UPDTDMP
*     AKL AND AKT CONTAIN THE ALTERNATE KEY LENGTH AND TYPE,             UPDTDMP
*       ALREADY EXTRACTED FROM THE SAME LEVEL-1 RECORD BY KRAK$MP.       UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE FUNCTION HAS BEEN ACCOMPLISHED. THE CURRENT RECORD MIGHT       UPDTDMP
*     POSSIBLY BE IN A DIFFERENT BLOCK OR A DIFFERENT PLACE IN CORE      UPDTDMP
*     BECAUSE OF A BLOCK SPLIT.                                          UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     NEWRASP - TO DO EVERYTHING EXCEPT SETTING CORRECLY THE             UPDTDMP
*       KL AND KT FIELDS OF THE SUBFILE HEADER.                          UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
      ITEM I , J;                                                        AFB0214
                                                                         AFB0214
          NEWRASP ;                                                      UPDTDMP
          I = MOD10(AKL) ;                                               AFB0214
          IF I NQ 0                                                      AFB0214
          THEN                                                           AFB0214
              BEGIN                                                      AFB0214
              I = 10 - I;                                                AFB0214
              END                                                        AFB0214
          SFHKP = I ;                                                    AFB0214
          I = AKL - 1;                                                   AFB0214
          I = MOD10(I) ;                                                 AFB0214
          SFHKA = (PKL + I) / 10;                                        AFB0214
          SFHKL[0] = AKL ;                                               UPDTDMP
          SFHKT[0] = AKT ;                                               UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC PTRP$MP ; BEGIN                                                UPDTDMP
 #                                                                       UPDTDMP
* *   PTRP$MP - ADD A KEY PAIR TO A MIP FILE                 PAGE 1      UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC PTRP$MP                                                            UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     GIVEN AN ALTERNATE KEY VALUE AND A PRIMARY KEY VALUE, TO ADD       UPDTDMP
*     THEM INTO A MIP FILE. IF THE ALTERNATE KEY VALUE IS ALREADY THERE, UPDTDMP
*     THIS MEANS ADDING THE PRIMARY KEY VALUE TO THE ADJOINED LIST. IF   UPDTDMP
*     NOT, IT MEANS ADDING THE ALTERNATE KEY VALUE TO THE LIST FOR THAT  UPDTDMP
*     ALTERNATE KEY DEFINITION, WITH A LIST BELOW IT THAT CONSISTS OF    UPDTDMP
*     THE ONE PRIMARY KEY VALUE.                                         UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     ARRAY PRIMKEY CONTAINS THE PRIMARY KEY VALUE.                      UPDTDMP
*     PKL IS ITS LENGTH IN CHARACTERS.                                   UPDTDMP
*     KEYLNGW IS THE NUMBER OF WORDS NECESSARY TO CONTAIN IT.            UPDTDMP
*     PKT IS ITS TYPE.                                                   UPDTDMP
*                                                                        CY211
*     RHO = 0. PTRP$MP DOES NOT NEED THIS, BUT THE CALLER OF             CY211
*     PTRP$MP NEEDS IT, SO THAT IF PTRP$MP SETS RHO=1 TO                 CY211
*     INDICATE AN ERROR, IT WILL BE DISCERNIBLE.                         CY211
*                                                                        UPDTDMP
*     ARRAY SECKEY CONTAINS THE ALTERNATE KEY VALUE.                     UPDTDMP
*     AKL IS ITS LENGTH IN CHARACTERS.                                   UPDTDMP
*     AKS INDICATES WHETHER AND HOW A SERIES OF MORE THAN ONE            UPDTDMP
*       PRIMARY KEY CAN BE LISTED BELOW IT.                              UPDTDMP
*                                                                        UPDTDMP
*     THE MIP FILE IS CURRENT -- P<FSTT$AA> AND P<PTRE$AA> ARE           UPDTDMP
*       SET FOR IT RATHER THAN THE DATA FILE.                            UPDTDMP
*                                                                        UPDTDMP
*     THE PTREE POSITION INDICATES SOME RECORD IN A LEVEL-2              UPDTDMP
*       SUBFILE OF THE MIP FILE -- NAMELY THE SUBFILE THAT HANGS         UPDTDMP
*       FROM THE LEVEL-1 RECORD CONTAINING THE DEFINITION OF THE         UPDTDMP
*       CURRENT SPECIES OF ALTERNATE KEY.                                UPDTDMP
*                                                                        UPDTDMP
*       IF THAT LEVEL-1 RECORD HAS NO KEY VALUES BELOW IT YET, WE        UPDTDMP
*       MUST HAVE ALREADY CALLED NUSK$MP TO CREATE THE SHELL OF AN       UPDTDMP
*       EMPTY SUBFILE DEPENDENT ON IT, AND THEN LEVL$MP(2) TO GET        UPDTDMP
*       US INTO THAT SUBFILE, EVEN THOUGH AT THE EOI POSITION.           UPDTDMP
*                                                                        UPDTDMP
*     MPAKI[0], PART OF THE ALTERNATE KEY DEFINITION, OF WHICH A COPY    UPDTDMP
*       IS IN THE FIAT, IS 0 OR 1.                                       UPDTDMP
*                                                                        UPDTDMP
*       HERE IS THE ONE PLACE IT HAS ANY EFFECT. IF A BLOCK IN A         UPDTDMP
*       LEVEL-2 SUBFILE IS ABOUT TO BURST BECAUSE WE HAVE TO ADD A       UPDTDMP
*       RECORD TO A SUBBLOCK CONTAINED BY A RECORD IN THAT BLOCK,        UPDTDMP
*       THERE ARE TWO WAYS TO LET IT GO -- EITHER SPLIT THE LEVEL-2      UPDTDMP
*       BLOCK, OR SQUEEZE OUT THE SUBBLOCK AND LET A REGULAR LEVEL-3     UPDTDMP
*       SUBFILE DO ITS WORK INSTEAD.                                     UPDTDMP
*                                                                        UPDTDMP
*       WE SPLIT THE LEVEL-2 BLOCK IF MPAKI[0]=0 (EXPECTED TO BE ITS     UPDTDMP
*       DEFAULT VALUE) AND THE LEVEL-2 BLOCK CONTAINS MORE THAN ONE      UPDTDMP
*       RECORD, AND THE LENGTH OF THE SUBBLOCK IS LESS THAN HALF THAT    UPDTDMP
*       OF THE LEVEL-2 BLOCK. OTHERWISE EXTRUDE THE SUBBLOCK AND START   UPDTDMP
*       A NEW LEVEL-3 SUBFILE. THE FORMER METHOD SHOULD BE BETTER WHEN   UPDTDMP
*       THERE ARE NOT VERY MANY OCCURRENCES OF AN ALTERNATE KEY VALUE,   UPDTDMP
*       THE LATTER WHEN THERE ARE.                                       UPDTDMP
*                                                                        CY211
*     RHO = 0 .                                                          CY211
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     RHO = 0 IF ALL IS WELL.                                            UPDTDMP
*       OTHERWISE, THIS ALTERNATE KEY VALUE WAS ALREADY IN THE MIP       UPDTDMP
*       FILE, BUT ITS SPECIES IS ONE FOR WHICH THE KEY DEFINITION        UPDTDMP
*       SAYS NO DUPLICATION IS ALLOWED. THE MIP FILE HAS NOT BEEN        UPDTDMP
*       CHANGED.                                                         UPDTDMP
*                                                                        UPDTDMP
*     EITHER WAY, THE MIP FILE IS STILL POSITIONED SOMEWHERE IN THE      UPDTDMP
*       SAME LEVEL-2 SUBFILE.                                            UPDTDMP
*                                                                        UPDTDMP
*     COND = 0 IF THE COMBINATION OF THIS ALTERNATE KEY VALUE AND        UPDTDMP
*       PRIMARY KEY VALUE WAS FOUND TO BE ALREADY IN THE MIP FILE.       UPDTDMP
*       THIS CAN HAPPEN ONLY WHEN THE ALTERNATE KEY DEFINITION ALLOWS    UPDTDMP
*       FOR REPEATING GROUPS, AND TWO GROUPS IN THE SAME RECORD HAVE     UPDTDMP
*       THE SAME VALUE FOR THIS KEY. MIP IGNORES SUCH DUPLICATIONS.      UPDTDMP
*     COND = 1 IN THE NORMAL CASE, WHEN THE COMBINATION WAS NOT ALREADY  UPDTDMP
*       IN THE MIP FILE, AND HAS NOW BEEN RECORDED THERE.                UPDTDMP
*                                                                        UPDTDMP
*     VARIANCE(2) = 1 IF THIS WAS A NEW ALTERNATE KEY VALUE, SO THAT
*       WE HAVE ADDED TO A LEVEL-2 SUBFILE, BUT NOT YET UPDATED THE      UPDTDMP
*       SUBFILE HEADER IN THE PARENT RECORD.                             UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     RHO = 1 IS AN ERROR CONDITION, BUT PTRP$MP DOES NOT RESPOND TO     UPDTDMP
*       IT. PTRP$MP DETECTS IT AND PASSES THE NON-ZERO RHO BACK TO THE   UPDTDMP
*       CALLER AS AN ERROR INDICATION.                                   UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     WKKY$IS - TO SEEK A MATCH FOR A KEY IN AN I-S SUBFILE AT           UPDTDMP
*       LEVEL 1.                                                         UPDTDMP
*     GOKY$MP - TO SEEK A MATCH FOR A KEY IN A LIST OF PRIMARY KEY       UPDTDMP
*       VALUES, WHICH MAY BE I-S OR FIFO, AND MAY BE A PROPER SUBFILE    UPDTDMP
*       AT LEVEL 3, OR A SUBBLOCK WITHIN A LEVEL-2 RECORD.               UPDTDMP
*     MOVC$AA - TO COPY A KEY IN THE FORM OF A CHARACTER STRING.         UPDTDMP
*     PTRP$IS - TO INSERT A RECORD IN AN I-S SUBFILE, OR, IN A UNIQUE    UPDTDMP
*       USE OF IT, TO SPLIT THE CURRENT BLOCK OF A LEVEL-2 I-S SUBFILE,  UPDTDMP
*       AS IF TO INSERT A BIG NEW RECORD, AND THEN DO NO INSET AFTER     UPDTDMP
*       ALL. THIS IS DONE AS A WAY OF ENABLING US TO INCREASE THE SIZE   UPDTDMP
*       OF A SUBBLOCK SOMEWHERE IN THAT CURRENT LEVEL-2 BLOCK.           UPDTDMP
*     CPCH$AA - TO COMPARE THE GIVEN PRIMARY KEY WITH THE ONE IN THE     UPDTDMP
*       LEVEL-2 RECORD, I.E. THE FIRST IN THE LIST FOR THIS ALTERNATE    UPDTDMP
*       KEY VALUE.                                                       UPDTDMP
*     MOVW$AA - TO COPY A KEY IN THE FORM OF A SERIES OF WORDS, WHEN     UPDTDMP
*       THIS SIMPLER METHOD IS ALLOWABLE.                                UPDTDMP
*     ALTR$AA - TO DO THE FORMALITIES BEFORE ALTERING A BLOCK IMAGE --   UPDTDMP
*       NORMALLY THIS IS CALLED FROM A ROUTINE THAT ALTERS A BLOCK IN    UPDTDMP
*       A MORE SPECIFIC WAY. BUT HERE PTRP$MP ALTERS A BLOCK IN          UPDTDMP
*       A WAY ALL ITS OWN, REPLACING THE PRIMARY KEY VALUE AT THE        UPDTDMP
*       BEGINNING OF A LEVEL-2 RECORD BY A LOWER PRIMARY KEY VALUE,      UPDTDMP
*       WITHOUT CHANGING THE REST OF THE RECORD.                         UPDTDMP
*     DNLV$MP - TO MOVE FROM A LEVEL-2 RECORD TO THE FIRST RECORD        UPDTDMP
*       IN THE DEPENDENT LEVEL-3 SUBFILE, OR IN THE CONTAINED SUBBLOCK.  UPDTDMP
*     UPLV$MP - TO DO THE REVERSE.                                       UPDTDMP
*     SEBL$AA - TO LOCATE THE CURRENT BLOCK ACCORDING TO THE PTREE.      UPDTDMP
*       LIKE ALTR$AA, NORMALLY CALLED THROUGH SOME INTERMEDIARY.         UPDTDMP
*       BUT HERE PTRP$MP HAS TO LOCATE THE ONE BLOCK OF A SUBFILE THAT   UPDTDMP
*       CONTAINS NO RECORDS YET, BUT TO WHICH A BLOCK HAS BEEN           UPDTDMP
*       ASSIGNED. THIS IS UNUSUAL.                                       UPDTDMP
*     RPPT$AA - TO PUT THE RECORD POINTER INTO THE BLOCK, IN THE         UPDTDMP
*       CASE MENTIONED 3 LINES ABOVE.                                    UPDTDMP
*     RCKN$AA - TO CALCULATE WHETHER A NEW RECORD WILL FIT INTO A        UPDTDMP
*       SUBBLOCK. WE DONT CALL IT WHEN THE NEW RECORD IS TO GO INTO      UPDTDMP
*       A REAL BLOCK, BECAUSE THE ORDINARY PUT ROUTINE HANDLES           UPDTDMP
*       EVERYTHING. BUT WITH SUBBLOCKS, WE DO EVERYTHING FOR             UPDTDMP
*       OURSELVES USING HOMEMADE TOOLS.                                  UPDTDMP
*     PUTSB - A HOMEMADE TOOL FOR ADDING A RECORD TO A SUBBLOCK, ONCE    UPDTDMP
*       WE KNOW THERE IS ROOM.                                           UPDTDMP
*     CURR$AA - LOCATES THE CURRENT RECORD, ACCORDING TO THE PTREE.      UPDTDMP
*       WE HAVE TO MAKE A SEPARATE CALL TO THIS JUST ONCE, AFTER THE     UPDTDMP
*       SPECIAL CALL TO PTRP$IS THAT SPLITS A BLOCK WITHOUT ADDING TO    UPDTDMP
*       IT. THAT BEING AN UNUSUAL SITUATION, WE USE CURR$AA TO MAKE      UPDTDMP
*       SURE AFTERWARDS.                                                 UPDTDMP
*     SQUSUB - TO CONVERT A SUBBLOCK TO A REGULAR SUBFILE AT LEVEL 3.    UPDTDMP
*       DONE WHEN WE WANT TO EXPAND THE SUBBLOCK BUT THERE IS NO         UPDTDMP
*       ROOM IN THE CONTAINING PHYSICAL BLOCK.                           UPDTDMP
*     MAKESF3 - TO PUT A SUBFILE HEADER INTO A LEVEL-2 RECORD AND        CY211
*       PROVIDE IT WITH AN EMPTY SUB-FILE (1 EMPTY BLOCK) OR AN          CY211
*       EMPTY SUBBLOCK.                                                  CY211
*     MAYCON - TO SQUEEZE OUT OF THE CURRENT LEVEL-2 BLOCK ANY DEAD      CY211
*       RECORDS, AND TO ADJUST OMEGA AND QQ ACCORDINGLY, AS WELL         CY211
*       AS RECFWA ETC.                                                   CY211
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     KEYFWA - USED TO SPECIFY THE KEY FWA TO WKKY$IS OR GOKY$MP.        UPDTDMP
*     NEWFWA, NEWLG, BARREN - USED TO SPECIFY THE FWA, LENGTH IN         UPDTDMP
*       CHARACTERS, AND FREEDOM FROM A SUBFILE, OF THE RECORD TO BE      UPDTDMP
*       INSERTED BY PTRP$IS OR PUTSB.                                    UPDTDMP
*     QMF - A RESULT SET BY WKKY$IS OR GOKY$MP. 1 FOR MATCH, 0 FOR NONE. UPDTDMP
*     COND - AS WELL AS BEING USED BY PTRP$MP TO SIGNIFY RESULT,         CY211
*       THIS IS USED MY CPCH$AA, CALLED WITHIN PTRP$MP, AS A             CY211
*       RESULT -- 0 FOR EQUAL COMPARANDS, NEGATIVE IF THE SECOND         CY211
*       COMPARAND IS GREATER, POSITIVE NON-ZERO IF THE FIRST             CY211
*       COMPARAND IS GREATER.                                            CY211
*     OMEGA - AFTER CALLING DNLV$MP, OMEGA IS CHECKED TO SEE IF WE       CY211
*       ARE IN A REAL LEVEL-3 SUBFILE (OMEGA=0) OR JUST A SUBBLOCK       CY211
*       (OMEGA NON-ZERO).                                                CY211
*     RECPTR IS THE VARIABLE FROM WHICH RPPT$AA TAKES A RECORD           CY211
*       POINTER TO INSERT IN A BLOCK. HERE PTRP$MP CONSTRUCTS            CY211
*       A NEW RECORD POINTER IN RECPTR.                                  CY211
*     SPLTFLG IS WHERE RCKN$AA RETURNS ITS RESULT. HERE WE ARE ONLY      CY211
*       INTERESTED IN ZERO/NONZERO -- THE ADDITION CAN OR CANNOT         CY211
*       BE MADE WITHOUT SPLITTING THE CURRENT BLOCK.                     CY211
*     NFHOLD IS USED TO SAVE AND RESTORE NEWFWA ACROSS A CALL TO         CY211
*       PTRP$IS. THIS IS BECAUSE IF PTRP$IS CAUSES CHANGES TO            CY211
*       INDEX RECORDS, IT WILL USE NEWFWA TO POINT TO NEW RECORDS        CY211
*       THAT IT GENERATES. ORDINARILY THAT IS HARMLESS, BUT HERE         CY211
*       PTRP$IS IS BEING USED IN A PECULIAR WAY, AND NEWFWA              CY211
*       REFERS TO SOMETHING QUITE DIFFERENT.                             CY211
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
CONTROL EJECT;                                                           JJJ0209
      ITEM I , J ;                                                       AFB0214
                                                                         AFB0214
      ARRAY [0:25] S(1) ;                                                AFRB030
      ITEM TANK U(0,0,60) ;                                              AFRB030
                                                                         JJJ0209
          KEYFWA = LOC(SECKEY[0]) ;                                      UPDTDMP
          NEWFWA = LOC(PRIMKEY[0]) ;                                     UPDTDMP
          WKKY$IS  ( 1 ) ;                                               UPDTDMP
          IF QMF EQ 0                                                    UPDTDMP
            THEN BEGIN                                                   UPDTDMP
              I = KLOC;                                                  AFB0214
              J = KPOS;                                                  AFB0214
              MOVC$AA (KEYFWA , 0 , NEWFWA+I , J , AKL) ;                AFB0214
              NEWLNG = 10*I + J + AKL ;                                  AFB0214
              BARREN = 0 ;                                               UPDTDMP
              PTRP$IS ( 1 ) ;#INSERT#                                    UPDTDMP
              VARIANCE(2) = 1;
            END                                                          UPDTDMP
            ELSE BEGIN                                                   UPDTDMP
              IF AKS EQ FO"UNIQUE"                                       UPDTDMP
                THEN BEGIN                                               UPDTDMP
                  RHO = 1 ;                                              UPDTDMP
                  RETURN ;                                               UPDTDMP
                END                                                      UPDTDMP
              CPCH$AA(RECFWA,0,NEWFWA,0,PKL,PKT) ;                       UPDTDMP
              IF COND EQ 0 THEN RETURN ;                                 UPDTDMP
              IF COND GR 0 AND AKS EQ FO"IS"                             UPDTDMP
                THEN BEGIN #NEW ONE IS LOW#                              UPDTDMP
                  ALTR$AA ;                                              UPDTDMP
                  MOVW$AA ( RECFWA , KEYLNGW , LOC(TANK[0]) ) ;          AFRB030
                  MOVC$AA ( NEWFWA,0,RECFWA,0,PKL) ;                     UPDTDMP
                  NEWFWA = LOC(TANK[0]) ;                                AFRB030
                END                                                      UPDTDMP
              IF SUBFLAG EQ 0 THEN MAKESF3 ;                             UPDTDMP
     BIGPUTA:                                                            AM2A089
              DNLV$MP ( 0 ) ;                                            AM2A089
              KEYFWA = NEWFWA ;                                          UPDTDMP
              IF OMEGA EQ 0                                              UPDTDMP
                THEN BEGIN                                               UPDTDMP
                  NEWLNG = PKL ;                                         UPDTDMP
                  IF RECCNT EQ 0                                         UPDTDMP
                    THEN BEGIN                                           UPDTDMP
                      SEBL$AA ( CURPTR , 1 ) ;                           UPDTDMP
                      ALTR$AA ; 
                      MOVW$AA ( NEWFWA , KEYLNGW , BLOCFWA ) ;           UPDTDMP
                      RC = 1 ;                                           UPDTDMP
                      RECCNT = 1 ;                                       UPDTDMP
                      EC = MAXMT - 2 * KEYLNGW - 1 ;                     UPDTDMP
                      UR = 1 ;                                           UPDTDMP
                      RECPTR = KEYLNGW ;                                 UPDTDMP
                      UCCFIELD = 10 * KEYLNGW - NEWLNG ;                 UPDTDMP
                      RPPT$AA ( 1 ) ;                                    UPDTDMP
                    END                                                  UPDTDMP
                    ELSE BEGIN                                           UPDTDMP
                      GOKY$MP ( 1 ) ;                                    UPDTDMP
                      IF QMF NQ 0                                        UPDTDMP
                        THEN BEGIN                                       UPDTDMP
          BIGPUTB:        COND = 0 ;                                     UPDTDMP
                          UPLV$MP;                                       JJJ0523
                          RETURN ;                                       UPDTDMP
                        END                                              UPDTDMP
                      BARREN = 0 ;                                       UPDTDMP
                      PTRP$IS ( 1 ) ; #INSERT#                           UPDTDMP
                    END                                                  UPDTDMP
                  VARIANCE(3) = 1;
                END                                                      UPDTDMP
                ELSE BEGIN # SUBBLOC #                                   UPDTDMP
                  NEWLNG = 10 * ( RECLNG + KEYLNGW ) ;                   UPDTDMP
                  MAYCON ;                                               AFB0415
                  RCKN$AA ( 0 , 1 ) ;                                    UPDTDMP
                  IF SPLTFLG EQ 0                                        UPDTDMP
                    THEN BEGIN #ADD TO SUBBLOCK#                         UPDTDMP
                      NEWLNG = PKL ;                                     UPDTDMP
                      GOKY$MP ( 1 ) ;                                    UPDTDMP
                      IF QMF NQ 0 THEN GOTO BIGPUTB ;                    UPDTDMP
                      PUTSB ;                                            UPDTDMP
                    END                                                  UPDTDMP
                    ELSE BEGIN                                           UPDTDMP
                      IF MPAKI[0] EQ 0 AND RC NQ 1 AND RECLNG LQ BLKLG/2 UPDTDMP
                        THEN BEGIN                                       UPDTDMP
                          UPLV$MP ;                                      UPDTDMP
                          NEWLNG = -1 ;                                  UPDTDMP
                          NFHOLD = NEWFWA ;                              RPN0127
                          PTRP$IS ( 0 ) ; #JUST DOES A BLOCKSPLIT#       UPDTDMP
                          VARIANCE(2) = 1;
                          CURR$AA ;                                      UPDTDMP
                          NEWFWA = NFHOLD ;                              RPN0127
                        END                                              UPDTDMP
                        ELSE SQUSUB ;                                    UPDTDMP
                      GOTO BIGPUTA ;                                     UPDTDMP
                    END                                                  UPDTDMP
                END                                                      UPDTDMP
              UPLV$MP ; #UPDATES SFH IF NOT SUBBLOCK#                    UPDTDMP
            END                                                          UPDTDMP
          COND = 1 ; #WE HAVE ADDED 1 KEY#                               UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC PUTSB ; BEGIN                                                  UPDTDMP
 #                                                                       UPDTDMP
* *   PUTSB - INSERT A RECORD IN A SUBBLOCK                  PAGE 1      UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC PUTSB                                                              UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO ADD A NEW RECORD, CONSISTING OF A PRIMARY KEY VALUE FROM        UPDTDMP
*     THE DATA FILE, LEFT JUSTIFIED, AT THE CURRENT POSITION IN A        UPDTDMP
*     LEVEL-3 SUBFILE THAT HAS THE FORM OF A SUBBLOCK.                   UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS AT LEVEL 2 AND CONTAINS A SUBBLOCK.          UPDTDMP
*     THIS RECORD IS IN CORE, AND RECFWA, RECLWA, AND RECLG              UPDTDMP
*     DESCRIBE IT NORMALLY.                                              UPDTDMP
*                                                                        UPDTDMP
*     OMEGA IS THE FWA OF THE SUBBLOCK.                                  UPDTDMP
*                                                                        UPDTDMP
*     QQ IS THE FWA OF THE CURRENT RECORD IN THE SUBBLOCK, BEFORE        UPDTDMP
*       WHICH THE NEW RECORD IS TO BE INSERTED. IF THE NEW RECORD        UPDTDMP
*       IS TO GO AT THE END OF THE SUBBLOCK, OR IF THE SUBBLOCK          UPDTDMP
*       CONTAINS NO RECORD TO START WITH, QQ=RECLWA-2.                   CY211
*                                                                        UPDTDMP
*     NEWFWA IS THE FWA OF THE NEW RECORD, WHICH IS LEFT JUSTIFIED.      UPDTDMP
*                                                                        UPDTDMP
*     KEYLNGW IS THE NUMBER OF WORDS IN A PRIMARY KEY, ROUNDED UP,       UPDTDMP
*       AND HENCE THE LENGTH OF A RECORD AT LEVEL 3.                     UPDTDMP
*                                                                        UPDTDMP
*     IT IS ALREADY KNOWN THAT THERE IS ROOM IN THE LEVEL-2 BLOCK        UPDTDMP
*       THAT CONTAINS THE WHOLE THING, TO ADD ONE RECORD TO THE          UPDTDMP
*       SUBBLOCK.                                                        UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     THE RECORD HAS BEEN ADDED TO THE SUBBLOCK. THE SUBBLOCK HEADER     UPDTDMP
*       WORD, AND THE SUBFILE HEADER (ONE WORD THAT COMES AT THE END,    UPDTDMP
*       AND IS THE ANALOG TO THE LAST OF THE 3 WORDS IN A PROPER         UPDTDMP
*       SUBFILE HEADER FOR A PROPER SUBFILE) HAVE BEEN UPDATED.          UPDTDMP
*       SINCE THE PARENT RECORD AT LEVEL 2 HAS EXPANDED, ONE OR MORE     UPDTDMP
*       RECORD POINTERS IN THE LEVEL-2 BLOCK HAVE BEEN ALTERED.          UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     ALTR$AA - TO DO THE FORMALITIES BEFORE ALTERING THE SUBBLOCK       CY211
*       SINCE THAT ALTERS THE PHYSICAL BLOCK THAT CONTAINS IT.           CY211
*                                                                        UPDTDMP
*     LWADJ - TO MOVE EVERYTHING FROM THE POINT OF INSERTION, DOWN       UPDTDMP
*       TO THE END OF THE LAST RECORD OF THE LEVEL-2 BLOCK, TO MAKE      UPDTDMP
*       ROOM FOR THE INSERTION, AND TO ADJUST THE LEVEL-2 RECORD         UPDTDMP
*       POINTERS, FROM THE CURRENT TO THE LAST RECORD IN THE BLOCK,      UPDTDMP
*       ACCORDINGLY.                                                     UPDTDMP
*                                                                        UPDTDMP
*     MOVW$AA - TO COPY IN THE NEW RECORD.                               UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     X IS USED AS SCRATCH.                                              UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          ALTR$AA ; 
          X = SUBBLOCRC1 + 1 ;                                           UPDTDMP
          SUBBLOCRC1 = X ;                                               UPDTDMP
          SUBBLOCRC2 = X ;                                               UPDTDMP
          LWADJ ( QQ , KEYLNGW ) ;                                       UPDTDMP
          MOVW$AA ( NEWFWA , KEYLNGW , QQ ) ;                            UPDTDMP
          SFHLG[0] = SFHLG[0] - KEYLNGW ; #SFHLG IS NEGATIVE#            UPDTDMP
          END                                                            UPDTDMP
CONTROL EJECT;                                                           JJJ0209
     PROC SQUSUB ; BEGIN                                                 UPDTDMP
 #                                                                       UPDTDMP
* *   SQUSUB - REPLACE A SUBBLOCK BY A REAL SUBFILE            PAGE 1    UPDTDMP
* *   A.F.R.BROWN                                                        UPDTDMP
* 1DC SQUSUB                                                             UPDTDMP
*                                                                        UPDTDMP
* DC  FUNCTION                                                           UPDTDMP
*                                                                        UPDTDMP
*     TO SQUEEZE A SUBBLOCK OUT OF A RECORD IN A LEVEL-2 SUBFILE OF      UPDTDMP
*     A MIP FILE, THUS SHORTENING THE RECORD, AND REPLACE IT WITH A      UPDTDMP
*     SUBFILE CONTAINING THE SAME RECORDS IN ONE PHYSICAL BLOCK.         UPDTDMP
*                                                                        UPDTDMP
* DC  ENTRY CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     THE CURRENT RECORD IS A LEVEL-2 RECORD, IT IS IN CORE, AND         UPDTDMP
*     RECFWA, RECLWA, AND RECLG LOCATE IT IN THE NORMAL WAY.             UPDTDMP
*                                                                        UPDTDMP
*     THIS RECORD CONTAINS A SUBBLOCK, OF WHICH OMEGA IS THE FWA.        UPDTDMP
*     SO LOGICALLY WE ARE AT LEVEL 3, EVEN THOUGH CURLEV=2 AND THE       UPDTDMP
*     PTREE IS ONLY VALID IN LEVELS 1 AND 2.                             UPDTDMP
*                                                                        UPDTDMP
*     P<SFH> = RECLWA-100 AND SO LOCATES THE SUBFILE HEADER AT THE       UPDTDMP
*       END OF THE LEVEL-2 RECORD IN THE NORMAL WAY, ALLOWING US TO      UPDTDMP
*       NAME ITS FIELDS WITH SUBSCRIPT [0].                              UPDTDMP
*                                                                        UPDTDMP
* DC  EXIT CONDITIONS                                                    UPDTDMP
*                                                                        UPDTDMP
*     A BLOCK HAS BEEN ADDED TO THE FILE (OR TAKEN BACK FROM ITS         UPDTDMP
*     EMPTY CHAIN) AND IT CONSTITUTES A LEVEL-3 SUBFILE AND CONTAINS     UPDTDMP
*     THE RECORDS PREVIOUSLY CONTAINED BY THE SUBBLOCK.                  UPDTDMP
*                                                                        UPDTDMP
*     THE RECORD AT LEVEL 2 THAT WAS CURRENT ON ENTRY IS STILL           UPDTDMP
*     CURRENT, BUT OMEGA=0, SO WE ARE AT LEVEL 2 IN EVERY SENSE.         UPDTDMP
*     THIS RECORD NO LONGER CONTAINS A SUBBLOCK, BUT RATHER A            UPDTDMP
*     3-WORD SUBFILE HEADER POINTING TO THE NEW BLOCK.                   UPDTDMP
*                                                                        UPDTDMP
* DC  ERROR CONDITIONS                                                   UPDTDMP
*                                                                        UPDTDMP
*     NONE                                                               UPDTDMP
*                                                                        UPDTDMP
* DC  CALLED ROUTINES                                                    UPDTDMP
*                                                                        UPDTDMP
*     NUBL$AA - TO GET A NEW BLOCK FOR THE NEW SUBFILE.                  UPDTDMP
*     MOVW$AA - TO MOVE THE LEVEL-3 RECORDS FROM THE SUBBLOCK INTO       UPDTDMP
*       THE NEW BLOCK.                                                   UPDTDMP
*     TROW$AA - TO CHANGE P<BLOK$AA> AND BLOCLWA FROM POINTING TO        UPDTDMP
*       THE NEW BLOCK, AS THEY WERE SET BY NUBL$AA, AND BRING THEM       UPDTDMP
*       BACK TO THE BLOCK WE STARTED FROM.                               UPDTDMP
*     LWADJ - TO MODIFY A BLOCK BY MOVING EVERYTHING FROM SOME POINT     UPDTDMP
*       IN THE CURRENT RECORD, DOWN TO THE END OF THE LAST RECORD,       UPDTDMP
*       AS ONE CHUNK, AND ALTERING THE RECORD POINTERS OF THE CURRENT    UPDTDMP
*       AND FOLLOWING RECORDS ACCORDINGLY. HERE WE MOVE THIS CHUNK IN    UPDTDMP
*       SUCH A WAY AS TO SQUEEZE THE SUBBLOCK OUT OF THE CURRENT RECORD. UPDTDMP
*     NEWSUBF - TO SET UP THE FIELDS IN A 3-WORD AREA ALREADY EXISTING   UPDTDMP
*       AT THE END OF THE CURRENT RECORD, FOR A SUBFILE HEADER.          UPDTDMP
*       ALSO, AS A MATTER OF CONVENIENCE, NEWSUBF CALLS UNFX$AA FOR      UPDTDMP
*       THE OLD AND NEW BLOCKS, TO RETURN THEM TO THE KICKOUT CHAIN      UPDTDMP
*       AND CLEAR FIXHOLD[0] AND FIXHOLD[1].                             UPDTDMP
*     UPLV$MP - TO RETURN LOGICALLY TO THE PARENT RECORD AT LEVEL 2.     UPDTDMP
*       ON ENTRY WE WERE LOGICALLY IN THE SUBBLOCK, BUT THIS NO          UPDTDMP
*       LONGER EXISTS. TO AVOID EMBARRASSMENT, UPLV$MP IS CALLED HERE    UPDTDMP
*       TO GET BACK TO LEVEL 2. ON EXIT FROM SQUSUB, THE CALLER WILL     UPDTDMP
*       CALL DNLV$MP TO GET BACK TO LEVEL 3, BUT IN THE NEW BLOCK.       UPDTDMP
*                                                                        UPDTDMP
* DC  NON-LOCAL VARIABLES                                                UPDTDMP
*                                                                        UPDTDMP
*     ARRAY FIXHOLD CONTAINS FWAS OF BLOCKS THAT HAVE BEEN REMOVED       UPDTDMP
*       FROM THE KICKOUT CHAIN AND FROZEN IN CORE. NUBL$AA FREEZES       CY211
*       THE STARTING BLOCK, PUTTING ITS ADDRESS IN FIXHOLD[0].           UPDTDMP
*       NEWSUBF UNFREEZES IT.                                            UPDTDMP
*     Q IS USED FOR SCRATCH.                                             UPDTDMP
*                                                                        UPDTDMP
 #                                                                       UPDTDMP
          NUBL$AA ( 1 ) ;                                                UPDTDMP
          RC = SUBBLOCRC1 ;                                              UPDTDMP
          UR = 1 ;                                                       UPDTDMP
          Q = (-SFHLG[0]) - SUFHLG ;                                     UPDTDMP
          MOVW$AA ( OMEGA+1 , Q , BLOCFWA ) ;                            UPDTDMP
          #RPWORD(1) = W[LOC(SFHLG[0])-1] #                              UPDTDMP
          W[BLOCLWA-1] = W[LOC(SFHLG[0])-1] ;                            UPDTDMP
          EC = MAXMT - 2 * Q - 1 ;                                       UPDTDMP
          TROW$AA ( 0 ) ;                                                UPDTDMP
          LWADJ ( RECLWA-1 , -Q ) ;                                      UPDTDMP
          NEWSUBF ( BLRECNT[FIXHOLD[1]-P<BLOK$AA>] ) ;                   UPDTDMP
          SFHFO[0] = AKS ;                                               AFB0121
          UPLV$MP ;                                                      UPDTDMP
          END                                                            UPDTDMP
          END   TERM                                                     UPDTDMP
