*DECK CMMVAF
          IDENT  CMM.VAF
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.VAF - VP CODE FOR ALF 
*CALL CMMCOM
          COMMENT  "SUBSYS"VP CODE FOR ALLOCATE FIXED.
          B1=1
 CMM.VAF  SPACE  4,10 
*         CMM.VAF - VARIABLE BLOCK CODE FOR ALLOCATE FIXED. 
* 
* 
*              THIS ROUTINE TRIES TO MAKE ROOM FOR A NEW FIXED BLOCK
*         AS FOLLOWS: 
* 
*         1) FIRST, IF A SECONDARY VP REGION EXISTS WHICH IS AT LEAST 
*            AS LARGE AS THE BLOCK, IT IS ATTEMPTED TO MOVE ALL OF THE
*            BLOCKS IN THAT REGION UP TO THE PRIMARY VP REGION.  ALSO,
*            TO BE ABLE TO DO THIS, ENOUGH OF THE REGION MUST BE
*            ABOVE HHA IF THE BLOCK BEING ALLOCATED IS GROUP-TYPE 0.
*            IF THIS STEP FAILS --
*         2) THE ORIGIN OF THE PRIMARY VP REGION IS MOVED UP ENOUGH 
*            SO AS TO MAKE ROOM.
* 
*              IF THE BLOCK IS A LWA-END GROW BLOCK, ONLY STEP 2 IS 
*         ATTEMPTED.
* 
*         ENTRY  PARAMETERS ARE IN SAVE AREA. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X1) = 1 IF SUCCESS. 
*                       0 IF FAILURE. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 4, 5, 6, 7. 
  
  
          ENTRY  CMM.VAF
 CMM.VAF  EQ     *+400000B   ENTRY / EXIT 
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    VAFSV
          SA7    A6+B1
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    A7+B1
          SA7    A6+B1
          SA1    A0-SC
          LX1    59-0 
          MI     X1,VAF20    IF LWA-END GROW BLOCK BEING ALLOCATED
  
*         SEARCH FOR ADEQUATE SPACE IN SECONDARY VP REGIONS.  IT IS 
*         KNOWN THAT THE PRIMARY VP REGION EXISTS.
  
          SA1    RA65        (B2) = REGION POINTER
          BX1    -X1
          SB2    X1+B1
 VAF2     SA1    B2          NEXT REGION HEADER 
          MX6    6           VP REGION HEADER = 40B 
          BX6    X6*X1
          SB2    X1 
          MX7    1
          BX6    X7-X6
          NZ     X6,VAF2     IF NOT A VP REGION 
          SA2    X1          NEXT REGION HEADER 
          SX3    X2 
          DF     X2,VAF3     IF NEXT HEADER NOT FIXED BLOCK 
          ZR     X3,VAF20    IF AT PRIMARY VP REGION
 VAF3     SA4    A0-TOTSIZE  (B4) = TOTAL SPACE NEEDED FOR BLOCK
          SB7    A2          (B7) = REGION LWA+1
          SB4    X4 
          SA3    A0-GIDENT
          MI     X3,VAF5     IF GROUP-TYPE 1
          SA5    HHA         (B5) = HHA+1 
          SB5    X5+B1
          SB6    B7-B4
          LT     B6,B5,VAF2  IF NOT ENOUGH ROOM ABOVE HHA+1 
 VAF5     SB3    A1          (B3) = REGION SIZE 
          SB3    B7-B3
          LT     B3,B4,VAF2  IF REGION TOO SMALL
          SX1    A1           ? (X1) = REGION FWA 
          RJ     =XCMM.CVS   -- COMPUTE VARIABLE SPACE -- 
          ERRNZ  P.ENDZ-1 
          SA1    A0-B1        ? (X1) = FWA PRIMARY VP REGION
          SA1    X1 
          AX1    18 
          SX1    X1 
          SX2    X3-1         ? (X2) = WORDS NEEDED TO MOVE INTO PRI VP 
          BX5    X2          SAVE WORDS NEEDED
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          ZR     X6,VAF2     IF TRANSFER INTO PRI VP NOT POSSIBLE 
          SB4    X6          NEW VARIABLE REGION HEADER                  CMMA020
          LX0    X6                                                      CMMA020
          LT     B2,B4,VAF7  IF NOT MERGING VARIABLE REGIONS             CMMA020
          SA5    A0-TOTSIZE  SIZE                                        CMMA020
          BX1    X6                                                      CMMA020
          RJ     =XCMM.CVS   COMPUTE VARIABLE SPACE                      CMMA020
          IX1    X1-X3       TOTAL FREE SPACE                            CMMA020
          BX2    X2-X2                                                   CMMA020
          IX1    X1-X5       (FREE SPACE - ALLOCATION)                   CMMA020
          RJ     =XCMM.CRD                                               CMMA020
          BX1    X0          NEW PRIM. VARIABLE REGION FW.               CMMA020
          IX2    X5+X6       TOTAL FIXED BLOCK SHARE (NEW+CALCULATED)    CMMA020
          MX3    0           NO VARIABLE SPACE                           CMMA020
          SB3    X2                                                      CMMA020
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
          BX1    X0           ? (X1) = NEW PRI VP REGION FWA
          SX2    B3                                                      CMMA020
          RJ     =XCMM.AFR   ADD FREE REGION                             CMMA020
          EQ     VAF25                                                   CMMA020
  
