//FINDFILE  JOB (TSO),
//             'Install FINDFILE',
//             CLASS=A,
//             MSGCLASS=A,
//             MSGLEVEL=(1,1),
//             USER=IBMUSER,
//             PASSWORD=SYS1
//*
//*-------------------------------------------------------*
//*        INSTALLATION OF THE 'FINDFILE' TSO CMD. THIS   *
//*        TSO CMD WAS FOUND ON THE SHARE CBT TAPE AS     *
//*        'LOCDSN'.                                      *
//*-------------------------------------------------------*
//LOCDSN   EXEC ASMFCL,
//         PARM.ASM='OBJ,TERM,NODECK,ALIGN'
//ASM.SYSPRINT DD SYSOUT=*
//ASM.SYSTERM  DD SYSOUT=*
//ASM.SYSIN DD *
*********************************************************************** 0004900
*                                                                     * 0005000
*  THIS PROGRAM IS A TSO COMMAND PROCESSOR THAT WILL LIST ON THE TER- * 0005100
*  MINAL TO WHICH VOLUME A DATA SET IS CATALOGED AND ON WHICH         * 0005200
*  ONLINE DIRECT ACCESS VOLUMES THE DATA SET CAN BE FOUND.            * 0005300
*                                                                     * 0005400
*                  WRITTEN OCT 10, 1977 BY SCOTT HEILMAN              * 0005500
*                                                                     * 0005600
*********************************************************************** 0005700
         EJECT                                                          0005800
*********************************************************************** 0005900
*  INITIALIZE.                                                        * 0006000
*********************************************************************** 0006100
LOCDSN   CSECT                                                          0006200
START    EQU   *                                                        0006300
         STM   R14,R12,12(R13)         SAVE REGISTERS                   0006400
         LR    R12,R15                 LOAD BASE REGISTER               0006500
         USING START,R12                                                0006600
         LR    R2,R1                   SAVE CPPL PTR                    0006700
         LA    R0,DEND-DSTART          GET SIZE OF DSECT                0006800
         GETMAIN   R,LV=(R0)                                            0006900
         LR    R11,R1                  LOAD DSECT BASE REGISTER         0007000
         USING GOTTEN,R11                                               0007100
         ST    R13,SAVE+4              ESTABLISH SAVE                   0007200
         ST    R11,8(R13)                             AREA CHAINING     0007300
         LR    R13,R11                 PTR TO MY SAVE AREA INTO R13     0007400
         EJECT                                                          0007500
*********************************************************************** 0007600
*  SEARCH UCBS FOR DIRECT ACCESS DEVICES. BUILD A TABLE OF VOLUME     * 0007700
*  SERIAL NUMBERS OF ALL ONLINE NON-VIO DIRECT ACCESS DEVICES.        * 0007800
*********************************************************************** 0007900
         XC    VOLCNT,VOLCNT           ZERO VOLUME COUNT                0008000
         L     R4,16                   ADDRESS OF CVT INTO R4           0008100
         L     R5,40(R4)               UCB LOOKUP LIST FROM CVT         0008200
UCBSCAN  EQU   *                                                        0008300
         LH    R6,0(R5)                GET ADDRESS OF A UCB             0008400
         LTR   R6,R6                   TEST FOR VALID                   0008500
         BZ    UCBINC                  NOT UCB ADDRESS                  0008600
         BM    UCBEND                  END OF LIST                      0008700
         CLI   2(R6),X'FF'             CHECK FOR UCB ID                 0008800
         BNE   RETURN                  SOMETHING IS WRONG GET OUT       0008900
         TM    18(R6),X'20'            IS IT DIRECT ACCESS              0009000
         BNO   UCBINC                  NO                               0009100
         TM    0(R6),X'80'             IS IT VIRTUAL DEVICE             0009200
         BO    UCBINC                  YES-- DO NOT WANT VIRTUAL        0009300
         TM    3(R6),X'80'             IS IT ONLINE                     0009400
         BNO   UCBINC                  NO                               0009500
         LA    R7,DASDLIST             GET START OF TABLE               0009600
         LH    R8,VOLCNT               CURRENT VOLUME COUNT FOR LOOP    0009700
         LTR   R8,R8                   TEST VOLUME COUNT                0009800
         BZ    NEWVOL                  IF ZERO THIS IS FIRST VOLUME     0009900
