	IMPLICIT INTEGER (A-Y)

	REAL*8 TOTAL_HITS
	INTEGER SUMMARY_ONLY, GRAN, IMAGE_LENGTH, OUTPUT_LENGTH
	COMMON /PCHIST/ TOTAL_HITS, SUMMARY_ONLY, GRAN
	COMMON /PCHIST/ IMAGE_LENGTH, OUTPUT_LENGTH

	CHARACTER*80 IMAGE_NAME,OUTPUT_NAME
	COMMON /FILE_NAMES/ IMAGE_NAME, OUTPUT_NAME

	INTEGER HIST(500000), RECORD(128)
	INTEGER*4 SYSTEM, CONTROL, TOP_PC, TOP_HIST
	DATA SYSTEM/0/, CONTROL/0/, TOP_HIST/1/, TOP_PC/0/
C
C	OPEN PC DATA FILE
C
	OPEN (UNIT=1,NAME='PC.DAT',TYPE='OLD',ACCESS='DIRECT',
	1 RECORDSIZE=128,READONLY,ERR=3)
	GOTO 4
3	WRITE(6,*) ' ERROR - Unable to open file ''PC.DAT''.'
	CALL EXIT
4	CONTINUE

C
C	FIRST TRY TO GET INFORMATION FROM INPUT LINE.
C
	IF (GETCMD()) GO TO 1001
C
C	PROMPT USER FOR IMAGE NAME TO BE ANALYZED
C
5	WRITE(6,300)
300	FORMAT(' Enter name of image to be analyzed:'$)
	READ(5,301,ERR=5,END=999) IMAGE_NAME
301	FORMAT(A)
6	WRITE (6,302)
302	FORMAT(' Enter name of output file (<CR>=SYS$OUTPUT):'$)
	READ (5,301,ERR=6,END=999) OUTPUT_NAME
C
C	PROMPT USER FOR PC HISTOGRAM GRANULARITY
C
7	WRITE(6,303)
303	FORMAT(' Enter granularity of PC histogram (default=16 bytes):'$)
	READ(5,304,ERR=7,END=999) IGRAN
304	FORMAT(I)
	IF (IGRAN .NE. 0) GRAN = IGRAN
	IMAGE_LENGTH=80
	OUTPUT_LENGTH=80
	DO 8 I=80,1,-1
	IF (IMAGE_NAME(I:I) .NE. ' ') GO TO 81
8	IMAGE_LENGTH=I-1
81	DO 811 I=80,1,-1
	IF (OUTPUT_NAME(I:I) .NE. ' ') GO TO 9
811	OUTPUT_LENGTH=I-1

9	WRITE (6,1233)
1233	FORMAT (' Long (L) or Summary (S) form? '$)
	READ (5,12331) C1
12331	FORMAT(A1)
	SUMMARY_ONLY = -1
	IF (C1 .EQ. 'L') SUMMARY_ONLY = 0
C
C	CALL INIT_MATCH TO OPEN IMAGE FILE AND INITIALIZE LOCAL STORAGE
C
1001	CONTINUE
	STAT=INIT_MATCH(IMAGE_NAME(1:IMAGE_LENGTH),
	1		OUTPUT_NAME(1:OUTPUT_LENGTH))

	IF (STAT .EQ. -1) THEN		!UNABLE TO OPEN IMAGE FILE
	WRITE(6,*) ' ERROR - Unable to open specified image file'
	GOTO 5
	ELSEIF (STAT .EQ. -2) THEN		!ERROR OPENING OUTPUT FILE.
	WRITE (6,*) ' ERROR - Unable to open specified output file.'
	GO TO 5
	ENDIF

C
C	NOW READ IN THE DATA FILE AND STORE THE DATA IN THE HIST ARRAY
C
	J=1
10	READ(1'J,ERR=99,END=99) RECORD
	DO 20 K=1,128			!DECODE SAVED PC'S
	IF (RECORD(K) .EQ. 0) GOTO 99	!HIT THE END
	TOTAL_HITS = TOTAL_HITS + 1.0	! ADD A HIT TO THE TOTAL

	IF (RECORD(K) .LT. 0) THEN	!HIT A SYSTEM SPACE PC
		SYSTEM=SYSTEM+1		!COUNT UP THE SYSTEM PC
		GOTO 20			!THATS IT FOR THIS GUY
	ENDIF

	IF (RECORD(K) .GT. '40000000'X) THEN	!HIT A P1 SPACE PC
		CONTROL=CONTROL+1	!COUNT IT UP
		GOTO 20			!THATS IT FOR THIS GUY
	ENDIF

	VAL=(RECORD(K)+(GRAN/2))/GRAN	!WITH SPECIFIED GRANULARITY
	IF (VAL .EQ. 0) VAL = 1		! PRETEND VERY LOW PC'S AREN'T THERE.
C
C	DYNAMICALLY ZERO HISTOGRAM ARRAY TO AVOID LARGE PAUSE AT START
C	OF PROGRAM RUN
C
	IF (VAL .GT. TOP_HIST) THEN
		DO 25 JJ=TOP_HIST,VAL	!INIT ARRAY UP TO THIS POINT
25		HIST(JJ)=0
		TOP_HIST=VAL+1		!REMEMBER WHERE INITING STOPED
	ENDIF
	HIST(VAL)=HIST(VAL)+1		!COUNT UP THE HIT
	IF (VAL .GT. TOP_PC) TOP_PC=VAL	!REMEMBER HIGHEST HIT IN HIST ARRAY
20	CONTINUE			!PROCEED THROUGH THE DATA
	J=J+1
	GOTO 10				!CONTINUE LOOPING UNTIL EOF REACHED
C
C	REACHED END OF PC HISTOGRAM FILE.
C	TAKE A LOOK AT HISTOGRAM AND TRY TO MAKE SENSE OUT OF IT
C
99	CONTINUE
	LOW=1
	DO 30 I=1,TOP_PC		!SORT THROUGH HISTOGRAM ARRAY
	IF (HIST(I) .NE. 0)  THEN
		IF (STAT .GT. 0) THEN
C
C	ATTEMPT TO TRANSLATE ABSOLUTE PC INTO LINE NUMBER
C
			CALL MATCH_PC( I*GRAN, HIST(I) )
		ELSE
			WRITE(6,204) I*GRAN, I*GRAN-1, HIST(I)
204			FORMAT(' From:',Z8,' - ',Z8,' Hits:',I6)
		ENDIF
	ENDIF
30	CONTINUE
	CALL CLEAN_UP(CONTROL,SYSTEM)
999	CALL EXIT
	END
	BLOCK DATA

	REAL*8 TOTAL_HITS
	INTEGER SUMMARY_ONLY, GRAN
	INTEGER IMAGE_LENGTH, OUTPUT_LENGTH
	COMMON /PCHIST/ TOTAL_HITS, SUMMARY_ONLY, GRAN
	COMMON /PCHIST/ IMAGE_LENGTH, OUTPUT_LENGTH

	DATA TOTAL_HITS/0.0/, SUMMARY_ONLY/0/, GRAN/16/
	DATA IMAGE_LENGTH/0/, OUTPUT_LENGTH/0/

	END
