ASMB,R,L,C
*     NAME:   QUERY 
*     SOURCE: 92070-18315 
*     RELOC:  92070-1X315 
*     PGMR:   B.W.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
      NAM QUERY,7  92070-1X315  REV.1941  800317
**********************************************************************
*     1) 3/17/80 FIXED OLDSN CALL TO PRCSS TO JMP PRCSS+1 
* 
* 
*  4.2   Query
* 
*  4.2.1   Purpose
* 
*       This is  a three  routine package to  use the  indexed libraries. 
*  These routines return to allow the  loader to use nonindexed libraries 
*  if they are not indexed. 
* 
*  4.2.2   Function 
* 
*  The QUERY  routine is called  by SE.MS instead  of PRCSS to  allow the 
*  searching  of  indexed  libraries.   In the  event  that  the  library 
*  currently open is not indexed then the  file state is returned to that 
*  before the call and PRCSS is called as is now done.  If the library is 
*  indexed then PRCSS is instructed to only load 1 module and the library 
*  is positioned to the module to load before calling PRCSS.
* 
*  4.2.3   Calling sequence 
* 
*  JSB QUERY
*  RETURNS       P+1    ERROR A REG CONTAINS ERROR CODE 
*                P+2    NORMAL A REG CONTAINS PRCSS CODE RETURN 
* 
*  The following globals are referenced by QUERY. 
*  Note other globals are required by PRCSS.
*  &MODE   0/1, YES/NO   MODULE SPECIFIED IN COMMAND? 
*  &MNAM                 MODULE NAME
*  &MLEN                 MODULE NAME LENGTH IN WORDS
*  &NMOD   0/1, N MODULES/ 1 MODULE TO PROCESS
*  ID.CB                 LIBRARY DCB
* 
*  EXTERNAL ROUTINES. 
*  L.ADD                 LOADER LIB SYMBOL SEARCH 
*  SER                   SEARCH INDEXED LIB 
*  PRCSS                 PROCESS LIBRARY MODULE 
*  FMPER                 PROCESS FMP ERROR
*  LDRER                 PROCESS LOADR ERROR
* 
*  4.2.4   Operation
* 
*  Query
*  1) MODULE OR SYMBOL MODE?
*  2) MODULE
*  3) REQUEST MODULE FROM LIBRARY (CALL SER)
*  4) CALL PSP (POST SEARCH PROCESS)
*  5) CALL P&P (POSITION LIB AND PROCESS) 
*  6) RETURN
* 
*  7) SYMBOL
*  8) REQUEST SYMBOL INDEX ENTRY (CALL SER) 
*  9) CALL PSP
*  10) SEE IF ANY SYMBOLS FIX UNDEFS? (L.ADD CALL)
*      A) YES CALL P&P
*  11) GOTO 8 
* 
*PSP    (TEST SER RETURN) 
*1) EOF OR NOT FOUND RETURN FROM QUERY
*2) ANY SER ERROR RETURN APP. ERROR MSG.
*3) IF NOT INDEXED
*      A) POSITION FILE TO START
*      B) SET SCAN N MODULES
*        C) PROCESS LIBRARY ALL MODULES 
*        D) RETURN FROM QUERY 
*  4) RETURN FROM PSP 
* 
*  P&P   (POSITION AND PROCESS LIBRARY MODULE)
*  1) POSITION FILE TO CURRENT NAM
*  2) SET SCAN 1 MODULE 
*  3) PROCESS 1 MODULE OF LIBRARY 
*  4) RETURN FROM P&P 
* 
******************************************************************* 
* 
      SUP PRESS EXTRANOIUS LISTING
      ENT QUERY 
