1	!

	!	S T A T S


2!		PROGRAM		: STATS
5!		VERSION		: 6B
6!		EDIT		: 07
7!		EDIT DATE	: 17-FEB-77
8!
9!		AUTHOR		: MARTIN MINOW/MARK BRAMHALL

20	!


	!	M O D I F I C A T I O N    H I S T O R Y



21!	VER/ED		EDIT DATE	REASON
  !
100	!


	!	G E N E R A L    D E S C R I P T I O N 



110	! PARAMETER LINE: OUTPUT <DEFAULT>? FILE/FLAGS
	! "FILE" DEFAULTS TO KB: AND FLAGS MAY BE AS FOLLOWS:
	!	TERMINAL TYPE:
	!		/VT05	/VT50	/VT52	/SPEC	/TTY
	!			DEFAULT: /TTY
120	!	STATISTICS DESIRED:
	!		/JOB	/DISK	/BOTH	/TOTAL	/INCR
	!			DEFAULT: /BOTH (VT50 FLIPS DISPLAY)
	!			DEFAULT: INCREMENTAL STATISTICS
130	!	OTHER FLAGS:
	!		/SL:NN	/DET
	!			DEFAULT: 60 SECONDS SLEEP, NO DETACHING
	!			/SL:0 MEANS "PRINT ONE STATS REPORT
	!			NOTE: YOU MUST BE PRIVILEGED TO DETACH.

210	! CHANGE THE NEXT LINE TO CHANGE THE DEFAULT PARAMETER LINE
	!

220	DATA	"KB:STATS.LST/TTY/INCR/BOTH/SL:60"

300	!


	!	I / O    C H A N N E L S 



301!	CHANNEL #		USED FOR
   !
310!		1		STATISTICS OUTPUT
800	!


	!	F U N C T I O N / S U B R O U T I N E    D E S C .



801!	FUNCTION/SUBROUTINE		USE
   !
810!	FND(C%,U%,I%)	GET DISK BUFFER DATA:
		C%	WHICH BUFFER
		U%	WHICH DISK DEV/UNIT
		I%	WHAT TYPE OF TRANSFER
	FND$(L%)	PRINT DISK DATA ENTRY:
		L%	WHICH ENTRY
	FND1$(Q%)	PRINT ACCESS/BLOCK INFORMATION
		Q%	1=BLOCK, 0=ACCESS
	FNN$(Q%)	RETURN DATE STRING FROM LOW-CORE
		Q%	WHERE IN LOW-CORE IT IS
820!	FNP(Q%)		GET 32-BIT STATISTICS BUFFER ENTRY:
		Q%	OFFSET FROM BASE P%
	FNP0(Q%)	GET 16-BIT UNSIGNED STATISTICS BUFFER ENTRY:
		Q%	ADDRESS TO PEEK AT
	FNP$(T%,Q,D)	PRINT PERCENTAGE DATA:
		T%	WHERE TO TAB TO
		Q	VALUE AS A PERCENT
		D	WHAT IT'S A PERCENT OF
	FNR$(T%,V,S%)	PRINT A NUMERIC VALUE:
		T%	WHERE TO TAB TO
		V	WHAT TO PRINT
		S%	PRINTED RIGHT-JUSTIFIED IN THIS FIELD
	FNR1$(T%,V,S%)	PRINT A VALUE WITH 2 DECIMAL PLACE
		T%	WHERE TO TAB TO
		V	WHAT TO PRINT
		S%	PRINTED RIGHT-JUSTIFIED IN THIS FIELD
830!	FNS%(K$,K%)	COMMAND-LINE STRING SEARCH:
		K$	SWITCH NAME
		K%	VALUE TO RETURN IF THERE
	FNS0%(K$,K%)	COMMAND-LINE STRING SEARCH (VALUE ARG.)
		K$	SWITCH NAME
		K%	DEFAULT IF NOT THERE
	FNT		EXACT TIME OF DAY IN FLOATING SECONDS
	FNN$(Q%)	DD-MMM-YY HH:MM:SS
		Q%	STARTING PEEK ADDRESS
	FNV%		TRUE IF PRINTING JOB STATISTICS NOW
	FNX(Q%)		GET INCREMENTAL TABLE VALUE:
		Q%	MONITOR TABLE ENTRY
900	!


	!	D I M E N S I O N    S T A T E M E N T S



910	DIM T(100), D(5,4), X(5,4), V%(5), D$(5), H0%(30%), H1%(30)
		!T()	OLD CPU DATA FOR INCREMENTAL STATISTICS
		!D()	OLD DISK DATA (AT LAST PROBE)
		!X()	NEW DISK DATA (AT THIS PROBE)
		!V%()	DISK REMAPPING VECTOR
		!D$()	DISK OUTPUT LABELING
		!H0%()	MONITOR TABLES, PART 1
		!H1%()	MONITOR TABLES, PART 2
999	!


	!	M A I N    C O D I N G    A R E A



1000	!

	!	G E T   P A R A M E T E R S   A N D   S E T U P


1010	PRINT "STATS"; CHR$(9%); "V06B-07"; CHR$(9%);
		CVT$$(RIGHT(SYS(CHR$(6%)+CHR$(9%)+CHR$(0%)),3%),4%)
		!INITIAL SIGN-ON

