         SYSTEM   SIG9P                                                         
         SYSTEM   OPTIONS                                                       
*   ENTRY POINTS                                                                
         DEF      RWEXT                                                         
         DEF      RWEXTSEQ                                                      
         DEF      RWEXTDIR                                                      
         DEF      FMGETEXT                                                      
*   EXIT POINTS                                                                 
         DEF      RWEXTSX                                                       
         DEF      RWEXTDX                                                       
         DEF      FMGETEX                                                       
         PSYS     0                                                             
OLAYFLAG EQU      'RWEX'                                                        
         SYSTEM   CPRMON                                                        
         TITLE    'ROUTINES TO HANDLE EXTENSIBLE FILES'                         
RWEXT    RES      0                                                             
*                                                                               
*                                                                               
*                                                                               
RWEXTERR CRASH    'RWEXT ERROR'                                                 
         TITLE    'RWEXTSEQ SUBROUTINE'                                         
**************                                                                  
*  RWEXTSEQ  *                                                                  
**************                                                                  
*                                                                               
*   ROUTINE CALLED WHEN AN EOD OR EOT IS ENCOUNTERED WHILE                      
*   SEQUENTIALLY READING OR WRITING A DISK FILE.                                
*                                                                               
*   WHEN READING AN EXTENSIBLE FILE, THE RFT WILL BE SET WITH                   
*   PARAMETERS FOR THE NEXT EXTENT IN SEQUENCE.                                 
*                                                                               
*   WHEN WRITING AN EXTENSIBLE FILE, THE NEXT EXTENT IN SEQUENCE                
*   WILL BE ALLOTTED THEN THE RFT WILL BE UPDATED APPROPRIATELY.                
*                                                                               
*   AT ENTRY:                                                                   
*        R1       FPT CODE                                                      
*        R2       DCB ADDRESS                                                   
*        R3       FPT ADDRESS                                                   
*        R7       RFT INDEX                                                     
*        R8       LINK                                                          
*                                                                               
*        EXITS:   +1    IF ERROR, R9=TYC                                        
*                 +2    IF FILE NOT EXTENSIBLE OR NEXT EXTENT NONEXIST          
*                 +3    IF NEXT EXTENT WAS FOUND/ALLOTTED                       
*                                                                               
*   ROUTINE PRESERVES:   R1-R3,R7,R9-R11                                        
*                                                                               
*                                                                               
RWEXTSEQ RES      0                                                             
         PUSH     4,R8              SAVE R8-R11                                 
         DISABLE                                                                
RWEXTS1  RES      0                                                             
         LW,R0    RFTESZ,R7         GET EXTENT SIZE                             
         BEZ      RWEXTS21          FILE NOT EXTENSIBLE, EXIT +2                
*   CLEANUP CURRENT BLOCKING BUFFER IF APPLICABLE.                              
         LW,R15   RFT17,R7          GET BBCW ADDRESS                            
         BEZ      RWEXTS2           NONE, CONTINUE                              
         LW,R12   *R15              R12= BLOCKING BUFFER CONTROL WORD           
         CB,R7    R12               IS BB TIED TO THIS RFT                      
         BNE      RWEXTS2           NO, DON'T WRITE IT                          
         CW,R12   Y008              HAS TH BB BEEN WRITTEN INTO                 
         BAZ      RWEXTS2           NO, BRANCH                                  
         ENABLE                                                                 
         BAL,R5   WBLOCK            YES, WRITE OUT THE BLOCK                    
         B        RWEXTS44           ERROR, R9=TYC                              
         DISABLE                                                                
RWEXTS2  RES      0                                                             
         LW,R15   RENT:D            GET REENTRANCE COUNT                        
         LH,R4    RFTE#,R7          GET CURRENT EXTENT AND                      
         LW,R5    RFT12,R7          RECORD # FOR REENT CHECKING.                
         CI,R1    K10               IS THIS A READ                              
         BNE      RWEXTS10          NO, PROCESS WRITE (EOT)                     
*                                                                               
*   HERE WE HAVE A READ REQUEST.                                                
*                                                                               
         LB,R0    RFT16,R7          GET FILE STATUS                             
         CI,R0    SEQWRT+DIRWRT     WAS THE FILE WRITTEN                        
         BANZ     RWEXTS21          YES, THIS IS A REAL EOD SINCE               
*                                    READER EXCEEDED WRITTEN DATA.              
*   SET UP CALL TO GET NEXT EXTENT.                                             
         ENABLE                                                                 
         LW,R9    R4                                                            
         AI,R9    1                 NUMBER OF EXTENT TO FIND                    
         BAL,R8   FMGETEXT          GO GET NEXT EXTENT INTO RFT                 
         B        RWEXTS18          ERROR, R9=TYC                               
*   READ THE FIRST BLOCK OF THIS EXTENT IF APPLICABLE                           
         LW,R15   RFT17,R7          GET BBCW                                    
         BEZ      RWEXTS6           NONE, EXIT                                  
         LB,R12   RFT7,R7           GET FLAGS                                   
         AND,R12  ORGMASK           R12= FILE ORGANIZATION                      
         BEZ      RWEXTS6           BRANCH IF UNBLOCKED ORG                     
         LW,R12   *R15              GET BLK BUFF CONTROL WORD                   
         BAL,R5   RBLOCK            READ THE BLOCK                              
         B        RWEXTS44           ERROR, R9=TYC                              
RWEXTS6  RES      0                                                             
         PULL     4,R8                                                          
         AI,R8    2                 RETURN NORMALLY (+3)                        
RWEXTSX  B        *R8                                                           
         SPACE 3                                                                
