/ assure fake printf (no floating)

.globl	fltused;

/ convert stream to number; result is type.
/ value in cval or fcval

fpp = 0

.globl	_getnum

.globl	_peekc
.globl	_getchar
.globl	_cval
.globl	_fcval
.globl	_error

_getnum:
	.if	fpp
	movif	$10,fr3
	clrf	fr0
	.endif
	clr	nfract
	clr	totdig
	clr	decpt
	clr	_cval
	mov	2(sp),base
	mov	r2,-(sp)
1:
	jsr	r5,getdig
		br 2f
	.if	fpp
	mulf	fr3,fr0
	movif	r0,fr1
	addf	fr1,fr0
	.endif
	inc	nfract
	br	1b
2:
	tst	decpt
	bne	1f
	clr	nfract
	cmp	r0,$'.
	bne	1f
	mov	pc,decpt
	br	1b
1:
	tst	totdig
	beq	1f
	cmp	r0,$'e
	bne	1f
	clr	-(sp)
	clr	_cval
	mov	pc,decpt
	clr	_cval
	mov	$10,base
	jsr	pc,_getchar
	cmp	r0,$'+
	beq	2f
	cmp	r0,$'-
	bne	3f
	inc	(sp)
	br	2f
3:
	mov	r0,_peekc
2:
	jsr	r5,getdig
		br 2f
	br	2b
2:
	tst	(sp)+
	beq	2f
	neg	_cval
2:
	sub	_cval,nfract
1:
	mov	r0,_peekc
	tst	totdig
	bne	1f
	mov	$39,r0		/ "." operator
9:
	mov	(sp)+,r2
	rts	pc
1:
	tst	decpt
	bne	1f
	mov	$21,r0		/ fixed constant
	br	9b
1:
	.if	fpp
	movif	$1,fr2
	mov	nfract,r2
	mov	r2,-(sp)
	beq	2f
	bgt	1f
	neg	r2
1:
	mulf	fr3,fr2
	sob	r2,1b
2:
	tst	(sp)+
	ble	1f
	divf	fr2,fr0
	br	2f
1:
	mulf	fr2,fr0
2:
	mov	$_fcval,r0
	movf	fr0,(r0)
	tst	(r0)+
	tst	(r0)+
	bne	1f
	tst	(r0)+
	bne	1f
	tst	(r0)+
	bne	1f
	mov	$24,r0
	mov	_fcval,_cval
	br	9b
1:
	mov	$23,r0
	br	9b
	.endif
	.if	1-fpp
	mov	$fperr,-(sp)
	jsr	pc,_error
	tst	(sp)+
	mov	$21,r0
	br	9b
fperr:	<No floating point!\0>; .even
	.endif

getdig:
	mov	_peekc,r0
	beq	1f
	clr	_peekc
	br	2f
1:
	jsr	pc,_getchar
2:
	sub	$'0,r0
	cmp	r0,$9
	bhi	1f
	inc	totdig
	mov	_cval,r1
	mul	base,r1
	add	r0,r1
	mov	r1,_cval
	tst	(r5)+
	rts	r5
1:
	add	$'0,r0
	rts	r5

.bss
fltused:
base:	.=.+2
nfract:	.=.+2
decpt:	.=.+2
totdig:	.=.+2
