*DECK DADDA                                                                DADDA
*CALL COMUSETXT 
     PROC DA$DA ; BEGIN                                                  DADDA
                                                                         DADDA
                                                                         DADDA
     XREF BEGIN                                                          DADDA
          FUNC MXPR$AA ;                                                 RJC1026
          FUNC UUCC$AA ;                                                 DADDA
          FUNC QUMP$AA ;                                                 DADDA
          PROC SETR$AA ;                                                 DADDA
          PROC BNCH$AA ;                                                 DADDA
          PROC SEBL$AA ;                                                 DADDA
          PROC RDRC$AA ;                                                 DADDA
          PROC MSGZ$AA ;                                                 DADDA
          PROC MSGF$AA ;                                                 DADDA
          PROC GET$MP ;                                                  DADDA
          PROC STPF$AA ;                                                 DADDA
          PROC GETN$MP ;                                                 DADDA
          PROC IMPR$AA ;                                                 DADDA
          PROC RWIN$MP ;                                                 DADDA
          PROC LOCB$AA ;                                                 DADDA
          PROC SEEK$MP ;                                                 DADDA
          PROC GTNR$MP ;                                                 DADDA
          PROC METB$DA ;                                                 DADDA
          PROC OWN$AA ;                                                  DADDA
          PROC MOVC$AA ;                                                 DADDA
          PROC MOVW$AA ;                                                 AFB1121
          PROC SKIP$MP ;                                                 DADDA
          PROC SASH$DA ;                                                 DADDA
          PROC VOKG$AA ;                                                 DADDA
          PROC FILP$AA ;                                                 AFB0801
          LABEL EXIT$AA ;                                                DADDA
          END                                                            DADDA
  
CONTROL WEAK GETN$MP, GET$MP, GTNR$MP, METB$DA ;
CONTROL WEAK RWIN$MP, SEEK$MP, SKIP$MP ;
                                                                         DADDA
     XDEF BEGIN                                                          DADDA
          PROC GTNR$DA ;                                                 DADDA
          PROC SKIP$DA ;                                                 DADDA
          PROC GET$DA ;                                                  DADDA
          PROC GETN$DA ;                                                 DADDA
          PROC REW$DA ;                                                  DADDA
          PROC SEEK$DA ;                                                 DADDA
          PROC FIND$DA ;                                                 DADDA
          PROC KPTR$DA ;                                                 DADDA
          PROC STEP$DA ;                                                 DADDA
          FUNC HASH$DA ;                                                 DADDA
          END                                                            DADDA
                                                                         DADDA
     BASED ARRAY HUSH ; ITEM ZITTI ;                                     DADDA
                                                                         DADDA
     ITEM I , J ; #SCRATCH#                                              DADDA
                                                                         DADDA
     DEF ALPHA #B<0,24>PTREEWRD[2]# ;                                    DADDA
     DEF GAMMA #B<24,24>PTREEWRD[2]# ;                                   DADDA
                                                                         DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   HASH$DA - CONVERT KEY TO HOMEBLOCK PRU NUMBER   PAGE 1             AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC HASH$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO RETURN IN X6, AS A SYMPL FUNCTION, THE PRU NUMBER OF THE        AFB0912
*     HOME BLOCK WHERE A RECORD WITH A GIVEN KEY OUGHT TO BE             AFB0912
*     LOCATED.                                                           AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     THERE ARE THREE PARAMETERS, PASSED IN THE NORMAL SYMPL WAY.        AFB0912
*     (1) THE ADDRESS OF THE WORD CONTAINING THE START OF THE KEY.       AFB0912
*     (2) THE CHARACTER POSITION OF THE START OF THE KEY (I.E. HOW       AFB0912
*        MANY CHARACTERS, IN THE WORD CONTAINING THE FIRST CHARACTER     AFB0912
*        OF THE KEY, PRECEDE THAT CHARACTER.)                            AFB0912
*     (3) THE LENGTH OF THE KEY IN CHARACTERS.                           AFB0912
*                                                                        AFB0912
*     THE HRL FIELD OF THE FIT CONTAINS EITHER THE ENTRY ADDRESS OF      AFB0912
*     A KEY-HASHING ROUTINE SUPPLIED BY THE CALLER, OR 0, IN WHICH       AFB0912
*     CASE SUBROUTINE SASH$DA, IN COMPASS PROGRAM EXEC$DA, IS TO BE      AFB0912
*     USED.                                                              AFB0912
*                                                                        AFB0912
*     FSHBCNT, IN THE FSTT, GIVES THE NUMBER OF HOME BLOCKS IN THIS      AFB0912
*     FILE.                                                              AFB0912
*                                                                        AFB0912
*     FSBLKSIZ, IN THE FSTT, GIVES THE NUMBER OF PRUS IN EVERY DATA      AFB0912
*     BLOCK OF THIS FILE.                                                AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     THE PRU NUMBER IS IN X6 AS A SYMPL FUNCTION. THIS NUMBER HAS       AFB0912
*     BEEN ARRIVED AT IN 3 STEPS --                                      AFB0912
*     (1) LET SASH$DA OR SOME OTHER ROUTINE CONVERT THE KEY TO A         AFB0912
*        ((RANDOM)) NUMBER N.                                            AFB0912
*         THIS ROUTINE IS THE ((HASH ROUTINE)) PROPERLY SPEAKING.        AFB1121
*         SASH$DA IS THE ((DEFAULT HASH)) AND ANYTHING ELSE IS A         AFB1121
*         ((USER HASH)). A HASH ROUTINE IS CALLED WITH 4 PARAMETERS--    AFB1121
*         1. THE LENGTH OF THE KEY IN CHARACTERS.                        AFB1121
*         2. THE FWA OF THE KEY. IF THE KEY IS AN INTEGRAL NUMBER OF     AFB1121
*            WORDS LONG, AND BEGINS ON A WORD BOUNDARY, THEN THIS IS     AFB1121
*            JUST THE FWA OF THE KEY AS IT WAS PRESENTED TO HASH$DA.     AFB1121
*            OTHERWISE, THE KEY IS COPIED INTO ARRAY KEYHOLE IN SUCH     AFB1121
*            A WAY AS TO BEGIN ON A WORD BOUNDARY, AND THE FWA OF        AFB1121
*            THIS ARRAY IS THE SECOND PARAMETER. IF THE KEY IS NOT AN    AFB1121
*            INTEGRAL NUMBER OF WORDS LONG, THE UNUSED CHARACTERS OF     AFB1121
*            THE LAST WORD IN THE COPY HAVE BEEN SET TO BINARY 0, FOR    AFB1121
*            THE COMFORT AND SAFETY OF ((USER HASH)) ROUTINES.           AFB1121
*         3. THE NUMBER OF HOME BLOCKS IN THE FILE. SASH$DA DOES NOT     AFB1121
*            USE THIS.                                                   AFB1121
*         4. THE PARAMETER IN WHICH THE HASH ROUTINE IS TO STORE THE     AFB1121
*            RESULT. THIS IS NOT PRESET BEFORE CALLING THE HASH          AFB1121
*            ROUTINE.                                                    AFB1121
*     (2) FIND K = N MOD H, WHERE H IS THE NUMBER OF HOME BLOCKS.        AFB0912
*     (3) CONSIDERING THE HOME BLOCKS NUMBERED 0 THROUGH H-1, FIND       AFB0912
*        THE PRU NUMBER AT WHICH BLOCK K BEGINS.                         AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     MOVC$AA -- TO COPY THE KEY INTO ARRAY KEYHOLE, IF IT               AFB1121
*       DOES NOT BEGIN ON A WORD BOUNDARY.                               AFB1121
*     MOVW$AA -- TO DO THE SAME, IF IT DOES.                             AFB1121
*     OWN$AA -- TO CALL A USER-SUPPLIED HASH ROUTINE, WHOSE ENTRY        AFB0912
*       ADDRESS IS IN THE HRL FIELD OF THE FIT.                          AFB0912
*     SASH$DA -- THE DEFAULT HASH ROUTINE.                               AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES.                                               AFB0912
*                                                                        AFB0912
*     I - SCRATCH                                                        AFB0912
*                                                                        AFB0912
*     HUSH - THIS BASED ARRAY IS USED ONLY HERE. IT HAS NO REAL          AFB0912
*     USE AS AN ARRAY, AND EXISTS ONLY BECAUSE OF PARAMETER-PASSING      AFB0912
*     CONVENTIONS. HISTORICALLY, A HASH ROUTINE WRITTEN IN FORTRAN       AFB0912
*     EXPECTS THE SECOND PARAMETER TO BE, NOT THE ADDRESS OF THE KEY,    AFB0912
*     BUT THE KEY ITSELF. SO WE PRETEND THAT ARRAY HUSH CONTAINS         AFB0912
*     THE KEY, AND PASS ((HUSH)) TO THE HASH ROUTINE.                    AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
     FUNC HASH$DA ( A , B , C ) ; BEGIN ITEM A , B , C , E , H ;         DADDA
          H = MOD10(C) ;                                                 AFB1121
          IF B EQ 0 AND H EQ 0                                           AFB1121
            THEN P<HUSH> = A ;                                           AFB1121
            ELSE BEGIN                                                   AFB1121
              P<HUSH> = LOC(KEYHOLE[0]) ;                                AFB1121
              I = TENTH(C) ;                                             AFB1121
              IF B EQ 0                                                  AFB1121
                THEN BEGIN                                               AFB1121
                  MOVW$AA ( A , I+1 , P<HUSH> ) ;                        AFB1121
                  ZITTI[I] = ZITTI[I] LAN -(2**(6*(10-H))-1) ;           AFB1121
                END                                                      AFB1121
                ELSE BEGIN                                               AFB1121
                  ZITTI[I] = 0 ;                                         AFB1121
                  MOVC$AA ( A , B , P<HUSH> , 0 , C ) ;                  AFB1121
                END                                                      AFB1121
            END                                                          AFB1121
          I = FTHRL[0] ;                                                 DADDA
          H = FSHBCNT[0] ;                                               DADDA
          IF I EQ 0                                                      DADDA
            THEN SASH$DA ( C , HUSH , H , E ) ;                          DADDA
            ELSE OWN$AA ( I , C , HUSH , H , E ) ;                       DADDA
          E = ABS(E) LAN (2**48 - 1) ;                                   DADDA
          IF E GQ H                                                      DADDA
            THEN BEGIN                                                   DADDA
              I = E/H ;                                                  DADDA
              E = E - I * H ;                                            DADDA
            END                                                          DADDA
          HASH$DA = E * FSBLKSIZ[0] + PRU3 ;                             DADDA
          END                                                            DADDA
                                                                         DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   FIND$DA - LOCATE A RECORD BY KEY IN A DA FILE      PAGE 1          AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC FIND$DA                                                            AFB0912
