;
; 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.