*COMDECK ALFINDADR
      SUBROUTINE FINDADR(ADDRESS,POINTER) 
C 
C 
C 
C        THIS ROUTINE FINDS THE MODULE WITH THE ADDRESS  SPECIFIED
C        IN THE 'ADDRESS' PARAMETER.  IF THE ENTRY IS NOT FOUND,
C        POINTER IS SET TO -1.    (BINARY SEARCH) 
C 
C 
*CALL ALCOMMON
C 
C        FIND THE SMALLEST POWER OF 2 LARGER THAN THE TOTAL NUMBER
C        OF MODULES TO SEARCH.
C 
      DO 5 I=1,59 
      POINTER = 2**I
      IF (POINTER .GT. MODCNTR) GO TO 10
   5  CONTINUE
C 
C        SPLIT THE TABLE IN HALF BY HALVING THE POINTER.
C 
  10  POWER = I - 1 
      POINTER = POINTER/2 
C 
C        ERROR IF POINTER IS LESS THAN ZERO.
C 
  12  IF (POINTER .LE. 0) GO TO 30
C 
C        IF THE TABLE BOUNDRY OVERSHOT, REDUCE THE POINTER. 
C 
      IF (POINTER .GT. MODCNTR) GO TO 20
C 
C        VERIFY POINTER HITS THE CORRECT ENTRY. 
C 
      IF (AND(MODTABL(1,SRTDADR(POINTER)),LDADMSK) - ADDRESS) 15,40,20
C 
C        IF THE POINTER IS TOO LOW, INCREASE IT.
C 
  15  POINTER = POINTER + 2**(POWER-1)
      GO TO 25
C 
C        IF POINTER IS TOO HIGH, REDUCE IT. 
C 
  20  POINTER = POINTER - 2**(POWER-1)
C 
C        REDUCE THE VALUE OF POWER.  IF IT GOES NEGATIVE, THE 
C        ENTRY CAN NOT BE FOUND.
C 
  25  POWER = POWER - 1 
      IF (POWER .LT. 0) GO TO 30
      GO TO 12
C 
C        IF ENTRY NOT FOUND, SET POINTER TO -1. 
C 
  30  POINTER = -1
      RETURN
C 
C        IF ENTRY FOUND, RETURN THE POINTER TO THE CALLER.
C 
  40  POINTER = SRTDADR(POINTER)
      RETURN
      END 
C 
C 
