*DECK CMMVM 
          IDENT  CMM.VM 
  
          TITLE  COMMON MEMORY MANAGER, V1.0, - VARIABLE BLOCK SUBROUTIN
,ES 
*CALL CMMCOM
          COMMENT  "SUBSYS"VARIABLE BLOCK SUBROUTINES.
          B1=1
 CMM.AFR  TITLE  CMM.AFR - ADD FREE REGION
**        CMM.AFR - ADD FREE REGION.
* 
* 
*              THIS ROUTINE ADDS A FREE REGION AT THE FWA OF THE
*         SPECIFIED VARIABLE REGION, AND MOVES ITS ORIGIN UP
*         ACCORDINGLY.  IT IS KNOWN THAT THERE IS ROOM FOR THE REGION 
*         WITHOUT MOVING ANY BLOCKS.
* 
*         ENTRY  (X1) = VP REGION FWA.
*                (X2) = SIZE OF FREE REGION.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 3, 4, 6, 7.
*                B - NONE.
*                A - 3, 4, 6. 
  
  
          ENTRY  CMM.AFR
 CMM.AFR  EQ     *+400000B   ENTRY / EXIT 
          ZR     X2,CMM.AFR  IF ZERO-LENGTH REGION SPECIFIED
          SA4    X1          (X4) = REGION HEADER 
          SA3    X4          ADJUST BKD IN NEXT REGION HEADER 
          LX3    -18
          IX6    X3+X2
          LX6    18 
          SA6    A3 
          LX4    -36         ADJUST BKD IN 1ST VP BLOCK HEADER
          SX6    X4 
          ZR     X6,AFR1     IF REGION EMPTY
          SA3    X6 
          LX3    -18
          IX6    X3+X2
          LX6    18 
          SA6    A3 
 AFR1     LX4    18          GET PREVIOUS REGION HEADER 
          SA3    X4 
          MI     X3,AFR2     IF NOT A FREE REGION 
          IX6    X3+X2       ADJUST FWD TO MAKE JUST ONE LARGER 
          SA6    A3           FREE REGION 
          IX3    X1+X2       (X3) = NEW VP REGION FWA 
          LX4    18 
          EQ     AFR4 
  
 AFR2     IX6    X1+X2       FORM FREE REGIOH HEADER AND STORE AT 
          SX7    A3           PREVIOUS VP REGION FWA
          SX3    X6          (X3) = NEW VP REGION FWA 
          LX7    18 
          BX6    X6+X7
          SA6    X1 
          SX6    A3          ADJUST BKD FOR NEW VP REGION HEADER
          IX4    X4-X6
          IX4    X4+X1
          LX4    18 
 AFR4     BX6    X4          STORE NEW VP REGION HEADER 
          SA6    X3 
          EQ     CMM.AFR     RETURN 
 CMM.CRD  TITLE  CMM.CRD - COMPUTE REGION DISTRIBUTION
**        CMM.CRD - COMPUTE REGION DISTRIBUTION.
* 
* 
*              THIS ROUTINE COMPUTES THE OPTIMUM DIVISION BETWEEN 
*         FIXED AND VARIABLE BLOCKS OF A GIVEN AMOUNT OF FREE SPACE.
*         THIS IS NORMALLY DONE WHEN A VARIABLE REGION HAS TO BE
*         REARRANGED IN ORDER TO GET MORE SPACE.  THE SECOND PARAMETER
*         TAKES INTO ACCOUNT THE KNOWN AMOUNT THAT EITHER FIXED OR
*         VARIABLE SPACE IS GOING TO GROW.
* 
*         ENTRY  (X1) = AMOUNT OF FREE SPACE TO DIVIDE (A). 
*                (X2) = IF > 0, ADD TO VARIABLE BLOCK TOTAL.
*                       IF < 0, ADD TO FIXED BLOCK TOTAL. 
* 
*                (B1) = 1.
*                (A0) = FL. 
*         EXIT   (X6) = AMOUNT OF (A) TO ASSIGN TO FIXED BLOCKS (F).
*                       SUBSEQUENTLY, NORMALLY GETS PUT INTO A FREE 
*                       REGION.  IF EITHER (F) OR (A-F) IS < MINFXVR, 
*                       IT GETS ASSIGNED TO THE OTHER VALUE, SO THE 
*                       SMALL VALUE = 0.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.CRD
 CMM.CRD  EQ     *+400000B   ENTRY / EXIT 
          BX6    X5          SAVE X5
          SA6    CRDSV
          SB5    B0          (B5) = USED FIXED SPACE
          SB6    B0          (B6) = USED VARIABLE SPACE 
          PL     X2,CRD2     IF *INC* TO GO TO VP SPACE 
          IX6    X1+X2       REDUCE FREE SPACE BY *INC* 
          BX7    -X2         ADD *INC* TO FIXED SPACE 
          SB5    X7 
          EQ     CRD3 
  
 CRD2     IX6    X1-X2       REDUCE FREE SPACE BY *INC* 
          SB6    X2          ADD *INC* TO VARIABLE SPACE
 CRD3     SB4    X6          (B4) = FREE SPACE
          SA1    RA65        (X5) = 1ST REGION FWA
          BX1    -X1
          SX5    X1+B1
  
*         COMPUTE TOTAL FIXED AND VARIABLE SPACE. 
  
 CRD5     SX1    X5 
          SA5    X1          NEXT REGION HEADER 
          PL     X5,CRD5     IF FREE REGION 
          DF     X5,CRD6     IF VP REGION 
          SX6    X5          ADD FIXED BLOCK SIZE TO TOTAL FIXED SPACE
          ZR     X6,CRD8     IF AT TRAILER
          IX6    X6-X1
          SB5    B5+X6
          EQ     CRD5        LOOP 
  
 CRD6     RJ     CMM.CVS     -- COMPUTE VP REGION SPACE -- (X1) = FWA 
          SB6    B6+X3       ADD USED SPACE TO TOTAL VP SPACE 
          EQ     CRD5        LOOP 
  
