*DECK,FLBLOCKF                                                           FLBLOCK
      PROGRAM FLBLOK(OUTPUT=100)
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             THE MAIN PROGRAM CONTROLS THE FLOW OF EXECUTION THROUGHOUT
C             IT DECIDES IF THE OUTPUT FILE IS CONNECTED. IF NOT MORE 
C             INFO IS PRINTED AND A * BOX SURROUNDS THE OUTPUT. IT
C             FIRST PRINTS THE CONTROL CARD(1 LINE BATCH,2 CONNECTED),
C             THEN CALLS KRACKER AND HEADPR TO WORK WITH THE CONTROL
C             CARD PARAMETERS. THEN IT CALLS ESTIMAT TO DO THE WORK.
C        ENTRY CONDITIONS : 
C             CONTROL CARD WITH 1 POSITIONAL AND UP TO 7 KEYWORD
C             PARAMETERS
C        CALLED ROUTINES :  
C             KRACKER - TO CRACK THE CONTROL CARD 
C             HEADPR - TO PRINT THE HEADINGS
C             ESTIMAT - TO DO THE CALCULATIONS
C        DEFINED VARIABLES :  
C             RA0 - WORD 0 OF THE FIELD LENGTH(USER COMMUNICATION AREA) 
C             FILE - OUTPUT FILE NAME 
C             TTYFILE - LOGICAL FLAG : TRUE = CONNECTED, FALSE = BATCH
C             PARMS - COMMON BLOCK FOR THE INPUT PARAMETERS 
C                  NR - NUMBER OF RECORDS 
C                  KL - KEY LENGTH
C                  RL - AVERAGE RECORD LENGTH 
C                  IP - INDEX PADDING 
C                  DP - DATA PADDING
C                  NL - NUMBER OF INDEX LEVELS (0 = DEFAULT)
C                  MRL - MAXIMUM RECORD LENGTH
C             CARD - ARRAY FOR THE CONTROL CARD AFTER IT IS BLANK PADDED
C             STAR - LOCATION FOR * 
C             CARDLOC - LOCATION OF CONTROL CARD
C             I, J - SCRATCH VARIABLES
C        ERROR CONDITIONS : 
C             NONE
C 
      IMPLICIT INTEGER(A-Z) 
      COMMON /PARMS/ NR, KL, RL, IP, DP, NL, MRL
      COMMON /TTYFILE/ TTYFILE
      LOGICAL TTYFILE 
      DIMENSION PARMS(7), CARD(8) 
      EQUIVALENCE (PARMS(1),NR) 
      DATA PARMS /7*(-1)/ 
C        INITIALIZED TO -1 FOR LATER CHECKING PURPOSES
C                  BEGIN FIND OUT IF OUTPUT IS CONNECTED
      PRINT 98
      RA0 = -LOCF(CARD(1))
      FILE = CARD(RA0+3)
      IF(SHIFT(FILE,-18).EQ.0) FILE = 6LOUTPUT
      I = CONFILE(FILE) 
      TTYFILE = I.EQ.1
      IF(TTYFILE) GO TO 5 
      STAR = 1R*
      PRINT 100, (STAR,I=1,130) 
      PRINT 402 
      PRINT 102 
      PRINT 401 
      GO TO 8 
 5    PRINT 103 
C                  BEGIN LOCATE AND PRINT CONTROL CARD
 8    CARDLOC = RA0 + 70B 
      DO 10 I = 1,8 
         CARD(I) = CARD(CARDLOC+I)
         DO 10 J = 1,10 
            IF((77B.AND.CARD(I)).EQ.0) CARD(I) = CARD(I).OR.1R
            CARD(I) = SHIFT(CARD(I),6)
 10      CONTINUE 
      IF(TTYFILE) GO TO 20
      PRINT 200, (CARD(I),I=1,8)
      PRINT 401 
      GO TO 30
 20   PRINT 201, (CARD(I),I=1,8)
 30   CALL KRACKER
      CALL HEADPR 
      CALL ESTIMAT
      IF(TTYFILE) STOP
C                  BEGIN PRINT BOTTOM OF BOX
 50   PRINT 101, (STAR,I=1,130) 
      STOP  " FLBLOK COMPLETE " 
  
 98   FORMAT(" ") 
 100  FORMAT("1  ",130R1) 
 101  FORMAT(3X,130R1)
 102  FORMAT(47X,"INDEXED SEQUENTIAL FILE PARAMETER ESTIMATE")
 103  FORMAT(16X,"INDEXED SEQUENTIAL FILE PARAMETER ESTIMATE")
201   FORMAT(5X,"CONTROL STATEMENT : ",4A10,/25X,4A10)
200   FORMAT(18X,"CONTROL STATEMENT : ",8A10) 
 401  FORMAT("+",2X,"*",128X,"*",/3X,"*",128X,"*")
 402  FORMAT(3X,"*",128X,"*") 
      END 
          IDENT  CONFILE
          SST 
          ENTRY  CONFILE
