diff --git a/CHANGES b/CHANGES index 9debf781f..ad24f9fae 100644 --- a/CHANGES +++ b/CHANGES @@ -62,6 +62,7 @@ Misc: - Qt: Add load alternate save option - GB Audio: Improved audio quality - GB, GBA Audio: Increase max audio volume + - GB: Fix VRAM/palette locking (fixes mgba.io/i/1109) 0.6.3: (2017-04-14) Bugfixes: diff --git a/src/gb/io.c b/src/gb/io.c index 14e3b3621..75a292235 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -489,8 +489,10 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { gb->memory.io[REG_BCPD] = gb->video.palette[gb->video.bcpIndex >> 1] >> (8 * (gb->video.bcpIndex & 1)); break; case REG_BCPD: - GBVideoProcessDots(&gb->video, 0); - GBVideoWritePalette(&gb->video, address, value); + if (gb->video.mode != 3) { + GBVideoProcessDots(&gb->video, 0); + GBVideoWritePalette(&gb->video, address, value); + } return; case REG_OCPS: gb->video.ocpIndex = value & 0x3F; @@ -498,8 +500,10 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { gb->memory.io[REG_OCPD] = gb->video.palette[8 * 4 + (gb->video.ocpIndex >> 1)] >> (8 * (gb->video.ocpIndex & 1)); break; case REG_OCPD: - GBVideoProcessDots(&gb->video, 0); - GBVideoWritePalette(&gb->video, address, value); + if (gb->video.mode != 3) { + GBVideoProcessDots(&gb->video, 0); + GBVideoWritePalette(&gb->video, address, value); + } return; case REG_SVBK: GBMemorySwitchWramBank(&gb->memory, value); diff --git a/src/gb/memory.c b/src/gb/memory.c index 799234ae4..8b2a873f8 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -239,7 +239,10 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) { return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)]; case GB_REGION_VRAM: case GB_REGION_VRAM + 1: - return gb->video.vramBank[address & (GB_SIZE_VRAM_BANK0 - 1)]; + if (gb->video.mode != 3) { + return gb->video.vramBank[address & (GB_SIZE_VRAM_BANK0 - 1)]; + } + return 0xFF; case GB_REGION_EXTERNAL_RAM: case GB_REGION_EXTERNAL_RAM + 1: if (memory->rtcAccess) { @@ -309,8 +312,10 @@ void GBStore8(struct LR35902Core* cpu, uint16_t address, int8_t value) { return; case GB_REGION_VRAM: case GB_REGION_VRAM + 1: - gb->video.renderer->writeVRAM(gb->video.renderer, (address & (GB_SIZE_VRAM_BANK0 - 1)) | (GB_SIZE_VRAM_BANK0 * gb->video.vramCurrentBank)); - gb->video.vramBank[address & (GB_SIZE_VRAM_BANK0 - 1)] = value; + if (gb->video.mode != 3) { + gb->video.renderer->writeVRAM(gb->video.renderer, (address & (GB_SIZE_VRAM_BANK0 - 1)) | (GB_SIZE_VRAM_BANK0 * gb->video.vramCurrentBank)); + gb->video.vramBank[address & (GB_SIZE_VRAM_BANK0 - 1)] = value; + } return; case GB_REGION_EXTERNAL_RAM: case GB_REGION_EXTERNAL_RAM + 1: