diff --git a/desmume/src/addons/slot1_retail_nand.cpp b/desmume/src/addons/slot1_retail_nand.cpp index 11310f22d..c39028083 100644 --- a/desmume/src/addons/slot1_retail_nand.cpp +++ b/desmume/src/addons/slot1_retail_nand.cpp @@ -119,6 +119,7 @@ public: if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr) { save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; + MMU_new.backupDevice.seek(save_start_adr); } handle_save = 1; break; @@ -140,6 +141,7 @@ public: if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr) { save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; + MMU_new.backupDevice.seek(save_start_adr); } } else @@ -151,6 +153,7 @@ public: case 0xB2: //Set save position mode = cmd; save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; + MMU_new.backupDevice.seek(save_start_adr); handle_save = 1; break; } @@ -185,7 +188,7 @@ public: { MMU_new.backupDevice.ensure(save_adr+4, (u8)0); - val = MMU_new.backupDevice.readLong(save_adr, 0); + val = MMU_new.backupDevice.readLong(0); save_adr += 4; } @@ -246,7 +249,7 @@ public: case 0x81: //Nand Write MMU_new.backupDevice.ensure(adr+4, (u8)0); - MMU_new.backupDevice.writeLong(adr, val); + MMU_new.backupDevice.writeLong(val); save_adr += 4; break; diff --git a/desmume/src/mc.cpp b/desmume/src/mc.cpp index 6ead5b93e..072091823 100644 --- a/desmume/src/mc.cpp +++ b/desmume/src/mc.cpp @@ -451,6 +451,28 @@ u32 BackupDevice::readLong(u32 addr, const u32 init) return val; } +u8 BackupDevice::readByte(const u8 init) +{ + u8 val = init; + fpMC->read8le(&val); + + return val; +} +u16 BackupDevice::readWord(const u16 init) +{ + u16 val = init; + fpMC->read16le(&val); + + return val; +} +u32 BackupDevice::readLong(const u32 init) +{ + u32 val = init; + fpMC->read32le(&val); + + return val; +} + bool BackupDevice::write(u8 val) { #ifdef _DONT_SAVE_BACKUP @@ -481,6 +503,22 @@ void BackupDevice::writeLong(u32 addr, u32 val) fpMC->write32le(val); } +void BackupDevice::writeByte(u8 val) +{ + if (isMovieMode) return; + fpMC->write8le(val); +} +void BackupDevice::writeWord(u16 val) +{ + if (isMovieMode) return; + fpMC->write16le(val); +} +void BackupDevice::writeLong(u32 val) +{ + if (isMovieMode) return; + fpMC->write32le(val); +} + bool BackupDevice::saveBuffer(u8 *data, u32 size, bool _rewind, bool _truncate) { if (_rewind) @@ -942,20 +980,21 @@ u32 BackupDevice::importDataSize(const char *filename) return 0; } -u32 BackupDevice::importData(const char *filename, u32 force_size) +bool BackupDevice::importData(const char *filename, u32 force_size) { - u32 res = 0; + bool res = false; if (strlen(filename) < 4) return res; if (memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0) res = import_duc(filename, force_size); else if (import_no_gba(filename, force_size)) - res = 1; + res = true; else res = import_raw(filename, force_size); - NDS_Reset(); + if (res) + NDS_Reset(); return res; } diff --git a/desmume/src/mc.h b/desmume/src/mc.h index 654a67a7f..97a87a8be 100644 --- a/desmume/src/mc.h +++ b/desmume/src/mc.h @@ -68,14 +68,24 @@ public: void reset_hardware(); std::string getFilename() { return filename; } - u8 readByte(u32 addr, const u8 init = 0xFF); - u16 readWord(u32 addr, const u16 init = 0xFFFF); - u32 readLong(u32 addr, const u32 init = 0xFFFFFFFF); + u8 readByte(u32 addr, const u8 init); + u16 readWord(u32 addr, const u16 init); + u32 readLong(u32 addr, const u32 init); + + u8 readByte(const u8 init); + u16 readWord(const u16 init); + u32 readLong(const u32 init); void writeByte(u32 addr, u8 val); void writeWord(u32 addr, u16 val); void writeLong(u32 addr, u32 val); + void writeByte(u8 val); + void writeWord(u16 val); + void writeLong(u32 val); + + void seek(u32 pos) { fpMC->fseek(pos, SEEK_SET); } + void flushBackup() { fpMC->fflush(); } u8 searchFileSaveType(u32 size); @@ -123,7 +133,7 @@ public: bool isMovieMode; u32 importDataSize(const char *filename); - u32 importData(const char *filename, u32 force_size = 0); + bool importData(const char *filename, u32 force_size = 0); bool exportData(const char *filename); private: diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index 760a5107e..ef7fa95e2 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -2942,6 +2942,7 @@ int _main() CommonSettings.loadToMemory = GetPrivateProfileBool("General", "loadType", true, IniName); CommonSettings.cheatsDisable = GetPrivateProfileBool("General", "cheatsDisable", false, IniName); CommonSettings.autodetectBackupMethod = GetPrivateProfileInt("General", "autoDetectMethod", 0, IniName); + CommonSettings.backupSave = GetPrivateProfileBool("General", "backupSave", false, IniName); ColorCtrl_Register(); if (!RegWndClass("DeSmuME", WindowProcedure, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME))))