*DECK SEEKDMP 
*CALL COMUSETXT 
USETEXT AAMMIPB ; 
PROC SEEK$MP; 
      BEGIN 
      XREF
          BEGIN 
          FUNC EOKS$MP; 
          LABEL EXIT$AA;
          PROC  CPCH$AA;
          PROC  CURR$AA;
          PROC  DNLV$MP;
          PROC  EZKY$IS;
          PROC WKKY$IS ;
          PROC  FILP$AA;
          PROC  GOKY$IS;
          PROC  KPTQ$MP;
          PROC  KPTR$MP;
          PROC  KRAK$MP;
          PROC  LEVL$MP;
          PROC  LOCR$AA;
          PROC  MERR; 
          PROC  MOVC$AA;
          PROC  MOVW$AA;
          PROC IMPR$AA; 
          PROC MSGF$AA; 
          PROC MSGZ$AA; 
          PROC  MSKP$MP;
          FUNC PKCT$MP; 
          PROC  PSIX$MP;
          PROC  RPOS$MP;
          PROC  SCSB$MP;
          PROC  SEBL$AA;
          PROC  SKIX$MP;
          PROC  STAT$MP;
          PROC  STMD$AA;
          PROC  STPF$AA;
          PROC  SVK2$MP;
          PROC  SVK3$MP;
          PROC  UPLV$MP;
          END 
      XDEF
          BEGIN 
          FUNC CEEK$MP; 
          PROC GTNR$MP; 
          PROC SKIP$MP; 
          END 
      ITEM X;                      #TEMP STORAGE# 
CONTROL EJECT;
                                                                         AFB0214
     FUNC CEEK$MP ; BEGIN                                                AFB0214
 #                                                                       CY211
* *   CEEK$MP - ARE WE IN MIDST OF SEEK ON THIS KEY    PAGE  1           AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC CEEK$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     AS A SYMPL FUNCTION, TO RETURN (IN X6) A 0 TO THE CALLER           CY211
*     IF THE PREVIOUS OPERATION THROUGH THIS FIT WAS A SEEK BY           CY211
*     ALTERNATE KEY, USING THE SAME VALUES OF KL, RKW, AND RKP AS        CY211
*     THE PRESENT OPERATION, AND THE SAME VALUE OF MKL, AND IF           CY211
*     THE FILE HAS NOT BEEN ALTERED SINCE THAT PREVIOUS OPERATION.       CY211
*     HENCE, IF THE CURRENT OPERATION CAN RELY ON THE INFORMATION        CY211
*     IN THE PTREE AND THE FIAT GENERALLY. OTHERWISE, TO RETURN          CY211
*     A NON-ZERO.                                                        CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     PREVOP IS A COPY OF THE FTCOP[0] CODE FOR THE PRECEDING            CY211
*     OPERATION THROUGH THIS FIT.                                        CY211
*                                                                        CY211
*     FAALTPOS[0] WAS SET TO 1 BY THE PRECEDING OPERATION IF IT          CY211
*     WAS AN UPDATE, AND IF ANY OPERATION THROUGH A DIFFERENT FIT        CY211
*     HAS BEEN AN UPDATE, SINCE THE PRECEDING OPERATION THROUGH          CY211
*     THIS FIT, IT WILL HAVE SET FAALTPOS[0] TO 1.                       CY211
*                                                                        CY211
*     IF THE PRECEDING OPERATION WAS A SEEK BY ALTERNATE                 CY211
*     KEY, IT HAS STORED FTRKW[0] INTO                                   CY211
*     SEEKRKW, FTRKP[0] INTO SEEKRKP, FTKL[0] INTO SEEKRKL, AND          CY211
*     MAJKEY INTO SEEKLENG -- ALL OF THESE "SEEK" THINGS ARE NAMES OF    CY211
*     FIELDS IN FASEEKEY1[0], A WORD IN THE FIAT. IT ALSO STORED THE     CY211
*     KEY VALUE IN THE FIAT FIELD TO WHICH FASKY2ADR[0] POINTS.          CY211
*                                                                        CY211
*     KEYFWA, KEYOFF, AND MAJKEY ARE THE FWA, THE STARTING CHARACTER     CY211
*     POSITION, AND THE LENGTH IN CHARACTERS OF THE KEY FOR THE          CY211
*     CURRENT OPERATION.                                                 CY211
*                                                                        CY211
*     AKT IS THE TYPE OF THE CURRENT ALTERNATE KEY, WHICH HAS ALREADY    CY211
*     BEEN DETERMINED ACCORDING TO THE CURRENT FTRKW[0], FTRKP[0],       CY211
*     AND FTKL[0].                                                       CY211
* 
*     IF THE REL FIELD OF THE FIT DOES NOT CONTAIN EQ, THE
*     FUNCTION MUST RETURN A NON-ZERO. THIS IS BECAUSE A
*     START BY ALTERNATE KEY, WITH REL=GE OR GT, MUST IGNORE
*     THE RESULTS OF PREVIOUS SEEKS. GT HERE MEANS WE MUST
*     STEP AHEAD ONE ALTERNATE KEY, AND THEN GO TO THE PRIMARY
*     KEY THAT MATCHES THE NEW ALTERNATE KEY. BUT SEEK BY 
*     ALTERNATE KEY MAY HAVE ALREADY CARRIED US OUT OF THE MIP
*     FILE INTO THE DATA FILE, MAKING IT TOO LATE TO DO THE 
*     FORWARD STEP. TO AVOID THIS POSSIBILITY, FORCE THE START
*     OPERATION TO MAKE A FRESH BEGINNING IF REL=GE OR GT.
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     SEE ABOVE UNDER ((FUNCTION)).                                      CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     CPCH$AA - TO COMPARE TWO KEY VALUES.                               CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     COND IS SET BY CPCH$AA. IT IS ALSO SET BY CEEK$MP TO 1 IF          CY211
*     CPCH$AA DOES NOT HAVE TO BE CALLED.                                CY211
*                                                                        CY211
 #                                                                       CY211
          COND = 1 ;                                                     AFB0214
          IF FAALTPOS[0] EQ 0 AND PREVOP EQ OP"SEK"                      GETNR
           AND QREL EQ REL"EQ" AND MAJKEY EQ SEEKLENG 
            AND SEEKRKW EQ FTRKW[0] AND SEEKRKP EQ FTRKP[0]              AFB0214
             AND SEEKRKL EQ FTKL[0]                                      AFB0214
              THEN BEGIN                                                 AFB0214
                CPCH$AA ( KEYFWA,KEYOFF , FASKY2ADR[0],0 , MAJKEY,AKT ); AFB0214
              END                                                        AFB0214
          CEEK$MP = COND ;                                               AFB0214
          END                                                            AFB0214
                                                                         AFB0214
CONTROL EJECT;
                                                                         EXECDMP
PROC BELL$MP (JOINT) ;                                                   CY211
          BEGIN                                                          CY211
 #                                                                       CY211
