- optimizing reads/writes NAND backup data.

This commit is contained in:
mtabachenko 2013-11-16 12:30:47 +00:00
parent 88e34db3e7
commit b5f78e2652
4 changed files with 63 additions and 10 deletions

View File

@ -119,6 +119,7 @@ public:
if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr) if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr)
{ {
save_start_adr = save_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; handle_save = 1;
break; break;
@ -140,6 +141,7 @@ public:
if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr) if (save_start_adr != (protocol.address & gameInfo.mask) - subAdr)
{ {
save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr; save_start_adr = save_adr = (protocol.address & gameInfo.mask) - subAdr;
MMU_new.backupDevice.seek(save_start_adr);
} }
} }
else else
@ -151,6 +153,7 @@ public:
case 0xB2: //Set save position case 0xB2: //Set save position
mode = cmd; mode = cmd;
save_start_adr = save_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; handle_save = 1;
break; break;
} }
@ -185,7 +188,7 @@ public:
{ {
MMU_new.backupDevice.ensure(save_adr+4, (u8)0); 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; save_adr += 4;
} }
@ -246,7 +249,7 @@ public:
case 0x81: //Nand Write case 0x81: //Nand Write
MMU_new.backupDevice.ensure(adr+4, (u8)0); MMU_new.backupDevice.ensure(adr+4, (u8)0);
MMU_new.backupDevice.writeLong(adr, val); MMU_new.backupDevice.writeLong(val);
save_adr += 4; save_adr += 4;
break; break;

View File

@ -451,6 +451,28 @@ u32 BackupDevice::readLong(u32 addr, const u32 init)
return val; 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) bool BackupDevice::write(u8 val)
{ {
#ifdef _DONT_SAVE_BACKUP #ifdef _DONT_SAVE_BACKUP
@ -481,6 +503,22 @@ void BackupDevice::writeLong(u32 addr, u32 val)
fpMC->write32le(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) bool BackupDevice::saveBuffer(u8 *data, u32 size, bool _rewind, bool _truncate)
{ {
if (_rewind) if (_rewind)
@ -942,20 +980,21 @@ u32 BackupDevice::importDataSize(const char *filename)
return 0; 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 (strlen(filename) < 4) return res;
if (memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0) if (memcmp(filename + strlen(filename) - 4, ".duc", 4) == 0)
res = import_duc(filename, force_size); res = import_duc(filename, force_size);
else else
if (import_no_gba(filename, force_size)) if (import_no_gba(filename, force_size))
res = 1; res = true;
else else
res = import_raw(filename, force_size); res = import_raw(filename, force_size);
NDS_Reset(); if (res)
NDS_Reset();
return res; return res;
} }

View File

@ -68,14 +68,24 @@ public:
void reset_hardware(); void reset_hardware();
std::string getFilename() { return filename; } std::string getFilename() { return filename; }
u8 readByte(u32 addr, const u8 init = 0xFF); u8 readByte(u32 addr, const u8 init);
u16 readWord(u32 addr, const u16 init = 0xFFFF); u16 readWord(u32 addr, const u16 init);
u32 readLong(u32 addr, const u32 init = 0xFFFFFFFF); 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 writeByte(u32 addr, u8 val);
void writeWord(u32 addr, u16 val); void writeWord(u32 addr, u16 val);
void writeLong(u32 addr, u32 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(); } void flushBackup() { fpMC->fflush(); }
u8 searchFileSaveType(u32 size); u8 searchFileSaveType(u32 size);
@ -123,7 +133,7 @@ public:
bool isMovieMode; bool isMovieMode;
u32 importDataSize(const char *filename); 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); bool exportData(const char *filename);
private: private:

View File

@ -2942,6 +2942,7 @@ int _main()
CommonSettings.loadToMemory = GetPrivateProfileBool("General", "loadType", true, IniName); CommonSettings.loadToMemory = GetPrivateProfileBool("General", "loadType", true, IniName);
CommonSettings.cheatsDisable = GetPrivateProfileBool("General", "cheatsDisable", false, IniName); CommonSettings.cheatsDisable = GetPrivateProfileBool("General", "cheatsDisable", false, IniName);
CommonSettings.autodetectBackupMethod = GetPrivateProfileInt("General", "autoDetectMethod", 0, IniName); CommonSettings.autodetectBackupMethod = GetPrivateProfileInt("General", "autoDetectMethod", 0, IniName);
CommonSettings.backupSave = GetPrivateProfileBool("General", "backupSave", false, IniName);
ColorCtrl_Register(); ColorCtrl_Register();
if (!RegWndClass("DeSmuME", WindowProcedure, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME)))) if (!RegWndClass("DeSmuME", WindowProcedure, CS_DBLCLKS, LoadIcon(hAppInst, MAKEINTRESOURCE(ICONDESMUME))))