
*	Maxon C++ Library:
*	Modul "math_fpu"
*	Transzendete Math-Funktionen für FPU
*	Jens Gelhar 02.03.95

	xdef	_sin__r,_cos__r,_tan__r,_sinh__r,_cosh__r,_tanh__r
	xdef	_asin__r,_acos__r,_atan__r,_exp__r,_log__r,_log10__r
	xdef	_sqrt__r,_pow__r,_atan2__r,_modf__r,_frexp__r,_ldexp__r,_fmod__r
	xdef	_fabs__r,_floor__r,_ceil__r

	mc68881

	SECTION "Transcen",CODE

_sin__r:
	fsin.d	4(a7),fp0
	rts

_cos__r:
	fcos.d	4(a7),fp0
	rts

_tan__r:
	ftan.d	4(a7),fp0
	rts

_asin__r:
	fasin.d	4(a7),fp0
	rts

_acos__r:
	facos.d	4(a7),fp0
	rts

_atan__r:
	fatan.d	4(a7),fp0
	rts

_sinh__r:
	fsinh.d	4(a7),fp0
	rts

_cosh__r:
	fcosh.d	4(a7),fp0
	rts

_tanh__r:
	ftanh.d	4(a7),fp0
	rts

_exp__r:
	fetox.d	4(a7),fp0
	rts

_log__r:
	flogn.d	4(a7),fp0
	rts

_log10__r:
	flog10.d 4(a7),fp0
	rts

_sqrt__r:
	fsqrt.d	4(a7),fp0
	rts

_pow__r:
	flogn.d	4(a7),fp0
	fmul.d	12(a7),fp0
	fetox.x	fp0
	rts

	SECTION "Misc",CODE

_modf__r:
	; Stack-Parameter: double, double*
	fmove.d	4(a7),fp0
	fintrz.x fp0,fp1	; Vorkommateil nach fp1
	fsub.x	fp1,fp0		; Nachkommateil...
	move.l	12(a7),a0
	cmp.w	#0,a0
	beq.b	.0
	fmove.d	fp1,(a0)
.0	rts


_atan2__r:
	fmove.d	4(a7),fp0
	fmove.d	12(a7),fp1
	ftst.x	fp1
	fbne	.0
	; Division durch Null umgehen:
	fmove.d #1.570796327,fp0		; = pi/2
	bra.b	.1
.0	fdiv.x	fp1,fp0
.1	ftst.d	4(a7)				; x < 0 ?
	fboge	.3				; dann Korrektur-Rechnung
	fmove.d	#3.14159265435897932384626433827950288,fp1
	ftst.x	fp0
	fbolt	.2
	fsub.x	fp1,fp0				; x = x'-pi
	bra.b	.3
.2	fadd.x	fp1,fp0				; x = x'+pi
.3	fatan.x	fp0
	rts


_frexp__r:
	; Parameter: double, int*
	fmove.d	4(a7),fp0
	fgetexp.x fp0,fp1
	fgetman.x fp0
	move.l	12(a7),a0
	cmp.w	#0,a0
	beq.b	.0
	fmove.d	fp1,(a0)
.0	rts


_ldexp__r:
	; Parameter: double, int
	move.w	4(a7),d0
	beq.b	.zero
	move.l	12(a7),d1
	bclr	#15,d0
	lsr.w	#4,d0
	ext.l	d0
	add.l	d1,d0
	cmp.l	#$7FF,d0
	bhi.b	.overflow
	swap	d0
	asl.l	#4,d0
	and.l	#$800FFFFF,4(a7)
	or.l	4(a7),d0
	fmove.d	4(a7),fp0
	rts
.overflow:
.zero:	fmove.x	#0.0,fp0
	rts

	SECTION "Round",CODE

_fmod__r:
	fmove.d	4(a7),fp0
	frem.d	12(a7),fp0
	rts

_fabs__r:
	fabs.d	4(a7),fp0
	rts

_floor__r:
	fmove.l	FPCR,d0
	fmove.l #%10100000,FPCR
	fint.d	4(a7),fp0
	fmove.l	d0,FPCR
	rts

_ceil__r:
	fmove.l	FPCR,d0
	fmove.l #%10110000,FPCR
	fint.d	4(a7),fp0
	fmove.l	d0,FPCR
	rts


	SECTION "atof",CODE

	xref	atof__PCc
	xdef	_atof__r
	xdef	atof__r_PCc

_atof__r:
atof__r_PCc:
	move.l	4(a7),-(a7)
	jsr	atof__PCc
	addq.l	#4,a7
	movem.l	d0/d1,-(a7)
	fmove.d	(a7)+,fp0
	rts


	SECTION "strtod",CODE

	xref	strtod__PCcPPc
	xdef	_strtod__r
	xdef	strtod__r_PCcPPc
_strtod__r:
strtod__r_PCcPPc:
	move.l	8(a7),-(a7)
	move.l	8(a7),-(a7)
	jsr	strtod__PCcPPc
	addq.l	#8,a7
	movem.l	d0/d1,-(a7)
	fmove.d	(a7)+,fp0
	rts


	SECTION "Random",CODE

	xref	Random_
	xdef	Random__r
Random__r:
	jsr	Random_
	movem.l	d0/d1,-(a7)
	fmove.d	(a7)+,fp0
	rts


	SECTION "difftime",CODE

	xref	difftime__UiUi
	xdef	_difftime__r
	xdef	difftime__r_UiUi
_difftime__r:
difftime__r_UiUi:
	move.l	8(a7),-(a7)
	move.l	8(a7),-(a7)
	jsr	difftime__UiUi
	addq.l	#8,a7
	movem.l	d0/d1,-(a7)
	fmove.d	(a7)+,fp0
	rts

	end

