*COMDECK GXV
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.GFV - GROW AT FWA VARY
,ING
*CALL CMMCOM
          COMMENT  "SUBSYS"GROW AT FWA AND LWA VARYING. 
          B1=1
 CMM.GFV  SPACE  4,10 
***       CMM.GFV - GROW AT FWA VARYING.
* 
* 
*              THE SPECIFIED NUMBER OF WORDS ARE ADDED TO THE BLOCK 
*         AT THE FWA END.  THE INITIAL CONTENTS OF THE ADDED WORDS ARE
*         UNDEFINED.  IF THE NUMBER SPECIFIED IS ZERO (0), NO CHANGE
*         TO THE BLOCK IS MADE. 
* 
*         ENTRY  (X1) = BITS 59-30 -- NOT REFERENCED BY CMM.
*                       BITS 29-0  -- BLOCK-FWA.
*                (X2) = NUMBER-OF-WORDS.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  GFV 
 CMM.GFV  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          SA3    RA65 
          SX6    A0          SAVE A0
          BX3    -X3
  
 IS       IFSAFE
          SX1    X1 
          SX3    X3 
          PL     X3,GFV102
          UERR   CMEFST,0,3RGFV  ILLEGAL 1ST CALL TO CMM
  
 GFV102   BSS    0
 IS       ENDIF 
  
          SA3    X3          (A0) = FL
          SA0    X3 
          SA6    A0-MNSAVEA0  SAVE A0 
          SX7    3RGFV       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.GFV     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
  
 IS       IFSAFE
          SA3    A0-IMAPM 
          ZR     X3,GFV104
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 GFV104   SB7    B1           ? (B7) = 1 - VARIABLE BLOCK 
          RJ     =XCMM.CAB   -- CHECK ACTIVE BLOCK -- 
          LX6    59-3 
          MI     X6,GFV106   IF REQUIRED SIZE-CODE BIT SET
          UERR   CMESCV,0    SIZE-CODE VIOLATION
  
 GFV106   PL     X2,GFV108   IF NUM \ 0 
          UERR   CMENUM,0    ILLEGAL NUM
  
 GFV108   BSS    0
 IS       ENDIF 
  
*         STORE ARGUMENTS IN SAVE AREA. 
  
          SX6    X1          BLOCK-FWA
          LX7    X2          NUM
          SA6    A0-BFWA
          SA7    A0-NUM 
  
*         INITIAL #EASY# ATTEMPT. 
  
          RJ     GFVE 
          ZR     X1,GFV4     IF NOT SUCCESSFUL
          SA2    A0-MNSAVEA0  RESTORE A0
          SA0    X2 
          EQ     CMM.GFV     RETURN 
  
*         IF OVERFLOW-ACTION CODE NOT PRESENT, CHECK DEFAULT TRIGGER
*         LEVEL AND, IF NOT REACHED, MAKE ONE TRY AT COMPLETING THE 
*         REQUEST VIA THE #HARD# ATTEMPT. 
  
 GFV4     SX2    =YCMM.GOA
          PL     X2,GFV12    IF OVERFLOW-ACTION CODE PRESENT
          SX1    B1           ? SO TO ABORT IF EXCEEDED 
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --
          RJ     GFVH 
          NZ     X1,GFV8     IF SUCCESSFUL
          MERR   ERRFAIL     CANNOT CONTINUE
  
*         RETURN THRU SAVED RETURN ADDRESS.  ACTUAL WOULD BE CHANGED
*         IF OVERFLOW-ACTION PROCESSING EXECUTED THIS SAME FUNCTION.
  
 GFV8     SA2    A0-MNSAVEA0  RESTORE A0
          SA3    A0-MNRETURN  RETURN THRU SAVED RETURN ADDRESS
          SA0    X2 
          SB7    X3 
          JP     B7          RETURN 
  
