*DECK FFSMRMT 
USETEXT TEXTFFS 
      PROC FFSMRMT (SPARE, (K), (NUM)); 
*CALL COPYRITE
# TITLE FFSMRMT - RELOCATE MANAGED TABLES.                             #
  
      BEGIN                            # FFSMRMT                       #
# 
**    FFSMRMT  RELOCATE MANAGED TABLES. 
* 
*     A. LIM                           88/01/18 
* 
*     THIS PROCEDURE RELOCATES ALL MANAGED TABLES BASED ON THE AMOUNT 
*     OF SPARE SPACE AVAILABLE AND TAKING INTO ACCOUNT ANY CURRENT
*     TABLE EXPANSION.
* 
*     PROC FFSMRMT (SPARE, K, NUM)
* 
*     ENTRY    SPARE  = NUMBER OF SPARE TABLE WORDS.
*              K      = INDEX OF TABLE THAT IS EXPANDING. 
*              NUM    = NUMBER OF WORDS TABLE IS EXPANDING. 
*              TSTART = DUMMY FIRST TABLE POINTER.
*              NTAB   = NUMBER OF MANAGED TABLES. 
* 
*     EXIT     MANAGED TABLES RELOCATED.
* 
*     METHOD   DIVIDE THE AMOUNT OF SPARE TABLE WORDS EQUALLY BETWEEN 
*              ALL TABLES (ALLOWING FOR EXPANSION OF SPECIFIED TABLE).
*              RELOCATE EACH TABLE WHOSE STARTING ADDRESS IS CHANGED. 
* 
# 
  
# 
****  PROC FFSMRMT - XREF LIST
# 
      XREF
        BEGIN 
        PROC MOVEI;      # MOVE A NUMBER OF WORDS - INDIRECT ADDRESSING#
        END 
# 
****
# 
      ITEM SPARE         I;            # NUMBER OF SPARE TABLE WORDS   #
      ITEM K             I;            # INDEX OF TABLE BEING INCREASED#
      ITEM NUM           I;            # NUMBER OF WORDS TO ALLOCATE   #
  
      ITEM I             I;            # LOOP INDUCTION VARIABLE       #
      ITEM NEWA          I;            # NEW START ADDRESS OF TABLE    #
      ITEM ROOM          I;            # ROOM TO KEEP ABOVE EACH TABLE #
      CONTROL EJECT;
  
#     START MAIN PROCEDURE                                             #
  
      ROOM = (SPARE - NUM) / NTAB;     # ROOM ABOVE EACH TABLE         #
  
      TABL[K] = TABL[K] + NUM;         # ALLOW FOR TABLE EXPANSION     #
      NEWA = TSTART;                   # START ADDRESS OF FIRST TABLE  #
      FOR I = 1 STEP 1 UNTIL NTAB DO   # LOOP THRU ALL TABLES          #
        BEGIN 
        TABA[I] = NEWA;                # NEW TABLE START ADDRESS       #
        NEWA = TABA[I] + TABL[I] + ROOM;
        END;
      TABL[K] = TABL[K] - NUM;         # TRUE LENGTH OF TABLE TO EXPAND#
  
      FOR I = NTAB STEP -1 UNTIL 1 DO  # LOOP THRU ALL TABLES          #
        BEGIN 
        IF TABA[I] GR TABB[I] 
        THEN
          BEGIN                        # NEED TO MOVE TABLE UP         #
          MOVEI (TABL[I],TABB[I],TABA[I]);
          END;
        END;
  
      FOR I = 1 STEP 1 UNTIL NTAB DO   # LOOP THRU ALL TABLES          #
        BEGIN 
        IF TABA[I] LS TABB[I] 
        THEN
          BEGIN                        # NEED TO MOVE TABLE DOWN       #
          MOVEI (TABL[I],TABB[I],TABA[I]);
          END;
        TABF[I] = TABA[I];             # NEW ADDRESS IS NOW CURRENT    #
        TABA[I] = 0;                   # CLEAR TEMPORARY NEW ADDRESS   #
        END;
  
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FFSMRFL                       #
  
      TERM
