.TITLE FILE_FRAGMENTATION .IDENT /V01-016/ .SUBTITLE DECLARATIONS ; ; PROGRAM TO SCAN A VAX/VMS FILES-11 LEVEL 2 DISK FILE HEADERS ; AND LIST THE RETRIVAL POINTERS. ASSUMES THE DEVICE IS A RA81. ; ; Bill Baker's mod of Michael N. LeVine's FILE.MAR JUICER program. ; ; Creates a brief $DUMP/HEADER of map area retrieval pointers. ; ; Example output (FILES_RP.LIS): ; ; 1 16 0 16 [000000]INDEXF.SYS;1 ; ; Where: The first number is the pointer number. ; ; The second number is the block count. ; ; The third number is the logical block number (LBN). ; ; The forth number is the next logical block number. LBN ; plus the count. This saves a lot of calculating when ; trying to find the next pointer or checking contiguious ; space allocation. ; ; Sorts: ; ; 1. LBN order: ; ; $ SORT/KEY=(POS=14,SIZE=6) FILES_RP.LIS FILES_RP_LBN.LIS ; ; 2. Almost directory order: ; ; $ SORT/KEY=(POS=30,SIZE=n) FILES_RP.LIS FILES_RP_DIR.LIS ; ; The reports will give you important information on file fragmentation ; and the location of the fragments. I use it to: ; ; 1. Determine how effictive was a disk reorganization. ; ; 2. Keep track of file placment and open space on disks reserved ; for master data files. ; .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_2_FORMAT: .ASCID /!4UL !6UL !6UL !6UL / FILE_TIME_OUT_PERIOD: .ASCID /366 0:0:0.0/ ;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 / /;V01-016 LENGTH: .LONG 0 OLD_AGE_FLAG: .LONG 0 ;V01-016 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 HEADER_BUFFER: .BLKB ;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 ;V01-012 .IFF ;V01-014 .BLKB FI2$S_FILENAME ;V01-014 .ENDC ;V01-014 ; ; BB MODS TO REDUCE DIRECTORY LOGIC I/O: ; LAST_FID: .BLKB 6 ; SAVE FID TO SO WE KNOW THE FULL NAME IS AVAIL. LAST_FILE_NAME: .BLKB 256 ; SAVE FULL FILE NAME LAST_DESC_LEN: .LONG 0 ; SAVE DESCPIPTOR LEN AFTER NAME INSERT ; T_BUF: .BLKB 256 T_DESC: .LONG 0,0 ; .PAGE ;V01-004 .SUBTITLE LIST OF FILES WITH MOST RETRIVAL POINTERS .PSECT ARRAY,RD,WRT,GBL,CON,QUAD,NOEXE ; SEQUENCE: .LONG 0 POINTERS: .LONG 0 SIZE: .LONG 0 LBN: .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=,- FAC=,- FNA=,FNS=0,- SHR= .ALIGN LONG INDEX_RAB: $RAB BKT=1,- FAB=INDEX_FAB,- RBF=INDEX_BLOCK,RSZ=512- ROP=,- UBF=INDEX_BLOCK,USZ=512 LIST_FAB: $FAB ALQ=15,- ;V01-003 DEQ=5,- ;V01-003 DNM=,- FAC=,- FOP=,- ORG=,- RAT=,- RFM=,- SHR= LIST_RAB: $RAB FAB=LIST_FAB,- BKT=0,- RAC=,- RBF=LIST_BUFFER,- RSZ=0 .PAGE .SUBTITLE CODE .SUBTITLE INITALIZATION .PSECT CODE,RD,NOWRT,EXE,GBL,CON .ENTRY FILE_CHECK,0 ; ; CLEAR THE BUFFERS ; MOVC5 #0,LIST_BUFFER,#^A/ /,#4096,LIST_BUFFER MOVC5 #0,LAST_FILE_NAME,#^A/ /,#256,LAST_FILE_NAME ; MOVL #80,T_DESC MOVAL T_BUF,T_DESC+4 MOVC5 #0,T_BUF,#^A/ /,#256,T_BUF ; ; ;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 CLRL OLD_AGE_FLAG ;V01-016 ; ; GET THE DEVICE NAME ; CALLG GET_ARG,G^LIB$GET_FOREIGN BLBS R0,1$ $EXIT_S R0 1$: LOCC #^A?/?,LENGTH,DEVICE_NAME+8 ;V01-016 BNEQ 30$ ;V01-016 SUBL2 R0,LENGTH ;V01-016 CMPB #^A/A/,1(R1) ;V01-016 BNEQ 30$ ;V01-016 MOVL #1,OLD_AGE_FLAG ;V01-016 30$: MOVL LENGTH,DEVICE_NAME ;V01-016 ; ; 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 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$: ; ; 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 #,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 #,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 #,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 #,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 CLRL HEADER_BUFFER_HEADER_COUNT ;V01-011 CLRL HEADER_BUFFER_FIRST_FID ;V01-011 MOVC5 #0,HEADER_BUFFER,#0,#,-;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 #,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,# ; 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 .PAGE .SUBTITLE SCAN FILE HEADER LOOP-SCAN FILE HEADER INCL ANY EXT OUTTER_COUNT_LOOP: ; ;V01-015 ; CHECK FOR BAD SOMETHING FLAGS ;V01-015 ; ;V01-015 BITL #FH2$M_BADACL,INDEX_BLOCK+FH2$L_FILECHAR ;V01-015 BEQL 1$ ;V01-015 1$: BITL #FH2$M_BADBLOCK,INDEX_BLOCK+FH2$L_FILECHAR ;V01-015 BEQL 2$ ;V01-015 2$: BITL #FH2$M_MARKDEL,INDEX_BLOCK+FH2$L_FILECHAR ;V01-015 BEQL 3$ ;V01-015 3$: ;V01-015 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 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 ; MOVZWL INDEX_BLOCK+FM2$W_LOWLBN(R11),LBN EXTZV #0, #6, INDEX_BLOCK+FM2$B_COUNT1+1(R11),R0 INSV R0, #16, #16, LBN ; 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 ; MOVL INDEX_BLOCK+FM2$L_LBN2(R11),LBN ; 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 ; MOVL INDEX_BLOCK+FM2$L_LBN2+2(R11),LBN ; ADDL2 #8,R11 BRB 39$ 35$: ; ;BAD FORMAT-FORGET THE WHOLE FILE HEADER ; BRW LOOP 39$: ; ; FILL IN NO OF POINTERS AND SIZE IN BLOCKS ; CMPL #0,POINTERS ;ZERO POINTER FILES-IGNORE;V01-003 BLSS 50$ ;V01-003 BRW 51$ ;V01-003 50$: MOVL #28,DESCRIPTER ;V01-003 MOVAL LIST_BUFFER,DESCRIPTER+4 MOVL LBN,R0 ADDL2 SIZE,R0 PUSHL R0 PUSHL LBN PUSHL SIZE PUSHL POINTERS PUSHAL DESCRIPTER PUSHAL LENGTH PUSHAL LIST_2_FORMAT CALLS #5,G^SYS$FAO ; ;V01-007 ; FILL IN EMPTY FILE NAME ;V01-007 ; ;V01-007 CMPC3 #6,INDEX_BLOCK+FH2$W_FID_NUM,LAST_FID BEQL 52$ MOVC3 #6,INDEX_BLOCK+FH2$W_FID_NUM,LAST_FID PUSHAL DESCRIPTER ;V01-007 PUSHAL SEQUENCE ;V01-007 CALLS #2,FILE_NAME ;V01-007 ; CMPB #^A/]/,LIST_BUFFER+29 BNEQ 54$ BRW LOOP 54$: CMPB I^#0,LIST_BUFFER+29 BNEQ 53$ BRW LOOP 53$: MOVC3 #256,LIST_BUFFER+28,LAST_FILE_NAME MOVL DESCRIPTER,LAST_DESC_LEN ; 52$: MOVC3 #256,LAST_FILE_NAME,LIST_BUFFER+28 MOVL LAST_DESC_LEN,DESCRIPTER MOVW DESCRIPTER,LIST_RAB+RAB$W_RSZ ;V01-007 MOVAL LIST_BUFFER,LIST_RAB+RAB$L_RBF $PUT RAB=LIST_RAB ; ;SAVE> MOVC5 #0,T_BUF,#^A/ /,#256,T_BUF ;TRACE> MOVC3 #78,LIST_BUFFER,T_BUF ; MOVB #37,T_BUF ; MOVW T_DESC,LIST_RAB+RAB$W_RSZ ; MOVAL T_BUF,LIST_RAB+RAB$L_RBF ; $PUT RAB=LIST_RAB ; 51$: CLRL SIZE 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 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 #,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,# ; 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: BRW LOOP .PAGE .SUBTITLE SET UP FOR OUTPUT OF RESULTS ;V01-007 END_LOOP: ; OUTPUT_LOOP: ; END_OUTPUT_LOOP: ; ;V01-004 .SUBTITLE DONE-CLOSE FILES,FINAL MESSAGE AND EXIT $DISCONNECT RAB=INDEX_RAB $CLOSE FAB=INDEX_FAB $DISCONNECT RAB=LIST_RAB $CLOSE FAB=LIST_FAB $EXIT_S .PAGE .SUBTITLE SYSTEM ERROR MESSAGE HANDLEING .ENTRY SYSTEM_ERROR_MESSAGE,^M ; ; 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 ;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 ; MOVC3 #512,INDEX_BLOCK,INDEX_BLOCK_2 ; ; 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/ /,#,- ;V01-012 TEMP_NAME ;V01-012 SUBL3 R0,#,R1 ;V01-012 .IFF ;V01-014 LOCC #^A/ /,#,TEMP_NAME ;V01-014 SUBL3 R0,#,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: ; ;SAVE> MOVC5 #0,T_BUF,#^A/ /,#256,T_BUF ;TRACE> MOVC3 #80,LIST_BUFFER,T_BUF ; MOVB #37,T_BUF ; MOVW T_DESC,LIST_RAB+RAB$W_RSZ ; MOVAL T_BUF,LIST_RAB+RAB$L_RBF ; $PUT RAB=LIST_RAB ; ; 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$ CMPL #RMS$_EOF,R0 ;WAS ERROR E.O.F. ;V01-011 BNEQ 50$ ;NO ;V01-011 BRW END_DIR_LOOP ;HANDLE EOF CONDITION ;V01-011 50$: $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/./,#,- ;V01-012 TEMP_NAME ;V01-012 SUBL3 R0,#,R7 ;V01-012 .IFF ;V01-014 LOCC #^A/./,#,TEMP_NAME ;V01-014 SUBL3 R0,#,R7 ;V01-014 .ENDC PUSHR #^M ;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 ;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 ;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,#,-;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 #,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