*DECK CMMRLS
          IDENT  CMM.RLS
  
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.RLS - RELEASE LOWER SP
,ACE
*CALL CMMCOM
          COMMENT  "SUBSYS"RELEASE LOWER SPACE. 
          B1=1
 CMM.RLS  SPACE  4,10 
**        CMM.RLS - RELEASE LOWER SPACE.
* 
* 
*              THIS ROUTINE IS USED BY CMM.SDA AND CMM.LDV TO MOVE ALL
*         VARIABLE BLOCKS ABOVE A GIVEN LOCATION.  THE FOLLOWING
*         CONDITIONS WILL BE VALID WHENEVER THIS IS ENTERED:  
* 
*         1) IF THERE ARE ANY FIXED BLOCKS BELOW HHA, IT IS A USER
*            ERROR. 
*         2) THE VARIABLE BLOCK CODE IS PRESENT, OR ELSE THIS WOULD 
*            NOT BE HERE.  THE PRIMARY VARIABLE REGION DOES, OR HAS,
*            EXISTED. 
* 
*         ENTRY  (X1) = LOC = ADDRESS, ABOVE WHICH, ALL BLOCKS ARE
*                             TO BE MOVED.
*                (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.RLS
 CMM.RLS  EQ     *+400000B   ENTRY / EXIT 
          BX6    X1          SAVE PARAMETER 
          SA6    RLSARG 
          SX2    =YCMM.POA
          PL     X2,RLS4     IF OVERFLOW-ACTION CODE PRESENT
  
*         OVERFLOW-ACTION CODE NOT PRESENT.  MAKE ONE ATTEMPT TO GET
*         THE BLOCKS MOVED.  IF FAILURE, ABORT. 
  
          SX1    B1           ? SO TO ABORT IF EXCEEDED 
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --
          SA1    RLSARG       ? (X1) = ADDRESS TO MOVE BLOCKS ABOVE 
          RJ     RLSH        -- RELEASE LOWER SPACE #HARD# -- 
          NZ     X6,CMM.RLS  RETURN IF SUCCESS
          MERR   ERRFAIL     CANNOT CONTINUE
  
*         IF ALREADY IN OVERFLOW MODE, MAKE ONE ATTEMPT TO GET THE
*         BLOCKS MOVED.  IF FAILURE, ABORT. 
  
 RLS4     SA3    A0-OVERFLOW
          ZR     X3,RLS6     IF NOT IN OVERFLOW MODE
          SA1    RLSARG       ? (X1) = ADDRESS TO MOVE BLOCKS ABOVE 
          RJ     RLSH        -- RELEASE LOWER SPACE #HARD# -- 
          NZ     X6,CMM.RLS  RETURN IF SUCCESS
          MERR   ERRFAOV     IN OVERFLOW MODE - CANNOT COMPLETE REQUEST 
  
*         BEGIN OVERFLOW-ACTION PROCESSING.  GET SIZE OF LOWEST 
*         VARIABLE REGION TO PASS TO OV-ACTION ROUTINES.
  
 RLS6     SA1    RA65        (B4) = REGION HEADER ADDRESS 
          BX1    -X1
          SB4    X1+B1
 RLS7     SA2    B4          NEXT REGION
          SB4    X2 
          PL     X2,RLS7     IF FREE REGION 
          SB5    A2           ? (X2) = REGION SIZE
          MX1    0            ? (X1) = 0 - INITIALIZE ALL CALL-NUMS 
          SX2    B4-B5
          SX6    X2          SAVE SIZE
          SA6    RLSSZ
          RJ     =YCMM.POA   -- PROCESS OVERFLOW ACTION --
  
*         AS LONG AS ONE OR MORE OV-ACTION SUBRS ARE CALLED DUE TO
*         TRIGGERS BEING EXCEEDED, CHECK IF ENOUGH BLOCKS WERE FREED SO 
*         AS TO FREE THE AREA BELOW THE SPECIFIED ADDRESS.
  
 RLS10    ZR     X6,RLS20    IF NO O-A-SUBR CALLED
          SA1    RA65        CHECK IF LOWER BLOCKS MAY HAVE BEEN FREED
          BX1    -X1
          SB4    X1+B1
          SA2    RLSARG      (B7) = ADDRESS TO MOVE BLOCKS ABOVE
          SB7    X2 
 RLS11    SA2    B4          NEXT REGION
          SB4    X2 
          MI     X2,RLS12    IF NOT FREE REGION 
          GE     B4,B7,CMM.RLS  IF FREE REGION NOW EXTENDS HIGH ENOUGH
          EQ     RLS11       LOOP 
  
 RLS12    SB5    A2           ? (X2) = SIZE OF LOWEST VP REGION 
          SX2    B4-B5
          SX6    X2          SAVE SIZE
          SX1    B1           ? (X1) = 1 - CALL O-A-S IF TRIG EXCEEDED
          SA6    RLSSZ
          RJ     =YCMM.POA   -- PROCESS OVERFLOW ACTION --
          EQ     RLS10       LOOP 
  
*         STILL NO SUCCESS.  CONTINUE CALLING O-A-SUBRS AND MAKING
*         THE #HARD# ATTEMPT UNTIL EITHER SUCCESS OR ALL CALL-NUMS
*         REACH 6, THE LATTER CAUSING AN ABORT. 
  
 RLS20    SA1    RLSARG       ? (X1) = ADDRESS TO MOVE BLOCKS ABOVE 
          RJ     RLSH        -- RELEASE LOWER SPACE #HARD# -- 
          NZ     X6,CMM.RLS  RETURN IF SUCCESS
          SA2    RLSSZ        ? (X2) = LAST COMPUTED REGION SIZE
          SX1    2            ? (X1) = 2 - CALL O-A-S REGARDLESS
          RJ     =YCMM.POA   -- PROCESS OVERFLOW ACTION --
          EQ     RLS20       LOOP 
  
 RLSARG   BSS    1           INPUT PARAMETER
 RLSSZ    BSS    1           SIZE AS PASSED TO O-A-SUBRS
  
 RLSH     SPACE  4,10 
**        RLSH - HARD CASE SUBROUTINE FOR RELEASE LOWER SPACE.
* 
* 
*              THIS ROUTINE IS CALLED BY CMM.RLS TO DO THE ACTUAL 
*         WORK INVOLVED IN FINDING OUT IF THERE IS ROOM TO MOVE ALL 
*         VARIABLE BLOCKS FROM BELOW *LOC* TO ABOVE *LOC*.  TWO (2) 
*         DISTINCT SITUATIONS ARE ADDRESSED:  
* 
*         1) THERE ARE NO FIXED BLOCKS.  WITH THE USE OF CMM.PMV, 
*            THIS RESULTS IN EVERYTHING GOING INTO A SINGLE VP REGION,
*            WITH THE ORIGIN MOVED UP TO *LOC*. 
*         2) FIXED BLOCKS ARE PRESENT.  CMM.PMV IS USED IN ORDER TO 
*            FORM EVERYTHING BELOW *LOC* (I.E., THOSE BLOCKS WHICH
*            MUST BE MOVED) INTO ONE VP REGION.  THE BLOCKS ARE MOVED 
*            INTO THE PRIMARY VP REGION ONE AT A TIME USING CMM.MOB.
* 
*         ENTRY  LOCATION RLSARG = LOC = ADDRESS, ABOVE WHICH, ALL
*                BLOCKS ARE TO BE MOVED.
*                (B1) = 1.
*                (A0) = FL. 
* 
*         EXIT   (X6) = 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. 
  
  
 RLSH     EQ     *+400000B   ENTRY / EXIT 
          SX6    B2-B0       SAVE B2
          SX7    B3-B0       SAVE B3
          SA6    RLSHSV 
          SA7    A6+B1
          BX6    X0          SAVE X0
          LX7    X5          SAVE X5
          SA6    A7+B1
          SA7    A6+B1
  
