Google
 

Trailing-Edge - PDP-10 Archives - bb-d868e-bm_tops20_v41_2020_dist_1of2 - 4-1-sources/watmai.mac
There are 18 other files named watmai.mac in the archive. Click here to see a list.
; UPD ID= 85, FARK:<4-1-WORKING-SOURCES.UTILITIES>WATMAI.MAC.2,  22-Dec-82 14:04:43 by DONAHUE
;Edit 12 - Decrease NJOBS for 4.1
; UPD ID= 39, FARK:<5-1-WORKING-SOURCES.UTILITIES>WATMAI.MAC.4,  14-Sep-82 14:27:20 by DONAHUE
;Edit 11 - Fix dummy disk statistics records at ODAGAN
; UPD ID= 13, FARK:<5-WORKING-SOURCES.UTILITIES>WATMAI.MAC.2,   3-May-82 12:22:54 by MOSER
; EDIT 10 - DO NOT REPORT COLUMN OVERFLOW. CHANGE EDIT # TO DECIMAL.
; UPD ID= 21, SNARK:<5.UTILITIES>WATMAI.MAC.10,  11-Aug-81 12:17:09 by MOSER
;<MOSER.SPR>WATMAI.MAC.7 11-Aug-81 12:16:12, Edit by MOSER
;TCO 5.1450 Make print monitor statistics question correctly accept all legal
; typins after an illegal typein.
;STRAIGHTEN OUT FIELD WIDTHS ON JOB DATA, PREVENT LINE OVERFLOW WITH SNOOP STUFF
; UPD ID= 1232, SNARK:<4.RP20-UTILITIES>WATMAI.MAC.3,   4-Nov-80 16:05:00 by UHLER
;UPDATE EDIT NUMBER FOR RP20 EDIT IN WATCH
;<4.UTILITIES>WATMAI.MAC.15,  3-Jan-80 15:28:03, EDIT BY R.ACE
;UPDATE COPYRIGHT DATE
;<4.UTILITIES>WATMAI.MAC.13, 10-Jul-79 09:49:21, Edit by WALLACE
;ADD MISSING RETURN TO THE DOCAV SUBROUTINE
;<4.UTILITIES>WATMAI.MAC.12, 25-Jun-79 09:10:17, EDIT BY ENGEL
;FIX PAGE WIDTH FOR OUTPUT DEVICE
;<4.UTILITIES>WATMAI.MAC.11,  3-May-79 09:20:56, EDIT BY KIRSCHEN
;LOAD # OF COLUMNS CORRECTLY IN LOAD AVG TYPOUT ROUTINE
;<4.UTILITIES>WATMAI.MAC.10,  2-Apr-79 12:11:44, Edit by MCLEAN
;<4.UTILITIES>WATMAI.MAC.9,  2-Apr-79 12:11:26, Edit by MCLEAN
;<4.UTILITIES>WATMAI.MAC.8,  2-Apr-79 11:27:01, Edit by MCLEAN
;<4.UTILITIES>WATMAI.MAC.7, 28-Mar-79 10:08:49, EDIT BY KIRSCHEN
;ADD DIRECTORY CACHE STATS
;<4.UTILITIES>WATMAI.MAC.6, 21-Mar-79 02:03:20, Edit by MCLEAN
;<4.UTILITIES>WATMAI.MAC.5, 21-Mar-79 02:00:09, Edit by MCLEAN
;MAKE FIT IN 132 COLS
;<4.UTILITIES>WATMAI.MAC.4, 12-Mar-79 14:40:11, Edit by KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.UTILITIES>WATMAI.MAC.3,  9-Mar-79 00:26:18, Edit by MCLEAN
;ADD CLASS SCHEDULER VALUES
;<4.UTILITIES>WATMAI.MAC.2, 26-Feb-79 21:53:59, Edit by MCLEAN

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	TITLE WATMAI - MAIN PROGRAM FOR "WATCH"

	SEARCH MACSYM,MONSYM
	.REQUIRE SYS:MACREL
	SALL
   IFDEF .PSECT,<		;IF MACRO 51 OR BETTER,
	.DIRECT FLBLST>		;MAKE BETTER LISTING
   IFNDEF .PSECT,<
	.DIRECT .XTABM>
	MLON

	EXTERN SINIT,GSNPD,DOSNPH,DOSNPD,SNPSUM,TSTSNP
	EXTERN SETHD,ODATM,GETFIL,PRIREC,OFLT,ONUM,NULJFN,RSTJFN,DOCACH
	EXTERN OPCT,ORAT,PQFIL,.PQMAX,DCFIL,OUSER,OPGM,DETJOB,CLSOPN,DSKOUT
	INTERN INTRVL,TUNEMF,NQUEUE,MAXCLS,STRING,SUMJOB

; VERSION NUMBER DEFINITIONS

VMAJOR==4			;MAJOR VERSION OF WATCH
VMINOR==0			;MINOR VERSION NUMBER
VEDIT==^D12			;EDIT NUMBER
VWHO==0				;GROUP WHO LAST EDITED PROGRAM (0=DEC DEVELOPMENT)

VWATCH== <VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT
;ACCUMULATORS

F=:0				;FLAGS
A==1
 T1=:A
B==2
 T2=:B
C==3
 T3=:C
D==4
 T4=:4
E==5
FF==6				; DITTO
G==7				; DITTO

P1=:10
P2=:11
P3=:12

P=:17

NMIN==^D<15*60>			; NO. OF SECONDS IF UNDER JOB 0

FLDSIZ==12
JBMAX==^D200			;SIZE OF JOB TABLES

;FLAGS IN F

JOBSMF==1B0			;PRINT JOB SUMMARY
STATF==1B1			;PRINT MONITOR STATISTICS SUMMARY
NOTIMF==1B2			;NO TIME PERIOD GIVEN

TUNEMF==:1B3			;TUNE MODE
ALLF==1B4			;ALL MODE (INCLUDING SNOOP DATA)
ODATFL==1B5			;OUTPUT DATA RECORDS TO FILE
MAXCLS=40			;MAXIMUM CLASS
;PROGRAM ENTRY VECTOR

ENTVEC:	JRST WATCH		;STARTING LOCATION
	JRST WATCH		;REENTER LOCATION
	VWATCH			;VERSION NUMBER

WATCH::	RESET
	MOVE P,[IOWD PDLEN,PDL]
	SETZ F,
	MOVE A,[SIXBIT/JOBRT/]
	SYSGT
	HLRE A,B
	MOVNM A,NJOBS
	CAMGE A,[-JBMAX]	; ENUFF ROOM?
	 JRST [HRROI A,[ASCIZ/
? NOT ENOUGH ROOM IN JOB TABLES!
/]
	       PSOUT
	       HALTF]
	GJINF
	JUMPE C,[MOVSI A,1
		HRROI B,[ASCIZ/<SYSTEM>WATCH.LOG/]
		GTJFN
		 JRST [	MOVSI A,400001
			HRROI B,[ASCIZ/PS:<SYSTEM>WATCH.LOG/]
			GTJFN
			 JRST [HRROI A,[ASCIZ/
? WATCH NOT BEING PERFORMED!
/]
				PSOUT
				HALTF
				JRST WATCH]
			JRST .+1]
		MOVEM A,OJFN
		MOVE B,[70000,,120000]
		OPENF
		 JRST [HRROI A,[ASCIZ/
? WATCH NOT BEING PERFORMED!
/]
			PSOUT
			HALTF
			JRST WATCH]
		TXO F,JOBSMF+STATF ;DO ALL OUTPUT
		MOVE B,[NMIN]	;USE DEFAULT TIME PERIOD
		JRST GOTTIM]
	TMSG <
WATCH >
	MOVEI A,.PRIOU
	MOVE B,[VWATCH]		;PRINT WATCH VERSION
	CALL PVERID
	TMSG <, /H for help.
