From ff1925cc0aa768f1ffefb3396e0bf354b3110d62 Mon Sep 17 00:00:00 2001 From: Brandon Wright Date: Mon, 25 Jun 2018 18:02:10 -0500 Subject: [PATCH] Disable interlace mode for bg modes not 5 or 6. --- gfx.cpp | 42 +++++++----------------------------------- ppu.cpp | 6 +++++- 2 files changed, 12 insertions(+), 36 deletions(-) diff --git a/gfx.cpp b/gfx.cpp index 73656332..13611a3d 100644 --- a/gfx.cpp +++ b/gfx.cpp @@ -369,12 +369,7 @@ void S9xStartScreenRefresh (void) } else { - #ifdef USE_OPENGL - if (Settings.OpenGLEnable) - GFX.RealPPL = SNES_WIDTH; - else - #endif - GFX.RealPPL = GFX.Pitch >> 1; + GFX.RealPPL = GFX.Pitch >> 1; IPPU.DoubleWidthPixels = FALSE; IPPU.RenderedScreenWidth = SNES_WIDTH; } @@ -685,37 +680,14 @@ void S9xUpdateScreen (void) { if (!IPPU.DoubleWidthPixels && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) { - #ifdef USE_OPENGL - if (Settings.OpenGLEnable && GFX.RealPPL == 256) + // Have to back out of the regular speed hack + for (register uint32 y = 0; y < GFX.StartY; y++) { - // Have to back out of the speed up hack where the low res. - // SNES image was rendered into a 256x239 sized buffer, - // ignoring the true, larger size of the buffer. - GFX.RealPPL = GFX.Pitch >> 1; + register uint16 *p = GFX.Screen + y * GFX.PPL + 255; + register uint16 *q = GFX.Screen + y * GFX.PPL + 510; - for (register int32 y = (int32) GFX.StartY - 1; y >= 0; y--) - { - register uint16 *p = GFX.Screen + y * GFX.PPL + 255; - register uint16 *q = GFX.Screen + y * GFX.RealPPL + 510; - - for (register int x = 255; x >= 0; x--, p--, q -= 2) - *q = *(q + 1) = *p; - } - - GFX.PPL = GFX.RealPPL; // = GFX.Pitch >> 1 above - } - else - #endif - { - // Have to back out of the regular speed hack - for (register uint32 y = 0; y < GFX.StartY; y++) - { - register uint16 *p = GFX.Screen + y * GFX.PPL + 255; - register uint16 *q = GFX.Screen + y * GFX.PPL + 510; - - for (register int x = 255; x >= 0; x--, p--, q -= 2) - *q = *(q + 1) = *p; - } + for (register int x = 255; x >= 0; x--, p--, q -= 2) + *q = *(q + 1) = *p; } IPPU.DoubleWidthPixels = TRUE; diff --git a/ppu.cpp b/ppu.cpp index a3ee2f1f..906774e3 100644 --- a/ppu.cpp +++ b/ppu.cpp @@ -546,7 +546,10 @@ void S9xSetPPU (uint8 Byte, uint16 Address) PPU.BGMode = Byte & 7; // BJ: BG3Priority only takes effect if BGMode == 1 and the bit is set PPU.BG3Priority = ((Byte & 0x0f) == 0x09); - IPPU.Interlace = Memory.FillRAM[0x2133] & 1; + if (PPU.BGMode == 6 || PPU.BGMode == 5) + IPPU.Interlace = Memory.FillRAM[0x2133] & 1; + else + IPPU.Interlace = 0; #ifdef DEBUGGER missing.modes[PPU.BGMode] = 1; #endif @@ -1068,6 +1071,7 @@ void S9xSetPPU (uint8 Byte, uint16 Address) FLUSH_REDRAW(); if ((Memory.FillRAM[0x2133] ^ Byte) & 2) IPPU.OBJChanged = TRUE; + IPPU.Interlace = Byte & 1; IPPU.InterlaceOBJ = Byte & 2; }