diff --git a/BizHawk.Emulation/CPUs/CP1610/Execute.cs b/BizHawk.Emulation/CPUs/CP1610/Execute.cs
index e0ced55404..6ae79bfbec 100644
--- a/BizHawk.Emulation/CPUs/CP1610/Execute.cs
+++ b/BizHawk.Emulation/CPUs/CP1610/Execute.cs
@@ -239,19 +239,19 @@ namespace BizHawk.Emulation.CPUs.CP1610
 				case 0x026:
 				case 0x027:
 					throw new NotImplementedException();
-					dest = (byte)(opcode & 0x7);
-					dest_value = Register[dest];
-					ones = (dest_value ^ 0xFFFF);
-					result = ones + 1;
-					Calc_FlagC(result);
-					Calc_FlagO_Add(ones, 1, result);
-					result &= 0xFFFF;
-					Calc_FlagS(result);
-					Calc_FlagZ(result);
-					Register[dest] = (ushort)result;
-					cycles = 6;
-					Interruptible = true;
-					break;
+                    //dest = (byte)(opcode & 0x7);
+                    //dest_value = Register[dest];
+                    //ones = (dest_value ^ 0xFFFF);
+                    //result = ones + 1;
+                    //Calc_FlagC(result);
+                    //Calc_FlagO_Add(ones, 1, result);
+                    //result &= 0xFFFF;
+                    //Calc_FlagS(result);
+                    //Calc_FlagZ(result);
+                    //Register[dest] = (ushort)result;
+                    //cycles = 6;
+                    //Interruptible = true;
+                    //break;
 				// ADCR
 				case 0x028:
 				case 0x029:
@@ -262,19 +262,19 @@ namespace BizHawk.Emulation.CPUs.CP1610
 				case 0x02E:
 				case 0x02F:
 					throw new NotImplementedException();
-					dest = (byte)(opcode & 0x7);
-					dest_value = Register[dest];
-					carry = FlagC ? 1 : 0;
-					result = dest_value + carry;
-					Calc_FlagC(result);
-					Calc_FlagO_Add(dest_value, carry, result);
-					result &= 0xFFFF;
-					Calc_FlagS(result);
-					Calc_FlagZ(result);
-					Register[dest] = (ushort)result;
-					cycles = 6;
-					Interruptible = true;
-					break;
+                    //dest = (byte)(opcode & 0x7);
+                    //dest_value = Register[dest];
+                    //carry = FlagC ? 1 : 0;
+                    //result = dest_value + carry;
+                    //Calc_FlagC(result);
+                    //Calc_FlagO_Add(dest_value, carry, result);
+                    //result &= 0xFFFF;
+                    //Calc_FlagS(result);
+                    //Calc_FlagZ(result);
+                    //Register[dest] = (ushort)result;
+                    //cycles = 6;
+                    //Interruptible = true;
+                    //break;
 				// GSWD
 				case 0x030:
 				case 0x031:
@@ -922,15 +922,15 @@ namespace BizHawk.Emulation.CPUs.CP1610
 				case 0x1BE:
 				case 0x1BF:
 					throw new NotImplementedException();
-					src = (byte)((opcode >> 3) & 0x7);
-					dest = (byte)(opcode & 0x7);
-					result = Register[dest] & Register[src];
-					Calc_FlagS(result);
-					Calc_FlagZ(result);
-					Register[dest] = (ushort)result;
-					cycles = 6;
-					Interruptible = true;
-					break;
+                    //src = (byte)((opcode >> 3) & 0x7);
+                    //dest = (byte)(opcode & 0x7);
+                    //result = Register[dest] & Register[src];
+                    //Calc_FlagS(result);
+                    //Calc_FlagZ(result);
+                    //Register[dest] = (ushort)result;
+                    //cycles = 6;
+                    //Interruptible = true;
+                    //break;
 				// XORR
 				case 0x1C0:
 				case 0x1C1:
@@ -1421,21 +1421,21 @@ namespace BizHawk.Emulation.CPUs.CP1610
 				case 0x306:
 				case 0x307:
 					throw new NotImplementedException();
