.TITLE MASSAGE .SBTTL INTRO PAGE .IDENT /MRH001/ .MCALL DIR$,EXIT$S,GMCR$,SPWN$,STSE$,QIOW$ ; ;THIS PROGRAM IS A COMBINATION OF PREVIOUS PROGRAMS AND ENHANCEMENTS ;ORIGINALLY DEVELOPED BY REID L BROWN OF WALLGREENS ; ;THIS PROGRAM COMBINES SEVERAL DCL TYPE COMMAND LINES INTO ONE ;PROGRAM. ; ;PRI[NT] QUE NAMED FILE TO LP ; ;DOC[UMENT] QUE NAMED FILE TO LP1 WITH FORMS TYPE 1 ; ;TYP[E] OUTPUT NAMED FILE TO TI ; ;PUR[GE] PURGE NAMED FILE TO LATEST VERSION ; ;DIR[ECTORY] GIVE A DIRECTORY OF THE DISK IN QUESTION ; ;BLO[CKS] LIST USED/ALLOCATED BLOCKS ; ;REC[OVER] RECOVER LOCKED FILE(S) ; ;FRE[E] REPORT AVAILABLE BLOCKS ON DISK ; ;SUB[MIT] SUBMIT FILE TO BATCH RUN ; ;PRO[TECT] SET FILE DELETE PROTECTION ON ; ;UNP[ROTECT] SET FILE DELETE PROTECTION OFF ; ;USE N,N SET /UIC=[N,N] ; ;COP[Y] FILE PIP SY:=FILE ; ;BRI[EF] DO BRIEF DIRECTORY (FASTER) OF DISK IN QUESTION ; ; LATELY ADDED ARE SHORT FORM COMMANDS TO FORTRAN AND MACRO ; TO AUTOMATICALLY EXPAND ONE NAME TO 3, I.E. ;FOR XXX F77 XXXXXX,XXXXXX/-SP=XXXXXX ;MAX XXX MAC XXXXXX,XXXXXX/-SP=XXXXXX ; ;DEL[ETE] DELETE ALL COPIES OF A FILE (WITH A PROMPT) ;TRU[NCATE] TRUNCATES FILES (RETURNS UNUSED BLOCKS) ; ; ;IN ADDITION, ALL TASK NOT INSTALLED ERRORS MCR ENCOUNTERS WILL CAUSE HIM TO ;SEND THE DIRECTIVE TO MASSAGE. MASSAGE WILL ATTEMPT TO INSTALL THE TASK ;LB:[11,1]XXX.TSK IF SUCCESSFUL HE WILL EXECUTE SAID MCR TASK AND REMOVE HIM ;ON EXIT. IF UNSUCCESSFUL, HE WILL ISSUE THE MCR ERROR MESSAGE "TASK NOT ;INSTALLED" ; ;THE PROGRAM WORKS SIMILAR TO MFT, IE MCR MUST REALIZE THAT THE ;COMMAND LINE SHOULD GO TO DCL RATHER THAN THE ONE MENTIONED IN ;THE COMMAND LINE. ; ;THIS PROGRAM MASSAGES THE COMMAND LINE, FOR EXAMPLE ; ; MCR>PRINT XXXXXX.YYY ; ;IS REFORMATTED AND SENT TO ...QUE AS ; ; QUE LP:=XXXXXX.YYY ; ;F.BORGER ;MICHAEL REESE MEDICAL CENTER ;DEPT OF MEDICAL PHYSICS ;SEPTEMBER 78 ; ;MODIFIED FEB '79 (ADDED SUB[MIT] TO BATCH COMMAND .PAGE .SBTTL LOCAL DATA, DPB'S ; ;DPB'S ; SPWXXX: SPWN$ ...XXX,GEN,,,,1 ;SPAWN APPROPRIATE TASK IN GEN PARTITION, INSXXX: SPWN$ ...INS,GEN,,1,1,1,,,INSMES,INSLEN ;SPAWN INS UNDER UIC [1,1] REMXXX: SPWN$ ...REM,GEN,,1,1,1,,,REMMES,REMLEN ;SPAWN REM UNDER UIC [1,1] ;WAIT FOR FLAG 1 FOR ALL SPAWNS STOXXX: STSE$ 1 ;STOP UNTIL SPAWNED TASK FINISHES ; MCR: GMCR$ ;DPB TO GET MCR LINE QIODPB: QIOW$ IO.WVB,1,1,,,, ;REPORT TASK NOT INSTALLED ; ; MISC STORAGE PERFLG: .WORD 0 ;FLAG THAT PERIOD WAS SEEN IN CMD LINE SEMFLG: .WORD 0 ;FLAG THAT SEMICOLON WAS SEEN IN CMD LINE SLAFLG: .WORD 0 ;FLAG THAT SLASH WAS SEEN IN CMD LINE TSKDOT: .RAD50 /.../ ;FULL RAD-50 NAME CALNAM: .WORD 0 ;TO CALL OR INSTALL TSKNAM: .WORD 0 ;RAD-50 TASK NAME IN COMMAND LINE MASNAM: .RAD50 /MAS/ ;CHECK SO I DON'T CALL MYSELF DELNAM: .RAD50 /DEL/ ;CHECK FOR DELETE FUNCTION VCPUD: .WORD 0 ;PUD ADDRESS OF VC: NAMEST: .WORD 0 ;START OF NAME IN COMMAND LINE NAMELN: .WORD 0 ;LENGTH OF NAME (FOR FOR, MAC 1-LINERS) SPWBUF: .BLKW 45 ;BUFFER FOR COMMAND LINE ; ; .PAGE .SBTTL ASCII DATA ; ;ASCII MESSAGES ; NOTMES: .ASCII /*** MCR TASK / NOTMEP: .ASCII / NOT INSTALLED ***/ NOTLEN=.-NOTMES LENERR: .ASCII /*** MCR COMMAND LINE TOO LONG ***/ LENERL=.-LENERR .EVEN ; ; ;ASCII COMMAND LINES FOR REMOVE AND INSTALL ; INSMES: .ASCII /INS LB:[11,1]/ INSPT1: .ASCII ?XXX/TASK=...? INSPT2: .ASCII ?XXX? INSLEN=.-INSMES ; REMMES: .ASCII /REM .../ REMPT1: .ASCII /XXX/ REMLEN=.-REMMES .EVEN .PAGE .SBTTL COMMAND TABLE ;THE FOLLOWING TABLE CONSIST OF 5-WORD ENTRIES OF THE FORM: ;(1) RAD-50 TASK NAME (2ND HALF) ;(2) POINTER TO START OF LEADER OF MODIFIED COMMAND ;(3) POINTER TO CHAR STRING TO ADD TO FILESPEC (OPTIONAL) ;(4) POINTER TO START OF TRAILER OF MODIFIED COMMAND (OPTIONAL) ;(5) RAD50 (LAST HALF) NAME OF TASK TO EVOKE ; CMDTAB: .RAD50 /PRI/ ;PRINT FUNCTION ENTRY .WORD PRILDR ;ADDRESS OF LEADER ASCII STRING .WORD 0 ;NO ADDITIONS TO FILESPEC .WORD 0 ;NO TRAILER FOR THIS COMMAND .RAD50 /QUE/ ;SEND COMMAND TO ...QUE ; .RAD50 /DOC/ ;DOCUMENT FUNCTION ENTRY .WORD DOCLDR ;ADDRESS OF LEADER ASCII STRING .WORD 0 ;NO ADDITIONS TO FILESPEC .WORD 0 ;NO TRAILER FOR THIS COMMAND .RAD50 /QUE/ ;SEND COMMAND TO ...QUE ; .RAD50 /TYP/ ;TYPE FUNCTION .WORD TYPLDR .WORD TYPADD ;ADDITION TO FILESPEC .WORD 0 ;NO TRAILER FOR THIS COMMAND .RAD50 /PIP/ ; .RAD50 /PUR/ ;PURGE FUNCTION .WORD PIPLDR .WORD 0 ;NO ADDITION TO FILESPEC .WORD PURTRL .RAD50 /PIP/ ; .RAD50 /DEL/ ;DELETE FUNCTION .WORD PIPLDR .WORD DIRADD .WORD DELTRL .RAD50 /PIP/ ; .RAD50 /DIR/ ;DIRECTORY FUNCTION .WORD PIPLDR .WORD DIRADD ;STRING TO ADD TO FILESPEC .WORD DIRTRL .RAD50 /PIP/ ; .RAD50 /BRI/ ;BRIEF DIRECTORY .WORD PIPLDR .WORD DIRADD ;STRING TO ADD TO FILESPEC .WORD BRITRL ;DIFFERENT TRAILER .RAD50 /PIP/ ;PASS THE COMMAND TO PIP ; .RAD50 /BLO/ ;BLOCKS FUNCTION .WORD PIPLDR .WORD DIRADD ;STRING TO ADD TO FILESPEC .WORD BLOTRL .RAD50 /PIP/ ; .RAD50 /REC/ ;RECOVER LOCKED FILE FUNCTION .WORD PIPLDR .WORD DIRADD .WORD RECTRL .RAD50 /PIP/ ; .RAD50 /FRE/ ;LIST FREE BLOCKS FUNCTION .WORD PIPLDR .WORD 0 .WORD FRETRL .RAD50 /PIP/ ; .RAD50 /SUB/ ;SUBMIT TO BATCH .WORD SUBLDR ;LEADER ADDRESS .WORD SUBADD ;ADDRESS OF FILE TYPE TO ADD TO FILESPEC .WORD SUBTRL ;TRAILER ADDRESS .RAD50 /QUE/ ;TASK TO EVOKE ; .RAD50 /PRO/ ;PROTECT FILE FROM DELETION .WORD PIPLDR ;LEADER ADDRESS .WORD DIRADD ;ADDRESS OF FILE TYPE TO ADD TO FILESPEC .WORD PROTRL ;TRAILER ADDRESS .RAD50 /PIP/ ;TASK TO EVOKE ; .RAD50 /TRU/ ;TRUNCATE FILE .WORD PIPLDR ;LEADER ADDRESS .WORD DIRADD ;ADDRESS OF FILE TYPE TO ADD TO FILESPEC .WORD TRUTRL ;TRAILER ADDRESS .RAD50 /PIP/ ;TASK TO EVOKE ; .RAD50 /UNP/ ;UNPROTECT FILE .WORD PIPLDR ;LEADER ADDRESS .WORD DIRADD ;ADDRESS OF FILE TYPE TO ADD TO FILESPEC .WORD UNPTRL ;TRAILER ADDRESS .RAD50 /PIP/ ;TASK TO EVOKE ; .RAD50 /WHA/ ;WHAT COMMAND .WORD WHALDR ;LEADER ADDRESS .WORD 0 ;NO ADDIT TO FILESPEC .WORD 0 ;NO TRAILER .RAD50 /INF/ ;EVOKE INFORM ; .RAD50 /WHN/ ;CLUDGE FOR WHEN .WORD WHNLDR ;LEADER ADDRESS .WORD 0 .WORD 0 .RAD50 /INF/ ;EVOKE INFORM ; .RAD50 /USE/ ;PSEUDO NAME .WORD USELDR ;LEADER ADDRESS .WORD 0 ;NO INSERT .WORD USETRL ;TRAILER ADDRESS .RAD50 /SET/ ;EVOKE SET ; .RAD50 /COP/ ;COPY FILE .WORD COPLDR ;LEADER ADDRESS .WORD 0 ;NO INSERT .WORD 0 ;NO TRAILER .RAD50 /PIP/ ;EVOKE PIP ; .RAD50 /FOR/ ;FOR AUTO LINER .WORD FORLDR ;ADDRESS OF LEADER .WORD -3 ;FLAG FOR 3 WORD EXPANSION .WORD 0 ;NO TRAILER .RAD50 /F77/ ;EVOKE F77 COMPILER ; .RAD50 /MAX/ ;FOR AUTO LINER .WORD MAXLDR .WORD -3 .WORD 0 .RAD50 /MAC/ ;EVOKE MACRO ; .WORD 0 ;END OF TABLE INDICATOR .PAGE .SBTTL LEADERS AND TRAILERS (IN ASCII) ;FIRST THE LEADER STRINGS ; PRILDR: .ASCIZ /QUE LP:=/ ;PRINT LEADER DOCLDR: .ASCIZ ?QUE LP1:/FO:1=? ;DOCUMENT LEADER TYPLDR: .ASCIZ /PIP TI:=/ ;TYPE LEADER PIPLDR: .ASCIZ /PIP / ;GENERAL LEADER SUBLDR: .ASCIZ /QUE BA:=/ ;LEADER FOR SUBMIT COMMAND WHALDR: .ASCIZ ?INF ACT/E? ;LEADER FOR INFORM ACT WHNLDR: .ASCIZ ?INF CKQ? ;LEADER FOR INFORM CKQ USELDR: .ASCIZ ?SET /UIC=[? ;LEADER FOR USE COPLDR: .ASCIZ /PIP SY:=/ ;LEADER FOR COPY FORLDR: .ASCIZ /F77 / ;FOR LEADER MAXLDR: .ASCIZ /MAC / ;MACRO LEADER ; ;NOW POSSIBLE STRINGS TO ADD TO FILESPEC ; SUBADD: .ASCIZ /.BIS/ ;SUBMIT FILESPEC ADDITION DIRADD: .ASCIZ /.*;*/ ;OPTIONAL DIRECTORY STRING ADDITION TYPADD: .ASCIZ /.DOC/ ;IF NO FILESPEC, TYPE ALL LIST FILES ; ;NOW THE TRAILERS ; PURTRL: .ASCIZ ?/PU? ;PURGE TRAILER DELTRL: .ASCIZ ?/SD? ;DELETE TRAILER DIRTRL: .ASCIZ ?/LI? ;DIRECTORY TRAILER BRITRL: .ASCIZ ?/BR? ;BRIEF DIRECTORY TRAILER BLOTRL: .ASCIZ ?/TB? ;BLOCKS TRAILER RECTRL: .ASCIZ ?/UN? ;RECOVER TRAILER FRETRL: .ASCIZ ?/FR? ;FREE TRAILER SUBTRL: .ASCIZ ?/BA? ;SUBMIT TRAILER PROTRL: .ASCIZ ?/PR/SY:RWE/OW:RWE/FO? ;PROTECT TRAILER UNPTRL: .ASCIZ ?/PR/SY:RWED/OW:RWED/FO? ;UNPROTECT TRAILER USETRL: .ASCIZ ?]? ;USE TRAILER TRUTRL: .ASCIZ ?/TR? ;TRUNCATE TRAILER .EVEN .PAGE .SBTTL GET COMMAND LINE AND FIGURE OUT WHAT HE WANTS ; START: CLR R0 ;SET UP FOR CALL MOV #"CO,R4 ;DEV NAME IN R4 CLR R5 ;UNIT # IN R5 JSR PC,..FDEV ;FIND PUD ADDRESS OF CO MOV R5,VCPUD ;SAVE PUD ADDRESS OF VC MOV #177777,U.LBN(R5) ;MAKE CO PRIV TERM SO INS IS OK BIS #UT.PR,U.TF(R5) ;AND MAKE PRIV ALSO DIR$ #MCR,ERROR ;TRY TO GET MCR COMMAND LINE MOV $DSW,R5 ;SAVE LENGTH OF RECEIVED COMMAND LINE MOV #MCR+2,R0 ;START OF ASCII TO R0 CLR R1 ;SHOW PERIOD NOT RAD50 JSR PC,$CAT5 ;CONVERT REQ'D NAME TO RAD50 CMP R1,MASNAM ;IS IT A CALL TO ME BNE 2222$ ;IT'S OK TO LOOK FOR ANY OTHER TASK, JMP ERROR ;BUT DON'T LET ME CALL MYSELF 2222$: MOV R1,TSKNAM ;SAVE TASK NAME MOV R1,CALNAM ;AND COMMAND LINE NAME MOV #CMDTAB,R0 ;POINT R0 TO START OF COMMAND TABLE 1$: CMP (R0),R1 ;FOUND THE ACTION HE WANTS ? BEQ FILL ;BRANCH IF SO ADD #12,R0 ;ELSE TRY ANOTHER TST (R0) ;DID WE FALL THROUGH TABLE ? BNE 1$ ;IF NOT, LOOK AGAIN ; ;IF NOT MASSAGE, TRY TO INSTALL MOV CALNAM,R1 ;GET TASK NAME MOV #INSPT1,R0 ;INSERT IN INSTALL MESSAGE JSR PC,$C5TA MOV CALNAM,R1 MOV #INSPT2,R0 ;INSERT TWICE JSR PC,$C5TA MOV .CRTSK,R4 ;GET MY ATL MOV A.TI(R4),-(SP) ;SAVE MY TI POINTER MOV VCPUD,A.TI(R4) ;MAKE INSTALL RUN AT VC DIR$ #INSXXX ;SPAWN INSTALL TO INSTALL TASK DIR$ #STOXXX ;WAIT FOR INSTALL MOV (SP)+,A.TI(R4) ;RESTORE MY TI POINTER MOV #TSKDOT,R1 ;POINT TO FULL RAD-50 NAME JSR PC,..FSTD ;FIND HIS STD TST R2 ;BETTER HAVE STD ADDRESS BNE 3$ ;BR IF OK JMP ERROR ;REPORT ERROR 3$: BIS #SF.RM,S.FW(R2) ;SET REMOVE-ON-EXIT FLAG MOV #MCR+2,SPWXXX+S.PWCA ;FILL IN COMMAND INFO IN SPAWN DPB MOV R5,SPWXXX+S.PWCL MOV .CRTSK,R4 ;GET MY ATL ENTRY MOV A.TI(R4),R4 ;MY PUD POINTER MOV U.PC(R4),SPWXXX+S.PWPC ;MAKE TASK RUN UNDER MY PC MOV CALNAM,SPWXXX+S.PWTN+2 ;FILL IN HIS TASK NAME DIR$ #SPWXXX,ERROR ;SPAWN THE TASK DIR$ #STOXXX ;STOP FOR HIM EXIT$S .PAGE .SBTTL FILL IN MASSAGED COMMAND LINE FILL: ;FOUND LEGIT REQUESTED TASK, FILL IN APPROPRIATE LEADER MOV 10(R0),CALNAM ;CHANGE NAME OF TASK TO REQUEST MOV 2(R0),R1 ;POINT TO LEADER MOV #SPWBUF,R2 ;POINT TO SPAWN COMMAND BUFFER 1$: MOVB (R1)+,(R2)+ ;XFER A CHARACTER TSTB (R1) ;NEXT CHAR A NULL (END OF LEADER) ? BNE 1$ ;IF NOT, XFER ANOTHER ;LEADER DONE, LOOK FOR FILESPEC MOV #MCR+5,R1 ;POINT PAST TSK NAME IN COMMAND LINE SUB #3,R5 ;ACCOUNT FOR IT IN COUNT BLE 70$ ;ONLY 3-CHAR TASK NAME IN COMMAND 10$: MOVB (R1)+,R3 ;GET NEXT CHARACTER DEC R5 ;ACCOUNT FOR IT BLE 70$ ;IF NONE LEFT, NO FILE SPECIFIED CMPB R3,#40 ;A SPACE ? (MCR REMOVES MULT SPACES AND TABS) BNE 10$ ;IF NOT, TRY AGAIN ;NOW LOOKING AT FIRST LETTER OF FILESPEC MOV R1,NAMEST ;SAVE POINTER TO START OF NAME MOV R5,NAMELN ;ASSUME NAME ONLY ON LINE FOR 3-NAME EXPANDS MOV R5,-(SP) ;SAVE LENGTH OF FILESPEC STRING FOR LATER 60$: CMPB (R1),#'. ;SEEN A PERIOD ? BNE 61$ ;SKIP IF NOT INC PERFLG ;SHOW PERIOD SEEN 61$: CMPB (R1),#'; ;SEEN A SEMICOLON ? BNE 62$ ;SKIP IF NOT INC SEMFLG ;SHOW SEMICOLON SEEN 62$: MOVB (R1)+,(R2)+ ;FILL IN FILESPEC SOB R5,60$ ;UNTIL DONE MOV (SP)+,R5 ;RESTORE LENGTH OF FILESPEC 70$: MOV 4(R0),R1 ;GET POSSIBLE ADDITION TO FILESPEC BEQ 80$ ;SKIP IF NONE REQUESTED BPL 71$ ;ADD DEFAULTS TO FILESPEC IF REQUIRED ;IF NEGATIVE, THIS NAME SHOULD BE EXPANDED TO ;3 FOR AUTO FORTRAN OR MACRO MOVB #',,(R2)+ ;PUT IN COMMA BETWEEN OBJ, LISTING MOV NAMEST,R1 ;POINT BACK TO NAME MOV NAMELN,R5 ;TO COPY AGAIN 711$: MOVB (R1)+,(R2)+ ;FILL IN NAME 2ND TIME SOB R5,711$ MOVB #'/,(R2)+ MOVB #'-,(R2)+ MOVB #'S,(R2)+ MOVB #'P,(R2)+ MOVB #'=,(R2)+ MOV NAMEST,R1 ;POINT BACK TO NAME MOV NAMELN,R5 ;TO COPY AGAIN 712$: MOVB (R1)+,(R2)+ ;FILL IN NAME 3RD TIME SOB R5,712$ JMP 90$ ;WE'RE DONE, DO THE SPAWN .PAGE .SBTTL CHECK FOR DEFAULTS IF ANY, 71$: TST PERFLG ;DID WE SEE A PERIOD ? BNE 80$ ;IF WE DID, DON'T ADD ".*;*" TST R5 ;WAS THERE A FILESPEC AT ALL ? BLE 72$ ;BR IF THERE WAS NONE CMPB -1(R2),#'] ;DID HE JUST SPECIFY UIC ? BEQ 72$ ;BR IF YES CMPB -1(R2),#': ;OR DID HE JUST SPECIFY A DEVICE ? BEQ 72$ ;BR IF YES BR 75$ ;FILE NAME AT LEAST SPECIF 72$: MOVB #'*,(R2)+ ;IF NO NAME, DO "*"+SPECIFIED ADDITION 75$: MOVB (R1)+,(R2)+ ;XFER ADDED FILESPEC TSTB (R1) ;END OF ASCII ? BNE 75$ BR 84$ ;BRANCH TO ADD TRAILER 80$: CMP TSKNAM,DELNAM ;IS THIS DELETE BNE 84$ ;NO, SKIP SEMICOLON TEST TST SEMFLG ;DID WE SEE A SEMICOLON ? BNE 84$ ;IF WE DID, DON'T ADD ";*" MOVB #';,(R2)+ ;ADD ";" MOVB #'*,(R2)+ ;ADD "*" 84$: MOV 6(R0),R1 ;GET POSSIBLE TRAILER POINTER BEQ 90$ ;NON THERE 85$: MOVB (R1)+,(R2)+ ;XFER TRAILER CHARACTER TSTB (R1) ;END OF TRAILER BNE 85$ 90$: ;FINISHED MASSAGING THE COMMAND LINE .PAGE .SBTTL FILL IN DPB AND DO SPAWN MOV R2,-(SP) ;SAVE END OF LINE POINTER MOV #TSKDOT,R1 ;POINT TO FULL RAD-50 NAME JSR PC,..FSTD ;FIND HIS STD TST R2 ;BETTER HAVE STD ADDRESS BNE 103$ ;BR IF OK MOV CALNAM,R1 ;GET TASK NAME MOV #INSPT1,R0 ;INSERT IN INSTALL MESSAGE JSR PC,$C5TA MOV CALNAM,R1 MOV #INSPT2,R0 ;INSERT TWICE JSR PC,$C5TA MOV .CRTSK,R4 ;GET MY ATL MOV A.TI(R4),-(SP) ;SAVE MY TI POINTER MOV VCPUD,A.TI(R4) ;MAKE INSTALL RUN AT VC DIR$ #INSXXX ;SPAWN INSTALL TO INSTALL TASK DIR$ #STOXXX ;WAIT FOR INSTALL MOV (SP)+,A.TI(R4) ;RESTORE MY TI POINTER MOV #TSKDOT,R1 ;POINT TO FULL RAD-50 NAME JSR PC,..FSTD ;FIND HIS STD TST R2 ;BETTER HAVE STD ADDRESS BNE 102$ ;BR IF OK TST (SP)+ ;RESTORE STACK JMP ERROR ;NOW IT'S AN ERROR 102$: BIS #SF.RM,S.FW(R2) ;IF WE INSTALLED, SET REMOVE-ON-EXIT 103$: MOV .CRTSK,R4 ;GET MY ATL ENTRY MOV A.TI(R4),R4 ;AND MY PUD POINTER MOV U.PC(R4),SPWXXX+S.PWPC ;MAKE TASK RUN WITH MY UIC MOV #SPWBUF,R4 ;POINT TO COMMAND BUFFER MOV R4,SPWXXX+S.PWCA ;PUT ADDRESS IN DPB MOV (SP)+,R2 ;RESTORE END OF LINE POINTER SUB R4,R2 ;NOW HAVE LENGTH OF COMMAND IN R2 MOV CALNAM,SPWXXX+S.PWTN+2 ;SPECIFY SPAWNED TASK NAME CMP R2,#80. ;CHECK LENGTH OF COMMAND BGT ERRORL ;IF TO LONG, EXIT MOV R2,SPWXXX+S.PWCL ;FILL IN COMMAND LENGTH IN DPB DIR$ #SPWXXX,ERROR ;SPAWN TASK, EXIT IF AN ERROR DIR$ #STOXXX ;STOP FOR TASK TO RUN EXIT$S ;AND EXIT ; .PAGE .SBTTL ERROR HANDLING ERRORL: MOV #LENERR,QIODPB+Q.IOPL ;CHANGE ERROR MESSAGE MOV #LENERL,QIODPB+Q.IOPL+2 ;INFO ERROR: MOV TSKNAM,R1 ;TASK NAME MOV #NOTMEP,R0 ;ASCII BUFFER JSR PC,$C5TA ;CONVERT TASK NAME TO ASCII DIR$ #QIODPB ;REPORT TASK NOT INSTALLED ERROR EXIT$S .END START