*         COMPUTE DISTRIBUTION. 
  
 CRD8     MX6    0           SET FOR NONE TO GO TO FIXED SPACE
          SX1    B4          FREE 
          ZR     B5,CRD10    IF NO FIXED SPACE
          SX2    B5          FIXED
          SX3    B5+B6       FIXED+VAR
          IX4    X1*X2       FREE*FIXED 
          IX7    X4/X3,B7    FP SHARE = FREE * [FIXED/(FIXED+VAR)]
          IX3    X1-X7       VP SHARE = TOTAL - (FP SHARE)
          SX4    X7-MINFXVR 
          MI     X4,CRD10    IF TOTAL FIXED SPACE < MINFXVR 
          SX6    B4          SET FOR ALL TO GO TO FIXED SPACE 
          SX2    X3-MINFXVR 
          MI     X2,CRD10    IF TOTAL VARIABLE SPACE < MINFXVR
          BX6    X7          (X6) = COMPUTED AMOUNT 
 CRD10    SA5    CRDSV       RESTORE (X5) 
          EQ     CMM.CRD     RETURN, (X6) = AMOUNT OF FIXED SPACE 
  
 CRDSV    BSS    1           X5 SAVE AREA 
 CMM.CVS  TITLE  CMM.CVS - COMPUTE VARIABLE SPACE 
**        CMM.CVS - COMPUTE VARIABLE SPACE. 
* 
* 
*              THIS ROUTINE COMPUTES THE TOTAL AND USED SPACE FOR A 
*         GIVEN VARIABLE REGION.
* 
*         ENTRY  (X1) = REGION FWA. 
*                (B1) = DIVISION IF OTHER THAN HHA (LOC). 
*                       1 - DEFAULT TO HHA. 
*                (A0) = FL. 
* 
*         EXIT   (X1) = TOTAL REGION SIZE.
*                (X2) = AMOUNT OF (X1) WHICH IS BELOW *LOC*.
*                (X3) = TOTAL USED SPACE. 
*                (X4) = TOTAL USED SPACE BELOW *LOC*. 
*                (B7) = NUMBER OF BLOCKS IN REGION. 
*                (B1) = 1.
*                (A0) = FL. 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 7. 
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.CVS
 CMM.CVS  EQ     *+400000B   ENTRY / EXIT 
          SX6    B4          SAVE B4
          SA6    CVSSV
          SX2    B1          (X2) = LOC 
          SB1    B1-1 
          NZ     B1,CVS2     IF LOC OTHER THAN HHA+1
          SA2    HHA         SET LOC = HHA+1
          SX2    X2+1 
 CVS2     SB1    1           (B1) = 1 
          SX6    B5          SAVE B5
          SX7    B6          SAVE B6
          SA6    A6+B1
          SA7    A6+B1
          BX6    X0          SAVE X0
          SA6    A7+B1
          BX6    X5          SAVE X5
          SA6    A6+B1
          SA3    X1 
          SX6    X3 
          IX5    X6-X1       (X5) = TOTAL REGION SIZE FOR RETURN
          IX7    X2-X1       (X7) = LOC-ADR 
          IX6    X5-X7       (B4) = TBL = TOTAL SPACE BELOW LOC 
          BX0    X5-X7            = MAX[MIN[(FWD-ADR),(LOC-ADR)],0] 
          AX6    59 
          BX0    -X6*X0 
          BX6    X0-X5
          SB4    X6 
          PL     X6,CVS4
          SB4    B0 
 CVS4     SB6    B0          (B6) = F = 0 IF REGION ENTIRELY ABOVE LOC
          MX0    0           (X0) = UBL = USED SPACE BELOW LOC
          IX7    X1-X2
          PL     X7,CVS6     IF REGION ENTIRELY ABOVE 
          SB6    -B1         F = -1 IF REGION ENTIRELY BELOW LOC
          SX6    X3          FWD
          IX7    X2-X6
          PL     X7,CVS6     IF REGION ENTIRELY BELOW 
          SB6    B1          F = 1 TO INDICATE UBL MUST BE COMPUTED 
          SX0    B1          UBL = 1 FOR REGION HEADER
 CVS6     SB5    B1          (B5) = TOTAL USED SPACE
          SB7    B0          (B7) = BLOCK COUNT 
          AX3    36          (X3) = POINTER TO 1ST BLOCK
          SX3    X3 
 CVS7     ZR     X3,CVS10    IF LAST BLOCK PROCESSED
          SB7    B7+B1       ADVANCE BLOCK COUNT
          SA1    X3          NEXT BLOCK HEADER WORD 0 
          SX3    X1 
          LX1    -36         ADD LENGTH + HDR TO USED SPACE 
          SX6    X1+4 
          SB5    B5+X6
          NE     B6,B1,CVS7  IF UBL OK, I.E., LOC NOT WITHIN REGION 
          SX1    A1          (X1) = HEADER WORD 0 ADDRESS 
          IX4    X1+X6       (X4) = LWA+1 OF BLOCK
          IX7    X2-X4
          MI     X7,CVS8     IF BLOCK NOT ENTIRELY BELOW LOC
          IX0    X0+X6       ADVANCE USED SPACE BELOW LOC = TOTAL SIZE
          EQ     CVS7        LOOP 
  
 CVS8     IX6    X1-X2
          PL     X6,CVS7     IF BLOCK ENTIRELY ABOVE LOC
          IX0    X0-X6       ADD LOC - (HDR FWA) TO UBL 
          EQ     CVS7        LOOP 
  
 CVS10    BX4    X0          (X4) = USED SPACE BELOW LOC
          PL     B6,CVS11    IF USED SPACE BELOW LOC ALREADY DONE 
          SX4    B5          SET TO TOTAL USED SPACE
 CVS11    SX3    B5          (X3) = TOTAL USED SPACE
          SX2    B4          (X2) = TOTAL SPACE BELOW LOC 
          BX1    X5          (X1) = TOTAL REGION SIZE 
          SA5    CVSSV       RESTORE B4 
          SB4    X5 
          SA5    A5+B1       RESTORE B5 
          SB5    X5 
          SA5    A5+B1       RESTORE B6 
          SB6    X5 
          SA5    A5+B1       RESTORE X0 
          BX0    X5 
          SA5    A5+B1       RESTORE X5 
          EQ     CMM.CVS     RETURN 
  
 CVSSV    BSS    5           REGISTER SAVE AREA 
 CMM.MOB  TITLE  CMM.MOB - MOVE ONE BLOCK 
