	.TITLE	FILE_FRAGMENTATION
	.IDENT	/V01-014/
	.SUBTITLE	DECLARATIONS
;
;	PROGRAM TO SCAN A VAX/VMS FILES-11 LEVEL 2 DISK FILE HEADERS
;	AND LIST THE MOST FRAGMENTED FILES FOUND
;
;	Michael N. LeVine
;	Naval Weapons Center
;	Code 3514
;	China Lake
;	Ca 93555
;	(619)939-2465
;	 AVN 437-2465
;
	.ENABLE	DEBUG
	.LIBRARY	/SYS$LIBRARY:LIB.MLB/
	$HM2DEF		;DECLARE THE STRUCTURE OF THE HOME BLOCK
	$FH2DEF		;FILE HEADER STRUCTURE
	$FI2DEF		;IDENT AREA STRUCTURE
	$FM2DEF		;MAP AREA STRUCTURE
	$DVIDEF		;DEVICE INFORMATION PARAMETERS AND FLAGS
	$DCDEF		;DEVICE TYPE FLAGS
	$RMSDEF		;RMS ERROR CODES
MAX_FILE_HEADERS=100	;MAX NUMBER OF FILES TO KEEP INFO ON FOR OUTPUT
HEADER_BUFFER_COUNT=32	;NO OF FILE HEADERS TO BUFFER		;V01-011
.IF	GT	HEADER_BUFFER_COUNT-127				;V01-011
	.ERROR	;HEADER BUFFER TOO LARGE			;V01-011
.ENDC
	.PAGE
	.SUBTITLE	PURE DATA
	.PSECT	PURE_DATA,RD,NOWRT,GBL,CON,QUAD,NOEXE
;
;	ARGUMENT LIST FOR LIB$GET_FOREIGN
;
GET_ARG:
	.LONG	4
	.ADDRESS	DEVICE_NAME
	.ADDRESS	PROMPT
	.ADDRESS	LENGTH
	.ADDRESS	FORCE
PROMPT:	.ASCID	/Device ? /
;
;	GETDEV ARGUMENT LIST
;
ITEM_LIST:
	.WORD	4,DVI$_DEVCLASS
	.ADDRESS	CLASS
	.LONG	0
	.WORD	4,DVI$_ACPTYPE
	.ADDRESS	ACPTYPE
	.LONG	0
	.LONG	0
NOT_DISK_ARG:
	.LONG	1
	.ADDRESS	NOT_DISK_STRING
NOT_DISK_STRING:
	.ASCID	/Specified device is not a disk/
NOT_ODS2_ARG:
	.LONG	1
	.ADDRESS	NOT_ODS2_STRING
NOT_ODS2_STRING:
	.ASCID	/Specified disk is not structured Files-11 Level 2/
MAIN_HOME_READ_ERROR:
	.ASCID	/Error reading main HOME block/
MAIN_HOME_CKSUM_ERROR:
	.ASCID	/Checksum error in main HOME block/
ALT_HOME_READ_ERROR:
	.ASCID	/Error reading alt. HOME block/
ALT_HOME_CKSUM_ERROR:
	.ASCID	/Checksum error in alt. HOME block/
INDEX_READ_ERROR:
	.ASCID	/Error reading file header in [000000]INDEXF.SYS/
LIST_1:	.ASCID	/Scan of file headers for the top fragmented  files on disk/
STAT_1:	.ASCID	/File statistics for disk/
LIST_2:	.ASCID	/# Pointers   Size-blocks   File name/
LIST_2_FORMAT:
	.ASCID	/!10<!ZL!>   !10<!ZL!>/
COUNT_FORMAT:	.ASCID	-					;V01-010
		?Active Files         !10UL!/?-			;V01-010
		?Extention headers    !10UL!/?-			;V01-010
		?Retrieval pointers   !10UL!/?-			;V01-010
		?Placement controls   !10UL?			;V01-010
FINAL_MESSAGE_1:						;V01-004
	.ASCID	/List of files with most retireval pointers/-	;V01-004
		/ in file FILES.LIS/				;V01-004
FINAL_MESSAGE_2:						;V01-004
	.ASCID	/Statistics in file STATS.LIS/			;V01-004
STATISTICS_HEADER_0:						;V01-010
	.ASCID	/File count matrix sorted by file size vs /-	;V01-010
		/number of retrival pointers used/		;V01-010
STATISTICS_HEADER_1:						;V01-004
	.ASCID	/File size\ Number of retrival pointers /	;V01-010
STATISTICS_HEADER_2:						;V01-010
	.ASCID	/(Blocks)  \/					;V01-006
STAT_1_FORMAT:							;V01-004
	.ASCID	/!6UL+  /					;V01-004
STAT_2_FORMAT:							;V01-004
	.ASCID	/!6UL   /					;V01-004
