.TITLE SPAWN SPAWN TASK .IDENT -000100- ;+ ; ABSTRACT: SPAWN ;*** ; ; THIS SUBROUTINE SPAWNS OTHER TASKS WITH FULL ACCESS ;*** ; TO DIRECTIVE FUNCTIONALITY, IN PARTICULAR ALLOWING ;*** ; SPECIFICATION OF A TI: OTHER THAN THE CALLER'S. ;*** ; ; CALLING SEQUENCE: ; ; CALL SPAWN (TSK, [IOP], [EFN], [ESB], [CMD], ; [TINUM], [DSW], [TIDEV]) ; ;*** ; ; ARGUMENTS: ; ; TSK FIXED BINARY (31,0) ; THE RADIX-50 TASK NAME ; ; IOP (4) FIXED BINARY (15,0) ; AN ARRAY CONTAINING MISCELLANEOUS INFORMATION: ; IOP (1) = PARTITION NAME (1ST HALF) ; IOP (2) = PARTITION NAME (2ND HALF) (RAD-50) ; IOP (3) = RUN PRIORITY ; IOP (4) = UIC ; ; EFN FIXED BINARY (15,0) ; THE EVENT FLAG TO BE SET ON COMPLETION OF THE TASK. ; ; ESB (8) FIXED BINARY (15,0) ; AN 8-WORD EXIT STATUS BLOCK. ; ; CMD CHARACTER (*) ; THE COMMAND TO BE PASSED TO THE SPAWNED TASK. ; ; TINUM FIXED BINARY (15,0) ;*** ; UNIT NUMBER OF THE TERMINAL TO BE THE SPAWNED TASK'S TI:. ;*** ; ; DSW FIXED BINARY (15,0) ; THE (RETURNED) DIRECTIVE STATUS WORD. ; ; TIDEV CHARACTER(2) ;*** ; DEVICE NAME MNEMONIC OF THE TERMINAL TO BE USED AS THE TI: OF ;*** ; THE SPAWNED TASK, ORDINARILY 'TT', THE DEFAULT IF UNSPECIFIED. ;*** ; ; ERRORS: ; AS RETURNED IN THE DIRECTIVE STATUS WORD. ; ; SUBROUTINES: ; ; ILNAR$ SIGNAL ERROR CONDITION FOR TOO FEW ARGS. ; SAVRG$ SAVE REGISTERS 0 - 3 ; ; LIMITATIONS: ; RSX-11/IAS-11 ONLY ; ; WRITTEN: 15-JAN-80, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: ; VERIFIED: 15-JAN-80, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED 19-APR-83, WALTER EPP, CHANGED LINES INDICATED BY TRIPLE ASTERISKS ; ALSO MODIFIED 6-MAR-84 ;- .MCALL SPWN$S NARG = 22 ;NUMBER OF ARGUMENTS TSK = NARG+2 ;TSK ADDRESS IOP = TSK+2 ;IOP ADDRESS EFN = IOP+2 ;EFN ADDRESS ESB = EFN+2 ;ESB ADDRESS CMD = ESB+2 ;CMD ADDRESS TINUM = CMD+2 ;TINUM ADDRESS ;*** DSW = TINUM+2 ;DSW RETURN. ;*** TIDEV = DSW+2 ;TIDEV ADDRESS ;*** .PSECT $$PLIS,RO,I SPAWN:: JSR R0,SAVRG$ ;SAVE REGISTERS 0 - 3 MOV R4,-(SP) ;SAVE REGISTERS 4, 5 MOV R5,-(SP) ; TST NARG(SP) ;TOO FEW ARGS? BGT TSNARG ;NO ;*** ILNARG: JSR R5,ILNAR$ ;THIS WILL STOP US!? ;*** TSNARG: CMP NARG(SP),#8. ;ALSO TEST FOR TOO MANY - ITS EASY TO ;*** BGT ILNARG ;SCREW UP SUCH A LONG CALLING SEQUENCE ;*** MOV PC,R1 ;R1 -> TEMP IOP ADD #TMPIOP-.,R1 ;POINT TO IT. CMP NARG(SP),#2 ;IS IOP PARM THERE? BLT 2$ ;NO MOV IOP(SP),R0 ;GET IOP POINTER CMP R0,#-1 ;IS IOP THERE? BEQ 2$ ;NO MOV 10(R0),R1 MUL 6(R0),R1 ;GET FIRST ELEMENT ADD 4(R0),R1 ;GET IOP(1) 2$: CLR R2 ;CLEAR EVENT FLAG. CMP NARG(SP),#3 ;ROOM FOR EVENT FLAG? BLT 4$ ;NO CMP EFN(SP),#-1 ;IS EVENT FLAG THERE? BEQ 4$ ;NO MOV @EFN(SP),R2 ;YES -- GET EVENT FLAG. 4$: CLR R3 ;CLEAR EXIT STATUS BLOCK PTR CMP NARG(SP),#4 ;ROOM FOR EXIT STATUS BLOCK? BLT 6$ ;NO MOV ESB(SP),R0 ;GET EXIT STATUS BLOCK PTR CMP R0,#-1 ;IS IT SPECIFIED? BEQ 6$ ;NO MOV 10(R0),R3 ; MUL 6(R0),R3 ; ADD 4(R0),R3 ;COMPUTE BASE OF ESB 6$: CLR R4 ;CLEAR COMMAND LINE CLR R5 ;AND COMMAND LINE LENGTH. CMP NARG(SP),#5 ;ROOM FOR COMMAND LINE? BLT 10$ ;NO MOV CMD(SP),R4 ;YES -- GET PTR CMP R4,#-1 ;IS IT THERE? BEQ 10$ ;NO MOV (R4)+,R5 ;GET COMMAND LENGTH MOV 2(R4),R4 ;GET PTR TO COMMAND. TST R5 ;VARYING STRING? BPL 8$ ;NO MOV (R4)+,R5 ;YES 8$: BIC #140000,R5 ;CLEAN STRING LENGTH. 10$: MOV R4,-(SP) ;SAVE COMMAND LINE CLR -(SP) ;SPACE FOR TINUM PARAMETER CLR -(SP) ;SPACE FOR TIDEV PARAMETER ;*** CMP NARG+6(SP),#6 ;ROOM FOR TINUM? ;*** BLT 12$ ;NO CMP TINUM+6(SP),#-1 ;IS IT SPECIFIED? ;*** BEQ 12$ ;NO MOV @TINUM+6(SP),2(SP) ;MOVE IT IN. ;*** 12$: CMP NARG+6(SP),#8. ;ROOM FOR TIDEV? ;*** BLT 16$ ;NO ;*** CMP TIDEV+6(SP),#-1 ;IS IT SPECIFIED? ;*** BEQ 16$ ;NO ;*** MOV TIDEV+6(SP),R4 ;ADDR OF STRING DESCRIPTOR ;*** MOV 4(R4),R0 ;ADDR OF STRING ;*** TST (R4) ;VARYING? ;*** BPL 14$ ;*** TST (R0)+ ;YES, SKIP LENGTH WORD ;*** 14$: MOVB (R0)+,(SP) ;MOVE TWO BYTES ;*** MOVB (R0),1(SP) ;(MAY NOT BE ON WORD BOUNDARY FOR MOV) ;*** 16$: MOV TSK+6(SP),R0 ;GET TASK NAME. ;*** MOV SP,R4 ;POINT TO BUFFER. SPWN$S R0,R1,4(R1),7(R1),6(R1),R2,,R3,4(R4),R5,2(R4),(R4) ;*** ADD #6,SP ;POP STACK. ;*** CMP NARG(SP),#7 ;ROOM FOR A DSW ARG? ;*** BLT 30$ ;NO ;*** CMP DSW(SP),#-1 ;SPECIFIED? ;*** BEQ 30$ ;NO ;*** MOV @#$DSW,@DSW(SP) ;RETURN THE DSW. 30$: MOV (SP)+,R5 ;RECOVER REGISTERS MOV (SP)+,R4 ; RTS PC ;AND RETURN TO CALLER TMPIOP: .WORD 0,0,0,0 ;;ERR: JSR R5,ILNAR$ ;THIS WILL STOP US!? ;*** .END