hook up pause and reset, w/ relevant hotkeys

This commit is contained in:
Arisotura 2020-05-20 22:22:22 +02:00
parent 26dcc95c20
commit 2ebb21ce3b
4 changed files with 104 additions and 49 deletions

View File

@ -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);

View File

@ -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.

View File

@ -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)
{ {

View File

@ -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];