1020	P7%=PEEK(PEEK(156%))\ U9%=PEEK(P7%) AND 255%
	\P8%=PEEK(PEEK(156%)+2%)\ P9%=PEEK(PEEK(156%)+6%)\ H=PEEK(P8%)
		!P7% -> DISK
		!P8% -> JOB 
		!P9% -> CACHE
		!U9% := DISKS
		!H   := TICKS/SECOND

1030	IF (P7% OR P8%) = 0% THEN
	  PRINT "?No statistics configured on this system"
	  \GOTO 32767
		!MUST HAVE JOB, DISK BUFFERS SYSGEN'D IN

1040	RESTORE\ READ Q$\ PRINT "Output <";Q$;">";
	\INPUT LINE O0$\ O0$=CVT$$(O0$,-1%)\ O0$=Q$ UNLESS LEN(O0$)<>0%
		!GET CONSOLE INPUT LINE, SET UP FOR DEFAULT IF
		!<CR> WAS TYPED

1050	S%=FNS0%("SL",60%)\ K0%=FNS%("DET",1%)
	\I9%=FNS%("TOTAL",-1%) OR FNS%("INCR",0%)
	\T9%=FNS%("VT05",1%) OR FNS%("VT50",2%) OR FNS%("VT52",3%)
			OR FNS%("SPEC",4%) OR FNS%("TTY",0%)
		!GET SLEEP, DETACH, STATISTICS, AND OUTPUT TYPE

1060	T8%=FNS%("JOB",1%) OR FNS%("DISK",2%) OR FNS%("BOTH",3%)
	\ON T9%+1% GOSUB 20010,20020,20030,20030,20040
	\T8%=3% UNLESS T8%\ T7%=0%\ T6%=(T8%=3%) AND (T9%=2%)
		!GET STATISTICS FLAGS AND VT52 FLAG.
		!SETUP <HOME> AND <CLEAR SCREEN>
1070	X(V%,I%)=0.0 FOR I%=0% TO 4% FOR V%=0% TO 5%
	\READ V%(I%) FOR I%=0% TO 5%\ READ D$(I%) FOR I%=0% TO 5%
		!X()	DISK STATS BUFFER
		!V%()	MAPPING VECTOR
		!D$()	TITLES

1080	DATA	2,0,3,3,1,3,
		"User data","Directory"," Swapping",
		"Other Sys","  All Sys","  All I/O"

1090	T(Q%)=0.0 FOR Q%=0% TO 100%
	\CHANGE SYS(CHR$(6%)+CHR$( -3%)) TO H0%
	\CHANGE SYS(CHR$(6%)+CHR$(-12%)) TO H1%
	\H0%(Q%)=H0%(Q%)+SWAP%(H0%(Q%+1%)) FOR Q%=5% TO 29% STEP 2%
	\H1%(Q%)=H1%(Q%)+SWAP%(H1%(Q%+1%)) FOR Q%=3% TO 29% STEP 2%
	\O%=1%\ O0$="KB:STATS.LST" UNLESS LEN(O0$)\ GOSUB 20050
		!T()	JOB STATS
		!H0%()	-> STSTEM STUFF
		!H1%()	-> SYSTEM STUFF
		!SET OUTPUT UNIT NUMBER AND OPEN IT

1100	IF K0%>0% THEN
	  GOSUB 25000
	  \Q$=SYS(CHR$(6%)+CHR$(7%))
	  \GOSUB 25100
		!DETACH
		!NOTE:  DROP TEMP. PRIVILEGES FIRST

1110	PRINT #O%, Z0$; Z1$;\ S1%=-1%
	\ON ERROR GOTO 19000\ Q$=SYS(CHR$(6%)+CHR$(-7%))
		!CLEAR SCREEN, SETUP ERROR HANDLER
		!AND TRAP CTRL/C'S
2000	!

	!	D O   T H E   W O R K


2010	GOSUB 3000\ GOSUB 10000
	\IF S1% THEN S0%=S% ELSE S0%=S%-(INT(S0+0.5)-S0%)
		!COLLECT STATISTICS AND PRINT THEM
		!S0%	SLEEP TIME NEXT TIME

2020	GOSUB 2200
	\IF S%=0% THEN CLOSE O%\ GOTO 32767
		!ABSORB ANY TYPING
		!EXIT (AFTER PRINTING) IF NO SLEEPING

2030	T=FNT\ SLEEP S0%\ T=FNT-T-S0%\ T=0.0 IF T<0.15
	\GOSUB 2200\ GOTO 2010
		!WAIT A WHILE, THEN GO DO THE STATISTICS.
		!T	"RESPONSE TIME".
		!NOTE: T WILL BE LESS THAN ZERO IF THE
		!JOB WAS AWAKENED EARLY (TERMINAL TYPED SOMETHING).
		!WE ALSO IGNORE VERY SMALL VALUES (ONE TICK)

2100	!

	!	T R Y   F O R   T E R M I N A L   I N P U T


2200	S1%=0%
	\IF O1%>=0% THEN
	  GET#O%, RECORD 8192%
	  \S1%=-1%\ T7%= NOT T7%\ T5%=T6%
		!TRY TO GET SOME INPUT, IF YOU DO,
		!SET "AWAKENED" FLAG, FLIP VT50 DISPLAY FLAG

