mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-21 05:09:46 -06:00
add functionality to import savefiles
This commit is contained in:
@ -1124,6 +1124,11 @@ void MicInputFrame(s16* data, int samples)
|
|||||||
return SPI_TSC::MicInputFrame(data, samples);
|
return SPI_TSC::MicInputFrame(data, samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ImportSRAM(u8* data, u32 length)
|
||||||
|
{
|
||||||
|
return NDSCart::ImportSRAM(data, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Halt()
|
void Halt()
|
||||||
{
|
{
|
||||||
|
@ -211,6 +211,8 @@ void SetLidClosed(bool closed);
|
|||||||
|
|
||||||
void MicInputFrame(s16* data, int samples);
|
void MicInputFrame(s16* data, int samples);
|
||||||
|
|
||||||
|
int ImportSRAM(u8* data, u32 length);
|
||||||
|
|
||||||
void ScheduleEvent(u32 id, bool periodic, s32 delay, void (*func)(u32), u32 param);
|
void ScheduleEvent(u32 id, bool periodic, s32 delay, void (*func)(u32), u32 param);
|
||||||
void CancelEvent(u32 id);
|
void CancelEvent(u32 id);
|
||||||
|
|
||||||
|
@ -1034,6 +1034,12 @@ void RelocateSave(const char* path, bool write)
|
|||||||
NDSCart_SRAM::RelocateSave(path, write);
|
NDSCart_SRAM::RelocateSave(path, write);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ImportSRAM(const u8* data, u32 length)
|
||||||
|
{
|
||||||
|
memcpy(NDSCart_SRAM::SRAM, data, std::min(length, NDSCart_SRAM::SRAMLength));
|
||||||
|
return length - NDSCart_SRAM::SRAMLength;
|
||||||
|
}
|
||||||
|
|
||||||
void ResetCart()
|
void ResetCart()
|
||||||
{
|
{
|
||||||
// CHECKME: what if there is a transfer in progress?
|
// CHECKME: what if there is a transfer in progress?
|
||||||
|
@ -48,6 +48,8 @@ void DecryptSecureArea(u8* out);
|
|||||||
bool LoadROM(const char* path, const char* sram, bool direct);
|
bool LoadROM(const char* path, const char* sram, bool direct);
|
||||||
void RelocateSave(const char* path, bool write);
|
void RelocateSave(const char* path, bool write);
|
||||||
|
|
||||||
|
int ImportSRAM(const u8* data, u32 length);
|
||||||
|
|
||||||
void ResetCart();
|
void ResetCart();
|
||||||
|
|
||||||
void WriteROMCnt(u32 val);
|
void WriteROMCnt(u32 val);
|
||||||
|
@ -100,6 +100,9 @@ bool SaveState(const char* filename);
|
|||||||
// undo the latest savestate load
|
// undo the latest savestate load
|
||||||
void UndoStateLoad();
|
void UndoStateLoad();
|
||||||
|
|
||||||
|
// imports savedata from an external file. Returns the difference between the filesize and the SRAM size
|
||||||
|
int ImportSRAM(const char* filename);
|
||||||
|
|
||||||
// enable or disable cheats
|
// enable or disable cheats
|
||||||
void EnableCheats(bool enable);
|
void EnableCheats(bool enable);
|
||||||
|
|
||||||
|
@ -588,6 +588,21 @@ void UndoStateLoad()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ImportSRAM(const char* filename)
|
||||||
|
{
|
||||||
|
FILE* file = fopen(filename, "rb");
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
u32 size = ftell(file);
|
||||||
|
u8* importData = new u8[size];
|
||||||
|
rewind(file);
|
||||||
|
fread(importData, size, 1, file);
|
||||||
|
fclose(file);
|
||||||
|
|
||||||
|
int diff = NDS::ImportSRAM(importData, size);
|
||||||
|
delete[] importData;
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
void EnableCheats(bool enable)
|
void EnableCheats(bool enable)
|
||||||
{
|
{
|
||||||
CheatsOn = enable;
|
CheatsOn = enable;
|
||||||
|
@ -1052,6 +1052,9 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
|||||||
actUndoStateLoad->setShortcut(QKeySequence(Qt::Key_F12));
|
actUndoStateLoad->setShortcut(QKeySequence(Qt::Key_F12));
|
||||||
connect(actUndoStateLoad, &QAction::triggered, this, &MainWindow::onUndoStateLoad);
|
connect(actUndoStateLoad, &QAction::triggered, this, &MainWindow::onUndoStateLoad);
|
||||||
|
|
||||||
|
actImportSavefile = menu->addAction("Import savefile");
|
||||||
|
connect(actImportSavefile, &QAction::triggered, this, &MainWindow::onImportSavefile);
|
||||||
|
|
||||||
menu->addSeparator();
|
menu->addSeparator();
|
||||||
|
|
||||||
actQuit = menu->addAction("Quit");
|
actQuit = menu->addAction("Quit");
|
||||||
@ -1220,6 +1223,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
|
|||||||
actLoadState[i]->setEnabled(false);
|
actLoadState[i]->setEnabled(false);
|
||||||
}
|
}
|
||||||
actUndoStateLoad->setEnabled(false);
|
actUndoStateLoad->setEnabled(false);
|
||||||
|
actImportSavefile->setEnabled(false);
|
||||||
|
|
||||||
actPause->setEnabled(false);
|
actPause->setEnabled(false);
|
||||||
actReset->setEnabled(false);
|
actReset->setEnabled(false);
|
||||||
@ -1618,6 +1622,41 @@ void MainWindow::onUndoStateLoad()
|
|||||||
OSD::AddMessage(0, "State load undone");
|
OSD::AddMessage(0, "State load undone");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::onImportSavefile()
|
||||||
|
{
|
||||||
|
if (!RunningSomething) return;
|
||||||
|
|
||||||
|
emuThread->emuPause();
|
||||||
|
QString path = QFileDialog::getOpenFileName(this,
|
||||||
|
"Select savefile",
|
||||||
|
Config::LastROMFolder,
|
||||||
|
"Savefiles (*.sav *.bin *.dsv);;Any file (*.*)");
|
||||||
|
|
||||||
|
if (!path.isEmpty())
|
||||||
|
{
|
||||||
|
if (QMessageBox::warning(this,
|
||||||
|
"Emulation will be reset and data overwritten",
|
||||||
|
"The emulation will be reset and the current savefile overwritten.",
|
||||||
|
QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok)
|
||||||
|
{
|
||||||
|
int res = Frontend::Reset();
|
||||||
|
if (res != Frontend::Load_OK)
|
||||||
|
{
|
||||||
|
QMessageBox::critical(this, "melonDS", "Reset failed\n" + loadErrorStr(res));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int diff = Frontend::ImportSRAM(path.toStdString().c_str());
|
||||||
|
if (diff > 0)
|
||||||
|
OSD::AddMessage(0, "Trimmed savefile");
|
||||||
|
else if (diff < 0)
|
||||||
|
OSD::AddMessage(0, "Savefile shorter than SRAM");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::onQuit()
|
void MainWindow::onQuit()
|
||||||
{
|
{
|
||||||
QApplication::quit();
|
QApplication::quit();
|
||||||
@ -1923,6 +1962,7 @@ void MainWindow::onEmuStart()
|
|||||||
actPause->setChecked(false);
|
actPause->setChecked(false);
|
||||||
actReset->setEnabled(true);
|
actReset->setEnabled(true);
|
||||||
actStop->setEnabled(true);
|
actStop->setEnabled(true);
|
||||||
|
actImportSavefile->setEnabled(true);
|
||||||
|
|
||||||
actSetupCheats->setEnabled(true);
|
actSetupCheats->setEnabled(true);
|
||||||
}
|
}
|
||||||
@ -1937,6 +1977,7 @@ void MainWindow::onEmuStop()
|
|||||||
actLoadState[i]->setEnabled(false);
|
actLoadState[i]->setEnabled(false);
|
||||||
}
|
}
|
||||||
actUndoStateLoad->setEnabled(false);
|
actUndoStateLoad->setEnabled(false);
|
||||||
|
actImportSavefile->setEnabled(false);
|
||||||
|
|
||||||
actPause->setEnabled(false);
|
actPause->setEnabled(false);
|
||||||
actReset->setEnabled(false);
|
actReset->setEnabled(false);
|
||||||
|
@ -195,6 +195,7 @@ private slots:
|
|||||||
void onSaveState();
|
void onSaveState();
|
||||||
void onLoadState();
|
void onLoadState();
|
||||||
void onUndoStateLoad();
|
void onUndoStateLoad();
|
||||||
|
void onImportSavefile();
|
||||||
void onQuit();
|
void onQuit();
|
||||||
|
|
||||||
void onPause(bool checked);
|
void onPause(bool checked);
|
||||||
@ -247,6 +248,7 @@ public:
|
|||||||
QAction* actSaveState[9];
|
QAction* actSaveState[9];
|
||||||
QAction* actLoadState[9];
|
QAction* actLoadState[9];
|
||||||
QAction* actUndoStateLoad;
|
QAction* actUndoStateLoad;
|
||||||
|
QAction* actImportSavefile;
|
||||||
QAction* actQuit;
|
QAction* actQuit;
|
||||||
|
|
||||||
QAction* actPause;
|
QAction* actPause;
|
||||||
|
Reference in New Issue
Block a user