*         OVERFLOW-ACTION PROCESSING. 
  
 GFV12    SX1    GFVE         ? #EASY# PROCESSOR
          SX2    GFVH         ? #HARD# PROCESSOR
          SA3    A0-NUM       ? SPACE NEEDED
          RJ     =YCMM.GOA   -- GENERAL OVERFLOW ACTION --
          EQ     GFV8        GO TO RETURN 
  
 BFWA     EQU    MNFWA
 NUM      EQU    MNARG2      SIZE 
 GFVE     SPACE  4,10 
**        GFVE - EASY CASE SUBROUTINE FOR GROW AT FWA VARYING.
* 
* 
*         ENTRY  ARGUMENTS ARE IN SAVE AREA.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X1) = NZ IF SUCCESS.
*                       ZR 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. 
  
  
*         IF THE NECESSARY SPACE IN FRONT OF THE BLOCK IS AVAILABLE,
*         MAKE THE CHANGE; OTHERWISE RETURN WITH FAILURE. 
  
 GFVE     EQ     *+400000B   ENTRY / EXIT 
          BX6    X0          SAVE X0
          SA6    GXVSV
          SA1    A0-BFWA     (B7) = HEADER WORD 0 ADDRESS 
          SA2    A0-NUM      (B5) = AMOUNT OF INCREASE
          SB7    X1-4 
          SB5    X2 
          SA3    B7          HEADER WORD 0
          BX6    X3 
          AX6    18 
          SA4    X6          PREVIOUS HEADER
          MX1    3           (X1) = NZ IF GROWING 1ST BLOCK IN REGION 
          BX7    X1*X4
          BX1    X1-X7
          BX7    -X2         (X7) = -(INCREASE) 
          LX4    -36
          SX2    X4+4        (B4) = LWA+1 OF PREVIOUS BLOCK 
          SB4    X6 
          SB4    B4+X2
          SB6    B7+X7       (B6) = NEW FWA OF HEADER WORD 0
          ZR     X1,GFVE2    IF NOT GROWING 1ST BLOCK 
          LX7    36          POSITION FOR REGION HEADER 
          SB4    X6+B1       (B4) = FWA FREE SPACE
 GFVE2    MX1    0           SET FOR FAILURE
          GT     B4,B6,GFVE11  IF INSUFFICIENT SPACE
          SX6    B5          ADVANCE LENGTH IN HEADER WORD 0
          LX6    36 
          IX6    X6+X3
          LX4    36 
          SA6    A3 
          IX0    X4+X7       (X0) = NEW VALUE FOR PREVIOUS HEADER 
          SB4    A4          (B4) = ADDRESS OF PREVIOUS HEADER
          SX1    B7           ? (X1) = CURRENT BLOCK HDR FWA
          SX2    B7-B5        ? (X2) = NEW BLOCK HDR FWA
                              ? (B1) = 1 - CALL P-M SUBR IF TC = 2
          RJ     =XCMM.PPM   -- PROCESS POINTER MAINTENANCE --
          SA1    B7          MOVE HEADER DOWN BY INCREASE 
          BX6    X1 
          SA6    B7-B5
          SA2    A1+B1
          SA3    A2+B1       (X3) = HEADER WORD 2 (GROUP-ID)
          BX6    X2 
          LX7    X3 
          SA6    A6+B1
          SA7    A6+B1
          SA4    A3+B1
          BX6    X4 
          SA6    A7+B1
          BX7    X0          STORE PREV. HDR WITH UPDATED FWD 
          SA7    B4 
          SB7    B7-B5       (B7) = NEW HEADER FWA
          SA2    X1          HEADER WORD 0 OF NEXT BLOCK
          SX7    X1 
          SX0    B5 
          LX0    18 
          ZR     X7,GFVE4    IF LAST BLOCK IN REGION
          IX6    X2-X0       ADJUST BKD OF NEXT HEADER
          SA6    A2 
 GFVE4    SA4    A0-CURALL   ADVANCE TOTAL ALLOCATED WORDS
          SX7    X4+B5
          SA7    A4 
          ZR     X3,GFVE10   IF NO GROUP-ID 
          SB6    X3 
          SA1    X3          NEXT ENTRY IN CHAIN
          ZR     B6,GFVE6    IF LAST ENTRY
          IX6    X1-X0       ADJUST GBKD
          SA6    A1 
 GFVE6    LX3    -18         ADJUST PREVIOUS ENTRY IN CHAIN 
          SX4    X3 
          SA2    X3 
          NZ     X4,GFVE8    IF NOT 1ST ENTRY IN CHAIN
          LX3    -18         (B4) = GROUP-ID
          SB4    X3 
          SA2    A0-P.GID    FIND P.GID ENTRY TO ADJUST GFWD
          SA2    X2+B1
 GFVE7    SA2    A2-B1       NEXT ENTRY 
          BX6    X2 
          AX6    36 
          SB6    X6 
          NE     B4,B6,GFVE7  LOOP UNTIL MATCH
 GFVE8    LX0    -18         ADJUST GFWD
          IX6    X2-X0
          SA6    A2 
 GFVE10   SX1    B1          (X1) = NZ - SUCCESS
 GFVE11   SA2    GXVSV       RESTORE X0 
          BX0    X2 
          EQ     GFVE        RETURN 
  
 GXVSV    BSS    4           REGISTER SAVE AREA 
          TTL    COMMON MEMORY MANAGER, V1.0, CMM.GLV - GROW AT LWA VARY
