*COMDECK ALLDFILE 
      SUBROUTINE LDFILE(OBJUNIT)
C 
C 
C 
C        THIS ROUTINE PERFORMS THE ACTUAL READING OF OBJECT FILES,
C        AND LOADS THE LENGTH OF EACH MODULE FOUND INTO ITS APPROPRIATE 
C        MODTABL ENTRY. 
C 
C 
C 
*CALL ALCOMMON
      DIMENSION RECORD(2000)
      LOGICAL ALFANUM 
      REAL UNIT 
C 
C 
      DATA MODULE /7/ 
      DATA NAMBLOK,CHR1MSK,CHR2MSK / 20120B , 7700B , 77B / 
      DATA NAMEMSK / 77777777777700000000B /
      DATA TESTMSK / 77777700000000000000B /
C 
C 
C 
C 
      SWITCH = 1
      REWIND OBJUNIT
C 
C        READ THE FIRST RECORD ON THE FILE SO WE CAN DETERMINE WHICH
C        TYPE OF FILE IT IS.
C 
   10 BUFFER IN (OBJUNIT,1) (RECORD(1),RECORD(2000))
      IF (UNIT(OBJUNIT)) 15,100,100 
C 
C 
C        IF BITS 47-59 .EQ. 7700B THEN NOT LIBRARY
C        IF BITS 16-23 .NE. 0 THEN NOT LIBRARY
C 
   15 IF (SHIFT(AND(RECORD(1),MASK(12)),12) .EQ. 7700B) GO TO 50
      IF (AND(RECORD(1),77777777777700177777B) .NE. 0) GO TO 50 
C 
C 
C        IF WE GET HERE, THIS IS A LIBRARY FILE.  INITIALIZE THE
C        WORD POINTER AND FIND THE MODTABL ENTRY FOR THE NEXT 
C        LIBRARY ENTRY. 
C 
      WORD = 1
   25 NAME = AND(RECORD(WORD),NAMEMSK)
      CALL FINDMOD(NAME,INDEX)
C 
C        ISSUE A WARNING MESSAGE IF NO MODTABL ENTRY EXISTS.
C 
      IF (INDEX.LT.0) GO TO 900 
C 
C        STORE THE LENGTH OF THIS MODULE AND ITS OBJECT SEQUENCE
C        NUMBER, THEN UPDATE THE SEQUENCE NUMBER AND WORD POINTER.
C 
      WORD = WORD + 1 
      MODTABL(2,INDEX) = RECORD(WORD) 
      MODTABL(5,INDEX) = OR(MODTABL(5,INDEX),BINSEQ)
   30 BINSEQ = BINSEQ + 1 
   35 WORD = WORD + 1 
C 
C        LOOK AT THE JUNK IN THE RECORD UNTIL WE FIND EITHER
C        ANOTHER MODULE NAME OR THE END.
C 
      IF (AND(RECORD(WORD),TESTMSK).EQ.0) GO TO 35
C 
C        RETURN IF THIS IS THE END, OTHERWISE GO GET THE MODULE NAME. 
C 
      IF (AND(RECORD(WORD),TESTMSK).EQ.TESTMSK) RETURN
      GO TO 25
C 
C 
C 
C        THIS SECTION PROCESSES THE OBJECT TEXT FILE.  KEEP 
C        READING THE OBJECT FILE UNTIL WE GET A NAM BLOCK OR UNTIL
C        WE HIT EOF.
C 
   50 ISKIP = 0 
      IF (SHIFT(AND(RECORD(1),MASK(12)),12) .EQ. 7700B) ISKIP = 60
      CALL GETWORD(RECORD,3+ISKIP,VALUE)
      IF (VALUE.EQ.NAMBLOK) GO TO 55
   52 BUFFER IN(OBJUNIT,1) (RECORD(1),RECORD(64)) 
      IF (UNIT(OBJUNIT)) 50,100,100 
C 
C        WHEN A NAM BLOCK IS FOUND, PACK THE SIX NAME CHARACTERS
C        INTO A WORD. 
C 
   55 NAME = 0
      DO 60 I=1,3 
      CALL GETWORD(RECORD,I+6+ISKIP,VALUE)
      CALL CHRCNVT(VALUE) 
      TEMP = AND(SHIFT(VALUE,-2),CHR1MSK) 
   60 NAME = OR(SHIFT(NAME,12),TEMP,AND(VALUE,CHR2MSK)) 
      NAME = SHIFT(NAME,24) 
C 
C        FIND THE MODTABL ENTRY, AND BRANCH OUT IF NONE EXISTS. 
C 
      CALL FINDMOD(NAME,INDEX)
      IF (INDEX.LT.0) GO TO 925 
C 
C        STORE THE MODULE LENGTH AND OBJECT SEQUENCE NUMBER, THEN 
C        UPDATE THE SEQUENCE NUMBER.
C 
      CALL GETWORD(RECORD,6+ISKIP,VALUE)
      CALL GETWORD(RECORD,5+ISKIP,VALUE2) 
      MODTABL(2,INDEX) = VALUE + VALUE2 
      MODTABL(5,INDEX) = OR(MODTABL(5,INDEX),BINSEQ)
   65 BINSEQ = BINSEQ + 1 
      GO TO 52
  100 RETURN
C 
C 
C 
C        ERROR BRANCHES 
C 
C 
C        NO MOD DIRECTIVE WAS GIVEN FOR A MODULE ON THE OBJECT FILE.
C 
  900 SWITCH2 = 1 
  905 IF (OBJUNIT.EQ.BINARY2) GO TO (30,65),SWITCH2 
      GO TO (910,915),SWITCH
  910 SWITCH = 2
      WARNING = .TRUE.
      CALL ERRMSG(MODULE,43)
  915 WRITE (ERRFIL,920) NAME 
  920 FORMAT (10X,A6) 
      GO TO (30,65), SWITCH2
  925 SWITCH2 = 2 
      GO TO 905 
      END 
C 
C 
