Index: apps/dsp_asm.h
===================================================================
--- apps/dsp_asm.h	(revision 28001)
+++ apps/dsp_asm.h	(working copy)
@@ -28,7 +28,7 @@
 #if defined(CPU_ARM)
 #define DSP_HAVE_ASM_APPLY_GAIN
 #define DSP_HAVE_ASM_RESAMPLING
-#define DSP_HAVE_ASM_CROSSFEED
+//#define DSP_HAVE_ASM_CROSSFEED
 #define DSP_HAVE_ASM_SOUND_CHAN_MONO
 #define DSP_HAVE_ASM_SOUND_CHAN_CUSTOM
 #define DSP_HAVE_ASM_SOUND_CHAN_KARAOKE
@@ -37,7 +37,7 @@
 #elif defined (CPU_COLDFIRE)
 #define DSP_HAVE_ASM_APPLY_GAIN
 #define DSP_HAVE_ASM_RESAMPLING
-#define DSP_HAVE_ASM_CROSSFEED
+//#define DSP_HAVE_ASM_CROSSFEED
 #define DSP_HAVE_ASM_SOUND_CHAN_MONO
 #define DSP_HAVE_ASM_SOUND_CHAN_CUSTOM
 #define DSP_HAVE_ASM_SOUND_CHAN_KARAOKE
Index: apps/dsp.c
===================================================================
--- apps/dsp.c	(revision 28001)
+++ apps/dsp.c	(working copy)
@@ -787,37 +787,38 @@
     int32_t left, right;
     int i;
 
+    int32_t vdiff, vcl, vcr, common;
+    
+    // 1 / F.Rforward.C
+    coefs[0] = (0xffffffff/NATIVE_FREQUENCY) * 2128;
+    // 1 / F.Rcross.C
+    coefs[1] = (0xffffffff/NATIVE_FREQUENCY) * 1000;
+
+    vcl = hist_l[0];
+    vcr = hist_r[0];
+    left = hist_l[1];
+    right = hist_r[1];
+
     for (i = 0; i < count; i++)
     {
-        left = buf[0][i];
-        right = buf[1][i];
-
-        /* Filter delayed sample from left speaker */
-        acc = FRACMUL(*di, coefs[0]);
-        acc += FRACMUL(hist_l[0], coefs[1]);
-        acc += FRACMUL(hist_l[1], coefs[2]);
-        /* Save filter history for left speaker */
-        hist_l[1] = acc;
-        hist_l[0] = *di;
-        *di++ = left;
-        /* Filter delayed sample from right speaker */
-        acc = FRACMUL(*di, coefs[0]);
-        acc += FRACMUL(hist_r[0], coefs[1]);
-        acc += FRACMUL(hist_r[1], coefs[2]);
-        /* Save filter history for right speaker */
-        hist_r[1] = acc;
-        hist_r[0] = *di;
-        *di++ = right;
-        /* Now add the attenuated direct sound and write to outputs */
-        buf[0][i] = FRACMUL(left, gain) + hist_r[1];
-        buf[1][i] = FRACMUL(right, gain) + hist_l[1];
-
-        /* Wrap delay line index if bigger than delay line size */
-        if (di >= delay + 13*2)
-            di = delay;
+        vdiff = left - right;
+    
+        // calculate output
+        left = buf[0][i] + vcl;
+        right = buf[1][i] + vcr;
+        buf[0][i] = left;
+        buf[1][i] = right;
+        
+        // update filter
+        common = FRACMUL(coefs[1], vdiff);
+        vcl -= (FRACMUL(coefs[0], vcl) + common);
+        vcr -= (FRACMUL(coefs[0], vcr) - common);
     }
-    /* Write back local copies of data we've modified */
-    crossfeed_data.index = di;
+    // store filter state
+    hist_l[0] = vcl;
+    hist_r[0] = vcr;
+    hist_l[1] = left;
+    hist_r[1] = right;
 }
 #endif /* DSP_HAVE_ASM_CROSSFEED */
 
