177 lines
1.9 KiB
ArmAsm
177 lines
1.9 KiB
ArmAsm
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
|