-					dest = (byte)(opcode & 0x7);
-					addr = ReadMemory(RegisterPC++);
-					dest_value = Register[dest];
-					addr_read = ReadMemory(addr);
-					twos = (0xFFFF ^ addr_read) + 1;
-					result = dest_value + twos;
-					Calc_FlagC(result);
-					Calc_FlagO_Add(dest_value, addr_read, result);
-					result &= 0xFFFF;
-					Calc_FlagS(result);
-					Calc_FlagZ(result);
-					Register[dest] = (ushort)result;
-					cycles = 10;
-					Interruptible = true;
-					break;
+                    //dest = (byte)(opcode & 0x7);
+                    //addr = ReadMemory(RegisterPC++);
+                    //dest_value = Register[dest];
+                    //addr_read = ReadMemory(addr);
+                    //twos = (0xFFFF ^ addr_read) + 1;
+                    //result = dest_value + twos;
+                    //Calc_FlagC(result);
+                    //Calc_FlagO_Add(dest_value, addr_read, result);
+                    //result &= 0xFFFF;
+                    //Calc_FlagS(result);
+                    //Calc_FlagZ(result);
+                    //Register[dest] = (ushort)result;
+                    //cycles = 10;
+                    //Interruptible = true;
+                    //break;
 				// SUB@
 				case 0x308:
 				case 0x309:
@@ -1612,17 +1612,17 @@ namespace BizHawk.Emulation.CPUs.CP1610
 				case 0x386:
 				case 0x387:
 					throw new NotImplementedException();
-					dest = (byte)(opcode & 0x7);
-					addr = ReadMemory(RegisterPC++);
-					dest_value = Register[dest];
-					addr_read = ReadMemory(addr);
-					result = dest_value & addr_read;
-					Calc_FlagS(result);
-					Calc_FlagZ(result);
-					Register[dest] = (ushort)result;
-					cycles = 10;
-					Interruptible = true;
-					break;
+                    //dest = (byte)(opcode & 0x7);
+                    //addr = ReadMemory(RegisterPC++);
+                    //dest_value = Register[dest];
+                    //addr_read = ReadMemory(addr);
+                    //result = dest_value & addr_read;
+                    //Calc_FlagS(result);
+                    //Calc_FlagZ(result);
+                    //Register[dest] = (ushort)result;
+                    //cycles = 10;
+                    //Interruptible = true;
+                    //break;
 				// AND@
 				case 0x388:
 				case 0x389:
@@ -1700,17 +1700,17 @@ namespace BizHawk.Emulation.CPUs.CP1610
 				case 0x3C6:
 				case 0x3C7:
 					throw new NotImplementedException();
-					dest = (byte)(opcode & 0x7);
-					addr = ReadMemory(RegisterPC++);
-					dest_value = Register[dest];
-					addr_read = ReadMemory(addr);
-					result = dest_value ^ addr_read;
-					Calc_FlagS(result);
-					Calc_FlagZ(result);
-					Register[dest] = (ushort)result;
-					cycles = 10;
-					Interruptible = true;
-					break;
+                    //dest = (byte)(opcode & 0x7);
+                    //addr = ReadMemory(RegisterPC++);
+                    //dest_value = Register[dest];
+                    //addr_read = ReadMemory(addr);
+                    //result = dest_value ^ addr_read;
+                    //Calc_FlagS(result);
+                    //Calc_FlagZ(result);
+                    //Register[dest] = (ushort)result;
+                    //cycles = 10;
+                    //Interruptible = true;
+                    //break;
 				// XOR@
 				case 0x3C8:
 				case 0x3C9:
diff --git a/BizHawk.Emulation/Consoles/Atari/2600/Atari2600.Core.cs b/BizHawk.Emulation/Consoles/Atari/2600/Atari2600.Core.cs
index 216c21da50..b9203a7d41 100644
--- a/BizHawk.Emulation/Consoles/Atari/2600/Atari2600.Core.cs
+++ b/BizHawk.Emulation/Consoles/Atari/2600/Atari2600.Core.cs
@@ -16,8 +16,6 @@ namespace BizHawk
 		public byte[] ram = new byte[128];
 		public MapperBase mapper;
 
-		bool resetSignal;
-
 		// The Atari 2600 memory mapper looks something like this...usually
 
 		// N/A  Page #  
diff --git a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper200.cs b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper200.cs
index d8a09a74d0..20931db83a 100644
--- a/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper200.cs
+++ b/BizHawk.Emulation/Consoles/Nintendo/NES/Boards/Mapper200.cs
@@ -48,7 +48,7 @@ namespace BizHawk.Emulation.Consoles.Nintendo
 		int prg_reg_16k, chr_reg_8k;
 		int prg_bank_mask_16k;
 		int chr_bank_mask_8k;
