From 4a2bec239a4c661dff81c45f23a9be0144aed491 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Fri, 30 Sep 2016 23:34:06 +0300 Subject: [PATCH] MBC2 RAM support was completely broken. --- Cocoa/Document.m | 2 +- Core/mbc.c | 11 +++++++++-- Core/memory.c | 13 ++++++------- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Cocoa/Document.m b/Cocoa/Document.m index aca44d2..15fc1aa 100644 --- a/Cocoa/Document.m +++ b/Cocoa/Document.m @@ -624,7 +624,7 @@ static uint32_t rgbEncode(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) n_banks = gb.is_cgb ? 2 : 1; break; case GBMemoryExternalRAM: - n_banks = gb.mbc_ram_size / 0x2000; + n_banks = (gb.mbc_ram_size + 0x1FFF) / 0x2000; break; case GBMemoryRAM: n_banks = gb.is_cgb ? 8 : 1; diff --git a/Core/mbc.c b/Core/mbc.c index 2719208..80fde6e 100644 --- a/Core/mbc.c +++ b/Core/mbc.c @@ -106,9 +106,16 @@ void GB_configure_cart(GB_gameboy_t *gb) } if (gb->cartridge_type->has_ram) { - static const int ram_sizes[256] = {0, 0x800, 0x2000, 0x8000, 0x20000, 0x10000}; - gb->mbc_ram_size = ram_sizes[gb->rom[0x149]]; + if (gb->cartridge_type->mbc_type == GB_MBC2) { + gb->mbc_ram_size = 0x200; + } + else { + static const int ram_sizes[256] = {0, 0x800, 0x2000, 0x8000, 0x20000, 0x10000}; + gb->mbc_ram_size = ram_sizes[gb->rom[0x149]]; + } gb->mbc_ram = malloc(gb->mbc_ram_size); + + /* Todo: Some games assume unintialized MBC RAM is 0xFF. It this true for all cartridges types?*/ memset(gb->mbc_ram, 0xFF, gb->mbc_ram_size); } diff --git a/Core/memory.c b/Core/memory.c index 9517081..819e4d0 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -86,7 +86,11 @@ static uint8_t read_mbc_ram(GB_gameboy_t *gb, uint16_t addr) return 0xFF; } - return gb->mbc_ram[((addr & 0x1FFF) + gb->mbc_ram_bank * 0x2000) & (gb->mbc_ram_size - 1)]; + uint8_t ret = gb->mbc_ram[((addr & 0x1FFF) + gb->mbc_ram_bank * 0x2000) & (gb->mbc_ram_size - 1)]; + if (gb->cartridge_type->mbc_type == GB_MBC2) { + ret |= 0xF0; + } + return ret; } static uint8_t read_ram(GB_gameboy_t *gb, uint16_t addr) @@ -278,8 +282,7 @@ static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value) break; case GB_MBC2: switch (addr & 0xF000) { - /* Todo: is this correct? */ - case 0x0000: case 0x1000: if (!(addr & 0x100)) gb->mbc_ram_enable = value & 0x1; break; + case 0x0000: case 0x1000: if (!(addr & 0x100)) gb->mbc_ram_enable = value == 10; break; case 0x2000: case 0x3000: if ( addr & 0x100) gb->mbc2.rom_bank = value; break; } break; @@ -326,10 +329,6 @@ static void write_mbc_ram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) gb->rtc_latched.data[gb->mbc_ram_bank - 8] = gb->rtc_real.data[gb->mbc_ram_bank - 8] = value; /* Todo: does it really write both? */ } - if (gb->cartridge_type->mbc_type == GB_MBC2) { - value &= 0xF; - } - if (!gb->mbc_ram) { return; }