*                                                                               
*   WE HAVE A WRITE REQUEST.  ALLOT A NEW EXTENT.                               
*                                                                               
*   REGISTERS CONTAIN:                                                          
*        R1    FPT CODE                                                         
*        R2    DCB ADDRESS                                                      
*        R3    FPT ADDRESS                                                      
*        R4    CURRENT EXTENT NUMBER                                            
*        R5    CURRENT RECORD NUMBER                                            
*        R7    RFT INDEX                                                        
*        R15   REENTRANCE COUNTER                                               
*                                                                               
RWEXTS10 RES      0                                                             
         LW,R14   RFTESZ,R7         GET # OF SECTORS TO ALLOT                   
         ENABLE                                                                 
         BAL,R8   RWALLOT           DEFINE THE FILE                             
         B        RWEXTS40           ERROR, R9=TYC                              
         PULL     4,R8              CLEANUP STACK                               
         AI,R8    2                 TAKE NORMAL EXIT (+3)                       
         B        RWEXTSX           EXIT                                        
         SPACE 3                                                                
*                                                                               
*   ERROR PROCESSING FOR RWEXTSEQ SUBROUTINE                                    
*                                                                               
RWEXTS18 RES      0                                                             
         DISABLE                                                                
         CI,R9    TYC03             IS TYC= NONEXISTENT FILE                    
         BNE      RWEXTS40          NO, BRANCH                                  
RWEXTS21 RES      0                                                             
         ENABLE                                                                 
         PULL     4,R8              CLEANUP STACK                               
         AI,R8    1                 TAKE EOD/EOT EXIT (+2)                      
         B        RWEXTSX           EXIT                                        
*                                                                               
RWEXTS40 RES      0                                                             
         CI,R9    TYCREENT          WERE WE REENTERED                           
         BNE      RWEXTS44          NO, BRANCH                                  
         DISABLE                                                                
         CH,R4    RFTE#,R7          ARE WE IN THE ORIGINAL EXTENT               
         BNE      RWEXTS44          NO, REAL REENTRANCY                         
         CW,R5    RFT12,R7          ARE WE POSITIONED AT SAME RECORD            
         BE       RWEXTS1           YES, OK TO START OVER                       
*                                                                               
RWEXTS44 RES      0                                                             
         ENABLE                                                                 
         LW,R0    R9                SAVE TYC IN R0                              
         PULL     4,R8              CLEANUP STACK                               
         LW,R9    R0                R9 NOW CONTAINS TYC                         
         B        RWEXTSX           EXIT (+1)                                   
         TITLE    'RWEXTDIR SUBROUTINE'                                         
**************                                                                  
*  RWEXTDIR  *                                                                  
**************                                                                  
*                                                                               
*   ROUTINE CALLED WHEN AN EOT IS ENCOUNTERED WHILE READING                     
*   OR WRITING AN EXTENSIBLE DISK FILE IN THE DIRECT ACCESS MODE.               
*                                                                               
*   WHEN READING, AS MUCH DATA AS POSSIBLE IS READ FROM THE                     
*   CURRENT EXTENT.  THE NEXT EXTENT IN SEQUENCE IS THEN                        
*   OBTAINED AND APPROPRIATE PARAMETERS ARE SET INTO THE RFT.                   
*   IF THE NEW EXTENT CONTAINS SUFFICIENT DATA TO COMPLETE                      
*   THE READ REQUEST, THE SUBROUTINE RETURNS AND THE BALANCE                    
*   OF THE DATA IS READ IN THE NORMAL MANNER.  IF THERE IS                      
*   INSUFFICIENT DATA IN THE NEW EXTENT TO COMPLETE THE READ,                   
*   THE PROCESS CONTINUES AS DESCRIBED ABOVE.                                   
*                                                                               
*   WHEN WRITING, DATA IS WRITTEN TO THE END OF THE CURRENT                     
*   EXTENT.  THEN A NEW EXTENT IS ALLOTTED , THE RFT                            
*   APPROPRIATELY UPDATED, AND THE SUBROUTINE RETURNS TO                        
*   ALLOW THE REMAINDER OF THE DATA TO BE WRITTEN IN THE                        
*   NORMAL MANNER.  NOTE THAT IF THE EXTENTS ARE FIXED IN SIZE                  
*   ('FIX' OPTION), MORE THAN ONE EXTENT MAY BE ALLOTTED.  IF                   
*   THIS IS THE CASE, WRITES TO THE INTERMEDIATE EXTENTS ARE DONE               
*   WITH WAIT, THE SUBROUTINE RETURNING ONLY WHEN THE I/O CAN BE                
*   COMPLETED IN THE LAST EXTENT.                                               
*                                                                               
*   AT ENTRY:                                                                   
*        R1-R3    SAME AS AT ENTRY TO READ/WRITE                                
*        R4       NUMBER OF SECTORS PER GRANULE                                 
*        R7       RFT INDEX                                                     
*        R10,R11  BUFFER ADDRESS AND SIZE                                       
*        R13      1ST SECTOR OF I/O RELATIVE TO THE FILE                        
*        R14      NUMBER OF SECTORS IN THE USER RECORD                          
*                                                                               
*   EXITS: +1     ERROR, R9=TYC                                                 
*          +2     TRUE EOT CONDITION EXISTS                                     
*          +3     REQUIRED EXTENTS WERE FOUND/ALLOTTED;  I/O MAY                
*                 CONTINUE IN THE NORMAL MANNER.                                
*                                                                               
*   AT EXIT THE RFT IS UPDATED AND THE REGISTERS CONTAIN                        
*        R1-R3    SAME AS AT ENTRY TO SUBROUTINE                                
*        R7       RFT INDEX                                                     
*        R9       # OF SECTORS WHICH WILL BE ACCESSED IN THE                    
*                  NEW EXTENT.                                                  
*        R10,R11  MODIFIED AS NECESSARY TO REFLECT I/O THAT HAS BEEN            
*                  DONE UP TO THE CURRENT EXTENT.                               
*        R13      FIRST SECTOR OF I/O RELATIVE TO THE NEW EXTENT (0 ALWAYS)     
*        R14      REMAINING NUMBER OF SECTORS OF I/O TO DO                      
*                                                                               
*                                                                               
RWEXTDIR RES      0                                                             
         LW,R0    R4                SAVE R0 IN R4                               
RWEXTD2  RES      0                                                             
         CI,R1    K10               IS THIS A READ REQUEST                      
         BNE      RWEXTD20          B TO PROCESS WRITE                          