2210	RETURN
		!RETURN HERE (FROM ERROR HANDLER, TOO)
3000	!

	!	C O L L E C T   J O B   S T A T I S T I C S


3010	P%=P8%			! START WITH JOB STATISTICS
3020 !	H=PEEK(P%)		! TICKS PER SECOND
3030	U=FNX(2%)		! UPTIME (TICKS)
3040	B%=PEEK(P%+6%)		! SMALL BUFFERS MINIMUM COUNT
3050	S=FNX(8%)		! LEVEL 3 ACCOUNTED (TICKS)
3060	L=FNX(12%)		! LOST (TICKS)
3070	O=FNX(16%)		! LEVEL 3 UNACCOUNTED (TICKS)
3080	N=FNX(20%)		! NULL (TICKS)
3090	Q%=PEEK(H1%(13%))
	\J0%=Q% AND 255%	! CURRENT NUMBER OF ACTIVE JOBS
3100	J1%=SWAP%(Q%) AND 255%	! CURRENT MAXIMUM NUMBER OF JOBS
3110	E1=FNP0(H1%(11%))	! HUNG TERMINALS
3120	E2=FNP0(H1%(17%))-E1	! REAL ERRORS (EXCLUDING HUNG TERMINALS)
3130	F0=FNX(24%)		! FIP DESIRED
3140 !	F1=FNX(28%)		! FIP NOT RUNNING
3150	F2=FNX(32%)		! FIP WAITING
3160 !	F3=FNX(36%)		!	FOR CODE
3170 !	F4=FNX(40%)		!	FOR DISK
3180 !	F5=FNX(44%)		!	FOR SAT
3190 !	F6=FNX(48%)		!	FOR OTHER
3200	L0=FNX(52%)		! PR0
3210	L1=FNX(56%)		! PR1
3220	L2=FNX(60%)		! PR2
3230	L3=FNX(64%)		! PR3
3240	L4=FNX(68%)		! PR4
3250	L5=FNX(72%)		! PR5
3255 REM K8%=PEEK(P%+102%)	!  # TIMES AT PR6 OR PR7 (IN-HOUSE)
3260	K9%=PEEK(P%+76%)	! KW11P OVERRUNS
3270 !	C0=FNX(78%)		! PR0 CACHE CODE
3280 !	C1=FNX(82%)		! PR1 CACHE CODE
3290 !	C2=FNX(86%)		! PR2 CACHE CODE
3300	C3=FNX(90%)		! PR3 CACHE CODE
3310	C4=FNX(94%)		! PR4 CACHE CODE
3320	C5=FNX(98%)		! PR5 CACHE CODE
3330	P%=P9%
	\GOTO 4010 UNLESS P%	! DO IF CACHE CODE
3340	H0=FNP(0%)		! CACHE ATTEMPTS
3350	H1=FNP(8%)		! CACHE HITS
3360	H4=H0-H2		! INCREMENTAL ATTEMPTS
3370	H5=H1-H3		! INCREMENTAL HITS
3380	H2=H0\ H3=H1		! GET NEW "PREVIOUS" VALUES
3390 !	H6%=PEEK(P%+16%)	! RESTARTS
3400	H7%=PEEK(P%+18%)	! SMALL BUFFER CACHE NODES
3410	H8%=PEEK(P%+20%)	! EXTENDED BUFFER CACHE NODES

4000	!

	!	C O L L E C T   D I S K   S T A T I S T I C S


4010	GOTO 4050 UNLESS P7%\ P%=P7%+2%
	\IF I9%
	  THEN D(V%,I%)=0.0	FOR I%=0% TO 4% FOR V%=0% TO 5%
	  ELSE D(V%,I%)=X(V%,I%)FOR I%=0% TO 4% FOR V%=0% TO 5%
		!D()	PREVIOUS TRIAL'S DATA

4020	X(V%,I%)=0.0		FOR I%=0% TO 4% FOR V%=0% TO 5%
	\X(V%(C%),I%)=X(V%(C%),I%)+FND(C%,U%,I%)
				FOR U%=0% TO U9%-1%
				FOR I%=0% TO 3%
				FOR C%=0% TO 5%
		!COLLECT DISK STATS
		!U%	DISK UNIT NUMBER
		!I%	ACCESS TYPE (READ/WRITE)
		!C%	PROCESS TYPE (SWAP, ETC.)

4030	X(5%,I%)=X(5%,I%)+X(V%,I%) FOR I%=0% TO 3% FOR V%=0% TO 3%
	\X(4%,I%)=X(5%,I%)-X(0%,I%) FOR I%=0% TO 3%
	\D(V%,I%)=X(V%,I%)-D(V%,I%) FOR I%=0% TO 3% FOR V%=0% TO 5%
		!GET DISK GROUP DATA AND SUMS
		! DISK DATA IS STORED IN D(V%,I%) WHERE
		!	V%			I%
		!	0 USER			0 READ  ACCESSES
		!	1 DIRECTORY		1 READ  BLOCKS
		!	2 SWAPS			2 WRITE ACCESSES
		!	3 OTHER SYS ACTION	3 WRITE BLOCKS
		!	4 TOTAL SYS I/O
		!	5 TOTAL I/O

4050	RETURN			! END OF STATISTICS
10000	!

	!	P R I N T   F I R S T   T E N   L I N E S


10010	U1=U-N\ U3=L3+L4+L5\ U2=L0+L1+L2+U3\ U4=U-L-O-N\ S0=U/H
		!U1	TOTAL LESS NULL JOB
		!U2	TOTAL PRIORITY 0-5
		!U3	TOTAL EXEC. PRIORITY 3-5
		!U4	UNCHARGED (TOTAL-LOST-UNCH.MON-NULL)
		!S0	SECONDS = TICKS/HERTZ

10020	PRINT #O%, Z2$;FNN$(512%);FNR$(0%,S0,15%);" Seconds";
		FNR$(0%,E2,7%);" Errors";FNR$(0%,E1,7%);" Hung TTY"

10030	GOSUB 22040
	\PRINT #O%, SPACE$((11%-LEN(Q$))/2%);Q$;" Uptime";
		" ";NUM1$(J0%)+"/"+NUM1$(J1%);" Jobs";
	\PRINT #O%, ",";FNR1$(0%,T,6%);" Swap in"; UNLESS S1%
	\PRINT #O%,FNR$(42%,B%,6%);" Minimum Small Buffers"

10040	PRINT #O%, Z1$;CHR$(13%); IF T5%\ T5%=0%
	\GOTO 12010 UNLESS FNV%
	\PRINT #O%, TAB(13%);"System Operation Statistics";
		TAB(49%);"Cache/Fip Statistics"

10050	PRINT #O%,
	  TAB( 7%);"Including Idle Time  Excluding Idle Time";
	  FNR$(47%,H7%,7%);" Monitor Nodes"

10060	PRINT #O%,
	  TAB( 8%);"Charged  Uncharged   Charged Uncharged";
	  FNR$(47%,H8%,7%);" XBUF Nodes"

10070	PRINT #O%,"   Idle ";FNP$(18%,N,U);
		FNP$(47%,H5,H4);"Incremental Hits"

10080	PRINT #O%,"   Lost ";FNP$(18%,L,U);FNP$(38%,L,U1);
		FNP$(47%,H1,H0);"Running Sum Hits"

10090	PRINT #O%,"   User ";FNP$(0%,U4-S,U);FNP$(29%,U4-S,U1);
		FNP$(47%,C3+C4+C5,U);"Cache CPU Usage"

10100	PRINT #O%," System ";FNP$(0%,S,U);FNP$(18%,O,U);FNP$(29%,S,U1);
		FNP$(38%,O,U1);FNP$(47%,F0,U);"FIP Desired"

10110	PRINT #O%,"  Total ";FNP$(0%,U4,U);FNP$(18%,O+L+N,U);FNP$(29%,U4,U1);
		FNP$(38%,O+L,U1);FNP$(47%,F2,U);"FIP Waiting"

10120 REM IF K8%<>0% THEN
	  PRINT #O%, FNR$(4%,K8%,7%);" Ticks at PR6/PR7";
		!PRINT PR6/PR7 TICKS IF THERE ARE ANY	IN-HOUSE ONLY

10130	IF K9%<>0% THEN
	  PRINT #O%, FNR$(25%,K9%,7%);" KW11P Overruns";
	! PRINT #O%, " (";FNN$(P8%+104%);")";		IN-HOUSE ONLY
		!PRINT OVERRUNS ONLY IF THERE ARE ANY

10190	IF ((T8% AND 2%) = 0%) OR T6%
	  THEN GOTO 13000 ELSE PRINT #O%\ PRINT #O%
		!END OF PART 1
12000	!

	!	P R I N T   L A S T   N I N E   L I N E S


12010	PRINT #O%,	TAB(13%);"CPU Status";
			TAB(29%);"Disk Status for all Disks";
			TAB(59%);"Xfer Percent"

12020	PRINT #O%,	TAB(11%);"Total    Exec   Process ";
			 "  Block/Sec  Xfer/Sec  Reads   Total"

12030	PRINT #O%,"User Job ";FNP$(0%,L0,U2); FND$(0%)

12040	PRINT #O%,"CPU Idle ";FNP$(0%,L1,U2); FND$(1%)

12050	PRINT #O%,"(Unused) ";FNP$(0%,L2,U2); FND$(2%)

12070	PRINT #O%,"Monitor  ";FNP$(0%,L3,U2);FNP$(0%,L3,U3); FND$(3%)

12080	PRINT #O%,"Slow I/O ";FNP$(0%,L4,U2);FNP$(0%,L4,U3); FND$(4%)

12090	PRINT #O%,"Fast I/O ";FNP$(0%,L5,U2);FNP$(0%,L5,U3); FND$(5%);

13000	PRINT #O%, Z1$;Z0$;\ RETURN
		!DONE, GO TO HOME AND EXIT
19000	!

	!	E R R O R   P R O C E S S I N G


19010	IF ERR=28% THEN
	  Q$=SYS(CHR$(6%)+CHR$(-7%))\ RESUME 19100
		!CTRL/C TRAPPED

