
*	Maxon C++:
*	Library "math_pwr10"
*	Jens Gelhar 29.10.91, 15.04.94

	xdef	_pwr10,Pwr10
	xdef	_expo10,Expo10

	xref	_MathIeeeDoubBasBase

i3edpMul	= -78
i3edpDiv	= -84

_pwr10:	; integer-Stackparameter
	move.l	4(a7),d0
	movem.l	d2-d3/a6,-(a7)
	move.w	d0,d2
	bsr.b	Pwr10
	movem.l	(a7)+,d2-d3/a6
	rts

Pwr10:	; Potenz d2.w
	move.l	_MathIeeeDoubBasBase,a6
	tst.w	d2
	bpl.b	lpwt1
	neg.l	d2
	cmp.w	#308,d2
	bls.b	lpwt0
	moveq	#0,d0       ; 10^d2 < MinReal
	moveq	#0,d1
	rts
lpwt0	bsr.b	lpwt1
	move.l	d0,d2
	move.l	d1,d3
	move.l	#$3FF00000,d0
	moveq	#0,d1
	jsr	i3edpDiv(a6)
	rts

lpwt1	cmp.w	#308,d2
	bhs.b	lpwt4
	cmp.w	#10,d2
	bls.b	lpwt2
	move.w	d2,-(a7)
	lsr.w	#1,d2
	bsr.b	Pwr10
	move.l	d0,d2
	move.l	d1,d3
	jsr	i3edpMul(a6)
	move.w	(a7)+,d2
	btst	#0,d2
	beq.b	lpwt3
	move.l	DoubPwr10tab+8(pc),d2
	move.l	DoubPwr10tab+12(pc),d3
	jmp	i3edpMul(a6)
lpwt2	; 0 <= d2 <= 10
	asl.w	#3,d2
	move.l	DoubPwr10tab(pc,d2.w),d0
	move.l	DoubPwr10tab+4(pc,d2.w),d1
lpwt3	rts
lpwt4	moveq	#0,d0
	move.l	d0,d1
	rts
DoubPwr10tab:
	dc.l $3FF00000,0	;    1
	dc.l $40240000,0	;   10
	dc.l $40590000,0	;  100
	dc.l $408F4000,0	; 1000
	dc.l $40C38800,0	; 10^4
	dc.l $40F86A00,0	; 10^5
	dc.l $412E8480,0	; 10^6
	dc.l $416312D0,0	; 10^7
	dc.l $4197D784,0	; 10^8
	dc.l $41CDCD65,0	; 10^9
	dc.l $4202A05F,$20000000; 10^10


_expo10:
	movem.l	d2-d4/a6,-(a7)
	movem.l	4*4+4(a7),d0/d1
	bsr.b	Expo10
	move.l	d4,d0
	movem.l	(a7)+,d2-d4/a6
	rts

Expo10:	; von d0||d1 nach d4
	moveq	#0,d4
	bclr	#31,d0
	cmp.l	#$000FFFFF,d0
	bls.b	dexp9
	movem.l	d0-d3/a0-a1,-(a7)
	cmp.l	#$3FF00000,d0
	bhs.b	dexp3
dexp1	; Zahl <1
	subq.l	#1,d4
	move.l	d4,d2
	bsr	Pwr10
	tst.l	d0
	beq.b	dexp0
	sub.l	(a7),d0
	bhi.b	dexp1a
	blo.b	dexp2
	cmp.l	4(a7),d1
	bls.b	dexp2
dexp1a	cmp.l	#$01500000,d0   ; +21
	bls.b	dexp1
	subq.w	#5,d4
	bra.b	dexp1
dexp2	movem.l	(a7)+,d0-d3/a0-a1
	rts
dexp0	moveq	#0,d4
	bra.b	dexp2

dexp3	; Zahl >= 1
	addq.l	#1,d4
	cmp.w	#308,d4
	bhs.b	dexp2
	move.l	d4,d2
	bsr	Pwr10
	sub.l	(a7),d0
	blo.b	dexp3a
	bhi.b	dexp4
	cmp.l	4(a7),d1
	bhi.b	dexp4
dexp3a	cmp.l	#$FED00000,d0  ; -20
	bgt.b	dexp3
	addq.w	#5,d4
	cmp.l	#$FAF00000,d0  ; -80
	bgt.b	dexp3
	addq.w	#6,d4
	bra.b	dexp3
dexp4	subq.l	#1,d4
	bra.b	dexp2
dexp9	rts

	end