VOLSRCH  EQU   *                       LOOP THRU VOLUMES ALREADY FOUND  0010000
         CLC   0(6,R7),28(R6)          TABLE ENTRY VS VOL IN UCB        0010100
         BE    UCBINC                  VOLUME ALREADY IN TABLE          0010200
         LA    R7,6(R7)                NEXT ENTRY IN TABLE              0010300
         BCT   R8,VOLSRCH              IF NOT ALL CHECK NEXT            0010400
NEWVOL   EQU   *                       NEW VOLUME FOUND                 0010500
         MVC   0(6,R7),28(R6)          MOVE VOL FROM UCB TO TABLE       0010600
         LH    R8,VOLCNT               GET VOLUME COUNT                 0010700
         LA    R8,1(R8)                ADD 1                            0010800
         STH   R8,VOLCNT               UPDATE                           0010900
         CH    R8,=H'256'              CHECK FOR TABLE LIMIT            0011000
         BE    UCBEND                  NO MORE ACCEPTED                 0011100
UCBINC   EQU   *                                                        0011200
         LA    R5,2(R5)                POINT TO NEXT UCB                0011300
         B     UCBSCAN                 GO LOOK AT IT                    0011400
UCBEND   EQU   *                                                        0011500
         EJECT                                                          0011600
*********************************************************************** 0011700
*  TEST FOR COMMAND OPERANDS.  RETURN IF THERE ARE NONE.  CALCULATE   * 0011800
*  THE ADDRESS AND LENGTH OF THE COMMAND OPERAND. CONVERT ANY LOWER   * 0011900
*  CASE LETTERS TO UPPER CASE AND INITIALIZE DSN WORK AREA.           * 0012000
*********************************************************************** 0012100
         L     R3,12(R2)               ECT PTR INTO R3                  0012200
         TM    28(R3),X'80'            ANY OPERANDS ?                   0012300
         BO    NOOPERS                 BRANCH NO                        0012400
         L     R3,0(R2)                CMD BUFFER PTR INTO R3           0012500
         LH    R4,0(R3)                BUFFER LENGTH INTO R4            0012600
         LA    R5,4                    SUBTRACT 4 TO ALLOW              0012700
         SR    R4,R5                            FOR LENGTH WORD         0012800
         SH    R4,2(R3)                SUBTRACT OFFSET TO ALLOW FOR CMD 0012900
         LA    R5,4(R3)                PTR TO CMD INTO R5               0013000
         AH    R5,2(R3)                PTR TO OPERAND INTO R5           0013100
         LR    R3,R5                   PTR TO OPERAND INTO R3           0013200
         LR    R5,R4                   SAVE DSN LENGTH IN R5            0013300
         BCTR  R5,0                    REDUCE BY 1 FOR EXECUTE INST     0013400
         EX    R5,LOWTOUP              CONVERT LOWER CASE TO UPPER      0013500
         LA    R5,44                   SET DSNLEN                       0013600
         STH   R5,DSNLEN                          TO 44                 0013700
         MVI   DSN,C' '                BLANK OUT                        0013800
         MVC   DSN+1(L43),DSN                    DSN AREA               0013900
         EJECT                                                          0014000
*********************************************************************** 0014100
*  CHECK TO SEE WHAT THE USER WANTS.  IF ALL HE WANTS IS A            * 0014200
*  PARTICULAR DATA SET, WRITE THE DSN ON THE TERMINAL AND GO CHECK    * 0014300
*  TO SEE IF LOGON ID NEEDS TO BE ADDED TO THE USER SUPPLIED DATA SET * 0014400
*  NAME.                                                              * 0014500
*********************************************************************** 0014600
         LR    R1,R3                   PTR TO DSN INTO R1               0014700
         LR    R0,R4                   DSN LENGTH INTO R0               0014800
         BAL   R10,TPUT                WRITE DSN TO TERMINAL            0014900
