hook up pause and reset, w/ relevant hotkeys
This commit is contained in:
parent
26dcc95c20
commit
2ebb21ce3b
|
@ -65,6 +65,9 @@ int LoadBIOS();
|
||||||
// note: loading a ROM to the NDS slot resets emulation
|
// note: loading a ROM to the NDS slot resets emulation
|
||||||
int LoadROM(const char* file, int slot);
|
int LoadROM(const char* file, int slot);
|
||||||
|
|
||||||
|
// reset execution of the current ROM
|
||||||
|
int Reset();
|
||||||
|
|
||||||
// get the filename associated with the given savestate slot (1-8)
|
// get the filename associated with the given savestate slot (1-8)
|
||||||
void GetSavestateName(int slot, char* filename, int len);
|
void GetSavestateName(int slot, char* filename, int len);
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,11 @@ void Init_ROM()
|
||||||
memset(PrevSRAMPath[ROMSlot_GBA], 0, 1024);
|
memset(PrevSRAMPath[ROMSlot_GBA], 0, 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: currently, when failing to load a ROM for whatever reason, we attempt
|
||||||
|
// to revert to the previous state and resume execution; this may not be a very
|
||||||
|
// good thing, depending on what state the core was left in.
|
||||||
|
// should we do a better state revert (via the savestate system)? completely stop?
|
||||||
|
|
||||||
void SetupSRAMPath(int slot)
|
void SetupSRAMPath(int slot)
|
||||||
{
|
{
|
||||||
strncpy(SRAMPath[slot], ROMPath[slot], 1023);
|
strncpy(SRAMPath[slot], ROMPath[slot], 1023);
|
||||||
|
@ -184,7 +189,7 @@ int LoadROM(const char* file, int slot)
|
||||||
}
|
}
|
||||||
else if (slot == ROMSlot_GBA && NDS::LoadGBAROM(ROMPath[slot], SRAMPath[slot]))
|
else if (slot == ROMSlot_GBA && NDS::LoadGBAROM(ROMPath[slot], SRAMPath[slot]))
|
||||||
{
|
{
|
||||||
SavestateLoaded = false;
|
SavestateLoaded = false; // checkme??
|
||||||
|
|
||||||
strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety
|
strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety
|
||||||
return Load_OK;
|
return Load_OK;
|
||||||
|
@ -197,6 +202,46 @@ int LoadROM(const char* file, int slot)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int Reset()
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
bool directboot = Config::DirectBoot != 0;
|
||||||
|
|
||||||
|
res = VerifyDSBIOS();
|
||||||
|
if (res != Load_OK) return res;
|
||||||
|
|
||||||
|
res = VerifyDSFirmware();
|
||||||
|
if (res != Load_OK)
|
||||||
|
{
|
||||||
|
if (res == Load_FirmwareNotBootable)
|
||||||
|
directboot = true;
|
||||||
|
else
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
SavestateLoaded = false;
|
||||||
|
|
||||||
|
if (ROMPath[ROMSlot_NDS][0] == '\0')
|
||||||
|
{
|
||||||
|
NDS::LoadBIOS();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetupSRAMPath(0);
|
||||||
|
if (!NDS::LoadROM(ROMPath[ROMSlot_NDS], SRAMPath[ROMSlot_NDS], directboot))
|
||||||
|
return Load_ROMLoadError;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ROMPath[ROMSlot_GBA][0] != '\0')
|
||||||
|
{
|
||||||
|
SetupSRAMPath(1);
|
||||||
|
if (!NDS::LoadGBAROM(ROMPath[ROMSlot_GBA], SRAMPath[ROMSlot_GBA]))
|
||||||
|
return Load_ROMLoadError;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Load_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// SAVESTATE TODO
|
// SAVESTATE TODO
|
||||||
// * configurable paths. not everyone wants their ROM directory to be polluted, I guess.
|
// * configurable paths. not everyone wants their ROM directory to be polluted, I guess.
|
||||||
|
|
|
@ -113,6 +113,8 @@ EmuThread::EmuThread(QObject* parent) : QThread(parent)
|
||||||
connect(this, SIGNAL(windowTitleChange(QString)), mainWindow, SLOT(onTitleUpdate(QString)));
|
connect(this, SIGNAL(windowTitleChange(QString)), mainWindow, SLOT(onTitleUpdate(QString)));
|
||||||
connect(this, SIGNAL(windowEmuStart()), mainWindow, SLOT(onEmuStart()));
|
connect(this, SIGNAL(windowEmuStart()), mainWindow, SLOT(onEmuStart()));
|
||||||
connect(this, SIGNAL(windowEmuStop()), mainWindow, SLOT(onEmuStop()));
|
connect(this, SIGNAL(windowEmuStop()), mainWindow, SLOT(onEmuStop()));
|
||||||
|
connect(this, SIGNAL(windowEmuPause()), mainWindow->actPause, SLOT(trigger()));
|
||||||
|
connect(this, SIGNAL(windowEmuReset()), mainWindow->actReset, SLOT(trigger()));
|
||||||
|
|
||||||
emit windowEmuStop();
|
emit windowEmuStop();
|
||||||
}
|
}
|
||||||
|
@ -152,14 +154,10 @@ void EmuThread::run()
|
||||||
{
|
{
|
||||||
Input::Process();
|
Input::Process();
|
||||||
|
|
||||||
/*if (Input::HotkeyPressed(HK_FastForwardToggle))
|
if (Input::HotkeyPressed(HK_FastForwardToggle)) emit windowLimitFPSChange();
|
||||||
{
|
|
||||||
Config::LimitFPS = !Config::LimitFPS;
|
|
||||||
// TODO: reflect in UI!
|
|
||||||
}*/
|
|
||||||
|
|
||||||
//if (Input::HotkeyPressed(HK_Pause)) uiQueueMain(TogglePause, NULL);
|
if (Input::HotkeyPressed(HK_Pause)) emit windowEmuPause();
|
||||||
//if (Input::HotkeyPressed(HK_Reset)) uiQueueMain(Reset, NULL);
|
if (Input::HotkeyPressed(HK_Reset)) emit windowEmuReset();
|
||||||
|
|
||||||
if (GBACart::CartInserted && GBACart::HasSolarSensor)
|
if (GBACart::CartInserted && GBACart::HasSolarSensor)
|
||||||
{
|
{
|
||||||
|
@ -318,18 +316,15 @@ void EmuThread::run()
|
||||||
lastmeasuretick = lasttick;
|
lastmeasuretick = lasttick;
|
||||||
fpslimitcount = 0;
|
fpslimitcount = 0;
|
||||||
|
|
||||||
if (EmuRunning == 2)
|
/*if (Screen_UseGL)
|
||||||
{
|
{
|
||||||
/*if (Screen_UseGL)
|
uiGLBegin(GLContext);
|
||||||
{
|
uiGLMakeContextCurrent(GLContext);
|
||||||
uiGLBegin(GLContext);
|
GLScreen_DrawScreen();
|
||||||
uiGLMakeContextCurrent(GLContext);
|
uiGLEnd(GLContext);
|
||||||
GLScreen_DrawScreen();
|
|
||||||
uiGLEnd(GLContext);
|
|
||||||
}
|
|
||||||
uiAreaQueueRedrawAll(MainDrawArea);*/
|
|
||||||
mainWindow->update();
|
|
||||||
}
|
}
|
||||||
|
uiAreaQueueRedrawAll(MainDrawArea);*/
|
||||||
|
mainWindow->update();
|
||||||
|
|
||||||
//if (Screen_UseGL) uiGLMakeContextCurrent(NULL);
|
//if (Screen_UseGL) uiGLMakeContextCurrent(NULL);
|
||||||
|
|
||||||
|
@ -338,7 +333,7 @@ void EmuThread::run()
|
||||||
sprintf(melontitle, "melonDS " MELONDS_VERSION);
|
sprintf(melontitle, "melonDS " MELONDS_VERSION);
|
||||||
changeWindowTitle(melontitle);
|
changeWindowTitle(melontitle);
|
||||||
|
|
||||||
SDL_Delay(100);
|
SDL_Delay(75);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,12 +370,11 @@ void EmuThread::emuRun()
|
||||||
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 0);
|
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuThread::emuPause(bool refresh)
|
void EmuThread::emuPause()
|
||||||
{
|
{
|
||||||
int status = refresh ? 2:3;
|
|
||||||
PrevEmuStatus = EmuRunning;
|
PrevEmuStatus = EmuRunning;
|
||||||
EmuRunning = status;
|
EmuRunning = 2;
|
||||||
while (EmuStatus != status);
|
while (EmuStatus != 2);
|
||||||
|
|
||||||
//emit windowEmuPause();
|
//emit windowEmuPause();
|
||||||
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 1);
|
if (audioDevice) SDL_PauseAudioDevice(audioDevice, 1);
|
||||||
|
@ -774,7 +768,7 @@ void MainWindow::dropEvent(QDropEvent* event)
|
||||||
QList<QUrl> urls = event->mimeData()->urls();
|
QList<QUrl> urls = event->mimeData()->urls();
|
||||||
if (urls.count() > 1) return; // not handling more than one file at once
|
if (urls.count() > 1) return; // not handling more than one file at once
|
||||||
|
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
QString filename = urls.at(0).toLocalFile();
|
QString filename = urls.at(0).toLocalFile();
|
||||||
QString ext = filename.right(3);
|
QString ext = filename.right(3);
|
||||||
|
@ -836,7 +830,7 @@ QString MainWindow::loadErrorStr(int error)
|
||||||
|
|
||||||
void MainWindow::onOpenFile()
|
void MainWindow::onOpenFile()
|
||||||
{
|
{
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
QString filename = QFileDialog::getOpenFileName(this,
|
QString filename = QFileDialog::getOpenFileName(this,
|
||||||
"Open ROM",
|
"Open ROM",
|
||||||
|
@ -897,7 +891,7 @@ void MainWindow::onBootFirmware()
|
||||||
{
|
{
|
||||||
// TODO: check the whole GBA cart shito
|
// TODO: check the whole GBA cart shito
|
||||||
|
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
int res = Frontend::LoadBIOS();
|
int res = Frontend::LoadBIOS();
|
||||||
if (res != Frontend::Load_OK)
|
if (res != Frontend::Load_OK)
|
||||||
|
@ -917,7 +911,7 @@ void MainWindow::onSaveState()
|
||||||
{
|
{
|
||||||
int slot = ((QAction*)sender())->data().toInt();
|
int slot = ((QAction*)sender())->data().toInt();
|
||||||
|
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
char filename[1024];
|
char filename[1024];
|
||||||
if (slot > 0)
|
if (slot > 0)
|
||||||
|
@ -958,7 +952,7 @@ void MainWindow::onLoadState()
|
||||||
{
|
{
|
||||||
int slot = ((QAction*)sender())->data().toInt();
|
int slot = ((QAction*)sender())->data().toInt();
|
||||||
|
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
char filename[1024];
|
char filename[1024];
|
||||||
if (slot > 0)
|
if (slot > 0)
|
||||||
|
@ -1006,7 +1000,7 @@ void MainWindow::onLoadState()
|
||||||
|
|
||||||
void MainWindow::onUndoStateLoad()
|
void MainWindow::onUndoStateLoad()
|
||||||
{
|
{
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
Frontend::UndoStateLoad();
|
Frontend::UndoStateLoad();
|
||||||
emuThread->emuUnpause();
|
emuThread->emuUnpause();
|
||||||
}
|
}
|
||||||
|
@ -1019,9 +1013,11 @@ void MainWindow::onQuit()
|
||||||
|
|
||||||
void MainWindow::onPause(bool checked)
|
void MainWindow::onPause(bool checked)
|
||||||
{
|
{
|
||||||
if (emuThread->emuIsRunning())
|
if (!RunningSomething) return;
|
||||||
|
|
||||||
|
if (checked)
|
||||||
{
|
{
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1031,7 +1027,26 @@ void MainWindow::onPause(bool checked)
|
||||||
|
|
||||||
void MainWindow::onReset()
|
void MainWindow::onReset()
|
||||||
{
|
{
|
||||||
//
|
if (!RunningSomething) return;
|
||||||
|
|
||||||
|
emuThread->emuPause();
|
||||||
|
|
||||||
|
actUndoStateLoad->setEnabled(false);
|
||||||
|
|
||||||
|
int res = Frontend::Reset();
|
||||||
|
if (res != Frontend::Load_OK)
|
||||||
|
{
|
||||||
|
QMessageBox::critical(this,
|
||||||
|
"melonDS",
|
||||||
|
loadErrorStr(res));
|
||||||
|
emuThread->emuUnpause();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// OSD::AddMessage(0, "Reset");
|
||||||
|
|
||||||
|
emuThread->emuRun();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onStop()
|
void MainWindow::onStop()
|
||||||
|
@ -1047,7 +1062,7 @@ void MainWindow::onOpenEmuSettings()
|
||||||
|
|
||||||
void MainWindow::onOpenInputConfig()
|
void MainWindow::onOpenInputConfig()
|
||||||
{
|
{
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
InputConfigDialog* dlg = InputConfigDialog::openDlg(this);
|
InputConfigDialog* dlg = InputConfigDialog::openDlg(this);
|
||||||
connect(dlg, &InputConfigDialog::finished, this, &MainWindow::onInputConfigFinished);
|
connect(dlg, &InputConfigDialog::finished, this, &MainWindow::onInputConfigFinished);
|
||||||
|
@ -1143,7 +1158,7 @@ void MainWindow::onEmuStart()
|
||||||
}
|
}
|
||||||
actSaveState[0]->setEnabled(true);
|
actSaveState[0]->setEnabled(true);
|
||||||
actLoadState[0]->setEnabled(true);
|
actLoadState[0]->setEnabled(true);
|
||||||
actUndoStateLoad->setEnabled(true);
|
actUndoStateLoad->setEnabled(false);
|
||||||
|
|
||||||
actPause->setEnabled(true);
|
actPause->setEnabled(true);
|
||||||
actPause->setChecked(false);
|
actPause->setChecked(false);
|
||||||
|
@ -1165,16 +1180,6 @@ void MainWindow::onEmuStop()
|
||||||
actStop->setEnabled(false);
|
actStop->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onEmuPause()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::onEmuUnpause()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
|
@ -1281,7 +1286,7 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
emuThread = new EmuThread();
|
emuThread = new EmuThread();
|
||||||
emuThread->start();
|
emuThread->start();
|
||||||
emuThread->emuPause(true);
|
emuThread->emuPause();
|
||||||
|
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,7 +38,7 @@ public:
|
||||||
|
|
||||||
// to be called from the UI thread
|
// to be called from the UI thread
|
||||||
void emuRun();
|
void emuRun();
|
||||||
void emuPause(bool refresh);
|
void emuPause();
|
||||||
void emuUnpause();
|
void emuUnpause();
|
||||||
void emuStop();
|
void emuStop();
|
||||||
|
|
||||||
|
@ -49,7 +49,10 @@ signals:
|
||||||
|
|
||||||
void windowEmuStart();
|
void windowEmuStart();
|
||||||
void windowEmuStop();
|
void windowEmuStop();
|
||||||
void windowPauseToggle();
|
void windowEmuPause();
|
||||||
|
void windowEmuReset();
|
||||||
|
|
||||||
|
void windowLimitFPSChange();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
volatile int EmuStatus;
|
volatile int EmuStatus;
|
||||||
|
@ -130,14 +133,13 @@ private slots:
|
||||||
|
|
||||||
void onEmuStart();
|
void onEmuStart();
|
||||||
void onEmuStop();
|
void onEmuStop();
|
||||||
void onEmuPause();
|
|
||||||
void onEmuUnpause();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString loadErrorStr(int error);
|
QString loadErrorStr(int error);
|
||||||
|
|
||||||
MainWindowPanel* panel;
|
MainWindowPanel* panel;
|
||||||
|
|
||||||
|
public:
|
||||||
QAction* actOpenROM;
|
QAction* actOpenROM;
|
||||||
QAction* actBootFirmware;
|
QAction* actBootFirmware;
|
||||||
QAction* actSaveState[9];
|
QAction* actSaveState[9];
|
||||||
|
|
Loading…
Reference in New Issue