; GOTASK - VAL TASK CONTROL ROUTINES ; LAST EDIT: 5-OCT-81 ;- .NLIST .TITLE GOTASK .SBTTL DESCRIPTION .NLIST SEQ,LOC,BIN,BEX,TOC,CND .LIST TTM .LIST ; ; TASK CONTROL SECTION OF VAL PACKAGE ; .IDENT /V004/ ; ; REMOVE DEFINITION OF SYMBOL 'BLURB' TO LIMIT EXTENSIVE DESCRIPTION ;BLURB=0 ; ; THIS MODULE SHOULD BE ASSEMBLED PRECEDED BY 'VALMFD' ; .NLIST .IF DF BLURB .LIST ;+ ; ; THE MODULE GOTASK CONTAINS TWO PRINCIPAL ROUTINES: ; GOTASK - START ANOTHER TASK AND WAIT FOR COMPLETION ; CHAIN - START ANOTHER TASK AND EXIT ; ; ;- .NLIST .ENDC .LIST SEQ,LOC,BIN .LIST ; ; .PSECT VALCTL ; ; .IIF NDF RSX11M .ERROR ;THIS VERSION OF GOTASK REQUIRES RSX11M V3.2 ; .MCALL RSUM$S,SREF$S,RQST$S,STOP$S,ASTX$S,USTP$S,CNCT$S ; ; RDOFF$ ;DEFINE READIT OFFSETS ; ; ; ROUTINES CALLED FROM VALSUB .GLOBL VMAP,VRSCTX ; ; FORTRAN OTS ROUTINES CALLED .GLOBL CLOSE,EXIT ; NPAGE .NLIST .NLIST SEQ,LOC,BIN .SBTTL START ANOTHER TASK--CHAIN,GOTASK .IF DF BLURB .LIST ;+ ; ; GOTASK - START ANOTHER TASK AND WAIT FOR IT ; CHAIN - START ANOTHER TASK AND FINISH ; CALLING FORMAT: ; CALL GOTASK(NAME[,IDATA,IERR]) ; CALL CHAIN(NAME[,IDATA,IERR) ; ;WHERE NAME IS RAD50 TASK NAME TO START ; IDATA IS THE COMMUNICATION ARRAY AS IN START AND FINISH ; IERR IS AN ERROR RETURN BEING -VE ON ERROR ; FOR GOTASK IERR RECEIVES THE TASK EXIT STATUS ; ; GOTASK AND CHAIN ENABLE TASKS TO BE STARTED AND ; PASSED DATA. GOTASK CALLS THE TASK AND WAITS FOR COMPLETION ; WHILST CHAIN EXITS ONCE THE TASK HAS BEEN REQUESTED. ; ;- .NLIST .ENDC .LIST SEQ,LOC,BIN .LIST ; GOTASK::CALL VMAP ;PICK UP IMPURE AREA CLR VC.RTK(R1) ;CLEAR RETURN NAME WORD IN VALCOM ;TO INDICATE RETURN TO CALLER. CALL SDRQ ;SEND DATA AND REQUEST BCS 1$ ;SKIP ON ERROR CALL RCVSP ;RECEIVE OR SUSPEND 1$: CALL VRSCTX ;RESTORE USER CONTEXT RETURN ; ; ; CHAIN:: CALL VMAP ;GET IMPURE AREA MOV VI.RTK(R0),VC.RTK(R1) ;SET RETURN TASK NAME MOV VI.RTK+2(R0),VC.RTK+2(R1) BIT #ST.CL1,VC.STA(R1) ;ARE WE CONNECTED TO CLONE BEQ 2$ BIS #ST.CHN,VC.STA(R1) ;SET CHAIN FLAG CALL CL1F$ ;NOTIFY CLONE OF DISCONNECT ; 2$: CALL SDRQ ;SEND DATA AND REQUEST TASK BCC 3$ ;SKIP IF THERE ARE NO PROBLEMS CALL VRSCTX ;RESTORE USER CONTEXT RETURN ;AND RETURN TO CALLER ; 3$: CALL VRSCTX ;RESTORE USER CONTEXT MOV #NULL,R5 ;GET NULL ARGUMENT BLOCK CALL EXIT ;EXIT THROUGH FORTRAN OTS ; ; ; SDRQ - SEND DATA TO A TASK AND REQUEST IT. ; P1(R5) - ADDRESS OF TASK NAME ; P2(R5) - OPTIONAL ADDRESS OF SEND DATA BUFFER ; P3(R5) - OPTIONAL ADDRESS FOR STATUS RETURN ; SDRQ: MOV P1(R5),R2 ;POINT TO TASK NAME RSUM$S R2 ;CHECK TASK IS INSTALLED AND NOT ACTIVE BCC 1$ ;IF WE SUCCEDE ITS ACTIVE CMP $DSW,#IE.ACT ;TASK SHOULD BE INSTALLED AND NOT ACTIVE BEQ 2$ ;IF SO WE CAN RUN IT CMP $DSW,#IE.ITS ;WAS TASK ACTIVE AND NOT SUSPENDED ? BNE 5$ ;IF NOT GO REPORT WHAT EVER THE ERROR WAS 1$: MOV #IE.ACT,$DSW ;FUDGE THE STATUS RETURN BR 5$ ; 2$: CMPB (R5),#2 ;IDATA SPECIFIED BLT 4$ CMP P2(R5),#-1 ;NULL? BEQ 4$ MOV P2(R5),R2 ;GET USER ARRAY ADD #12.,R2 ;START OF DATA AREA ADD #VC.UBF,R1 MOV #UBFLEN/2,R3 3$: MOV (R2)+,(R1)+ ;COPY IN VALUES SOB R3,3$ ; 4$: MOV VI.COM(R0),R1 ;GET BACK COMMON MOV R1,R2 ;COMPUTE BUFFER POINTER ADD #VC.LBF+1,R2 MOV RD.KP(R0),R3 ;CURRENT ADDRESS SUB R2,R3 ;CURRENT OFFSET MOVB R3,VC.LBF(R1) ;AND SAVE ; MOV P1(R5),R2 ;GET BACK TARGET TASK NAME MOV R0,R3 ;POINT TO WDB ADD #VI.WDB,R3 MOV #,W.NSTS(R3) ;SET ACCESS RIGHTS SREF$S R2,R3 ;DO THE SEND BCS 5$ ;SKIP ON ERROR MOV (R2),VC.TNM(R1) ;SET TASK NAME IN COMMON MOV 2(R2),VC.TNM+2(R1) RQST$S R2 ;REQUEST THE TASK ; 5$: CMPB (R5),#3 ;STATUS RETURN REQUIRED ? BLT 6$ ;SKIP IF NOT MOV $DSW,@P3(R5) ;RETURN ERROR CODE 6$: CLC ;ASSUME SUCCESS TST $DSW ;CHECK FOR ERRORS BPL 7$ ;SKIP IF NONE SEC ;RETURN ERROR STATUS 7$: RETURN ; ; ; RCVSP - WAIT FOR A TASK TO EXIT ; ; P2(R5) - OPTIONAL BUFFER TO RECEIVE COMMUNICATIONS BUFFER ; P3(R5) - OPTIONAL LOCATION TO RECEIVE EXIT STATUS ; ; ; FOUR CONDITIONS MAY EXIST AT THIS POINT: ; 0) TASK IS STILL ACTIVE (VC.TNM=NAME OF AN ACTIVE TASK) ; 1) TASK HAS CALLED FINISH AND EXITED (VC.TNM=0) ; 2) TASK HAS CALLED CHAIN AND EXITED (VC.TNM=NAME OF THE NEW TASK) ; 3) TASK HAS TERMINATED ABNORMALY (VC.TNM=NAME OF THE DEAD TASK) ; RCVSP: MOV #1,EXSTA ;INIT EXIT STATUS MOV R1,R2 ;POINT TO NAME IN COMMON ADD #VC.TNM,R2 TST (R2) ;TEST IF NAME HAS BEEN CLEARED BEQ 20$ ;IF SO TASK HAS CALLED FINISH CNCT$S R2,,#EXAST ;CONNECT (WE MAY BE ALREADY CONNECTED BUT WHAT THE HECK) BCS 10$ ;IF CONNECT FAILS ITS AN ERROR STOP$S ;WAIT FOR TASK OR AST TO UNSTOP US BR RCVSP ;AND GO ROUND AGAIN ; 10$: INC EXSTA ;AFTER UNEXPECTED EXIT RETURN STATUS OF 2 CLRB @RD.KP(R0) ;ZERO THE CURRENT INPUT BUFFER BR 21$ ; 20$: MOV R1,R2 ;RE-FORM BUFFER POINTER ADD #VC.LBF+1,R2 MOVB VC.LBF(R1),R3 ;THATS THE OFFSET ADD R3,R2 ;THATS THE ADDRESS MOV R2,RD.KP(R0) ;SAVE IN READIT BLOCK ; 21$: MOV VI.TNM(R0),VC.TNM(R1) ;COPY OUR TASK NAME BACK TO COMMON MOV VI.TNM+2(R0),VC.TNM+2(R1) ; ; SOME EARLIER VERSIONS OF GOTASK DID NOT RETURN A USER BUFFER. ; THE FOLLOWING CODE MAY BE COMMENTED OUT IF COMPATIBILITY IS REQUIRED. ; CMPB (R5),#2 ;USER BUFFER SUPPLIED ? BLT 5$ CMP P2(R5),#-1 ;OR IS IT NULL BEQ 5$ MOV R1,R2 ;POINT TO COMMUNICATIONS BUFFER ADD #VC.CTK,R2 MOV P2(R5),R3 ;POINT TO USER BUFFER MOV #+6,R4;SET WORD COUNT (INCLUDE HEADER) 4$: MOV (R2)+,(R3)+ SOB R4,4$ ; 5$: CMPB (R5),#3 ;STATUS REQUIRED ? BLT 6$ MOV EXSTA,@P3(R5) ;IF SO RETURN IT 6$: RETURN ; ; NULL: .WORD 0 EXSTA: .WORD 0 ; ; EXAST - EXIT AST FOR TASKS WHICH WE SPAWN ; ; THIS CODE IS EXECUTED WHEN A TASK WHICH WE HAVE GOTASKED EXITS ; IT UNSTOPS THE MAIN TASK CODE. ; EXAST: MOV R0,(SP) ;OVERWRITE THE ESB ADDRESS WITH R0 MOV #VALIMP+VI.TNM,R0 ;POINT TO OUR OWN NAME USTP$S R0 ;UNSTOP OURSELVES MOV (SP)+,R0 ASTX$S ; .END