diff -rdu snes9x-improvement11-beta15/Makefile.in snes9x-improvement11-beta15-lua0.05/Makefile.in
--- snes9x-improvement11-beta15/Makefile.in	Fri Jan 18 15:28:08 2008
+++ snes9x-improvement11-beta15-lua0.05/Makefile.in	Fri Feb 15 06:36:50 2008
@@ -19,6 +19,7 @@
 
 #Fairly good and special-char-safe descriptor of the os being built on.
 OS=`uname -s -r -m|sed \"s/ /-/g\"|tr \"[A-Z]\" \"[a-z]\"|tr \"/()\" \"___\"`
+# "
 BUILDDIR=.
 #BUILDDIR=build/$(OS)
 VPATH = @srcdir@
@@ -118,7 +119,8 @@
 	dsp1.o ppu.o dma.o snes9x.o data.o globals.o reader.o \
 	conffile.o \
 	$(SPC7110OBJ) $(OBC1OBJ) $(SETAOBJ) $(KREEDOBJ) $(SDD1OBJ) \
-	$(CHEATOBJ) $(PLATFORMOBJ) $(SNAPOBJ) $(SCREENSHOTOBJ) $(MOVIEOBJ)
+	$(CHEATOBJ) $(PLATFORMOBJ) $(SNAPOBJ) $(SCREENSHOTOBJ) $(MOVIEOBJ) \
+	logger.o lua-engine.o
 
 ifdef NETPLAY
 OBJECTS += netplay.o server.o
@@ -207,7 +209,7 @@
 $(KREEDDEFINES) \
 $(SDD1DEFINES) \
 $(JOYDEFINES) \
--DNO_INLINE_SET_GET @SYSDEFINES@
+@SYSDEFINES@
 
 #-DOLD_COLOUR_BLENDING
 #-DSOUND
diff -rdu snes9x-improvement11-beta15/Makefile.mingw snes9x-improvement11-beta15-lua0.05/Makefile.mingw
--- snes9x-improvement11-beta15/Makefile.mingw	Sat Jan 26 21:45:44 2008
+++ snes9x-improvement11-beta15-lua0.05/Makefile.mingw	Thu Feb 14 11:36:26 2008
@@ -6,7 +6,7 @@
 UNZIP=1
 JMA=1
 #GLIDE=1
-OPENGL=1
+#OPENGL=1
 ASMKREED=1
 SDD1_DECOMP=1
 #SDD1_VERIFY=0
@@ -54,7 +54,7 @@
 endif
 
 PLATFORMOBJ=win32/win32.o win32/directx.o win32/render.o win32/wsnes9x.o win32/wconfig.o \
-	win32/auxmath.o win32/AVIOutput.o win32/InputCustom.o win32/lazymacro.o snes9x.o \
+	win32/auxmath.o win32/AVIOutput.o win32/InputCustom.o win32/lazymacro.o snes9x.o snes9x-rc.o
 
 ifdef CHEATS
 	CHEATOBJ=cheats.o cheats2.o
@@ -93,9 +93,10 @@
 
 OBJECTS=$(CPUOBJ) $(SOUNDOBJ) apudebug.o $(FXOBJ) $(C4OBJ) \
 	cpu.o sa1.o debug.o sdd1.o tile.o srtc.o gfx.o memmap.o clip.o \
-	conffile.o dsp1.o ppu.o reader.o dma.o snes9x.o data.o globals.o \
+	conffile.o dsp1.o ppu.o reader.o dma.o data.o globals.o \
 	$(SPC7110OBJ) $(OBC1OBJ) $(SETAOBJ) $(KREEDOBJ) $(SDD1OBJ) \
-	$(CHEATOBJ) $(PLATFORMOBJ) $(SNAPOBJ) $(SCREENSHOTOBJ) $(MOVIEOBJ)
+	$(CHEATOBJ) $(PLATFORMOBJ) $(SNAPOBJ) $(SCREENSHOTOBJ) $(MOVIEOBJ) \
+	lua-engine.o $(LUAOBJECTS)
 
 ifdef NETPLAY
 	OBJECTS+=netplay.o server.o
@@ -135,18 +136,19 @@
 
 JOYDEFINES=-DJOYSTICK_SUPPORT
 
-AUDIODEFINES=-DFMOD_SUPPORT
+#AUDIODEFINES=-DFMOD_SUPPORT
 SOUNDENGINE=-lfmod -lmingw32
 
-CCC=c++
-CC=gcc
-GASM=c++
-NASM=nasmw
+CCC=/home/dehacked/mingw_cross_env-1.4/usr/bin/i386-mingw32msvc-g++
+CC=/home/dehacked/mingw_cross_env-1.4/usr/bin/i386-mingw32msvc-gcc
+GASM=$(CCC)
+NASM=nasm
 
-INCLUDES=-I. -Ii386 -Iunzip -I/mingw/include/FMOD 
+INCLUDES=-I. -Ii386 -Iunzip -Ifmod -Idxinc -L. -Ilua/src
 LDLIBS+=-lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -lcomctl32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -ladvapi32 -lwsock32 -lwinmm -lddraw -ldsound -ldxguid -lvfw32 -lz
 
-OPTIMISE=-O1 -mtune=pentium -fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -mwindows
+OPTIMISE=-O2 -march=pentium -fomit-frame-pointer -fno-exceptions -Wno-unused-parameter -mwindows
+#OPTIMISE=-g -fno-exceptions -mwindows -w
 
 CCFLAGS= \
 	-DZLIB \
@@ -154,7 +156,7 @@
 	-DCPU_SHUTDOWN \
 	-DSPC700_SHUTDOWN \
 	-DSDD1_DECOMP \
-	-DHAVE_STRINGS_H \
+	-DHAVE_STRINGS_H -DHAVE_STDINT_H \
 	-DNEW_COLOUR_BLENDING \
 	-DCORRECT_VRAM_READS \
 	-DJP_FIX \
@@ -189,13 +191,13 @@
 
 offsets.exe: offsets.o
 	$(CCC) $(INCLUDES) -o $@ offsets.o
-	offsets.exe > i386/offsets.h
+	DISPLAY=10.0.0.9:0.0 wine offsets.exe > i386/offsets.h
 
-snes9x.o: win32/rsrc/snes9x.rc win32/rsrc/resource.h
-	windres --use-temp-file -Iwin32/ -o win32/snes9x.o win32/rsrc/snes9x.rc
+snes9x-rc.o: win32/rsrc/snes9x.rc win32/rsrc/resource.h
+	/home/dehacked/mingw_cross_env-1.4/usr/bin/i386-mingw32msvc-windres --use-temp-file -Iwin32/ -o snes9x-rc.o win32/rsrc/snes9x.rc
 
 snes9x.exe: $(OBJECTS) $(MINGWOBJECTS)
-	$(CCC) $(INCLUDES) -Wl,--subsystem,windows -o $@ -s $(OBJECTS) $(LDLIBS) $(SOUNDENGINE) $(OPENGLLIBS)
+	$(CCC) $(INCLUDES) -Wl,--subsystem,windows -o $@ $(OBJECTS) $(LDLIBS) $(SOUNDENGINE) $(OPENGLLIBS) lua51.dll
 
 cpu.o:
 	$(CCC) $(INCLUDES) -c $(OPTIMISE) $(CCFLAGS) cpu.cpp -o $@
diff -rdu snes9x-improvement11-beta15/conffile.cpp snes9x-improvement11-beta15-lua0.05/conffile.cpp
--- snes9x-improvement11-beta15/conffile.cpp	Sat Jan 26 15:16:06 2008
+++ snes9x-improvement11-beta15-lua0.05/conffile.cpp	Mon Feb  4 08:51:46 2008
@@ -92,16 +92,17 @@
 *******************************************************************************/
 
 
+#include <string>
 
 #include <stdio.h>
 #include <time.h>
 #include <string.h>
-#include <string>
+//#include <string>
 
 #include "conffile.h"
 
 #ifdef __WIN32__
-#define snprintf _snprintf // needs ANSI compliant name
+//#define snprintf _snprintf // needs ANSI compliant name
 #endif
 
 #ifndef MAX
diff -rdu snes9x-improvement11-beta15/display.h snes9x-improvement11-beta15-lua0.05/display.h
--- snes9x-improvement11-beta15/display.h	Fri Jan 18 10:53:56 2008
+++ snes9x-improvement11-beta15-lua0.05/display.h	Tue Feb  5 11:08:12 2008
@@ -150,6 +150,9 @@
 const char *S9xGetDirectory (enum s9x_getdirtype dirtype);
 const char *S9xGetFilename (const char *extension, enum s9x_getdirtype dirtype);
 const char *S9xGetFilenameInc (const char *, enum s9x_getdirtype);
+
+const char *S9xGetSnapshotDirectory ();
+
 END_EXTERN_C
 
 #endif
diff -rdu snes9x-improvement11-beta15/dsp1.h snes9x-improvement11-beta15-lua0.05/dsp1.h
--- snes9x-improvement11-beta15/dsp1.h	Fri Mar  4 07:05:12 2005
+++ snes9x-improvement11-beta15-lua0.05/dsp1.h	Sat Jan 12 19:40:00 2008
@@ -123,9 +123,9 @@
 void S9xResetDSP1 ();
 uint8 S9xGetDSP (uint16 Address);
 void S9xSetDSP (uint8 Byte, uint16 Address);
-END_EXTERN_C
+//END_EXTERN_C
 
 extern struct SDSP1 DSP1;
-
+END_EXTERN_C
 #endif
 
diff -rdu snes9x-improvement11-beta15/getset.h snes9x-improvement11-beta15-lua0.05/getset.h
--- snes9x-improvement11-beta15/getset.h	Tue Feb 15 11:23:48 2005
+++ snes9x-improvement11-beta15-lua0.05/getset.h	Sun Feb 17 13:03:26 2008
@@ -97,24 +97,62 @@
 #include "spc7110.h"
 #include "obc1.h"
 #include "seta.h"
+#include "s9xlua.h"
+
 
 extern "C"
 {
 	extern uint8 OpenBus;
 }
 
-INLINE uint8 S9xGetByte (uint32 Address)
+
+
+#ifndef NO_INLINE_SET_GET
+
+
+// These are for when memmap.h doesn't define them. C++ requires
+// that the default parameter be defined in the prototype, and there can
+// NOT be two prototypes, so I find myself in an ugly situation.
+INLINE void S9xSetWord(uint16 Word, uint32 Address, bool free = false);
+INLINE void S9xSetByte(uint8 Byte, uint32 Address, bool free = false);
+INLINE uint8 S9xGetByte(uint32, bool free=false);
+INLINE uint16 S9xGetWord (uint32 Address, bool free=false);
+#endif
+
+INLINE void S9xLuaWriteInform(uint32 address) {
+
+	if (!(address >= 0x7e0000 && address <= 0x7fffff))
+		return;
+
+	int addr2 = address - 0x7e0000;
+	
+	// These might be better using binary arithmatic -- a shift and an AND
+	int slot = addr2 / 8;
+	int bits = addr2 % 8;
+	
+
+	
+	extern unsigned char lua_watch_bitfield[16384];
+	
+	// Check the slot
+	if (lua_watch_bitfield[slot] & (1 << bits))
+		S9xLuaWrite(address);
+
+}
+
+
+INLINE uint8 S9xGetByte (uint32 Address, bool free)
 {
     int block;
     uint8 *GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK];
 
-	if(!CPU.InDMA)
+	if(!CPU.InDMA && !free)
 		CPU.Cycles += Memory.MemorySpeed [block];
 
     if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
     {
 #ifdef CPU_SHUTDOWN
-		if (Memory.BlockIsRAM [block])
+		if (Memory.BlockIsRAM [block] && !free)
 			CPU.WaitAddress = CPU.PCAtOpcodeStart;
 #endif
 		return (*(GetAddress + (Address & 0xffff)));
@@ -194,24 +232,24 @@
     }
 }
 
-INLINE uint16 S9xGetWord (uint32 Address)
+INLINE uint16 S9xGetWord (uint32 Address, bool free)
 {
     if ((Address & 0x0fff) == 0x0fff)
     {
-		OpenBus=S9xGetByte (Address);
-		return (OpenBus | (S9xGetByte (Address + 1) << 8));
+		OpenBus=S9xGetByte (Address,free);
+		return (OpenBus | (S9xGetByte (Address + 1,free) << 8));
     }
     int block;
     uint8 *GetAddress = Memory.Map [block = (Address >> MEMMAP_SHIFT) & MEMMAP_MASK];
 
-	if(!CPU.InDMA)
+	if(!CPU.InDMA && !free)
 		CPU.Cycles += (Memory.MemorySpeed [block]<<1);
 
  
 	if (GetAddress >= (uint8 *) CMemory::MAP_LAST)
     {
 #ifdef CPU_SHUTDOWN
-		if (Memory.BlockIsRAM [block])
+		if (Memory.BlockIsRAM [block] && !free)
 			CPU.WaitAddress = CPU.PCAtOpcodeStart;
 #endif
 #ifdef FAST_LSB_WORD_ACCESS
@@ -317,7 +355,9 @@
     }
 }
 
-INLINE void S9xSetByte (uint8 Byte, uint32 Address)
+
+
+INLINE void S9xSetByteWrapped (uint8 Byte, uint32 Address, bool free = false)
 {
 #if defined(CPU_SHUTDOWN)
     CPU.WaitAddress = NULL;
@@ -325,7 +365,7 @@
     int block;
     uint8 *SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)];
 
-	if (!CPU.InDMA)
+	if (!CPU.InDMA && !free)
 		CPU.Cycles += Memory.MemorySpeed [block];
 
 	
@@ -333,8 +373,8 @@
     {
 #ifdef CPU_SHUTDOWN
 		SetAddress += Address & 0xffff;
-		if (SetAddress == SA1.WaitByteAddress1 ||
-			SetAddress == SA1.WaitByteAddress2)
+		if ((SetAddress == SA1.WaitByteAddress1 ||
+			SetAddress == SA1.WaitByteAddress2) && !free)
 		{
 			SA1.Executing = SA1.S9xOpcodes != NULL;
 			SA1.WaitCounter = 0;
@@ -433,12 +473,13 @@
     }
 }
 
-INLINE void S9xSetWord (uint16 Word, uint32 Address)
+
+INLINE void S9xSetWordWrapped (uint16 Word, uint32 Address, bool free)
 {
 	if((Address & 0x0FFF)==0x0FFF)
 	{
-		S9xSetByte(Word&0x00FF, Address);
-		S9xSetByte(Word>>8, Address+1);
+		S9xSetByteWrapped(Word&0x00FF, Address,free);
+		S9xSetByteWrapped(Word>>8, Address+1,free);
 		return;
 	}
 
@@ -448,7 +489,7 @@
     int block;
     uint8 *SetAddress = Memory.WriteMap [block = ((Address >> MEMMAP_SHIFT) & MEMMAP_MASK)];
 
-	if (!CPU.InDMA)
+	if (!CPU.InDMA && !free)
 		CPU.Cycles += Memory.MemorySpeed [block] << 1;
 
 
@@ -457,7 +498,7 @@
 #ifdef CPU_SHUTDOWN
 		SetAddress += Address & 0xffff;
 		if (SetAddress == SA1.WaitByteAddress1 ||
-			SetAddress == SA1.WaitByteAddress2)
+			SetAddress == SA1.WaitByteAddress2 && !free)
 		{
 			SA1.Executing = SA1.S9xOpcodes != NULL;
 			SA1.WaitCounter = 0;
@@ -709,6 +750,19 @@
 #endif
 		return (0);
     }
+}
+
+
+INLINE void S9xSetWord(uint16 Word, uint32 Address, bool free)
+{
+	S9xSetWordWrapped(Word,Address,free);
+	S9xLuaWriteInform(Address);
+}
+
+INLINE void S9xSetByte(uint8 Byte, uint32 Address, bool free)
+{
+	S9xSetByteWrapped(Byte,Address,free);
+	S9xLuaWriteInform(Address);
 }
 
 INLINE void S9xSetPCBase (uint32 Address)
diff -rdu snes9x-improvement11-beta15/gfx.cpp snes9x-improvement11-beta15-lua0.05/gfx.cpp
--- snes9x-improvement11-beta15/gfx.cpp	Sat Jan 26 20:53:50 2008
+++ snes9x-improvement11-beta15-lua0.05/gfx.cpp	Mon Feb  4 04:23:16 2008
@@ -101,14 +101,14 @@
 #include "movie.h"
 
 #include "font.h"
-static int font_width = 8;
-static int font_height = 9;
+int font_width = 8;
+int font_height = 9;
 
 // private text-displaying functions
 static void S9xDisplayPressedKeys ();
 static void S9xDisplayFrameRate ();
-static void S9xDisplayString (const char *string, int linesFromBottom=5, int pixelsFromLeft=1, bool allowWrap=true);
 static void S9xDisplayWatchedAddresses ();
+static void S9xDisplayString (const char *string, int linesFromBottom, int pixelsFromLeft, bool allowWrap);
 // shared params for the above functions and DisplayChar
 uint16* display_screen = NULL;
 int display_ppl, display_width, display_height;
diff -rdu snes9x-improvement11-beta15/i386/getset.S snes9x-improvement11-beta15-lua0.05/i386/getset.S
--- snes9x-improvement11-beta15/i386/getset.S	Mon Jul 12 13:50:56 2004
+++ snes9x-improvement11-beta15-lua0.05/i386/getset.S	Sun Feb 17 13:03:00 2008
@@ -508,8 +508,15 @@
 	ret
 
 
+.data
+	.align 4
+LuaStorage:
+	.byte 0,0,0,0
+
+.text
 .globl S9xSetByte
 S9xSetByte:
+	movl %edx, LuaStorage
 	pushl %eax
 #ifdef CPU_SHUTDOWN
 	movl $0, WaitAddress
@@ -549,6 +556,15 @@
 	popl %ecx
 	movb %cl, (%eax, %edx)
 #endif
+
+	pushl LuaStorage
+#if defined(__DJGCC) || defined(MICROSOFT_C) || defined(_WINDOWS) || defined(__WIN32__)
+	call _S9xLuaWriteCheck
+#else
+	call S9xLuaWriteCheck
+#endif
+	addl $4, %esp
+
 	ret
 
 .SBSpecial:
@@ -696,9 +712,11 @@
 	addl $8, %esp
 	ret
 
+
 .globl S9xSetWord
 
 S9xSetWord:
+	movl %edx, LuaStorage
 	pushl %eax
 
 	movl %edx, %eax
@@ -757,6 +775,15 @@
 	popl %ecx
 	movw %cx, (%eax, %edx)
 #endif
+
+	// Lua addition:
+	pushl LuaStorage
+#if defined(__DJGCC) || defined(MICROSOFT_C) || defined(_WINDOWS)  || defined(__WIN32__)
+	call _S9xLuaWriteCheck
+#else
+	call S9xLuaWriteCheck
+#endif
+	addl $4, %esp
 	ret
 
 .SWSpecial:
Only in snes9x-improvement11-beta15/i386: offsets.h
Only in snes9x-improvement11-beta15-lua0.05: logger.cpp
Only in snes9x-improvement11-beta15-lua0.05: logger.h
Only in snes9x-improvement11-beta15-lua0.05: lua-engine.cpp
diff -rdu snes9x-improvement11-beta15/memmap.cpp snes9x-improvement11-beta15-lua0.05/memmap.cpp
--- snes9x-improvement11-beta15/memmap.cpp	Sat Jan 26 17:19:38 2008
+++ snes9x-improvement11-beta15-lua0.05/memmap.cpp	Mon Feb  4 06:29:36 2008
@@ -89,7 +89,7 @@
 
 #include <string.h>
 #ifdef HAVE_STRINGS_H
-#include <strings.h>
+//#include <strings.h>
 #endif
 #include <ctype.h>
 #include <assert.h>
diff -rdu snes9x-improvement11-beta15/memmap.h snes9x-improvement11-beta15-lua0.05/memmap.h
--- snes9x-improvement11-beta15/memmap.h	Fri Jan 18 19:16:00 2008
+++ snes9x-improvement11-beta15-lua0.05/memmap.h	Fri Feb 15 06:24:04 2008
@@ -284,10 +284,10 @@
 void S9xAutoSaveSRAM ();
 
 #ifdef NO_INLINE_SET_GET
-uint8 S9xGetByte (uint32 Address);
-uint16 S9xGetWord (uint32 Address);
-void S9xSetByte (uint8 Byte, uint32 Address);
-void S9xSetWord (uint16 Byte, uint32 Address);
+uint8 S9xGetByte (uint32 Address, bool free=false);
+uint16 S9xGetWord (uint32 Address, bool free=false);
+void S9xSetByte (uint8 Byte, uint32 Address, bool free=false);
+void S9xSetWord (uint16 Byte, uint32 Address, bool free=false);
 void S9xSetPCBase (uint32 Address);
 uint8 *S9xGetMemPointer (uint32 Address);
 uint8 *GetBasePointer (uint32 Address);
diff -rdu snes9x-improvement11-beta15/movie.cpp snes9x-improvement11-beta15-lua0.05/movie.cpp
--- snes9x-improvement11-beta15/movie.cpp	Sat Jan 26 19:25:34 2008
+++ snes9x-improvement11-beta15-lua0.05/movie.cpp	Thu Jan 31 10:26:56 2008
@@ -126,6 +126,8 @@
 #include "netplay.h"
 #endif
 
+#include "s9xlua.h"
+
 #define SMV_MAGIC	0x1a564d53		// SMV0x1a
 #define SMV_VERSION	1
 #define SMV_HEADER_SIZE	32
@@ -1200,7 +1202,8 @@
 
 		Movie.CurrentFrame = current_frame;
 		Movie.MaxFrame = max_frame;
-		++Movie.RerecordCount;
+		if (!S9xLuaRerecordCountSkip())
+			++Movie.RerecordCount;
 
 		// when re-recording, update the sync info in the movie to the new settings as of the last re-record.
 		store_movie_settings();
diff -rdu snes9x-improvement11-beta15/port.h snes9x-improvement11-beta15-lua0.05/port.h
--- snes9x-improvement11-beta15/port.h	Fri Jan 18 15:19:54 2008
+++ snes9x-improvement11-beta15-lua0.05/port.h	Mon Feb  4 08:52:10 2008
@@ -105,6 +105,7 @@
 
 #ifndef ACCEPT_SIZE_T
 #ifdef __WIN32__
+//include <windef.h>
 #define ACCEPT_SIZE_T int
 #else
 #define ACCEPT_SIZE_T unsigned int
@@ -265,8 +266,8 @@
 void _splitpath (const char *path, char *drive, char *dir, char *fname,
 		 char *ext);
 #else /* __WIN32__ */
-#define strcasecmp stricmp
-#define strncasecmp strnicmp
+//#define strcasecmp stricmp
+//#define strncasecmp strnicmp
 #endif
 
 EXTERN_C void S9xGenerateSound ();
diff -rdu snes9x-improvement11-beta15/ppu.cpp snes9x-improvement11-beta15-lua0.05/ppu.cpp
--- snes9x-improvement11-beta15/ppu.cpp	Sat Jan 26 20:46:52 2008
+++ snes9x-improvement11-beta15-lua0.05/ppu.cpp	Wed Jan 30 06:03:32 2008
@@ -112,6 +112,8 @@
 EXTERN_C uint8 S9xSuperFXReadReg (uint32);
 #endif
 
+#include "s9xlua.h"
+
 uint32 justifiers=0xFFFF00AA;
 uint8 in_bit=0;
 
@@ -2900,7 +2902,10 @@
 
 	for (i = 0; i < 5; i++)
 	{
-		IPPU.Joypads [i] = S9xReadJoypad (i);
+		if (S9xLuaUsingJoypad(i))
+			IPPU.Joypads[i] = S9xLuaReadJoypad(i);
+		else
+			IPPU.Joypads [i] = S9xReadJoypad (i);
 	}
 
 	S9xMovieUpdate();
diff -rdu snes9x-improvement11-beta15/ppu.h snes9x-improvement11-beta15-lua0.05/ppu.h
--- snes9x-improvement11-beta15/ppu.h	Sat Jan 26 17:19:04 2008
+++ snes9x-improvement11-beta15-lua0.05/ppu.h	Sat Jan 12 19:40:16 2008
@@ -335,9 +335,11 @@
 	uint8 _5A22;
 } SnesModel;
 
+START_EXTERN_C
 extern SnesModel* Model;
 extern SnesModel M1SNES;
 extern SnesModel M2SNES;
+END_EXTERN_C
 
 #define MAX_5C77_VERSION 0x01
 #define MAX_5C78_VERSION 0x03
Only in snes9x-improvement11-beta15-lua0.05: s9xlua.h
diff -rdu snes9x-improvement11-beta15/snapshot.cpp snes9x-improvement11-beta15-lua0.05/snapshot.cpp
--- snes9x-improvement11-beta15/snapshot.cpp	Sat Jan 26 14:02:12 2008
+++ snes9x-improvement11-beta15-lua0.05/snapshot.cpp	Thu Feb 14 11:26:50 2008
@@ -1215,6 +1215,7 @@
 	if (local_dsp1)			 delete [] local_dsp1;
 	if (local_ippu)			 delete [] local_ippu;
 	if (local_gfx)			 delete [] local_gfx;
+	if (local_screenshot)		delete [] local_screenshot;
 
 	unfreezing_from_stream = false;
 
