(FLECS VERSION 22.38) 18-NOV-82 15:45:37 PAGE 00001 MCRREQ,MCRREQ/-SP=MCRREQ 00001 .TITLE MCRREQ - SPAWN SUBTASK 00002 .IDENT /08SPE0/ 00003 ;+ 00004 ;.ENTRY MCRREQ 00005 ; - M C R R E Q 00006 ; FILE: [202,221]MCRREQ.ALX 00007 ; SYSTEM: RSX11M V3.2 00008 ; LANGUAGE: ALECS/MACRO-11 00009 ; AUTHOR: M. OOTHOUDT BASED ON 11D VERSION BY R. KITTELL 00010 ; DATE: 08-SEP-80 00011 ;- 00012 ; REFERENCES: 00013 ; 00014 ; REVISIONS: 00015 ;+ 00016 ; 00017 ;****PURPOSE: SPAWN A SUBTASK AND OPTIONALLY PASS IT A COMMAND LINE. 00018 ; THE PARENT MAY ALSO WAIT FOR THE SUBTASK TO EXIT AND 00019 ; RECEIVE EXIT STATUS FROM THE SUBTASK. 00020 ; 00021 ;****RESTRICTIONS: CANNOT BE CALLED FROM AN AST SERVICE ROUTINE. 00022 ; 00023 ;****CALLING SEQUENCE: CALL MCRREQ(TSKNAM, [CMDLIN], [IWAIT], [STATUS]) 00024 ; 00025 ; INPUT: 00026 ; 00027 ; TSKNAM=(3L*1) THREE LETTER MCR TASK NAME. EG. FOR ...PIP, TSKNAM=PIP. 00028 ; THE NAME MUST BE NULL TERMINATED; IN F4P PASSING THE NAME 00029 ; AS A LITERAL (IE. 'PIP') WILL AUTOMATICALLY PUT THE NULL IN. 00030 ; 00031 ; CMDLIN=(BYTE ARRAY) ASCII COMMAND LINE TO BE PASSED TO THE SUBTASK. 00032 ; CHARACTERS BEYOND THE 75TH ARE NOT PASSED TO THE SUBTASK. 00033 ; THE LINE SHOULD CONTAIN ONLY THE DATA, NOT THE TASK NAME: 00034 ; '[200,200]/LI', NOT 'PIP [200,200]/LI'. 00035 ; THE LINE MUST BE NULL TERMINATED. IN F4P GIVING THE LINE 00036 ; AS A LITERAL DOES THIS AUTOMATICALLY. THE SUBTASK WILL 00037 ; RECEIVE (EG. VIA GETMCR) CMDLIN PREFIXED BY THE TSKNAME+ 00038 ; A SPACE AND SUFFIXED BY AN ESCAPE ("33). 00039 ; 00040 ; IWAIT =(I*2) IF THIS ARGUMENT IS PRESENT, THE PARENT TASK WAITS UNTIL 00041 ; THE SUBTASK EXITS BEFORE CONTINUING EXECUTION AND RECEIVES 00042 ; AN EXIT STATUS FROM THE SUBTASK. 00043 ; 00044 ; MODIFIED: 00045 ; 00046 ; IWAIT =(I*2) IF THIS ARGUMENT IS PRESENT IT WILL CONTAIN THE EXIT 00047 ; STATUS OF THE SUBTASK AFTER THE SUBTASK EXITS. 00048 ; 00049 ; OUTPUT: 00050 ; 00051 ; STATUS=(I*2) DIRECTIVE STATUS FOR ATTEMPT TO SPAWN THE SUBTASK: 00052 ; =IS.SUC=+1, SUCCESS. 00053 ; =IE.UPN=-1, INSUFFICIENT DYNAMIC MEMORY FOR SPAWN TO WORK. 00054 ; =IE.INS=-2, NO TASK NAME GIVEN IN MCRREQ CALL OR REQUESTED TASK 00055 ; NOT INSTALLED. (FLECS VERSION 22.38) 18-NOV-82 15:45:37 PAGE 00002 MCRREQ,MCRREQ/-SP=MCRREQ 00056 ; =IE.ACT=-7, SPECIFIED TASK ALREADY ACTIVE. 00057 ; 00058 ; CMN BLOCKS USED: NONE 00059 ; 00060 ;****RESOURCES: 00061 ; LIBRARIES: SYSLIB:$CAT5 00062 ; OTHER SUBR: NONE 00063 ; DISK FILES: NONE 00064 ; DEVICES: NONE 00065 ; SGAS: NONE 00066 ; EVENT FLAGS: NONE 00067 ; SYSTEM DIR: SPWN$, STOP$S, USTP$S, ASTX$S, DIR$ 00068 ; 00069 ;****NOTES: 00070 ; 1. EXAMPLES: 00071 ; CALL MCRREQ ('MOU','DK0:BACKUP',IWAIT) 00072 ; CALL MCRREQ ('PIP','DK0:[200,200]=SY:[200,200]*.*',WAIT) 00073 ; CALL MCRREQ ('DMO','DK0:') 00074 ; 00075 ; CALL MCRREQ ('HPL','@HPL.CMD') 00076 ; 00077 ;- 00078 ; 00079 ; MACROS 00080 ; 00081 .MCALL SPWN$,STOP$S,USTP$S,ASTX$S,DIR$ 00082 ; 00083 ; SYMBOL DEFINITIONS 00084 ; 00085 DEFARG=-1 ;ADDR OF DEFAULTED ARGUMENT 00086 ; 00087 ; STORAGE ALLOCATION AND INITIALIZATION 00088 ; 00089 SPAWN: SPWN$ ...XXX,,,,,,SPWAST,ESB,CMDLIN 00090 ; 00091 ESB: .BLKW 8. ;EXIT STATUS BLOCK WRITTEN WHEN SUBTASK 00092 ; 00093 CMDLIN: .BLKB 79. ;SUBTASK COMMAND LINE (SPWN$ MAX=79.) 00094 .BYTE 0 ;TERMINATING NULL 00095 ; 00096 WAIT: .BLKW 1 ;WAIT-ARGUMENT-PRESENT FLAG 00097 ; 00098 STATUS: .BLKW 1 ;VALUE OF DSW FOR SPAWN DIRECTIVE 00099 ; 00100 ; EXECUTABLE CODE 00101 ; 00102 MCRREQ:: 00103 WHEN (@R5:LT_B:#1 :IOR: 2(R5):EQ:#DEFARG) ;TASK NAME GIVEN? 00104 . MOV #IE.INS,STATUS ;SET STATUS CODE=TASK NOT INSTALLED 00105 ...FIN 00106 ELSE 00107 ; . 00108 ; . PUT TASK NAME IN SPAWN DPB AND IN COMMAND LINE 00109 ; . 00110 . MOV 2(R5),R0 ;ADDR OF TASK NAME FOR DPB (FLECS VERSION 22.38) 18-NOV-82 15:45:37 PAGE 00003 MCRREQ,MCRREQ/-SP=MCRREQ 00111 . MOV #1,R1 ;FLAG PERIOD AS LEGAL CHAR (EG. AT.) 00112 . JSR PC,$CAT5 ;CONVERT NAME TO RAD50 AND PUT IN R1 00113 . MOV R1,SPAWN+S.PWTN+2 ;STORE NAME IN DPB 00114 . MOV 2(R5),R0 ;ADDR OF TASK NAME AGAIN FOR CMDLIN 00115 . MOV #3,R1 ;MAX OF 3 CHARACTERS 00116 . MOV #CMDLIN,R2 ;DESTINATION FOR NAME 00117 5$: . MOVB (R0)+,(R2)+ ;PUT NAME INTO CMDLIN 00118 . BEQ 10$ ;NULL TERMINATES NAME 00119 . SOB R1,5$ 00120 10$: . 00121 ; . 00122 ; . GET USER COMMAND LINE 00123 ; . 00124 . IF (@R5:GE_B:#2 :AND: 4(R5):NE:#DEFARG) ;WAS CMDLIN GIVEN? 00125 . . MOVB #40,(R2)+ ;YES, PUT IN A BLANK AFTER TASK NAME 00126 . . MOV #CMDLIN,R1 ;ADDR OF OUR BUFFER 00127 . . SUB R2,R1 ;NEGATIVE OF # OF BYTES SO FAR 00128 . . ADD #79.,R1 ;REMAINING # OF BYTES WE CAN PUT IN LINE 00129 . . MOV 4(R5),R0 ;USER CMDLIN ADDR 00130 15$: . . MOVB (R0)+,(R2)+ ;MOVE IT TO OUR BUFFER 00131 . . BEQ 20$ ;NULL ENDS THE LINE 00132 . . SOB R1,15$ 00133 . . INC R2 ;PRETEND GOT A NULL FOR CONSISTENCY BELO 00134 20$: . . 00135 . . DEC R2 ;DON'T COUNT THE NULL 00136 . ...FIN 00137 ; . 00138 . MOV #CMDLIN,R0 ;FIND # CHARACTERS IN NET CMD LINE 00139 . SUB R0,R2 ;# OF BYTES IN CMDLIN EXCLUDING FINAL NU 00140 . MOV R2,SPAWN+S.PWCL ;STORE LENGTH IN DPB 00141 ; . 00142 ; . PROCESS WAIT ARGUMENT 00143 ; . 00144 . WHEN (@R5:LT_B:#3 :IOR: 6(R5):EQ:#DEFARG) ;WAS IT GIVEN? 00145 . . CLR WAIT ;NO, FLAG=ARG NOT GIVEN 00146 . . CLR SPAWN+S.PWEA ;DON'T NEED EXIT AST ADDR 00147 . . CLR SPAWN+S.PWES ;DON'T NEED EXIT STATUS BLOCK 00148 . ...FIN 00149 . ELSE 00150 . . MOV #1,WAIT ;FLAG=ARG PRESENT 00151 . . MOV #SPWAST,SPAWN+S.PWEA ;ADDR OF EXIT AST ROUTINE 00152 . . MOV #ESB,SPAWN+S.PWES ;ADDR OF EXIT STATUS BLOCK TO DPB 00153 . ...FIN 00154 ; . 00155 ; . SPAWN IT 00156 ; . 00157 . DIR$ #SPAWN 00158 . MOV $DSW,STATUS ;SAVE DIRECTIVE STATUS 00159 . IF( STATUS:EQ:#IS.SUC :AND: WAIT:NE:#0) 00160 . . STOP$S ;WAIT FOR SUBTASK TO EXIT 00161 . . MOV ESB,@6(R5) ;RETURN EXIT STATUS OF SUBTASK 00162 . ...FIN 00163 ...FIN 00164 ; 00165 ; RETURN DIRECTIVE STATUS IF REQUESTED (FLECS VERSION 22.38) 18-NOV-82 15:45:37 PAGE 00004 MCRREQ,MCRREQ/-SP=MCRREQ 00166 ; 00167 IF ( @R5:GE_B:#4 :AND: 10(R5):NE:#DEFARG) 00168 . MOV STATUS,@10(R5) 00169 ...FIN 00170 RETURN 00171 ; 00172 ; AST SERVICE ROUTINE USED TO RESTART WHEN SUBTASK EXITS. 00173 ; THIS AST IS THE REASON MCRREQ CANNOT BE CALLED FROM AN 00174 ; AST SERVICE ROUTINE. 00175 ; 00176 SPWAST: 00177 USTP$S ;UNSTOP THIS TASK 00178 TST (SP)+ ;CLEAN OFF STACK 00179 ASTX$S 00180 ; 00181 .END (FLECS VERSION 22.38) MCRREQ,MCRREQ/-SP=MCRREQ