*********************************************************************** 0015000
*  CHECK TO SEE IF USER'S LOGON ID MUST BE APPENDED TO THE SUPPLIED   * 0015100
*  DSNAME AND DO SO IF IT IS NECESSARY.  MOVE THE FULLY QUALIFIED     * 0015200
*  DSNAME TO A CONTROL AREA IN PREPARATION FOR ISSUING THE LOCATE     * 0015300
*  MACRO.                                                             * 0015400
*********************************************************************** 0015500
CHEKQUOT LA    R6,44                   DSN AREA LENGTH INTO R6          0015600
         LA    R5,DSN                  PTR TO DSN AREA INTO R5          0015700
         CLI   0(R3),C''''             IS 1ST CHARACTER A QUOTE ?       0015800
         BE    SKIPQUOT                BRANCH YES                       0015900
         L     R7,8(R2)                PSCB PTR INTO R7                 0016000
         MVC   DSN(L7),0(R7)           MOVE USER ID TO DSN AREA         0016100
ISITBLK  CLI   0(R5),C' '              IS THIS CHARACTER A BLANK ?      0016200
         BE    MOVEDOT                 BRANCH YES                       0016300
         LA    R5,1(R5)                BUMP OVER 1 CHARACTER            0016400
         BCT   R6,ISITBLK              REDUCE LENGTH BY 1 & LOOP        0016500
MOVEDOT  MVI   0(R5),C'.'              MOVE PERIOD AFTER USER ID        0016600
         LA    R5,1(R5)                BUMP OVER 1 CHARACTER            0016700
         BCT   R6,MOVEDSN              REDUCE LENGTH BY 1 & BRANCH      0016800
SKIPQUOT LA    R3,1(R3)                BUMP OVER 1 CHARACTER IN OPERAND 0016900
         BCTR  R4,0                    REDUCE OPERAND LENGTH BY 1       0017000
MOVEDSN  LTR   R4,R4                   IS THIS THE END OF THE OPERAND ? 0017100
         BZ    LOCATE                  BRANCH YES                       0017200
         CLI   0(R3),C''''             IS THIS CHARACTER A QUOTE ?      0017300
         BE    LOCATE                  BRANCH YES                       0017400
         MVC   0(L1,R5),0(R3)          MOVE 1 CHARACTER OF DSN OPERAND  0017500
         LA    R3,1(R3)                BUMP OVER 1 CHARACTER IN OPERAND 0017600
         LA    R5,1(R5)                BUMP OVER 1 CHARACTER IN DSN     0017700
         BCTR  R4,0                    REDUCE OPERAND LENGTH BY 1       0017800
         BCT   R6,MOVEDSN              REDUCE DSN LENGTH BY 1 AND LOOP  0017900
         EJECT                                                          0018000
*********************************************************************** 0018100
*  ISSUE THE LOCATE MACRO TO FIND THE VOLUME ON WHICH THE DATA SET    * 0018200
*  RESIDES.  IF THE DATA SET IS NOT CATALOGGED ISSUE AN INFORMATIVE   * 0018300
*  MESSAGE TO THE TERMINAL. IF THE DATA SET SPANS MORE THAN ONE     *   0018400
*  VOLUME ISSUE A MESSAGE INDICATING THAT THE DATA SET CANNOT BE PRO- * 0018500
*  CESSED AND RETURN.  IF LOCATE IS SUCCESSFUL CONTINUE PROCESSING.   * 0018600
*********************************************************************** 0018700
LOCATE   LA    R3,0                    ZERO R3                          0018800
         ST    R3,CAMLIST              ZERO WORD 1 OF CAMLIST           0018900
         MVI   CAMLIST,X'44'           INDICATE LOCATE OPTION           0019000
         ST    R3,CAMLIST+8            ZERO WORD 3 OF CAMLIST           0019100
         LA    R3,DSN                  DSN PTR INTO                     0019200
         ST    R3,CAMLIST+4                         WORD 2 OF CAMLIST   0019300
         LA    R3,SERAREA              SER PTR INTO                     0019400
         ST    R3,CAMLIST+12                        WORD 4 OF CAMLIST   0019500
         LOCATE  CAMLIST               FIND DSN IN CATALOG              0019600
         LTR   R15,R15                 LOCATE SUCCESSFUL ?              0019700
         BNZ   NOTCATLG                BRANCH NO                        0019800
         LA    R3,1                    DOES DATA SET SPAN MORE          0019900
         CH    R3,SERAREA                        THAN 1 VOLUME ?        0020000
         BNE   MORTHAN1                BRANCH YES                       0020100
         EJECT                                                          0020200
