*COMDECK ALFILRMOD
      SUBROUTINE FILRMOD(MAXADDR,PROBLEM,SAVECTR) 
C 
C 
C        DURING THIS PHASE, MODULES DESIGNATED AS 'FILLERS' WILL BE 
C        ADDRESSED SO AS TO FILL IN THE GAPS IN THE BASE MEMORY IN
C        ORDER TO MAXIMIZE THE OPEN AREA BETWEEN THE REVERSE ADD- 
C        RESSED MODULES AND THE VERY LAST FORWARD ADDRESSED MODULES.
C        MADADDR IS THE LIMITING ADDRESS FOR THE FORWARD
C        LOADED 'FILLER' MODULES. 
C 
*CALL ALCOMMON
      PROBLEM = 0 
      HOLBEGN = 0 
      HOLEND  = 0 
      HOLSIZE = 0 
      NUMOFMD = 0 
C 
C        SORT THE MODULES BY INCREASING ADDRESS.  DETERMINE THE TOTAL 
C        NUMBER OF 'FILLER' MODULES WHILE SCANNING FOR THE FIRST MODULE 
C        WITHOUT A ZERO ADDRESS.
C 
      CALL SORTARY(SRTDADR, MODCNTR, 4) 
      DO 5 J=1,MODCNTR
      JJ = SRTDADR(J) 
      IF (JJ .GT. SAVECTR) GO TO 3
      IF (AND(MODTABL(3,JJ),DEFMASK) .EQ. 0) GO TO 5
   3  NEXTADR = AND(MODTABL(1,JJ),LDADMSK)
      IF (NEXTADR .NE. 0) GO TO 8 
      IF (AND(MODTABL(4,JJ),FILLMSK) .NE. 0)
     X       NUMOFMD = NUMOFMD + 1
   5  CONTINUE
   8  INDEX = J 
      IF (NUMOFMD .EQ. 0) RETURN
C 
C        LOAD FILLER MODULES DEPENDING UPON WHETHER A MODULE
C        HAS BEEN PREASSIGNED TO LOCATION $0000 OR NOT. 
C 
      IF (ZEROFLG) GO TO 12 
C 
C        ...THIS SECTION PREPARES FOR THE FILLER MODULE TO BE 
C           ASSIGNED LOCATION $0000 BY THIS ROUTINE.
C 
  10  HOLSIZE = NEXTADR 
      DO 11 K=1,INDEX 
      KK = SRTDADR(K) 
      IF (AND(MODTABL(3,KK),DEFMASK) .EQ. 0) GO TO 11 
      LENGTH = MODTABL(2,KK)
      IF (LENGTH .GT. HOLSIZE) GO TO 11 
      IF (AND(MODTABL(4,KK),FILLMSK) .EQ. 0) GO TO 11 
      NUMOFMD = NUMOFMD - 1 
      ZERONAM = MODTABL(1,KK) 
      HOLSIZE = HOLSIZE - LENGTH
      HOLBEGN = LENGTH
      GO TO 15
   11 CONTINUE
      GO TO 30
C 
C        ...THIS SECTION PROTECTS THE MODULE PREASSIGNED
C           TO LOCATION $0000.
C 
   12 DO 13 K=1,INDEX 
      KK = SRTDADR(K) 
      IF (AND(MODTABL(3,KK),DEFMASK) .EQ. 0) GO TO 13 
      IF (ZERONAM .EQ. MODTABL(1,KK)) GO TO 14
   13 CONTINUE
C 
C        IF WE GET HERE, THE MODULE PREASSIGNEED TO $0000 IS NOT
C        PART OF THIS BUILD; THEREFORE ASSIGN A FILLER MODULE 
C        TO THIS LOCATION.
C 
      ZERONAM = 0 
      GO TO 10
   14 HOLBEGN = MODTABL(2,KK) 
      HOLSIZE = NEXTADR - HOLBEGN 
C 
C        ACCOUNT FOR A RESERVED AREA BEGINNING AT $0000.
C 
      IF (HOLSIZE .LT. 0) GO TO 30
C 
C        SCAN THE UNADDRESSED MODULES TO DETERMINE WHETHER ANY
C        CAN BE LOADED. 
C 
  15  DO 20 L=1,INDEX 
      LL = SRTDADR(L) 
      IF (AND(MODTABL(1,LL),LDADMSK) .NE. 0) GO TO 20 
      IF (AND(MODTABL(1,LL),MODNAME).EQ.ZERONAM)GO TO 20
      IF (AND(MODTABL(3,LL),DEFMASK) .EQ. 0) GO TO 20 
      IF (AND(MODTABL(4,LL),FILLMSK) .EQ. 0) GO TO 20 
      IF (MODTABL(2,LL) .GT. HOLSIZE)        GO TO 20 
