		*****************************************
		*					*
		*	      PatchMult64.s		*
		*    $VER: PatchMult64 1.0 (23.7.97)	*
		*					*
		*****************************************

	OPT	O+			; Turns on all optimizations.

	INCDIR	CD0:NDK_3.1/Includes&Libs/include_i
	OUTPUT	C:PatchMult64

	include	exec/execbase.i
	include exec/memory.i
	include	exec/ports.i
	include	dos/dos.i

*****	include exec/exec_lib.i

	_LVODisable:	   EQU	-120
	_LVOEnable:	   EQU	-126
	_LVOForbid:	   EQU	-132
	_LVOPermit:	   EQU	-138
	_LVOAllocMem:	   EQU	-198
	_LVOFindName:	   EQU	-276
	_LVOCloseLibrary:  EQU	-414
	_LVOSetFunction:   EQU	-420
	_LVOOpenLibrary:   EQU	-552
	_LVOCopyMemQuick:  EQU	-630
	_LVOCreateMsgPort: EQU	-666
	_LVOAddPort:	   EQU	-354
	_LVOFindPort:	   EQU	-390
	_LVOFreeMem:	   EQU	-210

	_LVOSMult64:	EQU	-198
	_LVOUMult64:	EQU	-204

*=========================================================================

PatchMult64	movem.l	d5-d7/a6,-(sp)

		movea.l	4.w,a6
		move.l	a6,SYSBase
		moveq	#RETURN_WARN,d7

	;------ Check if the patches are already installed.

		lea	PortName(pc),a1
		jsr	_LVOFindPort(a6)
		tst.l	d0
		bne	.Exit			; Patches done.

	;------ Find the "68060.library".

		moveq	#RETURN_ERROR,d7
		lea	_68060Name(pc),a1
		lea	LibList(a6),a0

		jsr	_LVOForbid(a6)
		jsr	_LVOFindName(a6)
		jsr	_LVOPermit(a6)

		tst.l	d0
		beq	.Exit			; No 68060...

	;------ Check for AFB_68060

		btst	#7,AttnFlags(a6)
		beq	.Exit			; No 68060...

	;------ Open the "utility.library"

		moveq	#39,d0
		lea	_UtilityName(pc),a1
		jsr	_LVOOpenLibrary(a6)
		move.l	d0,UtilityBase
		beq	.Exit			; Oupsss...

	;------ Allocate a buffer to store the patches.

		move.l	#Patch_End-Patch_Start,d0
		move.l	d0,d5
		moveq	#MEMF_PUBLIC,d1
		jsr	_LVOAllocMem(a6)
		move.l	d0,d6
		beq.s	.CloseUtility

	;------ Copy our patches in the buffer.

		lea	Patch_Start(pc),a0
		movea.l	d6,a1
		move.l	d5,d0
		jsr	_LVOCopyMemQuick(a6)

	;------ Create a message port.

		jsr	_LVOCreateMsgPort(a6)
		tst.l	d0
		beq.s	.FreeBuffer

		movea.l	d0,a1
		move.l	#PortName-Patch_Start,d0
		add.l	d6,d0
		move.l	d0,LN_NAME(a1)
		move.b	#PA_IGNORE,MP_FLAGS(a1)
		move.b	#-127,LN_PRI(a1)
		clr.b	MP_SIGBIT(a1)
		clr.l	MP_SIGTASK(a1)
		jsr	_LVOAddPort(a6)		; Add the port to the public list
						; so we can find it later.

	;------ Install the patches.

		jsr	_LVODisable(a6)		; UMult64 and SMult64 can be called
						; from interrupts...

		movea.l	UtilityBase(pc),a1
		lea	_LVOUMult64,a0
		move.l	d6,d0
		jsr	_LVOSetFunction(a6)

		movea.l	UtilityBase(pc),a1
		lea	_LVOSMult64,a0
		moveq	#SMult64-UMult64,d0
		add.l	d6,d0
		jsr	_LVOSetFunction(a6)

		jsr	_LVOEnable(a6)

		; SetFunction() flushes the instruction cache
		; so we don't need to do it ourself.

		moveq	#RETURN_OK,d7		; That's all.
		bra.s	.Exit

	;------ Free the patch buffer if we can't allocate a MsgPort.

.FreeBuffer	move.l	d5,d0
		movea.l	d6,a1
		jsr	_LVOFreeMem(a6)

	;------ Close utility.library if we can't patch it.

.CloseUtility	movea.l	UtilityBase(pc),a1
		jsr	_LVOCloseLibrary(a6)

	;------ Exit.

.Exit		move.l	d7,d0
		movem.l	(sp)+,d5-d7/a6
		rts

*=========================================================================

	include	UMult_SMult_060.s

*=========================================================================

		dc.b	"$VER: PatchMult64 1.0 (23.7.97)",13,10,0

_UtilityName:	dc.b	"utility.library",0
_68060Name:	dc.b	"68060.library",0

SYSBase:	dc.l	0
UtilityBase:	dc.l	0