-		bool low;
+
 		public override bool Configure(NES.EDetectionOrigin origin)
 		{
 			switch (Cart.board_type)
diff --git a/BizHawk.Emulation/Consoles/Sega/Genesis/Compat.txt b/BizHawk.Emulation/Consoles/Sega/Genesis/Compat.txt
index 2472610089..c7f1db80c2 100644
--- a/BizHawk.Emulation/Consoles/Sega/Genesis/Compat.txt
+++ b/BizHawk.Emulation/Consoles/Sega/Genesis/Compat.txt
@@ -24,29 +24,24 @@ Blood Shot - FPS game - some texture corruption
 Bonkers - substantial gfx corruption
 Buck Rogers crashes in a fun way
 Burning Force - some gfx issues. works way better than it has in the past though!
-Castle of Illusion - doesn't boot
 Cheese Cat-astrophe - crashes renderer!!
 Chester Cheetah - freezes when starting new game
 Chuck Rock - Music messed up
 Contra Hard Corps: Scrolling is messed up in level 1... used to work.
-Crusader of Centy- Text boxes messed up
 Dashin' Desperados .. bottom screen messed up
 Death Duel crashes my renderer... (!)
 Decap Attack - Item select screen messed up
 Double Dragon doesn't boot
 Devilish/Bad Omen - intro messed up.... interesting debug target
 Dune... freezes in intro
-Eternal Champions... GFX issues, immediately
 Exile - Immediate gfx issues... Debug target.
-Exo Squad - Doesn't boot at all
 F1 World Championship... Gfx issue at bottom of screen... quite cool working game though!
 Fatal Rewind - appears to do a read.w on FFFFFF... that would be an address error. read.l messes up too. Ergo: basically doesnt work.
 Final Blow - Music messed up
 Fire Shark - Messed up sound
 Flavio's Raster FX Test.. doesnt work
 Foreman for Real doent boot
-Galaxy Force II - minor gfx corruption now...
-Garfield... immediate gfx corruption. debug target.
+Galaxy Force II - gfx issue in level select screen, and in level-end "shoot the core" part
 Gargoyles... gameplay is nonfunctional
 Gauntlet 4 .. title screen messed. gfx corruption. immediately - debug target.
 Golden Axe - controls are jacked up
@@ -60,7 +55,6 @@ Jurassic Park 2 - crashes in intro
 Landstalker - Sprite masking on bottom is too high on the screen...
 Lemmings: Sound is royally effed... gfx glitches.
 Marvel Land .. holy shit thats psychadelic
-Mega Bomberman....gfx glitches title screen
 Mega Turrican some gfx glitches
 Mortal Kombat...
 MUSHA: Intro music starts too soon. Suffers from lack of 2-cell-vertical-scroll mode.
@@ -70,31 +64,24 @@ Outrun, minor gfx issue. maybe related to h-int timing?
 Outrunners, some gfx issues... but not as bad as you might think!!! apparently doesnt use interlace mode?
 Panorama Cotton still not working right
 Power Monger messed up
-Quackshot doesn't boot.
 RamboIII - intro gfx corrupted - MAYBE GOOD DEBUGGING TARGET
-Road Blasters: was working, now has gfx glitches.
-Shining in the Darkness: Gfx glitches, pretty severe
-Skitchin doesnt boot
+Shining in the Darkness: Check out sprites in the tavern... very odd
 Sonic 2: Aside from lack of interlace mode, the shadows in the special stage are white....?
 Sonic 3 serious gfx glitches
 Star Control - Shit gets crazy
 Steel Empire - controls messed up. probably gfx issues also.
 Sub-Terrania some gfx issues in intro
+Super Hang-On - Sprite priority/masking isnt happening the way its supposed to on the tracks.
 Super Fantasy Zone: Sound totally boned, missing graphics
 TaleSpin - gfx glitches
 The Humans
 The Immortal
 Truxton - Sound is jaaaacked.
 Verytex - gfx issues
-World of Illusion doesnt boot
 Zero Tolerance - gfx bugs that didnt used to happen :(
 Zombies At My Neighbors: doesnt boot really
 Zoop doesnt boot
 
-Things that read from VRAM work like 50%-90%, but not 100%. It's frustrating. Kid Chameleon and Eternal Champions are examples.
-
-Some games flicker in the rightmost columns. Is this caused by mid-frame mode shifting(32/40 col modes?) Alisia Dragoon is one example.
---- Havent seen an example of this in a long time. Maybe it's a non-issue.
 
 ======================================================
 Fixed Issues: (listed for regression testing purposes)
@@ -112,6 +99,21 @@ Fun-n-Games fails its fadeouts.  -- Fixed CRAM reads. I failed math.
 
 Sonic Spinball executes a VSRAM read -- Implemented VSRAM reads.
 
+Bugs related to longword read/write VRAM. Multiple bugs were present including sign-extension and endians and crap.  
+ - Crusader of Centy- Text boxes messed up
+ - Eternal Champions - immediate gfx corruption
+ - Garfield... immediate gfx corruption. debug target.
+ - Kid Chameleon - gfx corruption on bounce bricks and level-end effect
+
+Games to test window calculation on:
+ - Road Blasters (doesnt use window, but Window & Nametable A are at same location)
+ - Out of this World - Same as Road Blasters
+ - Musha,Gaiares - Window at top
+ - Eliminate Down - Window at bottom
+ - Monster World 4, Wonder Boy in Monster World - Window at top - needs window scroll plane size adjustment
+ - D&D Warriors of the Eternal Sun - Window at bottom and at sides
+ - Truxton, Fire Shark - Window on Right
+
 ======================================================
 
 TODO: non-instant DMA emulation
@@ -119,10 +121,6 @@ TODO: Add 68000/VDP interrupt enable delay (one instruction, similar to After Bu
 TODO: H-Ints timing possibly not correct... Some game raster effects work, others don't work as expected. (could be HVC tho)
 TODO: Test DMA/ VDP command words.... I'm not at all convinced that VRAM is always correct
 
-TODO: Seems like the Window should be high-priority... or Sprites aren't getting masked or something. Sprites routinely draw over window.
-
-
-
 
 ==============
 Notable games:
@@ -142,4 +140,10 @@ Games that use VRAM->VRAM Copy: D&D Warriors of the Eternal Sun, MUSHA, Devilish
 Games that require accurate VRAM fill emulation include Thunder Force IV,
  Contra Hard Corps, Revenge of Shinobi, Taiga Drama, and Sword of Vermillion.
 
-Sonic Spinball reads from VSRAM
\ No newline at end of file
+Sonic Spinball reads from VSRAM
+
+Games known to use 2-cell vertical scroll mode:
+ - Air Diver
+ - Exo Squad
+ - Contra Hard Corps (giant robot boss on stage 1)
+ - MUSHA (stage 3)
diff --git a/BizHawk.Emulation/Consoles/Sega/Genesis/GenVDP.cs b/BizHawk.Emulation/Consoles/Sega/Genesis/GenVDP.cs
index 5d3c7e0228..4de35beac4 100644
--- a/BizHawk.Emulation/Consoles/Sega/Genesis/GenVDP.cs
+++ b/BizHawk.Emulation/Consoles/Sega/Genesis/GenVDP.cs
@@ -59,6 +59,8 @@ namespace BizHawk.Emulation.Consoles.Sega
 
         public bool VdpDebug = false;
 
+        public Func<int> GetPC;
+
         public GenVDP()
         {
             WriteVdpRegister(00, 0x04);
@@ -105,7 +107,7 @@ namespace BizHawk.Emulation.Consoles.Sega
 
         public void WriteVdpControl(ushort data)
         {
-            Log.Note("VDP", "Control Write {0:X4}", data);
+            Log.Note("VDP", "Control Write {0:X4} (PC={1:X6})", data, GetPC());
 
             if (ControlWordPending == false)
             {
@@ -171,14 +173,14 @@ namespace BizHawk.Emulation.Consoles.Sega
 
         public void WriteVdpData(ushort data)
         {
-            Log.Note("VDP", "Data port write: {0:X4}", data);
+            Log.Note("VDP", "Data port write: {0:X4} (PC={1:X6})", data, GetPC());
             ControlWordPending = false; 
 
             // byte-swap incoming data when A0 is set
              if ((VdpDataAddr & 1) != 0)
             {
                 data = (ushort)((data >> 8) | (data << 8));
-                Log.Error("VDP", "VRAM byte-swap is happening because A0 is not 0");
+                Log.Error("VDP", "VRAM byte-swap is happening because A0 is not 0. [{0:X4}] = {1:X4}", VdpDataAddr, data);
             }
 
             switch (VdpDataCode & 0xF)
diff --git a/BizHawk.Emulation/Consoles/Sega/Genesis/Genesis.cs b/BizHawk.Emulation/Consoles/Sega/Genesis/Genesis.cs
index 7333cf4b5b..45643b9fdb 100644
--- a/BizHawk.Emulation/Consoles/Sega/Genesis/Genesis.cs
+++ b/BizHawk.Emulation/Consoles/Sega/Genesis/Genesis.cs
@@ -125,8 +125,10 @@ namespace BizHawk.Emulation.Consoles.Sega
 #if MUSASHI
             Musashi.Init();
             Musashi.Reset();
+            VDP.GetPC = () => Musashi.PC;
 #else
             MainCPU.Reset();
+            VDP.GetPC = () => MainCPU.PC;
 #endif
         }
 
diff --git a/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs b/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs
index 73f2249281..ce8d4f6c35 100644
--- a/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs
+++ b/BizHawk.Emulation/Consoles/Sega/Genesis/MemoryMap.68000.cs
@@ -49,7 +49,7 @@ namespace BizHawk.Emulation.Consoles.Sega
 
             if (address >= 0xE00000) // Work RAM
             {
-                maskedAddr = address & 0xFFFF;
+                maskedAddr = address & 0xFFFE;
                 return (short)((Ram[maskedAddr] << 8) | Ram[maskedAddr + 1]);
             }
 
@@ -80,6 +80,14 @@ namespace BizHawk.Emulation.Consoles.Sega
                 return (Ram[maskedAddr] << 24) | (Ram[maskedAddr + 1] << 16) | (Ram[maskedAddr + 2] << 8) | Ram[maskedAddr + 3];
             }
 
+            if (address >= 0xC00000)
+            {
+                //Console.WriteLine("long-read from VDP");
+                short msw = ReadWord(address);
+                short msl = ReadWord(address + 2);
+                return (msw << 16) | (ushort) msl;
+            }
+
             // try to handle certain things separate if they need to be separate? otherwise handle as 2x readwords?
             {
                 return ((ushort)ReadWord(address) | (ushort)(ReadWord(address + 2) << 16));
@@ -197,7 +205,7 @@ namespace BizHawk.Emulation.Consoles.Sega
             if (address >= 0xC00000)
             {
                 WriteWord(address, (short)(value >> 16));
-                WriteWord(address, (short)value);
+                WriteWord(address+2, (short)value);
                 return;
             }
 
diff --git a/BizHawk.MultiClient/RenderPanel.cs b/BizHawk.MultiClient/RenderPanel.cs
index 54b4915386..fbc482855e 100644
--- a/BizHawk.MultiClient/RenderPanel.cs
+++ b/BizHawk.MultiClient/RenderPanel.cs
@@ -530,7 +530,6 @@ namespace BizHawk.MultiClient
 	class UIDisplay
 	{
 		public string Message;
-		public DateTime ExpireAt;
 		public int X;
 		public int Y;
 		public bool Alert;
diff --git a/BizHawk.MultiClient/tools/HexEditor.cs b/BizHawk.MultiClient/tools/HexEditor.cs
index f87d579e14..797caecb48 100644
--- a/BizHawk.MultiClient/tools/HexEditor.cs
+++ b/BizHawk.MultiClient/tools/HexEditor.cs
@@ -350,7 +350,6 @@ namespace BizHawk.MultiClient
 
 		private byte[] GetRomBytes()
 		{
-			byte[] bytes;
 			string path = Global.MainForm.CurrentlyOpenRom;
 			if (path == null)
 			{
@@ -376,8 +375,6 @@ namespace BizHawk.MultiClient
 					return File.ReadAllBytes(path);
 				}
 			}
-
-			return new byte[0];
 		}
 
 		private void SetMemoryDomain(int pos)
diff --git a/DiscoHawk/MainDiscoForm.cs b/DiscoHawk/MainDiscoForm.cs
index 34735fd5a8..7f0b970bdc 100644
--- a/DiscoHawk/MainDiscoForm.cs
+++ b/DiscoHawk/MainDiscoForm.cs
@@ -26,12 +26,6 @@ namespace BizHawk
 			InitializeComponent();
 		}
 
-		private class DiscRecord
-		{
-			public Disc Disc;
-			public string BaseName;
-		}
-
 		private void MainDiscoForm_Load(object sender, EventArgs e)
 		{