DRSPW.MAC;1/AU:80./-BF=DRSPW.VGN;1 \ -2,2 .IDENT/DS1.04A/ -11,11 ; VERSION DS1.04A -28 ; ; MSH049 -- ADD MORE GROUP GLOBAL EVENT FLAG SUPPORT ; ; MSH051 -- CALCULATE DEFAULT UIC FOR NON-MULTI-USER SYSTEMS ; (NOV 79: SEQ 2.1.6.2 M) ; ; DSS001 -- IMPLEMENT SPWN/CNCT WITH OCB RELINKING... ; IF EFN = -1, UNLINK OCBS FROM REQUESTOR AND LINK ; TO CHILD, RATHER THAN CREATE A NEW OCB... ; T3.MCR STATUS BIT ALSO COPIED FOR PROMPT SYNCHRONIZATION ; ; LKB001 -- RESTORE R5 TO PREVENT ODD-ADDRESS TRAP AND CRASH % -141,,/;DSS001/ ; DIRECTIVE STATE OF 'D.RS8' IS RETURNED WHEN THE REQUEST IS ; A SPECIAL SPAWN (EFN=-1) TO A CLI AND ; THE REQUESTOR TASK HAS MORE THAN ONE PARENT -189,189,/;DSS001/ OCBFLG: .WORD 0 ;IF NON-ZERO, RELINK PARENT OCBS TO CHILD ;+1 IF PARENT T3.MCR SET// -1 IF CLEAR CNRQT: CLR OCBFLG ;INITIALIZE SPECIAL SPAWN FLAG CMP (R3),#-1 ;EFN = -1 BNE 15$ ; NO...VANILLA SPAWN ADD #6,R3 ; YES...SKIP EFN,AST,ESB PARAMS MOV $TKTCB,R1 ;GET REQUESTOR TCB MOV T.OCBH(R1),R4 ;POINT TO 1ST PARENT OCB BEQ 510$ ; NO PARENTS TST (R4) ;MORE THAN ONE PARENT? BEQ 510$ ; NO...USUALLY THIS IS THE CASE MOV (PC)+,R5 ; YES...DON'T SPAWN A CLI THAT WAY, THOUGH DRSTS D.RS8 ;(MCR..., FOR EXAMPLE, WILL CRASH TRYING BIT #T3.CLI,T.ST3(R0) ; TO DEQUEUE A COMMAND LINE FROM BNE 10$ ; MULTIPLE PARENTS 510$: MOV R4,$TEMP1 ;VALID SPAWN OR CONNECT...SAVE 1ST OCB ADDR INC OCBFLG ;SET FLAG FOR SPECIAL HANDLING BIT #T3.MCR,T.ST3(R1) ;IS PARENT SYNCHRONIZED? BNE 520$ ; YES...OCBFLG = +1 NEG OCBFLG ; NO...OCBFLG = -1 520$: BR 30$ ;SKIP OCB ALLOCATION AND EFN/AST/ESB CODE 15$: ;REF LABEL MOV #O.LGTH,R1 ;PICK UP OCB SIZE -217,217,/;MSH049/ MOV R4,-(SP) ;SAVE OCB POINTER -219,,/;MSH049/ MOV R0,-(SP) ;SAVE EVENT FLAG NUMBER -220,,/;MSH049/ MOV (SP)+,R0 ;RESTORE EVENT FLAG NUMBER MOV (SP)+,R4 ;RESTORE OCB POINTER -222,222,/;MSH049/ -255,,/;LKB001/ MOV $TKTCB,R5 ;CURRENT TASK'S TCB GOES TO R5 -345,,/;MSH051/ .IFF TST R1 ;UIC DEFAULTED? BNE 125$ ;IF NE NO MOV H.CUIC(R4),R1 ;GET DEFAULT UIC VALUE 125$: ;REF LABEL -385,391,/;DSS001/ SUCCES: MOV $TKTCB,R5 ; YES...GET PARENT TCB MOV $TEMP0,R4 ;AND CHILD TCB MOV $TEMP1,R1 ;IS THERE AN OCB TO QUEUE? BEQ 8$ ; NO...JUST CHECK FOR T3.MCR BIT TST OCBFLG ;REQUEUE OCB? BNE 2$ ; YES...DON'T TOUCH PARENT RUNDOWN COUNT INC T.RDCT(R5) ; NO...PARENT HAS ONE THING TO RUNDOWN MOV R1,R0 ;SET PTR TO LAST OCB (ONLY ONE) BR 5$ ; JOIN CODE AHEAD 2$: MOV R5,R3 ;COPY PARENT TCB PTR ADD #T.OCBH,R3 ;POINT TO PARENT OCB LISTHEAD MOV R3,R2 ;COPY PTR CLR (R3)+ ;CLEAR LINK TO OCB LIST MOV (R3),R0 ;GET PTR TO LAST OCB IN LIST MOV R2,(R3) ;CLOSE THE LIST 5$: MOV R4,R3 ;COPY CHILD TCB ADD #T.OCBH+2,R3 ;POINT TO CHILD'S LAST OCB PTR MOV (R3),R2 ;GET PTR TO LAST OCB MOV R0,(R3) ;SET NEW LAST OCB PTR CLR (R0) ;CLEAR LAST OCB LINK WORD MOV R1,(R2) ;LINK NEW OCB(S) AT END OF PREVIOUS LIST 8$: TST OCBFLG ;TWIDDLE T3.MCR? BLE 10$ ; NO...T3.MCR WAS CLEAR IN PARENT BIC #T3.MCR,T.ST3(R5) ;PARENT WILL NOW EXIT SILENTLY BIT #T3.CLI,T.ST3(R4) ;TARGET TASK A CLI? BNE 10$ ; YES...HANDLED BY CMD TERMINATOR BIS #T3.MCR,T.ST3(R4) ; NO...CHILD WILL EXIT WITH ">" -480,,/;DSS001/ TST OCBFLG ;RELINK OCB AND PARENT HAS T3.MCR SET? BLE 30$ ; NO...NORMAL MOVB #15,(R4) ; YES...SET TERMINATOR FOR T3.MCR BIT 30$: ;REF LABEL /