1BSD/px/30atof.s

Compare this file to the similar file:
Show the results in this format:

/ C library -- ascii to floating

/	f = atof(p)
/	char *p;

ldfps = 170100^tst
stfps = 170200^tst

.globl	_atof

.globl	csv, cret

_atof:
	jsr	r5,csv
	stfps	-(sp)
	ldfps	$200
	movf	fr1,-(sp)
	clr	-(sp)
	clrf	fr0
	clr	r2
	mov	4(r5),r3
1:
	movb	(r3)+,r0
	cmp	$' ,r0
	beq	1b
	cmpb	r0,$'-
	bne	2f
	inc	(sp)
1:
	movb	(r3)+,r0
2:
	sub	$'0,r0
	cmp	r0,$9.
	bhi	2f
	jsr	pc,digit
		br 1b
	inc	r2
	br	1b
2:
	cmpb	r0,$'.-'0
	bne	2f
1:
	movb	(r3)+,r0
	sub	$'0,r0
	cmp	r0,$9.
	bhi	2f
	jsr	pc,digit
		dec r2
	br	1b
2:
	cmpb	r0,$'E-'0
	beq	3f
	cmpb	r0,$'e-'0
	bne	1f
3:
	clr	r4
	clr	r1
	cmpb	(r3),$'-
	bne	3f
	inc	r4
	inc	r3
3:
	movb	(r3)+,r0
	sub	$'0,r0
	cmp	r0,$9.
	bhi	3f
	mul	$10.,r1
	add	r0,r1
	br	3b
3:
	tst	r4
	bne	3f
	neg	r1
3:
	sub	r1,r2
1:
	movf	$one,fr1
	mov	r2,-(sp)
	beq	2f
	bgt	1f
	neg	r2
1:
	cmp	r2,$38.
	blos	1f
	clrf	fr0
	tst	(sp)+
	bmi	out
	movf	$huge,fr0
	br	out
1:
	mulf	$ten,fr1
	sob	r2,1b
2:
	tst	(sp)+
	bge	1f
	divf	fr1,fr0
	br	2f
1:
	mulf	fr1,fr0
	cfcc
	bvc	2f
	movf	$huge,fr0
2:
out:
	tst	(sp)+
	beq	1f
	negf	fr0
1:
	movf	(sp)+,fr1
	ldfps	(sp)+
	jmp	cret
/
/
digit:
	cmpf	$big,fr0
	cfcc
	blt	1f
	mulf	$ten,fr0
	movif	r0,fr1
	addf	fr1,fr0
	rts	pc
1:
	add	$2,(sp)
	rts	pc
/
/
one	= 40200
ten	= 41040
big	= 56200
huge	= 77777