19020	RESUME   2210 IF ERL= 2200%
	\RESUME 19120 IF ERL=20050% AND K0%<0%
		!HANDLE "NO TERMINAL INPUT" WHEN DISPLAYING
		!AND "FILE OPEN" ERROR WHEN REATTACHING

19090	PRINT "FATAL ERROR";ERR;", AT LINE";ERL;", TRAPPED AT";LINE
	\ON ERROR GOTO 0
		!FATAL STOP

19100	CLOSE O%\ GOTO 32767 IF O1%<0%
	\Q$=SYS(CHR$(6%)+CHR$(-5%)+CHR$(O1%)+Z0$+Z1$+
		CHR$(13%)+"    The terminal is all yours now."+
		CHR$(13%)+CHR$(10%)+CHR$(10%))
		!EXIT UNLESS OUTPUT IS ON A KB:

19120	K0%=-1%\ CLOSE O%
		!PREPARE FOR RESTART

19130	Q%=PEEK(PEEK(PEEK(520%)))
	\IF (PEEK(518%) AND 255%) <> (PEEK(Q%+O%+O%) AND 255%)
		OR (PEEK(Q%+6%) AND 8192%) = 0%
	  THEN SLEEP 15%\ GOTO 19150
		!Q% -> CONSOLE KB: DDB
		!IF SOMEONE ELSE OWNS IT OR IT'S NOT A CONSOLE
		!WAIT A WHILE

19140	O1%=SWAP%(PEEK(Q%+2%)) AND 255%
	\INPUT "Continue detached"; Q$
	\GOTO 32767 UNLESS CVT$$(LEFT(Q$,1%),-1%) = "Y"
	\GOSUB 25000\ Q$=SYS(CHR$(6%)+CHR$(7%))\ GOSUB 25100
		!WE'RE ATTACHED, STOP OR DETACH AS DESIRED

19150	Q%=PEEK(H0%(7%)+H1%(9%))
	\Q%=Q%+2% WHILE (SWAP%(PEEK(PEEK(Q%)+2%)) AND 255%) <> O1%
		!Q% -> MY (CURRENT) CONSOLE DDB

19160	IF (PEEK(PEEK(Q%)+2%) AND 255%) <> 0%
	  THEN GOTO 19130
	  ELSE O0$="KB"+NUM1$(O1%)+":STATS.LST"
		\GOSUB 20050\ K0%=1%\ GOTO 1110
		!CONSOLE IS AVAILABLE, OPEN IT AND START UP
20000	!

	!	F U N C T I O N S   A N D   S U B R O U T I N E S


20010	Z0$=CHR$(13%)+CHR$(10%)+CHR$(12%)
	\Z1$,Z2$=""\ RETURN			!TTY

20020	Z0$,Z2$=CHR$(29%)\ Z1$=CHR$(31%)
	\RETURN					!VT05B

20030	Z0$,Z2$=CHR$(155%)+"H"\ Z1$=CHR$(155%)+"J"
	\RETURN					!VT50, VT52, BEE

20040	Z0$,Z2$=CHR$(29%)\ Z1$=CHR$(153%)
	\RETURN					!TANDBERG
		!NOTE "OTHER SCOPE" (T9%=4%) IS RESERVED
		!FOR WEIRD TERMINALS.

20050	GOSUB 25000\ OPEN O0$ FOR OUTPUT AS FILE O%
	\Q%=STATUS\ GOSUB 25100
		!OPEN OUTPUT FILE WITH PRIVILEGE PROTECTION

20060	IF (Q% AND 255%) <> 2% THEN O1%=-1%
		ELSE O2%=PEEK(PEEK(PEEK(520%))+(O%*2%)) + 2%
			\O1%=(SWAP%(PEEK(O2%)) AND 255%)
			\O0$="KB"+NUM1$(O1%)+":STATS.LST"
		!FIND RUNNING KB: NUMBER (NOTE, CHANGED FOR RSTS V6B)

20070	RETURN
		!O1%	KB: NUMBER, -1 IF NOT KB: TYPE
		!O2%	-> KB: DDB JOB NBR AND KB: NBR
		!O0$	ACTUAL KB: NUMBER

20080	DEF FNP0(Q%)
	\Q=PEEK(Q%)\ Q=Q+65536.0 IF Q < 0.0
	\FNP0=Q
	\FNEND			!GET UNSIGNED TABLE ENTRY

20090	DEF FNP(Q%)
	\Q=PEEK(Q%+P%)\ Q=Q+65536.0 IF Q < 0.0
	\FNP=Q+(65536.0*PEEK(Q%+P%+2%))
	\FNEND			!GET FLOATING TABLE ENTRY

20100	DEF FNX(Q%)
	\Q = FNP(Q%)\ T(Q%) = 0.0 IF I9%\ FNX = Q - T(Q%)\ T(Q%) = Q
	\FNEND			!INCREMENTAL TABLE VALUE
21000	DEF FNP$(T%,Q,D)
	\IF Q = 0.0 OR D = 0.0
	  THEN PRINT #O%, TAB(T%); "   .00% ";
	  ELSE PRINT #O%, FNR1$(T%,Q*100.0/D,6%);"% ";

21010	FNP$=""
	\FNEND			!PRINT PERCENTAGE