*                                                                        AFB0912
*     TO LOCATE A RECORD BY KEY IN A DA FILE, OR TO ASCERTAIN            AFB0912
*     ITS ABSENCE. IF PRESENT, TO NOTE ALSO THE HOME BLOCK NUMBER, WHICH AFB0912
*     MAY NOT BE THE SAME AS THE BLOCK WHERE THE RECORD IS FOUND, AND    AFB0912
*     THE NUMBER OF THE BLOCK (IF ANY) THAT PRECEDES, IN THE CHAIN       AFB0912
*     BEGINNING AT THE HOME BLOCK, THE BLOCK CONTAINING THE WANTED       AFB0912
*     RECORD.                                                            AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     KEYFWA IS THE STARTING ADDRESS OF THE KEY.                         AFB0912
*     KEYOFF IS THE STARTING CHARACTER POSITION OF THE KEY.              AFB0912
*     MAJKEY IS THE LENGTH OF THE KEY.                                   AFB0912
*     P<PTRE$AA>, P<FSTT$AA>, P<FINF$AA> MUST ALREADY BE SET FOR         AFB0912
*       THIS DA FILE.                                                    AFB0912
*     FSFDBPRU IN THE FSTT IS THE PRU NUMBER NEXT BEYOND THE END         AFB0912
*       OF THE LAST HOME BLOCK, SO THAT ANY PRU NUMBER NOT LESS          AFB0912
*       THAN THIS MUST INDICATE AN OVERFLOW BLOCK.                       AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     GAMMA (A FIELD IN THE THIRD WORD OF THE PTREE) IS THE PRU          AFB0912
*       NUMBER OF THE HOME BLOCK.                                        AFB0912
*     QMF = 1 IF MATCHING RECORD FOUND, ELSE QMF = 0.                    AFB0912
*       (A MATCHING DEAD RECORD, I.E. ONE DELETED BUT NOT SQUEEZED OUT,  AFB0912
*       WILL BE IGNORED.)                                                AFB0912
*     IF QMF = 1, H IS THE PRU NUMBER OF THE BLOCK CONTAINING            AFB0912
*       THE WANTED RECORD. ELSE H IS THE PRU NUMBER OF THE END           AFB0912
*       BLOCK IN THE CHAIN THAT BEGINS AT HOME BLOCK GAMMA.              AFB0912
*     ALPHA (ALSO A FIELD IN THE THIRD WORD OF THE PTREE) IS THE         AFB0912
*       PRU NUMBER OF THE BLOCK PRECEDING BLOCK H IN THE CHAIN,          AFB0912
*       UNLESS BLOCK H IS A HOME BLOCK, IN WHICH CASE ALPHA = 0.         AFB0912
*     IF QMF = 1, THE FIRST WORD OF THE PTREE HAS BEEN SET TO            AFB0912
*       CONTAIN THE BLOCK AND RECORD NUMBER OF THE MATCHING              AFB0912
*       RECORD.                                                          AFB0912
*     IF THE FILE IS OPEN FOR ALTER, AND A TERMINAL BLOCK IS             AFB0912
*       LOOKED AT, THE SUBROUTINE FOR UPDATING THE MOST-EMPTY            AFB0912
*       TABLE HAS BEEN CALLED TO SEE IF THIS BLOCK SHOULD BE             AFB0912
*       IN THE TABLE.                                                    AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     HASH$DA -- TO FIND THE HOME BLOCK PRU NUMBER.                      AFB0912
*     SEBL$AA -- TO LOCATE A BLOCK (WHOSE PRU NUMBER IS IN THE PTREE)    AFB0912
*     BNCH$AA -- TO SEARCH A BLOCK IN CORE FOR A GIVEN KEY.              AFB0912
*     UUCC$AA -- TO GET THE ((UNUSED CHARACTER COUNT)) OF A GIVEN        AFB0912
*       RECORD IN THE CURRENT BLOCK. PROPERLY THIS COUNT MUST BE         AFB0912
*       LESS THAN 10, BUT THE VALUE 15 IS USED TO INDICATE A DELETED     AFB0912
*       BUT UNSQUEEZED-OUT RECORD.                                       AFB0912
*     SETR$AA -- TO PUT A GIVEN RECORD NUMBER INTO THE CURRENT WORD      AFB0912
*       OF THE PTREE AND THEN LOCATE THAT RECORD, SETTING RECFWA,        AFB0912
*       RECLWA AND RECLNG.                                               AFB0912
*     METB$DA -- TO COMPARE THE CURRENT BLOCK (IF IT IS A TERMINAL       AFB0912
*       BLOCK) WITH THE MOST-EMPTY TABLE AND TO ENTER IT IN THAT         AFB0912
*       TABLE IF THIS CAN BE DONE WITHOUT DISPLACING AN EMPTIER BLOCK.   AFB0912
*       BUT ONLY IF METB$DA IS KNOWN TO BE LOADED. THE DA OUTPUT CAPSULE AFB0912
*       MAY NOT HAVE BEEN LOADED YET,EITHER BECAUSE THE FILE IS OPEN FOR AFB0912
*       INPUT ONLY, OR BECAUSE NO OUTPUT OPERATION HAS BEEN DONE SO FAR. AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     MATRESL IS SET BY BNCH$AA TO 0 IF THERE IS NO MATCHING RECORD IN   AFB0912
*       THE CURRENT BLOCK, OR ELSE TO THE RECORD NUMBER OF THE MATCHING  AFB0912
*       RECORD.                                                          AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
     PROC FIND$DA ; BEGIN ITEM H ;                                       DADDA
          H = HASH$DA ( KEYFWA , KEYOFF , MAJKEY ) ;                     DADDA
          ALPHA = 0 ;                                                    DADDA
          GAMMA = H ; #HOME BLOCK NUMBER#                                DADDA
          CURPTR = 0 ;                                                   DADDA
          QMF = 0 ;                                                      DADDA
          ASLONGAS H NQ 0                                                DADDA
            DO BEGIN                                                     DADDA
              PTCURBLK[0] = H ;                                          DADDA
              SEBL$AA ( 0 , 1 ) ;                                        DADDA
              BNCH$AA ;                                                  DADDA
              IF MATRESL NQ 0 AND UUCC$AA ( MATRESL ) NQ DEAD            DADDA
                THEN BEGIN                                               DADDA
                  SETR$AA ( MATRESL ) ;                                  DADDA
                  QMF = 1 ;                                              DADDA
                  GOTO FINDAB ;                                          DADDA
                END                                                      DADDA
                ELSE BEGIN                                               DADDA
                  ALPHA = H ;                                            DADDA
                  H = FWD ;                                              DADDA
                END                                                      DADDA
            END                                                          DADDA
       FINDAB:                                                           DADDA
         IF B<12,1>W[LOC(UPDT)] EQ 0  AND  FWD EQ 0                      GAG0905
          AND BLOCKID[0] GQ FSFDBPRU[0]                                  GAG0905
         THEN                                                            GAG0905
             BEGIN  #UPDATE MOST EMPTY TABLE IF UPDT CAPSULE IN CORE#    GAG0905
UPDT:        METB$DA ;                                                   GAG0905
             END                                                         GAG0905
         END                                                             GAG0906
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   GET$DA - DO A GET ON A DA FILE                      PAGE 1         AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC GET$DA                                                             AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO DO EVERYTHING NECESSARY FOR A GET OPERATION ON A DA             AFB0912
*     FILE, ASSUMING THE FILE HAS BEEN OPENED.                           AFB0912
*     OR TO DO A START OPERATION BY ALTERNATE KEY. BUT THERE IS NO       AFB0912
*     START BY PRIMARY KEY ON A DA FILE.                                 AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     P<FIT$AA> AND P<FIAT$AA> POINT TO THE FIT AND FIAT FOR             AFB0912
*       THIS FILE.                                                       AFB0912
*     STMD$AA ( 0 ) HAS BEEN CALLED JUST BEFORE GET$DA. IN PARTICULAR    AFB0912
*       THIS MEANS THAT P<FSTT$AA> POINTS TO THE DATA FILE, NOT THE      AFB0912
*       MIP FILE IF ANY.                                                 AFB0912
*     THE CURRENT DATA FILE IS OF COURSE KNOWN TO BE DA.                 AFB0912
*     KA AND KP IN THE FIT LOCATE THE START OF THE KEY PROPOSED          AFB0912
*       BY THE CALLER.                                                   AFB0912
*     KL, RKW, AND RKP GIVE THE LENGTH OF THE KEY (IN CHARACTERS) AND    AFB0912
*       ITS RELATIVE STARTING POSITION IN A RECORD. IF THESE ARE THE     AFB0912
*       SAME AS THE FSTT GIVES FOR PRIMARY KEYS, THE GET IS BY PRIMARY   AFB0912
*       KEY. OTHERWISE BY ALTERNATE KEY.                                 AFB0912
*     WSA IN THE FIT IS THE FWA OF THE AREA INTO WHICH THE RECORD IS     AFB0912
*       TO BE COPIED, BEGINNING AT THE LEFTMOST CHARACTER.               AFB0912
*     MRL IN THE FIT IS THE MAXIMUM LENGTH, IN CHARACTERS, OF THE RECORD AFB0912
*       THAT CAN BE ACCEPTED IN THE WSA AREA. IF THE ACTUAL RECORD IS    AFB0912
*       TOO LONG, THERE WILL BE A NON-FATAL ERROR. KEY VALUE(S) WILL     AFB0912
*       BE RETURNED IF CALLED FOR, BUT THE RECORD WILL NOT BE RETURNED.  AFB0912
*     NDX IN THE FIT IS 0. ALL INDEX-ONLY OPERATIONS ARE HANDLED AS IF   AFB0912
*       THE DATA FILE WERE INDEX-SEQUENTIAL, BECAUSE DATA FILE           AFB0912
*       ORGANIZATION IS REALLY IRRELEVANT TO THEM.                       AFB0912
*     IF THE GET (OR START) IS BY ALTERNATE KEY, SEE THE ((ENTRY         AFB0912
*     CONDITIONS)) AND ((EXIT CONDITIONS)) FOR SUBROUTINE GET$IS.        AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF BY ALTERNATE KEY, SEE ((EXIT CONDITIONS)) FOR SUBROUTINE        AFB0912
*     GET$IS. NOTABLY, FAPOSKEY1[0] IS SET SO THAT UNTIL FURTHER         AFB0912
*     NOTICE, A SKIP OR GETNEXT THRU THIS FIT WILL BE BY ALTERNATE       AFB0912
*     KEY, STARTING AT THE POSITION SET BY THIS ((GET)).                 AFB0912
*                                                                        AFB0912
*     OTHERWISE --                                                       AFB0912
*     IF THERE WAS NOT A MATCH, WE DO NOT EXIT NORMALLY BUT GIVE A       AFB0912
*     NON-FATAL ERROR AND SKIP OUT TO EXIT$AA.                           AFB0912
*                                                                        AFB0912
*     IF THERE WAS A MATCH, THE RECORD HAS BEEN RETURNED TO THE          AFB0912
*     CALLER (UNLESS MRL IN THE FIT WAS TOO SMALL, AS EXPLAINED ABOVE    AFB0912
*     UNDER ((ENTRY CONDITIONS)) ).                                      AFB0912
*     THE FP FIELD OF THE FIT HAS BEEN SET TO 20B (EOR).                 AFB0912
*     THE RL FIELD OF THE FIT CONTAINS THE LENGTH OF THE RECORD, IN      AFB0912
*     CHARACTERS. IF THIS IS NOT A MULTIPLE OF 10, THE EXTRA CHARACTERS  AFB0912
*     AT THE END OF THE LAST WORD HAVE NOT BEEN PRESERVED EXCEPT FOR     AFB0912
*     THOSE THAT LIE BEYOND THE LIMIT SET BY MRL.                        AFB0912
*     FSGETCNT[0] HAS BEEN INCREMENTED BY 1.                             AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     EC245 - IF A START BY PRIMARY KEY IS ATTEMPTED.                    AFB0912
*     EC445 - IF THERE IS NO MATCH, ON A GET BY PRIMAR KEY.              AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     VOKG$AA - TO CHECK PERMISSIONS ETC.                                AFB0912
*     QUMP$AA - TO DECIDE WHETHER BY PRIMARY OR                          AFB0912
*       BY ALTERNATE KEY.                                                AFB0912
*     GET$MP - TO DO EVERYTHING INVOLVED IN A GET BY ALTERNATE           AFB0912
*       KEY EXCEPT THE FINAL LOCATION OF THE RECORD BY PRIMARY           AFB0912
*       KEY, AND THE RETURNING OF THE RECORD TO THE CALLER.              AFB0912
*     POSTGMP - TO LOCATE THE RECORD BY PRIMARY KEY, AFTER               AFB0912
*       RETURNING FROM GET$MP.                                           AFB0912
*     KPTR$DA - FOR A GET BY PRIMARY KEY, TO SET UP THE                  AFB0912
*       KEY POINTERS FOR FIND$DA.                                        AFB0912
*     FIND$DA - TO LOOK FOR THE RECORD, BY PRIMARY KEY.                  AFB0912
*     MSGZ$AA - TO ISSUE A NON-FATAL ERROR.                              AFB0912
*     RDRC$AA - TO RETURN THE RECORD, AND POSSIBLY ONE OR TWO            AFB0912
*       KEYS, TO THE CALLER.                                             AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     QMF IS A RESULT SET BY FIND$DA - 1 IF MATCH, 0 IF NONE.            AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC GET$DA ; BEGIN                                                 DADDA
          VOKG$AA ;                                                      DADDA
          IF RECCNT EQ 0                                                 RJC1026
            THEN BEGIN                                                   RJC1026
              GOTO NOGET ;                                               RJC1026
            END                                                          RJC1026
          XFER = 0 ;                                                     DADDA
          IF QUMP$AA ( 0 ) NQ 0                                          DADDA
            THEN BEGIN                                                   DADDA
              GET$MP ;                                                   DADDA
              IF FTCOP[0] NQ OP"GET"                                     AFB0801
                THEN BEGIN                                               AFB0801
                  RETURN ;  #START#                                      AFB0801
                END                                                      AFB0801
              POSTGMP ; #NOTE THAT NDX = 1 IS ALWAYS HANDLED             DADDA
                          AS IF IS, NOT DA#                              DADDA
            END                                                          DADDA
            ELSE BEGIN                                                   DADDA
              IF FTCOP[0] NQ OP"GET" THEN GOTO MS245 ;                   DADDA
                 #CANT DO START IN DA#                                   DADDA
              KPTR$DA ;                                                  DADDA
              FIND$DA ;                                                  DADDA
              IF QMF EQ 0                                                DADDA
                THEN BEGIN                                               DADDA
 NOGET:                                                                  RJC1026
                  MSGZ$AA ( EC445 ) ;                                    DADDA
                  GOTO EXIT$AA ;                                         DADDA
                END                                                      DADDA
              FTFP[0] = EOR ;                                            DADDA
            END                                                          DADDA
          RDRC$AA ;                                                      DADDA
          FSGETCNT[0] = FSGETCNT[0] + 1 ;                                DADDA
          END                                                            DADDA
                                                                         DADDA
     MS245:                                                              DADDA
          MSGZ$AA ( EC245 ) ;                                            DADDA
          GOTO EXIT$AA ;                                                 DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   GETN$DA - GET NEXT RECORD IN A DA FILE         PAGE 1              AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC GETN$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO CARRY OUT A GETNEXT OPERATION ON A DA FILE. IF THIS IS          AFB0912