*                                                                               
*   PROCESS READ REQUEST                                                        
*                                                                               
RWEXTD4  RES      0                                                             
         DISABLE                                                                
         LW,R15   RENT:D            GET REENT COUNT                             
         LW,R5    RFT12,R7          CURRENT RECORD NUMBER                       
         LH,R4    RFTE#,R7          CURRENT EXTENT                              
         LW,R9    RFT6,R7           GET # GRANULES IN THIS EXTENT               
         MW,R9    R0                CONVERT TO SECTORS                          
         CW,R9    R13               COMPARE TO 1ST SECTOR OF I/O                
         BG       RWEXTD8           START SECTOR IN THIS EXTENT                 
*  I/O START SECTOR IS NOT IN THE CURRENT EXTENT. GET   THE NEXT                
*   EXTENT IN SEQUENCE.                                                         
         ENABLE                                                                 
         PUSH     15,R0             SAVE R0-R14                                 
         LW,R9    R4                CURRENT EXTENT                              
         AI,R9    1                 NUMBER OF EXTENT TO FIND                    
         BAL,R8   FMGETEXT          GO GET IT                                   
         B        RWEXTD60           ERROR, R9=TYC                              
         PULL     15,R0                                                         
         SW,R13   R9                R13=NEW START SECTOR AFTER NUMBER           
         B        RWEXTD4            OF SECTORS IN PREVIOUS EXTENT              
         SPACE 3                                                                
*                                    HAS BEEN SUBTRACTED.                       
*   THE STARTING SECTOR FOR THE I/O IS IN THE CURRENT EXTENT.                   
*   REGISTERS:                                                                  
*        R0       NUMBER OF SECTORS PER GRANULE                                 
*        R1-R3    FPT CODE, DCB ADD, FPT ADD                                    
*        R4       CURRENT EXTENT NUMBER                                         
*        R5       CURRENT RECORD NUMBER                                         
*        R7       RFT INDEX                                                     
*        R9       # OF SECTORS IN THE CURRENT EXTENT                            
*        R10,R11  BUFFER ADDRESS AND SIZE                                       
*        R13      1ST SECTOR OF I/O (ADJUSTED TO CURRENT EXTENT)                
*        R14      TOTAL NUMBER OF SECTORS IN USER I/O                           
*        R15      REENTRANCE COUNT                                              
*                                                                               
RWEXTD8  RES      0                                                             
         SW,R9    R13               R9= # OF SECTS OF I/O TO DO IN THIS EXT     
         CW,R9    R14               COMPARE TO TOTAL I/O TO DO                  
         BGE      RWEXTD12          DONE IF CURRENT EXT IS BIG ENOUGH           
         LW,R12   R9                R12=# OF SECTORS OF I/O IN THIS EXT         
*  SET UP CALL TO CALLQ SUBROUTINE TO READ DATA FROM THE CURRENT EXT.           
         LB,R6    RFT8,R7           AREA INDEX                                  
         LB,R6    MDDISCI,R6        DISK TABLE ADDRESS                          
         LH,R9    DISCNWPS,R6       R9= NUMBER OF WORDS PER SECTOR              
         SLS,R9   2                 CONVERT TO BYTES                            
         MW,R9    R12               R9=# BYTES OF I/O IN THIS EXTEBNT           
         PUSH     16,R0             SAVE EVERYTHING                             
         LW,R11   R9                MOVE BYTE COUNT TO R11                      
         LW,R14   R13               R14= FILE RELATIVE START SECTOR             
         ENABLE                                                                 
         BAL,R5   CVTFILE           CONVERT TO SEEK ADDRESS IN R12              
         BAL,R0   RWEXTERR          ERROR, CRASH                                
         LI,R4    FCRRAD            FUNCION CODE                                
         LW,R8    CUPCOD4           CLEANUP CODE                                
         LI,R15   -1                NO REENTRANCE CHECKING                      
*   REGISTERS CONTAIN                                                           
*        R1-R3    SAME AS USUAL                                                 
*        R4       FUNCION CODE                                                  
*        R7       DCT INDEX                                                     
*        R8       CLEANUP CODE                                                  
*        R10,R11  BUFFER ADDRESS AND SIZE                                       
*        R12      SEEK ADDRESS                                                  
*        R15      REENT FLAG                                                    
*                                                                               
         BAL,R5   CALLQ             READ THE DATE                               
         B        RWEXTD64          ERROR, R6=TYC                               
         PULL     16,R0             RESTORE REGISTERS                           
*   GET THE NEXT EXTENT INTO THE RFT                                            
         PUSH     15,R0                                                         
         LW,R9    R4                CURRENT EXTENT                              
         AI,R9    1                 R9= # OF EXTENT TO GET                      
         BAL,R8   FMGETEXT          GET THE EXTENT                              
         B        RWEXTD60           ERROR, R9=TYC                              
         PULL     15,R0                                                         
*   COMPUTE NEW BUFFER ADDRESS, BYTE COUNT, ETC....                             
         SW,R11   R9                R11= REMAINING # OF BYTES IN I/O            
         AW,R10   R9                R10= NEW BUFFER ADDRESS                     
         LI,R13   0                 NEW START SECTOR REL TO FILE                
         SW,R14   R12               REMAINING NUMBER OF SECTORS TO READ         
         B        RWEXTD4           B TO READ NEXT SECTION                      
         SPACE 3                                                                
*                                                                               
*   THE CURRENT EXTENT IS LARGE ENOUGH TO COMPLETE THE                          
*   REQUEST.  SET REGISTERS FOR NORMAL RETURN.                                  
*                                                                               
RWEXTD12 RES      0                                                             
         ENABLE                                                                 
         LW,R4    R0                NUMBER OF SECTORS/GRANULE                   
         LW,R9    R13               1ST SECTOR OF I/O REL TO FILE               
         AW,R9    R14               ADD REMAINING NUMBER OF SECTORS IN          
*                                    I/O TO GET # SECTORRS IN USER I/O          
         AI,R8    2                 BUMP RETURN REGISTER FOR NORMAL             
RWEXTDX  B        *R8               RETURN                                      
         PAGE                                                                   
