mirror of https://github.com/mgba-emu/mgba.git
GB: Clean up BIOS unmapping
This commit is contained in:
parent
003e181add
commit
b966d71a2c
|
@ -180,6 +180,7 @@ struct GBMemory {
|
||||||
GBMemoryBankControllerRead mbcRead;
|
GBMemoryBankControllerRead mbcRead;
|
||||||
union GBMBCState mbcState;
|
union GBMBCState mbcState;
|
||||||
int currentBank;
|
int currentBank;
|
||||||
|
int currentBank0;
|
||||||
|
|
||||||
uint8_t* wram;
|
uint8_t* wram;
|
||||||
uint8_t* wramBank;
|
uint8_t* wramBank;
|
||||||
|
|
16
src/gb/gb.c
16
src/gb/gb.c
|
@ -113,7 +113,6 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
gb->yankedRomSize = 0;
|
gb->yankedRomSize = 0;
|
||||||
gb->memory.romBase = gb->memory.rom;
|
|
||||||
gb->memory.romSize = gb->pristineRomSize;
|
gb->memory.romSize = gb->pristineRomSize;
|
||||||
gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize);
|
gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize);
|
||||||
memset(&gb->memory.mbcState, 0, sizeof(gb->memory.mbcState));
|
memset(&gb->memory.mbcState, 0, sizeof(gb->memory.mbcState));
|
||||||
|
@ -294,9 +293,6 @@ void GBSavedataUnmask(struct GB* gb) {
|
||||||
|
|
||||||
void GBUnloadROM(struct GB* gb) {
|
void GBUnloadROM(struct GB* gb) {
|
||||||
// TODO: Share with GBAUnloadROM
|
// TODO: Share with GBAUnloadROM
|
||||||
if (gb->memory.rom && gb->memory.romBase != gb->memory.rom && !gb->isPristine) {
|
|
||||||
free(gb->memory.romBase);
|
|
||||||
}
|
|
||||||
if (gb->memory.rom && !gb->isPristine) {
|
if (gb->memory.rom && !gb->isPristine) {
|
||||||
if (gb->yankedRomSize) {
|
if (gb->yankedRomSize) {
|
||||||
gb->yankedRomSize = 0;
|
gb->yankedRomSize = 0;
|
||||||
|
@ -374,6 +370,7 @@ void GBApplyPatch(struct GB* gb, struct Patch* patch) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBDestroy(struct GB* gb) {
|
void GBDestroy(struct GB* gb) {
|
||||||
|
GBUnmapBIOS(gb);
|
||||||
GBUnloadROM(gb);
|
GBUnloadROM(gb);
|
||||||
|
|
||||||
if (gb->biosVf) {
|
if (gb->biosVf) {
|
||||||
|
@ -588,17 +585,18 @@ void GBSkipBIOS(struct GB* gb) {
|
||||||
|
|
||||||
void GBMapBIOS(struct GB* gb) {
|
void GBMapBIOS(struct GB* gb) {
|
||||||
gb->biosVf->seek(gb->biosVf, 0, SEEK_SET);
|
gb->biosVf->seek(gb->biosVf, 0, SEEK_SET);
|
||||||
uint8_t* oldRomBase = gb->memory.romBase;
|
|
||||||
gb->memory.romBase = malloc(GB_SIZE_CART_BANK0);
|
gb->memory.romBase = malloc(GB_SIZE_CART_BANK0);
|
||||||
ssize_t size = gb->biosVf->read(gb->biosVf, gb->memory.romBase, GB_SIZE_CART_BANK0);
|
ssize_t size = gb->biosVf->read(gb->biosVf, gb->memory.romBase, GB_SIZE_CART_BANK0);
|
||||||
memcpy(&gb->memory.romBase[size], &oldRomBase[size], GB_SIZE_CART_BANK0 - size);
|
if (gb->memory.rom) {
|
||||||
if (size > 0x100) {
|
memcpy(&gb->memory.romBase[size], &gb->memory.rom[size], GB_SIZE_CART_BANK0 - size);
|
||||||
memcpy(&gb->memory.romBase[0x100], &oldRomBase[0x100], sizeof(struct GBCartridge));
|
if (size > 0x100) {
|
||||||
|
memcpy(&gb->memory.romBase[0x100], &gb->memory.rom[0x100], sizeof(struct GBCartridge));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBUnmapBIOS(struct GB* gb) {
|
void GBUnmapBIOS(struct GB* gb) {
|
||||||
if (gb->memory.romBase < gb->memory.rom || gb->memory.romBase > &gb->memory.rom[gb->memory.romSize - 1]) {
|
if (gb->memory.io[GB_REG_BANK] == 0xFF && gb->memory.romBase != gb->memory.rom) {
|
||||||
free(gb->memory.romBase);
|
free(gb->memory.romBase);
|
||||||
if (gb->memory.mbcType == GB_MMM01) {
|
if (gb->memory.mbcType == GB_MMM01) {
|
||||||
GBMBCSwitchBank0(gb, gb->memory.romSize / GB_SIZE_CART_BANK0 - 2);
|
GBMBCSwitchBank0(gb, gb->memory.romSize / GB_SIZE_CART_BANK0 - 2);
|
||||||
|
|
|
@ -76,6 +76,7 @@ void GBMBCSwitchBank0(struct GB* gb, int bank) {
|
||||||
bankStart &= (gb->memory.romSize - 1);
|
bankStart &= (gb->memory.romSize - 1);
|
||||||
}
|
}
|
||||||
gb->memory.romBase = &gb->memory.rom[bankStart];
|
gb->memory.romBase = &gb->memory.rom[bankStart];
|
||||||
|
gb->memory.currentBank0 = bank;
|
||||||
if (gb->cpu->pc < GB_SIZE_CART_BANK0) {
|
if (gb->cpu->pc < GB_SIZE_CART_BANK0) {
|
||||||
gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc);
|
gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc);
|
||||||
}
|
}
|
||||||
|
@ -436,6 +437,7 @@ void GBMBCInit(struct GB* gb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GBMBCReset(struct GB* gb) {
|
void GBMBCReset(struct GB* gb) {
|
||||||
|
gb->memory.currentBank0 = 0;
|
||||||
gb->memory.romBank = &gb->memory.rom[GB_SIZE_CART_BANK0];
|
gb->memory.romBank = &gb->memory.rom[GB_SIZE_CART_BANK0];
|
||||||
|
|
||||||
memset(&gb->memory.mbcState, 0, sizeof(gb->memory.mbcState));
|
memset(&gb->memory.mbcState, 0, sizeof(gb->memory.mbcState));
|
||||||
|
|
|
@ -195,6 +195,7 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) {
|
||||||
gb->audio.style = GB_AUDIO_CGB;
|
gb->audio.style = GB_AUDIO_CGB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GBUnmapBIOS(gb);
|
||||||
GBMemoryDeserialize(gb, state);
|
GBMemoryDeserialize(gb, state);
|
||||||
GBVideoDeserialize(&gb->video, state);
|
GBVideoDeserialize(&gb->video, state);
|
||||||
GBIODeserialize(gb, state);
|
GBIODeserialize(gb, state);
|
||||||
|
@ -203,8 +204,6 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) {
|
||||||
|
|
||||||
if (gb->memory.io[GB_REG_BANK] == 0xFF) {
|
if (gb->memory.io[GB_REG_BANK] == 0xFF) {
|
||||||
GBMapBIOS(gb);
|
GBMapBIOS(gb);
|
||||||
} else {
|
|
||||||
GBUnmapBIOS(gb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gb->model & GB_MODEL_SGB && canSgb) {
|
if (gb->model & GB_MODEL_SGB && canSgb) {
|
||||||
|
|
Loading…
Reference in New Issue