diff -rdu snes9x-improvement11-beta15/snes9x.cpp snes9x-improvement11-beta15-lua0.05/snes9x.cpp
--- snes9x-improvement11-beta15/snes9x.cpp	Sat Jan 26 11:12:34 2008
+++ snes9x-improvement11-beta15-lua0.05/snes9x.cpp	Tue Feb  5 11:38:06 2008
@@ -99,6 +99,10 @@
 #include "netplay.h"
 #include "gfx.h"
 
+#ifdef __linux
+#include "logger.h"
+#endif
+
 #ifdef DEBUGGER
 extern FILE *trace;
 #endif
@@ -265,14 +269,14 @@
     S9xMessage(S9X_INFO, S9X_USAGE, "");
 #endif
     S9xMessage(S9X_INFO, S9X_USAGE, "   DeHackEd's commands:");
-//    S9xMessage(S9X_INFO, S9X_USAGE, "-dumpstreams                    Save audio/video data to disk");
+    S9xMessage(S9X_INFO, S9X_USAGE, "-dumpstreams                    Save audio/video data to disk");
     S9xMessage(S9X_INFO, S9X_USAGE, "-mute                           Don't output audio to sound card, use with above.");
     S9xMessage(S9X_INFO, S9X_USAGE, "-upanddown                      Override protection from pressing");
     S9xMessage(S9X_INFO, S9X_USAGE, "                                left+right or up+down together");
-//    S9xMessage(S9X_INFO, S9X_USAGE, "-autodemo                       Start emulator playing a movie");
-//    S9xMessage(S9X_INFO, S9X_USAGE, "-maxframes <num>                Stop emulator after playing specified");
-//    S9xMessage(S9X_INFO, S9X_USAGE, "                                number of frames. Requires -dumpstreams");
-//    S9xMessage(S9X_INFO, S9X_USAGE, "-oldturbo                       Turbo button renders all frames, but slower");
+    S9xMessage(S9X_INFO, S9X_USAGE, "-autodemo                       Start emulator playing a movie");
+    S9xMessage(S9X_INFO, S9X_USAGE, "-maxframes <num>                Stop emulator after playing specified");
+    S9xMessage(S9X_INFO, S9X_USAGE, "                                number of frames. Requires -dumpstreams");
+    S9xMessage(S9X_INFO, S9X_USAGE, "-oldturbo                       Turbo button renders all frames, but slower");
     S9xMessage(S9X_INFO, S9X_USAGE, "");
     S9xExtraUsage();
 
@@ -752,26 +756,27 @@
              }
             }
 #endif
-/*
+#ifdef __linux
             else if (strcasecmp (argv[i], "-dumpstreams") == 0)
                 dumpstreams = 1;
             else if (strcasecmp (argv[i], "-maxframes") == 0)
                 maxframes = atoi(argv[++i]);
-*/
+#endif
             else if (strcasecmp (argv[i], "-mute") == 0)
                 Settings.Mute = 1;
             else if (strcasecmp (argv[i], "-upanddown") == 0)
                 Settings.UpAndDown = 1;
-/*
+
+#ifdef __linux
             else if (strcasecmp (argv[i], "-oldturbo") == 0)
-                Settings.OldTurbo = 1;
+                Settings.TurboSkipFrames = 0;
             else if (strcasecmp(argv[i], "-autodemo") == 0) {
 		i++;
 		if (!argv[i])
 			abort();
                 strcpy(autodemo, argv[i]);
             }
-*/
+#endif
             else if (strcasecmp(argv[i], "-keypress") == 0) // videologger output of controller 1
                 Settings.DisplayPressedKeys = 1;
             else if (strcasecmp(argv[i], "-keypress2") == 0) // S9xDisplayMessages output of all controllers and peripherals
diff -rdu snes9x-improvement11-beta15/snes9x.h snes9x-improvement11-beta15-lua0.05/snes9x.h
--- snes9x-improvement11-beta15/snes9x.h	Sat Jan 26 12:05:42 2008
+++ snes9x-improvement11-beta15-lua0.05/snes9x.h	Sun Feb 17 13:02:42 2008
@@ -92,11 +92,18 @@
 #ifndef _SNES9X_H_
 #define _SNES9X_H_
 
-#define VERSION "1.43+ v11 (beta15)"
+#define VERSION "1.43+ v11 (beta15 + lua 0.05)"
 
 #include <stdio.h>
 #include <stdlib.h>
 
+/*#define _MAX_DRIVE          3
+#define _MAX_FNAME          256
+#define _MAX_DIR            _MAX_FNAME
+#define _MAX_EXT            _MAX_FNAME
+#define _MAX_PATH           260
+*/
+
 #ifdef __WIN32__
 #include <windows.h>
 #include "win32/wsnes9x.h"
@@ -413,6 +420,7 @@
 #ifdef DEBUG_MAXCOUNT
     unsigned int MaxCount;
 #endif
+
 };
 
 struct SSNESGameFixes
diff -rdu snes9x-improvement11-beta15/unix/unix.cpp snes9x-improvement11-beta15-lua0.05/unix/unix.cpp
--- snes9x-improvement11-beta15/unix/unix.cpp	Fri Jan 18 17:03:24 2008
+++ snes9x-improvement11-beta15-lua0.05/unix/unix.cpp	Wed Feb  6 10:15:20 2008
@@ -86,9 +86,6 @@
   Super NES and Super Nintendo Entertainment System are trademarks of
   Nintendo Co., Limited and its subsidiary companies.
 *******************************************************************************/
-
-
-
 #include <signal.h>
 #include <errno.h>
 
@@ -144,6 +141,8 @@
 //typedef void (*SIG_PF)();
 //#endif
 
+#include <sys/select.h>
+
 #include "snes9x.h"
 #include "memmap.h"
 #include "debug.h"
@@ -156,7 +155,18 @@
 #include "soundux.h"
 #include "spc700.h"
 #include "spc7110.h"
-#include "conffile.h"
+#include "logger.h"
+
+#include "x11.h"
+#include "snapshot.h"
+
+#include "s9xlua.h"
+
+#ifdef SPCTOOL
+#include "spctool/spc700.h"
+extern "C" void TraceSPC (unsigned char *PC, unsigned short YA, unsigned char X,
+			  SPCFlags PS, unsigned char *SP);
+#endif
 
 #ifdef _NETPLAY_SUPPORT
 #include "netplay.h"
@@ -165,11 +175,13 @@
 uint32 joypads [5] = {0};
 int NumControllers = 5;
 
+fd_set waitfds;
+int maxwaitfds = -1;
+
 #ifdef JOYSTICK_SUPPORT
 #if defined(__linux)
 #include <linux/joystick.h>
 int js_fd [4] = {-1, -1, -1, -1};
-char *js_device [4] = {"/dev/js0", "/dev/js1", "/dev/js2", "/dev/js3"};
 int js_map_button [4][16] = {
     {
 	SNES_B_MASK, SNES_A_MASK, SNES_A_MASK,
@@ -197,35 +209,36 @@
     }
 };
 
+#if 0
+SNES_A_MASK, SNES_B_MASK, SNES_X_MASK, SNES_Y_MASK,
+		            SNES_TL_MASK, SNES_TR_MASK, SNES_START_MASK, SNES_SELECT_MASK,
+			    0, 0, 0, 0, 0, 0, 0, 0},
+			   {SNES_A_MASK, SNES_B_MASK, SNES_X_MASK, SNES_Y_MASK,
+			    SNES_TL_MASK, SNES_TR_MASK, SNES_START_MASK, SNES_SELECT_MASK,
+			    0, 0, 0, 0, 0, 0, 0, 0},
+			   {SNES_A_MASK, SNES_B_MASK, SNES_X_MASK, SNES_Y_MASK,
+			    SNES_TL_MASK, SNES_TR_MASK, SNES_START_MASK, SNES_SELECT_MASK,
+			    0, 0, 0, 0, 0, 0, 0, 0},
+			   {SNES_A_MASK, SNES_B_MASK, SNES_X_MASK, SNES_Y_MASK,
+			    SNES_TL_MASK, SNES_TR_MASK, SNES_START_MASK, SNES_SELECT_MASK,
+			    0, 0, 0, 0, 0, 0, 0, 0}};
+#endif
+char *js_device [4] = {"/dev/js0", "/dev/js1", "/dev/js2", "/dev/js3"};
 #endif
 
+int FromPause = 1;
+
 void InitJoysticks ();
 void ReadJoysticks ();
 #endif
 
-#if !defined(NOSOUND) && defined (__linux)
-#define CONFIGURABLE_SOUND_DEVICE
-    char *sound_device = "/dev/dsp";
-#endif
-#if !defined(NOSOUND) && defined (__sun)
-#define CONFIGURABLE_SOUND_DEVICE
-    char *sound_device = "/dev/audio";
-#endif
-
 void InitTimer ();
 void *S9xProcessSound (void *);
+void S9xProcessEvents(bool8 blocking);
 
 char *rom_filename = NULL;
 char *snapshot_filename = NULL;
 char *SDD1_pack = NULL;
-const char *base_dir="~" SLASH_STR ".snes96_snapshots";
-const char *snapshot_dir=base_dir;
-const char *sram_dir=base_dir;
-const char *screenshot_dir=base_dir;
-const char *spc_dir=base_dir;
-const char *patch_dir=base_dir;
-const char *rom_dir="." SLASH_STR "roms";
-const char *inc_format="%03d";
 
 //FIXME: I see no reason not to configureenable this for all Unixen
 #if defined(DEBUGGER) && (defined(__linux) || defined(__sun))
@@ -247,6 +260,13 @@
     exit (1);
 }
 
+static void S9xInfoMessage(const char *msg)
+{
+    S9xSetInfoString(msg);
+    if(Settings.Paused) puts(msg);
+}
+
+
 void S9xParseArg (char **argv, int &i, int argc)
 {
 #ifdef JOYSTICK_SUPPORT
@@ -381,37 +401,39 @@
 	S9xParseDisplayArg (argv, i, argc);
 }
 
-void S9xPostRomInit()
+#include "cheats.h"
+
+void sigcont(int number)
 {
+	printf("Sigcont\n");
+	::FromPause = 1;
 }
 