>
GOJFN:	TMSG <Output to file: >
	PBIN			;CHECK FIRST CHAR
	CAIN A,"?"
	JRST [	TMSG < Output filespec for WATCH output.
>
		JRST GOJFN]
	CAIN A,"/"		;SWITCH?
	JRST [	CALL RDLINE	;YES, GET NAME
		LDB A,[POINT 7,STRING,6] ;GET FIRST CHAR OF SWITCH
		CAIN A,"H"	;HELP?
		JRST DOHLP	;YES, TYPE LONG MESSAGE
		TMSG <?Invalid switch.
>
		JRST GOJFN]
	MOVEI A,.PRIIN
	BKJFN			;PUT IT BACK
	 JFCL
	MOVX A,GJ%MSG+GJ%CFM+GJ%FNS+GJ%SHT
	MOVE B,[100,,101]
	GTJFN
	 JRST [	CALL ERMSG
		JRST WATCH]
	MOVEM A,OJFN
	MOVE B,[70000,,120000]
	OPENF
	 JRST [	CALL ERMSG
		MOVE A,OJFN
		RLJFN
		 JFCL
		JRST WATCH]
	CALL GETFIL		;GET DATA FILE IF WANTED
	MOVE A,OJFN
	RFMOD			;GET PAGE WIDTH
	LOAD B,TT%WID,B
	MOVEI C,4		;USE 4 COLUMNS FOR SYSTEM DATA
;	CAIGE B,^D112		;UNLESS PAGE 112 WIDE OR MORE
;	MOVEI C,^D8		;THEN USE 8
	MOVEM C,NCOL
ASK:	TMSG <Print monitor statistics? >
	CALL RDLINE		;GET ANSWER
	LDB B,[POINT 7,STRING,6]
	CAIN B,"?"
	JRST [	HRROI A,QHLPTX	;HELP MSG
		PSOUT
		JRST ASK]	;TRY AGN
	CAIN B,"A"
	JRST [	TXO F,STATF+JOBSMF+ALLF ;EVERYTHING
		JRST TIMLOP]
	CAIN B,"Y"		;DID HE TYPE "Y"
	JRST [TXO F,STATF	;YES, FLAG PRINTING MONITOR STATS
	      JRST ASK1]	;AND ASK NEXT QUESTION
	CAIE B,"N"		;DID HE TYPE "N"?
	JRST ASK		;HE TYPED GARBAGE SO ASK AGAIN
ASK1:	TMSG <Print job summary ? > ;ASK ABOUT JOB SUMMARY
	CALL YESNO		;GET ANSWER
	SKIPE A
	TXO F,JOBSMF		;YES
	TXNE F,STATF+JOBSMF	;NOTA?
	JRST TIMLOP
	TMSG <Tune mode? >	;yes, try another possibility
	CALL YESNO
	SKIPE A
	TXO F,TUNEMF+STATF+JOBSMF+ALLF
	; ..
TIMLOP:	HRROI A,[ASCIZ/
Time period (MM:SS): /]
	PSOUT
	CALL RDLINE		;READ TO CR
	LDB A,[POINT 7,STRING,6] ;GET FIRST CHAR
	CAIN A,"?"		;HELP REQUEST?
	JRST [	HRROI A,[ASCIZ /
For fixed period reporting, enter the period as MM:SS.  Type CR
for variable period reporting.  This means that a report will
be done only when requested by typing CR.
/]
		PSOUT		;TYPE HELP
		JRST TIMLOP]	;TRY AGAIN
	CAIN A,.CHLFD		;ONLY CR TYPED?
	JRST [	TXO F,NOTIMF	;YES, FLAG
		HRROI A,[ASCIZ /
Type CR to get report.
/]
		PSOUT
		SETZ B,		;TIME IS 0
		JRST GOTTIM]
	CAIN A,":"		;STARTS WITH COLON?
	JRST [	SETZM WAITIM	;YES, ASSUME SECONDS FOLLOW
		MOVE A,[POINT 7,STRING,6]
		JRST TIMLO1]
	HRROI A,STRING
	FLIN			;SEE IF INPUT CAN BE RECOGNIZED AS
	 JRST BADTIM		; FLOATING PT - JUMP IF NOT
	LDB C,A			;OK, BUT MUST HAVE READ ENTIRE FIELD
	CAIE C," "
	CAIN C,.CHLFD
	JRST [	FMPRI B,(60.0)	;OK, CONVERT TO SECONDS
		FIXR B,B	;FIX
		JRST GOTTIM]
	CAIN C,":"		;COLON TERMINATOR?
	JRST TIMLO2		;YES, SECONDS GIVEN
BADTIM:	TMSG <?Invalid time period specification.
>
	JRST TIMLOP		;TRY AGAIN

TIMLO2:	FIXR B,B		;FIX MINUTES
	IMULI B,^D60		;CONVERT TO SECONDS
	MOVEM B,WAITIM
TIMLO1:	MOVEI C,^D10
	NIN			;YES, GET NUMBER
	 CALL LJSHLT
	ADD B,WAITIM		;ADD TO MINUTES
	; ..
;HERE WITH: B/ TIME PERIOD IN SECONDS

	; ..
GOTTIM:	IMULI B,^D1000		;CONVERT TO MILLISECONDS
	MOVEM B,WAITIM
	TXNE F,ALLF
	CALL SINIT		;INIT SNOOP STUFF
	TMSG <
WATCH IN OPERATION -- >
	MOVEI A,377777
	EXCH A,OJFN
	PUSH P,A
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL NULJFN		;SET OUTPUT DATA FILE TO NULL I/O
	TIME
	MOVEM A,STIME
	SETZM INTRVL
	CALL SETUP
	 JRST INTERR
	CALL GETQS		;INIT QUEUE TIMES
	CALL GSTATS		;INIT STATISTICS TABLES
	TXNE F,ALLF
	CALL GSNPD		;GET INITIAL SNOOP DATA
	CALL HEADER
	CALL STATS
	CALL PQSUM
	CALL DOAVS
	CALL TYPE
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL RSTJFN		;RESTORE OUTPUT FILE DATA JFN
	POP P,OJFN
	JRST LPWAIT

QHLPTX:	ASCIZ /
One of the following:

Y (yes) - include monitor statistics in report
N (no)  - do not include monitor statistics in report
A (all) - include monitor statistics, job data, and snoop data in report

If you do not select A mode, the next question will allow you to
include or exclude the per-job data from the report.

If you answer N to both questions, you may select "tune" mode
which gives a single-line system summary each period.

"A" and "tune" modes require wheel capability enabled.
/
;MAIN LOOP

LOOP:	TIME
	SUBM A,STIME		;COMPUTE ACTUAL INTERVAL
	EXCH A,STIME		;SAVE CURRENT TIME
	MOVEM A,INTRVL
	CALL ODATM		;SAVE CURRENT DATE AND TIME STRING
	CALL GSTATS		;GET STATISTICS
	TXNE F,ALLF
	CALL GSNPD		;GET SNOOP DATA
	CALL SETUP
	 JRST INTERR
	TXNN F,TUNEMF
	CALL GETQS		;GET QUEUE TIMES
	TXNE F,TUNEMF		;TUNE MODE?
	JRST [	SOSGE LINCNT	;YES, TIME FOR NEW HEADER?
		CALL TUNHED	;YES
		JRST .+1]
	TXNN F,TUNEMF
	CALL HEADER
	JXE F,STATF,SKSTAT	;JUMP IF NOT PRINTING STATISTICS
	CALL STATS
	TXNN F,TUNEMF
	CALL PQSUM		;PRINT QUEUE TIME SUMMARY
