Google
 

Trailing-Edge - PDP-10 Archives - bb-k345a-sb - lines.mac
There are 9 other files named lines.mac in the archive. Click here to see a list.
	TITLE	LINES - W.M.U.
	SUBTTL	TAKE SYSTEM DATA ON A MINUTELY BASIS
	SALL

;ASSEMBLY PARAMETERS

FTSCHED==1		;1 IFF SCHEDULER STATISTICS ARE DESIRED
IFNDEF	FTSCHED,<FTSCHED==0>

;ACCUMULATORS

MV=0		;MONVER
GI=1		;ADDRESS OF GETTAB IMMEDIATE TABLE
A=2
B=3
C=4
D=5
E=6
G=7
H=10
I=11
T1=12
T2=13
T3=14
T4=15
N=15
Q=16
P=17

;OTHER FIXED VALUE SYMBOLS

DSK==1
PTY==2
SPYSEG==400000

;OPDEFS

	OPDEF	PJRST	[JRST]

;MACROS

DEFINE	TYPE	(STRING)
<	OUTSTR	[ASCIZ /STRING/]>

DEFINE	ERROR	(STRING)
<	JSP	T1,FATAL
	JFCL	[ASCIZ/ ? STRING - LINES STOPPED/]
>

;GETTAB CONSTANT DEFINITIONS

	DEFINE	T.(TABLE,VALUE)
<	TABLE==VALUE>
	DEFINE	I.(ITEM,VALUE)
<	ITEM==SPYSEG+VALUE>

T.(.GTSTS,0)

T.(.GTPPN,2)

T.(.GTTTY,10)

T.(.GTCNF,11)
	I.(%CNTIM,10)
	I.(%CNDAT,11)
	I.(%CNSJN,15)
	I.(%CNFRE,23)
	I.(%CNTTC,30)
	I.(%CNTTN,31)
	I.(%CNVER,34)
	I.(%CNDTM,53)

T.(.GTNSW,12)
	I.(%NSCMX,10)
	I.(%NSNXM,34)

T.(.GTLVD,16)
	I.(%LDUNI,7)
	I.(%LDSWP,10)

T.(.GTLIM,40)

T.(.GTC0V,56)
	I.(%CVUPT,5)
	I.(%CVNUL,37)
	I.(%CVOHT,42)

T.(.GTSST,115)
	I.(%SSSCD,22)

T.(.GTCRT,123)

T.(.GTPAR,142)
;VERSION
	VMAJOR==5
	VMINOR==0
	VEDIT==24
	VWHO==0

	LOC	137
	BYTE	(3)VWHO(9)VMAJOR(6)VMINOR(18)VEDIT
	RELOC

;MAIN CONTROL LOOP

LINES:	RESET
	JSP	P,INITIA	;INITIALIZE
MAINLP:	PUSHJ	P,SNOOZE	;SLEEP FOR A WHILE
	PUSHJ	P,JOBS		;NUMBER OF JOBS AND LINES IN USE
	PUSHJ	P,CPUITL	;CPU UTILIZATION
	PUSHJ	P,DISK		;DISK PERFORMANCE
	PUSHJ	P,SWAPER	;SWAPPER INFO
	PUSHJ	P,CBUSED	;AMOUNT OF CORE BLOCKS USED
	PUSHJ	P,TTYUSD	;AMOUNT OF TTY CHUNKS USED
IFN	FTSCHED,<
	PUSHJ	P,GETPAR	;GET SCHEDULER PARAMETERS AND STATISTICS
	PUSHJ	P,GETCLS	;GET CLASS RUNTIMES
>
	PUSHJ	P,DMPMIN	;DUMP DATA FOR THIS MINUTE
	JRST	MAINLP		;LOOP
;INITIALIZATION CODE

INITIA:	SETZM	DBASE
	MOVE	Q,[DBASE,,DBASE+1]
	BLT	Q,DBEND-1
	MOVEM	P,PDL
	MOVE	P,[IOWD 27,PDL+1]
	MOVE	Q,[12,,11]
	GETTAB	Q,
	ERROR	(LNSGTB GETTAB 11 ERROR)
	SUBI	Q,1
	SPY	Q,
	ERROR	(LNSSPY SPY ERROR)
	MOVE	GI,[23,,23]	;ADDRESS OF GETTAB IMMEDIATE TABLE
	GETTAB	GI,
	ERROR	(LNSGTB GETTAB 23 ERROR)
	ADDI	GI,SPYSEG	;GET OUR ADDRESS
	MOVEM	GI,GETTBI	;SAVE IT
	MOVE	Q,.GTCNF(GI)	;ADDRESS OF CONFIG TABLE
	HRRZ	MV,%CNVER(Q)	;GET MONVER
	MOVEM	MV,MONVER
	POPJ	P,

