*DECK MOVEDOWN
USETEXT  TCMMDEF
     FUNC MOVEDOWN(ADDRESS, LENGTH) I;   # MOVES A TABLE CLOSER TO HHA #
#----------------------------------------------------------------------#
#                                                                      #
#     M O V E D O W N                                                  #
#                                                                      #
#    THIS FUNCTION ATTEMPTS TO ALLOCATE MEMORY FOR A TABLE IN ORDER    #
# TO REPOSITION IT AT A LOWER ADDRESS. THE VALUE RETURNED IS THE       #
# CURRENT POSITION OF THE TABLE. THE INPUT PARAMETERS ARE THE ADDRESS  #
# AND THE LENGTH OF THE TABLE.                                         #
  
  
      BEGIN 
      ITEM ADDRESS I;              # ADDRESS OF TABLE TO BE MOVED      #
      ITEM LENGTH  I;              # LENGTH  OF TABLE TO BE MOVED      #
  
          BASED ARRAY WORK1;  ITEM IWORK1;
          BASED ARRAY WORK2;  ITEM IWORK2;
          ITEM K; 
          DEF  CALL  # # ;
  
       MOVEDOWN = ADDRESS;         # SET MOVEDOWN IN CASE OF FAILURE   #
  
       IF LENGTH GR 0 THEN
       BEGIN
                             # ALLOCATE SPACE FOR NEW TABLE            #
          P<WORK2> = CMM$ALF(LENGTH, FIXED$LWA, 0); 
          IF P<WORK2> GR ADDRESS THEN        # TEST IF CLOSER THAN OLD #
             CALL CMM$FRF(P<WORK2>);         # IF NOT, GIVE UP         #
          ELSE
          BEGIN 
             P<WORK1> = ADDRESS;
             FOR K=0 STEP 1 UNTIL LENGTH-1  DO
                                       IWORK2[K] = IWORK1[K]; 
             CALL CMM$FRF(ADDRESS);          # RELEASE OLD SPACE       #
             MOVEDOWN = P<WORK2>; 
          END 
       END
       RETURN;
     END
TERM
