diff --git a/Core/debugger.c b/Core/debugger.c index 8cc4c20..8a39556 100644 --- a/Core/debugger.c +++ b/Core/debugger.c @@ -1288,6 +1288,7 @@ static bool mbc(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugg [GB_MBC2] = "MBC2", [GB_MBC3] = "MBC3", [GB_MBC5] = "MBC5", + [GB_HUC1] = "HUC1", [GB_HUC3] = "HUC3", }; GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]); diff --git a/Core/gb.h b/Core/gb.h index f64041d..1d8f341 100644 --- a/Core/gb.h +++ b/Core/gb.h @@ -174,11 +174,11 @@ typedef struct { GB_MBC2, GB_MBC3, GB_MBC5, + GB_HUC1, /* Todo: HUC1 features are not emulated. Should be unified with the CGB IR sensor API. */ GB_HUC3, } mbc_type; enum { GB_STANDARD_MBC, - GB_HUC1, /* Todo: HUC1 features are not emulated. Should be unified with the CGB IR sensor API. */ GB_CAMERA, } mbc_subtype; bool has_ram; @@ -313,6 +313,12 @@ typedef struct GB_gameboy_s { uint8_t rom_bank_high:1; uint8_t ram_bank:4; } mbc5; + + struct { + uint8_t bank_low:6; + uint8_t bank_high:3; + uint8_t mode:1; + } huc1; struct { uint8_t rom_bank; diff --git a/Core/mbc.c b/Core/mbc.c index b537a2c..4928edb 100644 --- a/Core/mbc.c +++ b/Core/mbc.c @@ -39,7 +39,7 @@ const GB_cartridge_t GB_cart_defs[256] = { { 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_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) @@ -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_ram_bank = gb->mbc5.ram_bank; 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: gb->mbc_rom_bank = gb->huc3.rom_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; } } -} \ No newline at end of file +} diff --git a/Core/memory.c b/Core/memory.c index 913d808..a22c746 100644 --- a/Core/memory.c +++ b/Core/memory.c @@ -322,6 +322,14 @@ static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value) 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: switch (addr & 0xF000) { case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break;