* *   BELL$MP - AN AUXILIARY TO GTNR$MP          PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC BELL$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO LOOK (WITHOUT I/O RECALL) FOR THE CURRENT BLOCK OF A MIP        CY211
*     FILE, TO REPORT WHETHER IT IS NOW IN CORE, AND IF NOT, AS A        CY211
*     PREPARATION FOR ENDING THIS TRIP THROUGH GTNR$MP, TO STORE         CY211
*     A STAGE NUMBER IN MPSKSTG[0] THAT WILL TELL THE NEXT TRIP          CY211
*     THROUGH GTNR$MP WHERE TO START.                                    CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     JOINT IS A PARAMETER PASSED IN THE NORMAL WAY. IT IS               CY211
*     MERELY THE STAGE NUMBER THAT BELL$MP IS TO STORE IN                CY211
*     MPSKSTG[0] IF THE WANTED BLOCK IS NOT YET IN CORE.                 CY211
*                                                                        CY211
*     P<PTRE$AA> LOCATES THE PTREE FOR THE CURRENT SUBFILE OF            CY211
*     THE MIP FILE.                                                      CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     COND = 0 IF THE BLOCK TO WHICH THE CURRENT WORD OF THE PTREE       CY211
*     POINTS IS NOW IN CORE, AND THE CURRENT RECORD HAS BEEN LOCATED     CY211
*     BY LOCR$AA.                                                        CY211
*                                                                        CY211
*     COND = -1 OTHERWISE, AND THE INCOMING PARAMETER, JOINT, HAS        CY211
*     BEEN COPIED INTO MPSKSTG[0].                                       CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     SEBL$AA - TO LOCATE THE CURRENT BLOCK, READING IT IF               CY211
*     NECESSARY, BUT WITHOUT RECALL.                                     CY211
*                                                                        CY211
*     LOCR$AA - TO LOCATE THE CURRENT RECORD, IF THE CURRENT BLOCK       CY211
*     IS NOW IN CORE.                                                    CY211
* 
*     STPF$AA - TO GET TO THE FIRST LIVE RECORD IN A BLOCK, 
*     IF OUR FIRST LOOK AT IT AFTER ITS READING IN SHOWS
*     THAT THE FIRST RECORD IS DEAD.
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     NONE BUT COND.                                                     CY211
*                                                                        CY211
 #                                                                       CY211
          ITEM JOINT;        #FORMAL PARAMETERS#                         CY211
                                                                         CY211
          SEBL$AA ( CURPTR , 0 ) ;                                       GETNR
          IF PTBLKIN[CURPTR] NQ 0                                        GETNR
            THEN BEGIN                                                   GETNR
              LOCR$AA ( PTCUREC[CURPTR] ) ;                              GETNR
              IF UCCFIELD EQ DEAD THEN STPF$AA ;
              COND = 0 ;                                                 GETNR
            END                                                          GETNR
            ELSE BEGIN                                                   GETNR
              COND = -1 ;                                                GETNR
              MPSKSTG[0] = JOINT ;                                       GETNR
            END                                                          GETNR
          END                                                            GETNR
                                                                         GETNR
CONTROL EJECT;                                                           JJJ0209
PROC GONG$MP (K,JOINT) ;                                                 CY211
          BEGIN                                                          CY211
 #                                                                       CY211
* *   GONG$MP - AN AUXILIARY TO GTNR$MP          PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC GONG$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO LOOK, WITHOUT RECALL, FOR A GIVEN KEY IN THE CURRENT SUBFILE    CY211
*     OF THE MIP FILE, TO REPORT WHETHER THE WANTED DATA BLOCK IN THE    CY211
*     SUBFILE IS NOW IN CORE (THE REPORT IS NOT ON WHETHER THE KEY       CY211
*     WAS ACTUALLY FOUND), AND IF NOT, TO STORE A GIVEN STAGE NUMBER     CY211
*     IN MPSKSTG[0], A FIELD OF THE MIP PART OF THE FIAT. THIS LAST      CY211
*     IS A PREPARATION FOR ENDING THE CURRENT TRIP THROUGH GTNR$MP,      CY211
*     AND THE STAGE NUMBER WILL TELL US WHERE TO PICK UP THE THREAD      CY211
*     ON THE NEXT TRIP.                                                  CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     THERE ARE TWO PARAMETERS PASSED IN THE STANDARD WAY --             CY211
*                                                                        CY211
*     1.THE FWA OF A KEY VALUE THAT IS BEING SOUGHT IN THE CURRENT       CY211
*       SUBFILE OF THE MIP FILE.                                         CY211
*     2.THE STAGE NUMBER THAT IS TO BE STORED IN MPSKSTG[0] IF           CY211
*       THE DATA BLOCK IS NOT YET IN CORE.                               CY211
*                                                                        CY211
*     P<PTRE$AA> MUST POINT TO THE PTREE OF THE CURRENT SUBFILE.         CY211
*     P<FIAT$AA> AND P<MPAT$AA> MUST ALSO BE CORRECT.                    CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     COND = 0 IF WE HAVE REACHED THE END OF THE SEARCH IN THE SUBFILE.  CY211
*     WHETHER THE KEY WAS ACTUALLY MATCHED OR NOT IS INDICATED BY        CY211
*     QMF -- 1 IF YES, 0 IF NO.                                          CY211
*                                                                        CY211
*     COND = -1 IF WE HAVE NOT REACHED THE END OF THE SEARCH IN THE      CY211
*     SUBFILE, AND IN THAT CASE, THE SECOND INCOMING PARAMETER HAS BEEN  CY211
*     COPIED TO MPSKSTG[0].                                              CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     EZKY$IS - TO DO A SEARCH OF A SUBFILE FOR A GIVEN KEY, FROM THE    CY211
*     BEGINNING.                                                         CY211
*                                                                        CY211
*     GOKY$IS - TO CONTINUE AN EXISTING SEARCH OF A SUBFILE.             CY211
*                                                                        CY211
*     BOTH OF THESE ARE CALLED WITH PARAMETER ( -1 ) INDICATING THAT     CY211
*     ANY NECESSARY I/O IS TO BE WITHOUT RECALL, AND IS TO CAUSE         CY211
*     EXIT FROM EZKY$IS OR GOKY$IS. ( -1 ) RATHER THAN ( -2 ) MEANS      CY211
*     THAT THE SEARCH IS TO GO RIGHT TO THE END, IF NO FURTHER I/O       CY211
*     IS NECESSARY.                                                      CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     NONE EXCEPT COND -- HOWEVER, IF COND IS SET TO 0 AT EXIT,          CY211
*     QMF WILL HAVE BEEN SET BY GOKY$IS OR EZKY$IS.                      CY211
*                                                                        CY211
 #                                                                       CY211
          ITEM K , JOINT;    #FORMAL PARAMETERS#                         CY211
                                                                         CY211
          KEYFWA = K ;                                                   EXECDMP
          KEYOFF = 0 ;                                                   EXECDMP
          MAJKEY = KLENG ;                                               EXECDMP
          QREL = REL"EQ" ;                                               EXECDMP
          IF MPSKSTG[0] NQ JOINT                                         EXECDMP
            THEN EZKY$IS ( -1 ) ;                                        GETNR
            ELSE GOKY$IS ( -1 ) ;                                        GETNR
          IF CURPTR EQ NLEV AND PTBLKIN[CURPTR] NQ 0                     GETNR
            THEN COND = 0 ;                                              GETNR
            ELSE BEGIN                                                   GETNR
              COND = -1 ;                                                GETNR
              MPSKSTG[0] = JOINT ;                                       GETNR
            END                                                          GETNR
          END                                                            EXECDMP
