*COMDECK ALLODMAIN
      OVERLAY(5,0)
      PROGRAM LODMAIN 
C 
C 
C 
C        THIS ROUTINE LOADS ALL REMAINING MODULES TO MAIN MEMORY
C        STARTING WITH APPLICATIONS HAVING ASSIGNED ADDRESSES.
C 
C 
*CALL ALCOMMON
      DATA MODULE /6/ 
      DATA MAXOVLY / 10 / 
      DATA HIBIT /40000000000000000000B/
C 
C 
C        FIRST, MAKE ALL RESERVED AREAS LOOK LIKE REGULAR MODTABL 
C        ENTRIES. 
C 
      SWITCH = 1
      SAVECTR = MODCNTR 
      DO 5 I=1,RSRVCTR
      MODCNTR = MODCNTR + 1 
      MODTABL(1,MODCNTR) = RESERVD(1,I) 
      MODTABL(2,MODCNTR) = RESERVD(2,I) - RESERVD(1,I) + 1
      MODTABL(3,MODCNTR) = 0
      MODTABL(4,MODCNTR) = DUMYMSK
      MODTABL(5,MODCNTR) = 0
    5 CONTINUE
C 
C 
C        FIND THE BIGGEST OVERLAY AREA SIZE, SO WE KNOW HOW BIG 
C        TO MAKE IT.
C 
      OVLYCTR = 0 
      DO 70 I=1,MODCNTR 
C 
C 
C        DO NOT LOAD IF THIS HAS NO DEFINED APPLICATIONS. 
C 
      IF (AND(MODTABL(3,I),DEFMASK).EQ.0) GO TO 70
C 
C        ALSO DO NOT LOAD IF THIS DOES NOT BELONG TO AN OVERLAY.
C 
      OVNAME = AND(MODTABL(5,I),OVNMASK)
      IF (OVNAME.EQ.0) GO TO 70 
C 
C        GET THE LENGTH OF THIS MODULE, THEN BRANCH OUT IF
C        THIS BELONGS TO THE FIRST OVERLAY. 
C 
      LENGTH = MODTABL(2,I) 
      IF (OVLYCTR.EQ.0) GO TO 60
C 
C        OTHERWISE, FIND THE OVERLAY WHERE THIS BELONGS.  BRANCH
C        OUT IF THE OVERLAY HAS ALREADY BEEN INITIALIZED. 
C 
      DO 55 J=1,OVLYCTR 
      IF (OVNAME.EQ.AND(OVLYTBL(J),OVNMASK)) GO TO 65 
   55 CONTINUE
C 
C        IF THIS IS THE FIRST OCCURRENCE OF THIS OVERLAY, INITIALIZE
C        ITS LENGTH.
C 
   60 OVLYCTR = OVLYCTR + 1 
      IF (OVLYCTR.GT.MAXOVLY) GO TO 920 
      OVLYTBL(OVLYCTR) = OR(OVNAME,LENGTH)
      GO TO 70
C 
C        FOR AN OVERLAY THAT HAS A LENGTH ALREADY, ADD IN THE NEW LENGTH. 
C 
   65 OVLYTBL(J) = OVLYTBL(J) + LENGTH
   70 CONTINUE
C 
C        CALCULATE THE LARGEST OVERLAY. 
C 
      BIGGEST = 0 
      DO 75 I=1,OVLYCTR 
      LENGTH = AND(OVLYTBL(I),COMPL(OVNMASK)) 
   75 BIGGEST = MAX0(BIGGEST,LENGTH)
C 
C        SET THE OVERLAY END ADDRESS IF NOT SPECIFIED BY THE USER,
C        AND ISSUE AN ERROR IF THERE IS NOT ENOUGH ROOM.
C 
      IF (OVLYEND.EQ.0) OVLYEND = OVLYBGN + BIGGEST - 1 
      IF (OVLYBGN + BIGGEST .GT. OVLYEND + 1) GO TO 930 