**        CMM.MOB - MOVE ONE BLOCK. 
* 
* 
*              THIS ROUTINE MOVES ONE BLOCK IN A VARIABLE REGION TO 
*         ANOTHER LOCATION IN THE SAVE REGION OR TO A DIFFERENT REGION. 
* 
*         ENTRY  (X1) = CURRENT HEADER FWA. 
*                (X2) = NEW HEADER FWA. 
*                (X3) = 0  - SAME REGION. 
*                       NZ - HEADER ADDRESS WITHIN DIFFERENT REGION 
*                            JUST PRIOR TO NEW LOCATION OF BLOCK.  MAY
*                            BE A BLOCK OR REGION HEADER. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4, 6, 7.
*                B - 5, 6, 7. 
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.MOB
 CMM.MOB  EQ     *+400000B   ENTRY / EXIT 
          SB7    X3          (B7) = SAME/DIFFERENT REGION FLAG
                              ? (X1) = CURRENT HEADER FWA 
                              ? (X2) = NEW HEADER FWA 
                              ? (B1) = 1 - CALL P-M-SUBR IF TYPE-CODE =2
          RJ     CMM.PPM     -- PROCESS POINTER MAINTENANCE --
          SB5    X1          (B5) = CURRENT FWA 
          SB6    X2          (B6) = NEW FWA 
  
*         SET ADJUSTMENTS TO ADJACENT HEADER POINTERS FOR THE CASE OF 
*         A MOVE WITHIN THE SAME REGION.
  
          IX7    X2-X1       (X7) = ADJ TO NEXT BKD 
                                  = (NEW FWA) - (CURRENT FWA) 
          BX4    X7          (X4) = ADJ TO PREVIOUS FWD 
          SA2    B5          HEADER WORD 0
          SX6    X2          FWD
          ZR     B7,MOB2     IF MOVING TO THE SAME VP REGION
  
*         SET ADJUSTMENTS TO ADJACENT HEADER POINTERS FOR THE CASE OF 
*         A MOVE TO A DIFFERENT REGION. 
  
          LX2    -18
          SX3    X2 
          IX7    X3-X1       (X7) = ADJ TO NEXT BKD 
          LX2    18               = (PREV BLOCK FWA) - (CURRENT FWA)
          IX4    X6-X1       (X4) = (NEXT BLOCK FWA OR 0) - (CUR. FWA)
  
*         MAKE ADJUSTMENTS TO POINTERS. 
  
 MOB2     ZR     X6,MOB4     IF LAST BLOCK IN REGION
          SA3    X6          ADJUST BKD IN NEXT HEADER
          LX7    18 
          IX6    X3+X7
          SA6    A3 
 MOB4     LX2    -18         ADJUST FWD IN PREVIOUS HEADER
          SA3    X2 
          LX6    X3,B1
          MI     X6,MOB5     IF NOT FWA OF REGION 
          LX4    36          FWD IS IN BITS 36-53 
 MOB5     IX6    X3+X4
          SA6    A3 
          ZR     B7,MOB10    IF MOVING WITHIN SAME VP REGION
  
*         ADJUST POINTERS IN ADJACENT HEADERS IN REGION TO WHICH
*         BLOCK IS BEING MOVED. 
  
          SA1    B7          HEADER PRIOR TO NEW BLOCK POSITION 
          LX4    X1,B1
          SX6    B7          FORM NEW FWD AND BKD FOR BLOCK BEING MOVED 
          LX6    18 
          MX7    -36
          MI     X4,MOB7     IF BLOCK HEADER
          LX1    -36         IN REGION HDR, USE FWD IN BITS 36-53 
 MOB7     SX3    X1 
          BX6    X6+X3
          SA2    B5          STORE NEW HEADER WORD 0 IN NEW POSITION
          BX7    X7*X2
          BX7    X7+X6
          SA7    B6 
          SX7    B6          ADJUST FWD IN PREVIOUS HEADER
          IX6    X7-X3
          IX6    X1+X6
          MI     X4,MOB8     RESTORE POSITION OF HEADER 
          LX6    36 
 MOB8     SA6    A1 
          ZR     X3,MOB10    IF TO BE LAST BLOCK IN REGION
          SX2    B7          SET BKD IN NEXT BLOCK HEADER 
          IX2    X7-X2
          LX2    18 
          SA4    X3 
          IX6    X4+X2
          SA6    A4 
  
*         ADJUST GROUP-ID CHAIN, IF PRESENT.
  
 MOB10    SA1    B5+2 
          SX2    X1 
          LX1    -18
          ZR     X1,MOB15    IF NOT IN A BLOCK GROUP
          SX7    B6-B5       (X7) = ADJ TO EITHER GBKD OR GFWD
          SX4    X1          GBKD THIS ENTRY
          ZR     X2,MOB11    IF LAST ENTRY IN CHAIN 
          SA3    X2          ADJUST GBKD IN NEXT ENTRY
          LX3    -18
          IX6    X3+X7
          LX6    18 
          SA6    A3 
 MOB11    SA3    X4          ADJUST GFWD IN PREVIOUS ENTRY
          NZ     X4,MOB13    IF NOT 1ST ENTRY 
          LX1    -18
          SX1    X1 
          SA3    A0-P.GID    FIND P.GID ENTRY TO ADJUST CHAIN 
          SA3    X3+B1
 MOB12    SA3    A3-B1       NEXT ENTRY 
          BX6    X3 
          AX6    36 
          SX6    X6 
          IX6    X6-X1
          NZ     X6,MOB12    LOOP UNTIL MATCH 
 MOB13    IX6    X3+X7       ADJUST GFWD
          SA6    A3 
  
