*COMDECK FAF                                                             FAF
          TITLE  COMMON MEMORY MANAGER, V1.0, CMM.FAF - FLEXIBLE ALLOCAT FAF
,E FIXED                                                                 FAF
          IPARAMS                                                        FAF
 OPSYS    MICRO  1,7,*"OS.NAME"_"OS.VER"*                                FAF
*CALL CMMCOM                                                             FAF
          COMMENT  "SUBSYS"FLEXIBLE ALLOCATE FIXED.                      FAF
          B1=1                                                           FAF
 CMM.FAF  SPACE  4                                                       FAF
***       CMM.FAF - FLEXIBLE ALLOCATE FIXED.                             FAF
*                                                                        FAF
*                                                                        FAF
*              CMM.FAF ALLOCATES/CREATES A FIXED-POSITION BLOCK WHICH IS FAF
*         WITHIN THE SPECIFIED RANGE OF ALLOWABLE SIZES.  THE FIRST WORD FAF
*         ADDRESS AND THE ACTUAL SIZE ARE RETURNED.  THE INITIAL         FAF
*         CONTENTS OF THE BLOCK ARE UNDEFINED.                           FAF
*              IF THE GROUP-ID IS NON-ZERO, THE BLOCK IS ALLOCATED AS A  FAF
*         MEMBER OF THE IDENTIFIED GROUP.                                FAF
*              CMM WILL POSITION EACH BLOCK SO AS TO GUARANTEE EIGHT (8) FAF
*         WORDS PAST THE LWA OF THE BLOCK WHICH MAY BE FETCHED WITHOUT   FAF
*         CAUSING AN ADDRESS RANGE ERROR EXIT.                           FAF
*                                                                        FAF
*                                                                        FAF
*              THE ROUTINE FUNCTIONS AS FOLLOWS:                         FAF
*                                                                        FAF
*         1) FINDS A FREE REGION OF SIZE .GE. MIN-BLOCK-SIZE.            FAF
*         2) SETS UP A FIXED BLOCK OF THE SIZE:                          FAF
*              IF FREE-REGION-SIZE .LE. MAX-BLOCK-SIZE                   FAF
*                   THEN FREE-REGION-SIZE                                FAF
*                   ELSE MIN[MAX[MIN-BLOCK-SIZE,(FREE-REGION-SIZE)],     FAF
*                        MAX-BLOCK-SIZE].                                FAF
*                                                                        FAF
*                                                                        FAF
*         ENTRY  (X2) = BITS 59-48 -- ZERO.                              FAF
*                       BITS 47-30 -- MAX-BLOCK-SIZE.                    FAF
*                                     ZERO - USE MIN-BLOCK-SIZE.         FAF
*                       BITS 29-18 -- ZERO.                              FAF
*                       BITS 17-0  -- MIN-BLOCK-SIZE.                    FAF
*                (X3) = BITS 59-29 -- ZERO.                              FAF
*                       BITS 28-12 -- GROUP-ID.                          FAF
*                       BITS 11-6  -- SIZE-CODE.                         FAF
*                       BITS  5-0  -- ZERO.                              FAF
*                                                                        FAF
*         EXIT   (X1) = BLOCK-FWA.                                       FAF
*                (X2) = BLOCK-SIZE.                                      FAF
*                (B1) = 1.                                               FAF
*                                                                        FAF
*         SAVES  X - 0, 5.                                               FAF
*                B - 2, 3.                                               FAF
*                A - 0.                                                  FAF
                                                                         FAF
                                                                         FAF
          CMMENT  FAF                                                    FAF
 CMM.FAF  EQ     *+1S17      ENTRY / EXIT                                FAF
          SB1    1                                                       FAF
          RJ     =XCMM.ICM   INITIALIZE AND SET A0                       FAF
          SX6    3RFAF       SAVE FUNCTION NAME                          FAF
          SA6    A0-MNFNAME                                              FAF
          SA1    CMM.FAF     SAVE RETURN ADDRESS                         FAF
          LX1    30                                                      FAF
          BX6    X1                                                      FAF
          SA6    A0-MNRETURN                                             FAF
                                                                         FAF
 IS       IFSAFE                                                         FAF
          SA1    A0-IMAPM                                                FAF
          ZR     X1,FAF102                                               FAF
          UERR   CMEPMR,0    CALLED FROM POINTER-MAINTENANCE ROUTINE     FAF
                                                                         FAF
 FAF102   SB4    X2          MIN-BLOCK-SIZE                              FAF
          MI     B4,FAF103                                               FAF
          LX2    30                                                      FAF
          SB5    X2          MAX-BLOCK-SIZE                              FAF
          LX2    30                                                      FAF
          ZR     B5,FAF104   IF ZERO, USE MIN-BLOCK-SIZE                 FAF
          GE     B5,B4,FAF104  IF MAX \ MIN                              FAF
 FAF103   UERR   CMESIZE,0   SIZE ERROR                                  FAF
                                                                         FAF
 FAF104   SA1    A0-P.ENDZ   CHECK IF FP LWA-END GROW BLOCK PRESENT      FAF
          SA1    X1          TRAILER                                     FAF
 FAF105   LX1    -18                                                     FAF
          SX1    X1                                                      FAF
          ZR     X1,FAF106   IF ALL REGIONS EXAMINED                     FAF
          SA1    X1          NEXT HEADER                                 FAF
          BX6    X1                                                      FAF
          DF     X1,FAF105   IF NOT A FIXED BLOCK                        FAF
          LX6    59-45                                                   FAF
          PL     X6,FAF106   IF LWA-END GROWTH NOT SPECIFIED             FAF
          UERR   CMEFPVS,0   NOT ALLOWED TO ALLOCATE A FIXED BLOCK       FAF
                                                                         FAF
 FAF106   BX6    X3          GROUP-ID                                    FAF
          AX6    12                                                      FAF
          SA1    A0-P.GID                                                FAF
          SX6    X6                                                      FAF
          ZR     X6,FAF109   IF GROUP-ID NOT SPECIFIED                   FAF
          SB6    X1          (B6) = FWA OF GID BLOCK                     FAF
          AX1    18                                                      FAF
          SB7    X1          (B7) = LENGTH                               FAF
 FAF107   NZ     B7,FAF108   IF MORE                                     FAF
          UERR   CMENGID,0   NON-ACTIVE GROUP-ID SPECIFIED               FAF
                                                                         FAF
 FAF108   SA1    B6          NEXT ENTRY                                  FAF
          SB6    B6-B1                                                   FAF
          AX1    36                                                      FAF
          SX1    X1                                                      FAF
          IX1    X1-X6                                                   FAF
          SB7    B7-B1                                                   FAF
          NZ     X1,FAF107   IF NON-MATCH                                FAF
 FAF109   BSS    0                                                       FAF
 IS       ENDIF                                                          FAF
                                                                         FAF