*     DONE BY ALTERNATE KEY, THE EXPLANATIONS GIVEN FOR SUBROUTINE       AFB0912
*     GETN$IS SHOULD BE REFERRED TO. NOTE THAT PTOF[0] COULD NOT         AFB0912
*     BE OTHER THAN 0 WHEN ANY GETNEXT BY ALTERNATE KEY IS BEGUN.        AFB0912
*                                                                        AFB0912
*     A GETN BY PRIMARY KEY GETS THE NEXT RECORD ACCORDING TO PHYSICAL   AFB0912
*     SEQUENCE OF RECORDS AND BLOCKS, DISREGARDING ALL QUESTIONS OF HOME AFB0912
*     VERSUS OVERFLOW. POSITION IN THIS SEQUENCE IS CONSIDERED LOST IF A AFB0912
*     PUT OR A REPLACE BY A LONGER RECORD TAKES PLACE.                   AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     IF FAPOSKEY1[0] IN THE FIAT IS 0, THE GETNEXT WILL BE BY PRIMARY   AFB0912
*     ELSE BY THE ALTERNATE KEY DEFINED BY FIELDS OF FAPOSKEY1[0].       AFB0912
*                                                                        AFB0912
*     FAPOSKEY1[0] CAN HAVE BEEN SET NON-ZERO IN TWO WAYS -- BY A REWIND AFB0912
*     OR A GET BY ALTERNATE KEY.                                         AFB0912
*     FAPOSKEY1[0] IS ZEROED AT OPEN.  SO IS THE SECOND WORD OF THE      AFB0912
*     PTREE, WHICH INDICATES THAT THE FILE IS REWOUND BY PRIMARY KEY.    AFB0912
*     FAPOSKEY1[0] IS ALSO ZEROED BY A REWIND BY PRIMARY KEY, BUT NOT    AFB0912
*     BY A GET BY PRIMARY KEY. THIS IS BECAUSE IN A DA FILE, A GET       AFB0912
*     BY PRIMARY KEY DOES NOT ESTABLISH A POSITION FROM WHICH GETNEXT    AFB0912
*     CAN CONTINUE. ALSO NOTE THAT THERE IS NO SKIPPING BY PRIMARY       AFB0912
*     KEY IN A DA FILE.                                                  AFB0912
*                                                                        AFB0912
*     IF THE GETNEXT IS BY ALTERNATE KEY, SEE THE ENTRY AND EXIT         AFB0912
*     CONDITIONS OF SUBROUTINE GETN$IS. HOWEVER, IF GETN$DA              AFB0912
*     HAS BEEN ENTERED, NDX IN THE FIT CAN ONLY BE 0. IF IT WERE 1       AFB0912
*     FOR AN INDEX-ONLY OPERATION, GETN$IS WOULD HAVE BEEN CALLED        AFB0912
*     IN THE FIRST PLACE, FOR THE FILE ORGANIZATION OF THE               AFB0912
*     DATA FILE WOULD THEN BE IRRELEVANT.                                AFB0912
*                                                                        AFB0912
*     IF THE GETNEXT IS BY PRIMARY KEY, CURRENT POSITION IS INDICATED    AFB0912
*     BY PTCURBLK[1] AND PTCUREC[1] IN THE PTREE. ZERO IN THIS WORD      AFB0912
*     INDICATES REWOUND POSITION. THE CURRENT RECORD IS CONSIDERED AS    AFB0912
*     HAVING BEEN PREVIOUSLY RETURNED. THERE IS NO NEED FOR USING THE    AFB0912
*     XFER FLAG HERE, BECAUSE THERE ARE NO STARTS AND NO SKIPS.          AFB0912
*                                                                        AFB0912
*     IF FAFP (A COPY OF FP IN THE FIT, SET BY SOME EARLIER OPERATION)   AFB0912
*     CONTAINS ((EOR)) (100B), THEN THE FILE IS CONSIDERED TO BE ALREADY AFB0912
*     AT EOI, AND A NON-FATAL ERROR IS GIVEN.                            AFB0912
*                                                                        AFB0912
*     WSA IN THE FIT IS THE FWA OF THE AREA INTO WHICH THE RECORD IS     AFB0912
*       TO BE COPIED, BEGINNING AT THE LEFTMOST CHARACTER.               AFB0912
*     MRL IN THE FIT IS THE MAXIMUM LENGTH, IN CHARACTERS, OF THE RECORD AFB0912
*       THAT CAN BE ACCEPTED IN THE WSA AREA. IF THE ACTUAL RECORD IS    AFB0912
*       TOO LONG, THERE WILL BE A NON-FATAL ERROR. THE PRIMARY KEY VALUE AFB0912
*       WILL BE RETURNED, IF KA IS NOT ZERO, BUT NOTHING ELSE.           AFB0912
*     IF KA IN THE FIT IS NOT 0, IT IS THE ADDRESS OF A WORD, AND KP IN  AFB0912
*       THE FIT IS THE CHARACTER POSITION, AT WHICH THE PRIMARY KEY IS   AFB0912
*       TO BE RETURNED TO THE CALLER.                                    AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF THE GETNEXT IS BY ALTERNATE KEY, SEE THE EXIT CONDITIONS FOR    AFB0912
*     SUBROUTINE GETN$IS.                                                AFB0912
*                                                                        AFB0912
*     OTHERWISE --                                                       AFB0912
*     FP IN THE FIT, AND FAFP IN THE FIAT, ARE SET TO EOI (100B) IF      AFB0912
*       FILE WAS ALREADY AT THE END OF THE LAST RECORD.                  AFB0912
*     OTHERWISE, THEY ARE SET TO EOR (20B).                              AFB0912
*     IF KA IN THE FIT IS NOT ZERO, THE PRIMARY KEY HAS BEEN RETURNED    AFB0912
*       TO WHERE KA AND KP POINT.                                        AFB0912
*     THE RECORD HAS BEEN RETURNED UNLESS MRL IN THE FIT IS TOO SMALL,   AFB0912
*       AS NOTED ABOVE.                                                  AFB0912
*     RL IN THE FIT CONTAINS THE LENGTH OF THE RECORD, IF RETURNED, IN   AFB0912
*       CHARACTERS. IF THIS IS NOT A MULTIPLE OF 10, THE EXTRA           AFB0912
*       CHARACTERS AT THE END OF THE LAST WORD HAVE NOT BEEN PRESERVED   AFB0912
*       EXCEPT FOR THOSE THAT LIE BEYOND THE LIMIT SET BY MRL.           AFB0912
*     FSGTNCNT IN THE FSTT OF THE DA FILE HAS BEEN INCREASED BY 1.       AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     NOTE011 - THE FILE WAS POSITIONED ON THE LAST RECORD WHEN WE       AFB0912
*       ENTERED GETN$DA, AND IS NOW AT EOI.                              AFB0912
*     EC100 - THE FILE WAS ALREADY AT EOI WHEN WE ENTERED GETN$DA.       AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     VOKG$AA - TO CHECK PERMISSIONS ETC.                                AFB0912
*     MSGZ$AA - TO ISSUE NON-FATAL ERRORS.                               AFB0912
*     GETN$MP - TO DO MOST OF THE WORK OF A GETNEXT BY ALTERNATE         AFB0912
*       KEY, UP TO THE POINT WHERE WE ARE READY TO LOCATE THE RECORD     AFB0912
*       BY PRIMARY KEY AND THEN DELIVER IT.                              AFB0912
*     POSTGMP - TO LOCATE THE RECORD BY PRIMARY KEY, AFTER GETN$MP.      AFB0912
*     STEP$DA - TO STEP FORWARD ONE RECORD BY PRIMARY KEY.               AFB0912
*     FILP$AA - TO SET THE FP FIELDS OF THE FIT AND FIAT.                AFB0912
*     RDRC$AA - TO RETURN THE RECORD, AND MAYBE ONE OR TWO KEYS,         AFB0912
*       TO THE CALLER.                                                   AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     MIPMODE IS 0 IF P<FSTT$AA>, P<PTRE$AA>, AND A COUPLE OF OTHER      AFB0912
*       BASED ARRAY POINTERS REFER TO THE DATA FILE, AND NON-ZERO        AFB0912
*       IF THEY REFER TO THE MIP FILE. WE DO NOT WANT TO CLEAR           AFB0912
*       A QEI FLAG IN THE MIP FILE, AND IF WE HAVE REACHED               AFB0912
*       EOI BY ALTERNATE KEY, NO ROUTINE WILL HAVE BOTHERED              AFB0912
*       TO CALL STMD$AA(0) AND SWITCH US BACK TO THE DATA FILE.          AFB0912
*       QEI=1 IN THE CURRENT FILE (WHICH THEN HAPPENS TO BE THE MIP      AFB0912
*       FILE) IS LEFT AS SUFFICIENT INDICATION. IF STEP$DA HAS BEEN      AFB0912
*       CALLED, HOWEVER, IT MAY HAVE LEFT QEI=1 IN THE PTREE FOR THE     AFB0912
*       DA FILE. WE WANT TO CLEAR THIS, NOT BECAUSE THERE APPEARS        AFB0912
*       TO BE ANY WAY IT COULD DO IMMEDIATE HARM, BUT BECAUSE THERE      AFB0912
*       IS NO PLACE WHERE IT COULD BE USEFULLY TESTED ON A FUTURE        AFB0912
*       OPERATION. SO WE CLEAR IT WHEN OF NO FURTHER USE, RATHER         AFB0912
*       THAN HAVING TO CLEAR IT, SAY ON EVERY ENTRY TO STEP$DA.          AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC GETN$DA ; BEGIN                                                DADDA
          VOKG$AA ;                                                      DADDA
          IF FAFP[0] EQ EOI                                              DADDA
            THEN BEGIN                                                   DADDA
              FTFP[0] = EOI ;                                            DADDA
              MSGZ$AA ( EC100 ) ;                                        DADDA
              GOTO EXIT$AA ;                                             DADDA
            END                                                          DADDA
          IF RECCNT EQ 0                                                 RJC1026
            THEN BEGIN                                                   RJC1026
              GOTO GNEOI ;                                               RJC1026
            END                                                          RJC1026
          IF FAPOSKEY1[0] NQ 0                                           DADDA
            THEN BEGIN                                                   DADDA
              GETN$MP ;                                                  DADDA
              POSTGMP ; #NOTE THAT NDX=1 IS ALWAYS HANDLED               DADDA
                           AS IF IS, NEVER DA OR AK#                     DADDA
            END                                                          DADDA
            ELSE BEGIN                                                   DADDA
              STEP$DA ( 1 ) ;                                            DADDA
              IF QEI EQ 0 THEN FILP$AA ( EOR ) ;                         AFB0801
            END                                                          DADDA
          IF QEI EQ 0                                                    DADDA
            THEN BEGIN                                                   DADDA
              RDRC$AA ;                                                  DADDA
              FSGTNCNT[0] = FSGTNCNT[0] + 1 ;                            DADDA
            END                                                          DADDA
            ELSE BEGIN                                                   DADDA
              IF MIPMODE EQ 0 THEN QEI = 0 ;                             DADDA
 GNEOI:                                                                  RJC1026
              FILP$AA ( EOI ) ;                                          AFB0801
              MSGZ$AA ( NOTE011 ) ;                                      DADDA
            END                                                          DADDA
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   GTNR$DA - GET NEXT WITHOUT RECALL ON A DA FILE           PAGE 1    AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC GTNR$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO DO A GETNEXT WITHOUT RECALL ON A DA FILE, WHETHER BY PRIMARY    AFB0912
*     OR BY ALTERNATE KEY. THIS MEANS INCHING ALONG TOWARDS GETNEXT      AFB0912
*     IN SUCH A WAY THAT BLOCK READING IS ALWAYS DONE WITHOUT RECALL.    AFB0912
*     UNLIKE SEEK, THIS OPERATION GOES TO COMPLETION WHEN IT CAN,        AFB0912
*     INSTEAD OF LEAVING IT TO THE CALLER TO GIVE THE COUP DE GRACE.     AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     IF FAFP[0], A COPY IN THE FIAT OF WHAT WAS LAST STORED IN THE      AFB0912
*     FP FIELD OF THE FIT, CONTAINS EOI (100B), THEN THE FILE IS         AFB0912
*     ALREADY POSITIONED AT EOI AND WE DO NOT HAVE TO DO ANYTHING        AFB0912
*     BUT ISSUE A NON-FATAL ERROR.                                       AFB0912
*                                                                        AFB0912
*     IF FAFP[0] = 63, THIS MUST MEAN THAT THE LAST TIME THE FILE        AFB0912
*     WAS REWOUND BY ALTERNATE KEY, IT WAS FOUND TO BE EMPTY, AND        AFB0912
*     NO GETNEXT BY ALTERNATE KEY HAS BEEN DONE SINCE THEN. SO IF        AFB0912
*     WE ARE NOW DOING A GETNEXT WITHOUT RECALL BY ALTERNATE KEY, TO     AFB0912
*     SIMPLIFY THINGS WE FORCE AN IMMEDIATE COMPLETION BY CALLING        AFB0912
*     GETN$DA, AND SETTING THE OPERATION CODE FIELDS IN THE FIT          AFB0912
*     TO GETN RATHER THAN GETNR. IF THIS WERE NOT DONE, WE SHOULD        AFB0912
*     HAVE TO HAVE MANY EXTRA INSTRUCTIONS HERE, AND FOR SUCH A          AFB0912
*     PECULIAR CASE IT IS NOT WORTH IT.                                  AFB0912
*                                                                        AFB0912
*     OTHERWISE, IF FAPOSKEY1[0] IS 0 WE ARE TO WORK BY PRIMARY KEY,     AFB0912
*     IF NOT, BY AN ALTERNATE KEY DEFINED BY FIELDS IN FAPOSKEY1[0].     AFB0912
*     SEE THE COMMENTS TO SUBROUTINE GTNR$MP FOR DETAILS OF THE          AFB0912
*     NON-ZERO CASE.                                                     AFB0912
*                                                                        AFB0912
*     IF BY PRIMARY KEY, CURRENT POSITION IS DEFINED BY THE SECOND       AFB0912
*     WORD OF THE PTREE, AS DESCRIBED ABOVE IN THE ENTRY CONDITIONS      AFB0912
*     TO SUBROUTINE GETN$DA.                                             AFB0912
*                                                                        AFB0912
*     WSA, MRL, KA AND KP IN THE FIT DEFINE WHERE THE RECORD, AND        AFB0912
*     OPTIONALLY THE PRIMARY KEY VALUE, ARE TO BE RETURNED TO THE        AFB0912
*     CALLER IF THIS GETNR GOES TO COMPLETION. THEY ARE DESCRIBED        AFB0912
*     AT THE END OF THE ENTRY CONDITIONS FOR SUBROUTINE GETN$DA.         AFB0912
*                                                                        AFB0912
*     MPEOK IS A FLAG IN THE MPAT SECTION OF THE FIAT. IT IS SET IN      AFB0912
*     SUBROUTINE GTNR$MP TO SHOW WHETHER THE NEW PRIMARY KEY VALUE,      AFB0912
*     AFTER THE STEP FORWARD, IS (1) OR IS NOT (0) THE LAST OR ONLY      AFB0912
*     ONE BELONGING TO THE CORRESPONDING ALTERNATE KEY VALUE.            AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF THIS GETNR GOES TO COMPLETION, THE EXIT CONDITIONS ARE THE      AFB0912
*     SAME AS THOSE DESCRIBED FOR COMPLETION OF SUBROUTINE GETN$DA.      AFB0912
*     THE COP AND POP FIELDS OF THE FIT WILL ALSO BE ALTERED             AFB0912
*     TO THE CODE FOR GETN RATHER THAN GETNR. THIS IS SO THAT            AFB0912
*     IF THE NEXT OPERATION ON THE FIT IS A GETNR, THE PRECEDING         AFB0912
*     OPERATION WILL SEEM NOT TO HAVE BEEN A GETNR, AND SO FORCE THE NEW AFB0912
*     GETNR TO START FROM SCRATCH INSTEAD OF TRYING TO CONTINUE          AFB0912
*     SOMETHING.                                                         AFB0912
*     IF THE COMPLETION CONSISTS OF REACHING EOI, EXIT CONDITIONS ARE    AFB0912
*     THE SAME AS FOR GETN$DA BUT POP AND COP IN THE FIT ARE NOT ALTERED AFB0912
*     BECAUSE THERE IS NO NEED.                                          AFB0912
*                                                                        AFB0912
*     OTHERWISE, FP IN THE FIT AND FAFP[0] IN THE FIAT ARE SET TO 0,     AFB0912
*     NAMED ((FPNULL)). IF THE OPERATION IS BY ALTERNATE KEY, THE EXIT   AFB0912
*     CONDITIONS ON INCOMPLETION ARE QUITE COMPLICATED, AND SHOULD BE    AFB0912
*     LOOKED UP IN THE COMMENTS TO SUBROUTINE GTNR$MP. IF BY PRIMARY     AFB0912
*     KEY, THE CURRENT POSITION IS MARKED AS EXPLAINED IN THE COMMENTS   AFB0912
*     TO SUBROUTINE STEP$DA, CALLED WITHOUT RECALL.                      AFB0912
*                                                                        AFB0912
*     THERE IS ONE EXIT CASE NOT COVERED BY THE ABOVE. IF THE GETNR IS   AFB0912
*     BY ALTERNATE KEY, AND HAS ALREADY GOT SO FAR AS TO FIND THE        AFB0912
*     NEEDED PRIMARY KEY VALUE, BUT THE RECORD IN THE DA FILE HAS NOT    AFB0912
*     BEEN LOCATED, WE ARE IN THE POSITION OF DOING, AS IT WERE, A       AFB0912
*     DA GET-WITHOUT-RECALL. THE CURRENT SITUATION IS MARKED BY FP=0,    AFB0912
*     A BLOCK NUMBER IN THE SECOND WORD OF THE PTREE (THE RECORD         AFB0912
*     NUMBER DOES NOT MATTER) AND A PRIMARY KEY VALUE IN THE AREA OF     AFB0912
*     THE FIAT TO WHICH FAPKY3ADR[0] POINTS.                             AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     EC117 - (ACTUALLY DONE IN SUBROUTINE STEP$DA) IF WE ARE TRYING     AFB0912
*       TO GO BY PRIMARY KEY, BUT POSITION HAS BEEN DESTROYED BY A       AFB0912
*       FILE UPDATE.                                                     AFB0912
*     EC100 - WE WERE ALREADY AT EOI.                                    AFB0912
*     NOTE011 - WE HAVE JUST REACHED EOI AND NO RECORD IS BEING          AFB0912
*       RETURNED.                                                        AFB0912
*     EC546 (FATAL) - A PRIMARY KEY VALUE CAME OUT OF THE MIP FILE       AFB0912
*       BUT COULD NOT BE FOUND IN THE DATA FILE. IT SEEMS THE            AFB0912
*       TWO FILES ARE OUT OF STEP.                                       AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     MSGZ$AA - TO SEND NON-FATAL ERRORS.                                AFB0912
*     MSGF$AA - TO SEND FATAL ERRORS.                                    AFB0912
*     GETN$DA - TO DO THE WHOLE JOB IMMEDIATELY, IF                      AFB0912
*       CONDITIONS ARE STRANGE.                                          AFB0912
*     GTNR$MP - IF BY ALTERNATE KEY, TO DO EVERYTHING UP                 AFB0912
*       TO AND INCLUDING FINDING THE NEW PRIMARY KEY VALUE               AFB0912
*       IN THE MIP FILE AND THEN CALLING STMD$AA(0) TO                   AFB0912
*       SWITCH TO THE DATA FILE. OR RATHER DOING AS MUCH                 AFB0912
*       OF THIS AS CAN BE ACHIEVED WITH NOT MORE THAN ONE                AFB0912
*       BLOCK READ, AND THAT WITHOUT RECALL.                             AFB0912
*     HASH$DA - TO DERIVE A HOME BLOCK NUMBER FROM THE                   AFB0912
*       PRIMARY KEY VALUE RETURNED BY GTNR$MP.                           AFB0912
*     SEBL$AA - TO FIND A BLOCK OF THE DA FILE, READING                  AFB0912
*       IT IN IF NECESSARY, BUT ONLY WITHOUT RECALL.                     AFB0912
*     UUCC$AA - TO EXTRACT, FROM ITS RECORD POINTER,                     AFB0912
*       THE ((UNUSED CHARACTER COUNT)) OF THE CURRENT                    AFB0912
*       RECORD. PROPERLY THIS IS BETWEEN 0 AND 9, AND                    AFB0912
*       DOESNT INTEREST US. BUT IF IT IS 15, IT IS NOT                   AFB0912
*       A COUNT BUT THE INDICATION THAT THE RECORD HAS BEEN              AFB0912
*       LOGICALLY DELETED.                                               AFB0912
*     BNCH$AA - TO SEARCH A BLOCK OF THE DATA FILE, IN WHICH             AFB0912
*       THE RECORDS ARE ORDERED BY KEY, FOR THE WANTED KEY.              AFB0912
*     SETR$AA - GIVEN A RECORD NUMBER WITHIN THE BLOCK, TO               AFB0912
*       FILL IT INTO THE PTREE WORD AND THEN LOCATE THAT                 AFB0912
*       RECORD, SETTING RECFWA, RECLWA, AND RECLNG.                      AFB0912
*     STEP$DA - TO MOVE FORWARD TO THE NEXT LIVE RECORD IN               AFB0912
*       THE CURRENT BLOCK OF A DA FILE. BUT IF WE ARE                    AFB0912
*       ALREADY AT THE LAST RECORD, TO READ IN THE NEXT                  AFB0912
*       BLOCK -- WITHOUT RECALL IN THIS CASE.                            AFB0912
*     FILP$AA -- TO SET THE FP FIELDS OF THE FIT AND FIAT.               AFB0912
*     RDRC$AA -- TO RETURN THE RECORD TO THE USER, IF WE                 AFB0912
*       GO TO COMPLETION, WITH A KEY VALUE AS 
*       AN OPTIONAL SUPPLEMENT.                                          AFB0912
*     MOVC$AA - TO RETURN THE PRIMARY KEY VALUE WHERE PKA 
*       POINTS, IF A GETNR BY ALTERNATE KEY HAS REACHED 
*       COMPLETION AND PKA IS NOT 0.
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     COND - THIS IS SET BY GTNR$MP JUST BEFORE EXITING, TO              AFB0912
*       SHOW HOW FAR ALONG IT HAS GOTTEN. THE SAME VALUE IS              AFB0912
*       ALSO STORED BY GTNR$MP IN FIELD MPSKSTG OF THE MPAT              AFB0912
*       SECTION OF THE FIAT, WHERE IT IS EXPECTED TO LIE                 AFB0912
*       UNDISTURBED UNTIL THE NEXT GTNR ON THIS FIT. THE                 AFB0912
*       VALUE IS PUT INTO COND AS WELL, JUST TO MAKE IT                  AFB0912
*       QUICKER TO TEST IN THE ROUTINES TO WHICH CONTROL                 AFB0912
*       RETURNS FROM GTNR$MP. THE POSSIBLE VALUES ARE --                 AFB0912
*       0, 1, OR 2 -- STILL WORKING IN THE MIP FILE.                     AFB0912
*       7 -- PRIMARY KEY VALUE HAS JUST BEEN FOUND BY GTNR$MP.           AFB0912
*       8 -- EOI FOUND BY GTNR$MP.                                       AFB0912
*       9 -- PRIMARY KEY NOW BEING WORKED ON HERE IN GTNR$DA.            AFB0912
*       100 -- GTNR$MP HAS FOUND THAT THE STEP FROM THE                  AFB0912
*         CURRENT POSITION TO THE NEXT INVOLVES A FIFO                   AFB0912
*         SUBFILE IN THE MIP FILE. WE DO NOT RECOMMEND                   AFB0912
*         FIFO AND EXPECT ITS USE IN THE REAL WORLD TO BE                AFB0912
*         RARE. SO RATHER THAN PUT IN EXTRA CODE TO ENABLE               AFB0912
*         THIS STEP TO BE TAKEN USING ONLY RECALLLESS I/O                AFB0912
*         WE JUST CALL GETN$DA TO DO THE JOB.                            AFB0912
*     WHEN GTNR$MP IS CALLED, THE VALUES THAT COULD ACTUALLY             AFB0912
*       BE IN MPSKSTG ARE 0, 1, 2 AND 9. ON SEEING 9,                    AFB0912
*       GTNR$MP JUST COPIES IT TO COND AND BOUNCES RIGHT BACK.           AFB0912
*     KEYFWA AND KEYOFF ARE THE FWA AND CHARACTER POSITION               AFB0912
*       OF THE PRIMARY KEY VALUE, REQUIRED BY BNCH$AA.                   AFB0912
*       MAJKEY IS THE KEY LENGTH, ALSO REQUIRED BY BNCH$AA.              AFB0912
*       QREL IS THE KIND OF RELATION (EQ, GE, GT -- HERE ALWAYS          AFB0912
*       EQ) TO BE SOUGHT BY BNCH$AA.                                     AFB0912
*     MATRESL IS A RESULT RETURNED BY BNCH$AA -- 0 IF THERE WAS          AFB0912
*       NO MATCHING RECORD IN THE BLOCK, OTHERWISE THE NUMBER            AFB0912
*       OF THE MATCHING RECORD.                                          AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC GTNR$DA ; BEGIN                                                DADDA
          IF FAFP[0] EQ EOI                                              DADDA
            THEN BEGIN                                                   DADDA
              FTFP[0] = EOI ;                                            DADDA
              MSGZ$AA ( EC100 ) ;                                        DADDA
              GOTO EXIT$AA ;                                             DADDA
            END                                                          DADDA
          IF RECCNT EQ 0                                                 RJC1026
            THEN BEGIN                                                   RJC1026
              GOTO DASEKND ;                                             RJC1026
            END                                                          RJC1026
          IF FAFP[0] EQ 63 AND FAPOSKEY1[0] NQ 0                         AFB0801
            THEN BEGIN                                                   DADDA
      DASEKNJ:                                                           DADDA
              FTCOP[0] = OP"GTN" ;                                       DADDA
              FTPOP[0] = OP"GTN" ;                                       DADDA
              GETN$DA ;                                                  DADDA
              RETURN ;                                                   DADDA
            END                                                          DADDA
      CONTROL IFEQ STATS,1 ;                                             DADDA
          FSGTNRCNT[0] = FSGTNRCNT[0] + 1 ;                              DADDA
      CONTROL ENDIF ;                                                    DADDA
          IF FAPOSKEY1[0] NQ 0                                           DADDA
            THEN BEGIN                                                   DADDA
              GTNR$MP ;                                                  DADDA
              IF COND EQ 100 THEN GOTO DASEKNJ ;                         DADDA
              IF COND LS 6 THEN GOTO DASEKNA ;                           DADDA
              IF COND EQ 8 THEN GOTO DASEKND ;                           DADDA
              IF COND EQ 7                                               DADDA
                THEN BEGIN                                               DADDA
                  MPSKSTG[0] = 9 ;                                       DADDA
                  PTCURBLK[1] = HASH$DA(FAPKY3ADR[0],0,FSKEYSIZE[0]) ;   DADDA
                  CURPTR = 1 ;                                           DADDA
                END                                                      DADDA
              KEYFWA = FAPKY3ADR[0] ;                                    DADDA
              KEYOFF = 0 ;                                               DADDA
              MAJKEY = KLENG ;                                           DADDA
              QREL = REL"EQ" ;                                           DADDA
     DASEKNC:                                                            DADDA
              SEBL$AA ( 1 , 0 ) ;                                        DADDA
              IF PTBLKIN[1] EQ 0 THEN GOTO DASEKNA ;                     DADDA
              BNCH$AA ;                                                  DADDA
              IF MATRESL NQ 0 AND UUCC$AA(MATRESL) NQ DEAD               DADDA
                THEN BEGIN                                               DADDA
                  SETR$AA ( MATRESL ) ;                                  DADDA
                  IF FTPKA[0] NQ 0
                    THEN BEGIN
                      MOVC$AA ( KEYFWA,0,FTPKA[0],0,FSKEYSIZE[0] ) ;
                    END 
                  GOTO DASEKNB ;                                         DADDA
                END                                                      DADDA
                ELSE BEGIN                                               DADDA
                  IF FWD EQ 0                                            DADDA
                    THEN BEGIN                                           DADDA
                      MSGF$AA ( EC546 ) ;                                DADDA
                      GOTO EXIT$AA ;                                     DADDA
                    END                                                  DADDA
                  PTCURBLK[1] = FWD ;                                    DADDA
                  GOTO DASEKNC ;                                         DADDA
                END                                                      DADDA
            END                                                          DADDA
            ELSE BEGIN                                                   DADDA
              STEP$DA ( 0 ) ;                                            DADDA
              IF PTBLKIN[1] EQ 0                                         DADDA
                THEN BEGIN                                               DADDA
                  QEI = 0 ;                                              DADDA
     DASEKNA:                                                            DADDA
                  FILP$AA ( FPNULL ) ;                                   AFB0801
                END                                                      DADDA
                ELSE BEGIN                                               DADDA
                  IF QEI NQ 0                                            DADDA
                    THEN BEGIN                                           DADDA
     DASEKND:                                                            DADDA
                      FILP$AA ( EOI ) ;                                  AFB0801
                      MSGZ$AA ( NOTE011 ) ;                              AFB0801
                    END                                                  DADDA
                    ELSE BEGIN                                           DADDA
     DASEKNB:                                                            DADDA
                      FTPOP[0] = OP"GTN" ;                               DADDA
                      FTCOP[0] = OP"GTN" ;                               DADDA
                      IF FAPOSKEY1[0] EQ 0 OR MPEOK[0] EQ 0              DADDA
                        THEN BEGIN                                       DADDA
                          FILP$AA ( EOR ) ;                              AFB0801
                        END                                              DADDA
                        ELSE BEGIN                                       DADDA
                          FILP$AA ( EOK ) ;                              AFB0801
                        END                                              DADDA
                      RDRC$AA ;                                          DADDA
                      FSGTNCNT[0] = FSGTNCNT[0] + 1;                     GAG1106
                    END                                                  DADDA
                END                                                      DADDA
            END                                                          DADDA
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   KPTR$DA - SET KEYFWA,KEYOFF,QREL, AND MAJKEY     PAGE 1            AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC KPTR$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO SET KEYOFF, KEYFWA, QREL, AND MAJKEY SO THAT BNCH$AA CAN        AFB0912
*     BE CALLED TO SEEK, IN ANY ONE BLOCK OF RECORDS ORDERED BY          AFB0912
*     KEY, THE RECORD CONTAINING THE GIVEN KEY.                          AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     KA IN THE FIT GIVES THE ADDRESS OF THE START OF THE KEY.           AFB0912
*     KP IN THE FIT GIVES ITS STARTING CHARACTER POSITION, I.E.          AFB0912
*       THE NUMBER OF CHARACTERS WHICH, IN THE WORD CONTAINING           AFB0912
*       THE FIRST CHARACTER OF THE KEY, PRECEDE THAT CHARACTER.          AFB0912
*     KLENG, WHICH IS ULTIMATELY A FIELD IN THE FSTT, GIVES THE          AFB0912
*       LENGTH OF A KEY IN CHARACTERS.                                   AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     KEYFWA = KA AND KEYOFF = KP.                                       AFB0912
*     QREL IS SET TO CALL FOR EQUALITY. BNCH$AA CAN HANDLE THREE         AFB0912
*       SORTS OF COMPARISON FOR INDEX-SEQUENTIAL FILES, BUT FOR          AFB0912
*       DA FILES ONLY EQUALITY IS EVER SOUGHT.                           AFB0912
*     MAJKEY = KLENG. BNCH$AA USES MAJKEY AS KEY LENGTH. IN              AFB0912
*       HANDLING INDEX-SEQUENTIAL FILES, THIS MIGHT BE LESS THAN         AFB0912
*       THE FULL LENGTH, BUT NOT IN DA FILES.                            AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     ONLY THOSE SET ACCORDING TO EXIT CONDITIONS.                       AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC KPTR$DA ; BEGIN                                                DADDA
          KEYFWA = FTKA[0] ;                                             DADDA
          KEYOFF = FTKP[0] ;                                             DADDA
          QREL = REL"EQ" ;                                               DADDA
          MAJKEY = KLENG ;                                               DADDA
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   POSTGMP - COMPLETE A GET-BY-ALTERNATE-KEY              PAGE 1      AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC POSTGMP                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     A GET OR GETNEXT BY ALTERNATE KEY EXTRACTS A PRIMARY KEY VALUE     AFB0912
*     FROM THE MIP FILE. THE WANTED RECORD MUST BE LOCATED IN THE DATA   AFB0912
*     FILE USING THIS KEY. FOR A DA FILE, POSTGMP DOES THIS JOB.         AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     P<PTRE$AA>, P<FSTT$AA>, P<FINF$AA> MUST BE SET FOR THE DATA FILE,  AFB0912
*       NOT THE MIP FILE (THIS WILL HAVE BEEN DONE BY GET$MP OR GETN$MP. AFB0912
*       HOWEVER, IF QEI = 1, FOR WHICH SEE BELOW, IT DOES NOT MATTER     AFB0912
*       WHICH FILE P<PTRE$AA> ETC. POINT TO BECAUSE WE ARE NOT GOING     AFB0912
*       ANY FURTHER ANYWAY, AND GET$MP OR GETN$MP WILL HAVE LEFT THEM    AFB0912
*       POINTING TO THE MIP FILE.)                                       AFB0912
*     QEI (A BIT IN THE CURRENT PTREE) = 1 IF WE CANNOT GET A RECORD     AFB0912
*       BECAUSE THE LIST OF ALTERNATE KEY VALUES IS POSITIONED AT EOI.   AFB0912
*     IF QEI = 0, KEYFWA POINTS TO THE WORD CONTAINING THE START         AFB0912
*       OF THE PRIMARY KEY VALUE, AND THE KEY IS KNOWN TO BEGIN ON       AFB0912
*       THE WORD BOUNDARY.                                               AFB0912
*     IF QEI = 0, KLENG IS A FIELD OF THE DATA FILE FSTT THAT GIVES      AFB0912
*       THE PRIMARY KEY LENGTH IN CHARACTERS.                            AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     THE SAME AS FOR FIND$DA, EXCEPT THAT QMF MUST BE 1.                AFB0912
*     IF QMF IS LEFT 0 BY FIND$DA, WE WILL NOT EXIT FROM POSTGMP         AFB0912
*       BUT SKIP TO EXIT$AA.                                             AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     EC546 -- THE PRIMARY KEY CANNOT BE FOUND IN THE DATA FILE.         AFB0912
*       THIS IS TREATED AS FATAL, BECAUSE THE MIP FILE AND THE           AFB0912
*       DATA FILE APPEAR TO BE OUT OF STEP.                              AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     FIND$DA - TO LOCATE A RECORD BY PRIMARY KEY IN A DA FILE.          AFB0912
*     MSGF$AA - TO ISSUE AN ERROR MESSAGE AND SET THE FATAL              AFB0912
*       ERROR FLAG IN THE FIT.                                           AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     KEYOFF - SET TO 0 (KEY BEGINS ON WORD BOUNDARY) AS INPUT           AFB0912
*       TO FIND$DA.                                                      AFB0912
*     MAJKEY - SET TO KLENG ( USE FULL LENGTH KEY ) AS INPUT             AFB0912
*       TO FIND$DA.                                                      AFB0912
*     QMF - SET BY FIND$DA TO 0 (NO MATCH) OR 1 (MATCH).                 AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
      PROC POSTGMP ;                                                     DADDA
          BEGIN                                                          DADDA
          IF QEI EQ 0                                                    DADDA
          THEN                                                           DADDA
              BEGIN                                                      DADDA
              KEYOFF = 0 ;                                               DADDA
              MAJKEY = KLENG ;                                           DADDA
              FIND$DA ;                                                  DADDA
              IF QMF EQ 0                                                DADDA
              THEN                                                       DADDA
                  BEGIN                                                  DADDA
                  MSGF$AA ( EC546 ) ; #PRIMARY KEY NOT FOUND#            DADDA
                  GOTO EXIT$AA ;                                         DADDA
                  END                                                    DADDA
              END                                                        DADDA
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   REW$DA - REWIND A DA FILE BY PRIMARY OR ALT KEY       PAGE 1       AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC REW$DA                                                             AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO REWIND THE CURRENT DA FILE, BY PRIMARY OR BY ALTERNATE          AFB0912
*     KEY, AND LEAVE THE FIAT AND PTREE INDICATING THE POSITION.         AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     P<FIT$AA> AND P<FIAT$AA> ARE SET TO THE CURRENT FIT AND ITS        AFB0912
*     FIAT. P<FSTT$AA> AND P<FINF$AA> ARE SET TO THE DATA FILE,          AFB0912
*     EVEN THOUGH THIS MAY BE A REWIND BY ALTERNATE KEY. P<PTRE$AA>      AFB0912
*     POINTS TO THE PTREE OF THE DATA FILE.                              AFB0912
*                                                                        AFB0912
*     IF THE KL, RKW, AND RKP FIELDS OF THE FIT CONTAIN THE LENGTH       AFB0912
*     AND POSITION OF THE PRIMARY KEY OF THE DATA FILE, THEN THE         AFB0912
*     REWIND IS TO BE BY PRIMARY KEY. OTHERWISE, IT IS TO BE BY          AFB0912
*     WHATEVER ALTERNATE KEY TYPE IS DEFINED BY THOSE THREE NUMBERS.     AFB0912
*     IF NO SUCH ALTERNATE KEY TYPE EXISTS, THERE WILL BE AN ERROR       AFB0912
*     EXIT FROM RWIN$MP.                                                 AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF THE REWIND WAS BY PRIMARY KEY, FAPOSKEY1[0] = 0, INDICATING     AFB0912
*     THAT GETNEXT POSITION IS BY PRIMARY KEY UNTIL FURTHER NOTICE,      AFB0912
*     AND THE SECOND WORD OF THE PTREE IS 0, INDICATING REWOUND          AFB0912
*     POSITION. NOTE THAT THIS IS THE ONLY WAY, FOR A DA FILE, IN        AFB0912
*     WHICH FAPOSKEY1[0] CAN BE SET TO 0 AFTER OPEN. IT IS 0 AT OPEN,    AFB0912
*     BUT THEREAFTER IT WILL BE SET NON-ZERO BY ANY GET OR START BY      AFB0912
*     ALTERNATE KEY, AS WELL AS BY A REWIND BY ALTERNATE KEY.            AFB0912
*     HOWEVER, A GET BY PRIMARY KEY WILL NOT CLEAR FAPOSKEY1[0] FOR      AFB0912
*     A DA FILE, AS IT WOULD DO FOR AN IS OR AK FILE.                    AFB0912
*                                                                        AFB0912
*     IF THE REWIND WAS BY ALTERNATE KEY, FAPOSKEY1[0] WILL NOT BE       AFB0912
*     0. THE EXIT CONDITIONS ARE FAIRLY NUMEROUS, AND CAN BE FOUND       AFB0912
*     AS THE EXIT CONDITIONS TO SUBROUTINE RWIN$MP.                      AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     QUMP$AA - TO DECIDE WHETHER BY PRIMARY OR BY ALTERNATE KEY.        AFB0912
*     RWIN$MP - TO DO ALL THE WORK, IF BY ALTERNATE KEY.                 AFB0912
*     FILP$AA - TO SET FP=EOR.
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC REW$DA ; BEGIN                                                 DADDA
          FAPOSKEY1[0] = 0 ;                                             DADDA
          IF QUMP$AA ( 0 ) NQ 0                                          AFB0801
            THEN RWIN$MP ;                                               DADDA
            ELSE BEGIN
              PTREEWRD[1] = 0 ; 
              FILP$AA ( EOR ) ; 
            END 
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   SEEK$DA - DO A SEEK ON A DA FILE                          PAGE 1   AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC SEEK$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO DO A SEEK OPERATION ON A DA FILE, WHETHER BY PRIMARY OR BY      AFB0912
*     ALTERNATE KEY. IT IS IMPORTANT TO NOTE THAT THE SEEK, IN EITHER    AFB0912
*     CASE, GOES UP TO BUT NOT BEYOND THE READING OF THE HOME BLOCK      AFB0912
*     WITHOUT RECALL. THUS, IN THE SIMPLE CASE OF A SEEK BY PRIMARY KEY, AFB0912
*     ONLY ONE SEEK CAN BE USEFUL (APART FROM POSSIBILITIES OF THRASHING AFB0912
*     THAT MIGHT REQUIRE RE-READING THE HOME BLOCK.) EVEN IF THE WANTED  AFB0912
*     RECORD IS IN AN OVERFLOW BLOCK, WHICH WE HOPE IS INFREQUENT, THE   AFB0912
*     WAY TO GET IT AFTER THE FIRST SEEK IS WITH A GET OPERATION.        AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     P<FIT$AA> AND P<FIAT$AA> POINT TO THE CURRENT FIT AND ITS FIAT.    AFB0912
*     P<FSTT$AA> AND P<FINF$AA> ARE SET FOR THE DATA FILE, WHETHER       AFB0912
*     OR NOT IT HAS A MIP PARTNER.                                       AFB0912
*                                                                        AFB0912
*     KL, RKP, AND RKW IN THE FIT DETERMINE WHETHER THE SEEK IS TO BE    AFB0912
*     BY PRIMARY OR BY ALTERNATE KEY, JUST AS IN REW$DA ABOVE. THIS      AFB0912
*     IS QUITE INDEPENDANT OF WHICH WAY THE FILE IS CURRENTLY            AFB0912
*     POSITIONED FROM A GETNEXT POINT OF VIEW.                           AFB0912
*                                                                        AFB0912
*     KA AND KP IN THE FIT POINT TO THE WORD AND CHARACTER POSITION AT   AFB0912
*     WHICH THE PROPOSED KEY BEGINS.                                     AFB0912
*                                                                        AFB0912
*     IF THE SEEK IS BY ALTERNATE KEY, FASEEKEY1[0] AND FAALTPOS[0]      AFB0912
*     AND PREVOP ARE USED BY SUBROUTINE SEEK$MP TO DECIDE WHETHER THIS   AFB0912
*     IS A CONTINUATION OF A PREVIOUS SEEK, OR WHETHER EVERYTHING HAS    AFB0912
*     TO START FROM THE BEGINNING. THE DETAILS OF THIS ARE GIVEN IN      AFB0912
*     THE COMMENTS TO SUBROUTINE SEEK$MP. AT ANY RATE, IF                AFB0912
*     FASEEKEY1[0] CONTAINS 0, THE PREVIOUS OPERATION WAS NOT A          AFB0912
*     SEEK BY ALTERNATE KEY. WHETHER OR NOT IT WAS A SEEK BY THE SAME    AFB0912
*     PRIMARY KEY DOES NOT MATTER, BECAUSE FOR DA FILES, A SEEK          AFB0912
*     BY PRIMARY KEY IS A ONE-SHOT ACTION ANYWAY.                        AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF THE FP FIELD OF THE FIT CONTAINS ((EOR)) (20B), THEN THE        AFB0912
*     HOME BLOCK OF THE DA FILE IS IN CORE, OR IS CURRENTLY BEING        AFB0912
*     READ IN. THE APPROPRIATE ACTION FOR THE CALLER IS TO WAIT          AFB0912
*     FOR COMPLETION OF THE CURRENT I/O ON THE DA FILE (BZF IN THE       AFB0912
*     FIT POINTS TO THE FET TO WATCH) AND THEN DO A GET OPERATION.       AFB0912
*     IF THE RECORD TURNS OUT TO BE IN AN OVERFLOW BLOCK, THIS MAY       AFB0912
*     INVOLVE ONE OR MORE READS WITH RECALL, BUT THERE IS NO WAY         AFB0912
*     AROUND IT AT PRESENT.                                              AFB0912
*                                                                        AFB0912
*     OTHERWISE, THE FP FIELD OF THE FIT WILL CONTAIN 0, INDICATING      AFB0912
*     THAT THE CALLER CAN USEFULLY GIVE ANOTHER SEEK, HAVING FIRST       AFB0912
*     WATCHED FOR COMPLETION THE FET TO WHICH BZF IN THE FIT POINTS.     AFB0912
*                                                                        AFB0912
*     IF THE SEEK IS BY ALTERNATE KEY, AND GETS TO THE POINT             AFB0912
*     OF LEARNING THAT THE GIVEN ALTERNATE KEY VALUE IS NOT IN FACT      AFB0912
*     MATCHED IN THE MIP FILE, SUBROUTINE GET$MP SETS FP TO EOR, TO      AFB0912
*     ENCOURAGE THE USER TO TRY A GET RIGHT AWAY, SO THAT THE BAD        AFB0912
*     NEWS CAN BE GIVEN TO HIM. ON THE OTHER HAND, GET$MP SETS           AFB0912
*     THE COP FIELD OF THE FIT, IN THIS CASE, TO INDICATE THAT THE       AFB0912
*     PRESENT OPERATION IS A GET RATHER THAN A SEEK. THIS IS SO THAT     AFB0912
*     IF THE CALLER STUBBORNLY GIVES ANOTHER SEEK, INSTEAD OF ANOTHER    AFB0912
*     GET, IT WILL LOOK TO CRM AS IF THIS IS A NEW SEEK, RATHER THAN A   AFB0912
*     CONTINUATION SEEK, AND THE WASTE MOTION WILL BEGIN AGAIN FROM THE  AFB0912
*     TOP. ALL OF THIS IS BECAUSE THERE IS NO NEAT WAY TO SIGNAL THE     AFB0912
*     CALLER THAT HIS SEEK IS USING A BAD KEY AND SHOULD BE DISCONTINUED AFB0912
*                                                                        AFB0912
*     FASEEKEY1[0] IS SET 0 IF THE SEEK IS BY PRIMARY KEY. IF BY         AFB0912
*     ALTERNATE KEY, SEEK$MP LEAVES IT SET TO A NON-ZERO VALUE INCLUDING AFB0912
*     A DEFINITION OF THE ALTERNATE KEY AND AN INDICATION OF HOW FAR     AFB0912
*     ALONG THE SEEK PROCESS HAS COME.                                   AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     NONE. A SEEK BY FALSE PRIMARY KEY IS DISCOVERED WHEN THE SERIES    AFB0912
*     OF SEEKS IS WOUND UP BY A GET. A SEEK BY FALSE ALTERNATE KEY       AFB0912
*     IS DISCOVERED THE SAME WAY, BUT FP IS SET TO EOR PREMATURELY.      AFB0912
*     IN AN APPLICATION WITH A LOT OF SEEKS BY ALTERNATE KEY, OF WHICH A AFB0912
*     HIGH PERCENTAGE WERE FALSE, THIS WOULD REPRESENT A LOT OF WASTED   AFB0912
*     TIME.                                                              AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     QUMP$AA - TO DECIDE WHETHER THE SEEK IS BY PRIMARY OR ALTERNATE    AFB0912
*       KEY.                                                             AFB0912
*     KPTR$DA - IF BY PRIMARY KEY, TO SET THE KEY POINTERS FOR THE       AFB0912
*       HASHING ROUTINE TO WORK ON.                                      AFB0912
*     SEEK$MP - IF BY ALTERNATE KEY, TO DO ALL THE WORK DOWN TO THE      AFB0912
*       POINT WHERE THE PRIMARY KEY VALUE IS FOUND, AND STMD$AA(0)       AFB0912
*       HAS BEEN CALLED TO SWITCH US BACK TO THE DATA FILE. OR AT        AFB0912
*       LEAST TO DO AS MUCH OF THAT WORK AS WE CAN DO WITHOUT USING      AFB0912
*       I/O WITH RECALL.                                                 AFB0912
*     HASH$DA - TO CONVERT THE PRIMARY KEY VALUE TO A HOME BLOCK         AFB0912
*       PRU NUMBER.                                                      AFB0912
*     LOCB$AA - TO FIND THAT BLOCK, READING IT IF NECESSARY, BUT         AFB0912
*       WITHOUT RECALL.                                                  AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     MIPMODE IS 0 ON ENTRY, INDICATING DATA FILE RATHER THAN            AFB0912
*       MIP FILE. IT REMAINS 0 IF THE SEEK IS BY PRIMARY KEY.            AFB0912
*       IF THE SEEK IS BY ALTERNATE KEY, SEEK$MP CALLS STMD$AA(16)       AFB0912
*       TO TURN TO THE MIP FILE, AND THIS SETS MIPMODE NONZERO.          AFB0912
*       THE EXIT FROM SEEK$MP IS WITH MIPMODE STILL NONZERO IF           AFB0912
*       THE PRIMARY KEY VALUE HAS NOT YET BEEN ASCERTAINED, OR           AFB0912
*       0 IF IT HAS.                                                     AFB0912
*                                                                        AFB0912
*     IF MIPMODE IS 0 ON EXIT FROM SEEK$MP, SEEK$MP HAS SET              AFB0912
*       KEYFWA AND KEYOFF TO POINT TO THE PRIMARY KEY VALUE, AND         AFB0912
*       MAJKEY TO ITS LENGTH IN CHARACTERS. THOSE THREE VARIABLES        AFB0912
*       ARE SET BY KPTR$DA IF THE WHOLE SEEK IS BY PRIMARY KEY.          AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC SEEK$DA ; BEGIN                                                DADDA
          IF MXPR$AA LQ PRU3                                             RJC1026
            THEN BEGIN                                                   RJC1026
              GOTO SKEOR ;                                               RJC1026
            END                                                          RJC1026
          IF QUMP$AA ( 0 ) EQ 0                                          DADDA
            THEN BEGIN                                                   DADDA
              KPTR$DA ;                                                  DADDA
              FASEEKEY1[0] = 0 ;                                         DADDA
            END                                                          DADDA
            ELSE BEGIN                                                   DADDA
              SEEK$MP ;                                                  DADDA
            END                                                          DADDA
          IF MIPMODE EQ 0                                                DADDA
            THEN LOCB$AA ( HASH$DA(KEYFWA,KEYOFF,MAJKEY) , 0 ) ;         DADDA
          IF MIPMODE EQ 0 AND P<BLOK$AA> GR 0                            DADDA
            THEN BEGIN                                                   RJC1026
 SKEOR:                                                                  RJC1026
              FTFP[0] = EOR ;                                            RJC1026
            END                                                          RJC1026
            ELSE FTFP[0] = 0 ;                                           DADDA
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   SKIP$DA - DO A SKIP ON A DA FILE                  PAGE 1           AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC SKIP$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO EXECUTE A SKIP OPERATION ON A DA FILE. HOWEVER, THIS IS         AFB0912
*     LEGAL ONLY IF BY ALTERNATE KEY. (EVEN BY ALTERNATE KEY,            AFB0912
*     BACKWARD SKIPPING IS IMPOSSIBLE ANYWAY.)                           AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     P<FIT$AA> AND P<FIAT$AA> POINT TO THE CURRENT FIT AND              AFB0912
*     ITS FIAT. P<FSTT$AA> AND P<FINF$AA> ARE SET FOR THE DATA FILE,     AFB0912
*     WHETHER OR NOT IT HAS A MIP PARTNER.                               AFB0912
*                                                                        AFB0912
*     FAPOSKEY1[0] IS 0 IF WE ARE CURRENTLY POSITIONED BY PRIMARY        AFB0912
*     KEY (IN WHICH CASE A SKIP IS ILLEGAL). OTHERWISE WE ARE            AFB0912
*     CURRENTLY POSITIONED BY ALTERNATE KEY, AND THE DETAILS SHOULD      AFB0912
*     BE LOOKED FOR IN THE COMMENTS TO SUBROUTINE SKIP$MP.               AFB0912
*                                                                        AFB0912
*     THE SKP FIELD OF THE FIT CONTAINS THE SKIP COUNT.                  AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF CURRENT POSITION WAS BY PRIMARY KEY, WE DO NOT EXIT             AFB0912
*     NORMALLY BUT SKIP TO MS245 FOR A NON-FATAL ERROR.                  AFB0912
*                                                                        AFB0912
*     IF NORMAL EXIT, THEN THE SKP FIELD OF THE FIT IS 0 IF THE          AFB0912
*     SKIP WAS COMPLETE. IF SKP IS NOT 0, WE ARE NOW AT EOI, AND         AFB0912
*     IF THE FILE HAD HAD EXACTLY SKP MORE RECORDS AFTER THE LAST        AFB0912
*     ONE WE WOULD HAVE ARRIVED AT EOI WITH SKP=0.                       AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     EC245 - A SKIP BY PRIMARY KEY WAS ATTEMPTED.                       AFB0912
*     NOTE012 - THE SKIP WAS NOT COMPLETED, BECAUSE WE REACHED           AFB0912
*       EOI FIRST.                                                       AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     SKIP$MP - TO DO ALL THE WORK.                                      AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     NONE                                                               AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC SKIP$DA ; BEGIN                                                DADDA
          IF FAPOSKEY1[0] EQ 0                                           DADDA
            THEN BEGIN                                                   DADDA
              GOTO MS245 ; #CANT SKIP ON DA PROPER#                      DADDA
            END                                                          DADDA
          SKIP$MP ;                                                      DADDA
          IF FTSKP[0] NQ 0 THEN MSGZ$AA ( NOTE012 ) ;                    DADDA
          END                                                            DADDA