*                                                                               
*   PROCESS WRITE REQUEST                                                       
*                                                                               
*   REGISTERS CONTAIN:                                                          
*        R0       NUMBER OF SECTORS PER GRANULE                                 
*        R1-R3    SAME AS USUAL                                                 
*        R7       RFT INDEX                                                     
*        R10,R11  BUFFER ADDRESS AND BYTE COUNT                                 
*        R13      NUMBER OF THE 1ST SECTOR OF USER I/O REL TO FILE              
*        R14      NUMBER OF SECTORS IN THE RECORD                               
*                                                                               
RWEXTD20 RES      0                                                             
         DISABLE                                                                
         LW,R15   RENT:D            GET REENT COUNT                             
         LH,R4    RFTE#,R7          GET CURRENT EXTENT                          
         LW,R5    RFT12,R7          CURRENT RECORD NUMBER                       
*                                                                               
         LW,R6    RFT3,R7           AREA RELATIVE LAST SECTOR                   
         SW,R6    RFT2,R7           FILE RELATIVE LAST SECTOR                   
         AI,R6    1                 # OF SECTORS IN CURRENT EXTENT              
         CW,R13   R6                IS 1ST I/O SECTOR IN THIS EXTENT            
         BL       RWEXTD28          YES, BRANCH                                 
*   I/O START SECTOR IS NOT IN THE CURRENT EXTENT.  WE MUST                     
*   ALLOT/FIND EXTENTS UNTIL WE HAVE THE ONE WHICH CONTAINS                     
*   THE FIRST I/O SECTOR.                                                       
         LW,R9    R6                                                            
         DW,R9    R0                CONVERT SECTORS TO GRANULES                 
         CW,R9    RFT6,R7           COMPARE TO # GRANS IN EXT (FISZE)           
         BLE      RWEXTD24          B IF EXTENT ALREADY FULL                    
*   SET NEW FILE SIZE TO INDICATE THAT THE EXTENT IS FULL.  THIS                
*   PREVENTS DISCONTINUITIES IN THE TOTAL FILE.                                 
         STW,R9   RFT6,R7           STORE NEW # OF GRANULES (FSIZE)             
         LB,R9    RFT16,R7          GET FLAGS                                   
         AND,R9   X3F               MASK                                        
         AI,R9    DIRWRT            SET 'DIRECTLY WRITTEN' BIT                  
         STB,R9   RFT16,R7          STORE UPDATED FLAGS                         
         LB,R9    RFT7,R7           GET RFT INDICATORS                          
         AND,R9   X3F               RESET 'ACCESS' BITS                         
         AI,R9    DIRACC            'DIRECT ACCESS' FILE                        
         STB,R9   RFT7,R7                                                       
RWEXTD24 RES      0                                                             
*   NOW WE UPDATE THE DIRECTORY FOR THE CURRENT EXTENT, ALLOT                   
*   THE NEXT EXTENT AND UPDATE THE RFT WITH PARAMETERS FOR                      
*   THE NEXT EXTENT BY CALLING RWALLOT.                                         
         PUSH     15,R0                                                         
         ENABLE                      #SECTORS IN USER RECORD.                   
         BAL,R8   RWALLOT           DOIT                                        
         B        RWEXTD60           ERROR, R9=TYC                              
         PULL     15,R0                                                         
         SW,R13   R6                R13=I/O START SECTOR RELATIVE               
         B        RWEXTD20           TO NEW EXTENT.                             
         SPACE 3                                                                
*   THE START SECTOR FOR THE I/O IS IN THE CURRENT EXTENT.                      
*   REGISTERS CONTAIN:                                                          
*        R0       SECTORS/GRANULE                                               
*        R1-R3    AS USUAL                                                      
*        R4       CURRENT EXTENT NUMBER                                         
*        R5       CURRENT RECORD NUMBER                                         
*        R6       NUMBER OF SECTORS IN CURRENT EXTENT                           
*        R7       RFT INDEX                                                     
*        R10,R11  BUFFER ADDRESS AND SIZE                                       
*        R13      1ST SECTOR OF I/O RELATIVE TO CURRENT EXTENT                  
*        R14      TOTAL # OF SECTORS IN USER I/O                                
*        R15      REENTRANCE FLAG                                               
*                                                                               
RWEXTD28 RES      0                                                             
         SW,R6    R13               R6=# OF SECTS OF I/O TO DO IN THIS EXT      
         CW,R6    R14               COMPARE WITH TOTAL I/O TO DO                
         BGE      RWEXTD36          DONE IF CURRENT EXTENT BIG ENOUGH           
*   THE CURRENT EXTENT IS NOT LARGE ENOUGH TO COMPLETE THE                      
*   I/O REQUEST.  SET UP TO CALLQ TO WRITE THE DATA TO THE                      
*   CURRENT EXTENT.                                                             
         LW,R12   R6                # OF SECTORS OF I/O IN THIS EXTENT          
         LB,R6    RFT8,R7           AREA INDEX                                  
         LB,R6    MDDISCI,R6        DISK TABLE ADDRESS                          
         LH,R9    DISCNWPS,R6       R9= NUMBER OF WORDS PER SECTOR              
         SLS,R9   2                 CONVERT TO BYTES                            
         MW,R9    R12               R9=# OF BYTES OF I/O IN THIS EXT            
         PUSH     16,R0                                                         
         LW,R11   R9                MOVE BYTE COUNT TO R11                      
         LW,R14   R13               FILE RELATIVE START SECTOR                  
         ENABLE                                                                 
         BAL,R5   CVTFILE           CONVERT TO SEEK ADDR IN R12                 
         BAL,R0   RWEXTERR          ERROR, CRASH                                
         LI,R4    FCWRAD            FUNCION CODE                                
         LW,R8    CUPCOD4           CLEANUP CODE                                
         LI,R15   -1                REENT FLAG                                  
         BAL,R5   CALLQ             WRITE THE DATA                              
         B        RWEXTD64           ERROR, R6=TYC                              
         PULL     16,R0                                                         