*         STORE ARGUMENTS IN SAVE AREA.                                  FAF
                                                                         FAF
          SX6    X2          MIN-BLOCK-SIZE                              FAF
          LX2    30                                                      FAF
          SA6    A0-MINSIZE                                              FAF
          SX7    X2          MAX-BLOCK-SIZE                              FAF
          LX2    30                                                      FAF
          MX4    -6                                                      FAF
          NZ     X7,FAF2     IF MAX-BLOCK-SIZE SPECIFIED                 FAF
          BX7    X6          USE MIN-BLOCK-SIZE                          FAF
 FAF2     SA7    A0-MAXSIZE                                              FAF
          AX3    6                                                       FAF
          BX7    -X4*X3      SIZE-CODE                                   FAF
                                                                         FAF
 IS       IFSAFE                                                         FAF
          SB5    X7-10B                                                  FAF
          MI     B5,FAF110                                               FAF
          UERR   CMESC,0     IMPROPERLY SPECIFIED SIZE-CODE              FAF
                                                                         FAF
 FAF110   BSS    0                                                       FAF
 IS       ENDIF                                                          FAF
                                                                         FAF
          AX3    6           GROUP-ID                                    FAF
          SX6    X3                                                      FAF
          SA6    A0-GID                                                  FAF
          SA7    A0-SC       SAVE SIZE-CODE                              FAF
          SX7    X2+B1       MIN-BLOCK-SIZE, INCLUDING HEADER            FAF
          ZR     X6,FAF4     IF NO GROUP-ID                              FAF
          SX7    X7+B1       2-WORD HEADER NEEDED                        FAF
 FAF4     SA7    A0-TOTSIZE                                              FAF
                                                                         FAF
