Improved MMM01 emulation, fixes #447
This commit is contained in:
parent
887a8104f5
commit
7071032288
@ -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) {
|
||||||
|
@ -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);
|
||||||
gb->mmm01.rom_bank_low |= ~(gb->mmm01.rom_bank_mask << 1) & value;
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user