21020	DEF FNR$(T%,V,S%)
		! TAB TO COLUMN T%, PRINT V RIGHT-JUSTIFIED
		! IN AN S%-LENGTH FIELD, FORMAT ###,###,...

21030	Q$=NUM1$(FIX(V+.5))\ GOSUB 21080\ FNR$=""
		!CONVERT AND PRINT THE DATUM

21040	FNEND

21050	DEF FNR1$(T%,V,S%)
		! TAB TO COLUMN T%, PRINT V RIGHT-JUSTIFIED
		! IN AN S%-LENGTH FIELD, FORMAT ###,###.##

21060	FNR1$=""\ Q$=NUM1$(FIX(V*100.+.5)/100.+.001)
	\Q$=LEFT(Q$,LEN(Q$)-1%)\ GOSUB 21080
		!CONVERT (FIX DECIMAL) AND PRINT THE DATUM

21070	FNEND

21080	Q$=LEFT(Q$,Q%)+","+RIGHT(Q$,Q%+1%)
		FOR Q%=INSTR(1%,Q$+".",".")-4% TO 1% STEP -3%
	\PRINT #O%, TAB(T%); SPACE$(S%-LEN(Q$)); Q$;
		!INTERNAL FUNCTION FOR FORMAT PRINTING
		!STUFF COMMAS EVERY THIRD PLACE AND PRINT

21090	RETURN

21100	DEF FNN$(Q%)
	\Q1%=1440%-PEEK(Q%+2%)
	\FNN$=DATE$(PEEK(Q%))+" "
		+RIGHT(NUM1$(100%+(Q1%/60%)),2%)+":"
		+RIGHT(NUM1$(100%+Q1%-((Q1%/60%)*60%)),2%)+":"
		+RIGHT(NUM1$(160%-(PEEK(Q%+4%) AND 255%)),2%)
	\FNEND
		!RETURN DD-MMM-YY HH:MM:SS
22000	DEF FND(C%,U%,I%) =
		FNP((C%*U9% + U%)*16% + I%*4%)
		!GET DISK BUFFER DATA:
		!C%	WHICH (0-5)
		!I%	WHAT  (0-3)
		!U%	WHERE (0-MAX UNITS)

22010	! DISK DATA IS STORED AS FOLLOWS
	!	C%		I% (ALREADY DESCRIBED)
	!	0 SWAPS AND RTS READS
	!	1 USER I/O
	!	2 SAT
	!	3 OVERLAY CODE
	!	4 DIRECTORY I/O
	!	5 DECTAPE BUFFER

22020	DEF FND$(L%)
	\PRINT #O%,TAB(26%);D$(L%);" ";FND1$(1%);FND1$(0%);
		FNP$(56%,D(L%,0%),D(L%,0%)+D(L%,2%));
		FNP$(0%,D(L%,0%)+D(L%,2%),D(5%,0%)+D(5%,2%));
	\FND$=""
	\FNEND			! PRINT DISK STATISTICS

22030	DEF FND1$(Q%)
	\PRINT #O%,FNR1$(0%,(D(L%,Q%)+D(L%,Q%+2%))/S0,9%);" "; IF S0>0
	\FND1$=""
	\FNEND			! PRINT NUMBER OF ACCESSES/BLOCKS

22040	Q=((PEEK(512%)-PEEK(36%))*1440.+PEEK(38%)-PEEK(514%))*60.+
		60.-ASCII(CHR$(PEEK(516%)))
	\IF Q<0. OR Q>3600000. THEN Q$ = "???:??:?"\ RETURN
		!SUBROUTINE TO GET UPTIME AS HHH:MM:SS

22050	Q$ = ""\ Q% = 0%\ Q1% = Q/3600.
	\IF Q1% THEN Q = Q - 3600.*Q1%\ GOSUB 22080\ Q$ = Q$ + ":"
		!GET HOURS (IF ANY)
		!Q$	OUTPUT STRING
		!Q%	FLAG (OUTPUT STARTED)
		!Q1%	VALUE TO CONVERT
		!Q	TIME (LEFT) TO CONVERT

22060	Q1% = Q/60% 
	\IF Q1% OR Q% THEN Q=Q-60%*Q1%\ GOSUB 22080\ Q$ = Q$ + ":"
		!GET MINUTES

22070	Q1% = Q\ GOSUB 22080\ RETURN
		!AND GET SECONDS

22080	Q0$=NUM1$(Q1%+Q%*100%)\ Q$=Q$+MID(Q0$,Q%,LEN(Q0$)-Q%)
	\Q% = 1%\ RETURN
		! CONVERT A VALUE FOR PRINTING
23000	DEF FNS%(K$,K%)
	\FNS%=0%\ Q%=INSTR(1%,O0$,"/"+K$)
	\IF Q% THEN FNS%=K%
	  \O0$=LEFT(O0$,Q%-1%)+RIGHT(O0$,Q%+LEN(K$)+1%)

23010	FNEND
		!FNS%(K$,K%): IF /K$ IS FOUND IN O0$, RETURN K%

