.TITLE MCRREQ - SPAWN SUBTASK .IDENT /08SPE0/ ;+ ;.ENTRY MCRREQ ; - M C R R E Q ; FILE: [202,221]MCRREQ.ALX ; SYSTEM: RSX11M V3.2 ; LANGUAGE: ALECS/MACRO-11 ; AUTHOR: M. OOTHOUDT BASED ON 11D VERSION BY R. KITTELL ; DATE: 08-SEP-80 ;- ; REFERENCES: ; ; REVISIONS: ;+ ; ;****PURPOSE: SPAWN A SUBTASK AND OPTIONALLY PASS IT A COMMAND LINE. ; THE PARENT MAY ALSO WAIT FOR THE SUBTASK TO EXIT AND ; RECEIVE EXIT STATUS FROM THE SUBTASK. ; ;****RESTRICTIONS: CANNOT BE CALLED FROM AN AST SERVICE ROUTINE. ; ;****CALLING SEQUENCE: CALL MCRREQ(TSKNAM, [CMDLIN], [IWAIT], [STATUS]) ; ; INPUT: ; ; TSKNAM=(3L*1) THREE LETTER MCR TASK NAME. EG. FOR ...PIP, TSKNAM=PIP. ; THE NAME MUST BE NULL TERMINATED; IN F4P PASSING THE NAME ; AS A LITERAL (IE. 'PIP') WILL AUTOMATICALLY PUT THE NULL IN. ; ; CMDLIN=(BYTE ARRAY) ASCII COMMAND LINE TO BE PASSED TO THE SUBTASK. ; CHARACTERS BEYOND THE 75TH ARE NOT PASSED TO THE SUBTASK. ; THE LINE SHOULD CONTAIN ONLY THE DATA, NOT THE TASK NAME: ; '[200,200]/LI', NOT 'PIP [200,200]/LI'. ; THE LINE MUST BE NULL TERMINATED. IN F4P GIVING THE LINE ; AS A LITERAL DOES THIS AUTOMATICALLY. THE SUBTASK WILL ; RECEIVE (EG. VIA GETMCR) CMDLIN PREFIXED BY THE TSKNAME+ ; A SPACE AND SUFFIXED BY AN ESCAPE ("33). ; ; IWAIT =(I*2) IF THIS ARGUMENT IS PRESENT, THE PARENT TASK WAITS UNTIL ; THE SUBTASK EXITS BEFORE CONTINUING EXECUTION AND RECEIVES ; AN EXIT STATUS FROM THE SUBTASK. ; ; MODIFIED: ; ; IWAIT =(I*2) IF THIS ARGUMENT IS PRESENT IT WILL CONTAIN THE EXIT ; STATUS OF THE SUBTASK AFTER THE SUBTASK EXITS. ; ; OUTPUT: ; ; STATUS=(I*2) DIRECTIVE STATUS FOR ATTEMPT TO SPAWN THE SUBTASK: ; =IS.SUC=+1, SUCCESS. ; =IE.UPN=-1, INSUFFICIENT DYNAMIC MEMORY FOR SPAWN TO WORK. ; =IE.INS=-2, NO TASK NAME GIVEN IN MCRREQ CALL OR REQUESTED TASK ; NOT INSTALLED. ; =IE.ACT=-7, SPECIFIED TASK ALREADY ACTIVE. ; ; CMN BLOCKS USED: NONE ; ;****RESOURCES: ; LIBRARIES: SYSLIB:$CAT5 ; OTHER SUBR: NONE ; DISK FILES: NONE ; DEVICES: NONE ; SGAS: NONE ; EVENT FLAGS: NONE ; SYSTEM DIR: SPWN$, STOP$S, USTP$S, ASTX$S, DIR$ ; ;****NOTES: ; 1. EXAMPLES: ; CALL MCRREQ ('MOU','DK0:BACKUP',IWAIT) ; CALL MCRREQ ('PIP','DK0:[200,200]=SY:[200,200]*.*',WAIT) ; CALL MCRREQ ('DMO','DK0:') ; ; CALL MCRREQ ('HPL','@HPL.CMD') ; ;- ; ; MACROS ; .MCALL SPWN$,STOP$S,USTP$S,ASTX$S,DIR$ ; ; SYMBOL DEFINITIONS ; DEFARG=-1 ;ADDR OF DEFAULTED ARGUMENT ; ; STORAGE ALLOCATION AND INITIALIZATION ; SPAWN: SPWN$ ...XXX,,,,,,SPWAST,ESB,CMDLIN ; ESB: .BLKW 8. ;EXIT STATUS BLOCK WRITTEN WHEN SUBTASK EXITS ; CMDLIN: .BLKB 79. ;SUBTASK COMMAND LINE (SPWN$ MAX=79.) .BYTE 0 ;TERMINATING NULL ; WAIT: .BLKW 1 ;WAIT-ARGUMENT-PRESENT FLAG ; STATUS: .BLKW 1 ;VALUE OF DSW FOR SPAWN DIRECTIVE ; ; EXECUTABLE CODE ; MCRREQ:: WHEN (@R5:LT_B:#1 :IOR: 2(R5):EQ:#DEFARG) ;TASK NAME GIVEN? MOV #IE.INS,STATUS ;SET STATUS CODE=TASK NOT INSTALLED FIN ELSE ; ; PUT TASK NAME IN SPAWN DPB AND IN COMMAND LINE ; MOV 2(R5),R0 ;ADDR OF TASK NAME FOR DPB MOV #1,R1 ;FLAG PERIOD AS LEGAL CHAR (EG. AT.) JSR PC,$CAT5 ;CONVERT NAME TO RAD50 AND PUT IN R1 MOV R1,SPAWN+S.PWTN+2 ;STORE NAME IN DPB MOV 2(R5),R0 ;ADDR OF TASK NAME AGAIN FOR CMDLIN MOV #3,R1 ;MAX OF 3 CHARACTERS MOV #CMDLIN,R2 ;DESTINATION FOR NAME 5$: MOVB (R0)+,(R2)+ ;PUT NAME INTO CMDLIN BEQ 10$ ;NULL TERMINATES NAME SOB R1,5$ 10$: ; ; GET USER COMMAND LINE ; IF (@R5:GE_B:#2 :AND: 4(R5):NE:#DEFARG) ;WAS CMDLIN GIVEN? MOVB #40,(R2)+ ;YES, PUT IN A BLANK AFTER TASK NAME MOV #CMDLIN,R1 ;ADDR OF OUR BUFFER SUB R2,R1 ;NEGATIVE OF # OF BYTES SO FAR ADD #79.,R1 ;REMAINING # OF BYTES WE CAN PUT IN LINE MOV 4(R5),R0 ;USER CMDLIN ADDR 15$: MOVB (R0)+,(R2)+ ;MOVE IT TO OUR BUFFER BEQ 20$ ;NULL ENDS THE LINE SOB R1,15$ INC R2 ;PRETEND GOT A NULL FOR CONSISTENCY BELOW 20$: DEC R2 ;DON'T COUNT THE NULL FIN ; MOV #CMDLIN,R0 ;FIND # CHARACTERS IN NET CMD LINE SUB R0,R2 ;# OF BYTES IN CMDLIN EXCLUDING FINAL NULL MOV R2,SPAWN+S.PWCL ;STORE LENGTH IN DPB ; ; PROCESS WAIT ARGUMENT ; WHEN (@R5:LT_B:#3 :IOR: 6(R5):EQ:#DEFARG) ;WAS IT GIVEN? CLR WAIT ;NO, FLAG=ARG NOT GIVEN CLR SPAWN+S.PWEA ;DON'T NEED EXIT AST ADDR CLR SPAWN+S.PWES ;DON'T NEED EXIT STATUS BLOCK FIN ELSE MOV #1,WAIT ;FLAG=ARG PRESENT MOV #SPWAST,SPAWN+S.PWEA ;ADDR OF EXIT AST ROUTINE MOV #ESB,SPAWN+S.PWES ;ADDR OF EXIT STATUS BLOCK TO DPB FIN ; ; SPAWN IT ; DIR$ #SPAWN MOV $DSW,STATUS ;SAVE DIRECTIVE STATUS IF( STATUS:EQ:#IS.SUC :AND: WAIT:NE:#0) STOP$S ;WAIT FOR SUBTASK TO EXIT MOV ESB,@6(R5) ;RETURN EXIT STATUS OF SUBTASK FIN FIN ; ; RETURN DIRECTIVE STATUS IF REQUESTED ; IF ( @R5:GE_B:#4 :AND: 10(R5):NE:#DEFARG) MOV STATUS,@10(R5) FIN RETURN ; ; AST SERVICE ROUTINE USED TO RESTART WHEN SUBTASK EXITS. ; THIS AST IS THE REASON MCRREQ CANNOT BE CALLED FROM AN ; AST SERVICE ROUTINE. ; SPWAST: USTP$S ;UNSTOP THIS TASK TST (SP)+ ;CLEAN OFF STACK ASTX$S ; .END