// DATE 040222
// NOHALT
*
*** RUN MAINT.
*
// LOAD $MAINT,F1
// RUN
// COPY FROM-READER,TO-F1,RETAIN-R,LIBRARY-S,NAME-$URCH
       MACRO
       $URCH
.*
.*     5703-XM1 SEARCH THE NULL DIRECTORY
.*
       TEXT
       TITLE 'SURCHN - SEARCH THE NULL DIRECTORY'
***********************************************************************
*  5703-XM1 COPYRIGHT IBM CORP. 1970                                  *
*           REFER TO INSTRUCTIONS ON COPY RIGHT NOTICE, 120-2083      *
*                                                                     *
***********************************************************************
*STATUS                                                               *
*   VERSION 1 MODIFICATION 0                                          *
*                                                                     *
*FUNCTION                                                             *
*   * SURCHN WILL SEARCH THE NULL DIRECTORY FOR AN ENTRY OF AT LEAST  *
*     N SECTORS WHERE N IS THE NUMBER OF SECTORS REQUIRED. IF THE     *
*     SPACE IS FOUND THE STARTING ADDRESS IS PLACED IN SMNDEA. IF IT  *
*     IS NOT FOUND SMNDEA IS SET TO ZERO, AND SMNULT CONTAINS THE     *
*     TOTAL OF ALL NULL SECTORS IN THE LIBRARY.                       *
*                                                                     *
*ENTRY POINTS                                                         *
*     SURCHN - ENTRY TO SEARCH FOR NULL SPACE. THE CALLING            *
*              SEQUENCE IS AS FOLLOWS:                                *
*                  B   SURCHN                                         *
*                                                                     *
*INPUT                                                                *
*   * THE INPUT TO SURCHN IS VIA TSMLES. SMNSCT MUST CONTAIN THE      *
*     NUMBER OF SECTORS REQUIRED. SMNDBA MUST CONTAIN THE ADDRESS OF  *
*     THE NULL DIRECTORY IN CORE.                                     *
*                                                                     *
*OUTPUT                                                               *
*   * SMNDEA WILL CONTAIN THE RELATIVE DISK ADDRESS OF THE NULL AREA  *
*     SMNDEA WILL BE ZERO IF THE SPACE IS NOT FOUND.                  *
*   * IF THE SPACE REQUIRED IS NOT FOUND SMNULT WILL CONTAIN THE      *
*     TOTAL OF NULL SECTORS IN THE LIBRARY.                           *
*                                                                     *
*EXTERNAL REFERENCES                                                  *
*        $CAERR - LOCATION OF SYSTEM ERROR CODE INDICATOR             *
*        SMNDBA - LOCATION OF NULL DIRECTORY BUFFER ADDRESS           *
*        SMNULT - LOCATION OF NULL TOTAL COUNT                        *
*        SMNSCT - LOCATION OF REQUIRED SECTOR COUNT                   *
*        SMNDEA - LOCATION OF THE NULL DIRCTY ENTRY ADDRESS.          *
*                                                                     *
*EXITS, NORMAL                                                        *
*   NORMAL RETURN IS TO THE FIRST INSTRUCTION FOLLOWING THE BRANCH    *
*   TO SURCHN.                                                        *
*                                                                     *
*EXITS, ERROR                                                         *
*   N/A                                                               *
*                                                                     *
*TABLES/WORKAREAS                                                     *
*   NONE                                                              *
*                                                                     *
*ATTRIBUTES                                                           *
*   RELOCATABLE                                                       *
*   REUSEABLE                                                         *
*                                                                     *
*CHARACTER CODE DEPENDENCY                                            *
*   THE OPERATION OF THIS MODULE DOES NOT DEPEND ON A PARTICULAR      *
*   INTERNAL REPRESENTATION OF THE EXTERNAL CHARACTER SET.            *
*                                                                     *
*NOTES                                                                *
*   ERROR PROCEDURES                                                  *
*      N/A                                                            *
*                                                                     *
*   REGISTER USAGE                                                    *
*      @BR AND @XR ARE SAVED AND RESTORED ON EXIT. @BR IS USED AS A   *
*      BASE REGISTER AND @XR IS USED TO POINT TO THE NULL DIRECTORY.  *
*                                                                     *
*   SAVED/RESTORED AREAS                                              *
*      NONE                                                           *
*                                                                     *
*   MODIFICATION CONSIDERATIONS                                       *
*      NONE                                                           *
*                                                                     *
*   REQUIRED MODULES                                                  *
*      @SYSEQ - SYSTEM SOFTWARE EQUATES.                              *
*      @DIREQ - LIBRARY DIRECTORY EQUATES                             *
*      @FXDEQ - SYSTEM NUCLEUS EQUATES                                *
*                                                                     *
*   OTHER                                                             *
*      NONE                                                           *
***********************************************************************
       EJECT
***********************************************************************
*  SURCHN WILL SEARCH THE NULL DIRECTORY FOR THE NUMBER OF SECTORS    *
*  SPECIFIED IN SMNSCT. THE ADDR OF THE SPACE FOUND WILL BE PLACED    *
*  IN SMNDEA. IF NO SPACE IS FOUND SMNDEA IS SET TO ZERO.             *
***********************************************************************
SURCHN EQU   *                         ENTRY TO SURCHN
SURE01 EQU   1                         VALUE TO TEST COUNTERS
       USING SUR000,@BR                SPECIFY BASE REGISTER
       ST    SUR900+@OP1,@BR           SAVE BASE OF CALLER
