GB: Fix VRAM/palette locking (fixes #1109)
Vicki Pfau vi@endrift.com
Sun, 24 Jun 2018 16:11:37 -0700
3 files changed,
17 insertions(+),
7 deletions(-)
M
src/gb/io.c
→
src/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.c
→
src/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: