	TITLE	BIGBEN -- PRINT A CTY LINE EVERY TEN MINUTES
	SUBTTL	P. BUDNE@BU/DSG
	.DECSAVE

F==0
A==1
B==2
C==3
D==4

BP==10
P==17

PDL:	BLOCK	<PDLEN==10>
BUFFER:	BLOCK	100		;STRING BUFFER
NOW:	BLOCK	1		;CURRENT TIME
LOGDES:	BLOCK	1		;CTY DESCR
OPRUNO:	BLOCK	1		;OPERATOR USER NUMBER
JOBS:	BLOCK	1		;AOBJN FOR ALL JOBS
USERS:	BLOCK	1		;COUNT OF USERS
OPERS:	BLOCK	1		;COUNT OF OPERATOR JOBS

START:	JFCL
	RESET
	MOVEI	A, .FHSLF
	SETO	C,
	EPCAP

	MOVE	A, [SIXBIT "JOBRT"]
	SYSGT
	HLLZM	B, JOBS

	MOVSI	A, (RC%EMO)
	HRROI	B, [ASCIZ "OPERATOR"]
	RCUSR
	MOVEM	C, OPRUNO

	MOVE	A, [1,,.LOGDES]
	GETAB
	 HALT	.
	MOVEM	A, LOGDES
	CAIN	A, .NULIO
	 WAIT			;IF NO LOG DEVICE, JUST HANG!

	ASND			;GRAB CTY!
	 ERJMP	RELCTY

	MOVE	A, LOGDES
	MOVEI	B, .TT120	;LA120
	STTYP
	 ERJMP	RELCTY

	MOVE	A, LOGDES
	MOVEI	B, .MOSLW	;SET WIDTH FUNCTION
	MOVEI	C, 132.		;TO 132
	MTOPR
	 ERJMP	RELCTY

RELCTY:	MOVE	A, LOGDES
	RELD
	 ERJMP	.+1

	MOVE	P, [-PDLEN,,PDL-1]

TOP:	GTAD
	MOVEM	A,NOW
	CALL	FIGURE		;FIGURE OUT WHEN NEXT TO PRINT
	CAIGE	A, 5*1000.	;MORE THAN 5 SECONDS FROM NOW?
	 JRST	SLEEP		; NO, SLEEP IT OFF
	PUSH	P,A		;YES, SAVE SLEEP TIME
	CALL	OUTPUT		;OUTPUT A LINE
	POP	P,A		;RESTORE TIME
SLEEP:	DISMS			;SLEEP
	JRST	TOP


FIGURE:	MOVE	B, NOW
	SETZ	D,		;NO FLAGS
	ODCNV			;SPLIT UP
	MOVEI	A, (D)		;GET SECONDS SINCE MIDNIGHT
	IDIVI	A, 60.*60.	;CAST OUT HOURS, LEAVING SECONDS IN B
	IDIVI	B, 60.*10.	;CAST OUT 10MINS WORTH OF SECONDS
	MOVEI	A, 60.*10.	;GET FULL PERIOD
	SUBI	A, (C)		;REMOVE..
	IMULI	A, 1000.	;GET MSEC.
	POPJ	P,

OUTPUT:	CALL	COUNT		;COUNT JOBS

	HRROI	A,BUFFER
;;;	HRROI	B,[ASCIZ '
;;;	**** ']
	HRROI	B,[asciz '
']
	SETZ	C,
	SOUT

	MOVE	B,NOW		;GET TIME
	SETO	C,		;VERBOSE
	ODTIM

	HRROI	B,[ASCIZ ', ']
	SETZ	C,
	SOUT

	MOVE	BP, A
	CALL	LOADS

	MOVE	A, BP
	HRROI	B, [ASCIZ ', ']
	SETZ	C,
	SOUT
	MOVE	B, USERS
	MOVEI	C, 10.
	NOUT
	 JFCL
	MOVEI	B, "+
	BOUT
	MOVE	B, OPERS
	NOUT
	 JFCL

	HRROI	B, [ASCIZ ' Jobs
']
	SETZ	C,
	SOUT

; SPIT THE COMPLETE STRING TO THE CTY
	MOVE	A, LOGDES
	HRROI	B, BUFFER
	SETZ	C,
	SOUT
	 ERJMP	.+1
	POPJ	P,

LOADS:	MOVE	A, [14,,.SYSTA]
	CALL	FLOAD

	MOVE	A, [15,,.SYSTA]
	CALL	FLOAD

	MOVE	A, [16,,.SYSTA]
FLOAD:	GETAB
	 ERJMP	R
	PUSH	P, A		;SAVE NUMBER
	MOVE	A, BP		;GET BP
	POP	P, B		;GET LOAD BACK
	MOVE	C, [FL%ONE\FL%PNT\20200]
	FLOUT
	 RET
	MOVE	BP, A
	RET

DOUPT:	MOVE	B, A		;GET UPTIME IN B
	IDIVI	B, 1000.	;GET SECONDS
	IDIVI	B, 3600.	;NOW, GET HOURS
	PUSH	P, C		;SAVE MINS
	IDIVI	B, 24.		;GET DAYS
	PUSH	P, C		;SAVE FRACTIONAL HOURS
	IDIVI	B, 7.		;GET WEEKS!!
	PUSH	P, C		;SAVE FRACTIONAL DAYS
	SETZ	F,

	HRROI	D, [ASCIZ ' week']
	CALL	DOIT

DAYS:	POP	P, B		;RESTORE DAYS
	HRROI	D, [ASCIZ ' day']
	CALL	DOIT

HOURS:	POP	P, B		;RESTORE MINS .LT. 3600
	HRROI	D, [ASCIZ ' hour']
	CALL	DOIT

MINS:	POP	P, B		; GET BACK REMAINDER AFTER HOUR CALC.
	IDIVI	B, 60.		; GET MINUTES
	PUSH	P, C		; SAVE SECONDS (REMAINDER)
	JUMPE	C, SECS
	HRROI	D, [ASCIZ ' minute']
	CALL	DOIT

SECS:	POP	P,B
	HRROI	D, [ASCIZ ' second']
;;; FALL IN..

; B/	count
; D/	string
DOIT:	MOVE	A,BP
	JUMPE	B,R
	CALL	COMMA
	MOVEI	C, 10.
	NOUT
	 TRN

	PUSH	P, B
	MOVE	B, D
	SETZ	C,
	SOUT
	MOVE	BP, A
	POP	P, B
	CAIG	B, 1
	 RET
	MOVEI	B, "s
	BOUT
	MOVE	BP, A
	RET

COMMA:	JUMPE	F,WUMP
	PUSH	P,B
	HRROI	B,[ASCIZ ", "]
	SETZ	C,
	SOUT
	POP	P,B
WUMP:	SETO	F,
R:	RET

COUNT:	SETZM	USERS
	SETZM	OPERS
	MOVE	D, JOBS
CNTLOP:	MOVEI	A, (D)		;GET JOB
	HRROI	B, C		;ONE WORD IN C
	MOVEI	C, .JIUNO	;GET USER NUMBER
	GETJI
	 ERJMP	CNTNXT
	JUMPE	C, CNTNXT
	CAME	C, OPRUNO	;OPERATOR?
	 AOSA	USERS		; NO, MUST BE USER
	  AOS	OPERS
CNTNXT:	AOBJN	D, CNTLOP
	RET

	END	START
