// DATE 040222
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$TUFI
       MACRO
       $TUFI
.*
.*     5703-XM1 STORE IN USER DIRECTORY
.*
       TEXT
       TITLE 'STUFID - STORE IN USER DIRECTORY'
***********************************************************************
*  5703-XM1 COPYRIGHT IBM CORP, 1970                                  *
*           REFER TO INSTRUCTIONS ON COPY RIGHT NOTICE, 120-2083      *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   STUFID INSERTS AN ENTRY IN A USER DIRECTORY BLOCK.  IF THE        *
*   CURRENT DIRECTORY IS FULL STUFID WILL CREATE AN ADDITIONAL        *
*   DIRECTORY AND LINK IT TO THE OLD BLOCK.                           *
*                                                                     *
*ENTRY POINTS                                                         *
*   STUFID - ENTRY TO INSERT FILENAME ENTRY IN DIRECTORY BLOCK.       *
*          THE CALLING SEQUENCE IS AS FOLLOWS:                        *
*          B     STUFID                                               *
*                                                                     *
*INPUT                                                                *
*   * SMUDEN MUST CONTAIN THE ADDRESS OF THE LEFT BYTE OF THE ENTRY   *
*     TO BE INSERTED,                                                 *
*   * SMUDBA MUST CONTAIN THE ADDRESS OF THE USER DIRECTORY BUFFER.   *
*                                                                     *
*OUTPUT                                                               *
*   * THE ENTRY IS INSERTED INTO THE DIRECTORY WHICH IS THEN WRITTEN  *
*     BACK TO THE DISK,                                               *
*   * IF THE DIRECTORY IS FULL ANOTHER DIRECTORY IS CREATED.  THE NEW *
*     BLOCK IS LINKED TO THE PREVIOUS DIRECTORY WHICH IS THE WRITTEN  *
*     BACK TO DISK,  THE ENTRY IS MADE IN THE NEW BLOCK AND THEN      *
*     WRITTEN BACK TO DISK,                                           *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*     SMUPEN - CONTAINS THE ADDRESS OF THE NEW ENTRY.                 *
*     SMUDBA - CONTAINS THE ADDRESS OF THE USER DIRECTORY.            *
*     DL2ICS - DISK LOGICAL IOCS,                                     *
*     SMNSCT - LOCATION OF REQUIRED NULL SECTOR COUNT.                *
*     SURCHN - ENTRY TO SEARCH NULL DIRECTORY ROUTINE.                *
*     SMNDEA - CONTAINS RELATIVE DISK ADDRESS OF NULL AREA.           *
*     STUERR - ERROR RETURN TO USER,                                  *
*                                                                     *
*EXITS, NORNAL                                                        *
*   NORMAL RETURN IS TO THE FIRST INSTRUCTION FILLOWING THE BRANCH    *
*   TO STUFID,                                                        *
*                                                                     *
*EXITS, ERROR                                                         *
*   IF AN ADDITIONAL DIRECTORY BLOCK RUST IT CREATED NO TWO SECTORS   *
*   ARE NOT AVAILAILE,  A RETURN IS MARE TO STUD, IN THE CALLERS      *
*   PROGRAM, @BR AND @XR ARE NOT RESTORED.                            *
*                                                                     *
*TABLES/WORKEARES                                                     *
*   NONE                                                              *
*                                                                     *
*ATTRIBUTES                                                           *
*   RELOCATAILE, REUSABLE                                             *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   THE OPERATION OF THIS MODULE DOES NOT DEPEND UPON A PARTICULAR    *
*   INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET.            *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      A BRANCH IS TAKEN TO STUERR IN THE CALLERS PGM IF 2 SECTORS    *
*      ARE NOT AVAILABLE TO CREATE A NEW USER DIRECTORY BLOCK.        *
*                                                                     *
*   REGISTER USAGE                                                    *
*      * @BR AND @XR ARE SAVED AND RESTORED ON EXIT.  @ARR IS STORED  *
*        IN THE BRANCH INSTRUCTION FOR RETURN.                        *
*      * DURING EXECUTION @BR IS USED AS A BASE REGISTER AND @XR IS   *
*        USED AS A GENERAL WORK REGISTER IN THE DIRECTORY.            *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      NONE                                                           *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      N/A                                                            *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      @SYSEQ - SYSTEM SOFTWARE EQUATES                               *
*      @DIREQ - LIBRARY DIRECTORY EQUATES                             *
*      TSMLES - DATA MANAGEMENT COMMUNICATIONS AREA                   *
*      DL2ICS - DISK IOCS ROUTINE                                     *
*      SURCHN - SEARCH NULL DIRECTORY ROUTINE                         *
*                                                                     *
*   OTHER                                                             *
*      N/A                                                            *
***********************************************************************
       EJECT
STUFID EQU   *                         ENTRY TO STUFID
STUE01 EQU   1                         VALUE TO INITIALIZE COUNTER
STUE02 EQU   2                         VALUE FOR Q CODE
       ST    STU900+@OP1,@BR           SAVE BASE REGISTER
       USING STU000,@BR
STU000 LA    STU000,@BR                SET UP BASE REGISTER
       ST    STU920+@OP1(,@BR),@ARR    SAVE RETURN ADDR
       ST    STU910+@OP1(,@BR),@XR     SAVE INDEX REGISTER