* 
*        PURPOSE :  
*             CONFILE CHECKS THE CNF BIT IN THE FIT OF THE OUTPUT FILE
*             TO SEE IF THE FILE IS CONNECTED. IT RETURNS 1 IF CONNECTED
*             AND 0 IF NOT IN X(6). 
*        ENTRY CONDITIONS : 
*             X(1) = ADDRESS OF ARGUEMENT - ARGUEMENT IS THE FILE NAME
*        CALLED ROUTINES :  
*             NONE
*        EXTERNAL REFERENCE : 
*             LIST.RM - THE LIST OF FILES WITH FIT ADDRESSES
*        ERROR CONDITIONS : 
*             IF FILE NAME IS NOT FOUND, DEFAULT TO CONNECTED 
* 
 CONFILE  EQ     *+1S17 
          SB1    1
          SA2    X1               GET PASSED PARAMETER
          SA1    =XLIST$RM        FIND LIST OF FILES
          SB2    X1               GET LENGTH OF LIST
          MX0    52B              MAKE FILE NAME MASK 
          BX2    X2*X0            MASK PASSED FILE NAME TO 42 BITS
 LOOP     SA1    A1+B1            GET NEXT LIST ENTRY 
          SB2    B2-B1            CHECK END OF LIST 
          LE     B2,DEFAULT       IF END OF LIST, PLUG A 0
          BX3    X1*X0            MASK TABLE FILE NAME
          IX7    X2-X3            CHECK FOR MATCH 
          NZ     X7,LOOP
          MX7    22B              ADDRESS MASK
          LX7    22B              MOVE ADDRESS MASK TO BOTTOM OF WORD 
          BX1    X1*X7            MASK FILE NAME OFF ADDRESS
          SA3    X1+B1            FIND FTS WORD IN FIT
          AX3    22B              MOVE FTS TO BOTTOM OF X3
          SX7    77B              MAKE 6 BIT MASK 
          BX7    X3*X7            MASK FTS
          SX3    #MNF#            GET MNF 
          IX3    X7-X3            COMPARE MNF AND FTS 
          NZ     X3,LOOP          IF NOT EQ FIND NEXT FIT NAME MATCH
          SA1    X1+21B           FIND CNF WORD IN FIT
          AX1    23B              SHIFT CNF FLAG TO BOTTOM OF X1
          SX0    1                MAKE A 1 BIT MASK 
          BX6    X1*X0            PUT FLAG IN X6 AS INTEGER (1 OR 0)
          EQ     CONFILE
 DEFAULT  SX6    B0               PLUG A 0 (DISCONNECTED FILE)
          EQ     CONFILE
          END 
      SUBROUTINE KRACKER
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             KRACKER TAKES CONTROL CARD PARAMETERS FROM THE RA+1 AREA
C             (RA+3 BECAUSE OF THE OUTPUT FILE) AND PUTS VALUES INTO THE
C             VARIABLES WHICH CORRESPOND TO THE KEYWORDS. KEYKRAK DOES
C             THE HARD WORK, WHILE KRACKER DOES THE MATCHING, ERROR 
C             CHECKING AND DEFAULTING.
C        ENTRY CONDITIONS : 
C             PARMS(1-7) = -1 (ILLEGAL VALUES TO FLAG DEFAULT)
C        CALLED ROUTINES :  
C             KEYKRAK - TO CRACK A SINGLE PARAMETER APART 
C             ERR - TO PROCESS ERRORS 
C        DEFINED VARIABLES :  
C             PMATCH - ARRAY WITH KEYWORD NAMES TO MATCH CONTROL CARD 
C                  KEYWORDS 
C             DEFAULT - ARRAY WITH DEFAULTS FOR THE PARAMETER VALUES
C             PMIN - ARRAY WITH MINIMUM VALUES FOR THE PARAMETERS 
C             PMAX - ARRAY WITH MAXIMUM VALUES FOR THE PARAMETERS 
C             RA0 - WORD 0 OF THE FIELD LENGTH(USER COMMUNICATION AREA) 
C             NARG - NUMBER OF ARGUEMENTS ON CONTROL CARD 
C             PNAME - PARAMETER KEYWORD 
C             PVAL - PARAMETER VALUE
C             I, J - SCRATCH VARIABLES
C        ERROR CONDITIONS : 
C             4) UNRECOGNIZED KEYWORD 
C             5) DUPLICATE PARAMETER
C             6) VALUE TOO LARGE
C             7) VALUE TOO SMALL
C 
      IMPLICIT INTEGER(A-Z) 
      COMMON /PARMS/ NR, KL, RL, IP, DP, NL, MRL
      DIMENSION PARMS(7), PMATCH(7), DEFAULT(7), PMAX(7), PMIN(7) 
      EQUIVALENCE (PARMS(1),NR) 
      DATA PMATCH /2RNR, 2RKL, 2RRL, 2RIP, 2RDP, 2RNL, 3RMRL/ 
      DATA PMIN /3*1,2*0,2*1/ 
      DATA PMAX /1073741823,255,81870,99,99,15,81870/ 
      DATA DEFAULT /100000,10,80,2*0,3,0/ 
      RA0 = (-LOCF(PARMS(1))) + 1 
      NARG = (PARMS(RA0+64B).AND.777777B) + 1 
      I = 3 
