.TITLE SEND MSG TO ANOTHER TERMINAL .IDENT /V0000A/ ; ; ; ; ; ;; ; ; .MCALL GMCR$, ALUN$S, QIOW$, QIOW$S, EXIT$S, DIR$, GLUN$S .MCALL ISTAT$, STATE$, TRAN$, RETURN, QIO$S, WTSE$S ; $RONLY = 1 ; GENERATE TPARS STUFF READ-ONLY TTYS = 16. ;N O T E : IN NO CASE MORE THAN 32 TERMINALS ; ; .PSECT IMPURE,RW,D,LCL,REL,CON ; UNIT: .WORD 0 DEVICE: .WORD 0 LUNINF: .BLKW 6 .PAGE ; GMCR: GMCR$ ERRQIO: QIOW$ IO.WVB,2,1,,,,<,,60> ; ; ; .PSECT PURE,RO,I,LCL,REL,CON ; ; ENTRY: DIR$ #GMCR BCC 5$ ;BR IF WE ARE MCR/PDS ROUTINE JMP EXIT ;ELSE, DO NOT ALLOW USER TO RUN 5$: MOV 0,R3 ;SAVE CHARACTER COUNT MOV R3,R0 ;SAVE IT AGAIN MOV #GMCR+G.MCRB,R4 ;GET MCR/PDS BUFFER ADDRESS ********* MOV #SNDSTB,R5 ;ADX OF STARTING STATE IN STATE TABLE MOV #SNDKTB,R2 ;ADX OF KEYWORD TABLE MOV #1,R1 ;PROCESS BLANKS NORMALLY CALL @#.TPARS ;PARSE INPUT STRING BCC UNEXIT ;BRANCH IF INPUT CORRECT ; SYNERR: MOV #SYNMSG,ERRQIO+Q.IOPL MOV #SYNSIZ,ERRQIO+Q.IOPL+2 DIR$ #ERRQIO ;PRINT SYNTAX ERROR MESSAGE ; MOV #GMCR+G.MCRB,R1 MOV R1,ERRQIO+Q.IOPL MOV R0,ERRQIO+Q.IOPL+2 MOV #40,ERRQIO+Q.IOPL+4 ;SINGLE SPACE NOW DIR$ #ERRQIO ;OUTPUT ENTIRE TYPED-IN LINE ; SUB R3,R0 ;DETERMINE LENGTH OF SCANNED STRING 1$: MOVB #40,(R1)+ ;BLANK OUT COMMAND LINE CMP R1,R4 ;IS THIS ADDRESS IN ERROR? BNE 1$ ;BR IF NO...CONTINUE MOVB #'^,@R1 ;SET ASCII POINTER TO ERROR INC R0 ;INCLUDE THE CARROT IN TYPEOUT MOV #GMCR+G.MCRB,ERRQIO+Q.IOPL MOV R0,ERRQIO+Q.IOPL+2 DIR$ #ERRQIO ;OUTPUT ASCII POINTER TO PART ; OF C.S. IN ERROR BR EXIT .PAGE UNEXIT: MOVB #7,-(R4) MOVB #11,-(R4) ALUN$S #2,#"TI BCS EXIT GLUN$S #2,#LUNINF MOV R4,R2 ;SAVE CURRENT LINE ADDRESS MOVB LUNINF+2,R4 BIC #177700,R4 ASHC #-3,R4 ASH #-13.,R5 BIC #177770,R5 BIS #60,R5 MOVB R5,-(R2) BIS #60,R4 MOVB R4,-(R2) MOVB LUNINF+1,-(R2) MOVB LUNINF,-(R2) MOVB #'*,-(R2) MOVB #'*,-(R2) MOV R2,R1 SUB #GMCR+G.MCRB,R1 SUB R1,R0 TST DEVICE ;SEND TO ALL TERMINALS IN THE SYSTEM? BEQ SNDALL ;Y E S . ALUN$S #1,DEVICE,UNIT BCS EXIT JSR PC,UIC ;CHANGE THE UIC TO [1,1] QIOW$S #IO.WVB,#1,#1,,,, ; ; ; ; EXIT: EXIT$S ; ; ; ROUTINE TO CHANGE THE UIC TO [1,1] SO THAT AN NON-PRIVILEDGED ; USER CAN BREAK THRU THE PI.... ATTACH. ; UIC: MOV R0,-(SP) ;SAVE R0 MOV .CRTSK,R0 MOV PS,-(SP) MOVB #PR7,PS ;PRIORITY 7 MOV #77406,UPDR3 ;USER PAGE DESCRIPTOR REGISTER 3 MOV A.HA(R0),UPAR3 ; MOV #401,60000+H.UIC;SET UIC TO [1,1] MOV (SP)+,PS ;RESET THE PRIORITY MOV (SP)+,R0 ;RESTORE R0 RTS PC ;RETURN ; ; ; ; ; ; SNDALL: JSR PC,UIC ;CHANGE THE UIC TO [1,1] MOV @#.PUDBA,R3 ;GET ADX OF 1ST. PUD ENTRY ********* MOV @#.PUDEA,-(SP) ;GET ADX OF LAST PUD ENTRY ********* CLR R1 ;INIT TO USE SEPARATE EF FOR EACH QIO 1$: BIT #UC.TTY,U.C1(R3) ;THIS A TTY DEVICE? ******** BEQ 2$ ;BR IF NO, DON'T ATTEMPT A SEND BITB #UT.LG,U.PR(R3) ;IS TERMINAL LOGGED ON? ********** BNE 3$ ;YES, PROCEES WITH SEND. ELSE NO NEED 2$: ADD #U.SZ,R3 ;GET NEXT PUD ADX CMP @SP,R3 ;LAST ENTRY PROCESSED? BHI 1$ ;BR IF NO, GO BACK & LOOK AT IT BR 4$ ;ELSE, GO WAIT ON ALL QIOS TO BE FINISHED 3$: MOVB U.UN(R3),R4 ;PICK UP RECEIVER TTY'S UNIT# CMP LUNINF,@R3 ;SAME DEVICE AS ISSUING TERMINAL? BNE 5$ ;BR IF NO, ISSUE QIO CMPB LUNINF+2,R4 ;SAME UNIT#? BEQ 2$ ;BR IF YES, DON'T ISSUE QIO 5$: ALUN$S #1,@R3,R4 ;ASSIGN TO CURRENT DEVICE & UNIT INC R1 ;SET TO NEXT EVENT FLAG NUMBER QIO$S #IO.WVB,#1,R1,,,, CMP #TTYS,R1 ;LAST KNOWN TERMINAL SENT TO? BEQ 4$ ;BR IF YES BR 2$ 4$: WTSE$S R1 SOB R1,4$ ;WAIT FOR ALL QIOS TO COMPLETE TST (SP)+ ;CLEANLINESS IS NEXT TO ... BR EXIT .PAGE ; ; ; ACTION ROUTINES FOR THE PARSER ; SETDV1: MOVB .PCHAR,DEVICE ;STORE 1ST CHARACTER OF DEVICE NAME RETURN ; SETDV2: MOVB .PCHAR,DEVICE+1 ;STORE 2ND CHARACTER OF DEVICE NAME RETURN ; SETUNT: MOV .PNUMB,UNIT ;STORE THE DEVICE UNIT NUMBER RETURN ; SETALL: MOV @#.CRTSK,R1 ;GET TASK'S ATL ADDRESS MOV A.TI(R1),R1 ;GET PUD ADDRESS OF THE TI: BITB #UT.PR,U.PR(R1) ;IS USER PRIVILEDGED? ****** BNE DOALL ;BR IF YES. OK TO DO SEND ALL: DEC R4 ;POINT TO ILLEGAL DEVICE NAME INC R3 ;...AND THAT MAKES LENGTH A LITTLE MORE RETURN ;ADJUSTED REGS SHOULD BOMB SCAN DOALL: CLR DEVICE ;SHOW TO BE SENT TO ALL TERMINALS RETURN ; ; .PSECT PRUDAT,RO,D,LCL,REL,CON ; ; ; SYNTAX ERROR MESSAGE SYNMSG: .ASCII /[SEN--INDICATED ITEM IS IN ERROR]/ SYNSIZ = .-SYNMSG ; ; ; PARSING TABLES ; ISTAT$ SNDSTB,SNDKTB ; ; SKIP COMMAND NAME AND FOLLOWING SEPARATORS STATE$ START TRAN$ $STRNG ; STATE$ TRAN$ $BLANK ; ; ; READ DEVICE AND UNIT NUMBER. A UNIT NUMBER IS REQUIRED. STATE$ TRAN$ "ALL",COLON,SETALL TRAN$ $ANY,,SETDV1 ; STATE$ TRAN$ $ANY,,SETDV2 ; STATE$ TRAN$ $NUMBR,,SETUNT ; STATE$ COLON TRAN$ ':,COLBLK TRAN$ 040,$EXIT TRAN$ 011,$EXIT ; STATE$ COLBLK TRAN$ 040,$EXIT TRAN$ 011,$EXIT TRAN$ $LAMDA,$EXIT ; ; STATE$ ; ; ; ; ; .END ENTRY