.TITLE /MCRUN/ .IDENT /01/ ; MCRUN IS A GENERAL UTILITY PROGRAM TO ALLOW PROGRAMS TO SEND A 24 CHARACTER COMMAND ; TO MCR. ANY PROGRAM MAY ISSUE A SEND AND REQUEST DIRECTION PAIR AIMED AT ; MCRUN, AND THERBY CAUSE AN ARBITRARY MCR COMMAND, PASSED TO MCRUN IN THE SEND BLOCK ; TO BE EXECUTED. THE FORMAT OF THE SEND BLOCK IS. ; ; WORD 1 UNUSED ; WORD 2 PACKED ASCII ; WORD 3 MCR COMMAND ; WORD 4 : ; . : ; . : ; WORD 13 : ; ANY MCR COMMAND WHICH CAN BE EXPRESSED WITH 24 CHARACTERS(INCLUDING COMMANDS TO ; SYSTEM UTILITIES(PIP ETC.))MAY BE SENT. .MCALL CALLR , TCBDF$ , RCVX$S TCBDF$ ; ; SYMBOL DEFINITIONS ; ESC=33 ; ; DATA ; MCRBUF: .WORD 0 ; STORAGE FOR POOL NODE ADDRESS TIUCB: .WORD 0 ; STORAGE FOR TTY UCB ADDRESS RBUF: .BLKW 15. ; STORAGE FOR RECEIVE BUFFER RBUEND: ; ADDRESS OF RBUF END .WORD 0 ; SAV\FTY BUFFER NEVER REMOVE .WORD 0 ; ; PROGRAM ; START: RCVX$S ,#RBUF ; RECEIVE OR EXIT ; CLR MCRBUF ; SHOW NO MCR BUFFER MOV $TKTCB,R1 ; GET OUT TCB ADDRESS MOV T.UCB(R1),TIUCB ; GET OUR TI UCB ADDRESS MOV #84.,R1 ; SHOW WE WANT THIS SIZE BUFFER CALL $SWSTK,2$ ; SWITCH TO SYSTEM PROCESS CALL $ALOCB ; ALLOCATE A BUFFER BCS 1$ ; NO BUFFER AVAILABLE MOV R0,MCRBUF ; SAVE BUFFER ADDRESS 1$: RETURN ; RETURN TO USER PROCESS 2$: MOV MCRBUF,R0 ; GET BUFFER ADDRESS BNE 3$ ; WE GOT A BUFFER BR START ; PROCESS NO BUFFER ERROR 3$: CLR (R0)+ ; CLEAR FORWARD POINTER MOV TIUCB,(R0)+ ; TELL MCR WHICH UCB TO USE FOR TI MOV #RBUEND,R2 ; GET END OF RECEIVE BUFFER 4$: TSTB (R2) ; BACK SCAN TO FIRST NON-BLANK NON-NULL BNE 7$ ; IGNORE NULL DEC R2 BR 4$ 7$: CMPB -(R2),#' ; BLANK WILL BE IGNORED TOO BEQ 4$ INC R2 ; POINT TO BLANK OR NULL MOVB #ESC,(R2) ; FORCE COMMAND TO END WITH ESC INC R2 ; BUMP ON BEYOUND MOV #RBUF+6,R3 ; GET START OF RECEIVE CHARS 5$: MOVB (R3)+,(R0)+ ; PUT CHARACTERS IN MCR BUFFER CMP R3,R2 ; GOT THEM ALL? BNE 5$ ; NO CALL $SWSTK,6$ ; SWITCH TO SYSTEM PROCESS MOV MCRBUF,R1 ; GET ADDRESS OF MCR BUFFER CALLR $QMCRL ; QUEUE MCR LINE AND RETURN ; TO USER PROCESS 6$: BR START ; EXIT .END START