*         INITIAL #EASY# ATTEMPT.                                        FAF
                                                                         FAF
          RJ     FAFE                                                    FAF
          ZR     X1,FAF6     IF NOT SUCCESSFUL                           FAF
          SA4    A0-MNSAVEA0  RESTORE A0                                 FAF
          SA0    X4                                                      FAF
          EQ     CMM.FAF     RETURN, (X1) = BLOCK-FWA, (X2) = BLOCK-SIZE FAF
                                                                         FAF
*         IF OVERFLOW-ACTION CODE NOT PRESENT, CHECK DEFAULT TRIGGER     FAF
*         LEVEL AND, IF NOT REACHED, MAKE ONE TRY AT COMPLETING THE      FAF
*         FUNCTION VIA THE #HARD# ATTEMPT.                               FAF
                                                                         FAF
 FAF6     SX2    =YCMM.GOA                                               FAF
          PL     X2,FAF10    IF OVERFLOW-ACTION CODE PRESENT             FAF
          SX1    B1           ? SO TO ABORT IF EXCEEDED                  FAF
          RJ     =XCMM.CUL   -- COMPUTE UTILIZATION LEVEL --             FAF
          RJ     FAFH                                                    FAF
          NZ     X1,FAF8     IF SUCCESSFUL                               FAF
          MERR   ERRFAIL     CANNOT COMPLETE                             FAF
                                                                         FAF
*         RETURN THRU SAVED RETURN ADDRESS.  ACTUAL WOULD BE             FAF
*         CHANGED IF OVERFLOW-ACTION PROCESSING EXECUTED THIS SAME       FAF
*         FUNCTION.                                                      FAF
                                                                         FAF
 FAF8     SA4    A0-MNSAVEA0  RESTORE A0                                 FAF
          SA3    A0-MNRETURN  RETURN THRU SAVED RETURN ADDRESS           FAF
          SA0    X4                                                      FAF
          SB7    X3                                                      FAF
          JP     B7          RETURN, (X1) = BLOCK-FWA                    FAF
                                     (X2) = BLOCK-SIZE                   FAF
                                                                         FAF
*         OVERFLOW-ACTION PROCESSING.                                    FAF
                                                                         FAF
 FAF10    SX1    FAFE         ? #EASY# PROCESSOR                         FAF
          SX2    FAFH         ? #HARD# PROCESSOR                         FAF
          SA3    A0-TOTSIZE   ? SPACE NEEDED                             FAF
          RJ     =YCMM.GOA   -- GENERAL OVERFLOW ACTION --               FAF
          EQ     FAF8        GO TO RETURN                                FAF
                                                                         FAF
*         EQUATES TO SAVE AREA.                                          FAF
                                                                         FAF
 MINSIZE  EQU    MNARG1      MIN-BLOCK-SIZE                              FAF
 MAXSIZE  EQU    MNARG2      MAX-BLOCK-SIZE                              FAF
 TOTSIZE  EQU    MNARG3      MIN-BLOCK-SIZE + (HEADER SIZE)              FAF
 GID      EQU    MNARG4      GROUP-ID                                    FAF
 SC       EQU    MNARG5      SIZE-CODE                                   FAF
 GIDENT   EQU    MNARG6      GROUP-ID ENTRY FROM CMM INTERNAL BLOCK      FAF
 FAFESV   BSS    4           REGISTER SAVE AREA                          FAF
          SPACE  4,9                                                     FAF
**        FAFE - EASY CASE SUBROUTINE FOR FLEXIBLE ALLOCATE FIXED.       FAF
*                                                                        FAF
*                                                                        FAF
*         ENTRY  ARGUMENTS ARE IN SAVE AREA.                             FAF
*                (B1) = 1.                                               FAF
*                (A0) = FL.                                              FAF
*                                                                        FAF
*         EXIT   (X1) = BLOCK-FWA IF SUCCESS.                            FAF
*                       0 IF FAILURE.                                    FAF
*                (X2) = BLOCK-SIZE IF SUCCESS.                           FAF
*                (B1) = 1.                                               FAF
*                (A0) = FL.                                              FAF
*                                                                        FAF
*         USES   X - 1, 2, 3, 4, 6, 7.                                   FAF
*                B - 4, 5, 6, 7.                                         FAF
*                A - 1, 2, 3, 4, 5, 6, 7.                                FAF
                                                                         FAF
                                                                         FAF
 FAFE     EQ     *+1S17      ENTRY / EXIT                                FAF
          BX6    X0          SAVE X0                                     FAF
          LX7    X5          SAVE X5                                     FAF
          SA6    FAFESV                                                  FAF
          SA7    A6+B1                                                   FAF
          SX6    B2-B0       SAVE B2                                     FAF
          SX7    B3-B0       SAVE B3                                     FAF
          SA6    A7+B1                                                   FAF
          SA7    A6+B1                                                   FAF
          MX6    0           SET FOR NO GROUP-ID                         FAF
          SX7    B0          SET FOR GROUP-TYPE = 0                      FAF
          SA2    A0-TOTSIZE  (X2) = LENGTH, INCLUDING HEADER             FAF
          SA3    A0-GID      GROUP-ID                                    FAF
          ZR     X3,FAFE4    IF NO GROUP-ID                              FAF
          SA1    A0-P.GID                                                FAF
          SB6    X1                                                      FAF
          MX4    1                                                       FAF
 FAFE3    SA1    B6          FIND GROUP-ID IN INTERNAL TABLE             FAF
          SB6    B6-B1                                                   FAF
          SX0    A1                                                      FAF
          LX0    18                                                      FAF
          BX6    X1+X0                                                   FAF
          BX7    X4*X1                                                   FAF
          AX1    36                                                      FAF
          SX1    X1                                                      FAF
          IX1    X1-X3                                                   FAF
          NZ     X1,FAFE3    IF MISS                                     FAF
 FAFE4    SA6    A0-GIDENT   SAVE GID TABLE ENTRY                        FAF
          LX7    1           SET GROUP-TYPE                              FAF
          SB7    X7                                                      FAF
                                                                         FAF
*         BEGIN PROCESSING FOR LWA-END GROW BLOCK.                       FAF
                                                                         FAF
          SA4    A0-SC                                                   FAF
          LX4    59-0                                                    FAF
          PL     X4,FAFE16   IF NOT LWA-END GROW BLOCK                   FAF
          SB2    B0          SET NO AVAILABLE REGION                     FAF
          SA4    A0-B1       INITIALIZE REGION SEARCH                    FAF
          SA4    X4                                                      FAF
          AX4    18                                                      FAF
          SA3    HHA         (B6) = MINIMUM ALLOWABLE FWA                FAF
          SB6    X3+B1            = HHA+1                                FAF
          MX1    0           (X1) = 0 FOR NO FIND                        FAF
          ZR     B7,FAFE6    IF GROUP-TYPE 1                             FAF
          SA3    RA65        (B6) = DABA+1                               FAF
          BX3    -X3                                                     FAF
          SB6    X3+B1                                                   FAF
 FAFE6    ZR     X4,FAFE8    IF ALL REGIONS SEARCHED                     FAF
          SA3    X4          NEXT REGION HEADER                          FAF
          LX3    -18         (X4) = POINTER TO NEXT LOWER REGION         FAF
          SX4    X3                                                      FAF
          LX3    18                                                      FAF
          ID     X3,FAFE8    IF FIXED BLOCK, TERMINATE SEARCH            FAF
          MI     X3,FAFE6    IF VP REGION, CONTINUE SEARCH               FAF
          SB4    A3          (B4) = REGION FWA                           FAF
          LT     B4,B6,FAFE10  IF BELOW MINIMUM ALLOWABLE                FAF
          SB5    X3          (X0) = REGION SIZE                          FAF
          SX0    B5-B4                                                   FAF
          IX7    X0-X2                                                   FAF
          MI     X7,FAFE6    IF REGION TOO SMALL                         FAF
          SB2    B4          SET AVAILABLE REGION                        FAF
          EQ     FAFE6       LOOP                                        FAF
                                                                         FAF
 FAFE8    ZR     B2,FAFE40   IF SPACE NOT FOUND                          FAF
          EQ     FAFE11                                                  FAF
                                                                         FAF
 FAFE10   ZR     B2,FAFE12   IF SPACE NOT FOUND                          FAF
 FAFE11   SB7    B2          (B7) = FREE REGION FWA FOR BLOCK            FAF
          EQ     FAFE30      GO SET UP BLOCK                             FAF
                                                                         FAF
 FAFE12   SX7    X3                                                      FAF
          IX7    X7-X2                                                   FAF
          SB3    X7                                                      FAF
          GE     B3,B6,FAFE29  IF BLOCK CAN BE PLACED AT HHA+1           FAF
          EQ     FAFE40      FAILURE                                     FAF
                                                                         FAF