C 
C        STORE THE OVERLAY INFORMATION IN 'MODTABL'.
C 
      IF (BIGGEST .EQ. 0) GO TO 76
      MODCNTR = MODCNTR + 1 
      MODTABL(1,MODCNTR) = OVLYBGN
      MODTABL(2,MODCNTR) = BIGGEST
      MODTABL(3,MODCNTR) = 0
      MODTABL(4,MODCNTR) = DUMYMSK
      MODTABL(5,MODCNTR) = 0
* 
*        PUT SAM AREA INFO IN MODTABL IF REQUIRED 
* 
   76 CONTINUE
         IF (.NOT. SAMAFLG) GO TO 78
         MODCNTR = MODCNTR+1
         MODTABL(1,MODCNTR) = SAMSTRT 
         MODTABL(2,MODCNTR) = SAMEND-SAMSTRT+1
         MODTABL(3,MODCNTR) = 0 
         MODTABL(4,MODCNTR) = DUMYMSK 
         MODTABL(5,MODCNTR) = 0 
78       CONTINUE 
C 
C        LOAD APPLICATION WHICH HAVE ADDRESSES PREASSIGNED. 
C        IF PROBLEM = 1, MODULES OVERLAP; IF PROBLEM = 2, 
C        MAIN MEMORY WILL BE EXCEEDED.
C 
      CALL APPLOAD(SAVECTR,PROBLEM) 
      IF (PROBLEM - 1) 80,940,910 
  80  CONTINUE
C 
C        INSERT ADDRESSES IN MODULES WHICH ARE TO BE AT THE TOP 
C        OF MAIN MEMORY, I.E., MODULES WHICH ARE REVERSE
C        LOADED.  BEGINAD IS THE LOWEST LOCATION OF THIS
C        REVERSE LOADED AREA, AND IT IS RETURNED FOR LATER USE. 
C        IF PROBLEM = 1, MODULES OVERLAP. 
C 
      CALL REVLOAD(BEGINAD,PROBLEM) 
      IF (PROBLEM .EQ. 1) GO TO 940 
C 
C        ADDRESS THE REMAINING MODULES WHICH ARE TO BE
C        SEQUENTIALLY LOADED.  IF PROBLEM = 1, MODULES OVERLAP. 
C 
      CALL SEQLOAD(PROBLEM) 
      IF(PROBLEM .EQ. 1) GO TO 939
C 
C        ADDRESS THE FILLER MODULE WHICH CAN BE LOADED ANYWHERE.
C        BEGINAD IS THE START OF THE REVERSE LOADED AREA, 
C        THUS IT IS THE UPPER ADDRESS LIMIT.  IF PROBLEM = 1, 
C        MODULES WOULD OVERLAP THIS AREA IF LOADED. 
C 
      CALL FILRMOD(BEGINAD,PROBLEM,SAVECTR) 
      IF(PROBLEM .EQ. 1) GO TO 939
C 
C                ********* LAST APPLICATION ********* 
C        AT THIS POINT THE LAST APPLICATION, IN THE SET OF
C        DIRECTIVES , IS LOADED.
C        SORT 'MODTABL' BY ADDRESS.  USE THE ADDRESS OF THE LOWEST
C        REVERSE LOADED MODULE TO FIND THE INDEX OF THAT MODULE,
C 
      CALL SORTARY(SRTDADR,MODCNTR,4) 
      CALL FINDADR(BEGINAD,INDEX) 
C 
C        BACK UP ONE MODULE TO BEGIN LOADING UNLESS THE NEW 
C        MODULE IS UNDEFINED, THEN BACK UP AGAIN. 
C 
      DO 87 L=1,MODCNTR 
      IF (SRTDADR(L) .EQ. INDEX) GO TO 88 
   87 CONTINUE
      GO TO 940 
   88 L = L - 1 
      IF (L .LT. 1) GO TO 910 
      IF (AND(MODTABL(3,SRTDADR(L)),DEFMASK) .EQ. 0) GO TO 88 
      ADDRESS = AND(MODTABL(1,SRTDADR(L)),LDADMSK)
