*DECK,MPGNDMP 
*CALL COMUSETXT 
USETEXT AAMMIPB ; 
     PROC MPGN$MP; BEGIN                                                 KDEFDMP
                                                                         KDEFDMP
     XREF BEGIN                                                          KDEFDMP
          FUNC SPAR$MP B;                                                GBK0204
          FUNC NULK$MP ;                                                 GAG1103
          FUNC SPRD$AA;                                                  CY211
          PROC NUKD$AA ;                                                 KDEFDMP
          PROC TRN1$IS;                                                  CIM0408
          PROC SPKY$AA;                                                  CIM0527
          PROC KRAK$MP ;                                                 KDEFDMP
          PROC MUVW$AA ; # SHOULD BE MUVW$AA #                           KDEFDMP
          PROC MOVC$AA ; # SHOULD BE MOVC$AA #                           KDEFDMP
          PROC MOVW$AA ; # SHOULD BE MOVW$AA #                           KDEFDMP
          PROC LEVL$MP ;                                                 KDEFDMP
          PROC UPLV$MP ;                                                 KDEFDMP
            PROC MSGZ$AA  ;                                              GAG1103
          PROC DNLV$MP ;                                                 KDEFDMP
          PROC IMPR$AA; 
          PROC CURR$AA ; # SHOULD BE CURR$AA #                           KDEFDMP
          PROC GOFI$AA ; # SHOULD BE GOFI$AA #                           KDEFDMP
          PROC SKPF$AA ; # SHOULD BE SKPF$AA #                           KDEFDMP
          PROC PTRP$IS ; # SHOULD BE PTRP$IS #                           KDEFDMP
          PROC DLTE$IS ; # SHOULD BE DLTE$IS #                           KDEFDMP
          PROC STMD$AA ; # SHOULD BE STMD$AA #                           KDEFDMP
          LABEL SAM$END ;                                                KDEFDMP
          FUNC MXPR$AA ;                                                 WAT
          FUNC UUCC$AA ;                                                 WAT
          PROC STEP$DA ;                                                 WAT
          PROC SETR$AA ;                                                 WAT
          PROC WKKY$IS ; # SHOULD BE WKKY$IS #                           KDEFDMP
          PROC PTRP$MP ;                                                 KDEFDMP
          PROC CCAL$AA;                                                  KDEFDMP
          PROC NUSK$MP ;                                                 KDEFDMP
          PROC FIXX$AA ; # SHOULD BE FIXX$AA #                           KDEFDMP
          PROC UNFX$AA ; # SHOULD BE UNFX$AA #                           KDEFDMP
          PROC SEBL$AA ; # SHOULD BE SEBL$AA #                           KDEFDMP
          PROC LOCB$AA ;                                                 KDEFDMP
          PROC DUPK$AA ;
          PROC LOCR$AA ; # SHOULD BE LOCR$AA #                           KDEFDMP
          LABEL FERR$MG ;  #IN MIPGEN#                                   AFB1109
          END                                                            KDEFDMP
                                                                         KDEFDMP
     XDEF BEGIN                                                          KDEFDMP
          PROC MGPT$MP;                                                  KDEFDMP
          PROC MGGT$MP;                                                  KDEFDMP
          ARRAY MGKD$MP[ 63 ] S( 2 );                                    KDEFDMP
                BEGIN                                                    CIM0330
                  ITEM KEYDEF1 I(0,0,60) = [64(0)];                      CIM0330
                  ITEM KEYDEF2 I(1,0,60) = [64(0)];                      CIM0330
                END                                                      CIM0330
          END                                                            KDEFDMP
                                                                         KDEFDMP
                                                                         KDEFDMP
      ITEM I , X , Y ;                                                   WAT
                                                                         KDEFDMP
     CONTROL REACTIVE FSTT$AA ; #******TEMPO AGAINST BUG IN SYMPL 1.2#   KDEFDMP
                                                                         KDEFDMP
     PROC MGPT$MP; BEGIN ITEM ALPHA = -1, BETA = 0;                      KDEFDMP
 #                                                                       CY211