* 
      EXT APOSN       FMP ROUTINE TO POSITION FILES 
      EXT PRCSS       LOADER PROCESS RELOATABLE MODULE
      EXT FMPER       LOADER FMP ERROR ROUTINE
      EXT LDRER       LOADER ERROR ROUTINE
      EXT RWNDF       FMP REWIND ROUTINE
      EXT $FNAM       SET COMPARE FOR MODULE NAME 
      EXT ID.CB       DCB OF LIBRARY FILE 
      EXT SER         INDEXED FILE SEARCH ROUTINE 
      EXT L.ADD       LOADER LIB ROUTINE TO SEARCH SYM TAB
      EXT &MNAM       MODULE NAME (IN PRCSS)
      EXT &MLEN       MODULE NAME LENGTH IN WORDS 
      EXT &MODE       0/1 MODULE/SYMBOL SEARCH
      EXT &NMOD       0/1 N/1 MODULES TO RELOCATE (PRCSS) 
      EXT FDONE       FLAG PRCSS ON READ FIRST REC
      EXT NOR.L       NUMBER TO FLAG ANYTHING LOADED
      EXT NM1.L       FLAG USED BY PRCSS
      EXT SCSEG       FLAG USED BY PRCSS
      EXT POST        FMP POST FILE 
      EXT .MVW        MOVE WORDS
A     EQU 0 
B     EQU 1 
* 
QUERY NOP 
      JSB RWNDF       TEST LIBRARY TO SEE IF REWINDABLE 
      DEF *+3 
      DEF ID.CB       LIBRARY DCB TO TEST REWIND
      DEF ERROR 
* 
      CPA N3          IF ERROR IS -3 (NOT REWINDABLE) THEN
      JMP OLDSN       FILE INDEX NOT USABLE PROCESS IN OLD WAY
* 
      CLA 
      STA IREC        CLEAR CURRENT POSITION TO START SCAN
* 
* MAKE COPY OF DCB TO USE SEPARATE DCB FOR INDEX AND RELOCATION 
* BECAUSE THE NAMR IS NOT AVAILABLE JUST COPY DCB HEADER
* AND REINITIALIZE THE ABSOLUTE POINTERS IN DCB HEADER TO DATA
* WITH EITHER A RWNDF CALL OR APOSN CALL
* THIS CODE IS WORTH ABOUT 10% OF LOADER TIME.
* IF IT IS REMOVED SER WILL HAVE TO BE MODIFIED TO REMEMBER ITS 
* LAST LOCATION AND USE APOSN TO POSITION TO THE CURRENT POSITION 
* IN THE INDEX BEING LOOKED AT. 
* 
      LDA @D.CB 
      LDB @D.DX 
      JSB .MVW      MOVE IDCB HEADER INTO NEW DATA BLOCK
      DEF P16       TO FORM LOCAL INDEX DCB 
      DEF 0 
* 
      JSB RWNDF 
      DEF *+3       PRAY FOR THIS!
      DEF ID.DX     TO RESET ABSOLUTE POINTERS TO DATA BUFFER 
      DEF ERROR     CURRENTLY DOES ON L AND RTE-IVB. 2/28/80
      SZA 
      JMP QUERY,I 
* 
      CCB             INIT FLAGS USED BY PRCSS TO 
      STB NOR.L       SIGNAL RESULTS OF PROCESS RUN 
      STB NM1.L 
* 
      LDA &MODE       SEE IF MODULE MODE. 
      SZA             0- MODULE 1- SYMBOL 
      JMP SYM 
* 
      STA $FNAM       CLEAR NEXT NAM WANT SPECIFIC NAM
      STA ERROR       SET MODE FOR REQUEST MODULE 
      JSB SER 
      DEF *+8 
      DEF ID.DX       LIBRARY DCB 
      DEF ERROR       ERROR RETURN
      DEF &MNAM       MODULE NAME 
      DEF &MLEN       MODULE NAME LENGTH WRDS 
      DEF IREC        RECORD # POSITION OF MODULE IN LIB
      DEF IBLK        BLOCK # 
      DEF IWRD        WORD #
* 
      JSB PSP         CHECK FOR ERROR RETURN
      JSB P&P         POSITION FILE AND PROCESS 
* 
      ISZ QUERY       MAKE GOOD RETURN
      JMP QUERY,I     SAVING RETURNED A REG FROM PRCSS