*********************************************************************** 0020300
*   ENTRY AT LOCATE2 PUTS OUT CATLOG MESSAGE.                         * 0020400
*   ENTRY AT SETLOOP OR DROP THRU SETS UP VOLUME LOOP FOR OBTAIN      * 0020500
*********************************************************************** 0020600
LOCATE2  EQU   *                                                        0020700
         LH    R0,MSG2                 SET MESSAGE LENGTH               0020800
         MVC   OUTLINE(28),MSG2+2      MOVE TO GOTTEN AREA              0020900
         MVC   OUTLINE+22(6),SERAREA+6    MOVE IN VOL SER               0021000
         LA    R1,OUTLINE              ADDRESS OF MESSAGE               0021100
         BAL   R10,TPUT                SEND CATLOGED MESSAGE            0021200
SETLOOP  EQU   *                                                        0021300
         LH    R0,MSG7                 SET MESSAGE LENGTH               0021400
         LA    R1,MSG7+2               ADDRESS OF MESSAGE               0021500
         BAL   R10,TPUT                SEND HEADER MESSAGE              0021600
         LH    R8,VOLCNT               SET UP LOOP CONTROL              0021700
         LA    R7,DASDLIST             POINT TO FIRST IN TABLE          0021800
         EJECT                                                          0021900
*********************************************************************** 0022000
*  OBTAIN THE FORMAT 1 DSCB FOR THE DATA SET.  IF THE OBTAIN IS NOT   * 0022100
*  SUCCESSFUL GO ON TO NEXT VOLUME ELSE DISPLAY VOLUME ON SCREEN      * 0022200
*********************************************************************** 0022300
OBTAIN1  LA    R3,0                    ZERO R3                          0022400
         ST    R3,CAMLIST              ZERO WORD 1 OF CAMLIST           0022500
         MVI   CAMLIST,X'C1'           INDICATE SEARCH OPTION OF OBTAIN 0022600
         LA    R3,DSN                  DSN PTR INTO                     0022700
         ST    R3,CAMLIST+4                         WORD 2 OF CAMLIST   0022800
*        LA    R3,SERAREA+6            SER PTR INTO                     0022900
         ST    R7,CAMLIST+8                         WORD 3 OF CAMLIST   0023000
         LA    R3,OBTAINWK             WORK PTR INTO                    0023100
         ST    R3,CAMLIST+12                         WORD 4 OF CAMLIST  0023200
         OBTAIN  CAMLIST               OBTAIN FORMAT 1 DSCB             0023300
         LTR   R15,R15                 OBTAIN SUCCESSFUL ?              0023400
         BNZ   LOOPCNTL                BRANCH NO                        0023500
         MVI   OUTLINE,X'40'           BLANK OUT MSG AREA               0023600
         MVC   OUTLINE+1(13),OUTLINE                                    0023700
         MVC   OUTLINE+4(6),0(R7)      PUT IN VOLSER                    0023800
         LA    R0,14                   LOAD LENGTH OF MESSAGE           0023900
         LA    R1,OUTLINE              ADDRESS OF MESSAGE               0024000
         BAL   R10,TPUT                SEND MESSAGE                     0024100
LOOPCNTL EQU   *                                                        0024200
         LA    R7,6(R7)                NEXT ENTRY IN TABLE              0024300
         BCT   R8,OBTAIN1              IF MORE VOLUMES GO BACK          0024400
         B     RETURN                  FINISHED                         0024500
         EJECT                                                          0024600
