; RUNOVL - RUN A VAL TASK UNDER CLONE ; LAST EDIT: 29-SEP-81 ; .NLIST .LIST TTM .NLIST BEX .TITLE RUNOVL .LIST ; ; ; THIS MODULE CONTAINS THE ENTRY STRTSK WHICH CREATES ; A VAL REGION AND REQUESTS A TASK TO RUN ASSOCIAED WITH IT. ; FOR EACH TASK STREAM AN EXIT STATUS BLOCK IS ALSO ALLOCATED ; THIS ITEM CONTAINS THE 8 WORD RSX EXIT STATUS BLOCK, THE STREAM ; ITEM ADDRESS AND THE NAME OF THE CONNECTED TASK. EXIT STATUS ; BLOCKS ARE USED TO IDENTIFY TASKS EXITING WITHOUT A CALL TO FINISH ; AND TO UPDATE THE TASK STREAM ITEM APPROPRIATLY ; ; ; .MCALL RSUM$S,SPWN$,CRRG$S,DIR$,WSIG$S ; ; ; STRTSK - START A TASK BY THE EQUIVALENT OF A VAL CHAIN ; INPUT: R2 ASCII NAME STRING ADDRESS ; OUTPUT: IF THE TASK IS STARTED SUCCESSFULY RETURN ; IS WITH C CLEAR. OTHERWISE C IS SET. ; ERRORS MAY OCCURE FROM THE FOLLOWING SOURCES: ; 1) TASK NOT INSTALLED ; ON RETURN THE EXCUTION STATUS ; WILL BE EX.ERR ; 2) REGION CREATE FAILED. AS FOR 1 BUT WITH AN ; ADDITIONAL MESSAGE. ; 3) TASK ALREADY ACTIVE. NO ERROR. RETURN IS WITH ; C BIT SET. ; STRTSK::MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) ; CONVERT THE SAVED NAME STRING TO RAD50 CLR NAMBUF CLR NAMBUF+2 MOV R2,R0 ;STRING ADDRESS MOV #1,R1 ;ACCEPT PERIOD '.' CALL $CAT5 ;CONVERT MOV R1,NAMBUF BCS 1$ TSTB (R0) ;ANYTHING MORE ? BEQ 1$ ;SKIP IF NOT MOV #1,R1 CALL $CAT5 ;SECOND WORD MOV R1,NAMBUF+2 1$: MOV #NAMBUF,R2 RSUM$S R2 ;CHECK TASK INSTALLED AND NOT ACTIVE CMP $DSW,#IE.ACT BEQ 2$ ;THATS WHAT IT SHOULD BE CMP $DSW,#IE.ITS ;NOT SUSPENDED ? BEQ 11$ ;IF NOT ITS ACTIVE AND THATS AN ERROR CMP $DSW,#IS.SUC ;OR IT WAS SUSPENDED BEQ 11$ ;SAME AS ACTIVE MOV #EX.ERR,EXEC ;KILL EXECUTION BR 11$ ; 2$: CALL GETSTR ;ALLOCATE STREAM ITEM BCS 11$ ;SKIP IF ALLOCATION FAILS MOV R1,R0 MOV STREAM,-(SP) ;SAVE CURRENT STREAM MOV R0,STREAM ;AND MAKE NEW ONE CURRENT MOV NAMBUF,SL.TSK(R0);SAVE TASK NAME MOV NAMBUF+2,SL.TSK+2(R0) MOV #TS.TSK,SL.STA(R0);INIT STATUS CALL NEWREG ;CREATE A NEW REGION BCS 9$ ;SKIP IF THAT FAILS MOV STREAM,VC.CL1(R1);SAVE STREAM POINTER BIS #ST.CL1,VC.STA(R1);SET CLONE CONNECTED MOV #-1,VC.RTK(R1) ;SET NULL RETURN NAME MOV #-1,VC.RTK+2(R1) CALL SENDR ;SEND OFF REGION MOV PROC,R3 ;GET CURRENT PROCESS MOV PL.UIC(R3),SPWDPB+S.PWUM ;SET UIC FOR TASK MOV #EXTAST,R2 ;SET ADDRESS FOR AST TO TRANSFER TO CALL ALLESB ;ALLOCATE THE EXIT STATUS BLOCK MOV R2,SPWDPB+S.PWEA;SET AST ADDRESS IN DPB DIR$ #SPWDPB ;SPAWN THE TASK BCS 5$ ; LINK ITEM INTO STREAM LIST ADD #PL.SLH,R3 ;FORM STREAM LIST-HEAD MOV STREAM,R2 ;ITEM TO LINK IN MOV (SP),R1 ;ITEM TO LINK IT AFTER CALL LINKA ;LINK AFTER CLC ;SUCCESS STATUS BR 10$ ; HERE THE RUN FAILED SO DE-ALLOCATE STREAM ITEM 5$: MOV R2,R0 ;GET EXIT STATUS BLOCK ADDRESS SUB #EB.AST,R0 ;POINT TO START OF ITEM CALL FREESP 9$: MOV #EX.ERR,EXEC ;TERMINATE EXECUTION MOV STREAM,R0 CALL FREESP SEC 10$: MOV (SP)+,STREAM ;RESTORE OLD STREAM ; 12$: MOV (SP)+,R2 ;UNSACK AND EXIT MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; 11$: WSIG$S ;PAUSE TO GIVE ACTIVE TASK ;A CHANCE TO EXIT SEC ;EXIT ON ERROR BR 12$ ; SPWDPB: SPWN$ XXXXXX,,,,,,0,0 NAMBUF=SPWDPB+S.PWTN ;ADDRESS OF TASK NAME BUFFER ; ; ; ; NEWREG - CREATE A NEW VAL/CL1 COMMON ; INPUT: A TASK STREAM CONTEXT ; OUTPUT: TASK STREAM IS INITIALISED WITH REGION ID ; COMMON IS CREATED AND INITIALISED TO ZERO ; R1=BASE ADDRESS OF COMMON ; ; RDB AND WDB ARE DEFINED IN CL1COM ; ; NEWREG::MOV PROC,R0 ;POINT TO PROCESS MOV STREAM,R1 ;AND GET STREAM MOV #RDB,R2 ;GET REGION DESCRIPTOR ; SET UP REGION NAME TO REFLECT TI MOV NAMTT0,R.GNAM(R2);SET FIRST WORD OF NAME MOV NAMTT0+2,R.GNAM+2(R2);AND SET SECOND MOV PL.TI+2(R0),R3 ;GET TI UNIT BIC #177770,R3 ;GET LOW ORDER DIGIT ADD R3,R.GNAM+2(R2) ;SET RAD50 3RD CHAR MOV PL.TI+2(R0),R3 ;GET UNIT AGAIN BIC #177707,R3 ;SECOND CHAR MOV R3,-(SP) ASH #2,R3 ;MUL*4 ADD (SP)+,R3 ;BECOMES *5 ADD R3,R.GNAM+2(R2) ;RAD50 SECOND CHAR ; NOW CREATE THE REGION 1$: CRRG$S R2 ;DO THE CREATE BCC 2$ MOV #CRGMES,R2 CALL OUT SEC RETURN ; 2$: MOV R.GID(R2),SL.REG(R1);SAVE REGION ID BIT #RS.CRR,R.GSTS(R2);DID WE ACTUALY CREATE ? BNE 3$ ;OK NO PROBLEMS CALL DETREG ;OTHERWISE DETACH THE REGION AGAIN INC R.GNAM(R2) ;CREATE A NEW NAME BR 1$ ;AND TRY AGAIN ; HERE WEVE CREATED THE REGION SO MAP IT 3$: CALL MAP MOV #VC.LEN,R2 ;REGION LENGTH IN BYTES ASR R2 MOV R1,R3 4$: CLR (R3)+ ;ZERO REGION SOB R2,4$ CLC RETURN ; CRGMES: .ASCIZ /CLONE - REGION CREATE FAILED/ .EVEN NAMTT0: .RAD50 /CL1R00/ ; ; ; ; ; ALLESB - ALLOCATE AN EXIT STATUS BLOCK ITEM ; ; INPUT: TASK STREAM CONTEXT ; R2=ADDRESS OF AST TO TRANSFER TO ; STREAM ITEM SHOULD BE FULLY INITIALIZED ; OUTPUT: R2 - ADDRESS OF EXIT AST LINKAGE ; SL.ESB -ADDRESS OF ESB ITEM ; ; OTHER REGISTERS DESTROYED: NONE ; ; THE ESB ITEM HAS THE FOLLOWING FORM: EB.STR==4 ;POINTER TO TASK STREAM ITEM (MAY BE NULL) EB.AST==6 ;AST LINKAGE TO SPECIFIED AST CODE ;AST IS ENTERED WITH EXIT ITEM ADDRESS ON STACK ; ; THE FOLLOWING CODE IS COPIED TO THE EXIT BLOCK LINK: MOV PC,(SP) ;OVERWRITE (NULL) RSX ESB ADDRESS SUB #EB.AST+2,(SP) ;BACKSPACE TO START OF ITEM JUMP: JMP @#EXTAST ;GO TO COMMON AST CODE LINKL=<.-LINK>/2 ; EB.SIZ==3+LINKL ;SIZE OF EXIT STATUS ITEM IN WORDS ; ; ALLESB::MOV R0,-(SP) MOV R1,-(SP) MOV R2,JUMP+2 ;SET AST CODE ADDRESS IN LINKAGE MOV #EB.SIZ,R1 CALL GETSP ;ALLOCATE EXIT STATUS ITEM MOV STREAM,R1 ;GET TASK STREAM ITEM MOV R1,EB.STR(R0) ;SET STREAM POINTER IN ITEM MOV R0,SL.ESB(R1) ;AND SET ITEM POINTER IN STREAM ADD #EB.AST,R0 ;OFFSET TO AST ENTRY MOV R0,R2 ;COPY ITEM ADDRESS MOV #LINK,R1 ;POINT TO LINKAGE CODE .REPT LINKL MOV (R1)+,(R0)+ ;COPY LINKAGE CODE .ENDR MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; .END ;