MiniUnix/usr/source/s3/atan.s
ldfps = 170100^tst
stfps = 170200^tst
/
.globl atan, _atan
.globl atan2, _atan2
/
/ floating-point arctangent
/
/ atan replaces the value in fr0 by its arctangent
/ in the range [-pi/2,pi/2].
/
/ atan2 places in fr0 the arctangent of fr0/fr1
/ in the range [-pi,pi].
/
/ there are no error exits
/
/ coefficients are #5076 from Hart & Cheney.
/
/
_atan:
mov r5,-(sp)
mov sp,r5
movf 4(r5),fr0
jsr pc,atan
br 1f
_atan2:
mov r5,-(sp)
mov sp,r5
movf 4(r5),fr0
movf 12.(r5),fr1
jsr pc,atan2
1:
mov (sp)+,r5
rts pc
atan:
jsr r0,save
tstf fr0
cfcc
blt 1f
jsr pc,satan
br ret
1:
negf fr0
jsr pc,satan
negf fr0
br ret
/
atan2:
jsr r0,save
clr -(sp)
tstf fr0
cfcc
bge 1f
inc (sp)
negf fr0
1:
tstf fr1
cfcc
beq 2f
bgt 1f
add $2,(sp)
negf fr1
1:
divf fr1,fr0
jsr pc,satan
br 1f
2:
movf pi2,fr0
1:
bit $2,(sp)
beq 1f
negf fr0
addf pi2,fr0
addf pi2,fr0
1:
bit $1,(sp)+
beq 1f
negf fr0
1:
ret:
ldfps (sp)+
movf (sp)+,fr3
movf (sp)+,fr2
movf (sp)+,fr1
mov (sp)+,r0
rts pc
save:
movf fr1,-(sp)
movf fr2,-(sp)
movf fr3,-(sp)
stfps -(sp)
ldfps $40200 / DP, no interrupt
jmp (r0)
satan:
cmpf sq2m1,fr0
cfcc
bge arctan
cmpf sq2p1,fr0
cfcc
bgt 1f
movf one,fr1
divf fr0,fr1
movf fr1,fr0
jsr pc,arctan
negf fr0
addf pi2,fr0
rts pc
1:
movf fr0,fr1
subf one,fr0
addf one,fr1
divf fr1,fr0
jsr pc,arctan
addf pi4,fr0
rts pc
arctan:
mov $p4p,r0
mov $4,-(sp)
movf fr0,fr3
mulf fr3,fr3
movf *(r0)+,fr1
1:
mulf fr3,fr1
addf *(r0)+,fr1
dec (sp)
bne 1b
mov $4,(sp)
movf fr3,fr2
br 2f
1:
mulf fr3,fr2
2:
addf *(r0)+,fr2
dec (sp)
bne 1b
tst (sp)+
divf fr2,fr1
mulf fr1,fr0
rts pc
.data
p4p:
p4;p3;p2;p1;p0
q3;q2;q1;p0
one: 40200;0;0;0
pi2: 40311;7732;121041;64302
pi4: 40111;7732;121041;64302
sq2p1: 40432
101171
114774
167461
sq2m1: 37724
11714
147747
74621
p4: 37442
145026
75504
15621
p3: 40725
21566
115517
50305
p2: 41443
160206
172714
25441
p1: 41632
172223
76027
56645
p0: 41462
25125
6152
126064
q3: 41170
10112
141724
64324
q2: 41573
53776
25372
71522
q1: 41670
123114
51576
75020
/ one = 1.00000 00000 00000 00000 d0
/ sq2p1=2.41421 35623 73095 04880 d0
/ sq2m1= .41421 35623 73095 04880 d0
/ pi2 = 1.57079 63267 94896 61923 d0
/ p4 = .15897 40288 48230 7048 d0
/ p3 = .66605 79017 00926 2658 d1
/ p2 = .40969 26483 21022 5637 d2
/ p1 = .77477 68771 92042 0862 d2
/ p0 = .44541 34005 92906 8032 d2
/ q4 = .10000 00000 00000 0000 d1
/ q3 = .15503 97755 14219 8753 d2
/ q2 = .62835 93051 10323 7683 d2
/ q1 = .92324 80107 23009 7484 d2
/ q0 = .44541 34005 92906 8044 d2