,ING
 CMM.GLV  EJECT 
***       CMM.GLV - GROW AT LWA VARYING.
* 
* 
*              THE SPECIFIED NUMBER OF WORDS ARE ADDED TO THE BLOCK AT
*         THE LWA END.  THE INITIAL CONTENTS OF THE ADDED WORDS ARE 
*         UNDEFINED.  IF THE NUMBER SPECIFIED IS ZERO (0), NO CHANGE
*         TO THE BLOCK IS MADE. 
* 
*         ENTRY  (X1) = BITS 59-30 -- NOT REFERENCED BY CMM.
*                       BITS 29-0  -- BLOCK-FWA.
*                (X2) = NUMBER-OF-WORDS.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  GLV 
 CMM.GLV  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          SA3    RA65 
          SX6    A0          SAVE A0
          BX3    -X3
  
 IS       IFSAFE
          SX1    X1 
          SX3    X3 
          PL     X3,GLV102
          UERR   CMEFST,0,3RGLV  ILLEGAL 1ST CALL TO CMM
  
 GLV102   BSS    0
 IS       ENDIF 
  
          SA3    X3          (A0) = FL
          SA0    X3 
          SA6    A0-MNSAVEA0  SAVE A0 
  
 IS       IFSAFE
          SX7    3RGLV       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.GLV     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
          SA3    A0-IMAPM 
          ZR     X3,GLV104
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 GLV104   SB7    B1           ? (B7) = 1 - VARIABLE BLOCK 
          RJ     =XCMM.CAB   -- CHECK ACTIVE BLOCK -- 
          LX6    59-0 
          MI     X6,GLV106   IF REQUIRED SIZE-CODE BIT SET
          UERR   CMESCV,0    SIZE-CODE VIOLATION
  
 GLV106   PL     X2,GLV108   IF NUM \ 0 
          UERR   CMENUM,0    ILLEGAL NUM
  
 GLV108   BSS    0
 IS       ENDIF 
  