*   COMPUTE NEW BUFFER ADDRESS, BYTE COUNT, START SECTOR AND                    
*   REMAINING NUMBER OF SECTORS: ALL TO BE USED FOR NEXT WRITE.                 
         SW,R11   R9                REMAINING BYTE COUNT                        
         AW,R10   R9                NEW BUFFER ADDRESS                          
         LI,R13   0                 I/O START SECTOR REL TO NEXT EXT            
         SW,R14   R12               REMAINING NUMBER OF SECTS TO WRITE          
*   UPDATE RFT TO REFLECT LAST WRITE                                            
         DISABLE                                                                
         LW,R9    RFT3,R7           AREA RELATIVE LAST SECTOR                   
         SW,R9    RFT2,R7           SUBTR 1ST SECTOR                            
         AI,R9    1                 R9= NUMBER OF SECTS IN THIS EXT             
         DW,R9    R0                # OF GRANULES IN THIS EXTENT                
         STW,R9   RFT6,R7           UPDATE FSIZE                                
*                                                                               
         LB,R9    RFT16,R7          GET FLAGS                                   
         AND,R9   X3F               MASK                                        
         AI,R9    DIRWRT            SET 'DIRECTLY WRITTEN' IND                  
         STB,R9   RFT16,R7                                                      
         LB,R9    RFT7,R7           GET RFT INDICATORS                          
         AND,R9   X3F               RESET 'ACCESS' BITS                         
         AI,R9    DIRACC            'DIRECT ACCESS' FILE                        
         STB,R9   RFT7,R7                                                       
*   NOW CALL RWALLOT TO UPDATE THE DIRECTORY FOR THE CURRENT                    
*   EXTENT, ALLOT THE NEXT EXTENT AND UPDATE THE                                
*   RFT WITH PARAMETERS FOR THE NEXT EXTENT.                                    
RWEXTD32 RES      0                                                             
         PUSH     15,R0                                                         
         ENABLE                                                                 
         BAL,R8   RWALLOT           DO THE ALLOT                                
         B        RWEXTD72           ERROR, R9=TYC                              
         PULL     15,R0                                                         
         B        RWEXTD20                                                      
         SPACE 3                                                                
*                                                                               
*   THE CURRENT EXTENT IS LARGE ENOUGH TO COMPLETE THE WRITE REQUEST            
*   NOW SET REGISTERS FOR A NORMAL RETURN.                                      
*                                                                               
RWEXTD36 RES      0                                                             
         ENABLE                                                                 
         LW,R4    R0                R4= # OF SECTORS PER GRANULE                
         LW,R9    R14               R9=# OF SECTORS OF I/O TO DO                
         AW,R9    R13               R9= FILE RELATIVE LAST SECTOR+1 (FISZE)     
         AI,R8    2                 TAKE NORMAL EXIT (+3)                       
         B        RWEXTDX           EXIT                                        
         SPACE 3                                                                
*                                                                               
*   ERROR PROCESSING FOR RWEXTDIR SUBROUTINE                                    
*                                                                               
RWEXTD60 RES      0                                                             
         DISABLE                                                                
         STW,R9   TEMP                                                          
         PULL     15,R0             CLEANUP STACK                               
         LW,R9    TEMP              R9= TYC                                     
         ENABLE                                                                 
         CI,R9    TYC03             IS IT NONEXISTENT FILE                      
         BNE      RWEXTD62          NO, BRANCH                                  
         AI,R8    1                 YES, EXIT +2 (EOD/EOT)                      
         B        RWEXTDX           EXIT                                        
*                                                                               
RWEXTD62 RES      0                                                             
         CI,R9    TYCREENT          REENTERED                                   
         BNE      RWEXTDX           NO, TAKE ERROR EXIT                         
         CH,R4    RFTE#,R7          YES, ARE WE IN THE SAME EXT                 
         BE       RWEXTD2           YES, OK TO TRY AGAIN                        
         B        RWEXTDX           NO RETURN THE ERROR                         
*                                                                               
RWEXTD64 RES      0                 R6=TYC                                      
         DISABLE                                                                
         STW,R6   TEMP              SAVE TYC                                    
         PULL     16,R0             CLEANUP STACK                               
         LW,R9    TEMP              R9=TYC                                      
         ENABLE                                                                 
         B        RWEXTDX           TAKE ERROR EXIT                             
*                                                                               
RWEXTD72 RES      0                                                             
         DISABLE                    R9=TYC                                      
         STW,R9   TEMP                                                          
         PULL     15,R0                                                         
         LW,R9    TEMP                                                          
         CI,R9    TYCREENT          REENTERED                                   
         BNE      RWEXTD76          NO, TAKE ERROR EXIT                         
         CH,R4    RFTE#,R7          ARE WE IN THE SAME EXTENT                   
         BNE      RWEXTD76          NO, RETURN THE ERROR                        
         LW,R5    RFT12,R7          GET CURRENT RECORD NUMBER                   
         LW,R15   RENT:D            AND CURRENT REENT COUNT.                    
         B        RWEXTD32          B TO TRY AGAIN                              
*                                                                               
RWEXTD76 RES      0                                                             
         ENABLE                                                                 
         B        RWEXTDX           TAKE ERROR EXIT                             
         PAGE                                                                   
*************                                                                   
*  FMRELTS  *                                                                   
*************                                                                   
*                                                                               
*   ROUTINE TO RELEASE AND DECHAIN TSPACE POINTED TO IN  R7                     
*                                                                               
*   AT ENTRY:  R7  TSPACE POINTER                                               
*              R8  LINK                                                         
*                                                                               
*   REGISTERS PRESERVED:  R0-R10,R12-R15                                        
*                                                                               
FMRELTS  RES      0                                                             
         PUSH     11,R0             SAVE R0-R10                                 
         LB,R5    TCBPOINT          STI INDEX                                   
         AI,R5    STISPCE           CHAIN HEAD                                  
         DISABLE                                                                
FMRELT1  LW,R4    0,R5              R4=NEXT TSPACE BLOCK IN CHAIN               
         BEZ      FMRELT3           END OF CHAIN, EXIT                          
         CW,R4    R7                IS IT THE ONE WE WANT TO RLS                
         BE       FMRELT2           YES, BRANCH                                 
         LW,R5    R4                NO, GET READY FOR NEXT                      
         B        FMRELT1                                                       