*         BEGIN NORMAL FIXED BLOCK ALLOCATION.                           FAF
                                                                         FAF
 FAFE16   SA3    HHA         (B6) = HHA+1                                FAF
          SA1    RA65        START SEARCH AT FIRST REGION                FAF
          BX1    -X1                                                     FAF
          SB6    X3+B1                                                   FAF
          SB5    X1+B1       (B5) = SEARCH POINTER                       FAF
 FAFE18   SA3    B5          (X3) = REGION HEADER                        FAF
          SB5    X3          (B5) = POINTER TO NEXT REGION HEADER        FAF
          ZR     B5,FAFE26   IF AT TRAILER                               FAF
          SB4    A3          (B4) = FWA THIS REGION                      FAF
          NZ     B7,FAFE19   IF GROUP-TYPE 1                             FAF
          LT     B4,B6,FAFE18  IF REGION BELOW HHA                       FAF
 FAFE19   MI     X3,FAFE18   IF NOT A FREE REGION                        FAF
          SX7    B5-B4       REGION SIZE                                 FAF
          IX1    X7-X2       (REGION SIZE) - (SPACE NEEDED)              FAF
          MI     X1,FAFE18   IF FREE REGION NOT LARGE ENOUGH             FAF
          SB7    A3          (B7) = FREE REGION FWA TO USE               FAF
          EQ     FAFE30      GO SET UP BLOCK                             FAF
                                                                         FAF
 FAFE26   MX1    0           SET RETURN FOR FAILURE                      FAF
          NZ     B7,FAFE40   IF GROUP-TYPE 1                             FAF
                                                                         FAF
*         CHECK FOR THE SPECIAL CASE OF A FREE REGION WITHIN WHICH,      FAF
*         IS HHA+1.  IF THE AMOUNT OF SPACE BETWEEN HHA+1 AND THE END    FAF
*         OF THIS REGION IS ENOUGH TO CONTAIN THE BLOCK, THEN THE        FAF
*         BLOCK WILL BE PLACED AT HHA+1.  NOTE THAT THIS CAN ONLY        FAF
*         APPLY TO A GROUP-TYPE 0 BLOCK, SINCE THIS REGION WOULD HAVE    FAF
*         ALREADY BEEN FOUND IF THE BLOCK WERE GROUP-TYPE 1.  NOTE ALSO  FAF
*         THAT THIS CASE MAY NOT BE RARE; SUCH AS IT WILL APPLY IF       FAF
*         THE VERY FIRST BLOCK TO BE ALLOCATED IS AN ORDINARY FIXED      FAF
*         BLOCK WITH NO GROUP-ID.                                        FAF
                                                                         FAF
          SA3    RA65        (B7) = REGION FWA                           FAF
          BX3    -X3                                                     FAF
          SB7    X3+B1                                                   FAF
 FAFE27   ZR     B7,FAFE40   IF NO SUCH FREE REGION                      FAF
          SA4    B7          NEXT REGION                                 FAF
          SB7    X4          (B7) = NEXT REGION FWA                      FAF
          SB4    A4          (B4) = REGION FWA                           FAF
          GE     B4,B6,FAFE40  IF ORIGIN ABOVE HHA+1                     FAF
          LT     B7,B6,FAFE27  IF REGION ENTIRELY BELOW HHA+1            FAF
          MI     X4,FAFE40   IF NOT A FREE REGION                        FAF
          SB5    X2          CHECK SPACE ABOVE HHA+1                     FAF
          SB5    B7-B5                                                   FAF
          LT     B5,B6,FAFE40  IF REGION NOT LARGE ENOUGH                FAF
                                                                         FAF
