From 0accea962137cb37215066bbba982dc5b4b2fa13 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 24 Jun 2019 09:05:38 -0700 Subject: [PATCH] GB Video: Increment BCPS/OCPS even in mode 3 (fixes #1462) --- CHANGES | 1 + src/gb/io.c | 4 ++-- src/gb/video.c | 32 ++++++++++++++++++-------------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 1fd0ea2e9..a96f3b9a1 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ Emulation fixes: - GBA Video: Fix wrapped sprite mosaic clamping (fixes mgba.io/i/1432) - GBA Memory: Fix STM to VRAM (fixes mgba.io/i/1430) + - GB Video: Increment BCPS/OCPS even in mode 3 (fixes mgba.io/i/1462) Other fixes: - Switch: Fix threading-related crash on second launch - Qt: Fix FPS target maxing out at 59.727 (fixes mgba.io/i/1421) diff --git a/src/gb/io.c b/src/gb/io.c index 84b3a35bc..d044ad05d 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -497,8 +497,8 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { case REG_BCPD: if (gb->video.mode != 3) { GBVideoProcessDots(&gb->video, 0); - GBVideoWritePalette(&gb->video, address, value); } + GBVideoWritePalette(&gb->video, address, value); return; case REG_OCPS: gb->video.ocpIndex = value & 0x3F; @@ -508,8 +508,8 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { case REG_OCPD: if (gb->video.mode != 3) { GBVideoProcessDots(&gb->video, 0); - GBVideoWritePalette(&gb->video, address, value); } + GBVideoWritePalette(&gb->video, address, value); return; case REG_SVBK: GBMemorySwitchWramBank(&gb->memory, value); diff --git a/src/gb/video.c b/src/gb/video.c index 8aa978292..89f3c493a 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -505,14 +505,16 @@ void GBVideoWritePalette(struct GBVideo* video, uint16_t address, uint8_t value) } else { switch (address) { case REG_BCPD: - if (video->bcpIndex & 1) { - video->palette[video->bcpIndex >> 1] &= 0x00FF; - video->palette[video->bcpIndex >> 1] |= value << 8; - } else { - video->palette[video->bcpIndex >> 1] &= 0xFF00; - video->palette[video->bcpIndex >> 1] |= value; + if (video->mode != 3) { + if (video->bcpIndex & 1) { + video->palette[video->bcpIndex >> 1] &= 0x00FF; + video->palette[video->bcpIndex >> 1] |= value << 8; + } else { + video->palette[video->bcpIndex >> 1] &= 0xFF00; + video->palette[video->bcpIndex >> 1] |= value; + } + video->renderer->writePalette(video->renderer, video->bcpIndex >> 1, video->palette[video->bcpIndex >> 1]); } - video->renderer->writePalette(video->renderer, video->bcpIndex >> 1, video->palette[video->bcpIndex >> 1]); if (video->bcpIncrement) { ++video->bcpIndex; video->bcpIndex &= 0x3F; @@ -522,14 +524,16 @@ void GBVideoWritePalette(struct GBVideo* video, uint16_t address, uint8_t value) video->p->memory.io[REG_BCPD] = video->palette[video->bcpIndex >> 1] >> (8 * (video->bcpIndex & 1)); break; case REG_OCPD: - if (video->ocpIndex & 1) { - video->palette[8 * 4 + (video->ocpIndex >> 1)] &= 0x00FF; - video->palette[8 * 4 + (video->ocpIndex >> 1)] |= value << 8; - } else { - video->palette[8 * 4 + (video->ocpIndex >> 1)] &= 0xFF00; - video->palette[8 * 4 + (video->ocpIndex >> 1)] |= value; + if (video->mode != 3) { + if (video->ocpIndex & 1) { + video->palette[8 * 4 + (video->ocpIndex >> 1)] &= 0x00FF; + video->palette[8 * 4 + (video->ocpIndex >> 1)] |= value << 8; + } else { + video->palette[8 * 4 + (video->ocpIndex >> 1)] &= 0xFF00; + video->palette[8 * 4 + (video->ocpIndex >> 1)] |= value; + } + video->renderer->writePalette(video->renderer, 8 * 4 + (video->ocpIndex >> 1), video->palette[8 * 4 + (video->ocpIndex >> 1)]); } - video->renderer->writePalette(video->renderer, 8 * 4 + (video->ocpIndex >> 1), video->palette[8 * 4 + (video->ocpIndex >> 1)]); if (video->ocpIncrement) { ++video->ocpIndex; video->ocpIndex &= 0x3F;