diff --git a/Core/mbc.c b/Core/mbc.c index fddd3a9..5d50db5 100644 --- a/Core/mbc.c +++ b/Core/mbc.c @@ -107,10 +107,10 @@ void GB_update_mbc_mappings(GB_gameboy_t *gb) if (gb->mmm01.locked) { if (gb->mmm01.multiplex_mode) { gb->mbc_rom0_bank = (gb->mmm01.rom_bank_low & (gb->mmm01.rom_bank_mask << 1)) | - ((gb->mmm01.rom_bank_low & (gb->mmm01.mbc1_mode? -1 : gb->mmm01.ram_bank_mask)) << 5) | + ((gb->mmm01.mbc1_mode? 0 : gb->mmm01.ram_bank_low) << 5) | (gb->mmm01.rom_bank_high << 7); gb->mbc_rom_bank = gb->mmm01.rom_bank_low | - (gb->mmm01.rom_bank_low << 5) | + (gb->mmm01.ram_bank_low << 5) | (gb->mmm01.rom_bank_high << 7); gb->mbc_ram_bank = gb->mmm01.rom_bank_mid | (gb->mmm01.ram_bank_high << 2); } @@ -125,7 +125,7 @@ void GB_update_mbc_mappings(GB_gameboy_t *gb) gb->mbc_ram_bank = gb->mmm01.ram_bank_low | (gb->mmm01.ram_bank_high << 2); } else { - gb->mbc_ram_bank = (gb->mmm01.ram_bank_low & gb->mmm01.ram_bank_mask) | (gb->mmm01.ram_bank_high << 2); + gb->mbc_ram_bank = gb->mmm01.ram_bank_low | (gb->mmm01.ram_bank_high << 2); } } if (gb->mbc_rom_bank == gb->mbc_rom0_bank) { @@ -256,6 +256,7 @@ void GB_reset_mbc(GB_gameboy_t *gb) if (gb->cartridge_type->mbc_type == GB_MMM01) { gb->mbc_rom_bank = -1; gb->mbc_rom0_bank = -2; + gb->mmm01.ram_bank_mask = -1; } else if (gb->cartridge_type->mbc_type == GB_MBC5 || gb->cartridge_type->mbc_type == GB_CAMERA) { diff --git a/Core/memory.c b/Core/memory.c index 18f8cdf..2e686c8 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -859,15 +859,12 @@ static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value) case 0x2000: case 0x3000: if (!gb->mmm01.locked) { gb->mmm01.rom_bank_mid = value >> 5; - gb->mmm01.rom_bank_low = value; - } - else { - gb->mmm01.rom_bank_low &= (gb->mmm01.rom_bank_mask << 1); - gb->mmm01.rom_bank_low |= ~(gb->mmm01.rom_bank_mask << 1) & value; } + gb->mmm01.rom_bank_low &= (gb->mmm01.rom_bank_mask << 1); + gb->mmm01.rom_bank_low |= ~(gb->mmm01.rom_bank_mask << 1) & value; break; case 0x4000: case 0x5000: - gb->mmm01.ram_bank_low = value; + gb->mmm01.ram_bank_low = value | ~gb->mmm01.ram_bank_mask; if (!gb->mmm01.locked) { gb->mmm01.ram_bank_high = value >> 2; gb->mmm01.rom_bank_high = value >> 4; @@ -875,7 +872,9 @@ static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value) } break; case 0x6000: case 0x7000: - gb->mmm01.mbc1_mode = (value & 1) && !gb->mmm01.mbc1_mode_disable; + if (!gb->mmm01.mbc1_mode_disable) { + gb->mmm01.mbc1_mode = (value & 1); + } if (!gb->mmm01.locked) { gb->mmm01.rom_bank_mask = value >> 2; gb->mmm01.multiplex_mode = value & 0x40;