C                  BEGIN LOOP THROUGH INPUT PARAMETERS AND MOVE VALUES
C                        INTO THE CORRESPONDING VARIABLE IN PARMS 
 5    IF(I.GT.NARG) GO TO 25
         CALL KEYKRAK(PARMS(RA0+I),I,PNAME,PVAL)
         DO 10 J = 1,7
            IF(PNAME.EQ.PMATCH(J)) GO TO 20 
 10         CONTINUE
         CALL ERR(4,PNAME)
 20      IF(PARMS(J).GE.0) CALL ERR(5,PNAME)
         IF(PVAL.GT.PMAX(J)) CALL ERR(6,PNAME,PMAX(J))
         IF(PVAL.LT.PMIN(J)) CALL ERR(7,PNAME,PMIN(J))
         PARMS(J) = PVAL
         I = I + 2
         GO TO 5
 25   DO 30 I = 1,7 
         IF(PARMS(I).GE.0) GO TO 30 
         PARMS(I) = DEFAULT(I)
 30      CONTINUE 
      IF(MRL.EQ.0) MRL = RL 
      RETURN
      END 
      SUBROUTINE KEYKRAK(PARAM,LOC,PNAME,PVAL)
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             KEYKRAK TAKES A KEYWORD FROM PARAM AND MOVES IT TO PNAME. 
C             IT ALSO TAKES A VALUE FROM PARAM+1 AND MOVES IT TO PVAL.
C             IF THE VALUE IS TWO WORDS LONG(GREATER THAN 7 DIGITS) IT
C             ALSO USES PARAM+2 AND BUMPS LOC BY 1. ALL DISPLAY CODES 
C             ARE CHECKED AS THEY ARE MOVED, AND PVAL IS DECODED TO AN
C             INTEGER.
C        ENTRY CONDITIONS : 
C             PARAM(1) IS THE LOCATION OF A KEYWORD IN THE USER 
C             COMMUNICATION AREA (UNLESS THERE IS A USER ERROR). OUR
C             LOCATION IN THE ARGUEMENTS IS RA+LOC
C        CALLED ROUTINES :  
C             ERR - TO PROCESS ERRORS 
C        DEFINED VARIABLES :  
C             PARAM, LOC - FORMALS, DEFINED BEFORE CALL 
C             PNAME, PVAL - FORMALS, USED TO RETURN RESULTS 
C             TMP, I - SCRATCH VARIABLES
C        ERROR CONDITIONS : 
C             1) VALUE > 10 DIGITS
C             2) NON-ALPHABETIC IN KEYWORD
C             3) NON-NUMERIC IN VALUE 
C 
      IMPLICIT INTEGER(A-Z) 
      DIMENSION PARAM(3)
      ADDCH(A,B) = SHIFT(A,6).OR.(SHIFT(B,6).AND.MASK(54))
      PNAME = 0 
      PVAL = 10L
      TMP = MASK(6).AND.PARAM(3)
      IF((TMP.GT.1L9).OR.(TMP.LT.1L0)) GO TO 10 
C                  BEGIN SPECIAL CASE OF VALUE > 7 DIGITS(BASE 10)
      LOC = LOC + 1 
      TMP = MASK(6).AND.SHIFT(PARAM(3),18)
      IF((TMP.NE.1L ).AND.(TMP.NE.0)) CALL ERR(1) 
      PARAM(2) = (MASK(42).AND.PARAM(2)).OR.SHIFT((MASK(18).AND.
     +   PARAM(3)),18)
C                  BEGIN MOVE AND CHECK A KEYWORD 
 10   DO 20 I = 1,7 
         TMP = MASK(6).AND.PARAM(1) 
         IF((TMP.EQ.1L ).OR.(TMP.EQ.0)) GO TO 25
         IF((TMP.GT.1LZ).OR.(TMP.LT.1LA)) CALL ERR(2) 
         PNAME = ADDCH(TMP,PNAME) 
         PARAM(1) = SHIFT(PARAM(1),6) 
 20      CONTINUE 
