diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index 890ad658a..533f56013 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -16,6 +16,7 @@ extern "C" { #include "gba.h" #include "gba-audio.h" +#include "gba-config.h" #include "gba-serialize.h" #include "renderers/video-software.h" #include "util/vfs.h" @@ -145,6 +146,18 @@ void GameController::setOverride(const GBACartridgeOverride& override) { m_threadContext.hasOverride = true; } +void GameController::setOptions(const GBAOptions* opts) { + setFrameskip(opts->frameskip); + setAudioSync(opts->audioSync); + setVideoSync(opts->videoSync); + setSkipBIOS(opts->skipBios); + setRewind(opts->rewindEnable, opts->rewindBufferCapacity, opts->rewindBufferInterval); + + threadInterrupt(); + m_threadContext.idleOptimization = opts->idleOptimization; + threadContinue(); +} + #ifdef USE_GDB_STUB ARMDebugger* GameController::debugger() { return m_threadContext.debugger; diff --git a/src/platform/qt/GameController.h b/src/platform/qt/GameController.h index a7c97f7a1..5df97d9c6 100644 --- a/src/platform/qt/GameController.h +++ b/src/platform/qt/GameController.h @@ -21,6 +21,7 @@ extern "C" { } struct GBAAudio; +struct GBAOptions; struct GBAVideoSoftwareRenderer; struct Configuration; @@ -59,6 +60,8 @@ public: void setOverride(const GBACartridgeOverride& override); void clearOverride() { m_threadContext.hasOverride = false; } + void setOptions(const GBAOptions*); + #ifdef USE_GDB_STUB ARMDebugger* debugger(); void setDebugger(ARMDebugger*); diff --git a/src/platform/qt/GamePakView.cpp b/src/platform/qt/GamePakView.cpp index 851613296..f78919b90 100644 --- a/src/platform/qt/GamePakView.cpp +++ b/src/platform/qt/GamePakView.cpp @@ -81,7 +81,13 @@ void GamePakView::updateOverrides() { } } - if (m_override.savetype != SAVEDATA_AUTODETECT || m_override.hardware != GPIO_NO_OVERRIDE) { + bool ok; + uint32_t parsedIdleLoop = m_ui.idleLoop->text().toInt(&ok, 16); + if (ok) { + m_override.idleLoop = parsedIdleLoop; + } + + if (m_override.savetype != SAVEDATA_AUTODETECT || m_override.hardware != GPIO_NO_OVERRIDE || m_override.idleLoop != IDLE_LOOP_NONE) { m_controller->setOverride(m_override); } else { m_controller->clearOverride(); @@ -109,9 +115,19 @@ void GamePakView::gameStarted(GBAThread* thread) { m_ui.hwTilt->setChecked(thread->gba->memory.gpio.gpioDevices & GPIO_TILT); m_ui.hwRumble->setChecked(thread->gba->memory.gpio.gpioDevices & GPIO_RUMBLE); + if (thread->gba->idleLoop != IDLE_LOOP_NONE) { + m_ui.idleLoop->setText(QString::number(thread->gba->idleLoop, 16)); + } else { + m_ui.idleLoop->clear(); + + } + GBAGetGameCode(thread->gba, m_override.id); m_override.hardware = thread->gba->memory.gpio.gpioDevices; m_override.savetype = thread->gba->memory.savedata.type; + m_override.idleLoop = thread->gba->idleLoop; + + m_ui.idleLoop->setEnabled(false); m_ui.save->setEnabled(m_config); } @@ -133,5 +149,8 @@ void GamePakView::gameStopped() { m_ui.hwTilt->setChecked(false); m_ui.hwRumble->setChecked(false); + m_ui.idleLoop->setEnabled(true); + + m_ui.clear->setEnabled(false); m_ui.save->setEnabled(false); } diff --git a/src/platform/qt/GamePakView.ui b/src/platform/qt/GamePakView.ui index 7c53d01a8..8cdd87667 100644 --- a/src/platform/qt/GamePakView.ui +++ b/src/platform/qt/GamePakView.ui @@ -7,7 +7,7 @@ 0 0 409 - 198 + 228 @@ -17,99 +17,47 @@ - Game Pak Overrides + Game Overrides - - - - - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Save type - - - - - - - - Autodetect - - - - - None - - - - - SRAM - - - - - Flash 512kb - - - - - Flash 1Mb - - - - - EEPROM - - - - - - - - Idle loop - - - - - - - - Run - - - - - Optimize - - - - - Detect - - - - - - - - - - - Qt::Horizontal - - - - - + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + Clear + + + + + + + false + + + Save + + + + - + @@ -178,32 +126,88 @@ + + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Save type + + + + + + + + Autodetect + + + + + None + + + + + SRAM + + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM + + + + + + + + Idle loop + + + + + + + + + + Qt::Horizontal + + + + + + - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - false - - - Save overrides - - - - + + + Qt::Vertical + + + + 20 + 40 + + + diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index f8900385e..12ee968ea 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -30,6 +30,15 @@ SettingsView::SettingsView(ConfigController* controller, QWidget* parent) loadSetting("rewindBufferCapacity", m_ui.rewindCapacity); loadSetting("resampleVideo", m_ui.resampleVideo); + QString idleOptimization = loadSetting("idleOptimization"); + if (idleOptimization == "ignore") { + m_ui.idleOptimization->setCurrentIndex(0); + } else if (idleOptimization == "remove") { + m_ui.idleOptimization->setCurrentIndex(1); + } else if (idleOptimization == "detect") { + m_ui.idleOptimization->setCurrentIndex(2); + } + connect(m_ui.biosBrowse, SIGNAL(clicked()), this, SLOT(selectBios())); connect(m_ui.buttonBox, SIGNAL(accepted()), this, SLOT(updateConfig())); } @@ -54,6 +63,19 @@ void SettingsView::updateConfig() { saveSetting("rewindBufferInterval", m_ui.rewindInterval); saveSetting("rewindBufferCapacity", m_ui.rewindCapacity); saveSetting("resampleVideo", m_ui.resampleVideo); + + switch (m_ui.idleOptimization->currentIndex() + IDLE_LOOP_IGNORE) { + case IDLE_LOOP_IGNORE: + saveSetting("idleOptimization", "ignore"); + break; + case IDLE_LOOP_REMOVE: + saveSetting("idleOptimization", "remove"); + break; + case IDLE_LOOP_DETECT: + saveSetting("idleOptimization", "detect"); + break; + } + m_controller->write(); emit biosLoaded(m_ui.bios->text()); @@ -69,17 +91,20 @@ void SettingsView::saveSetting(const char* key, const QComboBox* field) { } void SettingsView::saveSetting(const char* key, const QLineEdit* field) { - m_controller->setOption(key, field->text()); - m_controller->updateOption(key); + saveSetting(key, field->text()); } void SettingsView::saveSetting(const char* key, const QSpinBox* field) { - m_controller->setOption(key, field->cleanText()); + saveSetting(key, field->cleanText()); +} + +void SettingsView::saveSetting(const char* key, const QString& field) { + m_controller->setOption(key, field); m_controller->updateOption(key); } void SettingsView::loadSetting(const char* key, QAbstractButton* field) { - QString option = m_controller->getOption(key); + QString option = loadSetting(key); field->setChecked(option != "0"); } @@ -88,11 +113,15 @@ void SettingsView::loadSetting(const char* key, QComboBox* field) { } void SettingsView::loadSetting(const char* key, QLineEdit* field) { - QString option = m_controller->getOption(key); + QString option = loadSetting(key); field->setText(option); } void SettingsView::loadSetting(const char* key, QSpinBox* field) { - QString option = m_controller->getOption(key); + QString option = loadSetting(key); field->setValue(option.toInt()); } + +QString SettingsView::loadSetting(const char* key) { + return m_controller->getOption(key); +} diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index bb626c114..b6fd981ee 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -36,11 +36,13 @@ private: void saveSetting(const char* key, const QComboBox*); void saveSetting(const char* key, const QLineEdit*); void saveSetting(const char* key, const QSpinBox*); + void saveSetting(const char* key, const QString&); void loadSetting(const char* key, QAbstractButton*); void loadSetting(const char* key, QComboBox*); void loadSetting(const char* key, QLineEdit*); void loadSetting(const char* key, QSpinBox*); + QString loadSetting(const char* key); }; } diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 8d2ca1ba6..8b2b7b3e4 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -6,7 +6,7 @@ 0 0 - 350 + 355 501 @@ -326,6 +326,39 @@ + + + + + Run all + + + + + Remove known + + + + + Detect and remove + + + + + + + + Qt::Horizontal + + + + + + + Idle loops + + + diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 1dab048e4..f0051c484 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -146,11 +146,7 @@ void Window::loadConfig() { m_logView->setLevels(opts->logLevel); - m_controller->setFrameskip(opts->frameskip); - m_controller->setAudioSync(opts->audioSync); - m_controller->setVideoSync(opts->videoSync); - m_controller->setSkipBIOS(opts->skipBios); - m_controller->setRewind(opts->rewindEnable, opts->rewindBufferCapacity, opts->rewindBufferInterval); + m_controller->setOptions(opts); m_display->lockAspectRatio(opts->lockAspectRatio); m_display->filter(opts->resampleVideo);