*         COMBINE ALL LOWER VP BLOCKS INTO ONE VP REGION, IN CASE 
*         NOT THAT WAY ALREADY. 
  
          SA1    RA65 
          BX1    -X1
          SX1    X1+B1        ? (X1) = FWA OF 1ST REGION
          MX2    0            ? (X2) = 0 - NO SPACE REQUESTED, SO AS
                                           TO INSURE THAT CHANGE WILL 
                                           OCCUR REGARDLESS 
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          SA2    RLSARG       ? (B1) = ADDRESS TO MOVE BLOCKS ABOVE LOC 
          BX1    X6           ? (X1) = VP REGION FWA
          SB1    X2 
          RJ     =XCMM.CVS   -- COMPUTE VARIABLE SPACE -- 
          BX0    X2          (X0) = (X2) = TOTAL SPACE BELOW LOC
          LX5    X3          (X5) = TOTAL USED SPACE
  
*         DETERMINE WHETHER ON NOT ANY FIXED BLOCKS ARE PRESENT.
  
          SA4    RA65 
          BX4    -X4
          SB4    X4+B1
          SB2    B4          (B2) = DABA+1
 RLSH2    SA1    B4 
          SB4    X1 
          DF     X1,RLSH2    LOOP UNTIL FP HEADER FOUND 
          NZ     B4,RLSH10   IF AT LEAST ONE FIXED BLOCK
  
*         NO FIXED BLOCKS PRESENT.
  
          SX1    B2           ? (X1) = FWA PRIMARY VP REGION
                              ? (X2) = SPACE NEEDED 
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          ZR     X6,RLSH20   IF FAILURE, GO TO RETURN, (X6) = 0 
          SX1    B2           ? (X1) = FWA PRIMARY VP REGION
          BX2    X0           ? (X2) = SPACE BELOW LOC
          MX3    0            ? (X3) = 0 - NO ADDITIONAL NEEDED 
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
          SX1    B2           ? (X1) = FWA PRIMARY VP REGION -- 
          BX2    X0           ? (X2) = SPACE BELOW LOC
          RJ     =XCMM.AFR   -- ADD FREE REGION --
          SX6    B1          (X6) = 1 FOR SUCCESS 
          EQ     RLSH20      GO TO RETURN 
  
