mirror of https://github.com/mgba-emu/mgba.git
GBA: Split out save autodetect from no save present
This commit is contained in:
parent
19648c786d
commit
eced06bc2a
|
@ -430,7 +430,7 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) {
|
|||
case REGION_CART_SRAM:
|
||||
case REGION_CART_SRAM_MIRROR:
|
||||
wait = memory->waitstatesNonseq16[address >> BASE_OFFSET];
|
||||
if (memory->savedata.type == SAVEDATA_NONE) {
|
||||
if (memory->savedata.type == SAVEDATA_AUTODETECT) {
|
||||
GBALog(gba, GBA_LOG_INFO, "Detected SRAM savegame");
|
||||
GBASavedataInitSRAM(&memory->savedata);
|
||||
}
|
||||
|
@ -586,7 +586,7 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle
|
|||
}
|
||||
break;
|
||||
case REGION_CART2_EX:
|
||||
if (memory->savedata.type == SAVEDATA_NONE) {
|
||||
if (memory->savedata.type == SAVEDATA_AUTODETECT) {
|
||||
GBALog(gba, GBA_LOG_INFO, "Detected EEPROM savegame");
|
||||
GBASavedataInitEEPROM(&memory->savedata);
|
||||
}
|
||||
|
@ -642,7 +642,7 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo
|
|||
break;
|
||||
case REGION_CART_SRAM:
|
||||
case REGION_CART_SRAM_MIRROR:
|
||||
if (memory->savedata.type == SAVEDATA_NONE) {
|
||||
if (memory->savedata.type == SAVEDATA_AUTODETECT) {
|
||||
if (address == SAVEDATA_FLASH_BASE) {
|
||||
GBALog(gba, GBA_LOG_INFO, "Detected Flash savegame");
|
||||
GBASavedataInitFlash(&memory->savedata);
|
||||
|
@ -1142,7 +1142,7 @@ void GBAMemoryServiceDMA(struct GBA* gba, int number, struct GBADMA* info) {
|
|||
dest += destOffset;
|
||||
--wordsRemaining;
|
||||
} else if (destRegion == REGION_CART2_EX) {
|
||||
if (memory->savedata.type == SAVEDATA_NONE) {
|
||||
if (memory->savedata.type == SAVEDATA_AUTODETECT) {
|
||||
GBALog(gba, GBA_LOG_INFO, "Detected EEPROM savegame");
|
||||
GBASavedataInitEEPROM(&memory->savedata);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@ static void _flashErase(struct GBASavedata* savedata);
|
|||
static void _flashEraseSector(struct GBASavedata* savedata, uint16_t sectorStart);
|
||||
|
||||
void GBASavedataInit(struct GBASavedata* savedata, struct VFile* vf) {
|
||||
savedata->type = SAVEDATA_NONE;
|
||||
savedata->type = SAVEDATA_AUTODETECT;
|
||||
savedata->data = 0;
|
||||
savedata->command = EEPROM_COMMAND_NULL;
|
||||
savedata->flashState = FLASH_STATE_RAW;
|
||||
|
@ -42,7 +42,8 @@ void GBASavedataDeinit(struct GBASavedata* savedata) {
|
|||
case SAVEDATA_EEPROM:
|
||||
savedata->vf->unmap(savedata->vf, savedata->data, SIZE_CART_EEPROM);
|
||||
break;
|
||||
case SAVEDATA_NONE:
|
||||
case SAVEDATA_FORCE_NONE:
|
||||
case SAVEDATA_AUTODETECT:
|
||||
break;
|
||||
}
|
||||
savedata->vf = 0;
|
||||
|
@ -60,12 +61,13 @@ void GBASavedataDeinit(struct GBASavedata* savedata) {
|
|||
case SAVEDATA_EEPROM:
|
||||
mappedMemoryFree(savedata->data, SIZE_CART_EEPROM);
|
||||
break;
|
||||
case SAVEDATA_NONE:
|
||||
case SAVEDATA_FORCE_NONE:
|
||||
case SAVEDATA_AUTODETECT:
|
||||
break;
|
||||
}
|
||||
}
|
||||
savedata->data = 0;
|
||||
savedata->type = SAVEDATA_NONE;
|
||||
savedata->type = SAVEDATA_AUTODETECT;
|
||||
}
|
||||
|
||||
void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf) {
|
||||
|
@ -94,7 +96,8 @@ bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out) {
|
|||
return out->write(out, savedata->data, SIZE_CART_FLASH1M) == SIZE_CART_FLASH1M;
|
||||
case SAVEDATA_EEPROM:
|
||||
return out->write(out, savedata->data, SIZE_CART_EEPROM) == SIZE_CART_EEPROM;
|
||||
case SAVEDATA_NONE:
|
||||
case SAVEDATA_AUTODETECT:
|
||||
case SAVEDATA_FORCE_NONE:
|
||||
return true;
|
||||
}
|
||||
} else if (savedata->vf) {
|
||||
|
@ -122,14 +125,16 @@ void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type)
|
|||
case SAVEDATA_SRAM:
|
||||
GBASavedataInitSRAM(savedata);
|
||||
break;
|
||||
case SAVEDATA_NONE:
|
||||
// TODO: Force none
|
||||
case SAVEDATA_FORCE_NONE:
|
||||
savedata->type = SAVEDATA_FORCE_NONE;
|
||||
break;
|
||||
case SAVEDATA_AUTODETECT:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GBASavedataInitFlash(struct GBASavedata* savedata) {
|
||||
if (savedata->type == SAVEDATA_NONE) {
|
||||
if (savedata->type == SAVEDATA_AUTODETECT) {
|
||||
savedata->type = SAVEDATA_FLASH512;
|
||||
}
|
||||
if (savedata->type != SAVEDATA_FLASH512 && savedata->type != SAVEDATA_FLASH1M) {
|
||||
|
@ -157,7 +162,7 @@ void GBASavedataInitFlash(struct GBASavedata* savedata) {
|
|||
}
|
||||
|
||||
void GBASavedataInitEEPROM(struct GBASavedata* savedata) {
|
||||
if (savedata->type == SAVEDATA_NONE) {
|
||||
if (savedata->type == SAVEDATA_AUTODETECT) {
|
||||
savedata->type = SAVEDATA_EEPROM;
|
||||
} else {
|
||||
GBALog(0, GBA_LOG_WARN, "Can't re-initialize savedata");
|
||||
|
@ -180,7 +185,7 @@ void GBASavedataInitEEPROM(struct GBASavedata* savedata) {
|
|||
}
|
||||
|
||||
void GBASavedataInitSRAM(struct GBASavedata* savedata) {
|
||||
if (savedata->type == SAVEDATA_NONE) {
|
||||
if (savedata->type == SAVEDATA_AUTODETECT) {
|
||||
savedata->type = SAVEDATA_SRAM;
|
||||
} else {
|
||||
GBALog(0, GBA_LOG_WARN, "Can't re-initialize savedata");
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
struct VFile;
|
||||
|
||||
enum SavedataType {
|
||||
SAVEDATA_NONE = 0,
|
||||
SAVEDATA_AUTODETECT = -1,
|
||||
SAVEDATA_FORCE_NONE = 0,
|
||||
SAVEDATA_SRAM,
|
||||
SAVEDATA_FLASH512,
|
||||
SAVEDATA_FLASH1M,
|
||||
|
|
|
@ -109,6 +109,9 @@ static const struct GBACartridgeOverride _overrides[] = {
|
|||
{ "AX4E", SAVEDATA_FLASH1M, GPIO_NONE, -1 },
|
||||
{ "AX4P", SAVEDATA_FLASH1M, GPIO_NONE, -1 },
|
||||
|
||||
// Top Gun - Combat Zones
|
||||
{ "A2YE", SAVEDATA_FORCE_NONE, GPIO_NONE, -1 },
|
||||
|
||||
// Wario Ware Twisted
|
||||
{ "RZWJ", SAVEDATA_SRAM, GPIO_RUMBLE | GPIO_GYRO, -1 },
|
||||
{ "RZWE", SAVEDATA_SRAM, GPIO_RUMBLE | GPIO_GYRO, -1 },
|
||||
|
|
|
@ -50,7 +50,7 @@ void GamePakView::gameStarted(GBAThread* thread) {
|
|||
}
|
||||
SavedataType savetype = thread->gba->memory.savedata.type;
|
||||
if (m_ui.savetype->currentIndex() > 0) {
|
||||
if (savetype > SAVEDATA_NONE) {
|
||||
if (savetype > SAVEDATA_FORCE_NONE) {
|
||||
VFile* vf = thread->gba->memory.savedata.vf;
|
||||
GBASavedataDeinit(&thread->gba->memory.savedata);
|
||||
GBASavedataInit(&thread->gba->memory.savedata, vf);
|
||||
|
@ -59,7 +59,7 @@ void GamePakView::gameStarted(GBAThread* thread) {
|
|||
GBASavedataForceType(&thread->gba->memory.savedata, savetype);
|
||||
}
|
||||
|
||||
if (savetype > SAVEDATA_NONE) {
|
||||
if (savetype > SAVEDATA_AUTODETECT) {
|
||||
m_ui.savetype->setCurrentIndex(savetype + 1);
|
||||
}
|
||||
m_ui.savetype->setEnabled(false);
|
||||
|
|
Loading…
Reference in New Issue