;
;	NAME:  BRDCST
;
;	FUNCTION:  This program is used to "broadcast" a message to every
;	terminal on the system.  The restraints it uses in terminal
;	selection are:  1) the terminal must be attached to a job, and
;	2) it must not be a PSEUDO terminal.  The actual sending is done
;	by opening the terminal as a file using the TRM: driver.
;
;	AUTHOR:  Tom Dahlquist
;
;	HISTORY:
;VERS	  DATE   WHO SUBSTANCE
;[1.0]	09/19/83 TAD Written.
;	07/16/84 TAD Was moving a blank into low memory, causing random
;			failures.
;	06/85	John Baima 
;		Eisenbrauns
;		PO Box 275
;		Winona Lake, IN 46590
;		Don't send messages to jobs running LPTSPL--they are printers.
;[1.1]	03/85/86 DFP Make BRDCST reentrant. (UltraSoft - ULTR/AM).
;[1.2]  05/05/86 DAE Ignore FLIP terminals for AlphaBase systems.

	SEARCH	SYS
	SEARCH	SYSSYM

	VMAJOR=1
	VMINOR=2						;[1.2]

	.OFINI
	.OFDEF	DDB,D.DDB		; DDB for output to terminals	[1.1]
	.OFDEF	JOB,8.			; job work area			[1.1]
	.OFSIZ	CLRLEN			; size of impure area		[1.1]

BRDCST:	PHDR	-2,PV$RSM,PH$REU!PH$REE	; program header		[1.1]

	LIN				; anything to send?
	JEQ	EXIT			; leave if not...

;[1.1]	LEA	A4,DDB			; let A4 -> to DDB throughout...
;[1.1]	CLEAR	@A4,CLRLEN		; clear it,
	GETIMP	CLRLEN,A4		; Allocate local work memory	[1.1]
	MOVW	#[TRM],D.DEV(A4)	; move in device name,
	INIT	@A4			; and initialize.

	JOBIDX	A0			; A0 -> out JCB...
	LEA	A1,JOBNAM(A0)		; A1 -> job name field...
	PUSH	A2			; save A2...
;[1.1]	LEA	A2,JOB			; A2 -> job name work area...
	LEA	A2,JOB(A4)		; A2 -> job name work area...	[1.1]
	UNPACK				; unpack name into work area...
	UNPACK
	MOVB	#' ,@A2
	POP	A2

	MOV	JOBTBL,A0		; -> first JCB pointer...
LOOP:	MOV	(A0)+,D7		; -> JCB...
	BEQ	LOOP			; if not allocated...
  	CMP	D7,#-1			; test for end of table...
	JEQ	EXIT			; leave if so...
	MOV	D7,A1
	CMM	JOBPRG(A1),#[LPT]_16.+[SPL]	; JKB-Running Spooler
	BEQ	LOOP			; br if this is a printer
	MOV	JOBTRM(A1),D7		; D7 -> TCB...
	BEQ	LOOP			; br if no terminal...
	MOV	D7,A5			; A5 -> TCB...
	MOV	2(A5),A3		; A3 -> interface driver...
	SUB	#4,A3			; A3 -> I.D. name...
	CMM	@A3,#[PSE]_16.+[UDO]	; PSEUDO?		[1.2]
	BEQ	LOOP			; br if so...
	CMM	@A3,#[FLP]_16.+[IDV]	; or FLIP		[1.2]
	BEQ	LOOP			; If so, ignore.	[1.2]
	MOV	-4(A5),D.FIL(A4)	; move in terminal name...
	OPENO	@A4			; open for output

	MOVB	#';,D1			; make it look like SEND...
	FILOTB	@A4

;[1.1]	LEA	A1,JOB			; A1 -> job name work area...
	LEA	A1,JOB(A4)		; A1 -> job name work area...	[1.1]
NLOOP:	MOVB	(A1)+,D1
	FILOTB	@A4
	CMPB	D1,#' 
	BNE	NLOOP
	MOVB	#'-,D1
	FILOTB	@A4
	MOVB	#' ,D1
	FILOTB	@A4

	PUSH	A2			; save -> text line...
OLOOP:	MOVB	(A2)+,D1		; get next byte of text and
	FILOTB	@A4			; output...
	LIN				; end of input line?
	BNE	OLOOP			; br if not, else
	POP	A2			; restore A2 and
	MOVB	#7,D1
	FILOTB	@A4			; give him a BELL and
	MOVB	#15,D1			; a CR and a LF.
	FILOTB	@A4
	MOVB	#12,D1
	FILOTB	@A4
	CLOSE	@A4			; close output file.
	JMP	LOOP			; and back.

EXIT:	EXIT

	END