GB MBC: Partial HuC-1 support
Vicki Pfau vi@endrift.com
Sun, 22 Jul 2018 18:00:16 -0700
3 files changed,
33 insertions(+),
4 deletions(-)
M
CHANGES
→
CHANGES
@@ -15,6 +15,7 @@ - Debugger: Conditional breakpoints and watchpoints
- 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
M
src/gb/mbc.c
→
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 @@ mLOG(GB_MBC, WARN, "unimplemented MBC: MMM01");
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;@@ -819,6 +819,34 @@ } else if (GBMBC7FieldIsCS(value) && GBMBC7FieldIsCLK(old) && !GBMBC7FieldIsCLK(value)) {
value = GBMBC7FieldSetDO(value, GBMBC7FieldGetDO(old)); } 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) {