diff -urN fceux-2.2.2-orig/src/drivers/common/vidblit.cpp fceux-2.2.2/src/drivers/common/vidblit.cpp
--- fceux-2.2.2-orig/src/drivers/common/vidblit.cpp	2016-03-30 12:55:37 +0900
+++ fceux-2.2.2/src/drivers/common/vidblit.cpp	2016-03-30 12:49:04 +0900
@@ -86,7 +86,7 @@
 {
 
  // -Video Modes Tag-
- if(specfilt == 3) // NTSC 2x
+ if(specfilt == 3 || specfilt == 6) // NTSC 2x/3x
  {
   //nes_ntsc variables
   nes_ntsc_setup_t ntsc_setup = nes_ntsc_composite;
@@ -399,7 +399,7 @@
  int pinc;
  
  // -Video Modes Tag-
- if(special==3) //NTSC 2x
+ if(special==3 || special==6) //NTSC 2x/3x
   return; //Incompatible with 8-bit output. This is here for SDL.
 
  // -Video Modes Tag-
@@ -740,9 +740,41 @@
 	 uint8 *out = dest;
 	 const int in_stride = Bpp * outxr * 2;
 	 const int out_stride = Bpp * outxr * xscale;
-	 for( int y = 0; y < yr; y++, in += in_stride, out += 2*out_stride ) {
-	     memcpy(out, in, Bpp * outxr * xscale);
-	     memcpy(out + out_stride, in, Bpp * outxr * xscale);
+	 if( yscale == 3 ) {
+	     for( int y = 0; y < yr; y++, in += in_stride, out += 3*out_stride ) {
+	         for( int x = 0; x < outxr; x++ ) {
+	             const uint32 pixel0 = ((const uint32 *)in)[x*2+0];
+	             const uint32 pixel1 = ((const uint32 *)in)[x*2+1];
+	             const int r0 = pixel0 & 0xFF;
+	             const int g0 = pixel0>>8 & 0xFF;
+	             const int b0 = pixel0>>16 & 0xFF;
+	             const int r1 = pixel1 & 0xFF;
+	             const int g1 = pixel1>>8 & 0xFF;
+	             const int b1 = pixel1>>16 & 0xFF;
+                     ((uint32 *)out)[out_stride/4 + x*3+0] = pixel0;
+                     ((uint32 *)out)[out_stride/4 + x*3+1] = ((r0+r1)/2) | ((g0+g1)/2)<<8 | ((b0+b1)/2)<<16;
+                     ((uint32 *)out)[out_stride/4 + x*3+2] = pixel1;
+                 }
+	         for( int x = 0; x < outxr * xscale; x++ ) {
+                     const int r = out[out_stride + x*Bpp + 0];
+                     const int g = out[out_stride + x*Bpp + 1];
+                     const int b = out[out_stride + x*Bpp + 2];
+	             // Bright pixels bleed a little more than dark ones
+	             const float max_bleed = 0.3f;
+	             const float luminance = (r*(0.299f/255*max_bleed) +
+	                                      g*(0.587f/255*max_bleed) +
+	                                      b*(0.114f/255*max_bleed));
+	             const float level = 0.55 + luminance;
+	             out[2*out_stride + x*Bpp + 0] = out[x*Bpp + 0] = (int)(r * level + 0.5f);
+	             out[2*out_stride + x*Bpp + 1] = out[x*Bpp + 1] = (int)(g * level + 0.5f);
+	             out[2*out_stride + x*Bpp + 2] = out[x*Bpp + 2] = (int)(b * level + 0.5f);
+	         }
+	     }
+	 } else {  // yscale == 2
+	     for( int y = 0; y < yr; y++, in += in_stride, out += 2*out_stride ) {
+	         memcpy(out, in, Bpp * outxr * xscale);
+	         memcpy(out + out_stride, in, Bpp * outxr * xscale);
+	     }
 	 }
 	} else {
      pinc=pitch-((xr*xscale)<<2);
diff -urN fceux-2.2.2-orig/src/drivers/sdl/sdl-video.cpp fceux-2.2.2/src/drivers/sdl/sdl-video.cpp
--- fceux-2.2.2-orig/src/drivers/sdl/sdl-video.cpp	2016-03-30 12:58:26 +0900
+++ fceux-2.2.2/src/drivers/sdl/sdl-video.cpp	2016-03-30 12:49:04 +0900
@@ -307,12 +307,12 @@
         
 		// -Video Modes Tag-
 		if(s_sponge) {
-			if(s_sponge == 4 || s_sponge == 5) {
+			if(s_sponge >= 4) {
 				s_exs = s_eys = 3;
 			} else {
 				s_exs = s_eys = 2;
 			}
-			if(s_sponge == 3) {
+			if(s_sponge == 3 || s_sponge == 6) {
 				xres = 301 * s_exs;
 			}
 			s_eefx = 0;
@@ -357,7 +357,7 @@
 		g_config->getOption("SDL.XScale", &s_exs);
 		g_config->getOption("SDL.YScale", &s_eys);
 		g_config->getOption("SDL.SpecialFX", &s_eefx);
-        
+
 		// -Video Modes Tag-
 		if(s_sponge) {
 			if(s_sponge >= 4) {
@@ -369,7 +369,7 @@
 		}
 
 		int scrw = NWIDTH * s_exs;
-		if(s_sponge == 3) {
+		if(s_sponge == 3 || s_sponge == 6) {
 			scrw = 301 * s_exs;
 		}
 
@@ -695,7 +695,7 @@
 	}
 
 	int scrw;
-	if(s_sponge == 3) {  // NTSC 2x
+	if(s_sponge == 3 || s_sponge == 6) {  // NTSC 2x/3x
 		scrw = 301;
 	} else {
 		scrw = NWIDTH;
@@ -743,6 +743,10 @@
    static unsigned char* result = NULL;
    static unsigned resultsize = 0;
    int width = NWIDTH, height = s_tlines;
+   if(s_sponge == 6) {
+      width = 903;
+      height = 672;
+   }
    if(!result || resultsize != width*height*3*2)
    {
        if(result) free(result);
