*DECK FCSMRMT 
USETEXT TEXTFCS 
      PROC FCSMRMT (SPARE, (K), (NUM)); 
*CALL COPYRITE
# TITLE FCSMRMT - RELOCATE MANAGED TABLES.                             #
  
      BEGIN                            # FCSMRMT                       #
  
# 
**    FCSMRMT - RELOCATE MANAGED TABLES.
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE RELOCATES ALL MANAGED TABLES BASED ON THE AMOUNT 
*     OF SPARE SPACE AVAILABLE AND TAKING INTO ACCOUNT ANY CURRENT
*     TABLE EXPANSION.
* 
*     PROC FCSMRMT (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 FCSMRMT - XREF LIST
# 
      XREF
        BEGIN 
        PROC MOVEI;                    # MOVE A NUMBER OF WORDS (IND)  #
        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                              # FCSMRMT                       #
  
      TERM