*********************************************************************** 0024700
*  RETURN TO THE SYSTEM AFTER FREEING WORK AREA                       * 0024800
*********************************************************************** 0024900
RETURN   EQU   *                                                        0025000
         LR    R1,R13                  PTR TO GOTTEN AREA INTO R1       0025100
         L     R13,SAVE+4              RESTORE R13                      0025200
         LA    R0,DEND-DSTART          GET SIZE OF DSECT                0025300
         FREEMAIN  R,LV=(R0),A=(R1)                                     0025400
         LM    R14,R12,12(R13)         RESTORE R14-R12                  0025500
         SR    R15,R15                 ZERO R15 FOR RETURN CODE         0025600
         BR    R14                     RETURN TO INVOKER                0025700
         EJECT                                                          0025800
*********************************************************************** 0025900
*  ROUTINE TO WRITE LINES TO THE TERMINAL.                            * 0026000
*********************************************************************** 0026100
TPUT     TPUT  (R1),(R0),R             WRITE MSG TO TERMINAL            0026200
         BR    R10                     RETURN TO INVOKER                0026300
         EJECT                                                          0026400
*********************************************************************** 0026500
*  ROUTINES TO ISSUE ERROR MESSAGES.                                  * 0026600
*********************************************************************** 0026700
NOTCATLG LH    R0,MSG1                 MSG LENGTH INTO R0               0026800
         LA    R1,MSG1+2               PTR TO MSG INTO R1               0026900
         BAL   R10,TPUT                WRITE MSG TO TERMINAL            0027000
         B     SETLOOP                 GO SEARCH VOLUMES                0027100
MORTHAN1 LH    R0,MSG3                 MSG LENGTH INTO R0               0027200
         LA    R1,MSG3+2               PTR TO MSG INTO R1               0027300
         BAL   R10,TPUT                WRITE MSG TO TERMINAL            0027400
         B     RETURN                  GO TO RETURN                     0027500
BADCATRD LH    R0,MSG4                 MSG LENGTH INTO R0               0027600
         LA    R1,MSG4+2               PTR TO MSG INTO R1               0027700
         BAL   R10,TPUT                WRITE MSG TO TERMINAL            0027800
         B     RETURN                  GO TO RETURN                     0027900
UNUSDIND LH    R0,MSG5                 MSG LENGTH INTO R0               0028000
         LA    R1,MSG5+2               PTR TO MSG INTO R1               0028100
         BAL   R10,TPUT                WRITE MSG TO TERMINAL            0028200
         B     RETURN                  GO TO RETURN                     0028300
NOOPERS  LH    R0,MSG6                 MSG LENGTH INTO R0               0028400
         LA    R1,MSG6+2               PTR TO MSG INTO R1               0028500
         BAL   R10,TPUT                WRITE MSG TO TERMINAL            0028600
         B     RETURN                  GO TO RETURN                     0028700
         EJECT                                                          0028800
*********************************************************************** 0028900
*  INSTRUCTION THAT WHEN EXECUTED WILL CONVERT LOWER CASE LETTERS TO  * 0029000
*  UPPER CASE.                                                        * 0029100
*********************************************************************** 0029200
LOWTOUP  OC    0(L0,R3),BLANKS         OBJECT OF EXECUTE INSTRUCTION    0029300
         EJECT                                                          0029400
*********************************************************************** 0029500
*  CONSTANTS.                                                         * 0029600
*********************************************************************** 0029700
MSG1     DC    H'29'                                                    0029800
         DC    CL29'DATA SET NOT FOUND IN CATALOG'                      0029900
MSG2     DC    H'28'                                                    0030000
         DC    CL28'DATA SET CATALOGED TO XXXXXX'                       0030100
MSG3     DC    H'53'                                                    0030200
         DC    CL53'DATA SET SPANS MORE THAN 1 VOLUME - UNABLE TO PROCE+0030300
               SS'                                                      0030400
MSG4     DC    H'21'                                                    0030500
         DC    CL21'ERROR IN CATALOG READ'                              0030600
MSG5     DC    H'12'                                                    0030700
         DC    CL12'UNUSED INDEX'                                       0030800
MSG6     DC    H'40'                                                    0030900
         DC    CL40'DATA SET NAME REQUIRED. PLEASE TRY AGAIN'           0031000
