diff --git a/CHANGES b/CHANGES index e7344986f..c344df2b7 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,7 @@ Features: - Ability to select GB/GBC/SGB BIOS on console ports - Optional automatic state saving/loading - Access to ur0 and uma0 partitions on the Vita + - Partial support for MBC6, TAMA and HuC-1 GB mappers Bugfixes: - GB Audio: Make audio unsigned with bias (fixes mgba.io/i/749) - GB Serialize: Fix audio state loading diff --git a/README.md b/README.md index 7cbacd747..20937c08e 100644 --- a/README.md +++ b/README.md @@ -52,14 +52,14 @@ The following mappers are fully supported: The following mappers are partially supported: +- MBC6 - Pocket Cam - TAMA5 +- HuC-1 - HuC-3 The following mappers are not currently supported: -- MBC6 -- HuC-1 - MMM01 ### Planned features diff --git a/src/gb/mbc.c b/src/gb/mbc.c index fee944c03..605d3d05f 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -27,6 +27,7 @@ static void _GBMBC3(struct GB*, uint16_t address, uint8_t value); static void _GBMBC5(struct GB*, uint16_t address, uint8_t value); static void _GBMBC6(struct GB*, uint16_t address, uint8_t value); static void _GBMBC7(struct GB*, uint16_t address, uint8_t value); +static void _GBHuC1(struct GB*, uint16_t address, uint8_t value); static void _GBHuC3(struct GB*, uint16_t address, uint8_t value); static void _GBPocketCam(struct GB* gb, uint16_t address, uint8_t value); static void _GBTAMA5(struct GB* gb, uint16_t address, uint8_t value); @@ -259,8 +260,7 @@ void GBMBCInit(struct GB* gb) { gb->memory.mbcWrite = _GBMBC1; break; case GB_HuC1: - mLOG(GB_MBC, WARN, "unimplemented MBC: HuC-1"); - gb->memory.mbcWrite = _GBMBC1; + gb->memory.mbcWrite = _GBHuC1; break; case GB_HuC3: gb->memory.mbcWrite = _GBHuC3; @@ -821,6 +821,34 @@ static void _GBMBC7Write(struct GBMemory* memory, uint16_t address, uint8_t valu mbc7->eeprom = value; } +void _GBHuC1(struct GB* gb, uint16_t address, uint8_t value) { + struct GBMemory* memory = &gb->memory; + int bank = value & 0x3F; + switch (address >> 13) { + case 0x0: + switch (value) { + case 0xE: + memory->sramAccess = false; + break; + default: + memory->sramAccess = true; + GBMBCSwitchSramBank(gb, memory->sramCurrentBank); + break; + } + break; + case 0x1: + GBMBCSwitchBank(gb, bank); + break; + case 0x2: + GBMBCSwitchSramBank(gb, value); + break; + default: + // TODO + mLOG(GB_MBC, STUB, "HuC-1 unknown address: %04X:%02X", address, value); + break; + } +} + void _GBHuC3(struct GB* gb, uint16_t address, uint8_t value) { struct GBMemory* memory = &gb->memory; int bank = value & 0x3F;