Correct emulation of HUC1 banks higher than 0x1F

This commit is contained in:
Lior Halphon 2017-02-16 21:07:35 +02:00
parent 10ab2b4fe0
commit 421d3b27f5
4 changed files with 28 additions and 3 deletions

View File

@ -1288,6 +1288,7 @@ static bool mbc(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugg
[GB_MBC2] = "MBC2", [GB_MBC2] = "MBC2",
[GB_MBC3] = "MBC3", [GB_MBC3] = "MBC3",
[GB_MBC5] = "MBC5", [GB_MBC5] = "MBC5",
[GB_HUC1] = "HUC1",
[GB_HUC3] = "HUC3", [GB_HUC3] = "HUC3",
}; };
GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]); GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]);

View File

@ -174,11 +174,11 @@ typedef struct {
GB_MBC2, GB_MBC2,
GB_MBC3, GB_MBC3,
GB_MBC5, GB_MBC5,
GB_HUC1, /* Todo: HUC1 features are not emulated. Should be unified with the CGB IR sensor API. */
GB_HUC3, GB_HUC3,
} mbc_type; } mbc_type;
enum { enum {
GB_STANDARD_MBC, GB_STANDARD_MBC,
GB_HUC1, /* Todo: HUC1 features are not emulated. Should be unified with the CGB IR sensor API. */
GB_CAMERA, GB_CAMERA,
} mbc_subtype; } mbc_subtype;
bool has_ram; bool has_ram;
@ -313,6 +313,12 @@ typedef struct GB_gameboy_s {
uint8_t rom_bank_high:1; uint8_t rom_bank_high:1;
uint8_t ram_bank:4; uint8_t ram_bank:4;
} mbc5; } mbc5;
struct {
uint8_t bank_low:6;
uint8_t bank_high:3;
uint8_t mode:1;
} huc1;
struct { struct {
uint8_t rom_bank; uint8_t rom_bank;

View File

@ -39,7 +39,7 @@ const GB_cartridge_t GB_cart_defs[256] = {
{ GB_MBC5 , GB_CAMERA , true , true , false, false}, // FCh POCKET CAMERA { GB_MBC5 , GB_CAMERA , true , true , false, false}, // FCh POCKET CAMERA
{ GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // FDh BANDAI TAMA5 (Todo: Not supported) { GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // FDh BANDAI TAMA5 (Todo: Not supported)
{ GB_HUC3 , GB_STANDARD_MBC, true , true , false, false}, // FEh HuC3 (Todo: Mapper support only) { GB_HUC3 , GB_STANDARD_MBC, true , true , false, false}, // FEh HuC3 (Todo: Mapper support only)
{ GB_MBC1 , GB_HUC1 , true , true , false, false}, // FFh HuC1+RAM+BATTERY (Todo: No IR bindings) { GB_HUC1 , GB_STANDARD_MBC, true , true , false, false}, // FFh HuC1+RAM+BATTERY (Todo: No IR bindings)
}; };
void GB_update_mbc_mappings(GB_gameboy_t *gb) void GB_update_mbc_mappings(GB_gameboy_t *gb)
@ -86,6 +86,16 @@ void GB_update_mbc_mappings(GB_gameboy_t *gb)
gb->mbc_rom_bank = gb->mbc5.rom_bank_low | (gb->mbc5.rom_bank_high << 8); gb->mbc_rom_bank = gb->mbc5.rom_bank_low | (gb->mbc5.rom_bank_high << 8);
gb->mbc_ram_bank = gb->mbc5.ram_bank; gb->mbc_ram_bank = gb->mbc5.ram_bank;
break; break;
case GB_HUC1:
if (gb->huc1.mode == 0) {
gb->mbc_rom_bank = gb->huc1.bank_low | (gb->mbc1.bank_high << 6);
gb->mbc_ram_bank = 0;
}
else {
gb->mbc_rom_bank = gb->huc1.bank_low;
gb->mbc_ram_bank = gb->huc1.bank_high;
}
break;
case GB_HUC3: case GB_HUC3:
gb->mbc_rom_bank = gb->huc3.rom_bank; gb->mbc_rom_bank = gb->huc3.rom_bank;
gb->mbc_ram_bank = gb->huc3.ram_bank; gb->mbc_ram_bank = gb->huc3.ram_bank;
@ -127,4 +137,4 @@ void GB_configure_cart(GB_gameboy_t *gb)
gb->mbc1_wiring = GB_MBC1M_WIRING; gb->mbc1_wiring = GB_MBC1M_WIRING;
} }
} }
} }

View File

@ -322,6 +322,14 @@ static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value)
break; break;
} }
break; break;
case GB_HUC1:
switch (addr & 0xF000) {
case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break;
case 0x2000: case 0x3000: gb->huc1.bank_low = value; break;
case 0x4000: case 0x5000: gb->huc1.bank_high = value; break;
case 0x6000: case 0x7000: gb->huc1.mode = value; break;
}
break;
case GB_HUC3: case GB_HUC3:
switch (addr & 0xF000) { switch (addr & 0xF000) {
case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break; case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break;