*         FOR THIS FUNCTION, USE IN-LINE CODE FOR INITIAL #EASY#
*         ATTEMPT, TO MAKE THE COMMON CASE AS FAST AS POSSIBLE. 
  
          SA3    X1-4        (X3) = HEADER WORD 0 
          SX7    X3          (X7) = FWD 
          SX1    X1          (X1) = BLOCK-FWA ONLY
          NZ     X7,GLV6     IF NOT LAST BLOCK IN REGION
          ERRNZ  P.ENDZ-1 
          SA4    A0-B1       IF IN PRIMARY VP REGION, ENDZ IS THE 
          SA4    X4           DESIRED VALUE FOR FWD 
          SX7    A4          (X7) = FWD IF PRIMARY VP REGION
          AX4    18 
          SB5    X1 
          SB4    X4 
          GT     B5,B4,GLV6  IF PRIMARY VP REGION 
          BX4    X3          CHAIN BACKWARD TO REGION HEADER
          MX6    3
 GLV4     AX4    18 
          SA4    X4          NEXT-LOWER HEADER
          BX7    X6*X4
          BX7    X7-X6
          ZR     X7,GLV4     IF NOT REGION HEADER 
          SX7    X4          (X7) = FWD 
 GLV6     IX7    X7-X1       SPACE AVAILABLE FOR BLOCK
          LX3    -36         SET NEW LENGTH 
          IX6    X2+X3
          SB6    X6          NEW LENGTH 
          SB7    X7          MAXIMUM LENGTH WITHOUT MOVE
          LX6    36 
          GT     B6,B7,GLV12  IF NOT ENOUGH SPACE 
          SA6    A3          STORE HEADER WITH NEW LENGTH 
          SA4    A0-CURALL   ADVANCE CURRENT ALLOCATED WORDS
          IX7    X4+X2
          SA7    A4 
          SA3    A3+B1       HEADER WORD 1
          SB4    X3          (B4) = AUX1
          MX6    -2          (B7) = TC-1
          LX3    2
          BX4    -X6*X3 
          SB7    X4 
          ZR     B7,GLV7     IF TYPE-CODE 1 
          SB7    B7-B1       TC-2 
          NE     B7,B1,GLV10  IF TYPE-CODE 2 OR 4 
          SA4    B4          GET POINTER-WORD ADDRESS FROM
          LX3    -2-18        (AUX1) + AUX2 
          SB7    X4 
          SB4    B7+X3
 GLV7     SA3    =XCMM.NOL   GET NO LENGTH FLAG 
          NZ     X3,GLV10    JP IF LENGTH NOT TO BE SET 
          SA1    B4          GET POINTER WORD 
          LX2    30 
          IX6    X1+X2
          SA6    A1 
  
*         EXIT POINT FOR INITIAL #EASY# ATTEMPT.
  
 GLV10    SA3    A0-MNSAVEA0  RESTORE A0
          SA0    X3 
          EQ     CMM.GLV     RETURN 
  
*         #EASY# ATTEMPT WAS NOT SUCCESSFUL.  SAVE ARGUMENTS AND
*         RETURN ADDRESS.  IF OVERFLOW-ACTION CODE IS PRESENT, CHECK
*         DEFAULT TRIGGER LEVEL AND, IF NOT REACHED, MAKE ONE TRY AT
*         COMPLETING THE REQUEST VIA THE #HARD# ATTEMPT.
  
 GLV12    BX6    X1          SAVE ENTRY ARGS
          LX7    X2 
          SA6    A0-BFWA
          SA7    A0-NUM 
  
 IF       IFFAST
          SA3    CMM.GLV     SAVE RETURN ADDRESS
          LX3    30 
          BX6    X3 
          SA6    A0-MNRETURN
          SX7    3RGLV       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
 IF       ENDIF 
  
          SX2    =YCMM.GOA
          PL     X2,GLV20    IF OVERFLOW-ACTION CODE PRESENT
          SX1    B1           ? SO TO ABORT IF EXCEEDED 
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --
          RJ     GLVH 
          NZ     X1,GLV16    IF SUCCESSFUL
          MERR   ERRFAIL     CANNOT CONTINUE
  
*         RETURN THRU SAVED RETURN ADDRESS.  ACTUAL WOULD BE CHANGED
*         IF OVERFLOW-ACTION PROCESSING EXECUTED THIS SAME FUNCTION.
  
 GLV16    SA2    A0-MNSAVEA0  RESTORE A0
          SA3    A0-MNRETURN  RETURN THRU SAVED RETURN ADDRESS
          SA0    X2 
          SB7    X3 
          JP     B7          RETURN 
  
*         OVERFLOW-ACTION PROCESSING. 
  
 GLV20    SX1    GLVE         ? #EASY# PROCESSOR
          SX2    GLVH         ? #HARD# PROCESSOR
          SA3    A0-NUM       ? SPACE NEEDED
          RJ     =YCMM.GOA   -- GENERAL OVERFLOW ACTION --
          EQ     GLV16       GO TO RETURN 
 GLVE     SPACE  4,10 
