From 422ea26b46152528fe910757c7517f0ac2abbe76 Mon Sep 17 00:00:00 2001 From: dborth Date: Sun, 6 Feb 2011 05:23:21 +0000 Subject: [PATCH] sync to snes9x git --- source/snes9x/gfx.cpp | 96 +++++++++++++++++++++--------------------- source/snes9x/ppu.cpp | 8 +--- source/snes9x/tile.cpp | 38 +++++------------ 3 files changed, 59 insertions(+), 83 deletions(-) diff --git a/source/snes9x/gfx.cpp b/source/snes9x/gfx.cpp index f7bb546..9055e6d 100644 --- a/source/snes9x/gfx.cpp +++ b/source/snes9x/gfx.cpp @@ -329,9 +329,8 @@ void S9xStartScreenRefresh (void) { if (IPPU.RenderThisFrame) { - if (GFX.DoInterlace && GFX.InterlaceFrame == 0) - GFX.InterlaceFrame = 1; - else + GFX.InterlaceFrame = !GFX.InterlaceFrame; + if (!GFX.DoInterlace || !GFX.InterlaceFrame) { if (!S9xInitUpdate()) { @@ -339,50 +338,45 @@ void S9xStartScreenRefresh (void) return; } - GFX.InterlaceFrame = 0; if (GFX.DoInterlace) GFX.DoInterlace--; IPPU.MaxBrightness = PPU.Brightness; - IPPU.PseudoHires = Memory.FillRAM[0x2133] & 8; - if (PPU.BGMode == 5 || PPU.BGMode == 6) - { - IPPU.Interlace = Memory.FillRAM[0x2133] & 1; - IPPU.InterlaceOBJ = Memory.FillRAM[0x2133] & 2; - } + IPPU.Interlace = Memory.FillRAM[0x2133] & 1; + IPPU.InterlaceOBJ = Memory.FillRAM[0x2133] & 2; + IPPU.PseudoHires = Memory.FillRAM[0x2133] & 8; - if (Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires || IPPU.Interlace || IPPU.InterlaceOBJ)) + if (Settings.SupportHiRes && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) { GFX.RealPPL = GFX.Pitch >> 1; IPPU.DoubleWidthPixels = TRUE; IPPU.RenderedScreenWidth = SNES_WIDTH << 1; - if (IPPU.Interlace || IPPU.InterlaceOBJ) - { - GFX.PPL = GFX.RealPPL << 1; - IPPU.DoubleHeightPixels = TRUE; - IPPU.RenderedScreenHeight = PPU.ScreenHeight << 1; - GFX.DoInterlace++; - } - else - { - GFX.PPL = GFX.RealPPL; - IPPU.DoubleHeightPixels = FALSE; - IPPU.RenderedScreenHeight = PPU.ScreenHeight; - } } else { - IPPU.DoubleWidthPixels = FALSE; - IPPU.DoubleHeightPixels = FALSE; - IPPU.RenderedScreenWidth = SNES_WIDTH; - IPPU.RenderedScreenHeight = PPU.ScreenHeight; #ifdef USE_OPENGL if (Settings.OpenGLEnable) - GFX.RealPPL = GFX.PPL = SNES_WIDTH; + GFX.RealPPL = SNES_WIDTH; else #endif - GFX.RealPPL = GFX.PPL = GFX.Pitch >> 1; + GFX.RealPPL = GFX.Pitch >> 1; + IPPU.DoubleWidthPixels = FALSE; + IPPU.RenderedScreenWidth = SNES_WIDTH; + } + + if (Settings.SupportHiRes && IPPU.Interlace) + { + GFX.PPL = GFX.RealPPL << 1; + IPPU.DoubleHeightPixels = TRUE; + IPPU.RenderedScreenHeight = PPU.ScreenHeight << 1; + GFX.DoInterlace++; + } + else + { + GFX.PPL = GFX.RealPPL; + IPPU.DoubleHeightPixels = FALSE; + IPPU.RenderedScreenHeight = PPU.ScreenHeight; } IPPU.RenderedFramesCount++; @@ -652,7 +646,7 @@ static inline void RenderScreen (bool8 sub) void S9xUpdateScreen (void) { - if (IPPU.OBJChanged) + if (IPPU.OBJChanged || IPPU.InterlaceOBJ) SetupOBJ(); // XXX: Check ForceBlank? Or anything else? @@ -675,7 +669,7 @@ void S9xUpdateScreen (void) if (Settings.SupportHiRes) { - if (!IPPU.DoubleWidthPixels && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires || IPPU.Interlace || IPPU.InterlaceOBJ)) + if (!IPPU.DoubleWidthPixels && (PPU.BGMode == 5 || PPU.BGMode == 6 || IPPU.PseudoHires)) { #ifdef USE_OPENGL if (Settings.OpenGLEnable && GFX.RealPPL == 256) @@ -714,7 +708,7 @@ void S9xUpdateScreen (void) IPPU.RenderedScreenWidth = 512; } - if (!IPPU.DoubleHeightPixels && (IPPU.Interlace || IPPU.InterlaceOBJ)) + if (!IPPU.DoubleHeightPixels && IPPU.Interlace) { IPPU.DoubleHeightPixels = TRUE; IPPU.RenderedScreenHeight = PPU.ScreenHeight << 1; @@ -803,6 +797,8 @@ static void SetupOBJ (void) int inc = IPPU.InterlaceOBJ ? 2 : 1; + int startline = (IPPU.InterlaceOBJ && GFX.InterlaceFrame) ? 1 : 0; + // OK, we have three cases here. Either there's no priority, priority is // normal FirstSprite, or priority is FirstSprite+Y. The first two are // easy, the last is somewhat more ... interesting. So we split them up. @@ -853,7 +849,7 @@ static void SetupOBJ (void) else GFX.OBJVisibleTiles[S] = GFX.OBJWidths[S] >> 3; - for (uint8 line = 0, Y = (uint8) (PPU.OBJ[S].VPos & 0xff); line < Height; Y++, line += inc) + for (uint8 line = startline, Y = (uint8) (PPU.OBJ[S].VPos & 0xff); line < Height; Y++, line += inc) { if (Y >= SNES_HEIGHT_EXTENDED) continue; @@ -919,7 +915,7 @@ static void SetupOBJ (void) else GFX.OBJVisibleTiles[S] = GFX.OBJWidths[S] >> 3; - for (uint8 line = 0, Y = (uint8) (PPU.OBJ[S].VPos & 0xff); line < Height; Y++, line += inc) + for (uint8 line = startline, Y = (uint8) (PPU.OBJ[S].VPos & 0xff); line < Height; Y++, line += inc) { if (Y >= SNES_HEIGHT_EXTENDED) continue; @@ -996,8 +992,6 @@ static void DrawOBJS (int D) int BaseTile = (((GFX.OBJLines[Y].OBJ[I].Line << 1) + (PPU.OBJ[S].Name & 0xf0)) & 0xf0) | (PPU.OBJ[S].Name & 0x100) | (PPU.OBJ[S].Palette << 10); int TileX = PPU.OBJ[S].Name & 0x0f; int TileLine = (GFX.OBJLines[Y].OBJ[I].Line & 7) * 8; - if (IPPU.InterlaceOBJ) - TileLine >>= 1; int TileInc = 1; if (PPU.OBJ[S].HFlip) @@ -1090,6 +1084,7 @@ static void DrawBackground (int bg, uint8 Zh, uint8 Zl) int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; void (*DrawTile) (uint32, uint32, uint32, uint32); void (*DrawClippedTile) (uint32, uint32, uint32, uint32, uint32, uint32); @@ -1111,10 +1106,10 @@ static void DrawBackground (int bg, uint8 Zh, uint8 Zl) for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y += Lines) { - uint32 Y2 = IPPU.Interlace ? Y * 2 + GFX.InterlaceFrame : Y; - uint32 VOffset = LineData[Y].BG[bg].VOffset + (IPPU.Interlace ? 1 : 0); + uint32 Y2 = HiresInterlace ? Y * 2 + GFX.InterlaceFrame : Y; + uint32 VOffset = LineData[Y].BG[bg].VOffset + (HiresInterlace ? 1 : 0); uint32 HOffset = LineData[Y].BG[bg].HOffset; - int VirtAlign = ((Y2 + VOffset) & 7) >> (IPPU.Interlace ? 1 : 0); + int VirtAlign = ((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0); for (Lines = 1; Lines < GFX.LinesPerTile - VirtAlign; Lines++) { @@ -1306,6 +1301,7 @@ static void DrawBackgroundMosaic (int bg, uint8 Zh, uint8 Zl) int OffsetMask = (BG.TileSizeH == 16) ? 0x3ff : 0x1ff; int OffsetShift = (BG.TileSizeV == 16) ? 4 : 3; int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; void (*DrawPix) (uint32, uint32, uint32, uint32, uint32, uint32); @@ -1322,15 +1318,15 @@ static void DrawBackgroundMosaic (int bg, uint8 Zh, uint8 Zl) for (uint32 Y = GFX.StartY - MosaicStart; Y <= GFX.EndY; Y += PPU.Mosaic) { - uint32 Y2 = IPPU.Interlace ? Y * 2 : Y; - uint32 VOffset = LineData[Y].BG[bg].VOffset + (IPPU.Interlace ? 1 : 0); + uint32 Y2 = HiresInterlace ? Y * 2 : Y; + uint32 VOffset = LineData[Y].BG[bg].VOffset + (HiresInterlace ? 1 : 0); uint32 HOffset = LineData[Y].BG[bg].HOffset; Lines = PPU.Mosaic - MosaicStart; if (Y + MosaicStart + Lines > GFX.EndY) Lines = GFX.EndY - Y - MosaicStart + 1; - int VirtAlign = (((Y2 + VOffset) & 7) >> (IPPU.Interlace ? 1 : 0)) << 3; + int VirtAlign = (((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0)) << 3; uint32 t1, t2; uint32 TilemapRow = (VOffset + Y2) >> OffsetShift; @@ -1485,6 +1481,7 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) int Offset2Shift = (BG.OffsetSizeV == 16) ? 4 : 3; int OffsetEnableMask = 0x2000 << bg; int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; void (*DrawTile) (uint32, uint32, uint32, uint32); void (*DrawClippedTile) (uint32, uint32, uint32, uint32, uint32, uint32); @@ -1506,7 +1503,7 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) for (uint32 Y = GFX.StartY; Y <= GFX.EndY; Y++) { - uint32 Y2 = IPPU.Interlace ? Y * 2 + GFX.InterlaceFrame : Y; + uint32 Y2 = HiresInterlace ? Y * 2 + GFX.InterlaceFrame : Y; uint32 VOff = LineData[Y].BG[2].VOffset - 1; uint32 HOff = LineData[Y].BG[2].HOffset; uint32 HOffsetRow = VOff >> Offset2Shift; @@ -1593,11 +1590,11 @@ static void DrawBackgroundOffset (int bg, uint8 Zh, uint8 Zl, int VOffOff) HOffset = LineHOffset; } - if (IPPU.Interlace) + if (HiresInterlace) VOffset++; uint32 t1, t2; - int VirtAlign = (((Y2 + VOffset) & 7) >> (IPPU.Interlace ? 1 : 0)) << 3; + int VirtAlign = (((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0)) << 3; int TilemapRow = (VOffset + Y2) >> OffsetShift; BG.InterlaceLine = ((VOffset + Y2) & 1) << 3; @@ -1716,6 +1713,7 @@ static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) int Offset2Shift = (BG.OffsetSizeV == 16) ? 4 : 3; int OffsetEnableMask = 0x2000 << bg; int PixWidth = IPPU.DoubleWidthPixels ? 2 : 1; + bool8 HiresInterlace = IPPU.Interlace && IPPU.DoubleWidthPixels; void (*DrawPix) (uint32, uint32, uint32, uint32, uint32, uint32); @@ -1732,7 +1730,7 @@ static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) for (uint32 Y = GFX.StartY - MosaicStart; Y <= GFX.EndY; Y += PPU.Mosaic) { - uint32 Y2 = IPPU.Interlace ? Y * 2 : Y; + uint32 Y2 = HiresInterlace ? Y * 2 : Y; uint32 VOff = LineData[Y].BG[2].VOffset - 1; uint32 HOff = LineData[Y].BG[2].HOffset; @@ -1824,11 +1822,11 @@ static void DrawBackgroundOffsetMosaic (int bg, uint8 Zh, uint8 Zl, int VOffOff) HOffset = LineHOffset; } - if (IPPU.Interlace) + if (HiresInterlace) VOffset++; uint32 t1, t2; - int VirtAlign = (((Y2 + VOffset) & 7) >> (IPPU.Interlace ? 1 : 0)) << 3; + int VirtAlign = (((Y2 + VOffset) & 7) >> (HiresInterlace ? 1 : 0)) << 3; int TilemapRow = (VOffset + Y2) >> OffsetShift; BG.InterlaceLine = ((VOffset + Y2) & 1) << 3; diff --git a/source/snes9x/ppu.cpp b/source/snes9x/ppu.cpp index a9dc271..95ad4b4 100644 --- a/source/snes9x/ppu.cpp +++ b/source/snes9x/ppu.cpp @@ -454,10 +454,7 @@ 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); - if (PPU.BGMode == 5 || PPU.BGMode == 6) - IPPU.Interlace = Memory.FillRAM[0x2133] & 1; - else - IPPU.Interlace = 0; + IPPU.Interlace = Memory.FillRAM[0x2133] & 1; #ifdef DEBUGGER missing.modes[PPU.BGMode] = 1; #endif @@ -979,8 +976,7 @@ void S9xSetPPU (uint8 Byte, uint16 Address) FLUSH_REDRAW(); if ((Memory.FillRAM[0x2133] ^ Byte) & 2) IPPU.OBJChanged = TRUE; - if (PPU.BGMode == 5 || PPU.BGMode == 6) - IPPU.Interlace = Byte & 1; + IPPU.Interlace = Byte & 1; IPPU.InterlaceOBJ = Byte & 2; } #ifdef DEBUGGER diff --git a/source/snes9x/tile.cpp b/source/snes9x/tile.cpp index 286f0eb..b129009 100644 --- a/source/snes9x/tile.cpp +++ b/source/snes9x/tile.cpp @@ -492,7 +492,10 @@ void S9xSelectTileRenderers (int BGMode, bool8 sub, bool8 obj) M7M1 = PPU.BGMosaic[0] && PPU.Mosaic > 1; M7M2 = PPU.BGMosaic[1] && PPU.Mosaic > 1; - if (!IPPU.DoubleWidthPixels) + bool8 interlace = obj ? FALSE : IPPU.Interlace; + bool8 hires = !sub && (BGMode == 5 || BGMode == 6 || IPPU.PseudoHires); + + if (!IPPU.DoubleWidthPixels) // normal width { DT = Renderers_DrawTile16Normal1x1; DCT = Renderers_DrawClippedTile16Normal1x1; @@ -502,31 +505,9 @@ void S9xSelectTileRenderers (int BGMode, bool8 sub, bool8 obj) DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Normal1x1 : Renderers_DrawMode7BG2Normal1x1; GFX.LinesPerTile = 8; } - else + else if(hires) // hires double width { - bool8 hires, interlace; - - if (obj) // OBJ - { - hires = (BGMode == 5 || BGMode == 6 || IPPU.PseudoHires); - interlace = IPPU.InterlaceOBJ; - } - else - if (BGMode == 5 || BGMode == 6) - { - hires = TRUE; - interlace = IPPU.Interlace; - } - else - { - hires = IPPU.PseudoHires; - interlace = FALSE; - } - - if (sub) - hires = FALSE; - - if (hires && interlace) + if (interlace) { DT = Renderers_DrawTile16HiresInterlace; DCT = Renderers_DrawClippedTile16HiresInterlace; @@ -537,7 +518,6 @@ void S9xSelectTileRenderers (int BGMode, bool8 sub, bool8 obj) GFX.LinesPerTile = 4; } else - if (hires) { DT = Renderers_DrawTile16Hires; DCT = Renderers_DrawClippedTile16Hires; @@ -547,7 +527,9 @@ void S9xSelectTileRenderers (int BGMode, bool8 sub, bool8 obj) DM7BG2 = M7M2 ? Renderers_DrawMode7MosaicBG2Hires : Renderers_DrawMode7BG2Hires; GFX.LinesPerTile = 8; } - else + } + else // normal double width + { if (interlace) { DT = Renderers_DrawTile16Interlace; @@ -1435,7 +1417,7 @@ extern struct SLineMatrixData LineMatrixData[240]; #define DRAW_PIXEL(N, M) DRAW_PIXEL_N2x1(N, M) #define NAME2 Interlace -// Third-level include: Get the Interlace renderers. +// Third-level include: Get the double width Interlace renderers. #include "tile.cpp"