CONTROL EJECT;
PROC GTNR$MP;                                                            JJJ0523
          BEGIN                                                          JJJ0523
 #                                                                       CY211
* *   GTNR$MP - GET NEXT WITHOUT RECALL VIA ALT KEY       PAGE  1        AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC GTNR$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO DO MOST OF THE WORK THAT RELATES TO THE MIP FILE, WHEN          CY211
*     A GETNEXT-WITHOUT-RECALL IS BY ALTERNATE KEY.                      CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     FAALTPOS[0] IS 0 IF THE PRECEDING OPERATION THROUGH THIS FIT       CY211
*     WAS NOT AN UPDATE, AND NO MORE RECENT OPERATION THROUGH A          CY211
*     DIFFERENT FIT HAS BEEN AN UPDATE.                                  CY211
*                                                                        CY211
*     PREVOP CONTAINS A COPY OF THE CODE FOR THE PRECEDING OPERATION     CY211
*     THROUGH THIS FIT. IF FAALTPOS[0] = 1, THIS DOES NOT MATTER.        CY211
*     BUT OTHERWISE, IF PREVOP SHOWS A GETNEXT-WITHOUT-RECALL,           CY211
*     WE ARE TO CONTINUE ITS WORK. IF PREVOP SHOWS A GET OR GETNEXT, WE  CY211
*     MUST START FROM SCRATCH. IF IT SHOWS ANYTHING ELSE, AND FAALTPOS[0 CY211
*     IS 0, AND XFER=0, WE ARE ALREADY POSITIONED ON THE WANTED RECORD,  CY211
*     AT LEAST AS FAR AS THE PTREE IS CONCERNED, AND CAN SKIP OVER ALL   CY211
*     THE WORK WITH THE MIP FILE TO SEKNMPC, WHERE WE SWITCH BACK TO THE CY211
*     DATA FILE AND BEGIN LOOKING FOR THE CURRENT PRIMARY KEY. BUT IF    CY211
*     XFER=1, THE CASE IS THE SAME AS IF THE LAST OPERATION WERE A GET   CY211
*     OR GETNEXT -- IN FACT GET OR GETNEXT WILL HAVE LEFT XFER=1, AND    CY211
*     IT IS DIFFICULT TO IMAGINE WHAT OTHER OPERATION WOULD HAVE.        CY211
*                                                                        CY211
*     IF FAALTPOS[0]=0 AND THE PREVIOUS OPERATION WAS A GETNEXT-WITHOUT- CY211
*     RECALL, MPSKSTG[0] TELLS WHERE IN GTNR$MP WE SHOULD RESUME WORK.   CY211
*     THE POSSIBLE VALUES ARE 0, 1, 2, 7, 8, 9. THEY ARE EXPLAINED IN    CY211
*     THE COMMENTS TO SUBROUTINE GTNR$IS, WHICH SEE. 0, 1, AND 2 MEAN    CY211
*     WE ARE STILL LOOKING AT THE MIP FILE. 7 AND 9 MEAN WE ARE LOOKING  CY211
*     AT THE DATA FILE. 8 MEANS WE ARE AT EOI, AND NOTHING FURTHER       CY211
*     NEED BE DONE.                                                      CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     IF COND = 100, WE HAVE FOUND THAT THIS ALTERNATE KEY               CY211
*     SPECIES INVOLVES FIFO LISTS OF PRIMARY KEYS. 100 WILL TELL         CY211
*     GTNR$IS TO GO AHEAD WITH THE WHOLE THING AS A GETNEXT,             CY211
*     AND NOT TRY FOR OVERLAPPING. FIFO SHOULD VERY RARELY BE USED,      CY211
*     AND THE EXTRA CODE TO DO FIFO FILE SEARCHING WITHOUT               CY211
*     RECALL DOES NOT SEEM WORTH ADDING (FIELD LENGTH).                  CY211
*                                                                        CY211
*     IF COND = -1, MPSKSTG[0] = 0, 1, OR 2.                             CY211
*     IF COND = 7 OR 8, MPSKSTG[0] = THE SAME.                           CY211
*     THESE ARE THE ONLY POSSIBLE OUTCOMES FROM A TRIP THROUGH GTNR$MP   CY211
*     IN WHICH IT HAS ACTUALLY DONE SOME WORK.                           CY211
*                                                                        CY211
*     IF, ON ENTRY TO GTNR$MP, MPSKSTG[0] = 7, 8, OR 9, IT EXITS         CY211
*     IMMEDIATELY, HAVING DONE NOTHING MORE THAN COPY THE SAME NUMBER    CY211
*     INTO COND, AND CALL STMD$AA TO SHIFT TO THE DATA FILE.             CY211
*                                                                        CY211
*     IF COND AND MPSKSTG[0] ARE 2 OR LESS, THE PRESENT POSITION         CY211
*     IN THE MIP FILE IS RECORDED IN THE MIP PART OF THE FIAT, AND       CY211
*     P<FSTT$AA> POINTS TO THE MIP FILE. IF 7, 8, OR 9, THE POSITION     CY211
*     IS RECORDED IN THE DATA FILE PTREE, AND P<FSTT$AA> POINTS TO       CY211
*     THE DATA FILE FSTT. IF 0, 1, OR 2, THE ALTERNATE AND PRIMARY KEY   CY211
*     VALUES OF POSITION ARE THE OLD ONES. IF 7, 8, OR 9, THE NEW ONES.  CY211
*                                                                        CY211
*     AT THE SAME TIME THE TRANSITION TO NEW KEY VALUE(S) IS             CY211
*     MADE, XFER IS SET TO 0 IN COMPENSATION. THUS OUR LOGICAL           CY211
*     POSITION IN THE FILE HAS NOT CHANGED -- WHICH IT SHOULD            CY211
*     NOT, UNTIL GETNEXT-WITHOUT-RECALL HAS TURNED INTO A COMPLETED      CY211
*     GETNEXT, AT WHICH TIME XFER BECOMES 1. IF XFER WAS 0 RATHER        CY211
*     THAN 1 ON AT THE BEGINNING OF THE GETNEXT-WITHOUT-RECALL,          CY211
*     WE HAVE NOT REALLY MOVED IN THE FILE, AND THE NEW KEY VALUE(S)     CY211
*     ARE THE SAME AS THE OLD ONE(S).                                    CY211
*     HAS ALTERED THE PTREE.                                             CY211
*                                                                        AM2A088
*     FASKLAST IS 1 IF THE PTREE HAS BEEN LEFT IN SUCH A STATE THAT      AM2A088
*     IT DOES NOT CONVENIENTLY DEFINE THE CURRENT POSITION IN THE FILE,  AM2A088
*     SO THAT A FOLLOWING GET-NEXT OR SKIP WILL HAVE TO RECOVER POSI-    AM2A088
*     TION BY KEY. FASKLAST IS RESET TO 0 WHEN THE PTREE  HAS BEEN MADE  AM2A088
*     TO CORRESPOND TO THE KEY VALUE.                                    AM2A088
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     502 -- NO SUCH KEY DEFINED. IT IS CONCEIVABLE THAT THE PREVIOUS 
*     OPERATION WAS A GET BY ALTERNATE KEY, USING A NON-EXISTENT KEY
*     DEFINITION, AND THAT THIS DEFINITION IS STILL IN FAPOSKEY1. IN
*     SUCH A CASE,  A FOLLOWING GETNR WILL FIND NO MATCH TO THE KEY DEF 
*     AND ISSUE THIS ERROR. 
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     STMD$AA - TO MAKE P<FSTT$AA> POINT TO THE DATA FILE FSTT,          CY211
*     AND A FEW OTHER PREPARATIONS. THIS IS DONE IF GTNR$MP              CY211
*     FINDS ON ENTRY THAT IT HAS NOTHING DO BUT EXIT BACK TO             CY211
*     GTNR$IS, TO WORK ON THE DATA FILE BY KEY.                          CY211
*     ALSO WHEN GTNR$MP FINDS THE NEXT PRIMARY KEY VALUE,                CY211
*     BEFORE SETTING MPSKSTG[0]=7 AND EXITING BACK TO GTNR$IS.           CY211
*     ALSO TO SWITCH EVERYTHING TO THE MIP FILE FSTT ETC
*     IN THE ONE CASE WHERE THIS HAS TO BE DONE BEFORE KRAK$MP CAN BE 
*     CALLED, I.E. WHEN FAALTPOS IS 1. THE OPERATION THAT SET THIS FLAG 
*     MIGHT HAVE ALTERED MPAKD, WHICH IS WHAT KRAK$MP USES TO DECIDE
*     WHICH ALTERNATE KEY WE ARE POSITIONED ON. WE HAVE TO DO SOME
*     OTHER WORK AND RESET MPAKD BEFORE CALLING KRAK$MP.
*                                                                        CY211
*     KRAK$MP - CALLED WHENEVER GTNR$MP IS ENTERED WITH MPSKSTG[0]       CY211
*     =2 OR LESS, TO MAKE P<FSTT$AA> AND OTHER THINGS POINT TO THE       CY211
*     MIP FILE, AND SET AKW, AKL, AKP, AKT, AKS, PKL, AND PKT.           CY211
*                                                                        CY211
*     LEVL$MP - TO MOVE FROM A LEVEL-3 SUBFILE TO ITS PARENT             CY211
*     RECORD AT LEVEL 2 OF A MIP FILE, OR VICE VERSA.                    CY211
*     ALSO TO GO BACK TO LEVEL 1, THE SUBFILE OF KEY DEFINITIONS, 
*     IF FAALTPOS IS 1, AND THE ALTERING OPERATION MIGHT HAVE LEFT
*     US ON A KEY DEFINITION OTHER THAN THE ONE REFLECTED IN FAPOSKEY1. 
*                                                                        CY211
*     GONG$MP - TO PURSUE (WITHOUT I/O RECALL) A KEY VALUE IN A          CY211
*     LEVEL-2 OR LEVEL-3 SUBFILE (NOT A SUBBLOCK), AND TO SET            CY211
*     MPSKSTG[0] TO SOME PARAMETER IF WE ARE STILL WAITING FOR           CY211
*     I/O.                                                               CY211
*                                                                        CY211
*     BELL$MP - TO SEE IF THE CURRENT BLOCK IS IN CORE YET, READ         CY211
*     IT WITHOUT RECALL IF NECESSARY, LOCATE THE CURRENT RECORD          CY211
*     IF IT IS IN CORE, OR SET MPSKSTG[0] TO SOME PARAMETER IF           CY211
*     WE ARE STILL WAITING FOR I/O.                                      CY211
*                                                                        CY211
*     CPCH$AA - TO COMPARE TWO KEY VALUES. THIS ONE IS CALLED            CY211
*     DIRECTLY WHEN WE HAVE CAUGHT UP WITH THE CURRENT ALTERNATE         CY211
*     KEY VALUE IN THE MIP FILE. IN THE SAME RECORD THE LOWEST           CY211
*     OR ONLY ASSOCIATED PRIMARY KEY VALUE IS STORED, SO WE              CY211
*     TAKE THE OPPORTUNITY OF COMPARING IT IMMEDIATELY WITH              CY211
*     THE CURRENT PRIMARY KEY OF POSITION.                               CY211
*                                                                        CY211
*     STPF$AA - TO MOVE FORWARD ONE RECORD, WITHIN THE SAME              CY211
*     BLOCK, IN A LEVEL-2 OR LEVEL-3 SUBFILE OF THE MIP FILE.            CY211
*                                                                        CY211
*     SVK2$MP - TO STORE THE NEW ALTERNATE KEY OF POSITION               CY211
*     IN THE FIAT WHERE FAPKY2ADR[0] POINTS.                             CY211
*                                                                        CY211
*     SVK3$MP - TO STORE THE NEW PRIMARY KEY OF POSITION IN              CY211
*     THE FIAT WHERE FAPKY3ADR[0] POINTS, AND TO SET MPEOK[0]            CY211
*     ACCORDING TO WHETHER THE PRIMARY KEY IS THE LAST OR NOT,           CY211
*     FOR THE CURRENT ALTERNATE KEY VALUE.                               CY211
*                                                                        CY211
*     DNLV$MP - TO DESCEND FROM A LEVEL-2 RECORD TO THE SUBBLOCK IT      CY211
*     CONTAINS.                                                          CY211
*                                                                        CY211
*     SCSB$MP - TO SEEK A MATCH IN THE SUBBLOCK FOR THE PRIMARY KEY      CY211
*     VALUE.                                                             CY211
*                                                                        CY211
*     UPLV$MP - TO RETURN FROM A RECORD IN A SUBBLOCK OR A LEVEL-3       CY211
*     SUBFILE TO THE PARENT RECORD IN A LEVEL-2 SUBFILE.                 CY211
* 
*     WKKY$IS - TO SCAN THE LEVEL-1 SUBFILE (KEY DEFINITIONS) AND FIND
*     THE RECORD THAT MATCHES FAPOSKEY1, THE KEY DEFINITION THAT
*     REGULATES CURRENT POS1TION. 
* 
*     MSGZ$AA - TO ISSUE THE ERROR MESSAGE IF THE KEY DEFINITION IN 
*     FAPOSKEY1 SEEMS TO BE NON-EXISTENT. 
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     COND IS SET AS A RESULT BY CPCH$AA, GONG$MP, BELL$MP, AND          CY211
*     GTNR$MP ITSELF.                                                    CY211
*                                                                        CY211
*     QMF IS SET AS A RESULT BY GONG$MP, AND SCSB$MP.                    CY211
*                                                                        CY211
*     KEYFWA IS SET TO THE KEY VALUE FWA BEFORE CALLING SCSB$MP.         CY211
*                                                                        CY211
*     OMEGA, QQ, AND KEYLNGW. IF WE ARE IN A LEVEL-3 SUBFILE,            CY211
*     OMEGA=0. IF WE ARE IN A SUBBLOCK, OMEGA=THE FWA OF THE             CY211
*     SUBBLOCK, QQ = THE FWA OF THE CURRENT MINOR RECORD WITHIN          CY211
*     THE SUBBLOCK, AND KEYLNGW= THE LENGTH OF SUCH A MINOR              CY211
*     RECORD, IN WORDS.                                                  CY211
*                                                                        CY211
*     RECLWA IS THE LWA+1 OF THE CURRENT RECORD, NOT INCLUDING           CY211
*     A MINOR RECORD WITHIN A SUBBLOCK. RECLWA ONLY SURFACES             CY211
*     AT ONE POINT IN GTNR$MP, WHERE RECLWA-2 IS THE LWA+1 OF            CY211
*     THE CURRENT SUBBLOCK.                                              CY211
*                                                                        CY211
 #                                                                       CY211
          OMEGA = 0 ; 
          P<MPAT$AA> = FAMPATADR;  #ONLY MIP BASED ARRAY NEEDED NOW#     JJJ1206
                                   #NO NEED TO CALL STMD$AA#             JJJ1206
          IF FAALTPOS[0] EQ 0                                            GETNR
            THEN BEGIN                                                   GETNR
              IF PREVOP EQ OP"SEN"                                       GETNR
                THEN BEGIN                                               GETNR
                  COND = MPSKSTG[0] ;                                    GETNR
                  IF COND GR 6                                           GETNR
                    THEN BEGIN                                           GETNR
                      RETURN ;                                           GETNR
                    END                                                  GETNR
                  IF COND GR 2
                    THEN BEGIN
                      IMPOSSIBLE(MIPSEEK);
                    END 
                  KRAK$MP ( 0 ) ;                                        GETNR
                                                                         GETNR
          SWITCH SEKNMPX SEKNMP0 , SEKNMP1 , SEKNMP2 ;                   GETNR
                                                                         GETNR
                  GOTO SEKNMPX[COND] ;                                   GETNR
                END                                                      GETNR
              IF PREVOP NQ OP"GET" AND PREVOP NQ OP"GTN"                 GETNR
               AND XFER EQ 0 THEN GOTO SEKNMPC ;                         GETNR
            END                                                          JJJ1206
          MPSKSTG[0] = 1 ; #FORCE GONG TO EZKY$IS NOT GOKY$IS#           AFB0517
          IF B<0,27>MPAKD[0] NQ FAPKDEF[0]
            THEN BEGIN
              STMD$AA ( 16 ) ;
              LEVL$MP ( 1 ) ; 
              B<27,3>FAPOSKEY1[0] = 0 ; 
              KEYFWA = LOC(FAPOSKEY1[0]) ;
              WKKY$IS ( 0 ) ; 
              IF QMF EQ 0 
                THEN BEGIN
                  MSGZ$AA ( EC502 ) ; #NO SUCH KEY DEFINED# 
                  GOTO EXIT$AA ;
                END 
              MPAKD[0] = W[RECFWA] ;
              MPWRD1[0] = W[RECFWA+1] ; 
            END 
          KRAK$MP ( 0 ) ;                                                GETNR
          IF AKS EQ FO"FIFO"                                             CY211
          THEN                                                           CY211
              BEGIN                                                      CY211
              COND = 100;    #FOR FIFO, MUST DO WITH RECALL#             CY211
              RETURN;                                                    CY211
                                                                         CY211
              END                                                        CY211
          LEVL$MP ( 2 ) ;                                                GETNR
          FASKLAST[0] = 1 ;                                              AM2A088
                                                                         GETNR
     SEKNMP0:                                                            GETNR
          GONG$MP ( FAPKY2ADR[0] , 0 ) ;                                 GETNR
          IF COND NQ 0 THEN RETURN ;                                     GETNR
          IF QMF EQ 0 THEN GOTO SEKNMPD ;                                GETNR
          CPCH$AA ( RECFWA , 0 , FAPKY3ADR[0] , 0 , PKL , PKT ) ;        GETNR
          IF COND GR 0 THEN GOTO SEKNMPE ;                               GETNR
          IF COND LS 0 THEN GOTO SEKNMPG ;                               GETNR
          IF XFER EQ 0 THEN GOTO SEKNMPE ;                               GETNR
          IF SUBFLAG EQ 0 THEN GOTO SEKNMPT ;                            GETNR
          IF B<0,1>W[RECLWA-1] NQ 0                                      GETNR
            THEN BEGIN  #SUBBLOCK#                                       GETNR
              DNLV$MP ( 1 ) ;                                            AM2A089
              GOTO SEKNMPE ;                                             GETNR
            END                                                          GETNR
            ELSE BEGIN                                                   GETNR
              LEVL$MP ( 3 ) ;                                            GETNR
              X = FIRDAT ;                                               GETNR
              GOTO SEKNMPH ;                                             GETNR
            END                                                          GETNR
                                                                         GETNR
     SEKNMPT:                                                            GETNR
          IF QLR NQ 0 THEN GOTO SEKNMPF ;                                GETNR
          IF RNO LS RC                                                   GETNR
            THEN BEGIN                                                   GETNR
              STPF$AA ;                                                  GETNR
              GOTO SEKNMPE ;                                             GETNR
            END                                                          GETNR
          IF FWD EQ 0 
            THEN BEGIN
              FSRUINFLG[0] = TRUE ; 
              MSGF$AA ( EC547 ) ; #FWD=0 IN NONLAST BLOCK#
              GOTO EXIT$AA ;
            END 
          X = FWD ;                                                      GETNR
                                                                         GETNR
     SEKNMPH:                                                            GETNR
          CURPTR = NLEV ;                                                GETNR
          PTCUREC[0] = 0 ;                                               GETNR
          PTCURBLK[CURPTR] = X ;                                         GETNR
          PTCUREC[CURPTR] = 1 ;                                          GETNR
                                                                         GETNR
     SEKNMP1:                                                            GETNR
          BELL$MP ( 1 ) ;                                                GETNR
          IF COND NQ 0 THEN RETURN ;                                     GETNR
          GOTO SEKNMPE ;                                                 GETNR
                                                                         GETNR
     SEKNMPG:                                                            GETNR
          IF SUBFLAG EQ 0                                                GETNR
            THEN BEGIN                                                   GETNR
              IF AKS EQ FO"UNIQUE"                                       GETNR
                THEN GOTO SEKNMPE ;                                      GETNR
                ELSE GOTO SEKNMPT ;                                      GETNR
            END                                                          GETNR
          IF B<0,1>W[RECLWA-1] NQ 0                                      GETNR
            THEN BEGIN  #SUBBLOCK#                                       GETNR
              DNLV$MP ( 1 ) ;                                            AM2A089
              KEYFWA = FAPKY3ADR[0] ;                                    GETNR
              SCSB$MP;
              IF QMF NQ 0 AND XFER NQ 0 THEN QQ = QQ + KEYLNGW ;         GETNR
              IF QQ GQ RECLWA-2                                          GETNR
                THEN GOTO SEKNMPI ;                                      GETNR
                ELSE GOTO SEKNMPE ;                                      GETNR
            END                                                          GETNR
            ELSE BEGIN                                                   GETNR
              LEVL$MP ( 3 ) ;                                            GETNR
                                                                         GETNR
     SEKNMP2:                                                            GETNR
              GONG$MP ( FAPKY3ADR[0] , 2 ) ;                             GETNR
              IF COND NQ 0 THEN RETURN ;                                 GETNR
              IF QMF EQ 0 OR XFER EQ 0                                   GETNR
                THEN BEGIN                                               GETNR
                  IF QEI NQ 0                                            GETNR
                    THEN GOTO SEKNMPI ;                                  GETNR
                    ELSE GOTO SEKNMPE ;                                  GETNR
                END                                                      GETNR
                ELSE BEGIN                                               GETNR
                  IF QLR EQ 0 THEN GOTO SEKNMPT ;                        GETNR
                END                                                      GETNR
                                                                         GETNR
     SEKNMPI:                                                            GETNR
              UPLV$MP ;                                                  GETNR
              GOTO SEKNMPT ;                                             GETNR
            END                                                          GETNR
                                                                         GETNR
     SEKNMPD:                                                            GETNR
          IF QEI NQ 0                                                    GETNR
            THEN BEGIN                                                   GETNR
                                                                         GETNR
     SEKNMPF:                                                            GETNR
              COND = 8 ;                                                 GETNR
              MPSKSTG[0] = 8 ;                                           GETNR
              RETURN ;                                                   GETNR
            END                                                          GETNR
                                                                         GETNR
     SEKNMPE:                                                            GETNR
          IF CURLEV EQ 2 AND OMEGA EQ 0 
          THEN
              BEGIN 
              SVK2$MP;
              END 
          SVK3$MP;
          XFER = 0 ;                                                     GETNR
          FASKLAST[0] = 0 ;                                              AM2A088
          STMD$AA ( 0 ) ;                                                GETNR
                                                                         JJJ1206
SEKNMPC:                                                                 JJJ1206
          COND = 7 ;                                                     GETNR
          MPSKSTG[0] = 7 ;                                               GETNR
          END                                                            GETNR
CONTROL EJECT;                                                           JJJ0209
     PROC SKIP$MP ; BEGIN ITEM SKIPCNT ;                                 EXECDMP
 #                                                                       EXECDMP
* *   SKIP$MP - SKIP FORWARD SO MANY RECORDS BY ALT KEY    PAGE 1        EXECDMP
* *   A.F.R.BROWN                                                        EXECDMP
* 1DC SKIP$MP                                                            EXECDMP
*                                                                        EXECDMP
* DC  FUNCTION                                                           EXECDMP
*                                                                        EXECDMP
*     TO SKIP FORWARD A GIVEN NUMBER OF RECORDS, IF THE MOST RECENT      EXECDMP
*     REWIND, SKIP, GET, OR GETNEXT (SINCE THE MOST RECENT OPEN) WAS     EXECDMP
*     BY ALTERNATE KEY, AND TO DO IT BY ALTERNATE KEY.                   EXECDMP
*                                                                        EXECDMP
* DC  ENTRY, EXIT, AND ERROR CONDITIONS                                  EXECDMP
*                                                                        EXECDMP
*     THE SAME AS FOR ROUTINE SKIP$IS, EXCLUDING OF COURSE THE CASE      EXECDMP
*     WHEN THE CURRENT POSITION IS DEFINED BY PRIMARY KEY.               EXECDMP
*                                                                        EXECDMP
*     ALSO, BACKWARDS SKIP IS ALLOWED ONLY IN ONE CASE -                 CY211
*     WHEN THE SKIP COUNT IS 1, AND THE XFER FLAG IS 1, SO               CY211
*     THAT THE SKIP COUNT CAN BE SATISFIED JUST BY ZEROING               CY211
*     XFER, AND, AS IT WERE, SKIPPING FROM THE END OF A                  CY211
*     RECORD BACK TO THE BEGINNING OF THE SAME RECORD.                   CY211
*     NON-FATAL EC403 IF THIS IS VIOLATED.                               CY211
*                                                                        CY211
*     FOR INDEX-ONLY MIP, THE MEANING OF SKIP IS SOMEWHAT DIFFERENT.     CY211
*     IT CAN ONLY BE SKIP FORWARD. IF THE SKIP COUNT IS NON-ZERO, IT     CY211
*     MEANS TO SKIP FORWARD THAT MANY ALTERNATE KEY VALUES, AND STORE    CY211
*     IN FTRL[0] A TOTAL OF HOW MANY PRIMARY KEY VALUES THEY ALL,        CY211
*     INCLUDING THE ONE AT WHICH WE START BUT NOT THE TERMINAL ONE,      CY211
*     POSSESS.                                                           CY211
*                                                                        CY211
*     IF THE SKIP COUNT IS ZERO, A KEY IS SPECIFIED IN THE SAME WAY      CY211
*     AS FOR A START BY ALTERNATE KEY. THIS KEY TERMINATES THE SKIP,     CY211
*     AND FTRL[0] IS SET AS BEFORE. BUT IF FTKA[0] IS ALSO 0, THE        CY211
*     SKIP GOES TO EOI, AND THE TOTAL COUNT OF PRIMARY KEYS IS           CY211
*     STORED IN FTRL[0] AS BEFORE.                                       CY211
*                                                                        EXECDMP
* DC  CALLED ROUTINES                                                    EXECDMP
*                                                                        EXECDMP
*     KRAK$MP - TO CALL STMD$AA IF NECESSARY, AND TO SET PKT, PKL,       EXECDMP
*       KEYLNGW, AKW, AKP, AKL, AKT AND AKS.                             EXECDMP
*     RPOS$MP - TO POSITION AT THE RIGHT RECORD FROM WHICH TO SKIP       EXECDMP
*       FORWARD, BY ALTERNATE KEY. THIS POSITION MAY BE DEFINED BY THE   EXECDMP
*       MIP PTREE, BUT IF THE FILE HAS BEEN ALTERED SINCE IT WAS SET,    EXECDMP
*       THE POSITION MUST BE LOCATED BY KEY(S).)                         EXECDMP
*     MSKP$MP - TO SKIP FORWARD ONE RECORD BY ALTERNATE KEY.             CY211
*     STAT$MP - TO SET FTFP[0] AND FAFP[0].                              CY211
*     FILP$AA ALIAS FILPOS - TO SET FTFP[0] AND FAFP[0], BUT             CY211
*       ONLY IN THE CASE WHEN THEY GO TO EOI.                            CY211
*                                                                        CY211
*     FOR INDEX-ONLY SKIPS, ADDITIONAL CALLED ROUTINES ARE -             CY211
*                                                                        CY211
*     UPLV$MP - TO RETURN FROM A RECORD IN A LEVEL-3 SUBFILE             CY211
*     OR A SUBBLOCK, TO THE PARENT LEVEL-2 RECORD.                       CY211
*                                                                        CY211
*     KPTQ$MP - TO SET THE POINTERS TO THE KEY OF THE CURRENT            CY211
*     MIP OPERATION.                                                     CY211
*                                                                        CY211
*     SKIX$MP - TO SKIP FORWARD ONE ALTERNATE KEY VALUE AND              CY211
*     TALLY THE NUMBER OF RELATED PRIMARY KEYS.                          CY211
*                                                                        CY211
*     PSIX$MP - TO DECIDE WHETHER WE HAVE REACHED THE TERMINAL           CY211
*     ALTERNATE KEY VALUE.                                               CY211
*                                                                        CY211
*     SVK3$MP - TO SAVE THE NEW PRIMARY KEY VALUE WHEN THE               CY211
*     SKIP ENDS.                                                         CY211
*                                                                        EXECDMP
* DC  NON-LOCAL VARIABLES                                                EXECDMP
*                                                                        EXECDMP
*     NONE                                                               EXECDMP
 #                                                                       EXECDMP
          IF FTCOP[0] EQ OP"SKB"                                         GETNR
            THEN BEGIN                                                   GETNR
              IF FTSKP[0] EQ 1 AND XFER NQ 0                             AFB0721
                THEN BEGIN                                               AFB0721
                  XFER = 0 ;                                             AFB0721
                  FTSKP[0] = 0 ;                                         AFB0721
                  FILPOS(EOR) ;                                          AFB0721
                  RETURN ;                                               AFB0721
                END                                                      AFB0721
              ELSE
                  BEGIN 
                  MSGZ$AA(EC403); 
                  GOTO EXIT$AA; 
                  END 
            END                                                          GETNR
          IF FAFP[0] NQ EOI                                              AFB0222
            THEN BEGIN                                                   EXECDMP
              KRAK$MP ( 0 ) ;                                            EXECDMP
              RPOS$MP ;                                                  EXECDMP
              IF FTNDX[0] EQ 0                                           AFB0318
                THEN BEGIN                                               AFB0318
                  FOR SKIPCNT = FTSKP[0] STEP -1                         AFB0318
                    WHILE ( SKIPCNT GR 0 AND QEI EQ 0 )                  AFB0318
                      DO
                      BEGIN 
                      MSKP$MP;
                      END 
                  FTSKP[0] = SKIPCNT ;                                   AFB0318
                END                                                      AFB0318
                ELSE BEGIN                                               AFB0318
                  FTRL[0] = 0 ;                                          AFB0318
                  IF OMEGA NQ 0 OR CURLEV EQ 3 THEN UPLV$MP ;            AFB0318
                  IF FTSKP[0] EQ 0                                       CY211
                  THEN
                      BEGIN 
                      KPTQ$MP;