*         FORM TWO FREE REGIONS FROM ONE.  B4 CONTAINS THE SINGLE        FAF
*         FREE REGION HEADER.  B6 CONTAINS HHA+1.                        FAF
                                                                         FAF
 FAFE29   SA1    B4                                                      FAF
          SX6    X1          FWD FOR HEADER AT HHA+1                     FAF
          SX4    B4          BKD FOR HEADER AT HHA+1                     FAF
          LX4    18                                                      FAF
          BX6    X6+X4       FWD + BKD                                   FAF
          SA6    B6          STORE NEW HEADER AT HHA+1                   FAF
          SB5    X6          MODIFY FWD IN CURRENT FREE REGION HEADER    FAF
          SX3    B5-B6                                                   FAF
          IX7    X1-X3                                                   FAF
          SA7    A1                                                      FAF
          SX3    B6-B4       MODIFY BKD IN NEXT REGION HEADER            FAF
          LX3    18                                                      FAF
          SA2    X1                                                      FAF
          IX7    X2+X3                                                   FAF
          SA7    A2                                                      FAF
          SB7    B6          SET UP BLOCK AT HHA+1                       FAF
                                                                         FAF
*         DETERMINE SIZE AND SET UP NEWLY-ALLOCATED FIXED BLOCK.         FAF
*         B7 CONTAINS FWA OF FREE REGION.                                FAF
                                                                         FAF
 FAFE30   SA1    B7          (X6) = NEW FIXED BLOCK HEADER               FAF
          MX3    2           ADD CODE                                    FAF
          SA4    A0-SC       ADD SIZE-CODE                               FAF
          BX6    X1+X3                                                   FAF
          LX4    45                                                      FAF
          BX6    X6+X4                                                   FAF
          SB6    X1          (X0) = FREE REGION SIZE                     FAF
          SA4    A0-TOTSIZE  (X4) = MIN+HDR                              FAF
          SA2    A0-MINSIZE                                              FAF
          SX0    B6-B7                                                   FAF
          IX3    X4-X2       (X3) = HEADER-SIZE                          FAF
          SA1    A0-MAXSIZE  (X5) = MAX+HDR                              FAF
          IX5    X1+X3                                                   FAF
          IX7    X5-X0                                                   FAF
          MI     X7,FAFE32   IF FREE-REGION-SIZE > MAX+HDR               FAF
          BX2    X0          USE FREE-REGION-SIZE                        FAF
          EQ     FAFE34                                                  FAF
                                                                         FAF
 FAFE32   AX7    X0,B1       (FREE-REGION-SIZE)/2                        FAF
          IX1    X4-X7       (X1) = MAX[(MIN+HDR),(FREE-REGION-SIZE)/2]  FAF
          BX4    X4-X7                                                   FAF
          AX1    59                                                      FAF
          BX4    -X1*X4                                                  FAF
          BX1    X4-X7                                                   FAF
          IX2    X5-X1       (X2) = MIN[X1,(MAX+HDR)]                    FAF
          BX1    X5-X1            = (BLOCK-SIZE) + HDR                   FAF
          AX2    59                                                      FAF
          BX1    -X2*X1                                                  FAF
          BX2    X1-X5                                                   FAF
          IX7    X0-X2       ADJUST FWD FOR NEW FIXED BLOCK              FAF
          IX6    X6-X7                                                   FAF
          SX1    B6          FORM NEW FREE REGION HEADER                 FAF
          SX7    B7                                                      FAF
          LX7    18                                                      FAF
          BX7    X1+X7                                                   FAF
          SA7    B7+X2                                                   FAF
          SA5    B6          ADJUST BKD PTR IN NEXT REGION HEADER        FAF
          LX2    18                                                      FAF
          IX7    X5+X2                                                   FAF
          SA7    A5                                                      FAF
          LX2    -18                                                     FAF
 FAFE34   SA1    A0-CURALL   ADVANCE TOTAL OF ALLOCATED WORDS            FAF
          IX7    X1+X2                                                   FAF
          SA7    A1                                                      FAF
          IX2    X2-X3       SET BLOCK-SIZE FOR RETURN                   FAF
          SX1    B7+B1       SET BLOCK-FWA FOR RETURN                    FAF
          SA6    B7          STORE HEADER, WORD 0                        FAF
          SA5    A0-GIDENT                                               FAF
          ZR     X5,FAFE40   IF NO GROUP-ID SPECIFIED                    FAF
          SX3    B1          SET N = 1 TO INDICATE WORD 1 PRESENT        FAF
          LX3    44                                                      FAF
          BX6    X6+X3                                                   FAF
          SA6    A6                                                      FAF
          SX4    X5          INSERT NEW BLOCK IN CHAIN FOR THIS GROUP-ID FAF
          BX7    X5           SO THAT IT IS THE 1ST ENTRY                FAF
          AX7    18                                                      FAF
          MX0    -36                                                     FAF
          BX6    X0*X5                                                   FAF
          BX6    X6+X1                                                   FAF
          SA6    X7                                                      FAF
          AX5    36          ADD VALUE OF GID                            FAF
          SX6    X5                                                      FAF
          LX6    36                                                      FAF
          BX7    X4+X6                                                   FAF
          SX0    25B         ADD CODE                                    FAF
          LX0    54                                                      FAF
          BX7    X7+X0                                                   FAF
          SA7    X1                                                      FAF
          SX1    X1+B1       ADVANCE BLOCK-FWA DUE TO 2-WORD HEADER      FAF
          ZR     X4,FAFE40   IF LAST (ONLY) ENTRY IN CHAIN               FAF
          SA3    X4          SET PROPER BKD POINTER IN NEXT ENTRY        FAF
          SX7    X3                                                      FAF
          SX5    A7                                                      FAF
          LX5    18                                                      FAF
          BX7    X7+X5                                                   FAF
          BX7    X7+X6                                                   FAF
          BX7    X7+X0                                                   FAF
          SA7    A3                                                      FAF
                                                                         FAF
