; ; NAME: BRDCST ; ; FUNCTION: This program is used to "broadcast" a message to every ; terminal on the system. The restraints is 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: ; DATE WHO SUBSTANCE ; 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. ; 07/03/86 Creed Erickson, Computer Systems Plus, Inc., Lancaster, Pa. ; a. Don't send to jobs spawned by MULTI. ; b. Don't send to TASK MANAGR slave jobs or TASK MANAGR itself. ; c. Add inpure area to make reentrant. ; ; SEARCH SYS SEARCH SYSSYM VMAJOR=1 VMINOR=0 VEDIT=4. BRDCST: PHDR -2,PV$RSM,PH$REU!PH$REE GETIMP MEMSIZ,A4 LIN ; anything to send? JEQ EXIT ; leave if not... MOVW #[TRM],DDB+D.DEV(A4) ; move in device name, INIT DDB(A4) ; and initialize. JOBIDX A0 ; A0 -> out JCB... PUSH A2 ; save A2... LEA A1,JOBNAM(A0) ; A1 -> job name field... LEA A2,JOB(A4) ; A2 -> job name work area... 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 ; ; test for task managr job just in case it's not using PSEUDO tdv ; CMM JOBNAM(A1),#[TAS]_16.+[K ] ; is job a TASK MANAGR? BEQ LOOP ; branch if so ; ; test for job spawned by MULTI to avoid sending to unreal terminal ; MOV JOBATT(A1),D7 ; get attached job BEQ 10$ ; if none then proceed CMP D7,A1 ; compare to this job BNE LOOP ; if not same then loop 10$: ; ; ignore spooler jobs and slaves to TASK MANAGR ; MOVW JOBTYP(A1),D7 ; get job type ANDW #,D7 ; mask off spooler and task bits BNE LOOP ; loop if either set ; next two lines removed in edit 4 ; 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,PSEUDO ; PSEUDO? BEQ LOOP ; br if so... MOV -4(A5),D.FIL(A4) ; move in terminal name... OPENO DDB(A4) ; open for output MOVB #';,D1 ; make it look like SEND... FILOTB DDB(A4) LEA A1,JOB(A4) ; A1 -> job name work area... NLOOP: MOVB (A1)+,D1 FILOTB DDB(A4) CMPB D1,#' BNE NLOOP MOVB #'-,D1 FILOTB DDB(A4) MOVB #' ,D1 FILOTB DDB(A4) PUSH A2 ; save -> text line... OLOOP: MOVB (A2)+,D1 ; get next byte of text and FILOTB DDB(A4) ; output... LIN ; end of input line? BNE OLOOP ; br if not, else POP A2 ; restore A2 and MOVB #7,D1 FILOTB DDB(A4) ; give him a BELL and MOVB #15,D1 ; a CR and a LF. FILOTB DDB(A4) MOVB #12,D1 FILOTB DDB(A4) CLOSE DDB(A4) ; close output file. JMP LOOP ; and back. EXIT: EXIT ; ; Workarea and Constants ; DSECT .=0 DDB: BLKB D.DDB JOB: BLKB 8. GUARD: BLKW 1 ; just in case MEMSIZ=. PSECT PSEUDO: RAD50 /PSEUDO/ END .