* 
SYM   CLA,INA         SET REQUEST FOR NEXT NAM
      STA $FNAM       SO THAT ENT RECORD IS FOR 
      CLA             MODULE THAT HASN'T BEEN LOOKED
      STA ERROR       AT YET! 
      JSB SER 
      DEF *+8 
      DEF ID.DX       LIB DCB 
      DEF ERROR 
      DEF &MNAM       MODULE NAME 
      DEF &MLEN       MODULE NAME LENGTH
      DEF IREC        NAM RECORD #
      DEF IBLK            BLK # 
      DEF IWRD            WRD # 
      JSB PSP         CHECK FOR ERROR RETURN
* 
* SEARCH ENT SYMBOLS IN THIS AND SUCCESSIVE NAM MODULES 
* 
RQLP  CLA,INA 
      STA ERROR       SET MODE FOR ENT INDEX RECORD 
      JSB SER 
      DEF *+8 
      DEF ID.DX       LIBRARY DCB 
      DEF ERROR 
      DEF ADENT       ADDRESS OF ENT INDEX REC
      DEF LNENT       LENGTH OF ENT INDEX REC 
      DEF IREC        LAST VALID NAM RECORD # 
      DEF IBLK         BLK #
      DEF IWRD         WRD #
* 
      JSB PSP         CHECK FOR ERROR RETURN
* 
* SEE IF ANY SYMBOLS FIX UNDEFS?
* 
      LDA ADENT       LOAD ADDRESS OF INDEX REC 
      ADA LNENT       CALC ADDRESS OF WORD BEYOND REC 
      STA CNTR        SAVE IN END COUNT 
      LDA ADENT 
      ADA P3          STEP TO LENGTH OF FIRST SYMBOL
      STA NXSYM       SAVE ADDRESS OF LEN OF CURRENT SYM
* 
TSTLP LDA NXSYM       GET ADDRESS OF SYM LEN
      LDB A,I 
      CPB P3          IF SYM LEN <> 3 THEN NO MATCH 
      RSS             THIS RELEASE
      JMP NXT?
      INA             STEP TO SYMBOL
      STA ADSYM 
* 
      JSB L.ADD       SEE IF SYMBOL UNDEFINED 
      DEF *+5 
      DEF ADSYM,I 
      DEF VALSM       RETURNED SYMBOL VALUE 
      DEF SADDR       RETURNED SYMBOL TABLE ADDRESS 
      DEF RESLT       0 FND, 1 NOT FND, 2 UNDEF 
* 
      LDA RESLT 
      CPA P2
      JMP FND         RESOLVES UNDEF SO RELOCATE! 
* 
NXT?  LDA NXSYM       SEE IF MORE SYMBOLS IN REC
      ADA A,I         ADDRESS OF LENGTH OF NEXT SYM 
      INA             STEP TO ADDRESS OF LEN NEXT SYM 
      STA NXSYM 
      CMA,INA 
      ADA CNTR        END OF RECORD YET?
      CMA,INA 
      SSA 
      JMP TSTLP       MORE SYMBOLS
      JMP RQLP        GET NEXT ENT ENTRY
* 
FND   JSB P&P         PROCESS THIS MODULE 
      JMP SYM         SKIP TO NEXT NAM MODULE AND CONT SEARCH 
* 
      SKP 
* 
*P&P  POSITION AND PROCESS THE FILE TO DO 1 MODULE
* 
P&P   NOP 
      JSB APOSN       POSITION LIB FILE TO LAST 
      DEF *+6         VALID NAM RECORD
      DEF ID.CB+0     LIB DCB 
      DEF ERROR+0 
      DEF IREC        RECORD FOR CURRENT NAM MODULE 
      DEF IBLK
      DEF IWRD