C                  BEGIN MOVE AND CHECK A VALUE 
 25   DO 30 I = 1,10
         TMP = MASK(6).AND.PARAM(2) 
         IF((TMP.EQ.1L ).OR.(TMP.EQ.0)) GO TO 35
         IF((TMP.GT.1L9).OR.(TMP.LT.1L0)) CALL ERR(3) 
         PVAL = ADDCH(TMP,PVAL) 
         PARAM(2) = SHIFT(PARAM(2),6) 
 30      CONTINUE 
 35   DECODE(10,700,PVAL) TMP 
      PVAL = TMP
      RETURN
 700  FORMAT(I10) 
      END 
      SUBROUTINE HEADPR 
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             HEADPR PRINTS THE VALUES FROM THE ARRAY PARMS WITH
C             APPROPRIATE LABELS IN A READABLE FORMAT.
C        ENTRY CONDITIONS : 
C             PARAMS HAS ALL VALUES SET FOR CALCULATION 
C        CALLED ROUTINES :  
C             NONE
C        DEFINED VARIABLES :  
C             STAR - LOCATION FOR * 
C             I - SCRATCH VARIABLE
C        ERROR CONDITIONS : 
C             NONE
C 
      IMPLICIT INTEGER(A-Z) 
      COMMON /PARMS/ NR, KL, RL, IP, DP, NL, MRL
      COMMON /TTYFILE/ TTYFILE
      LOGICAL TTYFILE 
      IF(TTYFILE) GO TO 10
      PRINT 103 
      PRINT 401 
      PRINT 104, NR, KL 
      PRINT 400 
      PRINT 105, RL, MRL
      PRINT 400 
      PRINT 106, DP, IP 
      PRINT 400 
      PRINT 107, NL 
      PRINT 401 
      STAR = 1R*
      PRINT 101, (STAR,I=1,82)
      PRINT 401 
      RETURN
  
 10   PRINT 110, MRL, NL
      PRINT 111, RL, DP 
      PRINT 112, KL, IP 
      PRINT 113, NR 
      RETURN
  
 101  FORMAT(27X,82R1)
 103  FORMAT(23X,"PARAMETER VALUES USED THIS RUN :")
 104  FORMAT(23X,"TOTAL NUMBER OF RECORDS(NR) =",I10,13X, 
     +   "KEY LENGTH(CHARACTERS)(KL) =",I10)
 105  FORMAT(23X,"AVERAGE RECORD LENGTH(RL)   =",I10,13X, 
     +   "MAXIMUM RECORD LENGTH(MRL) =",I10)
 106  FORMAT(23X,"DATA BLOCK PADDING(DP)      =",I10,13X, 
     +   "INDEX BLOCK PADDING(IP)    =",I10)
 107  FORMAT(23X,"NUMBER OF INDEX LEVELS(NL)  =",I10) 
 110  FORMAT(/" MAXIMUM RECORD LENGTH(MRL) =",I5, 
     +   "   NUMBER OF INDEX LEVELS(NL) =",I3)
 111  FORMAT(" AVERAGE RECORD LENGTH(RL)  =",I5,
     +   "   DATA BLOCK PADDING(DP)     =",I3)
 112  FORMAT(" KEY LENGTH(CHARACTERS)(KL) =",I5,
     +   "   INDEX BLOCK PADDING(IP)    =",I3)
 113  FORMAT(16X,"TOTAL NUMBER OF RECORDS(NR) =",I10,/) 
 400  FORMAT("+",2X,"*",128X,"*") 
 401  FORMAT("+",2X,"*",128X,"*",/3X,"*",128X,"*")
      END 
      SUBROUTINE ESTIMAT
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             ESTIMAT DOES ALL OF THE ACTUAL CALCULATION FOR THE UTILITY
C             RESULTS ARE PLACED IN THE COMMON AREA ANSWERS.
C        ENTRY CONDITIONS : 
C             PARAMS HAS ALL VALUES SET FOR CALCULATION 
C        CALLED ROUTINES :  
C             COLHDPR - TO PRINT COLUMN HEADINGS FOR THE OUTPUT DATA
C             DATAPR - TO PRINT THE CALCULATED RESULTS
C        DEFINED VARIABLES :  
C            TNL - TEMPORARY NUMBER OF INDEX LEVELS 
C             ANSWERS - COMMON BLOCK FOR CALCULATION RESULTS
C                  MBL - MAXIMUM BLOCK LENGTH 
C                  MBLP - MAXIMUM BLOCK LENGTH IN PRUS
C                  DISK - MINIMUM DISK USAGE
C                  RANPER - RANDOM PERFORMANCE
C                  SEQPER - SEQUENTIAL PERFORMANCE
C                  MCAP - MAXIMUM CAPACITY
C                  PCAP - PADDED CAPACITY 
C                  DRB - DATA RECORDS PER BLOCK 
C                  IRB - INDEX RECORDS PER BLOCK
C                  SUGBUFR - SUGGESTED RANDOM BUFFER SIZE 
C                  SUGBUFS - SUGGESTED SEQUENTIAL BUFFER SIZE 
C                  MINBUF - MINIMUM BUFFER SIZE 
C                  SACCESS - SEQUENTIAL ACCESSES PER GET
C                  RACCESS - RANDOM ACCESSES PER GET
C             IOGUESS - SET TO A GOOD GUESS FOR I/O TIME ON 1 RANDOM
C                  ACCESS 
C             TRL - RECORD LENGTH IN WORDS
C             TKL - INDEX RECORD LENGTH IN WORDS
C             GBL - GROSS BLOCK LENGTH : PRELIMINARY MBL IN HALF WORDS
C             TIP - INDEX PAD LENGTH
C             TDP - DATA PAD LENGTH 
C             NIBL - NEW INDEX BLOCK LENGTH, PAD ADJUSTED 
C             NDBL - NEW DATA BLOCK LENGTH, PAD ADJUSTED
C             FIAT, FSTT - LENGTHS OF THESE AAM TABLES
C             NUMBLKS - USED FOR NUMBER OF BLOCKS ON A GIVEN LEVEL
C             BLKS - USED TO ADD UP TOTAL BLOCKS
C             MBLPMAX - MAXIMUM ALLOWABLE BLOCK LENGTH IN PRUS
C             MBLW - MBL IN WORDS 
C             PRUS - LOCAL LOOP VARIABLE FOR MBLP 
C             SMALDSK - THE SMALLEST DISK USAGE ENCOUNTERED SO FAR AT 
C                  A TNL
C             LASTNL - TNL FRON THE LAST TIME THROUGH THE LOOP
C             PAGE - LOCATION IN LINES ON THE PAGE
C             STAR - LOCATION FOR * 
C             DASH - LOCATION FOR - 
C             I - SCRATCH VARIABLE
C        ERROR CONDITIONS : 
C            9) 128 PRU BLOCK AND 15 INDEX LEVELS NOT BIG ENOUGH
C 
  
      IMPLICIT INTEGER(A-Z) 
      COMMON /PARMS/ NR, KL, RL, IP, DP, NL, MRL
      COMMON /ANSWERS/ MBL, MBLP, DISK, RANPER, SEQPER, MCAP, PCAP, DRB,
     +   IRB, SUGBUFR, SUGBUFS, MINBUF, SACCESS, RACCESS
      COMMON /TTYFILE/ TTYFILE
      LOGICAL TTYFILE 
      REAL IOGUESS, SEQPER, SACCESS 
      DATA FSTT /130/, MBLPMAX /128/, PRUS /0/,LASTNL /0/ 
      BESTMBL = 0 
      LASTPER = 0 
      FIAT = 21 + 2*((KL+9)/10) 
      STAR = 1R*
      DASH = 1R-
      TKL = (KL+13)/10
      TRL = (RL+9)/10 
      CALL COLHDPR
      PAGE = 22 
 10   PRUS = PRUS + 1 
      IF(PRUS.GT.MBLPMAX) GOTO 98 
      GBL = (PRUS*64-4)*2 
      TIP = (GBL*IP)/100
      TDP = (GBL*DP)/100
      NIBL = GBL - TIP - 1
      IRB = NIBL/(TKL*2)
      IF(RL.EQ.MRL) GO TO 20
      NDBL = GBL - TDP
      DRB = NDBL/(TRL*2+1)
      GO TO 30
 20   NDBL = GBL - TDP - 1
      DRB = NDBL/(TRL*2)
 30   IF((NDBL*5).LT.(MRL+5)) GO TO 10
      IF(IRB.LT.2) GO TO 10 
      NUMBLKS = (NR+DRB-1)/DRB
      TNL = 0 
 40      NUMBLKS = (NUMBLKS+IRB-1)/IRB
         TNL = TNL + 1
         IF(NUMBLKS.GT.1) GO TO 40
      IF(TNL.LE.NL) GO TO 50
      IF(PRUS.LT.MBLPMAX) GO TO 10
      IF(TNL.GT.15) CALL ERR(9) 