CONTROL EJECT ;                                                          AFB0912
 #                                                                       AFB0912
* *   STEP$DA - MOVE FORWARD ONE RECORD BY PRIMARY KEY      PAGE 1       AFB0912
* *   A.F.R.BROWN                                                        AFB0912
* 1DC STEP$DA                                                            AFB0912
*                                                                        AFB0912
* DC  FUNCTION                                                           AFB0912
*                                                                        AFB0912
*     TO MOVE FORWARD TO THE NEXT RECORD OF THE CURRENT BLOCK, OR        AFB0912
*     THE FIRST OF THE NEXT BLOCK ACCORDING TO PRU NUMBER, KEEPING       AFB0912
*     POSITION RECORDED IN THE SECOND WORD OF THE PTREE.                 AFB0912
*                                                                        AFB0912
* DC  ENTRY CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     THERE IS ONE PARAMETER, PASSED IN THE USUAL SYMPL WAY.             AFB0912
*     IF A BLOCK HAS TO BE READ, THIS WILL BE DONE WITHOUT RECALL        AFB0912
*     IF THE PARAMETER IS 0, AND WITH RECALL IF NOT.                     AFB0912
*                                                                        AFB0912
*     THE SECOND WORD OF THE PTREE IS 0 IF THE FILE IS LOGICALLY         AFB0912
*     REWOUND, SO THAT WE WANT TO GET TO THE FIRST LIVE RECORD           AFB0912
*     IN THE FIRST BLOCK. (OF COURSE THAT BLOCK MAY BE EMPTY, AND        AFB0912
*     WE SHALL HAVE TO GO TO THE NEXT BLOCK, AND SO ON.) THIS WILL       AFB0912
*     BE DONE WITH RECALL, REGARDLESS OF THE PARAMETER. THERE IS NO      AFB0912
*     COMPELLING REASON FOR THIS, BUT IT MEANS THAT THE FIRST            AFB0912
*     GET-NEXT-WITHOUT-RECALL AFTER REWINDING A DA FILE BY PRIMARY       AFB0912
*     KEY WILL GET A RECORD FOR SURE, HOWEVER INFINITE THE DELAYS        AFB0912
*     MAY BE THEREAFTER.                                                 AFB0912
*                                                                        AFB0912
*     IF THE SECOND WORD OF THE PTREE = 1, IT MEANS THAT A RECORD HAS    AFB0912
*     BEEN ADDED TO THE FILE, OR A RECORD HAS BEEN REPLACED BY A LARGER  AFB0912
*     RECORD (LARGER AFTER COMPRESSION, IF THIS IS BEING USED), SO THAT  AFB0912
*     POSITION BY PRIMARY KEY HAS BEEN LOST, AND THE CURRENT GETN OR     AFB0912
*     GETNR MUST BE COUNTED A NON-FATAL ERROR. THIS POSITION-DESTROYING  AFB0912
*     OPERATION MUST HAVE HAPPENED SINCE THE MOST RECENT SUCCESSFUL      AFB0912
*     GETN OR GETNR BY PRIMARY KEY.                                      AFB0912
*                                                                        AFB0912
*     IF THE SECOND WORD OF THE PTREE IS NOT 0 OR 1, IT CONTAINS A       AFB0912
*     BLOCK NUMBER OR BLOCK ADDRESS, AND A RECORD NUMBER. IT IS          AFB0912
*     THE NEXT LIVE RECORD AFTER THE ONE SO INDICATED, THAT WE           AFB0912
*     ARE TRYING TO REACH. THE GIVEN RECORD NUMBER MAY ACTUALLY          AFB0912
*     BE GREATER THAN THE NUMBER OF RECORDS IN THE BLOCK. THIS           AFB0912
*     COULD HAPPEN IF ONE OR MORE DELETIONS HAD TAKEN PLACE              AFB0912
*     SINCE THE LAST GETNEXT -- DELETIONS DO NOT DESTROY POSITION.       AFB0912
*     THE GIVEN RECORD NUMBER MAY ALSO BE 0. THIS MEANS WE WANT          AFB0912
*     THE FIRST LIVE RECORD OF THE INDICATED BLOCK. THIS NOTATION        AFB0912
*     IS USEFUL WHEN WE WANT TO MOVE FROM THE LAST RECORD OF             AFB0912
*     ONE BLOCK TO THE FIRST OF THE NEXT, AND WE HAVE TO READ            AFB0912
*     THE NEXT ONE WITHOUT RECALL, AND LEAVE THE STEP FORWARD            AFB0912
*     UNCOMPLETED. IF WE LEFT THE PTREE STILL POINTING TO THE            AFB0912
*     LAST RECORD OF THE FORMER BLOCK, A FUTURE GETNEXT WOULD            AFB0912
*     HAVE TO SEE THAT BLOCK TO FIND OUT IT WAS THE LAST                 AFB0912
*     RECORD, AND THAT COULD MEAN A USELESS READ OR EVEN                 AFB0912
*     THRASHING. SETTING THE PTREE WORD TO RECORD 0 OF THE               AFB0912
*     NEXT BLOCK FREES US FROM THE NEED TO SEE ANY BLOCK BUT             AFB0912
*     THE NEXT ONE.                                                      AFB0912
*                                                                        AFB0912
* DC  EXIT CONDITIONS                                                    AFB0912
*                                                                        AFB0912
*     IF THE SECOND WORD OF THE PTREE WAS 0 ON ENTRY, IT NOW POINTS      AFB0912
*     TO THE FIRST LIVE RECORD OF THE FILE, IF ANY, REGARDLESS OF        AFB0912
*     THE RECALL PARAMETER, AND QEI = 0. OR IF NO LIVE RECORD IN         AFB0912
*     THE FILE, QEI IS 1.                                                AFB0912
*                                                                        AFB0912
*     IF THE SECOND WORD OF THE PTREE WAS 1 ON ENTRY, WE HAVE TAKEN      AFB0912
*     AN ERROR EXIT.                                                     AFB0912
*                                                                        AFB0912
*     OTHERWISE, QEI (A FLAG IN THE PTREE) IS 1 IF WE WERE ALREADY       AFB0912
*     ON THE LAST RECORD OF THE FILE, SO THAT WE MUST NOW BE AT EOI,     AFB0912
*     AND IF THIS COULD BE CONFIRMED BY ACTUALLY LOOKING AT THE          AFB0912
*     BLOCK. QEI = 0 IF WE WERE NOT ALREADY ON THE LAST RECORD, OR       AFB0912
*     IF WE HAVE HAD TO READ WITHOUT RECALL TO SEE THE RECORD WHERE      AFB0912
*     WE WERE, AND THE BLOCK IS NOT YET IN CORE, SO THAT THE QUESTION    AFB0912
*     IS UNCERTAIN.                                                      AFB0912
*                                                                        AFB0912
*     IF QEI = 0, THEN PTBLKIN[1], A FLAG IN THE SECOND WORD OF          AFB0912
*     THE PTREE, TELLS WHETHER WE HAVE REACHED OUR DESTINATION.          AFB0912
*     IF PTBLKIN[1] IS 1, THE PTREE WORD POINTS TO THE NEXT LIVE         AFB0912
*     RECORD IN THE FILE, WHICH IS IN CORE. IF PTBLKIN[1] IS 0,          AFB0912
*     EITHER THE WORD POINTS TO THE RECORD FROM WHICH WE WANT TO         AFB0912
*     GO FORWARD, BUT THE BLOCK CONTAINING THIS RECORD IS NOW            AFB0912
*     A-READING, OR ELSE WE HAVE ALREADY ASCERTAINED THAT THE PREVIOUS   AFB0912
*     RECORD WAS THE LAST OF ITS BLOCK, AND THE WORD POINTS TO RECORD    AFB0912
*     0 OF THE NEXT BLOCK, FROM WHICH FICTIVE POSITION WE CAN STEP       AFB0912
*     FORWARD AS SOON AS STEP$DA HAS BEEN CALLED AGAIN WITH THAT         AFB0912
*     BLOCK IN CORE.                                                     AFB0912
*                                                                        AFB0912
*     IF PTBLKIN[1] IS 1, THEN P<BLOK$AA> POINTS TO THE WANTED BLOCK.    AFB0912
*                                                                        AFB0912
* DC  ERROR CONDITIONS                                                   AFB0912
*                                                                        AFB0912
*     EC117 - THE SECOND WORD OF THE PTREE WAS 1 ON ENTRY, SHOWING       AFB0912
*     THAT POSITION HAD BEEN DESTROYED AND NO FURTHER GETN OR GETNR      AFB0912
*     COULD BE DONE.                                                     AFB0912
*                                                                        AFB0912
* DC  CALLED ROUTINES                                                    AFB0912
*                                                                        AFB0912
*     SEBL$AA - TO LOCATE THE BLOCK OF CURRENT POSITION, READING         AFB0912
*       IT IF NECESSARY, WITH OR WITHOUT RECALL.                         AFB0912
*     STPF$AA - TO MOVE AHEAD TO THE NEXT LIVE RECORD IN THE             AFB0912
*       CURRENT BLOCK, IF POSSIBLE.                                      AFB0912
*     MSGZ$AA - TO ISSUE A NON-FATAL ERROR.                              AFB0912
*                                                                        AFB0912
* DC  NON-LOCAL VARIABLES                                                AFB0912
*                                                                        AFB0912
*     FAIL IS SET TO 0 OR 1 BY STPF$AA. 0 MEANS THE NEXT LIVE RECORD     AFB0912
*       IN THE SAME BLOCK IS NOW CURRENT ACCORDING TO THE PTREE WORD.    AFB0912
*       1 MEANS NO, WE WERE ALREADY AT THE LAST RECORD IN THE BLOCK.     AFB0912
*                                                                        AFB0912
 #                                                                       AFB0912
                                                                         DADDA
     PROC STEP$DA ( ( N ) ) ; BEGIN ITEM N ;                             DADDA
          CURPTR = 1 ;                                                   DADDA
          IF PTREEWRD[1] EQ 0                                            DADDA
            THEN BEGIN  #REWOUND#                                        DADDA
              PTCURBLK[1] = PRU3 ;                                       DADDA
              FAALTPOS[0] = 0 ;                                          DADDA
              QEI = 0 ; 
              N = 1 ;                                                    DADDA
            END                                                          DADDA
            ELSE BEGIN                                                   AFB0801
              IF PTREEWRD[1] EQ 1                                        AFB0801
                THEN BEGIN                                               AFB0801
                  MSGZ$AA ( EC117 ) ;                                    AFB0801
                  GOTO EXIT$AA ;                                         AFB0801
                END                                                      AFB0801
            END                                                          DADDA
          SEBL$AA ( 1 , N ) ;                                            DADDA
          IF PTBLKIN[1] EQ 0 THEN RETURN ;                               DADDA
                                                                         DADDA
     DAGNA:                                                              DADDA
          STPF$AA ;                                                      DADDA
          IF FAIL NQ 0                                                   DADDA
            THEN BEGIN                                                   DADDA
              IF BLOCKID[0] GQ FSLSTPRU[0]-FSBLKSIZ[0]                   DADDA
                THEN QEI = 1 ;                                           DADDA
                ELSE BEGIN                                               DADDA
                  PTCURBLK[1] = BLOCKID[0] + FSBLKSIZ[0] ;               DADDA
                  PTCUREC[1] = 0 ;                                       DADDA
                  SEBL$AA ( 1 , N ) ;                                    DADDA
                  IF PTBLKIN[1] EQ 0 THEN RETURN ;                       DADDA
                  GOTO DAGNA ;                                           DADDA
                END                                                      DADDA
            END                                                          DADDA
          END                                                            DADDA
                                                                         DADDA
          END TERM                                                       DADDA
