*COMDECK GLF
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.GLF - GROW AT LWA FIXE
,D
          IPARAMS 
 OPSYS    MICRO  1,7,*"OS.NAME"_"OS.VER"* 
*CALL CMMCOM
          COMMENT  "SUBSYS"GROW AT LWA FIXED. 
          B1=1
 CMM.GLF  SPACE  4
***       CMM.GLF - GROW AT LWA FIXED.
* 
* 
*              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) = BLOCK-FWA.
*                (X2) = NUMBER-OF-WORDS.
* 
*         EXIT   (B1) = 1.
* 
*         SAVES  X - 0, 5.
*                B - 2, 3.
*                A - 0. 
  
  
          CMMENT  GLF 
 CMM.GLF  EQ     *+400000B   ENTRY / EXIT 
          SB1    1
          SX1    X1 
          SX6    A0          SAVE A0
          SA3    RA65 
          BX3    -X3
  
 IS       IFSAFE
          SX3    X3 
          PL     X3,GLF102
          UERR   CMEFST,0,3RGLF  ILLEGAL 1ST CALL TO CMM
  
 GLF102   BSS    0
 IS       ENDIF 
  
          SA3    X3          (A0) = FL
          SA0    X3 
          SA6    A0-MNSAVEA0  SAVE A0 
          SX7    3RGLF       SAVE FUNCTION NAME 
          SA7    A0-MNFNAME 
          SA4    CMM.GLF     SAVE RETURN ADDRESS
          LX4    30 
          BX6    X4 
          SA6    A0-MNRETURN
  
 IS       IFSAFE
          SA3    A0-IMAPM 
          ZR     X3,GLF104
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE
  
 GLF104   SB7    B0           ? FIXED BLOCK 
          RJ     =XCMM.CAB   -- CHECK ACTIVE BLOCK -- 
 IS       ENDIF 
  
          SB7    X1-2        (B7) = BLOCK HEADER ADDRESS
          SA3    B7+B1
          BX6    X1          (X6) = BLOCK-FWA 
          PL     X3,GLF2
          SB7    B7+B1
 GLF2     SA4    B7          (X4) = HEADER WORD 0 
  
 IS       IFSAFE
          LX4    59-45
          MI     X4,GLF106   IF REQUIRED SIZE-CODE BIT SET
          UERR   CMESCV,0    SIZE-CODE VIOLATION
  
 GLF106   LX4    -59+45      RESTORE HEADER WORD 0
          MX7    43 
          BX7    X7*X2       ONLY BITS 0-16 OF BLOCK SIZE LEGAL 
          ZR     X7,GLF108   JMP IF BLOCK SIZE OK 
          UERR   CMENUM,0    ILLEGAL NUM
  
 GLF108   BSS    0
 IS       ENDIF 
  
*         STORE ARGUMENTS IN SAVE AREA. 
  
          LX7    X2          NUM
          SA6    A0-BFWA
          SA7    A0-NUM 
          SX6    B7          HEADER-FWA 
          SA6    A0-HFWA
  
*         INITIAL #EASY# ATTEMPT. 
  
          RJ     GLFE 
          ZR     X1,GLF4     IF NOT SUCCESSFUL
          SA2    A0-MNSAVEA0  RESTORE A0
          SA0    X2 
          EQ     CMM.GLF     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. 
  
 GLF4     SX2    =YCMM.GOA
          PL     X2,GLF12    IF OVERFLOW-ACTION CODE PRESENT
          SX1    B1           ? SO TO ABORT IF EXCEEDED 
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --
          RJ     GLFH 
          NZ     X1,GLF8     IF SUCCESSFUL
          MERR   ERRFAIL     CANNOT COMPLETE
  
*         RETURN THRU SAVED RETURN ADDRESS.  ACTUAL WOULD BE CHANGED IF 
*         OVERFLOW-ACTION PROCESSING EXECUTED THIS SAME FUNCTION. 
  
 GLF8     SA2    A0-MNSAVEA0  RESTORE A0
          SA3    A0-MNRETURN  RETURN THRU SAVED RETURN ADDRESS
          SA0    X2 
          SB7    X3 
          JP     B7          RETURN 
  
*         OVERFLOW-ACTION PROCESSING. 
  
 GLF12    SX1    GLFE         ? #EASY# PROCESSOR
          SX2    GLFH         ? #HARD# PROCESSOR
          SA3    A0-NUM       ? SPACE NEEDED
          RJ     =YCMM.GOA   -- GENERAL OVERFLOW ACTION --
          EQ     GLF8        GO TO RETURN 
  
 BFWA     EQU    MNARG1      EQUATES TO SAVE AREA 
 NUM      EQU    MNARG2 
 HFWA     EQU    MNARG3 
 GLFE     SPACE  4,25 
**        GLFE - EASY CASE SUBROUTINE FOR GROW AT LWA FIXED.
* 
* 
*         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.
*                A - 1, 2, 3, 4, 6, 7.
  
  
 GLFE     EQ     *+400000B   ENTRY / EXIT 
  
