*------------------------------------------------------------------
* math.asm: ZC library interface to Motorola fast floating point
* library supplied by Commodore.
* Maintenance Notes:
* 06Jun89 - Created by Jal
*------------------------------------------------------------------

AG_OpenLib	equ $00030000
AO_MathLib	equ $00008005
bias	SET	-30

libref	MACRO
_LVO\1	EQU	bias
bias	SET	bias-6
	ENDM

*------------------------------------------------------------------
* Note: these *Must* be in the same order as the mathbas_lib.fd
* file.
*------------------------------------------------------------------

	libref	SPFix
	libref	SPFlt
	libref	SPCmp
	libref	SPTst
	libref	SPAbs
	libref	SPNeg
	libref	SPAdd
	libref	SPSub
	libref	SPMul
	libref	SPDiv
	libref	SPFloor	; needs release 1.2+
	libref	SPCeil	; needs release 1.2+

	XREF	_Alert
	XREF	_exit
	XREF	_MathBase
	XREF	_OpenLibrary
	XREF	_CloseLibrary
	XREF	__MathBaseClose

*------------------------------------------------------------------

	SECTION	DATA,DATA

MathBase	dc.l	0
MATHName	dc.b    'mathffp.library',0

	SECTION	CODE,CODE

*
*	Called at exit if we opened the MathBase library.
*

MathBaseClose:
	move.l	MathBase,-(A7)
	jsr	_CloseLibrary
	addq	#4,A7
	rts

*
*	Make sure the MathBase is loaded correctly
*

.flopen:
	movem.l D0-D1/A0-A1,-(A7)	; save temporary registers
	pea	0			; any version will do....
	pea     MATHName		; Load the name of library
	jsr	_OpenLibrary		; Open the library
	addq	#8,A7
	move.l  D0,_MathBase	; Save the return code
	bne.s   1$			; If non-zero then OK

	pea	0			; Parameter for Alert.
	pea	AG_OpenLib!AO_MathLib	; Signal an error.
	jsr	_Alert
	addq	#8,A7
	pea     100			;     push return code
	jsr     _exit			;     and exit
1$:
	move.l	D0,MathBase	; A private copy
	move.l	#MathBaseClose,__MathBaseClose
	movem.l (A7)+,D0-D1/A0-A1	 ; restore temporaries
	rts

*-------------------------------------------------------------------
* Do a one or two parameter MathBase function.
*-------------------------------------------------------------------
.fldo2:
	move.l	12(A7),D1
.fldo1:
	move.l	8(A7),D0
	tst.l	_MathBase
	bne.s	1$
	jsr	.flopen
1$:
	movem.l	A6,-(A7)
	move.l	_MathBase,A6	
	add.l	4(A7),A6
	jsr	(A6)
	movem.l	(A7)+,A6
	addq	#4,A7		; unstack the function offset.
	rts

*********************************************************************
*
*	multiply 
*
	XDEF    fpmul
fpmul:
	pea	_LVOSPMul
	jmp     .fldo2

*********************************************************************
*
*	divide
*
	XDEF    fpdiv
fpdiv:
	pea	_LVOSPDiv
	jmp     .fldo2

*********************************************************************
*
*	add
*
	XDEF    fpadd
fpadd:
	pea	_LVOSPAdd
	jmp     .fldo2

*********************************************************************
*
*	subtract
*
	XDEF    fpsub
fpsub:
	pea	_LVOSPSub
	jmp     .fldo2

*********************************************************************
*
*	negate
*
	XDEF    fpneg
fpneg:
	pea	_LVOSPNeg
	jmp     .fldo1

*********************************************************************
*
*	compare
*
	XDEF    fpcmp
fpcmp:
	pea	_LVOSPCmp
	jmp     .fldo2

*********************************************************************
*
*	convert long to float
*
	XDEF    _fpltof
_fpltof:
	pea	_LVOSPFlt
	jmp     .fldo1

*********************************************************************
*
*	Convert float to long
*
	XDEF    _fpftol
_fpftol:
	pea	_LVOSPFix
	jmp     .fldo1

*********************************************************************
*
*	Implement the abs function.:
*
	XDEF    _abs
_abs:
	pea	_LVOSPAbs
	jmp	.fldo1

*********************************************************************
*
*	Implement the floor function.:
*
	XDEF    _floor
_floor:
	pea	_LVOSPFloor
	jmp	.fldo1

*********************************************************************
*
*	Implement the ceil function.:
*
	XDEF    _ceil
_ceil:
	pea	_LVOSPCeil
	jmp	.fldo1

	END
