.TITLE CA .IDENT /V3.2.1/ ; ; ; (LONG COMMENTS) ; .NLIST BEX ; ; DATA .MCALL DIR$,GMCR$,QIOW$S,SPWN$S,STSE$S,EXIT$S ; TASK = 1 ;DEFINE INS WITH /TASK=SWITCH ; TSKNAM: .RAD50 /MCR.../ ;TARGET TASK NAME GGG: .WORD 1 MMM: .WORD 54 ;MEMBER CODE OCBB: .BLKW ;EXIT STATUS FROM SPWAN ; $MUCB:: .WORD 0 $MOCB:: .WORD 0 $MTERM:: .WORD 0 $MBUF:: .WORD 0 DISLEN:: .WORD 0 TSKN: .RAD50 '... ' TIUCB: .WORD 0 ;TEMP TI: UCB ADDRESS STORAGE CW2: .WORD 0 ;TEMP TERM. STATUS STORAGE ; INSCMD: .ASCII /INS / ;INSTALL COMMAND INSBUF: .ASCII /$.../ ;TASKNAME BUFFER .IF DF TASK TSK: .ASCII %/TASK=...% ; /TASK= SWITCH NAME: .ASCII /.../ ;ACTUAL NAME IS HERE .BYTE 33 .EVEN INSLEN=.-INSCMD ; .IFF .BYTE 33 ;END OF STRING IS ESC. .EVEN INSLEN=.-INSCMD .ENDC ;TASK ; .WORD 0 GMCR: GMCR$ ERRMSG: .ASCIZ /MCR2 -- SYNTAX ERROR/ .EVEN ERRLEN=.-ERRMSG NOTMSG: .ASCIZ /MCR2 --TASK NOT IN SYSTEM/ .EVEN NOTLEN=.-NOTMSG ; TSKLST: .ASCII /CMP,CMP,INI,FLX,ERF,SLP,LBR,MUX,BRO,EDT,/ .ASCII /MOU,UFD,LOA,UNL,BOO,ZAP,ACS,VMR,VFY,DSC,/ .ASCII /TKB,FOR,EDI,PIP,MAC,RMD,PAT,/ .ASCII /RNO,PSE,SYE,/ .ASCII /TRA,DMO,STO,SAV,TEC,TVG,DOC,SRD,MSG,FTB,BAS,/ .EVEN .WORD 0 ;END OF LIST FLAG ; ; ; PROGRAM ; CA: DIR$ #GMCR ;GET COMMAND LINE BCC 33$ JMP SYNERR ;SOMETHING ILLEGAL 33$: MOV #GMCR,R1 ;GET GMCR BASE ADD #G.MCRB,R1 ;GET CMDL BUFFER MOV #TSKLST,R2 ;GET OUR TASKLIST MOV $DSW,DISLEN ;SAVE NUMBER OF CHARACTERS MOV R1,$MBUF ADD DISLEN,R1 MOVB (R1),$MTERM ;SAVE TERMINATOR MOV $MBUF,R1 5$: CMPB (R1),(R2)+ ;TRY TO FIND COMMAND BNE 10$ ;NO MATCH CMPB 1(R1),(R2)+ ;TRY SECOND CHAR BNE 10$ ;NO MATCH CMPB 2(R1),(R2)+ ;TRY THIRD CHAR BNE 10$ ;NO MATCH MOV $TKTCB,R4 ;GET MY TCB ADD BIC #T3.MCR,T.ST3(R4);CLEAR FOR NO PROMPT WHEN CA EXITS MOV T.UCB(R4),R4 ;GET MY UCB ADD 22$: MOV U.RED(R4),R4 CMP R4,U.RED(R4) BNE 22$ MOV R4,TIUCB ;SAVE MOV R4,$MUCB MOV U.CW2(R4),CW2 ;STORE INITIAL STATUS MOV $MBUF,R0 MOV #1,R1 CALL $CAT5 MOV R1,TSKN+2 CALL INS ;INSTALL THE TASK MOV #TSKN,R3 SUB #4,$MBUF MOV $TKTCB,R1 MOV T.OCBH(R1),R1 BEQ 66$ ; CMP O.MCRL(R1),$MBUF ; BNE 66$ MOV R1,$MOCB 66$: CALL EXEC BCS NOTIN BR EXIT ;AND STOP CA. 10$: TSTB (R2) ;END OF TASKLIST? BEQ NOTIN ;IF EQ. WE ARE AT END CMPB (R2)+,#', ;TRY TO FIND NEXT TASKNAME BEQ 5$ ;IF EQ. WE GOT ONE BR 10$ ;TRY NEXT CHAR ; ; SUBROUTINES ; SPWN: SPWN$S #TSKNAM,,,#GGG,#MMM,#5,,#OCBB,R0,R2 BCS NOTIN STSE$S #5 ;WAIT FOR TASK CMP #1,OCBB ;SEE IF EVERY THING WENT OK BNE NOTIN ;OOPS!!!!! 10$: RETURN ; NOTIN: QIOW$S #IO.WVB,#5,#5,,,,<#NOTMSG,#NOTLEN,#40> BR EXIT ; SYNERR: QIOW$S #IO.WVB,#5,#5,,,,<#ERRMSG,#ERRLEN,#40> ; EXIT: MOV TIUCB,R4 ;GET MY TT UCB ADD MOV CW2,U.CW2(R4) ;RESTORE TERM. STATUS EXIT$S ; INS: MOV #INSBUF+1,R2 ;GET INSBUF ADD MOV $MBUF,R1 MOVB (R1),(R2)+ ;INSERT TASKNAME MOVB 1(R1),(R2)+ ;TO BE MOVB 2(R1),(R2)+ ;INSTALLED ; .IF DF TASK ; MOV #NAME,R2 MOVB (R1),(R2)+ ;INSERT MOVB 1(R1),(R2)+ ;TASKNAME MOVB 2(R1),(R2)+ ;IN /TASK= SWITCH ; .ENDC ;TASK ; ; MOVB #33,(R2) ;AND CLOSE LINE MOV #INSCMD,R0 ;GET INSTALL CMD MOV #INSLEN,R2 ;AND LEN BIS #U2.SLV!U2.PRV,U.CW2(R4) ;SLAVE AND PRV THE TERM CALL SPWN ;EXECUTE IT BIC #U2.PRV!U2.SLV,U.CW2(R4) ;UNSLAVE AND NOT PRV RETURN ; ; ; ; .END CA