* 
      CLA,INA 
      STA &NMOD       SET FOR REL ONLY 1 MODULE 
      STA FDONE       FORCE READ OF NAM RECORD BY PRCSS 
      CLE             FLAG NEW LOAD 
      JSB PRCSS       REL CURRENT MODULE
      JMP QUERY,I     ERROR RETURN FROM PRCSS 
      JMP P&P,I       NORMAL RETURN 
* 
      SKP 
* 
* PSP POST SEARCH PROCESSING FOR ERROR RETURNS
* 
PSP   NOP 
      LDA ERROR       IF NO ERROR AT ALL RETURN 
      SZA,RSS 
      JMP PSP,I 
      CPA =B100003    EOF OR NOT FOUND IN INDEX 
      RSS 
      JMP M.ERS 
* 
      ISZ QUERY       DO ERROR FREE RETURN FROM QUERY 
      CLA 
      STA SCSEG       CLEAR RETURNING FROM SEG NAM FLAG!
      CCA             SET A EOF RETURN LIKE PRCSS 
      JMP QUERY,I 
* 
M.ERS CPA =B100002    IF NO DIRECTORY FAKE CALL TO PRCSS
      JMP OLDSN       IN OLD NON INDEXED METHOD 
* 
*PROCESS LOADER ERRORS HERE IF FMP ERROR THEN RETURN AND LET
*CALLER PROCESS FMP ERROR FMP ERROR CODE RETURNED IN A REG
* 
M.ER2 CPA =B100000    BAD INDEX RECORD
      RSS 
      JMP M.ER3 
      LDA P11         IL INDEX
      JMP PRTER       POST ERROR
M.ER3 CPA =B100001    BAD CHECKSUM
      RSS 
      JMP QUERY,I     TAKE FMP ERROR RETURN 
* 
      LDA N1          CK SUM
PRTER JSB LDRER       PRINT LOADR ERROR MESSAGE 
      CLA             TAKE ERROR EXIT SUPPESS FURTHOR MESSAGES
      JMP QUERY,I 
* 
      SKP 
* 
* OLDSN  RESET CONDITIONS TO ALLOW THIS CODE TO BE INVISABLE
*        IF THE FILE BEING SEARCHED IS NOT INDEXED
* 
OLDSN JSB RWNDF       REWIND FILE TO START
      DEF *+3 
      DEF ID.CB+0     LIB DCB 
      DEF ERROR 
      CLA             SET SCAN N MODULES
      STA &NMOD 
      INA             FORCE READ OF FIRST RECORD
      STA FDONE 
      LDA QUERY       RESET RETURN ADDRESS AS IF THIS CODE
      STA PRCSS       NEVER EXISTED.
      CLE             FLAG NEW LOAD 
      JMP PRCSS+1     PRCSS WILL RETURN TO QUERY'S CALLER 
* 
      SKP 
*DATA AREA
ADENT BSS   1         ADDRESS OF INDEX ENT BUFFER 
LNENT BSS   1         LENGTH OF INDEX ENT RECORD
ADSYM BSS   1         ADDRESS OF SYMBOL FOR CALL
CNTR  BSS   1         END MARK FOR SYMBOL COMPARE LOOP
ERROR BSS   1         ERROR PARM FOR CALLS
IREC  BSS   1         POSITION NAM RECORD 
IBLK  BSS   1 
IWRD  BSS   1 
P16   DEC   16
N1    DEC   -1
N3    DEC   -3
NXSYM BSS   1         POINTER TO CURRENT SYM IN ENT RECORD
P11   DEC   11
P2    DEC   2 
P3    DEC   3 
RESLT BSS   1         RESULT OF SYMBOL TABLE SEARCH 
SADDR BSS   1         SYMBOL TABLE ADDRESS IF DEFINED 
VALSM BSS   1         SYMBOL VALUE IF KNOWN 
@D.CB DEF ID.CB+0     ADDRESS OF DCB FROM CALLER
@D.DX DEF ID.DX+0     ADDRESS OF LOCAL DCB
ID.DX BSS   272       LOCAL DCB TO REDUCE IO ON LIB SEARCH
      END 
                                                                                                                                                                          