-#include "cheats.h"
-
 int main (int argc, char **argv)
 {
+    signal(SIGCONT, sigcont);
     if (argc < S9xMinCommandLineArgs ())
 	S9xUsage ();
 	
     ZeroMemory (&Settings, sizeof (Settings));
-
-	Settings.StopEmulation = TRUE;
-
+    Settings.HighSpeedSeek = 0;
 #ifdef JOYSTICK_SUPPORT
     Settings.JoystickEnabled = TRUE;
 #else
     Settings.JoystickEnabled = FALSE;
 #endif
-
-    Settings.SoundPlaybackRate = 5;
+    Settings.UpAndDown = 0;
+    Settings.SoundPlaybackRate = 4;
     Settings.Stereo = TRUE;
     Settings.SoundBufferSize = 0;
-    Settings.APUEnabled = Settings.NextAPUEnabled = TRUE;
-
-//    S9xLoadConfigFiles(argv, argc);
-
-//
     Settings.CyclesPercentage = 100;
     Settings.DisableSoundEcho = FALSE;
+#ifndef NOSOUND
+    Settings.APUEnabled = Settings.NextAPUEnabled = TRUE;
+    Settings.InterpolatedSound = TRUE;
+#else
+    Settings.APUEnabled = Settings.NextAPUEnabled = FALSE;
+#endif
     Settings.H_Max = SNES_CYCLES_PER_SCANLINE;
     Settings.SkipFrames = AUTO_FRAMERATE;
     Settings.ShutdownMaster = TRUE;
@@ -420,12 +442,12 @@
     Settings.FrameTime = Settings.FrameTimeNTSC;
     Settings.DisableSampleCaching = FALSE;
     Settings.DisableMasterVolume = FALSE;
-    Settings.InterpolatedSound = TRUE;
     Settings.Mouse = TRUE;
     Settings.SuperScope = TRUE;
     Settings.MultiPlayer5 = TRUE;
     Settings.ControllerOption = SNES_JOYPAD;
     Settings.Transparency = FALSE;
+//    Settings.SixteenBit = FALSE;
     Settings.SupportHiRes = FALSE;
     Settings.NetPlay = FALSE;
     Settings.ServerName [0] = 0;
@@ -438,26 +460,24 @@
     Settings.TurboMode = FALSE;
     Settings.TurboSkipFrames = 40;
     Settings.StretchScreenshots = 1;
-
-    Settings.AutoDisplayMessages = TRUE;
-
-    Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX;
-//
-
     rom_filename = S9xParseArgs (argv, argc);
 
     Settings.Transparency = Settings.ForceTransparency;
     if (Settings.ForceNoTransparency)
 	Settings.Transparency = FALSE;
 
+//    if (Settings.Transparency)
+//	Settings.SixteenBit = TRUE;
+
+    Settings.HBlankStart = (256 * Settings.H_Max) / SNES_HCOUNTER_MAX;
+
     if (!Memory.Init () || !S9xInitAPU())
 	OutOfMemory ();
 
-	Memory.PostRomInitFunc = S9xPostRomInit;
-
     S9xInitSound (Settings.SoundPlaybackRate, Settings.Stereo,
                   Settings.SoundBufferSize);
 
+    if (!Settings.APUEnabled)
 	S9xSetSoundMute (TRUE);
 
     uint32 saved_flags = CPU.Flags;
@@ -466,13 +486,9 @@
     S9xSetRenderPixelFormat (RGB565);
 #endif
 
-	bool8 loaded = FALSE;
-
     if (rom_filename)
-		loaded = Memory.LoadROM (rom_filename);
-	Settings.StopEmulation = !loaded;
-
-	if (!loaded && rom_filename)
+    {
+	if (!Memory.LoadROM (rom_filename))
 	{
 	    char dir [_MAX_DIR + 1];
 	    char drive [_MAX_DRIVE + 1];
@@ -493,18 +509,14 @@
 	    }
 	    _splitpath (fname, drive, dir, name, ext);
 	    _makepath (fname, drive, dir, name, ext);
-	    if ((Settings.StopEmulation = !Memory.LoadROM (fname)))
+	    if (!Memory.LoadROM (fname))
 	    {
 		fprintf (stderr, "Error opening: %s\n", rom_filename);
 		exit (1);
 	    }
-		loaded = TRUE;
 	}
-
-	if (loaded)
-	{
 	Memory.LoadSRAM (S9xGetFilename (".srm", SRAM_DIR));
-	S9xLoadCheatFile (S9xGetFilename (".cht", PATCH_DIR));
+	S9xLoadCheatFile (S9xGetFilename (".cht", CHEAT_DIR));
     }
     else
     {
@@ -597,18 +609,55 @@
 #endif
 
     InitTimer ();
-
+    if (!Settings.APUEnabled)
 	S9xSetSoundMute (FALSE);
 
+    /* FIXME: Is someone using this dead code, or should it go? */
+#if 0
+    {
+	FILE *fs = fopen ("test.bin", "r");
+	if (fs)
+	{
+	    memset (IAPU.RAM, 0, 1024 * 64);
+	    int bytes = fread (IAPU.RAM + 1024, 1, 13, fs);
+	    bytes = fread (IAPU.RAM + 1024, 1, 1024 * 63, fs);
+	    fclose (fs);
+#ifdef SPCTOOL
+	    _FixSPC (1024, 0, 0, 0, 0, 0xff);
+#else
+	    IAPU.PC = IAPU.RAM + 1024;
+#endif
+	    APU.Flags ^= TRACE_FLAG;
+	    extern FILE *apu_trace;
+	    if (APU.Flags & TRACE_FLAG)
+	    {
+#ifdef SPCTOOL
+		printf ("ENABLED\n");
+		_SetSPCDbg (TraceSPC);                   //Install debug handler
+#endif
+		if (apu_trace == NULL)
+		    apu_trace = fopen ("aputrace.log", "wb");
+	    }
+	    CPU.Cycles = 1024 * 10;
+	    APU_EXECUTE ();
+	    exit (0);
+	}
+    }
+#endif
+
     while (1)
     {
-	if (!Settings.Paused
+	if ((!Settings.Paused) || Settings.FrameAdvance || Settings.HighSpeedSeek > 0 || S9xLuaSpeed() > 0
 #ifdef DEBUGGER
 	    || (CPU.Flags & (DEBUG_MODE_FLAG | SINGLE_STEP_FLAG))
 #endif
            )
+           {
+            Settings.FrameAdvance = 0;
 	    S9xMainLoop ();
+	    S9xLuaFrameBoundary();
 
+           }
 	if (Settings.Paused
 #ifdef DEBUGGER
 	    || (CPU.Flags & DEBUG_MODE_FLAG)
@@ -625,10 +674,11 @@
 	}
 	else
 #endif
-	if (Settings.Paused)
+	if (Settings.Paused && !Settings.HighSpeedSeek)
 	{
 	    S9xProcessEvents (FALSE);
-	    usleep(100000);
+            fd_set copy = waitfds;
+	    select(maxwaitfds+1, &copy, NULL, NULL, NULL);
 	}
 
 #ifdef JOYSTICK_SUPPORT
@@ -656,14 +706,13 @@
 
 void S9xExit ()
 {
-	Settings.StopEmulation = TRUE;
   if(Settings.SPC7110)
     (*CleanUp7110)();
 
    S9xSetSoundMute (TRUE);
     S9xDeinitDisplay ();
     Memory.SaveSRAM (S9xGetFilename (".srm", SRAM_DIR));
-    S9xSaveCheatFile (S9xGetFilename (".cht", PATCH_DIR));
+    S9xSaveCheatFile (S9xGetFilename (".cht", CHEAT_DIR));
     Memory.Deinit ();
     S9xDeinitAPU ();
 
@@ -686,7 +735,7 @@
 void InitJoysticks ()
 {
 #ifdef JSIOCGVERSION
-    int version, j;
+    int version;
     unsigned char axes, buttons;
 
     if ((js_fd [0] = open (js_device [0], O_RDONLY | O_NONBLOCK)) < 0)
@@ -698,6 +747,7 @@
 	return;
     }
 
+/*
     if (ioctl (js_fd [0], JSIOCGVERSION, &version))
     {
         fprintf(stderr, "joystick: You need at least driver version 1.0"
@@ -705,42 +755,222 @@
 	close (js_fd [0]);
 	return;
     }
-    for(j=1; j<4; j++){
-        js_fd [j] = open (js_device [j], O_RDONLY | O_NONBLOCK);
-    }
+*/
+    FD_SET(js_fd[0], &waitfds);
+    js_fd [1] = open (js_device [1], O_RDONLY | O_NONBLOCK);
+    if (js_fd[1] >= 0) FD_SET(js_fd[1], &waitfds);
+    js_fd [2] = open (js_device [2], O_RDONLY | O_NONBLOCK);
+    if (js_fd[2] >= 0) FD_SET(js_fd[2], &waitfds); 
+
+    js_fd [3] = open (js_device [3], O_RDONLY | O_NONBLOCK);
+    if (js_fd[3] >= 0) FD_SET(js_fd[3], &waitfds); 
 
+#define MAX(a,b) ((a) > (b) ? (a) : (b))
+
+    maxwaitfds = MAX(MAX(maxwaitfds, js_fd[0]),MAX(js_fd[1], MAX(js_fd[2], js_fd[3])));
+
+#undef MAX
+/*
 #ifdef JSIOCGNAME
     char name [130];
     bzero (name, 128);
     if (ioctl (js_fd [0], JSIOCGNAME(128), name) > 0) 
     {
-        printf ("Using %s (%s) as pad1\n", name, js_device [0]);
-        for(j=1; j<4; j++){
-            if (js_fd [j] > 0)
-            {
-                ioctl (js_fd [j], JSIOCGNAME(128), name);
-                printf ("  and %s (%s) as pad%d\n", name, js_device [j], j+1);
-            }
-        }
+        printf ("Using %s (%s) as pad1", name, js_device [0]);
+        if (js_fd [1] > 0)
+	{
+	    ioctl (js_fd [1], JSIOCGNAME(128), name);
+	    printf ("and %s (%s) as pad2", name, js_device [1]);
+	}
     } 
     else
 #endif
     {
 	ioctl (js_fd [0], JSIOCGAXES, &axes);
 	ioctl (js_fd [0], JSIOCGBUTTONS, &buttons);
-	printf ("Using %d-axis %d-button joystick (%s) as pad1\n", axes, buttons, js_device [0]);
-		for(j=1; j<4; j++){
-			if (js_fd [j] > 0)
-			{
-				ioctl (js_fd [j], JSIOCGAXES, &axes);
-				ioctl (js_fd [j], JSIOCGBUTTONS, &buttons);
-				printf (" and %d-axis %d-button (%s) as pad%d\n", axes, buttons, js_device [j], j+1);
-			}
+	printf ("Using %d-axis %d-button joystick (%s) as pad1", axes, buttons, js_device [0]);
+	if (js_fd [1] > 0)
+	{
+	    ioctl (js_fd [0], JSIOCGAXES, &axes);
+	    ioctl (js_fd [0], JSIOCGBUTTONS, &buttons);
+	    printf (" and %d-axis %d-button (%s) as pad2", axes, buttons, js_device [1]);
+	}
+    }
+*/
+    puts (".");
+#endif
+}
+
+
+#ifdef DEHACKED_JOYPAD
+
+int js_ss_slot = 100;
+int js_ss_press = 0;
+
+
+void ReadJoysticks ()
+{
+
+#ifdef JSIOCGVERSION
+    struct js_event js_ev;
+    int i;
+
+    for (i = 0; i < 4 && js_fd [i] >= 0; i++)
+    {
+	while (read (js_fd[i], &js_ev, sizeof (struct js_event)) == sizeof (struct js_event) )
+	{
+	    switch (js_ev.type & ~JS_EVENT_INIT)
+	    {
+	    case JS_EVENT_AXIS:
+		if (js_ev.number == 4)
+		{
+		    if(js_ev.value < -16384)
+		    {
+			joypads [i] |= SNES_LEFT_MASK; 
+			joypads [i] &= ~SNES_RIGHT_MASK;
+			break;
+		    }
+		    if (js_ev.value > 16384)
+		    {
+			joypads [i] &= ~SNES_LEFT_MASK;
+			joypads [i] |= SNES_RIGHT_MASK; 
+			break;
+		    }
+		    joypads [i] &= ~SNES_LEFT_MASK;
+		    joypads [i] &= ~SNES_RIGHT_MASK;
+		    break;	
 		}
+
+		if (js_ev.number == 5)
+		{
+		    if (js_ev.value < -16384)
+		    {
+			joypads [i] |= SNES_UP_MASK; 
+			joypads [i] &= ~SNES_DOWN_MASK;
+			break;
+		    }
+		    if (js_ev.value > 16384)
+		    {
+			joypads [i] &= ~SNES_UP_MASK;
+			joypads [i] |= SNES_DOWN_MASK; 
+			break;
+		    }
+		    joypads [i] &= ~SNES_UP_MASK;
+		    joypads [i] &= ~SNES_DOWN_MASK;
+		    break;	
+		}
+		
+		if (js_ev.number == 0)
+		{
+		
+		    if (js_ev.value < -16384 && !js_ss_press)
+		    {
+		    	js_ss_slot--;
+		    	fprintf(stderr, "\nNew savestate slot: %d\n", js_ss_slot);
+			js_ss_press=1;
+		    	break;
+		    }
+		    if (js_ev.value > 16384 && !js_ss_press)
+		    {
+		    	js_ss_slot++;
+		    	fprintf(stderr, "\nNew savestate slot: %d\n", js_ss_slot);
+		    	js_ss_press = 1;
+		    	break;
+		    }
+		    if (js_ev.value == 0)
+			    js_ss_press = 0;
+		    break;
+		}
+		// if (js_ev.number == 3) // axis not used...
+		
+		if (js_ev.number == 2)
+		{
+		    if (js_ev.value > 16384 || js_ev.value < -16384)
+		    {
+			joypads [i] &= ~(SNES_TL_MASK | SNES_TR_MASK);
+			joypads [i] |= SNES_TL_MASK | SNES_TR_MASK; 
+			break;
+		    }
+		    joypads [i] &= ~SNES_TR_MASK;
+		    joypads [i] &= ~SNES_TR_MASK;
+		    break;
+		}
+		if (js_ev.number == 3)
+		{
+		    if (js_ev.value < -16384)
+		    {
+			joypads [i] |= SNES_TL_MASK; 
+			joypads [i] &= ~SNES_TR_MASK;
+			break;
+		    }
+		    if (js_ev.value > 16384)
+		    {
+			joypads [i] &= ~SNES_TL_MASK;
+			joypads [i] |= SNES_TR_MASK; 
+			break;
+		    }
+		    joypads [i] &= ~SNES_TL_MASK;
+		    joypads [i] &= ~SNES_TR_MASK;
+		    break;	
+		}
+
+		break;
+
+	    case JS_EVENT_BUTTON:
+		if (js_ev.number > 15)
+		    break;
+
+		if (js_ev.value)
+                {
+                    if (js_ev.number == 6 || js_ev.number == 7)
+                        Settings.FrameAdvance++;
+                    else if (js_ev.number == 4)
+                    {
+	                    char def [PATH_MAX];
+	                    char filename [PATH_MAX];
+	                    char drive [_MAX_DRIVE];
+	                    char dir [_MAX_DIR];
+	                    char ext [_MAX_EXT];
+	
+	                    _splitpath (Memory.ROMFilename, drive, dir, def, ext);
+	                    sprintf (filename, "%s%s%s.%03d",
+	                             S9xGetSnapshotDirectory (), SLASH_STR, def,
+	                             js_ss_slot);
+			    S9xFreezeGame (filename);
+                            S9xInfoMessage ("Joypad savestate OK");
+                    }
+                    else if (js_ev.number == 5)
+                    {
+	                    char def [PATH_MAX];
+	                    char filename [PATH_MAX];
+	                    char drive [_MAX_DRIVE];
+	                    char dir [_MAX_DIR];
+	                    char ext [_MAX_EXT];
+	
+	                    _splitpath (Memory.ROMFilename, drive, dir, def, ext);
+	                    sprintf (filename, "%s%s%s.%03d",
+	                             S9xGetSnapshotDirectory (), SLASH_STR, def,
+	                             js_ss_slot);
+	                    if (S9xUnfreezeGame (filename))
+	                    {
+	                        S9xInfoMessage ("Joypad loadstate OK");
+	                    }
+
+                    }
+                    else
+		        joypads [i] |= js_map_button [i][js_ev.number];
+                }
+		else
+		    joypads [i] &= ~js_map_button [i][js_ev.number];
+
+		break;
+	    }
 	}
+    }
 #endif
 }
 
+#else // DEHACKED_JOYPAD
 void ReadJoysticks ()
 {
 #ifdef JSIOCGVERSION
@@ -773,7 +1003,7 @@
 		    break;	
 		}
 
-		if (js_ev.number == 1)
+		else if (js_ev.number == 1)
 		{
 		    if (js_ev.value < -16384)
 		    {
@@ -791,7 +1021,7 @@
 		    joypads [i] &= ~SNES_DOWN_MASK;
 		    break;	
 		}
-
+//		else printf("Movement on unknown joystick axis %d\n", js_ev.number);
 		break;
 
 	    case JS_EVENT_BUTTON:
@@ -799,7 +1029,14 @@
 		    break;
 
 		if (js_ev.value)
-		    joypads [i] |= js_map_button [i][js_ev.number];
+		{
+/*                    if (js_ev.number == 6 || js_ev.number == 7)
+                        Settings.FrameAdvance = 1;
+                    else if (js_ev.number == 10)
+			Settings.Paused = !Settings.Paused, ::FromPause=1;
+		    else*/
+		        joypads [i] |= js_map_button [i][js_ev.number];
+		}
 		else
 		    joypads [i] &= ~js_map_button [i][js_ev.number];
 
@@ -809,16 +1046,25 @@
     }
 #endif
 }
+
+#endif // DEHACKED_JOYPAD
+
+
 #endif // defined (JOYSTICK_SUPPORT)
 
+const char *GetHomeDirectory ()
+{
+    return (getenv ("HOME"));
+}
+
 START_EXTERN_C
 char* osd_GetPackDir()
 {
   static char filename[_MAX_PATH];
   memset(filename, 0, _MAX_PATH);
   
-  if(strlen(S9xGetDirectory(PATCH_DIR))!=0)
-    strcpy (filename, S9xGetDirectory(PATCH_DIR));
+  if(strlen(S9xGetSnapshotDirectory())!=0)
+    strcpy (filename, S9xGetSnapshotDirectory());
   else
   {
     char dir [_MAX_DIR + 1];
@@ -861,102 +1107,100 @@
 }
 END_EXTERN_C
 
-const char *S9xGetDirectory (enum s9x_getdirtype dirtype)
+const char *S9xGetSnapshotDirectory ()
 {
-    static char filename [PATH_MAX+1];
-    const char *s, *b;
-    bool md=false;
-
-    switch(dirtype){
-      default:
-      case DEFAULT_DIR:     s=base_dir; md=true; break;
-      case HOME_DIR:        s=getenv("HOME"); break;
-      case ROM_DIR:         s=rom_dir; break;
-      case SNAPSHOT_DIR:    s=snapshot_dir; break;
-      case SRAM_DIR:        s=sram_dir; break;
-	  case BIOS_DIR:        s=sram_dir; break;
-      case SCREENSHOT_DIR:  s=screenshot_dir; break;
-      case SPC_DIR:         s=spc_dir; break;
-      case PATCH_DIR:       s=patch_dir; break;
-      case ROMFILENAME_DIR:
-        strcpy(filename, Memory.ROMFilename);
-        for(int i=strlen(filename); i>=0; i--){
-            if(filename[i]==SLASH_CHAR){
-                filename[i]='\0';
-                break;
-            }
-        }
-        return filename;
-    }
-
-    b=NULL;
-    if(dirtype!=HOME_DIR){
-        if(s[0]==SLASH_CHAR){
-            b=NULL;
-        } else if(s[0]=='~' && s[1]==SLASH_CHAR){
-            b=getenv("HOME");
-            md=true;
-            s+=2;
-        } else if(s[0]=='.' && s[1]==SLASH_CHAR){
-            b=NULL;
-        } else if(dirtype!=DEFAULT_DIR){
-            b=S9xGetDirectory(DEFAULT_DIR);
-            md=true;
-        } else {
-            b=NULL;
-        }
-    }
-
-    if(b==filename){
-        int l=strlen(filename);
-        snprintf(filename+l, sizeof(filename)-l, SLASH_STR "%s", s);
-    } else if(b){
-        snprintf(filename, sizeof(filename), "%s" SLASH_STR "%s", b, s);
-    } else {
-        snprintf(filename, sizeof(filename), "%s", s);
-    }
-    if(md){
-        if(mkdir(filename, 0777)==0)
-            chown(filename, getuid (), getgid ());
+    static char filename [PATH_MAX];
+    const char *snapshot;
+    
+    if (!(snapshot = getenv ("SNES9X_SNAPSHOT_DIR")) &&
+	!(snapshot = getenv ("SNES96_SNAPSHOT_DIR")))
+    {
+	const char *home = GetHomeDirectory ();
+	strcpy (filename, home);
+	strcat (filename, SLASH_STR);
+	strcat (filename, ".snes96_snapshots");
+	mkdir (filename, 0777);
+	chown (filename, getuid (), getgid ());
     }
+    else
+	return (snapshot);
 
-    return filename;
+    return (filename);
 }
 
-const char *S9xGetFilename (const char *ex, enum s9x_getdirtype dirtype)
+const char *S9xGetFilename (const char *ex)
 {
     static char filename [PATH_MAX + 1];
-    char dir [_MAX_DIR + 1];
     char drive [_MAX_DRIVE + 1];
+    char dir [_MAX_DIR + 1];
     char fname [_MAX_FNAME + 1];
     char ext [_MAX_EXT + 1];
+
     _splitpath (Memory.ROMFilename, drive, dir, fname, ext);
-    snprintf(filename, sizeof(filename), "%s" SLASH_STR "%s%s",
-             S9xGetDirectory(dirtype), fname, ex);
+    strcpy (filename, S9xGetSnapshotDirectory ());
+    strcat (filename, SLASH_STR);
+    strcat (filename, fname);
+    strcat (filename, ex);
+
     return (filename);
 }
 
-const char *S9xGetFilenameInc (const char *e, enum s9x_getdirtype dirtype)
+const char *S9xGetFilenameInc (const char *e)
 {
-    static char filename [PATH_MAX + 1];
-    char dir [_MAX_DIR + 1];
+    static char filename [_MAX_PATH + 1];
     char drive [_MAX_DRIVE + 1];
+    char dir [_MAX_DIR + 1];
     char fname [_MAX_FNAME + 1];
     char ext [_MAX_EXT + 1];
-    unsigned int i=0;
+    char *ptr;
     struct stat buf;
-    const char *d;
 
-    _splitpath (Memory.ROMFilename, drive, dir, fname, ext);
-    d=S9xGetDirectory(dirtype);
-    do {
-        snprintf(filename, sizeof(filename), inc_format, d, fname, i, e);
-        i++;
-    } while(stat(filename, &buf)==0 && i!=0);
+    if (strlen (S9xGetSnapshotDirectory()))
+    {
+        _splitpath (Memory.ROMFilename, drive, dir, fname, ext);
+        strcpy (filename, S9xGetSnapshotDirectory());
+        strcat (filename, "/");
+        strcat (filename, fname);
+        ptr = filename + strlen (filename);
+        strcat (filename, "00/");
+        strcat (filename, e);
+    }
+    else
+    {
+        _splitpath (Memory.ROMFilename, drive, dir, fname, ext);
+        strcat (fname, "00/");
+        _makepath (filename, drive, dir, fname, e);
+        ptr = strstr (filename, "00/");
+    }
+
+    do
+    {
+        if (++*(ptr + 2) > '9')
+        {
+            *(ptr + 2) = '0';
+            if (++*(ptr + 1) > '9')
+            {
+                *(ptr + 1) = '0';
+                if (++*ptr > '9')
+                    break;
+            }
+        }
+    } while( stat(filename, &buf) == 0 );
 
     return (filename);
 }
 
+const char *S9xGetROMDirectory ()
+{
+    const char *roms;
+    
+    if (!(roms = getenv ("SNES9X_ROM_DIR")) &&
+	!(roms = getenv ("SNES96_ROM_DIR")))
+	return ("." SLASH_STR "roms");
+    else
+	return (roms);
+}
+
 const char *S9xBasename (const char *f)
 {
     const char *p;
@@ -981,7 +1225,7 @@
     const char *filename;
 
     S9xSetSoundMute (TRUE);
-    filename = S9xSelectFilename (def, S9xGetDirectory (SNAPSHOT_DIR), "s96", title);
+    filename = S9xSelectFilename (def, S9xGetSnapshotDirectory (), "s96", title);
     S9xSetSoundMute (FALSE);
     return (filename);
 }
@@ -999,13 +1243,13 @@
 	(*dir == '.' && (*(dir + 1) == '/'
         )))
     {
-	strncpy (filename, fname, PATH_MAX);
+	strcpy (filename, fname);
 	if (!*ext)
 	    strcat (filename, ".s96");
     }
     else
     {
-	strcpy (filename, S9xGetDirectory (SNAPSHOT_DIR));
+	strcpy (filename, S9xGetSnapshotDirectory ());
 	strcat (filename, SLASH_STR);
 	strcat (filename, fname);
 	if (!*ext)
@@ -1061,7 +1305,10 @@
 
 bool8 S9xDeinitUpdate (int Width, int Height)
 {
+    S9xLuaGui((uint16*)GFX.Screen,GFX.Pitch/2, Width, Height);
     S9xPutImage (Width, Height);
+    if (!Settings.SoundSync)
+    	S9xGenerateSound();
     return (TRUE);
 }
 
@@ -1108,47 +1355,45 @@
     }
 }
 
-void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext)
+void _splitpath (const char *path, char *drive, char *dir, char *fname,
+		 char *ext)
 {
-  *drive = 0;
+    *drive = 0;
 
-  char *slash = strrchr(path, SLASH_CHAR);
-  char *dot = strrchr(path, '.');
+    char *slash = strrchr (path, '/');
+    if (!slash)
+	slash = strrchr (path, '\\');
 
-  if (dot && slash && dot < slash)
-  {
-    dot = 0;
-  }
+    char *dot = strrchr (path, '.');
 
-  if (!slash)
-  {
-    *dir = 0;
-    strcpy(fname, path);
-    if (dot)
-    {
-      fname[dot - path] = 0;
-      strcpy(ext, dot + 1);
-    }
-    else
-    {
-      *ext = 0;
-    }
-  }
-  else
-  {
-    strcpy(dir, path);
-    dir[slash - path] = 0;
-    strcpy(fname, slash + 1);
-    if (dot)
+    if (dot && slash && dot < slash)
+	dot = NULL;
+
+    if (!slash)
     {
-      fname[(dot - slash) - 1] = 0;
-      strcpy(ext, dot + 1);
+	strcpy (dir, "");
+	strcpy (fname, path);
+        if (dot)
+        {
+	    *(fname + (dot - path)) = 0;
+	    strcpy (ext, dot + 1);
+        }
+	else
+	    strcpy (ext, "");
     }
     else
     {
-      *ext = 0;
+	strcpy (dir, path);
+	*(dir + (slash - path)) = 0;
+	strcpy (fname, slash + 1);
+        if (dot)
+	{
+	    *(fname + (dot - slash) - 1) = 0;
+    	    strcpy (ext, dot + 1);
+	}
+	else
+	    strcpy (ext, "");
     }
-  }
 }
 
 void S9xToggleSoundChannel (int c)
@@ -1162,10 +1407,8 @@
 
 static void SoundTrigger ()
 {
-#ifndef NOSOUND
     if (Settings.APUEnabled && !so.mute_sound)
 	S9xProcessSound (NULL);
-#endif
 }
 
 void StopTimer ()
@@ -1176,12 +1419,13 @@
     timeout.it_interval.tv_usec = 0;
     timeout.it_value.tv_sec = 0;
     timeout.it_value.tv_usec = 0;
-    if (setitimer (ITIMER_REAL, &timeout, NULL) < 0)
-	perror ("setitimer");
+//    if (setitimer (ITIMER_REAL, &timeout, NULL) < 0)
+//	perror ("setitimer");
 }
 
 void InitTimer ()
 {
+    return;
     struct itimerval timeout;
     struct sigaction sa;
     
@@ -1218,6 +1462,9 @@
 
 void S9xSyncSpeed ()
 {
+    IPPU.RenderThisFrame = TRUE;
+    if (dumpstreams == 1 && !Settings.HighSpeedSeek)
+    	return;
 #ifdef _NETPLAY_SUPPORT
     if (Settings.NetPlay)
     {
@@ -1234,6 +1481,8 @@
 	    IPPU.RenderThisFrame = TRUE;
 	    IPPU.SkippedFrames = 0;
 	}
+	// Don't skip frames. EVER.
+	/*
 	else
 	{
 	    if (IPPU.SkippedFrames < 10)
@@ -1247,6 +1496,7 @@
 		IPPU.SkippedFrames = 0;
 	    }
 	}
+	*/
     }
     else
 #endif
@@ -1260,10 +1510,11 @@
     }
 #endif
 
-    if (Settings.TurboMode)
+    if (Settings.TurboMode || Settings.HighSpeedSeek)
     {
-        if(++IPPU.FrameSkip >= Settings.TurboSkipFrames)
-        {
+//        if(++IPPU.FrameSkip >= Settings.TurboSkipFrames || !Settings.HighSpeedSeek)
+       if (IPPU.SkippedFrames >= Settings.TurboSkipFrames && !Settings.HighSpeedSeek) 
+       {
             IPPU.FrameSkip = 0;
             IPPU.SkippedFrames = 0;
             IPPU.RenderThisFrame = TRUE;
@@ -1272,7 +1523,11 @@
         {
             ++IPPU.SkippedFrames;
             IPPU.RenderThisFrame = FALSE;
+            Logger_NextFrame();
+            FromPause = 1;
         }
+        if (Settings.HighSpeedSeek > 0)
+        	Settings.HighSpeedSeek--;
         return;
     }
     
@@ -1288,6 +1543,9 @@
 
     CHECK_SOUND(); S9xProcessEvents(FALSE);
 
+    if (S9xLuaSpeed() > 0)
+    	return;
+
     while (gettimeofday (&now, NULL) < 0) ;
     
     /* If there is no known "next" frame, initialize it now */
@@ -1300,30 +1558,48 @@
     unsigned limit = Settings.SkipFrames == AUTO_FRAMERATE
                      ? (timercmp(&next1, &now, <) ? 10 : 1)
                      : Settings.SkipFrames;
-    
-    IPPU.RenderThisFrame = ++IPPU.SkippedFrames >= limit;
-    if(IPPU.RenderThisFrame)
-    {
-        IPPU.SkippedFrames = 0;
-    }
-    else
-    {
-        /* If we were behind the schedule, check how much it is */
-        if(timercmp(&next1, &now, <))
-        {
-            unsigned lag =
-                (now.tv_sec - next1.tv_sec) * 1000000
-               + now.tv_usec - next1.tv_usec;
-            if(lag >= 1000000)
-            {
-                /* More than a second behind means probably
-                 * pause. The next line prevents the magic
-                 * fast-forward effect.
-                 */
-                next1 = now;
-            }
-        }
-    }
+
+
+
+
+      if (FromPause)
+      {
+      	next1 = now;
+      	FromPause = 0;
+      }
+      else
+      {
+            // Unforseen events, such as SIGSTOP, severe system lag, etc
+            unsigned lag = (now.tv_sec - next1.tv_sec) * 1000000 + now.tv_usec - next1.tv_usec;
+
+            // I'm using 0.25 of a second instead of 1.00
+//            if (lag >= 250000)
+//               next1 = now;
+      
+      }
+//    IPPU.RenderThisFrame = ++IPPU.SkippedFrames >= limit;
+//    if(IPPU.RenderThisFrame)
+//    {
+//        IPPU.SkippedFrames = 0;
+//    }
+//    else
+//    {
+//        /* If we were behind the schedule, check how much it is */
+//        if(timercmp(&next1, &now, <))
+//        {
+//            unsigned lag =
+//                (now.tv_sec - next1.tv_sec) * 1000000
+//               + now.tv_usec - next1.tv_usec;
+//            if(lag >= 1000000)
+//            {
+//                /* More than a second behind means probably
+//                 * pause. The next line prevents the magic
+//                 * fast-forward effect.
+//                 */
+//                next1 = now;
+//            }
+//        }
+//    }
     
     /* Delay until we're completed this frame */
 
@@ -1593,13 +1869,8 @@
     /* SUN version */
     int i;
 
-#if defined(CONFIGURABLE_SOUND_DEVICE)
-    if ((so.sound_fd = open (sound_device, O_WRONLY)) < 0)
-        return (FALSE);
-#else
     if ((so.sound_fd = open ("/dev/audio", O_WRONLY)) < 0)
-        return (FALSE);
-#endif
+	return (FALSE);
 
     audio_info_t audio;
 
@@ -1654,24 +1925,33 @@
 {
     /* Linux version (OSS) */
     int J, K;
-    so.stereo = stereo;
-    so.playback_rate = Rates[mode & 0x07];
-    so.sixteen_bit = TRUE;
 
-    if (!Settings.Mute) {
-#if defined(CONFIGURABLE_SOUND_DEVICE)
-    if ((so.sound_fd = open (sound_device, O_WRONLY | O_NONBLOCK)) < 0)
+    if (Settings.Mute)
     {
-    perror (sound_device);
-    return (FALSE);
+
+	// Do all sound setup without opening /dev/dsp
+	so.sixteen_bit = true;
+	so.stereo = true;
+        so.playback_rate = Rates[mode & 0x07];
+    S9xSetPlaybackRate (so.playback_rate);
+
+    if (buffer_size == 0)
+	buffer_size = BufferSizes [mode & 7];
+
+    if (buffer_size > MAX_BUFFER_SIZE / 4)
+	buffer_size = MAX_BUFFER_SIZE / 4;
+    if (so.sixteen_bit)
+	buffer_size *= 2;
+    if (so.stereo)
+	buffer_size *= 2;
+        return TRUE;
     }
-#else
-    if ((so.sound_fd = open ("/dev/dsp", O_WRONLY | O_NONBLOCK)) < 0)
+
+    if ((so.sound_fd = open ("/dev/dsp", O_NONBLOCK|O_WRONLY)) < 0)
     {
-    perror ("/dev/dsp");
-    return (FALSE);
+	perror ("/dev/dsp");
+	return (FALSE);
     }
-#endif
 
 #ifdef MMAP_SOUND 
    if (ioctl (so.sound_fd, SNDCTL_DSP_GETCAPS, &J) < 0)
@@ -1712,19 +1992,25 @@
 	    return (FALSE);
 	}
     }
+    else
+	so.sixteen_bit = TRUE;
 
+    so.stereo = stereo;
     if (ioctl (so.sound_fd, SNDCTL_DSP_STEREO, &so.stereo) < 0)
     {
 	perror ("ioctl SNDCTL_DSP_STEREO");
 	return (FALSE);
     }
     
+    so.playback_rate = Rates[mode & 0x07];
     if (ioctl (so.sound_fd, SNDCTL_DSP_SPEED, &so.playback_rate) < 0)
     {
 	perror ("ioctl SNDCTL_DSP_SPEED");
 	return (FALSE);
     }
 
+    S9xSetPlaybackRate (so.playback_rate);
+
     if (buffer_size == 0)
 	buffer_size = BufferSizes [mode & 7];
 
@@ -1761,9 +2047,7 @@
     printf ("Rate: %d, Buffer size: %d, 16-bit: %s, Stereo: %s, Encoded: %s\n",
 	    so.playback_rate, so.buffer_size, so.sixteen_bit ? "yes" : "no",
 	    so.stereo ? "yes" : "no", so.encoded ? "yes" : "no");
-    } // Settings.Mute
 
-    S9xSetPlaybackRate (so.playback_rate);
     return (TRUE);
 }
 #endif
@@ -1808,7 +2092,6 @@
 void *S9xProcessSound (void *)
 {
     /* No sound version */
-	return (NULL);
 }
 #endif
 
@@ -1817,6 +2100,7 @@
 {
     /* Linux and Sun versions */
     
+/* Mass comment-out!
     int bytes_so_far = so.sixteen_bit ? (so.samples_mixed_so_far << 1) :
 				        so.samples_mixed_so_far;
     if (Settings.SoundSync == 2)
@@ -1890,12 +2174,23 @@
 	pthread_mutex_unlock (&mutex);
     else
 #endif    
-//    if (pending_signal)
-    if (1)
+    if (pending_signal)
     {
 	S9xProcessSound (NULL);
 	pending_signal = FALSE;
     }
+    
+    */
+	uint8 Buf[262144];
+	unsigned N = so.playback_rate * Settings.FrameTime / 1000000;
+	if (so.stereo) N *= 2;
+	S9xMixSamplesO(Buf, N, 0);
+	if (so.sixteen_bit) N *= 2;
+	
+	if (!Settings.Mute)
+	    write(so.sound_fd, Buf, N);
+	
+	AudioLogger(Buf, N);
 }
 
 void *S9xProcessSound (void *)
@@ -1904,8 +2199,8 @@
     
     /* If threads in use, this is to loop indefinitely */
     /* If not, this will be called by timer */
-    if (Settings.Mute)
-        return NULL;
+    S9xGenerateSound();
+    return NULL;
 #ifdef __linux
     audio_buf_info info;
 
@@ -2023,7 +2318,8 @@
 	    }
 	    if(I == 0) break;
 	    
-            I = write (so.sound_fd, (char *) Buf + byte_offset, I);
+            if (!Settings.Mute)
+                I = write (so.sound_fd, (char *) Buf + byte_offset, I);
             if (I > 0)
             {
                 bytes_to_write -= I;
@@ -2043,7 +2339,7 @@
 #endif
 
 #ifdef __sun
-    if (!Settings.ThreadSound)
+    if (!Settings.ThreadSound && !Settings.Mute)
 	write (so.sound_fd, NULL, 0);
 #endif
 
@@ -2157,6 +2453,7 @@
     Settings.FrameTimeNTSC = get_config_int("Graphics", "FrameTimeNTSC", 16667);
     Settings.FrameTime = Settings.FrameTimeNTSC;
     Settings.Transparency = get_config_int("Graphics", "Transparency", FALSE);
+//    Settings.SixteenBit = get_config_int("Graphics", "HiColor", FALSE);
     Settings.SupportHiRes = get_config_int("Graphics", "Hi-ResSupport", FALSE);
     i = get_config_int("Graphics", "CPUCycles", 100);
     Settings.H_Max = (i * SNES_CYCLES_PER_SCANLINE) / i;
@@ -2216,7 +2513,7 @@
 
     Memory.FreeSDD1Data ();
 
-    strcpy (filename, S9xGetDirectory (PATCH_DIR));
+    strcpy (filename, S9xGetSnapshotDirectory ());
 
     Settings.SDD1Pack=FALSE;
     if (strncmp (Memory.ROMName, "Star Ocean", 10) == 0){
@@ -2342,6 +2639,136 @@
     }
 }
 