23020	DEF FNS0%(K$,K%)
	\FNS0%=K%\ GOTO 23040 UNLESS FNS%(K$+":",1%)
	\GOTO 23030 UNLESS
	  INSTR(1%,"0123456789",MID(O0$,K%,1%)) FOR K%=Q% TO LEN(O0$)
	\K%=LEN(O0$)+1%
		!IF SWITCH IS FOUND, SCAN FOR FOLLOWING NUMBER

23030	FNS0%=VAL(MID(O0$,Q%,K%-Q%))
	\O0$=LEFT(O0$,Q%-1%)+RIGHT(O0$,K%)
		!DONE SCANNING, RETURN THE VALUE AND FIX STRING

23040	FNEND
		!FNS0$(K$,K%): IF /K$:VALUE IS FOUND, RETURN VALUE
		!			ELSE RETURN K%

23050	DEF FNT
	\Q=H\ Q=50.0 IF H <> 60.0
	\FNT=TIME(0)+(Q-(SWAP%(PEEK(516%)) AND 255%))/Q
	\FNEND
		!FNT	TIME OF DAY (INCLUDING CLOCK TICKS)

23060	DEF FNV% = (T6% AND T7%) OR (NOT T6% AND (T8% AND 1%))
		!TRUE IF PRINTING JOB STATS:
		!/VT50/BOTH AND "ODD" <CR> TYPED, OR
		!/JOB OR /BOTH AND NOT /VT50 REQUESTED

25000	Q$=SYS(CHR$(6%)+CHR$(-21%)+CHR$(-1%))
	\RETURN
		!DROP PRIVILEGES TEMPORARILY
		!NOTE:  RSTS/E V06B ONLY.

25100	Q$=SYS(CHR$(6%)+CHR$(-21%)+CHR$(0%))
	\RETURN
		!REGAIN PRIVILEGES AFTER OPENING THE FILE
		!NOTE:  RSTS/E V06B ONLY.

32767	END

     Cross Reference Listing of DECSTS.BAC on 01-Mar-77 at 03:57 PM      Page 1 


#    0     19090 
# 1110     19160 
# 2010      2030 
# 2200      2020   2030 
# 2210     19020 
# 3000      2010 
# 4010      3330 
# 4050      4010 
#10000      2010 
#12010     10040 
#13000     10190 
#19000      1110 
#19100     19010 
#19120     19020 
#19130     19160 
#19150     19130 
#20010      1060 
#20020      1060 
#20030      1060   1060 
#20040      1060 
#20050      1090  19160 
#21080     21030  21060 
#22040     10030 
#22080     22050  22060  22070 
#23030     23020 
#23040     23020 
#25000      1100  19140  20050 
#25100      1100  19140  20050 
#32767      1030   2020  19100  19140 
B%          3040@ 10030 
C%          4020@  4020   4020   4020  22000# 22000 
C3          3300@ 10090 
C4          3310@ 10090 
C5          3320@ 10090 
D          21000# 21000  21000 
D$(5)        910#  1070@ 22020 
D(5,4)       910#  4010@  4010@  4030   4030@ 22020  22020  22020  22020  22020 
           22020  22020  22030  22030 
E1          3110@  3120  10020 
E2          3120@ 10020 
ERL        19020  19020  19090 
ERR        19010  19090 
F0          3130@ 10100 
F2          3150@ 10110 
FND         4020  22000# 22000@
FND$       12030  12040  12050  12070  12080  12090  22020# 22020@
FND1$      22020  22020  22030# 22030@
FNN$       10020  21100# 21100@
FNP         3340   3350  20090# 20090@ 20100  22000 
FNP$       10070  10070  10080  10080  10080  10090  10090  10090  10100  10100 
           10100  10100  10100  10110  10110  10110  10110  10110  12030  12040 
           12050  12070  12070  12080  12080  12090  12090  21000# 21010@ 22020 
           22020 
FNP0        3110   3120  20080# 20080@
FNR$       10020  10020  10020  10030  10050  10060  10130  21020# 21030@
     Cross Reference Listing of DECSTS.BAC on 01-Mar-77 at 03:57 PM      Page 2 

FNR1$      10030  21000  21050# 21060@ 22030 
FNS%        1050   1050   1050   1050   1050   1050   1050   1050   1060   1060 
            1060  23000# 23000@ 23000@ 23020 
FNS0%       1050  23020# 23020@ 23030@
FNT         2030   2030  23050# 23050@
FNV%       10040  23060# 23060@
FNX         3030   3050   3060   3070   3080   3130   3150   3200   3210   3220 
            3230   3240   3250   3300   3310   3320  20100# 20100@
H           1020@ 10010  23050  23050 
H0          3340@  3360   3380  10080 
H0%(30)      910#  1090@  1090   1090   1090@ 19150 
H1          3350@  3370   3380  10080 
H1%(30)      910#  1090@  1090   1090   1090@  3090   3110   3120  19150 
H2          3360   3380@
H3          3370   3380@
H4          3360@ 10070 
H5          3370@ 10070 
H7%         3400@ 10050 
H8%         3410@ 10060 
I%          1070@  1070   1070@  1070   1070@  1070   4010@  4010   4010@  4010 
            4010   4020@  4020   4020@  4020   4020   4020   4030@  4030   4030 
            4030   4030@  4030   4030   4030   4030@  4030   4030   4030  22000#
           22000 