;SLEEP TO BEGINNING OF NEXT MINUTE

SNOOZE:	MOVE	Q,.GTCNF(GI)	;ADDRESS OF CONFIG TABLE
	MOVE	A,%CNTIM(Q)	;GET TIME IN JIFFIES
	IDIVI	A,^D60*^D60
	ADDI	B,^D30
	IDIVI	B,^D60		;GET SECONDS ELAPSED IN THIS MINUTE
	MOVEI	A,^D75
	SUB	A,B		;TIME TO GO
	SLEEP	A,		;WAIT IT OUT
	MOVE	A,%CNDAT(Q)	;GET 15 BIT DATE
	MOVEM	A,THSDAT	;SAVE IT
	MOVE	A,%CNTIM(Q)
	IDIVI	A,^D60*^D60*^D60 ;GET THE HOUR
	MOVEM	A,HOUR
	IDIVI	B,^D60*^D60
	MOVEM	B,MINUTE	;SAVE THE MINUTE
	POPJ	P,
;COUNT NUMBER OF JOBS AND LINES ACTIVE

JB.LBT==1B10			;BATCH JOB BIT

JOBS:	SKIPE	A,JOBAOB	;FIRST TIME THROUGH?
	JRST	JOBS1		;NO
	MOVE	Q,.GTCNF(GI)	;ADDRESS OF CONFIG TABLE
	MOVN	A,%CNSJN(Q)	;GET -SEGN,,+JOBN
	MOVSI	A,(A)
	ADD	A,[1,,SPYSEG+1]	;MAKE AOBJN WORD
	MOVEM	A,JOBAOB
	MOVE	T1,.GTSTS(GI)	;ADDRESS OF JOB STATUS TABLE
	HRRM	T1,MOVSTS	;MODIFY INSTRUCTION
	MOVE	T1,.GTPPN(GI)	;ADDRESS OF PPN TABLE
	HRRM	T1,MOVPPN	;MODIFY INSTRUCTION
	MOVE	T1,.GTTTY(GI)	;ADDRESS OF JOB TO TERMINAL TABLE
	HRRM	T1,MOVTTY	;MODIFY INSTRUCTION
	MOVE	T1,.GTLIM(GI)	;ADDRESS OF BATCH PARAMETERS TABLE
	HRRM	T1,MOVLIM	;MODIFY INSTRUCTION
JOBS1:	SETZM	LNCNT
	SETZM	JBCNT
MOVSTS:	MOVE	T1,.GTSTS(A)	;GET JOB STATUS
	TLNN	T1,(1B3)	;JOB ASSIGNED?
	JRST	JOBS4		;NO
	AOS	JBCNT		;COUNT THE JOB
	TLNN	T1,(1B15)	;LOGGED IN?
	JRST	JOBS4		;NO
	HRLOI	T1,1
MOVPPN:	CAML	T1,.GTPPN(A)	;SYSTEMS NUMBER?
	JRST	JOBS4		;YES
MOVTTY:	SKIPN	T1,.GTTTY(A)	;TTY DDB FOR JOB?
	JRST	JOBS4		;NO
	MOVE	T2,SPYSEG(T1)	;GET TTY NAME
	TLNN	T2,-1		;ATTACHED?
	JRST	JOBS4		;NO
MOVLIM:	MOVE	T1,.GTLIM(A)	;GET BATCH PARAMETERS
	TLNN	T1,(JB.LBT)	;BATCH JOB
	AOS	LNCNT		;NO, COUNT THE LINE
JOBS4:	AOBJN	A,MOVSTS
	POPJ	P,
;COMPUTE PERCENTAGE OF USED CORE BLOCKS

CBUSED:	MOVE	Q,.GTCNF(GI)	;ADDRESS OF CONFIG TABLE
	MOVE	A,%CNFRE(Q)	;FREPTR AOBJN WORD
	HLRO	B,A
	MOVM	B,B
	IMULI	B,^D36
	MOVEM	B,TOTBIT	;TOTAL 4-WORD CORE BLOCKS
	SETZ	N,
WRDLP:	SKIPN	B,SPYSEG(A)	;GET FIRST WORD
	JRST	FREWRD		;THIS WORD IS EMPTY?
	TLZE	B,400000	;SIGN BIT ON?
	AOJ	N,		;YES
BITLP:	MOVN	C,B		;GET 2'S COMPLEMENT
	TDZE	B,C		;ANY ONES LEFT?
	AOJA	N,BITLP		;YES
FREWRD:	AOBJN	A,WRDLP
	IMULI	N,^D100
	IDIVM	N,TOTBIT	;THIS % IS USED
	POPJ	P,