C        START DISK CALCULATION 
 50   NUMBLKS = (NR+DRB-1)/DRB
      BLKS = NUMBLKS
 60      NUMBLKS = (NUMBLKS+IRB-1)/IRB
         BLKS = BLKS + NUMBLKS
         IF(NUMBLKS.GT.1) GO TO 60
      DISK = BLKS*PRUS+2
      IF(LASTNL.NE.TNL) GO TO 70
      IF(SMALDSK.LE.DISK) GO TO 10
      GO TO 90
 70   IF((LASTNL.EQ.0).OR.TTYFILE) GO TO 80 
      PRINT 101, (DASH,I=1,82)
      PRINT 400 
      IF(PAGE.LT.60) PAGE = PAGE + 1
 80   LASTNL = TNL
 90   SMALDSK = DISK
C                  BEGIN CALCULATE OTHER OUTPUT FIELDS
      MBLW = PRUS*64
      MBL = PRUS*640-50 
      MBLP = PRUS 
C                  BEGIN CALCULATE CAPACITIES 
      I = 0 
      IF(RL.NE.MRL) I = 1 
      MCAP = ((NDBL+TDP)/(TRL*2+I))*(((NIBL+TIP)/(TKL*2))**TNL) 
      PCAP = DRB*IRB**TNL 
C                  BEGIN CALCULATE BUFFER SIZES 
      SUGBUFS =(3*MBLW) + FSTT + FIAT 
      SUGBUFR =((TNL+2)*MBLW) + FSTT + FIAT 
      MINBUF  =(2*MBLW) + FSTT + FIAT 
