diff options
Diffstat (limited to 'apps/dsp_cf.S')
-rw-r--r-- | apps/dsp_cf.S | 102 |
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 | ||
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 | 20 | .section .text |
30 | .global apply_crossfeed | 21 | .global apply_crossfeed |
31 | apply_crossfeed: | 22 | apply_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 |