MSG7     DC    H'35'                                                    0031100
         DC    CL35'DATA SET FOUND ON FOLLOWING VOLUMES'                0031200
BLANKS   DC    CL80' '                                                  0031300
         EJECT                                                          0031400
*********************************************************************** 0031500
*  DSECT FOR GOTTEN STORAGE.                                          * 0031600
*********************************************************************** 0031700
GOTTEN   DSECT                                                          0031800
DSTART   EQU   *                                                        0031900
SAVE     DS    18F                                                      0032000
PARMWD1  DS    F                                                        0032100
PARMWD2  DS    F                                                        0032200
         DS    0H                                                       0032300
OUTLINE  DS    CL57                                                     0032400
         DS    0D                                                       0032500
SERAREA  DS    265C                                                     0032600
         ORG   *-249                                                    0032700
OBTAINWK DS    148C                                                     0032800
F3CCHHR  DS    CL5                                                      0032900
SERENDUP DS    96C                                                      0033000
DSNLEN   DS    H                                                        0033100
DSN      DS    CL44                                                     0033200
CAMLIST  DS    4F                                                       0033300
VOLCNT   DS    H                                                        0033400
DASDLIST DS    256CL6                                                   0033500
DEND     EQU   *                                                        0033600
         EJECT                                                          0033700
*********************************************************************** 0033800
*  EQUATES FOR LENGTH VALUES AND GENERAL REGISTERS.                   * 0033900
*********************************************************************** 0034000
L0       EQU   0                                                        0034100
L1       EQU   1                                                        0034200
L2       EQU   2                                                        0034300
L3       EQU   3                                                        0034400
L4       EQU   4                                                        0034500
L5       EQU   5                                                        0034600
L6       EQU   6                                                        0034700
L7       EQU   7                                                        0034800
L9       EQU   9                                                        0034900
L20      EQU   20                                                       0035000
L43      EQU   43                                                       0035100
R0       EQU   0                                                        0035200
R1       EQU   1                                                        0035300
R2       EQU   2                                                        0035400
R3       EQU   3                                                        0035500
R4       EQU   4                                                        0035600
R5       EQU   5                                                        0035700
R6       EQU   6                                                        0035800
R7       EQU   7                                                        0035900
R8       EQU   8                                                        0036000
R9       EQU   9                                                        0036100
R10      EQU   10                                                       0036200
R11      EQU   11                                                       0036300
R12      EQU   12                                                       0036400
R13      EQU   13                                                       0036500
R14      EQU   14                                                       0036600
R15      EQU   15                                                       0036700
         END                                                            0036800
//LKED.SYSLMOD DD DSN=SYS2.CMDLIB,DISP=SHR
//LKED.SYSPRINT DD SYSOUT=*
//LKED.SYSIN  DD *
 ALIAS LOCDSN
 NAME FINDFILE(R)
/*
//HELP    EXEC PGM=IEBUPDTE,PARM=NEW,COND=(0,NE)
//SYSPRINT DD  SYSOUT=*
//SYSUT2   DD  DISP=SHR,DSN=SYS2.HELP
//SYSIN    DD  *
./ ADD NAME=FINDFILE
./ ALIAS NAME=LOCDSN
)F       FUNCTION -                                                     00414210
            FINDFILE DISPLAYS WHERE A DATA SET IS CATALOGED             00414220
                    AND LISTS ALL MOUNTED DIRECT ACCESS                 00414230
                    VOLUMES ON WHICH THE DATA SET RESIDES.              00414240
)X       SYNTAX -                                                       00414250
            FINDFILE 'DSNAME'                                           00414260
                                                                        00414270
            ALIAS  -  LOCDSN                                            00414280
)O       OPERANDS:                                                      00414290
               DSNAME - THE DATA SET NAME YOU WISH TO LOCATE            00414300
                        USING STANDARD TSO NAMING CONVENTIONS.          00414310
                                                                        00414320
         EXAMPLES:                                                      00414330
            FINDFILE MYPROG.ASM                                         00414340
            FINDFILE 'SYS1.HELP'                                        00414350
./ ENDUP
/*