C 
C        FORM A FILTER TO IDENTIFY THE PROPER MODULES, I.E., THOSE
C        WHICH BELONG TO THE LAST APPLICATION.
C 
      FILTER = SHIFT(HIBIT,APPLCTR) 
C 
C        DETERMINE THE STARTING ADDRESS FOR THIS PHASE. 
C 
      NEXTADR = ADDRESS + MODTABL(2,SRTDADR(L)) 
      DO 90 N=1,MODCNTR 
C 
C        SKIP INAPPLICABLE MODULES: NON-ZERO ADDRESS, ETC.
C 
      IF (AND(MODTABL(1,N),LDADMSK) .NE. 0) GO TO 90
      IF (MODTABL(1,N) .EQ. ZERONAM ) GO TO 90
      IF (AND(MODTABL(3,N),DEFMASK) .EQ. 0) GO TO 90
      IF (AND(MODTABL(3,N),FILTER)  .EQ. 0) GO TO 90
C 
C        INSERT ADDRESS.
C 
      MODTABL(1,N) = MODTABL(1,N) + NEXTADR 
C 
C        UPDATE THE NEXT ADDRESS. 
C 
      NEXTADR = NEXTADR + MODTABL(2,N)
      IF(NEXTADR .GT. BEGINAD) GO TO 909
  90  CONTINUE
C 
C        CHECK IF ENOUGH MEMORY FOR INITIALIZATION TO COMPLETE
C 
      IF (BEGINAD - (((NEXTADR + 2047)/2048)*2048 + 4096) .LT. 1) 
     $ GOTO 945 
C 
C        CALCULATE THE BUFFER SPACE FOR THIS BUILD. 
C 
      CALL FINDMOD(6LPIBUF2,NDX)
      IF (NDX .LT. 0) GO TO 950 
      GAP1 = AND(MODTABL(1,NDX),LDADMSK) - NEXTADR
      GAP = BEGINAD - NEXTADR 
C 
C        DELETE THE DUMMY MODULES IN MODTABL AND RETURN.
C 
  100 MODCNTR = SAVECTR 
  110 RETURN
C 
C 
C 
C 
C        ERROR BRANCHES 
C 
C 
C 
C        MAIN MEMORY OVERFLOW.
C 
  909 MEMOVER = .TRUE.
  910 CALL ERRMSG(MODULE,37)
      GO TO 110 
C 
C        TOO MANY OVERLAYS. 
C 
  920 CALL ERRMSG(MODULE,49)
      GO TO 110 
C 
C        OVERLAY AREA GIVEN BY USER NOT LARGE ENOUGH. 
C 
  930 CALL ERRMSG(MODULE,50)
      WRITE (ERRFIL,935) BIGGEST
  935 FORMAT (/* $*,Z4,* WORDS REQUIRED FOR OVERLAY AREA*)
      GO TO 110 
C 
C        OVERLAPPING MODULES WILL RESULT. 
C 
  939 MEMOVER = .TRUE.
 940  CALL ERRMSG(MODULE,53)
      GO TO 110 
C 
C        NOT ENOUGH MEMORY FOR INITIALIZATION TO COMPLETE 
C 
  945 MEMOVER = .TRUE.
      CALL ERRMSG(MODULE,63)
      GOTO 110
C 
C        INVALID MODULE NAME. 
C 
  950 CALL ERRMSG(MODULE,18)
      GO TO 110 
      END 
C 
C 
*CALL ALREVLOAD 
*CALL ALAPPLOAD 
*CALL ALFINDHOL 
*CALL ALSEQLOAD 
*CALL ALFILRMOD 