*         THE NEXT-HIGHER REGION MUST BE A FREE REGION AND BE LARGE 
*         ENOUGH TO ACCOMODATE THE INCREASE, OR ELSE THE #EASY# 
*         ATTEMPT FAILS.
  
          SA4    A0-HFWA     (X4) = BLOCK HEADER WORD 0 
          SB5    X4          (B5) = HEADER WORD 0 ADDRESS 
          SA4    X4 
          SA2    X4          NEXT REGION HEADER 
          MX1    0           SET FOR UNSUCCESSFUL RETURN
          MI     X2,GLFE     IF NEXT REGION NOT FREE, RETURN, (X1) = 0
          SX7    X2          (X7) = SIZE OF FREE REGION 
          SA3    A0-NUM      (X3) = INCREASE
          SX6    A2 
          IX7    X7-X6
          IX6    X7-X3       (X6) = (AVAILABLE SPACE) - (SPACE NEEDED)
          MI     X6,GLFE     IF FREE REGION NOT LARGE ENOUGH AS IS
          NZ     X6,GLFE4    IF NOT EXACT FIT 
  
*         SET POINTERS FOR REMOVAL OF FREE REGION.
  
          SX1    A4 
          SX3    X4 
          SX6    X2 
          IX6    X6-X3       (X6) = CHANGE TO FWD OF THIS BLOCK 
          IX7    X1-X3       (X7) = CHANGE TO BKD OF NEW NEXT BLOCK 
          EQ     GLFE6
  
*         MOVE UP FREE REGION HEADER AND SET POINTERS ACCORDINGLY.
  
 GLFE4    BX6    X2          MOVE UP FREE REGION HEADER BY INCREASE 
          SB4    X3 
          SA6    A2+B4
          BX6    X3          (X6) = CHANGE TO FWD OF THIS BLOCK 
          BX7    X3          (X7) = CHANGE TO BKD OF NEXT+1 REGION
  
*         SET POINTERS. 
  
 GLFE6    SA2    X2          ADJUST BKD IN NEXT+1 REGION
          LX2    -18
          IX7    X2+X7
          LX7    18 
          SA7    A2 
          IX6    X4+X6       ADJUST FWD OF THIS BLOCK 
          SA6    A4 
  
*         ADJUST TOTAL ALLOCATED SPACE AND RETURN.
  
          SA1    A0-CURALL   ADVANCE TOTAL ALLOCATED WORDS
          SA2    A0-NUM 
          IX6    X1+X2
          SA6    A1 
          EQ     GLFE        RETURN, (X1) = NZ
 GLFH     SPACE  4,25 
**        GLFH - HARD CASE SUBROUTINE FOR GROW AT LWA FIXED.
* 
* 
*         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.
*                A - 1, 2, 3, 4, 6, 7.
  
  
 GLFH     EQ     *+400000B   ENTRY / EXIT 
          SA4    A0-HFWA     (X4) = BLOCK HEADER WORD 0 
          SA1    A0-NUM      INCREASE 
          SA4    X4 
          SA3    X4          (X3) = NEXT BLOCK HEADER WORD 0
          SB4    X3 
          ZR     B4,GLFH2    IF NO HIGHER VARIABLE REGIONS
          MI     X3,GLFH4    IF HIGHER VP REGION PRESENT
          SB5    A3          REDUCE AMOUNT NEEDED BY FREE REGION SIZE 
          SX7    B4-B5
          IX1    X1-X7
          SA3    B4 
          SB4    X3 
          NZ     B4,GLFH4    IF ANOTHER REGION, MUST BE VARIABLE
  
*         THERE ARE NO VARIABLE BLOCKS ABOVE THE LWA-END GROW FIXED 
*         BLOCK.  INCREASE THE FIELD LENGTH BY AN APPROPRIATE AMOUNT. 
  
 GLFH2    SA3    A0-MAXFL 
          SX2    A0 
          IX2    X3-X2       (X2) = MAXFL - FL
          SA4    A0-FLINC.C 
          IX4    X1+X4       (X4) = MIN[(INCREASE+FLINC),(MAXFL-FL)]
          IX6    X4-X2
          BX2    X4-X2
          AX6    59 
          BX2    -X6*X2 
          BX4    X2-X4
          IX2    X4-X1
          MX1    0           SET FOR NO SUCCESS 
          MI     X2,GLFH     IF ENOUGH INCREASE NOT POSSIBLE
          RJ     =XCMM.CFL   -- INCREASE FL BY (X4) --
          EQ     GLFH8
  
*         AT LEAST ONE HIGHER VARIABLE REGION IS PRESENT.  GET THE SPACE
*         BY USING THE VARIABLE BLOCK ROUTINE.
  
 GLFH4    BSS    0
 IS       IFSAFE
          SX2    =YCMM.VGF
          PL     X2,GLFH102  IF VP ROUTINE PRESENT
          UERR   CMENEED,3RVGF  VARIABLE BLOCK ROUTINE NOT PRESENT
  
 GLFH102  BSS    0
 IS       ENDIF 
  
          RJ     =YCMM.VGF   -- VP CODE FOR GROW-FIXED, (X1) = INC -- 
          ZR     X1,GLFH     IF NO SUCCESS
  
*         RETRY #EASY# ATTEMPT. 
  
 GLFH8    RJ     GLFE 
          ZR     X1,*+1S17   SYSTEM ERROR 
          EQ     GLFH        RETURN, (X1) = NZ
          SPACE  4,10 
*         ALTERNATE ENTRY POINT TO CMM.GLF TO RETURN TO SCOPE 2 
*         OPERATING SYSTEM. 
  
 OS       IFC    EQ,*"OPSYS"*SCOPE 2* 
          CMMENT  GL2 
 CMM.GL2  BSS    0
          RJ     CMM.GLF
          MJ     440B        RETURN TO OU.UCMR
 OS       ENDIF 
  
