! 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