From 01dfbf5afa027085ae0b2af09d514c16b5ee68b0 Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 7 Nov 2018 03:09:56 -0500 Subject: [PATCH] fix the way memview reads mirrored palette regs. Should fix bug 833 on SF but I'm not completely sure --- src/debug.h | 1 + src/drivers/win/memview.cpp | 7 ++-- src/ppu.cpp | 76 +++++++++---------------------------- 3 files changed, 23 insertions(+), 61 deletions(-) diff --git a/src/debug.h b/src/debug.h index d531abf7..21aa3774 100644 --- a/src/debug.h +++ b/src/debug.h @@ -115,6 +115,7 @@ extern void IncrementInstructionsCounters(); extern uint8 *vnapage[4],*VPage[8]; extern uint8 PPU[4],PALRAM[0x20],SPRAM[0x100],VRAMBuffer,PPUGenLatch,XOffset; extern uint32 FCEUPPU_PeekAddress(); +extern uint8 READPAL_MOTHEROFALL(uint32 A); extern int numWPs; ///encapsulates the operational state of the debugger core diff --git a/src/drivers/win/memview.cpp b/src/drivers/win/memview.cpp index 50bbd6f7..4344a4c0 100644 --- a/src/drivers/win/memview.cpp +++ b/src/drivers/win/memview.cpp @@ -679,11 +679,12 @@ int GetMemViewData(uint32 i) if (GameInfo->type==GIT_NSF) { return (0); - } else + } + else { if(i < 0x3F00) - return vnapage[(i>>10)&0x3][i&0x3FF]; - return PALRAM[i&0x1F]; + return vnapage[(i >> 10) & 0x3][i & 0x3FF]; + return READPAL_MOTHEROFALL(i & 0x1F); } } diff --git a/src/ppu.cpp b/src/ppu.cpp index ed401d67..689c7de6 100644 --- a/src/ppu.cpp +++ b/src/ppu.cpp @@ -376,6 +376,18 @@ uint8 UPALRAM[0x03];//for 0x4/0x8/0xC addresses in palette, the ones in uint8* MMC5BGVRAMADR(uint32 A); +uint8 READPAL_MOTHEROFALL(uint32 A) +{ + if(!(A & 3)) { + if(!(A & 0xC)) + return READPAL(0x00); + else + return READUPAL(((A & 0xC) >> 2) - 1); + } + else + return READPAL(A & 0x1F); +} + //this duplicates logic which is embedded in the ppu rendering code //which figures out where to get CHR data from depending on various hack modes //mostly involving mmc5. @@ -1627,7 +1639,6 @@ static void RefreshSprites(void) { } static void CopySprites(uint8 *target) { - uint8 n = ((PPU[1] & 4) ^ 4) << 1; uint8 *P = target; if (!spork) return; @@ -1635,65 +1646,14 @@ static void CopySprites(uint8 *target) { if (!rendersprites) return; //User asked to not display sprites. - loopskie: + if(!SpriteON) return; + for(int i=0;i<256;i++) { - uint32 t = *(uint32*)(sprlinebuf + n); - - if (t != 0x80808080) { - #ifdef LSB_FIRST - if (!(t & 0x80)) { - if (!(t & 0x40) || (P[n] & 0x40)) // Normal sprite || behind bg sprite - P[n] = sprlinebuf[n]; - } - - if (!(t & 0x8000)) { - if (!(t & 0x4000) || (P[n + 1] & 0x40)) // Normal sprite || behind bg sprite - P[n + 1] = (sprlinebuf + 1)[n]; - } - - if (!(t & 0x800000)) { - if (!(t & 0x400000) || (P[n + 2] & 0x40)) // Normal sprite || behind bg sprite - P[n + 2] = (sprlinebuf + 2)[n]; - } - - if (!(t & 0x80000000)) { - if (!(t & 0x40000000) || (P[n + 3] & 0x40)) // Normal sprite || behind bg sprite - P[n + 3] = (sprlinebuf + 3)[n]; - } - #else - /* TODO: Simplify */ - if (!(t & 0x80000000)) { - if (!(t & 0x40000000)) // Normal sprite - P[n] = sprlinebuf[n]; - else if (P[n] & 64) // behind bg sprite - P[n] = sprlinebuf[n]; - } - - if (!(t & 0x800000)) { - if (!(t & 0x400000)) // Normal sprite - P[n + 1] = (sprlinebuf + 1)[n]; - else if (P[n + 1] & 64) // behind bg sprite - P[n + 1] = (sprlinebuf + 1)[n]; - } - - if (!(t & 0x8000)) { - if (!(t & 0x4000)) // Normal sprite - P[n + 2] = (sprlinebuf + 2)[n]; - else if (P[n + 2] & 64) // behind bg sprite - P[n + 2] = (sprlinebuf + 2)[n]; - } - - if (!(t & 0x80)) { - if (!(t & 0x40)) // Normal sprite - P[n + 3] = (sprlinebuf + 3)[n]; - else if (P[n + 3] & 64) // behind bg sprite - P[n + 3] = (sprlinebuf + 3)[n]; - } - #endif - } + uint8 t = sprlinebuf[i]; + if(!(t&0x80)) + if (!(t & 0x40) || (P[i] & 0x40)) // Normal sprite || behind bg sprite + P[i] = t; } - n += 4; - if (n) goto loopskie; } void FCEUPPU_SetVideoSystem(int w) {