From e6ce14e031a669b43ea95f15ae82766f0c4dd1bb Mon Sep 17 00:00:00 2001 From: zeromus Date: Tue, 12 Apr 2016 03:01:46 -0500 Subject: [PATCH] gambatte: add feature to toggle visibility of the window. I tried to put it on the rendering logic and not the control logic, to prevent possible sync bugs, and I don't think I messed that up, but maybe I missed some of the rendering logic. --- libgambatte/src/video/ppu.cpp | 20 ++++++++++---------- libgambatte/src/video/ppu.h | 2 +- output/dll/libgambatte.dll | Bin 152064 -> 152064 bytes 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/libgambatte/src/video/ppu.cpp b/libgambatte/src/video/ppu.cpp index 079950ec89..ed884f7b97 100644 --- a/libgambatte/src/video/ppu.cpp +++ b/libgambatte/src/video/ppu.cpp @@ -217,7 +217,7 @@ namespace M3Start { switch (p.xpos & 7) { case 0: - if (p.winDrawState & WIN_DRAW_STARTED) { + if ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) { p.reg1 = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + (p.wscx >> 3 & 0x1F) + 0x1800]; p.nattrib = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + (p.wscx >> 3 & 0x1F) + 0x3800]; } else { @@ -228,7 +228,7 @@ namespace M3Start { break; case 2: { - const unsigned yoffset = (p.winDrawState & WIN_DRAW_STARTED) ? p.winYPos : p.scy + p.lyCounter.ly(); + const unsigned yoffset = ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) ? p.winYPos : p.scy + p.lyCounter.ly(); p.reg0 = p.vram[0x1000 + (p.nattrib << 10 & 0x2000) - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) + p.reg1 * 16 + ((-(p.nattrib >> 6 & 1) ^ yoffset) & 7) * 2]; @@ -237,7 +237,7 @@ namespace M3Start { break; case 4: { - const unsigned yoffset = (p.winDrawState & WIN_DRAW_STARTED) ? p.winYPos : p.scy + p.lyCounter.ly(); + const unsigned yoffset = ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) ? p.winYPos : p.scy + p.lyCounter.ly(); const unsigned r1 = p.vram[0x1000 + (p.nattrib << 10 & 0x2000) - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) + p.reg1 * 16 + ((-(p.nattrib >> 6 & 1) ^ yoffset) & 7) * 2 + 1]; @@ -734,7 +734,7 @@ namespace M3Loop { unsigned tileline; unsigned tileMapXpos; - if (p.winDrawState & WIN_DRAW_STARTED) { + if ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) { tileMapLine = p.vram + (p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + 0x1800; tileMapXpos = (xpos + p.wscx) >> 3; tileline = p.winYPos & 7; @@ -919,7 +919,7 @@ namespace M3Loop { p.wscx = 8 - p.xpos; - if (p.winDrawState & WIN_DRAW_STARTED) { + if ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) { p.reg1 = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + 0x1800]; p.nattrib = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + 0x3800]; } else { @@ -935,7 +935,7 @@ namespace M3Loop { } static void f2(PPUPriv &p) { - const unsigned yoffset = (p.winDrawState & WIN_DRAW_STARTED) ? p.winYPos : p.scy + p.lyCounter.ly(); + const unsigned yoffset = ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) ? p.winYPos : p.scy + p.lyCounter.ly(); p.reg0 = p.vram[0x1000 + (p.nattrib << 10 & 0x2000) - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) @@ -949,7 +949,7 @@ namespace M3Loop { } static void f4(PPUPriv &p) { - const unsigned yoffset = (p.winDrawState & WIN_DRAW_STARTED) ? p.winYPos : p.scy + p.lyCounter.ly(); + const unsigned yoffset = ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) ? p.winYPos : p.scy + p.lyCounter.ly(); const unsigned r1 = p.vram[0x1000 + (p.nattrib << 10 & 0x2000) - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) + p.reg1 * 16 + ((-(p.nattrib >> 6 & 1) ^ yoffset) & 7) * 2 + 1]; @@ -1076,7 +1076,7 @@ namespace M3Loop { p.attrib = p.nattrib; p.endx = p.xpos < 160 ? p.xpos + 8 : 168; - if (p.winDrawState & WIN_DRAW_STARTED) { + if ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW) ) { p.reg1 = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 + ((p.xpos + p.wscx) >> 3 & 0x1F) + 0x1800]; p.nattrib = p.vram[(p.lcdc << 4 & 0x400) + (p.winYPos & 0xF8) * 4 @@ -1102,7 +1102,7 @@ namespace M3Loop { if ((p.winDrawState & WIN_DRAW_START) && handleWinDrawStartReq(p)) return StartWindowDraw::f0(p); - const unsigned yoffset = (p.winDrawState & WIN_DRAW_STARTED) ? p.winYPos : p.scy + p.lyCounter.ly(); + const unsigned yoffset = ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) ? p.winYPos : p.scy + p.lyCounter.ly(); p.reg0 = p.vram[0x1000 + (p.nattrib << 10 & 0x2000) - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) @@ -1122,7 +1122,7 @@ namespace M3Loop { if ((p.winDrawState & WIN_DRAW_START) && handleWinDrawStartReq(p)) return StartWindowDraw::f0(p); - const unsigned yoffset = (p.winDrawState & WIN_DRAW_STARTED) ? p.winYPos : p.scy + p.lyCounter.ly(); + const unsigned yoffset = ((p.winDrawState & WIN_DRAW_STARTED) && (p.layersMask & LAYER_MASK_WINDOW)) ? p.winYPos : p.scy + p.lyCounter.ly(); const unsigned r1 = p.vram[0x1000 + (p.nattrib << 10 & 0x2000) - ((p.reg1 * 32 | p.lcdc << 8) & 0x1000) + p.reg1 * 16 + ((-(p.nattrib >> 6 & 1) ^ yoffset) & 7) * 2 + 1]; diff --git a/libgambatte/src/video/ppu.h b/libgambatte/src/video/ppu.h index 047c5da198..6ca279af9e 100644 --- a/libgambatte/src/video/ppu.h +++ b/libgambatte/src/video/ppu.h @@ -27,7 +27,7 @@ namespace gambatte { -enum { LAYER_MASK_BG = 1, LAYER_MASK_OBJ = 2 }; +enum { LAYER_MASK_BG = 1, LAYER_MASK_OBJ = 2, LAYER_MASK_WINDOW = 4 }; class PPUFrameBuf { uint_least32_t *buf_; diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 8be6fa6b1a1e71dcb799dee8c2150f93dbb6b8eb..cf461d3ed55dee57d9887f902a6726c01762c227 100644 GIT binary patch delta 3199 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 eDZeRCkl&W4$?wan