From b7b60ae7b4d34862e4096d626441aa715455571d Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 8 Feb 2023 01:32:24 -0500 Subject: [PATCH] NES PPU viewer: fix calculations of hovered sprites from mouse coordinates. they were pretty crashy before --- .../tools/NES/NESPPU.cs | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs b/src/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs index a60a41fff8..30f6ea69b4 100644 --- a/src/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs +++ b/src/BizHawk.Client.EmuHawk/tools/NES/NESPPU.cs @@ -551,7 +551,41 @@ namespace BizHawk.Client.EmuHawk byte[] ppuBus = _ppu.GetPPUBus(); // caching is quicker, but not really correct in this case bool is8x16 = _ppu.SPTall; - var spriteNumber = ((e.Y / 24) * 16) + (e.X / 16); + + //figure out which sprite we're over + int spriteSlotY = e.Y / 8; + int spriteSlotX = e.X / 8; + + //exclude mouse over empty area (vertical). this depends on how big the sprites are + if (is8x16) + { + if (spriteSlotY % 3 == 2) + return; + } + else + { + if (spriteSlotY % 3 != 0) + return; + } + + //exclude mouse over empty area to the right of sprites + if (spriteSlotX % 2 == 1) + return; + + //convert these 8x8 "slots" we've been working on to more sensible slots + spriteSlotX /= 2; + spriteSlotY /= 3; + + //if these were utterly senseless slots (so far out of range) then bail + if (spriteSlotX < 0 || spriteSlotX >= 16) + return; + + if (spriteSlotY < 0 || spriteSlotY >= 4) + return; + + //find the final sprite number that's being hovered + var spriteNumber = spriteSlotY * 16 + spriteSlotX; + int x = oam[(spriteNumber * 4) + 3]; int y = oam[spriteNumber * 4]; var color = oam[(spriteNumber * 4) + 2] & 0x03;