Skip to content

Commit

Permalink
GB MBC: Partial HuC-1 support
Browse files Browse the repository at this point in the history
  • Loading branch information
endrift committed Jul 23, 2018
1 parent 18065c8 commit c04d627
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
32 changes: 30 additions & 2 deletions src/gb/mbc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit c04d627

Please sign in to comment.