!*
!* Amended 30th June 1982 to get MAXPAGE from properties table.
!*
!
! REVISED VERSION 19MAR79 TO KEEP DISC QUEUES FULL ALL THE TIME
! FOR TESTING QUEUEING EFFICENCY AS WELL AS HARDWARE
!
CONSTSTRING (23) VERSION = "Vsn 30th March 1983
"
RECORDFORMAT PF(INTEGER DEST, SRCE, P1, P2, P3, P4, P5, P6)
RECORDFORMAT COMF(INTEGER OCPTYPE,SLIPL,SBLKS,SEPGS,NDISCS,DLVNADDR, C
(INTEGER GPCTABSIZE,GPCA OR INTEGER DCUTABSIZE,DCUA), C
INTEGER SFCTABSIZE,SFCA,SFCK,DIRSITE, C
DCODEDA,SUPLVN,TOJDAY,DATE0,DATE1,DATE2, C
TIME0,TIME1,TIME2,EPAGESIZE,USERS,CATTAD,SERVAAD, C
BYTEINTEGER NSACS,RESV1,SACPORT1,SACPORT0, C
NOCPS,RESV2,OCPPORT1,OCPPORT0,INTEGER ITINT,CONTYPEA, C
(INTEGER GPCCONFA OR INTEGER DCUCONFA), C
INTEGER FPCCONFA,SFCCONFA,BLKADDR,RATION, C
(INTEGER SMACS OR INTEGER SCUS), C
INTEGER TRANS,LONGINTEGER KMON, C
INTEGER DITADDR,SMACPOS,SUPVSN,PSTVA,SECSFRMN,SECSTOCD, C
SYNC1DEST,SYNC2DEST,ASYNCDEST,MAXPROCS,INSPERSEC,ELAPHEAD, C
COMMSRECA,STOREAAD,PROCAAD,SFCCTAD,DRUMTAD,TSLICE,FEPS, C
MAXCBT,PERFORMAD,SP1,SP2,SP3,SP4,SP5,SP6, C
LSTL,LSTB,PSTL,PSTB,HKEYS,HOOT,SIM,CLKX,CLKY,CLKZ, C
HBIT,SLAVEOFF,INHSSR,SDR1,SDR2,SDR3, C
SDR4,SESR,HOFFBIT,BLOCKZBIT,BLKSHIFT,BLKSIZE,END)
RECORDFORMAT DDTFORM(INTEGER SER,PTS,PROPADDR); ! minimal DDT format
RECORDFORMAT PROPFORM(INTEGER TRACKS,CYLS,PPERTRK,BLKSIZE, C
TOTPAGES,RQBLKSIZE,LBLKSIZE,ALISTSIZE,KEYLEN,SECTINDX)
CONSTRECORD (COMF)NAME COM=X'80C00000'
!*
CONSTINTEGER MAXLVN = 99
CONSTINTEGER READPAGEDEST = X'00210001'
CONSTINTEGER GETPAGEDEST = X'50000'
CONSTINTEGER RETURNPAGEDEST = X'60000'
CONSTINTEGER MAXQUEUE = 128; !MAX VALUE OF QUEUE
CONSTINTEGER MAXTOTAL QUEUE = 256; !MAX VALUE OF DISKS*QUEUE
CONSTINTEGER MAXDISKS = 8
EXTERNALROUTINESPEC DOUT(RECORD (PF)NAME P)
EXTERNALROUTINESPEC DPON(RECORD (PF)NAME P)
EXTERNALROUTINESPEC DPOFF(RECORD (PF)NAME P)
EXTERNALROUTINESPEC PROMPT(STRING (15) S)
EXTERNALROUTINE RANDREAD(STRING (255) S)
INTEGER LOOP, DISKS, QUEUE, L, D, Q, ITERATIONS, I, CDEX
INTEGER ABUFFER, TOTALFAULTS, FDEV, TOTPONNED, TOTPOFFED
INTEGERARRAY LVN,MAXPAGES,FAULT(1 : MAXDISKS)
INTEGERNAME MAXPAGE
RECORD (DDTFORM)NAME DDT
RECORD (PROPFORM)NAME PROP
RECORD (PF) P
ROUTINE FAIL(STRING (255) S)
PRINTSTRING(S)
NEWLINE
STOP
END ; !OF FAIL
INTEGERFN NEXTRAND
INTEGER I
OWNINTEGER RCONST = 1234567
*LSS_RCONST
*IMYD_65539
*STUH_B
*AND_X'7FFFFFFF'
*ST_I
*ST_RCONST
RESULT = I-(I//MAXPAGE)*MAXPAGE
END ; !OF NEXTRAND
ROUTINE PONREAD(INTEGER DEV)
RECORD (PF) P
P = 0
P_DEST = READPAGEDEST
P_P1 = (M'RRR'<<8)!DEV
P_P2 = DEV<<24!NEXTRAND
P_P3 = ABUFFER
DPON(P)
TOT PONNED=TOT PONNED+1
END ; !OF PONREAD
PRINTSTRING(VERSION)
!*
!CLEAR OUT FAULT RECORDS
!*
TOTALFAULTS = 0
CYCLE D = 1,1,MAXDISKS
FAULT(D) = 0
REPEAT
!FIRST READ IN NO OF DISKS AND THEIR LVNS
PROMPT("No. of disks:")
READ(DISKS)
UNLESS 0 < DISKS <= MAXDISKS C
THEN FAIL("Invalid no. of disks")
PROMPT("Disk lvns:")
CYCLE D = 1,1,DISKS; !NOW READ IN THEIR LVNS
READ(LVN(D))
UNLESS 0 <= LVN(D) <= MAXLVN C
THEN FAIL("Invalid disk number")
IF D > 1 START ; !CHECK FOR DUPLICATE DISKS
CYCLE I = 1,1,D-1
IF LVN(D) = LVN(I) THEN FAIL( C
"Duplicate disk specified")
REPEAT
FINISH
I=BYTEINTEGER(COM_DLVNADDR+LVN(D))
IF I>=COM_NDISCS THEN FAIL("Disc not avaliable")
DDT==RECORD(INTEGER(COM_DITADDR+4*I))
PROP==RECORD(DDT_PROPADDR)
MAXPAGES(D)=PROP_TOTPAGES
REPEAT
!NOW READ IN Q SIZE
PROMPT("Qs per disk:")
READ(QUEUE)
UNLESS 0 < QUEUE <= MAXQUEUE C
THEN FAIL("Invalid queue size")
IF QUEUE*DISKS > MAXTOTAL QUEUE C
THEN FAIL("Total queue too large")
!NOW READ IN NO OF READS
AGAIN:
PROMPT("reads/disk:")
READ(ITERATIONS)
IF ITERATIONS < 1 THEN FAIL("Invalid no. of reads")
LOOP = ITERATIONS*DISKS
TOT PONNED = 0
TOT POFFED = 0
!NOW GET A PAGE
P = 0; !CLEAR RECORD
P_DEST = GETPAGEDEST
DOUT(P)
CDEX = P_P2; !USED FOR RETURN PAGE
ABUFFER = P_P4
!*
!NOW DO THE READS
!*
CYCLE Q = 1,1,QUEUE
CYCLE D = 1,1,DISKS
MAXPAGE==MAXPAGES(D)
PONREAD(LVN(D))
REPEAT
REPEAT
CYCLE
DPOFF(P)
FDEV = P_P1&X'FF'; !DEVICE NO IN BOTTOM BYTE OF P1
FOR D=1,1,DISKS CYCLE
EXIT IF LVN(D)=FDEV
REPEAT
IF P_P2 # 0 START ; !A FAULT HAS OCCURRED
TOTAL FAULTS = TOTAL FAULTS+1
FAULT(D) = FAULT(D)+1
FINISH
TOT POFFED = TOT POFFED +1
EXIT IF TOT POFFED = LOOP
MAXPAGE==MAXPAGES(D)
PONREAD(FDEV) IF TOT PONNED < LOOP
REPEAT
!*
!NOW PRINT OUT FAULT INFO IF ANY
!*
IF TOTALFAULTS > 0 START
PRINTSTRING("Total fault record")
NEWLINE
PRINTSTRING("Lvn faults")
NEWLINE
CYCLE D = 1,1,DISKS
IF FAULT(D) > 0 START
WRITE(LVN(D),1)
WRITE(FAULT(D),6)
NEWLINE
FINISH
REPEAT
FINISH ELSE PRINTSTRING("No faults
")
PROMPT("More Y/N:")
SKIPSYMBOL WHILE NEXTSYMBOL = NL OR NEXTSYMBOL = ' '
READSYMBOL(I)
IF I = 'Y' START
SKIPSYMBOL WHILE NEXTSYMBOL # NL ; !SKIP REST OF LINE IN CASE REPLY WAS 'YES'
-> AGAIN
FINISH
!*
!NOW RETURN PAGE
P = 0
P_DEST = RETURNPAGEDEST
P_P2 = CDEX
DPON(P)
PRINTSTRING("Test ends
")
END ; !OF RANDREAD
ENDOFFILE