* *   MGPT$MP - GET NEXT KEY PAIR DURING         PAGE  1                 AM2A077
* *             FIRST PHASE OF MIPGEN                                    AM2A077
* *   A.F.R.BROWN/C.I.MACDONALD                                          CY211
* 1DC MGPT$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     IN THE FIRST PHASE OF A MIPGEN RUN, THE DATA FILE IS SCANNED FROM  CY211
*     START TO FINISH, USING A LIST OF ALTERNATE KEY DEFINITIONS. FOR    CY211
*     EVERY ALTERNATE KEY VALUE THAT CAN BE EXTRACTED FROM EACH RECORD,  CY211
*     MGPT$MP IS TO SET UP THE COMBINATION OF THE RELEVANT KEY           CY211
*     DEFINITION, THE ALTERNATE KEY VALUE, AND THE PRIMARY KEY VALUE OF  CY211
*     THE SAME RECORD.                                                   CY211
*                                                                        CY211
*     MPGT$MP RUNS AS A CYCLE WITHIN A CYCLE WITHIN A CYCLE.             CY211
*     THE OUTERMOST CYCLE CONSISTS OF READING EACH RECORD OF             CY211
*     THE DATA FILE IN TURN. THE MIDDLE CYCLE CONSISTS OF GOING          CY211
*     THROUGH THE LIST OF ALTERNATE KEY DEFINITIONS. THE INNERMOST       CY211
*     CYCLE CONSISTS OF SCANNING ONE RECORD, USING ONE ALTERNATE         CY211
*     KEY DEFINITION, TO GET ALL THE VALUES OF THAT ALTERNATE KEY        CY211
*     WHICH THE RECORD CONTAINS. ONLY WHEN AN ALTERNATE KEY IS           CY211
*     DEFINED AS OCCURRING IN A REPEATING GROUP DOES THIS INNER          CY211
*     CYCLE CONSIST OF MORE THAN ONE STEP.                               CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     AN IMPORTANT CONDITION IS THAT ONCE THE FILE TO BE MIPPED          CY211
*     HAS BEEN OPENED, IT IS TOUCHED ONLY BY MGPT$MP AND SUBROUTINES     CY211
*     CALLED BY MGPT$MP, UNTIL AFTER MGPT$MP HAS BEEN EXECUTED           CY211
*     FOR THE LAST TIME.                                                 CY211
*                                                                        CY211
*     ARRAY MGKD$MP CONSISTS OF TWO-WORD ITEMS, THE WORDS BEING NAMED    CY211
*     KEYDEF1 AND KEYDEF2. THIS IS THE LIST OF ALTERNATE KEY DEFINITIONS CY211
*     KEYDEF1 DEFINES THE ALTERNATE KEY BY POSITION, LENGTH, AND         CY211
*     REPEATING GROUP POSSIBILITIES. KEYDEF2 DESCRIBES ((SPARSE KEY))    CY211
*     RESTRICTIONS IF ANY. THE FIRST KEYDEF1 MAY, FOR HISTORICAL         CY211
*     REASONS, MERELY DESCRIBE THE PRIMARY KEY, IN WHICH CASE IT IS TO   CY211
*     BE IGNORED. THE EFFECTIVE PART OF THE ARRAY IS TERMINATED BY A     CY211
*     ZERO KEYDEF1.                                                      CY211
*                                                                        CY211
*     ONE OR MORE KEY DEFINITIONS IN THE ARRAY MAY (IF THIS RUN IS A     CY211
*     MODIFICATION MIPGEN RATHER THAN AN INITIAL MIPGEN ON THE DATA      CY211
*     FILE) CONTAIN A KEY TYPE NUMBER OF 3. THIS IS A SIGNAL TO          CY211
*     PURGE AN EXISTING SET OF VALUES FROM THE MIP FILE, RATHER THAN     CY211
*     TO ADD IN A NEW SET OF VALUES. THIS JOB IS NOT HANDLED THROUGH     CY211
*     MGPT$MP, AND SO WHENEVER MGPT$MP STRIKES SUCH AN ENTRY IN          CY211
*     THE KEYDEF LIST, IT SKIPS OVER IT.                                 CY211
*                                                                        CY211
*     ALPHA IS THE ORDINAL OF OUR CURRENT POSITION IN THE KEYDEF LIST.   CY211
*     SO IT MEASURES PROGRESS IN THE SECOND OF THE THREE CYCLES.         CY211
*     HOWEVER, ALPHA IS COMPILED AS -1, SO THAT A NEGATIVE VALUE         CY211
*     TELLS MGPT$MP TO INITIALIZE THE OUTERMOST CYCLE (SCANNING THE      CY211
*     DATA FILE.)                                                        CY211
*                                                                        CY211
*     BETA IS THE COUNTER FOR THE THIRD OR INNERMOST CYCLE.              CY211
*     FOR EACH KEYDEF, WE CALL KRAK$MP TO BREAK IT UP AND SET, AMONG     CY211
*     OTHER THINGS, AKC TO THE NUMBER OF TIMES THE REPEATING GROUP       CY211
*     CONTAINING THE ALTERNATE KEY WILL OCCUR, ACCORDING TO THE KEYDEF   CY211
*     AND THE LENGTH OF THE PARTICULAR RECORD. THEN THE INNER CYCLE,     CY211
*     FOR THIS INPUT RECORD AND THIS KEYDEF, CONSISTS OF AKC REPETITIONS CY211
*                                                                        CY211
*     WHEN MGPT$MP IS FIRST CALLED, P<FIT$AA> AND P<FIAT$AA> MUST        CY211
*     POINT TO THE FIT AND FIAT OF THE DATA FILE, AND THE FILE MUST      CY211
*     HAVE BEEN PROPERLY OPENED FOR READING. BUT APART FROM THIS,        CY211
*     THE ENTRY CONDITIONS FOR MGPT$MP ARE JUST THE CONDITIONS           CY211
*     WHICH MGPT$MP LEFT BEHIND ON ITS PRECEDING EXECUTION.              CY211
*                                                                        CY211
*     THE PTREE OF THE DATA FILE MARKS OUR PROGRESS THROUGH THE          CY211
*     FILE, WHICH IS CONTROLLED BY MGPT$MP. AKW AND AKP MARK OUR         CY211
*     PROGRESS THROUGH EACH SERIES OF REPEATING GROUPS.                  CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     WHEN MGPT$MP COMES TO THE END OF THE OUTER CYCLE, IT DOES          CY211
*     NOT EXIT NORMALLY BUT JUMPS TO SAM$END.                            CY211
*                                                                        CY211
*     OTHERWISE, THE CURRENT KEY DEFINITION IS IN CELL                   CY211
*     FAPOSKEY1[0] OF THE FIAT, THE CURRENT ALTERNATE KEY VALUE          CY211
*     IS IN THE AREA OF THE FIAT TO WHICH FAPKY2ADR[0] POINTS,           CY211
*     AND THE CURRENT PRIMARY KEY VALUE IS IN THE AREA TO WHICH          CY211
*     FAPKY3ADR[0] POINTS, AND BOTH HAVE BEEN COLLATED IF SYMBOLIC.      CY211
*     THESE AREAS ARE CONTIGUOUS, AND OCCUR IN THIS ORDER, SO            CY211
*     THAT THE ROUTINE THAT CALLS MGPT$MP CAN PASS THIS GROUP            CY211
*     OF THREE THINGS STRAIGHT ON TO THE SORT ROUTINE.                   CY211
*                                                                        CY211
*     APART FROM THIS, THE EXIT CONDITIONS ARE MERELY THE                CY211
*     ENTRY CONDITIONS THAT WILL BE FOUND THE NEXT TIME                  CY211
*     MGPT$MP IS CALLED. THEY DO NOT REPRESENT COMMUNICATION             CY211
*     BETWEEN MGPT$MP AND SOME OTHER ROUTINE.                            CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     STMD$AA - TO POINT EVERYTHING AT THE DATA FILE, INITIALLY.         CY211
*     GOFI$AA ALIAS GOSTARTFILE - TO REWIND IT INITIALLY.                CY211
*     CURR$AA - TO LOCATE THE CURRENT BLOCK AND RECORD, AS               CY211
*       SPECIFIED BY THE PTREE.                                          CY211
*     SKPF$AA - TO MOVE FORWARD ONE RECORD IN AN IS FILE.                WAT
*     STEP$DA - TO MOVE FORWARD ONE RECORD IN A DA FILE.                 WAT
*     UUCC$AA - A FUNCTION THAT RETURNS THE UCC FIELD OF THE RECORD      WAT
*       POINTER OF A RECORD CHOSEN BY NUMBER.                            WAT
*     SETR$AA - TO LOCATE AND POSITION AT, AND SET THE PTREE WORD        WAT
*       TO POINT AT, A RECORD CHOSEN BY NUMBER.                          WAT
*     SPRD$AA - TO DECOMPRESS A COMPRESSED RECORD.                       CY211
*     SPKY$AA - TO COPY THE PRIMARY KEY VALUE OUT OF A RECORD.           CY211
*     TRN1$IS - DECOLLATE THE PRIMARY KEY WITHIN THE RECORD,             CY211
*       IF SYMBOLIC. BASICALLY MIP IS ONLY INTERESTED IN THE             CY211
*       COLLATED FORM OF THE PRIMARY KEY, BUT IT IS ALWAYS               CY211
*       POSSIBLE THAT SOME ALTERNATE KEY LIES PARTLY INSIDE              CY211
*       AND PARTLY OUTSIDE THE PRIMARY KEY AREA. SO FOR SAFETY           CY211
*       WE DECOLLATE THE PRIMARY KEY IN PLACE. THEN IF SUCH              CY211
*       AN ALTERNATE KEY OCCURS, IT CAN BE EXTRACTED AND THEN            CY211
*       COLLATED INTO SOME SPECIAL BUFFER. IT WOULD SAVE TIME            CY211
*       TO NOTE AT THE VERY BEGINNING WHETHER ANY SUCH ALT               CY211
*       KEYS HAVE BEEN DEFINED, AND TO SKIP THE TRN1$IS CALL             CY211
*       IF NONE.                                                         CY211
*     KRAK$MP - TO BREAK UP THE PACKED KEY DEFINITION, AND SET           CY211
*       AKW, AKP, AKL, AKT, AKS, AKG, AND AKC. THE PARAMETER SENT        CY211
*       TO KRAK$MP HAS TO BE NON-ZERO TO GET AKG AND AKC SET.            CY211
*       IT IS NEGATIVE -- THIS THE ONLY TIME -- TO PREVENT               CY211
*       KRAK$MP FROM CALLING STMD$AA TO FOCUS ON THE MIP FILE            CY211
*       (WHICH MAY NOT EXIST YET).                                       CY211
*     MOVC$AA - TO COPY AN ALTERNATE KEY VALUE INTO A SAVE AREA.         CY211
*     TRN1$IS (AGAIN) - TO COLLATE THE SAVED ALTERNATE KEY               CY211
*       VALUE, IF SYMBOLIC.                                              CY211
*                                                                        CY211
*     SPAR$MP - TO HANDLE THE QUESTION OF SPARSE KEYS, RETURNING         CY211
*       A 0 VALUE IF THE KEY DEFINITION AND THIS RECORD COMBINE          CY211
*       TO REQUIRE THE ALTERNATE KEY VALUE TO BE USED, OR A 1            CY211
*       VALUE IF THE ALTERNATE KEY VALUE IN THIS RECORD IS               CY211
*       CONSIDERED INSIGNIFICANT.                                        CY211
*     NULK$MP - TO DECIDE IF AN ALT KEY VALUE IS NULL.                   GAG1103
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     X - USED FOR SCRATCH.                                              CY211
*     SIGMA - SET TO THE LENGTH IN WORDS OF THE LONGEST ALTERNATE        CY211
*       KEY KNOWN FOR THIS DATA FILE. IT IS NEEDED BY SUBROUTINE         CY211
*       MGGT$MP, WHICH IS CALLED IN THE SECOND HALF OF THE MIPGEN        CY211
*       PROCESS.                                                         CY211
*     MRQFWA AND MRQLNG - USED TO HOLD THE FWA AND LENGTH IN             CY211
*       CHARACTERS OF THE CURRENT DATA RECORD, OR ITS DECOMPRESSED       CY211
*       VERSION IF COMPRESSED.                                           CY211
*     RECFWA AND RECLNG - THE FWA AND LENGTH IN WORDS OF THE             CY211
*       CURRENT RECORD, AS IT ACTUALLY SITS IN THE BLOCK IMAGE.          CY211
*     OUTKEY - THE NUMBER OF WORDS OF NON-EMBEDDED KEY THAT              CY211
*       COME AT THE BEGINNING OF THE RECORD IN THE BLOCK IMAGE.          CY211
*       0 IF THE KEY IS EMBEDDED.                                        CY211
*     CBUFAD - THE FWA OF THE COMPRESSION/DECOMPRESSION BUFFER.          CY211
*       NOT NEEDED IF THE DATA FILE HAS NO COMPRESSION.                  CY211
*     AKT - KEY TYPE NUMBER SET BY KRAK$MP - 1 SYMBOLIC, 2               CY211
*       SIGNED BINARY INTEGER, 3 UNSIGNED DITTO, -1 PURGE.               CY211
*     AKW AND AKP - KEY STARTING ADDRESS AND CHARACTER POSITION          CY211
*       SET UP BY KRAK$MP AND AFTERWARDS ADVANCED IF THERE ARE           CY211
*       REPEATING GROUPS.                                                CY211
*     AKL - LENGTH OF ALTERNATE KEY IN CHARACTERS, SET BY                CY211
*       KRAK$MP.                                                         CY211
*     AKC - NUMBER OF REPEATING GROUPS IN THIS RECORD, SET BY            CY211
*       KRAK$MP. 1 IF NO REPETITION, JUST OCCURRENCE.                    CY211
*     AKG - LENGTH IN CHARACTERS OF REPEATING GROUP, SET BY              CY211
*       KRAK$MP. INSIGNIFICANT IF AKC = 1.                               CY211
*                                                                        CY211
 #                                                                       CY211
          IF ALPHA LS 0                                                  KDEFDMP
            THEN BEGIN                                                   KDEFDMP
              STMD$AA ( 0 ) ;  # FIRST TIME ONLY #                       KDEFDMP
              SIGMA = WLG ( FSMXALTKY[FTMIPFS-P<FSTT$AA>] ) ;            WAT
              IF FSFILEORG[0] EQ FO"IS"                                  WAT
                THEN BEGIN                                               WAT
                  GOSTARTFILE ;                                          WAT
                  GOTO MPRC ;                                            WAT
                END                                                      WAT
                ELSE BEGIN                                               WAT
                  IF FSFILEORG[0] EQ FO"DA"                              WAT
                    THEN BEGIN                                           WAT
                      PTREEWRD[1] = PRU3 ; #DA REWIND#                   RJC1006
                      CURPTR = 1 ;                                       RJC1006
                    END                                                  WAT
                    ELSE BEGIN                                           WAT
                      PTREEWRD[3] = PRU3 ;  #AK#                         WAT
                      CURPTR = 3 ;                                       WAT
                    END                                                  WAT
                END                                                      WAT
      MPRA:   CURR$AA ;                                                  KDEFDMP
              XFER = 0 ;                                                 KDEFDMP
              X = PARENTORG ;                                            KDEFDMP
              IF X EQ FO"IS"                                             KDEFDMP
                THEN SKPF$AA ;                                           KDEFDMP
                ELSE BEGIN                                               KDEFDMP
                  IF X EQ FO"DA"                                         WAT
                    THEN BEGIN                                           WAT
                      STEP$DA ( 1 ) ;                                    WAT
                    END                                                  WAT
                    ELSE BEGIN                                           WAT
