ASMB,R,L,C
      HED (FMGR) F.SET: FILTER SET, TEST AND GET ROUTINES 
*     NAME:   F.SET 
*     SOURCE: 92071-18018 
*     RELOC:  92071-16018 
*     PGMR:   G.A.A.
*     MOD:    E.D.B.
* 
*  ***************************************************************
*  * (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 F.SET,7 92071-1X018 REV.2041 800508 
* 
      ENT F.SET, F.TST, F.GET 
* 
      EXT DR.RD, PK.DR
      EXT .ENTR, .MVW 
      SUP 
      SKP 
* 
*     DESCRIPTION 
* 
*     THESE ROUTINES PROVIDE A FILTER FOR FMGR COMMANDS 
*     WHICH OPERATE ON A SERIES OF FILES (CO, DL, PU, RN).
* 
*     THE FMGR BUFFER PK.DR IS USED TO HOLD THE DIRECTORY 
*     BUFFER BETWEEN F.GET CALLS, SO IT SHOULD NOT BE USED
*     BY THE CALLING ROUTINE. 
* 
* 
*     F.SET SETS UP THE FILTER MASK 
* 
*     CALLING SEQUENCE: 
* 
*     CALL F.SET(NAME,OPTS) 
* 
*     WHERE:
* 
*     NAME   IS THE NAME MASK (3-WORD ARRAY)
*            A "-" IN ANY POSITION WILL MATCH ANY CHARACTER,
*            ANY OTHER CHARACTER MUST MATCH EXACTLY 
* 
*     OPTS   IS THE SUBPARAMETER MASK ARRAY (5-WORD ARRAY)
*            A "-" OR 0 AS ANY SUBPARAMETER WILL MATCH ANY VALUE, 
*            A NEGATIVE SECURITY CODE WILL MATCH A POSITIVE VALUE,
*            ANY OTHER VALUES MUST MATCH EXACTLY
* 
* 
*     F.TST TESTS A FILE NAMR AGAINST THE FILTER MASK 
*     (F.SET MUST BE USED TO SET UP FILTER) 
* 
*     CALLING SEQUENCE: 
* 
*     CALL F.TST(ENTRY) 
* 
*     WHERE:
* 
*     ENTRY  IS THE FILE ENTRY TO BE TESTED 
*            (16-WORD ARRAY LOCATED IN MEMORY)
* 
* 
*     F.GET GETS THE NEXT FILE FROM A DIRECTORY 
*     WHICH MATCHES THE FILTER MASK 
*     (F.SET MUST BE USED TO SET UP FILTER).
*     F.GET WILL ALWAYS RETURN THE CARTRIGE HEADER THE
*     FIRST TIME IT IS CALLED (IE. WHEN N(2) = 0).
* 
*     CALLING SEQUENCE: 
* 
*     ERR = F.GET(ENTRY,N)
* 
*     WHERE:
* 
*     ENTRY  WILL BE THE NEXT FILE MAIN ENTRY FROM THE DIRECTORY
*            SPECIFIED BY N.
* 
*     N      INDICATES THE LAST POSITION SEARCHED WITHIN THE
*            DIRECTORY. THIS PARAMETER IS A 2-WORD ARRAY.  THE
*            FIRST WORD CONTAINS THE +CRN/-LU OF THE DIRECTORY
*            BEING SEARCHED; THE SECOND WORD CONTAINS THE FILE
*            ENTRY POSITION (RELATIVE TO THE BEGINNING OF THE FILE).
* 
*     ERR    WILL BE THE ERROR RETURN CODE
* 
*     POSSIBLE ERRORS:
* 
*      0     NO ERROR (FILE ENTRY RETURNED) 
*     -12    END OF FILE DIRECTORY
*     -32    CARTRIDGE NOT FOUND
      SKP 
* 
*     F.SET ENTRY 
* 
NAME  NOP 
OPTS  NOP 
* 
F.SET NOP           ENTRY 
      JSB .ENTR     GET PARAMETERS
      DEF NAME
* 
      CLE           PRESET MASK-USED FLAG 
* 
      JSB NAMF      GET MASK AND TEST FOR FIRST WORD
      STA NM1.C      SET THE VALUES 
      STB NM1.M      FOR LATER
* 
      JSB NAMF      GET SAME FOR WORD 2 
      STA NM2.C      AND SAVE 
      STB NM2.M 
* 
      JSB NAMF      SAME FOR NAME 3 
      STA NM3.C 
      STB NM3.M 
* 
      CLA           CLEAR A-REG 
      ELA            GET MASK-USED FLAG 
      STA MASK        AND SAVE
* 
      LDA OPTS      GET ADDRESS OF SUB PRAMS
* 
      JSB SUTY      GET MASK FOR SC 
      STA SC.C1     SAVE SC VALUE ONE 
      SSA           IF NEGATIVE,
      CMA,INA        ALSO SAVE POSITIVE SC
      STA SC.C2 
      STB SC.M
* 
      ISZ OPTS      SKIP OVER CRN 
* 
      JSB SUTY      GET MASK FOR TYPE 
      STA TYP.C 
      STB TYP.M 
* 
      JSB SUTY
      STB SIZ.M 
      ALS           CONVERT SIZE IN BLOCKS TO SECTORS 
      STA SIZ.C 
* 
      JSB SUTY      NOW GET RECORD LENGTH 
      STA RCL.C 
      STB RCL.M     SET VALUES
* 
      LDA MASK      GET MASK-USED FLAG
      JMP F.SET,I   RETURN ALL MASKS SET UP 
      SKP 
* 
*     NAMF:  SET UP NAME MASK 
* 
NAMF  NOP 
      CLB           INITIALIZE MASK WORD
      LDA NAME,I    GET VALUE 
      AND C377       ISOLATE THE HIGH CHAR
      CPA "HM"      IF "-", 
      CCE,RSS        THEN LEAVE MASK ALONE, AND SET MASK FLAG 
      LDB C377       ELSE SET HIGH CHAR MASK
* 
      XOR NAME,I    ISOLATE LOW CHAR
      CPA "LM"      IF "-", 
      CCE,RSS        THEN LEAVE MASK ALONE, AND SET MASK FLAG 
      ADB B377       ELSE SET LOW CHAR MASK 
* 
      LDA NAME,I    GET THE VALUE 
      AND B         MASK IT 
      ISZ NAME      STEP FOR NEXT TIME
      JMP NAMF,I    RETURN A=VALUE, B= MASK 
* 
*     SUTY: SET UP SUBPARAMETER MASK
* 
SUTY  NOP           TYPE MASK SET ROUTINE 
      LDA OPTS,I    GET CURRENT PRAM
      SZA,RSS       SET MASK BASED ON IF SUPPLIED 
      CLB,RSS 
      CCB           B IS MASK ,A IS VALUE 
      ISZ OPTS      STEP TO NEXT ENTRY
      JMP SUTY,I    RETURN
      SKP 
* 
*     STORAGE AREA
* 
B377  OCT 377 
C377  OCT 177400
* 
NM1.C NOP 
NM2.C NOP 
NM3.C NOP 
SC.C1 NOP 
SC.C2 NOP 
TYP.C NOP 
SIZ.C NOP 
RCL.C NOP 
* 
NM1.M NOP 
NM2.M NOP 
NM3.M NOP 
SC.M  NOP 
TYP.M NOP 
SIZ.M NOP 
RCL.M NOP 
* 
"HM"  OCT 26400 
"LM"  OCT 55
      SKP 
* 
*     F.TST ENTRY 
* 
DADD  NOP 
* 
F.TST NOP           MASK TEST ROUTINE PRAM IS ADDRESS OF DIRECTORY ENTRY
      JSB .ENTR 
      DEF DADD
* 
      LDB DADD,I    GET THE ADDRESS 
* 
      LDA B,I       FILE NAME (1) 
      AND NM1.M     KEEP UNMASKED CHAR
      CPA NM1.C     IF OK,
      INB,RSS        THEN CONTINUE
      JMP FEXIT      ELSE TAKE FEXIT
* 
      LDA B,I       FILE NAME (2) 
      AND NM2.M 
      CPA NM2.C 
      INB,RSS 
      JMP FEXIT 
* 
      LDA B,I       FILE NAME (3) 
      AND NM3.M 
      CPA NM3.C 
      INB,RSS 
      JMP FEXIT 
* 
      LDA B,I       FILE TYPE 
      AND TYP.M 
      CPA TYP.C 
      INB,RSS 
      JMP FEXIT 
* 
      INB 
      INB           STEP OVER DISC ADDRESS
* 
      LDA B,I       FILE SIZE 
      AND SIZ.M 
      CPA SIZ.C 
      INB,RSS 
      JMP FEXIT 
* 
      LDA B,I       RECORD LENGTH 
      AND RCL.M 
      CPA RCL.C 
      INB,RSS 
      JMP FEXIT 
* 
      LDA B,I       SECURITY CODE 
      AND SC.M
      CPA SC.C1     TWO CHANCES HERE
      RSS 
      CPA SC.C2     OK? 
      CCA,RSS       YES 
* 
FEXIT CLA           MATCH FAILED EXIT 
* 
      JMP F.TST,I   RETURN
      SKP 
* 
*     F.GET ENTRY 
* 
ENTRY NOP 
N     NOP 
* 
F.GET NOP           ENTRY 
      JSB .ENTR     GET PARAMETERS
      DEF ENTRY 
* 
      LDA N,I       GET THE CRN 
      STA CRN 
      ISZ N 
* 
*     GET AN ENTRY FROM THE FILE DIRECTORY
* 
AGAIN LDB N,I       GET THE ENTRY NUMBER
      ASR 16         EXTEND SIGN
      DIV .8          DIVIDE BY ENTRIES / BLOCK 
      BLF           MULTIPLY OFFSET BY 16 (WORDS) 
      ADB DPKDR      ADD DIRECTORY BLOCK OFFSET 
      STB OFF         AND SAVE
      LDB CRN       GET CARTRIDGE ID
      CPB CCRN      IF CURRENT CRN, 
      RSS            THEN CONTINUE
      JMP READ       ELSE READ FROM FILE DIRECTORY
* 
      CPA CBLK      IF CURRENT BLOCK, 
      JMP NOREA      THEN DON'T READ FROM FILE DIRECTORY
* 
READ  STA CBLK      SAVE BLOCK NUMBER FOR DR.RD 
      STB CCRN
      JSB DR.RD     NOW READ FROM FILE DIRECTORY
      DEF *+4 
      DEF .1
      DEF CCRN
      DEF CBLK
* 
      SEZ           IF CARTRIDGE NOT FOUND, 
      JMP ER32       THEN TAKE ERROR EXIT 
* 
NOREA ISZ N,I       INCREMENT ENTRY NUMBER FOR NEXT TIME
* 
      LDA OFF,I     GET FIRST WORD OF ENTRY 
      SZA,RSS       IF END OF DIRECTORY (ZERO), 
      JMP FIN        THEN WE ARE FINISHED 
* 
      INA,SZA,RSS   IF PURGED ENTRY (-1), 
      JMP AGAIN      THEN CONTINUE
* 
      SSA           IF CARTRIDGE ENTRY (NEGATIVE),
      JMP MATCH      THEN WE MATCHED
* 
      JSB F.TST     TEST FILE ENTRY 
      DEF *+2 
      DEF OFF 
* 
      SZA,RSS       IF FILE DID NOT MATCH FILTER, 
      JMP AGAIN      THEN TRY NEXT ENTRY
* 
MATCH LDA OFF       NOW MOVE ENTRY TO USER ARRAY
      LDB ENTRY 
      JSB .MVW
      DEF .16 
      NOP 
* 
      CLA           SET FOR NORMAL RETURN 
      JMP EREX
* 
FIN   LDA N12       END OF DIRECTORY
      JMP EREX
* 
ER32  LDA N32       CARTRIDGE NOT FOUND 
* 
EREX  JMP F.GET,I   RETURN
* 
*     STORAGE AREA
* 
N6    DEC -6
N12   DEC -12 
N32   DEC -32 
* 
.1    DEC 1 
.8    DEC 8 
.16   DEC 16
* 
DPKDR DEF PK.DR 
* 
CRN   NOP           CARTRIDGE REFERENCE NUMBER
CCRN  NOP           CURRENT CARTRIDGE REFERENCE NUMBER
CBLK  NOP           CURRENT DIRECTORY BLOCK NUMBER
OFF   NOP           ENTRY MEMORY ADDRESS
* 
MASK  NOP           MASK-USED FLAG
* 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                                                                                                                                                                                                          