! 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