*         MOVE BLOCK. 
  
 MOB15    SA4    B5           ? (X1) = LENGTH + 4 
          AX4    36 
          SX1    X4+4 
          SX2    B5           ? (X2) = CURRENT HEADER FWA 
          SX3    B6           ? (X3) = NEW HEADER FWA 
          ZR     B7,MOB16    IF MOVE TO SAME REGION 
          SX1    X1-1         ? (X1) = LENGTH + 3 
          SX2    X2+B1        ? (X2) = CURRENT HEADER WORD 1 FWA
          SX3    X3+B1        ? (X3) = NEW HEADER WORD 1 FWA
 MOB16    RJ     =XMVE=      -- MOVE DATA --
  
*         CHECK IF OLD-FWA MATCHES EITHER OF THE VALUES SAVED AS AN 
*         ARGUMENT TO THE FUNCTION BEING PROCESSED.  IF SO, THESE 
*         VALUES MUST BE UPDATED TO REFLECT THE MOVE. 
  
          SB7    4           (B7) = HEADER SIZE 
          SA1    A0-MNFWA 
          SX2    B5+B7
          IX3    X1-X2
          SA4    A0-OVERFLOW
          NZ     X3,MOB17    IF NOT SAME BLOCK
          SX7    B6+B7       SET NEW FWA
          SA7    A1 
 MOB17    ZR     X4,MOB18    IF NOT IN OVERFLOW MODE
          SA1    =YCMM.SV+MNEND-MNFWA  IN CMM.POA 
          SA1    A1-1 
          IX3    X1-X2
          NZ     X3,MOB18    IF NOT SAME BLOCK
          SX7    B6+B7       SET NEW FWA
          SA7    A1 
          EQ     CMM.MOB     RETURN 
  
 MOB18    EQU    CMM.MOB
 CMM.PMV  TITLE  CMM.PMV - PROCESS MULTIPLE VARIABLE REGIONS
