MiniUnix/usr/source/s3/ecvt.s
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: .=.+40.
buftop:
sign: .=.+2
eflag: .=.+2
.text