FMRELT2  LW,R4    0,R4              DELINK OUR TSPACE                           
         STW,R4   0,R5                                                          
FMRELT3  BAL,R8   RELTEMP           RELEASE THE TSPACE                          
         PULL     11,R0                                                         
         B        *R8                                                           
         PAGE                                                                   
**************                                                                  
*  FMSETRFT  *                                                                  
**************                                                                  
*                                                                               
*   ROUTINE SETS THE RFT IN A REWOUND POSITION                                  
*                                                                               
*   AT ENTRY:   R7   RFT INDEX                                                  
*                                                                               
*   IF A BLOCKING BUFFER WAS ATTACHED TO THE FILE, IT SHOULD HAVE               
*   BEEN WRITTEN OUT BEFORE CALLING THIS SUBROUTINE.                            
*                                                                               
*   ROUTINE ALWAYS RETURNS +1                                                   
*                                                                               
*   ROUTINE CLOBBERS:   R0,R8                                                   
*                                                                               
FMSETRFT RES      0                                                             
         LI,R0    0                                                             
         STH,R0   RFT10,R7          ZERO BB POSITION                            
         STW,R0   RFT11,R7          ZERO CURRENT FILE POSITION                  
         LI,R0    1                                                             
         STW,R0   RFT12,R7          CURRENT RECORD NUMBER=1                     
         B        *R8               RETURN                                      
         TITLE    'RWALLOT SUBROUTINE'                                          
