         SYSTEM   SIG9P                                                         
         SYSTEM   OPTIONS                                                       
         DEF      FINDBB                                                        
         DEF      FINDDIR                                                       
         DEF      FINDDIRX          FIND EXTENT N OF FILE                       
         DEF      READDIR                                                       
         DEF      WRITDIR                                                       
*                                                                               
*   EXITS:                                                                      
         DEF      FBBX1,FBBX2                                                   
         DEF      FBBXITER                                                      
*                                                                               
*                                                                               
OLAYFLAG EQU      'FIND'                                                        
         SYSTEM   CPRMON                                                        
*                                                                               
*   EXIT POINTS FROM OVERLAY                                                    
*                                                                               
FBBX1    B        0,R5                                                          
FBBX2    B        1,R5                                                          
FBBXITOK AI,R8    1         OK EXIT: RETURN AT LINK + 1  (R8+1)                 
FBBXITER B        *R8       ERROR EXIT: RETURN AT LINK   (R8)                   
*                                                                               
         TITLE    '** FINDBB - FINDBB SUBROUTINE **'                            
**************                                                                  
*   FINDBB   *                                                                  
**************                                                                  
*                                                                               
*                                                                               
*                                                                               
*   ROUTINE GETS A BLOCKING BUFFER                                              
*   THE RELADBUF SUBROUTINE MUST BE USED TO RELEASE THE BLK BUF.                
*                                                                               
*                                                                               
*   AT ENTRY:  R1   FPT CODE                                                    
*              R3   FPT ADDRESS                                                 
*              R5   LINK                                                        
*                                                                               
*   AT EXIT:   R15  BLOCKING BUFFER CONTROL WORD ADDRESS                        
*                                                                               
*   ROUTINE RETURNS +1 IF A BLOCKING BUFFER WAS NOT OBTAINED                    
*                   +2 OTHERWISE                                                
*                                                                               
*   REGISTERS R0-R14 ARE SAVED                                                  
*                                                                               
*                                                                               
FINDBB   PUSH     15,R0             SAVE R0-R14                                 
         CLM,R1   L1015             CHECK IF FPT CODE IS   /SIG7-5323/*C015732  
*                                    READ,WRITE,OPEN,CLOSE /SIG7-5323/*C015732  
         BCS,9    %4076             B IF NOT               /SIG7-5323/*C015732  
         LI,R15   11                                                            
         BAL,R5   GETPI             GET BB ADDR                                 
         B        %4076                                                         
         PUSH     R15               SAVE BBCW ADDRESS                           
         LI,R11   1028              BYTE SIZE OF BB+CONTROL WORD                
         LW,R10   R15                                                           
         SLS,R10  2                 BYTE ADDR. OF BB                            
         BAL,R5   TESTBUF           TEST BB FOR ACCESSIBILITY                   
         B        FINDBBE1          ERROR, NOT WRITEABLE                        
         PULL     R15               RESTORE BBCW ADDRESS                        
         STW,R15  *R15                                                          
         MTW,1    *R15                                                          
         B        FINDBBEX          EXIT                                        
%4076    RES      0                                                             
         BIFMAP   %4076A            B IF USER MAPPED                            
         LW,R15   K:FPOOL                                                       
         BNEZ     %4071             B IF FPOOL NOT EMPTY                        
         B        FINDBBER          ERROR                                       
%4076A   LB,R6    TCBPOINT          STI INDEX                                   
         LB,R6    STIJID,R6         JOB I.D.                                    
         LW,R6    SJI1,R6           JCB ADDRESS                                 
         LW,R15   JCBBBCT,R6        R15= BBCW TABLE ADDRESS                     
         MTW,0    *R15                                                          
         BEZ      %4075             B IF POOL IS EMPTY                          
         LI,R6    MAXBBS            R6= MAX NO. OF BB'S                         
         B        %4073                                                         
%4071    LW,R6    *R15              NO OF BB'S                                  
         BLEZ     FINDBBER          ERROR (BBPOOL DESTROYED)                    
%4073    LW,R12   *R15,R6           BB CW                                       
         BEZ      %4073A            B IF NOT A BBCW                             
         LB,R5    R12                                                           
         BEZ      %4072             B IF NOT IN USE                             
%4073A   BDR,R6   %4073                                                         
         BIFREAL  FINDBBER          ERROR IF NO BB'S AND USER IS REAL.          
%4075    RES      0                                                             
         LW,R6    *R15              GET CURRENT BB COUNT                        
         CI,R6    MAXBBS            IS IT EQUAL TO MAXIMUM                      
         BGE      FINDBBER          YES,CANNOT GET ANY MORE                     
         LI,R0    0                 RO= ACCESS CODE (WRITEABLE)                 
         BAL,R8   MMGJRP            GET A PAGE FROM JOB'S RESERVED PAGE         
         B        FINDBBER                                                      
*  R14= VIRTUAL PAGE NUMBER. CONVERT THE PAGE NO. TO TWO BLOCKING               
*   BUFFER ADDRESSES AND ENTER THE ADDRESSES IN THE JOB'S BBCW TABLE.           
         LW,R6    R14               R6= VIRTUAL PAGE NUMBER                     
         AI,R6    -X'F0'            R6= INDEX FOR BBCW IN BBCWT                 
         AW,R6    R6                DOUBLE VALUE                                
         SLS,R14  9                 VIRTUAL WORD ADDRESS OF THE PAGE            
         AI,R6    1                 R6= INDEX FOR FIRST BBCW                    
         DISABLE                                                                
         STW,R14  *R15,R6           STORE ADDR OF BB INTO BBCW TABLE            
         AI,R6    1                 R6= INDEX FOR SECOND BBCW                   
         AI,R14   256               R14= ADDR OF THE 2ND BB                     
         STW,R14  *R15,R6           STORE ITS ADDR INTO THE BBCW TABLE          
         MTW,2    *R15              NEW BB COUNT= OLD COUNT+2                   
         ENABLE                                                                 
*                                                                               
*                                                                               
%4072    RES      0                                                             
         AW,R15   R6                R15= BBCW ADDRESS                           
         DISABLE                                                                
         LW,R5    *R15                                                          
         BEZ      %4099             B IF REENTERED AND RELEASED                 
         LB,R0    R5                GET RFTX FIELD                              
         BEZ      %4072A            B IF NOT RE-ENTERED                         
%4099    RES      0                                                             
         PULL     15,R0             RE-ENTERED, START AGAIN                     
         ENABLE                                                                 
         B        FINDBB                                                        
%4072A   RES      0                                                             
         AND,R5   M17                                                           
         LW,R9    R5                R9= BLK BUF FWA                             
         LI,R0    X'FF'                                                         
         STB,R0   R5                TIE UP BB                                   
         STW,R5   *R15                                                          
         ENABLE                                                                 
         LI,R11   0                 REQUIRE FULL ACCESS                         
         LW,R10   R9                                                            
         AI,R10   255               R10= BLK BUF LWA                            
         PUSH     R15               SAVE BBCW ADDRESS                           
         BAL,R8   TMCKADP           CHECK BB RANGE                              
         B        FINDBBE2          ERROR, OUT OF RANGE                         
         PULL     R15               RESTORE BBCW ADDRESS                        
FINDBBEX PULL     15,R0                                                         
         B        FBBX2             TAKE NORMAL EXIT (+2)                       
*                                                                               
*                                                                               
FINDBBE1 RES      0         ERROR FROM WBLOCK OR TESTBUF                        
         PULL     R7                CLEAR STACK OF SAVED WORD                   
FINDBBER PULL     15,R0                                                         
         B        FBBX1             TAKE ERROR EXIT                             
*                                                                               
*                                                                               
FINDBBE2 PULL     R15               RESTORE BBCW ADDRESS                        
         STW,R9   *R15              UNTIE BB (RFTX FIELD=0)                     
         B        FINDBBER          TAKE ERROR EXIT                             
         TITLE    '** FINDBB - FINDDIR SUBROUTINE **'                           
***************                                                                 
*   FINDDIR   *                                                                 
***************                                                                 
*                                                                               
*   ROUTINE TO FIND OR BUILD THE DIRECTORY ENTRY FOR A DISC FILE                
*                                                                               
*                                                                               
*   AT ENTRY:                                                                   
*        R1       FPT CODE                                                      
*        R2       DCB ADDRESS IF CALLED FROM OPEN/WRITE/READ/CLOSE              
*        R3       FPT ADDRESS IF X'09'<R1<X'16' (FROM OPEN/CLOSE/ETC)           
*        R6       AREA INDEX OR -1 FOR A PUBLIC AREA                            
*        R7       TSPACE ADDRESS (ALLOT) OR ZERO (FIND)                         
*        R8       LINK                                                          
*        R9       EXTENSION NUMBER                                              
*        R10,R11  ACCOUNT NAME                                                  
*        R12,R13  FILE NAME                                                     
*        R15      REENTRANCE COUNT                                              
*                                                                               
*   AT EXIT:                                                                    
*        R4       POINTS AT THE FILE'S DIRECTORY ENTRY IN BLOCK BUFFER          
*        R5       --------                                                      
*        R6       AREA INDEX                                                    
*        R8       LINK+1 IF NO ERROR; LINK IF ANY ERRORS                        
*        R9       TYC CODE IF ERROR ; ELSE --------                             
*        R10      ADDRESS OF BBCW IF NO ERRORS;  ELSE SEE NOTE BELOW            
*        R11      --------                                                      
*        R14      NUMBER OF SECTOR CONTAINING DIRECTORY ENTRY                   
*                                                                               
*   REGISTERS SAVED: R0-R3,R6,R7,R12,R13,R15                                    
*                                                                               
*   ROUTINE RETURNS TO LINK+1 IF NO ERRORS                                      
*   ROUTINE RETURNS TO LINK   IF ERROR, R9= TYC                                 
*                                                                               
*   NOTE THAT WHEN THE ERROR EXIT IS TAKEN, THE BLOCKING                        
*   BUFFER WILL ALWAYS BE RELEASED EXCEPT WHEN A FILE IS                        
*   BEING DEFINED AND A DUPLICATE ENTRY IS FOUND.  WHEN                         
*   THIS OCCURS, R4= POINTER TO THE FILE ENTRY AND R10                          
*   CONTAINS THE BLOCKING BUFFER ADDRESS.                                       
*                                                                               
         PAGE                                                                   
         SPACE    2                                                             
*        IF CALLED FOR AN ALLOT, THIS IS THE                                    
*   TSPACE BLOCK FORMAT (NEW FILE'S PRELIMINARY DIRECTORY ENTRY)                
*                                                                               
*  WORD  LABEL     CONTENTS                                                     
*                                                                               
*   0  TSNFTSPC   TSPACE CONTROL WORD FROM GETTEMP                              
*   1  TSNFNAM1   WORD ONE OF FILENAME                                          
*   2  TSNFNAM2   WORD TWO OF FILENAME                                          
*   3  TSNFLEN    LENGTH OF ENTRY, IN RIGHTMOST BYTE                            
*   3  TSNFFLGS   FLAGS (1 & 2), AND ALSO LENGTH                                
*   4  TSNFGRSZ   GSIZE IN HW 0, RSIZE IN HW 1, 0 FOR DEFAULTS                  
*   5  TSNFFSIZ   FSIZE )(IN RECORDS FROM ALLOT, ZEROED BY FINDDIR              
*                 IF ZERO AT ENTRY, REQUIRED SIZE IS IN TSNFSECT                
*   6  TSNFBOT    SPACE FOR FILE'S BOT  )(  THESE ARE FILLED-IN IN              
*   7  TSNFEOT    SPACE FOR FILE'S EOT  )(  DURING ALLOT IN 'FINDDIR'           
*   8  TSNFXTNT   EXTENT NUMBER: INITIALIZED TO ZERO                            
*   9  TSNFESIZ   EXTENT SIZE )(IN RECS FROM ALLOT, TO SECTS BY FINDDIR         
*  10  TSNFACT1   ACCOUNT NAME, PART 1  )(  THESE WORDS ARE OPTIONAL AND        
*  11  TSNFACT2   ACCOUNT NAME, PART 2  )(  ARE UNUSED IF NO ACCOUNTS           
*                                                                               
*        TEMP CELLS FOR USE BY FINDDIR IN ALLOTING                              
*                                                                               
*                 ONCE AREA IS DETERMINED:                                      
*  12  TSNFSECT   NUMBER OF SECTORS NEEDED FOR THE NEW FILE                     
*  13  TSDFSECT   NUMBER OF SECTORS IN 'BEST FIT' DELETED FILE                  
*  14  TSDFADD    SECTOR NUMBER OF DIRECTORY WITH 'BEST FIT' ENTRY              
*  15  TSDFINDX   WORD INDEX INTO SECTOR OF 'BEST FIT' ENTRY                    
*                                                                               
*                 FOR A PUBLIC FILE (AREA INDETERMINATE):                       
*  13  TSDFSECT   FLAG FOR BIG ENUF HOLE IN CURRENT AREA (BYTE 0)               
*  13  TSDFSECT   TOTAL NR OF FREE SECTORS IN CURRENT AREA (BYTES 1-3)          
*  14  TSBESTA    AREA INDEX FOR BEST PUBLIC AREA                               
*  15  TSBESTSZ   TOTAL FREE SPACE IN BEST AREA IN KBYTES                       
         PAGE                                                                   
         SPACE    3                                                             
FINDDIR  RES      0         FIND FILE IN DIRECTORY OF AREA IN R6                
         LI,R9    0                 SET LOOKING FOR EXTENT 0                    
*                                                                               
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        ALTERNATE ENTRY TO FINDDIR FOR A SPECIFIED EXTENT OF A FILE            
*                                                                               
*        ENTRY IS THE SAME AS FOR FINDDIR, EXCEPT                               
*        R9       EXTENT NR                                                     
*                                                                               
FINDDIRX RES      0                 FIND FILE, EXTENT N, IN DIRECTORY           
         PUSH     4,R0              SAVE R0-R3                                  
         PUSH     R6                SAVE AREA INDEX (RESTORE IF ERROR)          
         PUSH     R8                SAVE LINK                                   
*                                                                               
         PUSH     R15               SAVE RENT:D                                 
         BAL,R5   FINDBB            GET A  BLOCKING BUFFER WHILE R1-R3          
         B        FDIRER55          STILL VALID; NONE AVAIL: GIVE ERROR         
*                                                                               
         LD,R2    R10               SHUFFLE REGS.  SAVE ACNT NAME               
         LW,R11   R9                EXTENT NR                                   
         LW,R10   R15               COPY ADDR OF BBCW                           
         LW,R9    R6                SET PUBLIC/SPECIFIED FLAG                   
         BLZ      FINDIR75          B IF PUBLIC AREAS SEARCH                    
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        PROCESS AN AREA DIRECTORY                                              
*                                                                               
*        REGISTERS CONTAIN                                                      
*        R2, R3   ACCOUNT NAME                                                  
*        R6       AREA INDEX                                                    
*        R7       TSPACE ADDRESS (ALLOT)  OR ZERO (FIND)                        
*        R9       -1 (PUBLIC SEARCH) OR AREA INDEX (SPECIFIED AREA)             
*        R10      BLOCKING BUFFER CONTROL WORD ADDRESS                          
*        R11      EXTENT NR                                                     
*        R12, R13 FILE NAME                                                     
*                                                                               
FINDIR1  RES      0                                                             
         LB,R0    MDFLAG,R6         GET AREA FLAGS                              
         CI,R0    ALLOC                                                         
         BAZ      FDIRER70          B IF AREA IS NOT ALLOCATED                  
         LI,R14   0                 REL ADDR OF 1ST DIRECTORY SECTOR            
         CI,R7    0                                                             
         BE       FINDIR2           B IF NOT AN ALLOT                           
*                                                                               
         STW,R14  TSDFSECT,R7       RESET BEST SPACE EVALUATOR:                 
*                                   FOR PUBLIC SEARCH, NR OF                    
*                                   AVAILABLE SECTORS IN CURRENT AREA.          
*                                   FOR SPECIFIC AREA, SIZE OF SMALLEST         
*                                   ADEQUATE DELETED FILE.                      
*                                                                               
         LW,R1    TSNFFSIZ,R7       GET NR OF RECORDS TO ALLOT                  
         BEZ      FINDIR2           B IF ZERO (ASSUME SECTORS GIVEN)            
         BAL,R8   FDIRNSEC          FIND NR SECS FOR GIVEN NR RECS              
         STW,R5   TSNFSECT,R7       SAVE NR SECTORS NEEDED                      
         PAGE                                                                   
         SPACE    2                                                             
*        PROCESS A DIRECTORY SECTOR                                             
*                                                                               
*        IN ADDITION TO ABOVE, REGISTERS CONTAIN                                
*        R14      SECTOR NUMBER TO READ (REL TO AREA)                           
*                                                                               
FINDIR2  RES      0         READ DIRE SECTOR (R14)                              
         PULL     R15               RESTORE REENTRANCE COUNT                    
         PUSH     R15                                                           
         BAL,R8   READDIR           READ THE SECTOR                             
         B        FDIRER              ERROR OF SOME SORT: RETURN TYC            
*                                                                               
         LI,R4    X'1FFFF'          GET ADDRESS OF BLOCKING BUFFER              
         AND,R4   *R10              (OR ADDRESS OF THE DIRE SECTOR)             
         LCI      2                                                             
         LM,R0    DIREIDW1,R4       GET DIRECTORY VALIDATION WORDS              
         CD,R0    DIRECODE                                                      
         BE       FINDIR2A          B IF VALIDATION WORDS OK                    
*                                                                               
         CI,R14   0                                                             
*        NONSTANDARD DIRECTORY PERMITTED ONLY ON EMPTY AREA                     
         BNE      FDIRER75          B IF NOT FIRST DIRECTORY SECTOR             
         CD,R0    ZEROS                                                         
         BNE      FDIRER75          B IF NOT ZEROED DIRECTORY                   
         B        FINDIR26          AREA IS EMPTY                               
*                                                                               
FINDIR2A RES      0                                                             
         LW,R0    DIREINFO,R4                                                   
         BEZ      FINDIR26          B IF INITIATED BUT EMPTY SECTOR             
         AI,R4    DIRELHDR          POINT AT FIRST ENTRY                        
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        PROCESS A DIRECTORY ENTRY                                              
*                                                                               
*        R4       ADDRESS OF NEXT ENTRY IN DIRECTORY SECTOR                     
*                                                                               
*                                                                               
FINDIR4  RES      0         TEST IF AT END OF SECTOR; TEST NEXT ENTRY           
         LW,R5    *R10              GET BUFFER ADDRESS                          
         AW,R5    DIREINFO,R5       ADDRESS OF INFO END +1                      
         AND,R5   X1FFFF                                                        
         CW,R4    R5                ARE WE PAST END                             
         BGE      FINDIR20            YES, SEE IF ANOTHER DIRE SECTOR           
*                                                                               
         CW,R13   DIRENAM2,R4                                                   
         BNE      FINDIR10          B IF NAME WORD 2 DIFFERS                    
         CW,R12   DIRENAM1,R4                                                   
         DO       #SYMB                                                         
         BNE      FINDIR8           B IF WORD 1 DIFFERS BUT 2 MATCHES           
         ELSE                       #SYMB                                       
         BNE      FINDIR10          B IF WORD 1 DIFFERS                         
         FIN                        #SYMB                                       
*                                                                               
         CW,R11   DIREXTNT,R4       CORRECT EXTENT OF THE FILE ?                
         BNE      FINDIR10            NO, CANNOT BE CORRECT FILE                
*                                                                               
         DO       #DFACNT        IF ACCOUNT FILES ARE PERMITTED...              
         LI,R1    X'FF'                                                         
         AND,R1   DIRELEN,R4        GET ENTRY LENGTH                            
          CI,R1    DIRESIZE         SPACE IN ENTRY FOR ACCOUNT NAME ?           
          BLE      FINDIR6            NO, MUST BE LOOKING FOR SYS ACNT          
*                                                                               
          CW,R2    DIREACT1,R4      YES, ARE FILES IN SAME ACCOUNT ?            
          BNE      FINDIR10           NO, NOT SAME FILE                         
          CW,R3    DIREACT2,R4                                                  
          BNE      FINDIR10                                                     
          B        FDIRFNDP           YES, WE HAVE FOUND THE SAME FILE          
*                                                                               
FINDIR6   RES      0         DESIRED FILE MUST BE IN SYSTEM ACCOUNT             
          CD,R2    SYSACNT          IS FILE TO BE IN SYSTEM ACCOUNT?            
          BNE      FINDIR10         NO, TEST NEXT FILE                          
         FIN      #DFACNT                                                       
*                                                                               
          B        FDIRFNDP                                                     
*                                                                               
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        SPECIAL COMPARISON FOR SYMBIONT FILE NAMES,                            
*        WHICH SOMETIMES MUST MATCH WHEN FIRST TWO                              
*        CHARACTERS DIFER.                                                      
*                                                                               
        DO       #SYMB                                                          
FINDIR8  RES      0         TEST IF SEARCHING FOR A SYMBIONT FILE               
         LH,R0    MDNAME,R6         GET AREA'S NAME                             
         AND,R0   M16                                                           
         CI,R0    KIS               IS IT A SYMBIONT AREA?  'IS' ?              
         BE       %+3                 YES, A SYMBIONT FILE                      
         CI,R0    KOS               OR 'OS' ?                                   
         BNE      FINDIR10            NO, NORMAL FILE IN NORMAL AREA            
*                                                                               
*   THE AREA IS A SYMBIONT AREA. TEST IF THE SEARCH IS FOR THE                  
*   FIRST FILE ALLOCATED FOR A JOB ( EXTENSION 0).                              
*    THIS TYPE OF SEARCH IS INDICATED BY PASSING A FILE NAME WITH THE           
*   FIRST TWO CHARACTERS BLANKS I.E. '  JJJ000'                                 
         LH,R0    R12               ARE THE 1ST TWO CHARACTERS OF THE           
         CH,R0    BLANKS            FILE NAME BLANKS ?                          
         BNE      FINDIR10            NO, THIS IS A STANDARD SEARCH             
*        LAST FOUR CHARACTERS OF NAME MATCH BY PRIOR TEST                       
*   SEE IF FILE NAME MATCHES IN REMAINING TWO CHARACTERS                        
         LW,R0    R12               GET FIRST WORD OF NAME                      
         LI,R1    X'FFFF'           COMPARISON MASK                             
         CS,R0    DIRENAM1,R4       DO NAME BYTES 2 AND 3 MATCH                 
         BE       FDIRFNDP            YES, FOUND THE FILE WE WANTED             
         FIN                        #SYMB                                       
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        NON-MATCHING DIRECTORY ENTRY FOUND.                                    
*        IF ALLOTTING, EVALUATE DELETED ENTRIES FOR BEST-ALLOT                  
*        SPACE SELECTION                                                        
*                                                                               
FINDIR10 RES      0                                                             
         CI,R7    0                                                             
         BE       FINDIR18          B IF NOT ALLOTTING                          
         LCI      2                                                             
         LM,R0    DIRENAM1,R4       GET DIRECTORY FILE NAME                     
         CD,R0    ZEROS             IS THIS A DELETED FILE ENTRY ?              
         BNE      FINDIR18            NO, JUST SKIP OVER IT                     
         LW,R15   DIREEOT,R4        GET NUMBER OF SECTORS USED BY               
         SW,R15   DIREBOT,R4        THE DELETED ENTRY                           
         AI,R15   1                                                             
         CI,R9    0                                                             
         BGE      FINDIR15          B IF NOT A PUBLIC AREA SEARCH               
*                                                                               
*        FOR PUBLIC AREA SEARCH, ACCUMULATE DELETED SPACE COUNT                 
*                                                                               
         AWM,R15  TSDFSECT,R7                                                   
         CW,R15   TSNFSECT,R7                                                   
         BL       FINDIR18          B IF HOLE ISN'T BIG ENUF                    
         LW,R1    Y01                                                           
         STS,R1   TSDFSECT,R7       SET FLAG FOR BIG ENUF HOLE FOUND            
         B        FINDIR18                                                      
*                                                                               
*        FOR SPECIFIED AREA FIND SMALLEST ADEQUATE DELETED FILE                 
*        SPACE AND ITS DIRECTORY ENTRY                                          
*                                                                               
FINDIR15 RES      0                                                             
         CW,R15   TSNFSECT,R7       WILL NEW FILE FIT IN HOLE AT ALL ?          
         BL       FINDIR18            NO, TOO SMALL; SKIP ENTRY                 
*                                                                               
         LW,R0    TSDFSECT,R7       IS THIS FIRST USABLE DELETED FILE ?         
         BEZ      FINDIR16            YES, SET IT AS BEST FIT SO FAR            
*                                                                               
         CW,R15   R0                IS IT BETTER FIT THAN PREVIOUS ?            
         BGE      FINDIR18            NO, KEEP THE PREVIOUS AS BEST             
*                                                                               
FINDIR16 RES      0         NEW BEST FIT DELETED ENTRY FOUND. SAVE LOC          
         STW,R15  TSDFSECT,R7       SAVE ITS SIZE                               
         STW,R14  TSDFADD,R7        SAVE SECTOR ADDRESS                         
         LW,R0    R4                COMPUTE AND SAVE INDEX WITHIN THE           
         LW,R15   *R10              SECTOR OF THE ENTRY                         
         AND,R15  M17                                                           
         SW,R0    R15                                                           
         STW,R0   TSDFINDX,R7       FOR FAST ACCESS IF WE USE IT                
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        DONE WITH A DIRECTORY ENTRY                                            
*                                                                               
FINDIR18 RES      0                                                             
         LI,R0    X'FF'                                                         
         AND,R0   DIRELEN,R4        GET ENTRY LENGTH                            
         AW,R4    R0                ADD IT TO ENTRY POINTER (NEXT ENTRY)        
         B        FINDIR4                                                       
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        DONE WITH A DIRECTORY SECTOR                                           
*                                                                               
FINDIR20 RES      0         AT END OF CURRENT SECTOR. TEST IF MORE              
         LI,R4    X'1FFFF'          POINT AT START OF DIRECTORY AGAIN           
         AND,R4   *R10              TO ACCESS DIRE CONTROL WORDS                
         LW,R0    DIREINFO,R4       IS DIRECTORY CONTINUED FLAG SET ?           
         BGEZ     FINDIR26            NO, SEARCH COMPLETE: TEST ALLOCATE        
*                                                                               
         LW,R14   DIRENEXT,R4       GET ADDRESS OF NEXT DIRE SECTOR             
         B        FINDIR2           GO READ AND SEARCH NEXT SECTOR              
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        DONE WITH AN AREA DIRECTORY                                            
*                                                                               
*        IF PUBLIC AREA SEARCH:                                                 
*        LOOK FOR ANOTHER PUBLIC AREA.                                          
*        IF SPECIFIED AREA SEARCH:                                              
*        FILE HAS NOT BEEN FOUND                                                
*                                                                               
FINDIR26 RES      0         DECIDE TYPE OF CALL AND ACTION                      
         CI,R9    0                                                             
         BL       FINDIR70          B IF PUBLIC AREA SEARCH                     
         CI,R7    0                 WAS CALL FOR 'FIND A FILE' ?                
         BE       FDIRER03            YES, NOT FOUND: REPORT ERROR 03           
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        ALLOT A NEW FILE                                                       
*                                                                               
*        REGISTERS:                                                             
*                                                                               
*        R6       MD INDEX                                                      
*        R7       TSPACE POINTER (ADDR OF FILE'S PROTOTYPE ENTRY)               
*        R10      BBCW FOR BB HOLDING LAST DIRECTORY SECTOR                     
*        R14      RELATIVE SECTOR ADDRESS OF LAST DIRECTORY SECTOR              
*                                                                               
         LI,R1    0                                                             
         XW,R1    TSNFFSIZ,R7       GET AND RESET NR RECS IN FILE               
         BEZ      FINDIR27          B IF SIZE WAS IN SECTORS AT ENTRY           
         LW,R1    TSNFESIZ,R7       GET ESIZE IN RECS                           
         BEZ      %+3               B IF NOT AN EXTENSIBLE FILE                 
         BAL,R8   FDIRNSEC          CONVERT ESIZE TO SECTORS                    
         STW,R5   TSNFESIZ,R7       SAVE IN DIRECTORY ENTRY                     
         BAL,R8   FDIRGRSZ          GET SECTOR/GRAN/REC DEFAULTS                
         STW,R5   TSNFGRSZ,R7       SET GSIZE/RSIZE DEFAULTS                    
FINDIR27 RES      0                                                             
         LI,R4    X'1FFFF'                                                      
         AND,R4   *R10              SET R4 TO BUFFER ADDRESS                    
         LI,R15   X'FF'                                                         
         AND,R15  TSNFLEN,R7        GET LENGTH OF NEW ENTRY                     
         LW,R1    DIREINFO,R4       GET CURRENT LENGTH OF INFO IN DIRE          
         BNEZ     %+3               B IF DIRECTORY NOT EMPTY                    
         BAL,R8   FDIRINIT          INITIALIZE DIRECTORY                        
         LI,R1    DIRELHDR          CURRENT LGTH OF INFO IN DIRECTORY           
         AW,R15   R1                ADD CURRENT LGTH TO NEW ENTRY LGTH          
         LB,R1    MDDISCI,R6        POINT AT WORDS/SECTOR FOR DISC              
         CH,R15   DISCNWPS,R1       WILL NEW ENTRY FIT IN THE SECTOR ?          
         BLE      FINDIR28          B IF YES                                    
         LW,R0    TSDFSECT,R7       CHECK FOR USABLE DELETED ENTRY              
         BNEZ     FINDIR40          B IF THERE IS ONE                           
         B        FINDIR50          OTHERWISE, ADD A NEW DIRE SECT              
*                                                                               
*                           WILL FILE FIT IN SPACE REMAINING IN AREA            
FINDIR28 RES      0                                                             
         LW,R1    MDEOA,R6          CALCULATE SIZE OF THE AREA FOR              
         SW,R1    MDBOA,R6          OVERFLOW TEST.                              
         AI,R1    +1                SIZE = END - BEGIN + 1                      
*                                                                               
*                           COMPUTE BOT, EOT FOR FILE AND TEST IF ROOM          
         LW,R8    DIRENEXT,R4       GET NEXT AVAILABLE SECTOR = BOT             
         LW,R9    R8                COPY AND COMPUTE NEW NEXT                   
         AW,R9    TSNFSECT,R7       EOT FOR FILE                                
         AI,R9    -1                                                            
         CW,R9    R1                WILL FILE FIT IN SPACE REMAINING ?          
         BL       FINDIR30          B IF YES                                    
         LW,R0    TSDFSECT,R7       CHECK FOR USABLE DELETED ENTRY              
         BNEZ     FINDIR40          B IF THERE IS ONE                           
         B        FDIRER72          OTHERWISE REPORT NO SPACE                   
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        PUT FILE AT AREA END, DIRECTORY ENTRY AT DIRECTORY END                 
*                                                                               
*        R4       DIRECTORY SECTOR BUFFER ADDRESS                               
*        R6       AREA INDEX                                                    
*        R7       ALLOT TSPACE POINTER                                          
*        R8       FILE BOT                                                      
*        R9       FILE EOT                                                      
*        R10      BBCW                                                          
*        R14      DIRECTORY SECTOR NR                                           
*        R15      DIRECTORY SECTOR NEW FIRST UNUSED WORD                        
*                                                                               
FINDIR30 RES      0                                                             
*                                                                               
         STW,R8   TSNFBOT,R7        SET BOT, EOT FOR NEW FILE IN ITS            
         STW,R9   TSNFEOT,R7        PROTOTYPE IN TSPACE                         
         XW,R15   DIREINFO,R4       SAVE NEW LENGTH OF DIRE INFO                
         AI,R9    1                 SET NEW NEXT AVAILABLE SECTOR               
         STW,R9   DIRENEXT,R4       FILE'S EOT+1                                
         AW,R4    R15               POINT AT (SOON TO BE) ENTRY IN DIRE         
         PAGE                                                                   
*                                                                               
*        REGISTERS:                                                             
*                                                                               
*        R4       ADDRESS OF NEW ENTRY IN DIRECTORY SECTOR                      
*        R6       MD INDEX                                                      
*        R7       TSPACE POINTER, WITH NEW ENTRY COMPLETED                      
*        R10      BBCW                                                          
*        R14      DIRECTORY SECTOR NUMBER                                       
*                                                                               
*   MOVE DIRECTORY ENTRY TO DIRECTORY SECTOR                                    
*                                                                               
FINDIR32 RES      0                                                             
         AI,R4    -1                ADJUST POSITION FOR BDR LOOP                
         LW,R1    TSNFLEN,R7        GET NUMBER OF WORDS TO MOVE                 
         AND,R1   M8                                                            
*                                                                               
FINDIR34 RES      0         MOVE ENTRY                                          
         LW,R0    *R7,R1                                                        
         STW,R0   *R4,R1                                                        
         BDR,R1   FINDIR34                                                      
         LI,R0    0                 ZERO TWO NEW H00 WORDS                      
         STW,R0   DIREUSEC+1,R4      CORRECT FOR R4                             
         STW,R0   DIREDATE+1,R4                                                 
*                                                                               
*                                                                               
FINDIR36  RES     0          WRITE THE UPDATED DIRECTORY                        
         PULL     R15               RECOVER REENTRANCE COUNT                    
         PUSH     R15                                                           
         AI,R4    1                 POINT R4 AT ENTRY IN BUFFER AGAIN           
         BAL,R8   WRITDIR           WRITE DIRECTORY SECTOR                      
         B        FDIRER              WRITE ERROR                               
         B        FDIRFND           DONE, EXIT                                  
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        EITHER THE FILE WONT FIT AT THE END OF THE AREA,                       
*        OR THE DIRECTORY ENTRY WONT FIT AT THE END OF                          
*        THE DIRECTORY, BUT THERE IS A REUSABLE DELETED ENTRY.                  
*        PUT THE FILE AND DIRECTORY ENTRY IN A DELETED FILE SPACE               
*                                                                               
*        REGISTERS:                                                             
*                                                                               
*        R4       ADDRESS OF BEGIN OF DIRECTORY BUFFER                          
*        R6       MD INDEX                                                      
*        R7       TSPACE POINTER                                                
*        R10      BBCW FOR BB HOLDING LAST DIRECTORY SECTOR                     
*        R14      ADDRESS OF CURRENT DIRECTORY SECTOR                           
*                                                                               
*                                                                               
FINDIR40 RES      0                                                             
         CW,R14   TSDFADD,R7        IS THE SECTOR ALREADY IN BUFFER             
         BE       FINDIR44            YES, NOT NECESSARY TO READ IT IN          
*                                                                               
         LW,R14   TSDFADD,R7        NO, READ THE SECTOR                         
         PULL     R15               RECOVER REENTRANCE COUNT                    
         PUSH     R15                                                           
         BAL,R8   READDIR           READ DIRECTORY SECTOR                       
         B        FDIRER              REPORT SOME SORT OF READ ERROR            
*                                                                               
FINDIR44 RES      0          DIRECTORY SECTOR IN CORE: FORM NEW ENTRY           
         LI,R4    X'1FFFF'          GET ADDRESS OF BUFFER AND                   
         AND,R4   *R10              FORM INDEX TO DELETED ENTRY AS              
         AW,R4    TSDFINDX,R7       SAVED WHEN FOUND IN LOOP ABOVE.             
         LW,R0    DIREBOT,R4        SET NEW FILE'S BOT = OLD FILE'S             
         STW,R0   TSNFBOT,R7                                                    
         AW,R0    TSNFSECT,R7       AND COMPUTE NEW EOT.  ANY UNUSED            
         AI,R0    -1                SPACE FROM OLD FILE IS LOST UNTIL           
         STW,R0   TSNFEOT,R7        A 'RADEDIT' SQUEEZE IS DONE                 
         B        FINDIR32                                                      
         PAGE                                                                   
         SPACE    2                                                             
*        THERE IS NOT ENOUGH ROOM IN THE LAST DIRECTORY SECTOR                  
*        FOR A NEW ENTRY, AND THERE WERE NO DELETED ENTRIES TO                  
*        BE REUSED.                                                             
*                                                                               
*        A NEW DIRECTORY SECTOR MUST BE CREATED. THERE MUST BE ROOM             
*        IN THE AREA FOR THE FILE AND THE DIRECTORY SECTOR.                     
*                                                                               
*        REGISTERS:                                                             
*                                                                               
*        R4       ADDRESS OF BEGIN OF DIRECTORY BUFFER                          
*        R6       MD INDEX                                                      
*        R7       TSPACE POINTER                                                
*        R10      BBCW FOR BB HOLDING LAST DIRECTORY SECTOR                     
*        R14      ADDRESS OF CURRENT DIRECTORY SECTOR                           
*                                                                               
*                                                                               
FINDIR50 RES      0                                                             
         LW,R5    MDEOA,R6          END OF AREA                                 
         SW,R5    MDBOA,R6          - BEGIN OF AREA                             
         AI,R5    +1                +1 = NUMBER OF SECTORS IN THE AREA          
*                                                                               
         LW,R0    DIRENEXT,R4       IS THERE ROOM AT END OF AREA FOR A          
         AW,R0    TSNFSECT,R7       DIRECTORY SECTOR AND THE FILE ?             
         CW,R0    R5                (FREE SPACE + LEN + 1 < SIZE ?)             
         BGE      FDIRER72            NO, ERROR: NOT ENOUGH SPACE               
*                                                                               
*                           SPACE AVAILABLE AT END OF AREA: ALLOCATE.           
         STW,R14  TSDFADD,R7        SAVE CURRENT SECTOR ADDR                    
*                                                                               
*        CONSTRUCT A NEW DIRECTORY SECTOR                                       
*                                                                               
         LW,R14   DIRENEXT,R4       GET NEXT AVAILABLE SECTOR ADDR              
         BAL,R8   FDIRINIT          BUILD AN EMPTY DIRE SECT                    
         PULL     R15               GET REENTRANCE COUNT                        
         PUSH     R15                                                           
         BAL,R8   WRITDIR           WRITE NEW DIRECTORY SECTOR                  
         B        FDIRER            ERROR RETURN                                
         PULL     R15               GET REENTRACE COUNT                         
         AI,R15   1                 ACCOUNT FOR THE WRITE JUST DONE             
         PUSH     R15                                                           
*                                                                               
*        LINK NEW DIRECTORY SECTOR TO OLD ONE                                   
*                                                                               
         XW,R14   TSDFADD,R7        GET OLD LAST SECT ADDR, SAVE NEW            
         BAL,R8   READDIR           READ OLD LAST SECTOR OF DERECTORY           
         B        FDIRER            ERROR RETURN                                
         LW,R1    Y8                                                            
         STS,R1   DIREINFO,R4       SET 'NOT LAST' FLAG IN DIRE SECTOR          
         BAL,R8   WRITDIR           REWRITE FORMER LAST SECTOR                  
         B        FDIRER            ERROR RETURN                                
         PULL     R15               GET REENTRANCE COUNT                        
         AI,R15   1                 ACCOUNT FOR THE WRITE JUST DONE             
         PUSH     R15                                                           
*                                                                               
*        GET NEW LAST SECTOR INTO BUFFER TO ADD NEW ENTRY                       
*                                                                               
         LW,R14   TSDFADD,R7        RECOVER NEW LAST SECTOR ADDR                
         BAL,R8   READDIR           READ NEW LAST SECTOR                        
         B        FDIRER            ERROR RETURN                                
         B        FINDIR27          B TO PUT NEW ENTRY IN NEW SECTOR            
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        PUBLIC AREA SEARCH LOOP CONTROL CODE                                   
*                                                                               
*        END OF LOOP: COME HERE AFTER EACH PUBLIC AREA IS SEARCHED              
*                                                                               
FINDIR70 RES      0                                                             
         CI,R7    0                                                             
         BE       FINDIR77          B IF NOT ALLOTTING                          
*                                                                               
*        ACCUMULATE UNUSED SPACE AT END OF AREA                                 
*                                                                               
         LW,R1    MDEOA,R6                                                      
         SW,R1    MDBOA,R6                                                      
         SW,R1    DIRENEXT,R4                                                   
         AI,R1    1                 TOTAL SPACE AT END IN SECTORS               
         LW,R0    TSDFSECT,R7       TOTAL DELETED ENTRY SPACE                   
         AW,R0    R1                TOTAL AVAILABLE SPACE W/O SQUEEZE           
         CW,R1    TSNFSECT,R7                                                   
         BLE      %+2               B IF END SPACE TOO SMALL                    
*                                   FOR FILE + 1 DIRECTORY SECTOR               
         OR,R0    Y01               SET FLAG FOR BIG ENUF HOLE FOUND            
*                                                                               
*        SEE IF THIS IS THE BEST AREA SO FAR FOUND                              
*                                                                               
         CW,R0    Y01                                                           
         BAZ      FINDIR77          B IF NO HOLE BIG ENUF                       
         AND,R0   XFFFFFF           TRIM TOTAL SECTORS                          
         LB,R1    MDDISCI,R6        GET DISC TYPE INDEX                         
         LH,R1    DISCNWPS,R1       GET WORDS PER SECTOR                        
         MW,R1    R0                GET WORDS AVAILABLE                         
         SLS,R1   -8                CONVERT TO KBYTES                           
         CW,R1    TSBESTSZ,R7                                                   
         BLE      FINDIR77          B IF NOT THE BEST AREA                      
         STW,R6   TSBESTA,R7        SAVE INDEX AS BEST AREA                     
         STW,R1   TSBESTSZ,R7       SAVE SIZE FOR LATER COMPARES                
         B        FINDIR77                                                      
         PAGE                                                                   
*                                                                               
*        INITIALIZE PUBLIC AREA SEARCH LOOP                                     
*                                                                               
FINDIR75 RES      0                                                             
         LI,R6    -1                INDEX TO NEXT AREA TO CONSIDER - 1          
         LI,R0    0                                                             
         STW,R0   TSBESTSZ,R7       ZERO BEST AREA SIZE (IE, NOT FOUND)         
         PAGE                                                                   
*                                                                               
*        CONTINUE PUBLIC AREA SEARCH LOOP                                       
*                                                                               
FINDIR77 RES      0                                                             
         AI,R6    1                 INCREMENT AREA INDEX                        
         CW,R6    K:NUMDA                                                       
         BG       FINDIR79          B IF PAST END OF MASTER DIRECTORY           
         LB,R0    MDFLAG,R6                                                     
         CI,R0    X'80'                                                         
         BAZ      FINDIR77          B IF "NOT ALLOCATED" AREA                   
         AND,R0   M3                R0= AREA TYPE                               
         BNEZ     FINDIR77          B IF NOT PUBLIC                             
         LB,R1    MDDCTI,R6         GET DEVICE INDEX FOR AREA                   
         LB,R1    DCTRBM,R1                                                     
         CI,R1    2                                                             
         BANZ     FINDIR77          B IF DEVICE IS BEING DEMOUNTED              
         B        FINDIR1           SEARCH THE AREA                             
         PAGE                                                                   
*                                                                               
*        END OF PUBLIC AREA SEARCH                                              
*                                                                               
FINDIR79 RES      0                                                             
         CI,R7    0                                                             
         BE       FDIRER03          B IF NOT ALLOTTING                          
         LW,R6    TSBESTSZ,R7                                                   
         BEZ      FDIRER72          B IF NO SPACE FOUND                         
         LW,R6    TSBESTA,R7        GET AREA INDEX OF BEST AREA                 
         LW,R9    R6                SPECIFIC AREA SEARCH THIS TIME              
         B        FINDIR1           FIND BEST SPACE IN BEST AREA                
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        SUBROUTINE TO CONVERT NR OF RECORDS TO NR OF SECTORS                   
*                                                                               
*        CALL:    BAL,R8  FDIRNSEC                                              
*                                                                               
*        INPUT:   R1=NR OF RECORDS NEEDED                                       
*                 R6=MASTER IRECTORY INDEX OF AREA TO CONSIDER                  
*                 R7=POINTER TO ALLOT TSPACE                                    
*                                                                               
*        RETURN:  R5= NUMBER OF SECTORS NEEDED                                  
*        R0, R1, R4 MAY BE ALTERED                                              
*                                                                               
FDIRNSEC RES      0                                                             
         PUSH     R8                SAVE LINK                                   
         BAL,R8   FDIRGRSZ          GET RECORD AND SECTOR SIZES                 
         PULL     R8                                                            
         AND,R5   M16                                                           
*                 R1=NR RECORDS                                                 
*                 R4=NR BYTES PER SECTOR                                        
*                 R5=NR BYTES PER RECORD                                        
*        THIS IS ADEQUATE FOR UNBLOCKED OR COMPRESSED FILES                     
         LW,R0    TSNFFLGS,R7       GET FLAGS                                   
         LB,R0    R0                                                            
         AND,R0   M2                EXTRACT FORMAT CODE                         
         CI,R0    BLKORG                                                        
         BNE      FDN20             B IF NOT BLOCKED                            
*                                                                               
*        DETERMINE NR OF BLOCKS NEEDED FOR BLOCKED FILE                         
         LI,R0    X'400'            BYTES PER BLOCK                             
         XW,R0    R5                                                            
         DW,R5    R0                RECS PER BLOCK IN R5                        
         CI,R5    1                                                             
         BG       %+3               B IF MORE THAN 1 REC/BLOCK                  
         LW,R5    R0                RESTORE BYTES/REC                           
         B        FDN20             TREAT AS UNBLOCKED                          
*                                                                               
         AW,R1    R5                                                            
         AI,R1    -1                                                            
         DW,R1    R5                NR OF BLOCKS NEEDED IN R1                   
         LI,R5    X'400'            BYTES PER BLOCK IN R5                       
*                                                                               
FDN20    RES      0                                                             
         AW,R5    R4                                                            
         AI,R5    -1                                                            
         DW,R5    R4                NR OF SECTORS PER UNIT IN R5                
         MW,R5    R1                NR OF SECTORS IN R5                         
         B        *R8                                                           
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        SUBROUTINE TO RETURN SECTOR SIZE, GRANULE SIZE, AND                    
*        RECORD SIZE, TAKING DEFAULTS INTO ACCOUNT                              
*                                                                               
*        CALL:    BAL,R8  FDIRGRSZ                                              
*                                                                               
*        INPUT:   R6=AREA INDEX                                                 
*                 R7=ALLOT TSPACE POINTER                                       
*                                                                               
*        RETURN:  R4=SECTOR SIZE IN BYTES                                       
*        R5 HW0=GRANULE SIZE IN BYTES                                           
*        R5 HW1=RECORD SIZE IN BYTES                                            
*                                                                               
FDIRGRSZ RES      0                                                             
         LB,R4    MDDISCI,R6        GET DISC TYPE INDEX                         
         LH,R4    DISCNWPS,R4       GET SECTOR SIZE IN WORDS                    
         SLS,R4   2                 SECTOR SIZE IN BYTES                        
         LW,R5    TSNFGRSZ,R7       SPECIFIED GSIZE, RSIZE                      
         CW,R5    YFFFF                                                         
         BANZ     %+2               B IF GSIZE SPECIFIED                        
         STH,R4   R5                SET GSIZE TO SECTOR SIZE                    
         CW,R5    XFFFF                                                         
         BANZ     *R8               RETURN IF RSIZE SPECIFIED                   
*                                   RSIZE MUST BE SPECIFIED AT THIS             
*                                   LEVEL FOR BLOCKED OR COMPRESSED FILES       
         SCS,R5   16                                                            
         STH,R5   R5                SET RSIZE TO GSIZE                          
         B        *R8                                                           
         PAGE                                                                   
         SPACE    2                                                             
*                                                                               
*        SUBROUTINE TO INITIALIZE A NEW DIRECTORY SECTOR                        
*                                                                               
*        CALL:    BAL,R8  FDIRINIT                                              
*                                                                               
*        INPUT:   R4=BUFFER ADDRESS                                             
*        R14=SECTOR ADDRESS FOR NEW SECTOR                                      
*             (FOLLOWING SECTOR BECOMES NEXT AVAILABLE SECTOR)                  
*                                                                               
*        MAY DESTROY R0, R1                                                     
*                                                                               
FDIRINIT RES      0                                                             
         LI,R1    255                                                           
         LI,R0    0                                                             
         STW,R0   *R4,R1            ZERO THE BUFFER                             
         BDR,R1   %-1                                                           
*                                                                               
         LI,R0    DIRELHDR                                                      
         STW,R0   DIREINFO,R4       LINK FLAG IS RESET,                         
*                                   INFORMATION LGTH IS HEADER ONLY             
         STW,R14  DIRENEXT,R4                                                   
         MTW,1    DIRENEXT,R4       NEXT AVAILABLE SECTOR IS THIS+1             
         LCI      2                                                             
         LM,R0    DIRECODE                                                      
         STM,R0   DIREIDW1,R4       SET VALIDATION CODE                         
         B        *R8                                                           
         PAGE                                                                   
*                                                                               
*   NORMAL EXITS FROM FINDDIR SUBROUTINE                                        
*                                                                               
FDIRFNDP RES      0          FILE ENTRY FOUND: ENTRY AT R4                      
         CI,R7    0                                                             
         BNE      FDIRER71          B IF TRYING TO ALLOT                        
*                                                                               
FDIRFND  RES      0                                                             
         PULL     R15               RESTORE REENTRANCE COUNT                    
         PULL     R8                RESTORE LINK                                
         PULL     R0                DISCARD AREA INDEX SAVED AT ENTRY           
         PULL     4,R0              RESTORE REGISTERS                           
         B        FBBXITOK          RETURN +2 (NORMAL)                          
*                                                                               
* PROCESS ERROR RETURNS                                                         
*                                                                               
FDIRER   RES      0         COMMON ERROR EXIT: RELEASE BUFFER                   
         PUSH     R6                SAVE R6                                     
         LW,R6    R10               R6= BBCW ADDRESS FOR RELADBUF               
         BAL,R11  RELADBUF          RELEASE THE BUFFER                          
         PULL     R6                                                            
*                                                                               
FDIRERX  RES      0         COMMON ERROR EXIT:  ERROR TYC IN R9                 
         PULL     R15               RESTORE REENTRANCE COUNT                    
         PULL     R8                RESTORE LINK REGISTER                       
         PULL     R6                RECOVER AREA INDEX FROM ENTRY               
         PULL     4,R0              RECOVER WORK REGISTERS                      
         B        FBBXITER          RETURN TO ERROR EXIT                        
*                                                                               
*                                                                               
FDIRER03 RES      0         FILE NOT IN DIRECTORY                               
         LI,R9    K3                ERROR TYC = FILE NON-EXIST                  
         B        FDIRER                                                        
*                                                                               
FDIRER55 RES      0         UNABLE TO GET BLOCKING BUFFER                       
         LI,R9    TYC55             SET ERROR TYC                               
         B        FDIRERX                                                       
*                                                                               
FDIRER70 RES      0         AREA NOT ALLOCATED ERROR                            
         LI,R9    TYC70             SET TYC CODE                                
         B        FDIRER           GO TO COMMON ERROR EXIT                      
*                                                                               
FDIRER71 RES      0         DUPLICATE FILE ERROR                                
         LI,R9    TYC71             DUPLICATE FILE NAME                         
         B        FDIRERX           RETURN ERROR, FILE ENTRY AT (R4)            
*                                                                               
FDIRER72 RES      0         NO SPACE AVAILABLE IN AREA FOR NEW FILE             
         LI,R9    TYC72             SPACE OVERFLOW                              
         B        FDIRER                                                        
*                                                                               
FDIRER75 RES      0         FILE DIRECTORY FORMAT ERROR                         
         LI,R9    TYC75             DIRECTORY FORMAT ERROR                      
         B        FDIRER                                                        
         PAGE                                                                   
***************************                                                     
*   READDIR AND WRITDIR   *                                                     
***************************                                                     
*                                                                               
*   ROUTINE TO READ OR WRITE A SPECIFIED DISC SECTOR                            
*                 IN PRACTICE, IT IS A DIRECTORY SECTOR                         
*                                                                               
*   AT ENTRY:                                                                   
*        R6       AREA INDEX                                                    
*        R8       LINK                                                          
*        R10      ADDRESS OF BBCW                                               
*        R14      RELATIVE SECTOR NUMBER TO READ OR WRITE                       
*        R15      REENTRANCE COUNT FROM RENT:D                                  
*                                                                               
*  AT EXIT:                                                                     
*        R8       LINK+1 IF NO ERRORS; LINK IF ANY ERRORS                       
*        R9       TYC CODE IF ANY ERRORS                                        
*                                                                               
*                                                                               
*   CALL:                                                                       
*        BAL,R8   READDIR                                                       
*        BAL,R8   WRITDIR                                                       
*                                                                               
*   EXITS:        LINK   IF ERRORS                                              
*                 LINK+1 IF NO ERROR                                            
*                                                                               
READDIR  RES      0         READ A SECTOR                                       
         PUSH     16,R0             SAVE ALL REGISTERS                          
         LI,R4    FCRRAD            SET FUNCTION CODE = READ                    
         B        RWDIR1                                                        
*                                                                               
WRITDIR  RES      0         WRITE A SECTOR                                      
         PUSH     16,R0             SAVE ALL REGISTERS                          
         LI,R4    FCWRAD            SET FUNCTION CODE = WRITE                   
*                                                                               
RWDIR1   RES      0                                                             
         LW,R10   *R10              SET  BA(BLOCKING BUFFER) FROM BBCW          
         AND,R10  M17                                                           
         SLS,R10  2                                                             
         BAL,R5   CVTAREA           GET SEEK ADDRESS IN R12                     
         B        RWDIR9              ERROR OF SOME SORT: REPORT IT             
         LB,R5    MDDISCI,R6        GET SECTOR SIZE                             
         LH,R11   DISCNWPS,R5                                                   
         SLS,R11  2                 AND CONVERT TO BYTES                        
         LW,R8    CUPCOD4           CLEANUP CODE = DO NOT POST FPT/DCB          
         LI,R13   PRIODIR           PRIORITY = READ/WRITE DIRECTORY             
         BAL,R5   CALLQP            DO THE READ/WRITE                           
         B        RWDIR6              ERROR, R6=TYC                             
*                                                                               
RWDIR3   RES      0         RETURN TO SUCCESSFUL EXIT                           
         PULL     16,R0             RECOVER THE REGISTERS                       
         B        FBBXITOK          AND RETURN OK                               
*                                                                               
*   ERROR PROCESSING FOR READDIR/WRITDIR                                        
*                                                                               
RWDIR6   RES      0         ERROR EXIT: SET TYC CODE                            
         PULL     9,R7              RESTORE LAST HALF OF PUSH; SAVE R6          
         LW,R9    R6                MOVE ERROR TYC TO RETURN REGISTER           
         PULL     7,R0              RECOVER REST OF REGISTERS                   
         B        FBBXITER          AND RETURN WITH ERROR                       
*                                                                               
*                                                                               
RWDIR9   RES      0         ERROR FROM CVTAREA                                  
         LW,R0    R15               SAVE CVTAREA ERROR CODE                     
         PULL     15,R1             RECOVER MOST OF REGISTERS                   
         LW,R9    R0                SET ERROR IN CORRECT REGISTER               
         PULL     R0                GET LAST SAVED REGISTER                     
         B        FBBXITER          AND RETURN WITH AN ERROR                    
         OLAYEND                                                                
         END                                                                    