+
+
+
+// New additions from the heavy "improvement"
+
+const char *inc_format="%03d";
+
+const char *S9xGetFilename (const char *ex, enum s9x_getdirtype dirtype)
+{
+    static char filename [PATH_MAX + 1];
+    char dir [_MAX_DIR + 1];
+    char drive [_MAX_DRIVE + 1];
+    char fname [_MAX_FNAME + 1];
+    char ext [_MAX_EXT + 1];
+    _splitpath (Memory.ROMFilename, drive, dir, fname, ext);
+    snprintf(filename, sizeof(filename), "%s" SLASH_STR "%s%s",
+             S9xGetDirectory(dirtype), fname, ex);
+    return (filename);
+}
+
+const char *S9xGetFilenameInc (const char *e, enum s9x_getdirtype dirtype)
+{
+    static char filename [PATH_MAX + 1];
+    char dir [_MAX_DIR + 1];
+    char drive [_MAX_DRIVE + 1];
+    char fname [_MAX_FNAME + 1];
+    char ext [_MAX_EXT + 1];
+    unsigned int i=0;
+    struct stat buf;
+    const char *d;
+
+    _splitpath (Memory.ROMFilename, drive, dir, fname, ext);
+    d=S9xGetDirectory(dirtype);
+    do {
+        snprintf(filename, sizeof(filename), inc_format, d, fname, i, e);
+        i++;
+    } while(stat(filename, &buf)==0 && i!=0);
+
+    return (filename);
+}
+
+
+const char *base_dir="~" SLASH_STR ".snes96_snapshots";
+const char *snapshot_dir=base_dir;
+const char *sram_dir=base_dir;
+const char *screenshot_dir=base_dir;
+const char *spc_dir=base_dir;
+const char *patch_dir=base_dir;
+const char *rom_dir="." SLASH_STR "roms";
+
+
+const char *S9xGetDirectory (enum s9x_getdirtype dirtype)
+{
+    static char filename [PATH_MAX+1];
+    const char *s, *b;
+    bool md=false;
+
+    switch(dirtype){
+      default:
+      case DEFAULT_DIR:     s=base_dir; md=true; break;
+      case HOME_DIR:        s=getenv("HOME"); break;
+      case ROM_DIR:         s=rom_dir; break;
+      case SNAPSHOT_DIR:    s=snapshot_dir; break;
+      case SRAM_DIR:        s=sram_dir; break;
+	  case BIOS_DIR:        s=sram_dir; break;
+      case SCREENSHOT_DIR:  s=screenshot_dir; break;
+      case SPC_DIR:         s=spc_dir; break;
+      case PATCH_DIR:       s=patch_dir; break;
+      case ROMFILENAME_DIR:
+        strcpy(filename, Memory.ROMFilename);
+        for(int i=strlen(filename); i>=0; i--){
+            if(filename[i]==SLASH_CHAR){
+                filename[i]='\0';
+                break;
+            }
+        }
+        return filename;
+    }
+
+    b=NULL;
+    if(dirtype!=HOME_DIR){
+        if(s[0]==SLASH_CHAR){
+            b=NULL;
+        } else if(s[0]=='~' && s[1]==SLASH_CHAR){
+            b=getenv("HOME");
+            md=true;
+            s+=2;
+        } else if(s[0]=='.' && s[1]==SLASH_CHAR){
+            b=NULL;
+        } else if(dirtype!=DEFAULT_DIR){
+            b=S9xGetDirectory(DEFAULT_DIR);
+            md=true;
+        } else {
+            b=NULL;
+        }
+    }
+
+    if(b==filename){
+        int l=strlen(filename);
+        snprintf(filename+l, sizeof(filename)-l, SLASH_STR "%s", s);
+    } else if(b){
+        snprintf(filename, sizeof(filename), "%s" SLASH_STR "%s", b, s);
+    } else {
+        snprintf(filename, sizeof(filename), "%s", s);
+    }
+    if(md){
+        if(mkdir(filename, 0777)==0)
+            chown(filename, getuid (), getgid ());
+    }
+
+    return filename;
+}
+
+
+char *S9xGetFreezeFilename(int slot) {
+                   char def [PATH_MAX];
+                   char filename [PATH_MAX];
+                   char drive [_MAX_DRIVE];
+                   char dir [_MAX_DIR];
+                   char ext [_MAX_EXT];
+                   _splitpath (Memory.ROMFilename, drive, dir, def, ext);
+                   sprintf (filename, "%s%s%s.%03d",
+                            S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, def,
+                            slot);
+
+	return strdup(filename);
+}
+
+#include "conffile.h"
+
 ConfigFile::secvec_t keymaps;
 
 typedef std::pair<std::string,std::string> strpair_t;
@@ -2474,4 +2901,3 @@
         free(s);
     }
 }
-
diff -rdu snes9x-improvement11-beta15/unix/x11.cpp snes9x-improvement11-beta15-lua0.05/unix/x11.cpp
--- snes9x-improvement11-beta15/unix/x11.cpp	Fri Jan 18 15:48:26 2008
+++ snes9x-improvement11-beta15-lua0.05/unix/x11.cpp	Thu Feb 14 11:06:12 2008
@@ -86,9 +86,6 @@
   Super NES and Super Nintendo Entertainment System are trademarks of
   Nintendo Co., Limited and its subsidiary companies.
 *******************************************************************************/
-
-
-
 #include <stdlib.h>
 #include <ctype.h>
 #include <string.h>
@@ -99,6 +96,10 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
+#include <sys/select.h>
+
+extern fd_set waitfds;
+extern int maxwaitfds;
 
 #include "snes9x.h"
 #include "memmap.h"
@@ -110,8 +111,9 @@
 #include "apu.h"
 #include "soundux.h"
 #include "x11.h"
-#include "movie.h"
 #include "spc7110.h"
+#include "logger.h"
+#include "s9xlua.h"
 
 #if 0
 #define QT_CLEAN_NAMESPACE
@@ -155,11 +157,15 @@
 void S9xSwitchToFullScreen (bool8 enable);
 
 #ifdef USE_VIDMODE_EXTENSION
+#if defined (__cplusplus) || defined (c_plusplus)
 #include <X11/extensions/xf86vmode.h>
+#endif
 
 #define ALL_DEVICE_EVENTS 0
 #endif
 
+//extern int FromPause;
+
 typedef struct 
 {
     bool8		full_screen_available;
@@ -192,6 +198,7 @@
 
 GUIData GUI;
 extern uint32 joypads [5];
+extern int FromPause;
 
 #if 0
 QApplication *app;
@@ -223,7 +230,6 @@
 		  uint8 *dstPtr, uint32 dstPitch, 
 		  uint32 dstWidth, uint32 dstHeight, int width, int height);
 
-
 START_EXTERN_C
 uint8 snes9x_clear_change_log = 0;
 END_EXTERN_C
@@ -301,6 +307,10 @@
 	S9xOpenGLInit ();
 #endif
 
+    FD_SET( ConnectionNumber(GUI.display), &waitfds);
+    if (ConnectionNumber(GUI.display) > maxwaitfds)
+       maxwaitfds = ConnectionNumber(GUI.display);
+
     XVisualInfo plate;
     XVisualInfo *matches;
     int count;
@@ -327,6 +337,7 @@
     if (GUI.depth >= 15 && !Settings.ForceNoTransparency)
     {
 	Settings.Transparency = TRUE;
+//	Settings.SixteenBit = TRUE;
     }
 
     GUI.pseudo = matches[0].c_class == PseudoColor ||
@@ -389,6 +400,7 @@
     if (Settings.OpenGLEnable || Settings.AIDOShmId)
     {
 	S9xSetRenderPixelFormat (RGB555);
+//        Settings.SixteenBit = TRUE;
         Settings.Transparency = TRUE;
     }
 #endif
@@ -512,7 +524,7 @@
 
     static XColor bg;
     static XColor fg;
-    static char data [8] = { 0,0,0,0,0,0,0,0 };
+    static char data [8] = { 0x01 };
 
     Pixmap bitmap = XCreateBitmapFromData (GUI.display, GUI.window, data, 8, 8);
     GUI.point_cursor = XCreatePixmapCursor (GUI.display, bitmap, bitmap, &fg, &bg, 0, 0);
@@ -745,6 +757,23 @@
 
     int h = IMAGE_HEIGHT;
 
+    if (!(true))
+    {
+	if (GUI.image_needs_scaling || GUI.depth != 8)
+	{
+	    GFX.Screen = (uint8 *) (GUI.to_free [tf++] = malloc (IMAGE_WIDTH * h));
+	    GFX.Pitch = IMAGE_WIDTH;
+	}
+	else
+	{
+	    GFX.Screen = (uint8 *) GUI.image->data;
+	    GFX.Pitch = GUI.image->bytes_per_line;
+	}
+	GFX.SubScreen = NULL;
+	GFX.ZBuffer = (uint8 *) (GUI.to_free [tf++] = malloc (GFX.Pitch * h));
+	GFX.SubZBuffer = NULL;
+    }
+    else
     if (GUI.depth == 8)
     {
 	if (GUI.interpolate)
@@ -804,7 +833,7 @@
 	memset (GUI.delta_screen, 0xff, GFX.Pitch * h);
     if (GUI.interpolated_screen)
 	ZeroMemory (GUI.interpolated_screen, 512 * 478 * 2);
-    if (GUI.interpolate)
+    if ((true) && GUI.interpolate)
     {
 	// Offset the rendering of the SNES image by at least one pixel because
 	// Kreed's interpolation routines read one pixel beyond the bounds of
@@ -905,7 +934,8 @@
 #endif
 }
 
-const char *S9xChooseMovieFilename(bool8 read_only)
+#include "movie.h"
+static const char *S9xChooseMovieFilename(bool8 read_only)
 {
     char def [PATH_MAX + 1];
     char title [PATH_MAX + 1];
@@ -919,7 +949,7 @@
     const char *filename;
 
     S9xSetSoundMute (TRUE);
-    filename = S9xSelectFilename (def, S9xGetDirectory (SPC_DIR), "smv", title);
+    filename = S9xSelectFilename (def, S9xGetSnapshotDirectory (), "smv", title);
     S9xSetSoundMute (FALSE);
     return (filename);
 }
@@ -987,8 +1017,11 @@
         WRITE_MOVIE_ASK,
         LOAD_MOVIE_ASK,
         STOP_MOVIE,
-        
-        FUNC_LAST = STOP_MOVIE /* update this to match the last token */
+        READONLY_MOVIE_TOGGLE,
+        FRAMEADVANCE,
+        SEEK,
+        LUA_CONTROL,
+        FUNC_LAST = SEEK /* update this to match the last token */
     };
     static const char* GetFuncName(functiontype func)
     {
@@ -1027,6 +1060,10 @@
             case WRITE_MOVIE_ASK: return         "WRITE_MOVIE_ASK";
             case LOAD_MOVIE_ASK: return          "LOAD_MOVIE_ASK";
             case STOP_MOVIE: return              "STOP_MOVIE";
+            case READONLY_MOVIE_TOGGLE: return   "READONLY_MOVIE_TOGGLE";
+            case FRAMEADVANCE: return            "FRAMEADVANCE";
+            case SEEK: return                    "SEEK";
+            case LUA_CONTROL: return             "LUA_CONTROL";
             default: return "unknown";
         }
     }
@@ -1233,7 +1270,7 @@
         Define(FRAMESKIP_INC, 0,       XK_equal, XK_plus);
         Define(FRAMESKIP_DEC, 0,       XK_minus);
         // pause
-        Define(PAUSE, 0,               XK_Pause, XK_Break, XK_Scroll_Lock);
+        Define(PAUSE, 0,               XK_Pause, XK_Break, XK_g);
         // misc functions
         Define(DGA_FULLSCREEN, 0,      Alt(XK_Return));
         Define(SCREENSHOT, 0,          XK_Print);
@@ -1245,8 +1282,11 @@
         Define(TOGGLE_TRANSP, 0,       XK_9);
         Define(TOGGLE_CLIPWIN, 0,      XK_BackSpace);
         Define(TOGGLE_CONTROLLER, 0,   XK_7);
-        Define(TOGGLE_INTERPSOUND, 0,  XK_bracketleft, Alt(XK_8));
-        Define(TOGGLE_SYNCSOUND, 0,    XK_bracketright, Alt(XK_9));
+// I'm claiming these in the name of Frame Advance
+//        Define(TOGGLE_INTERPSOUND, 0,  XK_bracketleft, Alt(XK_8));
+//        Define(TOGGLE_SYNCSOUND, 0,    XK_bracketright, Alt(XK_9));
+        Define(TOGGLE_INTERPSOUND, 0,  Alt(XK_8));
+        Define(TOGGLE_SYNCSOUND, 0,    Alt(XK_9));
         Define(TOGGLE_MODE7INTERP, 0,  Shift(XK_9));
         Define(TURBO_ENABLE, 0,        XK_Tab);
         Define(SUPERSCOPE_TURBO, 0,    XK_grave, XK_asciitilde, XK_numbersign);
@@ -1257,7 +1297,15 @@
         Define(WRITE_MOVIE_ASK, 0,     Shift(XK_1));
         Define(LOAD_MOVIE_ASK, 0,      Shift(XK_2));
         Define(STOP_MOVIE, 0,          Shift(XK_3));
-        
+        Define(READONLY_MOVIE_TOGGLE,0,Shift(XK_4));   
+#ifdef BRUSHY
+	Define(FRAMEADVANCE,0,XK_f);
+	Define(PAUSE,0,XK_g);
+#else
+	Define(FRAMEADVANCE, 0, XK_backslash, XK_bracketleft, XK_bracketright);
+#endif
+	Define(SEEK,	0, Shift(XK_backslash));
+	Define(LUA_CONTROL, 0, Ctrl(XK_l));
         VerifySetup();
     }
 public:
@@ -1287,6 +1335,12 @@
     }
 } KBSetup;
 
+int pauseatstart=0;
+
+#ifndef unlikely
+#define unlikely(x) __builtin_expect((x), 1==0)
+#endif
+
 void S9xProcessEvents (bool8 block)
 {
 #ifdef USE_AIDO
@@ -1297,6 +1351,17 @@
     }
 #endif
 
+    if (unlikely(autodemo[0]))
+    {
+    	S9xMovieOpen(autodemo, true,0);
+    	printf("Autodemo loading.\n");
+    	autodemo[0] = 0;
+    }
+    if (unlikely(pauseatstart))
+    {
+        Settings.Paused = 1;
+        pauseatstart = 0;
+    }
     while (block || CheckForPendingXEvents (GUI.display))
     {
         XEvent event;
@@ -1371,7 +1436,7 @@
 
                     _splitpath (Memory.ROMFilename, drive, dir, def, ext);
                     sprintf (filename, "%s%s%s.%03d",
-                             S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, def,
+                             S9xGetSnapshotDirectory (), SLASH_STR, def,
                              func.param);
                     sprintf (GUI.info_string, "%s.%03d saved", def, func.param);
                     S9xInfoMessage (GUI.info_string);
@@ -1398,7 +1463,7 @@
 
                     _splitpath (Memory.ROMFilename, drive, dir, def, ext);
                     sprintf (filename, "%s%s%s.%03d",
-                             S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, def,
+                             S9xGetSnapshotDirectory (), SLASH_STR, def,
                              func.param);
                     if (S9xUnfreezeGame (filename))
                     {
@@ -1410,7 +1475,7 @@
                         static char *digits = "t123456789";
                         _splitpath (Memory.ROMFilename, drive, dir, def, ext);
                         sprintf (filename, "%s%s%s.zs%c",
-                                 S9xGetDirectory (SNAPSHOT_DIR), SLASH_STR, 
+                                 S9xGetSnapshotDirectory (), SLASH_STR, 
                                  def, digits [func.param]);
                         if (S9xUnfreezeGame (filename))
                         {
@@ -1461,7 +1526,7 @@
 
                     _splitpath (Memory.ROMFilename, drive, dir, def, ext);
                     strcpy (ext, "spc");
-                    _makepath (filename, drive, S9xGetDirectory (SPC_DIR), 
+                    _makepath (filename, drive, S9xGetSnapshotDirectory (), 
                                def, ext);
                     if (S9xSPCDump (filename))
                         sprintf (GUI.info_string, "%s.%s saved", def, ext);
@@ -1554,6 +1619,7 @@
                     if(event.type != KeyPress) break;
                     
                     Settings.Paused ^= 1;
+                    FromPause = 1;
                     S9xDisplayStateChange ("Pause", Settings.Paused);
                     
                     break;
@@ -1620,6 +1686,7 @@
                 {
                     if(event.type != KeyPress) break;
                     
+                    if ((true))
                     {
                         Settings.Transparency = !Settings.Transparency;
                         S9xDisplayStateChange ("Transparency effects", 
@@ -1680,6 +1747,7 @@
                 case KeyboardSetup::TURBO_ENABLE:
                 {
                     Settings.TurboMode = event.type == KeyPress;
+                    FromPause = 1;
                     break;
                 }
                 case KeyboardSetup::SUPERSCOPE_TURBO:
@@ -1712,16 +1780,45 @@
                 }
                 case KeyboardSetup::WRITE_MOVIE_ASK:
                 {
-                    if(event.type != KeyPress) break;
+                    char temp[128];
 
+                    if(event.type != KeyPress) break;
+                    FromPause = 1;
+                    int Reset = 0;
+                    
+                    resetq:
+                    printf("From reset? (yes/no/cancel): ");
+                    fflush(stdout);
+                    
+                    fgets(temp, 127, stdin);
+                    if (temp[0] == 'y' || temp[0] == 'Y')
+                    	Reset = 1;
+                    else if (temp[0] == 'n' || temp[0] == 'N')
+                    	Reset = 0;
+                    else if (temp[0] == 'c' || temp[0] == 'C')
+                    	break;
+                    else
+                    	goto resetq;
+                    
+                    int numplayers;
+                    playersq:
+                    printf("Number of players (1/2/3/4/5/cancel): ");
+                    fflush(stdout);
+                    fgets(temp, 127, stdin);
+                    if (temp[0] == 'c' || temp[0] == 'C')
+                    	break;
+                    else
+                    	numplayers = atoi(temp);
+                    if (numplayers < 1 || numplayers > 5)
+                    	goto playersq;
+                    
                     wchar_t name[MOVIE_MAX_METADATA] = {0};
                     if(S9xMovieActive()) S9xMovieStop(FALSE);
                     S9xMovieCreate(S9xChooseMovieFilename(FALSE),
-                                   0x1F,
-                                   //MOVIE_OPT_FROM_SNAPSHOT
+                                   (1 << numplayers)-1 ,
+                                   (!Reset) ? MOVIE_OPT_FROM_SNAPSHOT : 
                                    MOVIE_OPT_FROM_RESET
-                                   ,
-                                   name,0);
+                                   , NULL,0);
                     break;
                 }
                 case KeyboardSetup::LOAD_MOVIE_ASK:
@@ -1729,7 +1826,7 @@
                     if(event.type != KeyPress) break;
 
                     if(S9xMovieActive()) S9xMovieStop(FALSE);
-                    S9xMovieOpen(S9xChooseMovieFilename(TRUE), FALSE, 0);
+                    S9xMovieOpen(S9xChooseMovieFilename(TRUE), FALSE,0);
                     break;
                 }
                 case KeyboardSetup::STOP_MOVIE:
@@ -1739,11 +1836,49 @@
                     if(S9xMovieActive()) S9xMovieStop(FALSE);
                     break;
                 }
-
+                case KeyboardSetup::READONLY_MOVIE_TOGGLE:
+                {
+                	// I'll get to it later
+                	break;
+                
+                }
+		case KeyboardSetup::FRAMEADVANCE:
+		{
+			if (event.type != KeyPress) break;
+			Settings.FrameAdvance=1;
+			break;
+		}
                 /* Do not put a "default" case here, or you'll
                  * miss the compiler warning about unhandled
                  * enumeration values
                  */
+                case KeyboardSetup::SEEK:
+                {
+			if (event.type != KeyPress) break;
+                	char input[64];
+                	int skipframes;
+                	fprintf(stderr, "Seek to what frame (current: %d)? ", Logger_FrameCounter());
+                	fgets(input, sizeof(input), stdin);
+                	Settings.HighSpeedSeek = atoi(input) - Logger_FrameCounter();
+                	FromPause = 1;
+			break;
+                }
+                case KeyboardSetup::LUA_CONTROL:
+                {
+                    if(event.type != KeyPress) break;
+                	S9xLuaStop();
+                	fprintf(stderr, "Filename to load: ");
+                	char buffer[1024];
+                	buffer[0] = 0;
+                	FromPause = 1;
+                	fgets(buffer,sizeof(buffer), stdin);
+                	while (buffer[strlen(buffer)-1] == '\n' || buffer[strlen(buffer)-1] == '\r')
+                		buffer[strlen(buffer)-1] = 0;
+
+			if (strlen(buffer) > 0)
+				S9xLoadLuaCode(buffer);
+                }
+
             }
             
             break;
@@ -1813,7 +1948,7 @@
     height = snes_height;
     cheight = (height>SNES_HEIGHT_EXTENDED)?SNES_HEIGHT_EXTENDED*2:SNES_HEIGHT_EXTENDED;
     
-    if (GUI.interpolate)
+    if (GUI.interpolate && (true))
     {
 	if (snes_width == 512 && snes_height > 240 && GUI.interpolate != 5)
 	{
@@ -1935,27 +2070,44 @@
 	}
     }
 
-    if ((GUI.depth != 15 && GUI.depth != 16) ||
-	(GUI.image_needs_scaling && GUI.interpolate != 5))
+    if (((true) && GUI.depth != 15 && GUI.depth != 16) ||
+	(!(true) && (!GUI.pseudo || GUI.depth != 8)) ||
+	(GUI.image_needs_scaling && !((true) && GUI.interpolate == 5)))
     {
 	done = TRUE;
 	switch (GUI.depth)
 	{
 	case 8:
+	    if ((true))
 		Convert16To8 (width, height);
+	    else
+		Scale8 (width, height);
 	    break;
 
 	case 15:
 	case 16:
+	    if (!(true))
+		Convert8To16 (width, height);
+	    else
 		Scale16 (width, height);
 	    break;
 
 	case 32:
 	case 24:
+	    if ((true))
+	    {
 		if (GUI.image->bits_per_pixel == 32)
 		    Convert16To24 (width, height);
 		else
 		    Convert16To24Packed (width, height);
+	    }
+	    else
+	    {
+		if (GUI.image->bits_per_pixel == 32)
+		    Convert8To24 (width, height);
+		else
+		    Convert8To24Packed (width, height);
+	    }
 	    break;
 	}
     }
@@ -1989,9 +2141,6 @@
     }
 #endif
 
-    GUI.last_snes_width = snes_width;
-    GUI.last_snes_height = snes_height;
-
 #ifdef USE_DGA_EXTENSION
     if (!XF86.is_full_screen)
     {
@@ -2016,6 +2165,9 @@
     }
 #endif
 
+    GUI.last_snes_width = snes_width;
+    GUI.last_snes_height = snes_height;
+    VideoLogger(GUI.image_date, snes_width, snes_height, GUI.depth);
 
     if (GUI.box.x != GUI.old_box.x || GUI.box.y != GUI.old_box.y ||
 	GUI.box.width != GUI.old_box.width || GUI.box.height != GUI.old_box.height)
@@ -2146,6 +2298,8 @@
     else
     if (GUI.pseudo)
     {
+	if ((true))
+	{
 	    for (i = 0; i < 256; i++)
 	    {
 		GUI.colors[i].flags = DoRed | DoGreen | DoBlue;
@@ -2153,6 +2307,19 @@
 		GUI.colors[i].green = GUI.fixed_colours[i].green << 11;
 		GUI.colors[i].blue = GUI.fixed_colours[i].blue << 11;
 	    }
+	}
+	else
+	{
+	    uint16 Brightness = (IPPU.MaxBrightness) * 140;
+	    
+	    for (i = 0; i < 256; i++)
+	    {
+		GUI.colors[i].flags = DoRed | DoGreen | DoBlue;
+		GUI.colors[i].red = ((PPU.CGDATA[i] >> 0) & 0x1F) * Brightness;
+		GUI.colors[i].green = ((PPU.CGDATA[i] >> 5) & 0x1F) * Brightness;
+		GUI.colors[i].blue = ((PPU.CGDATA[i] >> 10) & 0x1F) * Brightness;
+	    }
+	}
 	XStoreColors (GUI.display, GUI.cmap, GUI.colors, 256);
     }
 }
@@ -2162,6 +2329,8 @@
 {
     static char path [PATH_MAX];
     char buffer [PATH_MAX];
+
+    FromPause = 1;
     
     XAutoRepeatOn (GUI.display);
 
@@ -2802,14 +2971,11 @@
     //XAutoRepeatOff (GUI.display);
 }
 