**        GLVE - EASY CASE PROCESSOR FOR GROW AT LWA VARYING. 
* 
* 
*         ENTRY  ARGUMENTS ARE IN SAVE AREA.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X1) = NZ IF SUCCESS.
*                       ZR 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. 
  
  
*         IF THE NECESSARY SPACE PAST THE BLOCK IS AVAILABLE, MAKE
*         THE CHANGE; OTHERWISE RETURN WITH FAILURE.
  
 GLVE     EQ     *+400000B   ENTRY / EXIT 
          SA1    A0-BFWA     (X1) = BLOCK-FWA 
          SA2    A0-NUM      (X2) = INCREASE
          SA3    X1-4        (X3) = HEADER WORD 0 
          SX7    X3          (X7) = FWD 
          NZ     X7,GLVE4    IF NOT LAST BLOCK IN REGION
          SA4    A0-B1       IF IN PRIMARY VP REGION, ENDZ IS THE 
          SA4    X4           DESIRED VALUE FOR FWD 
          AX4    18 
          SB5    X1 
          SB4    X4 
          SX7    A4          (X7) = FWD IF PRIMARY VP REGION
          GT     B5,B4,GLVE4  IF PRIMARY VP REGION
          BX4    X3          CHAIN BACKWARD TO REGION HEADER
          MX6    3
 GLVE2    AX4    18 
          SA4    X4          NEXT-LOWER HEADER
          BX7    X6*X4
          BX7    X7-X6
          ZR     X7,GLVE2    IF NOT REGION HEADER 
          SX7    X4          (X7) = FWD 
 GLVE4    IX7    X7-X1       SPACE AVAILABLE FOR BLOCK
          LX3    -36         SET NEW LENGTH 
          IX6    X2+X3
          SB6    X6          NEW LENGTH 
          SB7    X7          MAXIMUM LENGTH WITHOUT MOVE
          MX1    0           SET FOR FAILURE
          GT     B6,B7,GLVE  IF NOT ENOUGH SPACE, (X1) = 0
          LX6    36          STORE HEADER WITH NEW LENGTH 
          SA6    A3 
          SA4    A0-CURALL   ADVANCE CURRENT ALLOCATED WORDS
          IX6    X4+X2
          SA6    A4 
          SX1    A3           ? (X1) = CURRENT HEADER FWA 
          SX2    A3           ? (X2) = NEW (SAME) HEADER FWA
          SB1    B0           ? (B1) = 0 - DO NOT CALL P-M SUBR 
          RJ     =XCMM.PPM   -- PROCESS POINTER MAINTENANCE --
          SX1    B1          (X1) = NZ FOR SUCCESS
          EQ     GLVE        RETURN 
 GFVH     SPACE  4,10 
**        GFVH - HARD CASE SUBROUTINE FOR GROW AT FWA VARYING.
*         GLVH - HARD CASE SUBROUTINE FOR GROW AT LWA VARYING.
* 
* 
*         ENTRY  ARGUMENTS ARE IN SAVE AREA.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X1) = NZ IF SUCCESS.
*                       ZR 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. 
  
  
 GFVH     EQ     *+400000B   ENTRY / EXIT 
 GLVH     EQU    GFVH 
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    GXVHSV 
          SA7    A6+B1
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    A7+B1
          SA7    A6+B1
  
