diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c
index ff729e4cf..852c25427 100644
--- a/src/cpu/386_dynarec.c
+++ b/src/cpu/386_dynarec.c
@@ -51,6 +51,7 @@
#define CPU_BLOCK_END() cpu_block_end = 1
+int cpu_force_interpreter = 0;
int cpu_override_dynarec = 0;
int inrecomp = 0;
int cpu_block_end = 0;
@@ -778,7 +779,7 @@ exec386_dynarec(int32_t cycs)
cycles_old = cycles;
oldtsc = tsc;
tsc_old = tsc;
- if ((!CACHE_ON()) || cpu_override_dynarec) /*Interpret block*/
+ if (cpu_force_interpreter || cpu_override_dynarec || (!CACHE_ON())) /*Interpret block*/
{
exec386_dynarec_int();
} else {
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index 9f6ce23cc..25564082b 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -823,6 +823,8 @@ extern MMX_REG *MMP[8];
extern uint16_t *MMEP[8];
extern int cpu_block_end;
+
+extern int cpu_force_interpreter;
extern int cpu_override_dynarec;
extern void mmx_init(void);
diff --git a/src/cpu/x86.c b/src/cpu/x86.c
index 1090f22a1..38e50a488 100644
--- a/src/cpu/x86.c
+++ b/src/cpu/x86.c
@@ -373,6 +373,8 @@ reset_common(int hard)
in_lock = 0;
cpu_cpurst_on_sr = 0;
+
+ cpu_force_interpreter = 0;
}
/* Hard reset. */
diff --git a/src/include/86box/ui.h b/src/include/86box/ui.h
index 9bfae4330..08719cc2b 100644
--- a/src/include/86box/ui.h
+++ b/src/include/86box/ui.h
@@ -71,6 +71,8 @@ extern void ui_sb_set_text(char *str);
extern void ui_sb_bugui(char *str);
extern void ui_sb_mt32lcd(char *str);
+extern void ui_update_force_interpreter(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot
index 8bedf31f8..f2689b6e1 100644
--- a/src/qt/languages/86box.pot
+++ b/src/qt/languages/86box.pot
@@ -3038,3 +3038,15 @@ msgstr ""
msgid "Search:"
msgstr ""
+
+msgid "Force interpretation"
+msgstr ""
+
+msgid "Allow recompilation"
+msgstr ""
+
+msgid "&Force interpretation"
+msgstr ""
+
+msgid "&Allow recompilation"
+msgstr ""
diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po
index 0a1ff9f52..4b5c16481 100644
--- a/src/qt/languages/cs-CZ.po
+++ b/src/qt/languages/cs-CZ.po
@@ -3044,3 +3044,15 @@ msgstr "Tmavé"
msgid "Search:"
msgstr "Hledat:"
+
+msgid "Force interpretation"
+msgstr "Vynutit interpretaci"
+
+msgid "Allow recompilation"
+msgstr "Povolit rekompilaci"
+
+msgid "&Force interpretation"
+msgstr "&Vynutit interpretaci"
+
+msgid "&Allow recompilation"
+msgstr "&Povolit rekompilaci"
diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po
index 3e23d8682..69b778eda 100644
--- a/src/qt/languages/de-DE.po
+++ b/src/qt/languages/de-DE.po
@@ -3044,3 +3044,15 @@ msgstr "Dunkel"
msgid "Search:"
msgstr "Suche:"
+
+msgid "Force interpretation"
+msgstr "Erzwingen der Interpretation"
+
+msgid "Allow recompilation"
+msgstr "Recompilierung zulassen"
+
+msgid "&Force interpretation"
+msgstr "&Erzwingen der Interpretation"
+
+msgid "&Allow recompilation"
+msgstr "Recompilierung &zulassen"
diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po
index a365d62aa..b99343d59 100644
--- a/src/qt/languages/es-ES.po
+++ b/src/qt/languages/es-ES.po
@@ -3044,3 +3044,15 @@ msgstr "Oscuro"
msgid "Search:"
msgstr "Buscar:"
+
+msgid "Force interpretation"
+msgstr "Forzar interpretación"
+
+msgid "Allow recompilation"
+msgstr "Permitir recompilación"
+
+msgid "&Force interpretation"
+msgstr "&Forzar interpretación"
+
+msgid "&Allow recompilation"
+msgstr "&Permitir recompilación"
diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po
index ce6d6bab4..0409680ec 100644
--- a/src/qt/languages/fi-FI.po
+++ b/src/qt/languages/fi-FI.po
@@ -3038,3 +3038,15 @@ msgstr "Tumma"
msgid "Search:"
msgstr "Hae:"
+
+msgid "Force interpretation"
+msgstr "Pakota tulkinta"
+
+msgid "Allow recompilation"
+msgstr "Salli uudelleenkompilointi"
+
+msgid "&Force interpretation"
+msgstr "&Pakota tulkinta"
+
+msgid "&Allow recompilation"
+msgstr "&Salli uudelleenkompilointi"
diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po
index 026b53fa3..6c9175ec9 100644
--- a/src/qt/languages/fr-FR.po
+++ b/src/qt/languages/fr-FR.po
@@ -3044,3 +3044,15 @@ msgstr "Sombre"
msgid "Search:"
msgstr "Rechercher :"
+
+msgid "Force interpretation"
+msgstr "Forcer l'interprétation"
+
+msgid "Allow recompilation"
+msgstr "Permettre la recompilation"
+
+msgid "&Force interpretation"
+msgstr "&Forcer l'interprétation"
+
+msgid "&Allow recompilation"
+msgstr "&Permettre la recompilation"
diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po
index ee6c238b9..3f14ed6e8 100644
--- a/src/qt/languages/hr-HR.po
+++ b/src/qt/languages/hr-HR.po
@@ -3046,3 +3046,15 @@ msgstr "Tamno"
msgid "Search:"
msgstr "Pretrag:"
+
+msgid "Force interpretation"
+msgstr "Prisilna interpretacija"
+
+msgid "Allow recompilation"
+msgstr "Omogući rekompilaciju"
+
+msgid "&Force interpretation"
+msgstr "&Prisilna interpretacija"
+
+msgid "&Allow recompilation"
+msgstr "&Omogući rekompilaciju"
diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po
index 533377b46..2e9e34d61 100644
--- a/src/qt/languages/it-IT.po
+++ b/src/qt/languages/it-IT.po
@@ -3044,3 +3044,15 @@ msgstr "Scura"
msgid "Search:"
msgstr "Cerca:"
+
+msgid "Force interpretation"
+msgstr "Forza interpretazione"
+
+msgid "Allow recompilation"
+msgstr "Permetti ricompilazione"
+
+msgid "&Force interpretation"
+msgstr "&Forza interpretazione"
+
+msgid "&Allow recompilation"
+msgstr "&Permetti ricompilazione"
diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po
index 8d117f349..ef3edd21d 100644
--- a/src/qt/languages/ja-JP.po
+++ b/src/qt/languages/ja-JP.po
@@ -3045,3 +3045,15 @@ msgstr "暗闇"
msgid "Search:"
msgstr "検索:"
+
+msgid "Force interpretation"
+msgstr "解釈を強制する"
+
+msgid "Allow recompilation"
+msgstr "再コンパイルを許可する"
+
+msgid "&Force interpretation"
+msgstr "解釈を強制する(&F)"
+
+msgid "&Allow recompilation"
+msgstr "再コンパイルを許可する(&A)"
diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po
index 4994e8e66..ab0686842 100644
--- a/src/qt/languages/ko-KR.po
+++ b/src/qt/languages/ko-KR.po
@@ -3038,3 +3038,15 @@ msgstr "어둠"
msgid "Search:"
msgstr "검색:"
+
+msgid "Force interpretation"
+msgstr "강제 해석"
+
+msgid "Allow recompilation"
+msgstr "재컴파일 허용"
+
+msgid "&Force interpretation"
+msgstr "강제 해석(&F)"
+
+msgid "&Allow recompilation"
+msgstr "재컴파일 허용(&A)"
diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po
index 395a56dc9..04f605d28 100644
--- a/src/qt/languages/nb-NO.po
+++ b/src/qt/languages/nb-NO.po
@@ -3038,3 +3038,15 @@ msgstr "Mørk"
msgid "Search:"
msgstr "Søk:"
+
+msgid "Force interpretation"
+msgstr "Tving tolkning"
+
+msgid "Allow recompilation"
+msgstr "Tillat rekompilering"
+
+msgid "&Force interpretation"
+msgstr "&Tving tolkning"
+
+msgid "&Allow recompilation"
+msgstr "&Tillat rekompilering"
diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po
index b62014ee7..1c5369768 100644
--- a/src/qt/languages/nl-NL.po
+++ b/src/qt/languages/nl-NL.po
@@ -3038,3 +3038,15 @@ msgstr "Donker"
msgid "Search:"
msgstr "Zoeken:"
+
+msgid "Force interpretation"
+msgstr "Interpretatie afdwingen"
+
+msgid "Allow recompilation"
+msgstr "Recompilatie toestaan"
+
+msgid "&Force interpretation"
+msgstr "Interpretatie &afdwingen"
+
+msgid "&Allow recompilation"
+msgstr "Recompilatie &toestaan"
diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po
index ae47844c2..f861392ae 100644
--- a/src/qt/languages/pl-PL.po
+++ b/src/qt/languages/pl-PL.po
@@ -3045,3 +3045,15 @@ msgstr "Ciemny"
msgid "Search:"
msgstr "Szukanie:"
+
+msgid "Force interpretation"
+msgstr "Wymuś interpretację"
+
+msgid "Allow recompilation"
+msgstr "Zezwól na rekompilację"
+
+msgid "&Force interpretation"
+msgstr "&Wymuś interpretację"
+
+msgid "&Allow recompilation"
+msgstr "&Zezwól na rekompilację"
diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po
index d8fddc787..c263bc02b 100644
--- a/src/qt/languages/pt-BR.po
+++ b/src/qt/languages/pt-BR.po
@@ -3038,3 +3038,15 @@ msgstr "Escuro"
msgid "Search:"
msgstr "Pesquisar:"
+
+msgid "Force interpretation"
+msgstr "Forçar interpretação"
+
+msgid "Allow recompilation"
+msgstr "Permitir recompilação"
+
+msgid "&Force interpretation"
+msgstr "&Forçar interpretação"
+
+msgid "&Allow recompilation"
+msgstr "&Permitir recompilação"
diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po
index 177ef25f6..de0623bec 100644
--- a/src/qt/languages/pt-PT.po
+++ b/src/qt/languages/pt-PT.po
@@ -3045,3 +3045,15 @@ msgstr "Escuro"
msgid "Search:"
msgstr "Procurar:"
+
+msgid "Force interpretation"
+msgstr "Forçar interpretação"
+
+msgid "Allow recompilation"
+msgstr "Permitir recompilação"
+
+msgid "&Force interpretation"
+msgstr "&Forçar interpretação"
+
+msgid "&Allow recompilation"
+msgstr "&Permitir recompilação"
diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po
index 0b20956e7..ceaa7b4b8 100644
--- a/src/qt/languages/ru-RU.po
+++ b/src/qt/languages/ru-RU.po
@@ -3038,3 +3038,15 @@ msgstr "Тёмная"
msgid "Search:"
msgstr "Поиск:"
+
+msgid "Force interpretation"
+msgstr "Принудительная интерпретация"
+
+msgid "Allow recompilation"
+msgstr "Разрешить рекомпиляцию"
+
+msgid "&Force interpretation"
+msgstr "&Принудительная интерпретация"
+
+msgid "&Allow recompilation"
+msgstr "&Разрешить рекомпиляцию"
diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po
index 5f84e59fe..8e41931ee 100644
--- a/src/qt/languages/sk-SK.po
+++ b/src/qt/languages/sk-SK.po
@@ -3044,3 +3044,15 @@ msgstr "Tmavá"
msgid "Search:"
msgstr "Hľadať:"
+
+msgid "Force interpretation"
+msgstr "Vynútiť interpretáciu"
+
+msgid "Allow recompilation"
+msgstr "Povoliť rekompiláciu"
+
+msgid "&Force interpretation"
+msgstr "&Vynútiť interpretáciu"
+
+msgid "&Allow recompilation"
+msgstr "&Povoliť rekompiláciu"
diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po
index b654c9889..ca7a3e17b 100644
--- a/src/qt/languages/sl-SI.po
+++ b/src/qt/languages/sl-SI.po
@@ -3046,3 +3046,15 @@ msgstr "Temno"
msgid "Search:"
msgstr "Išči:"
+
+msgid "Force interpretation"
+msgstr "Vsili interpretacijo"
+
+msgid "Allow recompilation"
+msgstr "Dovoli prevajanje"
+
+msgid "&Force interpretation"
+msgstr "&Vsili interpretacijo"
+
+msgid "&Allow recompilation"
+msgstr "&Dovoli prevajanje"
diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po
index ff0774bed..a153443f2 100644
--- a/src/qt/languages/sv-SE.po
+++ b/src/qt/languages/sv-SE.po
@@ -3038,3 +3038,15 @@ msgstr "Mörk"
msgid "Search:"
msgstr "Sök:"
+
+msgid "Force interpretation"
+msgstr "Tvinga tolkning"
+
+msgid "Allow recompilation"
+msgstr "Tillåt omkompilering"
+
+msgid "&Force interpretation"
+msgstr "&Tvinga tolkning"
+
+msgid "&Allow recompilation"
+msgstr "&Tillåt omkompilering"
diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po
index 02bf881a5..ac4f83acf 100644
--- a/src/qt/languages/tr-TR.po
+++ b/src/qt/languages/tr-TR.po
@@ -3038,3 +3038,15 @@ msgstr "Karanlık"
msgid "Search:"
msgstr "Ara:"
+
+msgid "Force interpretation"
+msgstr "Yorumlanmasını zorla"
+
+msgid "Allow recompilation"
+msgstr "Derlenmesine izin ver"
+
+msgid "&Force interpretation"
+msgstr "&Yorumlanmasını zorla"
+
+msgid "&Allow recompilation"
+msgstr "&Derlenmesine izin ver"
diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po
index e98da1f0c..b29619ae1 100644
--- a/src/qt/languages/uk-UA.po
+++ b/src/qt/languages/uk-UA.po
@@ -3046,3 +3046,15 @@ msgstr "Темний"
msgid "Search:"
msgstr "Пошук:"
+
+msgid "Force interpretation"
+msgstr "Примусове тлумачення"
+
+msgid "Allow recompilation"
+msgstr "Дозволити рекомпіляцію"
+
+msgid "&Force interpretation"
+msgstr "&Примусове тлумачення"
+
+msgid "&Allow recompilation"
+msgstr "&Дозволити рекомпіляцію"
diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po
index 09d5defa3..ac374e389 100644
--- a/src/qt/languages/vi-VN.po
+++ b/src/qt/languages/vi-VN.po
@@ -3038,3 +3038,15 @@ msgstr "Tối"
msgid "Search:"
msgstr "Tìm:"
+
+msgid "Force interpretation"
+msgstr "Buộc giải thích"
+
+msgid "Allow recompilation"
+msgstr "Cho phép biên dịch lại"
+
+msgid "&Force interpretation"
+msgstr "&Buộc giải thích"
+
+msgid "&Allow recompilation"
+msgstr "&Cho phép biên dịch lại"
diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp
index 083f0761a..df323986e 100644
--- a/src/qt/qt_mainwindow.cpp
+++ b/src/qt/qt_mainwindow.cpp
@@ -164,6 +164,8 @@ keyb_filter(BMessage *message, BHandler **target, BMessageFilter *filter)
static BMessageFilter *filter;
#endif
+extern int cpu_force_interpreter;
+
extern void qt_mouse_capture(int);
extern "C" void qt_blit(int x, int y, int w, int h, int monitor_index);
@@ -278,8 +280,24 @@ MainWindow::MainWindow(QWidget *parent)
vmname.truncate(vmname.size() - 1);
this->setWindowTitle(QString("%1 - %2 %3").arg(vmname, EMU_NAME, EMU_VERSION_FULL));
+ connect(this, &MainWindow::forceInterpretationCompleted, this, [this]() {
+ const auto fi_icon = cpu_force_interpreter ? QIcon(":/menuicons/qt/icons/recompiler.ico") :
+ QIcon(":/menuicons/qt/icons/interpreter.ico");
+ const auto tooltip_text = cpu_force_interpreter ? QString(tr("Allow recompilation")) :
+ QString(tr("Force interpretation"));
+ const auto menu_text = cpu_force_interpreter ? QString(tr("&Allow recompilation")) :
+ QString(tr("&Force interpretation"));
+
+ ui->actionForce_interpretation->setIcon(fi_icon);
+ ui->actionForce_interpretation->setToolTip(tooltip_text);
+ ui->actionForce_interpretation->setText(menu_text);
+ ui->actionForce_interpretation->setChecked(cpu_force_interpreter);
+ ui->actionForce_interpretation->setEnabled(cpu_use_dynarec);
+ });
+
connect(this, &MainWindow::hardResetCompleted, this, [this]() {
ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA));
+ ui_update_force_interpreter();
num_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD));
scroll_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD));
caps_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD));
@@ -968,6 +986,12 @@ MainWindow::closeEvent(QCloseEvent *event)
event->accept();
}
+void
+ui_update_force_interpreter()
+{
+ emit main_window->forceInterpretationCompleted();
+}
+
void
MainWindow::updateShortcuts()
{
@@ -986,6 +1010,7 @@ MainWindow::updateShortcuts()
ui->actionHard_Reset->setShortcut(QKeySequence());
ui->actionPause->setShortcut(QKeySequence());
ui->actionMute_Unmute->setShortcut(QKeySequence());
+ ui->actionForce_interpretation->setShortcut(QKeySequence());
int accID;
QKeySequence seq;
@@ -1017,6 +1042,10 @@ MainWindow::updateShortcuts()
accID = FindAccelerator("mute");
seq = QKeySequence::fromString(acc_keys[accID].seq);
ui->actionMute_Unmute->setShortcut(seq);
+
+ accID = FindAccelerator("force_interpretation");
+ seq = QKeySequence::fromString(acc_keys[accID].seq);
+ ui->actionForce_interpretation->setShortcut(seq);
}
void
@@ -1600,6 +1629,7 @@ MainWindow::refreshMediaMenu()
status->refresh(ui->statusbar);
ui->actionMCA_devices->setVisible(machine_has_bus(machine, MACHINE_BUS_MCA));
ui->actionACPI_Shutdown->setEnabled(!!acpi_enabled);
+ ui_update_force_interpreter();
num_label->setToolTip(QShortcut::tr("Num Lock"));
num_label->setVisible(machine_has_bus(machine, MACHINE_BUS_PS2_PORTS | MACHINE_BUS_AT_KBD));
@@ -1788,6 +1818,13 @@ MainWindow::on_actionInverted_VGA_monitor_triggered()
video_toggle_option(ui->actionInverted_VGA_monitor, &invert_display);
}
+void
+MainWindow::on_actionForce_interpretation_triggered()
+{
+ cpu_force_interpreter ^= 1;
+ ui_update_force_interpreter();
+}
+
static void
update_scaled_checkboxes(Ui::MainWindow *ui, QAction *selected)
{
diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp
index 1a1cf4f20..a31900767 100644
--- a/src/qt/qt_mainwindow.hpp
+++ b/src/qt/qt_mainwindow.hpp
@@ -58,6 +58,7 @@ signals:
void destroyRendererMonitor(int monitor_index);
void initRendererMonitorForNonQtThread(int monitor_index);
void destroyRendererMonitorForNonQtThread(int monitor_index);
+ void forceInterpretationCompleted();
void hardResetCompleted();
void setTitle(const QString &title);
@@ -79,6 +80,7 @@ public slots:
void updateStatusEmptyIcons();
void updateUiPauseState();
private slots:
+ void on_actionForce_interpretation_triggered();
void on_actionFullscreen_triggered();
void on_actionSettings_triggered();
void on_actionExit_triggered();
diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui
index 45c4f70ae..5b5265b42 100644
--- a/src/qt/qt_mainwindow.ui
+++ b/src/qt/qt_mainwindow.ui
@@ -70,6 +70,8 @@
+
+
@@ -292,6 +294,8 @@
false
+
+
@@ -302,6 +306,14 @@
+
+
+ true
+
+
+ &Force interpretation
+
+
true
diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc
index 78153d3ff..e68c4e2da 100644
--- a/src/qt_resources.qrc
+++ b/src/qt_resources.qrc
@@ -68,6 +68,8 @@
qt/icons/send_cad.ico
qt/icons/send_cae.ico
qt/icons/settings.ico
+ qt/icons/interpreter.ico
+ qt/icons/recompiler.ico
qt/icons/warning.ico
diff --git a/src/unix/unix.c b/src/unix/unix.c
index ce644cac6..ee92bddcb 100644
--- a/src/unix/unix.c
+++ b/src/unix/unix.c
@@ -1731,3 +1731,9 @@ ui_hard_reset_completed(void)
{
/* No-op. */
}
+
+void
+ui_update_force_interpreter(void)
+{
+ /* No-op. */
+}