/
trig.s
91 lines (87 loc) · 3.98 KB
/
trig.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
@@@ Cosine: quadrant is bits 9 and 10;
@@@ 01 => angle = -angle, value = -value
@@@ 10 => value = -value
@@@ 11 => angle = -angle
@@@ Sine: shift by pi/2
.section .text
.arm
.align 2
.global sine
sine: sub r0, r0, #0x100
@@ r0 = theta (10 bits); returns sin(theta) (0.15) in r0; uses r1
.global cosine
cosine: ldr r1, =0x3ff
and r0, r0, r1
ldr r1, =slut
@@ XXX I'm sure there's a way more clever way to do this that
@@ I could figure out if I had any time.
cmp r0, #0x300
bge 3f
cmp r0, #0x200
bge 2f
cmp r0, #0x100
bge 1f
and r0, r0, #0xff
lsl r0, #1
ldrh r0, [r1, r0]
bx lr
1: rsb r0, r0, #0xff
and r0, r0, #0xff
lsl r0, #1
ldrh r0, [r1, r0]
rsb r0, r0, #0
bx lr
2: and r0, r0, #0xff
lsl r0, #1
ldrh r0, [r1, r0]
rsb r0, r0, #0
bx lr
3: rsb r0, r0, #0xff
and r0, r0, #0xff
lsl r0, #1
ldrh r0, [r1, r0]
bx lr
/*
To expand the range of this, we could do linear interpolation between
neighbors, or even cubic interpolation with extra neighbors.
http://paulbourke.net/miscellaneous/interpolation/
*/
.section .rodata
.align 2
@@ (loop for i from 1 to 256
@@ do (let ((v (truncate (* 32768 (cos (* 1/2 pi (/ i 256))))))
@@ (m (mod i 8)))
@@ (format t "~@[~*~&~8T.hword ~]0x~X~@[~*, ~]" (= 1 m) v (/= 0 m))))
slut:
.hword 0x7FFF, 0x7FFD, 0x7FFA, 0x7FF6, 0x7FF0, 0x7FE9, 0x7FE1, 0x7FD8
.hword 0x7FCE, 0x7FC2, 0x7FB5, 0x7FA7, 0x7F97, 0x7F87, 0x7F75, 0x7F62
.hword 0x7F4D, 0x7F38, 0x7F21, 0x7F09, 0x7EF0, 0x7ED5, 0x7EBA, 0x7E9D
.hword 0x7E7F, 0x7E5F, 0x7E3F, 0x7E1D, 0x7DFA, 0x7DD6, 0x7DB0, 0x7D8A
.hword 0x7D62, 0x7D39, 0x7D0F, 0x7CE3, 0x7CB7, 0x7C89, 0x7C5A, 0x7C29
.hword 0x7BF8, 0x7BC5, 0x7B92, 0x7B5D, 0x7B26, 0x7AEF, 0x7AB6, 0x7A7D
.hword 0x7A42, 0x7A05, 0x79C8, 0x798A, 0x794A, 0x7909, 0x78C7, 0x7884
.hword 0x7840, 0x77FA, 0x77B4, 0x776C, 0x7723, 0x76D9, 0x768E, 0x7641
.hword 0x75F4, 0x75A5, 0x7555, 0x7504, 0x74B2, 0x745F, 0x740B, 0x73B5
.hword 0x735F, 0x7307, 0x72AF, 0x7255, 0x71FA, 0x719E, 0x7141, 0x70E2
.hword 0x7083, 0x7023, 0x6FC1, 0x6F5F, 0x6EFB, 0x6E96, 0x6E30, 0x6DCA
.hword 0x6D62, 0x6CF9, 0x6C8F, 0x6C24, 0x6BB8, 0x6B4A, 0x6ADC, 0x6A6D
.hword 0x69FD, 0x698C, 0x6919, 0x68A6, 0x6832, 0x67BD, 0x6746, 0x66CF
.hword 0x6657, 0x65DD, 0x6563, 0x64E8, 0x646C, 0x63EF, 0x6371, 0x62F2
.hword 0x6271, 0x61F1, 0x616F, 0x60EC, 0x6068, 0x5FE3, 0x5F5E, 0x5ED7
.hword 0x5E50, 0x5DC7, 0x5D3E, 0x5CB4, 0x5C29, 0x5B9D, 0x5B10, 0x5A82
.hword 0x59F3, 0x5964, 0x58D4, 0x5842, 0x57B0, 0x571D, 0x568A, 0x55F5
.hword 0x5560, 0x54CA, 0x5433, 0x539B, 0x5302, 0x5269, 0x51CE, 0x5133
.hword 0x5097, 0x4FFB, 0x4F5E, 0x4EBF, 0x4E21, 0x4D81, 0x4CE1, 0x4C3F
.hword 0x4B9E, 0x4AFB, 0x4A58, 0x49B4, 0x490F, 0x4869, 0x47C3, 0x471C
.hword 0x4675, 0x45CD, 0x4524, 0x447A, 0x43D0, 0x4325, 0x427A, 0x41CE
.hword 0x4121, 0x4073, 0x3FC5, 0x3F17, 0x3E68, 0x3DB8, 0x3D07, 0x3C56
.hword 0x3BA5, 0x3AF2, 0x3A40, 0x398C, 0x38D8, 0x3824, 0x376F, 0x36BA
.hword 0x3604, 0x354D, 0x3496, 0x33DE, 0x3326, 0x326E, 0x31B5, 0x30FB
.hword 0x3041, 0x2F87, 0x2ECC, 0x2E11, 0x2D55, 0x2C98, 0x2BDC, 0x2B1F
.hword 0x2A61, 0x29A3, 0x28E5, 0x2826, 0x2767, 0x26A8, 0x25E8, 0x2528
.hword 0x2467, 0x23A6, 0x22E5, 0x2223, 0x2161, 0x209F, 0x1FDC, 0x1F19
.hword 0x1E56, 0x1D93, 0x1CCF, 0x1C0B, 0x1B47, 0x1A82, 0x19BD, 0x18F8
.hword 0x1833, 0x176D, 0x16A8, 0x15E2, 0x151B, 0x1455, 0x138E, 0x12C8
.hword 0x1201, 0x1139, 0x1072, 0xFAB, 0xEE3, 0xE1B, 0xD53, 0xC8B
.hword 0xBC3, 0xAFB, 0xA33, 0x96A, 0x8A2, 0x7D9, 0x710, 0x647
.hword 0x57F, 0x4B6, 0x3ED, 0x324, 0x25B, 0x192, 0xC9, 0x0