EMPTY_FILE:		.ASCID	/Zero length file           /	;V01-007
EXTENTION_HEADER:	.ASCID	/Multiple file headers      /	;V01-007
PLACEMENT_CONTROL:	.ASCID	/File has placement control /	;V01-007
FILE_TIME_OUT_PERIOD:	.ASCID	/366 0:0:0.0/			;V01-014
OLD_FILE_MESSAGE:	.ASCID	/File is over 1 year old    /	;V01-014
MATCH_BRACKETS:		.ASCID	/[]/				;V01-014
MATCH_MFD:		.ASCID	/[000000]/			;V01-014
MATCH_SYS0_BKT:		.ASCID	/[SYS0]/			;V01-014
MATCH_SYS1_BKT:		.ASCID	/[SYS1]/			;V01-014
MATCH_SYS2_BKT:		.ASCID	/[SYS2]/			;V01-014
MATCH_SYS3_BKT:		.ASCID	/[SYS3]/			;V01-014
MATCH_SYS4_BKT:		.ASCID	/[SYS4]/			;V01-014
MATCH_SYS5_BKT:		.ASCID	/[SYS5]/			;V01-014
MATCH_SYS6_BKT:		.ASCID	/[SYS6]/			;V01-014
MATCH_SYS7_BKT:		.ASCID	/[SYS7]/			;V01-014
MATCH_SYS8_BKT:		.ASCID	/[SYS8]/			;V01-014
MATCH_SYS9_BKT:		.ASCID	/[SYS9]/			;V01-014
MATCH_SYSA_BKT:		.ASCID	/[SYSA]/			;V01-014
MATCH_SYSB_BKT:		.ASCID	/[SYSB]/			;V01-014
MATCH_SYSC_BKT:		.ASCID	/[SYSC]/			;V01-014
MATCH_SYSD_BKT:		.ASCID	/[SYSD]/			;V01-014
MATCH_SYSE_BKT:		.ASCID	/[SYSE]/			;V01-014
MATCH_SYSF_BKT:		.ASCID	/[SYSF]/			;V01-014
MATCH_SYS0_DOT:		.ASCID	/[SYS0./			;V01-014
MATCH_SYS1_DOT:		.ASCID	/[SYS1./			;V01-014
MATCH_SYS2_DOT:		.ASCID	/[SYS2./			;V01-014
MATCH_SYS3_DOT:		.ASCID	/[SYS3./			;V01-014
MATCH_SYS4_DOT:		.ASCID	/[SYS4./			;V01-014
MATCH_SYS5_DOT:		.ASCID	/[SYS5./			;V01-014
MATCH_SYS6_DOT:		.ASCID	/[SYS6./			;V01-014
MATCH_SYS7_DOT:		.ASCID	/[SYS7./			;V01-014
MATCH_SYS8_DOT:		.ASCID	/[SYS8./			;V01-014
MATCH_SYS9_DOT:		.ASCID	/[SYS9./			;V01-014
MATCH_SYSA_DOT:		.ASCID	/[SYSA./			;V01-014
MATCH_SYSB_DOT:		.ASCID	/[SYSB./			;V01-014
MATCH_SYSC_DOT:		.ASCID	/[SYSC./			;V01-014
MATCH_SYSD_DOT:		.ASCID	/[SYSD./			;V01-014
MATCH_SYSE_DOT:		.ASCID	/[SYSE./			;V01-014
MATCH_SYSF_DOT:		.ASCID	/[SYSF./			;V01-014
MATCH_SYSEXEMIN:	.ASCID	/[SYSEXEMIN]/			;V01-014
MATCH_SYSEXE:		.ASCID	/[SYSEXE]/			;V01-014
MATCH_SYSLOST:		.ASCID	/[SYSLOST]/			;V01-014
MATCH_SYSMAINT:		.ASCID	/[SYSMAINT]/			;V01-014
MATCH_SYSUPD:		.ASCID	/[SYSUPD]/			;V01-014
	.PAGE
	.SUBTITLE	IMPURE DATA
	.PSECT	IMPURE_DATA,RD,WRT,GBL,CON,QUAD,NOEXE
DEVICE_NAME:	.ASCID	/                                   /
LENGTH:		.LONG	0
FORCE:		.LONG	0
CLASS:		.LONG	0
ACPTYPE:	.LONG	0
IOSB:		.LONG	0,0
;	THE FOLLOWING STORAGE AREAS MUST BE QUAD ALIGNED	;V01-011
		.ALIGN	QUAD					;V01-005
INDEX_BLOCK:	.BLKB	512
INDEX_BLOCK_2:	.BLKB	512					;V01-007
LIST_BUFFER:	.BLKB	4096
STAT_BUFFER:	.BLKB	4096
HEADER_BUFFER:	.BLKB	<HEADER_BUFFER_COUNT*512>		;V01-011
HEADER_BUFFER_FIRST_FID:	.LONG	0			;V01-011
HEADER_BUFFER_HEADER_COUNT:	.LONG	0			;V01-011
FILE_HEADER_1_VBN:	.LONG	0
LAST_FILE_HEADER:	.LONG	0
DESCRIPTER:	.LONG	0,0
MESSAGE_VECTOR:	.LONG	0,0,0,0
PLACEMENT_CONTROL_FLAG:	.LONG	0				;V01-007
EXTENTION_HEADER_FLAG:	.LONG	0				;V01-007
FILE_COUNT:		.LONG	0				;V01-008
POINTER_COUNT:		.LONG	0				;V01-008
EXTENTION_COUNT:	.LONG	0				;V01-008
PLACEMENT_COUNT:	.LONG	0				;V01-010
BIN_TIME_OUT:		.LONG	0,0				;V01-014
CURRENT_TIME:		.LONG	0,0				;V01-014
OLD_LIMIT:		.LONG	0,0				;V01-014
TEMP_LIMIT:		.LONG	0,0				;V01-014
TEMP_NAME:							;V01-012
	.IF	DF	FI2$S_FILENAMEXT			;V01-014
		.BLKB	<FI2$S_FILENAME+FI2$S_FILENAMEXT>	;V01-012
	.IFF							;V01-014
		.BLKB	FI2$S_FILENAME				;V01-014
	.ENDC							;V01-014
	.PAGE							;V01-004
	.SUBTITLE	STATISTICS SIZE LISTS AND BUFFERS	;V01-004
	.PSECT	PURE_DATA					;V01-004
;								;V01-004
;	FIRST ENTRY IN LISTS MUST BE ZERO AND LAST MUST BE -1	;V01-004
;								;V01-004
;	EITHER LIST CAN BE MODIFIED JUST BY ADDING,DELTEING	;V01-004
;	AND/OR CHANGEING ENTRIES IN EITHER OR BOTH LISTS.	;V01-004
;	THE CODE FOR INSTRUCTIONS AND DATA AREAS HANDLE THE	;V01-004
;	CHANGES. THE ONLY LIMITATION BEING THAT ONE LINE CAN	;V01-004
;	HOLD NO MORE THAN 4096 CHAR'S				;V01-004
;								;V01-004
FILE_SIZE_LIST:							;V01-004
	.LONG	0,1,5,10,25,50,75,100,250,500,750,1000		;V01-004
	.LONG	10000,100000,-1					;V01-004
FILE_SIZE_COUNT=<<<.-FILE_SIZE_LIST>/4>-1>			;V01-004
POINTER_COUNT_LIST:						;V01-004
	.LONG	0,1,2,8,50,100,1000,-1				;V01-006
POINTER_SIZE_COUNT=<<<.-POINTER_COUNT_LIST>/4>-1>		;V01-004
	.PSECT	STATS,RD,WRT					;V01-004
STATISTICS:							;V01-004
	.BLKL	<POINTER_SIZE_COUNT*FILE_SIZE_COUNT>		;V01-004
	.PAGE
	.SUBTITLE	LIST OF FILES WITH MOST RETRIVAL POINTERS
	.PSECT	ARRAY,RD,WRT,GBL,CON,QUAD,NOEXE
;
;	LIST OF ELEMENTS POINTING TO FILE HEADERS WITH MOST RETRIVAL POINTERS
;
;	------------
;	!          ! 0	NUMBER OF RETRIVAL POINTERS
;	------------
;	!          ! 4  SIZE OF FILE IN BLOCKS
;	------------
;	!          ! 8  SEQUENCE NUMBER OF FILE HEADER
;	------------
;
	COUNT_L_POINTERS=0
	COUNT_L_SIZE=4
	COUNT_L_SEQUENCE=8
	COUNT_SIZE=12
COUNT_ARRAY:	.BLKB	<MAX_FILE_HEADERS*COUNT_SIZE>
SEQUENCE:	.LONG	0
POINTERS:	.LONG	0
SIZE:		.LONG	0
COUNT:		.LONG	0
TEMP_SEQUENCE:	.LONG	0					;V01-007
	.PAGE
	.SUBTITLE	RMS BLOCKS
	.PSECT	RMS_DATA,RD,WRT,GBL,CON,QUAD,NOEXE
	.ALIGN	LONG
INDEX_FAB:
	$FAB	ALQ=0,-
		DEQ=0,-
		DNM=<NL:[000000]INDEXF.SYS>,-
		FAC=<BIO,GET,PUT>,-
		FNA=<DEVICE_NAME+8>,FNS=0,-
		SHR=<PUT,GET,DEL,UPD,UPI>
	.ALIGN	LONG
INDEX_RAB:
	$RAB	BKT=1,-
		FAB=INDEX_FAB,-
		RBF=INDEX_BLOCK,RSZ=512-
		ROP=<BIO>,-
		UBF=INDEX_BLOCK,USZ=512
LIST_FAB:
	$FAB	ALQ=15,-				;V01-003
		DEQ=5,-					;V01-003
		DNM=<FILES.LIS>,-
		FAC=<PUT>,-
		FOP=<SQO,MXV>,-
		ORG=<SEQ>,-
		RAT=<CR>,-
		RFM=<VAR>,-
		SHR=<NIL>
LIST_RAB:
	$RAB	FAB=LIST_FAB,-
		BKT=0,-
		RAC=<SEQ>,-
		RBF=LIST_BUFFER,-
		RSZ=0
STAT_FAB:						;V01-004
	$FAB	ALQ=5,-					;V01-004
		DEQ=5,-					;V01-004
		DNM=<STATS.LIS>,-			;V01-004
		FAC=<PUT>,-				;V01-004
		FOP=<SQO,MXV>,-				;V01-004
		ORG=<SEQ>,-				;V01-004
		RAT=<CR>,-				;V01-004
		RFM=<VAR>,-				;V01-004
		SHR=<NIL>				;V01-004
STAT_RAB:						;V01-004
	$RAB	FAB=STAT_FAB,-				;V01-004
		BKT=0,-					;V01-004
		RAC=<SEQ>,-				;V01-004
		RBF=STAT_BUFFER,-			;V01-004
		RSZ=0					;V01-004
	.PAGE
	.SUBTITLE	CODE
	.SUBTITLE		INITALIZATION
	.PSECT	CODE,RD,NOWRT,EXE,GBL,CON
	.ENTRY	FILE_CHECK,0
;							;V01-014
;	INIT THE TIME OUT STUFF				;V01-014
;							;V01-014
	PUSHAL	CURRENT_TIME				;V01-014
	CALLS	#1,G^SYS$GETTIM				;V01-014
	PUSHAL	BIN_TIME_OUT				;V01-014
	PUSHAL	FILE_TIME_OUT_PERIOD			;V01-014
	CALLS	#2,G^SYS$BINTIM				;V01-014
	MOVQ	CURRENT_TIME,OLD_LIMIT			;V01-014
	ADDL2	BIN_TIME_OUT,OLD_LIMIT			;V01-014
	ADWC	BIN_TIME_OUT+4,OLD_LIMIT+4		;V01-014
;
;	GET THE DEVICE NAME
;
	CALLG	GET_ARG,G^LIB$GET_FOREIGN
	BLBS	R0,1$
	$EXIT_S	R0
1$:	MOVL	LENGTH,DEVICE_NAME
;
;	GET INFORMATION ON SPECIFIED DEVICE
;
	$GETDVI_S	#1,,DEVICE_NAME,ITEM_LIST,IOSB
	BLBS	R0,2$
	$EXIT_S	R0
2$:	$WAITFR_S	#1
	BLBS	IOSB,3$
	CVTWL	IOSB,R0
	$EXIT_S	R0
;						MUST BE A DISK
3$:	CMPL	#DC$_DISK,CLASS
	BEQL	4$
	CALLG	NOT_DISK_ARG,G^LIB$PUT_OUTPUT
	$EXIT_S
;						MUST BE ODS-2
4$:	CMPL	#DVI$C_ACP_F11V2,ACPTYPE
	BEQL	5$
	CALLG	NOT_ODS2_ARG,G^LIB$PUT_OUTPUT
	$EXIT_S
5$:;
;	OPEN THE INDEXF.SYS FILE
;
	MOVB	LENGTH,INDEX_FAB+FAB$B_FNS
	$OPEN	FAB=INDEX_FAB
	BLBS	R0,6$
	$EXIT_S	R0
6$:	$CONNECT	RAB=INDEX_RAB
	BLBS	R0,7$
	$EXIT_S	R0
7$:
;								;V01-007
;	OPEN OUTPUT FILES					;V01-007
;								;V01-007
	$CREATE	FAB=STAT_FAB					;V01-004
	BLBS	R0,9$						;V01-007
	$EXIT_S							;V01-007
9$:	$CONNECT	RAB=STAT_RAB				;V01-007
	BLBS	R0,10$						;V01-007
	$EXIT_S	R0						;V01-004
10$:	$CREATE	FAB=LIST_FAB					;V01-007
	BLBS	R0,11$						;V01-007
	$EXIT_S	R0
11$:	$CONNECT	RAB=LIST_RAB
	BLBS	R0,12$						;V01-007
	$EXIT_S	R0
12$:
;
;	PUT OUT INITIAL HEADER INFO
;
	MOVL		LIST_1+4,LIST_RAB+RAB$L_RBF		;V01-007
	MOVZBW	LIST_1,LIST_RAB+RAB$W_RSZ
	$PUT	RAB=LIST_RAB
	MOVL		STAT_1+4,STAT_RAB+RAB$L_RBF		;V01-004
	MOVZBW	STAT_1,STAT_RAB+RAB$W_RSZ			;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;	DEVICE NAME
	MOVL	DEVICE_NAME+4,LIST_RAB+RAB$L_RBF
	MOVZBW	DEVICE_NAME,LIST_RAB+RAB$W_RSZ
	$PUT	RAB=LIST_RAB
	MOVL	DEVICE_NAME+4,STAT_RAB+RAB$L_RBF		;V01-004
	MOVZBW	DEVICE_NAME,STAT_RAB+RAB$W_RSZ			;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;	DATE TIME
	MOVL	#30,DESCRIPTER
	MOVAL	LIST_BUFFER,DESCRIPTER+4
	PUSHAL	DESCRIPTER
	CALLS	#1,G^LIB$DATE_TIME
	MOVL	#30,LIST_RAB+RAB$W_RSZ
	MOVAL	LIST_BUFFER,LIST_RAB+RAB$L_RBF
	$PUT	RAB=LIST_RAB
	MOVL	#30,STAT_RAB+RAB$W_RSZ				;V01-004
	MOVAL	LIST_BUFFER,STAT_RAB+RAB$L_RBF			;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;	OUTPUT A BLANK LINE
	MOVAL	LIST_BUFFER,LIST_RAB+RAB$L_RBF
	MOVW	#1,LIST_RAB+RAB$W_RSZ
	MOVB	#^A/ /,LIST_BUFFER
	$PUT	RAB=LIST_RAB
	MOVAL	LIST_BUFFER,STAT_RAB+RAB$L_RBF			;V01-004
	MOVW	#1,STAT_RAB+RAB$W_RSZ				;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;
;	GET THE CURRENT HOME BLOCK FOR INFO ON START OF FILE HEADERS
;
	MOVL	#2,INDEX_RAB+RAB$L_BKT	;GET INITIAL HOME BLOCK
	MOVAL	INDEX_BLOCK,INDEX_RAB+RAB$L_UBF			;V01-007
	MOVW	#512,INDEX_RAB+RAB$W_USZ			;V01-011
	$READ	RAB=INDEX_RAB
	BLBS	R0,13$			;ERROR READING MAIN HOME BLOCK
	PUSHAL	INDEX_RAB+RAB$L_STV
	PUSHAL	INDEX_RAB+RAB$L_STS
	PUSHAL	MAIN_HOME_READ_ERROR
	CALLS	#3,SYSTEM_ERROR_MESSAGE
	BRW	14$
13$:					;CHECK CHECKSUMS
	CLRL	R0
	MOVL	#<HM2$W_CHECKSUM1/2>,R1
	MOVAL	INDEX_BLOCK,R2
15$:	ADDW2	(R2)+,R0
	SOBGTR	R1,15$
	CMPW	R0,(R2)
	BNEQ	16$			;BRANCH IF CHECKSUM1 DOES NOT MATCH
	CLRL	R0
	MOVL	#<HM2$W_CHECKSUM2/2>,R1
	MOVAL	INDEX_BLOCK,R2
17$:	ADDW2	(R2)+,R0
	SOBGTR	R1,17$
	CMPW	R0,(R2)
	BNEQ	16$			;BRANCH IF CHECKSUM2 DOES NOT MATCH
	BRW	18$			;CHECKSUMMS OK-CONTINUE
16$:	PUSHAL	MAIN_HOME_CKSUM_ERROR	;CHECKSUM ERROR-MESSAGE OUTPUT
	CALLS	#1,G^LIB$PUT_OUTPUT
14$:					;ATTEMPT TO GET ALT HOME BLOCK
	MOVL	#3,INDEX_RAB+RAB$L_BKT	;GET ALT HOME BLOCK
	MOVAL	INDEX_BLOCK,INDEX_RAB+RAB$L_UBF			;V01-007
	MOVW	#512,INDEX_RAB+RAB$W_USZ			;V01-011
	$READ	RAB=INDEX_RAB
	BLBS	R0,23$			;ERROR READING ALT HOME BLOCK
	PUSHAL	INDEX_RAB+RAB$L_STV
	PUSHAL	INDEX_RAB+RAB$L_STS
	PUSHAL	ALT_HOME_READ_ERROR
	CALLS	#3,SYSTEM_ERROR_MESSAGE
	$EXIT_S
23$:					;CHECK CHECKSUMS
	CLRL	R0
	MOVL	#<HM2$W_CHECKSUM1/2>,R1
	MOVAL	INDEX_BLOCK,R2
25$:	ADDW2	(R2)+,R0
	SOBGTR	R1,25$
	CMPW	R0,(R2)
	BNEQ	26$			;BRANCH IF CHECKSUM 1 ERROR
	CLRL	R0
	MOVL	#<HM2$W_CHECKSUM2/2>,R1
	MOVAL	INDEX_BLOCK,R2
27$:	ADDW2	(R2)+,R0
	SOBGTR	R1,27$
	CMPW	R0,(R2)
	BEQL	18$			;BRANCH IF CHECKSUM 2 OK
26$:	PUSHAL	ALT_HOME_CKSUM_ERROR	;BOTH HOME BLOCKS BAD
	CALLS	#1,G^LIB$PUT_OUTPUT	;MESSAGE AND EXIT
	$EXIT_S
;
;	INITALIZE INTERNAL DATA AREAS
;
18$:	CVTWL	INDEX_BLOCK+HM2$W_IBMAPVBN,R0	;GET STARTING VBN AND SIZE OF
	CVTWL	INDEX_BLOCK+HM2$W_IBMAPSIZE,R1	;FILE HEADER BITMAP
	ADDL3	R1,R0,FILE_HEADER_1_VBN		;INIT 1ST FILE HEADER;V01-007
	CLRL	LAST_FILE_HEADER
	CLRL	FILE_COUNT					;V01-008
	CLRL	POINTER_COUNT					;V01-008
	CLRL	EXTENTION_COUNT					;V01-008
	CLRL	PLACEMENT_COUNT					;V01-010
	MOVC5	#0,COUNT_ARRAY,#0,#<MAX_FILE_HEADERS*COUNT_SIZE>,COUNT_ARRAY
	MOVC5	#0,STATISTICS,#0,-				;V01-004
		#<4*POINTER_SIZE_COUNT*FILE_SIZE_COUNT>,STATISTICS;V01-004
	CLRL	HEADER_BUFFER_HEADER_COUNT			;V01-011
	CLRL	HEADER_BUFFER_FIRST_FID				;V01-011
	MOVC5	#0,HEADER_BUFFER,#0,#<HEADER_BUFFER_COUNT*512>,-;V01-011
		HEADER_BUFFER					;V01-011
	.PAGE
	.SUBTITLE	SCAN FILE HEADER LOOP-GET FILE HEADER
LOOP:	INCL	LAST_FILE_HEADER
	PUSHAL	INDEX_BLOCK					;V01-011
	PUSHAL	LAST_FILE_HEADER				;V01-011
	CALLS	#2,READ_HEADER					;V01-011
	BLBS	R0,4$
	BRW	END_LOOP	;CAN ONLY BE EOF-DONE		;V01-011
4$:;
;	CONFIRM IT IS A VALID FILE HEADER
;
;	CHECKS BASED ON THOSE USED BY DUMP-CODE ADAPTED FROM THAT READ
;	IN SOURCE FICHE.
;
	MOVAL	INDEX_BLOCK,R0		;CHECK CHECKSUM
	CLRL	R1
	MOVL	#<FH2$W_CHECKSUM/2>,R2
6$:	ADDW2	(R0)+,R1
	SOBGTR	R2,6$
	CMPW	R1,(R0)
	BEQL	7$
	BRW	LOOP			;BAD CHECKSUM
7$:	CMPB	INDEX_BLOCK+FH2$B_STRUCLEV,#2;CHECK STRUCTURE LEVEL
	BEQL	8$
	BRW	LOOP			;BAD STRUCTURE
;
;	CHECK OFFSETS INTO HEADER
;
8$:;	CMPB	INDEX_BLOCK+FH2$B_IDOFFSET,#<FH2$C_LENGTH/2>
;	BLSSU	9$
	CMPB	INDEX_BLOCK+FH2$B_MPOFFSET,INDEX_BLOCK+FH2$B_IDOFFSET
	BLSSU	9$
	CMPB	INDEX_BLOCK+FH2$B_ACOFFSET,INDEX_BLOCK+FH2$B_MPOFFSET
	BLSSU	9$
	CMPB	INDEX_BLOCK+FH2$B_RSOFFSET,INDEX_BLOCK+FH2$B_ACOFFSET
	BLSSU	9$
	SUBB3	INDEX_BLOCK+FH2$B_MPOFFSET,INDEX_BLOCK+FH2$B_ACOFFSET,R0
	CMPB	INDEX_BLOCK+FH2$B_MAP_INUSE,R0
	BGTRU	9$
;
;	SEE IF HEADER IN USE
;
	TSTW	INDEX_BLOCK+FH2$W_FID_NUM
	BNEQ	10$
	TSTB	INDEX_BLOCK+FH2$B_FID_NMX
	BNEQ	10$
9$:	BRW	LOOP
10$:
;
;	ALSO MUST NOT BE AN EXTENTION FILE HEADER
;
	TSTW	INDEX_BLOCK+FH2$W_SEG_NUM
	BEQL	11$
	BRW	LOOP
11$:
;
;	INIT COUNTERS AND POINTERS
;
	MOVW	INDEX_BLOCK+FH2$W_FID_NUM,SEQUENCE
	MOVZBW	INDEX_BLOCK+FH2$B_FID_NMX,SEQUENCE+2
	INCL	FILE_COUNT					;V01-008
	CLRL	POINTERS
	CLRL	SIZE
	CLRL	EXTENTION_HEADER_FLAG				;V01-007
	CLRL	PLACEMENT_CONTROL_FLAG				;V01-007
;								;V01-014
;	CHECK FOR OLD FILES					;V01-014
;								;V01-014
	MOVZBL	INDEX_BLOCK+FH2$B_IDOFFSET,R0	;ID AREA OFFSET	;V01-014
	MULL2	#2,R0						;V01-014
	MOVQ	INDEX_BLOCK+FI2$Q_CREDATE(R0),TEMP_LIMIT	;V01-014
	SUBL2	OLD_LIMIT,TEMP_LIMIT				;V01-014
	SBWC	OLD_LIMIT+4,TEMP_LIMIT+4			;V01-014
	BLEQ	13$						;V01-014
	BRW	12$						;V01-014
13$:	MOVAL	STAT_BUFFER,DESCRIPTER+4			;V01-014
	MOVZBL	OLD_FILE_MESSAGE,R0				;V01-014
	MOVL	R0,DESCRIPTER					;V01-014
	MOVC3	R0,@OLD_FILE_MESSAGE+4,STAT_BUFFER		;V01-014
	PUSHAL	DESCRIPTER					;V01-014
	PUSHAL	SEQUENCE					;V01-014
	CALLS	#2,FILE_NAME					;V01-014
	MOVZBL	DESCRIPTER,R4					;V01-014
	MOVL	DESCRIPTER+4,R5					;V01-014
	.MACRO	CHK	DESC,?A					;V01-014
		MOVZBL	DESC,R0					;V01-014
		MATCHC	R0,@DESC+4,R4,(R5)			;V01-014
		BNEQ	A					;V01-014
		BRW	12$					;V01-014
A:								;V01-014
	.ENDM							;V01-014
	CHK	MATCH_BRACKETS					;V01-014
	CHK	MATCH_MFD					;V01-014
	CHK	MATCH_SYS0_DOT					;V01-014
	CHK	MATCH_SYS0_BKT					;V01-014
	CHK	MATCH_SYS1_DOT					;V01-014
	CHK	MATCH_SYS1_BKT					;V01-014
	CHK	MATCH_SYS2_DOT					;V01-014
	CHK	MATCH_SYS2_BKT					;V01-014
	CHK	MATCH_SYS3_DOT					;V01-014
	CHK	MATCH_SYS3_BKT					;V01-014
	CHK	MATCH_SYS4_DOT					;V01-014
	CHK	MATCH_SYS4_BKT					;V01-014
	CHK	MATCH_SYS5_DOT					;V01-014
	CHK	MATCH_SYS5_BKT					;V01-014
	CHK	MATCH_SYS6_DOT					;V01-014
	CHK	MATCH_SYS6_BKT					;V01-014
	CHK	MATCH_SYS7_DOT					;V01-014
	CHK	MATCH_SYS7_BKT					;V01-014
	CHK	MATCH_SYS8_DOT					;V01-014
	CHK	MATCH_SYS8_BKT					;V01-014
	CHK	MATCH_SYS9_DOT					;V01-014
	CHK	MATCH_SYS9_BKT					;V01-014
	CHK	MATCH_SYSA_DOT					;V01-014
	CHK	MATCH_SYSA_BKT					;V01-014
	CHK	MATCH_SYSB_DOT					;V01-014
	CHK	MATCH_SYSB_BKT					;V01-014
	CHK	MATCH_SYSC_DOT					;V01-014
	CHK	MATCH_SYSC_BKT					;V01-014
	CHK	MATCH_SYSD_DOT					;V01-014
	CHK	MATCH_SYSD_BKT					;V01-014
	CHK	MATCH_SYSE_DOT					;V01-014
	CHK	MATCH_SYSE_BKT					;V01-014
	CHK	MATCH_SYSF_DOT					;V01-014
	CHK	MATCH_SYSF_BKT					;V01-014
	CHK	MATCH_SYSEXEMIN					;V01-014
	CHK	MATCH_SYSEXE					;V01-014
	CHK	MATCH_SYSLOST					;V01-014
	CHK	MATCH_SYSMAINT					;V01-014
	CHK	MATCH_SYSUPD					;V01-014
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-014
	MOVZBW	DESCRIPTER,STAT_RAB+RAB$W_RSZ			;V01-014
	$PUT	RAB=STAT_RAB					;V01-014
12$:								;V01-014
	.PAGE
	.SUBTITLE	SCAN FILE HEADER LOOP-SCAN FILE HEADER INCL ANY EXT
OUTTER_COUNT_LOOP:
	MOVZBL	INDEX_BLOCK+FH2$B_MPOFFSET,R11
	MULL2	#2,R11
	MOVZBL	INDEX_BLOCK+FH2$B_MAP_INUSE,R10
	MULL2	#2,R10
	ADDL2	R11,R10
INNER_COUNT_LOOP:
	CMPL	R11,R10
	BLSS	31$
	BRW	40$
;
;	EXTRACT FORMAT FIELD
;
31$:	EXTZV	#FM2$V_FORMAT,#FM2$S_FORMAT,INDEX_BLOCK(R11),R9
;
;	IS IT PLACEMENT CONTROL
;
	CMPB	#FM2$C_PLACEMENT,R9
	BNEQ	32$		;NO
;
;	PLACEMENT CONTROL DOES NOT COUNT
;
	ADDL2	#2,R11
	INCL	PLACEMENT_COUNT					;V01-010
	TSTL	PLACEMENT_CONTROL_FLAG				;V01-007
	BNEQ	20$						;V01-007
	MOVAL	STAT_BUFFER,DESCRIPTER+4			;V01-007
	MOVZBL	PLACEMENT_CONTROL,R0				;V01-007
	MOVL	R0,DESCRIPTER					;V01-007
	MOVC3	R0,@PLACEMENT_CONTROL+4,STAT_BUFFER		;V01-007
	PUSHAL	DESCRIPTER					;V01-007
	PUSHAL	SEQUENCE					;V01-007
	CALLS	#2,FILE_NAME					;V01-007
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-007
	MOVZBW	DESCRIPTER,STAT_RAB+RAB$W_RSZ			;V01-007
	$PUT	RAB=STAT_RAB					;V01-007
	MOVL	#1,PLACEMENT_CONTROL_FLAG			;V01-007
20$:	BRW	39$						;V01-007
;
;	IS IT FORMAT 1
;
32$:	CMPB	#FM2$C_FORMAT1,R9
	BNEQ	33$
;
;	EXTRACT COUNT 
;	AND UPDATE OFFSET TO NEXT PTR.
;
	MOVZBL	INDEX_BLOCK+FM2$B_COUNT1(R11),R0
	INCL	POINTERS
	ADDL2	R0,SIZE
	INCL	SIZE
	ADDL2	#4,R11
	BRB	39$
;
;	IS IT FORMAT 2
;
33$:	CMPB	#FM2$C_FORMAT2,R9
	BNEQ	34$	;NO
;
;	EXTRACT COUNT
;	AND UPDATE OFFSET TO NEXT PTR.
;
	EXTZV	#FM2$V_COUNT2,#FM2$S_COUNT2,INDEX_BLOCK(R11),R0
	ADDL2	R0,SIZE
	INCL	SIZE
	INCL	POINTERS
	ADDL2	#6,R11
	BRB	39$
;
;	CAN ONLY BE FORMAT 3
;
34$:	CMPB	#FM2$C_FORMAT3,R9
	BNEQ	35$	;OOP'S  NOT 3 EITHER
;
;	EXTRACT COUNT 
;	AND UPDATE OFFSET TO NEXT PTR.
;
	ROTL	#16,INDEX_BLOCK(R11),R0
	EXTZV	#0,#30,R0,R1
	ADDL2	R1,SIZE
	INCL	SIZE
	INCL	POINTERS
	ADDL2	#8,R11
	BRB	39$
35$:
;
;BAD FORMAT-FORGET THE WHOLE FILE HEADER
;
	BRW	LOOP
39$:	INCL	POINTER_COUNT				;V01-008
	BRW	INNER_COUNT_LOOP			;V01-008
;
;	THIS HEADER USED UP-SEE IF THERE IS AN EXTENTION HEADER FOR THIS
;	FILE
;
40$:	MOVW	INDEX_BLOCK+FH2$W_EX_FIDNUM,COUNT
	MOVZBW	INDEX_BLOCK+FH2$B_EX_FIDNMX,COUNT+2
	TSTL	COUNT
	BNEQ	41$	;YES THERE IS AN EXTENTION HEADER FOR THIS FILE
	BRW	END_COUNT_LOOP	;NO-SEE IF FILE FITS IN LIST
;
;	CALCULATE VBN AND READ IN EXTENTION HEADER FOR THIS FILE
;
41$:	TSTL	EXTENTION_HEADER_FLAG				;V01-007
	BNEQ	25$						;V01-007
	MOVAL	STAT_BUFFER,DESCRIPTER+4			;V01-007
	MOVZBL	EXTENTION_HEADER,R0				;V01-007
	MOVL	R0,DESCRIPTER					;V01-007
	MOVC3	R0,@EXTENTION_HEADER+4,STAT_BUFFER		;V01-007
	PUSHAL	DESCRIPTER					;V01-007
	PUSHAL	SEQUENCE					;V01-007
	CALLS	#2,FILE_NAME					;V01-007
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-007
	MOVZBW	DESCRIPTER,STAT_RAB+RAB$W_RSZ			;V01-007
	$PUT	RAB=STAT_RAB					;V01-007
	MOVL	#1,EXTENTION_HEADER_FLAG			;V01-007
25$:	INCL	EXTENTION_COUNT					;V01-008
	ADDL3	FILE_HEADER_1_VBN,COUNT,R0			;V01-008
	SUBL3	#1,R0,INDEX_RAB+RAB$L_BKT
	MOVAL	INDEX_BLOCK,INDEX_RAB+RAB$L_UBF			;V01-007
	MOVW	#512,INDEX_RAB+RAB$W_USZ			;V01-011
	$READ	RAB=INDEX_RAB
	BLBS	R0,44$
	PUSHAL	INDEX_RAB+RAB$L_STV
	PUSHAL	INDEX_RAB+RAB$L_STS
	PUSHAL	INDEX_READ_ERROR
	CALLS	#3,SYSTEM_ERROR_MESSAGE
	$EXIT_S
44$:
;
;	CONFIRM IT IS A VALID FILE HEADER
;
	MOVAL	INDEX_BLOCK,R0	;CHECKSUM
	CLRL	R1
	MOVL	#<FH2$W_CHECKSUM/2>,R2
46$:	ADDW2	(R0)+,R1
	SOBGTR	R2,46$
	CMPW	R1,(R0)
	BEQL	47$
	BRW	END_COUNT_LOOP
47$:	CMPB	INDEX_BLOCK+FH2$B_STRUCLEV,#2	;STRUCTURE LEVEL
	BEQL	48$
	BRW	END_COUNT_LOOP
;
;	OFFSETS
;
48$:;	CMPB	INDEX_BLOCK+FH2$B_IDOFFSET,#<FH2$C_LENGTH/2>
;	BLSSU	49$
	CMPB	INDEX_BLOCK+FH2$B_MPOFFSET,INDEX_BLOCK+FH2$B_IDOFFSET
	BLSSU	49$
	CMPB	INDEX_BLOCK+FH2$B_ACOFFSET,INDEX_BLOCK+FH2$B_MPOFFSET
	BLSSU	49$
	CMPB	INDEX_BLOCK+FH2$B_RSOFFSET,INDEX_BLOCK+FH2$B_ACOFFSET
	BLSSU	49$
	SUBB3	INDEX_BLOCK+FH2$B_MPOFFSET,INDEX_BLOCK+FH2$B_ACOFFSET,R0
	CMPB	INDEX_BLOCK+FH2$B_MAP_INUSE(R11),R0
	BGTRU	49$
;
;	MAKE SURE IN USE
;
	TSTW	INDEX_BLOCK+FH2$W_FID_NUM
	BNEQ	42$
	TSTB	INDEX_BLOCK+FH2$B_FID_NMX
	BNEQ	42$
49$:	BRW	END_COUNT_LOOP
42$:
;
;	ALSO MUST BE AN EXTENTION FILE HEADER
;
	TSTW	INDEX_BLOCK+FH2$W_SEG_NUM
	BNEQ	43$
	BRW	END_COUNT_LOOP
43$:	BRW	OUTTER_COUNT_LOOP	;CONTINUE SCANNING RETRIVAL POINTERS
	.PAGE
	.SUBTITLE	SCAN FILE HEADER LOOP-PUT IN ARRAY IF POSSABLE
END_COUNT_LOOP:
	TSTL	SIZE						;V01-007
	BNEQ	5$						;V01-007
	MOVAL	STAT_BUFFER,DESCRIPTER+4			;V01-007
	MOVZBL	EMPTY_FILE,R0					;V01-007
	MOVL	R0,DESCRIPTER					;V01-007
	MOVC3	R0,@EMPTY_FILE+4,STAT_BUFFER			;V01-007
	PUSHAL	DESCRIPTER					;V01-007
	PUSHAL	SEQUENCE					;V01-007
	CALLS	#2,FILE_NAME					;V01-007
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-007
	MOVZBW	DESCRIPTER,STAT_RAB+RAB$W_RSZ			;V01-007
	$PUT	RAB=STAT_RAB					;V01-007
5$:								;V01-007
;								;V01-004
;	PUT IN STATISTICS BUFFER				;V01-004
;								;V01-004
	CLRL	R11						;V01-004
1$:	CMPL	FILE_SIZE_LIST+4[R11],SIZE			;V01-004
	BGTRU	2$						;V01-004
	INCL	R11						;V01-004
	BRB	1$						;V01-004
2$:	MULL2	#POINTER_SIZE_COUNT,R11				;V01-004
	CLRL	R10						;V01-004
3$:	CMPL	POINTER_COUNT_LIST+4[R10],POINTERS		;V01-004
	BGTRU	4$						;V01-004
	INCL	R11						;V01-004
	INCL	R10						;V01-004
	BRB	3$						;V01-004
4$:	INCL	STATISTICS[R11]					;V01-004
	MOVAL	COUNT_ARRAY,R11
	MOVL	#MAX_FILE_HEADERS,R10
CHECK_LOOP:
	CMPL	POINTERS,COUNT_L_POINTERS(R11)
	BGEQ	FOUND_SLOT
	ADDL2	#COUNT_SIZE,R11
	SOBGTR	R10,CHECK_LOOP
;
;	NO SLOT FOUND-JUST FORGET THIS ONE-NOT FRAGMENTED ENOUGH
;
	BRW	LOOP
FOUND_SLOT:
;
;	CALC HOW MUCH STUFF TO SLIDE DOWN THE ARRAY
;
	DECL	R10
	BEQL	1$	;THIS IS THE LAST SLOT
	MULL2	#COUNT_SIZE,R10	;GET NUMBER OF BYTES TO MOVE
	MOVC3	R10,(R11),COUNT_SIZE(R11)	;SLIDE ALL DOWN 1 SLOT
1$:	MOVL	SEQUENCE,COUNT_L_SEQUENCE(R11)
	MOVL	POINTERS,COUNT_L_POINTERS(R11)
	MOVL	SIZE,COUNT_L_SIZE(R11)
	BRW	LOOP
	.PAGE
	.SUBTITLE	SET UP FOR OUTPUT OF RESULTS		;V01-007
END_LOOP:
;
;	OUTPUT A BLANK LINE
;
	MOVAL	LIST_BUFFER,LIST_RAB+RAB$L_RBF
	MOVW	#1,LIST_RAB+RAB$W_RSZ
	MOVB	#^A/ /,LIST_BUFFER
	$PUT	RAB=LIST_RAB
	MOVAL	LIST_BUFFER,STAT_RAB+RAB$L_RBF			;V01-004
	MOVW	#1,STAT_RAB+RAB$W_RSZ				;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;								;V01-008
;	FILE/POINTER STATS					;V01-008
;								;V01-008
	PUSHL	PLACEMENT_COUNT					;V01-010
	PUSHL	POINTER_COUNT					;V01-008
	PUSHL	EXTENTION_COUNT					;V01-008
	PUSHL	FILE_COUNT					;V01-008
	MOVAL	STAT_BUFFER,DESCRIPTER+4			;V01-008
	MOVL	#200,DESCRIPTER					;V01-010
	PUSHAL	DESCRIPTER					;V01-008
	PUSHAL	DESCRIPTER					;V01-008
	PUSHAL	COUNT_FORMAT					;V01-008
	CALLS	#6,G^SYS$FAO					;V01-008
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-008
	MOVL	DESCRIPTER,STAT_RAB+RAB$W_RSZ			;V01-008
	$PUT	RAB=STAT_RAB					;V01-008
	MOVAL	LIST_BUFFER,STAT_RAB+RAB$L_RBF			;V01-008
	MOVW	#1,STAT_RAB+RAB$W_RSZ				;V01-008
	MOVB	#^A/ /,LIST_BUFFER				;V01-011
	$PUT	RAB=STAT_RAB					;V01-008
;
;	AND THE COLLUMN HEADERS
;
	MOVL	LIST_2+4,LIST_RAB+RAB$L_RBF
	MOVZBW	LIST_2,LIST_RAB+RAB$W_RSZ
	$PUT	RAB=LIST_RAB
	MOVAL	COUNT_ARRAY,R11
	MOVL	#MAX_FILE_HEADERS,R10
	.PAGE
	.SUBTITLE	OUTPUT LOOP FOR HIGH FRAGMENTATION FILES
OUTPUT_LOOP:
;
;	SEE IF LIST IS SHORT
;
	TSTL	COUNT_L_POINTERS(R11)
	BNEQ	1$
	BRW	END_OUTPUT_LOOP
;
;	CLEAR THE BUFFER
;
1$:	MOVC5	#0,LIST_BUFFER,#^A/ /,#4096,LIST_BUFFER
;
;	FILL IN NO OF POINTERS AND SIZE IN BLOCKS
;
	CMPL	#1,COUNT_L_POINTERS(R11);ONE POINTER FILES-IGNORE;V01-003
	BLSS	3$						;V01-003
	BRW	END_OUTPUT_LOOP					;V01-003
3$:	MOVL	#26,DESCRIPTER					;V01-003
	MOVAL	LIST_BUFFER,DESCRIPTER+4
	PUSHL	COUNT_L_SIZE(R11)
	PUSHL	COUNT_L_POINTERS(R11)
	PUSHAL	DESCRIPTER
	PUSHAL	LENGTH
	PUSHAL	LIST_2_FORMAT
	CALLS	#5,G^SYS$FAO
;								;V01-007
;	FILL IN EMPTY FILE NAME					;V01-007
;								;V01-007
	PUSHAL	DESCRIPTER					;V01-007
	PUSHAL	COUNT_L_SEQUENCE(R11)				;V01-007
	CALLS	#2,FILE_NAME					;V01-007
	MOVW	DESCRIPTER,LIST_RAB+RAB$W_RSZ			;V01-007
	MOVAL	LIST_BUFFER,LIST_RAB+RAB$L_RBF
	$PUT	RAB=LIST_RAB
	ADDL2	#COUNT_SIZE,R11
	DECL	R10
	BLEQ	END_OUTPUT_LOOP
	BRW	OUTPUT_LOOP
END_OUTPUT_LOOP:
	.PAGE							;V01-004
	.SUBTITLE	OUTPUT STATISTICS			;V01-004
;								;V01-004
;	OUTPUT THE HEADER					;V01-004
;								;V01-004
	MOVL	STATISTICS_HEADER_0+4,STAT_RAB+RAB$L_RBF	;V01-010
	MOVZBW	STATISTICS_HEADER_0,STAT_RAB+RAB$W_RSZ		;V01-010
	$PUT	RAB=STAT_RAB					;V01-010
	MOVAL	LIST_BUFFER,STAT_RAB+RAB$L_RBF			;V01-010
	MOVW	#1,STAT_RAB+RAB$W_RSZ				;V01-010
	MOVB	#^A/ /,LIST_BUFFER				;V01-011
	$PUT	RAB=STAT_RAB					;V01-010
	MOVL	STATISTICS_HEADER_1+4,STAT_RAB+RAB$L_RBF	;V01-004
	MOVZBW	STATISTICS_HEADER_1,STAT_RAB+RAB$W_RSZ		;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
	MOVL	STATISTICS_HEADER_2+4,STAT_RAB+RAB$L_RBF	;V01-004
	MOVZBW	STATISTICS_HEADER_2,STAT_RAB+RAB$W_RSZ		;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;								;V01-004
;	CREATE THE POINTER COLUMN HEADER			;V01-004
;								;V01-004
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-004
	MOVC5	#0,STAT_BUFFER,#^A/ /,#13,STAT_BUFFER		;V01-004
	MOVW	#9,STAT_RAB+RAB$W_RSZ				;V01-004
	MOVAL	STAT_BUFFER+9,R11				;V01-004
	MOVAL	POINTER_COUNT_LIST,R10				;V01-004
	MOVL	#POINTER_SIZE_COUNT,R9				;V01-004
1$:		PUSHL	(R10)					;V01-004
		MOVAL	(R11),DESCRIPTER+4			;V01-004
		MOVL	#9,DESCRIPTER				;V01-004
		PUSHAL	DESCRIPTER				;V01-004
		PUSHAL	LENGTH					;V01-004
		PUSHAL	STAT_1_FORMAT				;V01-004
		CALLS	#4,G^SYS$FAO				;V01-004
		ADDW2	#9,STAT_RAB+RAB$W_RSZ			;V01-004
		ADDL2	#9,R11					;V01-004
		ADDL2	#4,R10					;V01-004
	SOBGTR	R9,1$						;V01-004
	$PUT	RAB=STAT_RAB					;V01-004
;								;V01-004
;	NOW TO GENERATE THE LINES OF STATS			;V01-004
;								;V01-004
	MOVAL	STATISTICS,R11					;V01-004
	MOVAL	FILE_SIZE_LIST,R9				;V01-004
	MOVL	#FILE_SIZE_COUNT,R10				;V01-004
	MOVAL	STAT_BUFFER,STAT_RAB+RAB$L_RBF			;V01-004
2$:		MOVW	#9,STAT_RAB+RAB$W_RSZ			;V01-004
		PUSHL	(R9)					;V01-004
		MOVL	#9,DESCRIPTER				;V01-004
		MOVAL	STAT_BUFFER,DESCRIPTER+4		;V01-004
		PUSHAL	DESCRIPTER				;V01-004
		PUSHAL	LENGTH					;V01-004
		PUSHAL	STAT_1_FORMAT				;V01-004
		CALLS	#4,G^SYS$FAO				;V01-004
		MOVL	#POINTER_SIZE_COUNT,R8			;V01-004
		MOVAL	STAT_BUFFER+9,R7			;V01-004
3$:			PUSHL	(R11)				;V01-004
			MOVAL	(R7),DESCRIPTER+4		;V01-004
			PUSHAL	DESCRIPTER			;V01-004
			PUSHAL	LENGTH				;V01-004
			PUSHAL	STAT_2_FORMAT			;V01-004
			CALLS	#4,G^SYS$FAO			;V01-004
			ADDL2	#4,R11				;V01-004
			ADDL2	#9,R7				;V01-004
			ADDW2	#9,STAT_RAB+RAB$W_RSZ		;V01-004
			SOBGTR	R8,3$				;V01-004
		$PUT	RAB=STAT_RAB				;V01-004
		ADDL2	#4,R9					;V01-004
	DECL	R10						;V01-004
	BLEQ	4$						;V01-004
	BRW	2$						;V01-004
4$:								;V01-004
	.PAGE
	.SUBTITLE	DONE-CLOSE FILES,FINAL MESSAGE AND EXIT
	$DISCONNECT	RAB=INDEX_RAB
	$CLOSE		FAB=INDEX_FAB
	$DISCONNECT	RAB=LIST_RAB
	$CLOSE		FAB=LIST_FAB
	$DISCONNECT	RAB=STAT_RAB				;V01-004
	$CLOSE		FAB=STAT_FAB				;V01-004
	PUSHAL	FINAL_MESSAGE_1					;V01-004
	CALLS	#1,G^LIB$PUT_OUTPUT
	PUSHAL	FINAL_MESSAGE_2					;V01-004
	CALLS	#1,G^LIB$PUT_OUTPUT				;V01-004
	$EXIT_S
	.PAGE                                                               
	.SUBTITLE	SYSTEM ERROR MESSAGE HANDLEING                      
	.ENTRY	SYSTEM_ERROR_MESSAGE,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>    
;                                                                           
;	CALLED WITH 3 ARGUMENTS ACCORING TO FORTRAN STD                     
;	ARG1	INDEX ERROR MESSAGE PASS BY DESCRIPTER                      
;	ARG2	SYSTEM ERROR VALUE (SS$_XXX OR RMS$_XXX)                    
;	ARG3	SUPLIMENTAL VALUE TO ABOVE-USEUALLY FAB/RAB$L_STV VALUE     
;	OUTPUTS TO LIST FILE ARE NOT DONE HERE                              
;
	TSTL	4(AP)   ;CHECK FOR CALLER SUPPLIED ERROR MESSAGE
	BEQL	16$ 	;SKIP IF NONE
	PUSHAL	@4(AP)	;FIRST OUTPUT THE INDEX ERROR MESSAGE               
	CALLS	#1,G^LIB$PUT_OUTPUT                                         
16$:                                                                        
	EXTZV	#16,#12,@8(AP),R0	;GET FACILITY CODE                  
	CMPL	#0,R0		;IS IT A SYSTEM CODE                        
	BNEQ	1$		;NO                                         
	BRW	100$		;YES                                        
1$:	CMPL	#1,R0		;IS IT AN RMS CODE                          
	BEQL	2$		;YES                                        
	BRW	200$		;NO                                         
	.MACRO	CHKERR	ERR,DST,?A                                          
		CMPL	#ERR,R0                                             
		BNEQ	A                                                   
		BRW	DST                                                 
A:                                                                          
	.ENDM	CHKERR                                                      
2$:;	SET UP RMS ERROR CODES                                              
	MOVW	#2,MESSAGE_VECTOR                                           
	MOVW	#15,MESSAGE_VECTOR+2                                        
	MOVL	@8(AP),MESSAGE_VECTOR+4                                     
	CLRL	MESSAGE_VECTOR+8                                            
	MOVL	@8(AP),R0                                                   
;
;	CHECK ERROR CODES THAT MIGHT HAVE A SECONDARY ERROR MESSAGE
;
	CHKERR	RMS$_ACC,10$ 
	CHKERR	RMS$_AID,10$ 
	CHKERR	RMS$_ALN,10$ 
	CHKERR	RMS$_AOP,10$ 
	CHKERR	RMS$_ATR,10$ 
	CHKERR	RMS$_ATW,10$ 
	CHKERR	RMS$_BKZ,10$ 
	CHKERR	RMS$_CCF,10$ 
	CHKERR	RMS$_CDA,10$ 
	CHKERR	RMS$_CHN,10$ 
	CHKERR	RMS$_COD,10$ 
	CHKERR	RMS$_CRE,10$ 
	CHKERR	RMS$_CRMP,10$
	CHKERR	RMS$_DAC,10$ 
	CHKERR	RMS$_DAN,10$ 
	CHKERR	RMS$_DFL,10$ 
	CHKERR	RMS$_DNF,10$ 
	CHKERR	RMS$_DPE,10$ 
	CHKERR	RMS$_DTP,10$ 
	CHKERR	RMS$_ENQ,10$ 
	CHKERR	RMS$_ENT,10$ 
	CHKERR	RMS$_EXT,10$ 
	CHKERR	RMS$_FLG,10$ 
	CHKERR	RMS$_FND,10$ 
	CHKERR	RMS$_IAN,10$ 
	CHKERR	RMS$_IBF,10$ 
	CHKERR	RMS$_IBK,10$ 
	CHKERR	RMS$_IFA,10$ 
	CHKERR	RMS$_IFL,10$ 
	CHKERR	RMS$_IMX,10$ 
	CHKERR	RMS$_IRC,10$ 
	CHKERR	RMS$_KNM,10$ 
	CHKERR	RMS$_KSI,10$ 
	CHKERR	RMS$_LAN,10$ 
	CHKERR	RMS$_MKD,10$ 
	CHKERR	RMS$_NET,10$                                                
	CHKERR	RMS$_NETFAIL,10$
	CHKERR	RMS$_ORD,10$ 
	CHKERR	RMS$_POS,10$ 
	CHKERR	RMS$_RER,10$ 
	CHKERR	RMS$_RMV,10$ 
	CHKERR	RMS$_RPL,10$ 
	CHKERR	RMS$_SIZ,10$ 
	CHKERR	RMS$_SPL,10$ 
	CHKERR	RMS$_SUP,10$    
	CHKERR	RMS$_SYS,10$    
	CHKERR	RMS$_SUPPORT,10$
	CHKERR	RMS$_WBE,10$  
	CHKERR	RMS$_WER,10$  
	CHKERR	RMS$_WPL,10$  
	CHKERR	RMS$_XAB,10$  
	BRW	300$          
10$:	MOVL	@12(AP),MESSAGE_VECTOR+8	;PRIMARY ERROR HAS SECONDARY
	BRW	300$          			;ERROR MESSAGE
100$:
;
;SYSTEM ERROR CODES   
;
	MOVW	#1,MESSAGE_VECTOR   
	MOVW	#15,MESSAGE_VECTOR+2
	MOVL	@8(AP),MESSAGE_VECTOR+4 
;
;	ADD SYSTEM ERROR CHECKS HERE FOR FA0 ARGS                           
;
	BRW	300$                    
200$:
;
;	ALL OTHER ERROR TYPES           
;
	MOVW	#2,MESSAGE_VECTOR       
	MOVW	#15,MESSAGE_VECTOR+2    
	MOVL	@8(AP),MESSAGE_VECTOR+4 
	CLRL	MESSAGE_VECTOR+8        
	BRW	300$                    
300$:	PUSHAL	MESSAGE_VECTOR          
	CALLS	#1,G^SYS$PUTMSG         
	RET                             
	.PAGE							;V01-007
	.SUBTITLE	GENERATE FILE NAME			;V01-007
	.ENTRY	FILE_NAME,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>	;V01-007
;								;V01-007
;	TWO ARGUMENTS PASSED BY REFERENCE			;V01-007
;	FILE HEADER NUMBER 					;V01-007
;	DESCRIPER OF LINE TO PUT DATA INTO. LINE ALREADY FILLED	;V01-007
;		AND ADDITIONAL STRING PUT ON END		;V01-007
;								;V01-007
	MOVL	8(AP),R11	;GET ADDR OF DESCRIPTER		;V01-007
	MOVZBL	(R11),R10	;GET LENGTH			;V01-007
	MOVL	4(R11),R9	;GET STARTING ADDR		;V01-007
	ADDL3	R10,R9,R8	;GET NEXT STARTING LOC		;V01-007
;
;	FILL IN EMPTY DIRECTORY DELIMITERS
;
	MOVW	#^A/[]/,(R8)					;V01-007
	ADDL2	#2,R10						;V01-007
;
;	GET THE FILE HEADER
;
	ADDL3	@4(AP),FILE_HEADER_1_VBN,R0			;V01-007
	SUBL3	#1,R0,INDEX_RAB+RAB$L_BKT			;V01-007
	MOVAL	INDEX_BLOCK_2,INDEX_RAB+RAB$L_UBF		;V01-007
	MOVW	#512,INDEX_RAB+RAB$W_USZ			;V01-011
	$READ	RAB=INDEX_RAB					;V01-007
	BLBS	R0,2$
	$EXIT_S	R0
;
;	GET THE FILE NAME
;
2$:	MOVZBL	FH2$B_IDOFFSET+INDEX_BLOCK_2,R7			;V01-007
	MULL2	#2,R7						;V01-007
;								;V01-012
;	BUILD A CONTIGUOUS FORM OF THE FILE NAME		;V01-012
;								;V01-012
	MOVC3	#FI2$S_FILENAME,-				;V01-012
		INDEX_BLOCK_2+FI2$T_FILENAME(R7),-		;V01-012
		TEMP_NAME					;V01-012
	.IF	DF	FI2$S_FILENAMEXT			;V01-014
	MOVC3	#FI2$S_FILENAMEXT,-				;V01-012
		INDEX_BLOCK_2+FI2$T_FILENAMEXT(R7),-		;V01-012
		TEMP_NAME+FI2$S_FILENAME			;V01-012
	.ENDC							;V01-014
;
;	LOCATE TERMINATEING BLANK OF FILE NAME
;
	.IF	DF	FI2$S_FILENAMEXT			;V01-014
	LOCC	#^A/ /,#<FI2$S_FILENAME+FI2$S_FILENAMEXT>,-	;V01-012
		TEMP_NAME					;V01-012
	SUBL3	R0,#<FI2$S_FILENAME+FI2$S_FILENAMEXT>,R1	;V01-012
	.IFF							;V01-014
	LOCC	#^A/ /,#<FI2$S_FILENAME>,TEMP_NAME		;V01-014
	SUBL3	R0,#<FI2$S_FILENAME>,R1				;V01-014
	.ENDC							;V01-014
	ADDL2	R1,R10	;BUMP COUNT OF LINE SIZE		;V01-007
	MOVC3	R1,TEMP_NAME,2(R8)				;V01-012
	INCL	R8						;V01-007
;
;	NOW DO A LOOP BACK THROUGH BACK POINTERS THROUGH DIRECTORIES
;	BUILDING THE EXACT LOCATION IN DIR TREE OF FILE
;
DIR_LOOP:
;
;	GET SEQUENCE NUMBER OF DIRECTORY VIA BACK POINTER
;
	MOVW	INDEX_BLOCK_2+FH2$W_BK_FIDNUM,TEMP_SEQUENCE	;V01-007
	MOVZBW	INDEX_BLOCK_2+FH2$B_BK_FIDNMX,TEMP_SEQUENCE+2	;V01-007
	TSTL	TEMP_SEQUENCE					;V01-008
	BNEQ	5$						;V01-008
	BRW	END_DIR_LOOP					;V01-008
5$:								;V01-008
;
;	AND READ IN THE FILE HEADER
;
	ADDL3	FILE_HEADER_1_VBN,TEMP_SEQUENCE,R0		;V01-007
	SUBL3	#1,R0,INDEX_RAB+RAB$L_BKT			;V01-007
	MOVAL	INDEX_BLOCK_2,INDEX_RAB+RAB$L_UBF		;V01-007
	MOVW	#512,INDEX_RAB+RAB$W_USZ			;V01-011
	$READ	RAB=INDEX_RAB					;V01-007
	BLBS	R0,2$
	$EXIT_S	R0
;
;	GET THE DIR NAME
;
2$:	MOVZBL	FH2$B_IDOFFSET+INDEX_BLOCK_2,R5			;V01-007
	MULL2	#2,R5						;V01-007
;								;V01-012
;	BUILD A CONTIGUOUS FORM OF THE DIRECTORY NAME		;V01-012
;								;V01-012
	MOVC3	#FI2$S_FILENAME,-				;V01-012
		INDEX_BLOCK_2+FI2$T_FILENAME(R5),-		;V01-012
		TEMP_NAME					;V01-012
	.IF	DF	FI2$S_FILENAMEXT			;V01-014
	MOVC3	#FI2$S_FILENAMEXT,-				;V01-012
		INDEX_BLOCK_2+FI2$T_FILENAMEXT(R5),-		;V01-012
		TEMP_NAME+FI2$S_FILENAME			;V01-012
	.ENDC							;V01-014
;
;	LOCATE DOT IN DIR NAME
;
	.IF	DF	FI2$S_FILENAMEXT			;V01-014
	LOCC	#^A/./,#<FI2$S_FILENAME+FI2$S_FILENAMEXT>,-	;V01-012
			TEMP_NAME				;V01-012
	SUBL3	R0,#<FI2$S_FILENAME+FI2$S_FILENAMEXT>,R7	;V01-012
	.IFF							;V01-014
	LOCC	#^A/./,#<FI2$S_FILENAME>,TEMP_NAME		;V01-014
	SUBL3	R0,#<FI2$S_FILENAME>,R7				;V01-014
	.ENDC
	PUSHR	#^M<R5>						;V01-007
;
;	SEE IF DOT IS NEEDED IN DIR STRING
;
	CMPB	#^A/]/,(R8)	;IS THIS FIRST DIR ENTRY	;V01-007
	BEQL	1$
;								;V01-002
;	SEE IF THIS IS DIR [000000] IF SO AT THIS POINT		;V01-002
;	OTHER DIR ENTRIES HAVE BEEN MADE SO THIS IS NOT		;V01-002
;	NEEDED-SKIP PUTTING IT IN				;V01-002
;								;V01-002
	TSTB	INDEX_BLOCK_2+FH2$B_FID_NMX			;V01-007
	BNEQ	4$						;V01-002
	CMPW	#4,INDEX_BLOCK_2+FH2$W_FID_NUM			;V01-007
	BNEQ	4$						;V01-002
	BRW	END_DIR_LOOP					;V01-002
4$:	INCL	R7	;DOT NEEDED				;V01-002
1$:	ADDL2	R7,R10	;BUMP COUNT OF LINE SIZE		;V01-007
;
;	MOVE NAME AS BUILT SO FAR DOWN TO FIT IN DIR  NAME
;
	SUBL3	R10,#4096,R6					;V01-007
	SUBL2	R7,R6						;V01-007
	ADDL3	R7,R8,R1					;V01-007
	MOVC3	R6,(R8),(R1)					;V01-007
;
;	MOVE IN DIR NAME
;
	POPR	#^M<R5>						;V01-007
	MOVC3	R7,TEMP_NAME,(R8)				;V01-012
;
;	NOW SEE IF THIS IS DIR [000000] WE JUST GOT-IF SO DONE
;
	TSTB	INDEX_BLOCK_2+FH2$B_FID_NMX			;V01-007
	BNEQ	3$
	CMPW	#4,INDEX_BLOCK_2+FH2$W_FID_NUM			;V01-007
	BNEQ	3$
	BRW	END_DIR_LOOP
3$:	BRW	DIR_LOOP
END_DIR_LOOP:
	MOVZBL	R10,(R11)					;V01-007
	RET							;V01-007
	.PAGE							;V01-011
	.SUBTITLE	READ AND TRANSFER FILE HEADER BLOCKS	;V01-011
	.ENTRY	READ_HEADER,^M<R2,R3,R4,R5,R6,R7,R8,R9,R10,R11>	;V01-011
;								;V01-011
;	PASS 2 ARGUMENTS BY REFERENCE				;V01-011
;	FID	FILE ID OF FILE HEADER TO BE TRANSFERED		;V01-011
;	BUFFER	LOCATION OF BUFFER TO RECIEVE HEADER		;V01-011
;								;V01-011
;	SEE IF WANTED HEADER IS IN BUFFER			;V01-011
;								;V01-011
	CMPL	HEADER_BUFFER_FIRST_FID,@4(AP)			;V01-011
	BGTRU	1$						;V01-011
	SUBL3	HEADER_BUFFER_FIRST_FID,@4(AP),R11		;V01-011
	CMPL	R11,HEADER_BUFFER_HEADER_COUNT			;V01-011
	BGEQU	1$	;HIGHER THAN LAST IN BUFFER		;V01-011
	MULL2	#512,R11;GET OFFSET INTO BUFFER			;V01-011
	MOVC3	#512,HEADER_BUFFER(R11),@8(AP)			;V01-011
	MOVL	#1,R0						;V01-011
	RET							;V01-011
;								;V01-011
;	HEADER NOT IN BUFFER-UPDATE BUFFER			;V01-011
;								;V01-011
1$:	MOVC5	#0,HEADER_BUFFER,#0,#<HEADER_BUFFER_COUNT*512>,-;V01-011
		HEADER_BUFFER					;V01-011
	ADDL3	@4(AP),FILE_HEADER_1_VBN,R0			;V01-011
	SUBL3	#1,R0,INDEX_RAB+RAB$L_BKT			;V01-011
	MOVAL	HEADER_BUFFER,INDEX_RAB+RAB$L_UBF		;V01-011
	MOVW	#<HEADER_BUFFER_COUNT*512>,INDEX_RAB+RAB$W_USZ	;V01-011
	$READ	RAB=INDEX_RAB	;READ BLOCK OF HEADERS		;V01-011
	BLBS	R0,4$		;BRANCH IF NO ERROR		;V01-011
	CMPL	#RMS$_EOF,R0	;WAS ERROR E.O.F.		;V01-011
	BNEQ	5$		;NO				;V01-011
	BRW	10$		;HANDLE EOF CONDITION		;V01-011
;								;V01-011
;	ERROR FOUND NOT EOF-REPORT IT AND EXIT			;V01-011
;								;V01-011
5$:	PUSHAL	INDEX_RAB+RAB$L_STV				;V01-011
	PUSHAL	INDEX_RAB+RAB$L_STS				;V01-011
	PUSHAL	INDEX_READ_ERROR				;V01-011
	CALLS	#3,SYSTEM_ERROR_MESSAGE				;V01-011
	$EXIT_S							;V01-011
;								;V01-011
;	TRANSFER FIRST HEADER TO USER BUFFER			;V01-011
;								;V01-011
4$:	MOVL	@4(AP),HEADER_BUFFER_FIRST_FID			;V01-011
	MOVL	#HEADER_BUFFER_COUNT,HEADER_BUFFER_HEADER_COUNT	;V01-011
	MOVC3	#512,HEADER_BUFFER,@8(AP)			;V01-011
	MOVL	#1,R0						;V01-011
	RET							;V01-011
;								;V01-011
;	HANDLE EOF-SEE IF NO OR PARTIAL XFER			;V01-011
;								;V01-011
10$:	MOVZWL	INDEX_RAB+RAB$W_RSZ,R1				;V01-011
	BNEQ	11$						;V01-011
	RET	;NOTHING XFERD-PASS BACK EOF			;V01-011
11$:	DIVL3	#512,R1,HEADER_BUFFER_HEADER_COUNT		;V01-011
	MOVL	@4(AP),HEADER_BUFFER_FIRST_FID			;V01-011
	MOVC3	#512,HEADER_BUFFER,@8(AP)			;V01-011
	MOVL	#1,R0						;V01-011
	RET							;V01-011
	.END	FILE_CHECK
