home *** CD-ROM | disk | FTP | other *** search
- 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
-