C                  BEGIN CALCULATE PERFORMANCE
      RACCESS = TNL 
      SACCESS = 1.0/FLOAT(DRB)
      IOGUESS = 30 + ( .7 * PRUS) 
      SEQPER = IOGUESS/DRB
      RANPER = IOGUESS*TNL
      IF((BESTMBL.NE.0).AND.(RANPER.GT.(LASTPER * 1.1)))GOTO 94 
        BESTMBL = MBL 
      IF((LASTPER.NE.0).AND.(RANPER.GT.LASTPER))GOTO 94 
        LASTPER = RANPER
 94   CONTINUE
      IF(PAGE.LE.60) GO TO 95 
      PRINT 100, (STAR,I=1,82)
      PRINT 401 
      CALL COLHDPR
      PAGE = 7
 95   CALL DATAPR(TNL)
      PAGE = PAGE + 1 
      GO TO 10
 98   IF(TTYFILE) GOTO 99 
        PRINT 403, LEFTINT(BESTMBL) 
        PRINT 400 
        RETURN
 99   PRINT 402, LEFTINT(BESTMBL) 
  
 100  FORMAT("1  *",23X,82R1) 
 101  FORMAT(27X,82R1)
 400  FORMAT("+",2X,"*",128X,"*") 
 401  FORMAT("+",2X,"*",128X,"*",/3X,"*",128X,"*")
 402  FORMAT(8X,"PROBABLE BEST MBL = ",A10) 
 403  FORMAT(15X,"PROBABLE BEST MBL = ",A10)
      END 
      SUBROUTINE DATAPR(TNL)
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             DATAPR PRINTS THE RESULTS WITH RANGE
C             CHECKING AND FORMAT ADJUSTMENT. 
C        ENTRY CONDITIONS : 
C             ANSWERS HAS ALL CALCULATION RESULTS 
C        CALLED ROUTINES :  
C             LEFTINT - TO TO LEFT JUSTIFY A NUMBER 
C             ERR - TO PROCESS ERRORS 
C        DEFINED VARIABLES :  
C             TNL - FORMAL, USED AS NUMBER OF INDEX LEVELS
C             BUFMAX - MAXIMUM ALLOWABLE BUFFER LENGTH
C             RBMAX - MAXIMUM DATA RECORDS PER BLOCK
C             MAXFLM - MAXIMUM NUMBER OF RECORDS EVER ALLOWED IN A FILE 
C             MESSAGE - AN ARRAY WITH DESCRIPTIONS FOR PASSING TO THE 
C                  ERROR PROCESSER
C             TOP4  - SMALLEST NUMBER TOO BIG FOR A 4  DIGIT FIELD
C             TOP6  - SMALLEST NUMBER TOO BIG FOR A 6  DIGIT FIELD
C             TOP12 - SMALLEST NUMBER TOO BIG FOR A 12 DIGIT FIELD
C        ERROR CONDITIONS : 
C             8) ANSWER TOO LARGE TO PRINT
C 
      IMPLICIT INTEGER(A-Z) 
      DIMENSION MESSAGE(6)
      COMMON /ANSWERS/ MBL, MBLP, DISK, RANPER, SEQPER, MCAP, PCAP, DRB,
     +   IRB, SUGBUFR, SUGBUFS, MINBUF, SACCESS, RACCESS
      COMMON /TTYFILE/ TTYFILE
      LOGICAL TTYFILE 
      REAL SEQPER, SACCESS
      DATA BUFMAX /131000/, RBMAX /4095/, TOP12 /1000000000000/,
     +             TOP6 /1000000/, TOP4 /10000/,
     +             MAXFLM /1073741823/
      DATA MESSAGE /10HDISK USAGE,1H ,10HRANDOM PER,10HFORMANCE  ,
     +             10HSEQ. PERFO,10HRMANCE    / 
  
C                  BEGIN CHECK ANSWERS AGAINST THEIR MAXIMUM VALUES 
      IF(SUGBUFR.GT.BUFMAX) SUGBUFR = BUFMAX
      IF(SUGBUFS.GT.BUFMAX) SUGBUFS = BUFMAX
      IF(MINBUF.GT.BUFMAX) MINBUF = BUFMAX
      IF(DRB.GT.RBMAX) DRB = RBMAX
      IF(PCAP.GT.MAXFLM) PCAP = MAXFLM
      IF(MCAP.GT.MAXFLM) MCAP = MAXFLM
      IF(DISK.GT.TOP12) CALL ERR(8,MESSAGE(1),MESSAGE(2),DISK)
      IF(RANPER.GE.TOP6)  CALL ERR(8,MESSAGE(3),MESSAGE(4),RANPER)
      IF(SEQPER.GE.TOP4) CALL ERR(8,MESSAGE(5),MESSAGE(6),SEQPER) 