C 
C        A SUITABLE MODULE HAS BEEN DISCOVERED.  INSERT AN
C        ADDRESS AND DECREASE HOLE SIZE AND COUNTER.
C        RETURN IF THE COUNTER IS ZERO. 
C 
      MODTABL(1,LL) = MODTABL(1,LL) + HOLBEGN 
      HOLBEGN = HOLBEGN + MODTABL(2,LL) 
      HOLSIZE = HOLSIZE - MODTABL(2,LL) 
      NUMOFMD = NUMOFMD - 1 
      IF (NUMOFMD .EQ. 0) RETURN
  20  CONTINUE
C 
C        WHEN NO MORE MODULES CAN FIT INTO THE PRESENT GAP, A 
C        NEW ONE MUST BE LOCATED. 
C 
  30  ENDPLS1 = NEXTADR + MODTABL(2,SRTDADR(J)) 
  31  J = J + 1 
      IF (J .GT. MODCNTR) GO TO 900 
C 
C        IGNORE MODULES NOT PART OF THIS LOAD, BUT DO NOT 
C        IGNORE RESERVED AREAS. 
C 
      IF (SRTDADR(J) .GT. SAVECTR) GO TO 32 
      IF (AND(MODTABL(3,SRTDADR(J)),DEFMASK) .EQ. 0) GO TO 31 
  32  NEXTADR = AND(MODTABL(1,SRTDADR(J)),LDADMSK)
         NEXTEND = NEXTADR+MODTABL(2,SRTDADR(J))
* 
*        BRANCH IF NO MORE MAIN MEMORY LEFT 
* 
         IF (NEXTADR .GT. MAXADDR) GO TO 900
* 
*        BRANCH IF COMPLETE OVERLAP (SKIP MODULE) 
* 
         IF (NEXTEND .LE. ENDPLS1) GO TO 31 
* 
*        BRANCH IF PARTIAL OVERLAP OR NO GAP (IDLE MODULE)
* 
         IF (NEXTADR .LE. ENDPLS1) GO TO 30 
* 
*        THE GAP IS THE DIFFERENCE IN THE 2 ADDRESSES 
* 
      GAP = NEXTADR - ENDPLS1 
C 
C        IF THE GAP IS TOO SMALL, MOVE TO THE NEXT PAIR OF
C        SEQUENTIAL MODULES.  OTHERWISE RETURN TO THE 
C        ADDRESSING LOOP. 
C 
      IF (GAP .LT. 3) GO TO 30
      HOLSIZE = GAP 
      HOLBEGN = ENDPLS1 
      GO TO 15
C 
C 
C            ****** PROBLEMS ****** 
C 
C        MODULES REMAIN UNADDRESSED, BUT THE SEARCH HAS 
C        EXCEEDED BASE MEMORY.
C 
 900  PROBLEM = 1 
      IF (RPTGEN) RETURN
      WRITE (5,904) 
 904  FORMAT (1X,////,5X,8(1H+)," WHILE LOADING FILLER MODULES")
      WRITE (5,905) NUMOFMD 
 905  FORMAT (14X,I3," MODULES REMAIN UNLOADED.") 
      DO 910 M=1,INDEX
      IF (AND(MODTABL(1,SRTDADR(M)),LDADMSK) .NE. 0) GO TO 910
      IF (AND(MODTABL(1,SRTDADR(M)),MODNAME).EQ.ZERONAM)GO TO 910 
      IF (AND(MODTABL(3,SRTDADR(M)),DEFMASK) .EQ. 0) GO TO 910
      IF (AND(MODTABL(4,SRTDADR(M)),FILLMSK) .EQ. 0) GO TO 910
      WRITE (5,907) MODTABL(1,SRTDADR(M)) 
 907  FORMAT (20X,A6) 
 910  CONTINUE
      WRITE (5,915) J, MODCNTR, NEXTADR, MAXADDR
 915  FORMAT (1X,//,10X,"INDEX J = ",I4,6X,"MODCNTR = ",I4,/, 
     X    10X,"NEXTADR = ",I6,5X,"MAXADDR = ",I6) 
      RETURN
C 
C 
      END 
C 
C 