SKSTAT:	TXNN F,TUNEMF
	CALL DOAVS
	MOVE T1,OJFN		;GET OUTPUT JFN
	TXNE F,ALLF
	JRST [	TXNN F,TUNEMF	;DO NOT DO CACHE STATS IF TUNE MODE
		CALL DOCACH	;PRINT DIRECTORY CACHE STATS
		JRST .+1 ]
	TXNE F,JOBSMF		;SKIP IF JOB SUMMARY NOT WANTED
	CALL TYPE
	TXNN F,TUNEMF
	TXNN F,ALLF
	SKIPA
	CALL DSKOUT		;DO DISK STATISTICS
	;GJINF
	;JUMPGE D,LPWAIT	;DON'T DO CLOSF/OPENF IF ATTACHED
	JXE F,TUNEMF,SKPTN2	;JUMP IF NOT DOING TUNE MODE
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL PRIREC		;OUTPUT THE DATA RECORD
SKPTN2:	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL CLSOPN		;CLOSE AND OPEN DATA FILE
	MOVE A,OJFN
	HRLI A,(1B0)
	CLOSF
	  JFCL
	HRRZ A,OJFN
	MOVE B,[70000,,120000]
	OPENF
	  JRST [MOVE B,A
		HRROI A,[ASCIZ/
? CANNOT REOPEN OUTPUT FILE!
? /]
		PSOUT
		MOVEI A,101
		SETZ C,
		HRLI B,400000
		ERSTR
		  JFCL
		  JFCL
		HALTF
		JRST WATCH]
LPWAIT:	JXO F,NOTIMF,[PBIN	;INDEF PERIOD, GET TYPEIN
		CAIE A,.CHLFD	;CR TYPED?
		JRST LPWAIT	;NO, KEEP WAITING
		JRST LOOP]	;YES, DO REPORT
	TIME
	SUB A,STIME
	MOVNS A
	ADD A,WAITIM
	SKIPL A
	DISMS
	JRST LOOP
;TYPE JOB SUMMARY

