diff options
Diffstat (limited to 'apps/dsp_cf.S')
-rw-r--r-- | apps/dsp_cf.S | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/apps/dsp_cf.S b/apps/dsp_cf.S new file mode 100644 index 0000000000..6147ebeea7 --- /dev/null +++ b/apps/dsp_cf.S | |||
@@ -0,0 +1,104 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2006 Thom Johansen | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | .section .idata,"aw",@progbits | ||
21 | crossfeed_coefs: | ||
22 | .long 0x4CCCCCCD | LOW | ||
23 | .long 0x33333333 | LOW_COMP | ||
24 | .long -0x66666666 | HIGH_NEG | ||
25 | .long 0x66666666 | HIGH_COMP | ||
26 | .long 0x0CCCCCCD | ATT | ||
27 | .long 0x73333333 | ATT_COMP | ||
28 | |||
29 | .section .text | ||
30 | .global apply_crossfeed | ||
31 | apply_crossfeed: | ||
32 | lea.l (-44, %sp), %sp | ||
33 | movem.l %d2-%d7/%a2-%a6, (%sp) | save all regs | ||
34 | move.l (44+4, %sp), %a4 | ||
35 | movem.l (%a4), %a4-%a5 | a4 = src[0], a5 = src[1] | ||
36 | move.l (44+8, %sp), %d7 | d7 = count | ||
37 | |||
38 | lea.l crossfeed_data, %a1 | ||
39 | lea.l crossfeed_coefs, %a6 | ||
40 | lea.l (16, %a1), %a0 | a0 = &delay[0][0] | ||
41 | movem.l (%a1), %d0-%d3 | fetch filter history samples | ||
42 | move.l (120, %a1), %d4 | fetch delay line index | ||
43 | move.l (%a4), %d5 | d5 = left sample | ||
44 | move.l (%a5), %d6 | d6 = right sample | ||
45 | move.l (%a6)+, %a1 | a1 = LOW value | ||
46 | move.l (%a6)+, %a2 | a2 = LOW_COMP value | ||
47 | /* Register usage in loop: | ||
48 | * a0 = &delay[0][0], a1 & a2 = coefs, a3 = temp storage, | ||
49 | * a4 = src[0], a5 = src[1], a6 = &crossfeed_coefs[0], | ||
50 | * d0 = low_left, d1 = low_right, | ||
51 | * d2 = high_left, d3 = high_right, | ||
52 | * d4 = delay line index, | ||
53 | * d5 = src[0][i], d6 = src[1][i]. | ||
54 | * d7 = count | ||
55 | */ | ||
56 | .cfloop: | ||
57 | | LOW*low_left + LOW_COMP*left | ||
58 | mac.l %a1, %d0, %acc0 | ||
59 | mac.l %a2, %d5, %acc0 | ||
60 | | LOW*low_right + LOW_COMP*right | ||
61 | mac.l %a1, %d1, (%a6)+, %a1, %acc1 | a1 = HIGH_NEG | ||
62 | mac.l %a2, %d6, (%a6)+, %a2, %acc1 | a2 = HIGH_COMP | ||
63 | movclr.l %acc0, %d0 | get low_left | ||
64 | movclr.l %acc1, %d1 | get low_right | ||
65 | | HIGH_NEG*high_left + HIGH_COMP*left | ||
66 | mac.l %a1, %d2, %acc0 | ||
67 | mac.l %a2, %d5, %acc0 | ||
68 | | HIGH_NEG*high_right + HIGH_COMP*right | ||
69 | mac.l %a1, %d3, (%a6)+, %a1, %acc1 | a1 = ATT | ||
70 | mac.l %a2, %d6, (%a6)+, %a2, %acc1 | a2 = ATT_COMP | ||
71 | lea.l (-6*4, %a6), %a6 | coef = &coefs[0] | ||
72 | move.l (%a0, %d4*4), %a3 | a3 = delay[0][idx] | ||
73 | move.l (52, %a0, %d4*4), %d5 | d5 = delay[1][idx] | ||
74 | movclr.l %acc0, %d2 | get high_left | ||
75 | movclr.l %acc1, %d3 | get high_right | ||
76 | | ATT*delay_r + ATT_COMP*high_left | ||
77 | mac.l %a1, %d5, (4, %a4), %d5, %acc0 | d5 = src[0][i+1] | ||
78 | mac.l %a2, %d2, (4, %a5), %d6, %acc0 | d6 = src[1][i+1] | ||
79 | | ATT*delay_l + ATT_COMP*high_right | ||
80 | mac.l %a1, %a3, (%a6)+, %a1, %acc1 | a1 = LOW | ||
81 | mac.l %a2, %d3, (%a6)+, %a2, %acc1 | a2 = LOW_COMP | ||
82 | |||
83 | | save crossfed samples to output | ||
84 | movclr.l %acc0, %a3 | ||
85 | move.l %a3, (%a4)+ | src[0][i++] = out_l | ||
86 | movclr.l %acc1, %a3 | ||
87 | move.l %a3, (%a5)+ | src[1][i++] = out_r | ||
88 | move.l %d0, (%a0, %d4*4) | delay[0][index] = low_left | ||
89 | move.l %d1, (52, %a0, %d4*4) | delay[1][index] = low_right */ | ||
90 | addq.l #1, %d4 | index++ */ | ||
91 | cmp.l #13, %d4 | if (index >= 13) { | ||
92 | jlt .nowrap | ||
93 | clr.l %d4 | index = 0 | ||
94 | .nowrap: | } | ||
95 | subq.l #1, %d7 | ||
96 | jne .cfloop | ||
97 | | save data back to struct | ||
98 | lea.l crossfeed_data, %a1 | ||
99 | movem.l %d0-%d3, (%a1) | ||
100 | move.l %d4, (120, %a1) | ||
101 | movem.l (%sp), %d2-%d7/%a2-%a6 | ||
102 | lea.l (44, %sp), %sp | ||
103 | rts | ||
104 | |||