*COMDECK ALFINDHOL
      SUBROUTINE FINDHOL(HOLBEGN,HOLEND,HOLSIZE)
C 
C 
C        THIS MODULE WILL FIND THE LARGEST AREA IN MAIN MEMORY
C        WITHOUT ANY MODULES, I.E., THE LARGEST HOLE.  IT 
C        EXCLUDES ANY UNUSED PORTION OF THE BASE PAGE AREA. 
C                     ****NOTE****
C            THIS MODULE MAY NOT BE USED PRIOR TO 
C            LOAD PHASE 1: LDPH1. 
C 
C 
*CALL ALCOMMON
      DATA  BASEND/177776B/ 
      HOLBEGN = 0 
      HOLEND  = 0 
      HOLSIZE = 0 
C 
C        SORT THE MODULES BY INCREASING ADDRESS, THEN SCAN
C        FOR THE FIRST NON-ZERO ADDRESS.
C 
      CALL SORTARY(SRTDADR, MODCNTR, 4) 
      DO 5 J=1,MODCNTR
         IF ((MODTABL(4,SRTDADR(J)).AND.DUMYMSK) .NE. 0) GO TO 3
         IF ((MODTABL(3,SRTDADR(J)).AND.DEFMASK) .EQ. 0) GO TO 5
3        CONTINUE 
      NEXTADR = AND(MODTABL(1,SRTDADR(J)), LDADMSK) 
      IF (NEXTADR .NE. 0) GO TO 10
   5  CONTINUE
  10  FIRSTMD = J 
C 
C        SEE IF THERE A HOLE AT THE VERY BEGINNING OF 
C        THE MAIN MEMORY. 
C 
      IF (NEXTADR .GT. 2) HOLSIZE = NEXTADR 
C 
C        FOR ALL MODULES, COMPARE THE END OF ONE MODULE WITH
C        THE BEGINNING OF THE FOLLOWING MODULE TO DETERMINE 
C        WHETHER THEY ARE CONTIGUOUS OR A GAP EXISTS. 
C 
      LASTRUN = MODCNTR - 1 
         MODEND = NEXTADR+MODTABL(2,SRTDADR(J)) 
      DO 30 M=FIRSTMD, LASTRUN
* 
*        SKIP MODULE IF ITS APPLICATION(S) NOT DEFINED AND
*          IT IS NOT A DUMMY MODULE 
* 
         IF ((MODTABL(4,SRTDADR(M+1)).AND.DUMYMSK) .NE. 0) GO TO 15 
         IF ((MODTABL(3,SRTDADR(M+1)).AND.DEFMASK) .EQ. 0) GO TO 30 
15       CONTINUE 
      NEXTADR = AND(MODTABL(1,SRTDADR(M+1)),LDADMSK)
         NEXTEND = NEXTADR+MODTABL(2,SRTDADR(M+1))
C 
C        IF THE NEXT ADDRESS EQUALS OR EXCEEDS THE BASE 
C        MEMORY UPPER LIMIT, THEN RETURN. 
C 
      IF (NEXTADR .GE. BASEND) RETURN 
* 
*        BRANCH IF COMPLETE OVERLAP (SKIP MODULE) 
* 
         IF (NEXTEND .LE. MODEND) GO TO 30
* 
*        BRANCH IF PARTIAL OVERLAP OR NO GAP (IDLE MODULE)
* 
         IF (NEXTADR .LE. MODEND) GO TO 25
C 
C        THE GAP IS THE DIFFERENCE IN THE TWO ADDRESSES . 
C 
      GAP = NEXTADR - MODEND
         IF (HOLSIZE .GE. GAP) GO TO 25 
      HOLSIZE = GAP 
      HOLBEGN = MODEND
      HOLEND  = NEXTADR - 1 
* 
*        VALID MODULE, ADJUST POINTER 
* 
25       CONTINUE 
         MODEND = NEXTADR+MODTABL(2,SRTDADR(M+1)) 
  30  CONTINUE
* 
      RETURN
* 
      END 
C 
C 
