*DECK FCSMDTS 
USETEXT TEXTFCS 
      PROC FCSMDTS (PTR, (IDX), (NUM)); 
*CALL COPYRITE
# TITLE FCSMDTS - DEALLOCATE TABLE SPACE.                              #
  
      BEGIN                            # FCSMDTS                       #
  
# 
**    FCSMDTS - DEALLOCATE TABLE SPACE. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE DEALLOCATES THE REQUESTED AMOUNT OF MEMORY FROM THE
*     SPECIFIED TABLE BEGINNING AT THE SPECIFIED POSITION IN THE TABLE. 
* 
*     PROC FCSMDTS (PTR, IDX, NUM)
* 
*     ENTRY    PTR       = PTR TO TABLE TO DEALLOCATE SPACE FROM. 
*              IDX       = WORD INDEX WITHIN TABLE TO START DEALLOCATION. 
*              NUM       = NUMBER OF WORDS TO DEALLOCATE. 
*              AVAIL     = AVAILABLE WORDS FOR TABLE EXPANSION. 
* 
*     EXIT     AVAIL     = AVAILABLE WORDS FOR TABLE EXPANSION. 
*              TABLE LENGTH UPDATED.
* 
*     METHOD   IF THE DEALLOCATION IS NOT AT THE END OF THE TABLE THEN
*              RELOCATE THE AFFECTED PORTION OF THE TABLE.
*              UPDATE THE TABLE LENGTH AND AVAILABLE WORDS FOR TABLE
*              EXPANSION. 
* 
# 
  
# 
****  PROC FCSMDTS - XREF LIST
# 
      XREF
        BEGIN 
        PROC MOVEI;                    # MOVE A NUMBER OF WORDS (IND)  #
        END 
# 
****
# 
      ITEM PTR           I;            # TABLE POINTER                 #
      ITEM IDX           I;            # DEALLOCATION INDEX WITHIN TBL #
      ITEM NUM           I;            # NUMBER OF WORDS TO DEALLOCATE #
  
      ITEM COUNT         I;            # NUMBER OF WORDS TO MOVE       #
      ITEM DEST          I;            # ADDRESS TO MOVE TO            #
      ITEM FROM          I;            # ADDRESS TO MOVE FROM          #
      ITEM K             I;            # MANAGED TABLE INDEX           #
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      K = (LOC(PTR) - LOC(TSTART)) / 2;# CALCULATE MANAGED TABLE INDEX #
  
      COUNT = TABL[K] - IDX - NUM;     # NUMBER OF WORDS TO MOVE       #
      IF COUNT NQ 0 
      THEN
        BEGIN                          # NEED TO MOVE PART OF TABLE    #
        FROM = TABF[K] + IDX + NUM;    # ADDRESS TO MOVE FROM          #
        DEST = TABF[K] + IDX;          # ADDRESS TO MOVE TO            #
        MOVEI (COUNT, FROM, DEST);     # MOVE AFFECTED PART OF TABLE   #
        END;
  
      TABL[K] = TABL[K] - NUM;         # UPDATE TABLE LENGTH           #
      AVAIL = AVAIL + NUM;             # UPDATE AVAILABLE WORDS        #
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSMDTS                       #
  
      TERM
