Add original unix v6
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
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
|
||||
Reference in New Issue
Block a user