SKIPMPA:                     #LOOP TILL DONE# 
                      PSIX$MP;                                           REORG1 
                      IF QMF EQ 0                                        AFB0318
                        THEN BEGIN                                       AFB0318
                          SKIX$MP;  #SKIP FOR NDX ON#                    REORG1 
                          GOTO SKIPMPA ;                                 AFB0318
                        END                                              AFB0318
                        ELSE FTKNE[0] = QNE ;                            AFB0318
                      END 
                  ELSE
                      BEGIN 
                      FOR SKIPCNT = FTSKP[0]                             AFB0318
                       WHILE SKIPCNT GR 0 AND QEI EQ 0                   AFB0318
                        DO BEGIN                                         AFB0318
                          SKIX$MP;  #SKIP FOR NDX ON#                    REORG1 
                          SKIPCNT = SKIPCNT - 1 ;                        AFB0318
                        END                                              AFB0318
                      FTSKP[0] = SKIPCNT ;                               AFB0318
                      END 
                  SVK3$MP;
                END                                                      AFB0318
            END                                                          EXECDMP
          STAT$MP (0);
          IF FTSKP[0] NQ 0 OR QEI NQ 0                                   AFB0517
          THEN                                                           AFB0222
              BEGIN                                                      AFB0222
              FILPOS (EOI) ;                                             AFB0222
              END                                                        AFB0222
          END                                                            EXECDMP