AKSTEP:                                                                  WAT
                      SEBL$AA ( 3 , 1 ) ;                                WAT
                      FOR X = PTCUREC[3]+1 STEP 1 UNTIL RC               WAT
                        DO BEGIN                                         WAT
                          Y = UUCC$AA ( X ) ;                            WAT
                          IF Y NQ DEAD AND Y NQ OVERFLOW                 WAT
                            THEN BEGIN                                   WAT
                              SETR$AA ( X ) ;                            WAT
                              IF RPUCC EQ ALIEN                          WAT
                                THEN BEGIN                               WAT
                                  RPUCC = B<0,4>W[RECFWA] ;              WAT
                                  X = B<36,24>W[RECFWA] ;                WAT
                                  Y = B<22,13>W[RECFWA] ;                WAT
                                  RECFWA = RECFWA + 1 ;                  WAT
                                  RECLNG = RECLNG - 1 ;                  WAT
                                END                                      WAT
                                ELSE BEGIN                               WAT
                                  Y = X ;                                WAT
                                  X = BLOCKID[0] ;                       WAT
                                END                                      WAT
                              GOTO MPRC ;                                WAT
                            END                                          WAT
                        END                                              WAT
                      PTREEWRD[3] = BLOCKID[0] + FSBLKSIZ[0] ;           WAT
                      IF PTREEWRD[3] GQ MXPR$AA                          WAT
                        THEN BEGIN                                       WAT
                          GOTO SAM$END ;                                 WAT
                        END                                              WAT
                        ELSE BEGIN                                       WAT
                          GOTO AKSTEP ;                                  WAT
                        END                                              WAT
                    END                                                  WAT
                END                                                      KDEFDMP
      MPRC:   IF QEI NQ 0 THEN GOTO SAM$END ;                            KDEFDMP
              IF FTFNF[0] NQ 0 THEN GOTO FERR$MG ;                       AFB1109
              MRQFWA = RECFWA + OUTKEY ;                                 KDEFDMP
              MRQLNG = 10*(RECLNG - OUTKEY) - UCCFIELD;                  KDEFDMP
              IF FSCOMPACT[0] NQ 0 AND RPCMP NQ 0                        WAT
                THEN BEGIN                                               WAT
                  MRQLNG = SPRD$AA ( MRQFWA , MRQLNG ) ;                 WAT
                  MRQFWA = CBUFAD ;                                      WAT
                END                                                      WAT
              IF PARENTORG EQ FO"AK"                                     WAT
                THEN BEGIN                                               WAT
                  W[FAPKY3ADR]=(((X-PRU3)/FSBLKSIZ)*FSBKFACTR+Y)         WAT
                             * 2 ** ((WC-KLENG)*CHSZB) ;                 WAT
                END                                                      WAT
                ELSE BEGIN                                               WAT
                  SPKY$AA ( FAPKY3ADR[0] ) ;                             WAT
                END                                                      WAT
              IF KTYPE EQ KT"SYMBOLIC" AND OUTKEY EQ 0
              THEN                                                       CIM0504
                  BEGIN                                                  CIM0504
                  TRN1$IS ( MRQFWA+KLOC , KPOS , KLENG ,
                           LOC(FSCODITAB[FTMIPFS - P<FSTT$AA>]) );       GAG1012
                  END                                                    CIM0504
              ALPHA = 0 ;                                                KDEFDMP
              IF B<KDKDDM>KEYDEF1[0] EQ FSPKD[ FTMIPFS[0]-P<FSTT$AA> ]   GBK0107
                THEN ALPHA = 1 ;                                         KDEFDMP
      MPRB:   BETA = 0 ;                                                 KDEFDMP
            END                                                          KDEFDMP
          IF BETA EQ 0                                                   KDEFDMP
            THEN BEGIN                                                   KDEFDMP
              IF KEYDEF1[ ALPHA ] EQ 0 THEN GOTO MPRA;                   GBK0204
              MPAKD[0] = KEYDEF1[ ALPHA ];                               KDEFDMP
              MPWRD1 = KEYDEF2[ ALPHA ];                                 GBK0204
              IF SPAR$MP THEN GOTO MPRD ;                                GAG1103
              KRAK$MP ( -1 ) ;                                           KDEFDMP
              IF AKT LS 0  THEN  GOTO MPRD;  #IGNORE PURGE#              JJJ0114
              FAPOSKEY1[0] = MPAKD[0] ;                                  KDEFDMP
              FOR I=0 STEP 1 UNTIL SIGMA - 1                             RJC1026
                DO BEGIN                                                 RJC1023
                  FAPOSK2[I] = 0 ;                                       RJC1023
                END                                                      RJC1023
            END                                                          KDEFDMP
      MPRE:                                                              GAG1103
          BETA = BETA + 1 ;                                              KDEFDMP
          IF BETA GR AKC                                                 GAG1103
            THEN BEGIN                                                   GAG1103
      MPRD:                                                              GAG1103
              ALPHA = ALPHA + 1 ;                                        GAG1103
              GOTO MPRB ;                                                GAG1103
            END                                                          GAG1103
          IF MPSPNL AND NULK$MP EQ 0                                     GAG1103
            THEN BEGIN                                                   GAG1103
              GETSTEP ;                                                  GAG1103
              GOTO MPRE ;                                                GAG1103
            END                                                          GAG1103
          MOVC$AA( MRQFWA+AKW, AKP, FAPKY2ADR[0], 0, AKL ); 
          IF AKT EQ KT"SYMBOLIC"
          THEN
              BEGIN 
              TRN1$IS( FAPKY2ADR[0], 0, AKL,                             GAG1012
                       LOC(FSDICOTAB[FTMIPFS - P<FSTT$AA>]) );           GAG1012
              END 
          GETSTEP ;                                                      GAG1103
          END                                                            GAG1103
                                                                         GAG1103
      PROC GETSTEP ; BEGIN                                               GAG1103
          AKP = AKP + MPAKG[0] ;                                         KDEFDMP
          AKW = AKW + TENTH(AKP) ;                                       KDEFDMP
          AKP = MOD10(AKP) ;                                             KDEFDMP
          END                                                            KDEFDMP
                                                                         KDEFDMP
     PROC MGGT$MP( N ); BEGIN ITEM N, FT = 0;                            KDEFDMP
 #                                                                       CY211