*         AT LEAST ONE FIXED BLOCK IS PRESENT.  USE THE MORE INVOLVED 
*         METHOD. 
  
          ERRNZ  P.ENDZ-1 
 RLSH10   SA1    A0-B1       (B4) = FWA OF HIGHEST REGION 
          SA1    X1 
          AX1    18 
          SB4    X1 
          SA2    B4 
          DF     X2,RLSH12   IF HIGHEST BLOCK NOT FIXED 
          SX3    A0          INCREASE FL BY MIN[(MAXFL-FL),FLINC] 
          SA4    A0-MAXFL 
          IX3    X4-X3
          SA2    A0-FLINC.C 
          IX6    X3-X2
          BX2    X3-X2
          AX6    59 
          BX2    -X6*X2 
          BX6    X3-X2
          BX4    X6           ? (X4) = AMOUNT OF INCREASE 
          ZR     X6,RLSH20   IF NO INCREASE POSSIBLE
          RJ     =XCMM.CFL   -- CHANGE FIELD LENGTH --
          SA1    B4          (B4) = FWA OF NEW FREE REGION
          SB4    X1 
 RLSH12   SX1    B4           ? (X1) = FWA HIGHEST NON-FIXED REGION 
          BX2    X5           ? (X2) = SPACE NEEDED TO GO INTO IT 
                              ? (B1) = 1 - FL INCREASE ALLOWED
          RJ     =XCMM.PMV   -- PROCESS MULTIPLE VARIABLE REGIONS --
          ZR     X6,RLSH20   IF FAILURE, GO TO RETURN, (X6) = 0 
          BX1    X7           ? (X1) = EXCESS FREE SPACE
          SB2    X6          (B2) = PRIMARY VP REGION FWA 
          MX2    0            ? (X2) = 0 - NO CHANGE TO FP OR VP TOTALS 
          RJ     =XCMM.CRD   -- COMPUTE REGION DISTRIBUTION --
          BX0    X6          (X0) = SPACE FOR POTENTIAL FIXED BLOCKS
          SA2    B2          PRIMARY VP REGION HEADER 
          AX2    36 
          SX2    X2 
          ZR     X2,RLSH14   IF VP REGION JUST FORMED BY CMM.PMV
          SX1    B2           ? (X1) = PRIMARY VP REGION FWA
          BX2    X0           ? (X2) = FIXED BLOCK SHARE
          LX3    X5           ? (X3) = SPACE FOR BLOCKS BEING MOVED IN
          RJ     =XCMM.RVR   -- REARRANGE VARIABLE REGION --
 RLSH14   SX1    B2           ? (X1) = PRIMARY VP REGION FWA
          BX2    X0           ? (X2) = FIXED BLOCK SHARE
          RJ     =XCMM.AFR   -- ADD FREE REGION --
          SB3    B2+X0       (B3) = HEADER PRIOR TO NEXT DEST. ADDRESS
                                  = (REGION HEADER ADR) + 1 
          SB4    B3+B1       (B4) = INITIAL DESTINATION ADDRESS 
          SA1    RA65        (X5) = INITIAL SOURCE ADDRESS
          BX1    -X1              = HEADER FWA OF 1ST BLOCK 
          SA2    X1+B1
          AX2    36 
          SX5    X2 
 RLSH16   ZR     X5,RLSH18   IF ALL BLOCKS MOVED
          BX1    X5           ? (X1) = SOURCE HEADER FWA
          SX2    B4           ? (X2) = DESTINATION HEADER FWA 
          SX3    B3           ? (X3) = ADR OF PRIOR HDR AT DESTINATION
          SA5    X5          (X5) = HEADER WORD 0 WITH CURRENT POINTERS 
          RJ     =XCMM.MOB   -- MOVE ONE BLOCK -- 
          SB3    B4          PRIOR HEADER = CURRENT HEADER
          BX1    X5          (B4) = NEXT STORE ADDRESS
          SX5    X5          (X5) = ADDRESS OF NEXT HEADER TO MOVE
          AX1    36 
          SX1    X1+4 
          SB4    B3+X1
          EQ     RLSH16      LOOP 
  
 RLSH18   SX1    B1           ? (X1) = 1 - ONE HEADER ELIMINATED
          RJ     =XCMM.AUS   -- ADJUST USED SPACE --
          SA1    RA65        SET VP REGION STARTING AT DABA + 1 TO A
          BX1    -X1          FREE REGION 
          SA2    X1+B1
          MX7    -36
          BX7    -X7*X2 
          SA7    A2 
          SX6    B1          (X6) = 1 FOR SUCCESS 
  
*         COMMON EXIT, (X6) = NZ IF SUCCESS.
  
 RLSH20   SA1    RLSHSV      RESTORE B2 
          SB2    X1-0 
          SA2    A1+B1       RESTORE B3 
          SA3    A2+B1       RESTORE X0 
          SB3    X2-0 
          BX0    X3 
          SA5    A3+B1       RESTORE X5 
          EQ     RLSH        RETURN, (X6) = NZ IF SUCCESS 
  
 RLSHSV   BSS    4           B2, B3, X0, X5 SAVE AREA 
  
          END 