I9%         1050@  4010  20100 
J0%         3090@ 10030 
J1%         3100@ 10030 
K$         23000# 23000  23000  23020# 23020 
K%         23000# 23000  23020# 23020  23020@ 23020  23020@ 23030  23030 
K0%         1050@  1100  19020  19120@ 19160@
K9%         3260@ 10130  10130 
L           3060@ 10010  10080  10080  10110  10110 
L%         22020# 22020  22020  22020  22020  22020  22020  22030  22030 
L0          3200@ 10010  12030 
L1          3210@ 10010  12040 
L2          3220@ 10010  12050 
L3          3230@ 10010  12070  12070 
L4          3240@ 10010  12080  12080 
L5          3250@ 10010  12090  12090 
LINE       19090 
N           3080@ 10010  10010  10070  10110 
O           3070@ 10010  10100  10100  10110  10110 
O%          1090@  1110   2020   2200  10020  10030  10030  10030  10040  10040 
           10050  10060  10070  10080  10090  10100  10110  10130  10190  10190 
           12010  12020  12030  12040  12050  12070  12080  12090  13000  19100 
           19120  19130  19130  20050  20060  21000  21000  21080  22020  22030 
O0$         1040@  1040   1040@  1040   1040@  1090   1090@ 19160@ 20050  20060@
           23000  23000  23000  23000@ 23020  23020  23020  23030  23030  23030 
           23030@
O1%         2200  19100  19100  19140@ 19150  19160  20060@ 20060@ 20060 
O2%        20060@ 20060 
P%          3010@  3040   3260   3330@  3330   3400   3410   4010@ 20090  20090 
P7%         1020@  1020   1030   4010   4010 
P8%         1020@  1020   1030   3010 
P9%         1020@  3330 
Q          20080@ 20080  20080  20080@ 20080  20090@ 20090  20090  20090@ 20090 
           20100@ 20100  20100  21000# 21000  21000  22040@ 22040  22040  22050 
           22050  22050@ 22060  22060  22060@ 22070  23050@ 23050@ 23050  23050 
     Cross Reference Listing of DECSTS.BAC on 01-Mar-77 at 03:57 PM      Page 3 

Q$          1040@  1040   1040   1100@  1110@ 10030  10030  19010@ 19100@ 19140@
           19140  19140@ 21030@ 21060@ 21060  21060  21060@ 21080  21080  21080 
           21080@ 21080  21080  22040@ 22050@ 22050  22050@ 22060  22060@ 22080 
           22080@ 25000@ 25100@
Q%          1090@  1090   1090@  1090   1090   1090   1090@  1090   1090   1090 
            3090@  3090   3100  19130@ 19130  19130  19140  19150@ 19150  19150 
           19150@ 19160  20050@ 20060  20080# 20080  20090# 20090  20090  20100#
           20100  20100  20100  20100  21080@ 21080  21080  21100# 21100  21100 
           21100  22030# 22030  22030  22050@ 22060  22080  22080  22080  22080@
           23000@ 23000  23000  23000  23020  23030  23030  23030 
Q0$        22080@ 22080  22080 
Q1%        21100@ 21100  21100  21100  22050@ 22050  22050  22060@ 22060  22060 
           22070@ 22080 
S           3050@ 10090  10090  10100  10100 
S%          1050@  2010   2010   2020  21020# 21050# 21080 
S0          2010  10010@ 10020  22030  22030 
S0%         2010@  2010   2010@  2030   2030 
S1%         1110@  2010   2200@  2200@ 10030 
STATUS     20050 
T           2030@  2030   2030@  2030   2030@ 10030 
T%         21000# 21000  21000  21020# 21050# 21080 
T(100)       910#  1090@ 20100@ 20100  20100@
T5%         2200@ 10040  10040@
T6%         1060@  2200  10190  23060  23060 
T7%         1060@  2200   2200@ 23060 
T8%         1060@  1060   1060@  1060  10190  23060 
T9%         1050@  1060   1060 
U           3030@ 10010  10010  10010  10070  10080  10090  10090  10100  10100 
           10100  10110  10110  10110 
U%          4020@  4020  22000# 22000 
U1         10010@ 10080  10090  10100  10100  10110  10110 
U2         10010@ 12030  12040  12050  12070  12080  12090 
U3         10010@ 10010  12070  12080  12090 
U4         10010@ 10090  10090  10110  10110 
U9%         1020@  4020  22000 
V          21020# 21030  21050# 21060 
V%          1070@  1070   4010@  4010   4010@  4010   4010   4020@  4020   4030@
            4030   4030@  4030   4030   4030 
V%(5)        910#  1070@  4020   4020 
X(5,4)       910#  1070@  4010   4020@  4020   4020@  4030   4030   4030@  4030 
            4030   4030@  4030 
Z0$         1110  13000  19100  20010@ 20020@ 20030@ 20040@
Z1$         1110  10040  13000  19100  20010@ 20020@ 20030@ 20040@
Z2$        10020  20010@ 20020@ 20030@ 20040@


   127 Variables   750 References   190 Statements  2406 Code elements

K-Words Reserved      Used      Free
  Data      3.91      2.53      1.38
  Code      4.09      3.96       .13
 Total      8.00      6.49      1.51