TYPE:	PUSH P,P1
	PUSH P,P2
	TXNE F,TUNEMFF
	JRST TYPTM1
	CALL CALPER		;CALCULATE PERCENTAGES
	;CALL SORT		;SORT JOBS BY USED TIME
	CALL CRLF
	CALL IFLDW		;INIT FIELD WIDTHS FOR LINE
	HRROI A,[ASCIZ/JOB/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
	HRROI A,[ASCIZ/TTY/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
	HRROI A,[ASCIZ/USER/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
	HRROI A,[ASCIZ/PROGRAM/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
	TXNE F,ALLF
	JRST TYPA1		;SKIP THIS FIELD IF SNOOP DATA
	HRROI A,[ASCIZ/DELTA RT/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
TYPA1:	HRROI A,[ASCIZ/ %RT/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
	TXNE F,ALLF
	JRST TYPA2
	HRROI A,[ASCIZ/ JBUTIL/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
	HRROI A,[ASCIZ/   CSHR/]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSTR
TYPA2:	TXNE F,ALLF
	CALL DOSNPH		;DO SNOOP HEADER
	CALL CRLF
	CALL CRLF
	; ..
	; ..
TYPTM1:	MOVN P1,NJOBS
	HRLZS P1
TYPLOP:	CALL IFLDW		;INIT FIELD WIDTHS FOR LINE
	MOVE P2,JOBNUM(P1)
	SKIPN USER(P2)
	  JRST TYPNXT
	SKIPG DRUNTM(P2)
	JRST [	HRRZ T1,P2	;NO RUN TIME HERE, SEE IF ANY SNOOP EVENTS
		CALL TSTSNP
		JUMPE T1,TYPNXT	;JUMP IF NONE
		JRST .+1]
	TXNE F,TUNEMF
	JRST [	MOVE A,OJFN
		HRRZ B,P2
		CALL DOSNPD
		JRST TYPNXT]
	TXNE F,ALLF		;IF OUTPUT MODE IS ALL, THE EXPANDED JOB RECORD
	MOVEI A,3		;  TYPE IS OUTPUT
	TXNN F,ALLF		;IF OUTPUT MODE IS NOT ALL, THE NORMAL JOB
	MOVEI A,4		;  RECORD TYPE IS OUTPU
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL SETHD		;SET OUTPUT RECORD HEADER
	MOVE A,P2
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPDEC		;JOB NUMBER
	SKIPGE A,TTYNUM(P2)
	  JRST [MOVE A,[ASCII/DET/]
		MOVEM A,STRING
		CALL GNFLDW
		CALL TYPFLD
		TXNE F,ODATFL		;TEST IF USING DATA FILE
		CALL DETJOB		;OUTPUT DETACHED JOB NUMBER
		JRST TYPE2]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPOCT		;TTY NUMBER
TYPE2:	MOVE A,USER(P2)
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPUSR
	MOVE A,PRGNAM(P2)
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPSIX
	TXNE F,ALLF
	JRST TYPB1
	FLTR A,DRUNTM(P2)
	FDVR A,[1000.0]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPFLT
TYPB1:	MOVE A,PERCNT(P1)
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPPER
	TXNE F,ALLF
	JRST TYPB2
	MOVEI T1,.SKRJP
	MOVEI T2,SKJBP	;BLOCK ADDRESS
	MOVEM P2,1(T2)	;STORE JOB NUMBER
	SETZM SKJBP+.SAJSH	;ZERO SHARES AND FRIENDS
	SETZM SKJBP+.SAJUS
	SKED%		;SKED
	ERJMP .+1		;LOGGED OUT IS POSSIBLE HERE SO SHARE IS 0
	MOVE A,SKJBP+.SAJUS
	FMPR A,[100.]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPFLT
	MOVE A,SKJBP+.SAJSH
	FMPR A,[100.]
	CALL GNFLDW		;GET NEXT FIELD WIDTH INTO B
	CALL TYPFLT
TYPB2:	MOVE A,OJFN
	HRRZ T2,P2
	TXNE F,ALLF
	CALL DOSNPD		;DO SNOOP DATA FOR THIS JOB
	CALL CRLF
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL PRIREC		;OUTPUT THE DATA RECORD
TYPNXT:	AOBJN P1,TYPLOP
	TXNN F,ALLF
	JRST TYPC1
	TXNE F,TUNEMF
	JRST TYPTM3
	CALL CRLF
	HRROI A,[ASCIZ /        System summary/]
	MOVE B,SUMFLW
	CALL TYPSTR
TYPTM3:	MOVE A,OJFN
	CALL SNPSUM		;DO SNOOP DATA SUMMARY
	CALL CRLF
TYPC1:	POP P,P2
	POP P,P1
	RET
;INIT LIST OF FIELD WIDTHS

IFLDW:	MOVEI T1,PJFLDT		;REGULAR TABLE
	TXNE F,ALLF		;SNOOP DATA?
	MOVEI T1,PJFLDS		;YES, ALTERNATE TABLE
	MOVEM T1,PJFLDW
	RET

;GET NEXT FIELD WIDTH IN B

GNFLDW:	MOVE B,@PJFLDW
	AOS PJFLDW
	RET

;TABLE OF FIELD WIDTHS, REGULAR

;	JOB, TTY, USER, PGM, DELTA RT, %RT, JBUTIL, CSHR
PJFLDT:	DEC 4,4,12,8,9,4,7,7

;TABLE OF FIELD WIDTHS, SNOOP DATA

;	JOB, TTY, USER, PGM, %RT
PJFLDS:	DEC 4,4,10,8,4
SUMFLW:	^D30			;SUM OF ABOVE FIELDS
;TYPE STRING LEFT JUSTIFIED IN FIELD
; A/ STRING PTR
; B/ FIELD WIDTH

TYPSTR:	PUSH P,B
	MOVE B,A
	HRROI A,STRING
	SETZ C,
	SOUT
	POP P,A
	JRST TYPFLD

TYPRT:	PUSH P,B
	ADDI A,^D50		;ROUND TO 0.1 SECONDS
	IDIVI A,^D100		;GET 0.1 SECOND UNITS
	IDIVI A,^D10		;GET SECONDS, TENTHS
	PUSH P,B		;SAVE TENTHS
	IDIVI A,^D60		; B = SECONDS, A = MINUTES
	PUSH P,B
	IDIVI A,^D60		; B = MINUTES, A = HOURS
	PUSH P,B
	MOVE B,A
	HRROI A,STRING		;WRITE TIME TO BUFFER STRING
	MOVX C,<NO%LFL+NO%AST+FLD(3,NO%COL)+^D10>
	JUMPE B,TYPRT1		;SUPPRESS LEADING 0 HOURS
	NOUT
	 JFCL
	MOVEI B,":"
	BOUT
	MOVX C,<NO%LFL+NO%ZRO+FLD(2,NO%COL)+^D10>
TYPRT1:	POP P,B			;RECOVER MINUTES
	NOUT			;PRINT MINUES
	 JFCL
	MOVEI B,":"
	BOUT
	POP P,B			;RECOVER SECONDS
	MOVX C,<NO%LFL+NO%ZRO+FLD(2,NO%COL)+^D10>
	NOUT			;PRINT SECONDS
	 JFCL
	MOVEI B,"."
	BOUT
	POP P,B			;RECOVER TENTHS
	MOVEI C,^D10
	NOUT
	 NOP
	POP P,A
	JRST TYPFLD
TYPDEC:	SKIPA C,[12]
TYPOCT:	MOVEI C,10
	PUSH P,B
	SUBI B,1		;SAVE 1 FOR FOLLOWING SPACE
	STOR B,NO%COL,C		;SETUP NUMBER COLUMNS
	TXO C,NO%LFL+NO%AST
	MOVE B,A
	HRROI A,STRING
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL ONUM		;OUTPUT NUMBER
	NOUT
	  SETZM STRING
	POP P,A
	JRST TYPFLD

TYPPER:	PUSH P,B
	MOVE B,A
	HRROI A,STRING
	MOVE C,[1B4!1B6!37B17!2B23!1B29]
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL OFLT		;OUTPUT THE FLOATING POINT NUMBER
	FLOUT
	  JRST TYPZER
	MOVEI B,0
	IDPB B,A
	POP P,A
	JRST TYPFLD

TYPUSR:	PUSH P,B
	MOVE B,A
	HRROI A,STRING
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL OUSER		;OUTPUT USER NAME TO DATA FILE
	DIRST
TYPZER:	SETZM STRING
	POP P,A
	JRST TYPFLD

TYPSIX:	PUSH P,B
	CALL SIXTO7
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL OPGM		;OUTPUT PROGRAM NAME TO DATA FILE
	POP P,A
	JRST TYPFLD

SIXTO7:	MOVE B,[POINT 7,STRING]
	MOVE C,[POINT 6,A]
	MOVEI D,6
	ILDB E,C
	ADDI E,40
	IDPB E,B
	SOJG D,.-3
	MOVEI E,0
	IDPB E,B
	RET
TYPFLD:	CAIG A,0		;DEFAULT WIDTH?
	MOVSI A,2		;YES
	MOVE D,[POINT 7,STRING]
	MOVE E,A
	MOVE A,OJFN
TYPFL1:	ILDB B,D
	JUMPE B,TYPFL2
	BOUT
	SOJG E,TYPFL1
TYPFL2:	SOJL E,R
	CALL SPACE
	CAIL E,777777		;DEFAULT?
	RET			;YES, STOP AFTER ONE SPACE
	JRST TYPFL2

; CRLF -- TURNS A NEW LINE
;
CRLF::	HRROI B,[ASCIZ/
/]
	MOVE A,OJFN
	SETZ C,
	SOUT
	RET

; JSYS ERROR ROUTINE

ERMSG:	TMSG <
? >
	JRST ERMSG0

LJSERR:	TMSG <
?JSYS ERROR: >
ERMSG0:	MOVEI A,101		; SET UP OUTJFN
	HRLOI B,.FHSLF
	SETZ C,			;
	ERSTR			; PRINT ERROR MESSAGE
	 JFCL			;
	 JFCL			; IGNORE ALL SCREWUP CONDITIONS
	HRROI A,[ASCIZ/
/]
	PSOUT			;
	RET			;

LJSHLT:	CALL LJSERR		;DO MESSAGE
	HALTF			;QUIT
	RET			;BUT IF CONTINUED...

INTERR:	TMSG <
? WATCH: FATAL INTERNAL ERROR!
>
	HALTF
	JRST WATCH
;READ YES/NO ANSWER

YESNO:	CALL RDLINE		;READ TYPEIN TO NEXT CR
YESNOX:	LDB B,[POINT 7,STRING,6] ;GET FIRST CHAR OF ANSWER
	CAIN B,"?"		;HELP?
	JRST [	HRROI A,[ASCIZ /
"YES" OR "NO": /]
		PSOUT
		JRST YESNO]	;TRY AGAIN
	CAIE B,"Y"
	CAIN B,"Y"+40
	JRST [	SETO A,		;YES, RETURN NON-0
		RET]
	CAIE B,"N"
	CAIN B,"N"+40
	JRST [	SETZ A,		;NO, RETURN 0
		RET]
	HRROI A,[ASCIZ /? YES OR NO REQUIRED: /]
	PSOUT
	JRST YESNO

;READ ONE LINE FROM PRIMARY

RDLINE:	PBIN			;READ FIRST CHAR
	CAIN A,"?"		;HELP REQUEST?
	JRST [	SETZM STRING	;YES, RETURN IMMEDIATELY
		DPB A,[POINT 7,STRING,6]
		RET]
	MOVEI A,.PRIIN
	BKJFN			;NO, PUT IT BACK
	 CALL LJSERR
	MOVE A,[.PRIIN,,.PRIOU]
	HRROI B,STRING
	MOVX C,<RD%BEL+RD%JFN+RD%RAI+RD%CRF+STRNGL*5-1>
	RDTXT
	 CALL LJSHLT
	RET
;PRINT VERSION IDENTIFICATION
; A/ OUTPUT DESIGNATOR
; B/ VERSION ID WORD

PVERID:	SAVEAC <P1>
	MOVEM T2,P1		;SAVE WORD
	MOVEI T3,^D8		;ALL NUMBERS ARE OCTAL
	LOAD T2,VI%MAJ,P1	;MAJOR VERSION
	NOUT
	 JFCL
	LOAD T2,VI%MIN,P1	;MINOR
	JUMPE T2,PVER1		;PRINT NOTHING IF 0
	ADDI T2,"A"-1		;CONVERT TO ALPHABETIC
	BOUT
PVER1:	MOVEI T2,"("
	BOUT			;PUNCTUATE EDIT NUMBER
	LOAD T2,VI%EDN,P1
	NOUT
	 JFCL
	MOVEI T2,")"
	BOUT
	LOAD T2,VI%WHO,P1	;GET CUSTOMER CODE
	JUMPE T2,PVER2		;JUMP IF NONE
	MOVEI T2,"-"		;PUNCTUATE IT
	BOUT
	LOAD T2,VI%WHO,P1
	NOUT
	 JFCL
PVER2:	RET
;
; HEADER CODE BEGINS HERE
;
HEADER:	MOVE A,OJFN
	HRROI T2,[BYTE (7) .CHFFD]
	TXC F,STATF+JOBSMF	;BOTH FUNCTIONS ON?
	TXCE F,STATF+JOBSMF
	HRROI T2,[ASCIZ /


/]
	SETZ C,
	SOUT
	FMSG <
SUMMARY at >
	MOVNI B,1
	SETZ C,
	ODTIM
	HRROI B,[ASCIZ/
  for an interval of /]
	SETZ C,
	SOUT
	MOVE A,INTRVL
	MOVEI B,0
	CALL TYPRT
	MOVE A,OJFN
	HRROI B,[ASCIZ/ with /]
	SETZ C,
	SOUT
	CALL SUMJOB
	MOVEI B,4
	CALL TYPDEC
	MOVE A,OJFN
	HRROI B,[ASCIZ/ active jobs.
/]
	SETZ C,
	SOUT
	RET
DOAVS:	MOVEI A,2		;SET ENTRY RECORD TYPE
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL SETHD		;SET THE RECORD HEADER
	MOVE A,OJFN
	HRROI B,[ASCIZ /
LOAD AVERAGES:       /]
	SETZ C,
	SOUT
	MOVE A,[SIXBIT/SYSTAT/]
	SYSGT
	PUSH P,B
	MOVE A,0(P)
	HRLI A,14
	GETAB
	  JFCL
	MOVEI B,10
	CALL TYPFLT
	MOVE A,0(P)
	HRLI A,15
	GETAB
	  JFCL
	MOVEI B,10
	CALL TYPFLT
	POP P,A
	HRLI A,16
	GETAB
	  JFCL
	MOVEI B,10
	CALL TYPFLT
	CALL CRLF
	HRROI A,[ASCIZ /HIGH QUEUE AVERAGES: /]
	MOVEI B,.HQLAV
	CALL DOLAV
	HRROI A,[ASCIZ /LOW QUEUE AVERAGES:  /]
	MOVEI B,.LQLAV
	CALL DOLAV
	CALL DOCAV		;DO CLASS AVERAGES
	RET

DOCAV:	CALL CRLF
	HRROI A,[ASCIZ /CLASS   SHARE  UTILIZ    CLASS LOAD AVERAGES/]
	MOVEI B,56
	CALL TYPSTR
	CALL CRLF
	CALL CRLF
	PUSH P,P1
	SETZ P1,0
	SETZ P2,		;INITIALIZE COUNTER FOR NUMBER OF ITEMS OUTPUT
CLAVL:	MOVEI A,.SKRCS
	MOVEI B,SKLDA
	CAIN P1,MAXCLS
	JRST CLAVXT
	MOVEM P1,SKLDA+.SACLS	;SET CLASS
	SKED%
	ERJMP NXTCLS
	SKIPN SKLDA+.SASHR
	JRST NXTCLS
	AOJ P2,			;INCREMENT ITEM COUNTER
	MOVE A,P1
	MOVEI B,6
	CALL TYPDEC
	MOVE A,SKLDA+.SASHR
	FMPR A,[100.]
	MOVEI B,10
	CALL TYPFLT
	MOVE A,SKLDA+.SAUSE
	FMPR A,[100.]
	MOVEI B,10
	CALL TYPFLT
	MOVE A,SKLDA+.SA1ML
	MOVEI B,10
	CALL TYPFLT
	MOVE A,SKLDA+.SA5ML
	MOVEI B,10
	CALL TYPFLT
	MOVE A,SKLDA+.SA15L
	MOVEI B,10
	CALL TYPFLT
	CALL CRLF
NXTCLS:	AOS P1
	JRST CLAVL

CLAVXT:	POP P,P1
	TXNN F,ODATFL		;TEST IF USING DATA FILE
	RET			;RETURN
	CALL DCFIL		;OUTPUT FILLER DATA ENTRIES AND NUMBER OF
				;  ENTRIES OUTPUT
	CALL PRIREC		;OUTPUT THE ENTIRE RECORD
	RET
;TYPE LOAD AVERAGES
; A/ MESSAGE
; B/ TABLE TO BE USED

DOLAV:	SAVEAC <P1>
	ASUBR <MSG,TABLE>
	HRRO A,TABLE		;REQUEST SIZE OF TABLE
	GETAB
	 RET			;NONE SUCH, DO NOTHING
	HRLZ P1,A		;SETUP AOBJN PTR
	MOVE A,OJFN
	SETZ C,
	HRRO B,MSG
	SOUT			;TYPE MESSAGE
DOLAV1:	MOVE A,TABLE
	HRL A,P1		;SETUP INDEX,,TABLE
	GETAB			;GET ENTRY
	 CALL LJSHLT		;IMPOSSIBLE
	MOVEI B,10		;FIELD SIZE
	CALL TYPFLT		;TYPE IT
	AOBJN P1,DOLAV1		;DO ALL
	CALL CRLF		;END OF LINE
	RET

TYPFLT:	PUSH P,B
	MOVE B,A
	HRROI A,STRING
	MOVE C,[1B1!1B4!1B6!37B17!4B23!2B29] ;4 COLUMNS
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL OFLT		;OUTPUT THE NUMBER TO THE DATA FILE
	FLOUT
	  JRST TYPZER
	POP P,A
	JRST TYPFLD
SETUP:	PUSH P,P1
	MOVN P1,NJOBS
	HRLZS P1
SETLOP:	HRRZ A,P1
	MOVE B,[-10,,JIBLK]
	MOVEI C,0
	GETJI
	  JRST SETZER		;
	SKIPN A,JIBLK+.JIUNO
	  JRST SETZER
	MOVEM A,USER(P1)
	MOVE A,JIBLK+.JIJNO
	MOVEM A,JOBNUM(P1)
	MOVE A,JIBLK+.JITNO
	MOVEM A,TTYNUM(P1)
	MOVE A,JIBLK+.JIPNM
	MOVEM A,PRGNAM(P1)
	MOVE A,JIBLK+.JIRT
	SUB A,RUNTIM(P1)
	SKIPGE A
	  SETZ A,
	MOVEM A,DRUNTM(P1)
	MOVE A,JIBLK+.JIRT
	MOVEM A,RUNTIM(P1)
SETNXT:	AOBJN P1,SETLOP
	POP P,P1
CPOPJ1:	AOS (P)
CPOPJ:	RET

SETZER:	SETZM PERCNT(P1)
	SETZM USER(P1)
	SETZM RUNTIM(P1)
	SETZM DRUNTM(P1)
	SETOM JOBNUM(P1)
	SETOM TTYNUM(P1)
	JRST SETNXT
SUMJOB:	MOVN B,NJOBS
	HRLZS B
	SETZ A,
SUMJLP:	SKIPE USER(B)
	  AOS A
	AOBJN B,SUMJLP
	RET

;CALCULATE PERCENTAGE RUNTIME FOR EACH JOB

CALPER:	PUSH P,P1
	FLTR A,INTRVL
	PUSH P,A
	MOVN P1,NJOBS
	HRLZS P1
CALLOP:	FLTR A,DRUNTM(P1)
	FDVR A,0(P)
	FMPR A,[100.0]
	MOVEM A,PERCNT(P1)
	AOBJN P1,CALLOP
	POP P,(P)
	POP P,P1
	RET

;SORT JOBS IN ORDER OF DESCENDING RUN TIME

SORT:	PUSH P,P1
SORT1:	MOVN P1,NJOBS
	HRLZS P1
	SETZ D,
SORTLP:	MOVE A,PERCNT(P1)
	CAML A,PERCNT+1(P1)
	  JRST SORNXT
	EXCH A,PERCNT+1(P1)
	MOVEM A,PERCNT(P1)
	MOVE A,JOBNUM(P1)
	EXCH A,JOBNUM+1(P1)
	MOVEM A,JOBNUM(P1)
	SETO D,
SORNXT:	AOBJN P1,SORTLP
	JUMPN D,SORT1
	POP P,P1
	RET
;
; HERE BEGINS CODE FOR STAT GATHERING
;  --- AA. MACK
;
GSTATS:	TIME			; GET CURRENT TIME
	MOVEM A,TNEW		; SAVE IT
	MOVE A,[SIXBIT /SYSTAT/] ; GET SYSTEM TABLE
	SYSGT			;
	JUMPE B,[HRROI A,[ASCIZ/SYSTAT TABLE NOT FOUND
/]
		PSOUT
		HALTF]
	HRRZM B,SYSTAT		; SAVE TABLE NUMBER
	HLRE A,B		; NEGATIVE OF LENGTH
	MOVMM A,NSYST		;
	HLLM B,NSYST		; NSYST/-LENGTH,,+LENGTH
	MOVE A,[SIXBIT/JOBRT/]	; GET JOBRT TABLE
	SYSGT			;
	JUMPE B,[HRROI A,[ASCIZ/JOBRT TABLE NOT FOUND
/]
		PSOUT
		HALTF]
	HRRZM B,JOBRT		;
	HLRE A,B		;
	MOVMM A,NNJOBS		; SAME AS FOR SYSTAT
	HLLM B,NNJOBS		;
	MOVE A,[SIXBIT /XBIO/]	;TRY TO GET XB IO TABLE
	SYSGT			; ...
	HRRZM B,XBIO		;SAVE
	HLLZ E,NNJOBS		;
GTA1:	HRRZ A,JOBRT		; JOB RUNTIME TABLE
	HRLI A,0(E)		; 
	GETAB			;
	JRST [	CALL LJSERR
		SETZ A,		; USE 0 IF FAILURE
		JRST .+1]
	MOVEM A,JNEW(E)		;
	AOBJN E,GTA1		; LOOP TO GET ALL
	HLLZ E,NSYST		; SYSTAT TABLE
GTA2:	HRRZ A,SYSTAT		;
	HRLI A,0(E)		;
	GETAB			;
	JRST [	CALL LJSERR
		SETZ A,
		JRST .+1]
	MOVEM A,VNEW(E)		;
	AOBJN E,GTA2		; LOOP TO GET ALL 
	SKIPG A,XBIO		;GET XBIO INDEX
	JRST GTA3		;NONEX
	HRLI A,0		;FIRST GET READS
	GETAB
	 JRST GTA3
	MOVEM A,XBRNEW		;SAVE
	MOVE A,XBIO		;GET WRITES
	HRLI A,1		; ...
	GETAB
	 JRST GTA3
	MOVEM A,XBWNEW		;SAVE WRITES
GTA3:	RET			;
;PRINT STATISTICS

STATS:	MOVEI A,1		;RECORD ENTRY TYPE FOR SYSTEM STATS RECORD
	TXNE F,TUNEMF		;IF NOT IN TUNE MODE THEN DO NOT CHANGE ENTRY
				;  RECORD TYPE
	MOVEI A,6		;RECORD ENTRY TYPE FOR TUNE MODE RECORD
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL SETHD		;SET THE HEADER OF THE OUTPUT RECORD
	MOVE A,TNEW		;COMPUTE SAMPLE INTERVAL
	SUBM A,TOLD		;
	TXNE F,TUNEMF
	JRST GO5
	MOVSI G,-NVALS		; SET UP TO DO ALL VALUES
	SETZ FF,		;INIT ITEMS PER LINE
GO1:	MOVE A,OJFN
	SOJLE FF,[CALL CRLF	;DO NEW LINE IF ITEM COUNT DONE
		MOVE FF,NCOL
		JRST GO2]
	CALL SPACE		;ELSE SPACE TO NEXT ITEM
	CALL SPACE
	CALL SPACE
GO2:	HLRZ A,VNAMES(G)	; POINTER TO CALL WORD
	MOVE E,0(A)		; CALL WORD, IE. INDEX,,ROUTINE
	HLRZ A,E		; A/0,,INDEX
	CALL 0(E)		; PERFORM SPECIFIED FUNCTION
	AOBJN G,GO1		; LOOP TO DO WHOLE TABLE
	CALL CRLF		; NEW LINE
GO3:	MOVE A,[XWD VNEW,VOLD]	; MAKE CURRENT SET BE OLD SET
	BLT A,TOLD		;   FOR NEXT TIME THRU LOOP
				; BACK TO "HEADER" CODE
	RET			
TUNHED:	MOVSI G,-NSVALT
	MOVE A,OJFN
	MOVEI B,.CHFFD
	BOUT
	CALL CRLF
TUNHE1:	FMSG <  >
	HRRO B,SVNAMT(G)
	SETZ C,
	SOUT
	AOBJN G,TUNHE1
	CALL DOSNPH
	CALL CRLF
	MOVEI B,^D50
	MOVEM B,LINCNT
	RET

GO5:	MOVSI G,-NSVALT
GO4:	MOVE A,OJFN
	FMSG < >
	HLRZ A,SVNAMT(G)
	MOVE E,0(A)
	HLRZ A,E
	CALL 0(E)
	AOBJN G,GO4
	JRST GO3
; DOPCT -- ITEM AS PERCENTAGE OF REALTIME INTERVAL

DOPCTH:	MOVE B,VNEW(A)		;HERE FOR HP UNITS
	SUBB B,VOLD(A)
	IDIVI B,^D100		;CONVERT TO 1 MS UNITS
	JRST DOPCTX

DOPCT:	MOVE B,VNEW(A)		;
	SUBB B,VOLD(A)		;
DOPCTX:	MOVE A,B		;
DOPCT1:	IMULI A,^D1000
DOPCT3: IDIV A,TOLD		; GET PERCENT*10
	ASH B,1			; ROUNDING -- IF REMAINDER IS
	CAML B,TOLD		;  GEQ DIVISOR/2, THEN ADD 1
	ADDI A,1
				;
				; SPLIT INTO INTEGER & FRACTION
				; GREATER THAN 100% ?
				; YES, JUST PRINT INTEGER
DOPCT2:	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL OPCT		;OUTPUT PERCENTAGE TO DATA FILE
	IDIVI A,^D10
	CAIL A,^D100
	JRST [	CALL LABEL
		MOVE B,A
		MOVE A,OJFN
		MOVE C,[1B2+1B4+1B5+4B17+12] ; 4 COLUMNS
		NOUT
		JFCL
		MOVEI B,"."
		BOUT
		RET  ]
	PUSH P,B		; SAVE FRACTION
	CALL LABEL		; PRINT STAT NAME
	MOVE B,A		; 
	MOVE A,OJFN		;
	MOVE C,[1B2+1B4+1B5+3B17+12] ; 3 COLUMNS FOR INTEGER
	NOUT			; PRINT THE NUMBER
	JFCL			;
	MOVEI B,"."		;
	BOUT			;
	POP P,B			;
	HRLI C,(1B4+1B5+1B17)	; ONE COLUMN FOR FRACTION
	NOUT			; PRINT THE FRACTION
	JFCL			;
	RET			; AND GO BACK
; FUNCTIONS TO COMPUTE SYSTAT & JOBRT DATA
;
; DOUSE -- TAKES NO INDEX, ADDS UP ALL JOB RUN TIMES
;
DOUSE:	HLLZ D,NNJOBS		; NUMBER OF JOBS ON SYSTEM
	SETZB A,JOBCT		; SET TO ACCUMULATE RUN TIMES
DOUSE2:	SKIPGE B,JNEW(D)	; IF JOB DOESN'T EXIST, SKIP IT
	JRST DOUSE1		;
	SKIPL C,JOLD(D)		; IF JOB DIDN'T EXIST BEFORE,
	CAMGE B,C		;  OR LOGGED OUT AND IN AGAIN,
	SETZ C,			;  USE 0 AS PREVIOUS RUNTIME
	SUB B,C			; NEW - OLD
	MOVEM B,JOLD(D)		; SAVE INTERVAL RUN TIME FOR JOB
	ADD A,B			; ACCUMULATE TOTAL RUN TIME
	AOS JOBCT		;
DOUSE1: AOBJN D,DOUSE2		; LOOP BACK TO DO ALL
	JRST DOPCT1		; GO DO PERCENTAGE OF INTERVAL

; LABEL -- PRINTS A STAT NAME
;
LABEL:	TXNE F,TUNEMF
	RET
	PUSH P,A		; STACK A
	MOVE A,OJFN		;
	HRRO B,VNAMES(G)	; OUTPUT STAT NAME
	SETZ C,			;
	SOUT			; PRINT THE LABEL
	HRROI B,[ASCIZ/: /]	;
	SETZ C,			;
	SOUT			;
	POP P,A			; RESTORE A
	RET			; AND GO BACK

;DO NUMBER AS RATE - NUMBER/SECOND

DORAT:	MOVE B,VNEW(A)
	SUBB B,VOLD(A)
DORAT0:	JUMPE B,DOZRO
	IMULI B,^D10000		;10 * MILLISECONDS
	MOVE A,B
	JRST DOPCT3
;DO NUMBER AS RATE PER MINUTE

DORAT1:	MOVE B,VNEW(A)
	SUBB B,VOLD(A)
	JUMPE B,DOZRO
	IMUL B,[^D6000000]	;PER 60000 MS, * 100 FOR OUTPUT
	MOVE A,B
	IDIV A,TOLD		; GET PERCENT*100
	ASH B,1			; ROUNDING -- IF REMAINDER IS
	CAML B,TOLD		;  GEQ DIVISOR/2, THEN ADD 1
	ADDI A,1		;
	CAIL A,^D10000		;WITHIN RANGE?
	JRST [	IDIVI A,^D10	;NO, SCALE AND PRINT AS INTEGER
		JRST DOPCT2]
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL ORAT		;OUTPUT THE RATE TO THE DATA FILE
	IDIVI A,^D100		;100 IS UNIT
	PUSH P,B		;SAVE FRACTION
	CALL LABEL
	MOVE B,A		;SETUP INTEGER PART
	MOVE A,OJFN
	MOVX C,NO%LFL+NO%OOV+NO%AST+2B17+^D10
	NOUT
	 NOP
	MOVEI B,"."
	BOUT
	POP P,B
	MOVX C,NO%LFL+NO%ZRO+NO%OOV+NO%AST+2B17+^D10
	NOUT
	 NOP
	RET

;DO TOTAL DISK IO RATE

DOIO:	MOVE B,VOLD(A)		;4 CONSECUTIVE TOTALS
	ADD B,VOLD+1(A)
	ADD B,VOLD+2(A)
	ADD B,VOLD+3(A)
	JRST DORAT0

;TOTAL DISK IO - TUNE MODE

DOIOT:	MOVE B,VNEW(A)
	SUB B,VOLD(A)
	ADD B,VNEW+1(A)
	SUB B,VOLD+1(A)
	ADD B,VNEW+2(A)
	SUB B,VOLD+2(A)
	ADD B,VNEW+3(A)
	SUB B,VOLD+3(A)
	JRST DORAT0

;OUTPUT 0 IN FIVE COLUMNS

DOZRO:	MOVEI A,0
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL ORAT		;OUTPUT THE RATE TO THE DATA FILE
	CALL LABEL
	MOVE A,OJFN
	HRROI B,[ASCIZ /    0/]
	SETZ C,
	SOUT
	RET
; DONUM -- INTEGER NUMBER
;
DONUM:	CALL LABEL		; PRINT A STAT NAME
	MOVE B,VNEW(A)		;
	SUBB B,VOLD(A)		;
PNUM:	MOVE A,OJFN		; SET UP FOR OUTPUT
	MOVE C,[1B2+1B4+1B5+5B17+12] ; 5 COLUMNS
	NOUT			;
	JFCL			;
	RET			; AND GO BACK

; DOAV -- AVERAGE COMPUTED FROM INTEGRAL OVER DT
;
DOAV:	MOVE B,VNEW(A)		;
	SUBB B,VOLD(A)		;
	IMULI B,12		; FOR ONE PLACE AFTER POINT
	MOVE A,B		;
	JRST DOPCT3		; GO DIVIDE BY DT

; DOAVB -- AVERAGE COMPUTED FROM INTEGRAL.DBALSETTIME
;
DOAVB:	MOVE B,VNEW(A)		;
	SUBB B,VOLD(A)		;
	IMULI B,1750		; 1750 = 1000
	IDIV B,VOLD+NBWTX	; DIVIDE BY NBWT
	ASH C,1			; ROUNDING -- SEE DOPCT3
	CAML C,VOLD+NBWTX	;
	ADDI B,1		;
	MOVE A,B		;
	JRST DOPCT2		;

;DOXB - PRINT XBIO VALUES

DOXB:	RET			;**TEMP**
	CALL LABEL		;OUTPUT NAME
	MOVE B,XBRNEW(A)	;GET VALUE
	SUB B,XBROLD(A)		;GET DIFFERENCE
	CALL PNUM		;PRINT IT
	RET			;DONE


; SPACE -- INSERTS A SPACE WHEN NECESSARY
;
SPACE:	MOVEI B," "		; NULL CHARACTER
	BOUT			; SPACE OVER
	RET			; RETURN
;
; LISTIT -- PRINTS LIST OF SWATCH ABBREVIATIONS TO TTY:
;           AT USER'S REQUEST
;
LISTIT:	HRROI A,HELP		; GRAB THE LIST
	PSOUT			;
	RET			; AND GO BACK

SKNOB:	MOVEI A,.SKRBC		;READ KNOB
	MOVEI B,SKJBP
	SKED%
	ERJMP .+1
	CALL LABEL
	MOVE B,SKJBP+.SAKNB
	MOVE A,OJFN
	MOVE C,[1B2+1B4+1B5+5B17+12]
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL ONUM		;OUTPUT THE NUMBER
	NOUT
	NOP
	RET
; TABLE OF ITEMS TO BE REPORTED

;ITEMS ARE PRINTED 4 ACROSS PAGE, HENCE SOME USEFUL GROUPINGS OF 4
;SHOULD BE NOTED WHEN ADDING NEW ITEMS

DEFINE VNAME(NM,SUBR,LC)<
	XWD [XWD LC,SUBR],[ASCIZ/NM/]>

VNAMES:	VNAME(USED,DOPCT,32)
	VNAME(IDLE,DOPCT,0)
	VNAME(SWPW,DOPCT,1)
	VNAME(SKED,DOPCT,2)

	VNAME(SUSE,DOUSE,0)
	VNAME(TCOR,DOPCTH,24)
	VNAME(FILW,DOPCTH,50)
	VNAME(BGND,DOPCTH,43)

	VNAME(NTRP,DORAT,44)
	VNAME(NCOR,DORAT1,23)
	VNAME(AJBL,DORAT1,36)
	VNAME(NREM,DORAT1,25)

	VNAME(TRAP,DOPCT,3)
	VNAME(NRUN,DOAV,13)
	VNAME(NBAL,DOAV,NBALX)
	VNAME(NWSM,DOAV,47)

	VNAME(BSWT,DOAV,NBWTX)
	VNAME(DSKR,DOAVB,17)
	VNAME(DSKW,DOAVB,35)
	VNAME(SWPR,DOAVB,20)

	VNAME(NLOD,DORAT1,51)
	VNAME(CTXS,DORAT,42)
	VNAME(UPGS,DOAV,37)
	VNAME(FPGS,DOAV,40)

	VNAME(DMRD,DORAT,4)
	VNAME(DMWR,DORAT,5)
	VNAME(DKRD,DORAT,6)
	VNAME(DKWR,DORAT,7)

	VNAME(TTIN,DORAT,21)
	VNAME(TTOU,DORAT,22)
	VNAME(WAKE,DORAT,10)
	VNAME(TTCC,DORAT1,11)

	VNAME(TDIO,DOIO,4)
	VNAME(RPQS,DORAT,45)
	VNAME(GCCW,DORAT,46)
	VNAME(XGCW,DORAT,53)

	VNAME(KNOB,SKNOB,0)
	VNAME(XBRD,DOXB,0)
	VNAME(XBWT,DOXB,1)
NVALS==.-VNAMES
NBALX==12
NBWTX==26
;SHORT TABLE OF ITEMS FOR TUNE MODE

SVNAMT:	VNAME (USED,DOPCT,32)
	VNAME(SWPW,DOPCT,1)
	VNAME(SKED,DOPCT,2)
	VNAME(CTXS,DORAT,42)
	VNAME(WAKE,DORAT,10)
	VNAME(TDIO,DOIOT,4)
	VNAME(NRUN,DOAV,13)
	VNAME(NWSM,DOAV,47)
	VNAME(NLOD,DORAT1,51)
NSVALT==.-SVNAMT

;HERE FOR INITIAL HELP

DOHLP:	CALL LISTIT		; PRINT THE LIST
	JRST GOJFN

; LIST OF ABBREVIATIONS USED
;

HELP:	ASCIZ /

    ALL DATA IS FOR LAST INTERVAL ONLY.

USED: USED TIME AS PERCENTAGE
IDLE: IDLE TIME AS PERCENTAGE
SWPW: SWAP-WAIT TIME AS PERCENTAGE
SKED: SCHEDULER OVERHEAD TIME AS PERCENTAGE
SUSE: SUM OF JOB RUNTIMES AS PERCENTAGE
TCOR: GCCOR TIME AS PERCENTAGE
FILW: FILE-WAIT TIME AS PERCENTAGE
BGND: BACKGROUND ACTIVITY TIME (TTCH7, ETC.) AS PERCENTAGE
NTRP: PAGE TRAPS PER SECOND
NCOR: GCCOR'S (GARBAGE-COLLECT CORE) PER MINUTE
AJBL: FORCED CALLS TO AJBALS (ADJUST BALANCE SET) PER MINUTE
NREM: FORCED PROCESS REMOVALS PER MINUTE
TRAP: PAGER TRAP SERVICE TIME PERCENTAGE (COUNTS IN USED ALSO)
NRUN: AVERAGE NUMBER RUNNABLE FORKS DURING INTERVAL
NBAL: AVERAGE NUMBER FORKS IN BALANCE SET DURING INTERVAL
NWSM: AVERAGE NUMBER WORKING SETS IN MEMORY DURING INTERVAL
BSWT: AVERAGE NUMBER BALANCE SET FORKS WAITING DURING INTERVAL
DSKR: PERCENT OF BALANCE SET WAITS ATTRIBUTABLE TO DSK READS
DSKW: PERCENT OF BALANCE SET WAITS ATTRIBUTABLE TO DSK WRITES
SWPR: PERCENT OF BALANCE SET WAITS ATTRIBUTABLE TO SWAP READS
NLOD: WORKING SET LOADS PER MINUTE
CTXS: CONTEXT SWITCHES PER SEC
UPGS: AVERAGE NUMBER OF PAGES IN THE BALANCE SET (SUM OF WORKING SET SIZES)
FPGS: AVERAGE NUMBER OF FREE PAGES (PAGES ON REPLACABLE QUEUE)
DMRD: DRUM READS PER SEC
DMWR: DRUM WRITES PER SEC
DKRD: DISK READS PER SEC
DKWR: DISK WRITES PER SEC
TTIN: TERMINAL INPUT CHARACTERS PER SEC
TTOU: TERMINAL OUTPUT CHARACTERS PER SEC
WAKE: PROCESS WAKEUPS PER SEC
TTCC: TERMINAL INTERRUPTS PER MINUTE
TDIO: TOTAL DISK IO PER SEC
RPQS: "SAVES" FROM REPLACABLE QUEUE PER SECOND
GCCW: WRITES BY GCCOR AND WSSWPO PER SECOND
XGCW: WRITES BY XGC PER SECOND
KNOB: SCHEDULER KNOB

QUEUE DISTRIBUTION PERCENTAGE: FRACTION OF "USED" TIME USED ON
	EACH SCHEDULER QUEUE.
LOAD AVERAGES: EXPONENTIAL AVERAGE OF NUMBER OF RUNNABLE FORKS WITH
	TIME CONSTANTS OF 1, 5, AND 15 MINUTES.
HIGH QUEUE AVERAGES: COMPONENT OF LOAD AVERAGE DUE TO FORKS ON
	INTERACTIVE QUEUES.
LOW QUEUE AVERAGES: COMPONENT OF LOAD AVERAGE DUE TO FORKS ON
	COMPUTE QUEUE.

RUN TIME: TOTAL ACCUMULATED RUN TIME OF JOB (ALL FORKS) AS HH:MM:SS.
DELTA RT: JOB RUNTIME IN LAST INTERVAL
%: JOB RUNTIME AS PERCENTAGE OF "USED"
/
;QUEUE TIMES LOGIC

;READ CURRENT QUEUE TIMES INTO TABLE

GETQS:	MOVE A,[QTTAB,,OQTTAB]
	BLT A,OQTTAB+NQTAB-1	;COPY CURRENT DATA TO OLD
	MOVE A,[SIXBIT /QTIMES/]
	SYSGT			;GET TABLE PARAMETERS
	HLLZ D,B
	HLREM B,NQUEUE		;SAVE NEG TABLE SIZE
GETQS1:	HRRZ A,B		;SETUP  INDEX,,TABLE NUMBER
	HRL A,D
	GETAB
	 JFCL
	MOVEM A,QTTAB(D)	;SAVE DATA
	AOBJN D,GETQS1
	RET

;PRINT QUEUE TIMES AS PERCENTAGE OF INTERVAL

PQSUM:	MOVE A,OJFN
	HRROI B,[ASCIZ /QUEUE DISTRIBUTION PERCENTAGE: /]
	SETZ C,
	SOUT
	HRLZ D,NQUEUE
	MOVEI P3,.PQMAX		;SET COUNTER TO CHECK OVERFLOW OF QUEUE ENTRIES
				;  DATA RECORD
PQSUM1:	MOVE B,QTTAB(D)		;GET CURRENT TIME
	SUB B,OQTTAB(D)		;COMPUTE DELTA
	FLTR B,B		;FLOAT IT
	FMPRI B,(100.0)		;COMPUTE PERCENTAGE
	FLTR C,INTRVL
	FDVR B,C
	MOVX C,<FLD(.FLLSP,FL%JUS)+FL%ONE+FL%PNT+FLD(4,FL%FST)+FLD(2,FL%SND)>
	SOJL P3,PQSUM2		;DO NOT OUTPUT TO DATA RECORD IF IT IS FULL OF
				;  QUEUE ENTRIES
	TXNE F,ODATFL		;TEST IF USING DATA FILE
	CALL OFLT		;OUTPUT A FLOATING POINT NUMBER
PQSUM2:	FLOUT			;PRINT IT
	 JFCL
	AOBJN D,PQSUM1
	CALL CRLF		;DO CRLF
	TXNN F,ODATFL		;TEST IF USING DATA FILE
	RET			;RETURN
	CALL PQFIL		;APPEND ZERO ENTRIES TO FILL RECORD AND OUTPUT
				;  NUMBER OF GOOD ENTRIES
	CALL PRIREC		;OUTPUT THE DATA RECORD
	RET
JOBNUM:	BLOCK JBMAX
TTYNUM:	BLOCK JBMAX
USER:	BLOCK JBMAX
PRGNAM: BLOCK JBMAX
RUNTIM: BLOCK JBMAX
DRUNTM: BLOCK JBMAX
PERCNT: BLOCK JBMAX
STR:	0

NJOBS:	0
OJFN:	0
NCOL:	0
LINCNT:	0
PJFLDW:	0			;PTR TO NEXT FIELD WIDTH
WAITIM:	0
STIME:	0
INTRVL:	0
SOLDTM:	0
NULTIM: 0
LOSTIM: 0
SCHEDT: 0
JIBLK:	BLOCK 10
	STRNGL==20
STRING: BLOCK STRNGL
	PDLEN==50
PDL:	BLOCK PDLEN

NNJOBS:	BLOCK 1
NSYST:	BLOCK 1
SYSTAT:	BLOCK 1
JOBRT:	BLOCK 1
XBIO:	BLOCK 1
JOBCT:  BLOCK 1
;
; ITEM TABLES -- ORDER OF NEW MUST BE SAME AS ORDER OF OLD:
;  V MUST BE FIRST & T MUST BE LAST
;

NSTATW==100			;NUMBER OF STATISTICS WORDS MAX
VOLD:	BLOCK NSTATW
JOLD:   BLOCK JBMAX
XBROLD:	BLOCK 1
XBWOLD:	BLOCK 1
TOLD:	BLOCK 1

VNEW:	BLOCK NSTATW
JNEW:	BLOCK JBMAX
XBRNEW:	BLOCK 1
XBWNEW:	BLOCK 1
TNEW:	BLOCK 1

NQTAB==7			;MAX NUMBER QUEUES POSSIBLE
QTTAB:	BLOCK NQTAB		;CURRENT QUEUE TIMES
OQTTAB:	BLOCK NQTAB		;PREVIOUS QUEUE TIMES
NQUEUE:	BLOCK 1			;ACTUAL NUMBER QUEUES (NEGATIVE)

SKJBP:	10			;SIZE OF BLOCK
	BLOCK 7			;JOB PARAMETERS BLOCK

SKLDA:	7			;CLASS LOAD AVERAGES BLOCK
	BLOCK 7


	END <3,,ENTVEC>