*         RESTORE REGISTERS AND EXIT.                                    FAF
*         EITHER (X1) = 0,                                               FAF
*         OR     (X1) = BLOCK-FWA, AND (X2) = BLOCK-SIZE.                FAF
                                                                         FAF
 FAFE40   SA4    FAFESV      RESTORE X0                                  FAF
          BX0    X4                                                      FAF
          SA5    A4+B1       RESTORE X5                                  FAF
          SA4    A5+B1       RESTORE B2                                  FAF
          SA3    A4+B1       RESTORE B3                                  FAF
          SB2    X4-0                                                    FAF
          SB3    X3-0                                                    FAF
          EQ     FAFE        RETURN                                      FAF
 ALFH     SPACE  4,25                                                    FAF
**        FAFH - HARD CASE SUBROUTINE FOR FLEXIBLE ALLOCATE FIXED.       FAF
*                                                                        FAF
*                                                                        FAF
*         ENTRY  ARGUMENTS ARE IN SAVE AREA.                             FAF
*                (B1) = 1.                                               FAF
*                (A0) = FL.                                              FAF
*                                                                        FAF
*         EXIT   (X1) = BLOCK-FWA IF SUCCESS.                            FAF
*                       0 IF FAILURE.                                    FAF
*                (X2) = BLOCK-SIZE IF SUCCESS.                           FAF
*                (B1) = 1.                                               FAF
*                (A0) = FL.                                              FAF
*                                                                        FAF
*         USES   X - 1, 2, 3, 4, 6, 7.                                   FAF
*                B - 4, 5, 6, 7.                                         FAF
*                A - 1, 2, 3, 4, 6, 7.                                   FAF
                                                                         FAF
                                                                         FAF
 FAFH     EQ     *+1S17      ENTRY / EXIT                                FAF
          SA1    A0-B1       GET HEADER OF HIGHEST REGION                FAF
          SA2    X1                                                      FAF
          AX2    18                                                      FAF
          SA3    X2                                                      FAF
          MX4    3                                                       FAF
          BX4    X4*X3                                                   FAF
          LX4    3                                                       FAF
          SB7    X1          (B7) = LWA+1 OF HIGHEST REGION              FAF
          SX4    X4-4                                                    FAF
          ZR     X4,FAFH10   IF PRIMARY VP REGION EXISTS                 FAF
                                                                         FAF
