*DECK CMMCIA
          IDENT  CMM.CIA
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.CIA - CHANGE INTERNAL 
,AREA 
*CALL CMMCOM
          COMMENT  "SUBSYS"CHANGE INTERNAL AREA.
          B1=1
 CMM.CIA  SPACE  4
**        CMM.CIA - CHANGE INTERNAL AREA. 
* 
* 
*              THIS ROUTINE RESERVES OR FREES THE REQUESTED SPACE FOR 
*         A CMM-INTERNAL BLOCK.  NOTE THAT FOR THESE BLOCKS,
*         ALLOCATION IS DOWNWARDS, SO THAT THE LOGICAL FWA IS ACTUALLY
*         THE WORD WITH THE HIGHEST-NUMBERED ADDRESS. 
* 
*         ENTRY  (X1) = BLOCK NUMBER. 
*                (X2) = REQUESTED CHANGE (+ OR -).
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (B1) = 1.
*                (B7) = FWA OF NEWLY-ALLOCATED WORDS (FOR GROW REQUESTS)
*                (A0) = FL. 
* 
*         USES   X - 1, 2, 3, 4.
*                B - 4, 5, 6, 7.
*                A - 1, 2, 3, 4, 6, 7.
  
  
          ENTRY  CMM.CIA
 CMM.CIA  EQ     *+400000B   ENTRY / EXIT 
          SA6    CIARGSV     SAVE X6
          SA7    A6+B1       SAVE X7
          SB5    X1          (B5) = K+1 
          SA3    A0-B5       POINTER TO BLOCK BEING CHANGED 
          SX6    X3          (X6) = ADR(K)
          LX3    -18
          SX4    X3          (B7) = FWA OF NEW SPACE IF GROW
          IX4    X6-X4
          SB7    X4 
          ZR     X2,CIA40    IF CHANGE = 0, RETURN WITH B7 SET
          IX7    X3+X2
          LX7    18          STORE NEW LENGTH 
          SA7    A3 
          BX1    X2          (X1) = MOVE DISTANCE 
          PL     X2,CIA10    IF INCREASING INTERNAL SPACE 
  
*         DECREASING. 
  
          BX1    -X1         (X1) = POSITIVE AMOUNT TO SHRINK 
          SB7    X1 
          RJ     =XCMM.AUS   -- ADJUST USED SPACE BY (X1) --
 CIA4     SB5    B5-B1       K = K - 1
          SA4    A0-B5       ADVANCE ADR IN NEXT-LOWER HEADER 
          SX1    B7          MOVE DISTANCE
          IX6    X4+X1
          SA6    A4 
          EQ     B5,B1,CIA6  IF ALL BLOCKS MOVED  (ENDZ IS LAST)
          SA3    A4+B1       MOVE UP NEXT-LOWER BLOCK 
          SX3    X3 
          SX2    X3+B1       (X2) = SOURCE ADDRESS
          SX4    X4          (X1) = AMOUNT TO MOVE
          IX1    X4-X3
          SX3    X2+B7       (X3) = DESTINATION ADDRESS 
          SB4    B7 
          RJ     =XMVE=      -- MOVE DATA --
          SB7    B4 
          EQ     CIA4        LOOP 
  
 CIA6     SA2    X4          LOOK AT LAST REGION
          LX2    -18
          SA3    X2 
          MX4    2
          DF     X3,CIA7     IF NOT A FIXED BLOCK 
          SX7    A3          FORM NEW FREE REGION AT PREVIOUS LOCATION
          LX7    18           OF TRAILER
          IX7    X7+X6
          SA7    A2 
          SX3    A2          FORM NEW TRAILER 
          LX3    18 
          BX7    X4+X3
          SA7    X6 
          EQ     CIA40       RETURN 
  
 CIA7     BX7    X2          MOVE UP TRAILER AT ENDZ
          LX7    18 
          SA7    X6 
          IX7    X3+X1       ADJUST FWD POINTER OF NEXT-LOWER HEADER
          SA7    A3 
          EQ     CIA40       RETURN 
  
