; taskadder.s
;
; AddTask patch in exec
; Will copy pr_Pad (UID) if both tasks are processes
;
; Pasi Ojala ©1992, 6-Nov-92

	XDEF	_InstallAddTask
	XDEF	_UnInstallAddTask
	XDEF	_taskaddaddr

	SECTION taskadder,CODE

_TaskAdder
	link    a5,#-$04
	movem.l d1/a0-a1,-(sp)

	move.l  a1,-$04(a5)
	jsr     -$84(a6)	; Forbid()

	movea.l _taskaddaddr,a0
	jsr     (a0)

	moveq   #$0d,d1		; NT_PROCESS
	move.l  $114(a6),a1	; ThisTask
	cmp.b	$08(a1),d1	; tc_Node.ln_Type
	bne.s	over

	movea.l -$04(a5),a0	; newtask
	cmp.b   $08(a0),d1	; tc_Node.ln_Type
	bne.s   over

	move.w  $7e(a1),$7e(a0)	; newtask->pr_Pad=ThisTask->pr_Pad

over
	jsr     -$8A(a6)	; Permit()
	movem.l (sp)+,d1/a0-a1
	unlk    a5
	rts


_InstallAddTask
	move.l	a6,-(sp)
	move.l	$04,a6
	jsr	-$78(a6)	; Disable()

	movea.l	a6,a1		; exec.library
	lea	_TaskAdder(pc),a0
	move.l	a0,d0		; &TaskAdder()
	movea.w	#-$11a,a0	; AddTask-entry

	jsr	-$1a4(a6)	; SetFunction()
	move.l	d0,_taskaddaddr

	jsr	-$7e(a6)	; Enable()
	move.l	(sp)+,a6
	rts

_UnInstallAddTask
	move.l	a6,-(sp)
	move.l	$04,a6
	jsr	-$78(a6)	; Disable()

	movea.l	a6,a1		; exec.library
	movea.w	#-$11a,a0	; AddTask-entry
	move.l	_taskaddaddr,d0	; old addtask
	jsr	-$1a4(a6)	; SetFunction()

;	The return value is not yet checked !
;	It should be, and if anything other than our routine,
;	a stub routine should be created.

	jsr	-$7e(a6)	; Enable()
	move.l	(sp)+,a6
	rts

	SECTION taskadddata,DATA

_taskaddaddr	DC.L	0

	END

---------------------------------------------------------------

