all repos — mgba @ e78333611d8d72394d5fd68539c0a0a8e2ffe45f

mGBA Game Boy Advance Emulator

GB: Fix VRAM/palette locking (fixes #1109)
Vicki Pfau vi@endrift.com
Sun, 24 Jun 2018 16:11:37 -0700
commit

e78333611d8d72394d5fd68539c0a0a8e2ffe45f

parent

e748d8fe771c6802215bd43710b3d0f1d81994dc

3 files changed, 17 insertions(+), 7 deletions(-)

jump to
M CHANGESCHANGES

@@ -62,6 +62,7 @@ - GBA Savedata: Remove ability to disable realistic timing

- 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:
M src/gb/io.csrc/gb/io.c

@@ -489,8 +489,10 @@ gb->video.bcpIncrement = value & 0x80;

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 @@ gb->video.ocpIncrement = value & 0x80;

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);
M src/gb/memory.csrc/gb/memory.c

@@ -239,7 +239,10 @@ case GB_REGION_CART_BANK1 + 1:

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 @@ cpu->memory.setActiveRegion(cpu, cpu->pc);

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: