Proper MBC30 support, more accurate MBC3 emulation. Fixes #244
This commit is contained in:
parent
d75b7c0023
commit
0ed5cf6b38
@ -1420,15 +1420,20 @@ static bool mbc(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugg
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cartridge->mbc_type) {
|
if (cartridge->mbc_type) {
|
||||||
static const char * const mapper_names[] = {
|
if (gb->is_mbc30) {
|
||||||
[GB_MBC1] = "MBC1",
|
GB_log(gb, "MBC30\n");
|
||||||
[GB_MBC2] = "MBC2",
|
}
|
||||||
[GB_MBC3] = "MBC3",
|
else {
|
||||||
[GB_MBC5] = "MBC5",
|
static const char *const mapper_names[] = {
|
||||||
[GB_HUC1] = "HUC1",
|
[GB_MBC1] = "MBC1",
|
||||||
[GB_HUC3] = "HUC3",
|
[GB_MBC2] = "MBC2",
|
||||||
};
|
[GB_MBC3] = "MBC3",
|
||||||
GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]);
|
[GB_MBC5] = "MBC5",
|
||||||
|
[GB_HUC1] = "HUC1",
|
||||||
|
[GB_HUC3] = "HUC3",
|
||||||
|
};
|
||||||
|
GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]);
|
||||||
|
}
|
||||||
GB_log(gb, "Current mapped ROM bank: %x\n", gb->mbc_rom_bank);
|
GB_log(gb, "Current mapped ROM bank: %x\n", gb->mbc_rom_bank);
|
||||||
if (cartridge->has_ram) {
|
if (cartridge->has_ram) {
|
||||||
GB_log(gb, "Current mapped RAM bank: %x\n", gb->mbc_ram_bank);
|
GB_log(gb, "Current mapped RAM bank: %x\n", gb->mbc_ram_bank);
|
||||||
|
@ -403,9 +403,8 @@ struct GB_gameboy_internal_s {
|
|||||||
} mbc2;
|
} mbc2;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint8_t rom_bank:7;
|
uint8_t rom_bank:8;
|
||||||
uint8_t padding:1;
|
uint8_t ram_bank:3;
|
||||||
uint8_t ram_bank:4;
|
|
||||||
} mbc3;
|
} mbc3;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@ -538,6 +537,7 @@ struct GB_gameboy_internal_s {
|
|||||||
GB_STANDARD_MBC1_WIRING,
|
GB_STANDARD_MBC1_WIRING,
|
||||||
GB_MBC1M_WIRING,
|
GB_MBC1M_WIRING,
|
||||||
} mbc1_wiring;
|
} mbc1_wiring;
|
||||||
|
bool is_mbc30;
|
||||||
|
|
||||||
unsigned pending_cycles;
|
unsigned pending_cycles;
|
||||||
|
|
||||||
|
11
Core/mbc.c
11
Core/mbc.c
@ -86,6 +86,10 @@ void GB_update_mbc_mappings(GB_gameboy_t *gb)
|
|||||||
case GB_MBC3:
|
case GB_MBC3:
|
||||||
gb->mbc_rom_bank = gb->mbc3.rom_bank;
|
gb->mbc_rom_bank = gb->mbc3.rom_bank;
|
||||||
gb->mbc_ram_bank = gb->mbc3.ram_bank;
|
gb->mbc_ram_bank = gb->mbc3.ram_bank;
|
||||||
|
if (!gb->is_mbc30) {
|
||||||
|
gb->mbc_rom_bank &= 0x7F;
|
||||||
|
gb->mbc_ram_bank &= 0x3;
|
||||||
|
}
|
||||||
if (gb->mbc_rom_bank == 0) {
|
if (gb->mbc_rom_bank == 0) {
|
||||||
gb->mbc_rom_bank = 1;
|
gb->mbc_rom_bank = 1;
|
||||||
}
|
}
|
||||||
@ -147,6 +151,13 @@ void GB_configure_cart(GB_gameboy_t *gb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Detect MBC30 */
|
||||||
|
if (gb->cartridge_type->mbc_type == GB_MBC3) {
|
||||||
|
if (gb->rom_size > 0x200000 || gb->mbc_ram_size > 0x8000) {
|
||||||
|
gb->is_mbc30 = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Set MBC5's bank to 1 correctly */
|
/* Set MBC5's bank to 1 correctly */
|
||||||
if (gb->cartridge_type->mbc_type == GB_MBC5) {
|
if (gb->cartridge_type->mbc_type == GB_MBC5) {
|
||||||
gb->mbc5.rom_bank_low = 1;
|
gb->mbc5.rom_bank_low = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user