**        CMM.PMV - PROCESS MULTIPLE VARIABLE REGIONS.
* 
* 
*              THIS ROUTINE DETERMINES WHETHER OR NOT A GIVEN AMOUNT
*         OF FREE SPACE EXISTS IN A SET OF ADJACENT (I.E., NO 
*         INTERVENING FIXED BLOCKS) VARIABLE REGIONS.  IF IT DOES,
*         THEN THIS AREA IS FORMED INTO A SINGLE VARIABLE REGION AND THE
*         NEW ORIGIN IS RETURNED.  NOTE THE FOLLOWING:  
* 
*         - IT IS OK FOR THE INITIAL REGION TO BE A SINGLE FREE REGION. 
*         - IF THE NEEDED SPACE IS NOT AVAILABLE, NOTHING IS CHANGED, 
*           BUT THE CHANGE IS GUARANTEED IF THE NEEDED AMOUNT = 0.
* 
*         ENTRY  (X1) = FWA OF A VP OR FREE REGION. 
*                (X2) = AMOUNT OF SPACE NEEDED IN RESULTING REGION. 
*                (B1) = 1 IF FL INCREASE ALLOWED. 
*                       0 IF NOT ALLOWED. 
*                (A0) = FL. 
* 
*         EXIT   (X6) = NZ - FWA OF RESULTING VARIABLE REGION.
*                       0  - INSUFFICIENT ROOM. 
*                (X7) = TOTAL FREE WORDS IN NEW REGION. 
*                (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.PMV
 CMM.PMV  EQ     *+400000B   ENTRY / EXIT 
          BX6    X5          SAVE X5
          SX5    B1          (X5) = FL INCREASE FLAG
          SB1    1           (B1) = 1 
          SA6    PMVSV
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    A6+B1
          SA7    A6+B1
          SB2    X2          (B2) = SPACE NEEDED
  
*         GET UPPER BOUND OF NEW VARIABLE REGION. 
  
          SB7    X1 
 PMV2     SA3    B7          FIND NEXT FIXED BLOCK
          SB7    X3 
          DF     X3,PMV2     IF NOT FIXED BLOCK 
          SB5    B0          SET THRESHOLD = 0
          NZ     B7,PMV4     IF NOT ABOVE ALL FIXED BLOCKS
          SX2    A3          THRESHOLD FOR FL INCREASE
          IX2    X2-X1        = SIZE/2**THR 
          AX2    THR
          SB5    X2+B1       THR+1 SO AS TO ALWAYS BE > 0 
  
*         GET LOWER BOUND.
  
 PMV4     SB3    B0          INITIALIZE FREE SPACE
          SB4    A3          (B4) = PREVIOUS REGION 
          AX3    18 
          SB6    X3          (B6) = CURRENT REGION
 PMV6     SA3    B6          NEXT HEADER DOWN 
          MI     X3,PMV7     IF NOT FREE REGION 
          SX6    B4-B6       ADD REGION SIZE TO FREE SPACE
          SB3    B3+X6
          SB4    A3          ADVANCE POINTERS 
          AX3    18 
          SB6    X3 
          EQ     PMV6        LOOP 
  
 PMV7     ID     X3,PMV8     IF FIXED BLOCK 
          SB4    A3          ADVANCE POINTERS 
          AX3    18 
          SB6    X3 
          SX1    A3           ? (X1) = REGION FWA 
          RJ     CMM.CVS     -- COMPUTE VARIABLE SPACE -- 
          IX1    X1-X3       (TOTAL SPACE) - (USED SPACE) 
          SB3    B3+X1
          EQ     PMV6        LOOP 
  
 PMV8     SB6    B0          (B6) = AMOUNT OF FL INCREASE 
          SB7    B3-B5       COMPARE AMOUNT OF SPACE REDUCED BY THR 
          LE     B2,B7,PMV15  IF ENOUGH PRESENT 
          ZR     B5,PMV10    IF THR ALREADY TAKEN INTO ACCOUNT
          ZR     X5,PMV10    IF FL INCREASE NOT PERMITTED 
          SA1    A0-MAXFL    (X1) = MAXFL-FL
          SX2    A0          (B7) = FREE SPACE INCLUDING THAT ABOVE FL
          IX1    X1-X2
          SB7    B3+X1
          LE     B2,B7,PMV11  IF ADEQUATE SPACE CAN BE OBTAINED 
 PMV10    MX6    0           RETURN, (X6) = 0 TO SHOW FAILURE 
          EQ     PMV30
  
 PMV11    SB7    B2+B5       (X2) = (NEEDED SPACE)+THR+FLINK-AVAILABLE
          SX2    B7-B3
          SA3    A0-FLINC.C 
          IX2    X2+X3
          IX6    X2-X1        ? (X4) = AMOUNT OF INCREASE 
          BX1    X2-X1               = MIN [(X2),(X1)]
          AX6    59 
          BX1    -X6*X1 
          BX4    X1-X2
          RJ     =XCMM.CFL   -- CHANGE FIELD LENGTH --
  
*         FORM INTO ONE VARIABLE REGION.
  
 PMV15    SX5    -B1         (X5) = NO. OF VP REGIONS BEING ELIMINATED
          SB5    B3+B6       (B2) = NEW TOTAL FREE WORD COUNT 
          SB2    B5-B2
          MX4    0           HEADER NOT STORED FLAG 
          SB3    B4          (B3) = FETCH POINTER 
 PMV16    SA1    B3          NEXT REGION HEADER 
          SB3    X1 
          PL     X1,PMV16    IF FREE REGION 
          ID     X1,PMV25    IF FIXED BLOCK 
          SX5    X5+B1       ADVANCE VP REGION COUNT
          AX1    36          (B6) = FWA OF 1ST BLOCK IN REGION
          SB6    X1 
          NZ     X4,PMV18    IF NEW VP HEADER ALREADY FORMED
          SX4    X1          (X4) = 1ST BLOCK HEADER FWA FOR NEW
          LX4    36                 VP REGION HEADER
          SB7    B4          (B7) = VALUE FOR BKD IN 1ST BLOCK HEADER 
          EQ     PMV20
  
 PMV18    SX1    B6          SET FWD IN HEADER OF LAST BLOCK OF 
          BX7    X7+X1        PREVIOUS VP REGION
          SA7    A2 
 PMV20    SA2    B6          SET BKD IN HEADER OF 1ST BLOCK OF REGION 
          SB6    X2 
          LX2    -18
          MX6    42 
          BX6    X6*X2
          SX1    B7 
          BX6    X6+X1
          LX6    18 
          SA6    A2 
          BX7    X6          (X7) = LAST HEADER FOR INSERTION OF FWD
          SB7    A2          (B7) = BKD FOR 1ST BLOCK IN NEXT REGION
 PMV21    ZR     B6,PMV16    LOOP TO END OF REGION
          SA2    B6          NEXT HEADER
          SB6    X2 
          SB7    A2          (B7) = HEADER ADDRESS
          BX7    X2          (X7) = LAST HEADER FOR INSERTION OF FWD
          EQ     PMV21
  
 PMV25    SA2    B4          FORM VP REGION HEADER
          AX2    18 
          SX2    X2 
          LX2    18 
          MX3    1
          BX3    X3+X2
          BX4    X3+X4
          SX6    A1          SET FWD AND STORE HEADER OF REGION 
          IX6    X4+X6
          SA6    A2 
          MX7    42          SET BKD IN FIXED BLOCK HEADER AT END 
          LX7    18 
          BX7    X7*X1
          SX2    B4 
          LX2    18 
          BX7    X7+X2
          SA7    A1 
          BX1    X5           ? (X1) = NO. WORDS FREED DUE TO FEWER 
                                       VP REGIONS 
          RJ     =XCMM.AUS   -- ADJUST USED SPACE --
          SX6    B4          (X6) = FWA OF NEW REGION 
          SX7    B2          (X7) = TOTAL FREE WORDS
 PMV30    SA5    PMVSV       RESTORE X5 
          SA1    A5+B1       RESTORE B2 
          SA2    A1+B1       RESTORE B3 
          SB2    X1-0 
          SB3    X2-0 
          EQ     CMM.PMV     RETURN 
  
 PMVSV    BSS    3           X5, B2, B3 SAVE AREA 
 CMM.PPM  TITLE  CMM.PPM - PROCESS POINTER MAINTENANCE
**        CMM.PPM - PROCESS POINTER MAINTENANCE.
* 
* 
*              THIS ROUTINE ADJUSTS FWA AND LENGTH IN THE USER POINTER
*         WORD, OR CALLS THE POINTER-MAINTENANCE ROUTINE, DEPENDING 
*         ON THE BLOCK TYPE-CODE. 
* 
*         ENTRY  (X1) = CURRENT BLOCK HEADER FWA. 
*                (X2) = NEW BLOCK HEADER FWA. 
*                (B1) = 1 - CALL P-M SUBR IF TYPE-CODE = 2. 
*                       0 - DO NOT CALL P-M SUBR EVEN IF TYPE-CODE = 2. 
*                (A0) = FL. 
* 
*         EXIT   (B1) = 1.
*                (A0) = FL. 
* 
*         USES   X - 3, 4, 6, 7.
*                B - NONE.
*                A - 1, 2, 3, 4, 5, 6, 7. 
  
  
          ENTRY  CMM.PPM
 CMM.PPM  EQ     *+400000B   ENTRY / EXIT 
          SX6    B1          (X6) = POINTER-MAINT. CALL FLAG
          SB1    1           (B1) = 1 
          SA3    X1+B1       (X3) = (TYPE-CODE)-1, MI IF TC = 3 OR 4
          SX7    X3          (X7) = AUX1 = POINTER WORD ADR IF TC = 1 
          AX3    18          (X4) = AUX2
          SX4    X3 
          AX3    58-18
          PL     X3,PPM1     IF NOT TYPE-CODE 4 
          ZR     X3,CMM.PPM  IF TYPE-CODE 4 
 PPM1     ZR     X3,PPM2     IF TYPE-CODE 1 
          PL     X3,PPM4     IF TYPE-CODE 2 
          SA3    X7          (X7) = POINTER WORD ADDRESS FOR
          IX7    X3+X4        TYPE 3 BLOCK
*         STORE UPDATED POINTER WORD
 PPM2     SA3    CMM.NOL     GET NO LENGTH FLAG 
          NZ     X3,PPM3     JP IF LENGTH NOT TO BE CHANGED 
          SA3    X1          FIRST HEADER WORD (HAS LENGTH) 
          SX6    X2+4        FWA (NEW OR UNCHANGED) 
          AX3    36          LENGTH (NEW OR UNCHANGED)
          SX3    X3 
          LX3    30 
          BX6    X6+X3
          SA6    X7 
          EQ     CMM.PPM     RETURN 
  
 PPM3     SX6    X2+4        FWA OF BLOCK 
          SA6    X7          STORE NEW POINTER WORD WITHOUT LENGTH
          EQ     CMM.PPM     EXIT 
  
          ENTRY  CMM.NOL
 CMM.NOL  DATA   0           NO LENGTH IN POINTER IF NON ZERO 
  
 PPM4     ZR     X6,CMM.PPM  IF P-M SUBR NOT TO BE CALLED 
          SX6    A0          SAVE A0
          SA6    PPMSV
          SX6    B2-B0       SAVE B2
          SA6    A6+B1
          SX6    B3-B0       SAVE B3
          SA6    A6+B1
          SX6    B4          SAVE B4
          SA6    A6+B1
          SX6    B5          SAVE B5
          SA6    A6+B1
          SX6    B6          SAVE B6
          SA6    A6+B1
          SX6    B7          SAVE B7
          SA6    A6+B1
          BX6    X0          SAVE X0
          SA6    A6+B1
          BX6    X5          SAVE X5
          SA6    A6+B1
          R=     X6,1        FORM RJ TO P-M SUBR
          LX6    54 
          LX7    30          AUX1 
          BX6    X6+X7
          SA6    PPM8 
          SX6    X1          STORE ARGS - CURRENT AND NEW FWA 
          SX7    X2 
          SA6    PPMARGS
          SA7    A6+B1
          SX6    X6+4        SET UP CALLING SEQUENCE TO P-M SUBR
          SX7    X7+4 
          SA6    PPMUSER
          SA7    A6+B1
          BX6    X4          AUX2 = BLOCK-ID
          SA6    PPMID
          SA7    A0-IMAPM    SET POINTER-MAINTENANCE FLAG 
          SA1    PPMUSER     (A1) = FWA CALLING SEQUENCE
          RJ     PPM7        CLEAR STACK
 PPM7     EQ     *+1S17 
  
 PPM8     RJ     0           ---- PLUGGED WITH CALL TO P-M SUBR ----
          SB1    1           RESTORE B1 
          SA1    PPMSV       RESTORE A0 
          SA0    X1 
          MX6    0           CLEAR POINTER-MAINTENANCE FLAG 
          SA6    A0-IMAPM 
          SA1    A1+B1       RESTORE B2 
          SB2    X1-0 
          SA1    A1+B1       RESTORE B3 
          SB3    X1-0 
          SA1    A1+B1       RESTORE B4 
          SB4    X1 
          SA1    A1+B1       RESTORE B5 
          SB5    X1 
          SA1    A1+B1       RESTORE B6 
          SB6    X1 
          SA1    A1+B1       RESTORE B7 
          SB7    X1 
          SA1    A1+B1       RESTORE X0 
          BX0    X1 
          SA5    A1+B1       RESTORE X5 
          SA1    PPMARGS     RESTORE ENTRY ARGS 
          SA2    A1+B1
          EQ     CMM.PPM     RETURN 
  
 PPMSV    BSS    9           SAVE AREA FOR A0, B2-7, X0, X5 
 PPMARGS  BSS    2           CURRENT-FWA, NEW-FWA (SAVE AREA) 
 PPMUSER  BSS    2           CURRENT-FWA, NEW-FWA (PASSED TO CALLEE)
          VFD    42/0,18/PPMID
          CON    0
 PPMID    CON    0           BLOCK-ID (PASSED TO CALLEE)
 CMM.RVR  TITLE  CMM.RVR - REARRANGE VARIABLE REGION
**        CMM.RVR - REARRANGE VARIABLE REGION.
* 
* 
*              THIS ROUTINE, WHEN CALLED, CONSTITUTES WHAT IS KNOWN 
*         AS A TABLE CRASH.  IT REARRANGES THE BLOCKS SO AS TO INSURE 
*         A SPECIFIED AMOUNT OF FREE SPACE AT THE FRONT OF THE REGION 
*         AND ANOTHER SPECIFIED AMOUNT AT A SPECIFIED POSITION IN 
*         THE REGION.  IT IS THE RESPONSIBILITY OF THE CALLING ROUTINE
*         TO KNOW THAT THE SPECIFIED AMOUNT OF SPACE IS AVAILABLE SO
*         THAT THE REARRANGEMENT WILL BE POSSIBLE.  ALSO, THE REGION
*         MUST CONTAIN AT LEAST ONE (1) BLOCK.
* 
*         ENTRY  (X1) = ADR = FWA OF REGION IF SPACE (MS) TO GO BEFORE
*                             1ST BLOCK.
*                           = ADR OF BLOCK HEADER IF SPACE (MS) TO GO 
*                             AFTER THAT BLOCK. 
*                           = LWA OF REGION IF SPACE (MS) TO GO AT END
*                             OF REGION.
*                (X2) = FS  = AMOUNT OF SPACE TO GO AT FRONT OF REGION. 
*                (X3) = MS  = AMOUNT OF SPACE AS DESCRIBED ABOVE. 
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (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.RVR
 CMM.RVR  EQ     *+400000B   ENTRY / EXIT 
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    RVRSV
          SA7    A6+B1
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    A7+B1
          SA7    A6+B1
          SX7    X1          SAVE ADR 
          SA7    RADR 
          MX0    3           GET FWA OF VP REGION 
          SA1    X7 
 RVR2     BX6    X0*X1
          BX5    X6-X0
          NZ     X5,RVR4     IF REGION HEADER, NOT BLOCK HEADER 
          AX1    18          CHAIN BACKWARDS TO REGION HEADER 
          SA1    X1 
          EQ     RVR2 
  
 RVR4     MX4    1           CHECK FOR VP REGION HEADER, IF NOT ONE,
          BX4    X4-X6        ASSUME AT END OF REGION 
          SX7    A1 
          ZR     X4,RVR6     IF SO
          AX1    18          GET VP REGION HEADER 
          SX7    X1 
 RVR6     SA7    RFWA        SAVE VP REGION FWA 
          SB2    X7          (B2) = REGION FWA
          BX6    X2          SAVE FS
          LX7    X3          SAVE MS
          SA6    FS 
          SA7    MS 
  
*         LOOP 1 - DETERMINE *U*, *UG*, *TG*, SET NEW VALUES OF *PS*
*                  IN HEADERS, SET *BG* (TEMPORARY) IN HEADERS. 
  
          SB5    B0          U = 0
          SB6    B0          UG = 0 
          SB7    B0          TG = 0 
          SA1    B2          (B3) = 1ST BLOCK HEADER FWA
          AX1    36 
          SB3    X1 
 RVR10    SA1    B3          NEXT BLOCK HEADER WORD 0 
          SB3    X1          NEXT HEADER FWA
          MX7    0           BG = 0 
          LX1    -36
          SX3    X1+4        S = (BLOCK SIZE) + (HEADER SIZE) 
          SB5    B5+X3       U = U + S
          SA2    A1+B1       HEADER WORD 1
          LX2    2+4
          SX6    11B
          BX6    X6*X2
          SA4    A1+3        (X4) = HEADER WORD 3 
          ZR     X6,RVR12    IF NEITHER GROWTH BIT SET
          SB6    B6+X3       UG = UG + S
          SX0    X4          PS 
          IX7    X3-X0       S - PS 
          PL     X7,RVR12    BG = MAX[(S-PS),0] 
          MX7    0
 RVR12    SB7    B7+X7       TG = TG + BG 
          LX7    18          STORE BG, (NEW PS=S), IN HEADER WORD 3 
          BX7    X7+X3
          SA7    A4 
          NZ     B3,RVR10    LOOP THROUGH VP REGION 
          SX6    B6          SAVE UG
          SX7    B7          (X7) = TG
          SA6    UG 
          SA7    TG 
  
*         COMPUTE TOTAL FREE SPACE THAT WILL RESULT AFTER GROWTH. 
  
          SA5    B2 
          SB4    X5          LWA
          SB3    B2+B1       FWA + 1
          SB4    B4-B3       SIZE - 1 
          SX6    B4-B5       SIZE - 1 - U 
          SA2    FS 
          SA3    MS 
          IX4    X2+X3       FS + MS
          IX6    X6-X4       FR = SIZE - 1 - U - FS - MS
          SA6    FR          SAVE FR
  
*         LOOP 2 - DETERMINE *NSB*, *FA*, *FB*.  SET NEW BLOCK FWA
*                  (*MVE*) IN HEADERS.
  
          MX1    0           (X1) = 0 
          BX2    X2-X2       (X2) = 0 
          SA4    UG 
          ZR     X4,RVR16    IF NO VARIABLE BLOCKS CAN GROW 
          PX4 
          NX4 
          NZ     X7,RVR14    IF ONE OR MORE BLOCKS HAVE GROWN 
          PX6 
          NX6 
          FX1    X6/X4       (X1) = FR/UG, (X2) = 0 
          EQ     RVR16
  
 RVR14    AX6    1           FR/2 
          BX3    X6 
          AX3    1           FR/4 
          IX6    X3+X6       3FR/4
          PX3 
          NX3 
          FX1    X3/X4       (X1) = (FR/4) * (1/UG) 
          PX6 
          NX6 
          PX7 
          NX7 
          FX2    X6/X7       (X2) = (3FR/4) * (1/TG)
 RVR16    SA3    FS          (X3) = INITIAL VALUE OF NA 
          SX4    B3               = (REGION FWA) + 1 + FS 
          IX3    X4+X3
          SA4    RADR        (B6) = INPUT PARAMETER *ADR* 
          SB6    X4 
          LX5    -36         (B3) = INITIAL BLOCK HEADER FWA
          SB3    X5 
 RVR20    SA4    B3          NEXT BLOCK HEADER WORD 0 
          SB3    X4 
          MX0    0           (X0) = NSB = 0 
          SB4    B0          (B4) = FA = 0
          SB5    B0          (B5) = FB = 0
          ZR     X1,RVR24    IF NO BLOCKS THAT CAN GROW 
          SA5    A4+B1       HEADER WORD 1
          SX6    11B
          LX5    6
          BX6    X6*X5
          ZR     X6,RVR24    IF NEITHER GROWTH BIT SET
          LX4    -36
          SX4    X4+4        S = (BLOCK SIZE) + (HEADER SIZE) 
          PX4                (FR/4) * (S/UG)
          NX4 
          FX7    X1*X4
          ZR     X2,RVR21    IF NO GROWTH SINCE LAST TIME 
          SA5    A4+3        HEADER WORD 3
          AX5    18          BG 
          ZR     X5,RVR21    IF THIS BLOCK HAS NOT GROWN
          PX5                (3FR/4) * (BG/TG)
          NX5 
          FX5    X2*X5
          FX7    X7+X5       NSB= (FR/4)*(S/UG) + (3FR/4)*(BG/TG) 
 RVR21    UX7    X7,B7
          LX0    X7,B7
          LX6    59-3 
          MI     X6,RVR22    IF FWA GROWTH POSSIBLE 
          SB5    X0          LWA GROWTH ONLY, GIVE IT ALL TO END
          EQ     RVR24
  
 RVR22    LX6    3-0
          SB4    X0          SET FOR ALL SPACE GIVEN TO FRONT 
          PL     X6,RVR24    IF FWA GROWTH ONLY 
          AX4    X0,B1       BOTH FWA AND LWA GROWTH, SO GIVE ONE-HALF
          SB4    X4           TO EACH END 
          IX4    X0-X4       TO MAKE SURE THIS BLOCK GETS ALL IT
          SB5    X4           DESERVES, IF NSB IS ODD, FB = FA+1
 RVR24    SA5    MS 
          ZR     X5,RVR26    IF MS ALREADY GIVEN OUT (OR NOT SPECIFIED) 
          SB7    A4          FWA OF CURRENT BLOCK HEADER
          GE     B6,B7,RVR26  IF NOT TO THE PLACE TO GIVE OUT MS
          IX3    X3+X5       NA = NA + MS 
          MX6    0           CLEAR MS TO INDICATE IT HAS BEEN GIVEN OUT 
          SA6    A5 
 RVR26    SA4    A4          (X4) = S = (BLOCK SIZE) + (HEADER SIZE)
          SA5    A4+3        HEADER WORD 3
          AX4    36 
          SX4    X4+4 
          SX3    X3+B4       NA = NA + FA 
          SX5    X5          PS 
          BX6    X3          INSERT MVE IN HEADER WORD 3 (NA+FA)
          LX6    18 
          BX6    X6+X5
          LX0    36          INSERT NSB FOR DEBUGGING USE ONLY
          BX6    X6+X0
          SA6    A5 
          IX3    X3+X4       NA = NA + S + FB 
          SX3    X3+B5
          NZ     B3,RVR20    LOOP THRU REGION 
  
*         LOOP 3 - MOVE ALL BLOCKS WHICH ARE TO BE MOVED UP.  PROCESS 
*                  REGION DOWNWARDS.
  
          SB3    A4          (B3) = FWA OF HIGHEST HEADER IN REGION 
 RVR30    SA4    B3          NEXT HEADER WORD 0, GOING DOWN 
          MX6    3
          BX1    X6*X4
          BX1    X1-X6
          NZ     X1,RVR40    IF AT REGION HEADER
          SA5    A4+3        HEADER WORD 3
          AX4    18          (B3) = NEXT LOWER HEADER FWA 
          MX3    0            ? (X3) = 0 - SAME REGION
          SB3    X4 
          AX5    18 
          SX1    A4           ? (X1) = CURRENT HEADER FWA 
          SX2    X5           ? (X2) = NEW HEADER FWA 
          IX7    X1-X2       CURRENT - NEW
          SB2    A4          (B2) = HEADER FWA
          PL     X7,RVR30    IF NOT A MOVE UPWARD 
          RJ     CMM.MOB     -- MOVE ONE BLOCK -- 
          EQ     RVR30       LOOP THRU REGION 
  
*         LOOP 4 - MOVE ALL BLOCKS WHICH ARE TO BE MOVED DOWNWARDS. 
*                  PROCESS REGION UPWARDS.
  
 RVR40    AX4    36          SET TO 1ST BLOCK IN REGION 
          SB2    X4 
 RVR41    SA4    B2          NEXT HEADER WORD 0, GOING UP 
          SA5    A4+3        HEADER WORD 3
          MX3    0            ? (X3) = 0 - SAME REGION
          SB2    X4          (B2) = NEXT HEADER FWA 
          AX5    18 
          SX1    A4           ? (X1) = CURRENT HEADER FWA 
          SX2    X5           ? (X2) = NEW HEADER FWA 
          IX7    X2-X1       NEW - CURRENT
          PL     X7,RVR42    IF NOT A MOVE DOWNWARD 
          RJ     CMM.MOB     -- MOVE ONE BLOCK -- 
 RVR42    NZ     B2,RVR41    LOOP THRU REGION 
  
*         CLOSING PROCEDURES. 
  
          SA1    A0-CRASHES  ADVANCE CRASH COUNT
          SX6    X1+B1
          SA6    A1 
          SA1    RVRSV       RESTORE B2 
          SB2    X1-0 
          SA2    A1+B1       RESTORE B3 
          SA3    A2+B1       RESTORE X0 
          SB3    X2-0 
          SA5    A3+B1       RESTORE X5 
          BX0    X3 
          EQ     CMM.RVR     RETURN 
  
 RVRSV    BSS    4           B2, B3, X0, X5 SAVE AREA 
 RVRTMP   BSS    7           TEMPORARY STORAGE, AS DEFINED BELOW
 RADR     EQU    RVRTMP      INPUT PARAMETER *ADR*
 FS       EQU    RVRTMP+1    INPUT PARAMETER *FS* 
 MS       EQU    RVRTMP+2    INPUT PARAMETER *MS* 
 UG       EQU    RVRTMP+3    TOTAL SPACE USED BY BLOCKS THAT CAN GROW 
 TG       EQU    RVRTMP+4    SUM OF ALL BLOCK GROWTHS  (S-PS) 
 FR       EQU    RVRTMP+5    * TOTAL RESULTING FREE SPACE 
 RFWA     EQU    RVRTMP+6    * VP REGION FWA
  
          END 