*         THE ABOVE PROCESSING BY CMM.PMV CAUSED THE SELECTED SECONDARY 
*         VP REGION TO BE COMBINED WITH THE PRIMARY VP REGION.
*         THUS, NO MORE MOVING OF ITS BLOCKS IS NECESSARY.
  
 VAF7     LX1    X7          FREE SPACE                                  CMMA020
          BX2    X2-X2       NO FIXED ALLOCATION IN PRIMARY REGION       CMMA020
          RJ     =XCMM.CRD                                               CMMA020
          BX1    X0                                                      CMMA020
          BX3    X5                                                      CMMA020
          SB3    X6                                                      CMMA020
          SX2    X6          SPACE AT FRONT OF REGION                    CMMA020
          RJ     =XCMM.RVR   REARRANGE VARIABLE REGIONS                  CMMA020
          SX2    B3                                                      CMMA020
          LX1    X0                                                      CMMA020
          SX2    B3          FIXED BLOCK SHARE                           CMMA023
          RJ     =XCMM.AFR   -- ADD FREE REGION --
          SB4    X0                                                      CMMA023
          GE     B2,B4,VAF25 IF PART OF THE PRIMARY VP REGION            CMMA023
  
*         MOVE BLOCKS FROM SECONDARY VP REGION TO PRIMARY VP REGION.
  
          SX0    X0+B3       SET PREV HDR ADR = FWA PRI VP REGION 
          SX5    X0+B1       (X5) = HDR FWA FOR NEXT BLOCK
          SA1    B2          (B2) = FWA SECONDARY VP REGION 
          AX1    18          (B3) = FWA 1ST VP BLOCK
          SA2    X1 
          AX2    36 
          SB2    A2 
          SB3    X2 
 VAF10    SX1    B3           ? (X1) = CURRENT HEADER ADDRESS 
          BX2    X5           ? (X2) = NEW HEADER ADDRESS 
          SX3    X0           ? (X3) = PREV HDR ADR IN NEW REGION 
          SA4    B3          (B4) = NEXT BLOCK HEADER FWA 
          SB4    X4 
          RJ     =XCMM.MOB   -- MOVE ONE BLOCK -- 
          SA4    X5          ADVANCE STORE FWA BY LENGTH OF BLOCK 
          AX4    36           JUST MOVED
          SX4    X4+4 
          BX0    X5          SET PREV HDR = CURRENT HDR 
          IX5    X5+X4
          SB3    B4          (B3) = NEXT BLOCK HEADER FWA 
          NZ     B3,VAF10    IF MORE BLOCKS 
  