* *   MGGT$MP - ADD A KEY PAIR TO THE MIP FILE     PAGE  1               AM2A077
* *   A.F.R.BROWN/C.I.MACDONALD                                          CY211
* 1DC MGGT$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     AS THE SECOND HALF OF A MIPGEN RUN, THE SORT PROGRAM FEEDS         CY211
*     BACK A SORTED LIST OF ALL THE THINGS THAT MGPT$MP FED OUT          CY211
*     TO BE SORTED IN THE FIRST PLACE, AND MGGT$MP INSERTS THEM          CY211
*     IN THE MIP FILE.                                                   CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     MGGT$MP IS LIKE MGPT$MP IN THAT IT IS CALLED MANY TIMES,           CY211
*     BUT CONTINUES THROUGHOUT TO HAVE FULL CONTROL OVER THE             CY211
*     FILE IT IS INTERESTED IN -- FOR MGGT$MP THIS IS THE MIP            CY211
*     FILE.                                                              CY211
*                                                                        CY211
*     THERE IS ONE INCOMING PARAMETER, PASSED IN THE STANDARD            CY211
*     WAY. THIS IS THE ADDRESS OF A RECORD SUPPLIED BY THE               CY211
*     SORT PROGRAM. (MGPT$MP AND MGGT$MP DO NOT, OF COURSE,              CY211
*     KNOW ANYTHING ABOUT THE SORT PROGRAM.)                             CY211
*                                                                        CY211
*     THE FIRST WORD OF THIS RECORD IS THE KEY DEFINITION,               CY211
*     EQUAL TO ONE OF THE KEYDEF1 WORDS IN ARRAY MGKD$MP.                CY211
*     THE NEXT SIGMA WORDS ARE ENOUGH TO CONTAIN AN                      CY211
*     ALTERNATE KEY VALUE OF THE LONGEST EXISTING TYPE.                  CY211
*     HOWEVER, ONLY THE FIRST AKL CHARACTERS OF THIS AREA ARE            CY211
*     FILLED BY AN ALTERNATE KEY VALUE IN EACH CASE, AKL BEING           CY211
*     ASCERTAINABLE FROM THE KEY DEFINITION. THE REASON THE              CY211
*     FULL SIGMA WORDS ARE ALLOWED IN EVERY RECORD IS TO MAKE            CY211
*     ALL THE RECORDS, EVEN IF INVOLVING ALTERNATE KEYS OF               CY211
*     DIFFERING LENGTHS, LOOK THE SAME TO THE SORT PROGRAM.              CY211
*     AFTER THOSE SIGMA WORDS COME ENOUGH WORDS TO CONTAIN               CY211
*     A PRIMARY KEY VALUE.                                               CY211
*                                                                        CY211
*     FT, AN INTERNAL VARIABLE, IS COMPILED =0. THIS IS JUST             CY211
*     TO LET MGGT$MP KNOW WHEN IT IS BEING CALLED FOR THE                CY211
*     FIRST TIME. IT IMMEDIATELY SETS FT = 1.                            CY211
*                                                                        CY211
*     P<FIT$AA> AND P<FIAT$AA> HAVE TO POINT TO THE CURRENT              CY211
*     FIT AND FIAT, BUT APART FROM THAT EVERYTHING IS SET UP             CY211
*     BY THE CALL TO STMD$AA(16) WHEN MGGT$MP IS CALLED FOR THE          CY211
*     FIRST TIME, AND THEREAFTER MGGT$MP IS REALLY JUST TALKING          CY211
*     TO ITSELF -- ENTRY AND EXIT CONDITIONS ARE NOT                     CY211
*     QUESTIONS OF COMMUNICATION BETWEEN MGGT$MP AND OTHER               CY211
*     ROUTINES.                                                          CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     AS ALREADY NOTED, MGGT$MP DOES NOT REALLY SET ANYTHING             CY211
*     SO AS TO COMMUNICATE WITH OTHER ROUTINES.                          CY211
*                                                                        CY211
*     AT THE END OF EACH TRIP THROUGH MGGT$MP, THE KEY PAIR HAS BEEN     CY211
*     RECORDED IN THE MIP FILE BY SUBROUTINE PTRP$MP, UNLESS (1) THE     CY211
*     SAME KEY PAIR TURNED OUT TO BE ALREADY RECORDED,  OR (2) THE       CY211
*     ALTERNATE KEY HAS BEEN DEFINED AS UNIQUE BUT THIS VALUE IS ALREADY CY211
*     RECORDED.                                                          CY211
*        THE FIRST OF THOSE TWO CASES CAN ONLY HAPPEN WITH REPEATING     CY211
*     GROUPS, WHEN THE SAME ALT KEY VALUE IS FOUND IN TWO REPEATING      CY211
*     GROUPS OF THE SAME RECORD. THIS KIND OF DUPLICATION IS NOT         CY211
*     RECORDED IN THE MIP FILE. THE SECOND CASE MAY WELL HAPPEN, AND     CY211
*     WILL CAUSE PTRP$MP TO SET RHO=1 AND LEAVE THE MIP FILE UNALTERED.  CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     A FATAL ERROR IF WE GET A KEYDEF BACK FROM THE SORT ROUTINE,       CY211
*     FOR WHICH NO MATCH CAN BE FOUND IN THE LEVEL-1 SUBFILE OF THE      CY211
*     MIP FILE. ALL THE KEYDEFS THAT WERE FED TO THE SORT ROUTINE BY     CY211
*     MGPT$MP SHOULD HAVE BEEN ADDED TO THE LEVEL-1 SUBFILE              CY211
*     BY KDEF$MP.                                                        CY211
*                                                                        CY211
*     A NONFATAL ERROR IF PTR$MP SETS 
*     RHO TO 1, AS EXPLAINED JUST ABOVE.                                 CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     STMD$AA - TO TURN EVERYTHING TO THE MIP FILE, ON THE FIRST         CY211
*       TRIP THROUGH MGGT$MP.                                            CY211
*     KRAK$MP - TO BREAK UP THE KEYDEF WORD. THE PARAMETER IS 0          CY211
*       BECAUSE WE DO NOT NEED AKC OR AKG, AND HAVE NOT GOT AN           CY211
*       ACTUAL DATA RECORD AT HAND.                                      CY211
*     LEVL$MP - TO MOVE TO A DIFFERENT LEVEL OF THE MIP FILE.            CY211
*     WKKY$IS - TO SEARCH THE LEVEL-1 SUBFILE OF THE MIP FILE            CY211
*       FOR A RECORD WHOSE KEY MATCHES THE GIVEN KEYDEF.                 CY211
*     GOFI$AA ALIAS GOSTARTFILE - TO REWIND THE LEVEL-2                  CY211
*       SUBFILE, OR LIST OF ALTERNATE KEY VALUES.                        CY211
*     MOVW$AA - TO MOVE AN ALTERNATE OR PRIMARY KEY VALUE FROM           CY211
*       THE RECORD SENT IN BY THE SORT ROUTINE, TO THE AREA              CY211
*       FROM WHICH PTRP$MP WILL TAKE IT.                                 CY211
*     PTRP$MP - TO RECORD A PAIR OF KEY VALUES IN THE MIP                CY211
*       FILE.                                                            CY211
*     DUPK$AA - TO ISSUE A DUPLICATE KEY ERROR MESSAGE. 
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     QMF - SET BY WKKY$IS TO 1 FOR MATCH FOUND, OR 0 FOR                CY211
*       NO MATCH.                                                        CY211
*     SIGMA - SET BY MGPT$MP TO THE NUMBER OF WORDS NEEDED               CY211
*       TO CONTAIN THE LONGEST KNOWN ALTERNATE KEY.                      CY211
*     KEYLNGW - SET BY KRAK$MP TO THE NUMBER OF WORDS                    CY211
*       NEEDED TO CONTAIN THE PRIMARY KEY.                               CY211
*                                                                        CY211
*     PRIMKEY AND SECKEY - FIXED ARRAYS PROVIDED FOR TEMPORARY           CY211
*       CUSTODY OF PRIMARY AND SECONDARY KEY VALUES                      CY211
*       RESPECTIVELY.                                                    CY211
*                                                                        CY211
 #                                                                       CY211
          IF FT EQ 0                                                     KDEFDMP
            THEN BEGIN                                                   KDEFDMP
              STMD$AA ( 16 ) ; # FIRST TIME ONLY #                       KDEFDMP
              MPAKD[0] = 0 ;                                             KDEFDMP
              FT = 1 ;                                                   KDEFDMP
            END                                                          KDEFDMP
          IF W[N] NQ MPAKD[0]                                            KDEFDMP
            THEN BEGIN                                                   KDEFDMP
              MPAKD[0] = W[N] ;                                          KDEFDMP
              KRAK$MP ( 0 ) ;                                            CY211
              LEVL$MP ( 1 ) ;                                            KDEFDMP
              KEYFWA = N ;                                               KDEFDMP
              WKKY$IS ( 0 ) ;                                            KDEFDMP
              IF QMF EQ 0 
              THEN
                  BEGIN 
                  IMPOSSIBLE(BADKD);
                  END 
              LEVL$MP ( 2 ) ;                                            KDEFDMP
              GOSTARTFILE ;                                              KDEFDMP
            END                                                          KDEFDMP
          MOVW$AA ( N+1+SIGMA , KEYLNGW , LOC(PRIMKEY[0]) ) ;            KDEFDMP
          MOVW$AA ( N+1 , SIGMA , LOC(SECKEY[0]) ) ;                     KDEFDMP
          RHO = 0 ;                                                      GAG1103
          PTRP$MP ;                                                      GAG1103
          IF RHO NQ 0                                                    GAG1103
            THEN BEGIN                                                   GAG1103
              KEYFWA = LOC(PRIMKEY[0]) ;
              KEYOFF = 0 ;
              DUPK$AA ( EC503 ) ; 
            END                                                          GAG1103
          IF FTFNF[0] NQ 0 THEN GOTO FERR$MG ;                           AFB1109
          END                                                            KDEFDMP
                                                                         KDEFDMP
          END   TERM                                                     KDEFDMP
