*COMDECK FRF
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.FRF - FREE FIXED
*CALL CMMCOM
          COMMENT  "SUBSYS"FREE FIXED.
          B1=1
 CMM.FRF  SPACE  4
***       CMM.FRF - FREE FIXED. 
* 
* 
*              THE BLOCK WHOSE CURRENT FWA IS BLOCK-FWA IS FREED/ 
*         DESTROYED/ERASED, AND THE CONTENTS ARE LOST.
* 
*         ENTRY  (X1) = BLOCK-FWA.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  FRF 
 CMM.FRF  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          SX1    X1 
          SX6    A0          SAVE A0
          SA2    RA65 
          BX2    -X2
  
 IS       IFSAFE
          SX2    X2 
          PL     X2,FRF102
          UERR   CMEFST,0,3RFRF  ILLEGAL 1ST CALL TO CMM
  
 FRF102   BSS    0
 IS       ENDIF 
  
          SA3    X2          (A0) = FL
          SA0    X3 
          SA6    A0-MNSAVEA0  SAVE A0 
  
 IS       IFSAFE
          SX7    3RFRF       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA2    CMM.FRF     SAVE RETURN ADDRESS
          LX2    30 
          BX6    X2 
          SA6    A0-MNRETURN
          SA4    A0-IMAPM 
          ZR     X4,FRF104
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 FRF104   SB7    B0           ? FIXED BLOCK 
          RJ     =XCMM.CAB   -- CHECK ACTIVE BLOCK -- 
 IS       ENDIF 
  
          SB4    B1          (B4) = 1, GROUP-ID PRESENT 
          SB7    X1-2        (B7) = ADDRESS OF HEADER WORD 0
          SA2    B7+B1
          PL     X2,FRF2     IF WORD 1 OF HEADER
          SB4    B0          (B4) = 0, GROUP-ID NOT PRESENT 
          SB7    A2 
 FRF2     SA2    B7          GET HEADER WORD 0
          SB6    X2           ? (X1) = SPACE BEING FREED
          SX1    B6-B7
          RJ     =XCMM.AUS   -- ADJUST USED SPACE --
  
*         FREE BLOCK BY SETTING IT TO A FREE REGION, AND THEN COMBINING 
*         IT WITH ADJACENT FREE REGIONS, IF PRESENT.
  
          SX1    B7 
          SA2    X1 
          MX7    -36         SET TO FREE REGION 
          BX7    -X7*X2 
          SA7    A2 
          SX3    X2          (X3) = FWA OF NEXT REGION
          SB5    X1          SET LOWEST FREE REGION 
          AX7    18 
          ZR     X7,FRF4     IF THIS IS THE VERY LOWEST REGION
          SA2    X7 
          MI     X2,FRF4     IF LOWER REGION NOT FREE 
          SB5    X7          SET LOWEST FREE REGION 
          IX4    X3-X1       ADJUST FWD OF PREVIOUS REGION
          IX6    X2+X4
          SA6    A2 
          SA4    X3          ADJUST BKD OF THE NEXT REGION
          IX6    X7-X1
          LX6    18 
          IX6    X4+X6
          SA6    A4 
 FRF4     SA2    X3 
          SX7    B5          (X7) = LOW REGION TO ADJUST TO 
          MI     X2,FRF6     IF NEXT REGION NOT FREE
          SX4    X2          NEXT NEXT REGION 
          SA2    X7          ADJUST FWD ON LOWEST FREE REGION 
          IX6    X4-X3
          IX6    X2+X6
          SA6    A2 
          SA2    X4          ADJUST BKD OF NEXT, NEXT REGION
          IX6    X7-X3
          LX6    18 
          IX6    X6+X2
          SA6    A2 
 FRF6     ZR     B4,FRF12    IF BLOCK HAD NO GROUP-ID                    CMM0008
          SA2    X1+B1       HEADER WORD 1 OF FREED BLOCK 
          SX3    X2          (X3) = GFWD
          SX1    A2          (X1) = ADDRESS OF FREED ENTRY
          AX2    18 
          SX7    X2          (X7) = GBKD
          ZR     X3,FRF8     IF THIS WAS LAST ENTRY IN CHAIN
          SA4    X3          ADJUST GBKD IN NEXT ENTRY
          LX4    -18
          IX6    X4-X1
          IX6    X6+X7
          LX6    18 
          SA6    A4 
 FRF8     SA4    X7          PREVIOUS ENTRY 
          NZ     X7,FRF10    IF NOT FREEING 1ST ENTRY 
          AX2    18          (B4) = GROUP-ID
          SB4    X2 
          SA4    A0-P.GID    FIND P.GID ENTRY TO ADJUST GFWD
          SA4    X4+B1
 FRF9     SA4    A4-B1       NEXT ENTRY 
          BX7    X4 
          AX7    36 
          SB5    X7 
          NE     B4,B5,FRF9  LOOP UNTIL MATCH 
 FRF10    IX6    X4-X1       ADJUST GFWD
          IX6    X6+X3
          SA6    A4 
  
*         REDUCE FIELD LENGTH IF POSSIBLE.
  
 FRF12    RJ     =XCMM.FFA   -- FIXED FREE ALGORITHM -- 
          SA2    A0-MNSAVEA0  RESTORE A0
          SA0    X2 
          EQ     CMM.FRF     RETURN 
  
