mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-26 07:39:56 -06:00
Split GBA Reset and Eject logic into two sets
This allows solving some crashes and provides more flexibility in how GBA cartridges change state between soft and hard resets. Since save states including GBA data do not carry over the original save file path, and the GBA cartridge is being reset along with the other parts of the system, this is needed to avoid losing the GBA state on reset following a state load, while preserving the behavior where cartridges are ejected when calling Stop().
This commit is contained in:
@ -76,10 +76,14 @@ void DeInit()
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
// do nothing, we don't want to clear GBA SRAM on reset
|
||||
}
|
||||
|
||||
void Eject()
|
||||
{
|
||||
if (SRAMFile) fclose(SRAMFile);
|
||||
if (SRAM) delete[] SRAM;
|
||||
|
||||
SRAM = NULL;
|
||||
SRAMFile = NULL;
|
||||
SRAMLength = 0;
|
||||
@ -524,17 +528,32 @@ void DeInit()
|
||||
|
||||
void Reset()
|
||||
{
|
||||
CartInserted = false;
|
||||
HasSolarSensor = false;
|
||||
if (CartROM) delete[] CartROM;
|
||||
CartROM = NULL;
|
||||
CartROMSize = 0;
|
||||
CartGPIO = {};
|
||||
// Do not reset cartridge ROM.
|
||||
// Prefer keeping the inserted cartridge on reset.
|
||||
// This allows resetting a DS game without losing GBA state,
|
||||
// and resetting to firmware without the slot being emptied.
|
||||
// The Stop function will clear the cartridge state via Eject().
|
||||
|
||||
GBACart_SRAM::Reset();
|
||||
GBACart_SolarSensor::Reset();
|
||||
}
|
||||
|
||||
void Eject()
|
||||
{
|
||||
if (CartROM) delete[] CartROM;
|
||||
|
||||
CartInserted = false;
|
||||
HasSolarSensor = false;
|
||||
CartROM = NULL;
|
||||
CartROMSize = 0;
|
||||
CartCRC = NULL;
|
||||
CartID = NULL;
|
||||
CartGPIO = {};
|
||||
|
||||
GBACart_SRAM::Eject();
|
||||
Reset();
|
||||
}
|
||||
|
||||
void DoSavestate(Savestate* file)
|
||||
{
|
||||
file->Section("GBAC"); // Game Boy Advance Cartridge
|
||||
@ -545,10 +564,16 @@ void DoSavestate(Savestate* file)
|
||||
// since unlike with DS, it's not loaded in advance
|
||||
|
||||
file->Var32(&CartROMSize);
|
||||
if (!CartROMSize) return; // no GBA cartridge state? nothing to do here.
|
||||
if (!CartROMSize) // no GBA cartridge state? nothing to do here
|
||||
{
|
||||
// do eject the cartridge if something is inserted
|
||||
Eject();
|
||||
return;
|
||||
}
|
||||
|
||||
u32 oldCRC = CartCRC;
|
||||
file->Var32(&CartCRC);
|
||||
|
||||
if (CartCRC != oldCRC)
|
||||
{
|
||||
// delete and reallocate ROM so that it is zero-padded to its full length
|
||||
|
Reference in New Issue
Block a user