CONTROL EJECT;
#         START OF SEEK$MP CODE#
 #                                                                       CY211
* *   SEEK$MP - DO MIP PART OF SEEK              PAGE  1                 AM2A077
* *   A.F.R.BROWN                                                        CY211
* 1DC SEEK$MP                                                            CY211
*                                                                        CY211
* DC  FUNCTION                                                           CY211
*                                                                        CY211
*     TO BEGIN OR CONTINUE A SEEK BY ALTERNATE KEY,                      CY211
*     EXITING EITHER WHEN A BLOCK READ (WITHOUT RECALL)                  CY211
*     HAD TO BE INITIATED ON THE MIP FILE (HOWEVER, A READ               CY211
*     AT LEVEL 1, I.E. THE LIST OF KEYDEFS, IN A MIP FILE,               CY211
*     IS NEVER DONE WITHOUT RECALL), OR WHEN THE GIVEN                   CY211
*     ALTERNATE KEY VALUE HAS BEEN FOUND IN THE MIP FILE,                CY211
*     AND ITS FIRST OR ONLY CORRESPONDING PRIMARY KEY VALUE              CY211
*     CAN BE PASSED BACK TO SEEK$IS.                                     CY211
*                                                                        CY211
* DC  ENTRY CONDITIONS                                                   CY211
*                                                                        CY211
*     IT IS KNOWN THAT THIS IS A SEEK BY ALTERNATE KEY, AND              CY211
*     STMD$AA ( 16 ) HAS BEEN CALLED TO MAKE THE MIP FILE                CY211
*     CURRENT.                                                           CY211
*                                                                        CY211
*     THE KEY IS LOCATED BY FTKA[0] AND FTKP[0], AND THE SPECIES         CY211
*     OF ALTERNATE KEY IS DEFINED BY FTRKP[0], FTRKW[0] AND              CY211
*     FTKL[0]. MAJKEY IS THE ACTUAL LENGTH OF THE GIVEN KEY VALUE.       CY211
*                                                                        CY211
*     LOOK AT THE ENTRY CONDITIONS FOR SUBROUTINE CEEK$MP --             CY211
*     THEY ARE ALL TRUE HERE AS WELL. IN ADDITION, A BIT IN              CY211
*     WORD FASEEKEY1[0] IS CALLED ((SEEKSTAGE)). THIS IS 0 AS            CY211
*     LONG AS A SEEK OR SERIES OF SEEKS IS STILL LOOKING UP THE          CY211
*     ALTERNATE KEY VALUE IN THE MIP FILE. IT BECOMES 1 WHEN             CY211
*     THE ALT KEY VALUE IS FOUND, THE PRIMARY KEY VALUE IS               CY211
*     EXTRACTED, AND THE TASK IS TO SEEK IN THE DATA FILE.               CY211
*                                                                        CY211
* DC  EXIT CONDITIONS                                                    CY211
*                                                                        CY211
*     FASKLAST[0] = 1 . 
  