-void S9xExtraUsage ()
-{
-}
-
 void S9xParseDisplayArg (char **argv, int &ind, int)
 {
     if (strncasecmp (argv [ind], "-y", 2) == 0)
     {
+//	Settings.SixteenBit = TRUE;
         Settings.SupportHiRes = TRUE;
         Settings.ForceTransparency = TRUE;
 	switch (argv[ind][2])
@@ -2825,6 +2991,7 @@
     else
     if (strncasecmp (argv [ind], "-GUI.interpolate", 12) == 0)
     {
+//	Settings.SixteenBit = TRUE;
         Settings.SupportHiRes = TRUE;
         Settings.ForceTransparency = TRUE;
 	switch (argv[ind][12])
@@ -2862,6 +3029,10 @@
 	S9xUsage ();
 }
 
+void S9xExtraUsage ()
+{
+}
+
 int S9xMinCommandLineArgs ()
 {
     return (2);
@@ -3228,6 +3399,10 @@
 	XUngrabKeyboard (GUI.display, CurrentTime);
 }
 #endif
+
+
+
+// Addons!
 
 #include "conffile.h"
 typedef std::pair<std::string,std::string> strpair_t;
diff -rdu snes9x-improvement11-beta15/win32/rsrc/resource.h snes9x-improvement11-beta15-lua0.05/win32/rsrc/resource.h
--- snes9x-improvement11-beta15/win32/rsrc/resource.h	Fri Jan 25 19:28:04 2008
+++ snes9x-improvement11-beta15-lua0.05/win32/rsrc/resource.h	Wed Jan 30 05:51:36 2008
@@ -1,5 +1,5 @@
 //{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
+// Microsoft Developer Studio generated include file.
 // Used by snes9x.rc
 //
 #define IDR_RT_MANIFEST2                1
@@ -42,6 +42,7 @@
 #define IDB_HIDDENFOLDER                149
 #define IDD_MULTICART                   150
 #define IDD_MACRO_SETTINGS              160
+#define IDD_LUA_ADD                     161
 #define IDC_DRIVER                      1001
 #define IDC_BUFLEN                      1002
 #define IDC_RATE                        1003
@@ -141,6 +142,7 @@
 #define IDC_UP                          1090
 #define IDC_VALUE_ENTER                 1090
 #define IDC_MOVIE_METADATA              1090
+#define IDC_LUA_FILENAME                1090
 #define IDC_PAUSEINTERVAL               1091
 #define IDC_UPRIGHT                     1091
 #define IDC_MAXSKIP                     1092
@@ -399,6 +401,7 @@
 #define IDC_MACRO5_STEP                 4014
 #define IDC_MACRO_METHOD_NONE           4015
 #define IDC_MACRO_METHOD_OVERWRITE      4016
+#define IDC_LUA_BROWSE                  4016
 #define IDC_MACRO_METHOD_TOGGLE         4017
 #define IDC_PAUSE_WITH_MACRO            4018
 #define ID_FILE_EXIT                    40001
@@ -525,6 +528,8 @@
 #define ID_TURBO_UP                     40125
 #define ID_TURBO_RIGHT                  40126
 #define ID_TURBO_DOWN                   40127
+#define IDD_FILE_LUA_LOAD               40128
+#define IDD_FILE_LUA_STOP               40129
 #define ID_SOUND_CHANNELS               40138
 #define ID_CHANNELS_CHANNEL1            40139
 #define ID_CHANNELS_CHANNEL2            40140
@@ -545,9 +550,9 @@
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        161
-#define _APS_NEXT_COMMAND_VALUE         40128
-#define _APS_NEXT_CONTROL_VALUE         4016
+#define _APS_NEXT_RESOURCE_VALUE        164
+#define _APS_NEXT_COMMAND_VALUE         40130
+#define _APS_NEXT_CONTROL_VALUE         4017
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif
diff -rdu snes9x-improvement11-beta15/win32/rsrc/snes9x.rc snes9x-improvement11-beta15-lua0.05/win32/rsrc/snes9x.rc
--- snes9x-improvement11-beta15/win32/rsrc/snes9x.rc	Fri Jan 25 19:31:46 2008
+++ snes9x-improvement11-beta15-lua0.05/win32/rsrc/snes9x.rc	Wed Jan 30 05:00:16 2008
@@ -1,6 +1,7 @@
-// Microsoft Visual C++ generated resource script.
+//Microsoft Developer Studio generated resource script.
 //
 #include "resource.h"
+#include "commctrl.h"
 
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
@@ -21,19 +22,21 @@
 #pragma code_page(1252)
 #endif //_WIN32
 
+#define LVS_OWNERDATA 4096
+
 /////////////////////////////////////////////////////////////////////////////
 //
 // Cursor
 //
 
-IDC_CURSOR_SCOPE        CURSOR                  "nodrop.cur"
+IDC_CURSOR_SCOPE        CURSOR  DISCARDABLE     "nodrop.cur"
 
 /////////////////////////////////////////////////////////////////////////////
 //
 // Accelerator
 //
 
-IDR_SNES9X_ACCELERATORS ACCELERATORS 
+IDR_SNES9X_ACCELERATORS ACCELERATORS MOVEABLE PURE 
 BEGIN
     "E",            ID_CHEAT_ENTER,         VIRTKEY, ALT, NOINVERT
     "A",            ID_CHEAT_SEARCH,        VIRTKEY, ALT, NOINVERT
@@ -57,88 +60,136 @@
 //
 
 IDD_SOUND_OPTS DIALOGEX 0, 0, 352, 202
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | 
+    WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
 CAPTION "Sound Settings"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    GROUPBOX        "Sound Quality",IDC_STATIC,7,7,168,167,0,WS_EX_TRANSPARENT
-    GROUPBOX        "Sound Emulation",IDC_STATIC,177,7,168,167,0,WS_EX_TRANSPARENT
+    GROUPBOX        "Sound Quality",IDC_STATIC,7,7,168,167,0,
+                    WS_EX_TRANSPARENT
+    GROUPBOX        "Sound Emulation",IDC_STATIC,177,7,168,167,0,
+                    WS_EX_TRANSPARENT
     DEFPUSHBUTTON   "&OK",IDOK,229,178,56,16
-    COMBOBOX        IDC_DRIVER,65,24,106,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_DRIVER,65,24,106,60,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
     LTEXT           "Sound Driver:",IDC_STATIC,13,25,49,11
-    COMBOBOX        IDC_BUFLEN,65,72,106,101,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_BUFLEN,65,72,106,101,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
     LTEXT           "Buffer Length:",IDC_STATIC,13,74,49,11
-    COMBOBOX        IDC_RATE,65,40,106,171,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_RATE,65,40,106,171,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
     LTEXT           "Playback Rate:",IDC_STATIC,13,41,49,11
-    COMBOBOX        IDC_MIX,65,56,106,154,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_MIX,65,56,106,154,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
     LTEXT           "Mix Interval:",IDC_STATIC,13,57,49,11
-    CONTROL         "&16 Bit playback",IDC_16BIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,92,158,10
-    CONTROL         "&Stereo",IDC_STEREO,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,13,108,158,10
-    CONTROL         "&Reverse Stereo",IDC_REV_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,124,158,10
-    CONTROL         "Gaussian &Interpolation of Sample Data",IDC_LINEAR_INTER,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,140,158,10
-    CONTROL         "&Generate sample data in sync with sound CPU",IDC_SYNC_TO_SOUND_CPU,
-                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,156,158,10
-    CONTROL         "&Volume envelope height reading",IDC_ENVX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,19,141,12
-    CONTROL         "&Echo Effects",IDC_ECHO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,58,141,12
-    CONTROL         "&Cache decoded samples",IDC_CACHING,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,183,71,141,12
-    CONTROL         "M&aster volume control",IDC_MASTER_VOL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,84,141,12
-    CONTROL         "Enable sound CP&U emulation",IDC_SPC700ON,"Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,183,136,141,12
+    CONTROL         "&16 Bit playback",IDC_16BIT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,13,92,158,10
+    CONTROL         "&Stereo",IDC_STEREO,"Button",BS_AUTOCHECKBOX | 
+                    BS_NOTIFY | WS_TABSTOP,13,108,158,10
+    CONTROL         "&Reverse Stereo",IDC_REV_STEREO,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,13,124,158,10
+    CONTROL         "Gaussian &Interpolation of Sample Data",
+                    IDC_LINEAR_INTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    13,140,158,10
+    CONTROL         "&Generate sample data in sync with sound CPU",
+                    IDC_SYNC_TO_SOUND_CPU,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,13,156,158,10
+    CONTROL         "&Volume envelope height reading",IDC_ENVX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,183,19,141,12
+    CONTROL         "&Echo Effects",IDC_ECHO,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,183,58,141,12
+    CONTROL         "&Cache decoded samples",IDC_CACHING,"Button",
+                    BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,183,71,141,12
+    CONTROL         "M&aster volume control",IDC_MASTER_VOL,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,183,84,141,12
+    CONTROL         "Enable sound CP&U emulation",IDC_SPC700ON,"Button",
+                    BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,183,136,141,12
     CONTROL         "Anti-Resonance's sample &decoding method",IDC_ANTIRES,
-                    "Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,183,123,157,12
-    CONTROL         "&Mute sound",IDC_MUTE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,97,141,12
-    COMBOBOX        IDC_SKIP_TYPE,249,152,94,59,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+                    "Button",BS_AUTOCHECKBOX | BS_NOTIFY | WS_TABSTOP,183,
+                    123,157,12
+    CONTROL         "&Mute sound",IDC_MUTE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,183,97,141,12
+    COMBOBOX        IDC_SKIP_TYPE,249,152,94,59,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
     LTEXT           "CPU wait skip style",IDC_STATIC,183,152,64,13
     PUSHBUTTON      "&Cancel",IDCANCEL,289,178,56,16
-    CONTROL         "&Fake Mute desync workaround",IDC_FMUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,32,141,12
-    CONTROL         "Use &WIP1 timing",IDC_WIP1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,45,141,12
-    CONTROL         "Frame Advance mu&te",IDC_FAMT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,183,110,141,12
+    CONTROL         "&Fake Mute desync workaround",IDC_FMUT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,183,32,141,12
+    CONTROL         "Use &WIP1 timing",IDC_WIP1,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,183,45,141,12
+    CONTROL         "Frame Advance mu&te",IDC_FAMT,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,183,110,141,12
 END
 
-IDD_SPC7110_CACHE DIALOG  0, 0, 185, 92
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+IDD_SPC7110_CACHE DIALOG DISCARDABLE  0, 0, 185, 92
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | 
+    WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
 CAPTION "SPC7110 Pack Configuration"
 FONT 8, "MS Sans Serif"
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,138,48,40,16
     PUSHBUTTON      "Cancel",IDCANCEL,138,68,40,16
-    CONTROL         "Load All Data into RAM",IDC_SPC7110_ALL,"Button",BS_AUTORADIOBUTTON,7,7,92,13
-    CONTROL         "Load Some Data into RAM",IDC_SPC7110_SOME,"Button",BS_AUTORADIOBUTTON,7,26,101,13
-    CONTROL         "Read all data from file",IDC_SPC7110_FILE,"Button",BS_AUTORADIOBUTTON,7,48,104,13
+    CONTROL         "Load All Data into RAM",IDC_SPC7110_ALL,"Button",
+                    BS_AUTORADIOBUTTON,7,7,92,13
+    CONTROL         "Load Some Data into RAM",IDC_SPC7110_SOME,"Button",
+                    BS_AUTORADIOBUTTON,7,26,101,13
+    CONTROL         "Read all data from file",IDC_SPC7110_FILE,"Button",
+                    BS_AUTORADIOBUTTON,7,48,104,13
     EDITTEXT        IDC_CACHE_MB,112,26,40,13,ES_AUTOHSCROLL | ES_NUMBER
-    CONTROL         "Spin1",IDC_SPIN_CACHE,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS,146,26,11,13
+    CONTROL         "Spin1",IDC_SPIN_CACHE,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | 
+                    UDS_NOTHOUSANDS,146,26,11,13
 END
 
-IDD_7110_RTC DIALOG  0, 0, 302, 148
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
+IDD_7110_RTC DIALOG DISCARDABLE  0, 0, 302, 148
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION | 
+    WS_SYSMENU
 CAPTION "SPC7110 RTC Control"
 FONT 8, "MS Sans Serif"
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,192,127,50,14
     PUSHBUTTON      "Cancel",IDCANCEL,245,127,50,14
     GROUPBOX        "RTC Control Registers",IDC_STATIC,7,49,288,71
-    CONTROL         "30 ADJ",IDC_RTC_D8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70,62,53,10
-    CONTROL         "IRQ-F",IDC_RTC_D4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,127,62,53,10
-    CONTROL         "CAL / HW",IDC_RTC_D2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,184,62,53,10
-    CONTROL         "HOLD",IDC_RTC_D1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,242,62,45,10
-    CONTROL         "T1",IDC_RTC_E8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,70,80,25,10
-    CONTROL         "T0",IDC_RTC_E4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,127,80,25,10
-    CONTROL         "INT/STND",IDC_RTC_E2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,184,80,51,10
-    CONTROL         "MASK",IDC_RTC_E1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,242,80,36,10
-    CONTROL         "TEST",IDC_RTC_F8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,70,98,35,10
-    CONTROL         "24/12",IDC_RTC_F4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,127,98,35,10
-    CONTROL         "STOP",IDC_RTC_F2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,184,98,35,10
-    CONTROL         "RESET",IDC_RTC_F1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,242,98,40,10
+    CONTROL         "30 ADJ",IDC_RTC_D8,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,70,62,53,10
+    CONTROL         "IRQ-F",IDC_RTC_D4,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,127,62,53,10
+    CONTROL         "CAL / HW",IDC_RTC_D2,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,184,62,53,10
+    CONTROL         "HOLD",IDC_RTC_D1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    242,62,45,10
+    CONTROL         "T1",IDC_RTC_E8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | 
+                    WS_TABSTOP,70,80,25,10
+    CONTROL         "T0",IDC_RTC_E4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | 
+                    WS_TABSTOP,127,80,25,10
+    CONTROL         "INT/STND",IDC_RTC_E2,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,184,80,51,10
+    CONTROL         "MASK",IDC_RTC_E1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | 
+                    WS_TABSTOP,242,80,36,10
+    CONTROL         "TEST",IDC_RTC_F8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | 
+                    WS_TABSTOP,70,98,35,10
+    CONTROL         "24/12",IDC_RTC_F4,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,127,98,35,10
+    CONTROL         "STOP",IDC_RTC_F2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    184,98,35,10
+    CONTROL         "RESET",IDC_RTC_F1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    242,98,40,10
     LTEXT           "Register 0xD",IDC_STATIC,13,62,43,8
     LTEXT           "Register 0xE",IDC_STATIC,13,80,41,8
     LTEXT           "Register 0xF",IDC_STATIC,13,98,42,8
-    CONTROL         "Slider1",IDC_DAY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,59,20,45,8
-    CONTROL         "Slider2",IDC_YEAR,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,106,20,42,8
+    CONTROL         "Slider1",IDC_DAY,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,59,20,45,8
+    CONTROL         "Slider2",IDC_YEAR,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,106,20,42,8
     LTEXT           "1",IDC_LBLDAY,74,28,18,8
-    CONTROL         "Slider1",IDC_MONTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,7,20,51,8
-    CONTROL         "Slider2",IDC_HOUR,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,160,20,42,8
-    CONTROL         "Slider2",IDC_MINUTE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,203,20,42,8
-    CONTROL         "Slider2",IDC_SECOND,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,246,20,42,8
+    CONTROL         "Slider1",IDC_MONTH,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,7,20,51,8
+    CONTROL         "Slider2",IDC_HOUR,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,160,20,42,8
+    CONTROL         "Slider2",IDC_MINUTE,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,203,20,42,8
+    CONTROL         "Slider2",IDC_SECOND,"msctls_trackbar32",TBS_BOTH | 
+                    TBS_NOTICKS | WS_TABSTOP,246,20,42,8
     LTEXT           "1",IDC_LBLMONTH,20,28,26,8
     LTEXT           "1995",IDC_LBLYEAR,116,28,27,8
     LTEXT           "Month",IDC_STATIC,20,7,21,8
@@ -152,8 +203,9 @@
     LTEXT           "0",IDC_LBLSECOND,257,28,18,8
 END
 
-IDD_ROM_INFO DIALOG  0, 0, 233, 185
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+IDD_ROM_INFO DIALOG DISCARDABLE  0, 0, 233, 185
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION | WS_SYSMENU
 CAPTION "Rom Info"
 FONT 8, "MS Sans Serif"
 BEGIN
@@ -163,55 +215,85 @@
 END
 
 IDD_ABOUT DIALOGEX 0, 0, 232, 181
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION | WS_SYSMENU
 CAPTION "APP - About Dialog"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,90,160,50,14
-    EDITTEXT        IDC_DISCLAIMER,7,7,218,148,ES_MULTILINE | ES_NOHIDESEL | ES_READONLY,WS_EX_STATICEDGE
+    EDITTEXT        IDC_DISCLAIMER,7,7,218,148,ES_MULTILINE | ES_NOHIDESEL | 
+                    ES_READONLY,WS_EX_STATICEDGE
 END
 
 IDD_EMU_SETTINGS DIALOGEX 0, 0, 319, 148
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION | WS_SYSMENU
 CAPTION "APP - Emulator Settings"
-FONT 8, "MS Sans Serif", 0, 0, 0x0
+FONT 8, "MS Sans Serif"
 BEGIN
     EDITTEXT        IDC_CUSTOM_FOLDER_FIELD,91,28,163,14,ES_AUTOHSCROLL
     PUSHBUTTON      "&Browse...",IDC_BROWSE,264,27,48,14
-    EDITTEXT        IDC_AUTO_SAVE_DELAY,91,47,49,14,ES_AUTOHSCROLL | ES_NUMBER
-    CONTROL         "Spin2",IDC_SRAM_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,301,51,11,13
+    EDITTEXT        IDC_AUTO_SAVE_DELAY,91,47,49,14,ES_AUTOHSCROLL | 
+                    ES_NUMBER
+    CONTROL         "Spin2",IDC_SRAM_SPIN,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,301,51,11,
+                    13
     EDITTEXT        IDC_MAX_SKIP,91,66,49,14,ES_AUTOHSCROLL | ES_NUMBER
-    CONTROL         "Spin3",IDC_SPIN_MAX_SKIP,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,298,70,11,13
+    CONTROL         "Spin3",IDC_SPIN_MAX_SKIP,"msctls_updown32",
+                    UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | 
+                    UDS_ARROWKEYS,298,70,11,13
     EDITTEXT        IDC_TURBO_SKIP,91,85,49,14,ES_AUTOHSCROLL | ES_NUMBER
-    CONTROL         "Spin4",IDC_SPIN_TURBO_SKIP,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS,296,94,11,13
-    CONTROL         "Toggled Turbo Mode",IDC_TOGGLE_TURBO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,91,103,123,12
+    CONTROL         "Spin4",IDC_SPIN_TURBO_SKIP,"msctls_updown32",
+                    UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | 
+                    UDS_ARROWKEYS,296,94,11,13
+    CONTROL         "Toggled Turbo Mode",IDC_TOGGLE_TURBO,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,91,103,123,12
     DEFPUSHBUTTON   "&OK",IDOK,215,127,46,14
     PUSHBUTTON      "&Cancel",IDCANCEL,266,127,46,14
     RTEXT           "Directory",IDC_LABEL_FREEZE,53,28,32,14,SS_CENTERIMAGE
-    RTEXT           "Auto-Save S-RAM",IDC_LABEL_ASRAM,21,47,64,14,SS_CENTERIMAGE
+    RTEXT           "Auto-Save S-RAM",IDC_LABEL_ASRAM,21,47,64,14,
+                    SS_CENTERIMAGE
     RTEXT           "Skip at most",IDC_LABEL_SMAX,40,66,45,14,SS_CENTERIMAGE
-    RTEXT           "Skip rendering",IDC_LABEL_STURBO,32,85,51,14,SS_CENTERIMAGE
-    LTEXT           "seconds after last change (0 disables auto-save)",IDC_LABEL_ASRAM_TEXT,146,47,161,14,SS_CENTERIMAGE
-    LTEXT           "frames in auto-frame rate mode",IDC_LABEL_SMAX_TEXT,146,66,138,14,SS_CENTERIMAGE
-    LTEXT           "frames in Turbo mode",IDC_LABEL_STURBO_TEXT,146,85,92,14,SS_CENTERIMAGE
-    CONTROL         "Pause When Inactive",IDC_INACTIVE_PAUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,91,116,100,12
+    RTEXT           "Skip rendering",IDC_LABEL_STURBO,32,85,51,14,
+                    SS_CENTERIMAGE
+    LTEXT           "seconds after last change (0 disables auto-save)",
+                    IDC_LABEL_ASRAM_TEXT,146,47,161,14,SS_CENTERIMAGE
+    LTEXT           "frames in auto-frame rate mode",IDC_LABEL_SMAX_TEXT,146,
+                    66,138,14,SS_CENTERIMAGE
+    LTEXT           "frames in Turbo mode",IDC_LABEL_STURBO_TEXT,146,85,92,
+                    14,SS_CENTERIMAGE
+    CONTROL         "Pause When Inactive",IDC_INACTIVE_PAUSE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,91,116,100,12
     LTEXT           "Config file",IDC_STATIC,54,11,34,11
-    EDITTEXT        IDC_CONFIG_NAME_BOX,91,9,49,14,ES_AUTOHSCROLL | ES_READONLY | ES_NUMBER
-    LTEXT           "all of Snes9x's settings are stored in this file",IDC_STATIC,147,11,160,11
+    EDITTEXT        IDC_CONFIG_NAME_BOX,91,9,49,14,ES_AUTOHSCROLL | 
+                    ES_READONLY | ES_NUMBER
+    LTEXT           "all of Snes9x's settings are stored in this file",
+                    IDC_STATIC,147,11,160,11
     COMBOBOX        IDC_DIRCOMBO,7,29,44,30,CBS_DROPDOWNLIST | WS_TABSTOP
-    CONTROL         "Custom ROM Open Dialog",IDC_CUSTOMROMOPEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,91,130,117,12
+    CONTROL         "Custom ROM Open Dialog",IDC_CUSTOMROMOPEN,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,91,130,117,12
 END
 
 IDD_OPEN_ROM DIALOGEX 0, 0, 430, 223
-STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | 
+    WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | 
+    WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
 CAPTION "Open ROM"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    CONTROL         "Tree1",IDC_ROM_DIR,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS | WS_BORDER | WS_TABSTOP,4,4,154,192,WS_EX_CLIENTEDGE
-    CONTROL         "List1",IDC_ROMLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_OWNERDATA | WS_TABSTOP,161,4,266,192,WS_EX_CLIENTEDGE
+    CONTROL         "Tree1",IDC_ROM_DIR,"SysTreeView32",TVS_HASBUTTONS | 
+                    TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | 
+                    TVS_SHOWSELALWAYS | TVS_NOTOOLTIPS | WS_BORDER | 
+                    WS_TABSTOP,4,4,154,192,WS_EX_CLIENTEDGE
+    CONTROL         "List1",IDC_ROMLIST,"SysListView32",LVS_REPORT | 
+                    LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | 
+                    LVS_OWNERDATA | WS_TABSTOP,161,4,266,192,
+                    WS_EX_CLIENTEDGE
     COMBOBOX        IDC_MEM_TYPE,5,208,66,57,CBS_DROPDOWNLIST | WS_TABSTOP
-    COMBOBOX        IDC_INTERLEAVE,85,208,89,64,CBS_DROPDOWNLIST | WS_TABSTOP
-    COMBOBOX        IDC_VIDEO_MODE,182,208,66,61,CBS_DROPDOWNLIST | WS_TABSTOP
+    COMBOBOX        IDC_INTERLEAVE,85,208,89,64,CBS_DROPDOWNLIST | 
+                    WS_TABSTOP
+    COMBOBOX        IDC_VIDEO_MODE,182,208,66,61,CBS_DROPDOWNLIST | 
+                    WS_TABSTOP
     COMBOBOX        IDC_HEADER,256,208,73,44,CBS_DROPDOWNLIST | WS_TABSTOP
     DEFPUSHBUTTON   "&Open ROM",IDOK,335,205,44,15
     PUSHBUTTON      "&Cancel",IDCANCEL,380,205,44,15
@@ -222,9 +304,10 @@
 END
 
 IDD_GFX_PACK DIALOGEX 0, 0, 219, 260
-STYLE DS_SETFONT | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
+STYLE DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | 
+    WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
 CAPTION "Graphics Pack Configuration"
-FONT 8, "MS Sans Serif", 0, 0, 0x0
+FONT 8, "MS Sans Serif"
 BEGIN
     EDITTEXT        IDC_STAR_OCEAN,1,20,170,13,ES_AUTOHSCROLL
     LTEXT           "Star Ocean",IDC_STATIC,1,6,80,12
@@ -239,7 +322,8 @@
     LTEXT           "Super Power League 4",IDC_STATIC,1,93,80,12
     PUSHBUTTON      "Browse...",IDC_SPL4_BROWSE,173,105,45,14
     EDITTEXT        IDC_SJNS,1,135,170,13,ES_AUTOHSCROLL
-    LTEXT           "Far East of Eden Zero - Shounen Jump no Shou",IDC_STATIC,1,122,166,12
+    LTEXT           "Far East of Eden Zero - Shounen Jump no Shou",
+                    IDC_STATIC,1,122,166,12
     PUSHBUTTON      "Browse...",IDC_FEOEZ_SJNS_BROWSE,173,134,45,14
     EDITTEXT        IDC_SFA2,1,164,170,13,ES_AUTOHSCROLL
     LTEXT           "Street Fighter Alpha 2 (US)",IDC_STATIC,1,151,104,12
@@ -255,32 +339,48 @@
 END
 
 IDD_NPOPTIONS DIALOGEX 0, 0, 187, 161
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION
 CAPTION "Netplay Options"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    GROUPBOX        "Port Settings",IDC_PORTNUMBLOCK,5,5,180,25,0,WS_EX_TRANSPARENT
-    RTEXT           "Socket Port Number",IDC_LABEL_PORTNUM,10,15,85,10,SS_CENTERIMAGE
+    GROUPBOX        "Port Settings",IDC_PORTNUMBLOCK,5,5,180,25,0,
+                    WS_EX_TRANSPARENT
+    RTEXT           "Socket Port Number",IDC_LABEL_PORTNUM,10,15,85,10,
+                    SS_CENTERIMAGE
     EDITTEXT        IDC_PORTNUMBERA,100,15,25,12,ES_RIGHT | ES_AUTOHSCROLL
-    GROUPBOX        "Client Settings",IDC_CLIENTSETTINGSBLOCK,5,35,180,40,0,WS_EX_TRANSPARENT
-    RTEXT           "Ask Server to Pause when",IDC_LABEL_PAUSEINTERVAL,10,45,85,10,SS_CENTERIMAGE
+    GROUPBOX        "Client Settings",IDC_CLIENTSETTINGSBLOCK,5,35,180,40,0,
+                    WS_EX_TRANSPARENT
+    RTEXT           "Ask Server to Pause when",IDC_LABEL_PAUSEINTERVAL,10,45,
+                    85,10,SS_CENTERIMAGE
     EDITTEXT        IDC_PAUSEINTERVAL,100,45,30,12,ES_RIGHT | ES_AUTOHSCROLL
-    CONTROL         "Spin1",IDC_PAUSESPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_TABSTOP,120,45,10,12
-    LTEXT           "frames behind",IDC_LABEL_PAUSEINTERVAL_TEXT,135,45,45,12,SS_CENTERIMAGE
-    RTEXT           "Maximum Frame Rate Skip",IDC_LABEL_MAXSKIP,10,60,85,10,SS_CENTERIMAGE
+    CONTROL         "Spin1",IDC_PAUSESPIN,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | 
+                    UDS_NOTHOUSANDS | WS_TABSTOP,120,45,10,12
+    LTEXT           "frames behind",IDC_LABEL_PAUSEINTERVAL_TEXT,135,45,45,
+                    12,SS_CENTERIMAGE
+    RTEXT           "Maximum Frame Rate Skip",IDC_LABEL_MAXSKIP,10,60,85,10,
+                    SS_CENTERIMAGE
     EDITTEXT        IDC_MAXSKIP,100,60,30,12,ES_RIGHT | ES_AUTOHSCROLL
-    CONTROL         "Spin2",IDC_MAXSPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_TABSTOP,120,60,10,12
-    GROUPBOX        "Server Settings",IDC_SERVERSETTINGSBLOCK,5,80,180,60,0,WS_EX_TRANSPARENT
-    CONTROL         "Send ROM Image to Client on Connect",IDC_SENDROM,"Button",BS_AUTOCHECKBOX | BS_LEFT | BS_VCENTER | WS_TABSTOP,10,105,173,15
-    CONTROL         "Act as Server",IDC_ACTASSERVER,"Button",BS_AUTOCHECKBOX | BS_LEFT | BS_VCENTER | WS_TABSTOP,10,120,174,15
+    CONTROL         "Spin2",IDC_MAXSPIN,"msctls_updown32",UDS_SETBUDDYINT | 
+                    UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | 
+                    UDS_NOTHOUSANDS | WS_TABSTOP,120,60,10,12
+    GROUPBOX        "Server Settings",IDC_SERVERSETTINGSBLOCK,5,80,180,60,0,
+                    WS_EX_TRANSPARENT
+    CONTROL         "Send ROM Image to Client on Connect",IDC_SENDROM,"Button",
+                    BS_AUTOCHECKBOX | BS_LEFT | BS_VCENTER | WS_TABSTOP,10,
+                    105,173,15
+    CONTROL         "Act as Server",IDC_ACTASSERVER,"Button",BS_AUTOCHECKBOX | 
+                    BS_LEFT | BS_VCENTER | WS_TABSTOP,10,120,174,15
     DEFPUSHBUTTON   "OK",IDOK,80,145,50,14
     PUSHBUTTON      "Cancel",IDCANCEL,135,145,50,14
-    CONTROL         "Sync By Reset",IDC_SYNCBYRESET,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,90,174,15
+    CONTROL         "Sync By Reset",IDC_SYNCBYRESET,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,10,90,174,15
 END
 
 IDD_NEWDISPLAY DIALOGEX 0, 0, 337, 206
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | 
-    WS_CLIPCHILDREN | WS_CAPTION
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION
 CAPTION "Display Settings"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -288,92 +388,145 @@
     PUSHBUTTON      "Cancel",IDCANCEL,60,185,50,14
     PUSHBUTTON      "Test Mode",IDC_TESTMODE,291,147,39,14
     PUSHBUTTON      "Set Mode",IDC_SETDMODE,291,165,39,13
-    CONTROL         "List1",IDC_VIDMODELIST,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,185,15,145,128
-    CONTROL         "Show Frame Rate",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,101,133,73,8
-    CONTROL         "Stretch Image",IDC_STRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,25,60,10
-    CONTROL         "Full Screen",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,15,51,10
-    CONTROL         "Bi-Linear Mode 7",IDC_BILINEARMD7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,36,69,10
+    CONTROL         "List1",IDC_VIDMODELIST,"SysListView32",LVS_REPORT | 
+                    WS_BORDER | WS_TABSTOP,185,15,145,128
+    CONTROL         "Show Frame Rate",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,101,133,73,8
+    CONTROL         "Stretch Image",IDC_STRETCH,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,25,60,10
+    CONTROL         "Full Screen",IDC_FULLSCREEN,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,15,51,10
+    CONTROL         "Bi-Linear Mode 7",IDC_BILINEARMD7,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,100,36,69,10
     GROUPBOX        "SNES Image",IDC_STATIC,95,5,75,67,0,WS_EX_TRANSPARENT
-    CONTROL         "Transparency",IDC_TRANS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,15,59,10
-    CONTROL         "Hi Res",IDC_HIRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,25,37,10
-    GROUPBOX        "Output Image Processing",IDC_STATIC,3,74,167,46,0,WS_EX_TRANSPARENT
-    COMBOBOX        IDC_FILTERBOX,10,85,153,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Automatic Frame Skipping",IDC_AUTOFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,5,122,98,10
-    CONTROL         "Use Frame Rate Limiter",IDC_LIMITFRAMES,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,5,132,89,10
-    GROUPBOX        "Fixed Frame Skipping Rate",IDC_STATIC,3,142,167,40,0,WS_EX_TRANSPARENT
-    CONTROL         "Slider2",IDC_FRAMERATESKIPSLIDER,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,7,159,160,19
-    GROUPBOX        "Fullscreen Display Settings",IDC_STATIC,180,5,155,177,0,WS_EX_TRANSPARENT
-    CONTROL         "Enable Triple Buffering",IDC_DBLBUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,185,149,87,10
+    CONTROL         "Transparency",IDC_TRANS,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,100,15,59,10
+    CONTROL         "Hi Res",IDC_HIRES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,
+                    100,25,37,10
+    GROUPBOX        "Output Image Processing",IDC_STATIC,3,74,167,46,0,
+                    WS_EX_TRANSPARENT
+    COMBOBOX        IDC_FILTERBOX,10,85,153,90,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "Automatic Frame Skipping",IDC_AUTOFRAME,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,5,122,98,10
+    CONTROL         "Use Frame Rate Limiter",IDC_LIMITFRAMES,"Button",
+                    BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,5,132,89,10
+    GROUPBOX        "Fixed Frame Skipping Rate",IDC_STATIC,3,142,167,40,0,
+                    WS_EX_TRANSPARENT
+    CONTROL         "Slider2",IDC_FRAMERATESKIPSLIDER,"msctls_trackbar32",
+                    TBS_AUTOTICKS | WS_TABSTOP,7,159,160,19
+    GROUPBOX        "Fullscreen Display Settings",IDC_STATIC,180,5,155,177,0,
+                    WS_EX_TRANSPARENT
+    CONTROL         "Enable Triple Buffering",IDC_DBLBUFFER,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,185,149,87,10
     LTEXT           "Current Mode: 1024x1024x16",IDC_CURRMODE,185,165,94,8
     LTEXT           "0",IDC_STATIC,14,150,11,8
     RTEXT           "9",IDC_STATIC,148,153,11,8
-    CONTROL         "Extend Height",IDC_HEIGHT_EXTEND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,47,61,10
-    CONTROL         "Use Video Memory",IDC_VIDEOCARD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,48,75,8
-    CONTROL         "Maintain Aspect Ratio",IDC_ASPECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,37,81,8
-    COMBOBOX        IDC_FILTERBOX2,41,101,122,90,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "Extend Height",IDC_HEIGHT_EXTEND,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,100,47,61,10
+    CONTROL         "Use Video Memory",IDC_VIDEOCARD,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,48,75,8
+    CONTROL         "Maintain Aspect Ratio",IDC_ASPECT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,7,37,81,8
+    COMBOBOX        IDC_FILTERBOX2,41,101,122,90,CBS_DROPDOWNLIST | 
+                    WS_VSCROLL | WS_TABSTOP
     LTEXT           "Hi Res:",IDC_HIRESLABEL,10,104,31,8
     GROUPBOX        "General",IDC_STATIC,3,5,88,67,0,WS_EX_TRANSPARENT
-    CONTROL         "Local Vid Mem",IDC_LOCALVIDMEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,59,61,8
-    CONTROL         "Text in Image",IDC_MESSAGES_IN_IMAGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,57,59,10
+    CONTROL         "Local Vid Mem",IDC_LOCALVIDMEM,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,7,59,61,8
+    CONTROL         "Text in Image",IDC_MESSAGES_IN_IMAGE,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,100,57,59,10
 END
 
 IDD_CHEATER DIALOGEX 0, 0, 262, 218
-STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | 
+    WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | 
+    WS_SYSMENU
 CAPTION "Cheat Entry and Editor"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    CONTROL         "List1",IDC_CHEAT_LIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,5,5,200,125,WS_EX_CLIENTEDGE
+    CONTROL         "List1",IDC_CHEAT_LIST,"SysListView32",LVS_REPORT | 
+                    LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | 
+                    WS_BORDER | WS_TABSTOP,5,5,200,125,WS_EX_CLIENTEDGE
     PUSHBUTTON      "&Add",IDC_ADD_CHEAT,215,5,40,15,WS_DISABLED
     PUSHBUTTON      "&Delete",IDC_DELETE_CHEAT,215,25,40,15,WS_DISABLED
     PUSHBUTTON      "&Update",IDC_UPDATE_CHEAT,215,45,40,15,WS_DISABLED
     PUSHBUTTON      "C&lear",IDC_CLEAR_CHEATS,215,65,40,15
-    EDITTEXT        IDC_CHEAT_CODE,86,134,118,15,ES_UPPERCASE | ES_AUTOHSCROLL
+    EDITTEXT        IDC_CHEAT_CODE,86,134,118,15,ES_UPPERCASE | 
+                    ES_AUTOHSCROLL
     EDITTEXT        IDC_CHEAT_DESCRIPTION,85,154,119,15,ES_AUTOHSCROLL
-    EDITTEXT        IDC_CHEAT_ADDRESS,85,175,44,15,ES_UPPERCASE | ES_AUTOHSCROLL
-    EDITTEXT        IDC_CHEAT_BYTE,215,175,26,15,ES_UPPERCASE | ES_AUTOHSCROLL
+    EDITTEXT        IDC_CHEAT_ADDRESS,85,175,44,15,ES_UPPERCASE | 
+                    ES_AUTOHSCROLL
+    EDITTEXT        IDC_CHEAT_BYTE,215,175,26,15,ES_UPPERCASE | 
+                    ES_AUTOHSCROLL
     PUSHBUTTON      "&OK",IDOK,93,196,50,15
     PUSHBUTTON      "&Cancel",IDCANCEL,151,196,50,15
-    RTEXT           "Enter Cheat Code:",IDC_LABEL_CHEAT_CODE,23,134,59,15,SS_CENTERIMAGE
-    RTEXT           "Cheat Description",IDC_LABEL_CHEAT_DESCRIPTION,19,154,61,15,SS_CENTERIMAGE
-    RTEXT           "Cheat Address (hex)",IDC_LABEL_CHEAT_ADDRESS,18,175,64,15,SS_CENTERIMAGE
-    RTEXT           "New Value (dec or hex)",IDC_LABEL_CHEAT_BYTE,134,175,74,15,SS_CENTERIMAGE
+    RTEXT           "Enter Cheat Code:",IDC_LABEL_CHEAT_CODE,23,134,59,15,
+                    SS_CENTERIMAGE
+    RTEXT           "Cheat Description",IDC_LABEL_CHEAT_DESCRIPTION,19,154,
+                    61,15,SS_CENTERIMAGE
+    RTEXT           "Cheat Address (hex)",IDC_LABEL_CHEAT_ADDRESS,18,175,64,
+                    15,SS_CENTERIMAGE
+    RTEXT           "New Value (dec or hex)",IDC_LABEL_CHEAT_BYTE,134,175,74,
+                    15,SS_CENTERIMAGE
 END
 
-IDD_NETPLAYPROGRESS DIALOG  0, 0, 186, 61
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+IDD_NETPLAYPROGRESS DIALOG DISCARDABLE  0, 0, 186, 61
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Dialog"
 FONT 8, "MS Sans Serif"
 BEGIN
     LTEXT           "Static",IDC_STATIC,5,0,160,20
-    CONTROL         "Progress1",IDC_NPPROGRESS,"msctls_progress32",WS_BORDER,5,30,160,25
+    CONTROL         "Progress1",IDC_NPPROGRESS,"msctls_progress32",WS_BORDER,
+                    5,30,160,25
 END
 
 IDD_INPUTCONFIG DIALOGEX 0, 0, 327, 150
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION
 CAPTION " "
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
-    COMBOBOX        IDC_JPCOMBO,12,11,77,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL         "Enabled",IDC_JPTOGGLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,100,13,42,10
-    CONTROL         "WOG!",IDC_UP,"InputCustom",WS_TABSTOP,50,39,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_LEFT,"InputCustom",WS_TABSTOP,50,52,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_DOWN,"InputCustom",WS_TABSTOP,50,65,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_RIGHT,"InputCustom",WS_TABSTOP,50,78,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_B,"InputCustom",WS_TABSTOP,50,91,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_A,"InputCustom",WS_TABSTOP,50,104,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_Y,"InputCustom",WS_TABSTOP,50,117,71,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_X,"InputCustom",WS_TABSTOP,50,129,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_START,"InputCustom",WS_TABSTOP,161,39,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_SELECT,"InputCustom",WS_TABSTOP,161,52,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_L,"InputCustom",WS_TABSTOP,161,65,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_R,"InputCustom",WS_TABSTOP,161,78,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_UPLEFT,"InputCustom",WS_DISABLED | WS_TABSTOP,161,91,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_UPRIGHT,"InputCustom",WS_DISABLED | WS_TABSTOP,161,104,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_DWNRIGHT,"InputCustom",WS_DISABLED | WS_TABSTOP,161,117,71,12,WS_EX_CLIENTEDGE
-    CONTROL         " ",IDC_DWNLEFT,"InputCustom",WS_DISABLED | WS_TABSTOP,161,129,71,12,WS_EX_CLIENTEDGE
+    COMBOBOX        IDC_JPCOMBO,12,11,77,60,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
+    CONTROL         "Enabled",IDC_JPTOGGLE,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,100,13,42,10
+    CONTROL         "WOG!",IDC_UP,"InputCustom",WS_TABSTOP,50,39,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_LEFT,"InputCustom",WS_TABSTOP,50,52,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_DOWN,"InputCustom",WS_TABSTOP,50,65,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_RIGHT,"InputCustom",WS_TABSTOP,50,78,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_B,"InputCustom",WS_TABSTOP,50,91,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_A,"InputCustom",WS_TABSTOP,50,104,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_Y,"InputCustom",WS_TABSTOP,50,117,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_X,"InputCustom",WS_TABSTOP,50,129,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_START,"InputCustom",WS_TABSTOP,161,39,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_SELECT,"InputCustom",WS_TABSTOP,161,52,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_L,"InputCustom",WS_TABSTOP,161,65,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_R,"InputCustom",WS_TABSTOP,161,78,71,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_UPLEFT,"InputCustom",WS_DISABLED | WS_TABSTOP,
+                    161,91,71,12,WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_UPRIGHT,"InputCustom",WS_DISABLED | WS_TABSTOP,
+                    161,104,71,12,WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_DWNRIGHT,"InputCustom",WS_DISABLED | WS_TABSTOP,
+                    161,117,71,12,WS_EX_CLIENTEDGE
+    CONTROL         " ",IDC_DWNLEFT,"InputCustom",WS_DISABLED | WS_TABSTOP,
+                    161,129,71,12,WS_EX_CLIENTEDGE
     PUSHBUTTON      "Cancel",IDCANCEL,242,127,39,14
     PUSHBUTTON      "OK",IDOK,282,127,41,14
-    LTEXT           "Blue means the button is already mapped.\nPink means it conflicts with a custom hotkey.\nRed means it's reserved by Windows.\nButtons can be disabled using Escape.",IDC_LABEL_BLUE,166,0,157,32
+    LTEXT           "Blue means the button is already mapped.\nPink means it conflicts with a custom hotkey.\nRed means it's reserved by Windows.\nButtons can be disabled using Escape.",
+                    IDC_LABEL_BLUE,166,0,157,32
     RTEXT           "UP",IDC_LABEL_UP,8,42,38,8
     RTEXT           "RIGHT",IDC_LABEL_RIGHT,6,81,41,8
     RTEXT           "LEFT",IDC_LABEL_LEFT,9,55,37,8
@@ -391,53 +544,78 @@
     RTEXT           "UP RIGHT",IDC_LABEL_UPRIGHT,122,107,36,8
     RTEXT           "DN LEFT",IDC_LABEL_DOWNLEFT,127,132,31,8
     CONTROL         133,IDC_STATIC,"Static",SS_BITMAP,243,39,80,74
-    CONTROL         "Allow Left+Rt/Up+Dn",IDC_ALLOWLEFTRIGHT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,243,115,80,11
+    CONTROL         "Allow Left+Rt/Up+Dn",IDC_ALLOWLEFTRIGHT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,243,115,80,11
     GROUPBOX        "Controller",IDC_STATIC,5,1,142,28,0,WS_EX_TRANSPARENT
     GROUPBOX        "Buttons",IDC_STATIC,5,30,234,117,0,WS_EX_TRANSPARENT
 END
 
 IDD_CHEAT_SEARCH DIALOGEX 0, 0, 272, 275
-STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_VISIBLE | 
+    WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
 CAPTION "Cheat Search"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
     DEFPUSHBUTTON   "&OK",IDOK,161,253,50,14
     PUSHBUTTON      "&Cancel",IDCANCEL,218,253,50,14
-    CONTROL         "List1",IDC_ADDYS,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,7,7,201,152,WS_EX_CLIENTEDGE
+    CONTROL         "List1",IDC_ADDYS,"SysListView32",LVS_REPORT | 
+                    LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | 
+                    WS_BORDER | WS_TABSTOP,7,7,201,152,WS_EX_CLIENTEDGE
     PUSHBUTTON      "&Search",IDC_C_SEARCH,215,7,52,16
     PUSHBUTTON      "&Add Cheat",IDC_C_ADD,215,29,52,16,WS_DISABLED
     PUSHBUTTON      "&Reset",IDC_C_RESET,215,51,52,16
-    CONTROL         "1 byte",IDC_1_BYTE,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,212,172,42,11
-    CONTROL         "2 bytes",IDC_2_BYTE,"Button",BS_AUTORADIOBUTTON,212,185,42,11
-    CONTROL         "3 bytes",IDC_3_BYTE,"Button",BS_AUTORADIOBUTTON,212,198,42,11
-    CONTROL         "4 bytes",IDC_4_BYTE,"Button",BS_AUTORADIOBUTTON,212,211,42,11
+    CONTROL         "1 byte",IDC_1_BYTE,"Button",BS_AUTORADIOBUTTON | 
+                    WS_GROUP | WS_TABSTOP,212,172,42,11
+    CONTROL         "2 bytes",IDC_2_BYTE,"Button",BS_AUTORADIOBUTTON,212,185,
+                    42,11
+    CONTROL         "3 bytes",IDC_3_BYTE,"Button",BS_AUTORADIOBUTTON,212,198,
+                    42,11
+    CONTROL         "4 bytes",IDC_4_BYTE,"Button",BS_AUTORADIOBUTTON,212,211,
+                    42,11
     GROUPBOX        "Data Size",IDC_STATIC,205,162,54,66,0,WS_EX_TRANSPARENT
-    GROUPBOX        "Comparison Type",IDC_STATIC,7,162,114,86,0,WS_EX_TRANSPARENT
-    CONTROL         "< (Less Than)",IDC_LESS_THAN,"Button",BS_AUTORADIOBUTTON | WS_GROUP,13,170,90,11
-    CONTROL         "> (Greater Than)",IDC_GREATER_THAN,"Button",BS_AUTORADIOBUTTON,13,182,90,11
-    CONTROL         "<= (Less Than or Equal to)",IDC_LESS_THAN_EQUAL,"Button",BS_AUTORADIOBUTTON,13,194,106,11
+    GROUPBOX        "Comparison Type",IDC_STATIC,7,162,114,86,0,
+                    WS_EX_TRANSPARENT
+    CONTROL         "< (Less Than)",IDC_LESS_THAN,"Button",
+                    BS_AUTORADIOBUTTON | WS_GROUP,13,170,90,11
+    CONTROL         "> (Greater Than)",IDC_GREATER_THAN,"Button",
+                    BS_AUTORADIOBUTTON,13,182,90,11
+    CONTROL         "<= (Less Than or Equal to)",IDC_LESS_THAN_EQUAL,"Button",
+                    BS_AUTORADIOBUTTON,13,194,106,11
     CONTROL         ">= (Greater than or Equal To)",IDC_GREATER_THAN_EQUAL,
                     "Button",BS_AUTORADIOBUTTON,13,206,105,11
-    CONTROL         "= (Equal To)",IDC_EQUAL,"Button",BS_AUTORADIOBUTTON,13,218,90,11
-    CONTROL         "!= (Not Equal To)",IDC_NOT_EQUAL,"Button",BS_AUTORADIOBUTTON,13,230,90,11
+    CONTROL         "= (Equal To)",IDC_EQUAL,"Button",BS_AUTORADIOBUTTON,13,
+                    218,90,11
+    CONTROL         "!= (Not Equal To)",IDC_NOT_EQUAL,"Button",
+                    BS_AUTORADIOBUTTON,13,230,90,11
     GROUPBOX        "Data Type",IDC_STATIC,125,206,75,43,0,WS_EX_TRANSPARENT
-    GROUPBOX        "Compare To",IDC_STATIC,125,162,75,42,0,WS_EX_TRANSPARENT
-    CONTROL         "Previous Value",IDC_PREV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,129,171,67,10
-    CONTROL         "Entered Value",IDC_ENTERED,"Button",BS_AUTORADIOBUTTON,129,181,67,10
-    CONTROL         "Entered Address",IDC_ENTEREDADDRESS,"Button",BS_AUTORADIOBUTTON,129,192,67,10
-    CONTROL         "Unsigned (>=0)",IDC_UNSIGNED,"Button",BS_AUTORADIOBUTTON | WS_GROUP,129,216,67,10
-    CONTROL         "Signed (+/-)",IDC_SIGNED,"Button",BS_AUTORADIOBUTTON,129,226,67,10
-    CONTROL         "Hexadecimal",IDC_HEX,"Button",BS_AUTORADIOBUTTON,129,236,67,10
-    EDITTEXT        IDC_VALUE_ENTER,72,253,83,12,ES_UPPERCASE | ES_AUTOHSCROLL | WS_DISABLED
-    RTEXT           "Enter a Value:",IDC_ENTER_LABEL,7,253,54,12,SS_CENTERIMAGE | WS_DISABLED
+    GROUPBOX        "Compare To",IDC_STATIC,125,162,75,42,0,
+                    WS_EX_TRANSPARENT
+    CONTROL         "Previous Value",IDC_PREV,"Button",BS_AUTORADIOBUTTON | 
+                    WS_GROUP,129,171,67,10
+    CONTROL         "Entered Value",IDC_ENTERED,"Button",BS_AUTORADIOBUTTON,
+                    129,181,67,10
+    CONTROL         "Entered Address",IDC_ENTEREDADDRESS,"Button",
+                    BS_AUTORADIOBUTTON,129,192,67,10
+    CONTROL         "Unsigned (>=0)",IDC_UNSIGNED,"Button",
+                    BS_AUTORADIOBUTTON | WS_GROUP,129,216,67,10
+    CONTROL         "Signed (+/-)",IDC_SIGNED,"Button",BS_AUTORADIOBUTTON,
+                    129,226,67,10
+    CONTROL         "Hexadecimal",IDC_HEX,"Button",BS_AUTORADIOBUTTON,129,
+                    236,67,10
+    EDITTEXT        IDC_VALUE_ENTER,72,253,83,12,ES_UPPERCASE | 
+                    ES_AUTOHSCROLL | WS_DISABLED
+    RTEXT           "Enter a Value:",IDC_ENTER_LABEL,7,253,54,12,
+                    SS_CENTERIMAGE | WS_DISABLED
     PUSHBUTTON      "&Watch",IDC_C_WATCH,215,91,52,16
     PUSHBUTTON      "&Clear Watches",IDC_C_CLEARWATCH,215,108,52,16
     PUSHBUTTON      "&Load Watches",IDC_C_LOADWATCH,215,125,52,16
     PUSHBUTTON      "Sa&ve Watches",IDC_C_SAVEWATCH,215,142,52,16
 END
 
-IDD_CHEAT_FROM_SEARCH DIALOG  0, 0, 187, 143
-STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+IDD_CHEAT_FROM_SEARCH DIALOG DISCARDABLE  0, 0, 187, 143
+STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | 
+    WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | 
+    WS_SYSMENU
 CAPTION "Cheat Details"
 FONT 8, "MS Sans Serif"
 BEGIN
@@ -456,9 +634,9 @@
 END
 
 IDD_OPENMOVIE DIALOGEX 0, 0, 304, 223
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Play Movie"
-FONT 8, "MS Sans Serif", 0, 0, 0x0
+FONT 8, "MS Sans Serif"
 BEGIN
     DEFPUSHBUTTON   "OK",IDOK,187,200,50,14
     PUSHBUTTON      "Cancel",IDCANCEL,246,200,50,14
@@ -474,34 +652,54 @@
     LTEXT           "FRAMES",IDC_MOVIE_FRAMES,71,73,81,8
     LTEXT           "RERECORD",IDC_MOVIE_RERECORD,71,82,81,8
     LTEXT           "Author Info:",IDC_LABEL_MOVIEINFOBOX,30,99,38,8
-    CONTROL         "Open Read-Only",IDC_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,7,69,10
+    CONTROL         "Open Read-Only",IDC_READONLY,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,172,7,69,10
     LTEXT           "Static",IDC_MOVIE_METADATA,70,99,226,21,WS_BORDER
     GROUPBOX        "Record Options",IDC_LABEL_STARTSETTINGS,7,133,77,61
-    CONTROL         "Record from now",IDC_RECORD_NOW,"Button",BS_AUTORADIOBUTTON | WS_DISABLED | WS_GROUP | WS_TABSTOP,11,169,70,10
-    CONTROL         "Record from reset",IDC_RECORD_RESET,"Button",BS_AUTORADIOBUTTON | WS_DISABLED | WS_TABSTOP,11,154,72,10
-    CONTROL         "Joypad 1",IDC_JOY1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,98,142,45,10
-    CONTROL         "Joypad 3",IDC_JOY3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,98,162,45,10
-    CONTROL         "Joypad 2",IDC_JOY2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,98,152,45,10
-    CONTROL         "Joypad 4",IDC_JOY4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,98,172,45,10
-    CONTROL         "Joypad 5",IDC_JOY5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,98,183,45,10
-    GROUPBOX        "Record Controllers",IDC_LABEL_CONTROLLERSETTINGS,89,133,69,61
-    CONTROL         "Use WIP1 Timing",IDC_WIP1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,142,71,10
-    CONTROL         "Volume Envelope Height Reading",IDC_ENVX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,162,123,10
-    CONTROL         "Fake Mute desync workaround",IDC_FMUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,173,114,10
-    GROUPBOX        "Emulator Sync Settings",IDC_LABEL_SYNCSETTINGS,163,133,133,61
-    CONTROL         "Allow Left+Right / Up+Down",IDC_ALLOWLEFTRIGHT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,151,118,11
+    CONTROL         "Record from now",IDC_RECORD_NOW,"Button",
+                    BS_AUTORADIOBUTTON | WS_DISABLED | WS_GROUP | WS_TABSTOP,
+                    11,169,70,10
+    CONTROL         "Record from reset",IDC_RECORD_RESET,"Button",
+                    BS_AUTORADIOBUTTON | WS_DISABLED | WS_TABSTOP,11,154,72,
+                    10
+    CONTROL         "Joypad 1",IDC_JOY1,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,98,142,45,10
+    CONTROL         "Joypad 3",IDC_JOY3,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,98,162,45,10
+    CONTROL         "Joypad 2",IDC_JOY2,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,98,152,45,10
+    CONTROL         "Joypad 4",IDC_JOY4,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,98,172,45,10
+    CONTROL         "Joypad 5",IDC_JOY5,"Button",BS_AUTOCHECKBOX | 
+                    WS_DISABLED | WS_TABSTOP,98,183,45,10
+    GROUPBOX        "Record Controllers",IDC_LABEL_CONTROLLERSETTINGS,89,133,
+                    69,61
+    CONTROL         "Use WIP1 Timing",IDC_WIP1,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,172,142,71,10
+    CONTROL         "Volume Envelope Height Reading",IDC_ENVX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,162,123,10
+    CONTROL         "Fake Mute desync workaround",IDC_FMUT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,173,114,10
+    GROUPBOX        "Emulator Sync Settings",IDC_LABEL_SYNCSETTINGS,163,133,
+                    133,61
+    CONTROL         "Allow Left+Right / Up+Down",IDC_ALLOWLEFTRIGHT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,151,118,11
     CONTROL         "Sync samples with sound CPU",IDC_SYNC_TO_SOUND_CPU,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,183,117,10
-    LTEXT           "                                                        ",IDC_LOADEDFROMMOVIE,169,124,127,8
-    LTEXT           "Movie's ROM: CRC32=Unknown, Name=Unknown",IDC_MOVIEROMINFO,8,35,1024,8
-    LTEXT           "Current ROM: CRC32=Unknown, Name=Unknown",IDC_CURRENTROMINFO,9,43,287,9
+    LTEXT           "                                                        ",
+                    IDC_LOADEDFROMMOVIE,169,124,127,8
+    LTEXT           "Movie's ROM: CRC32=Unknown, Name=Unknown",
+                    IDC_MOVIEROMINFO,8,35,1024,8
+    LTEXT           "Current ROM: CRC32=Unknown, Name=Unknown",
+                    IDC_CURRENTROMINFO,9,43,287,9
     LTEXT           " ",IDC_PLAYWARN,10,203,167,15
-    CONTROL         "Seek To Frame:",IDC_SEEK_TO_FRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,81,61,10
+    CONTROL         "Seek To Frame:",IDC_SEEK_TO_FRAME,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,81,61,10
     EDITTEXT        IDC_FRAME_NUMBER,237,80,60,13,ES_AUTOHSCROLL
 END
 
 IDD_CREATEMOVIE DIALOGEX 0, 0, 303, 150
-STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
 CAPTION "Record Movie"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -511,28 +709,42 @@
     LTEXT           "Movie File",IDC_STATIC,7,7,33,8
     PUSHBUTTON      "&Browse...",IDC_BROWSE_MOVIE,248,17,48,14
     GROUPBOX        "Record Options",IDC_LABEL_STARTSETTINGS,7,38,77,61
-    CONTROL         "Record from now",IDC_RECORD_NOW,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,11,65,70,10
-    CONTROL         "Record from reset",IDC_RECORD_RESET,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,11,52,72,10
-    CONTROL         "Joypad 1",IDC_JOY1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,98,47,45,10
-    CONTROL         "Joypad 3",IDC_JOY3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,98,67,45,10
-    CONTROL         "Joypad 2",IDC_JOY2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,98,57,45,10
-    CONTROL         "Joypad 4",IDC_JOY4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,98,77,45,10
-    CONTROL         "Joypad 5",IDC_JOY5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,98,87,45,10
-    GROUPBOX        "Record Controllers",IDC_LABEL_CONTROLLERSETTINGS,89,38,69,61
+    CONTROL         "Record from now",IDC_RECORD_NOW,"Button",
+                    BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,11,65,70,10
+    CONTROL         "Record from reset",IDC_RECORD_RESET,"Button",
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,11,52,72,10
+    CONTROL         "Joypad 1",IDC_JOY1,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,98,47,45,10
+    CONTROL         "Joypad 3",IDC_JOY3,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,98,67,45,10
+    CONTROL         "Joypad 2",IDC_JOY2,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,98,57,45,10
+    CONTROL         "Joypad 4",IDC_JOY4,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,98,77,45,10
+    CONTROL         "Joypad 5",IDC_JOY5,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,98,87,45,10
+    GROUPBOX        "Record Controllers",IDC_LABEL_CONTROLLERSETTINGS,89,38,
+                    69,61
     EDITTEXT        IDC_MOVIE_METADATA,67,105,229,14,ES_AUTOHSCROLL
     LTEXT           "Author Info:",IDC_STATIC,18,108,43,8,0,WS_EX_RIGHT
-    CONTROL         "Use WIP1 Timing",IDC_WIP1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,47,71,10
-    CONTROL         "Volume Envelope Height Reading",IDC_ENVX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,67,123,10
+    CONTROL         "Use WIP1 Timing",IDC_WIP1,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,172,47,71,10
+    CONTROL         "Volume Envelope Height Reading",IDC_ENVX,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,67,123,10
     GROUPBOX        "Emulator Sync Settings",IDC_STATIC,163,38,133,61
-    CONTROL         "Allow Left+Right / Up+Down",IDC_ALLOWLEFTRIGHT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,57,118,10
-    CONTROL         "Fake Mute desync workaround",IDC_FMUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,77,114,10
+    CONTROL         "Allow Left+Right / Up+Down",IDC_ALLOWLEFTRIGHT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,57,118,10
+    CONTROL         "Fake Mute desync workaround",IDC_FMUT,"Button",
+                    BS_AUTOCHECKBOX | WS_TABSTOP,172,77,114,10
     CONTROL         "Sync samples with sound CPU",IDC_SYNC_TO_SOUND_CPU,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,172,87,117,10
-    CONTROL         "Clear SRAM",IDC_CLEARSRAM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,83,70,10
+    CONTROL         "Clear SRAM",IDC_CLEARSRAM,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP,12,83,70,10
 END
 
 IDD_KEYCUSTOM DIALOGEX 0, 0, 349, 203
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION
 CAPTION "Customize Special Keys"
 FONT 8, "MS Sans Serif", 0, 0, 0x1
 BEGIN
@@ -548,99 +760,171 @@
     RTEXT           "movie read-only",IDC_LABEL_HK12,3,150,59,8
     RTEXT           "superscope pause",IDC_LABEL_HK9,2,111,60,8
     RTEXT           "skip -",IDC_LABEL_HK7,3,85,59,8
-    CONTROL         "",IDC_HOTKEY1,"InputCustomHot",WS_TABSTOP,66,5,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY2,"InputCustomHot",WS_TABSTOP,66,18,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY3,"InputCustomHot",WS_TABSTOP,66,31,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY4,"InputCustomHot",WS_TABSTOP,66,45,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY5,"InputCustomHot",WS_TABSTOP,66,58,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY6,"InputCustomHot",WS_TABSTOP,66,70,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY7,"InputCustomHot",WS_TABSTOP,66,83,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY8,"InputCustomHot",WS_TABSTOP,66,96,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY9,"InputCustomHot",WS_TABSTOP,66,109,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY10,"InputCustomHot",WS_TABSTOP,66,122,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY11,"InputCustomHot",WS_TABSTOP,66,135,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY12,"InputCustomHot",WS_TABSTOP,66,149,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_HOTKEY13,"InputCustomHot",WS_TABSTOP,66,162,98,12,WS_EX_CLIENTEDGE
-    CONTROL         "",IDC_SAVE1,"InputCustomHot",WS_TABSTOP,192,5,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY1,"InputCustomHot",WS_TABSTOP,66,5,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY2,"InputCustomHot",WS_TABSTOP,66,18,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY3,"InputCustomHot",WS_TABSTOP,66,31,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY4,"InputCustomHot",WS_TABSTOP,66,45,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY5,"InputCustomHot",WS_TABSTOP,66,58,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY6,"InputCustomHot",WS_TABSTOP,66,70,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY7,"InputCustomHot",WS_TABSTOP,66,83,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY8,"InputCustomHot",WS_TABSTOP,66,96,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY9,"InputCustomHot",WS_TABSTOP,66,109,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY10,"InputCustomHot",WS_TABSTOP,66,122,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY11,"InputCustomHot",WS_TABSTOP,66,135,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY12,"InputCustomHot",WS_TABSTOP,66,149,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_HOTKEY13,"InputCustomHot",WS_TABSTOP,66,162,98,12,
+                    WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE1,"InputCustomHot",WS_TABSTOP,192,5,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save1",IDC_LABEL_UP2,170,21,20,8
-    CONTROL         "",IDC_SAVE2,"InputCustomHot",WS_TABSTOP,192,18,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE2,"InputCustomHot",WS_TABSTOP,192,18,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save2",IDC_LABEL_UP3,170,34,20,8
-    CONTROL         "",IDC_SAVE3,"InputCustomHot",WS_TABSTOP,192,31,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE3,"InputCustomHot",WS_TABSTOP,192,31,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save3",IDC_LABEL_UP4,170,47,20,8
-    CONTROL         "",IDC_SAVE4,"InputCustomHot",WS_TABSTOP,192,45,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE4,"InputCustomHot",WS_TABSTOP,192,45,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save4",IDC_LABEL_UP5,170,58,20,8
-    CONTROL         "",IDC_SAVE5,"InputCustomHot",WS_TABSTOP,192,58,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE5,"InputCustomHot",WS_TABSTOP,192,58,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save5",IDC_LABEL_UP6,170,72,20,8
-    CONTROL         "",IDC_SAVE6,"InputCustomHot",WS_TABSTOP,192,71,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE6,"InputCustomHot",WS_TABSTOP,192,71,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save6",IDC_LABEL_UP7,170,85,20,8
-    CONTROL         "",IDC_SAVE7,"InputCustomHot",WS_TABSTOP,192,82,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE7,"InputCustomHot",WS_TABSTOP,192,82,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save7",IDC_LABEL_UP8,170,98,20,8
-    CONTROL         "",IDC_SAVE8,"InputCustomHot",WS_TABSTOP,192,96,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE8,"InputCustomHot",WS_TABSTOP,192,96,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save8",IDC_LABEL_UP9,170,112,20,8
-    CONTROL         "",IDC_SAVE9,"InputCustomHot",WS_TABSTOP,192,109,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE9,"InputCustomHot",WS_TABSTOP,192,109,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save9",IDC_LABEL_UP10,170,125,20,8
-    CONTROL         "",IDC_SAVE10,"InputCustomHot",WS_TABSTOP,192,122,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE10,"InputCustomHot",WS_TABSTOP,192,122,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "save0",IDC_LABEL_UP11,170,8,20,8
-    CONTROL         "",IDC_SAVE11,"InputCustomHot",WS_TABSTOP,279,5,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE11,"InputCustomHot",WS_TABSTOP,279,5,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load1",IDC_LABEL_UP12,257,21,20,8
-    CONTROL         "",IDC_SAVE12,"InputCustomHot",WS_TABSTOP,279,18,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE12,"InputCustomHot",WS_TABSTOP,279,18,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load2",IDC_LABEL_UP13,257,34,20,8
-    CONTROL         "",IDC_SAVE13,"InputCustomHot",WS_TABSTOP,279,31,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE13,"InputCustomHot",WS_TABSTOP,279,31,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load3",IDC_LABEL_UP14,257,48,20,8
-    CONTROL         "",IDC_SAVE14,"InputCustomHot",WS_TABSTOP,279,45,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE14,"InputCustomHot",WS_TABSTOP,279,45,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load4",IDC_LABEL_UP15,257,61,20,8
-    CONTROL         "",IDC_SAVE15,"InputCustomHot",WS_TABSTOP,279,58,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE15,"InputCustomHot",WS_TABSTOP,279,58,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load5",IDC_LABEL_UP16,257,72,20,8
-    CONTROL         "",IDC_SAVE16,"InputCustomHot",WS_TABSTOP,279,71,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE16,"InputCustomHot",WS_TABSTOP,279,71,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load6",IDC_LABEL_UP17,257,85,20,8
-    CONTROL         "",IDC_SAVE17,"InputCustomHot",WS_TABSTOP,279,82,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE17,"InputCustomHot",WS_TABSTOP,279,82,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load7",IDC_LABEL_UP18,257,98,20,8
-    CONTROL         "",IDC_SAVE18,"InputCustomHot",WS_TABSTOP,279,96,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE18,"InputCustomHot",WS_TABSTOP,279,96,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load8",IDC_LABEL_UP19,257,111,20,8
-    CONTROL         "",IDC_SAVE19,"InputCustomHot",WS_TABSTOP,279,109,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE19,"InputCustomHot",WS_TABSTOP,279,109,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load9",IDC_LABEL_UP20,257,125,20,8
-    CONTROL         "",IDC_SAVE20,"InputCustomHot",WS_TABSTOP,279,122,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SAVE20,"InputCustomHot",WS_TABSTOP,279,122,60,12,
+                    WS_EX_CLIENTEDGE
     RTEXT           "load0",IDC_LABEL_UP21,257,8,20,8
     RTEXT           "fast forward",IDC_LABEL_HK5,3,61,58,8
     RTEXT           "show pressed keys",IDC_LABEL_HK10,1,125,61,8
     RTEXT           "save screenshot",IDC_LABEL_HK13,3,163,59,8
     RTEXT           "slot-",IDC_LABEL_UP22,170,138,20,8
-    CONTROL         "",IDC_SLOTMINUS,"InputCustomHot",WS_TABSTOP,192,135,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SLOTMINUS,"InputCustomHot",WS_TABSTOP,192,135,60,
+                    12,WS_EX_CLIENTEDGE
     RTEXT           "slot+",IDC_LABEL_UP23,257,138,20,8
-    CONTROL         "",IDC_SLOTPLUS,"InputCustomHot",WS_TABSTOP,279,135,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SLOTPLUS,"InputCustomHot",WS_TABSTOP,279,135,60,
+                    12,WS_EX_CLIENTEDGE
     RTEXT           "save#",IDC_LABEL_UP24,166,151,23,8
-    CONTROL         "",IDC_SLOTSAVE,"InputCustomHot",WS_TABSTOP,192,149,60,12,WS_EX_CLIENTEDGE
+    CONTROL         "",IDC_SLOTSAVE,"InputCustomHot",WS_TABSTOP,192,149,60,
+                    12,WS_EX_CLIENTEDGE
     RTEXT           "load#",IDC_LABEL_UP25,253,151,23,8
-    CONTROL         "",IDC_SLOTLOAD,"InputCustomHot",WS_TABSTOP,279,149,60,12,WS_EX_CLIENTEDGE
-    LTEXT           "Blue means the hotkey is already mapped.\nPink means it conflicts with a game button.\nRed means it's reserved by Windows.\nA hotkey can be disabled using Escape.",IDC_LABEL_BLUE,208,164,136,32
-    COMBOBOX        IDC_HKCOMBO,134,183,60,60,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL         "",IDC_SLOTLOAD,"InputCustomHot",WS_TABSTOP,279,149,60,
+                    12,WS_EX_CLIENTEDGE
+    LTEXT           "Blue means the hotkey is already mapped.\nPink means it conflicts with a game button.\nRed means it's reserved by Windows.\nA hotkey can be disabled using Escape.",
+                    IDC_LABEL_BLUE,208,164,136,32
+    COMBOBOX        IDC_HKCOMBO,134,183,60,60,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
 END
 
 IDD_MACRO_SETTINGS DIALOGEX 0, 0, 280, 133
-STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
+STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_3DLOOK | DS_CENTER | WS_VISIBLE | 
+    WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
 CAPTION "Input Macro Editor"
-FONT 8, "MS Sans Serif", 0, 0, 0x0
+FONT 8, "MS Sans Serif"
 BEGIN
-    COMBOBOX        IDC_MACRO1_INPUT,33,7,200,13,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_GROUP
-    CONTROL         "&1P:",IDC_MACRO1_CHECK,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,7,24,13
-    EDITTEXT        IDC_MACRO1_STEP,238,7,35,13,ES_AUTOVSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
-    COMBOBOX        IDC_MACRO2_INPUT,33,25,200,13,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_GROUP
-    CONTROL         "&2P:",IDC_MACRO2_CHECK,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,25,24,13
-    EDITTEXT        IDC_MACRO2_STEP,238,25,35,13,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
-    COMBOBOX        IDC_MACRO3_INPUT,33,43,200,13,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_GROUP
-    CONTROL         "&3P:",IDC_MACRO3_CHECK,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,43,24,13
-    EDITTEXT        IDC_MACRO3_STEP,238,43,35,13,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
-    COMBOBOX        IDC_MACRO4_INPUT,33,61,200,13,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_GROUP
-    CONTROL         "&4P:",IDC_MACRO4_CHECK,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,61,24,13
-    EDITTEXT        IDC_MACRO4_STEP,238,61,35,13,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
-    COMBOBOX        IDC_MACRO5_INPUT,33,79,200,13,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_GROUP
-    CONTROL         "&5P:",IDC_MACRO5_CHECK,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,7,79,24,13
-    EDITTEXT        IDC_MACRO5_STEP,238,79,35,13,ES_AUTOHSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
-    GROUPBOX        "User Input Mode",IDC_STATIC,7,98,146,28,0,WS_EX_TRANSPARENT
-    CONTROL         "&None",IDC_MACRO_METHOD_NONE,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,109,36,13
-    CONTROL         "&Overwrite",IDC_MACRO_METHOD_OVERWRITE,"Button",BS_AUTORADIOBUTTON,53,109,50,13
-    CONTROL         "&Toggle",IDC_MACRO_METHOD_TOGGLE,"Button",BS_AUTORADIOBUTTON,107,109,40,13
-    CONTROL         "&Pause With Macro",IDC_PAUSE_WITH_MACRO,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,159,109,74,13
+    COMBOBOX        IDC_MACRO1_INPUT,33,7,200,13,CBS_DROPDOWN | 
+                    CBS_AUTOHSCROLL | WS_GROUP
+    CONTROL         "&1P:",IDC_MACRO1_CHECK,"Button",BS_AUTOCHECKBOX | 
+                    WS_GROUP | WS_TABSTOP,7,7,24,13
+    EDITTEXT        IDC_MACRO1_STEP,238,7,35,13,ES_AUTOVSCROLL | ES_READONLY | 
+                    WS_GROUP | NOT WS_TABSTOP
+    COMBOBOX        IDC_MACRO2_INPUT,33,25,200,13,CBS_DROPDOWN | 
+                    CBS_AUTOHSCROLL | WS_GROUP
+    CONTROL         "&2P:",IDC_MACRO2_CHECK,"Button",BS_AUTOCHECKBOX | 
+                    WS_GROUP | WS_TABSTOP,7,25,24,13
+    EDITTEXT        IDC_MACRO2_STEP,238,25,35,13,ES_AUTOHSCROLL | 
+                    ES_READONLY | WS_GROUP | NOT WS_TABSTOP
+    COMBOBOX        IDC_MACRO3_INPUT,33,43,200,13,CBS_DROPDOWN | 
+                    CBS_AUTOHSCROLL | WS_GROUP
+    CONTROL         "&3P:",IDC_MACRO3_CHECK,"Button",BS_AUTOCHECKBOX | 
+                    WS_GROUP | WS_TABSTOP,7,43,24,13
+    EDITTEXT        IDC_MACRO3_STEP,238,43,35,13,ES_AUTOHSCROLL | 
+                    ES_READONLY | WS_GROUP | NOT WS_TABSTOP
+    COMBOBOX        IDC_MACRO4_INPUT,33,61,200,13,CBS_DROPDOWN | 
+                    CBS_AUTOHSCROLL | WS_GROUP
+    CONTROL         "&4P:",IDC_MACRO4_CHECK,"Button",BS_AUTOCHECKBOX | 
+                    WS_GROUP | WS_TABSTOP,7,61,24,13
+    EDITTEXT        IDC_MACRO4_STEP,238,61,35,13,ES_AUTOHSCROLL | 
+                    ES_READONLY | WS_GROUP | NOT WS_TABSTOP
+    COMBOBOX        IDC_MACRO5_INPUT,33,79,200,13,CBS_DROPDOWN | 
+                    CBS_AUTOHSCROLL | WS_GROUP
+    CONTROL         "&5P:",IDC_MACRO5_CHECK,"Button",BS_AUTOCHECKBOX | 
+                    WS_GROUP | WS_TABSTOP,7,79,24,13
+    EDITTEXT        IDC_MACRO5_STEP,238,79,35,13,ES_AUTOHSCROLL | 
+                    ES_READONLY | WS_GROUP | NOT WS_TABSTOP
+    GROUPBOX        "User Input Mode",IDC_STATIC,7,98,146,28,0,
+                    WS_EX_TRANSPARENT
+    CONTROL         "&None",IDC_MACRO_METHOD_NONE,"Button",
+                    BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,14,109,36,13
+    CONTROL         "&Overwrite",IDC_MACRO_METHOD_OVERWRITE,"Button",
+                    BS_AUTORADIOBUTTON,53,109,50,13
+    CONTROL         "&Toggle",IDC_MACRO_METHOD_TOGGLE,"Button",
+                    BS_AUTORADIOBUTTON,107,109,40,13
+    CONTROL         "&Pause With Macro",IDC_PAUSE_WITH_MACRO,"Button",
+                    BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,159,109,74,13
+END
+
+IDD_LUA_ADD DIALOGEX 0, 0, 186, 76
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Load Lua Script..."
+FONT 8, "MS Sans Serif"
+BEGIN
+    DEFPUSHBUTTON   "Load && Run",IDOK,70,55,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,129,55,50,14
+    EDITTEXT        IDC_LUA_FILENAME,7,17,116,14,ES_AUTOHSCROLL,
+                    WS_EX_ACCEPTFILES
+    PUSHBUTTON      "Browse...",IDC_LUA_BROWSE,129,17,50,14
 END
 
 
@@ -650,7 +934,7 @@
 //
 
 #ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO 
+GUIDELINES DESIGNINFO MOVEABLE PURE 
 BEGIN
     IDD_SOUND_OPTS, DIALOG
     BEGIN
@@ -795,6 +1079,14 @@
         TOPMARGIN, 7
         BOTTOMMARGIN, 126
     END
+
+    IDD_LUA_ADD, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 179
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 69
+    END
 END
 #endif    // APSTUDIO_INVOKED
 
@@ -804,24 +1096,24 @@
 // Bitmap
 //
 
-IDB_OPENFOLDER          BITMAP                  "openfold.bmp"
-IDB_CLOSEDFOLDER        BITMAP                  "closedfold.bmp"
-IDB_CDDRIVE             BITMAP                  "cdd.bmp"
-IDB_NETDRIVE            BITMAP                  "nd.bmp"
-IDB_HARDDRIVE           BITMAP                  "hd.bmp"
-IDB_PAD                 BITMAP                  "pad.bmp"
-IDB_REMOVABLE           BITMAP                  "rd.bmp"
-IDB_RAMDISK             BITMAP                  "ram.bmp"
-IDB_UNKNOWN             BITMAP                  "ud.bmp"
-IDB_LOCKEDFOLDER        BITMAP                  "rodir.bmp"
-IDB_HIDDENFOLDER        BITMAP                  "hiddir.bmp"
+IDB_OPENFOLDER          BITMAP  MOVEABLE PURE   "openfold.bmp"
+IDB_CLOSEDFOLDER        BITMAP  MOVEABLE PURE   "closedfold.bmp"
+IDB_CDDRIVE             BITMAP  MOVEABLE PURE   "cdd.bmp"
+IDB_NETDRIVE            BITMAP  MOVEABLE PURE   "nd.bmp"
+IDB_HARDDRIVE           BITMAP  MOVEABLE PURE   "hd.bmp"
+IDB_PAD                 BITMAP  MOVEABLE PURE   "pad.bmp"
+IDB_REMOVABLE           BITMAP  MOVEABLE PURE   "rd.bmp"
+IDB_RAMDISK             BITMAP  MOVEABLE PURE   "ram.bmp"
+IDB_UNKNOWN             BITMAP  MOVEABLE PURE   "ud.bmp"
+IDB_LOCKEDFOLDER        BITMAP  MOVEABLE PURE   "rodir.bmp"
+IDB_HIDDENFOLDER        BITMAP  MOVEABLE PURE   "hiddir.bmp"
 
 /////////////////////////////////////////////////////////////////////////////
 //
 // RT_MANIFEST
 //
 
-IDR_RT_MANIFEST2        RT_MANIFEST             "rt_manif.bin"
+IDR_RT_MANIFEST2        RT_MANIFEST MOVEABLE PURE "rt_manif.bin"
 
 /////////////////////////////////////////////////////////////////////////////
 //
@@ -830,7 +1122,7 @@
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_ICON1               ICON                    "icon1.ico"
+IDI_ICON1               ICON    DISCARDABLE     "icon1.ico"
 #endif    // English (U.S.) resources
 /////////////////////////////////////////////////////////////////////////////
 
@@ -844,6 +1136,7 @@
 #pragma code_page(1252)
 #endif //_WIN32
 
+#ifndef _MAC
 /////////////////////////////////////////////////////////////////////////////
 //
 // Version
@@ -866,14 +1159,14 @@
     BEGIN
         BLOCK "080904b0"
         BEGIN
-            VALUE "CompanyName", "Gary Henderson"
-            VALUE "FileDescription", "Snes9XW"
-            VALUE "FileVersion", "1.40"
-            VALUE "InternalName", "Snes9X"
-            VALUE "LegalCopyright", "Copyright  1996-2001"
-            VALUE "OriginalFilename", "Snes9XW.exe"
-            VALUE "ProductName", "Snes9X SNES Emulator"
-            VALUE "ProductVersion", "1.40"
+            VALUE "CompanyName", "Gary Henderson\0"
+            VALUE "FileDescription", "Snes9XW\0"
+            VALUE "FileVersion", "1.40\0"
+            VALUE "InternalName", "Snes9X\0"
+            VALUE "LegalCopyright", "Copyright  1996-2001\0"
+            VALUE "OriginalFilename", "Snes9XW.exe\0"
+            VALUE "ProductName", "Snes9X SNES Emulator\0"
+            VALUE "ProductVersion", "1.40\0"
         END
     END
     BLOCK "VarFileInfo"
@@ -882,6 +1175,8 @@
     END
 END
 
+#endif    // !_MAC
+
 
 #ifdef APSTUDIO_INVOKED
 /////////////////////////////////////////////////////////////////////////////
@@ -889,18 +1184,18 @@
 // TEXTINCLUDE
 //
 
-1 TEXTINCLUDE 
+1 TEXTINCLUDE MOVEABLE PURE 
 BEGIN
     "resource.h\0"
 END
 
-2 TEXTINCLUDE 
+2 TEXTINCLUDE MOVEABLE PURE 
 BEGIN
     "#include ""afxres.h""\r\n"
     "#include ""../wlanguage.h""\0"
 END
 
-3 TEXTINCLUDE 
+3 TEXTINCLUDE MOVEABLE PURE 
 BEGIN
     "\r\n"
     "\0"
@@ -914,7 +1209,7 @@
 // Menu
 //
 
-IDR_MENU_NL MENU 
+IDR_MENU_NL MENU DISCARDABLE 
 BEGIN
     POPUP "&Bestand"
     BEGIN
@@ -932,23 +1227,34 @@
         BEGIN
             MENUITEM "8000 Hz, mono",               ID_SOUND_8BIT8000HZMONO
             MENUITEM "8000 Hz, stereo",             ID_SOUND_8BIT8000HZSTEREO
+
             MENUITEM "11025 Hz, mono",              ID_SOUND_8BIT11025HZMONO
             MENUITEM "11025 Hz, stereo",            ID_SOUND_8BIT11025HZSTEREO
+
             MENUITEM "22050 Hz, mono",              ID_SOUND_8BIT22050HZMONO
             MENUITEM "22050 Hz, stereo",            ID_SOUND_8BIT22050HZSTEREO
+
             MENUITEM "44100 Hz, mono",              ID_SOUND_8BIT44100HZMONO
             MENUITEM "44100 Hz, stereo",            ID_SOUND_8BIT44100HZSTEREO
+
         END
         POPUP "&16-Bit"
         BEGIN
             MENUITEM "8000 Hz, mono",               ID_SOUND_16BIT8000HZMONO
             MENUITEM "8000 Hz, stereo",             ID_SOUND_16BIT8000HZSTEREO
+
             MENUITEM "11025 Hz, mono",              ID_SOUND_16BIT11025HZMONO
+
             MENUITEM "11025 Hz, stereo",            ID_SOUND_16BIT11025HZSTEREO
+
             MENUITEM "22050 Hz, mono",              ID_SOUND_16BIT22050HZMONO
+
             MENUITEM "22050 Hz, stereo",            ID_SOUND_16BIT22050HZSTEREO
+
             MENUITEM "44100 Hz, mono",              ID_SOUND_16BIT44100HZMONO
+
             MENUITEM "44100 Hz, stereo",            ID_SOUND_16BIT44100HZSTEREO
+
         END
         MENUITEM SEPARATOR
         MENUITEM "&Geen Geluid",                ID_SOUND_NOSOUND
@@ -958,7 +1264,8 @@
         POPUP "&Taal"
         BEGIN
             MENUITEM "&English",                    ID_LANGUAGE_ENGLISH
-            MENUITEM "&Nederlands",                 ID_LANGUAGE_NEDERLANDS, CHECKED
+            MENUITEM "&Nederlands",                 ID_LANGUAGE_NEDERLANDS
+            , CHECKED
         END
         MENUITEM SEPARATOR
         MENUITEM "&Verberg menubalk\tESC",      ID_WINDOW_HIDEMENUBAR
@@ -984,17 +1291,21 @@
 //
 
 IDD_NETCONNECT DIALOGEX 0, 0, 227, 61
-STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | WS_CAPTION
+STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CLIPCHILDREN | 
+    WS_CAPTION
 CAPTION "Connect to Server"
-FONT 8, "MS Sans Serif", 0, 0, 0x0
+FONT 8, "MS Sans Serif"
 BEGIN
     DEFPUSHBUTTON   "&OK",IDOK,120,45,50,14
     PUSHBUTTON      "Canccel",IDCANCEL,175,45,50,14
-    RTEXT           "Server Address",IDC_LABEL_SERVERADDY,5,5,50,14,SS_CENTERIMAGE
+    RTEXT           "Server Address",IDC_LABEL_SERVERADDY,5,5,50,14,
+                    SS_CENTERIMAGE
     PUSHBUTTON      "Clear History",IDC_CLEARHISTORY,175,5,50,14
-    RTEXT           "Port Number",IDC_LABEL_PORTNUM,5,25,50,14,SS_CENTERIMAGE
+    RTEXT           "Port Number",IDC_LABEL_PORTNUM,5,25,50,14,
+                    SS_CENTERIMAGE
     EDITTEXT        IDC_PORTNUMBER,60,25,25,14,ES_AUTOHSCROLL
-    COMBOBOX        IDC_HOSTNAME,60,5,110,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    COMBOBOX        IDC_HOSTNAME,60,5,110,40,CBS_DROPDOWNLIST | WS_VSCROLL | 
+                    WS_TABSTOP
 END
 
 
@@ -1003,14 +1314,15 @@
 // Menu
 //
 
-IDR_MENU_US MENU 
+IDR_MENU_US MENU DISCARDABLE 
 BEGIN
     POPUP "&File"
     BEGIN
         MENUITEM "L&oad Game...\tCtrl+O",       ID_FILE_LOAD_GAME
         POPUP "Recent &Games"
         BEGIN
-            MENUITEM "Dummy",                       ID_RECENT_DUMMY, INACTIVE
+            MENUITEM "Dummy",                       ID_RECENT_DUMMY
+            , INACTIVE
         END
         POPUP "&Save Game Position"
         BEGIN
@@ -1041,7 +1353,8 @@
         BEGIN
             MENUITEM "S&ave SPC Data",              ID_FILE_SAVE_SPC_DATA
             MENUITEM "Save Screenshot",             ID_SAVESCREENSHOT
-            MENUITEM "Sa&ve S-RAM Data",            ID_FILE_SAVE_SRAM_DATA, GRAYED
+            MENUITEM "Sa&ve S-RAM Data",            ID_FILE_SAVE_SRAM_DATA
+            , GRAYED
             MENUITEM "Save SPC&7110 log",           IDM_LOG_7110, GRAYED
         END
         MENUITEM "ROM Information...",          IDM_ROM_INFO, GRAYED
@@ -1050,6 +1363,9 @@
         MENUITEM "Movie Record...",             ID_FILE_MOVIE_RECORD, GRAYED
         MENUITEM "Movie Stop",                  ID_FILE_MOVIE_STOP, GRAYED
         MENUITEM SEPARATOR
+        MENUITEM "Run Lua Script...",           IDD_FILE_LUA_LOAD, GRAYED
+        MENUITEM "Stop Lua Script",             IDD_FILE_LUA_STOP, GRAYED
+        MENUITEM SEPARATOR
         MENUITEM "Record AVI...",               ID_FILE_WRITE_AVI, GRAYED
         MENUITEM "Stop AVI Recording",          ID_FILE_STOP_AVI, GRAYED
         MENUITEM SEPARATOR
@@ -1132,16 +1448,22 @@
         MENUITEM SEPARATOR
         POPUP "&Language"
         BEGIN
-            MENUITEM "&English",                    ID_LANGUAGE_ENGLISH, CHECKED
-            MENUITEM "&Nederlands",                 ID_LANGUAGE_NEDERLANDS, GRAYED
+            MENUITEM "&English",                    ID_LANGUAGE_ENGLISH
+            , CHECKED
+            MENUITEM "&Nederlands",                 ID_LANGUAGE_NEDERLANDS
+            , GRAYED
         END
     END
     POPUP "&Cheat"
     BEGIN
-        MENUITEM "&Game Genie, Pro-Action Replay Codes\tAlt+E", ID_CHEAT_ENTER
-        MENUITEM "&Search for New Cheats",      ID_CHEAT_SEARCH_MODAL, GRAYED
-        MENUITEM "Search for New Cheats (active)\tAlt+A", ID_CHEAT_SEARCH, GRAYED
-        MENUITEM "&Apply Cheats",               ID_CHEAT_APPLY, CHECKED, GRAYED
+        MENUITEM "&Game Genie, Pro-Action Replay Codes\tAlt+E", 
+                                                ID_CHEAT_ENTER
+        MENUITEM "&Search for New Cheats",      ID_CHEAT_SEARCH_MODAL
+        , GRAYED
+        MENUITEM "Search for New Cheats (active)\tAlt+A", ID_CHEAT_SEARCH
+        , GRAYED
+        MENUITEM "&Apply Cheats",               ID_CHEAT_APPLY
+        , CHECKED, GRAYED
         MENUITEM "Set SPC7110 RTC",             IDM_7110_RTC, GRAYED
     END
     POPUP "&Netplay", GRAYED
@@ -1150,10 +1472,13 @@
         MENUITEM "&Disconnect from Server",     ID_NETPLAY_DISCONNECT
         MENUITEM SEPARATOR
         MENUITEM "&Act as Server",              ID_NETPLAY_SERVER
-        MENUITEM "&Re-sync all Clients Using Freeze File Now", ID_NETPLAY_SYNC
+        MENUITEM "&Re-sync all Clients Using Freeze File Now", 
+                                                ID_NETPLAY_SYNC
         MENUITEM "&Send ROM Image to Clients Now", ID_NETPLAY_ROM
         MENUITEM "S&end ROM Image to Clients",  ID_NETPLAY_SEND_ROM_ON_CONNECT
-        MENUITEM "S&ync Using Reset Game",      ID_NETPLAY_SYNC_BY_RESET, CHECKED
+
+        MENUITEM "S&ync Using Reset Game",      ID_NETPLAY_SYNC_BY_RESET
+        , CHECKED
         MENUITEM SEPARATOR
         MENUITEM "&Options...",                 ID_NETPLAY_OPTIONS
     END
diff -rdu snes9x-improvement11-beta15/win32/win32.cpp snes9x-improvement11-beta15-lua0.05/win32/win32.cpp
--- snes9x-improvement11-beta15/win32/win32.cpp	Sat Jan 26 17:44:36 2008
+++ snes9x-improvement11-beta15-lua0.05/win32/win32.cpp	Mon Feb  4 04:23:32 2008
@@ -108,7 +108,7 @@
 #include "AVIOutput.h"
 #include "wlanguage.h"
 #include "lazymacro.h"
-
+#include "s9xlua.h"
 #include <direct.h>
 
 #include <io.h>
@@ -185,6 +185,7 @@
 {
 	if(Settings.SPC7110)
 		(*CleanUp7110)();
+	S9xLuaStop();
     SendMessage (GUI.hWnd, WM_COMMAND, ID_FILE_EXIT, 0);
 }
 
@@ -939,6 +940,10 @@
     else
 #endif
 
+    // Lua gets a crack at screwing with the results
+    if (S9xLuaSpeed() > 0)
+	return;
+
     if (!Settings.TurboMode && Settings.SkipFrames == AUTO_FRAMERATE &&
 		!GUI.AVIOut && !Settings.HighSpeedSeek)
     {
@@ -1523,6 +1528,7 @@
 
 	const int OrigHeight = Height;
 	Height = Src.Height;
+	S9xLuaGui((uint16*)Src.Surface, Src.Pitch/2 /*512*/, Width, Height);
 
 	// avi writing
 	DoAVIVideoFrame(&Src, Width, Height);
@@ -1723,6 +1729,9 @@
         }
         else
             dstRect = srcRect;
+
+//	S9xLuaGui((uint16*)Dst.Surface, Dst.Pitch/2, srcRect.right-srcRect.left, srcRect.bottom-srcRect.top - ((in_display_dlg && GUI.HeightExtend) ? GetFilterScale(GUI.Scale) : 0));
+
 	
         lpDDSurface2->Unlock (Dst.Surface);	
         if (PrimarySurfaceLockFailed)
diff -rdu snes9x-improvement11-beta15/win32/wsnes9x.cpp snes9x-improvement11-beta15-lua0.05/win32/wsnes9x.cpp
--- snes9x-improvement11-beta15/win32/wsnes9x.cpp	Sat Jan 26 19:28:46 2008
+++ snes9x-improvement11-beta15-lua0.05/win32/wsnes9x.cpp	Mon Feb  4 04:22:04 2008
@@ -161,6 +161,8 @@
 #include "fmod.h"
 #endif
 
+#include "s9xlua.h"
+
 #ifdef _MSC_VER
 #define F_OK 0
 #define X_OK 1
@@ -194,6 +196,7 @@
 INT_PTR CALLBACK DlgCreateMovie(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
 INT_PTR CALLBACK DlgOpenMovie(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
 HRESULT CALLBACK EnumModesCallback( LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext);
+INT_PTR CALLBACK DlgLuaScriptDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
 
 #define S9XWATCH_HELP
 #ifdef S9XWATCH_HELP
@@ -851,7 +854,11 @@
 		Scale = NextScale;
 	else
 	{
-		if (IS_GLIDE_MODE(NextScale) || (IS_GL_MODE(NextScale) && !S9xOpenGLInit ()) || (!IS_GL_OR_GLIDE(NextScale) && !DirectX.InitDirectX()))
+		if (IS_GLIDE_MODE(NextScale) || (IS_GL_MODE(NextScale)
+#ifdef OPENGL
+		 && !S9xOpenGLInit ()
+#endif
+		 ) || (!IS_GL_OR_GLIDE(NextScale) && !DirectX.InitDirectX()))
 		{
 			Scale = FILTER_NONE;
 			NextScale = FILTER_NONE;
@@ -1638,6 +1645,49 @@
 				RestoreSNESDisplay ();// re-enter after dialog
 			}
 			break;
+		case IDD_FILE_LUA_LOAD: 
+			{
+				RestoreGUIDisplay();
+				int success = 0;
+				DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_LUA_ADD), hWnd, DlgLuaScriptDialog,(LPARAM) &success);
+				if (success) {
+					MENUITEMINFO mii;
+					unsigned int i;
+	
+					ZeroMemory( &mii, sizeof( mii));
+					mii.cbSize = sizeof( mii);
+					mii.fMask = MIIM_STATE;
+    
+					mii.fState = MFS_UNCHECKED;
+					SetMenuItemInfo (GUI.hMenu, IDD_FILE_LUA_STOP, FALSE, &mii);
+					mii.fState |= MFS_DISABLED;
+					SetMenuItemInfo (GUI.hMenu, IDD_FILE_LUA_LOAD, FALSE, &mii);
+
+
+				}
+				RestoreSNESDisplay();
+
+			}
+			break;
+		case IDD_FILE_LUA_STOP:
+			{
+				// I'm going to assume that Windows will adequately guard against this being executed
+				// uselessly. Even if it wasn't, it's no big deal.
+				S9xLuaStop();
+
+				MENUITEMINFO mii;
+				unsigned int i;
+
+				ZeroMemory( &mii, sizeof( mii));
+				mii.cbSize = sizeof( mii);
+				mii.fMask = MIIM_STATE;
+   
+				mii.fState = MFS_UNCHECKED;
+				SetMenuItemInfo (GUI.hMenu, IDD_FILE_LUA_LOAD, FALSE, &mii);
+				mii.fState |= MFS_DISABLED;
+				SetMenuItemInfo (GUI.hMenu, IDD_FILE_LUA_STOP, FALSE, &mii);
+			}
+			break;
 		case ID_FILE_MOVIE_RECORD:
 			{
 				RestoreGUIDisplay ();  //exit DirectX
@@ -3363,7 +3413,7 @@
 				}
 				run_loop=true;
 			}
-			else if (Settings.TurboMode || Settings.FrameAdvance || Settings.SkipFrames != AUTO_FRAMERATE
+			else if (Settings.TurboMode || Settings.FrameAdvance || Settings.SkipFrames != AUTO_FRAMERATE  || S9xLuaSpeed() > 0
 #ifdef NETPLAY_SUPPORT
 			|| Settings.NetPlay
 #endif
@@ -3406,6 +3456,14 @@
 			if(GUI.FrameAdvanceJustPressed)
 				GUI.FrameAdvanceJustPressed--;
 
+			if (S9xLuaRunning())
+			{
+				S9xLuaFrameBoundary();
+				if (S9xLuaSpeed() > 0) {
+					run_loop = 1;
+				}
+			}
+
 			if(run_loop)
 			{
 				S9xMainLoop();
@@ -3538,9 +3596,8 @@
     UpdateBackBuffer();
 }
 
-void FreezeUnfreeze (int slot, bool8 freeze)
-{
-    static TCHAR filename [_MAX_PATH + 1];
+char *S9xGetFreezeFilename(int slot) {
+    TCHAR filename [_MAX_PATH + 1];
     TCHAR drive [_MAX_DRIVE + 1];
     TCHAR dir [_MAX_DIR + 1];
     TCHAR fname [_MAX_FNAME + 1];
@@ -3551,7 +3608,7 @@
     {
         S9xMessage (S9X_INFO, S9X_NETPLAY_NOT_SERVER,
 			"Only the server is allowed to load freeze files.");
-        return;
+        return NULL;
     }
 #endif
 
@@ -3559,7 +3616,8 @@
     static char *digits = "t123456789";
 	for(int oldDir = 0; oldDir <= 1; oldDir++)
 	{
-		for(int zmv = 0; zmv <= 1; zmv++)
+		int zmv=0, freeze=1;
+//		for(int zmv = 0; zmv <= 1; zmv++)
 		{
 		    if((!oldDir && !zmv) || (!freeze && _access (filename, 0) != 0 && slot < 10))
 			{
@@ -3580,6 +3638,17 @@
 		}
 	}
 
+
+	return strdup(filename);
+}
+
+void FreezeUnfreeze (int slot, bool8 freeze)
+{
+    char *filename = S9xGetFreezeFilename(slot);
+
+    if (!filename)
+	return;
+
     S9xSetPause (PAUSE_FREEZE_FILE);
     
     if (freeze)
@@ -3603,6 +3672,7 @@
     }
     
     S9xClearPause (PAUSE_FREEZE_FILE);
+    free(filename);
 }
 
 void CheckDirectoryIsWritable (const char *filename)
@@ -3673,6 +3743,7 @@
     SetMenuItemInfo (GUI.hMenu, ID_FILE_RESET, FALSE, &mii);
     SetMenuItemInfo (GUI.hMenu, ID_CHEAT_ENTER, FALSE, &mii);
     SetMenuItemInfo (GUI.hMenu, ID_CHEAT_SEARCH_MODAL, FALSE, &mii);
+    SetMenuItemInfo (GUI.hMenu, IDD_FILE_LUA_LOAD, FALSE, &mii);
 
 	if (GUI.FullScreen)
         mii.fState |= MFS_DISABLED;
@@ -8200,10 +8271,11 @@
 		case IDC_FILTERBOX:
 			if(!in_display_dlg) break;
 			{
+				{
 				int scale = (int)SendDlgItemMessage(hDlg,IDC_FILTERBOX,CB_GETCURSEL,0,0);
 				if(scale == GUI.Scale)
 					break;
-
+				
 				const int oldScaleScale = max(GetFilterScale(GUI.Scale), GetFilterScale(GUI.ScaleHiRes));
 
 //				UpdateScale(GUI.Scale, (RenderFilter&)scale);
@@ -8216,7 +8288,7 @@
 
 				if(oldScaleScale != newScaleScale)
 					RestoreSNESDisplay();
-
+				}
 				// refresh screen, so the user can see the new filter
 				// (assuming the dialog box isn't completely covering the game window)
 				if(DirectX.Clipped) S9xReRefresh();
@@ -11548,6 +11620,75 @@
 
 		EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
 	}
+
+}
+
+INT_PTR CALLBACK DlgLuaScriptDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
+
+	static int *success;
+
+	switch (msg) {
+	case WM_INITDIALOG:
+		{
+
+		// Nothing very useful to do
+		success = (int*)lParam;
+		return true;
+		}
+		break;
+	case WM_COMMAND:
+		switch (LOWORD(wParam)) {
+			case IDOK:
+			{
+				char filename[MAX_PATH];
+				GetDlgItemText(hDlg, IDC_LUA_FILENAME, filename, MAX_PATH);
+				if (S9xLoadLuaCode(filename)) {
+					*success = 1;
+					// For user's convenience, don't close dialog unless we're done.
+					// Users who make syntax errors and fix/reload will thank us.
+					EndDialog(hDlg, 1);
+				} else {
+					//MessageBox(hDlg, "Oops", "Script not loaded", MB_OK); // Errors are displayed by the Lua code.
+					*success = 0;
+				}
+				return true;
+			}
+			case IDCANCEL:
+			{
+				EndDialog(hDlg, 0);
+				return true;
+			}
+			case IDC_LUA_BROWSE:
+			{
+				OPENFILENAME  ofn;
+				char  szFileName[MAX_PATH];
+				szFileName[0] = '\0';
+				ZeroMemory( (LPVOID)&ofn, sizeof(OPENFILENAME) );
+				ofn.lStructSize = sizeof(OPENFILENAME);
+				ofn.hwndOwner = hDlg;
+				ofn.lpstrFilter = MOVIE_FILETYPE_DESCRIPTION "\0*.lua\0" FILE_INFO_ANY_FILE_TYPE "\0*.*\0\0";
+				ofn.lpstrFile = szFileName;
+				ofn.lpstrDefExt = "lua";
+				ofn.nMaxFile = MAX_PATH;
+				ofn.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; // hide previously-ignored read-only checkbox (the real read-only box is in the open-movie dialog itself)
+				if(GetOpenFileName( &ofn ))
+				{
+					SetWindowText(GetDlgItem(hDlg, IDC_LUA_FILENAME), szFileName);
+				}
+				//SetCurrentDirectory(movieDirectory);
+				return true;
+			}
+		}
+
+
+	}
+	char message[1024];
+//	sprintf(message, "Unkonwn command %d,%d",msg,wParam);
+	//MessageBox(hDlg, message, TEXT("Range Error"), MB_OK);
+
+//	printf("Unknown entry %d,%d,%d\n",msg,wParam,lParam);
+	// All else, fall off
+	return false;
 
 }
 