*         INCREASING. 
  
 CIA10    SX6    B5          SAVE BLOCK NUMBER
          SX7    X1          SAVE AMOUNT OF SPACE NEEDED
          SA6    CIASV
          SA7    A6+B1
          SA4    A0-B1       LOOK AT LAST REGION, (X4) = ENDZ 
          SA2    X4 
          LX2    -18
          SA3    X2 
          ID     X3,CIA20    IF FIXED BLOCK AT VERY END 
          SX6    A3          (X6) = SIZE OF LAST REGION 
          IX6    X4-X6
          BX7    X3 
          LX3    -36
          MI     X7,CIA14    IF VARIABLE REGION 
          IX7    X6-X1       (FREE SPACE) - (SPACE TO BE ADDED) 
          PL     X7,CIA25    IF ROOM
          EQ     CIA20       GO MAKE FL INCREASE
  
 CIA14    SA2    X3          GET HEADER OF LAST VARIABLE BLOCK
          SX3    X2 
          NZ     X3,CIA14 
          LX2    -36         FREE SPACE STARTS AT LWA+1 OF BLOCK
          SX2    X2          LENGTH 
          SX3    A2+4        BLOCK FWA
          IX2    X3+X2       LWA+1
          IX6    X4-X2       FREE SPACE 
          IX7    X6-X1       (FREE SPACE) - (SPACE TO BE ADDED) 
          PL     X7,CIA25    IF ROOM AT END OF LAST REGION
          SA3    A0-B1        ? (X1) = FWA PRIMARY VP REGION
          SA3    X3 
          BX2    X1           ? (X2) = SPACE NEEDED 
          AX3    18 
          SX1    X3 
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =YCMM.PMV    -- PROCESS MULTIPLE VARIABLE REGIONS -- 
          ZR     X6,CIA20    IF SPACE NOT AVAILABLE 
          BX1    X7           ? (X1) = TOTAL RESULTING FREE SPACE 
          MX2    0            ? (X2) = 0 - NO CHANGE TO FP OR VP TOTALS 
          RJ     =YCMM.CRD    -- COMPUTE REGION DISTRIBUTION -- 
          SA6    CIAFP       SAVE FIXED BLOCK AMOUNT
          SA1    A0-B1        ? (X1) = LWA+1 PRIMARY VP REGION
          BX2    X6           ? (X2) = SPACE FOR POTENTIAL FIXED BLOCKS 
          SA3    CIASV+1      ? (X3) = SPACE FOR INTERNAL AREA
          RJ     =YCMM.RVR    -- REARRANGE VARIABLE REGION -- 
          SA1    A0-B1        ? (X1) = FWA PRIMARY VP REGION
          SA1    X1 
          AX1    18 
          SX1    X1 
          SA2    CIAFP        ? (X2) = SPACE FOR POTENTIAL FIXED BLOCKS 
          RJ     =YCMM.AFR    -- ADD FREE REGION -- 
          EQ     CIA25
  
 CIA20    SA1    CIASV+1     (X1) = AMOUNT NEEDED 
          SA2    A0-FLINC.C  (X3) = MAX(N,FLINC)
          IX6    X1-X2
          BX3    X1-X2
          AX6    59 
          BX3    -X6*X3 
          BX3    X3-X2
          SX7    A0 
          SA4    A0-MAXFL    (X4) = MIN[MAX(N,FLINC),(MAXFL-FL)]
          IX4    X4-X7
          IX6    X3-X4
          BX4    X3-X4
          AX6    59 
          BX4    -X6*X4 
          MX7    -6          ROUND UP TO NEXT 100B
          BX4    X4-X3
          IX2    X4-X1
          PL     X2,CIA22    IF FL CAN BE INCREASED ENOUGH
          MERR   ERRCIA      NO ROOM TO INCREASE INTERNAL AREA
  
 CIA22    IX4    X4-X7
          BX4    X4*X7
          RJ     =XCMM.CFL   -- INCREASE FL BY (X4) --
  
*         MOVE INTERNAL BLOCKS DOWN BY THE NECESSARY AMOUNT.
  
 CIA25    SA2    CIASV       (B5) = BLOCK NUMBER
          SA1    A2+B1       (X1) = AMOUNT OF INCREASE
          SB5    X2 
          SA2    A0-B1       MOVE TRAILER DOWN
          SA3    X2 
          SB6    X1 
          BX6    X3 
          LX3    -18
          SX3    X3 
          SA4    X3          PREVIOUS HEADER
          SA6    A3-B6
          SX6    A6 
          IX6    X6-X3
          ZR     X6,CIA26    IF FREE REGION BEING ELIMINATED ENTIRELY 
          IX7    X4-X1       REDUCE FWD IN PREVIOUS HEADER
          SA7    A4 
          EQ     CIA27
  
 CIA26    LX4    -18         FORM NEW TRAILER WITH BKD FROM HEADER
          SX4    X4           WHICH WAS OVERWRITTEN 
          LX4    18 
          MX6    2
          BX6    X6+X4
          SA6    A6 
 CIA27    SA4    A0-CURALL   ADVANCE CURRENT ALLOCATED WORDS
          IX6    X4+X1
          SA6    A4 
          SB4    B1          J = 1
 CIA28    SA4    A0-B4       DECREASE ADR(J), I.E., INCREASE SIZE 
          SX1    B6 
          IX6    X4-X1
          SA6    A4 
          SB4    B4+B1       NEXT INTERNAL BLOCK POINTER
          EQ     B4,B5,CIA30  IF CORRECT NUMBER OF BLOCKS PROCESSED 
          SX2    X4+B1        ? (X2) = SOURCE ADDRESS 
          IX3    X2-X1        ? (X3) = DESTINATION ADDRESS
          SA1    A0-B4        ? (X1) = WORD COUNT 
          SX1    X1                  = SIZE OF BLOCK
          SX4    X4 
          IX1    X1-X4
          RJ     =XMVE=      -- MOVE DATA --
          EQ     CIA28       LOOP 
  
 CIA30    SA4    CIASV       TABLE NBR
          SA1    A4+B1       AMOUNT OF CHANGE 
          SB7    X4 
          SA4    A0-B7       GET TABLE POINTER
          SB5    X4          ADDR OF START OF TABLE 
          LX4    -18
          IX4    X4-X1       DECREASE BY AMOUNT OF CHANGE 
          SB7    X4          SIZE OF TABLE
          SB7    B5-B7       POINT TO NEW ENTRY 
 CIA40    SA1    CIARGSV     RESTORE X6 
          SA2    A1+B1       RESTORE X7 
          BX6    X1 
          LX7    X2 
          EQ     CMM.CIA     RETURN 
  
 CIASV    BSS    2           TEMPORARY STORAGE
 CIAFP    BSS    1           RETURN VALUE FROM CMM.CRD
 CIARGSV  BSS    2           SAVE AREA FOR X6, X7 
  
          END 
