summaryrefslogtreecommitdiff
path: root/apps/dsp_cf.S
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dsp_cf.S')
-rw-r--r--apps/dsp_cf.S102
1 files changed, 41 insertions, 61 deletions
diff --git a/apps/dsp_cf.S b/apps/dsp_cf.S
index 6147ebeea7..719d1db1d5 100644
--- a/apps/dsp_cf.S
+++ b/apps/dsp_cf.S
@@ -17,15 +17,6 @@
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19 19
20 .section .idata,"aw",@progbits
21crossfeed_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 20 .section .text
30 .global apply_crossfeed 21 .global apply_crossfeed
31apply_crossfeed: 22apply_crossfeed:
@@ -36,68 +27,57 @@ apply_crossfeed:
36 move.l (44+8, %sp), %d7 | d7 = count 27 move.l (44+8, %sp), %d7 | d7 = count
37 28
38 lea.l crossfeed_data, %a1 29 lea.l crossfeed_data, %a1
39 lea.l crossfeed_coefs, %a6 30 lea.l (8*4, %a1), %a0 | a0 = &delay[0][0]
40 lea.l (16, %a1), %a0 | a0 = &delay[0][0] 31 move.l (%a1)+, %a6 | a6 = direct gain
41 movem.l (%a1), %d0-%d3 | fetch filter history samples 32 movem.l (3*4, %a1), %d0-%d3 | fetch filter history samples
42 move.l (120, %a1), %d4 | fetch delay line index 33 move.l (33*4, %a1), %d4 | fetch delay line index
43 move.l (%a4), %d5 | d5 = left sample 34 movem.l (%a1), %a1-%a3 | load filter coefs
44 move.l (%a5), %d6 | d6 = right sample 35 move.l %d4, %d5
45 move.l (%a6)+, %a1 | a1 = LOW value 36 lsl.l #3, %d5
46 move.l (%a6)+, %a2 | a2 = LOW_COMP value 37 add.l %d5, %a0 | point a0 to current delay position
38| lea.l (%d4*4, %a0), %a0
39| lea.l (%d4*4, %a0), %a0 | point a0 to current delay position
47 /* Register usage in loop: 40 /* Register usage in loop:
48 * a0 = &delay[0][0], a1 & a2 = coefs, a3 = temp storage, 41 * a0 = &delay[index][0], a1..a3 = b0, b1, a1 (filter coefs),
49 * a4 = src[0], a5 = src[1], a6 = &crossfeed_coefs[0], 42 * a4 = src[0], a5 = src[1], a6 = direct gain,
50 * d0 = low_left, d1 = low_right, 43 * d0..d3 = history
51 * d2 = high_left, d3 = high_right,
52 * d4 = delay line index, 44 * d4 = delay line index,
53 * d5 = src[0][i], d6 = src[1][i]. 45 * d5,d6 = temp.
54 * d7 = count 46 * d7 = count
55 */ 47 */
56.cfloop: 48.cfloop:
57 | LOW*low_left + LOW_COMP*left 49 mac.l %a2, %d0, (4, %a0), %d0, %acc0 | acc = b1*dr[n - 1] d0 = dr[n]
58 mac.l %a1, %d0, %acc0 50 mac.l %a1, %d0, %acc0 | acc += b0*dr[n]
59 mac.l %a2, %d5, %acc0 51 mac.l %a3, %d1, (%a4), %d5, %acc0 | acc += a1*y_l[n - 1], load left input
60 | LOW*low_right + LOW_COMP*right 52 move.l %acc0, %d1 | get filtered delayed sample
61 mac.l %a1, %d1, (%a6)+, %a1, %acc1 | a1 = HIGH_NEG 53 mac.l %a6, %d5, %acc0 | acc += gain*x_l[n]
62 mac.l %a2, %d6, (%a6)+, %a2, %acc1 | a2 = HIGH_COMP 54 movclr.l %acc0, %d6
63 movclr.l %acc0, %d0 | get low_left 55 move.l %d6, (%a4)+ | write result
64 movclr.l %acc1, %d1 | get low_right 56
65 | HIGH_NEG*high_left + HIGH_COMP*left 57 mac.l %a2, %d2, (%a0), %d2, %acc0 | acc = b1*dl[n - 1], d2 = dl[n]
66 mac.l %a1, %d2, %acc0 58 move.l %d5, (%a0)+ | save left input to delay line
67 mac.l %a2, %d5, %acc0 59 mac.l %a1, %d2, %acc0 | acc += b0*dl[n]
68 | HIGH_NEG*high_right + HIGH_COMP*right 60 mac.l %a3, %d3, (%a5), %d5, %acc0 | acc += a1*y_r[n - 1], load right input
69 mac.l %a1, %d3, (%a6)+, %a1, %acc1 | a1 = ATT 61 move.l %acc0, %d3 | get filtered delayed sample
70 mac.l %a2, %d6, (%a6)+, %a2, %acc1 | a2 = ATT_COMP 62 mac.l %a6, %d5, %acc0 | acc += gain*x_r[n]
71 lea.l (-6*4, %a6), %a6 | coef = &coefs[0] 63 move.l %d5, (%a0)+ | save right input to delay line
72 move.l (%a0, %d4*4), %a3 | a3 = delay[0][idx] 64 movclr.l %acc0, %d6
73 move.l (52, %a0, %d4*4), %d5 | d5 = delay[1][idx] 65 move.l %d6, (%a5)+ | write result
74 movclr.l %acc0, %d2 | get high_left 66
75 movclr.l %acc1, %d3 | get high_right 67 addq.l #1, %d4 | index++
76 | ATT*delay_r + ATT_COMP*high_left 68 moveq.l #13, %d6
77 mac.l %a1, %d5, (4, %a4), %d5, %acc0 | d5 = src[0][i+1] 69 cmp.l %d6, %d4 | wrap index to 0 if it overflows
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 70 jlt .nowrap
93 clr.l %d4 | index = 0 71 moveq.l #13*8, %d4
94.nowrap: | } 72 sub.l %d4, %a0 | wrap back delay line ptr as well
73 clr.l %d4
74.nowrap:
95 subq.l #1, %d7 75 subq.l #1, %d7
96 jne .cfloop 76 jne .cfloop
97 | save data back to struct 77 | save data back to struct
98 lea.l crossfeed_data, %a1 78 lea.l crossfeed_data + 4*4, %a1
99 movem.l %d0-%d3, (%a1) 79 movem.l %d0-%d3, (%a1)
100 move.l %d4, (120, %a1) 80 move.l %d4, (30*4, %a1)
101 movem.l (%sp), %d2-%d7/%a2-%a6 81 movem.l (%sp), %d2-%d7/%a2-%a6
102 lea.l (44, %sp), %sp 82 lea.l (44, %sp), %sp
103 rts 83 rts