diff -urN fceux-2.2.2-orig/src/drivers/common/nes_ntsc.c fceux-2.2.2/src/drivers/common/nes_ntsc.c
--- fceux-2.2.2-orig/src/drivers/common/nes_ntsc.c	2010-05-22 05:42:05 +0900
+++ fceux-2.2.2/src/drivers/common/nes_ntsc.c	2016-03-30 12:49:04 +0900
@@ -24,7 +24,7 @@
 #define alignment_count 3
 #define burst_count     3
 #define rescale_in      8
-#define rescale_out     6
+#define rescale_out     7
 
 #define artifacts_mid   1.0f
 #define fringing_mid    1.0f
@@ -81,14 +81,13 @@
 	}
 }
 
-void nes_ntsc_init( nes_ntsc_t* ntsc, nes_ntsc_setup_t const* setup, int bpp, int multiplier )
+void nes_ntsc_init( nes_ntsc_t* ntsc, nes_ntsc_setup_t const* setup, int bpp )
 {
 	int merge_fields;
 	int entry;
 	init_t impl;
 	float gamma_factor;
 
-	OutputMultiplier = multiplier;
 	OutputDepth = bpp * 8;
 
 	if ( !setup )
@@ -244,18 +243,12 @@
 #ifndef NES_NTSC_NO_BLITTERS
 
 void nes_ntsc_blit( nes_ntsc_t const* ntsc, NES_NTSC_IN_T const* input, long in_row_width,
-		int burst_phase, int in_width, int in_height, void* rgb_out, long out_pitch )
+		int burst_phase, int emphasis, int in_width, int in_height, void* rgb_out, long out_pitch )
 {
 	int chunk_count = (in_width - 1) / nes_ntsc_in_chunk;
 
-	int TempMultiplier = OutputMultiplier * 3;
-	if (TempMultiplier > 7)
-		TempMultiplier = 7;
-
 	for ( ; in_height; --in_height )
 	{
-		int out;
-		for ( out = OutputMultiplier; out; --out ) {
 		NES_NTSC_IN_T const* line_in = input;
 		NES_NTSC_BEGIN_ROW( ntsc, burst_phase, nes_ntsc_black, nes_ntsc_black, NES_NTSC_ADJ_IN( *line_in ) );
 		nes_ntsc_out_t* restrict line_out = (nes_ntsc_out_t*) rgb_out;
@@ -297,7 +290,6 @@
 		NES_NTSC_RGB_OUT( 5, line_out [5], OutputDepth );
 		NES_NTSC_RGB_OUT( 6, line_out [6], OutputDepth );
 		rgb_out = (char*) rgb_out + out_pitch;
-		}
 		
 		burst_phase = (burst_phase + 1) % nes_ntsc_burst_count;
 		input += in_row_width;
diff -urN fceux-2.2.2-orig/src/drivers/common/nes_ntsc.h fceux-2.2.2/src/drivers/common/nes_ntsc.h
--- fceux-2.2.2-orig/src/drivers/common/nes_ntsc.h	2010-05-22 05:42:05 +0900
+++ fceux-2.2.2/src/drivers/common/nes_ntsc.h	2016-03-30 12:49:04 +0900
@@ -54,15 +54,16 @@
 /* Initializes and adjusts parameters. Can be called multiple times on the same
 nes_ntsc_t object. Can pass NULL for either parameter. */
 typedef struct nes_ntsc_t nes_ntsc_t;
-void nes_ntsc_init( nes_ntsc_t* ntsc, nes_ntsc_setup_t const* setup, int bpp, int multiplier );
+void nes_ntsc_init( nes_ntsc_t* ntsc, nes_ntsc_setup_t const* setup, int bpp );
 
 /* Filters one or more rows of pixels. Input pixels are 6/9-bit palette indicies.
-In_row_width is the number of pixels to get to the next input row. Out_pitch
+In_row_width is the number of pixels to get to the next input row. Emphasis is
+the emphasis bits to bitwise-OR with all pixels in the input data. Out_pitch
 is the number of *bytes* to get to the next output row. Output pixel format
 is set by NES_NTSC_OUT_DEPTH (defaults to 16-bit RGB). */
 void nes_ntsc_blit( nes_ntsc_t const* ntsc, NES_NTSC_IN_T const* nes_in,
-		long in_row_width, int burst_phase, int in_width, int in_height,
-		void* rgb_out, long out_pitch );
+		long in_row_width, int burst_phase, int emphasis, int in_width,
+		int in_height, void* rgb_out, long out_pitch );
 
 /* Number of output pixels written by blitter for given input width. Width might
 be rounded down slightly; use NES_NTSC_IN_WIDTH() on result to find rounded
diff -urN fceux-2.2.2-orig/src/drivers/common/nes_ntsc_config.h fceux-2.2.2/src/drivers/common/nes_ntsc_config.h
--- fceux-2.2.2-orig/src/drivers/common/nes_ntsc_config.h	2010-05-22 05:42:05 +0900
+++ fceux-2.2.2/src/drivers/common/nes_ntsc_config.h	2016-03-30 12:49:04 +0900
@@ -5,7 +5,7 @@
 
 /* Uncomment to enable emphasis support and use a 512 color palette instead
 of the base 64 color palette. */
-/*#define NES_NTSC_EMPHASIS 1*/
+#define NES_NTSC_EMPHASIS 1
 
 /* The following affect the built-in blitter only; a custom blitter can
 handle things however it wants. */
@@ -21,7 +21,7 @@
 // CUSTOM: (XBuf uses bit 0x80, and has palettes above 0x3f for LUA)
 /* Each raw pixel input value is passed through this. You might want to mask
 the pixel index if you use the high bits as flags, etc. */
-#define NES_NTSC_ADJ_IN( in ) in & 0x3f
+#define NES_NTSC_ADJ_IN( in ) ((in & 0x3f) | emphasis)
 
 /* For each pixel, this is the basic operation:
 output_color = color_palette [NES_NTSC_ADJ_IN( NES_NTSC_IN_T )] */
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	2012-08-30 02:46:58 +0900
+++ fceux-2.2.2/src/drivers/common/vidblit.cpp	2016-03-30 12:55:37 +0900
@@ -27,6 +27,8 @@
 #include "../../utils/memory.h"
 #include "nes_ntsc.h"
 
+#include "../../ppu.h"  // for PPU[]
+
 nes_ntsc_t* nes_ntsc;
 uint8 burst_phase = 0;
 
@@ -86,8 +88,6 @@
  // -Video Modes Tag-
  if(specfilt == 3) // NTSC 2x
  {
-  int multi = (2 * 2);
-
   //nes_ntsc variables
   nes_ntsc_setup_t ntsc_setup = nes_ntsc_composite;
   
@@ -111,9 +111,9 @@
   nes_ntsc = (nes_ntsc_t*) FCEU_dmalloc( sizeof (nes_ntsc_t) );
 
   if ( nes_ntsc ) {
-  nes_ntsc_init( nes_ntsc, &ntsc_setup, b, 2 );
+  nes_ntsc_init( nes_ntsc, &ntsc_setup, b );
 
-  ntscblit = (uint8*)FCEU_dmalloc(256*257*b*multi); //Need to add multiplier for larger sizes
+  ntscblit = (uint8*)FCEU_dmalloc(602*257*b);
   }
 
  } // -Video Modes Tag-
@@ -731,15 +731,19 @@
    {
     case 4:
 	if ( nes_ntsc ) {
+	 const int outxr = 301;
 	 burst_phase ^= 1;
 	 nes_ntsc_blit( nes_ntsc, (unsigned char*)src, xr, burst_phase,
-	 xr, yr, ntscblit, xr * Bpp * xscale );
-	 
-	 //Multiply 4 by the multiplier on output, because it's 4 bpp
-	 //Top 2 lines = line 3, due to distracting flicker
-	 //memcpy(dest,ntscblit+(Bpp * xscale)+(Bpp * xr * xscale),(Bpp * xr * xscale));
-	 //memcpy(dest+(Bpp * xr * xscale),ntscblit+(Bpp * xscale)+(Bpp * xr * xscale * 2),(Bpp * xr * xscale));
-	 memcpy(dest+(Bpp * xr * xscale),ntscblit+(Bpp * xscale),(xr*yr*Bpp*xscale*yscale));
+	 (PPU[1] >> 5) << 6, xr, yr, ntscblit, (2*outxr) * Bpp );
+
+	 const uint8 *in = ntscblit + (Bpp * xscale);
+	 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);
+	 }
 	} else {
      pinc=pitch-((xr*xscale)<<2);
      for(y=yr;y;y--,src+=256-xr)
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	2013-06-27 10:58:10 +0900
+++ fceux-2.2.2/src/drivers/sdl/sdl-video.cpp	2016-03-30 12:58:26 +0900
@@ -312,6 +312,9 @@
 			} else {
 				s_exs = s_eys = 2;
 			}
+			if(s_sponge == 3) {
+				xres = 301 * s_exs;
+			}
 			s_eefx = 0;
 			if(s_sponge == 1 || s_sponge == 4) {
 				desbpp = 32;
@@ -365,6 +368,11 @@
 			s_eefx = 0;
 		}
 
+		int scrw = NWIDTH * s_exs;
+		if(s_sponge == 3) {
+			scrw = 301 * s_exs;
+		}
+
 #ifdef OPENGL
 		if(!s_useOpenGL) {
 			s_exs = (int)s_exs;
@@ -408,8 +416,7 @@
 		}
 #endif
         
-		s_screen = SDL_SetVideoMode((int)(NWIDTH * s_exs),
-								(int)(s_tlines * s_eys),
+		s_screen = SDL_SetVideoMode(scrw, (int)(s_tlines * s_eys),
 								desbpp, flags);
 		if(!s_screen) {
 			FCEUD_PrintError(SDL_GetError());
@@ -687,6 +694,13 @@
 		SDL_UnlockSurface(TmpScreen);
 	}
 
+	int scrw;
+	if(s_sponge == 3) {  // NTSC 2x
+		scrw = 301;
+	} else {
+		scrw = NWIDTH;
+	}
+
 	 // if we have a hardware video buffer, do a fast video->video copy
 	if(s_BlitBuf) {
 		SDL_Rect srect;
@@ -694,12 +708,12 @@
 
 		srect.x = 0;
 		srect.y = 0;
-		srect.w = NWIDTH;
+		srect.w = scrw;
 		srect.h = s_tlines;
 
 		drect.x = 0;
 		drect.y = 0;
-		drect.w = (Uint16)(s_exs * NWIDTH);
+		drect.w = (Uint16)(s_exs * scrw);
 		drect.h = (Uint16)(s_eys * s_tlines);
 
 		SDL_BlitSurface(s_BlitBuf, &srect, s_screen, &drect);
@@ -710,7 +724,7 @@
 	//TODO - SDL2
 #else
 	SDL_UpdateRect(s_screen, xo, yo,
-				(Uint32)(NWIDTH * s_exs), (Uint32)(s_tlines * s_eys));
+				(Uint32)(scrw * s_exs), (Uint32)(s_tlines * s_eys));
 #endif
 
 #ifdef CREATE_AVI