*         SINCE ALL THE BLOCKS FROM THE SECONDARY VP REGION HAVE BEEN 
*         MOVED OUT, THIS ENTIRE REGION MAY BE FREED AT ONCE, WITH THE
*         USUAL COMBINING OF ANY ADJACENT FREE REGIONS. 
  
          SA2    B2          (X2) = HEADER OF SEC VP REGION 
          SA3    X2          (X3) = NEXT HEADER 
          BX1    X2          (X1) = PREVIOUS HEADER 
          AX1    18 
          SA1    X1 
          PL     X3,VAF14    IF NEXT IS FREE
          MI     X1,VAF16    IF PREVIOUS IS NOT FREE
          BX3    X2          USE CURRENT HEADER 
 VAF14    MI     X1,VAF15    IF PREVIOUS IS NOT FREE
          SA2    A1          SET A2 TO PREVIOUS HEADER
 VAF15    BX4    X3-X2       NOW  (X2) = BKD2, FWD2 
          SX1    X4               (X3) = BKD2, FWD3 
          BX2    X2-X1       FORM (X2) = BKD2, FWD3 
          SA4    X3          SET BKD IN NEXT NON-FREE BLOCK 
          MX7    -18
          SX1    A2 
          LX7    18 
          LX1    18 
          BX4    X7*X4
          IX7    X4+X1
          SA7    A4 
 VAF16    MX7    -36         SET NEW FREE REGION
          BX6    -X7*X2 
          SA6    A2 
          SX1    B1           ? (X1) = 1 - ONE LESS REGION HEADER 
          RJ     =XCMM.AUS   -- ADJUST USED SPACE --
          SX1    B1          (X1) = 1 - SUCCESS 
          EQ     VAF25       GO TO RETURN 
  
*         MAKE ROOM FOR THE BLOCK AT THE START OF THE PRIMARY VP REGION.
  
 VAF20    SA1    A0-B1        ? (X1) = FWA PRIMARY VP REGION
          SA1    X1 
          MX6    0           SET FOR NO SPACE FOR HHA 
 VAF21    AX1    18          NEXT-LOWER REGION
          SA1    X1 
          ID     X1,VAF22    IF FIXED BLOCK 
          SX7    A1          SET LWA+1 OF HIGHEST FIXED BLOCK 
          EQ     VAF21       LOOP 
  
 VAF22    SA4    A0-GIDENT
          MI     X4,VAF23    IF GROUP-TYPE 1
          SA3    HHA         (X6) = (HHA+1) - (LWA+1 HIGHEST FP BLOCK)
          SX3    X3+B1
          IX6    X3-X7
          PL     X6,VAF23    IF NO FIXED BLOCKS EXTEND PAST HHA+1 
          BX6    X6-X6       THEY DO - NO EXTRA NEEDED
 VAF23    SA2    A0-TOTSIZE   ? (X2) = SPACE NEEDED 
          SX1    X7           ? (X1) = FWA LOWEST FREE OR VP REGION 
          IX2    X2+X6
          SB2    X2          (B2) = SPACE NEEDED
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          MX1    0           SET FOR FAILURE
          ZR     X6,VAF25    IF SPACE NOT AVAILABLE 
          BX0    X6          (X0) = NEW FWA OF PRI VP REGION
          BX1    X7           ? (X1) = TOTAL FREE SPACE 
          BX2    X2-X2        ? (X2) = 0 - INCREASE ALREADY ACCOUNTED 
          RJ     =XCMM.CRD   -- COMPUTE REGION DISTRIBUTION --
          BX5    X6          (X5) = FIXED BLOCK SHARE OF FREE SPACE 
          BX1    X0           ? (X1) = PRI VP REGION FWA
          LX2    X6           ? (X2) = SPACE FOR FIXED BLOCKS 
          SX3    B2           ? (X3) = SPACE FOR BLOCK BEING ALLOCATED
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
          BX1    X0           ? (X1) = PRI VP REGION FWA
          SX2    B2           ? (X2) = SIZE OF NEW FREE REGION
          IX2    X5+X2               = FP SPACE + NEW BLOCK 
          RJ     =XCMM.AFR   -- ADD FREE REGION --
          SX1    B1          (X1) = 1 - SUCCESS 
 VAF25    SA2    VAFSV       RESTORE B2 
          SA3    A2+B1       RESTORE B3 
          SA4    A3+B1       RESTORE X0 
          SB2    X2-0 
          SB3    X3-0 
          SA5    A4+B1       RESTORE X5 
          BX0    X4 
          EQ     CMM.VAF     RETURN, (X1) = NZ IF SUCCESS 
  
 VAFSV    BSS    4           B2, B3, X0, X5 SAVE AREA 
 SIZE     EQU    MNARG1      EQUATES TO SAVE AREA 
 TOTSIZE  EQU    MNARG3                                                  F182CMM
 GID      EQU    MNARG4                                                  F182CMM
 SC       EQU    MNARG5                                                  F182CMM
 GIDENT   EQU    MNARG6                                                  F182CMM
  
          END 
