! VCRIDX.BAS ! Purpose: Calculate & print the number of blocks per PPN from a VCRDIR file. ! Output to xxxxxx.LST and terminal. ! Limitations: Memory required: 135K Bytes. See COUNTS matrix below. ! Max block count per PPN = 65,535. ! At: Interactive Concepts, Inc. (312)949-1771 ! By: Bart Berndtson ! On: 01/03/85 Why: Created ! On: 01/08/85 By: BEB Why: Edited format. ! On: 01/22/85 By: BEB Why: Add STRING="". Make [mmm,nnn] fixed length ! On: 05/22/87 By: BEB Why: Dress up report matrix: ......, column foot. ! Where PPN = P PN ! From 1 0 ! To 377 377 MAP1 COUNTS(255,256),B,2 ! = 130,560 bytes ! where max block count = 65,535 per PPN MAP1 TRUE,B,2,-1 MAP1 FALSE,B,2,0 MAP1 FIRST,B,2 MAP1 DEBUG,B,2,FALSE MAP1 FILE'NAME,S,30 ! DSKn:[nnn,nnn]abcdef MAP1 EXT,S,3 ! ghi MAP1 FILE'SPEC,S,30 ! DSKn:[nnn,nnn]abcdef.ghi MAP1 OUT'SPEC,S,30 ! DSKn:[nnn,nnn]abcdef.LST MAP1 STRING,S,90 MAP1 DEV,S,4 ! DEVn device on tape to report MAP1 I,F MAP1 N,F MAP1 X,F MAP1 PX,F MAP1 XP,F MAP1 XPN,F MAP1 XPU,F MAP1 D,F MAP1 P'PRIOR,F MAP1 PN'PRIOR,F MAP1 P,F,,0 MAP1 PN,F,,0 MAP1 PFLAG(255),B,1 MAP1 PS(255),B,1 MAP1 PNS(256),B,1 MAP1 PPN'TOTAL(256),F MAP1 PPN'BLOCKS,F MAP1 PPN,S,30 MAP1 PROJ,S,30 MAP1 SEQ,B,5 MAP1 BLOCKS,B,5 MAP1 BLOCKS'PER'PPN,B,5 MAP1 TOTAL'BLOCKS,B,5,0 MAP1 P'STRING,S,6 MAP1 FMT,S,3 MAP1 P'10,F MAP1 WORK,F MAP1 ROW,F ?MEM(0) FOR I = 1 TO 255 : PFLAG(I) = 0 : NEXT I EXT = "VCR" ! default PRINT TAB(-1,0); PRINT "File Name: " PRINT "Extension: ";EXT PRINT "Summarize device from vcr directory(eg, DSK0): " ?MEM(0) PRINT TAB(1,12); INPUT LINE "", FILE'NAME PRINT TAB(2,12); INPUT LINE "", EXT PRINT TAB(3,48); INPUT LINE "",DEV IF EXT = "" EXT = "VCR" FILE'SPEC = FILE'NAME + "." + EXT OUT'SPEC = FILE'NAME + "." + "LST" PRINT PRINT "Input file: ";FILE'SPEC;" Output file: ";OUT'SPEC OPEN #10,FILE'SPEC,INPUT OPEN #20,OUT'SPEC,OUTPUT FIRST = TRUE TOTAL'BLOCKS = 0 N = 0 ROW = 7 BLOCKS'PER'PPN = 0 IF DEBUG = TRUE & PRINT " 1111111111222222222233333333334" : & PRINT " 1234567890123456789012345678901234567890" : & PRINT " ===== ==== === === ===== " ! Here scan directory file: NEXT: P'PRIOR = P PN'PRIOR = PN INPUT LINE #10,STRING IF EOF (10) # FALSE GOTO INPUT'END N = N + 1 IF N <= 7 GOSUB DO'PRT'STG : GOTO NEXT IF N = 8 GOSUB SEE'HEADING SEQ = STRING[1,5] PRINT TAB(ROW,1);(SEQ USING "#####");" "; IF NOT(STRING[8,11] = DEV OR STRING[8,11] = "ALL")& PRINT " SKIP";TAB(-1,9); : GOTO NEXT P = 0 : FOR I = 25 TO 27 : D = STRING[I,I] : P = P * 8 + D : NEXT I IF P # 0 PFLAG(P) = P PN = 0 FOR I = 29 TO 31 IF STRING[I,I] >= "0" AND STRING[I,I] <= "9" & D = STRING[I,I] : PN = PN * 8 + D NEXT I P'10 = P : FMT = "#ZZ" : GOSUB OCT'FMT PROJ = "["+P'STRING+"," P'10 = PN : FMT = "#ZZ" : GOSUB OCT'FMT PPN = PROJ + P'STRING+ "]" PRINT PPN; BLOCKS = STRING[33,37] PRINT BLOCKS USING " #####"; IF P # P'PRIOR OR PN # PN'PRIOR BLOCKS'PER'PPN = 0 BLOCKS'PER'PPN = BLOCKS'PER'PPN + BLOCKS PRINT BLOCKS'PER'PPN USING " #####" COUNTS(P,PN+1) = COUNTS(P,PN+1) + BLOCKS TOTAL'BLOCKS = TOTAL'BLOCKS + BLOCKS GOTO NEXT INPUT'END: CLOSE #10 PRINT : ROW = ROW + 1 ! Here print table of block counts: ! [nn,?] nn,nnn nn,nnn ... PRINT ((DEV+": ")[1,5]);" TOTAL"; PRINT #20,((DEV+": ")[1,5]);" TOTAL"; GOSUB PRT'COLUMNS ! [mmm,nn?] nn,nnn nn,nnn ... ! 12345678901234567890123456 PPN = "" FOR XP = 1 TO 255 ! mmm IF PFLAG(XP) = 0 GOTO LOOP'XP PPN'BLOCKS = 0 FIRST = TRUE FOR XPN = 0 TO 31 ! mmm,nn? STRING = "" P'10 = XP : FMT = "#ZZ" : GOSUB OCT'FMT PROJ = "["+P'STRING+"," P'10 = XPN : FMT = "#Z" : GOSUB OCT'FMT PPN = PROJ + P'STRING+ ".] " STRING = PPN IF FIRST = TRUE FIRST = FALSE & ELSE STRING[2,5]=SPACE(4) N = 0 FOR XPU = 0 TO 7 ! mmm,??n X = XPN*8+XPU+1 ! mmm,nnn GOSUB FMT'COUNT NEXT XPU GOSUB SEE'COUNT ! (including nn,nnn per proj.) NEXT XPN GOSUB SEE'PROJ GOSUB DO'PRT'LF LOOP'XP: NEXT XP PRINT " "; PRINT #20," "; GOSUB PRT'COLUMNS GOSUB SEE'TOTAL CLOSE #20 END ! ================================= SEE'HEADING: PRINT TAB(ROW,1); PRINT " Blocks" PRINT " Seq. Prj PNo /File /PPN" PRINT "===== === === ===== =====" ROW = ROW + 3 RETURN OCT'STG: ! Convert to octal string ! Given: P'10 Return: P'STRING P'STRING = "" OCT'STG'CONT: WORK = INT(P'10/8) P'STRING = "0123456789"[1+P'10-WORK*8;1]+P'STRING P'10 = WORK IF P'10 <> 0 GOTO OCT'STG'CONT RETURN OCT'FMT: GOSUB OCT'STG P'STRING = VAL(P'STRING) USING FMT RETURN OCT'PN: P'10 = XPN-1 GOSUB OCT'STG P'STRING = RIGHT(P'STRING+":",5) RETURN DO'PRT'STG: PRINT STRING PRINT #20,STRING ROW = ROW + 1 RETURN DO'PRT'LF: PRINT PRINT #20 ROW = ROW + 1 RETURN PRT'COLUMNS: FOR I = 0 TO 7 PRINT " ,..";STR(I);" "; PRINT #20," ,..";STR(I);" "; NEXT I PRINT PRINT #20 RETURN FMT'COUNT: IF COUNTS(XP,X) # 0 & N = N + COUNTS(XP,X) :& PPN'BLOCKS = PPN'BLOCKS + COUNTS(XP,X):& STRING[17+8*XPU;6]= COUNTS(XP,X) USING "##,###" IF COUNTS(XP,X) = 0 STRING[17+8*XPU;6] = "......" RETURN SEE'COUNT: IF N =0 RETURN PRINT STRING PRINT #20,STRING RETURN SEE'PROJ: IF PPN'BLOCKS # 0 & STRING = PROJ +"*] " :& STRING[12,17] = PPN'BLOCKS USING "##,###" :& PRINT STRING :& PRINT #20,STRING RETURN SEE'TOTAL: STRING = "TOTAL" STRING[11,17] = TOTAL'BLOCKS USING "###,###" PRINT STRING PRINT #20,STRING RETURN