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. */ +}