.TITLE ...SND - SEND MESSAGE TO TERMINALS ; ; ; MACRO TO MOVE MESSAGE POINTER TO WORD BOUNDARY ; .MACRO ADJUST INC R2 BIC #1,R2 .ENDM ; ; ; AND THE MACROS WE CALL ; .MCALL CALL,RETURN,ENTER,LEAVE .MCALL DIR$,EXIT$S .MCALL QIO$,QIOW$,ALUN$,WTLO$ .MCALL CLEF$,MRKT$,CMKT$S .MCALL XMIT$ .MCALL FSRSZ$ ; ; FSRSZ$ 0 ; ; ; ; ; SOME CONSTANTS ; OUTLUN=4 OUTEVF=4 TIMEVF=5 MINTI=0 MAXTI=5 ;MIN AND MAX TERMINAL NUMBERS ; ; ; ; SET UP XMIT STUFF ; XMIT$ ,,2000,,10,1,1 ; ; .SBTTL >HANDLE SEND COMMAND (-1) ; ; SEND: ENTER R0,R1,R2,R3,R4,R5 MOV (R2)+,R5 ;GET TERMINAL TO SEND TO BMI PA ;OR MAYBE ALL TERMINALS MOV (R2)+,FROMTI ;R2 POINTS TO MESSAGE CMP #MINTI,R5 ;IN RANGE? BHI NOMES ;NO CMP #MAXTI,R5 ;MAYBE BLO NOMES ;NO DIR$ #CLEF ;WAIT FOREVER, IF NECESSARY CALL SENDER ;SEND MESSAGE NOMES: LEAVE RETURN ; ; PA: MOV (R2)+,FROMTI ;GET SENDER TERMINAL NUMBER MOV #MINTI,R5 ;PA MESSAGE, SEND TO EVERYONE 1$: DIR$ #TIME ;START UP TIMER CALL SENDER ;SEND TO FIRST TERMINAL CMKT$S ;CANCEL TIMER, JUST IN CASE INC R5 ;ON TO NEXT TERMINAL CMP #MAXTI,R5 ;IF ANY BGE 1$ ;OK, GO AHEAD BR NOMES .SBTTL > SEND MESSAGE TO TERMINAL ; ; ; SENDER - SENDS MESSAGE POINTED TO BY R2 TO TERMINAL ; WHOSE NUMBER IS IN R5 ; ; SENDER: ENTER R0,R1,R2,R3,R4,R5 MOV R5,ASSIGN+A.LUNU ;SET UP TERMINAL NUMBER DIR$ #ASSIGN,DIRERR ;AND ASSIGN TERMINAL MOV (R2)+,R5 ;GET ID LENGTH MOV #MESSID,R4 ;AND POINT TO WHERE IT SHOULD GO 1$: MOVB (R2)+,(R4)+ ;COPY IT SOB R5,1$ ADJUST ;AND ALIGN R2 MOV #ATMES,R1 ;NOW COPY IN 'AT TT' MOV #LATMES,R5 2$: MOVB (R1)+,(R4)+ SOB R5,2$ MOV FROMTI,R1 ;GET BACK TERMINAL MESSAGE IS FROM CALL OCT ;OUTPUT IT IN OCTAL MOVB #':,(R4)+ ;AND COMPLETE WITH : MOVB #7,(R4)+ ;ADD A FEW BELLS MOVB #7,(R4)+ ; SUB #MESS,R4 ;COMPUTE LENGTH MOV #MESS,OUT+Q.IOPL ;SET UP TO PRINT MOV R4,OUT+Q.IOPL+2 DIR$ #OUT ;WHICH DO DIR$ #WAIT 3$: MOV (R2)+,R5 ;GET LENGTH OF LINE BEQ 4$ ;END OF MESSAGE MOV R2,OUT+Q.IOPL ;ADDRESS OF LINE MOV R5,OUT+Q.IOPL+2 ;LENGTH OF LINE DIR$ #OUT ;OUTPUT IT DIR$ #WAIT ADD R5,R2 ;ADVANCE OVER IT ADJUST ;TO NEXT WORD BOUNDARY BR 3$ ;AND DO NEXT ONE 4$: DIR$ #END ;OUTPUT LAST CR DIR$ #WAIT ;WAIT FOR IT ALL DIR$ #KILL ;KILL TERMINAL I/O, IN CASE LEAVE RETURN ;AND RETURN ; ; OCT: MOV R1,R5 BIC #-10,R5 MOV R5,-(SP) ASR R1 ASR R1 ASR R1 BEQ 1$ CALL OCT 1$: MOV (SP)+,R5 ADD #'0,R5 MOVB R5,(R4)+ RETURN ; ; .SBTTL >VARIABLES AND SUCH ; ; WAIT: WTLO$ 0,30 ;WAIT FOR TIMER OR OUTPUT ASSIGN: ALUN$ OUTLUN,TT,0 OUT: QIO$ IO.WLB!TF.WBT,OUTLUN,OUTEVF,,,,<0,0,40> END: QIO$ IO.WLB!TF.WBT,OUTLUN,OUTEVF,,,, KILL: QIO$ IO.KIL,OUTLUN CLEF: CLEF$ TIMEVF TIME: MRKT$ TIMEVF,1,3 ; ; MESS: .ASCII <15><12>/MESSAGE FROM / MESSID: .BLKB 132. ATMES: .ASCII / AT TT/ LATMES=.-ATMES .EVEN FROMTI: .BLKW 1 ; ; ; .END