*         FIND OUT IF THERE IS ROOM IN THE REGION FOR THE BLOCK WITH
*         THE INCREASED SIZE.  IF SO, DO THE REARRANGING AND THEN CALL
*         THE #EASY# PROCESSOR. 
  
          SA3    A0-BFWA
          MX0    3
          SA4    X3-4        HEADER WORD 0
          SB2    A4          (B2) = BLOCK HEADER FWA
 GXVH2    AX4    18          GET REGION FWA 
          SA4    X4 
          BX7    X0*X4
          BX7    X0-X7
          ZR     X7,GXVH2    LOOP TO REGION HEADER
          SX6    A4          SAVE REGION FWA
          SX1    A4           ? (X1) = REGION FWA 
          SA2    A0-NUM       ? (X2) = SPACE NEEDED 
          SA6    RFWA 
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          ZR     X6,GXVH10   IF SPACE NOT AVAILABLE IN REGION 
          BX0    X6          (X0) = NEW REGION FWA
          BX1    X7           ? (X1) = TOTAL FREE WORDS IN REGION 
          MX2    0            ? (X2) = 0 - INCREASE ALREADY ACCOUNTED 
          RJ     =XCMM.CRD   -- COMPUTE REGION DISTRIBUTION --
          SB3    X6          (B3) = FIXED BLOCK SHARE 
          SA3    A0-MNFNAME 
          SX3    X3-3RGLV 
          NZ     X3,GFVH6    IF IN CMM.GFV
  
*         CMM.GLV - REARRANGE TO PUT SPACE AFTER BLOCK. 
  
          SX1    B2           ? (X1) = FWA CURRENT BLOCK HEADER 
          SX2    B3           ? (X2) = SPACE FOR FRONT OF REGION
          SA3    A0-NUM       ? (X3) = SPACE FOR END OF BLOCK 
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
          BX1    X0           ? (X1) = NEW VP REGION FWA
          SX2    B3           ? (X2) = SPACE FOR FIXED BLOCK SHARE
          RJ     =XCMM.AFR   -- ADD FREE REGION --
 GLVH4    RJ     GLVE        #EASY# PROCESSOR 
          ZR     X1,*+1S17   SYSTEM ERROR 
  
*         COMMON RETURN POINT.
  
 GXVH5    SA4    GXVHSV      RESTORE B2 
          SB2    X4-0 
          SA2    A4+B1       RESTORE B3 
          SA3    A2+B1       RESTORE X0 
          SB3    X2-0 
          BX0    X3 
          SA5    A3+B1       RESTORE X5 
          EQ     GLVH        RETURN, (X1) = NZ IF SUCCESS 
  
*         CMM.GFV - REARRANGE TO PUT SPACE BEFORE BLOCK.
  
 GFVH6    SA1    B2           ? (X1) = FWA PREVIOUS HEADER
          AX1    18 
          SX1    X1 
          SX2    B3           ? (X2) = SPACE FOR FRONT OF REGION
          SA3    A0-NUM       ? (X3) = SPACE FOR FRONT OF BLOCK 
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
          BX1    X0           ? (X1) = NEW VP REGION FWA
          SX2    B3           ? (X2) = SPACE FOR FIXED BLOCK SHARE
          RJ     =XCMM.AFR   -- ADD FREE REGION --
 GFVH8    RJ     GFVE        #EASY# PROCESSOR 
          ZR     X1,*+1S17   SYSTEM ERROR 
          EQ     GXVH5       GO TO RETURN 
  
