Improved MMM01 emulation, fixes #447

This commit is contained in:
Lior Halphon 2022-07-02 21:03:26 +03:00
parent 887a8104f5
commit 7071032288
2 changed files with 10 additions and 10 deletions

View File

@ -107,10 +107,10 @@ void GB_update_mbc_mappings(GB_gameboy_t *gb)
if (gb->mmm01.locked) { if (gb->mmm01.locked) {
if (gb->mmm01.multiplex_mode) { if (gb->mmm01.multiplex_mode) {
gb->mbc_rom0_bank = (gb->mmm01.rom_bank_low & (gb->mmm01.rom_bank_mask << 1)) | 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->mmm01.rom_bank_high << 7);
gb->mbc_rom_bank = gb->mmm01.rom_bank_low | 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->mmm01.rom_bank_high << 7);
gb->mbc_ram_bank = gb->mmm01.rom_bank_mid | (gb->mmm01.ram_bank_high << 2); 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); gb->mbc_ram_bank = gb->mmm01.ram_bank_low | (gb->mmm01.ram_bank_high << 2);
} }
else { 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) { 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) { if (gb->cartridge_type->mbc_type == GB_MMM01) {
gb->mbc_rom_bank = -1; gb->mbc_rom_bank = -1;
gb->mbc_rom0_bank = -2; gb->mbc_rom0_bank = -2;
gb->mmm01.ram_bank_mask = -1;
} }
else if (gb->cartridge_type->mbc_type == GB_MBC5 || else if (gb->cartridge_type->mbc_type == GB_MBC5 ||
gb->cartridge_type->mbc_type == GB_CAMERA) { gb->cartridge_type->mbc_type == GB_CAMERA) {

View File

@ -859,15 +859,12 @@ static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value)
case 0x2000: case 0x3000: case 0x2000: case 0x3000:
if (!gb->mmm01.locked) { if (!gb->mmm01.locked) {
gb->mmm01.rom_bank_mid = value >> 5; 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; break;
case 0x4000: case 0x5000: 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) { if (!gb->mmm01.locked) {
gb->mmm01.ram_bank_high = value >> 2; gb->mmm01.ram_bank_high = value >> 2;
gb->mmm01.rom_bank_high = value >> 4; 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; break;
case 0x6000: case 0x7000: 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) { if (!gb->mmm01.locked) {
gb->mmm01.rom_bank_mask = value >> 2; gb->mmm01.rom_bank_mask = value >> 2;
gb->mmm01.multiplex_mode = value & 0x40; gb->mmm01.multiplex_mode = value & 0x40;