;COMPUTE PERCENTAGE OF USED TELETYPE BUFFER AREA

TTYUSD:	MOVE	Q,.GTCNF(GI)	;ADDRESS OF CONFIG TABLE
	HLRZ	A,%CNTTC(Q)	;TOTAL TTY CHUNKS
	MOVE	B,%CNTTN(Q)	;CHUNKS FREE
	SUBM	A,B		;GET NO USED
	IMULI	B,^D100
	IDIV	B,A		;PERCENTAGE USED
	MOVEM	B,USDCNK
	POPJ	P,

;CPU DATA

CPUITL:	MOVE	Q,.GTC0V(GI)	;ADDRESS OF CPU0 CDB
	MOVE	A,%CVUPT(Q)	;UPTIME
	MOVEM	A,D		;SAVE UPTIME
	MOVE	B,%CVNUL(Q)	;GET NULL TIME
	MOVEM	B,E		;SAVE NULL TIME
	IMULI	B,^D100
	IDIV	B,A		;GET TOTAL NULL TIME
	MOVEM	B,TOTNUL
	SUB	D,OLDUP		;GET ELAPSED UPTIME
	ADDM	D,OLDUP		;UPDATE IT
	SUB	E,OLDNUL	;GET ELAPSED NULL TIME
	ADDM	E,OLDNUL	;UPDATE IT
	IMULI	E,^D100
	IDIV	E,D
	MOVEM	E,MINNUL	;PERCENT OF NULL TIME FOR LAST MINUTE
	MOVE	A,%CVOHT(Q)	;GET MONITOR OVERHEAD
	SUB	A,OLDOVH
	ADDM	A,OLDOVH	;UPDATE OLD OVERHEAD
	IMULI	A,^D100
	IDIV	A,D
	MOVEM	A,MINOVH	;MONITOR OVERHEAD FOR LAST MINUTE
;DISPLAY CPU UTILIZATION FOR LAST HOUR IN PROGRAM NAME 

	MOVE	A,MINDEX
	CAIGE	A,^D60
	JRST	.+3
	SETZ	A,
	SETOM	FRSFLG
	MOVE	D,MINNUL
	MOVEM	D,HRNULL(A)
	ADDI	A,1
	MOVEM	A,MINDEX
	SETZ	C,
	HRLZI	D,-^D60
	ADD	C,HRNULL(D)
	AOBJN	D,.-1
	SKIPE	FRSFLG
	MOVEI	A,^D60
	IDIV	C,A
	SUBI	C,^D100		;COMPLEMENT OF NULL TIME
	MOVMS	C
	CAIL	C,^D100		;100 %?
	JRST	[MOVE C,['  100%']
		JRST %100]
	IDIVI	C,^D10		;1ST DIG IN C, 2ND IN N
	LSH	C,^D12
	LSH	D,^D6
	IORI	C,'00%'(D)	;MAKE IT READABLE
%100:	TLNE	C,770000	;LEADING SPACES?
	JRST	%100A		;NO, CHANGE NAME
	LSH	C,6		;YES, THROW ONE AWAY
	JRST	%100		;AND LOOK AGAIN

%100A:	SETNAM	C,
	POPJ	P,
;DSK USEAGE ROUTINE

DISK:	MOVE	Q,.GTLVD(GI)	;ADR OF DISK PARAMETER TABLE
	HLRZ	A,%LDUNI(Q)	;GET ADDRESS OF FIRST UNIT
	SETZB	C,D		;ZERO FREE BLOCKS AND TOTAL BLOCKS
	SETZ	E,		;ZERO BLOCKS TRANSFERED
DSKLP0:	ADD	E,SPYSEG+16(A)	;BUFFERED READS
	ADD	E,SPYSEG+17(A)	;BUFFERED WRITES
	ADD	E,SPYSEG+20(A)	;DUMP READS
	ADD	E,SPYSEG+21(A)	;DUMP WRITES
	ADD	E,SPYSEG+22(A)	;MONITOR READS
	ADD	E,SPYSEG+23(A)	;MONITOR WRITES
	SUB	E,SPYSEG+24(A)	;SUBTRACT BLOCKS SWAPPED IN FROM MR
	SUB	E,SPYSEG+25(A)	;SUBTRACT BLOCKS SWAPPED OUT FROM MW
	MOVE	T1,SPYSEG(A)	;GET PHYSICAL UNIT NAME
	MOVEM	T1,DSKCHB	;STORE IN DSKCHR BLOCK
	MOVE	T2,[20,,DSKCHB]
	DSKCHR	T2,		;GET UNIT CHARACTERISTICS
	ERROR	(LNSDCH DSKCHR ERROR)
	ADD	C,DSKCHB+3	;ACCUMULATE TOTAL FREE BLOCKS
	ADD	D,DSKCHB+6	;ACCUMULATE TOTAL BLOCKS ON UNIT
	MOVE	T1,DSKCHB+12	;K FOR SWAPPING MUST BE SUBTRACTED
	LSH	T1,3		;CONVERT TO BLOCKS
	SUB	D,T1		;SUBTRACT SWAPPING SPACE
