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