; Patch for faulty "mathieeesingbas.library" on 68040
;
; Copyright (c) 1994-1995 by Matthias Scheler

		CODE
		MC68882

		INCLUDE	"exec/types.i"
		INCLUDE	"exec/memory.i"
		INCLUDE	"exec/execbase.i"
		INCLUDE	"dos/dosextens.i"

; Constants

_LVOForbid		EQU	-132
_LVOAllocMem		EQU	-198
_LVOFreeMem		EQU	-210
_LVOGetMsg		EQU	-372
_LVOReplyMsg		EQU	-378
_LVOWaitPort		EQU	-384
_LVOSetFunction		EQU	-420
_LVOCloseLibrary	EQU	-414
_LVOOpenLibrary		EQU	-552
_LVOCacheClearU		EQU	-636

_LVOPutStr	EQU	-948

_LVOIEEESPMul	EQU	-78
_LVOIEEESPDiv	EQU	-84

_AbsExecBase	EQU	4

; Macros

CALL:		MACRO
		jsr	_LVO\1(a6)
		ENDM

; we don't support Workbench

		move.l	(_AbsExecBase).w,a6
		move.l	ThisTask(a6),a0
		tst.l	pr_CLI(a0)
		bne.s	CLI
		lea	pr_MsgPort(a0),a2

		move.l	a2,a0
		CALL	WaitPort

		CALL	Forbid

		move.l	a2,a0
		CALL	GetMsg

		move.l	d0,a1
		CALL	ReplyMsg

		moveq	#0,d0
		rts
		
; check for 68040 with FPU (=> NO 68LC040)

CLI:		move.w	AttnFlags(a6),d0
		and.w	#AFF_68040+AFF_68882,d0
		cmp.w	#AFF_68040+AFF_68882,d0
		beq.s	OpenMathLib

		moveq	#5,d0
		rts

; open "mathieeesingbas.library"

OpenMathLib:	moveq	#10,d2

		lea	MathName(pc),a1
		moveq	#0,d0
		CALL	OpenLibrary

		move.l	d0,d3
		beq	Exit

; check if patch is already installed

		move.l	d3,a0
		move.l	_LVOIEEESPMul+2(a0),a0
		cmp.l	#'PTCH',-4(a0)

		bne.s	GetMem

		moveq	#5,d2
		bra.s	CloseLib

; allocate memory

GetMem:		moveq	#PatchEnd-Patch,d0
		moveq	#MEMF_PUBLIC,d1
		CALL	AllocMem

		move.l	d0,d4
		beq.s	CloseLib

		lea	Patch(pc),a0
		move.l	d4,a1
		moveq	#PatchEnd-Patch-1,d0
CopyMemLoop:	move.b	(a0)+,(a1)+
		dbf	d0,CopyMemLoop

		CALL	CacheClearU

; apply patches

		move.l	d3,a1
		lea	_LVOIEEESPMul,a0
		move.l	d4,d0
		addq.l	#NewMul-Patch,d0
		CALL	SetFunction

		move.l	d3,a1
		lea	_LVOIEEESPDiv,a0
		move.l	d4,d0
		add.l	#NewDiv-Patch,d0
		CALL	SetFunction

; print message

		moveq	#0,d2

		lea	DOSName(pc),a1
		moveq	#37,d0
		CALL	OpenLibrary

		move.l	d0,d4
		beq.s	CloseLib

		exg	d4,a6
		move.l	#PatchMsg,d1
		CALL	PutStr

		exg	d4,a6
		move.l	d4,a1
		CALL	CloseLibrary

; close "mathieeesingbas.library"

CloseLib	move.l	d3,a1
		CALL	CloseLibrary

Exit:		move.l	d2,d0
		rts

; Patch

Patch:		dc.b	"PTCH"

NewMul:		fmove.s	d0,fp0
		fmove.s	d1,fp1
		fmul	fp1,fp0
		fmove.s	fp0,d0
		rts

NewDiv:		fmove.s	d0,fp0
		fmove.s	d1,fp1
		fdiv	fp1,fp0
		fmove.s	fp0,d0
		rts

PatchEnd:

; Strings

Version:	dc.b	"$VER: MathIEEESingBasPatch 1.2 (14.02.95)",0

MathName:	dc.b	"mathieeesingbas.library",0
DOSName:	dc.b	"dos.library",0

PatchMsg:	dc.b	"mathieeesingbas.library patched",10,0

		END