NOTPUB:	HLRZ	A,SPYSEG+3(A)	;ADDRESS OF NEXT UNIT
	JUMPN	A,DSKLP0	;CONTINUE IF MORE
	SUB	E,TOTDSK
	ADDM	E,TOTDSK	;TOTAL BLOCKS TRANSFERED
	MOVEM	E,MINDSK	;BLOCKS TRANSFERED IN LAST MINUTE
	IMULI	C,^D100
	IDIV	C,D
	SUBI	C,^D100
	MOVNM	C,DSKUSD	;PERCENT OF PUBLIC DISK SPACE USED
	POPJ	P,
;SWAPPING DATA

SWAPER:	SETZB	E,G
	SETZ	N,
	MOVE	Q,.GTLVD(GI)	;ADR OF DISK PARAMS TABLE
	HLRZ	D,%LDSWP(Q)	;ADR OF FIRST SWAP UNIT
SWLP1:	ADD	N,SPYSEG+24(D)	;GET R ON FHA
	ADD	N,SPYSEG+25(D)	;GET W ON FHA
	ADD	E,SPYSEG+31(D)	;P FREE FOR SWAPPING
	LDB	B,[POINT 13,SPYSEG+7(D),35]
	ADD	G,B		;K TO BEGIN WITH FOR SWAPPING
	HLRZ	D,SPYSEG+7(D)	;NEXT UNIT FOR SWAPING
	JUMPN	D,SWLP1		;LAST UNIT?
	LSH	G,1		;SINCE G HAS K AND E HAS PAGES
	SUB	E,G
	MOVNS	E		;PAGES USED FOR SWAPPING
	IMULI	E,^D100
	IDIV	E,G		;% OF SWAPPING SPACE USED
	MOVEM	E,SWUSED
	SUB	N,TOTSWP
	ADDM	N,TOTSWP	;UPDATE TOTAL BLOCKS SWAPPED
	MOVEM	N,MINSWP	;BLOCKS SWAPPED IN LAST MINUTE
	POPJ	P,
IFN	FTSCHED,<

;SCHEDULER PARAMETERS

NOPAR==^D34			;ACTUAL NUMBER OF PARAMETERS USED
NCLASS==^D16			;NUMBER OF SCHEDULER CLASSES
NPAR==NOPAR+NCLASS+^D20		;ROOM FOR UP TO 50 PARAMETERS + 20 TO SPARE

GETPAR:	SKIPGE	A,PARAOB	;FIRST TIME THRU?
	JRST	GETP1		;NO
	JUMPG	A,CPOPJ		;RETURN IF GETTAB DESN'T WORK
	AOS	PARAOB		;FLAG THAT WE HAVE BEEN THRU THIS CODE BEFORE
	MOVEI	A,.GTPAR	;GETTAB SCHEDULER PARAMETERS
	GETTAB	A,
	POPJ	P,		;NO SUCH GETTAB
	MOVE	B,.GTPAR(GI)
	ADDI	B,SPYSEG
	HRRM	B,GETP1
	HRRM	B,GETP2
	LDB	A,[POINT 9,B,8]
	CAILE	A,NOPAR-1	;MAXIMUM OF NOPAR ENTRIES
	MOVEI	A,NOPAR-1
	SUBI	A,^D8		;ACCOUNT FOR WASTE PAGES AND SWAP TIMES
	SETCA	A,
	HRLZ	A,A
	MOVEM	A,PARAOB	;SAVE AOBJN WORD
GETP1:	MOVE	B,.GTPAR(A)	;RH REPLACED BY ADR OF SPYSEG, ETC.
	EXCH	B,SAVPAR(A)
	SUB	B,SAVPAR(A)
	MOVNM	B,OUTPAR(A)	;USE DIFFERENCE WITH LAST VALUE
	AOBJN	A,GETP1
GETP2:	HRLZI	B,.GTPAR(A)	;RH REPLACED BY ADR OF SPYSEG, ETC.
	HRRI	B,NEWPAR
	BLT	B,NEWPAR+7	;DON'T LET THEM CHANGE IN THE MIDDLE
	DEFINE	YANK(X)
<	MOVE	B,X+NEWPAR	;GET 2 SINGLE WORD ENTRIES
	MOVE	C,X+NEWPAR+1	;GET 2 SINGLE WORD ENTRIES
	EXCH	B,X+SAVPAR(A)	;SAV THE NEW VALUES
	EXCH	C,X+SAVPAR+1(A)
	SUB	B,X+SAVPAR(A)	;GET DIFFERENCES
	SUB	C,X+SAVPAR+1(A)
	MOVNM	B,X+OUTPAR(A)	;STORE FOR OUTPUT
	MOVNM	C,X+OUTPAR+1(A)
	MOVE	B,X+NEWPAR+2	;GET 1 DOUBLE WORD ENTRY
	MOVE	C,X+NEWPAR+3	;GET 1 DOUBLE WORD ENTRY
	EXCH	B,X+SAVPAR+2(A)	;SAVE THE NEW VALUES
	EXCH	C,X+SAVPAR+3(A)
	MOVN	C,C		;TEST POSITIVE NUMBER
	ADD	C,X+SAVPAR+3(A)	;LOW ORDER WORD DIFFERENCE
	TLZE	C,400000	;BORROW?
	ADDI	B,1		;YES
	SUB	B,X+SAVPAR+2(A)	;HI ORDER WORD DIFFERENCE
	MOVNM	B,X+OUTPAR+2(A)	;STORE FOR OUTPUT
	MOVEM	C,X+OUTPAR+3(A)	;(ALSO NEGATE THIS ONE)
>
	YANK	0
	YANK	4
	POPJ	P,
;ROUTINE TO GRAB CLASS RUNTIMES

GETCLS:	SKIPGE	A,CLSAOB	;BEEN THRU HERE YET?
	JRST	GETCLA		;YES
	JUMPG	A,CPOPJ		;IF GETTAB DOESN'T WORK, RETURN
	AOS	CLSAOB		;ASSUME GETTAB DOESN'T WORK
	MOVEI	A,.GTCRT	;TRY IT
	GETTAB	A,
	POPJ	P,		;NO SUCH GETTAB
	MOVE	B,[%SSSCD-SPYSEG,,.GTSST]
	GETTAB	B,		;DOES SCDSET GETTAB WORK?
	POPJ	P,		;NO
	MOVE	B,.GTCRT(GI)	;GETTAB IMMEDIATE OF CLASS RUNTIMES
	ADDI	B,SPYSEG	;SPY ADDRESS
	HRRM	B,GETCLC	;STORE FOR LATER USE
	LDB	A,[POINT 9,B,8]	;HIGHEST CLASS
	CAILE	A,NCLASS-1	;MAXIMUM OF 16 CLASSES
	MOVEI	A,NCLASS-1
	SETCA	A,		;NEGATIVE NUMBER OF CLASSES
	HRLZ	A,A
	MOVEM	A,CLSAOB	;STORE AS CLASS AOBJN WORD
GETCLA:	MOVE	Q,.GTSST(GI)	;SCHEDULER STATISTICS TABLE
	MOVE	B,%SSSCD(Q)	;TIME THAT CLASS PERCENTS WERE LAST SET
	EXCH	B,SCDSET	;STORE FOR FUTURE COMPARE
	CAMN	B,SCDSET	;SAME AS LAST TIME?
	JRST	GETCLB		;YES
	SETZM	NOPAR+SAVPAR(A)	;NO IT CHANGED, SO ZERO OUR CUMULATIVE TABLE
	AOBJN	A,.-1
	MOVE	A,CLSAOB	;RESET A TO AOBJN POINTER
GETCLB:	SKIPN	SCDSET		;CLASS SCHEDULING?
	POPJ	P,		;NO, DON'T BOTHER GETTING STATISTICS
GETCLC:	MOVE	B,.GTCRT(A)	;GET CLASS RUNTIME FOR THIS CLASS
	EXCH	B,NOPAR+SAVPAR(A) ;STORE IN TABLE
	SUB	B,NOPAR+SAVPAR(A) ;COMPUTE DIFFERENCE FROM LAST VALUE
	MOVNM	B,NOPAR+OUTPAR(A) ;OUTPUT DIFFERENCE
	AOBJN	A,GETCLC	;REPEAT FOR ALL CLASSES
	POPJ	P,		;RETURN
>
;OUTPUT MINUTELY DATA

