mirror of https://github.com/mgba-emu/mgba.git
GBA: Improve reset behavior of various hardware components
This commit is contained in:
parent
655211651a
commit
edaa27796b
|
@ -86,6 +86,7 @@ struct GBACartridgeHardware {
|
|||
};
|
||||
|
||||
void GBAHardwareInit(struct GBACartridgeHardware* gpio, uint16_t* gpioBase);
|
||||
void GBAHardwareReset(struct GBACartridgeHardware* gpio);
|
||||
void GBAHardwareClear(struct GBACartridgeHardware* gpio);
|
||||
|
||||
void GBAHardwareInitRTC(struct GBACartridgeHardware* gpio);
|
||||
|
|
|
@ -91,6 +91,7 @@ struct GBASavedataRTCBuffer {
|
|||
};
|
||||
|
||||
void GBASavedataInit(struct GBASavedata* savedata, struct VFile* vf);
|
||||
void GBASavedataReset(struct GBASavedata* savedata);
|
||||
void GBASavedataDeinit(struct GBASavedata* savedata);
|
||||
|
||||
void GBASavedataMask(struct GBASavedata* savedata, struct VFile* vf, bool writeback);
|
||||
|
|
|
@ -47,6 +47,20 @@ void GBAHardwareInit(struct GBACartridgeHardware* hw, uint16_t* base) {
|
|||
GBAHardwareClear(hw);
|
||||
}
|
||||
|
||||
void GBAHardwareReset(struct GBACartridgeHardware* hw) {
|
||||
hw->readWrite = GPIO_WRITE_ONLY;
|
||||
hw->pinState = 0;
|
||||
hw->direction = 0;
|
||||
hw->lightCounter = 0;
|
||||
hw->lightEdge = false;
|
||||
hw->lightSample = 0xFF;
|
||||
hw->gyroSample = 0;
|
||||
hw->gyroEdge = 0;
|
||||
hw->tiltX = 0xFFF;
|
||||
hw->tiltY = 0xFFF;
|
||||
hw->tiltState = 0;
|
||||
}
|
||||
|
||||
void GBAHardwareClear(struct GBACartridgeHardware* hw) {
|
||||
hw->devices = HW_NONE | (hw->devices & HW_GB_PLAYER_DETECTION);
|
||||
hw->readWrite = GPIO_WRITE_ONLY;
|
||||
|
@ -503,6 +517,7 @@ void GBAHardwareDeserialize(struct GBACartridgeHardware* hw, const struct GBASer
|
|||
hw->devices = state->hw.devices;
|
||||
|
||||
if ((hw->devices & HW_GPIO) && hw->gpioBase) {
|
||||
// TODO: This needs to update the pristine state somehow
|
||||
if (hw->readWrite) {
|
||||
STORE_16(hw->pinState, 0, hw->gpioBase);
|
||||
STORE_16(hw->direction, 2, hw->gpioBase);
|
||||
|
|
|
@ -138,6 +138,16 @@ void GBAMemoryReset(struct GBA* gba) {
|
|||
mLOG(GBA_MEM, FATAL, "Could not map memory");
|
||||
}
|
||||
|
||||
if (!gba->memory.rom) {
|
||||
gba->isPristine = false;
|
||||
}
|
||||
|
||||
if (gba->memory.hw.devices & HW_GPIO) {
|
||||
_pristineCow(gba);
|
||||
}
|
||||
|
||||
GBASavedataReset(&gba->memory.savedata);
|
||||
GBAHardwareReset(&gba->memory.hw);
|
||||
GBADMAReset(gba);
|
||||
GBAUnlCartReset(gba);
|
||||
memset(&gba->memory.matrix, 0, sizeof(gba->memory.matrix));
|
||||
|
|
|
@ -45,7 +45,7 @@ static void _ashesToAshes(struct mTiming* timing, void* user, uint32_t cyclesLat
|
|||
|
||||
void GBASavedataInit(struct GBASavedata* savedata, struct VFile* vf) {
|
||||
savedata->type = GBA_SAVEDATA_AUTODETECT;
|
||||
savedata->data = 0;
|
||||
savedata->data = NULL;
|
||||
savedata->command = EEPROM_COMMAND_NULL;
|
||||
savedata->flashState = FLASH_STATE_RAW;
|
||||
savedata->vf = vf;
|
||||
|
@ -63,6 +63,11 @@ void GBASavedataInit(struct GBASavedata* savedata, struct VFile* vf) {
|
|||
savedata->dust.callback = _ashesToAshes;
|
||||
}
|
||||
|
||||
void GBASavedataReset(struct GBASavedata* savedata) {
|
||||
savedata->command = EEPROM_COMMAND_NULL;
|
||||
savedata->flashState = FLASH_STATE_RAW;
|
||||
}
|
||||
|
||||
void GBASavedataDeinit(struct GBASavedata* savedata) {
|
||||
if (savedata->vf) {
|
||||
size_t size = GBASavedataSize(savedata);
|
||||
|
|
Loading…
Reference in New Issue