/ assure fake printf (no floating) .globl fltused; fltused = 0 / convert stream to number; result is type. / value in cval or fcval fpp = 1 .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: ; .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 base: .=.+2 nfract: .=.+2 decpt: .=.+2 totdig: .=.+2