From 06d407f130ca454bc23668051a7b73a84b9c1dd7 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 5b4a414a9..3a5e1033b 100644 --- a/CHANGES +++ b/CHANGES @@ -27,6 +27,7 @@ Emulation fixes: - GBA Memory: Fix STM to VRAM (fixes mgba.io/i/1430) - GB Audio: Only reset channel 3 sample in DMG mode - GB Audio: Sample inactive channels (fixes mgba.io/i/1455, mgba.io/i/1456) + - GB Video: Increment BCPS/OCPS even in mode 3 (fixes mgba.io/i/1462) Other fixes: - Qt: Fix some Qt display driver race conditions - Core: Improved lockstep driver reliability (Le Hoang Quyen) diff --git a/src/gb/io.c b/src/gb/io.c index e008dbb26..2c4b9b4b3 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -499,8 +499,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; @@ -510,8 +510,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 cfe80f913..020889ca9 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;