*         IF THE BLOCK IS CURRENTLY IN A SECONDARY VP REGION, FIND
*         OUT IF THERE IS ROOM IN THE PRIMARY VP REGION FOR THE 
*         BLOCK WITH ITS INCREASED SIZE.  IF SO, MOVE IT THERE (TO
*         THE FRONT OF THE REGION).  IF NOT, FAILURE. 
  
 GXVH10   SA4    A0-B1       (B6) = PRIMARY VP REGION FWA 
          SA4    X4 
          AX4    18 
          SB6    X4 
          SA2    RFWA        (B7) = REGION FWA OF BLOCK 
          BX1    X1-X1       SET FOR FAILURE
          SB7    X2 
          EQ     B6,B7,GXVH5  IF ALREADY IN PRIMARY VP REGION 
          SA3    B2          HEADER WORD 0
          AX3    36 
          SX3    X3+4 
          SA2    A0-NUM 
          IX5    X3+X2       (X5) = NEW SIZE OF BLOCK + HDR 
          SX1    B6           ? (X1) = FWA PRIMARY VP REGION
          BX2    X5           ? (X2) = SPACE NEEDED 
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          BX1    X1-X1       SET FOR FAILURE
          ZR     X6,GXVH5    IF SPACE NOT AVAILABLE 
          LX1    X7           ? (X1) = TOTAL FREE WORDS IN REGION 
          BX0    X6          (X0) = NEW PRIMARY VP REGION FWA 
          MX2    0            ? (X2) = 0 - INCREASE ALREADY ACCOUNTED 
          RJ     =XCMM.CRD   -- COMPUTE REGION DISTRIBUTION --
          SB3    X6          (B3) = FIXED BLOCK SHARE 
          BX1    X0           ? (X1) = PRIMARY VP REGION FWA
          SX2    B3           ? (X2) = SPACE FOR FIXED BLOCK SHARE
          LX3    X5           ? (X3) = SPACE NEEDED FOR BLOCK 
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
          BX1    X0           ? (X1) = PRIMARY VP REGION FWA
          SX2    B3           ? (X2) = SPACE FOR FIXED BLOCK SHARE
          RJ     =XCMM.AFR   -- ADD FREE REGION --
          SX0    X0+B3       ADVANCE PRIMARY VP REGION FWA
          SA3    A0-MNFNAME  (X5) = 0 IF IN CMM.GLV 
          SX4    B0          SET FOR BLOCK JUST PAST REGION HEADER
          SX5    X3-3RGLV 
          ZR     X5,GXVH14   IF CMM.GLV 
          SA4    A0-NUM      SET FOR BLOCK TO HAVE SPACE AT FRONT 
 GXVH14   SX1    B2           ? (X1) = EXISTING BLOCK HEADER FWA
          IX2    X0+X4        ? (X2) = NEW BLOCK HEADER FWA 
          BX3    X0           ? (X3) = PRIMARY VP REGION FWA
          SX2    X2+B1
          RJ     =XCMM.MOB   -- MOVE ONE BLOCK -- 
  
*         CHECK IF THE BLOCK MOVED OUT OF THE SECONDARY VP REGION WAS 
*         THE ONLY BLOCK IN THAT REGION.  IF SO, FORM FREE REGION.
*         CMM.MOB HAS ALREADY ADJUSTED THE POINTERS TO FREE THE BLOCK.
*         (B2) = THE ADDRESS OF THE HEADER WORD 0 OF THE FREED BLOCK. 
  
          SA1    B2          (X1) = HEADER WORD 0, PREVIOUS COPY         CMMA023
          SX3    X1          (X3) = FWD                                  CMMA023
          NZ     X3,GXVH24   IF STILL MORE BLOCKS IN THIS SEC VP REGION 
          LX1    -18         FETCH PREVIOUS HEADER                       CMMA023
          SA2    X1                                                      CMMA023
          LX4    X2,B1       CHECK FOR REGION HEADER                     CMMA023
          LX1    18                                                      CMMA023
          MI     X4,GXVH24   IF STILL MORE BLOCKS IN REGION 
  
*         FORM AND COMBINE FREE REGIONS.
  
          SA3    X2          (X3) = NEXT HEADER 
          BX1    X2          (X1) = PREVIOUS HEADER 
          AX1    18 
          SA1    X1 
          PL     X3,GXVH20   IF NEXT IS FREE
          MI     X1,GXVH22   IF PREVIOUS IS NOT FREE
          BX3    X2          USE CURRENT HEADER 
 GXVH20   MI     X1,GXVH21   IF PREVIOUS IS NOT FREE
          SA2    X1          SET A2 TO PREVIOUS HEADER
 GXVH21   BX4    X3-X2       NOW  (X2) = BKD2, FWD2 
          SX1    X4               (X3) = BKD3, 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 
 GXVH22   MX7    -36         SET NEW FREE REGION
          BX6    -X7*X2 
          SA6    A2 
  
*         GO COMPLETE FUNCTION VIA THE #EASY# ATTEMPT.
  
 GXVH24   ZR     X5,GLVH4    IF CMM.GLV 
          EQ     GFVH8       CMM.GFV
  
 GXVHSV   BSS    4           B2, B3, X0, X5 SAVE AREA 
 RFWA     BSS    1           REGION FWA 
  