*     IF SEEKSTAGE = 0, WE ARE STILL LOOKING UP THE ALTERNATE KEY        CY211
*     VALUE IN A LEVEL-2 SUBFILE OF THE MIP FILE. THE CURRENT            CY211
*     SITUATION IS DESCRIBED BY THE LEVEL-2 PTREE.                       CY211
*                                                                        CY211
*     IF SEEKSTAGE HAS BEEN CHANGED FROM 0 TO 1 (THE ROUTINE THAT        CY211
*     CALLED SEEK$MP SAVED THE OLD VALUE OF SEEKSTAGE), THEN WE          CY211
*     HAVE SAVED THE PRIMARY KEY VALUE IN THE FIAT AREA                  CY211
*     TO WHICH FASKY3ADR[0] POINTS, SET FTRC[0] TO THE NUMBER OF         CY211
*     PRIMARY KEY VALUES THAT CORRESPOND TO THE ALTERNATE KEY            CY211
*     VALUE, SET MPSOK[0]=1 IF FTRC[0] IS 1 (A POSSIBLE EOK SITUATION    CY211
*     HERE, EVENTUALLY), OR OTHERWISE TO 0. FURTHERMORE, IF MAJKEY IS    CY211
*     LESS THAN THE FULL LENGTH OF AN ALTERNATE KEY VALUE, THE           CY211
*     FULL-LENGTH ALTERNATE KEY VALUE HAS BEEN STORED IN THE FIAT        CY211
*     AREA TO WHICH FASKY2ADR[0] POINTS, IN PLACE OF THE ((MAJOR KEY))   CY211
*     (SHORT KEY) OFFERED BY THE CALLER.                                 CY211
*                                                                        CY211
*     IF SEEKSTAGE IS 1 ON EXIT, WHETHER IT WAS 0 OR 1 ON ENTRY, WE      CY211
*     HAVE CALLED STMD$AA TO MOVE ATTENTION FROM THE MIP FILE TO         CY211
*     THE DATA FILE, AND SET KEYFWA, KEYOFF, AND MAJKEY TO POINT TO      CY211
*     AND DESCRIBE THE PRIMARY KEY VALUE, AND SET QREL=REL"EQ".          CY211
*                                                                        CY211
*     BUT IF IT TURNED OUT THAT THERE WAS NO MATCH TO THE ALTERNATE      CY211
*     KEY VALUE OFFERED BY THE CALLER, WE HAVE SET FTFP[0]=EOR,          CY211
*     FTPOP[0] = THE CODE FOR ((GET)), AND JUMPED TO EXIT$AA TO          CY211
*     TERMINATE THIS SEEK OPERATION PREMATURELY. EOR IN FTFP[0]          CY211
*     WILL SUGGEST TO THE CALLER THAT HE SHOULD NOT ISSUE ANOTHER SEEK.  CY211
*     BUT IF HE DOES, THE CHANGE IN FTPOP[0] WILL CAUSE THAT SEEK TO     CY211
*     START FROM SCRATCH AGAIN, INSTEAD OF TRYING TO BUILD ON THIS       CY211
*     SEEK, WHICH REACHED A DEAD END.                                    CY211
*                                                                        CY211
* DC  ERROR CONDITIONS                                                   CY211
*                                                                        CY211
*     NONE                                                               CY211
*                                                                        CY211
* DC  CALLED ROUTINES                                                    CY211
*                                                                        CY211
*     KPTR$MP - TO SET UP A KEYDEF WORD IN SIGMA, BASED ON FTRKW[0],     CY211
*       FTRKP[0], AND FTKL[0], AND TO SET KEYFWA, KEYOFF, MAJKEY         CY211
*       AND QREL TO POINT TO THE KEY VALUE.                              CY211
*     CEEK$MP - TO DECIDE WHETHER THIS IS A CONTINUATION OF A            CY211
*       PREVIOUS SEEK.                                                   CY211
*     GOKY$IS - TO CONTINUE A SEARCH OF A LEVEL-2 SUBFILE, LOOKING       CY211
*       FOR THE PROFFERED ALTERNATE KEY VALUE.                           CY211
*     MOVC$AA - TO COPY THE ALTERNATE KEY VALUE INTO THE FIAT            CY211
*       AREA TO WHICH FASKY2ADR[0] POINTS.                               CY211
*     LEVL$MP - TO MOVE FROM THE LEVEL-1 SUBFILE OF THE MIP FILE         CY211
*       TO THE PROPER LEVEL-2 SUBFILE.                                   CY211
*     EZKY$IS - TO INITIATE A SEARCH OF A LEVEL-2 SUBFILE.               CY211
*     CURR$AA - TO LOCATE THE CURRENT RECORD OF A SUBFILE,               CY211
*       BASED ON THE PTREE.                                              CY211
*     PKCT$MP - A FUNCTION THAT = THE NUMBER OF PRIMARY KEY VALUES       CY211
*       LISTED FOR THE CURRENT ALTERNATE KEY VALUE.                      CY211
*     MOVW$AA - TO COPY THE FIRST PRIMARY KEY VALUE TO THE FIAT          CY211
*       AREA TO WHICH FASKY3ADR[0] POINTS.                               CY211
*     STMD$AA - TO TURN ATTENTION TO THE DATA FILE.                      CY211
*                                                                        CY211
* DC  NON-LOCAL VARIABLES                                                CY211
*                                                                        CY211
*     SIGMA - KPTR$MP CALLS POSONKD AND TELLS IT TO CONSTRUCT            CY211
*       A KEYDEF WORD IN SIGMA, FROM WHICH SEEK$MP GETS IT.              CY211
*     OMEGA IS ZEROED AFTER WE DESCEND FROM LEVEL 1 TO LEVEL             CY211
*       2. IT THEN MEANS WE ARE NOT IN A SUBBLOCK INSIDE A               CY211
*       LEVEL-2 RECORD. THE NECESSITY FOR THIS IS NOT OBVIOUS,           CY211
*       BECAUSE A SEEK BY ALTERNATE KEY, OR ANY OTHER OPERATION          CY211
*       THAT CAN LOGICALLY FOLLOW AND DEPEND ON IT, DOES NOT             CY211
*       EXPECT ANY INFORMATION ABOUT LEVEL 3.                            CY211
*                                                                        CY211
 #                                                                       CY211
          BEGIN 
          FASKLAST[0] = 1 ; 
          KPTR$MP ;                                                      AFB0214
          IF CEEK$MP NQ 0 
            THEN BEGIN                                                   AFB0214
              FASEEKEY1[0] = SIGMA ;                                     AFB0214
              MOVC$AA ( KEYFWA,KEYOFF , FASKY2ADR[0],0 , MAJKEY ) ;      AFB0214
              SEEKLENG = MAJKEY ;                                        EXECDMP
              LEVL$MP ( 2 ) ;                                            EXECDMP
              OMEGA = 0;                                                 JJJ0717
              EZKY$IS ( -1 ) ;                                           EXECDMP
            END                                                          EXECDMP
            ELSE BEGIN                                                   EXECDMP
              IF SEEKSTAGE EQ 0 THEN GOKY$IS ( -1 ) ;                    AFB0222
            END                                                          EXECDMP
          IF SEEKSTAGE EQ 0 AND CURPTR EQ NLEV AND PTBLKIN[CURPTR] NQ 0  EXECDMP
            THEN BEGIN                                                   EXECDMP
              IF QMF EQ 0                                                JJJ0222
              THEN                                                       JJJ0222
                  BEGIN                                                  JJJ0222
                  FTFP[0] = EOR ;                                        AFB0531
                  FTPOP[0] = OP"GET" ;                                   CY211
                  GOTO EXIT$AA;                                          JJJ0222
                  END                                                    JJJ0222
              CURR$AA ;                                                  EXECDMP
              MPSOK[0] = 1 - SUBFLAG; 
              FTRC = PKCT$MP; 
              MOVW$AA ( RECFWA , KEYLNGW , FASKY3ADR[0] ) ;              EXECDMP
              IF MAJKEY NQ KLENG                                         AFB0517
                THEN MOVC$AA ( RECFWA+KLOC,KPOS,FASKY2ADR[0],0,KLENG ) ; AFB0517
                  #REPLACE PART KEY BY FULL KEY TO GO TO KEY2#           EXECDMP
              SEEKSTAGE = 1 ;                                            EXECDMP
            END                                                          AFB0222
          IF SEEKSTAGE NQ 0                                              AFB0222
            THEN BEGIN                                                   AFB0222
              STMD$AA ( 0 ) ;                                            EXECDMP
              KEYFWA = FASKY3ADR[0] ;                                    CY211
              KEYOFF = 0;                                                CY211
              QREL = REL"EQ" ;                                           CY211
              MAJKEY = FSKEYSIZE[0] ;                                    CY211
            END                                                          EXECDMP
          END                                                            EXECDMP
                                                                         EXECDMP
      END 
      TERM