C                  BEGIN REFORMAT ALL NUMBERS TO BE PRINTED TO THE RIGHT
C                        OF A / 
      MBLP = LEFTINT(MBLP)
      IRB = LEFTINT(IRB)
      PCAP = LEFTINT(PCAP)
      RANPER = LEFTINT(RANPER)
      SUGBUFR = LEFTINT(SUGBUFR)
      RACCESS = LEFTINT(RACCESS)
      IF(TTYFILE) GO TO 10
      PRINT 301, TNL, MBL, MBLP, DISK, SACCESS, RACCESS, DRB, IRB, MCAP,
     +   PCAP, SUGBUFS, SUGBUFR, MINBUF, SEQPER, RANPER 
      PRINT 400 
      RETURN
 10   PRINT 302, TNL, MBL, MBLP, SEQPER, RANPER, SACCESS, RACCESS,
     +   SUGBUFS, SUGBUFR, MINBUF, MCAP 
  
 301   FORMAT(9X,I2,5X,I5,"/",A3,2X,I12,5X,F5.3,"/",A6,3X,I5,"/",A5,
     +  I10,"/",A10,I6,"/",A6,3X,I6,3X,F5.1,"/",A6) 
 302  FORMAT(3X,I2,I7,"/",A3,F5.1,"/",A5,F5.3,"/",A5,I6,"/",A6,I7,I10)
 400  FORMAT("+",2X,"*",128X,"*") 
      END 
      SUBROUTINE COLHDPR
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             COLHDPR PRINTS THE DATA COLUMN HEADINGS 
C        ENTRY CONDITIONS : 
C             NONE
C        CALLED ROUTINES :  
C             NONE
C        DEFINED VARIABLES :  
C             NONE
C        ERROR CONDITIONS : 
C             NONE
C 
      COMMON /TTYFILE/ TTYFILE
      LOGICAL TTYFILE 
      IF(TTYFILE) GO TO 10
      PRINT 403 
      PRINT 201 
      PRINT 400 
      PRINT 202 
      PRINT 400 
      PRINT 203 
      PRINT 400 
      PRINT 204 
      PRINT 401 
      RETURN
 10   PRINT 210 
      PRINT 211 
      PRINT 212 
      PRINT 213 
      PRINT 214 
  
 201  FORMAT(7X,"NUMBER",2X,"BLOCK       ",2X,"MINIMUM      ",2X, 
     +"AVERAGE      ",2X,"RECORDS     ",4X,"FILE         ",4X,
     +"NON-POOLED   ",2X,"MINIMUM",2X,"844-41 FULL")
 202  FORMAT(7X,"INDEX ",2X,"LENGTH      ",2X,"DISK USAGE   ",2X, 
     +"ACCESSES     ",2X,"PER         ",4X,"CAPACITY     ",4X,
     +"PERF. BUFFER ",2X,"BUFFER ",2X,"TRK. DISK GET")
 203  FORMAT(7X,"LEVELS",2X,"(MBL)       ",2X,"WITH NR      ",2X, 
     +"PER GET      ",2X,"BLOCK       ",4X,"IN RECORDS   ",4X,
     +"SIZE (WORDS) ",2X,"SIZE   ",2X,"TIME APROX.")
 204  FORMAT(7X,"(NL)  ",2X,"(CHARS/PRUS)",2X,"RECORDS(PRUS)",2X, 
     +"(SEQ./RANDOM)",2X,"(DATA/INDEX)",4X,"(MAX./PADDED)",4X,
     +"(SEQ./RANDOM)",2X,"(WORDS)",2X,"(SEQ./RANDOM)")
 210  FORMAT("        BLOCK    844-41      ACCESSES  NON-POOLED " 
     +   "          MAXIMUM ")
 211  FORMAT("  NO.   LENGTH   DISK GET    PER       BUFFER     " 
     +   " MIN.     FILE    ")
 212  FORMAT("  NDX.  (MBL)    TIME EST.   GET       SIZE(WDS)  " 
     +   " BUFFER   CAPACITY")
 213  FORMAT("  LVLS  (CHARS/  (SEQ./      (SEQ./    (SEQ./     " 
     +   " SIZE     IN      ")
 214  FORMAT("  (NL)  PRUS)    RANDOM)     RANDOM)   RANDOM)    " 
     +   " (WORDS)  RECORDS ",/)
 400  FORMAT("+",2X,"*",128X,"*") 
 401  FORMAT("+",2X,"*",128X,"*",/3X,"*",128X,"*")
 403  FORMAT(3X,"*",128X,"*",/3X,"*",128X,"*")
      END 
      INTEGER FUNCTION LEFTINT(NUM) 
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             THE FUNCTION LEFTINT TAKES AN INTEGER AND RETURNS ITS 
C             DISPLAY CODE EQUIVALENT LEFT JUSTIFIED IN A WORD. 
C        ENTRY CONDITIONS : 
C             NUM CONTAINS THE INTEGER TO BE REFORMATTED
C        CALLED ROUTINES :  
C             NONE
C        DEFINED VARIABLES :  
C             NUM - FORMAL, USED TO PASS THE INTEGER
C             TMP, I - SCRATH VARIABLES 
C        ERROR CONDITIONS : 
C             NONE
C 
      IMPLICIT INTEGER(A-Z) 
      ENCODE(10,700,LEFTINT) NUM
      DO 10 I = 1,10
         TMP = MASK(6).AND.LEFTINT
         IF((TMP.LE.1L9).AND.(TMP.GE.1L0)) RETURN 
         LEFTINT = SHIFT(LEFTINT,6) 
 10      CONTINUE 
 700  FORMAT(I10) 
      END 
      SUBROUTINE ERR(NUM,WORD1,WORD2,WORD3) 