*
       L     SMUPEN,@XR                GET CADDR OF NEW ENTRY
       LA    ##DUER(,@XR),@XR          BUMP TO RIGHT END
       ST    STU020+@DOP2(,@BR),@XR    SET IN MOVE TO DIRCTY
       ST    STU060+@DOP2(,@BR),@XR    SET IN MOVE TO NEW DIRCTY
       L     SMUDBA,@XR                ACTIVE BUFFER ADDR
       ST    STULST+@DBFR2(,@BR),@XR   ACTIVE BUFFER ADDR
       MVC   STULST+@DSAD(@DADDR,@BR),##DUHA(,@XR)  DADDR OF BLOCK
       CLI   ##DUHC(,@XR),##MUHM       TEST FOR MAX COUNT
       JNL   STU040                    GO SEARCH FOR NEW BLOCK
*
       MVC   STUCNT(1,@BR),##DUHC(,@XR)  PICK UP COUNT FOR WORK
*
       LA    ##DUE1(,@XR),@XR          BUMP PAST HEADER
*
STU010 CLI   STUCNT(,@BR),@ZERO        TEST IF COUNT EXHAUSTED
       JE    STU020                    ZERO IS END OF DIRCTY
       SLC   STUCNT(1,@BR),STUC01(,@BR)  DECR ENTRY COUNT
       LA    ##LUE(,@XR),@XR           NEXT ENTRY
       B     STU010(,@BR)              BACK TO BUMP TO NEXT ENTRY
*
STU020 MVC   ##LUE-1(##LUE,@XR),*-*    MOVE NEW ENTRY INTO DIRCTY
       L     STULST+@DBFR2(,@BR),@XR   RESTORE ACTIVE BUFFER POINTER
       ALC   ##DUHC(1,@XR),STUC01(,@BR)  BUMP DIRCTY ENTRY COUNT
*
       B     DL2ICS                    REPLACE DIRCTY ON DISK
       DC    AL2(STULST)               ADDR OF DPL
*
       J     STU900                    GO TO RETURN
*
*            OLD BLOCK IS FULL, GO LOOK FOR 2 SECTORS TO BUILD A NEW
*            USER DIRECTORY.
*
STU040 MVC   SMNSCT,STUCLU(STUE02,@BR) REQUIRED SECTOR COUNT
       B     SURCHN                    SEARCH NULL DIRCTY FOR A SPACE
       CLC   SMNDEA(@DADDR),STUC00(,@BR)  TEST IF SPACE FOUND
       BE    STUERR                    GO TAKE ERROR RUTURN
*
STU050 MVC   ##DUHB(,@XR),SMNDEA(@DADDR)  SET LINK IN OLD BLK HEADER
*
       B     DL2ICS                    WRITE OLD BLOCK BACK TO DISK
       DC    AL2(STULST)               POINTER TO OLD DPL
*
       SLC   STUNHD(,@BR),STUNHD(,@BR) CLEAR HEADER AREA
STU060 MVC   STUNNT(##LUE,@BR),*-*     MOVE NEW ENTRY NEXT TO NEW HDR
*
*            NOW IN ENTRIES TO FORM NEN DIRCTY BLOCK HEADER
*
       MVI   STUHDR+##DUHC(,@BR),STUE01  INITIAL COUNT
       MVC   STUHDR+##DUHA(@DADDR,@BR),##DUHB(,@XR) NEW BLK ADDR
       MVC   STUDPL+@DSAD(@DADDR,@BR),##DUHB(,@XR)  NEW BLK ADDR
       B     DL2ICS                    WRITE THE NEW BLOCK
       DC    AL2(STUDPL)               POINTER TO DPL
*
STU900 LA    *-*,@BR                   RESTORE BASE
STU910 LA    *-*,@XR                   RESTORE INDEX
STU920 B     *-*                       RETURN
       EJECT
*
*            CONSTANTS AND WORKAREA
*
*                                      START OF DPL FOR OLD BLOCK
STULST DC    AL1(@DPUT)                READ OP CODE
       DS    CL(@DADDR)                DISK ADDR SPACE
       DC    AL1(##LU)                 SECTOR COUNT OF DIRCTY
       DS    CL(@CADDR)                BUFFER ADDR
STUDPL DC    AL1(@DPUT)                START OF DPL FOR NEW BLOCK
       DS    CL(@DADDR)                NEW DISK ADDR
       DC    AL1(##LU)                 SECTOR COUNT OF DIRCTY
       DC    AL2(STUHDR)               NEW BLOCK HEADER ADDR
STUC00 DC    IL2'0'                    TEST VALUE FOR SPACE FOUND
STUCLU DC    AL1(##LU)                 SECTOR COUNT FOR USER DIRCTY
*
*         FOLLOWING IS THE NEW HEADER TO BE WRITTEN IF A NEW USER
*         DIRECTRY BLOCK IS CREATED.
*
STUHDR EQU   *                         START OF HEADER
STUNHD DS    IL(##LUH)                 SAVE AREA FOR NEW ENTRY
STUCNT EQU   STUHDR                    WORK AREA FOR COUNTER
STUNNT DS    IL(##LUE)                 SAVE AREA FOR NEW ENTRY
*
STUC01 DC    IL1'1'                    CONSTANT 1 TO DECR ENTRY COUNT
***                       END OF STUFID                             ***
       MEND
// CEND
// END
*
// READER CONSOLE