*         FIXED-BLOCK-ONLY CASE.                                         FAF
                                                                         FAF
          MX4    0           K = 0                                       FAF
          MI     X3,FAFH4    IF HIGHEST REGION IS A FIXED BLOCK          FAF
          SX2    X2                                                      FAF
          IX4    X1-X2       K = SIZE OF FREE REGION                     FAF
          SA1    A0-GIDENT                                               FAF
          MI     X1,FAFH4    IF GROUP-TYPE 1                             FAF
          SA2    HHA         ADJ = (HIGHEST REGION LWA+1) - (HHA+1)      FAF
          SB6    X2+B1                                                   FAF
          SX2    B7-B6                                                   FAF
          IX6    X4-X2       K = MIN(K,ADJ)                              FAF
          BX2    X2-X4                                                   FAF
          AX6    59                                                      FAF
          BX2    -X6*X2                                                  FAF
          BX4    X2-X4                                                   FAF
 FAFH4    SA1    A0-TOTSIZE                                              FAF
          IX4    X1-X4       K = (BLOCK SIZE INCLUDING HEADER) - K       FAF
          SX2    A0                                                      FAF
          SA3    A0-MAXFL                                                FAF
          IX3    X3-X2       MAXFL - FL                                  FAF
          SA1    A0-FLINC.C 
          IX2    X4+X1       K + FLINC
          IX6    X2-X3       INC = MIN[(K+FLINC),(MAXFL-FL)]             FAF
          BX3    X3-X2                                                   FAF
          AX6    59                                                      FAF
          BX3    -X6*X3                                                  FAF
          BX6    X3-X2                                                   FAF
          IX7    X6-X4       AVAILABLE - NEEDED                          FAF
          MX1    0           SET FOR UNSUCCESSFUL RETURN                 FAF
          MI     X7,FAFH     IF NOT ENOUGH FL INCREASE POSSIBLE          FAF
          BX4    X6           ? (X4) = AMOUNT TO INCREASE                FAF
          RJ     =XCMM.CFL   -- INCREASE FL --                           FAF
 FAFH8    RJ     FAFE                                                    FAF
          ZR     X1,*+1S17   SYSTEM ERROR                                FAF
          EQ     FAFH        RETURN, (X1) = BLOCK-FWA, (X2) = BLOCK-SIZE FAF
                                                                         FAF
*         PROCESSING WHEN VARIABLE BLOCKS ARE PRESENT.                   FAF
                                                                         FAF
 FAFH10   BSS    0                                                       FAF
                                                                         FAF
 IS       IFSAFE                                                         FAF
          SX2    =YCMM.VAF                                               FAF
          PL     X2,FAFH102  IF VARIABLE BLOCK CODE PRESENT              FAF
          UERR   CMENEED,3RVAF                                           FAF
                                                                         FAF
 FAFH102  BSS    0                                                       FAF
 IS       ENDIF                                                          FAF
                                                                         FAF
          RJ     =YCMM.VAF   -- VP REGION CODE FOR ALLOCATE FIXED --     FAF
          NZ     X1,FAFH8    IF SUCCESS                                  FAF
          EQ     FAFH        RETURN WITH FAILURE                         FAF
                                                                         FAF
