GB: Fix maximum cartridge size with MBC5

This commit is contained in:
Jeffrey Pfau 2016-02-21 11:38:36 -08:00
parent ceac601e60
commit cbc3be7571
3 changed files with 16 additions and 8 deletions

View File

@ -114,7 +114,7 @@ void GBUnloadROM(struct GB* gb) {
if (gb->yankedRomSize) { if (gb->yankedRomSize) {
gb->yankedRomSize = 0; gb->yankedRomSize = 0;
} }
mappedMemoryFree(gb->memory.rom, 0x400000); mappedMemoryFree(gb->memory.rom, GB_SIZE_CART_MAX);
} }
gb->memory.rom = 0; gb->memory.rom = 0;
@ -140,10 +140,10 @@ void GBApplyPatch(struct GB* gb, struct Patch* patch) {
if (!patchedSize) { if (!patchedSize) {
return; return;
} }
if (patchedSize > 0x400000) { if (patchedSize > GB_SIZE_CART_MAX) {
patchedSize = 0x400000; patchedSize = GB_SIZE_CART_MAX;
} }
gb->memory.rom = anonymousMemoryMap(0x400000); gb->memory.rom = anonymousMemoryMap(GB_SIZE_CART_MAX);
if (!patch->applyPatch(patch, gb->pristineRom, gb->pristineRomSize, gb->memory.rom, patchedSize)) { if (!patch->applyPatch(patch, gb->pristineRom, gb->pristineRomSize, gb->memory.rom, patchedSize)) {
mappedMemoryFree(gb->memory.rom, patchedSize); mappedMemoryFree(gb->memory.rom, patchedSize);
gb->memory.rom = gb->pristineRom; gb->memory.rom = gb->pristineRom;

View File

@ -514,9 +514,10 @@ void _GBMBC3(struct GBMemory* memory, uint16_t address, uint8_t value) {
} }
void _GBMBC5(struct GBMemory* memory, uint16_t address, uint8_t value) { void _GBMBC5(struct GBMemory* memory, uint16_t address, uint8_t value) {
int bank = value; int bank;
switch (address >> 13) { switch (address >> 12) {
case 0x0: case 0x0:
case 0x1:
switch (value) { switch (value) {
case 0: case 0:
memory->sramAccess = false; memory->sramAccess = false;
@ -531,10 +532,16 @@ void _GBMBC5(struct GBMemory* memory, uint16_t address, uint8_t value) {
break; break;
} }
break; break;
case 0x1: case 0x2:
bank = (memory->currentBank & 0x100) | value;
_switchBank(memory, bank); _switchBank(memory, bank);
break; break;
case 0x2: case 0x3:
bank = (memory->currentBank & 0xFF) | ((value & 1) << 8);
_switchBank(memory, bank);
break;
case 0x4:
case 0x5:
if (memory->mbcType == GB_MBC5_RUMBLE) { if (memory->mbcType == GB_MBC5_RUMBLE) {
memory->rumble->setRumble(memory->rumble, (value >> 3) & 1); memory->rumble->setRumble(memory->rumble, (value >> 3) & 1);
value &= ~8; value &= ~8;

View File

@ -44,6 +44,7 @@ enum {
enum { enum {
GB_SIZE_CART_BANK0 = 0x4000, GB_SIZE_CART_BANK0 = 0x4000,
GB_SIZE_CART_MAX = 0x800000,
GB_SIZE_VRAM = 0x4000, GB_SIZE_VRAM = 0x4000,
GB_SIZE_VRAM_BANK0 = 0x2000, GB_SIZE_VRAM_BANK0 = 0x2000,
GB_SIZE_EXTERNAL_RAM = 0x2000, GB_SIZE_EXTERNAL_RAM = 0x2000,