*COMDECK ALREVLOAD
      SUBROUTINE  REVLOAD(BEGINAD,PROBLEM)
C 
C 
C        MODULES WHICH ARE TO LOADED IN REVERSE ORDER 
C        FROM THE END OF BASE MEMORY ARE ADDRESSED IN 
C        THIS PHASE.  THE ORDER OF ADDRESSING IS
C        DEPENDENT UPON A REVERSE LOADABLE MODULES
C        POSITION IN "MODTABL" WITH THE FIRST SUCH
C        MODULE POSITIONED TO THE END OF BASE MEMORY, 
C        THE NEXT IN FRONT OF IT, ETC. WITH THE RESULT
C        THAT EACH SUBSEQUENT MODULE IN "MODTABL" IS
C        IN INVERSE POSITION IN MAIN MEMORY.  BEGINAD IS
C        THE FIRST LOCATION OF THIS GROUP OF MODULES. 
C        NOTE: IF THE LAST ADDRESS IS GIVEN IN MOD
C              DIRECTIVES, THE CALCULATION OF THE FIRST 
C              ADDRESS IS DONE IN SUBROUTINE RDOBJT.
C 
C 
*CALL ALCOMMON
C        INITIAL CONDITIONS 
C 
C 
      DATA BASEND /177776B/ 
      PROBLEM = 0 
C 
C        LOCATE THE NAME OF THE TOP REVERSE LOADED MODULE 
C        IN THIS BUILD. 
C 
      DO 3 I=1,MODCNTR
      IF (AND(MODTABL(3,I),DEFMASK) .EQ. 0) GO TO 3 
      IF (AND(MODTABL(5,I),PVALMSK) .EQ. REVERSE) GO TO 4 
   3  CONTINUE
C 
C        IF THERE ARE NO REVERSE LOADED MODULES, THEN ADJUST THE
C        BEGINNING ADDRESS TO THE FIRST PAGEABLE MODULE ADDRESS.
C 
      BEGINAD = BASEND + 2
      RETURN
   4  REVNAME = AND(MODTABL(1,I),MODNAME) 
C 
C        SORT "MODTABL" BY INCREASING ADDRESS.
C 
      CALL SORTARY(SRTDADR,MODCNTR,4) 
C 
C        BRANCH DEPENDING UPON WHETHER THE INITIAL REVERSE
C        ADDRESS HAS BEEN ASSIGNED. 
C 
      REVADR = AND(MODTABL(1,I),LDADMSK)
      IF (REVADR .EQ. 0) GO TO 8
      ENDADRS = REVADR - 1
C 
C        THE ADDRESS IS NON-ZERO, SO FIND THE POSITION OF 
C        THE MODULE IN THE ARRAY. 
C 
      DO 6 L=1,MODCNTR
      NAME = AND(MODTABL(1,SRTDADR(L)),MODNAME) 
      IF (NAME .EQ. REVNAME) GO TO 12 
   6  CONTINUE
      GO TO 900 
C 
C        THE END OF THE FIRST MODULE TO BE LOADED IS ...
C 
   8  ENDADRS = BASEND
      DO 10 L=1,MODCNTR 
      ADDRESS = AND(MODTABL(1,SRTDADR(L)),LDADMSK)
      IF (ADDRESS .GT. BASEND) GO TO 12 
  10  CONTINUE
      L = MODCNTR + 1 
C 
C        BACK UP ONE MODULE.
C 
  12  J = L - 1 
      MODADRS = AND(MODTABL(1,SRTDADR(J)),LDADMSK)
C 
C        THE ADDRESS OF THE END OF THIS MODULE IS ... 
C 
      MODTOP = MODADRS + MODTABL(2,SRTDADR(J)) - 1
C 
C        SCAN "MODTABL" FOR REVERSE LOADED MODULES. 
C        SKIP OVER THOSE WHICH AREN'T REVERSE LOADED. 
C 
      DO 20 M=1,MODCNTR 
      IF (AND(MODTABL(1,M),LDADMSK) .NE. 0) GO TO 20
      IF (AND(MODTABL(3,M),DEFMASK) .EQ. 0) GO TO 20
      PVALUE = AND(MODTABL(5,M),PVALMSK)
      IF (PVALUE .NE. REVERSE) GO TO 20 
C 
C        DETERMINE THE MODULES BEGINNING ADDRESS. 
C 
      LENGTH = MODTABL(2,M) 
      BEGINAD = ENDADRS - LENGTH + 1
C 
C        INSERT ADDRESS.
C 
      MODTABL(1,M) = AND(MODTABL(1,M),MODNAME) + BEGINAD
C 
C        SEE IF THE REVERSE LOADED MODULE OVERLAPPED
C        AN EXISTING MODULE.
C 
      IF (BEGINAD .LE. MODTOP) GO TO 900
      ENDADRS = BEGINAD - 1 
  20  CONTINUE
      RETURN
C 
C 
C            ****** PROBLEMS ****** 
C 
C 
C        ERRORS: MODULES OVERLAP
C 
 900  PROBLEM = 1 
      WRITE (5,904) 
 904  FORMAT (1X,////,5X,8(1H+)," WHILE REVERSE LOADING") 
      WRITE (5,905) MODTABL(1,M),BEGINAD,BEGINAD
 905  FORMAT (14X,"MODULE = ",A6," OVERLAPS AT ADDRESS $",
     X    Z4,"(",I5,")")
      RETURN
      END 
C 
C 
