*COMDECK GFS
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.GFS - GET MAX. FP BLOC
,K SIZE 
*CALL CMMCOM
          COMMENT  "SUBSYS"GET MAX. AVAIL. FIXED BLOCK SIZE.
          B1=1
 CMM.GFS  SPACE  4,10 
***       CMM.GFS - GET MAXIMUM AVAILABLE FIXED BLOCK SIZE. 
* 
* 
*              CMM.GFS EXAMINES THE DYNAMIC AREA AND RETURNS THE
*         SIZE OF THE LARGEST FIXED-POSITION BLOCK THAT MAY BE
*         ALLOCATED.  NOTHING IS ACTUALLY ALLOCATED BY THIS FUNCTION. 
* 
* 
*         ENTRY  (X1) = 0 - SIZE RETURNED ASSUMES THAT NO FL INCREASE 
*                           IS ALLOWED. 
*                       1 - SIZE RETURNED IS THAT WHICH WOULD CAUSE 
*                           FL TO EQUAL MAXFL.
* 
*                (X2) = 0 - SIZE RETURNED IS TO BE THAT OF A GROUP-TYPE 
*                           0 BLOCK, I.E., IT MAY NOT EXTEND BELOW HHA. 
*                       1 - SIZE RETURNED IS TO BE THAT OF A GROUP-TYPE 
*                           1 BLOCK, I.E., IT MAY EXTEND BELOW HHA. 
* 
*         EXIT   (X6) = LARGEST FIXED BLOCK THAT MAY BE ALLOCATED 
*                       UNDER SPECIFIED CONDITIONS. 
*                (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  GFS 
 CMM.GFS  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          RJ     =XCMM.ICM   INITIALIZE AND SET A0
  
 IS       IFSAFE
          SX7    3RGFS       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.GFS     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA3    A0-IMAPM 
          ZR     X3,GFS101
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 GFS101   BSS    0
 IS       ENDIF 
  
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    GFSSV
          SA7    A6+B1
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    A7+B1
          SA7    A6+B1
          SB2    X1          (B2) = FL INCREASE FLAG
          SB3    X2          (B3) = GROUP-TYPE FLAG 
          MX1    0           NO ABORT 
          RJ     =XCMM.CUL   COMPUTE UTILIZATION LEVEL
          SA7    =SUSED      SAVE SPACE USED
          BX6    X3 
          MX7    0           INITIALIZE MAXIMUM FREE REGION SIZE
          SA7    GFSMF
          SA6    =STOTAL     SAVE TOTAL SPACE 
          MX5    0           (X5) = LARGEST SIZE
          BX0    X0-X0       (X0) = SIZE THIS GAP 
          SA3    RA65        (B4) = 1ST REGION FWA
          BX3    -X3
          SB4    X3+B1
          SA4    HHA         (B6) = HHA+1 
          SB6    X4+B1
          SB7    B0          (B7) = 0 - NO VP REGIONS ENCOUNTERED 
          EQ     GFS4        ENTER LOOP 
  
*         BEGIN REGION LOOP.
  
 GFS2     SB4    B5          ADVANCE TO NEXT REGION 
 GFS4     SA1    B4          (B5) = FWD 
          SB5    X1 
          ID     X1,GFS20    IF FIXED BLOCK 
          MI     X1,GFS10    IF VARIABLE REGION 
  
*         ADD SPACE WITHIN FREE REGION. 
  
          NZ     B3,GFS6     IF GROUP-TYPE 1 BLOCK DESIRED
          LE     B5,B6,GFS2  IF REGION ENTIRELY BELOW HHA+1 
          GE     B4,B6,GFS6  IF REGION ENTIRELY ABOVE HHA+1 
          SX7    B5-B6       ADD PORTION OF FREE REGION ABOVE HHA+1 
          IX0    X0+X7        TO AVAILABLE SPACE
          EQ     GFS11       GO CHECK FOR MAXIMUM FREE REGION SIZE
  
 GFS6     SX7    B5-B4       ADD ENTIRE FREE REGION SIZE TO 
          IX0    X0+X7        AVAILABLE SPACE 
 GFS11    SA2    GFSMF       RETAIN MAXIMUM FREE REGION SIZE
          IX6    X2-X7
          PL     X6,GFS2     IF A PREVIOUS, LARGER FREE REGION
          SA7    A2          SET CURRENT ONE AS THE LARGEST SO FAR
          EQ     GFS2        LOOP 
  
*         ADD FREE SPACE WITHIN VARIABLE REGION.
  
 GFS10    BSS    0
  
 IS       IFSAFE
          SX6    =YCMM.CVS
          PL     X6,GFS104
          UERR   CMENEED,3RCVS  CMM.CVS NEEDED, BUT NOT PRESENT 
  
 GFS104   BSS    0
 IS       ENDIF 
  
          SX1    B4           ? (X1) = FWA VARIABLE REGION
          RJ     =YCMM.CVS   -- COMPUTE VARIABLE SPACE -- 
          SB7    B1          FLAG VP REGION ENCOUNTERED 
          NZ     B3,GFS12    IF GROUP-TYPE 1 BLOCK DESIRED
          LE     B5,B6,GFS2  IF REGION ENTIRELY BELOW HHA+1 
          IX1    X1-X2       (X1) = TOTAL REGION SPACE ABOVE HHA+1
          IX3    X3-X4       (X3) = TOTAL USED SPACE ABOVE HHA+1
 GFS12    IX1    X1-X3       TOTAL FREE SPACE 
          IX0    X0+X1       ADD TO TOTAL AVAILABLE SPACE 
          EQ     GFS2        LOOP 
  
*         FIXED BLOCK - IF AT TRAILER, ADD AMOUNT POSSIBLE TO ADD BY
*         INCREASING FL, IF OPTION TO DO SO WAS SPECIFIED.
*         IF AT TRAILER, BUT NOT TO INCREASE FL, REDUCE FREE SPACE
*         IN THIS AREA BY THR.
  
 GFS20    NZ     B5,GFS28    IF NOT AT TRAILER
          NZ     B2,GFS22    IF TO TAKE FL INCREASE INTO ACCOUNT
          ZR     B7,GFS28    IF NO PRI VP REGION
          SA2    GFSAD       REDUCE FREE SPACE BY THR 
          SB7    X2 
          SX2    B4-B7
          AX2    THR
          SX2    X2+B1
          IX0    X0-X2
          EQ     GFS28
  
 GFS22    SX4    A0          SET FOR ADDING MAXFL-FL
          NZ     B3,GFS26    IF GROUP-TYPE 1 DESIRED
          SB7    A0 
          GE     B7,B6,GFS26  IF FL NOT < HHA+1 
          SX4    B6          SET FOR ADDING MAXFL-(HHA+1) 
 GFS26    SA1    A0-MAXFL    ADD AMOUNT WHICH CAN BE GAINED BY
          IX1    X1-X4        INCREASING FL 
          IX0    X0+X1
 GFS28    SX7    B5          FWA OF CURRENT FREE-VP AREA
          SA7    GFSAD
          SB7    B0          SET NO VP REGIONS
          IX6    X0-X5       (X5) = MAX[(THIS SIZE),(LARGEST SIZE)] 
          BX0    X0-X5
          AX6    59 
          BX0    -X6*X0 
          BX5    X0-X5
          MX0    0           RESET CURRENT SIZE 
          NZ     B5,GFS2     IF NOT AT TRAILER
          SX6    X5-2        REDUCE BY 2 TO ALLOW FOR MAXIMUM 
                              POSSIBLE HEADER SIZE
          SA1    TOTAL       GET TOTAL SPACE FROM CMM.CUL 
          SA5    USED        GET USED SPACE 
          PX3    X6 
          NX3    X3 
          FX3    X3+X5       ADD IN USED FOR TOTAL USED 
          SA5    =0."DEFTRIG" 
          FX3    X3/X1       USED OVER TOTAL
          FX3    X5-X3       CHECK AGAINST DEFAULT TRIGGER
          PL     X3,GFS29    IF NOT CLOSE 
          BX3    -X3
          FX3    X1*X3
          UX3    X3,B2
          LX3    X3,B2
          IX6    X6-X3       BACK OFF AMOUNT NEEDED TO NOT EXC. TRIG. 
 GFS29    SA2    GFSMF       MAKE SURE RETURN VALUE IS .GE. LARGEST FREE
          IX3    X6-X2        FREE REGION 
          PL     X3,GFS30    IF COMPUTED VALUE .GT. LARGEST FREE REGION 
          SX6    X2-2        USE LARGEST FREE REGION AS RETURN VALUE
 GFS30    BSS    0
          SA1    GFSSV       RESTORE X0 
          SA5    A1+B1       RESTORE X5 
          BX0    X1 
          SA2    A5+B1       RESTORE B2 
          SA3    A2+B1       RESTORE B3 
          SB2    X2-0 
          SB3    X3-0 
          SA1    A0-MNSAVEA0  RESTORE A0
          SA0    X1 
          EQ     CMM.GFS     RETURN, (X6) = MAXIMUM FP SIZE 
  
 GFSSV    BSS    4           SAVE AREA FOR X0, X5, B2, B3 
 GFSAD    BSS    1           FWA CURRENT FREE-VP AREA 
 GFSMF    BSS    1           SIZE OF LARGEST FREE REGION
  
