From 8e176a52950e4ae55853e7726348c5f0d9d546e8 Mon Sep 17 00:00:00 2001 From: RSX798 Date: Sun, 28 Dec 2025 14:05:07 +0800 Subject: [PATCH 01/20] Update it-IT.po --- src/qt/languages/it-IT.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 36621b840..7c76f0cbe 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -154,13 +154,13 @@ msgid "VGA screen &type" msgstr "Schermi &VGA" msgid "RGB &Color" -msgstr "RGB a &Colori" +msgstr "RGB a &colori" msgid "RGB (no brown)" msgstr "RGB (senza marrone)" msgid "&RGB Grayscale" -msgstr "&RGB a Scala di grigi" +msgstr "&RGB a scala di grigi" msgid "Generic RGBI color monitor" msgstr "Monitor a colori RGBI generico" @@ -1123,7 +1123,7 @@ msgid "VMs: %1" msgstr "Macchine virtuali: %1" msgid "System Directory:" -msgstr "Directory Sistema:" +msgstr "Directory sistema:" msgid "Choose directory" msgstr "Scegli la directory" @@ -2392,10 +2392,10 @@ msgid "Wheel" msgstr "Rotellina" msgid "Five + Wheel" -msgstr "Cinque + Rotellina" +msgstr "Cinque + rotellina" msgid "Five + 2 Wheels" -msgstr "Cinque + 2 Rotelline" +msgstr "Cinque + 2 rotelline" msgid "A3 - SMT2 Serial / SMT3(R)V" msgstr "A3 - SMT2 seriale / SMT3(R)V" From 0d2a64ab48fd36016a4fa92d3f306ae66876750d Mon Sep 17 00:00:00 2001 From: RSX798 Date: Sun, 28 Dec 2025 20:58:37 +0800 Subject: [PATCH 02/20] Update fr-FR.po --- src/qt/languages/fr-FR.po | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index aa550e5f3..bb1857e99 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -55,10 +55,10 @@ msgid "&Resizeable window" msgstr "Fenêtre &redimensionnable" msgid "R&emember size && position" -msgstr "S&auvegarder taille && position" +msgstr "S&auvegarder taille et position" msgid "Remember size && position" -msgstr "Sauvegarder taille && position" +msgstr "Sauvegarder taille et position" msgid "Re&nderer" msgstr "Moteur de re&ndu vidéo" @@ -691,7 +691,7 @@ msgid "&Removable disk %1 (%2): %3" msgstr "&Disque amovible %1 (%2) : %3" msgid "Removable disk images" -msgstr "Imges de disque amovible" +msgstr "Images de disque amovible" msgid "Image %1" msgstr "Image %1" @@ -931,7 +931,7 @@ msgid "Advanced sector images" msgstr "Images secteur avancé" msgid "Flux images" -msgstr "Images Flux" +msgstr "Images de flux" msgid "Are you sure you want to hard reset the emulated machine?" msgstr "Etes-vous sûr de vouloir réinitialiser la machine émulée ?" @@ -1957,7 +1957,7 @@ msgid "Translate 26 -> 17" msgstr "Traduire 26 -> 17" msgid "Language" -msgstr "Langage" +msgstr "Langue" msgid "Enable backlight" msgstr "Activer le rétro-éclairage" @@ -2662,28 +2662,28 @@ msgid "High performance impact" msgstr "Impact important sur la performance" msgid "[Generic] RAM Disk (max. speed)" -msgstr "[Generic] Disque RAM (vitesse maximale)" +msgstr "[Générique] Disque RAM (vitesse maximale)" msgid "[Generic] 1989 (3500 RPM)" -msgstr "[Generic] 1989 (3500 RPM)" +msgstr "[Générique] 1989 (3500 RPM)" msgid "[Generic] 1992 (3600 RPM)" -msgstr "[Generic] 1992 (3600 RPM)" +msgstr "[Générique] 1992 (3600 RPM)" msgid "[Generic] 1994 (4500 RPM)" -msgstr "[Generic] 1994 (4500 RPM)" +msgstr "[Générique] 1994 (4500 RPM)" msgid "[Generic] 1996 (5400 RPM)" -msgstr "[Generic] 1996 (5400 RPM)" +msgstr "[Générique] 1996 (5400 RPM)" msgid "[Generic] 1997 (5400 RPM)" -msgstr "[Generic] 1997 (5400 RPM)" +msgstr "[Générique] 1997 (5400 RPM)" msgid "[Generic] 1998 (5400 RPM)" -msgstr "[Generic] 1998 (5400 RPM)" +msgstr "[Générique] 1998 (5400 RPM)" msgid "[Generic] 2000 (7200 RPM)" -msgstr "[Generic] 2000 (7200 RPM)" +msgstr "[Générique] 2000 (7200 RPM)" msgid "IBM 8514/A clone (ISA)" msgstr "Clone IBM 8514/A (ISA)" @@ -2911,7 +2911,7 @@ msgid "You are currently running build %1." msgstr "Vous exécutez actuellement le build %1." msgid "Build %1 is now available." -msgstr "Le Build %1 est désormais disponible." +msgstr "Le build %1 est désormais disponible." msgid "Would you like to visit the download page?" msgstr "Souhaitez-vous visiter la page de téléchargement ?" From c0b2376b1435673ce72c90f8db3cc7042070e267 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 28 Dec 2025 23:34:13 +0600 Subject: [PATCH 03/20] Revert "Manager: Fix duplicate call on details keys" This reverts commit 1585efbef697dbe99c350195afe52520bd9ec787. --- src/qt/qt_vmmanager_detailsection.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/qt_vmmanager_detailsection.cpp b/src/qt/qt_vmmanager_detailsection.cpp index 635dcd0f9..9a849b892 100644 --- a/src/qt/qt_vmmanager_detailsection.cpp +++ b/src/qt/qt_vmmanager_detailsection.cpp @@ -200,6 +200,7 @@ VMManagerDetailSection::setSections() } else { labelKey = new QLabel(); labelKey->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); frameGridLayout->addWidget(labelKey, row, 0, Qt::AlignLeft); } labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); From 7bc12acca7c375cbbe222d34811ae26607cb287b Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 28 Dec 2025 23:34:25 +0600 Subject: [PATCH 04/20] Revert "Manager: Streamline details label caching code to address an incorrect assumption" This reverts commit 9bc36f74e81b40a9fe9594bc2fef92db9ddd55a7. --- src/qt/qt_vmmanager_detailsection.cpp | 28 ++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/qt/qt_vmmanager_detailsection.cpp b/src/qt/qt_vmmanager_detailsection.cpp index 9a849b892..a025abb06 100644 --- a/src/qt/qt_vmmanager_detailsection.cpp +++ b/src/qt/qt_vmmanager_detailsection.cpp @@ -179,10 +179,9 @@ VMManagerDetailSection::setSections() continue; } - auto item = frameGridLayout->itemAtPosition(row, 1); - QLabel *label; - if (item) { - label = (QLabel *) item->widget(); + auto item = frameGridLayout->itemAtPosition(row, 1); + auto label = item ? ((QLabel *) item->widget()) : nullptr; + if (label) { label->setVisible(true); } else { label = new QLabel(); @@ -194,21 +193,25 @@ VMManagerDetailSection::setSections() item = frameGridLayout->itemAtPosition(row, 0); if (!labelKey) { - if (item) { + if (item) labelKey = (QLabel *) item->widget(); + if (labelKey) { labelKey->setVisible(true); } else { labelKey = new QLabel(); - labelKey->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + labelKey->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); frameGridLayout->addWidget(labelKey, row, 0, Qt::AlignLeft); } labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); } else if (item) { - item->widget()->setVisible(false); + label = (QLabel *) item->widget(); + if (label) + label->setVisible(false); } - if (!frameGridLayout->itemAtPosition(row, 2)) { + item = frameGridLayout->itemAtPosition(row, 2); + if (!item || !item->widget()) { const auto hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); frameGridLayout->addItem(hSpacer, row, 2); } @@ -221,10 +224,13 @@ VMManagerDetailSection::setSections() int prevUsedRows = usedRows; usedRows = row; for (; row < prevUsedRows; row++) { - for (int i = 0; i <= 1; i++) { + for (int i = 0; i <= 2; i++) { auto item = frameGridLayout->itemAtPosition(row, i); - if (item) - item->widget()->setVisible(false); + if (item) { + auto widget = item->widget(); + if (widget) + widget->setVisible(false); + } } } From 6adcdbe68dc2464c1904bc2fb3aae80c541bfa13 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 28 Dec 2025 23:34:35 +0600 Subject: [PATCH 05/20] Revert "Manager: Improve machine load times by caching details labels" This reverts commit 9366ddd60d83f3d0ef9984aaaedba1ed71e2cc79. --- src/qt/qt_vmmanager_details.cpp | 4 -- src/qt/qt_vmmanager_detailsection.cpp | 80 +++++++++------------------ src/qt/qt_vmmanager_detailsection.hpp | 1 - 3 files changed, 27 insertions(+), 58 deletions(-) diff --git a/src/qt/qt_vmmanager_details.cpp b/src/qt/qt_vmmanager_details.cpp index 59491d89e..396997e7d 100644 --- a/src/qt/qt_vmmanager_details.cpp +++ b/src/qt/qt_vmmanager_details.cpp @@ -263,8 +263,6 @@ VMManagerDetails::updateConfig(VMManagerSystem *passed_sysconfig) // * First you clear it with VMManagerDetailSection::clear() // * Then you add each line with VMManagerDetailSection::addSection() - setUpdatesEnabled(false); - // System systemSection->clear(); systemSection->addSection("Machine", passed_sysconfig->getDisplayValue(VMManager::Display::Name::Machine)); @@ -322,8 +320,6 @@ VMManagerDetails::updateConfig(VMManagerSystem *passed_sysconfig) inputSection->setSections(); portsSection->setSections(); otherSection->setSections(); - - setUpdatesEnabled(true); } void diff --git a/src/qt/qt_vmmanager_detailsection.cpp b/src/qt/qt_vmmanager_detailsection.cpp index a025abb06..0b19f77cd 100644 --- a/src/qt/qt_vmmanager_detailsection.cpp +++ b/src/qt/qt_vmmanager_detailsection.cpp @@ -39,10 +39,6 @@ VMManagerDetailSection:: ui->setupUi(this); frameGridLayout = new QGridLayout(); - frameGridLayout->setContentsMargins(getMargins(MarginSection::DisplayGrid)); - ui->detailFrame->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - ui->detailFrame->setLayout(frameGridLayout); - // Create the collapse button, set the name and add it to the layout collapseButton = new CollapseButton(); setSectionName(sectionName); @@ -132,8 +128,6 @@ VMManagerDetailSection:: innerFrameLayout->addWidget(buttonWidget); innerFrameLayout->addWidget(frame); setLayout(outerFrameLayout); - - usedRows = 0; } VMManagerDetailSection::~VMManagerDetailSection() @@ -162,7 +156,6 @@ VMManagerDetailSection::setupMainLayout() delete mainLayout; mainLayout = new QVBoxLayout; } - void VMManagerDetailSection::setSections() { @@ -179,71 +172,52 @@ VMManagerDetailSection::setSections() continue; } - auto item = frameGridLayout->itemAtPosition(row, 1); - auto label = item ? ((QLabel *) item->widget()) : nullptr; - if (label) { - label->setVisible(true); - } else { - label = new QLabel(); - label->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); - label->setTextInteractionFlags(label->textInteractionFlags() | Qt::TextSelectableByMouse); - frameGridLayout->addWidget(label, row, 1, Qt::AlignLeft); - } - label->setText(line); + const auto labelValue = new QLabel(); + labelValue->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); + labelValue->setTextInteractionFlags(labelValue->textInteractionFlags() | Qt::TextSelectableByMouse); + labelValue->setText(line); + frameGridLayout->addWidget(labelValue, row, 1, Qt::AlignLeft); - item = frameGridLayout->itemAtPosition(row, 0); if (!labelKey) { - if (item) - labelKey = (QLabel *) item->widget(); - if (labelKey) { - labelKey->setVisible(true); - } else { - labelKey = new QLabel(); - labelKey->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred); - labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); - frameGridLayout->addWidget(labelKey, row, 0, Qt::AlignLeft); - } + labelKey = new QLabel(); + labelKey->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + labelKey->setTextInteractionFlags(labelValue->textInteractionFlags()); labelKey->setText(QCoreApplication::translate("", QString(section.name + ":").toUtf8().data())); - } else if (item) { - label = (QLabel *) item->widget(); - if (label) - label->setVisible(false); - } - - item = frameGridLayout->itemAtPosition(row, 2); - if (!item || !item->widget()) { - const auto hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); - frameGridLayout->addItem(hSpacer, row, 2); + frameGridLayout->addWidget(labelKey, row, 0, Qt::AlignLeft); } + const auto hSpacer = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum); + frameGridLayout->addItem(hSpacer, row, 2); empty = false; row++; } } - int prevUsedRows = usedRows; - usedRows = row; - for (; row < prevUsedRows; row++) { - for (int i = 0; i <= 2; i++) { - auto item = frameGridLayout->itemAtPosition(row, i); - if (item) { - auto widget = item->widget(); - if (widget) - widget->setVisible(false); - } - } - } - collapseButton->setContent(ui->detailFrame); if (!empty) setVisible(true); } - void VMManagerDetailSection::clear() { sections.clear(); setVisible(false); + + // Clear everything out + if (frameGridLayout) { + while (frameGridLayout->count()) { + QLayoutItem *cur_item = frameGridLayout->takeAt(0); + if (cur_item->widget()) + delete cur_item->widget(); + delete cur_item; + } + } + + delete frameGridLayout; + frameGridLayout = new QGridLayout(); + frameGridLayout->setContentsMargins(getMargins(MarginSection::DisplayGrid)); + ui->detailFrame->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + ui->detailFrame->setLayout(frameGridLayout); } #ifdef Q_OS_WINDOWS diff --git a/src/qt/qt_vmmanager_detailsection.hpp b/src/qt/qt_vmmanager_detailsection.hpp index 39ec51f16..71a3c992e 100644 --- a/src/qt/qt_vmmanager_detailsection.hpp +++ b/src/qt/qt_vmmanager_detailsection.hpp @@ -91,7 +91,6 @@ private: static QMargins getMargins(MarginSection section); QString sectionName; - int usedRows; struct DetailSection { QString name; From 909e893f4dcf516b909de0ea9ffff1fa673f70ba Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 28 Dec 2025 23:43:04 +0600 Subject: [PATCH 06/20] Improve slow loading speeds for manager --- src/include/86box/machine.h | 1 + src/machine/machine_table.c | 15 +++++++++++++++ src/qt/qt_vmmanager_system.cpp | 11 ++++------- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index b39ecdad6..de4e75ff8 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -392,6 +392,7 @@ extern const char * machine_getname_ex(int m); extern const char * machine_get_internal_name(void); extern const char * machine_get_nvr_name(void); extern int machine_get_machine_from_internal_name(const char *s); +extern int machine_get_machine_from_internal_name_ex(const char *s); /* returns -1 if internal name does not exist. */ extern void machine_init(void); #ifdef EMU_DEVICE_H extern const device_t *machine_get_kbc_device(int m); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index e404a3f4a..cefc25878 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -20709,6 +20709,21 @@ machine_get_machine_from_internal_name(const char *s) return 0; } + +int +machine_get_machine_from_internal_name_ex(const char *s) +{ + int c = 0; + + while (machines[c].init != NULL) { + if (!strcmp(machines[c].internal_name, s)) + return c; + c++; + } + + return -1; +} + int machine_has_mouse(void) { diff --git a/src/qt/qt_vmmanager_system.cpp b/src/qt/qt_vmmanager_system.cpp index 5c9fd3d01..159659ebf 100644 --- a/src/qt/qt_vmmanager_system.cpp +++ b/src/qt/qt_vmmanager_system.cpp @@ -521,14 +521,11 @@ VMManagerSystem::setupVars() auto machine_name = QString(); int i = 0; int ram_granularity = 0; + int ci = machine_get_machine_from_internal_name_ex(machine_config["machine"].toUtf8()); // Machine - for (int ci = 0; ci < machine_count(); ++ci) { - if (machine_available(ci)) { - if (machines[ci].internal_name == machine_config["machine"]) { - machine_name = machines[ci].name; - ram_granularity = machines[ci].ram.step; - } - } + if (ci != -1 && machine_available(ci)) { + machine_name = machines[ci].name; + ram_granularity = machines[ci].ram.step; } display_table[VMManager::Display::Name::Machine] = machine_name; From c81fedeaeae1fee9a520cd6200b6dd9b97eae765 Mon Sep 17 00:00:00 2001 From: win2kgamer <47463859+win2kgamer@users.noreply.github.com> Date: Sun, 28 Dec 2025 22:20:37 -0600 Subject: [PATCH 07/20] Block incompatible WinChip CPUs on the HP Ruby USB machine --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index cefc25878..12ed4a874 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14788,7 +14788,7 @@ const machine_t machines[] = { .cpu = { .package = CPU_PKG_SOCKET5_7, .block = CPU_BLOCK(CPU_K5, CPU_5K86, CPU_K6, CPU_K6_2, CPU_K6_2C, CPU_K6_3, CPU_K6_2P, - CPU_K6_3P, CPU_Cx6x86, CPU_Cx6x86MX, CPU_Cx6x86L), + CPU_K6_3P, CPU_Cx6x86, CPU_Cx6x86MX, CPU_Cx6x86L, CPU_WINCHIP, CPU_WINCHIP2), .min_bus = 50000000, .max_bus = 66666667, .min_voltage = 2800, From b9a55829f2fd35d3be5ba90b8b97c99bc63491b3 Mon Sep 17 00:00:00 2001 From: Bozo Scum Date: Mon, 29 Dec 2025 16:29:48 +0800 Subject: [PATCH 08/20] Update zh-TW.po --- src/qt/languages/zh-TW.po | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index ddb879c8f..635ce006a 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -202,16 +202,16 @@ msgid "&Update status bar icons" msgstr "更新狀態列圖示(&U)" msgid "Take s&creenshot" -msgstr "擷圖(&C)" +msgstr "擷取螢幕畫面(&C)" msgid "Take &raw screenshot" -msgstr "原始擷圖(&R)" +msgstr "擷取原始螢幕畫面(&R)" msgid "C&opy screenshot" -msgstr "複製擷圖(&O)" +msgstr "擷取螢幕畫面至剪貼簿(&O)" msgid "Copy r&aw screenshot" -msgstr "複製原始擷圖(&A)" +msgstr " 擷取原始螢幕畫面至剪貼薄(&A)" msgid "S&ound" msgstr "聲音(&O)" @@ -340,7 +340,7 @@ msgid "Machine:" msgstr "機型:" msgid "Configure" -msgstr "設定" +msgstr "組態" msgid "CPU:" msgstr "CPU:" @@ -652,13 +652,13 @@ msgid "Card 4:" msgstr "擴充卡 4:" msgid "Generic ISA ROM Board" -msgstr "通用 ISA ROM 板" +msgstr "通用 ISA 單 ROM 板" msgid "Generic Dual ISA ROM Board" -msgstr "通用雙 ISA ROM 板" +msgstr "通用 ISA 雙 ROM 板" msgid "Generic Quad ISA ROM Board" -msgstr "通用四通道 ISA ROM 板" +msgstr "通用 ISA 四 ROM 板" msgid "ISABugger device" msgstr "ISABugger 裝置" @@ -904,10 +904,10 @@ msgid "Steering wheel (3-axis, 4-button)" msgstr "方向盤 (3 軸, 4 鍵搖桿)" msgid "Thrustmaster Formula T1/T2 with adapter" -msgstr "附轉接器 Thrustmaster Formula T1/T2" +msgstr "Thrustmaster Formula T1/T2 附轉接器" msgid "Thrustmaster Formula T1/T2 without adapter" -msgstr "不附轉接器 Thrustmaster Formula T1/T2" +msgstr "Thrustmaster Formula T1/T2 不附轉接器 " msgid "None" msgstr "無" @@ -1006,7 +1006,7 @@ msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny docum msgstr "自動將 PCL 檔案轉換為 PDF 需要 %1。\n\n使用通用 PCL 印表機列印的文件將被儲存為 Printer Command Language (.pcl) 檔案。" msgid "Don't show this message again" -msgstr "不要再顯示此消息" +msgstr "不要再顯示此訊息" msgid "Don't exit" msgstr "不退出" @@ -1021,7 +1021,7 @@ msgid "CD-ROM images" msgstr "光碟影像" msgid "%1 Device Configuration" -msgstr "%1 裝置設定" +msgstr "%1 裝置組態" msgid "Monitor in sleep mode" msgstr "監視器處在睡眠狀態" @@ -1297,7 +1297,7 @@ msgid "An error has occurred while checking for updates: %1" msgstr "檢查更新時發生錯誤: %1" msgid "An update to 86Box is available!" -msgstr "86Box 的更新可用!" +msgstr "有 86Box 的更新可用!" msgid "Warning" msgstr "警告" @@ -1312,10 +1312,10 @@ msgid "&Delete" msgstr "刪除(&D)" msgid "Do you really want to delete the virtual machine \"%1\" and all its files? This action cannot be undone!" -msgstr "您真的想要刪除虛擬機器 \"%1\" 及其所有檔案嗎?此操作無法撤銷!" +msgstr "您真的想要刪除虛擬機器 \"%1\" 及其所有檔案嗎?此操作無法回復!" msgid "Show &config file" -msgstr "顯示設定檔(&C)" +msgstr "顯示組態檔(&C)" msgid "No screenshot" msgstr "沒有螢幕畫面擷取" @@ -1915,7 +1915,7 @@ msgid "Enable BIOS extension ROM Writes (ROM #4)" msgstr "啟用 BIOS 擴充 ROM 寫入 (ROM 4)" msgid "Linear framebuffer base" -msgstr "線性圖框緩衝記憶體的起始位址" +msgstr "線性影格緩衝記憶體的起始位址" msgid "Address" msgstr "位址" @@ -2335,7 +2335,7 @@ msgid "Address for > 2 MB" msgstr "> 2 MB 的位址" msgid "Frame Address" -msgstr "影格位址" +msgstr "頁框位址" msgid "USA" msgstr "美國" @@ -2554,13 +2554,13 @@ msgid "Mono Interlaced" msgstr "單色隔行掃描" msgid "Mono Non-Interlaced" -msgstr "單色非隔行掃描" +msgstr "單色逐行掃描" msgid "Color Interlaced" msgstr "彩色隔行掃描" msgid "Color Non-Interlaced" -msgstr "彩色非隔行掃描" +msgstr "彩色逐行掃描" msgid "3Dfx Voodoo Graphics" msgstr "3Dfx Voodoo 圖形" @@ -2761,28 +2761,28 @@ msgid "Could not load file %1" msgstr "無法載入檔案 %1" msgid "Key Bindings:" -msgstr "按鍵綁定:" +msgstr "按鍵組合:" msgid "Action" -msgstr "行動" +msgstr "動作" msgid "Keybind" -msgstr "鍵盤綁定" +msgstr "按鍵組合" msgid "Clear binding" -msgstr "解除綁定" +msgstr "解除組合" msgid "Bind" -msgstr "綁定" +msgstr "組合" msgid "Bind Key" -msgstr "綁定按鍵" +msgstr "組合按鍵" msgid "Enter key combo:" msgstr "輸入組合鍵:" msgid "Bind conflict" -msgstr "綁定衝突" +msgstr "組合衝突" msgid "This key combo is already in use." msgstr "此組合鍵已在使用中。" @@ -2932,7 +2932,7 @@ msgid "Virtual machine crash" msgstr "虛擬機當機" msgid "The virtual machine \"%1\"'s process has unexpectedly terminated with exit code %2." -msgstr "虛擬機 \"%1\" 的進程以退出代碼 %2 意外終止。" +msgstr "虛擬機 \"%1\" 的行程以結束碼 %2 意外終止。" msgid "The system will not be added." msgstr "系統將不會被新增。" From cc939fe1710e03c0f7e3e7fd41a6dd1f6cc90165 Mon Sep 17 00:00:00 2001 From: Daniel Gurney Date: Sun, 28 Dec 2025 15:37:18 +0000 Subject: [PATCH 09/20] Translated using Weblate (Finnish) Currently translated at 97.1% (971 of 999 strings) Translation: 86Box/86Box Translate-URL: https://weblate.86box.net/projects/86box/86box/fi/ --- src/qt/languages/fi-FI.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index d43b70192..f5cd64b90 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-12-06 18:56+0000\n" +"PO-Revision-Date: 2025-12-29 09:54+0000\n" "Last-Translator: Daniel Gurney \n" "Language-Team: Finnish \n" "Language: fi-FI\n" @@ -211,13 +211,13 @@ msgid "Take s&creenshot" msgstr "Ota &kuvakaappaus" msgid "Take &raw screenshot" -msgstr "Ota &raaka kuvakaapus" +msgstr "Ota &raaka kuvakaappaus" msgid "C&opy screenshot" -msgstr "K&opia kuvakaapaus" +msgstr "K&opioi kuvakaappaus" msgid "Copy r&aw screenshot" -msgstr "Kopia r&aaka kuvakaapaus" +msgstr "Kopioi r&aaka kuvakaappaus" msgid "S&ound" msgstr "&Ääni" From 41997e1badfbf2ec5c7c5b492852b8e4fa907d3c Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Tue, 30 Dec 2025 02:08:20 +0100 Subject: [PATCH 10/20] Remove redundant FIFO wait calls in vid_s3_virge.c --- src/video/vid_s3_virge.c | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index bb1b2b11e..844a8d51e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1378,122 +1378,96 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) case 0xa4d4: case 0xa8d4: case 0xacd4: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_base; break; case 0xa4d8: case 0xa8d8: case 0xacd8: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.dest_base; break; case 0xa4dc: case 0xa8dc: case 0xacdc: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r; break; case 0xa4e0: case 0xa8e0: case 0xace0: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b; break; case 0xa4e4: case 0xa8e4: case 0xace4: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str; break; case 0xa4e8: case 0xace8: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.mono_pat_0; break; case 0xa4ec: case 0xacec: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.mono_pat_1; break; case 0xa4f0: case 0xacf0: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pat_bg_clr; break; case 0xa4f4: case 0xa8f4: case 0xacf4: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pat_fg_clr; break; case 0xa4f8: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_bg_clr; break; case 0xa4fc: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_fg_clr; break; case 0xa500: case 0xa900: case 0xad00: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.cmd_set; break; case 0xa504: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.r_width << 16) | virge->s3d.r_height; break; case 0xa508: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.rsrc_x << 16) | virge->s3d.rsrc_y; break; case 0xa50c: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y; break; case 0xa96c: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.lxend0 << 16) | virge->s3d.lxend1; break; case 0xa970: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.ldx; break; case 0xa974: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.lxstart; break; case 0xa978: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.lystart; break; case 0xa97c: - s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.line_dir << 31) | virge->s3d.lycnt; break; case 0xad68: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.prdx; break; case 0xad6c: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.prxstart; break; case 0xad70: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pldx; break; case 0xad74: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.plxstart; break; case 0xad78: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pystart; break; case 0xad7c: - s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pycnt; break; From 33bd395dc55aba011d6714af15ccd23cf7659b6d Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Tue, 30 Dec 2025 12:38:12 +0100 Subject: [PATCH 11/20] Add s3_virge_wait_fifo_idle calls for register access --- src/video/vid_s3_virge.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 844a8d51e..bb1b2b11e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1378,96 +1378,122 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) case 0xa4d4: case 0xa8d4: case 0xacd4: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_base; break; case 0xa4d8: case 0xa8d8: case 0xacd8: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.dest_base; break; case 0xa4dc: case 0xa8dc: case 0xacdc: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r; break; case 0xa4e0: case 0xa8e0: case 0xace0: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b; break; case 0xa4e4: case 0xa8e4: case 0xace4: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str; break; case 0xa4e8: case 0xace8: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.mono_pat_0; break; case 0xa4ec: case 0xacec: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.mono_pat_1; break; case 0xa4f0: case 0xacf0: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pat_bg_clr; break; case 0xa4f4: case 0xa8f4: case 0xacf4: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pat_fg_clr; break; case 0xa4f8: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_bg_clr; break; case 0xa4fc: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_fg_clr; break; case 0xa500: case 0xa900: case 0xad00: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.cmd_set; break; case 0xa504: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.r_width << 16) | virge->s3d.r_height; break; case 0xa508: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.rsrc_x << 16) | virge->s3d.rsrc_y; break; case 0xa50c: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y; break; case 0xa96c: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.lxend0 << 16) | virge->s3d.lxend1; break; case 0xa970: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.ldx; break; case 0xa974: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.lxstart; break; case 0xa978: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.lystart; break; case 0xa97c: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.line_dir << 31) | virge->s3d.lycnt; break; case 0xad68: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.prdx; break; case 0xad6c: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.prxstart; break; case 0xad70: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pldx; break; case 0xad74: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.plxstart; break; case 0xad78: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pystart; break; case 0xad7c: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pycnt; break; From caab65339e5b62a40002a2f5a830f2d91e001b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Tue, 30 Dec 2025 18:01:17 +0100 Subject: [PATCH 12/20] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..7446dd9aa --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,27 @@ +**1. No illegal activity or Discord ToS violations** +- 1.1. Do not distribute malware for non-research purposes. Post samples in a clearly named encrypted archive. +- 1.2. Posting old software is allowed if at least 10 years old and out of support. +- 1.3. Do not join while being under the age of 13 (this Discord server is bridged to an IRC network and Minecraft server hosted in Finland, where the minimum age is 13 (or higher if you are in a country where the minimum age is higher), as such we enforce that minimum age server-wide). +- 1.4. Do not post NSFW content (defined at the staff's discretion). + +**2. No offensive or disruptive behavior or harassment** +- 2.1. No gate-keeping. We aim to accommodate and welcome people of all different opinions and knowledge levels to this server. +- 2.2. You may speak any language but provide a summary in English so that we can understand what you are saying and use English when requested. +- 2.3. Do not retroactively delete messages or do major edits. +- 2.4. Do not antagonize, defame, demean, blackmail, impersonate, dox others, bring outside drama, use intentionally offensive profile aspects, or otherwise post messages to start a fight (eg. platform wars). Discuss or debate the idea, not the person. +- 2.5. Do not backseat moderate, spam, flood, unsolicitedly ping people, advertise without staff permission, or evade server bans. +- 2.6. Do not speak on behalf of the project unless you are a project member (staff role or higher). This includes all messages which could reasonably be understood as being an official position. Ask a staff member if you're unsure about your message. +- 2.7. Do not block essential communications, including Staff or the Owner. +- 2.8. Do not engage in political discussions. (Formerly Rule 8) +- 2.9. Decisions by higher-ranked users supersede those by lower-ranked users. This applies to moderation **and** emulator development. The rank will be proportional to the accrued contribution. Seniority must be earned. + +**3. Moderation and appeal protocol** +- 3.1. Rule violations are punished at the staff's discretion, taking all circumstances into account. +- 3.2. Rules enforcement must be equal, impartial, and not retroactive or politically motivated. +- 3.3. Everyone is innocent until proven guilty. +- 3.4. Unless there is an emergency, urgent action is otherwise warranted, or a user has joined with the express purpose of violating our rules, staff shall deliberate before taking action in order to reach consensus and avoid staff conflicts. + +**4. Do not insist on requests or suggestions** +- 4.1. You may politely request something from us; if rejected, you are going to be told why and what to do to have it reconsidered. +- 4.2. Follow the contribution requirements listed on the GitHub readme. +- 4.3. Follow proper procedure (eg. for pull requests or bug reports). From e8c3f13eccda5c89740e82c8d680f2a3eca91b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Tue, 30 Dec 2025 18:04:29 +0100 Subject: [PATCH 13/20] Update CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 7446dd9aa..56384bfda 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,8 +1,9 @@ -**1. No illegal activity or Discord ToS violations** +**1. No illegal activity or Discord or GitHub ToS violations** - 1.1. Do not distribute malware for non-research purposes. Post samples in a clearly named encrypted archive. - 1.2. Posting old software is allowed if at least 10 years old and out of support. -- 1.3. Do not join while being under the age of 13 (this Discord server is bridged to an IRC network and Minecraft server hosted in Finland, where the minimum age is 13 (or higher if you are in a country where the minimum age is higher), as such we enforce that minimum age server-wide). +- 1.3. Do not join while being under the age of 13. - 1.4. Do not post NSFW content (defined at the staff's discretion). +- 1.5. Do not do anything forbidden by the law or the Discord or GitHub Terms of Service. **2. No offensive or disruptive behavior or harassment** - 2.1. No gate-keeping. We aim to accommodate and welcome people of all different opinions and knowledge levels to this server. From f4f2a1223ae72b28d332f803ae14beeb0cd0f563 Mon Sep 17 00:00:00 2001 From: Daniel Gurney Date: Tue, 30 Dec 2025 19:16:39 +0200 Subject: [PATCH 14/20] Refine CoC Change some wording to fit GitHub better, as the initial commit was just a copy from Discord --- CODE_OF_CONDUCT.md | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 56384bfda..3975e1df6 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,28 +1,30 @@ -**1. No illegal activity or Discord or GitHub ToS violations** +# Code of Conduct +In order for everyone to enjoy their time contributing to 86Box or otherwise being a part of the community, we kindly ask you to review and follow the below rules. + +## 1. No illegal activity or GitHub ToS violations - 1.1. Do not distribute malware for non-research purposes. Post samples in a clearly named encrypted archive. - 1.2. Posting old software is allowed if at least 10 years old and out of support. - 1.3. Do not join while being under the age of 13. -- 1.4. Do not post NSFW content (defined at the staff's discretion). +- 1.4. Do not post NSFW content (defined at the team's discretion). - 1.5. Do not do anything forbidden by the law or the Discord or GitHub Terms of Service. -**2. No offensive or disruptive behavior or harassment** -- 2.1. No gate-keeping. We aim to accommodate and welcome people of all different opinions and knowledge levels to this server. +## 2. No offensive or disruptive behavior or harassment +- 2.1. No gate-keeping. We aim to accommodate and welcome people of all different opinions and knowledge levels to this community. - 2.2. You may speak any language but provide a summary in English so that we can understand what you are saying and use English when requested. -- 2.3. Do not retroactively delete messages or do major edits. +- 2.3. Do not retroactively delete messages or do major edits unless you posted something by mistake. - 2.4. Do not antagonize, defame, demean, blackmail, impersonate, dox others, bring outside drama, use intentionally offensive profile aspects, or otherwise post messages to start a fight (eg. platform wars). Discuss or debate the idea, not the person. -- 2.5. Do not backseat moderate, spam, flood, unsolicitedly ping people, advertise without staff permission, or evade server bans. -- 2.6. Do not speak on behalf of the project unless you are a project member (staff role or higher). This includes all messages which could reasonably be understood as being an official position. Ask a staff member if you're unsure about your message. -- 2.7. Do not block essential communications, including Staff or the Owner. -- 2.8. Do not engage in political discussions. (Formerly Rule 8) -- 2.9. Decisions by higher-ranked users supersede those by lower-ranked users. This applies to moderation **and** emulator development. The rank will be proportional to the accrued contribution. Seniority must be earned. +- 2.5. Do not backseat moderate, spam, flood, unsolicitedly ping people, advertise without permission, or evade blocks. +- 2.6. Do not speak on behalf of the project unless you are a team member. This includes all messages which could reasonably be understood as being an official position. Ask a team member if you're unsure about your message. +- 2.7. Do not engage in political discussions. +- 2.8. Decisions by higher-ranked users supersede those by lower-ranked users. -**3. Moderation and appeal protocol** -- 3.1. Rule violations are punished at the staff's discretion, taking all circumstances into account. +## 3. Moderation and appeal protocol +- 3.1. Rule violations are punished at the team's discretion, taking all circumstances into account. - 3.2. Rules enforcement must be equal, impartial, and not retroactive or politically motivated. - 3.3. Everyone is innocent until proven guilty. -- 3.4. Unless there is an emergency, urgent action is otherwise warranted, or a user has joined with the express purpose of violating our rules, staff shall deliberate before taking action in order to reach consensus and avoid staff conflicts. +- 3.4. Unless there is an emergency, urgent action is otherwise warranted, or a user is participating with the express purpose of violating our rules, the team shall deliberate before taking action in order to reach consensus and avoid team conflicts. -**4. Do not insist on requests or suggestions** +## 4. Do not insist on requests or suggestions - 4.1. You may politely request something from us; if rejected, you are going to be told why and what to do to have it reconsidered. - 4.2. Follow the contribution requirements listed on the GitHub readme. - 4.3. Follow proper procedure (eg. for pull requests or bug reports). From 15e6841d8a11908009b0bfcef0be7ebb10581caf Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Wed, 31 Dec 2025 00:16:51 +0600 Subject: [PATCH 15/20] Fix drawing of 2D polygons on ATi Mach64 --- src/video/vid_ati_mach64.c | 93 ++++++++++++++------------------------ 1 file changed, 34 insertions(+), 59 deletions(-) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 97c869668..4cecf6cf4 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -2169,6 +2169,14 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) uint32_t dest_dat; uint32_t host_dat = 0; int mix = 0; + int draw_pixel = !(mach64->dst_cntl & DST_POLYGON_EN); + + if (mach64->dst_cntl & DST_POLYGON_EN) { + if (mach64->dst_cntl & DST_Y_MAJOR) + draw_pixel = 1; + else if (mach64->accel.err >= 0) + draw_pixel = 1; + } if (mach64->accel.source_host) { host_dat = cpu_dat; @@ -2215,7 +2223,7 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) break; } - if ((mach64->accel.dst_x >= mach64->accel.sc_left) && (mach64->accel.dst_x <= mach64->accel.sc_right) && (mach64->accel.dst_y >= mach64->accel.sc_top) && (mach64->accel.dst_y <= mach64->accel.sc_bottom)) { + if ((mach64->accel.dst_x >= mach64->accel.sc_left) && (mach64->accel.dst_x <= mach64->accel.sc_right) && (mach64->accel.dst_y >= mach64->accel.sc_top) && (mach64->accel.dst_y <= mach64->accel.sc_bottom) && draw_pixel) { switch (mix ? mach64->accel.source_fg : mach64->accel.source_bg) { case SRC_HOST: src_dat = host_dat; @@ -2285,17 +2293,21 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) if (mach64->dst_cntl & DST_Y_MAJOR) { mach64->accel.dst_y += mach64->accel.yinc; + mach64->accel.src_y += mach64->accel.yinc; if (mach64->accel.err >= 0) { mach64->accel.err += mach64->dst_bres_dec; mach64->accel.dst_x += mach64->accel.xinc; + mach64->accel.src_x += mach64->accel.xinc; } else { mach64->accel.err += mach64->dst_bres_inc; } } else { mach64->accel.dst_x += mach64->accel.xinc; + mach64->accel.src_x += mach64->accel.xinc; if (mach64->accel.err >= 0) { mach64->accel.err += mach64->dst_bres_dec; mach64->accel.dst_y += mach64->accel.yinc; + mach64->accel.src_y += mach64->accel.yinc; } else { mach64->accel.err += mach64->dst_bres_inc; } @@ -2347,9 +2359,7 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) if (mach64->dst_cntl & DST_POLYGON_EN) { if (mach64->dst_cntl & DST_Y_MAJOR) draw_pixel = 1; - else if ((mach64->dst_cntl & DST_X_DIR) && mach64->accel.err < (mach64->dst_bres_dec + mach64->dst_bres_inc)) /*X+*/ - draw_pixel = 1; - else if (!(mach64->dst_cntl & DST_X_DIR) && mach64->accel.err >= 0) /*X-*/ + else if (mach64->accel.err >= 0) draw_pixel = 1; } @@ -2406,62 +2416,27 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) return; } - switch (mach64->dst_cntl & 7) { - case 0: - case 2: - mach64->accel.src_x--; - mach64->accel.dst_x--; - break; - case 1: - case 3: - mach64->accel.src_x++; - mach64->accel.dst_x++; - break; - case 4: - case 5: - mach64->accel.src_y--; - mach64->accel.dst_y--; - break; - case 6: - case 7: - mach64->accel.src_y++; - mach64->accel.dst_y++; - break; - - default: - break; - } - mach64_log("x %i y %i err %i inc %i dec %i\n", mach64->accel.dst_x, mach64->accel.dst_y, mach64->accel.err, mach64->dst_bres_inc, mach64->dst_bres_dec); - if (mach64->accel.err >= 0) { - mach64->accel.err += mach64->dst_bres_dec; - - switch (mach64->dst_cntl & 7) { - case 0: - case 1: - mach64->accel.src_y--; - mach64->accel.dst_y--; - break; - case 2: - case 3: - mach64->accel.src_y++; - mach64->accel.dst_y++; - break; - case 4: - case 6: - mach64->accel.src_x--; - mach64->accel.dst_x--; - break; - case 5: - case 7: - mach64->accel.src_x++; - mach64->accel.dst_x++; - break; - - default: - break; + if (mach64->dst_cntl & DST_Y_MAJOR) { + mach64->accel.dst_y += mach64->accel.yinc; + mach64->accel.src_y += mach64->accel.yinc; + if (mach64->accel.err >= 0) { + mach64->accel.err += mach64->dst_bres_dec; + mach64->accel.dst_x += mach64->accel.xinc; + mach64->accel.src_x += mach64->accel.xinc; + } else { + mach64->accel.err += mach64->dst_bres_inc; } - } else - mach64->accel.err += mach64->dst_bres_inc; + } else { + mach64->accel.dst_x += mach64->accel.xinc; + mach64->accel.src_x += mach64->accel.xinc; + if (mach64->accel.err >= 0) { + mach64->accel.err += mach64->dst_bres_dec; + mach64->accel.dst_y += mach64->accel.yinc; + mach64->accel.src_y += mach64->accel.yinc; + } else { + mach64->accel.err += mach64->dst_bres_inc; + } + } } } break; From a10bda22ef8297de5aa0a31e0bdb6823d1c5219c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Tue, 30 Dec 2025 20:02:15 +0100 Subject: [PATCH 16/20] Update CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 3975e1df6..bd5810a77 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -15,8 +15,8 @@ In order for everyone to enjoy their time contributing to 86Box or otherwise bei - 2.4. Do not antagonize, defame, demean, blackmail, impersonate, dox others, bring outside drama, use intentionally offensive profile aspects, or otherwise post messages to start a fight (eg. platform wars). Discuss or debate the idea, not the person. - 2.5. Do not backseat moderate, spam, flood, unsolicitedly ping people, advertise without permission, or evade blocks. - 2.6. Do not speak on behalf of the project unless you are a team member. This includes all messages which could reasonably be understood as being an official position. Ask a team member if you're unsure about your message. -- 2.7. Do not engage in political discussions. -- 2.8. Decisions by higher-ranked users supersede those by lower-ranked users. +- 2.7. Decisions by higher-ranked users supersede those by lower-ranked users. +- 2.8. Do not engage in political discussions. ## 3. Moderation and appeal protocol - 3.1. Rule violations are punished at the team's discretion, taking all circumstances into account. From 08851fae31ecbdc96c71caaf4c72f52fb21656a7 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 29 Dec 2025 13:46:46 +0000 Subject: [PATCH 17/20] Translated using Weblate (Russian) Currently translated at 100.0% (999 of 999 strings) Translation: 86Box/86Box Translate-URL: https://weblate.86box.net/projects/86box/86box/ru/ --- src/qt/languages/ru-RU.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 9e16f6c28..8f3e611ad 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-12-07 13:33+0000\n" +"PO-Revision-Date: 2025-12-30 13:56+0000\n" "Last-Translator: Alexander Babikov \n" "Language-Team: Russian \n" "Language: ru-RU\n" @@ -212,13 +212,13 @@ msgid "Take s&creenshot" msgstr "Сделать с&криншот" msgid "Take &raw screenshot" -msgstr "Сделать &сырой скриншот" +msgstr "Сделать н&еобработанный скриншот" msgid "C&opy screenshot" -msgstr "С&копировать скриншот" +msgstr "Ско&пировать скриншот" msgid "Copy r&aw screenshot" -msgstr "Скопировать с&ырой скриншот" +msgstr "Скопировать необработанный скрин&шот" msgid "S&ound" msgstr "&Звук" From 261840be7bc2423a8a1d40b1b8e8ffc439df5f66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Tue, 30 Dec 2025 20:04:24 +0100 Subject: [PATCH 18/20] Update CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index bd5810a77..88c62ddef 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -17,6 +17,7 @@ In order for everyone to enjoy their time contributing to 86Box or otherwise bei - 2.6. Do not speak on behalf of the project unless you are a team member. This includes all messages which could reasonably be understood as being an official position. Ask a team member if you're unsure about your message. - 2.7. Decisions by higher-ranked users supersede those by lower-ranked users. - 2.8. Do not engage in political discussions. +- 2.9. Ignoring essential communication from team members does not exempt you from possible actions against you. Seniority must be earned. ## 3. Moderation and appeal protocol - 3.1. Rule violations are punished at the team's discretion, taking all circumstances into account. From b1756b250f49a8a21234953c6f26cffdf601c255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Tue, 30 Dec 2025 20:08:38 +0100 Subject: [PATCH 19/20] Update CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 88c62ddef..8691505fc 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -4,9 +4,8 @@ In order for everyone to enjoy their time contributing to 86Box or otherwise bei ## 1. No illegal activity or GitHub ToS violations - 1.1. Do not distribute malware for non-research purposes. Post samples in a clearly named encrypted archive. - 1.2. Posting old software is allowed if at least 10 years old and out of support. -- 1.3. Do not join while being under the age of 13. -- 1.4. Do not post NSFW content (defined at the team's discretion). -- 1.5. Do not do anything forbidden by the law or the Discord or GitHub Terms of Service. +- 1.3. Do not post NSFW content (defined at the staff's discretion). +- 1.4. Do not do anything forbidden by the law or the Discord or GitHub Terms of Service. ## 2. No offensive or disruptive behavior or harassment - 2.1. No gate-keeping. We aim to accommodate and welcome people of all different opinions and knowledge levels to this community. From 61918e4d72479e07349022401b072a621ad12028 Mon Sep 17 00:00:00 2001 From: AITUS95 <48457684+AITUS95@users.noreply.github.com> Date: Tue, 30 Dec 2025 21:14:13 +0100 Subject: [PATCH 20/20] Implement wait states for MMIO reads Added wait states for MMIO reads to reduce excessive polling. --- src/video/vid_s3_virge.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index bb1b2b11e..abeba064e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -24,6 +24,7 @@ #include #define HAVE_STDARG_H #include <86box/86box.h> +#include "cpu.h" #include <86box/io.h> #include <86box/timer.h> #include <86box/dma.h> @@ -1191,6 +1192,9 @@ s3_virge_mmio_read(uint32_t addr, void *priv) virge_t *virge = (virge_t *) priv; uint8_t ret; + /* Add wait states for MMIO reads to prevent excessive polling */ + cycles -= virge->svga.monitor->mon_video_timing_read_b; + switch (addr & 0xffff) { case 0x8504: if (!virge->virge_busy) @@ -1242,6 +1246,9 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv) virge_t *virge = (virge_t *) priv; uint16_t ret; + /* Add wait states for MMIO reads to prevent excessive polling */ + cycles -= virge->svga.monitor->mon_video_timing_read_w; + switch (addr & 0xfffe) { case 0x8504: ret = 0xc000; @@ -1275,6 +1282,9 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) virge_t *virge = (virge_t *) priv; uint32_t ret = 0xffffffff; + /* Add wait states for MMIO reads to prevent excessive polling */ + cycles -= virge->svga.monitor->mon_video_timing_read_l; + switch (addr & 0xfffc) { case 0x8180: ret = virge->streams.pri_ctrl;