SUR000 LA    SUR000,@BR                ESTABLISH BASE ADDR
       ST    SUR910+@OP1(,@BR),@XR     SAVE INDEX
       ST    SUR920+@OP1(,@BR),@ARR    SET RETURN ADDR
       MVI   $CAERR,@@E300             LIBRARY SPACE NOT AVAILABLE
*
       L     SMNDBA,@XR                GET ADDR TO NULL DIRCTY
       MVC   SMNULT(SURE02),SURC00(,@BR)  CLEAR TOTAL FIELD
*
       MVC   SURCNT(SURE01,@BR),##DNHC(,@XR)  ENTRY COUNT FROM HEADER
       LA    ##DNE1(,@XR),@XR          BUMP POINTER TO FIRST ENTRY
SUR010 CLI   SURC00(,@BR),*-*
SURCNT EQU   SUR010+@Q
       JE    SUR0G2                    NO ENTRIES
*
*            SEARCH ENTRIES FOR ONE WITH ENOUGH SPACE
*
       CLC   ##DNEF(##LNEF,@XR),SMNSCT LOOK FOR LARGE ENOUGH COUNT
       JNL   SUR0A2                    ENTRY GREATER OR EQUAL
*
*            ENTRY IS LESS THAN SPECIFIED COUNT. ADD ENTRY COUNT TO
*            SMNULT AND TOTAL AVAILABLE SPACE.
*
       ALC   SMNULT,##DNEF(##LNEF,@XR) ADD COUNT TO NULL TOTAL
       LA    ##LNE(,@XR),@XR           BUMP TO NEXT ENTRY
       SLC   SURCNT(SURE01,@BR),SURC01(,@BR)  DECR WORKING COUNT
       B     SUR010(,@BR)              GO LOOK AT NEXT ENTRY
*
*            LARGE ENOUGH SPACE HAS BEEN FOUND. TAKE THE REQUIRED
*            NUMBER OF SECTORS AND MODIFY OR DELETE THE ENTRY. SAVE
*            DIRECTORY ENTRY ADDR.
*
SUR0A2 MVC   SMNDEA,##DNEA(@DADDR,@XR) SAVE DADDR OF SPACE FOUND
*
*            TEST IF ENTRY IS OF EQUAL SIZE OF REQUIRED SPACE.
*
       JNE   SUR0A3                    ENTRY NOT THE SAKE SIZE JUMPS
*
*            ENTRY IS OF EQUAL SIZE SO DELETE IT FROM THE DIRECTORY.
*
*            MOVE EACH ENTRY OF DIRECTORY UP ONE POSITION
*
SUR020 MVC   ##DNER(,@XR),##DNER+##LNE(##LNE,@XR)  MOVE ENTRY
       SLC   SURCNT(SURE01,@BR),SURC01(,@BR)  DECR ENTRY COUNT
       JE    SUR024                    ZERO COUNT JUMP
*
       LA    ##LNE(,@XR),@XR           BUMP POINTER TO NEXT *TRY
       B     SUR020(,@BR)              BACK TO MOVE NEXT ENTRY
       SPACE
SUR024 L     SMNDBA,@XR                RESTORE POINTER TO START OF BUF
       SLC   ##DNHC(SURE02,@XR),SURC01(,@BR) DECR HEADER COUNT
*
*            RETURN ACTION
*
SUR900 LA    *-*,@BR                   RESTORE BASE
SUR910 LA    *-*,@XR                   RESTORE INDEX
SUR920 B     *-*                       RETURN ADDR
*
*            NO ENTRY FOUND. CLEAR SMNDEA AND RETURN
*
SUR0G2 MVC   SMNDEA(@CADDR),SURC00(,@BR)  CLEAR DADDR POINTER
       B     SUR900(,@BR)
*
*            REDUCE ENTRY BY REQUIRED SECTORS. MODIFY THE RELATIVE
*            ADDRESS OF ENTRY TO NEW STARTING LOCATION OF THE NULL
*            AREA WHICH IS THE REQUIRED SPACE+1.
*
SUR0A3 SLC   ##DNEF(##LNEF,@XR),SMNSCT  DECR ENTRY BY REQUIRED COUNT
       MVC   SURSWK(1,@BR),##DNEA-1(,@XR)  GET CYL COUNT
       MVI   ##DNEA-1(,@XR),@ZERO       CLEAR CYL IN ENTRY
       ALC   ##DNEA(SURE02,@XR),SMNSCT  BUMP SECTOR BY SPACE USED
SUR034 SLC   ##DNEA(SURE02,@XR),SURC48(,@BR)  DECR BY 1 CYL VALUE
       JL    SUR033                    JUMP LEIS THAN A SECTOR
       ALC   SURSWK(1,@BR),SURC01(,@BR)  BUMP CYL COUNT
       B     SUR034(,@BR)              BACK FOR NEXT CYL
SUR033 ALC   ##DNEA(SURE02,@XR),SURC48(,@BR)  RESTORE REMAINDER
SUR03C MVI   ##DNEA-1(,@XR),*-*        PLUG CYLINDER BACK INTO DADDR
SURSWK EQU   SUR03C+@Q                 ADDR OF CYL IN INSTR
       B     SUR900(,@BR)              GO TO RETURN
*
*            CONSTANTS AND WORK AREA
*
SURE02 EQU   2                         VALUE FOR MOVES
SURC00 DC    IL2'0'                    ZERO FOR COUNT TEST
SURC01 DC    IL1'1'                    VALUE TO INCR COUNTS
SURC48 DC    IL2'48'                   CYL VALUE
***                       END OF SURCHN                             ***
       MEND
// CEND
// END
*
// READER CONSOLE
