*DECK CMMVSQ
          IDENT  CMM.VSQ
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.VSQ - VARIABLE SQUEEZE
*CALL CMMCOM
          COMMENT  "SUBSYS"VARIABLE SQUEEZE.
          B1=1
 CMM.VSQ  SPACE  4,10 
**        CMM.VSQ - VARIABLE SQUEEZE FOR COMPACT DYNAMIC AREA.
* 
* 
*              THIS ROUTINE IS CALLED BY THE CMM.OP4 FUNCTION IF ANY
*         VARIABLE BLOCKS ARE PRESENT ABOVE THE HIGHEST FIXED BLOCK.
*         ALL SUCH BLOCKS ARE MOVED DOWN AS LOW AS POSSIBLE.
* 
*         ENTRY  (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X6) = LWA+1 OF HIGHEST VARIABLE BLOCK AFTER MOVES.
*                (B1) = 1.
*                (A0) = NEW FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 4, 5, 6, 7. 
  
  
          ENTRY  CMM.VSQ
 CMM.VSQ  EQ     *+400000B   ENTRY / EXIT 
          BX6    X0          SAVE X0
          SA6    VSQSV
  
*         FIND LWA+1 OF HIGHEST FIXED BLOCK.  CALL CMM.PMV TO FORM
*         EVERYTHING ABOVE IT INTO ONE VP REGION. 
  
          ERRNZ  P.ENDZ-1 
          SA2    A0-B1       (B4) = CURRENT REGION FWA
          SA3    X2 
          LX3    -18
 VSQ2     SB4    X3          GET NEXT-LOWER REGION
          SX1    A3          (X1) = LWA+1 OF LAST REGION EXAMINED 
          SA3    B4 
          DF     X3,VSQ2     IF NOT A FIXED BLOCK 
                              ? (X1) = LWA+1 OF HIGHEST FIXED BLOCK 
          MX2    0            ? (X2) = SPACE NEEDED = 0 
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
  
*         MOVE ALL VP BLOCKS DOWN SO THAT THERE WILL BE NO FREE 
*         SPACE IN THE PRIMARY VP REGION. 
  
          SX0    X6+B1       (X0) = DESTINATION ADDRESS 
          SA2    X6          (B4) = ADDRESS OF 1ST VP BLOCK HEADER
          AX2    36 
          SB4    X2 
 VSQ4     ZR     B4,VSQ6     IF NO MORE VP BLOCKS 
          SA4    B4          NEXT HEADER
          SB4    X4          (B4) = FWD 
          AX4    36          ADVANCE STORE ADDRESS FOR NEXT BLOCK 
          SX4    X4+4         BY (LENGTH OF THIS ONE) + HDR SIZE
          BX2    X0           ? (X2) = DESTINATION ADDRESS
          IX0    X0+X4
          SX1    A4           ? (X1) = SOURCE ADDRESS 
          MX3    0            ? (X3) = 0 - SAME REGION
          RJ     =XCMM.MOB   -- MOVE ONE BLOCK -- 
          EQ     VSQ4        LOOP 
  
 VSQ6     SX6    X0          (X6) = LWA+1 OF LAST VP BLOCK
          SA1    VSQSV       RESTORE X0 
          BX0    X1 
          EQ     CMM.VSQ     RETURN 
  
 VSQSV    BSS    1           X0 SAVE AREA 
  
          END 
