ldfps = 170100^tst
stfps = 170200^tst
/ ftoa -- basic g fp conversion

.globl	_ndigit
.globl ecvt
.globl fcvt


/ ecvt converts fr0 into decimal
/ the string of converted digits is pointed to by r0.
/ the number of digits are specified by _ndigit
/ r2 contains the decimal point
/ r1 contains the sign

.globl	_ecvt, _fcvt

_ecvt:
	mov	r5,-(sp)
	mov	sp,r5
	mov	r2,-(sp)
	movf	4(r5),fr0
	mov	14(r5),_ndigit
	jsr	pc,ecvt
	br	1f

_fcvt:
	mov	r5,-(sp)
	mov	sp,r5
	mov	r2,-(sp)
	movf	4(r5),fr0
	mov	14(r5),_ndigit
	jsr	pc,fcvt
1:
	mov	r2,*16(r5)
	mov	r1,*20(r5)
	mov	(sp)+,r2
	mov	(sp)+,r5
	rts	pc

fcvt:
	clr	eflag
	br	1f
ecvt:
	mov	$1,eflag
1:
	stfps	-(sp)
	ldfps	$200
	movf	fr0,-(sp)
	movf	fr1,-(sp)
	mov	r3,-(sp)
	mov	$buf,r1
	clr	r2
	clr	sign
	tstf	fr0
	cfcc
	beq	zer
	bgt	1f
	inc	sign
	negf	fr0
1:
	modf	$one,fr0
	tstf	fr1
	cfcc
	beq	lss

gtr:
	movf	fr0,-(sp)
	movf	fr1,fr0
1:
	mov	$buftop,r3
1:
	modf	tenth,fr0
	movf	fr0,fr2
	movf	fr1,fr0
	addf	$epsilon,fr2
	modf	$ten,fr2
	movfi	fr3,r0
	add	$'0,r0
	movb	r0,-(r3)
	inc	r2
	tstf	fr0
	cfcc
	bne	1b
/
	mov	$buf,r1
1:
	movb	(r3)+,(r1)+
	cmp	r3,$buftop
	blo	1b
/
	movf	(sp)+,fr0
	br	pad

zer:
	inc	r2
	br	pad

lss:
	dec	r2
	modf	$ten,fr0
	tstf	fr1
	cfcc
	beq	lss
	inc	r2
	jsr	pc,digit1

pad:
	jsr	pc,digit
		br out
	br	pad

digit:
	cmp	r1,$buftop
	bhis	1f
	add	$2,(sp)
	modf	$ten,fr0

digit1:
	movfi	fr1,r0
	add	$'0,r0
	movb	r0,(r1)+
1:
	rts	pc
/
out:
	mov	$buf,r0
	add	_ndigit,r0
	tst	eflag
	bne	1f
	add	r2,r0
1:
	cmp	r0,$buf
	blo	outout
	movb	(r0),r3
	add	$5,r3
	movb	r3,(r0)
1:
	cmpb	(r0),$'9
	ble	1f
	movb	$'0,(r0)
	cmp	r0,$buf
	blos	2f
	incb	-(r0)
	br	1b
2:
	movb	$'1,(r0)
	inc	r2
1:
outout:
	mov	sign,r1
	mov	_ndigit,r0
	tst	eflag
	bne	1f
	add	r2,r0
1:
	clrb	buf(r0)
	mov	$buf,r0
	mov	(sp)+,r3
	movf	(sp)+,fr1
	movf	(sp)+,fr0
	ldfps	(sp)+
	rts	pc

epsilon = 037114
one	= 40200
ten	= 41040
	.data
tenth:	037314; 146314; 146314; 146315
_ndigit:10.
	.bss
buf:	.=.+64.
buftop:
sign:	.=.+2
eflag:	.=.+2
	.text