*************                                                                   
*  RWALLOT  *                                                                   
*************                                                                   
*                                                                               
*   SUBROUTINE ALLOTS THE NEXT EXTENT IN SEQUENCE.  THE                         
*   CURRENT EXTENT NUMBER IS TAKEN FROM THE RFT (RFTE#).                        
*                                                                               
*   THE DIRECTORY ENTRY FOR THE CURRENT EXTENT IS UPDATED                       
*   IF NECESSARY.                                                               
*                                                                               
*   AFTER THE FILE IS ALLOTTED THE RFT IS UPDATED TO REFLECT                    
*   THE PARAMETERS FOR THE NEW EXTENT.                                          
*                                                                               
*   AT ENTRY:                                                                   
*        R1       FPT CODE                                                      
*        R2       DCB ADDRESS                                                   
*        R3       FPT ADDRESS                                                   
*        R4       CURRENT EXTENT NUMBER (USED IN REENT CHECKING)                
*        R5       CURRENT RECORD NUMBER (USED IN REENT CHECKING)                
*        R7       RFT INDEX                                                     
*        R8       LINK                                                          
*        R14      SIZE OF NEW FILE IN SECTORS (USED ONLY IF FIX=0)              
*        R15      REENTRANCE COUNT FROM RENT:D                                  
*                                                                               
*   ROUTINE PRESERVES:  R1-R5,R7                                                
*                                                                               
*                                                                               
RWALLOT  RES      0                                                             
         PUSH     R8                SAVE LINK                                   
         LB,R0    RFT16,R7          GET FILE STATUS                             
         CI,R0    SEQWRT+DIRWRT     WAS THE FILE WRITTEN                        
         BAZ      RWALL4            NO, BRANCH                                  
*   UPDATE DIRECTORY FOR THE CURRENT EXTENT                                     
         LW,R0    R14               SAVE FILE SIZE IN R0                        
         PUSH     2,R4              YES, DIRECTORY MUST BE UPDATED              
         BAL,R8   CFUPDIR           GO TO UPDATE DIR FOR CURRENT EXT            
         B        RWALL20            ERROR, R9=TYC                              
         PULL     2,R4                                                          
         LW,R14   R0                MOVE FILE SIZE BACK TO R14                  
RWALL4   RES      0                                                             
         LW,R6    R7                SAVE RFT INDEX IN R6                        
         LI,R7    16                                                            
         BAL,R8   GETTEMP           GET 16 WORDS OF TSPACE FOR ALLOT            
         B        RWALL24            ERROR, R15=TYC                             
         LB,R1    TCBPOINT          LINK THE TSPACE TO CALLER'S                 
         LW,R0    STISPCE,R1         TSPACE CHAIN.                              
         STW,R0   0,R7                                                          
         STW,R7   STISPCE,R1                                                    
*                                                                               
         LI,R0    0                 ZERO TSPACE BLOCK                           
         LI,R1    15                                                            
         STW,R0   *R7,R1                                                        
         BDR,R1   %-1                                                           
*   SET UP THE TSPACE BLOCK FOR ALLOT.                                          
         LI,R0    DIRESIZE          LENGTH OF DIRECTORY ENTRY                   
         DO1      #DFACNT                                                       
         AI,R0    2                 ADD TWO WORDS FOR ACCOUNTS                  
         STW,R0   TSNFLEN,R7        STORE IT                                    
*                                                                               
         LB,R12   RFT7,R6           GET RFT STATUS BYTE IN R12                  
         AND,R12  X3F               R12= 'FIX' AND ORG                          
         STB,R12  R0                                                            
         STW,R0   TSNFFLGS,R7       STORE FLAG1,FLAG2,LENGTH                    
*                                                                               
         LH,R13   RFT5,R6           R13= RSIZE                                  
         LH,R12   RFT4,R6           R12= GSIZE                                  
         STH,R12  R13                                                           
         STW,R13  TSNFGRSZ,R7       STORE GSIZE,RSIZE                           
*                                                                               
         LH,R9    RFTE#,R6          R9= CURRENT EXTENT NUMBER                   
         AI,R9    1                                                             
         STW,R9   TSNFXTNT,R7       STORE NEW EXTENT NUMBER                     
*                                                                               
         LW,R0    RFTESZ,R6                                                     
         STW,R0   TSNFESIZ,R7       STORE EXTENT SIZE (IN SECTORS)              
         STW,R0   TSNFSECT,R7        AND # SECTORS FOR FILE.                    
         CW,R14   R0                IS SPECIFIED SIZE<ALLOT ESIZE               
         BLE      RWALL8            YES, LEAVE IT AT ALLOTTED ESIZE             
         LB,R10   RFT7,R6           GET RFT FLAGS                               
         CI,R10   RFTFIX            IS 'FIX' INDICATOR SET                      
         BANZ     RWALL8            YES, # OF SECTORS OK AS IS                  
         STW,R14  TSNFSECT,R7       NO, STORE SPECIFIED SIZE                    
*                                                                               
RWALL8   RES      0                                                             
         DO       #DFACNT                                                       
         LD,R10   RFTACNT,R6        GET ACCOUNT NAME                            
         STW,R10  TSNFACT1,R7       STORE IT IN TSPACE                          
         STW,R11  TSNFACT2,R7                                                   
         FIN      #DFACNT                                                       
*                                                                               
         LD,R12   RFT1,R6           FILE NAME TO R12,R13                        
         STW,R12  TSNFNAM1,R7       STORE IT IN TSPACE                          
         STW,R13  TSNFNAM2,R7                                                   
*                                                                               
         PUSH     2,R5              SAVE R5,R6                                  
         LB,R6    RFT8,R6           GET AREA INDEX IN R8                        
         ENABLE                                                                 
         LW,R0    R4                SAVE CURRENT EXTENT IN R0                   
         LB,R1    *R3               GET FPT CODE IN R1                          
         AND,R1   M7                MASK OUT INDIRECT BIT                       
*                                                                               
*   REGISTERS CONTAIN:                                                          
*        R0       CURRENT EXTENT NUMBER                                         
*        R1       FPT CODE                                                      
*        R2       DCB ADDRESS                                                   
*        R3       FPT ADDRESS                                                   
*        R4       CURRENT EXTENT NUMBER                                         
*        R5       CURRENT RECORD NUMBER                                         
*        R6       AREA INDEX                                                    
*        R7       TSPACE POINTER FOR ALLOT                                      
*        R9       NUMBER OF EXTENT TO ALLOT                                     
*        R10,R11  ACCOUNT NAME                                                  
*        R12,R13  FILE NAME                                                     
*        R15      REENTRANCE COUNTER                                            
*                                                                               
         ENABLE                                                                 
         BAL,R8   FINDDIRX          ALLOT THE NEW EXTENT                        
         B        RWALL28            ERROR, R9=TYC                              
RWALL12  RES      0                                                             
         PULL     2,R5                                                          
         DISABLE                                                                
         CH,R0    RFTE#,R6          ARE WE IN THE SAME EXTENT                   
         BNE      RWALL32            NO, REENTERED                              
         CW,R5    RFT12,R6          ARE WE POSITIONED AT THE SAME RECORD        
         BNE      RWALL32            NO, REENTERED                              
*                                                                               
*   THE DIRECTORY SECTOR CONTAINING THE NEW FILE EXTENT IS                      
*   IN CORE.  THE RFT WILL NOW BE UPDATED.                                      
*   REGISTERS CONTAIN:                                                          
*        R0       CURRENT EXTENT NUMBER                                         
*        R1-R3    SAME AS AT ENTRY                                              
*        R4       POINTER TO DIRECTORY ENTRY IN MEMORY                          
*        R5       CURRENT RECORD NUMBER                                         
*        R6       RFT INDEX                                                     
*        R7       TSPACE POINTER                                                
*        R10      ADDRESS OF BLOCKING BUFFER CONTROL WORD                       
*        R15      REENTRANCE COUNTER                                            
*                                                                               
         LCI      4                                                             
         LM,R11   DIREFSIZ,R4       LOAD DIR PARAMETERS INTO R11-R14            
         STW,R11  RFT6,R6           STORE FILE SIZE                             
         STW,R12  RFT2,R6           BOT                                         
         STW,R13  RFT3,R6           EOT                                         
         STH,R14  RFTE#,R6          AND EXTENT NUMBER                           
         LW,R4    R0                R4= ORIGINAL EXTENT NUMBER                  
         XW,R6    R7                GET RFT INDEX IN R7                         
         BAL,R8   FMSETRFT          SET THE REST OF THE RFT PARAMETERS          
         ENABLE                                                                 
         XW,R6    R7                RFT INDEX TO R6                             
*   RFT UPDATE COMPLETED. DO CLEANUP.                                           
         BAL,R8   FMRELTS           RELEASE AND DECHAIN TSPACE                  
         LW,R7    R6                RFT INDEX TO R7                             
         LW,R6    R10               R6= BBCW ADDRESS                            
         PUSH     2,R4                                                          
         BAL,R11  RELADBUF          RELEASE THE BLOCKING BUFFER                 
         PULL     2,R4                                                          
         PULL     R8                RESTORE LINK                                
         AI,R8    1                 TAKE NORMAL EXIT (+2)                       
         B        *R8               EXIT                                        
*                                                                               
         SPACE 3                                                                
*                                                                               
*   ERROR PROCESSING FOR RWALLOT SUBROUTINE                                     
*                                                                               
RWALL20  RES      0                 R9=TYC                                      
         PULL     2,R4              CLEANUP STACK                               
         CI,R9    TYC03             IS IT A NONEXISTENT FILE                    
         BNE      RWALL36           NO, TAKE ERROR EXIT                         
         BAL,R0   RWEXTERR          YES, CRASH....                              
*                                                                               
RWALL24  RES      0                 R15=TYC                                     
         LW,R7    R6                R7= RFT INDEX                               
         LW,R9    R15               R9=TYC                                      
         B        RWALL36           TAKE ERROR EXIT                             
*                                                                               
RWALL28  RES      0                 R9=TYC                                      
         CI,R9    TYC71             DOES EXTENT ALREADY EXIST                   
         BE       RWALL12           YES, USE IT                                 
         BAL,R8   FMRELTS           RELEASE AND CLEANUP TSPACE                  
         PULL     2,R5                                                          
         LW,R7    R6                MOVE RFT INDEX TO R7                        
         LW,R4    R0                R4= ORIGINAL EXTENT NUMBER                  
         B        RWALL36           TAKE ERROR EXIT                             
*                                                                               
RWALL32  RES      0                                                             
         BAL,R8   FMRELTS           RELEASE TSPACE                              
         LW,R7    R6                R7= RFT INDEX                               
         LW,R6    R10               GET BBCW ADDRESS IN R6                      
         PUSH     2,R4                                                          
         BAL,R11  RELADBUF          RELEASE THE BLOCKING BUFFER                 
         PULL     2,R4                                                          
         LI,R9    TYCREENT          SET TYC                                     
*                                                                               
RWALL36  RES      0                                                             
         PULL     R8                                                            
         B        *R8               TAKE ERROR EXIT                             
         PAGE                                                                   
**************                                                                  
*  FMGETEXT  *                                                                  
**************                                                                  
*                                                                               
*   ROUTINE FINDS THE DIRECTORY ENTRY FOR THE SPECIFIED                         
*   EXTENT AND UPDATES THE RFT ACCORDINGLY.                                     
*   THE NEW FILE EXTENT IS LEFT IN A REWOUND POSITION.                          
*   THE DIRECTORY IS UPDATED FOR THE PREVIOUS EXTENT IF                         
*   REQUIRED.                                                                   
*                                                                               
*   AT ENTRY:                                                                   
*        R1       FPT CODE                                                      
*        R3       FPT ADDRESS IF FPT CODE IS READ,WRITE,OPEN OR CLOSE           
*        R4       CURRENT EXTENT (USED IN REENTRANCE CHECKING)                  
*        R5       CURRENT RECORD NUMBER (USED LIKE CONTENTS OF R4)              
*        R7       RFT INDEX                                                     
*        R8       LINK                                                          
*        R9       NUMBER OF EXTENT TO FIND                                      
*        R15      REENT COUNT FROM RENT:D                                       
*   AT EXIT:                                                                    
*        R9       TYC IF ERROR                                                  
*                                                                               
*   ROUTINE EXITS +2 NORMALLY                                                   
*                 +1 IF ERROR (R9=TYC)                                          
*   REGISTERS PRESERVED:  R1-R5,R7,R9    IF NO ERRORS                           
*                                                                               
FMGETEXT RES      0                                                             
         PUSH     R8                SAVE LINK                                   
*   CLEANUP THE CURRENT EXTENT                                                  
         LB,R8    RFT16,R7          GET FLAGS                                   
         CI,R8    SEQWRT+DIRWRT     WAS THE FILE WRITTEN                        
         BAZ      FMGETX3           NO, NO DIRECTORY UPD TO DO                  
         PUSH     6,R4              SAVE R4-R9                                  
         BAL,R8   CFUPDIR           UPDATE THE DIRECTORY FOR THIS EXTENT        
         B        FMGETE15          ERROR, R9=TYC                               
         PULL     6,R4              RESTORE R4-R9                               
FMGETX3  RES      0                                                             
*   GET THE DIRECTORY ENTRY FOR THE SPECIFIED EXTENT.                           
         LB,R6    RFT8,R7           AREA INDEX                                  
         LD,R10   RFTACNT,R7        ACCOUNT NAME                                
         LD,R12   RFT1,R7           FILE NAME                                   
         PUSH     4,R4              SAVE R4-R7                                  
         LI,R7    0                 SET R7=0 FOR FINDDIR SUBROUTINE             
         BAL,R8   FINDDIRX          FIND THE DIRECTORY ENTRY                    
         B        FMGETE9           ERROR, R9=TYC                               
*   UPDATE THE RFT WITH PARAMETERS FOR THE NEW EXTENT.                          
*   LOAD DIRECTORY PARAMETERS INTO R11-R14 AS FOLLOWS:                          
*        R11      FILE SIZE                                                     
*        R12      FILE BOT                                                      
*        R13      FILE EOT                                                      
*        R14      EXTENT NUMBER                                                 
*                                                                               
         LCI      4                                                             
         LM,R11   DIREFSIZ,R4       LOAD 'EM UP                                 
         PULL     4,R4              RESTORE R4-R7                               
         DISABLE                                                                
         CH,R4    RFTE#,R7          ARE WE IN ORIGINAL EXTENT                   
         BNE      FMGETE3            NO, ERROR (REENTERED)                      
         CW,R5    RFT12,R7          POSITIONED AT SAME RECORD                   
         BNE      FMGETE3            NO, TAKE ERROR EXIT                        
         STW,R11  RFT6,R7           FILE SIZE                                   
         STW,R12  RFT2,R7           BOT                                         
         STW,R13  RFT3,R7           EOT                                         
         STH,R14  RFTE#,R7          EXTENT NUMBER                               
*   NOW SET REMAINING RFT ENTRIES WHICH WILL RESULT IN THE                      
*   EXTENT BEING IN A REWOUND POSITION.                                         
         BAL,R8   FMSETRFT                                                      
         ENABLE                                                                 
         LW,R6    R10               R6= BBCW ADDRESS                            
         BAL,R11  RELADBUF          RELEASE THE BB                              
         PULL     R8                RESTORE LINK                                
         AI,R8    1                 TAKE NORMAL EXIT (+2)                       
FMGETEX  B        *R8               EXIT                                        
         SPACE 3                                                                
*                                                                               
*   PROCESS ERRORS IN FMGETEXT SUBROUTINE                                       
*                                                                               
FMGETE3  RES      0                                                             
         ENABLE                                                                 
         LW,R6    R10               RELEASE THE BLOCKING BUFFER                 
         BAL,R11  RELADBUF          POINTED TO IN R6.                           
         LI,R9    TYCREENT          SET TYC FOR REENTERED                       
         B        FMGETE12          EXIT                                        
*                                                                               
FMGETE9  RES      0                                                             
         PULL     4,R4              CLEANUP STACK                               
*                                                                               
FMGETE12 RES      0                                                             
         PULL     R8                                                            
         B        FMGETEX           TAKE ERROR EXIT (+1)                        
*                                                                               
FMGETE15 RES      0                                                             
         LW,R0    R9                TEMPORARILY SAVE TYC IN R0                  
         PULL     6,R4              CLEANUP STACK                               
         LW,R9    R0                R9 NOW HAS TYC                              
         B        FMGETE12          COMPLETE EXIT SEQUENCE                      
         END                                                                    