DMPMIN:	MOVE	A,THSDAT	;GET THIS DATE
	EXCH	A,LSTDAT
	JUMPN	A,DEVOPN	;JUMP IF NOT FIRST TIME THROUGH
	SETOM	LSTDAT		;MAKE COMPARISON FAIL NEXT TIME
	INIT	DSK,
	'DSK   '
	DOBUFF,,DIBUFF
	ERROR	(LNSCID CAN'T INIT DSK 2)
	OUTBUF	DSK,1		;ONLY 1 BUFFER
	POPJ	P,

DEVOPN:	CAME	A,THSDAT	;SAME DATE AS BEFORE?
	PUSHJ	P,FILVER	;NO, OPEN A NEW FILE
	MOVEI	A,VARCNT-1
	SKIPN	VARARA(A)
	SOJG	A,.-1
	SETCA	A,
	HRLZ	A,A
	HRRI	A,VARARA
	MOVE	Q,(A)		;GET A VARIABLE
	PUSHJ	P,DECOUT	;DUMP IT
	AOBJN	A,.-2		;DUMP THEM ALL
	MOVEI	Q,15
	PUSHJ	P,PUTCHR
	MOVEI	Q,12
	PJRST	PUTCHR


; HERE TO OPEN FILE AND STORE OUR VERSION IN IT
FILVER:	PUSHJ	P,FILOPN	;OPEN THE NEW FILE
	MOVEI	Q,^D25		;CODE FOR VERSION NUMBER RECORD
	PUSHJ	P,DECOUT	;OUTPUT IT
	MOVEI	Q,VMAJOR	;OUTPUT VERSION NUMBER
	PUSHJ	P,DECOUT	;IN DECIMAL
	MOVEI	Q,15		;CR
	PUSHJ	P,PUTCHR	;OUTPUT A CHAR
	MOVEI	Q,12		;LF
	PJRST	PUTCHR		;OUTPUT IT AND RETURN
;OPEN THE FILE OF THE DAY

FILOPN:	MOVE	T2,THSDAT
	IDIVI	T2,^D31
	ADDI	T3,1		;GET THE DAY
	IDIVI	T3,^D10		;SEPARATE DIGITS
	LSH	T3,6
	IORI	T3,'00'(T4)	;MAKE IT SIXBIT
	LSH	T3,6		;LEFT JUST
	MOVE	T1,T3
	IDIVI	T2,^D12
	HRL	T1,MONTAB(T3)	;ADD NAME OF MONTH
FILCLS:	CLOSE	DSK,		;CLOSE ANY OLD FILE
	MOVEI	T2,5
	MOVEM	T2,.RBCNT	;COUNT OF RIB ARGUMENTS
	SETZM	.RBPPN
	MOVEM	T1,.RBNAM
	MOVSI	T2,'DAT'
	MOVEM	T2,.RBEXT
	LOOKUP	DSK,.RBCNT	;DO EXTENDED LOOKUP
	JRST	MAKFIL		;NOT THERE, MAKE ZERO BLOCK FILE
	MOVSI	T2,'DAT'
	SETZB	T3,T4
	ENTER	DSK,T1		;ENTER IT
	ERROR	(LNSCEO CAN'T ENTER OUTPUT FILE 1)
	MOVE	T1,.RBSIZ
	ADDI	T1,177
	IDIVI	T1,200		;GET NUMBER OF BLOCKS
	USETO	DSK,1(T1)	;OUTPUT TO THAT ONE
	OUTPUT	DSK,		;SET UP BYTE POINTER AND COUNT
	POPJ	P,

MAKFIL:	MOVSI	T2,'DAT'
	MOVSI	T3,(157B8)
	SETZ	T4,
	ENTER	DSK,T1
	ERROR	(LNSCEO CAN'T ENTER OUTPUT FILE 2)
	JRST	FILCLS		;WRITE A NULL FILE
;IO ROUTINES

DECOUT:	PUSH	P,Q
	MOVEI	Q," "
	PUSHJ	P,PUTCHR
	MOVEI	Q,"-"
	SKIPGE	(P)
	PUSHJ	P,PUTCHR
	POP	P,T1
	MOVMS	T1
	PUSH	P,I
	SETZ	I,
	IDIVI	T1,^D10
	PUSH	P,T2
	ADDI	I,1
	JUMPN	T1,.-3
	POP	P,Q
	ADDI	Q,"0"
	PUSHJ	P,PUTCHR
	SOJG	I,.-3
	POP	P,I
	POPJ	P,

PUTCHR:	SKIPE	RECSIZ		;FIRST CHARACTER OF RECORD?
	JRST	NFSCHR		;NO
	MOVE	T1,[POINT 7,RECORD]
	MOVEM	T1,RECPNT
NFSCHR:	AOS	T1,RECSIZ	;KEEP RECORD SIZE
	IDPB	Q,RECPNT	;STORE THE BYTE
	CAIE	Q,12		;END OF LINE?
	POPJ	P,		;NO
	CAMG	T1,BYTCNT	;YES, WILL IT FIT?
	JRST	RECFTS		;YES
	OUT	DSK,		;DUMP THE BLOCK
	JRST	.+2
	ERROR	(LNSEOO ERROR ON DSK OUTPUT)
	PUSHJ	P,FILOPN	;CLOSE FILE AND REOPEN TO SAVE IN CASE OF CRASH
RECFTS:	MOVN	T1,RECSIZ
	ADDM	T1,BYTCNT
	SETZM	RECSIZ		;START NEW RECORD
	MOVE	T2,[POINT 7,RECORD]
	ILDB	T3,T2
	IDPB	T3,BYTPNT
	AOJL	T1,.-2
	POPJ	P,

MONTAB:	'JAN'
	'FEB'
	'MAR'
	'APR'
	'MAY'
	'JUN'
	'JUL'
	'AUG'
	'SEP'
	'OCT'
	'NOV'
	'DEC'
PTYWRT:	OPEN	PTY,PTYDEV	;INITIALIZE A PTY
	POPJ	P,		;NONE AVAILABLE

	PUSH	P,T1		;SAVE T1
	PUSH	P,.JBFF##	;SAVE JOBFF
	MOVSI	T4,-TTYLEN	;NUMBER OF TTYS TO SEND TO
PTYLP:	MSTIME	T1,
	ADDI	T1,^D3000	;CURRENT TIME + 3 SEC.
	MOVEM	T1,TIMLIM	;TIME LIMIT FOR PTY TO RETURN A DOT
	MOVEI	T1,[ASCIZ/SEND /]
	PUSHJ	P,ASCIIP
	MOVE	T1,TTYTAB(T4)	;TYPE TTY NAME
	PUSHJ	P,SIXBIP
	MOVE	T1,-1(P)	;GET ARG
	PUSHJ	P,ASCIIP	;PRINT IT
	MOVEI	T1,[ASCIZ/
/]
	PUSHJ	P,ASCIIP	;PRINT CRLF
	OUTPUT	PTY,		;FORCE AN OUTPUT
PTYTRY:	MOVEI	T1,PTY		;PTY CHANNEL NUMBER
	JOBSTS	T1,		;GET JOB STATUS
	JRST	PTYINP		;SHOULD NEVER HAPPEN
	TLC	T1,160000	;OUTPUT AVAILABLE, AT MONITOR COMMAND LEVEL
	TLCN	T1,160000	;READY FOR NEXT SEND?
	JRST	PTYINP		;YES
	MSTIME	T1,		;GET CURRENT TIME
	SUB	T1,TIMLIM	;MINUS TIME LIMIT
	JUMPGE	T1,PTYINP	;GIVE UP IF TIME LIMIT PASSED ALREADY
	MOVNS	T1		;NUMBER OF MS TO SLEEP
	HRLI	T1,(1B12)	;WAKE ON PTY ACTIVITY
	HIBER	T1,		;GO TO SLEEP
	SKIPA			;HIBER NOT IMPLEMENTED
	JRST	PTYTRY		;CHECK AGAIN
	MOVEI	T1,1
	SLEEP	T1,		;SLEEP A SEC
	JRST	PTYTRY		;NOW TRY

;INPUT FROM PTY
PTYINP:	INPUT	PTY,		;INPUT ANYTHING THATS THERE
	AOBJN	T4,PTYLP	;GO BACK TO SEND MESSAGE TO NEXT TTY
	RELEAS	PTY,		;GET RID OF PTY
	POP	P,.JBFF##	;RESTORE JOBFF
	POP	P,T1		;GET RID OF ARG
	POPJ	P,

;OUTPUT ASCII STRING TO PTY
ASCIIP:	TLO	T1,440700	;MAKE INTO BYTE POINTER
	ILDB	T2,T1		;GET NEXT CHAR
	JUMPE	T2,CPOPJ	;RETURN IF DONE
	PUSHJ	P,PTYP		;PRINT CHARACTER
	JRST	ASCIIP+1	;GET NEXT CHAR

;OUTPUT 6BIT WORD TO PTY
SIXBIP:	SETZ	T2,		;CLEAR JUNK FROM T2
	ROTC	T1,6		;ROTATE NEXT CHAR INTO T2
	JUMPE	T2,CPOPJ	;RETURN IF DONE
	ADDI	T2,40		;CHANGE TO ASCII
	PUSHJ	P,PTYP		;PRINT IT
	JRST	SIXBIP		;SAME FOR REST OF CHARACTERS

;STORE NUMBER IN T1 INTO ASCII STRING POINTED TO BY T4
DECP:	IDIVI	T1,^D10		;GET REMAINDER INTO T4
	HRLM	T2,(P)		;SAVE ON STACK
	SKIPE	T1		;DONE?
	PUSHJ	P,DECP		;NO, GET NEXT DIGIT
	HLRZ	T2,(P)		;RETRIEVE DIGIT
	ADDI	T2,60		;CHANGE TO CHAR
	IDPB	T2,T4		;STORE DIGIT
	POPJ	P,

;OUTPUT CHR TO PTY
PTYP:	SOSG	PTYOUT+2	;ANY ROOM LEFT
	OUTPUT	PTY,		;NO, DUMP BUFFER
	IDPB	T2,PTYOUT+1	;STORE BYTE IN BUFFER
CPOPJ:	POPJ	P,

FATAL:	MOVEI	T1,@(T1)
	MOVE	T4,['STOPED']
	SETNAM	T4,		;SET JOB NAME FOR SYSTAT
	GETLIN	T2,		;GET TTY NAME CONTROLING
	TLNN	T2,777777	;LEFT HALF ZERO?
	JRST	FATAL1		;YES - JOB DETACHED
	OUTSTR	(T1)		;NO - OK TO DO NORMAL OUTPUT
	OUTSTR	[ASCIZ/
/]
	CAIA
FATAL1:	PUSHJ	P,PTYWRT	;OUTPUT TO OPR THRU PTY
	EXIT	1,		;EXIT QUIETLY
	EXIT			;DONT ALLOW CONTINUE

LASTIM:	-1
TIMLIM:	BLOCK	1
PTYIN:	BLOCK	3
PTYOUT:	BLOCK	3
PTYDEV:	0
	'PTY   '
	PTYOUT,,PTYIN
TTYTAB:	'CTY   '
	TTYLEN==.-TTYTAB


;DATA BASE

DBASE:

;VARIABLES TO BE PRINTED EACH MINUTE

VARARA:
HOUR:	Z	;HOUR OF THE DAY
MINUTE:	Z	;MINUTE OF THE DAY
JBCNT:	Z	;NUMBER OF ACTIVE JOBS
LNCNT:	Z	;NUMBER OF ACTIVE LINES
TOTNUL:	Z	;PERCENT OF NULL TIME SINCE UP
MINNUL:	Z	;NULL TIME FOR LAST MINUTE
MINDSK:	Z	;NUMBER OF DSK BLOCKS TRANSFERED IN LAST MINUTE
TOTDSK:	Z	;TOTAL DSK BLOCKS TRANSFERED
MINSWP:	Z	;TOTAL BLOCKS SWAPPED IN LAST MINUTE
TOTSWP:	Z	;TOTAL BLOCKS SWAPPED
MINOVH:	Z	;MONITOR OVERHEAD FOR LAST MINUTE
USDCNK:	Z	;PERCENT OF TELETYPE CHUNKS USED
TOTBIT:	Z	;PERCENT OF CB USED
SWUSED:	Z	;PERCENT OF SWAPPING SPACE USED
DSKUSD:	Z	;PERCENT OF PUBLIC DSK SPACE USED
IFN	FTSCHED,<
OUTPAR:	BLOCK	NPAR	;SCHEDULER PARS
>

VARCNT==.-VARARA

;OTHER VARIABLES

IFN	FTSCHED,<
NEWPAR:	BLOCK	^D8
SAVPAR:	BLOCK	NPAR
PARAOB:	Z	;AOBJN WORD FOR SCHEDULER PARAMETERS
CLSAOB:	Z	;AOBJN WORD FOR CLASS RUN TIMES
SCDSET:	Z	;LAST TIME CLASS SCHEDULING PARAMETERS WERE CHANGED
>
DOBUFF:	Z
BYTPNT:	Z	;RING HEADER POINTER
BYTCNT:	Z	;RING HEADER BYTE COUNT
DIBUFF:	BLOCK	3
.RBCNT:	Z
.RBPPN:	Z
.RBNAM:	Z
.RBEXT:	Z
.RBPRV:	Z
.RBSIZ:	Z
PDL:	BLOCK	30
THSDAT:	Z	;CURRENT DATE
LSTDAT:	Z	;DATE LAST TIME THROUGH
MINDEX:	Z	;INDEX FOR THE MINUTE
FRSFLG:	Z	;HOUR FLAG FOR CPUITL
HRNULL:	BLOCK	^D60	;HOURS WORTH OF CPU DATA
OLDNUL:	Z	;OLD NULL TIME
OLDUP:	Z	;OLD UP TIME
OLDOVH:	Z	;OLD MONITOR OVERHEAD
RECSIZ:	Z	;SIZE OF CURRENT OUTPUT RECORD
RECPNT:	Z	;BYTE POINTER TO CURRENT OUTPUT RECORD
RECORD:	BLOCK	100	;RECORD BUFFER AREA
DSKCHB:	BLOCK	20	;SPACE FOR DSKCHR UUO
MONVER:	Z	;MONITOR VERSION NUMBER IN RT HALF
GETTBI:	Z	;ADDRESS OF GETTAB IMMEDIATES
JOBAOB:	Z	;AOB WORD FOR JOBS

DBEND:

	END	LINES