C             R. CLIFTON               JANUARY 1979 
C 
C        PURPOSE :  
C             ERR IS THE ERROR ROUTINE. DEPENDING ON THE ERROR, IT
C             WILL :  
C                  1) STOP EXECUTION AFTER PRINTING A MESSAGE ABOUT 
C                       THE ERROR AND FINISHING THE * BOX 
C                  2) RETURN AFTER PRINTING A MESSAGE ABOUT THE ERROR 
C        ENTRY CONDITIONS : 
C             NUM CONTAINS THE ERROR NUMBER. WORD1, IF USED, CONTAINS 
C             AN IDENTIFIER OF THE PROBLEM CAUSE. WORD2, IF USED, 
C             CONTAINS A LIMIT VALUE
C        CALLED ROUTINES :  
C             NONE
C        DEFINED VARIABLES :  
C             NUM, WORD 1/2/3   - FORMALS, USED TO DESCRIBE THE ERROR 
C             PROB - IDENTIFIER OF THE PROBLEM
C             STAR - LOCATION FOR * 
C             TMP - SCRATCH VARIABLE
C        ERROR CONDITIONS : 
C             NONE
C 
      IMPLICIT INTEGER(A-Z) 
      COMMON /TTYFILE/ TTYFILE
      LOGICAL TTYFILE 
      STAR = 1R*
      IF(.NOT.TTYFILE) PRINT 403
      GO TO (1, 2, 3, 4, 5, 6, 7, 8, 9), NUM
  
 1    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 11
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 12
      GO TO 500 
  
 2    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 21
      GO TO 500 
  
 3    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 31
      GO TO 500 
  
 4    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 41
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 42
      GO TO 450 
  
 5    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 51
      GO TO 450 
  
 6    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 61
      GO TO 425 
  
 7    PRINT 10
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 71
      GO TO 425 
  
 8    PRINT 80
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 81, WORD1, WORD2
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 82,WORD3
      IF(.NOT.TTYFILE) PRINT 401
      RETURN
  
 9    PRINT 90
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 91
      GO TO 500 
  
C                  BEGIN PRINT LIMIT VALUE
 425  IF(.NOT.TTYFILE) PRINT 400
      PRINT 30, WORD2 
C                  BEGIN PRINT PROBLEM WORD 
 450  PROB = 0
      DO 475 I = 1,10 
         TMP = SHIFT((MASK(6).AND.WORD1),6) 
      WORD1 = SHIFT(WORD1,6)
         IF(TMP.EQ.0) TMP = 1R
         PROB = SHIFT(PROB,6).OR.TMP
 475     CONTINUE 
      IF(.NOT.TTYFILE) PRINT 400
      PRINT 20, PROB
C                  BEGIN CLOSE UP THE BOX 
 500  IF(.NOT.TTYFILE) PRINT 401
C                  BEGIN PRINT BOTTOM OF BOX
 50   IF(.NOT.TTYFILE) PRINT 101, (STAR,I=1,130)
      STOP  " ERROR " 
  
 10   FORMAT(11X,"ERROR ON CONTROL CARD") 
 11   FORMAT(11X,"A PARAMETER VALUE HAS MORE THAN 10 DIGITS") 
 12   FORMAT(11X,"OR A NUMBER HAS BEEN USED AS A KEYWORD")
 21   FORMAT(11X,"A KEYWORD CONTAINS NON-ALPHABETIC CHARACTERS")
 31   FORMAT(11X,"A VALUE CONTAINS NON-NUMERIC CHARACTERS") 
 41   FORMAT(11X,"A KEYWORD PARAMETER IS UNRECOGNIZED") 
 42   FORMAT(11X,"ALLOWABLE KEYWORDS ARE NR, KL, RL, IP, DP, NL, MRL.") 
 51   FORMAT(11X,"THERE IS A DUPLICATE PARAMETER")
 61   FORMAT(11X,"A PARAMETER VALUE IS TOO LARGE")
 71   FORMAT(11X,"A PARAMETER VALUE IS TOO SMALL")
 20   FORMAT(11X,"PROBLEM DETECTED ON ",A10)
 30   FORMAT(11X,"THE LIMIT VIOLATED BY THIS PARAMETER IS ",I10)
 80   FORMAT(11X,"*** A PARAMETER EXCEEDED PRINTABLE SIZE - IT HAS BEEN"
     +        ," * FILLED IN THE TABLE ***")
 81   FORMAT(11X,"*** THE PARAMETER GAVE INFORMATION ON ",
     +        2A10,18X,"***") 
 82   FORMAT(11X,"*** THE OVERSIZE VALUE WAS ",I18,31X,"***") 
 90   FORMAT(11X,"CANNOT FIND A LEGAL BLOCK SIZE WHERE NL=15 OR LESS")
 91   FORMAT(11X,"PLEASE CHECK INPUT PARAMETERS") 
 101  FORMAT(3X,130R1)
 400  FORMAT("+",2X,"*",128X,"*") 
 401  FORMAT("+",2X,"*",128X,"*",/3X,"*",128X,"*")
 403  FORMAT(3X,"*",128X,"*",/3X,"*",128X,"*")
      END 
