all repos — mgba @ c04d627de8471939afd395c737181f52241df08d

mGBA Game Boy Advance Emulator

GB MBC: Partial HuC-1 support
Vicki Pfau vi@endrift.com
Sun, 22 Jul 2018 18:00:16 -0700
commit

c04d627de8471939afd395c737181f52241df08d

parent

18065c8b621de877e031eee56a3160e7e22608a4

3 files changed, 33 insertions(+), 4 deletions(-)

jump to
M CHANGESCHANGES

@@ -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 README.mdREADME.md

@@ -52,14 +52,14 @@ - MBC7

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
M src/gb/mbc.csrc/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) {